NUMCXX  0.13.20181108
Numerical library for small projects and teaching purposes
Public Member Functions | Static Public Member Functions | Private Attributes | List of all members
numcxx::SimpleGrid Class Reference

Description

Class containing data for simple grid data structure.

Examples:
40-stationary-heat-fe.cxx, 41-stationary-heat-fv.cxx, 42-convtest-fem-sin.cxx, 43-convtest-fvm-sin.cxx, 44-transient-heat-fe.cxx, and 46-nonlin-fvm.cxx.

Definition at line 19 of file simplegrid.hxx.

Public Member Functions

 SimpleGrid ()
 Trivial construtor. More...
 
 SimpleGrid (const SimpleGrid &g)=delete
 
 SimpleGrid (const Geometry &geometry, const char *triangle_flags)
 Construct simple grid from geometry via library call to Triangle mesh generator. More...
 
const TArray2< double > & get_points () const
 Get array of point coordinates. More...
 
const TArray2< int > & get_cells () const
 Get array of point indices describing cells. More...
 
const TArray1< int > & get_cellregions () const
 Get array region markers. More...
 
const TArray2< int > & get_bfaces () const
 Get array of point indices describing boundary faces. More...
 
const TArray1< int > & get_bfaceregions () const
 Get array of boundary markers. More...
 
const int spacedim () const
 Return dimension of space. More...
 
const int griddim () const
 Return dimension of grid. More...
 
const int ncells () const
 Return number of cells. More...
 
const int npoints () const
 Return number of points. More...
 
const int nbfaces () const
 Return number of boundary faces. More...
 
void calc_hminmax (double &hmin, double &hmax) const
 Calculate some grid data. More...
 

Static Public Member Functions

static std::shared_ptr< SimpleGridcreate (const Geometry &geometry, const std::string triangle_flags)
 Static constructor from reference to geometry. More...
 
static std::shared_ptr< SimpleGridcreate (std::shared_ptr< Geometry > geometry, const char *triangle_flags)
 Static constructor from shared pointer to geometry. More...
 

Private Attributes

std::shared_ptr< TArray2< double > > points =nullptr
 
std::shared_ptr< TArray2< int > > cells =nullptr
 
std::shared_ptr< TArray1< int > > cellregions =nullptr
 
std::shared_ptr< TArray2< int > > bfaces =nullptr
 
std::shared_ptr< TArray1< int > > bfaceregions =nullptr
 

Constructor & Destructor Documentation

numcxx::SimpleGrid::SimpleGrid ( )
inline

Trivial construtor.

Definition at line 24 of file simplegrid.hxx.

24 {};
numcxx::SimpleGrid::SimpleGrid ( const SimpleGrid g)
delete
numcxx::SimpleGrid::SimpleGrid ( const Geometry geometry,
const char *  triangle_flags 
)

Construct simple grid from geometry via library call to Triangle mesh generator.

The triangle_flags must contain the z flag

Definition at line 79 of file simplegrid.cxx.

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;
93  out.numberofpointattributes=0;
94  out.trianglelist=0;
95  out.triangleattributelist=0;
96  out.trianglearealist=0;
97  out.neighborlist=0;
98  out.numberoftriangles=0;
99  out.numberofcorners=0;
100  out.numberoftriangleattributes=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;
117  in.numberofpointattributes=0;
118  in.trianglelist=0;
119  in.triangleattributelist=0;
120  in.trianglearealist=0;
121  in.neighborlist=0;
122  in.numberoftriangles=0;
123  in.numberofcorners=0;
124  in.numberoftriangleattributes=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);
143  in.numberofpointattributes=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.
229  if(in.holelist) triangle::trifree(in.holelist);
230  if(in.regionlist) triangle::trifree(in.regionlist);
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 
252  if (in.triangleattributelist) triangle::trifree(in.triangleattributelist);
253  if (out.triangleattributelist) triangle::trifree(out.triangleattributelist);
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  }
265 
266  }
std::shared_ptr< TArray1< int > > bfaceregions
Definition: simplegrid.hxx:79
std::shared_ptr< TArray1< int > > cellregions
Definition: simplegrid.hxx:77
void print_triangulateio(triangle::triangulateio *in)
Definition: simplegrid.cxx:21
std::shared_ptr< TArray2< int > > cells
Definition: simplegrid.hxx:76
void trifree(VOID *memptr)
std::shared_ptr< TArray2< int > > bfaces
Definition: simplegrid.hxx:78
void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *)
std::shared_ptr< TArray2< double > > points
Definition: simplegrid.hxx:75

+ Here is the call graph for this function:

Member Function Documentation

static std::shared_ptr<SimpleGrid> numcxx::SimpleGrid::create ( const Geometry geometry,
const std::string  triangle_flags 
)
inlinestatic

Static constructor from reference to geometry.

Examples:
30-triangle.cxx, and 31-cut.cxx.

Definition at line 35 of file simplegrid.hxx.

35 { return std::make_shared<SimpleGrid>(geometry,triangle_flags.c_str());}
static std::shared_ptr<SimpleGrid> numcxx::SimpleGrid::create ( std::shared_ptr< Geometry geometry,
const char *  triangle_flags 
)
inlinestatic

