/// <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); }
private static void CollectorGather(Collector coll, KeyedVector <ResourceType> delta) { var cur = delta.Zeroed(); var location = coll.Location; foreach (var deposit in location.Terrain.Resources) { cur[deposit.Type] += deposit.Richness; } foreach (var feautre in location.MapFeautres) { foreach (var deposit in feautre.Resources) { cur[deposit.Type] += deposit.Richness; } } foreach (var res in cur) { if (res.Value < 0) { cur[res.Key] = 0; } } cur.Filter(coll.Type.Collected); delta.Add(cur); }
/// <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> /// The user may have placed reactions directly on to fixed supports. /// These are ignored during the calculation, but the correct answer for the total reaction must include them /// </summary> /// <param name="reactions">The calculated values of the reactions</param> /// <returns>The calculated values of the reactions with additional external forces added where applicable.</returns> protected KeyedVector<NodalDegreeOfFreedom> CombineExternalForcesOnReactionNodesWithReactions(KeyedVector<NodalDegreeOfFreedom> reactions) { KeyedVector<NodalDegreeOfFreedom> externalForcesOnReactionNodes = this.model.GetCombinedForcesFor(reactions.Keys); return reactions.Add(externalForcesOnReactionNodes); }
/// <summary> /// The user may have placed reactions directly on to fixed supports. /// These are ignored during the calculation, but the correct answer for the total reaction must include them /// </summary> /// <param name="reactions">The calculated values of the reactions</param> /// <returns>The calculated values of the reactions with additional external forces added where applicable.</returns> protected KeyedVector <NodalDegreeOfFreedom> CombineExternalForcesOnReactionNodesWithReactions(KeyedVector <NodalDegreeOfFreedom> reactions) { KeyedVector <NodalDegreeOfFreedom> externalForcesOnReactionNodes = this.model.GetCombinedForcesFor(reactions.Keys); return(reactions.Add(externalForcesOnReactionNodes)); }
private static void BuildingGetTotalConsumption(Building build, KeyedVector <ResourceType> delta) { delta.Add(build.Type.Input); delta.Sub(build.Type.Output); }