mesh_triangle_wrapper.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 #include "libmesh/libmesh_config.h"
20 
21 #ifdef LIBMESH_HAVE_TRIANGLE
22 
23 // Local includes
26 #include "libmesh/point.h"
27 #include "libmesh/face_tri3.h"
28 #include "libmesh/face_tri6.h"
29 
30 namespace libMesh
31 {
32 
33  void TriangleWrapper::init(TriangleWrapper::triangulateio& t)
34  {
35  t.pointlist = static_cast<REAL*>(NULL);
36  t.pointattributelist = static_cast<REAL*>(NULL);
37  t.pointmarkerlist = static_cast<int* >(NULL);
38  t.numberofpoints = 0 ;
39  t.numberofpointattributes = 0 ;
40 
41  t.trianglelist = static_cast<int* >(NULL);
42  t.triangleattributelist = static_cast<REAL*>(NULL);
43  t.trianglearealist = static_cast<REAL*>(NULL);
44  t.neighborlist = static_cast<int* >(NULL);
45  t.numberoftriangles = 0;
46  t.numberofcorners = 0;
47  t.numberoftriangleattributes = 0;
48 
49  t.segmentlist = static_cast<int* >(NULL);
50  t.segmentmarkerlist = static_cast<int* >(NULL);
51  t.numberofsegments = 0;
52 
53  t.holelist = static_cast<REAL*>(NULL);
54  t.numberofholes = 0;
55 
56  t.regionlist = static_cast<REAL*>(NULL);
57  t.numberofregions = 0;
58 
59  t.edgelist = static_cast<int* >(NULL);
60  t.edgemarkerlist = static_cast<int* >(NULL);
61  t.normlist = static_cast<REAL*>(NULL);
62  t.numberofedges = 0;
63  }
64 
65 
66 
67 
68 
69 
70  void TriangleWrapper::destroy(TriangleWrapper::triangulateio& t, TriangleWrapper::IO_Type io_type)
71  {
72  std::free (t.pointlist );
73  std::free (t.pointattributelist );
74  std::free (t.pointmarkerlist );
75  std::free (t.trianglelist );
76  std::free (t.triangleattributelist);
77  std::free (t.trianglearealist );
78  std::free (t.neighborlist );
79  std::free (t.segmentlist );
80  std::free (t.segmentmarkerlist );
81 
82  // Only attempt to free these when t was used as an input struct!
83  if (io_type==INPUT)
84  {
85  std::free (t.holelist );
86  std::free (t.regionlist);
87  }
88 
89  std::free (t.edgelist );
90  std::free (t.edgemarkerlist);
91  std::free (t.normlist );
92 
93  // Reset
94  // TriangleWrapper::init(t);
95  }
96 
97 
98 
99 
100 
101 
102  void TriangleWrapper::copy_tri_to_mesh(const triangulateio& triangle_data_input,
103  UnstructuredMesh& mesh_output,
104  const ElemType type)
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 ParallelMesh,
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  {
154  libMesh::err << "ERROR: Unrecognized triangular element type." << std::endl;
155  libmesh_error();
156  }
157  }
158  }
159 
160  // Note: If the input mesh was a parallel one, calling
161  // prepare_for_use() now will re-parallelize it by a call to
162  // delete_remote_elements()... We do not actually want to
163  // reparallelize it here though: the triangulate() function may
164  // still do some Mesh smoothing. The main thing needed (for
165  // smoothing) is the neighbor information, so let's just find
166  // neighbors...
167  //mesh_output.prepare_for_use(/*skip_renumber =*/false);
168  mesh_output.find_neighbors();
169  }
170 
171 
172 }
173 
174 #endif // LIBMESH_HAVE_TRIANGLE

Site Created By: libMesh Developers
Last modified: February 07 2014 16:57:06 UTC

Hosted By:
SourceForge.net Logo