Static constructor from shared pointer to geometry.

Definition at line 38 of file simplegrid.hxx.

38 { return std::make_shared<SimpleGrid>(*geometry,triangle_flags);}
const TArray2<double>& numcxx::SimpleGrid::get_points ( ) const
inline

Get array of point coordinates.

Examples:
42-convtest-fem-sin.cxx, and 43-convtest-fvm-sin.cxx.

Definition at line 42 of file simplegrid.hxx.

42 { return *points;};
std::shared_ptr< TArray2< double > > points
Definition: simplegrid.hxx:75
const TArray2<int>& numcxx::SimpleGrid::get_cells ( ) const
inline

Get array of point indices describing cells.

Definition at line 45 of file simplegrid.hxx.

45 { return *cells;};
std::shared_ptr< TArray2< int > > cells
Definition: simplegrid.hxx:76
const TArray1<int>& numcxx::SimpleGrid::get_cellregions ( ) const
inline

Get array region markers.

Definition at line 48 of file simplegrid.hxx.

48 {return *cellregions;};
std::shared_ptr< TArray1< int > > cellregions
Definition: simplegrid.hxx:77
const TArray2<int>& numcxx::SimpleGrid::get_bfaces ( ) const
inline

Get array of point indices describing boundary faces.

Definition at line 51 of file simplegrid.hxx.

51 { return *bfaces;};
std::shared_ptr< TArray2< int > > bfaces
Definition: simplegrid.hxx:78
const TArray1<int>& numcxx::SimpleGrid::get_bfaceregions ( ) const
inline

Get array of boundary markers.

Definition at line 54 of file simplegrid.hxx.

54 { return *bfaceregions;};
std::shared_ptr< TArray1< int > > bfaceregions
Definition: simplegrid.hxx:79
const int numcxx::SimpleGrid::spacedim ( ) const
inline

Return dimension of space.

Definition at line 57 of file simplegrid.hxx.

57 { return points->shape(1);}
std::shared_ptr< TArray2< double > > points
Definition: simplegrid.hxx:75
const int numcxx::SimpleGrid::griddim ( ) const
inline

Return dimension of grid.

Definition at line 60 of file simplegrid.hxx.

60 { return bfaces->shape(1);}
std::shared_ptr< TArray2< int > > bfaces
Definition: simplegrid.hxx:78
const int numcxx::SimpleGrid::ncells ( ) const
inline

Return number of cells.

Definition at line 63 of file simplegrid.hxx.

63 {return cells->shape(0);}
std::shared_ptr< TArray2< int > > cells
Definition: simplegrid.hxx:76
const int numcxx::SimpleGrid::npoints ( ) const
inline

Return number of points.

Examples:
40-stationary-heat-fe.cxx, 41-stationary-heat-fv.cxx, 42-convtest-fem-sin.cxx, 43-convtest-fvm-sin.cxx, 44-transient-heat-fe.cxx, and 46-nonlin-fvm.cxx.

Definition at line 66 of file simplegrid.hxx.

66 {return points->shape(0);}
std::shared_ptr< TArray2< double > > points
Definition: simplegrid.hxx:75
const int numcxx::SimpleGrid::nbfaces ( ) const
inline

Return number of boundary faces.

Definition at line 69 of file simplegrid.hxx.

69 {return bfaces->shape(0);}
std::shared_ptr< TArray2< int > > bfaces
Definition: simplegrid.hxx:78

+ Here is the call graph for this function:

void numcxx::SimpleGrid::calc_hminmax ( double &  hmin,
double &  hmax 
) const

Calculate some grid data.

Examples:
42-convtest-fem-sin.cxx, and 43-convtest-fvm-sin.cxx.

Definition at line 55 of file simplegrid.cxx.

56  {
57  hmax=0.0;
58  hmin=1.0e100;
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  }
const int ncells() const
Return number of cells.
Definition: simplegrid.hxx:63
A::value_type max(const A &a)
Maximum of array or expression.
Definition: util.ixx:70
A::value_type min(const A &a)
Minimum of of array or expression.
Definition: util.ixx:59
double dist(const numcxx::DArray2 &points, int p1, int p2)
Definition: simplegrid.cxx:48
std::shared_ptr< TArray2< int > > cells
Definition: simplegrid.hxx:76
std::shared_ptr< TArray2< double > > points
Definition: simplegrid.hxx:75

+ Here is the call graph for this function:

Member Data Documentation

std::shared_ptr<TArray2<double> > numcxx::SimpleGrid::points =nullptr
private

Definition at line 75 of file simplegrid.hxx.

std::shared_ptr<TArray2<int> > numcxx::SimpleGrid::cells =nullptr
private

Definition at line 76 of file simplegrid.hxx.

std::shared_ptr<TArray1<int> > numcxx::SimpleGrid::cellregions =nullptr
private

Definition at line 77 of file simplegrid.hxx.

std::shared_ptr<TArray2<int> > numcxx::SimpleGrid::bfaces =nullptr
private

Definition at line 78 of file simplegrid.hxx.

std::shared_ptr<TArray1<int> > numcxx::SimpleGrid::bfaceregions =nullptr
private

Definition at line 79 of file simplegrid.hxx.


The documentation for this class was generated from the following files: