/// <summary> /// Calculates part of the stiffness equations for the unknown reactions. /// </summary> /// <param name="unknownDisplacements">A vector of the displacements which were previously unknown</param> /// <returns>A vector of the reactions which were previously unknown, and have now been solved</returns> protected KeyedVector <NodalDegreeOfFreedom> CalculateUnknownReactions(KeyedVector <NodalDegreeOfFreedom> unknownDisplacements) { Guard.AgainstNullArgument(unknownDisplacements, "unknownDisplacements"); // Fu = K21 * Uu + K22 * Uk StiffnessMatrix unknownForcesUnknownDisplacementStiffnesses = this.matrixBuilder.BuildUnknownForcesUnknownDisplacementStiffnessMatrix(); // K21 StiffnessMatrix unknownForcesKnownDisplacementsStiffnesses = this.matrixBuilder.BuildUnknownForcesKnownDisplacementStiffnessMatrix(); // K22 KeyedVector <NodalDegreeOfFreedom> knownDisplacements = this.model.KnownDisplacementVector(); // Uk KeyedVector <NodalDegreeOfFreedom> lhsStatement = unknownForcesUnknownDisplacementStiffnesses.Multiply(unknownDisplacements); // K21 * Uu KeyedVector <NodalDegreeOfFreedom> rhsStatement = unknownForcesKnownDisplacementsStiffnesses.Multiply(knownDisplacements); // K22 * Uk KeyedVector <NodalDegreeOfFreedom> unknownReactions = lhsStatement.Add(rhsStatement); return(unknownReactions); }
/// <summary> /// Calculates part of the problem for unknown displacements /// </summary> /// <returns>A vector of the displacements which were previously unknown, and have now been solved</returns> protected KeyedVector <NodalDegreeOfFreedom> CalculateUnknownDisplacements() { StiffnessMatrix knownForcesUnknownDisplacementStiffnesses = this.matrixBuilder.BuildKnownForcesUnknownDisplacementStiffnessMatrix(); // K11 //TODO calculating the determinant is computationally intensive. We should use another method of model verification to speed this up. double det = knownForcesUnknownDisplacementStiffnesses.Determinant(); Guard.AgainstInvalidState(() => { return(det.IsApproximatelyEqualTo(0.0)); }, "We are unable to solve this model as it is able to move as a rigid body without deforming in any way. Are you missing any constraints?\r\nMatrix of stiffnesses for known forces and unknown displacements:\r\n {0}", knownForcesUnknownDisplacementStiffnesses); KeyedVector <NodalDegreeOfFreedom> knownForces = this.model.KnownForceVector(); // Fk StiffnessMatrix knownForcesKnownDisplacementsStiffnesses = this.matrixBuilder.BuildKnownForcesKnownDisplacementStiffnessMatrix(); // K12 KeyedVector <NodalDegreeOfFreedom> knownDisplacements = this.model.KnownDisplacementVector(); // Uk // solve for unknown displacements // Uu = K11^-1 * (Fk + (K12 * Uk)) KeyedVector <NodalDegreeOfFreedom> forcesDueToExternallyAppliedDisplacements = knownForcesKnownDisplacementsStiffnesses.Multiply(knownDisplacements); // K12 * Uk KeyedVector <NodalDegreeOfFreedom> externallyAppliedForces = knownForces.Add(forcesDueToExternallyAppliedDisplacements); // Fk + (K12 * Uk) // K11^-1 * (Fk + (K12 * Uk)) KeyedVector <NodalDegreeOfFreedom> unknownDisplacements = this.Solve(knownForcesUnknownDisplacementStiffnesses, externallyAppliedForces); return(unknownDisplacements); }