private static Feti1LagrangeMultipliersEnumerator CreateBooleanMultipliers(Model model, bool createLagranges) { // Initialize model model.ConnectDataStructures(); // Order freedom degrees var orderer = new DofOrderer(new NodeMajorDofOrderingStrategy(), new NullReordering()); IGlobalFreeDofOrdering globalOrdering = orderer.OrderFreeDofs(model); model.GlobalDofOrdering = globalOrdering; foreach (Subdomain subdomain in model.Subdomains) { subdomain.FreeDofOrdering = globalOrdering.SubdomainDofOrderings[subdomain]; } // Create boolean matrices var dofSeparator = new Feti1DofSeparator(); dofSeparator.DefineGlobalBoundaryDofs(model); foreach (ISubdomain subdomain in model.Subdomains) { dofSeparator.SeparateBoundaryInternalDofs(subdomain); } var lagrangeEnumerator = new Feti1LagrangeMultipliersEnumerator(new FullyRedundantConstraints(), dofSeparator); if (createLagranges) { lagrangeEnumerator.DefineLagrangesAndBooleanMatrices(model); } else { lagrangeEnumerator.DefineBooleanMatrices(model); } return(lagrangeEnumerator); }
public static void TestSignedBooleanMatrices() { // Node | Lagrange | Sum // 1 2 20 // 3 2 // 4 12 // 5 2 // 7 2 // Dof notation: i, b, c = internal, boundary, corner dof // Numbering order: node major, subdomain medium, dof minor var booleansExpected = new Dictionary <int, Matrix>(); // Subdomain 0: 6 free dofs // (2,3) (4,5) // 3 ----- 4 // | | // | | // 0 ----- 1 // (0,1) booleansExpected[0] = Matrix.CreateFromArray(new double[numLagranges, 6] { // b b b b c c { 1, 0, 0, 0, 0, 0 }, // Node 1 { 0, 1, 0, 0, 0, 0 }, // Node 1 { 0, 0, 1, 0, 0, 0 }, // Node 3 { 0, 0, 0, 1, 0, 0 }, // Node 3 { 0, 0, 0, 0, 1, 0 }, // Node 4 { 0, 0, 0, 0, 0, 1 }, // Node 4 { 0, 0, 0, 0, 1, 0 }, // Node 4 { 0, 0, 0, 0, 0, 1 }, // Node 4 { 0, 0, 0, 0, 1, 0 }, // Node 4 { 0, 0, 0, 0, 0, 1 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, 0, 0, 0 }, // Node 7 { 0, 0, 0, 0, 0, 0 } // Node 7 }); // Subdomain 1: 7 free dofs // (3,4) (5,6) // 4 ----- 5 // | | // | | // 1 ----- 2 // (0,1) (2) booleansExpected[1] = Matrix.CreateFromArray(new double[numLagranges, 7] { // b b i c c b b { -1, 0, 0, 0, 0, 0, 0 }, // Node 1 { 0, -1, 0, 0, 0, 0, 0 }, // Node 1 { 0, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, 0, 0, -1, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, -1, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 1, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 1, 0, 0 }, // Node 4 { 0, 0, 0, 1, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 1, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 1, 0 }, // Node 5 { 0, 0, 0, 0, 0, 0, 1 }, // Node 5 { 0, 0, 0, 0, 0, 0, 0 }, // Node 7 { 0, 0, 0, 0, 0, 0, 0 } // Node 7 }); // Subdomain 2: 8 free dofs // (4,5) (6,7) // 6 ----- 7 // | | // | | // 3 ----- 4 // (0,1) (2,3) booleansExpected[2] = Matrix.CreateFromArray(new double[numLagranges, 8] { // b b c c i i b b { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 1 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 1 { -1, 0, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, -1, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, -1, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, -1, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, -1, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, -1, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 1, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 1, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, 0, 0, 0, 1, 0 }, // Node 7 { 0, 0, 0, 0, 0, 0, 0, 1 } // Node 7 }); // Subdomain 3: 8 free dofs // (4,5) (6,7) // 7 ----- 8 // | | // | | // 4 ----- 5 // (0,1) (2,3) booleansExpected[3] = Matrix.CreateFromArray(new double[numLagranges, 8] { // c c b b b b i i { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 1 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 1 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 3 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { -1, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, -1, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { -1, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, -1, 0, 0, 0, 0, 0, 0 }, // Node 4 { -1, 0, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, -1, 0, 0, 0, 0, 0, 0 }, // Node 4 { 0, 0, -1, 0, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, -1, 0, 0, 0, 0 }, // Node 5 { 0, 0, 0, 0, -1, 0, 0, 0 }, // Node 7 { 0, 0, 0, 0, 0, -1, 0, 0 } // Node 7 }); Model model = CreateModel(); Feti1LagrangeMultipliersEnumerator lagrangeMultipliers = CreateBooleanMultipliers(model, false); foreach (var id in lagrangeMultipliers.BooleanMatrices.Keys) { Matrix booleanComputed = lagrangeMultipliers.BooleanMatrices[id].CopyToFullMatrix(false); Assert.True(booleansExpected[id].Equals(booleanComputed)); } }