Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TriangleInterface.cpp
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // File: TriangleInterface.cpp
4 //
5 // For more information, please see: http://www.nektar.info/
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // License for the specific language governing rights and limitations under
14 // Permission is hereby granted, free of charge, to any person obtaining a
15 // copy of this software and associated documentation files (the "Software"),
16 // to deal in the Software without restriction, including without limitation
17 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 // and/or sell copies of the Software, and to permit persons to whom the
19 // Software is furnished to do so, subject to the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be included
22 // in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 // DEALINGS IN THE SOFTWARE.
31 //
32 // Description: Interface to triangle mesher
33 //
34 ////////////////////////////////////////////////////////////////////////////////
35 
37 
38 #include <sstream>
39 
40 using namespace std;
41 namespace Nektar
42 {
43 namespace NekMeshUtils
44 {
45 
46 void TriangleInterface::Mesh(bool Quality)
47 {
48  SetUp();
49 
50  int numPoints = 0;
51  int numSeg = 0;
52  for (int i = 0; i < m_boundingloops.size(); i++)
53  {
54  numSeg += m_boundingloops[i].size();
55  }
56  numPoints = numSeg + m_stienerpoints.size();
57 
58  stringstream ss;
59  ss << "3 points required for triangulation, " << numPoints << " provided";
60 
61  ASSERTL0(numPoints > 2, ss.str());
62 
63  dt.in.numberofpoints = numPoints;
64  dt.in.numberofpointattributes = 0;
65  dt.in.pointlist = new double[dt.in.numberofpoints * 2];
66  dt.in.pointmarkerlist = new int [dt.in.numberofpoints];
67 
68  int pointc = 0;
69 
70  for (int i = 0; i < m_boundingloops.size(); i++)
71  {
72  for (int j = 0; j < m_boundingloops[i].size(); j++, pointc++)
73  {
74  nodemap[pointc] = m_boundingloops[i][j];
75 
77  m_boundingloops[i][j]->GetCADSurfInfo(sid);
78  dt.in.pointlist[pointc * 2 + 0] = uv[0] * m_str;
79  dt.in.pointlist[pointc * 2 + 1] = uv[1];
80  }
81  }
82 
83  for (int i = 0; i < m_stienerpoints.size(); i++, pointc++)
84  {
85  nodemap[pointc] = m_stienerpoints[i];
86 
87  Array<OneD, NekDouble> uv = m_stienerpoints[i]->GetCADSurfInfo(sid);
88  dt.in.pointlist[pointc * 2 + 0] = uv[0] * m_str;
89  dt.in.pointlist[pointc * 2 + 1] = uv[1];
90  }
91 
92  dt.in.numberofsegments = numSeg;
93  dt.in.segmentlist = new int[dt.in.numberofsegments * 2];
94  pointc = 0;
95  for (int i = 0; i < m_boundingloops.size(); i++, pointc++)
96  {
97  int first = pointc;
98  for (int j = 0; j < m_boundingloops[i].size() - 1; j++, pointc++)
99  {
100  dt.in.segmentlist[pointc * 2 + 0] = pointc;
101  dt.in.segmentlist[pointc * 2 + 1] = pointc + 1;
102  }
103  dt.in.segmentlist[pointc * 2 + 0] = pointc;
104  dt.in.segmentlist[pointc * 2 + 1] = first;
105  }
106 
107  dt.in.numberofregions = 0;
108  dt.in.numberofholes = m_centers.size() - 1;
109  dt.in.holelist = new double[dt.in.numberofholes * 2];
110 
111  for (int i = 1; i < m_centers.size(); i++)
112  {
113  dt.in.holelist[(i - 1) * 2 + 0] = m_centers[i][0] * m_str;
114  dt.in.holelist[(i - 1) * 2 + 1] = m_centers[i][1];
115  }
116 
117  string cmd;
118  if (Quality)
119  {
120  cmd = "pqY";
121  }
122  else if (!Quality)
123  {
124  cmd = "pY";
125  }
126  char *cstr = new char[cmd.length() + 1];
127  strcpy(cstr, cmd.c_str());
128 
129  dt.triangulate(cstr);
130 }
131 
132 void TriangleInterface::SetUp()
133 {
134  dt.in.pointlist = (double *)NULL;
135  dt.in.pointattributelist = (double *)NULL;
136  dt.in.pointmarkerlist = (int *)NULL;
137  dt.in.numberofpoints = 0;
138  dt.in.numberofpointattributes = 0;
139  //
140  dt.in.trianglelist = (int *)NULL;
141  dt.in.triangleattributelist = (double *)NULL;
142  dt.in.trianglearealist = (double *)NULL;
143  dt.in.neighborlist = (int *)NULL;
144  dt.in.numberoftriangles = 0;
145  dt.in.numberofcorners = 0;
146  dt.in.numberoftriangleattributes = 0;
147  //
148  dt.in.segmentlist = (int *)NULL;
149  dt.in.segmentmarkerlist = (int *)NULL;
150  dt.in.numberofsegments = 0;
151  //
152  dt.in.holelist = (double *)NULL;
153  dt.in.numberofholes = 0;
154  //
155  dt.in.regionlist = (double *)NULL;
156  dt.in.numberofregions = 0;
157  //
158  dt.in.edgelist = (int *)NULL;
159  dt.in.edgemarkerlist = (int *)NULL;
160  dt.in.normlist = (double *)NULL;
161  dt.in.numberofedges = 0;
162  //
163  dt.out.pointlist = (double *)NULL;
164  dt.out.pointattributelist = (double *)NULL;
165  dt.out.pointmarkerlist = (int *)NULL;
166  dt.out.numberofpoints = 0;
167  dt.out.numberofpointattributes = 0;
168  //
169  dt.out.trianglelist = (int *)NULL;
170  dt.out.triangleattributelist = (double *)NULL;
171  dt.out.trianglearealist = (double *)NULL;
172  dt.out.neighborlist = (int *)NULL;
173  dt.out.numberoftriangles = 0;
174  dt.out.numberofcorners = 0;
175  dt.out.numberoftriangleattributes = 0;
176  //
177  dt.out.segmentlist = (int *)NULL;
178  dt.out.segmentmarkerlist = (int *)NULL;
179  dt.out.numberofsegments = 0;
180  //
181  dt.out.holelist = (double *)NULL;
182  dt.out.numberofholes = 0;
183  //
184  dt.out.regionlist = (double *)NULL;
185  dt.out.numberofregions = 0;
186  //
187  dt.out.edgelist = (int *)NULL;
188  dt.out.edgemarkerlist = (int *)NULL;
189  dt.out.normlist = (double *)NULL;
190  dt.out.numberofedges = 0;
191 }
192 
193 void TriangleInterface::Extract(
194  std::vector<std::vector<NodeSharedPtr> > &Connec)
195 {
196  Connec.clear();
197  for (int i = 0; i < dt.out.numberoftriangles; i++)
198  {
200  n1 = nodemap.find(dt.out.trianglelist[i * 3 + 0]);
201  n2 = nodemap.find(dt.out.trianglelist[i * 3 + 1]);
202  n3 = nodemap.find(dt.out.trianglelist[i * 3 + 2]);
203 
204  ASSERTL0(n1 != nodemap.end() && n2 != nodemap.end() &&
205  n3 != nodemap.end(),
206  "node index error");
207 
208  vector<NodeSharedPtr> tri(3);
209  tri[0] = n1->second;
210  tri[1] = n2->second;
211  tri[2] = n3->second;
212  Connec.push_back(tri);
213  }
214 }
215 }
216 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
STL namespace.
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator