private Vector CreateInterfaceProblemRhs(FetiDPFlexibilityMatrix flexibility, IFetiDPCoarseProblemSolver coarseProblemSolver, Vector globalFcStar, Vector dr) { // rhs = dr - FIrc * inv(KccStar) * fcStar Vector rhs = coarseProblemSolver.MultiplyInverseCoarseProblemMatrixTimes(globalFcStar); rhs = flexibility.MultiplyFIrc(rhs); rhs = dr - rhs; return(rhs); }
public void Multiply(IVectorView lhsVector, IVector rhsVector) { //TODO: remove casts. I think PCG, LinearTransformation and preconditioners should be generic, bounded by // IVectorView and IVector var lhs = (Vector)lhsVector; var rhs = (Vector)rhsVector; // rhs = (FIrr + FIrc * inv(KccStar) * FIrc^T) * lhs rhs.Clear(); flexibility.MultiplyFIrr(lhs, rhs); Vector temp = flexibility.MultiplyTransposedFIrc(lhs); temp = coarseProblemSolver.MultiplyInverseCoarseProblemMatrixTimes(temp); temp = flexibility.MultiplyFIrc(temp); rhs.AddIntoThis(temp); }
public static void TestFlexibilityMatrices() { // Setup the model and solver Model model = Quads4x4MappingMatricesTests.CreateModel(); Dictionary <int, HashSet <INode> > cornerNodes = Quads4x4MappingMatricesTests.DefineCornerNodes(model); var fetiMatrices = new DenseFetiDPSubdomainMatrixManager.Factory(); var cornerNodeSelection = new UsedDefinedCornerNodes(cornerNodes); var solver = new FetiDPSolver.Builder(cornerNodeSelection, fetiMatrices).BuildSolver(model); model.ConnectDataStructures(); solver.OrderDofs(false); solver.Initialize(); // Mock the stiffness matrices Dictionary <int, IFetiDPSubdomainMatrixManager> matrixManagers = MockStiffnesses(); // Access private fields of FetiDPSolver FieldInfo fi = typeof(FetiDPSolver).GetField("lagrangeEnumerator", BindingFlags.NonPublic | BindingFlags.Instance); var lagrangeEnumerator = (FetiDPLagrangeMultipliersEnumerator)fi.GetValue(solver); fi = typeof(FetiDPSolver).GetField("dofSeparator", BindingFlags.NonPublic | BindingFlags.Instance); var dofSeparator = (FetiDPDofSeparator)fi.GetValue(solver); // Create the flexibility matrices by multiplying with identity matrices int numLagranges = lagrangeEnumerator.NumLagrangeMultipliers; int numCornerDofs = dofSeparator.NumGlobalCornerDofs; var flexibility = new FetiDPFlexibilityMatrix(dofSeparator, lagrangeEnumerator, matrixManagers); Matrix FIrr = MultiplyWithIdentity(numLagranges, numLagranges, flexibility.MultiplyFIrr); Matrix FIrc = MultiplyWithIdentity(numLagranges, numLagranges, (x, y) => y.CopyFrom(flexibility.MultiplyFIrc(x))); // Check against expected matrices double tol = 1E-11; Assert.True(MatrixFIrr.Equals(FIrr, tol)); Assert.True(MatrixFIrc.Equals(FIrc, tol)); }