proteus 1.9.0
C/C++/Fortran libraries
Loading...
Searching...
No Matches
mesh.h
Go to the documentation of this file.
1#ifndef MESH_H
2#define MESH_H
3#include <set>
4#include <vector>
5#include <algorithm>
6#include <map>
7#include <list>
8#include <iostream>
9#include <iomanip>
10#include <fstream>
12#include <cassert>
13#include <cmath>
14
15
23
24extern "C"
25{
26 /* The simple array based interface to meshes */
27 //forward declaration
28
29 struct Mesh
30 {
31 //if you change this make sure to update initialize and delete below
43
44 int *elementNodesArray, //the nodes numbers for each element
45 *nodeElementsArray, //the element numbers for each node
46 *nodeElementOffsets, //offsets for indexing into nodeElementsArray,
47 *elementNeighborsArray, //the elment numbers for each neighboring element
48 *elementBoundariesArray, //the global elementBoundary numbers for each element
50 *elementBoundaryElementsArray, //the element numbers for each element boundary
51 *elementBoundaryLocalElementBoundariesArray, //the local element boundary number for the left and right neighbors of the element boundary
52 *interiorElementBoundariesArray, //the element boundary numbers of the interior element boundaries
53 *exteriorElementBoundariesArray, //the element boundary numbers of the exterior element boundaries
57 *elementMaterialTypes, //ids for classifying elements,element boundaries,nodes
60
61 // NURBS
62 int *elementIJK; // Cartesian indices of element
63 double *weights; // NURBS weight
64 double *U_KNOT,*V_KNOT,*W_KNOT; // Knot vectors
65 int nx,ny,nz;
66 int px,py,pz;
67 // NURBS
68
73 //for adaptive mesh refinement
75
76 //for parallel computations
77
86
87 // DMPlex mesh flag
88 bool usePlex = false;
89
91 };
92
93 inline void initializeMesh(Mesh& mesh)
94 {
95 //dimensions
96 mesh.nElements_global=0;
97 mesh.nNodes_global=0;
98 mesh.nNodes_element=0;
104 mesh.max_nElements_node=0;
105 mesh.nEdges_global=0;
106 //arrays
107 mesh.elementNodesArray=NULL;
108 mesh.nodeElementsArray=NULL;
109 mesh.nodeElementOffsets=NULL;
110 mesh.elementNeighborsArray=NULL;
111 mesh.elementBoundariesArray=NULL;
117 mesh.edgeNodesArray=NULL;
118 mesh.nodeStarArray=NULL;
119 mesh.nodeStarOffsets=NULL;
120 mesh.elementMaterialTypes=NULL;
122 mesh.nodeMaterialTypes=NULL;
123 mesh.nodeArray=NULL;
124 mesh.elementBarycentersArray=NULL;
126 mesh.nodeDiametersArray=NULL;
127 mesh.nodeSupportArray=NULL;
128 mesh.newestNodeBases=NULL;
129
130 //parallel
139
140 // NURBS
141 mesh.nx=mesh.ny=mesh.nz=0;
142 mesh.px=mesh.py=mesh.pz=0;
143 mesh.elementIJK=NULL;
144 mesh.weights=NULL;
145 mesh.U_KNOT=NULL;
146 mesh.V_KNOT=NULL;
147 mesh.W_KNOT=NULL;
148 // NURBS
149
150 //geometry
151 mesh.elementDiametersArray=NULL;
152 mesh.h=0.0;
153 mesh.hMin=0.0;
154 mesh.sigmaMax=0.0;
155 mesh.volume=0.0;
156
157 //parallel
166 mesh.subdomainp=NULL;
167
168 }
169
170 inline void deleteMesh(Mesh& mesh)
171 {
172
173 //dimensions
174 mesh.nElements_global=0;
175 mesh.nNodes_global=0;
176 mesh.nNodes_element=0;
182 mesh.max_nElements_node=0;
183 mesh.nEdges_global=0;
184
185 //arrays
186 if(mesh.elementNodesArray!=NULL) delete [] mesh.elementNodesArray;
187 if(mesh.nodeElementsArray!=NULL) delete [] mesh.nodeElementsArray;
188 if(mesh.nodeElementOffsets!=NULL) delete [] mesh.nodeElementOffsets;
189 if(mesh.elementNeighborsArray!=NULL) delete [] mesh.elementNeighborsArray;
190 if(mesh.elementBoundariesArray!=NULL) delete [] mesh.elementBoundariesArray;
191 if(mesh.elementBoundaryNodesArray!=NULL) delete [] mesh.elementBoundaryNodesArray;
196 if(mesh.edgeNodesArray!=NULL) delete [] mesh.edgeNodesArray;
197 if(mesh.nodeStarArray!=NULL) delete [] mesh.nodeStarArray;
198 if(mesh.nodeStarOffsets!=NULL) delete [] mesh.nodeStarOffsets;
199 if(mesh.elementMaterialTypes!=NULL) delete [] mesh.elementMaterialTypes;
201 if(mesh.nodeMaterialTypes!=NULL) delete [] mesh.nodeMaterialTypes;
202 if(mesh.nodeArray!=NULL) delete [] mesh.nodeArray;
203 if(mesh.elementDiametersArray!=NULL) delete [] mesh.elementDiametersArray;
204 if(mesh.elementBarycentersArray!=NULL) delete [] mesh.elementBarycentersArray;
206 if(mesh.nodeDiametersArray!=NULL) delete [] mesh.nodeDiametersArray;
207 if(mesh.nodeSupportArray!=NULL) delete [] mesh.nodeSupportArray;
208 if(mesh.newestNodeBases!=NULL) delete [] mesh.newestNodeBases;
209
210 // NURBS
211 mesh.nx=mesh.ny=mesh.nz=0;
212 mesh.px=mesh.py=mesh.pz=0;
213 if(mesh.elementIJK!=NULL) delete [] mesh.elementIJK;
214 if(mesh.weights!=NULL) delete [] mesh.weights;
215 if(mesh.U_KNOT!=NULL) delete [] mesh.U_KNOT;
216 if(mesh.V_KNOT!=NULL) delete [] mesh.V_KNOT;
217 if(mesh.W_KNOT!=NULL) delete [] mesh.W_KNOT;
218 // NURBS
219
220 //parallel
223 if(mesh.nodeOffsets_subdomain_owned!=NULL) delete [] mesh.nodeOffsets_subdomain_owned;
227 if(mesh.edgeOffsets_subdomain_owned!=NULL) delete [] mesh.edgeOffsets_subdomain_owned;
229
230 mesh.elementNodesArray=NULL;
231 mesh.nodeElementsArray=NULL;
232 mesh.nodeElementOffsets=NULL;
233 mesh.elementNeighborsArray=NULL;
234 mesh.elementBoundariesArray=NULL;
240 mesh.edgeNodesArray=NULL;
241 mesh.nodeStarArray=NULL;
242 mesh.nodeStarOffsets=NULL;
243 mesh.elementMaterialTypes=NULL;
245 mesh.nodeMaterialTypes=NULL;
246 mesh.nodeArray=NULL;
247 mesh.elementBarycentersArray=NULL;
249
250 //parallel
259 mesh.subdomainp=NULL;
260
261 }
262
264 {
267 int **elementParentsArray, //nLevels x nElements_global_level
269 **elementChildrenOffsets; //nLevels x nElements_global_level x nElementChildren_element
270 };
271
272 inline void initializeMultilevelMesh(MultilevelMesh& multilevelMesh)
273 {
274 multilevelMesh.nLevels=0;
275 multilevelMesh.meshArray=NULL;
276 multilevelMesh.elementParentsArray=NULL;
277 multilevelMesh.elementChildrenArray=NULL;
278 multilevelMesh.elementChildrenOffsets=NULL;
279 }
280
281 inline void deleteMultilevelMesh(MultilevelMesh& multilevelMesh)
282 {
283 for(int i=0;i<multilevelMesh.nLevels;i++)
284 {
285 deleteMesh(multilevelMesh.meshArray[i]);
286 if(i>0)
287 if (multilevelMesh.elementParentsArray[i] != NULL) delete [] multilevelMesh.elementParentsArray[i];
288 if(i<multilevelMesh.nLevels-1)
289 {
290 if (multilevelMesh.elementChildrenArray[i] != NULL) delete [] multilevelMesh.elementChildrenArray[i];
291 if (multilevelMesh.elementChildrenOffsets[i] != NULL) delete [] multilevelMesh.elementChildrenOffsets[i];
292 }
293 }
294 if (multilevelMesh.meshArray != NULL) delete [] multilevelMesh.meshArray;
295 if (multilevelMesh.elementParentsArray != NULL) delete [] multilevelMesh.elementParentsArray;
296 if (multilevelMesh.elementChildrenArray != NULL) delete [] multilevelMesh.elementChildrenArray;
297 if (multilevelMesh.elementChildrenOffsets != NULL) delete [] multilevelMesh.elementChildrenOffsets;
298
299 multilevelMesh.nLevels=0;
300 multilevelMesh.meshArray=NULL;
301 multilevelMesh.elementParentsArray=NULL;
302 multilevelMesh.elementChildrenArray=NULL;
303 multilevelMesh.elementChildrenOffsets=NULL;
304 }
305
306 int edgeMeshElements(const int& nx, Mesh& mesh);
307 int regularEdgeMeshNodes(const int& nx, const double& Lx, Mesh& mesh);
308 int globallyRefineEdgeMesh(const int& nLevels, Mesh& mesh, MultilevelMesh& multilevelMesh, bool averageNewNodeFlags=false);
309 int locallyRefineEdgeMesh(MultilevelMesh& multilevelMesh,
310 int * elementTagArray);
311 int locallyRefineTriangleMesh(MultilevelMesh& multilevelMesh,
312 int * elementTagArray);
313 int locallyRefineTriangleMesh_4T(MultilevelMesh& multilevelMesh,
314 int * elementTagArray);
316 int * elementTagArray);
318
319 int regularRectangularToTriangularMeshElements(const int& nx,const int& ny,Mesh& mesh, int triangleFlag);
320 int regularRectangularToTriangularMeshNodes(const int& nx, const int& ny, const double& Lx, const double& Ly, Mesh& mesh);
321 int regularRectangularToTriangularElementBoundaryMaterials(const double& Lx, const double& Ly, Mesh& mesh);
322 int globallyRefineTriangularMesh(const int& nLevels, Mesh& mesh, MultilevelMesh& multilevelMesh, bool averageNewNodeFlags=false);
323
324 int regularQuadrilateralMeshElements(const int& nx,const int& ny,Mesh& mesh);
325 int regularQuadrilateralMeshElementBoundaryMaterials(const double& Lx, const double& Ly, Mesh& mesh);
326 int globallyRefineQuadrilateralMesh(const int& nLevels, Mesh& mesh, MultilevelMesh& multilevelMesh, bool averageNewNodeFlags=false);
327
328
329 int regularMeshNodes(const int& nx,const int& ny,const int& nz, const double& Lx, const double& Ly, const double& Lz, Mesh& mesh);
330 int regularMeshNodes2D(const int& nx,const int& ny, const double& Lx, const double& Ly, Mesh& mesh);
331 int regularHexahedralMeshElementBoundaryMaterials(const double& Lx, const double& Ly, const double& Lz, Mesh& mesh);
332 int regularHexahedralToTetrahedralMeshNodes(const int& nx,const int& ny,const int& nz, const double& Lx, const double& Ly, const double& Lz, Mesh& mesh);
333 int regularHexahedralToTetrahedralMeshElements(const int& nx,const int& ny,const int& nz,Mesh& mesh);
334 int regularHexahedralToTetrahedralElementBoundaryMaterials(const double& Lx, const double& Ly, const double& Lz, Mesh& mesh);
335 int regularHexahedralMeshElements(const int& nx,const int& ny,const int& nz,const int& px,const int& py,const int& pz, Mesh& mesh);
336 int reorientTetrahedralMesh(Mesh& mesh);
337 int regularNURBSMeshElements(const int& nx,const int& ny,const int& nz,const int& px,const int& py,const int& pz,Mesh& mesh);
338 int globallyRefineHexahedralMesh(const int& nLevels, Mesh& mesh, MultilevelMesh& multilevelMesh, bool averageNewNodeFlags=false);
339
340 int globallyRefineTetrahedralMesh(const int& nLevels, Mesh& mesh, MultilevelMesh& multilevelMesh, bool averageNewNodeFlags=false);
341
348
353
360
361 int writeElements(std::ostream& meshFile, const Mesh& mesh);
362 int writeNodes(std::ostream& meshFile, const Mesh& mesh);
363 int readElements(std::istream& meshFile, Mesh& mesh);
364
371
378
379 int assignElementBoundaryMaterialTypesFromParent(Mesh& parentMesh, Mesh& childMesh, const int* levelElementParentsArray,
380 const int& nSpace_global);
381 int allocateNodeAndElementNodeDataStructures(Mesh& mesh, int nElements_global, int nNodes_global, int nNodes_element);
382 //mwf added for converting from triangle data structure
383 struct triangulateio;
384
385 int setFromTriangleElements(triangulateio* trimesh, Mesh& mesh, int base);
386 int setFromTriangleNodes(triangulateio* trimesh, Mesh& mesh, int base);
387 int readTriangleMesh(Mesh& mesh, const char* filebase, int base);
388 int readTriangleElementBoundaryMaterialTypes(Mesh& mesh, const char* filebase, int base);
389 int writeTriangleMesh(Mesh& mesh, const char* filebase, int base);
390 int readTetgenMesh(Mesh& mesh, const char* filebase, int base);
391 int readTetgenElementBoundaryMaterialTypes(Mesh& mesh, const char* filebase, int base);
392 int writeTetgenMesh(Mesh& mesh, const char* filebase, int base);
393 int read3DM(Mesh& mesh, const char* filebase, int indexBase);
394 int read2DM(Mesh& mesh, const char* filebase, int indexBase);
395 int readHex(Mesh& mesh, const char* filebase, int indexBase);
396 int readBC(Mesh& mesh, const char* filebase, int indexBase);
397 int write3dmMesh(Mesh& mesh, const char* filebase, int base);
398 int write2dmMesh(Mesh& mesh, const char* filebase, int base);
400 Mesh& mesh, int base);
401 }//extern "C"
402
403 // DMPlex mesh reader function declaration.
404 // #include <pybind11/pybind11.h>
405 // namespace py = pybind11;
406 #include <Python.h>
407 int readDMPlexMesh(PyObject* dmplexMesh, Mesh& mesh);
408
409/* A sorted tuple of node numbers to use as a key in maps */
410template<int nNodes>
412{
413public:
414 inline NodeTuple(const int* nodesIn)
415 {
416 //sort
417 int position;
418 for(int i=0;i<nNodes;i++)
419 {
420 position=0;
421 //dumb sorting seems fast enough for now
422 for(int j=0;j<nNodes;j++)
423 if(nodesIn[i] > nodesIn[j])
424 position++;
425 nodes[position]=nodesIn[i];
426 nodes_unsorted[i] = nodesIn[i];
427 }
428// for(int i=0;i<nNodes;i++)
429// nodes[i] = nodesIn[i];
430// std::sort(nodes,nodes+nNodes);
431 }
432 inline NodeTuple(const NodeTuple<nNodes>& nt)
433 {
434 for(int i=0;i<nNodes;i++)
435 {
436 nodes[i]=nt.nodes[i];
438 }
439 }
440 int nodes[nNodes];
441 int nodes_unsorted[nNodes];
442};
443
444template<int nNodes>
445inline bool operator<(const NodeTuple<nNodes>& left, const NodeTuple<nNodes>& right)
446{
447 for (int i=0;i<nNodes;i++)
448 {
449 if(left.nodes[i]<right.nodes[i])
450 return true;
451 else if(left.nodes[i]>right.nodes[i])
452 return false;
453 }
454 return false;
455}
456
457class Node
458{
459public:
460 int nN;
461 double x,y,z;
462 int flag;
463};
464
465inline void midpoint(const double* left, const double* right, Node& midpoint)
466{
467 midpoint.x = 0.5*(left[0]+right[0]);
468 midpoint.y = 0.5*(left[1]+right[1]);
469 midpoint.z = 0.5*(left[2]+right[2]);
470}
471
472inline double edgeLength(const Node& left, const Node& right)
473{
474 return sqrt( (right.x - left.x)*(right.x - left.x) +
475 (right.y - left.y)*(right.y - left.y) +
476 (right.z - left.z)*(right.z - left.z) );
477}
478
479inline double edgeLengthFromNodeNumbers(double* nodeArray,const int& left, const int& right)
480{
481 return sqrt( (nodeArray[right*3+0] - nodeArray[left*3+0])*(nodeArray[right*3+0] - nodeArray[left*3+0]) +
482 (nodeArray[right*3+1] - nodeArray[left*3+1])*(nodeArray[right*3+1] - nodeArray[left*3+1]) +
483 (nodeArray[right*3+2] - nodeArray[left*3+2])*(nodeArray[right*3+2] - nodeArray[left*3+2]) );
484}
485
486inline bool operator<(const Node& left, const Node& right)
487{
488 if(left.x < right.x)
489 return true;
490 else if (left.x > right.x)
491 return false;
492 else if (left.y < right.y)
493 return true;
494 else if (left.y > right.y)
495 return false;
496 else if (left.z < right.z)
497 return true;
498 else if (left.z > left.z)
499 return false;
500 return false;
501}
502
504{
505public:
506 inline ElementNeighbors(int leftIn,int left_ebN_elementIn){left=leftIn;left_ebN_element=left_ebN_elementIn;right=-1;right_ebN_element=-1;}
509};
510
511inline int newEdge(int eN,int* nodes,int n0,int n1)
512{
513 nodes[eN*2+0] = n0;
514 nodes[eN*2+1] = n1;
515 eN++;
516 return eN;
517}
518inline int newTriangle(int eN,int* nodes,int n0,int n1,int n2)
519{
520 nodes[eN*3+0] = n0;
521 nodes[eN*3+1] = n1;
522 nodes[eN*3+2] = n2;
523 eN++;
524 return eN;
525}
526
527inline int newTetrahedron(int eN,int* nodes,int n0,int n1,int n2,int n3)
528{
529 nodes[eN*4+0] = n0;
530 nodes[eN*4+1] = n1;
531 nodes[eN*4+2] = n2;
532 nodes[eN*4+3] = n3;
533 eN++;
534 return eN;
535}
536
537inline int newQuadrilateral(int eN,int* nodes,int n0,int n1,int n2,int n3)
538{
539 nodes[eN*4+0] = n0;
540 nodes[eN*4+1] = n1;
541 nodes[eN*4+2] = n2;
542 nodes[eN*4+3] = n3;
543 eN++;
544 return eN;
545}
546
547inline int newHexahedron(int eN,int* nodes,int n0,int n1,int n2,int n3,int n4,int n5,int n6,int n7)
548{
549 nodes[eN*8+0] = n0;
550 nodes[eN*8+1] = n1;
551 nodes[eN*8+2] = n2;
552 nodes[eN*8+3] = n3;
553 nodes[eN*8+4] = n4;
554 nodes[eN*8+5] = n5;
555 nodes[eN*8+6] = n6;
556 nodes[eN*8+7] = n7;
557 eN++;
558 return eN;
559}
560
561
562bool newestNodeBisect(int eN,
563 int& nElements_global,
564 int& nNodes_global,
565 std::vector<double>& nodeArray,
566 std::vector<int>& elementNodesArray,
567 std::vector<int>& elementNeighborsArray,
568 std::vector<std::list<int> >& childrenList,
569 std::vector<int>& elementParentsArray,
570 std::vector<int>& bases,
571 std::vector<bool>& refined);
572
573
574bool add4TnodesForRefinement2d(int eN,//element to be refined
575 int& nNodes_global,//number of nodes in mesh, will grow as refine
576 std::vector<bool>& refined, //is an element to be refined or not?
577 std::vector<int>& edgeMidNodesArray,//edge--> new node from bisection (-1 = none)
578 const int* elementNodesArray, //parent mesh representation
579 const int* elementBoundariesArray,
580 const int* elementNeighborsArray,
581 const double * nodeArray);
582
583bool add4TnodesForConformity2d(int eN, int ebN_longest,
584 int ebN_neig,int eN_neig,
585 int& nNodes_global,
586 std::vector<bool>& refined,
587 std::vector<int>& edgeMidNodesArray,
588 const int* elementNodesArray, //parent mesh representation
589 const int* elementBoundariesArray,
590 const int* elementNeighborsArray,
591 const double * nodeArray);
592
593int findLocalLongestEdge2d(int eN,
594 const int* elementNodesArray,
595 const double * nodeArray);
596
597bool subdivideTriangle4T(int eN_parent,
598 int& eN_new,
599 int* elementParentsArray,
600 int* elementChildrenOffsets,
601 int* elementChildrenArray,
602 int* elementNodesArray_child,
603 const std::vector<int>& edgeMidNodesArray,
604 const std::vector<bool>& refined,
605 const int* elementNodesArray_parent,
606 const int* elementBoundariesArray_parent,
607 const double* nodeArray_parent);
608
609
611
612#endif
ElementNeighbors(int leftIn, int left_ebN_elementIn)
Definition mesh.h:506
int right_ebN_element
Definition mesh.h:508
int left_ebN_element
Definition mesh.h:508
Definition mesh.h:458
double x
Definition mesh.h:461
double y
Definition mesh.h:461
int flag
Definition mesh.h:462
double z
Definition mesh.h:461
int nN
Definition mesh.h:460
int nodes_unsorted[nNodes]
Definition mesh.h:441
NodeTuple(const int *nodesIn)
Definition mesh.h:414
int nodes[nNodes]
Definition mesh.h:440
NodeTuple(const NodeTuple< nNodes > &nt)
Definition mesh.h:432
int regularHexahedralToTetrahedralElementBoundaryMaterials(const double &Lx, const double &Ly, const double &Lz, Mesh &mesh)
Definition mesh.cpp:268
int newTetrahedron(int eN, int *nodes, int n0, int n1, int n2, int n3)
Definition mesh.h:527
int writeTriangleMesh(Mesh &mesh, const char *filebase, int triangleIndexBase)
Definition mesh.cpp:4935
int writeNodes(std::ostream &meshFile, const Mesh &mesh)
Definition mesh.cpp:4820
int constructElementBoundaryElementsArray_edge(Mesh &mesh)
Definition mesh.cpp:622
int allocateGeometricInfo_hexahedron(Mesh &mesh)
Definition mesh.cpp:3651
int computeGeometricInfo_NURBS(Mesh &mesh)
Definition mesh.cpp:3749
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_hexahedron(Mesh &mesh)
Definition mesh.cpp:3305
int constructElementBoundaryElementsArrayWithGivenElementBoundaryNumbers_quadrilateral(Mesh &mesh)
Definition mesh.cpp:2279
void deleteMesh(Mesh &mesh)
Definition mesh.h:170
int constructElementBoundaryElementsArray_quadrilateral(Mesh &mesh)
Definition mesh.cpp:949
int setNewestNodeBasesToLongestEdge(MultilevelMesh &multilevelMesh)
Definition mesh.cpp:6107
int allocateGeometricInfo_triangle(Mesh &mesh)
Definition mesh.cpp:3756
int readTetgenMesh(Mesh &mesh, const char *filebase, int tetgenIndexBase)
Definition mesh.cpp:5023
void initializeMultilevelMesh(MultilevelMesh &multilevelMesh)
Definition mesh.h:272
int read3DM(Mesh &mesh, const char *filebase, int indexBase)
Definition mesh.cpp:5405
int writeElements(std::ostream &meshFile, const Mesh &mesh)
Definition mesh.cpp:4832
int constructElementBoundaryElementsArray_NURBS(Mesh &mesh)
Definition mesh.cpp:1516
int regularEdgeMeshNodes(const int &nx, const double &Lx, Mesh &mesh)
Definition mesh.cpp:73
int readTriangleElementBoundaryMaterialTypes(Mesh &mesh, const char *filebase, int triangleIndexBase)
Definition mesh.cpp:4965
int locallyRefineTriangleMesh(MultilevelMesh &multilevelMesh, int *elementTagArray)
Definition mesh.cpp:5928
int regularHexahedralMeshElementBoundaryMaterials(const double &Lx, const double &Ly, const double &Lz, Mesh &mesh)
Definition mesh.cpp:312
int regularRectangularToTriangularMeshElements(const int &nx, const int &ny, Mesh &mesh, int triangleFlag)
Definition mesh.cpp:88
int readDMPlexMesh(PyObject *dmplexMesh, Mesh &mesh)
Definition mesh.cpp:7669
int write2dmMesh(Mesh &mesh, const char *filebase, int adhIndexBase)
Definition mesh.cpp:5714
int newEdge(int eN, int *nodes, int n0, int n1)
Definition mesh.h:511
int regularMeshNodes2D(const int &nx, const int &ny, const double &Lx, const double &Ly, Mesh &mesh)
Definition mesh.cpp:419
int constructElementBoundaryElementsArray_hexahedron(Mesh &mesh)
Definition mesh.cpp:1308
int newQuadrilateral(int eN, int *nodes, int n0, int n1, int n2, int n3)
Definition mesh.h:537
void initializeMesh(Mesh &mesh)
Definition mesh.h:93
int regularQuadrilateralMeshElements(const int &nx, const int &ny, Mesh &mesh)
Definition mesh.cpp:513
int read2DM(Mesh &mesh, const char *filebase, int indexBase)
Definition mesh.cpp:5489
int constructElementBoundaryElementsArrayWithGivenElementBoundaryNumbers_tetrahedron(Mesh &mesh)
Definition mesh.cpp:2452
int findLocalLongestEdge2d(int eN, const int *elementNodesArray, const double *nodeArray)
Definition mesh.cpp:7331
bool add4TnodesForConformity2d(int eN, int ebN_longest, int ebN_neig, int eN_neig, int &nNodes_global, std::vector< bool > &refined, std::vector< int > &edgeMidNodesArray, const int *elementNodesArray, const int *elementBoundariesArray, const int *elementNeighborsArray, const double *nodeArray)
Definition mesh.cpp:7260
int regularHexahedralToTetrahedralMeshNodes(const int &nx, const int &ny, const int &nz, const double &Lx, const double &Ly, const double &Lz, Mesh &mesh)
Definition mesh.cpp:457
int setFromTriangleNodes(triangulateio *trimesh, Mesh &mesh, int base)
int globallyRefineHexahedralMesh(const int &nLevels, Mesh &mesh, MultilevelMesh &multilevelMesh, bool averageNewNodeFlags)
Definition mesh.cpp:4551
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_edge(Mesh &mesh)
Definition mesh.cpp:2632
int regularMeshNodes(const int &nx, const int &ny, const int &nz, const double &Lx, const double &Ly, const double &Lz, Mesh &mesh)
Definition mesh.cpp:368
int readBC(Mesh &mesh, const char *filebase, int indexBase)
Definition mesh.cpp:5656
int allocateGeometricInfo_quadrilateral(Mesh &mesh)
Definition mesh.cpp:3856
int constructElementBoundaryElementsArray_tetrahedron(Mesh &mesh)
Definition mesh.cpp:1118
int regularHexahedralToTetrahedralMeshElements(const int &nx, const int &ny, const int &nz, Mesh &mesh)
Definition mesh.cpp:232
int computeGeometricInfo_edge(Mesh &mesh)
Definition mesh.cpp:3938
int allocateGeometricInfo_edge(Mesh &mesh)
Definition mesh.cpp:3926
bool add4TnodesForRefinement2d(int eN, int &nNodes_global, std::vector< bool > &refined, std::vector< int > &edgeMidNodesArray, const int *elementNodesArray, const int *elementBoundariesArray, const int *elementNeighborsArray, const double *nodeArray)
Definition mesh.cpp:7202
int assignElementBoundaryMaterialTypesFromParent(Mesh &parentMesh, Mesh &childMesh, const int *levelElementParentsArray, const int &nSpace_global)
Definition mesh.cpp:4570
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_triangle(Mesh &mesh)
Definition mesh.cpp:2787
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_NURBS(Mesh &mesh)
Definition mesh.cpp:1738
int newHexahedron(int eN, int *nodes, int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7)
Definition mesh.h:547
int newTriangle(int eN, int *nodes, int n0, int n1, int n2)
Definition mesh.h:518
int constructElementBoundaryElementsArray_triangle(Mesh &mesh)
Definition mesh.cpp:780
int regularRectangularToTriangularMeshNodes(const int &nx, const int &ny, const double &Lx, const double &Ly, Mesh &mesh)
Definition mesh.cpp:166
int locallyRefineTriangleMesh_redGreen(MultilevelMesh &multilevelMesh, int *elementTagArray)
Definition mesh.cpp:6135
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_quadrilateral(Mesh &mesh)
Definition mesh.cpp:2962
int constructElementBoundaryElementsArrayWithGivenElementBoundaryNumbers_triangle(Mesh &mesh)
Definition mesh.cpp:2105
bool newestNodeBisect(int eN, int &nElements_global, int &nNodes_global, std::vector< double > &nodeArray, std::vector< int > &elementNodesArray, std::vector< int > &elementNeighborsArray, std::vector< std::list< int > > &childrenList, std::vector< int > &elementParentsArray, std::vector< int > &bases, std::vector< bool > &refined)
Definition mesh.cpp:6824
int computeGeometricInfo_quadrilateral(Mesh &mesh)
Definition mesh.cpp:3866
int computeGeometricInfo_triangle(Mesh &mesh)
Definition mesh.cpp:3768
int regularQuadrilateralMeshElementBoundaryMaterials(const double &Lx, const double &Ly, Mesh &mesh)
Definition mesh.cpp:362
int readTriangleMesh(Mesh &mesh, const char *filebase, int triangleIndexBase)
Definition mesh.cpp:4875
int writeTetgenMesh(Mesh &mesh, const char *filebase, int tetgenIndexBase)
Definition mesh.cpp:5370
int globallyRefineTetrahedralMesh(const int &nLevels, Mesh &mesh, MultilevelMesh &multilevelMesh, bool averageNewNodeFlags)
Definition mesh.cpp:4266
void midpoint(const double *left, const double *right, Node &midpoint)
Definition mesh.h:465
int edgeMeshElements(const int &nx, Mesh &mesh)
Definition mesh.cpp:59
int globallyRefineEdgeMesh(const int &nLevels, Mesh &mesh, MultilevelMesh &multilevelMesh, bool averageNewNodeFlags)
Definition mesh.cpp:4027
int constructElementBoundaryElementsArrayWithGivenElementBoundaryNumbers_edge(Mesh &mesh)
Definition mesh.cpp:1944
bool subdivideTriangle4T(int eN_parent, int &eN_new, int *elementParentsArray, int *elementChildrenOffsets, int *elementChildrenArray, int *elementNodesArray_child, const std::vector< int > &edgeMidNodesArray, const std::vector< bool > &refined, const int *elementNodesArray_parent, const int *elementBoundariesArray_parent, const double *nodeArray_parent)
Definition mesh.cpp:7359
int allocateNodeAndElementNodeDataStructures(Mesh &mesh, int nElements_global, int nNodes_global, int nNodes_element)
Definition mesh.cpp:4007
int globallyRefineTriangularMesh(const int &nLevels, Mesh &mesh, MultilevelMesh &multilevelMesh, bool averageNewNodeFlags)
Definition mesh.cpp:4122
int readElements(std::istream &meshFile, Mesh &mesh)
Definition mesh.cpp:4756
int readHex(Mesh &mesh, const char *filebase, int indexBase)
Definition mesh.cpp:5581
double edgeLengthFromNodeNumbers(double *nodeArray, const int &left, const int &right)
Definition mesh.h:479
int allocateGeometricInfo_NURBS(Mesh &mesh)
Definition mesh.cpp:3743
int globallyRefineQuadrilateralMesh(const int &nLevels, Mesh &mesh, MultilevelMesh &multilevelMesh, bool averageNewNodeFlags)
Definition mesh.cpp:4247
int write3dmMesh(Mesh &mesh, const char *filebase, int adhIndexBase)
Definition mesh.cpp:5694
int allocateGeometricInfo_tetrahedron(Mesh &mesh)
Definition mesh.cpp:3535
int regularHexahedralMeshElements(const int &nx, const int &ny, const int &nz, const int &px, const int &py, const int &pz, Mesh &mesh)
Definition mesh.cpp:470
int copyElementBoundaryMaterialTypesFromTriangle(triangulateio *trimesh, Mesh &mesh, int base)
int regularNURBSMeshElements(const int &nx, const int &ny, const int &nz, const int &px, const int &py, const int &pz, Mesh &mesh)
Definition mesh.cpp:541
int regularRectangularToTriangularElementBoundaryMaterials(const double &Lx, const double &Ly, Mesh &mesh)
Definition mesh.cpp:139
int locallyRefineTriangleMesh_4T(MultilevelMesh &multilevelMesh, int *elementTagArray)
Definition mesh.cpp:6646
int constructElementBoundaryElementsArrayWithGivenElementBoundaryAndEdgeNumbers_tetrahedron(Mesh &mesh)
Definition mesh.cpp:3117
bool operator<(const NodeTuple< nNodes > &left, const NodeTuple< nNodes > &right)
Definition mesh.h:445
int locallyRefineEdgeMesh(MultilevelMesh &multilevelMesh, int *elementTagArray)
Definition mesh.cpp:5778
void deleteMultilevelMesh(MultilevelMesh &multilevelMesh)
Definition mesh.h:281
int readTetgenElementBoundaryMaterialTypes(Mesh &mesh, const char *filebase, int tetgenIndexBase)
Definition mesh.cpp:5082
int reorientTetrahedralMesh(Mesh &mesh)
Definition mesh.cpp:225
int setFromTriangleElements(triangulateio *trimesh, Mesh &mesh, int base)
int computeGeometricInfo_hexahedron(Mesh &mesh)
Definition mesh.cpp:3663
int computeGeometricInfo_tetrahedron(Mesh &mesh)
Definition mesh.cpp:3547
double edgeLength(int nL, int nR, const double *nodeArray)
Definition mesh.cpp:3495
Definition mesh.h:30
int * elementBoundaryNodesArray
Definition mesh.h:49
int * elementIJK
Definition mesh.h:62
int nx
Definition mesh.h:65
int * edgeNumbering_subdomain2global
Definition mesh.h:85
double * elementBoundaryBarycentersArray
Definition mesh.h:70
int * nodeStarOffsets
Definition mesh.h:56
int * elementBoundaryNumbering_subdomain2global
Definition mesh.h:83
int nEdges_global
Definition mesh.h:41
double * nodeArray
Definition mesh.h:69
int nNodes_elementBoundary
Definition mesh.h:35
int * nodeNumbering_subdomain2global
Definition mesh.h:81
double * elementDiametersArray
Definition mesh.h:69
int nNodes_element
Definition mesh.h:34
int * elementBoundaryElementsArray
Definition mesh.h:50
int * nodeElementOffsets
Definition mesh.h:46
double * W_KNOT
Definition mesh.h:64
int * elementBoundaryOffsets_subdomain_owned
Definition mesh.h:82
double * nodeSupportArray
Definition mesh.h:71
int * nodeElementsArray
Definition mesh.h:45
int nElements_global
Definition mesh.h:32
int * elementOffsets_subdomain_owned
Definition mesh.h:78
int max_nElements_node
Definition mesh.h:40
int nNodes_global
Definition mesh.h:33
int * nodeStarArray
Definition mesh.h:55
double sigmaMax
Definition mesh.h:72
int * elementNodesArray
Definition mesh.h:44
double volume
Definition mesh.h:72
double * weights
Definition mesh.h:63
double * elementBoundaryDiametersArray
Definition mesh.h:69
int * elementNeighborsArray
Definition mesh.h:47
int py
Definition mesh.h:66
int * exteriorElementBoundariesArray
Definition mesh.h:53
int * elementBoundaryLocalElementBoundariesArray
Definition mesh.h:51
int nExteriorElementBoundaries_global
Definition mesh.h:39
int pz
Definition mesh.h:66
int nElementBoundaries_element
Definition mesh.h:36
int * elementNumbering_subdomain2global
Definition mesh.h:79
int * nodeOffsets_subdomain_owned
Definition mesh.h:80
int * elementBoundaryMaterialTypes
Definition mesh.h:58
int max_nNodeNeighbors_node
Definition mesh.h:42
int * elementMaterialTypes
Definition mesh.h:57
int * edgeNodesArray
Definition mesh.h:54
int * edgeOffsets_subdomain_owned
Definition mesh.h:84
double * U_KNOT
Definition mesh.h:64
double * elementBarycentersArray
Definition mesh.h:70
Mesh * subdomainp
Definition mesh.h:90
int px
Definition mesh.h:66
double * elementInnerDiametersArray
Definition mesh.h:69
int nInteriorElementBoundaries_global
Definition mesh.h:38
int * elementBoundariesArray
Definition mesh.h:48
int * newestNodeBases
Definition mesh.h:74
double hMin
Definition mesh.h:72
int ny
Definition mesh.h:65
int * interiorElementBoundariesArray
Definition mesh.h:52
double * nodeDiametersArray
Definition mesh.h:71
double * V_KNOT
Definition mesh.h:64
int nElementBoundaries_global
Definition mesh.h:37
int * nodeMaterialTypes
Definition mesh.h:59
int nz
Definition mesh.h:65
bool usePlex
Definition mesh.h:88
double h
Definition mesh.h:72
int nLevels
Definition mesh.h:265
int ** elementParentsArray
Definition mesh.h:267
int ** elementChildrenArray
Definition mesh.h:268
int ** elementChildrenOffsets
Definition mesh.h:269
Mesh * meshArray
Definition mesh.h:266