NUMCXX  0.13.20181108
Numerical library for small projects and teaching purposes
simplegrid.cxx
Go to the documentation of this file.
1 #include <cstring>
2 #include <iostream>
3 #include <numcxx/numcxx.hxx>
4 #include <numcxx/simplegrid.hxx>
5 
6 namespace triangle
7 {
8  extern "C" {
9 #define VOID void
10 #define REAL double
11 #define ANSI_DECLARATORS
12 #include "../triangle/triangle.h"
13 #undef REAL
14 #undef VOID
15 #undef ANSI_DECLARATORS
16  }
17 }
18 
19 namespace numcxx
20 {
22  {
23  std::printf("pointlist=%p\n",in->pointlist);
24  std::printf("pointattributelist=%p\n",in->pointattributelist);
25  std::printf("pointmarkerlist=%p\n",in->pointmarkerlist);
26  std::printf("numberofpoints=%d\n",in->numberofpoints);
27  std::printf("numberofpointattributes=%d\n",in->numberofpointattributes);
28  std::printf("trianglelist=%p\n",in->trianglelist);
29  std::printf("triangleattributelist=%p\n",in->triangleattributelist);
30  std::printf("trianglearealist=%p\n",in->trianglearealist);
31  std::printf("neighborlist=%p\n",in->neighborlist);
32  std::printf("numberoftriangles=%d\n",in->numberoftriangles);
33  std::printf("numberofcorners=%d\n",in->numberofcorners);
34  std::printf("numberoftriangleattributes=%d\n",in->numberoftriangleattributes);
35  std::printf("segmentlist=%p\n",in->segmentlist);
36  std::printf("segmentmarkerlist=%p\n",in->segmentmarkerlist);
37  std::printf("numberofsegments=%d\n",in->numberofsegments);
38  std::printf("holelist=%p\n",in->holelist);
39  std::printf("numberofholes=%d\n",in->numberofholes);
40  std::printf("regionlist=%p\n",in->regionlist);
41  std::printf("numberofregions=%d\n",in->numberofregions);
42  std::printf("edgelist=%p\n",in->edgelist);
43  std::printf("edgemarkerlist=%p\n",in->edgemarkerlist);
44  std::printf("normlist=%p\n",in->normlist);
45  std::printf("numberofedges=%d\n",in->numberofedges);
46  }
47 
48  inline double dist(const numcxx::DArray2&points, int p1, int p2)
49  {
50  double dx=points(p2,0)-points(p1,0);
51  double dy=points(p2,1)-points(p1,1);
52  return sqrt(dx*dx+dy*dy);
53  }
54 
55  void SimpleGrid::calc_hminmax(double& hmin, double& hmax) const
56  {
57  hmax=0.0;
58  hmin=1.0e100;
59  auto cells=*SimpleGrid::cells;
60  auto points=*SimpleGrid::points;
61 
62  for (int icell=0; icell<ncells();icell++)
63  {
64  double h=dist(points, cells(icell,0), cells(icell,1));
65  hmin=std::min(h,hmin);
66  hmax=std::max(h,hmax);
67 
68  h=dist(points, cells(icell,1), cells(icell,2));
69  hmin=std::min(h,hmin);
70  hmax=std::max(h,hmax);
71 
72  h=dist(points, cells(icell,0), cells(icell,2));
73  hmin=std::min(h,hmin);
74  hmax=std::max(h,hmax);
75  }
76 
77  }
78 
79  SimpleGrid::SimpleGrid(const Geometry & geometry, const char * flags)
80  {
81  if (strchr(flags,'z')==nullptr)
82  {
83  throw std::runtime_error("numcxx: triangulate: Missing 'z' flag");
84  }
85 
86  struct triangle::triangulateio in,out;
87  int dbg=0;
88 
89  out.pointlist=0;
90  out.pointattributelist=0;
91  out.pointmarkerlist=0;
92  out.numberofpoints=0;
94  out.trianglelist=0;
96  out.trianglearealist=0;
97  out.neighborlist=0;
98  out.numberoftriangles=0;
99  out.numberofcorners=0;
101  out.segmentlist=0;
102  out.segmentmarkerlist=0;
103  out.numberofsegments=0;
104  out.holelist=0;
105  out.numberofholes=0;
106  out.regionlist=0;
107  out.numberofregions=0;
108  out.edgelist=0;
109  out.edgemarkerlist=0;
110  out.normlist=0;
111  out.numberofedges=0;
112 
113  in.pointlist=0;
114  in.pointattributelist=0;
115  in.pointmarkerlist=0;
116  in.numberofpoints=0;
118  in.trianglelist=0;
120  in.trianglearealist=0;
121  in.neighborlist=0;
122  in.numberoftriangles=0;
123  in.numberofcorners=0;
125  in.segmentlist=0;
126  in.segmentmarkerlist=0;
127  in.numberofsegments=0;
128  in.holelist=0;
129  in.numberofholes=0;
130  in.regionlist=0;
131  in.numberofregions=0;
132  in.edgelist=0;
133  in.edgemarkerlist=0;
134  in.normlist=0;
135  in.numberofedges=0;
136 
137 
138  // take point list
139  if (geometry.points)
140  {
141  in.pointlist=geometry.points->data();
142  in.numberofpoints=geometry.points->shape(0);
144  }
145  else
146  {
147  throw std::runtime_error("numcxx: triangulate: Missing point list");
148  }
149  // take bfaces if defined
150  if (geometry.bfaces)
151  {
152  if (!geometry.bfaceregions)
153  throw std::runtime_error("numcxx: triangulate: Missing bfaceregions");
154 
155  in.segmentlist=geometry.bfaces->data();
156  in.segmentmarkerlist=geometry.bfaceregions->data();
157  in.numberofsegments=geometry.bfaces->shape(0);
158  }
159  else
160  {
161  throw std::runtime_error("numcxx: triangulate: Missing bface list");
162  }
163 
164  // create region and hole information for triangle
165  // Holes are marked with region number <0
166  if (geometry.regionpoints)
167  {
168  int nregs,nholes,ireg,ihole;
169  int i;
170  nregs=nholes=0;
171  if (!geometry.regionnumbers)
172  {
173  throw std::runtime_error("numcxx: triangulate: Missing region numbers");
174  }
175  if (!geometry.regionvolumes)
176  {
177  throw std::runtime_error("numcxx: triangulate: Missing region volumes");
178  }
179  for (i=0;i<geometry.regionnumbers->shape(0);i++)
180  {
181  if ((*geometry.regionnumbers)(i)>=0)
182  nregs++;
183  else
184  nholes++;
185  }
186  in.numberofholes=nholes;
187  in.numberofregions=nregs;
188  if(nholes)
189  in.holelist=(double*)malloc(2*nholes*sizeof(double));
190  in.regionlist=(double*)malloc(4*nregs*sizeof(double));
191  ireg=ihole=0;
192 
193  for (i=0;i<geometry.regionnumbers->shape(0);i++)
194  if ((*geometry.regionnumbers)(i)>=0)
195  {
196  in.regionlist[ireg+0]=(*geometry.regionpoints)(i,0);
197  in.regionlist[ireg+1]=(*geometry.regionpoints)(i,1);
198  in.regionlist[ireg+2]=(*geometry.regionnumbers)(i);
199  in.regionlist[ireg+3]=(*geometry.regionvolumes)(i);
200  ireg+=4;
201  }
202  else
203  {
204  in.holelist[ihole+0]=(*geometry.regionpoints)(i,0);
205  in.holelist[ihole+1]=(*geometry.regionpoints)(i,1);
206  ihole+=2;
207  }
208 
209  }
210 
211 
212  if (dbg)
213  {
214  printf("in:\n");
215  print_triangulateio(&in);
216  }
217 
218 
219  // Do the damn thing!
220  triangle::triangulate((char*)flags,&in,&out,NULL);
221 
222  if (dbg)
223  {
224  printf("out (flags=%s):\n",flags);
225  print_triangulateio(&out);
226  }
227 
228  // This triangle specific input information is not needed anymore.
231 
232 
233  // Take point and cell list as is.
234  points=std::make_shared<numcxx::TArray2<double>>(out.numberofpoints,2,out.pointlist,[](double*p){triangle::trifree(p);});
235  cells=std::make_shared<numcxx::TArray2<int>>(out.numberoftriangles,3,out.trianglelist,[](int*p){triangle::trifree(p);});
236 
237 
238  // Our cellregions are integer, not double as in triangle.
239  // Furthermore, they are mandatory in our process, so we
240  // set them to 0 if they are not available
241  {
242  int *triattr,i;
243 
244  cellregions=std::make_shared<numcxx::TArray1<int>>(out.numberoftriangles);
245  if (out.triangleattributelist)
246  for (i=0;i<out.numberoftriangles;i++)
247  (*cellregions)(i)=(int)out.triangleattributelist[i];
248  else
249  for (i=0;i<out.numberoftriangles;i++)
250  (*cellregions)(i)=0;
251 
254  }
255 
256  if (out.segmentlist)
257  {
258  bfaces=std::make_shared<numcxx::TArray2<int>>(out.numberofsegments,2,out.segmentlist,[](int*p){triangle::trifree(p);});
259  bfaceregions=std::make_shared<numcxx::TArray1<int>>(out.numberofsegments,out.segmentmarkerlist,[](int*p){triangle::trifree(p);});
260  }
261  else
262  {
263  throw std::runtime_error("numcxx: triangulate: Missing segment list");
264  }
266  }
267 }
Class collecting data for the description of piecewise linear geometries.
Definition: geometry.hxx:17
std::shared_ptr< TArray1< int > > regionnumbers
nreg array of integers containing region markers
Definition: geometry.hxx:65
A::value_type max(const A &a)
Maximum of array or expression.
Definition: util.ixx:70
std::shared_ptr< TArray2< int > > bfaces
nbfaces x dim array of of integers describing boundary segments
Definition: geometry.hxx:49
Header for simple grid data class.
Main header of the library.
A::value_type min(const A &a)
Minimum of of array or expression.
Definition: util.ixx:59
std::shared_ptr< TArray1< int > > bfaceregions
nbfaces array of integers describing boundary segment markers
Definition: geometry.hxx:55
std::shared_ptr< TArray2< double > > regionpoints
nreg x dim array of doubles containing point coordinates of region points
Definition: geometry.hxx:60
std::shared_ptr< TArray2< double > > points
Points: npt x dim array of double containing point coordinates.
Definition: geometry.hxx:44
std::shared_ptr< TArray1< double > > regionvolumes
nreg array of integers containing the maximum volumes/areas of triangles in a region ...
Definition: geometry.hxx:70
double dist(const numcxx::DArray2 &points, int p1, int p2)
Definition: simplegrid.cxx:48
Numcxx template library.
Definition: expression.ixx:41
void print_triangulateio(triangle::triangulateio *in)
Definition: simplegrid.cxx:21
void trifree(VOID *memptr)
Two-dimensional array class.
Definition: tarray2.hxx:31
void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *)