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 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."); } }
public void ReorderInternalDofs(Feti1DofSeparator dofSeparator, ISubdomain subdomain) { // Do nothing, since the sparsity pattern is irrelevant for dense matrices. }