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,14 @@ 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 =
92+ on_displaced ? _displaced_mortar_segment_triangulation_map : _mortar_segment_triangulation_map ;
93+ auto & triangulate_triangles_map =
94+ on_displaced ? _displaced_triangulate_triangles_map : _triangulate_triangles_map ;
4395 auto & mortar_interfaces = on_displaced ? _displaced_mortar_interfaces : _mortar_interfaces ;
96+ const auto parsed_options = parseTriangulationOptions (triangulation );
97+ const auto & mortar_segment_triangulation_name = parsed_options .canonical_name ;
98+ const auto triangulation_mode = parsed_options .mode ;
4499
45100 // Periodic flag
46101 auto periodic_map_iterator = periodic_map .find (boundary_key );
@@ -60,6 +115,26 @@ MortarInterfaceWarehouse::createMortarInterface(
60115 else
61116 debug_flag_map .insert (debug_flag_map_iterator , std ::make_pair (boundary_key , debug ));
62117
118+ auto mortar_segment_triangulation_map_iterator =
119+ mortar_segment_triangulation_map .find (boundary_key );
120+ if (mortar_segment_triangulation_map_iterator != mortar_segment_triangulation_map .end () &&
121+ mortar_segment_triangulation_map_iterator -> second != mortar_segment_triangulation_name )
122+ mooseError ("We do not currently support multiple values of 'triangulation' on the same "
123+ "boundary primary-secondary surface pair." );
124+ else
125+ mortar_segment_triangulation_map .insert (
126+ mortar_segment_triangulation_map_iterator ,
127+ std ::make_pair (boundary_key , mortar_segment_triangulation_name ));
128+
129+ auto triangulate_triangles_map_iterator = triangulate_triangles_map .find (boundary_key );
130+ if (triangulate_triangles_map_iterator != triangulate_triangles_map .end () &&
131+ triangulate_triangles_map_iterator -> second != triangulate_triangles )
132+ mooseError ("We do not currently support multiple values of 'triangulate_triangles' on the "
133+ "same boundary primary-secondary surface pair." );
134+ else
135+ triangulate_triangles_map .insert (triangulate_triangles_map_iterator ,
136+ std ::make_pair (boundary_key , triangulate_triangles ));
137+
63138 // Generate lower-d mesh
64139 if (mortar_interfaces .find (boundary_key ) == mortar_interfaces .end ())
65140 {
@@ -73,7 +148,9 @@ MortarInterfaceWarehouse::createMortarInterface(
73148 periodic ,
74149 debug ,
75150 correct_edge_dropping ,
76- minimum_projection_angle ));
151+ minimum_projection_angle ,
152+ triangulation_mode ,
153+ triangulate_triangles ));
77154 if (inserted )
78155 it -> second -> initOutput ();
79156 }
0 commit comments