19 #include "libmesh/libmesh_config.h"
21 #ifdef LIBMESH_HAVE_TRIANGLE
24 #include "libmesh/mesh_triangle_wrapper.h"
25 #include "libmesh/unstructured_mesh.h"
26 #include "libmesh/point.h"
27 #include "libmesh/face_tri3.h"
28 #include "libmesh/face_tri6.h"
29 #include "libmesh/enum_elem_type.h"
36 t.pointlist = static_cast<REAL*>(
nullptr);
37 t.pointattributelist = static_cast<REAL*>(
nullptr);
38 t.pointmarkerlist = static_cast<int *>(
nullptr);
39 t.numberofpoints = 0 ;
40 t.numberofpointattributes = 0 ;
42 t.trianglelist = static_cast<int *>(
nullptr);
43 t.triangleattributelist = static_cast<REAL*>(
nullptr);
44 t.trianglearealist = static_cast<REAL*>(
nullptr);
45 t.neighborlist = static_cast<int *>(
nullptr);
46 t.numberoftriangles = 0;
47 t.numberofcorners = 0;
48 t.numberoftriangleattributes = 0;
50 t.segmentlist = static_cast<int *>(
nullptr);
51 t.segmentmarkerlist = static_cast<int *>(
nullptr);
52 t.numberofsegments = 0;
54 t.holelist = static_cast<REAL*>(
nullptr);
57 t.regionlist = static_cast<REAL*>(
nullptr);
58 t.numberofregions = 0;
60 t.edgelist = static_cast<int *>(
nullptr);
61 t.edgemarkerlist = static_cast<int *>(
nullptr);
62 t.normlist = static_cast<REAL*>(
nullptr);
73 std::free (t.pointlist );
74 std::free (t.pointattributelist );
75 std::free (t.pointmarkerlist );
76 std::free (t.trianglelist );
77 std::free (t.triangleattributelist);
78 std::free (t.trianglearealist );
79 std::free (t.neighborlist );
80 std::free (t.segmentlist );
81 std::free (t.segmentmarkerlist );
86 std::free (t.holelist );
87 std::free (t.regionlist);
90 std::free (t.edgelist );
91 std::free (t.edgemarkerlist);
92 std::free (t.normlist );
106 const triangulateio * voronoi)
115 for (
int i=0, c=0; c<triangle_data_input.numberofpoints; i+=2, ++c)
120 triangle_data_input.pointlist[i+1]),
125 for (
int i=0; i<triangle_data_input.numberoftriangles; ++i)
133 for (
unsigned int n=0; n<3; ++n)
134 elem->
set_node(n) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*3 + n]);
137 if (triangle_data_input.triangleattributelist)
139 std::round(triangle_data_input.
140 triangleattributelist[i * triangle_data_input.numberoftriangleattributes]);
149 elem->
set_node(0) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 0]);
150 elem->
set_node(1) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 1]);
151 elem->
set_node(2) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 2]);
152 elem->
set_node(3) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 5]);
153 elem->
set_node(4) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 3]);
154 elem->
set_node(5) = mesh_output.
node_ptr(triangle_data_input.trianglelist[i*6 + 4]);
157 if (triangle_data_input.triangleattributelist)
159 std::round(triangle_data_input.
160 triangleattributelist[i * triangle_data_input.numberoftriangleattributes]);
165 libmesh_error_msg(
"ERROR: Unrecognized triangular element type.");
180 if (voronoi && triangle_data_input.edgemarkerlist)
183 for (
int e=0; e<triangle_data_input.numberofedges; ++e)
185 if (triangle_data_input.edgemarkerlist[e] != 0)
187 int p1 = triangle_data_input.edgelist[e + e];
188 int p2 = triangle_data_input.edgelist[e + e + 1];
189 int elem_id = voronoi->edgelist[e + e];
190 unsigned short int s;
191 if (p1 == triangle_data_input.trianglelist[elem_id*3] &&
192 p2 == triangle_data_input.trianglelist[elem_id*3 + 1])
194 else if (p1 == triangle_data_input.trianglelist[elem_id*3 + 1] &&
195 p2 == triangle_data_input.trianglelist[elem_id*3 + 2])
197 else if (p1 == triangle_data_input.trianglelist[elem_id*3 + 2] &&
198 p2 == triangle_data_input.trianglelist[elem_id*3])
201 libmesh_error_msg(
"ERROR: finding element errors for boundary edges.");
203 boundary_info.
add_side(elem_id, s, triangle_data_input.edgemarkerlist[e]);
212 #endif // LIBMESH_HAVE_TRIANGLE