コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: LinearSolver.cs プロジェクト: iainsproat/SharpFE
 /// <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);
 }
コード例 #5
0
        /// <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));
        }
コード例 #6
0
 private static void BuildingGetTotalConsumption(Building build, KeyedVector <ResourceType> delta)
 {
     delta.Add(build.Type.Input);
     delta.Sub(build.Type.Output);
 }