Skip to content

Commit 216ba86

Browse files
committed
add edge3 triangulation test
1 parent 6e12149 commit 216ba86

File tree

1 file changed

+91
-1
lines changed

1 file changed

+91
-1
lines changed

tests/mesh/mesh_triangulation.C

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public:
4040
CPPUNIT_TEST( testPoly2TriInterp2 );
4141
CPPUNIT_TEST( testPoly2TriHoles );
4242
CPPUNIT_TEST( testPoly2TriMeshedHoles );
43+
CPPUNIT_TEST( testPoly2TriEdge3ToTri6 );
4344
# ifdef LIBMESH_ENABLE_AMR
4445
CPPUNIT_TEST( testPoly2TriRoundHole );
4546
# endif
@@ -76,6 +77,7 @@ public:
7677
# endif
7778
CPPUNIT_TEST( testTriangleEdges );
7879
CPPUNIT_TEST( testTriangleSegments );
80+
CPPUNIT_TEST( testTriangleEdge3ToTri6 );
7981
#endif
8082

8183
CPPUNIT_TEST_SUITE_END();
@@ -334,6 +336,38 @@ public:
334336
}
335337
}
336338

339+
void testEdge3ToTri6Base(MeshBase & mesh,
340+
TriangulatorInterface & triangulator)
341+
{
342+
commonSettings(triangulator);
343+
344+
triangulator.elem_type() = TRI6;
345+
triangulator.triangulate();
346+
const Real hsq2 = std::sqrt(2) / 2.0;
347+
348+
// Check element number
349+
CPPUNIT_ASSERT_EQUAL(mesh.n_elem(), (dof_id_type)2);
350+
for (const auto & elem : mesh.element_ptr_range())
351+
{
352+
// Check element type
353+
CPPUNIT_ASSERT_EQUAL(elem->type(), TRI6);
354+
355+
for (const auto & i_side : make_range(elem->n_sides()))
356+
{
357+
// We only want to check the sides on the external boundary
358+
if (elem->neighbor_ptr(i_side) == nullptr)
359+
{
360+
const Point & side_pt_0 = *(elem->node_ptr(i_side));
361+
const Point & side_pt_1 = *(elem->node_ptr((i_side + 1) % 3));
362+
const Point & side_pt_2 = *(elem->node_ptr(i_side + 3));
363+
const bool x_sign = (side_pt_0(0) == 1 || side_pt_1(0) == 1);
364+
const bool y_sign = (side_pt_0(1) == 1 || side_pt_1(1) == 1);
365+
const Point ref_side_pt_2 = Point (x_sign ? hsq2 : -hsq2, y_sign ? hsq2 : -hsq2);
366+
CPPUNIT_ASSERT_EQUAL(ref_side_pt_2, side_pt_2);
367+
}
368+
}
369+
}
370+
}
337371

338372
void testTriangulator(MeshBase & mesh,
339373
TriangulatorInterface & triangulator)
@@ -664,6 +698,38 @@ public:
664698
mesh.prepare_for_use();
665699
}
666700

701+
void testEdge3Mesh(MeshBase & mesh)
702+
{
703+
const Real hsq2 = std::sqrt(2) / 2.0;
704+
auto node0 = mesh.add_point(Point(1,0), 0);
705+
auto node1 = mesh.add_point(Point(hsq2,hsq2), 1);
706+
auto node2 = mesh.add_point(Point(0,1), 2);
707+
auto node3 = mesh.add_point(Point(-hsq2,hsq2), 3);
708+
auto node4 = mesh.add_point(Point(-1,0), 4);
709+
auto node5 = mesh.add_point(Point(-hsq2,-hsq2), 5);
710+
auto node6 = mesh.add_point(Point(0,-1), 6);
711+
auto node7 = mesh.add_point(Point(hsq2,-hsq2), 7);
712+
713+
auto edge021 = mesh.add_elem(Elem::build(EDGE3));
714+
edge021->set_node(0) = node0;
715+
edge021->set_node(1) = node2;
716+
edge021->set_node(2) = node1;
717+
auto edge243 = mesh.add_elem(Elem::build(EDGE3));
718+
edge243->set_node(0) = node2;
719+
edge243->set_node(1) = node4;
720+
edge243->set_node(2) = node3;
721+
auto edge465 = mesh.add_elem(Elem::build(EDGE3));
722+
edge465->set_node(0) = node4;
723+
edge465->set_node(1) = node6;
724+
edge465->set_node(2) = node5;
725+
auto edge607 = mesh.add_elem(Elem::build(EDGE3));
726+
edge607->set_node(0) = node6;
727+
edge607->set_node(1) = node0;
728+
edge607->set_node(2) = node7;
729+
730+
mesh.prepare_for_use();
731+
}
732+
667733

668734
void testHalfDomain(MeshBase & mesh,
669735
TriangulatorInterface & triangulator,
@@ -810,7 +876,6 @@ public:
810876
this->testTriangulatorBase(mesh, triangulator);
811877
}
812878

813-
814879
void testTriangleSegments()
815880
{
816881
LOG_UNIT_TEST;
@@ -819,6 +884,19 @@ public:
819884
TriangleInterface triangle(mesh);
820885
testTriangulatorSegments(mesh, triangle);
821886
}
887+
888+
void testTriangleEdge3ToTri6()
889+
{
890+
LOG_UNIT_TEST;
891+
892+
Mesh mesh(*TestCommWorld);
893+
TriangleInterface triangulator(mesh);
894+
895+
testEdge3Mesh(mesh);
896+
897+
this->testEdge3ToTri6Base(mesh, triangulator);
898+
}
899+
822900
#endif // LIBMESH_HAVE_TRIANGLE
823901

824902

@@ -892,6 +970,18 @@ public:
892970
testTriangulatorMeshedHoles(mesh, p2t_tri);
893971
}
894972

973+
void testPoly2TriEdge3ToTri6()
974+
{
975+
LOG_UNIT_TEST;
976+
977+
Mesh mesh(*TestCommWorld);
978+
Poly2TriTriangulator triangulator(mesh);
979+
980+
testEdge3Mesh(mesh);
981+
982+
this->testEdge3ToTri6Base(mesh, triangulator);
983+
}
984+
895985

896986
#ifdef LIBMESH_ENABLE_AMR
897987
void testPoly2TriRoundHole()

0 commit comments

Comments
 (0)