@@ -40,6 +40,7 @@ public:
40
40
CPPUNIT_TEST ( testPoly2TriInterp2 );
41
41
CPPUNIT_TEST ( testPoly2TriHoles );
42
42
CPPUNIT_TEST ( testPoly2TriMeshedHoles );
43
+ CPPUNIT_TEST ( testEdge3ToTri6 );
43
44
# ifdef LIBMESH_ENABLE_AMR
44
45
CPPUNIT_TEST ( testPoly2TriRoundHole );
45
46
# endif
@@ -810,6 +811,71 @@ public:
810
811
this -> testTriangulatorBase (mesh , triangulator );
811
812
}
812
813
814
+ void testEdge3ToTri6 ()
815
+ {
816
+ LOG_UNIT_TEST ;
817
+
818
+ Mesh mesh (* TestCommWorld );
819
+ TriangleInterface triangulator (mesh );
820
+
821
+ const Real hsq2 = std ::sqrt (2 ) / 2.0 ;
822
+ auto node0 = mesh .add_point (Point (1 ,0 ), 0 );
823
+ auto node1 = mesh .add_point (Point (hsq2 ,hsq2 ), 1 );
824
+ auto node2 = mesh .add_point (Point (0 ,1 ), 2 );
825
+ auto node3 = mesh .add_point (Point (- hsq2 ,hsq2 ), 3 );
826
+ auto node4 = mesh .add_point (Point (-1 ,0 ), 4 );
827
+ auto node5 = mesh .add_point (Point (- hsq2 ,- hsq2 ), 5 );
828
+ auto node6 = mesh .add_point (Point (0 ,-1 ), 6 );
829
+ auto node7 = mesh .add_point (Point (hsq2 ,- hsq2 ), 7 );
830
+
831
+ auto edge021 = mesh .add_elem (Elem ::build (EDGE3 ));
832
+ edge021 -> set_node (0 ) = node0 ;
833
+ edge021 -> set_node (1 ) = node2 ;
834
+ edge021 -> set_node (2 ) = node1 ;
835
+ auto edge243 = mesh .add_elem (Elem ::build (EDGE3 ));
836
+ edge243 -> set_node (0 ) = node2 ;
837
+ edge243 -> set_node (1 ) = node4 ;
838
+ edge243 -> set_node (2 ) = node3 ;
839
+ auto edge465 = mesh .add_elem (Elem ::build (EDGE3 ));
840
+ edge465 -> set_node (0 ) = node4 ;
841
+ edge465 -> set_node (1 ) = node6 ;
842
+ edge465 -> set_node (2 ) = node5 ;
843
+ auto edge607 = mesh .add_elem (Elem ::build (EDGE3 ));
844
+ edge607 -> set_node (0 ) = node6 ;
845
+ edge607 -> set_node (1 ) = node0 ;
846
+ edge607 -> set_node (2 ) = node7 ;
847
+
848
+ mesh .prepare_for_use ();
849
+
850
+ commonSettings (triangulator );
851
+
852
+ triangulator .elem_type () = TRI6 ;
853
+ triangulator .triangulate ();
854
+
855
+ // Check element number
856
+ CPPUNIT_ASSERT_EQUAL (mesh .n_elem (), (dof_id_type )2 );
857
+ for (const auto & elem : mesh .element_ptr_range ())
858
+ {
859
+ // Check element type
860
+ CPPUNIT_ASSERT_EQUAL (elem -> type (), TRI6 );
861
+
862
+ for (const auto & i_side : make_range (elem -> n_sides ()))
863
+ {
864
+ // We only want to check the sides on the external boundary
865
+ if (elem -> neighbor_ptr (i_side ) == nullptr )
866
+ {
867
+ const Point & side_pt_0 = * (elem -> node_ptr (i_side ));
868
+ const Point & side_pt_1 = * (elem -> node_ptr ((i_side + 1 ) % 3 ));
869
+ const Point & side_pt_2 = * (elem -> node_ptr (i_side + 3 ));
870
+ const bool x_sign = (side_pt_0 (0 ) == 1 || side_pt_1 (0 ) == 1 );
871
+ const bool y_sign = (side_pt_0 (1 ) == 1 || side_pt_1 (1 ) == 1 );
872
+ const Point ref_side_pt_2 = Point (x_sign ? hsq2 : - hsq2 , y_sign ? hsq2 : - hsq2 );
873
+ CPPUNIT_ASSERT_EQUAL (ref_side_pt_2 , side_pt_2 );
874
+ }
875
+ }
876
+ }
877
+ }
878
+
813
879
814
880
void testTriangleSegments ()
815
881
{
0 commit comments