@@ -40,6 +40,7 @@ public:
40
40
CPPUNIT_TEST ( testPoly2TriInterp2 );
41
41
CPPUNIT_TEST ( testPoly2TriHoles );
42
42
CPPUNIT_TEST ( testPoly2TriMeshedHoles );
43
+ CPPUNIT_TEST ( testPoly2TriEdge3ToTri6 );
43
44
# ifdef LIBMESH_ENABLE_AMR
44
45
CPPUNIT_TEST ( testPoly2TriRoundHole );
45
46
# endif
@@ -76,6 +77,7 @@ public:
76
77
# endif
77
78
CPPUNIT_TEST ( testTriangleEdges );
78
79
CPPUNIT_TEST ( testTriangleSegments );
80
+ CPPUNIT_TEST ( testTriangleEdge3ToTri6 );
79
81
#endif
80
82
81
83
CPPUNIT_TEST_SUITE_END ();
@@ -334,6 +336,38 @@ public:
334
336
}
335
337
}
336
338
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
+ }
337
371
338
372
void testTriangulator (MeshBase & mesh ,
339
373
TriangulatorInterface & triangulator )
@@ -664,6 +698,38 @@ public:
664
698
mesh .prepare_for_use ();
665
699
}
666
700
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
+
667
733
668
734
void testHalfDomain (MeshBase & mesh ,
669
735
TriangulatorInterface & triangulator ,
@@ -810,7 +876,6 @@ public:
810
876
this -> testTriangulatorBase (mesh , triangulator );
811
877
}
812
878
813
-
814
879
void testTriangleSegments ()
815
880
{
816
881
LOG_UNIT_TEST ;
@@ -819,6 +884,19 @@ public:
819
884
TriangleInterface triangle (mesh );
820
885
testTriangulatorSegments (mesh , triangle );
821
886
}
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
+
822
900
#endif // LIBMESH_HAVE_TRIANGLE
823
901
824
902
@@ -892,6 +970,18 @@ public:
892
970
testTriangulatorMeshedHoles (mesh , p2t_tri );
893
971
}
894
972
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
+
895
985
896
986
#ifdef LIBMESH_ENABLE_AMR
897
987
void testPoly2TriRoundHole ()
0 commit comments