public void Multiply(Vector lhs, Vector rhs)
 {
     rhs.Clear(); //TODO: perhaps this should be done outside.
     foreach (var keyFactor in matrixManagers)
     {
         int id = keyFactor.Key;
         IFeti1SubdomainMatrixManager matrixManager = keyFactor.Value;
         SignedBooleanMatrixColMajor  B             = lagrangeEnumerator.BooleanMatrices[id];
         Vector FBx  = matrixManager.MultiplyInverseKffTimes(B.Multiply(lhs, true));
         Vector BFBx = B.Multiply(FBx, false);
         rhs.AddIntoThis(BFBx);
     }
 }
Пример #2
0
        /// <summary>
        /// d = sum(Bs * generalInverse(Ks) * fs), where fs are the nodal forces applied to the dofs of subdomain s.
        /// Does not mutate this object.
        /// </summary>
        internal Vector CalcDisconnectedDisplacements(Dictionary <int, Vector> fr)
        {
            // dr = sum_over_s( Br[s] * inv(Krr[s]) * fr[s])
            var dr = Vector.CreateZero(lagrangeEnumerator.NumLagrangeMultipliers);

            foreach (int s in linearSystems.Keys)
            {
                SignedBooleanMatrixColMajor Br = lagrangeEnumerator.BooleanMatrices[s];
                Vector temp = matrixManagers[s].MultiplyInverseKrrTimes(fr[s]);
                temp = Br.Multiply(temp);
                dr.AddIntoThis(temp);
            }
            return(dr);
        }
        public Vector Multiply(Vector lhs)
        {
            var rhs = Vector.CreateZero(Order);

            foreach (var keyFactor in matrixManagers)
            {
                int id = keyFactor.Key;
                IFeti1SubdomainMatrixManager matrixManager = keyFactor.Value;
                SignedBooleanMatrixColMajor  B             = lagrangeEnumerator.BooleanMatrices[id];
                Vector FBx  = matrixManager.MultiplyInverseKffTimes(B.Multiply(lhs, true));
                Vector BFBx = B.Multiply(FBx, false);
                rhs.AddIntoThis(BFBx);
            }
            return(rhs);
        }
Пример #4
0
        /// <summary>
        /// d = sum(Bs * generalInverse(Ks) * fs), where fs are the nodal forces applied to the dofs of subdomain s.
        /// Does not mutate this object.
        /// </summary>
        internal Vector CalcDisconnectedDisplacements()
        {
            var displacements = Vector.CreateZero(lagrangeEnumerator.NumLagrangeMultipliers);

            foreach (var linearSystem in linearSystems.Values)
            {
                int    s = linearSystem.Subdomain.ID;
                Vector f = linearSystem.RhsConcrete;
                SignedBooleanMatrixColMajor B = lagrangeEnumerator.BooleanMatrices[s];
                Vector Kf  = matrixManagers[s].MultiplyInverseKffTimes(f);
                Vector BKf = B.Multiply(Kf, false);
                displacements.AddIntoThis(BKf);
            }
            return(displacements);
        }
Пример #5
0
        protected Dictionary <int, IMappingMatrix> CalcBoundaryPreconditioningBooleanMatrices(IStiffnessDistribution stiffnessDistribution,
                                                                                              IDofSeparator dofSeparator, ILagrangeMultipliersEnumerator lagrangeEnumerator)
        {
            int numContinuityEquations = lagrangeEnumerator.NumLagrangeMultipliers;
            var matricesBb             = new Dictionary <int, SignedBooleanMatrixColMajor>();

            foreach (int s in dofSeparator.BoundaryDofIndices.Keys)
            {
                SignedBooleanMatrixColMajor B  = lagrangeEnumerator.BooleanMatrices[s];
                SignedBooleanMatrixColMajor Bb = B.GetColumns(dofSeparator.BoundaryDofIndices[s], false);
                matricesBb[s] = Bb;
            }
            Dictionary <int, IMappingMatrix> matricesBpb = stiffnessDistribution.CalcBoundaryPreconditioningSignedBooleanMatrices(
                lagrangeEnumerator, matricesBb);

            return(matricesBpb);
        }
        /// <summary>
        /// G = [B(1)*R(1) B(2)*R(2) ... B(ns)*R(ns)]
        /// </summary>
        private void CalculateMatrixG()
        {
            int numEquations = booleanMatrices.First().Value.NumRows;
            int numRbms      = 0;

            foreach (IFeti1SubdomainMatrixManager matrixManager in matrixManagers.Values)
            {
                numRbms += matrixManager.RigidBodyModes.Count;
            }

            matrixG = Matrix.CreateZero(numEquations, numRbms);
            int colCounter = 0;

            foreach (int s in booleanMatrices.Keys)
            {
                SignedBooleanMatrixColMajor matrixB = booleanMatrices[s];
                List <Vector> matrixR = matrixManagers[s].RigidBodyModes;
                foreach (Vector columnR in matrixR)
                {
                    Vector columnG = matrixB.Multiply(columnR, false); //TODO: Perhaps I can cache some of these for reanalysis.
                    matrixG.SetSubcolumn(colCounter++, columnG);
                }
            }
        }