27 #ifndef OOMPH_QUAD_FROM_TRIANGLE_MESH_TEMPLATE_HEADER
28 #define OOMPH_QUAD_FROM_TRIANGLE_MESH_TEMPLATE_HEADER
43 #ifdef OOMPH_HAS_FPUCONTROLH
44 #include <fpu_control.h>
48 #include "../generic/problem.h"
49 #include "../generic/quad_mesh.h"
51 #include "../generic/triangle_scaffold_mesh.h"
52 #include "../generic/unstructured_two_d_mesh_geometry_base.h"
53 #include "../generic/refineable_quad_mesh.h"
54 #include "../generic/Qelements.h"
69 template<
class ELEMENT>
77 #ifdef OOMPH_HAS_TRIANGLE_LIB
84 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(2);
93 const bool& use_attributes =
false,
94 const bool& allow_automatic_creation_of_vertices_on_boundaries =
true)
97 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(2);
101 allow_automatic_creation_of_vertices_on_boundaries;
111 node_file_name, element_file_name, poly_file_name);
122 for (
unsigned ibound = 0; ibound < nbound; ibound++)
124 this->
template setup_boundary_coordinates<ELEMENT>(ibound);
128 #ifdef OOMPH_HAS_TRIANGLE_LIB
138 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(2);
142 triangle_mesh_parameters
156 unsigned max_boundary_id = 0;
169 if (outer_boundary_pt.size() == 0)
171 std::stringstream error_message;
173 <<
"There are no outer boundaries defined.\n"
174 <<
"Verify that you have specified the outer boundaries in the\n"
175 <<
"Triangle_mesh_parameter object\n\n";
184 unsigned n_outer_boundaries = outer_boundary_pt.size();
187 Vector<TriangleMeshPolygon*> outer_boundary_polygon_pt(
191 for (
unsigned i = 0;
i < n_outer_boundaries; ++
i)
197 outer_boundary_polygon_pt[
i] = this->closed_curve_to_polygon_helper(
198 outer_boundary_pt[
i], max_boundary_id);
206 Vector<TriangleMeshClosedCurve*> internal_closed_curve_pt =
210 unsigned n_internal_closed_curves = internal_closed_curve_pt.size();
215 Vector<TriangleMeshPolygon*> internal_polygon_pt(
216 n_internal_closed_curves);
219 for (
unsigned i = 0;
i < n_internal_closed_curves; ++
i)
223 internal_polygon_pt[
i] = this->closed_curve_to_polygon_helper(
224 internal_closed_curve_pt[
i], max_boundary_id);
232 Vector<TriangleMeshOpenCurve*> internal_open_curve_pt =
236 unsigned n_internal_open_curves = internal_open_curve_pt.size();
239 Vector<TriangleMeshOpenCurve*> internal_open_curve_poly_pt(
240 n_internal_open_curves);
243 for (
unsigned i = 0;
i < n_internal_open_curves;
i++)
248 internal_open_curve_poly_pt[
i] =
249 this->create_open_curve_with_polyline_helper(
250 internal_open_curve_pt[
i], max_boundary_id);
260 for (
unsigned i = 0;
i < n_outer_boundaries;
i++)
262 this->set_geom_objects_and_coordinate_limits_for_close_curve(
263 outer_boundary_pt[
i]);
269 for (
unsigned i = 0;
i < n_internal_closed_curves;
i++)
271 this->set_geom_objects_and_coordinate_limits_for_close_curve(
272 internal_closed_curve_pt[
i]);
278 for (
unsigned i = 0;
i < n_internal_open_curves;
i++)
280 this->set_geom_objects_and_coordinate_limits_for_open_curve(
281 internal_open_curve_pt[
i]);
290 const double element_area = triangle_mesh_parameters.
element_area();
293 Vector<Vector<double>> extra_holes_coordinates =
297 std::map<unsigned, Vector<double>> regions =
303 const bool refine_boundary =
306 const bool refine_internal_boundary =
309 if (!refine_internal_boundary && refine_boundary)
311 std::ostringstream error_stream;
313 <<
"You have specified that Triangle may refine the outer boundary, "
315 <<
"not internal boundaries. Triangle does not support this "
317 <<
"If you do not want Triangle to refine internal boundaries, it "
319 <<
"refine outer boundaries either!\n"
320 <<
"Please either disable all boundary refinement\n"
321 <<
"(call TriangleMeshParameters::disable_boundary_refinement()\n"
322 <<
"or enable internal boundary refinement (the default)\n";
324 throw OomphLibError(error_stream.str().c_str(),
329 this->generic_constructor(
330 outer_boundary_polygon_pt,
332 internal_open_curve_poly_pt,
334 extra_holes_coordinates,
340 refine_internal_boundary);
356 for (
unsigned b = 0;
b <
nb;
b++)
358 this->
template setup_boundary_coordinates<ELEMENT>(
b);
368 void generic_constructor(
369 Vector<TriangleMeshPolygon*>& outer_boundary_pt,
370 Vector<TriangleMeshPolygon*>& internal_polygon_pt,
371 Vector<TriangleMeshOpenCurve*>& open_polylines_pt,
372 const double& element_area,
373 Vector<Vector<double>>& extra_holes_coordinates,
374 std::map<
unsigned, Vector<double>>& regions_coordinates,
375 std::map<unsigned, double>& regions_areas,
376 TimeStepper* time_stepper_pt,
377 const bool& use_attributes,
378 const bool& refine_boundary,
379 const bool& refine_internal_boundary)
383 if (element_area < 10
e-14)
385 std::ostringstream warning_message;
387 <<
"The current elements area was stated to (" << element_area
388 <<
").\nThe current precision to generate the input to triangle "
389 <<
"is fixed to 14 digits\n\n";
390 OomphLibWarning(warning_message.str(),
419 TriangulateIO triangulate_io;
420 TriangulateIO triangulate_out;
423 TriangleHelper::initialise_triangulateio(triangulate_io);
427 UnstructuredTwoDMeshGeometryBase::build_triangulateio(
431 extra_holes_coordinates,
437 TriangleHelper::initialise_triangulateio(triangulate_out);
440 std::stringstream input_string_stream;
441 input_string_stream.precision(14);
442 input_string_stream.setf(std::ios_base::fixed, std::ios_base::floatfield);
448 input_string_stream <<
"-pA -a -a" << element_area <<
" -q30"
454 input_string_stream <<
" -YY";
458 if (refine_boundary ==
false)
460 input_string_stream <<
"-Y";
463 if (refine_internal_boundary ==
false)
465 input_string_stream <<
"Y";
470 char triswitches[100];
471 sprintf(triswitches,
"%s", input_string_stream.str().c_str());
474 triangulate(triswitches, &triangulate_io, &triangulate_out, 0);
476 #ifdef OOMPH_HAS_FPUCONTROLH
478 fpu_control_t cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_DOUBLE;
483 TriangleScaffoldMesh* tmp_mesh_pt =
484 new TriangleScaffoldMesh(triangulate_out);
487 if (!regions_coordinates.empty())
507 bool clear_hole_data =
false;
508 TriangleHelper::clear_triangulateio(triangulate_io, clear_hole_data);
509 TriangleHelper::clear_triangulateio(triangulate_out, clear_hole_data);
523 #ifdef OOMPH_HAS_TRIANGLE_LIB
525 std::set<TriangleMeshCurveSection*>::iterator it_polyline;
530 delete (*it_polyline);
533 std::set<TriangleMeshPolygon*>::iterator it_polygon;
538 delete (*it_polygon);
541 std::set<TriangleMeshOpenCurve*>::iterator it_open_polyline;
546 delete (*it_open_polyline);
555 const bool& use_attributes);
574 template<
class ELEMENT>
580 #ifdef OOMPH_HAS_TRIANGLE_LIB
589 this->setup_quadtree_forest();
600 refine_uniformly(doc_info);
607 unsigned nelem = this->nelement();
627 node_file_name, element_file_name, poly_file_name, time_stepper_pt)
629 this->setup_quadtree_forest();
645 template<
class ELEMENT>
656 const bool& use_attributes =
false)
664 set_lagrangian_nodal_coordinates();
667 #ifdef OOMPH_HAS_TRIANGLE_LIB
678 set_lagrangian_nodal_coordinates();
696 template<
class ELEMENT>
709 const bool& use_attributes =
false)
717 set_lagrangian_nodal_coordinates();
720 #ifdef OOMPH_HAS_TRIANGLE_LIB
733 set_lagrangian_nodal_coordinates();
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: oomph_utilities.h:499
void disable_doc()
Disable documentation.
Definition: oomph_utilities.h:542
std::string directory() const
Output directory.
Definition: oomph_utilities.h:524
static Steady< 0 > Default_TimeStepper
The Steady Timestepper.
Definition: mesh.h:75
unsigned nboundary() const
Return number of boundaries.
Definition: mesh.h:827
Definition: oomph_definitions.h:222
Definition: quad_from_triangle_mesh.template.h:72
TimeStepper * Time_stepper_pt
Timestepper used to build elements.
Definition: quad_from_triangle_mesh.template.h:558
void operator=(const QuadFromTriangleMesh &)=delete
Broken assignment operator.
~QuadFromTriangleMesh()
Empty destructor.
Definition: quad_from_triangle_mesh.template.h:521
QuadFromTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false, const bool &allow_automatic_creation_of_vertices_on_boundaries=true)
Constructor with the input files.
Definition: quad_from_triangle_mesh.template.h:88
bool Use_attributes
Definition: quad_from_triangle_mesh.template.h:562
void build_from_scaffold(TriangleScaffoldMesh *tmp_mesh_pt, TimeStepper *time_stepper_pt, const bool &use_attributes)
Build the quad mesh from the given scaffold mesh.
Definition: quad_from_triangle_mesh.template.cc:71
QuadFromTriangleMesh(const QuadFromTriangleMesh &dummy)=delete
Broken copy constructor.
QuadFromTriangleMesh()
Empty constructor.
Definition: quad_from_triangle_mesh.template.h:75
Base class for quad meshes (meshes made of 2D quad elements).
Definition: quad_mesh.h:57
Unstructured refineable QuadFromTriangleMesh.
Definition: quad_from_triangle_mesh.template.h:578
virtual void refine_uniformly()
Refine mesh uniformly.
Definition: quad_from_triangle_mesh.template.h:595
RefineableQuadFromTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Build mesh, based on the polyfiles.
Definition: quad_from_triangle_mesh.template.h:621
virtual ~RefineableQuadFromTriangleMesh()
Empty Destructor.
Definition: quad_from_triangle_mesh.template.h:633
void refine_uniformly(DocInfo &doc_info)
Refine mesh uniformly and doc process.
Definition: quad_from_triangle_mesh.template.h:604
Definition: refineable_quad_mesh.h:53
Unstructured refineable QuadFromTriangleMesh upgraded to solid mesh.
Definition: quad_from_triangle_mesh.template.h:700
virtual ~RefineableSolidQuadFromTriangleMesh()
Empty Destructor.
Definition: quad_from_triangle_mesh.template.h:739
RefineableSolidQuadFromTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false)
Definition: quad_from_triangle_mesh.template.h:704
Unstructured QuadFromTriangleMesh upgraded to solid mesh.
Definition: quad_from_triangle_mesh.template.h:649
SolidQuadFromTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper, const bool &use_attributes=false)
Definition: quad_from_triangle_mesh.template.h:651
virtual ~SolidQuadFromTriangleMesh()
Empty Destructor.
Definition: quad_from_triangle_mesh.template.h:684
Definition: timesteppers.h:231
Definition: triangle_mesh.template.h:94
Vector< TriangleMeshClosedCurve * > internal_closed_curve_pt() const
Helper function for getting the internal closed boundaries.
Definition: triangle_mesh.template.h:163
bool is_automatic_creation_of_vertices_on_boundaries_allowed()
Definition: triangle_mesh.template.h:361
Vector< Vector< double > > extra_holes_coordinates() const
Helper function for getting the extra holes.
Definition: triangle_mesh.template.h:201
std::map< unsigned, double > & target_area_for_region()
Helper function for getting access to the region's target areas.
Definition: triangle_mesh.template.h:267
bool is_mesh_distributed() const
Boolean to indicate if Mesh has been distributed.
Definition: triangle_mesh.template.h:298
bool is_use_attributes() const
Definition: triangle_mesh.template.h:286
Vector< TriangleMeshClosedCurve * > outer_boundary_pt() const
Helper function for getting the outer boundary.
Definition: triangle_mesh.template.h:139
OomphCommunicator * communicator_pt() const
Read-only access fct to communicator (Null if mesh is not distributed)
Definition: triangle_mesh.template.h:310
double element_area() const
Helper function for getting the element area.
Definition: triangle_mesh.template.h:189
Vector< TriangleMeshOpenCurve * > internal_open_curves_pt() const
Helper function for getting the internal open boundaries.
Definition: triangle_mesh.template.h:176
std::map< unsigned, Vector< double > > & regions_coordinates()
Helper function for getting access to the regions coordinates.
Definition: triangle_mesh.template.h:255
bool is_boundary_refinement_allowed() const
Helper function for getting the status of boundary refinement.
Definition: triangle_mesh.template.h:322
bool is_internal_boundary_refinement_allowed() const
Helper function for getting the status of boundary refinement.
Definition: triangle_mesh.template.h:340
Definition: triangle_scaffold_mesh.h:51
Definition: unstructured_two_d_mesh_geometry_base.h:1738
Vector< TriangleMeshOpenCurve * > Internal_open_curve_pt
Vector of open polylines that define internal curves.
Definition: unstructured_two_d_mesh_geometry_base.h:2602
bool is_automatic_creation_of_vertices_on_boundaries_allowed()
Definition: unstructured_two_d_mesh_geometry_base.h:2000
Vector< TriangleMeshPolygon * > Outer_boundary_pt
Polygon that defines outer boundaries.
Definition: unstructured_two_d_mesh_geometry_base.h:2596
Vector< TriangleMeshPolygon * > Internal_polygon_pt
Vector of polygons that define internal polygons.
Definition: unstructured_two_d_mesh_geometry_base.h:2599
void snap_nodes_onto_geometric_objects()
Definition: unstructured_two_d_mesh_geometry_base.cc:4020
std::map< unsigned, Vector< double > > Regions_coordinates
Definition: unstructured_two_d_mesh_geometry_base.h:2609
Vector< Vector< double > > Extra_holes_coordinates
Storage for extra coordinates for holes.
Definition: unstructured_two_d_mesh_geometry_base.h:2605
bool Allow_automatic_creation_of_vertices_on_boundaries
Definition: unstructured_two_d_mesh_geometry_base.h:2575
std::set< TriangleMeshOpenCurve * > Free_open_curve_pt
Definition: unstructured_two_d_mesh_geometry_base.h:2646
std::set< TriangleMeshCurveSection * > Free_curve_section_pt
Definition: unstructured_two_d_mesh_geometry_base.h:2638
std::set< TriangleMeshPolygon * > Free_polygon_pt
Definition: unstructured_two_d_mesh_geometry_base.h:2642
Definition: oomph-lib/src/generic/Vector.h:58
#define _FPU_SETCW(cw)
Definition: dummy_fpu_control.h:13
Matrix< Type, Size, 1 > Vector
\cpp11 SizeĆ1 vector of type Type.
Definition: Eigen/Eigen/src/Core/Matrix.h:515
int nb
Definition: level2_impl.h:286
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *)