1111#include "SubProblem.h"
1212#include "MooseMesh.h"
1313#include "MooseError.h"
14+ #include "MooseEnum.h"
1415#include "MortarExecutorInterface.h"
1516#include "AutomaticMortarGeneration.h"
1617
18+ namespace
19+ {
20+ struct ParsedMortarTriangulationOptions
21+ {
22+ MortarSegmentTriangulationMode mode = MortarSegmentTriangulationMode ::vertex ;
23+ std ::string canonical_name = "vertex ";
24+ };
25+
26+ ParsedMortarTriangulationOptions
27+ parseTriangulationOptions (const MooseEnum & triangulation )
28+ {
29+ ParsedMortarTriangulationOptions options ;
30+
31+ if (triangulation == "vertex" )
32+ {
33+ options .mode = MortarSegmentTriangulationMode ::vertex ;
34+ options .canonical_name = "vertex" ;
35+ return options ;
36+ }
37+ if (triangulation == "centroid" )
38+ {
39+ options .mode = MortarSegmentTriangulationMode ::centroid ;
40+ options .canonical_name = "centroid" ;
41+ return options ;
42+ }
43+ if (triangulation == "ear_clipping" )
44+ {
45+ options .mode = MortarSegmentTriangulationMode ::ear_clipping ;
46+ options .canonical_name = "ear_clipping" ;
47+ return options ;
48+ }
49+ #if defined(LIBMESH_HAVE_TRIANGLE ) || defined(LIBMESH_HAVE_POLY2TRI )
50+ if (triangulation == "delaunay" )
51+ {
52+ options .mode = MortarSegmentTriangulationMode ::delaunay ;
53+ options .canonical_name = "delaunay" ;
54+ return options ;
55+ }
56+ #endif
57+
58+ mooseError ("Unsupported mortar triangulation option: " , triangulation );
59+ return options ;
60+ }
61+ }
62+
1763MortarInterfaceWarehouse ::MortarInterfaceWarehouse (const libMesh ::ParallelObject & other )
1864 : libMesh ::ParallelObject (other ), _mortar_initd (false)
1965{
@@ -28,7 +74,9 @@ MortarInterfaceWarehouse::createMortarInterface(
2874 bool periodic ,
2975 const bool debug ,
3076 const bool correct_edge_dropping ,
31- const Real minimum_projection_angle )
77+ const Real minimum_projection_angle ,
78+ const MooseEnum & triangulation ,
79+ const bool triangulate_triangles )
3280{
3381 _mortar_subdomain_coverage .insert (subdomain_key .first );
3482 _mortar_subdomain_coverage .insert (subdomain_key .second );
@@ -40,7 +88,15 @@ MortarInterfaceWarehouse::createMortarInterface(
4088
4189 auto & periodic_map = on_displaced ? _displaced_periodic_map : _periodic_map ;
4290 auto & debug_flag_map = on_displaced ? _displaced_debug_flag_map : _debug_flag_map ;
91+ auto & mortar_segment_triangulation_map = on_displaced
92+ ? _displaced_mortar_segment_triangulation_map
93+ : _mortar_segment_triangulation_map ;
94+ auto & triangulate_triangles_map =
95+ on_displaced ? _displaced_triangulate_triangles_map : _triangulate_triangles_map ;
4396 auto & mortar_interfaces = on_displaced ? _displaced_mortar_interfaces : _mortar_interfaces ;
97+ const auto parsed_options = parseTriangulationOptions (triangulation );
98+ const auto & mortar_segment_triangulation_name = parsed_options .canonical_name ;
99+ const auto triangulation_mode = parsed_options .mode ;
44100
45101 // Periodic flag
46102 auto periodic_map_iterator = periodic_map .find (boundary_key );
@@ -60,6 +116,26 @@ MortarInterfaceWarehouse::createMortarInterface(
60116 else
61117 debug_flag_map .insert (debug_flag_map_iterator , std ::make_pair (boundary_key , debug ));
62118
119+ auto mortar_segment_triangulation_map_iterator =
120+ mortar_segment_triangulation_map .find (boundary_key );
121+ if (mortar_segment_triangulation_map_iterator != mortar_segment_triangulation_map .end () &&
122+ mortar_segment_triangulation_map_iterator -> second != mortar_segment_triangulation_name )
123+ mooseError ("We do not currently support multiple values of 'triangulation' on the same "
124+ "boundary primary-secondary surface pair." );
125+ else
126+ mortar_segment_triangulation_map .insert (
127+ mortar_segment_triangulation_map_iterator ,
128+ std ::make_pair (boundary_key , mortar_segment_triangulation_name ));
129+
130+ auto triangulate_triangles_map_iterator = triangulate_triangles_map .find (boundary_key );
131+ if (triangulate_triangles_map_iterator != triangulate_triangles_map .end () &&
132+ triangulate_triangles_map_iterator -> second != triangulate_triangles )
133+ mooseError ("We do not currently support multiple values of 'triangulate_triangles' on the "
134+ "same boundary primary-secondary surface pair." );
135+ else
136+ triangulate_triangles_map .insert (triangulate_triangles_map_iterator ,
137+ std ::make_pair (boundary_key , triangulate_triangles ));
138+
63139 // Generate lower-d mesh
64140 if (mortar_interfaces .find (boundary_key ) == mortar_interfaces .end ())
65141 {
@@ -73,7 +149,9 @@ MortarInterfaceWarehouse::createMortarInterface(
73149 periodic ,
74150 debug ,
75151 correct_edge_dropping ,
76- minimum_projection_angle ));
152+ minimum_projection_angle ,
153+ triangulation_mode ,
154+ triangulate_triangles ));
77155 if (inserted )
78156 it -> second -> initOutput ();
79157 }
0 commit comments