Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
            }
        }