Exemplo n.º 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);
        }
Exemplo n.º 2
0
        public void ReorderInternalDofs(Feti1DofSeparator dofSeparator, ISubdomain subdomain)
        {
            if (reordering == null)
            {
                return;                     // Use the natural ordering and do not modify any stored dof data
            }
            try
            {
                int[] internalDofs = dofSeparator.InternalDofIndices[subdomain.ID];
                var   pattern      = linearSystem.Matrix.GetSubmatrixSymmetricPattern(internalDofs);
                (int[] permutation, bool oldToNew) = reordering.FindPermutation(pattern);
                int[] newInternalDofs = ReorderingUtilities.ReorderKeysOfDofIndicesMap(internalDofs, permutation, oldToNew);

                // What if the dof separator gets added other state that needs to be updated?
                dofSeparator.InternalDofIndices[subdomain.ID] = newInternalDofs;
            }
            catch (MatrixDataOverwrittenException)
            {
                throw new InvalidOperationException(
                          "The free-free stiffness matrix of this subdomain has been overwritten and cannot be used anymore."
                          + "Try calling this method before factorizing/inverting it.");
            }
        }
Exemplo n.º 3
0
 public void ReorderInternalDofs(Feti1DofSeparator dofSeparator, ISubdomain subdomain)
 {
     // Do nothing, since the sparsity pattern is irrelevant for dense matrices.
 }