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); } }
/// <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); }
/// <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); }
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); } } }