diff --git a/include/geom/cell_hex.h b/include/geom/cell_hex.h index 33d5933ad80..1f77951794c 100644 --- a/include/geom/cell_hex.h +++ b/include/geom/cell_hex.h @@ -125,11 +125,18 @@ class Hex : public Cell /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + /** * \returns \p Hex8::side_nodes_map[side][side_node] after doing some range checking. */ diff --git a/include/geom/cell_hex27.h b/include/geom/cell_hex27.h index 4781b98e7be..8a50372593a 100644 --- a/include/geom/cell_hex27.h +++ b/include/geom/cell_hex27.h @@ -151,8 +151,7 @@ class Hex27 final : public Hex /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Hex27 since we can * use the center node of each face to provide a perfect (unique) diff --git a/include/geom/cell_inf_hex.h b/include/geom/cell_inf_hex.h index 12903135269..423f3a416dc 100644 --- a/include/geom/cell_inf_hex.h +++ b/include/geom/cell_inf_hex.h @@ -151,11 +151,18 @@ class InfHex : public InfCell /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + /** * \returns \p InfHex8::side_nodes_map[side][side_node] after doing some range checking. */ diff --git a/include/geom/cell_inf_hex18.h b/include/geom/cell_inf_hex18.h index 9400e9091e8..737ce73531e 100644 --- a/include/geom/cell_inf_hex18.h +++ b/include/geom/cell_inf_hex18.h @@ -160,8 +160,7 @@ class InfHex18 final : public InfHex /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p InfHex18 since we can * use the center node of the bottom face to provide a perfect (unique) diff --git a/include/geom/cell_inf_prism.h b/include/geom/cell_inf_prism.h index d67809fe355..5b953eb1f9f 100644 --- a/include/geom/cell_inf_prism.h +++ b/include/geom/cell_inf_prism.h @@ -143,11 +143,18 @@ class InfPrism : public InfCell /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + /** * \returns InfPrism6::side_nodes_map[side][side_node] after doing some range checking. */ diff --git a/include/geom/cell_prism.h b/include/geom/cell_prism.h index 09f3ad2e8ad..52d2bed1b1b 100644 --- a/include/geom/cell_prism.h +++ b/include/geom/cell_prism.h @@ -117,11 +117,18 @@ class Prism : public Cell /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + /** * \returns \p Prism6::side_nodes_map[side][side_node] after doing some range checking. */ diff --git a/include/geom/cell_prism18.h b/include/geom/cell_prism18.h index 532d5264a47..722c00325e9 100644 --- a/include/geom/cell_prism18.h +++ b/include/geom/cell_prism18.h @@ -156,8 +156,7 @@ class Prism18 final : public Prism /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Prism18 since we can * use the center node of each quad face to provide a perfect (unique) diff --git a/include/geom/cell_prism20.h b/include/geom/cell_prism20.h index f1a954ee284..e6c666e82b9 100644 --- a/include/geom/cell_prism20.h +++ b/include/geom/cell_prism20.h @@ -160,8 +160,7 @@ class Prism20 final : public Prism /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Prism20 since we can * use the center node of each quad face to provide a perfect (unique) diff --git a/include/geom/cell_prism21.h b/include/geom/cell_prism21.h index f2c3749792b..742d2795972 100644 --- a/include/geom/cell_prism21.h +++ b/include/geom/cell_prism21.h @@ -163,8 +163,7 @@ class Prism21 final : public Prism /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Prism21 since we can * use the center node of each quad face to provide a perfect (unique) diff --git a/include/geom/cell_pyramid.h b/include/geom/cell_pyramid.h index 25898ec3160..5a70b5fd43d 100644 --- a/include/geom/cell_pyramid.h +++ b/include/geom/cell_pyramid.h @@ -120,14 +120,21 @@ class Pyramid : public Cell */ using Elem::key; - /** + /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + + /** * \returns \p Pyramid5::side_nodes_map[side][side_node] after doing some range checking. */ virtual unsigned int local_side_node(unsigned int side, diff --git a/include/geom/cell_pyramid14.h b/include/geom/cell_pyramid14.h index 30d8cf3cf11..348959299a5 100644 --- a/include/geom/cell_pyramid14.h +++ b/include/geom/cell_pyramid14.h @@ -158,8 +158,7 @@ class Pyramid14 final : public Pyramid /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Pyramid14 since we can * use the center node of the base face to provide a perfect (unique) diff --git a/include/geom/cell_pyramid18.h b/include/geom/cell_pyramid18.h index d1781a1ab38..f28fc71f034 100644 --- a/include/geom/cell_pyramid18.h +++ b/include/geom/cell_pyramid18.h @@ -164,8 +164,7 @@ class Pyramid18 final : public Pyramid /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Pyramid18 since we can * use the center node of the base face to provide a perfect (unique) diff --git a/include/geom/cell_tet.h b/include/geom/cell_tet.h index 2916d98808a..5cae533edd0 100644 --- a/include/geom/cell_tet.h +++ b/include/geom/cell_tet.h @@ -106,12 +106,19 @@ class Tet : public Cell /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + + /** * \returns \p Tet4::side_nodes_map[side][side_node] after doing some range checking. */ virtual unsigned int local_side_node(unsigned int side, diff --git a/include/geom/edge.h b/include/geom/edge.h index 339d22e3d12..d8890e83904 100644 --- a/include/geom/edge.h +++ b/include/geom/edge.h @@ -127,12 +127,20 @@ class Edge : public Elem /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override final { return this->compute_key(this->node_id(s)); } + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override final + { return this->compute_key(this->node_id(s)); } + /** * \returns \p side after doing some range checking. \p side_node is ignored. */ diff --git a/include/geom/elem.h b/include/geom/elem.h index 1eac5a60d0b..2ea1fe9ae16 100644 --- a/include/geom/elem.h +++ b/include/geom/elem.h @@ -249,11 +249,18 @@ class Elem : public ReferenceCountedObject, /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const = 0; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const = 0; + /** * \returns An id associated with the global node ids of this * element. The id is not necessarily unique, but should be diff --git a/include/geom/face_inf_quad.h b/include/geom/face_inf_quad.h index 55035035304..8dd4ec33dcd 100644 --- a/include/geom/face_inf_quad.h +++ b/include/geom/face_inf_quad.h @@ -157,11 +157,18 @@ class InfQuad : public Elem /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; + /** + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. + */ + virtual dof_id_type low_order_key (const unsigned int s) const override; + /** * \returns \p InfQuad4::side_nodes_map[side][side_node] after doing some range checking. */ diff --git a/include/geom/face_inf_quad6.h b/include/geom/face_inf_quad6.h index a9ea06818e3..e0cded568ad 100644 --- a/include/geom/face_inf_quad6.h +++ b/include/geom/face_inf_quad6.h @@ -113,8 +113,7 @@ class InfQuad6 : public InfQuad /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We override this function to return a key for the Edge3 side * which is consistent which Edge3::key(). diff --git a/include/geom/face_quad.h b/include/geom/face_quad.h index 6eab8c5bdc0..4f738934b12 100644 --- a/include/geom/face_quad.h +++ b/include/geom/face_quad.h @@ -131,19 +131,26 @@ class Quad : public Face */ using Elem::key; + /** + * \returns An id associated with the global node ids of this + * element. The id is not necessarily unique, but should be + * close. + */ + virtual dof_id_type key () const override; + /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; /** - * \returns An id associated with the global node ids of this - * element. The id is not necessarily unique, but should be - * close. + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. */ - virtual dof_id_type key () const override; + virtual dof_id_type low_order_key (const unsigned int s) const override; /** * \returns \p Quad4::side_nodes_map[side][side_node] after doing some range checking. diff --git a/include/geom/face_quad8.h b/include/geom/face_quad8.h index fc7f28ed869..9e7ff4773e0 100644 --- a/include/geom/face_quad8.h +++ b/include/geom/face_quad8.h @@ -132,8 +132,7 @@ class Quad8 : public Quad /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Quad8 since we can * use the center node of each edge to provide a perfect (unique) diff --git a/include/geom/face_quad9.h b/include/geom/face_quad9.h index 358b50767b4..71135a346e1 100644 --- a/include/geom/face_quad9.h +++ b/include/geom/face_quad9.h @@ -132,8 +132,7 @@ class Quad9 : public Quad /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * * We reimplement this method here for the \p Quad9 since we can * use the center node of each edge to provide a perfect (unique) diff --git a/include/geom/face_tri.h b/include/geom/face_tri.h index defd07aeb23..355576c963c 100644 --- a/include/geom/face_tri.h +++ b/include/geom/face_tri.h @@ -118,19 +118,26 @@ class Tri : public Face */ using Elem::key; + /** + * \returns An id associated with the global node ids of this + * element. The id is not necessarily unique, but should be + * close. + */ + virtual dof_id_type key () const override final; + /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. */ virtual dof_id_type key (const unsigned int s) const override; /** - * \returns An id associated with the global node ids of this - * element. The id is not necessarily unique, but should be - * close. + * \returns An id associated with the \p s side of this element, as + * defined solely by element vertices. The id is not necessarily + * unique, but should be close. This is particularly useful in the + * \p MeshBase::find_neighbors() routine. */ - virtual dof_id_type key () const override final; + virtual dof_id_type low_order_key (const unsigned int s) const override; /** * \returns \p Tri3::side_nodes_map[side][side_node] after doing some range checking. diff --git a/include/geom/face_tri6.h b/include/geom/face_tri6.h index 40b93b9f81f..87894130c3b 100644 --- a/include/geom/face_tri6.h +++ b/include/geom/face_tri6.h @@ -142,10 +142,9 @@ class Tri6 : public Tri /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * - * We reimplement this method here for the \p Quad8 since we can + * We reimplement this method here for the \p Tri6 since we can * use the center node of each edge to provide a perfect (unique) * key. */ diff --git a/include/geom/face_tri7.h b/include/geom/face_tri7.h index d4c6151d97f..345f775ac90 100644 --- a/include/geom/face_tri7.h +++ b/include/geom/face_tri7.h @@ -147,10 +147,9 @@ class Tri7 : public Tri /** * \returns An id associated with the \p s side of this element. - * The id is not necessarily unique, but should be close. This is - * particularly useful in the \p MeshBase::find_neighbors() routine. + * The id is not necessarily unique, but should be close. * - * We reimplement this method here for the \p Quad8 since we can + * We reimplement this method here for the \p Tri7 since we can * use the center node of each edge to provide a perfect (unique) * key. */ diff --git a/include/geom/node_elem.h b/include/geom/node_elem.h index 04ded413581..8ce404dc270 100644 --- a/include/geom/node_elem.h +++ b/include/geom/node_elem.h @@ -114,6 +114,13 @@ class NodeElem : public Elem virtual dof_id_type key (const unsigned int) const override { libmesh_error_msg("Calling NodeElem::key(side) does not make sense."); return 0; } + /** + * \returns An id associated with the \p s side of this element. + * This should never be important for NodeElems. + */ + virtual dof_id_type low_order_key (const unsigned int) const override + { libmesh_error_msg("Calling NodeElem::low_order_key(side) does not make sense."); return 0; } + /** * NodeElems don't have sides, so they can't have nodes on sides. */ diff --git a/include/geom/remote_elem.h b/include/geom/remote_elem.h index 12fabd09611..68391765ad7 100644 --- a/include/geom/remote_elem.h +++ b/include/geom/remote_elem.h @@ -109,6 +109,9 @@ class RemoteElem : public Elem, virtual dof_id_type key (const unsigned int) const override { remote_elem_error("key"); return 0; } + virtual dof_id_type low_order_key (const unsigned int) const override + { remote_elem_error("low_order_key"); return 0; } + virtual unsigned int local_side_node(unsigned int /*side*/, unsigned int /*side_node*/) const override { remote_elem_error("local_side_node"); return 0; } diff --git a/src/geom/cell_hex.C b/src/geom/cell_hex.C index e321a01e99a..414f41c9369 100644 --- a/src/geom/cell_hex.C +++ b/src/geom/cell_hex.C @@ -99,6 +99,18 @@ dof_id_type Hex::key (const unsigned int s) const +dof_id_type Hex::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + return this->compute_key(this->node_id(Hex8::side_nodes_map[s][0]), + this->node_id(Hex8::side_nodes_map[s][1]), + this->node_id(Hex8::side_nodes_map[s][2]), + this->node_id(Hex8::side_nodes_map[s][3])); +} + + + unsigned int Hex::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/cell_inf_hex.C b/src/geom/cell_inf_hex.C index d785c3beb6d..d61435ce420 100644 --- a/src/geom/cell_inf_hex.C +++ b/src/geom/cell_inf_hex.C @@ -97,6 +97,20 @@ dof_id_type InfHex::key (const unsigned int s) const +dof_id_type InfHex::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + // The order of the node ids does not matter, they are sorted by the + // compute_key() function. + return this->compute_key(this->node_id(InfHex8::side_nodes_map[s][0]), + this->node_id(InfHex8::side_nodes_map[s][1]), + this->node_id(InfHex8::side_nodes_map[s][2]), + this->node_id(InfHex8::side_nodes_map[s][3])); +} + + + unsigned int InfHex::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/cell_inf_prism.C b/src/geom/cell_inf_prism.C index df04263ce7e..bbc0118434a 100644 --- a/src/geom/cell_inf_prism.C +++ b/src/geom/cell_inf_prism.C @@ -92,6 +92,32 @@ dof_id_type InfPrism::key (const unsigned int s) const +dof_id_type InfPrism::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + switch (s) + { + case 0: // the triangular face at z=-1, base face + return this->compute_key (this->node_id(InfPrism6::side_nodes_map[s][0]), + this->node_id(InfPrism6::side_nodes_map[s][1]), + this->node_id(InfPrism6::side_nodes_map[s][2])); + + case 1: // the quad face at y=0 + case 2: // the other quad face + case 3: // the quad face at x=0 + return this->compute_key (this->node_id(InfPrism6::side_nodes_map[s][0]), + this->node_id(InfPrism6::side_nodes_map[s][1]), + this->node_id(InfPrism6::side_nodes_map[s][2]), + this->node_id(InfPrism6::side_nodes_map[s][3])); + + default: + libmesh_error_msg("Invalid side s = " << s); + } +} + + + unsigned int InfPrism::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/cell_prism.C b/src/geom/cell_prism.C index 44123f8b579..b484834a5e2 100644 --- a/src/geom/cell_prism.C +++ b/src/geom/cell_prism.C @@ -97,6 +97,33 @@ dof_id_type Prism::key (const unsigned int s) const +dof_id_type Prism::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + switch (s) + { + case 0: // the triangular face at z=0 + case 4: // the triangular face at z=1 + return this->compute_key (this->node_id(Prism6::side_nodes_map[s][0]), + this->node_id(Prism6::side_nodes_map[s][1]), + this->node_id(Prism6::side_nodes_map[s][2])); + + case 1: // the quad face at y=0 + case 2: // the other quad face + case 3: // the quad face at x=0 + return this->compute_key (this->node_id(Prism6::side_nodes_map[s][0]), + this->node_id(Prism6::side_nodes_map[s][1]), + this->node_id(Prism6::side_nodes_map[s][2]), + this->node_id(Prism6::side_nodes_map[s][3])); + + default: + libmesh_error_msg("Invalid side " << s); + } +} + + + unsigned int Prism::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/cell_pyramid.C b/src/geom/cell_pyramid.C index cf7e234a0e2..c34b3ffa4d8 100644 --- a/src/geom/cell_pyramid.C +++ b/src/geom/cell_pyramid.C @@ -91,6 +91,33 @@ dof_id_type Pyramid::key (const unsigned int s) const +dof_id_type Pyramid::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + switch (s) + { + case 0: // triangular face 1 + case 1: // triangular face 2 + case 2: // triangular face 3 + case 3: // triangular face 4 + return this->compute_key (this->node_id(Pyramid5::side_nodes_map[s][0]), + this->node_id(Pyramid5::side_nodes_map[s][1]), + this->node_id(Pyramid5::side_nodes_map[s][2])); + + case 4: // the quad face at z=0 + return this->compute_key (this->node_id(Pyramid5::side_nodes_map[s][0]), + this->node_id(Pyramid5::side_nodes_map[s][1]), + this->node_id(Pyramid5::side_nodes_map[s][2]), + this->node_id(Pyramid5::side_nodes_map[s][3])); + + default: + libmesh_error_msg("Invalid side s = " << s); + } +} + + + unsigned int Pyramid::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/cell_tet.C b/src/geom/cell_tet.C index 390f43aec0c..079855f7d0b 100644 --- a/src/geom/cell_tet.C +++ b/src/geom/cell_tet.C @@ -69,6 +69,17 @@ dof_id_type Tet::key (const unsigned int s) const +dof_id_type Tet::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + return this->compute_key(this->node_id(Tet4::side_nodes_map[s][0]), + this->node_id(Tet4::side_nodes_map[s][1]), + this->node_id(Tet4::side_nodes_map[s][2])); +} + + + unsigned int Tet::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/face_inf_quad.C b/src/geom/face_inf_quad.C index 5770080b9af..76f67c71809 100644 --- a/src/geom/face_inf_quad.C +++ b/src/geom/face_inf_quad.C @@ -61,6 +61,18 @@ dof_id_type InfQuad::key (const unsigned int s) const +dof_id_type InfQuad::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + // The order of the node ids does not matter, they are sorted by the + // compute_key() function. + return this->compute_key(this->node_id(InfQuad4::side_nodes_map[s][0]), + this->node_id(InfQuad4::side_nodes_map[s][1])); +} + + + unsigned int InfQuad::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/face_quad.C b/src/geom/face_quad.C index cb9a8ad0643..b7178f21845 100644 --- a/src/geom/face_quad.C +++ b/src/geom/face_quad.C @@ -62,6 +62,16 @@ dof_id_type Quad::key (const unsigned int s) const +dof_id_type Quad::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + return this->compute_key(this->node_id(Quad4::side_nodes_map[s][0]), + this->node_id(Quad4::side_nodes_map[s][1])); +} + + + unsigned int Quad::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/geom/face_tri.C b/src/geom/face_tri.C index 9b628b26109..ff59c86d836 100644 --- a/src/geom/face_tri.C +++ b/src/geom/face_tri.C @@ -61,6 +61,16 @@ dof_id_type Tri::key (const unsigned int s) const +dof_id_type Tri::low_order_key (const unsigned int s) const +{ + libmesh_assert_less (s, this->n_sides()); + + return this->compute_key(this->node_id(Tri3::side_nodes_map[s][0]), + this->node_id(Tri3::side_nodes_map[s][1])); +} + + + unsigned int Tri::local_side_node(unsigned int side, unsigned int side_node) const { diff --git a/src/mesh/boundary_info.C b/src/mesh/boundary_info.C index 8aa1e8595bb..b3d35ffcd79 100644 --- a/src/mesh/boundary_info.C +++ b/src/mesh/boundary_info.C @@ -3228,19 +3228,29 @@ void BoundaryInfo::clear_stitched_boundary_side_ids (const boundary_id_type side auto pred_result = predicate(*it, _boundary_side_id); if (pred_result.first) { - // First erase associated nodeset information + // First erase associated nodeset information. Do it from both + // sides, so we get any higher-order nodes if we're looking at + // them from a lower-order side, and so we only remove the two + // boundary ids used for stitching. if (clear_nodeset_data) { const Elem & elem = *it->first; + const Elem & neigh = *pred_result.second->first; const auto elem_side = it->second.first; - const auto local_node_nums = elem.nodes_on_side(elem_side); - for (const auto local_node_num : local_node_nums) - // This will remove all boundary info associated with this node, e.g. nodeset info - // for both sideset_id and other_sideset_id which is what we want - this->remove(elem.node_ptr(local_node_num)); + const boundary_id_type neigh_side = pred_result.second->second.first; + const auto elem_bcid = it->second.second; + const boundary_id_type neigh_bcid = pred_result.second->second.second; + + for (const auto local_node_num : elem.nodes_on_side(elem_side)) + this->remove_node(elem.node_ptr(local_node_num), elem_bcid); + + for (const auto local_node_num : neigh.nodes_on_side(neigh_side)) + this->remove_node(neigh.node_ptr(local_node_num), neigh_bcid); } - // Now erase the sideset information + // Now erase the sideset information for our element and its + // neighbor, together. This is safe since a multimap doesn't + // invalidate iterators. _boundary_side_id.erase(pred_result.second); it = _boundary_side_id.erase(it); } diff --git a/src/mesh/unstructured_mesh.C b/src/mesh/unstructured_mesh.C index d7226d728a1..d9d621dcb45 100644 --- a/src/mesh/unstructured_mesh.C +++ b/src/mesh/unstructured_mesh.C @@ -836,8 +836,10 @@ void UnstructuredMesh::find_neighbors (const bool reset_remote_elements, if (element->neighbor_ptr(ms) == nullptr || element->neighbor_ptr(ms) == remote_elem) { - // Get the key for the side of this element - const dof_id_type key = element->key(ms); + // Get the key for the side of this element. Use the + // low_order_key so we can find neighbors in + // mixed-order meshes if necessary. + const dof_id_type key = element->low_order_key(ms); // Look for elements that have an identical side key auto bounds = side_to_elem_map.equal_range(key); @@ -1863,7 +1865,7 @@ UnstructuredMesh::stitching_helper (const MeshBase * other_mesh, // This side is on the boundary, add its information to side_to_elem if (skip_find_neighbors && (i==0)) { - key_type key = el->key(side_id); + key_type key = el->low_order_key(side_id); val_type val; val.first = el; val.second = cast_int(side_id); @@ -2407,7 +2409,7 @@ UnstructuredMesh::stitching_helper (const MeshBase * other_mesh, { if (el->neighbor_ptr(s) == nullptr) { - key_type key = el->key(s); + key_type key = el->low_order_key(s); auto bounds = side_to_elem_map.equal_range(key); if (bounds.first != bounds.second) diff --git a/tests/Makefile.am b/tests/Makefile.am index f4ca10fe134..fb57c3520ff 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -76,6 +76,7 @@ unit_tests_sources = \ mesh/mesh_stitch.C \ mesh/mesh_triangulation.C \ mesh/mixed_dim_mesh_test.C \ + mesh/mixed_order_test.C \ mesh/nodal_neighbors.C \ mesh/libmesh_poly2tri.C \ mesh/slit_mesh_test.C \ diff --git a/tests/Makefile.in b/tests/Makefile.in index 0a9a2646ce9..6d4f69ca97c 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -220,9 +220,9 @@ am__unit_tests_dbg_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -327,6 +327,7 @@ am__objects_3 = unit_tests_dbg-driver.$(OBJEXT) \ mesh/unit_tests_dbg-mesh_stitch.$(OBJEXT) \ mesh/unit_tests_dbg-mesh_triangulation.$(OBJEXT) \ mesh/unit_tests_dbg-mixed_dim_mesh_test.$(OBJEXT) \ + mesh/unit_tests_dbg-mixed_order_test.$(OBJEXT) \ mesh/unit_tests_dbg-nodal_neighbors.$(OBJEXT) \ mesh/unit_tests_dbg-libmesh_poly2tri.$(OBJEXT) \ mesh/unit_tests_dbg-slit_mesh_test.$(OBJEXT) \ @@ -419,9 +420,9 @@ am__unit_tests_devel_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -524,6 +525,7 @@ am__objects_5 = unit_tests_devel-driver.$(OBJEXT) \ mesh/unit_tests_devel-mesh_stitch.$(OBJEXT) \ mesh/unit_tests_devel-mesh_triangulation.$(OBJEXT) \ mesh/unit_tests_devel-mixed_dim_mesh_test.$(OBJEXT) \ + mesh/unit_tests_devel-mixed_order_test.$(OBJEXT) \ mesh/unit_tests_devel-nodal_neighbors.$(OBJEXT) \ mesh/unit_tests_devel-libmesh_poly2tri.$(OBJEXT) \ mesh/unit_tests_devel-slit_mesh_test.$(OBJEXT) \ @@ -612,9 +614,9 @@ am__unit_tests_oprof_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -717,6 +719,7 @@ am__objects_7 = unit_tests_oprof-driver.$(OBJEXT) \ mesh/unit_tests_oprof-mesh_stitch.$(OBJEXT) \ mesh/unit_tests_oprof-mesh_triangulation.$(OBJEXT) \ mesh/unit_tests_oprof-mixed_dim_mesh_test.$(OBJEXT) \ + mesh/unit_tests_oprof-mixed_order_test.$(OBJEXT) \ mesh/unit_tests_oprof-nodal_neighbors.$(OBJEXT) \ mesh/unit_tests_oprof-libmesh_poly2tri.$(OBJEXT) \ mesh/unit_tests_oprof-slit_mesh_test.$(OBJEXT) \ @@ -805,9 +808,9 @@ am__unit_tests_opt_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -910,6 +913,7 @@ am__objects_9 = unit_tests_opt-driver.$(OBJEXT) \ mesh/unit_tests_opt-mesh_stitch.$(OBJEXT) \ mesh/unit_tests_opt-mesh_triangulation.$(OBJEXT) \ mesh/unit_tests_opt-mixed_dim_mesh_test.$(OBJEXT) \ + mesh/unit_tests_opt-mixed_order_test.$(OBJEXT) \ mesh/unit_tests_opt-nodal_neighbors.$(OBJEXT) \ mesh/unit_tests_opt-libmesh_poly2tri.$(OBJEXT) \ mesh/unit_tests_opt-slit_mesh_test.$(OBJEXT) \ @@ -998,9 +1002,9 @@ am__unit_tests_prof_SOURCES_DIST = driver.C libmesh_cppunit.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -1103,6 +1107,7 @@ am__objects_11 = unit_tests_prof-driver.$(OBJEXT) \ mesh/unit_tests_prof-mesh_stitch.$(OBJEXT) \ mesh/unit_tests_prof-mesh_triangulation.$(OBJEXT) \ mesh/unit_tests_prof-mixed_dim_mesh_test.$(OBJEXT) \ + mesh/unit_tests_prof-mixed_order_test.$(OBJEXT) \ mesh/unit_tests_prof-nodal_neighbors.$(OBJEXT) \ mesh/unit_tests_prof-libmesh_poly2tri.$(OBJEXT) \ mesh/unit_tests_prof-slit_mesh_test.$(OBJEXT) \ @@ -1360,6 +1365,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_dbg-mesh_stitch.Po \ mesh/$(DEPDIR)/unit_tests_dbg-mesh_triangulation.Po \ mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po \ + mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po \ mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po \ @@ -1393,6 +1399,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_devel-mesh_stitch.Po \ mesh/$(DEPDIR)/unit_tests_devel-mesh_triangulation.Po \ mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po \ + mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po \ mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po \ @@ -1426,6 +1433,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_oprof-mesh_stitch.Po \ mesh/$(DEPDIR)/unit_tests_oprof-mesh_triangulation.Po \ mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po \ + mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po \ mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po \ @@ -1459,6 +1467,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_opt-mesh_stitch.Po \ mesh/$(DEPDIR)/unit_tests_opt-mesh_triangulation.Po \ mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po \ + mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po \ mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po \ @@ -1492,6 +1501,7 @@ am__depfiles_remade = ./$(DEPDIR)/unit_tests_dbg-driver.Po \ mesh/$(DEPDIR)/unit_tests_prof-mesh_stitch.Po \ mesh/$(DEPDIR)/unit_tests_prof-mesh_triangulation.Po \ mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po \ + mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po \ mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po \ mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po \ @@ -2204,9 +2214,9 @@ unit_tests_sources = driver.C libmesh_cppunit.h stream_redirector.h \ mesh/mesh_function.C mesh/mesh_function_dfem.C \ mesh/mesh_generation_test.C mesh/mesh_input.C \ mesh/mesh_stitch.C mesh/mesh_triangulation.C \ - mesh/mixed_dim_mesh_test.C mesh/nodal_neighbors.C \ - mesh/libmesh_poly2tri.C mesh/slit_mesh_test.C \ - mesh/spatial_dimension_test.C \ + mesh/mixed_dim_mesh_test.C mesh/mixed_order_test.C \ + mesh/nodal_neighbors.C mesh/libmesh_poly2tri.C \ + mesh/slit_mesh_test.C mesh/spatial_dimension_test.C \ mesh/mapped_subdomain_partitioner_test.C \ mesh/write_elemset_data.C mesh/write_sideset_data.C \ mesh/write_nodeset_data.C mesh/write_edgeset_data.C \ @@ -2492,6 +2502,8 @@ mesh/unit_tests_dbg-mesh_triangulation.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_dbg-mixed_dim_mesh_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_dbg-mixed_order_test.$(OBJEXT): mesh/$(am__dirstamp) \ + mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_dbg-nodal_neighbors.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_dbg-libmesh_poly2tri.$(OBJEXT): mesh/$(am__dirstamp) \ @@ -2766,6 +2778,8 @@ mesh/unit_tests_devel-mesh_triangulation.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_devel-mixed_dim_mesh_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_devel-mixed_order_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_devel-nodal_neighbors.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_devel-libmesh_poly2tri.$(OBJEXT): \ @@ -2992,6 +3006,8 @@ mesh/unit_tests_oprof-mesh_triangulation.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_oprof-mixed_dim_mesh_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_oprof-mixed_order_test.$(OBJEXT): \ + mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_oprof-nodal_neighbors.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_oprof-libmesh_poly2tri.$(OBJEXT): \ @@ -3218,6 +3234,8 @@ mesh/unit_tests_opt-mesh_triangulation.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_opt-mixed_dim_mesh_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_opt-mixed_order_test.$(OBJEXT): mesh/$(am__dirstamp) \ + mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_opt-nodal_neighbors.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_opt-libmesh_poly2tri.$(OBJEXT): mesh/$(am__dirstamp) \ @@ -3444,6 +3462,8 @@ mesh/unit_tests_prof-mesh_triangulation.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_prof-mixed_dim_mesh_test.$(OBJEXT): \ mesh/$(am__dirstamp) mesh/$(DEPDIR)/$(am__dirstamp) +mesh/unit_tests_prof-mixed_order_test.$(OBJEXT): mesh/$(am__dirstamp) \ + mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_prof-nodal_neighbors.$(OBJEXT): mesh/$(am__dirstamp) \ mesh/$(DEPDIR)/$(am__dirstamp) mesh/unit_tests_prof-libmesh_poly2tri.$(OBJEXT): mesh/$(am__dirstamp) \ @@ -3765,6 +3785,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mesh_stitch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mesh_triangulation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -3798,6 +3819,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mesh_stitch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mesh_triangulation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -3831,6 +3853,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mesh_stitch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mesh_triangulation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -3864,6 +3887,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mesh_stitch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mesh_triangulation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -3897,6 +3921,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mesh_stitch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mesh_triangulation.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po@am__quote@ # am--include-marker @@ -4898,6 +4923,20 @@ mesh/unit_tests_dbg-mixed_dim_mesh_test.obj: mesh/mixed_dim_mesh_test.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-mixed_dim_mesh_test.obj `if test -f 'mesh/mixed_dim_mesh_test.C'; then $(CYGPATH_W) 'mesh/mixed_dim_mesh_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_dim_mesh_test.C'; fi` +mesh/unit_tests_dbg-mixed_order_test.o: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_dbg-mixed_order_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Tpo -c -o mesh/unit_tests_dbg-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_dbg-mixed_order_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C + +mesh/unit_tests_dbg-mixed_order_test.obj: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_dbg-mixed_order_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Tpo -c -o mesh/unit_tests_dbg-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_dbg-mixed_order_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_dbg-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` + mesh/unit_tests_dbg-nodal_neighbors.o: mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_dbg_CPPFLAGS) $(CPPFLAGS) $(unit_tests_dbg_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_dbg-nodal_neighbors.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Tpo -c -o mesh/unit_tests_dbg-nodal_neighbors.o `test -f 'mesh/nodal_neighbors.C' || echo '$(srcdir)/'`mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Tpo mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po @@ -6410,6 +6449,20 @@ mesh/unit_tests_devel-mixed_dim_mesh_test.obj: mesh/mixed_dim_mesh_test.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-mixed_dim_mesh_test.obj `if test -f 'mesh/mixed_dim_mesh_test.C'; then $(CYGPATH_W) 'mesh/mixed_dim_mesh_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_dim_mesh_test.C'; fi` +mesh/unit_tests_devel-mixed_order_test.o: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_devel-mixed_order_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Tpo -c -o mesh/unit_tests_devel-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_devel-mixed_order_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C + +mesh/unit_tests_devel-mixed_order_test.obj: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_devel-mixed_order_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Tpo -c -o mesh/unit_tests_devel-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_devel-mixed_order_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_devel-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` + mesh/unit_tests_devel-nodal_neighbors.o: mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_devel_CPPFLAGS) $(CPPFLAGS) $(unit_tests_devel_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_devel-nodal_neighbors.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Tpo -c -o mesh/unit_tests_devel-nodal_neighbors.o `test -f 'mesh/nodal_neighbors.C' || echo '$(srcdir)/'`mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Tpo mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po @@ -7922,6 +7975,20 @@ mesh/unit_tests_oprof-mixed_dim_mesh_test.obj: mesh/mixed_dim_mesh_test.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-mixed_dim_mesh_test.obj `if test -f 'mesh/mixed_dim_mesh_test.C'; then $(CYGPATH_W) 'mesh/mixed_dim_mesh_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_dim_mesh_test.C'; fi` +mesh/unit_tests_oprof-mixed_order_test.o: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_oprof-mixed_order_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Tpo -c -o mesh/unit_tests_oprof-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_oprof-mixed_order_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C + +mesh/unit_tests_oprof-mixed_order_test.obj: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_oprof-mixed_order_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Tpo -c -o mesh/unit_tests_oprof-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_oprof-mixed_order_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_oprof-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` + mesh/unit_tests_oprof-nodal_neighbors.o: mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_oprof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_oprof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_oprof-nodal_neighbors.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Tpo -c -o mesh/unit_tests_oprof-nodal_neighbors.o `test -f 'mesh/nodal_neighbors.C' || echo '$(srcdir)/'`mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Tpo mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po @@ -9434,6 +9501,20 @@ mesh/unit_tests_opt-mixed_dim_mesh_test.obj: mesh/mixed_dim_mesh_test.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-mixed_dim_mesh_test.obj `if test -f 'mesh/mixed_dim_mesh_test.C'; then $(CYGPATH_W) 'mesh/mixed_dim_mesh_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_dim_mesh_test.C'; fi` +mesh/unit_tests_opt-mixed_order_test.o: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_opt-mixed_order_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Tpo -c -o mesh/unit_tests_opt-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_opt-mixed_order_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C + +mesh/unit_tests_opt-mixed_order_test.obj: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_opt-mixed_order_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Tpo -c -o mesh/unit_tests_opt-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_opt-mixed_order_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_opt-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` + mesh/unit_tests_opt-nodal_neighbors.o: mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_opt_CPPFLAGS) $(CPPFLAGS) $(unit_tests_opt_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_opt-nodal_neighbors.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Tpo -c -o mesh/unit_tests_opt-nodal_neighbors.o `test -f 'mesh/nodal_neighbors.C' || echo '$(srcdir)/'`mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Tpo mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po @@ -10946,6 +11027,20 @@ mesh/unit_tests_prof-mixed_dim_mesh_test.obj: mesh/mixed_dim_mesh_test.C @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-mixed_dim_mesh_test.obj `if test -f 'mesh/mixed_dim_mesh_test.C'; then $(CYGPATH_W) 'mesh/mixed_dim_mesh_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_dim_mesh_test.C'; fi` +mesh/unit_tests_prof-mixed_order_test.o: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_prof-mixed_order_test.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Tpo -c -o mesh/unit_tests_prof-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_prof-mixed_order_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-mixed_order_test.o `test -f 'mesh/mixed_order_test.C' || echo '$(srcdir)/'`mesh/mixed_order_test.C + +mesh/unit_tests_prof-mixed_order_test.obj: mesh/mixed_order_test.C +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_prof-mixed_order_test.obj -MD -MP -MF mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Tpo -c -o mesh/unit_tests_prof-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Tpo mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mesh/mixed_order_test.C' object='mesh/unit_tests_prof-mixed_order_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -c -o mesh/unit_tests_prof-mixed_order_test.obj `if test -f 'mesh/mixed_order_test.C'; then $(CYGPATH_W) 'mesh/mixed_order_test.C'; else $(CYGPATH_W) '$(srcdir)/mesh/mixed_order_test.C'; fi` + mesh/unit_tests_prof-nodal_neighbors.o: mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(unit_tests_prof_CPPFLAGS) $(CPPFLAGS) $(unit_tests_prof_CXXFLAGS) $(CXXFLAGS) -MT mesh/unit_tests_prof-nodal_neighbors.o -MD -MP -MF mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Tpo -c -o mesh/unit_tests_prof-nodal_neighbors.o `test -f 'mesh/nodal_neighbors.C' || echo '$(srcdir)/'`mesh/nodal_neighbors.C @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Tpo mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po @@ -12258,6 +12353,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po @@ -12291,6 +12387,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_devel-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po @@ -12324,6 +12421,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po @@ -12357,6 +12455,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_opt-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po @@ -12390,6 +12489,7 @@ distclean: distclean-am -rm -f mesh/$(DEPDIR)/unit_tests_prof-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po @@ -12845,6 +12945,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_dbg-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_dbg-spatial_dimension_test.Po @@ -12878,6 +12979,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_devel-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_devel-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_devel-spatial_dimension_test.Po @@ -12911,6 +13013,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_oprof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_oprof-spatial_dimension_test.Po @@ -12944,6 +13047,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_opt-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_opt-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_opt-spatial_dimension_test.Po @@ -12977,6 +13081,7 @@ maintainer-clean: maintainer-clean-am -rm -f mesh/$(DEPDIR)/unit_tests_prof-mesh_stitch.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mesh_triangulation.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_dim_mesh_test.Po + -rm -f mesh/$(DEPDIR)/unit_tests_prof-mixed_order_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-nodal_neighbors.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-slit_mesh_test.Po -rm -f mesh/$(DEPDIR)/unit_tests_prof-spatial_dimension_test.Po diff --git a/tests/mesh/mixed_order_test.C b/tests/mesh/mixed_order_test.C new file mode 100644 index 00000000000..f52c0b78430 --- /dev/null +++ b/tests/mesh/mixed_order_test.C @@ -0,0 +1,117 @@ +#include + +#include +#include +#include + +#include + +#include "test_comm.h" +#include "libmesh_cppunit.h" + + +using namespace libMesh; + +class MixedOrderTest : public CppUnit::TestCase +{ + /** + * The goal of this test set is to test libMesh manipulation of + * meshes with mixed Elem orders. + */ +public: + LIBMESH_CPPUNIT_TEST_SUITE( MixedOrderTest ); + + CPPUNIT_TEST( testFindNeighbors ); + CPPUNIT_TEST( testStitch ); + + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp() {} + + void tearDown() {} + + static int n_neighbor_links (const MeshBase & mesh) + { + int n_neighbors = 0; + for (const auto & elem : mesh.local_element_ptr_range()) + for (const auto & neigh : elem->neighbor_ptr_range()) + if (neigh) + ++n_neighbors; + mesh.comm().sum(n_neighbors); + return n_neighbors; + } + + + void testFindNeighbors() + { + LOG_UNIT_TEST; + + Mesh mesh(*TestCommWorld); + + // Construct a multi-element Tri3 mesh + MeshTools::Generation::build_square(mesh, + /*nx=*/3, /*ny=*/3, + /*xmin=*/0., /*xmax=*/1., + /*ymin=*/0., /*ymax=*/1., + /*elem_type=*/TRI3); + + // Make some of them into Tri6 + auto range_start = mesh.elements_begin(); + const auto range_end = mesh.elements_end(); + while (range_start != range_end && (*range_start)->id() < 5) + ++range_start; + + const int old_n_neighbors = n_neighbor_links(mesh); + + mesh.all_second_order_range({range_start,range_end}, + /*full_ordered=*/true); + const int new_n_neighbors = n_neighbor_links(mesh); + CPPUNIT_ASSERT_EQUAL(old_n_neighbors, new_n_neighbors); + + mesh.find_neighbors(); + const int newer_n_neighbors = n_neighbor_links(mesh); + CPPUNIT_ASSERT_EQUAL(old_n_neighbors, newer_n_neighbors); + } + + void testStitch() + { + LOG_UNIT_TEST; + + Mesh mesh0(*TestCommWorld), + mesh1(*TestCommWorld); + + // Quad4 mesh and Quad9 mesh + MeshTools::Generation::build_square(mesh0, + /*nx=*/3, /*ny=*/3, + /*xmin=*/0., /*xmax=*/1., + /*ymin=*/0., /*ymax=*/1., + /*elem_type=*/QUAD4); + CPPUNIT_ASSERT_EQUAL(mesh0.n_nodes(), dof_id_type(16)); + + MeshTools::Generation::build_square(mesh1, + /*nx=*/3, /*ny=*/3, + /*xmin=*/-1., /*xmax=*/0., + /*ymin=*/0., /*ymax=*/1., + /*elem_type=*/QUAD9); + CPPUNIT_ASSERT_EQUAL(mesh1.n_nodes(), dof_id_type(49)); + + // Stitch them together + mesh0.stitch_meshes(mesh1, 3, 1, TOLERANCE, /*clear_bcids*/ true, + /*verbose*/ false, /*binary_search*/ false, + /*enforce_all_nodes_match*/ false, + /*merge_all_or_nothing*/ false); + CPPUNIT_ASSERT_EQUAL(mesh0.n_nodes(), dof_id_type(61)); + + const int stitched_n_neighbors = n_neighbor_links(mesh0); + CPPUNIT_ASSERT_EQUAL(stitched_n_neighbors, 54); + + mesh0.all_second_order_range(mesh0.element_ptr_range(), + /*full_ordered=*/true); + const int new_n_neighbors = n_neighbor_links(mesh0); + CPPUNIT_ASSERT_EQUAL(new_n_neighbors, 54); + } +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION( MixedOrderTest );