9 namespace smith::mfem_ext {
11 void GetEssentialTrueDofsFromElementAttribute(
const mfem::ParFiniteElementSpace& fespace,
12 const mfem::Array<int>& elem_attr_is_ess, mfem::Array<int>& ess_tdof_list,
15 mfem::Array<int> ess_dofs, true_ess_dofs;
17 GetEssentialVDofsFromElementAttribute(fespace, elem_attr_is_ess, ess_dofs, component);
18 fespace.GetRestrictionMatrix()->BooleanMult(ess_dofs, true_ess_dofs);
19 fespace.MarkerToList(true_ess_dofs, ess_tdof_list);
22 static void mark_dofs(
const mfem::Array<int>& dofs, mfem::Array<int>& mark_array)
24 for (
int i = 0; i < dofs.Size(); i++) {
33 void GetEssentialVDofsFromElementAttribute(
const mfem::ParFiniteElementSpace& fespace,
34 const mfem::Array<int>& elem_attr_is_ess, mfem::Array<int>& ess_vdofs,
38 fespace.GetParMesh()->attributes.Max() == elem_attr_is_ess.Size(),
39 "Length of elem_attr_is_ess must match the number of element attributes on the mesh associated with fespace");
41 mfem::Array<int> vdofs, dofs;
42 ess_vdofs.SetSize(fespace.GetVSize());
44 for (
int elem = 0; elem < fespace.GetNE(); elem++) {
45 if (elem_attr_is_ess[fespace.GetAttribute(elem) - 1]) {
48 fespace.GetElementVDofs(elem, vdofs);
51 fespace.GetElementDofs(elem, dofs);
52 vdofs.SetSize(dofs.Size());
53 for (
int d = 0; d < dofs.Size(); d++) {
54 vdofs[d] = fespace.DofToVDof(dofs[d], component);
57 mark_dofs(vdofs, ess_vdofs);
60 fespace.Synchronize(ess_vdofs);
This file contains the declarations of helper methods for boundary conditions.