14#include <unordered_map>
21using namespace SubMeshUtils;
24 const Array<int> &attributes)
25 : NCMesh(), parent_(&parent)
27 Dim = submesh.Dimension();
28 spaceDim = submesh.SpaceDimension();
33 if (from == From::Domain)
35 SubMeshUtils::ConstructVolumeTree(*
this, attributes);
37 else if (from == From::Boundary)
39 SubMeshUtils::ConstructFaceTree(*
this, attributes);
44 for (
int i = 0; i < parent_node_ids_.Size(); i++)
46 const auto &parent_node = parent.nodes[parent_node_ids_[i]];
47 const int submesh_p1 = parent_to_submesh_node_ids_[parent_node.p1];
48 const int submesh_p2 = parent_to_submesh_node_ids_[parent_node.p2];
49 nodes.Reparent(i, submesh_p1, submesh_p2);
53 for (
int i = 0; i < elements.Size(); i++)
55 if (elements[i].IsLeaf())
63 InitRootState(root_state.Size());
68 if (parent.coordinates.Size() > 0)
70 coordinates.SetSize(3*parent_node_ids_.Size());
71 parent.tmp_vertex =
new TmpVertex[parent.nodes.NumIds()];
72 for (
int n = 0; n < parent_node_ids_.Size(); n++)
74 std::memcpy(&coordinates[3*n], parent.CalcVertexPos(parent_node_ids_[n]),
77 delete [] parent.tmp_vertex;
82 if (from == From::Domain)
86 submesh.parent_to_submesh_element_ids_ = -1;
87 for (
int i = 0; i < submesh.parent_element_ids_.Size(); i++)
89 submesh.parent_element_ids_[i] =
90 parent.elements[parent_element_ids_[leaf_elements[i]]].index;
91 submesh.parent_to_submesh_element_ids_[submesh.parent_element_ids_[i]] = i;
96 submesh.parent_to_submesh_element_ids_ = -1;
98 const auto &parent_face_to_be = submesh.GetParent()->GetFaceToBdrElMap();
99 MFEM_ASSERT(NElements == submesh.GetNE(),
"!");
100 auto new_parent_to_submesh_element_ids = submesh.parent_to_submesh_element_ids_;
101 Array<int> new_parent_element_ids;
102 new_parent_element_ids.Reserve(submesh.parent_element_ids_.Size());
103 for (
int i = 0; i < submesh.parent_element_ids_.Size(); i++)
105 new_parent_element_ids.Append(
106 parent_face_to_be[parent.faces[parent_element_ids_[leaf_elements[i]]].index]);
107 new_parent_to_submesh_element_ids[new_parent_element_ids[i]] = i;
110 MFEM_ASSERT(new_parent_element_ids.Size() == submesh.parent_element_ids_.Size(),
113 for (
auto x : new_parent_element_ids)
115 MFEM_ASSERT(std::find(submesh.parent_element_ids_.begin(),
116 submesh.parent_element_ids_.end(), x)
117 != submesh.parent_element_ids_.end(),
118 x <<
" not found in submesh.parent_element_ids_");
120 for (
auto x : submesh.parent_element_ids_)
122 MFEM_ASSERT(std::find(new_parent_element_ids.begin(),
123 new_parent_element_ids.end(), x)
124 != new_parent_element_ids.end(), x <<
" not found in new_parent_element_ids_");
127 submesh.parent_element_ids_ = std::move(new_parent_element_ids);
128 submesh.parent_to_submesh_element_ids_ =
129 std::move(new_parent_to_submesh_element_ids);
void Update(Vector &x, int k, DenseMatrix &h, Vector &s, Array< Vector * > &v)
std::array< int, NCMesh::MaxFaceNodes > nodes