libMesh
Enumerations | Functions
libMesh::TriangleWrapper Namespace Reference

A special namespace for wrapping the standard Triangle API, as well as some helper functions for initializing/destroying the structs triangle uses to communicate. More...

Enumerations

enum  IO_Type { INPUT = 0, OUTPUT = 1, BOTH = 2 }
 

Functions

void init (triangulateio &t)
 Initializes the fields of t to NULL/0 as necessary. More...
 
void destroy (triangulateio &t, IO_Type)
 Frees any memory which has been dynamically allocated by Triangle. More...
 
void copy_tri_to_mesh (const triangulateio &triangle_data_input, UnstructuredMesh &mesh_output, const ElemType type)
 Copies triangulation data computed by triangle from a triangulateio object to a LibMesh mesh. More...
 

Detailed Description

A special namespace for wrapping the standard Triangle API, as well as some helper functions for initializing/destroying the structs triangle uses to communicate.

Author
John W. Peterson
Date
2011 Namespace that wraps the Triangle mesh generator's API.

Enumeration Type Documentation

Enumerator
INPUT 
OUTPUT 
BOTH 

Definition at line 57 of file mesh_triangle_wrapper.h.

Function Documentation

void libMesh::TriangleWrapper::copy_tri_to_mesh ( const triangulateio &  triangle_data_input,
UnstructuredMesh mesh_output,
const ElemType  type 
)

Copies triangulation data computed by triangle from a triangulateio object to a LibMesh mesh.

This routine is used internally by the MeshTools::Generation::build_delaunay_square(...) and MeshTools::Generation::build_delaunay_square_with_hole(...) routines.

Definition at line 102 of file mesh_triangle_wrapper.C.

References libMesh::MeshBase::add_elem(), libMesh::MeshBase::add_point(), libMesh::MeshBase::clear(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::MeshBase::node_ptr(), libMesh::MeshBase::set_mesh_dimension(), libMesh::Elem::set_node(), libMesh::TRI3, and libMesh::TRI6.

Referenced by libMesh::TriangleInterface::triangulate().

105 {
106  // Transfer the information into the LibMesh mesh.
107  mesh_output.clear();
108 
109  // Make sure the new Mesh will be 2D
110  mesh_output.set_mesh_dimension(2);
111 
112  // Node information
113  for (int i=0, c=0; c<triangle_data_input.numberofpoints; i+=2, ++c)
114  {
115  // Specify ID when adding point, otherwise, if this is DistributedMesh,
116  // it might add points with a non-sequential numbering...
117  mesh_output.add_point( Point(triangle_data_input.pointlist[i],
118  triangle_data_input.pointlist[i+1]),
119  /*id=*/c);
120  }
121 
122  // Element information
123  for (int i=0; i<triangle_data_input.numberoftriangles; ++i)
124  {
125  switch (type)
126  {
127  case TRI3:
128  {
129  Elem * elem = mesh_output.add_elem (new Tri3);
130 
131  for (unsigned int n=0; n<3; ++n)
132  elem->set_node(n) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*3 + n]);
133 
134  break;
135  }
136 
137  case TRI6:
138  {
139  Elem * elem = mesh_output.add_elem (new Tri6);
140 
141  // Triangle number TRI6 nodes in a different way to libMesh
142  elem->set_node(0) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 0]);
143  elem->set_node(1) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 1]);
144  elem->set_node(2) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 2]);
145  elem->set_node(3) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 5]);
146  elem->set_node(4) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 3]);
147  elem->set_node(5) = mesh_output.node_ptr(triangle_data_input.trianglelist[i*6 + 4]);
148 
149  break;
150  }
151 
152  default:
153  libmesh_error_msg("ERROR: Unrecognized triangular element type.");
154  }
155  }
156 
157  // Note: If the input mesh was a parallel one, calling
158  // prepare_for_use() now will re-parallelize it by a call to
159  // delete_remote_elements()... We do not actually want to
160  // reparallelize it here though: the triangulate() function may
161  // still do some Mesh smoothing. The main thing needed (for
162  // smoothing) is the neighbor information, so let's just find
163  // neighbors...
164  //mesh_output.prepare_for_use(/*skip_renumber =*/false);
165  mesh_output.find_neighbors();
166 }
void libMesh::TriangleWrapper::destroy ( triangulateio &  t,
IO_Type   
)

Frees any memory which has been dynamically allocated by Triangle.

Note
Triangle does not free any memory itself.
It is always safe to call free on a NULL pointer.
Triangle does shallow-copy (for example) the holelist pointer from the input to output struct without performing a deep copy of the holelist itself. Therefore, double-free will occur without additional care!

Referenced by libMesh::TriangleInterface::triangulate().

void libMesh::TriangleWrapper::init ( triangulateio &  t)