19#ifndef _GIMLI_MESHENTITIES__H
20#define _GIMLI_MESHENTITIES__H
26#include "elementmatrix.h"
27#include "baseentity.h"
29#include "polynomial.h"
36template <
class Typname >
bool lesserId(
const Typname * a,
const Typname * b){
37 return (a->id() < b->id());
44DLLEXPORT
Boundary * findBoundary(
const std::vector < Node * > & n);
47DLLEXPORT std::set < Boundary * >
53DLLEXPORT
Cell * findCommonCell(
const std::vector < Node * > & n,
bool warn =
true);
56class CollectNodeFunctor{
58 CollectNodeFunctor(std::set< Node * > & c):c_(& c){}
60 template <
class E >
void operator()(E * e){
61 for (Index i = 0; i < e->nodeCount(); i++) c_->insert(& e->node(i));
63 std::set< Node * > * c_;
69template <
class ContainerOfMeshEntities >
70std::set< Node * >
commonNodes(
const ContainerOfMeshEntities & c){
71 std::set< Node * > commons;
74 for_each(c.begin(), c.end(), gc);
78class DLLEXPORT RegionMarker :
public RVector3{
80 RegionMarker(
const RVector3 & pos,
int marker,
double area=0.0,
82 : RVector3(pos), marker_(marker), area_(area), isHole_(hole){}
86 inline void setMarker(SIndex marker) {marker_ = marker;}
87 inline int marker()
const {
return marker_;}
89 inline void setArea(
double area) {area_ = area;}
90 inline double area()
const {
return area_;}
92 inline void setPos(
const Pos & pos) {copy_(pos);}
94 bool isHole()
const {
return isHole_; }
95 inline void setHole(
bool h) { isHole_ = h; }
113 virtual uint
dim()
const {
return 0; }
116 virtual uint
rtti()
const {
return MESH_MESHENTITY_RTTI; }
119 virtual uint
parentType()
const {
return MESH_MESHENTITY_RTTI; }
121 virtual void setNodes(
const std::vector < Node * > & nodes);
123 const std::vector< Node * > & nodes()
const {
return nodeVector_; }
125 inline Node & node(uint i) {
126 ASSERT_RANGE(i, 0, nodeCount());
return *nodeVector_[i];
129 inline Node & node(uint i)
const {
130 ASSERT_RANGE(i, 0, nodeCount());
return *nodeVector_[i];
133 inline uint nodeCount()
const {
return nodeVector_.size(); }
135 inline Shape & shape() {
return *shape_; }
137 inline Shape & shape()
const {
return *shape_; }
139 inline Shape * pShape() {
return shape_; }
142 RVector3 rst(uint i)
const;
145 RVector3 center()
const;
150 virtual double attribute()
const {
return -1.0; }
153 IndexArray ids()
const;
155 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
160 virtual RVector N(
const RVector3 & rst)
const;
163 virtual void N(
const RVector3 & rst, RVector & n)
const;
168 virtual RVector dNdL(
const RVector3 & rst, uint i)
const;
175 virtual RMatrix dNdL(
const RVector3 & rst)
const;
180 double pot(
const RVector3 & p,
const RVector & u)
const;
185 RVector3 vec(
const RVector3 & p,
const R3Vector & v)
const;
190 RVector3 grad(
const RVector3 & p,
const RVector & u)
const;
192 friend std::ostream & operator << (std::ostream & str,
const MeshEntity & c);
198 void setUxCache(
const RMatrix & mat)
const { uxCache_ = mat; }
200 const RMatrix & uxCache()
const {
return uxCache_; }
202 ElementMatrix < double > & uCache(){
return uCache_; }
204 ElementMatrix < double > & gradUCache(){
return gradUCache_; }
209 void addSecondaryNode(Node * n);
211 void delSecondaryNode(Node * n);
213 const std::vector < Node * > & secondaryNodes()
const;
216 const std::vector < Node * > allNodes()
const;
218 Index allNodeCount()
const;
222 virtual bool enforcePositiveDirection();
227 virtual void registerNodes_();
228 virtual void deRegisterNodes_();
230 virtual void registerSecNode_(Node *n);
231 virtual void deRegisterSecNode_(Node *n);
236 std::vector < Node * > nodeVector_;
237 std::vector < Node * > secondaryNodes_;
241 mutable ElementMatrix < double > gradUCache_;
243 mutable RMatrix uxCache_;
263 DLLEXPORT
friend std::ostream & operator << (std::ostream & str,
const Cell & c);
269 Cell(
const std::vector < Node * > & nodes);
276 return &cell ==
this;
279 virtual uint
rtti()
const {
return MESH_CELL_RTTI; }
281 virtual uint neighborCellCount()
const {
return 0; }
282 inline uint boundaryCount()
const {
return neighborCellCount(); }
284 void cleanNeighborInfos();
286 Cell * neighborCell(
const RVector & sf);
298 virtual void findNeighborCell(uint i);
300 inline double attribute()
const {
return attribute_; }
302 inline void setAttribute(
double attr) { attribute_ = attr; }
306 Node * oppositeTo(
const Boundary & bound);
310 Boundary * boundaryTo(
const RVector & sf);
313 Boundary * boundary(Index i);
318 std::cout <<
rtti() << std::endl;
319 std::vector < Node * > n;
324 virtual void registerNodes_();
325 virtual void deRegisterNodes_();
326 virtual void registerSecNode_(
Node *n);
327 virtual void deRegisterSecNode_(
Node *n);
329 std::vector < Cell * > neighborCells_;
335 std::cerr <<
"cell(const cell & cell)" << std::endl;
343 std::cerr <<
"cell=cell" << std::endl;
353 Boundary(
const std::vector < Node * > & nodes);
356 virtual uint
rtti()
const {
return MESH_BOUNDARY_RTTI; }
357 virtual uint
parentType()
const {
return MESH_BOUNDARY_RTTI; }
360 virtual RVector3 rst(uint i)
const;
365 inline Cell * leftCell() {
return leftCell_; }
367 inline const Cell & rightCell()
const {
return *rightCell_; }
368 inline Cell * rightCell() {
return rightCell_; }
370 inline void setLeftCell(Cell * cell) { leftCell_ = cell; }
371 inline void setRightCell(Cell * cell) { rightCell_ = cell; }
373 friend std::ostream & operator << (std::ostream & str,
const Boundary & e);
376 virtual RVector3 norm()
const;
380 virtual RVector3 norm(
const Cell & cell)
const;
383 bool normShowsOutside(
const Cell & cell)
const;
386 void swapNorm(
bool withNeighbours=
true);
389 bool outside()
const {
return (leftCell_ != 0) && (rightCell_ == 0); }
393 virtual void registerNodes_();
394 virtual void deRegisterNodes_();
395 virtual void registerSecNode_(
Node *n);
396 virtual void deRegisterSecNode_(
Node *n);
405 std::cerr <<
"Boundary(const Boundary & bound)" << std::endl;
410 Boundary & operator = (
const Boundary & boundary){
411 if (
this != &boundary) {
412 std::cerr <<
"Assignment for boundaries not yet supported." << std::endl;
420class DLLEXPORT NodeBoundary :
public Boundary{
422 NodeBoundary(
Node & n1);
424 NodeBoundary(
const std::vector < Node * > & nodes);
426 virtual ~NodeBoundary();
428 virtual uint
dim()
const {
return 1; }
430 virtual uint
rtti()
const {
return MESH_BOUNDARY_NODE_RTTI; }
432 void setNodes(
Node & n1);
434 virtual double size()
const {
return 1.0; }
436 friend std::ostream & operator << (std::ostream & str,
const NodeBoundary & e);
440 virtual RVector3 norm()
const;
445class DLLEXPORT Edge :
public Boundary{
449 Edge(
const std::vector < Node * > & nodes);
453 virtual uint
dim()
const {
return 1; }
455 virtual uint
rtti()
const {
return MESH_EDGE_RTTI; }
457 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
459 void setNodes(
Node & n1,
Node & n2);
469 friend std::ostream & operator << (std::ostream & str,
const Edge & e);
474class DLLEXPORT Edge3 :
public Edge{
477 Edge3(
const std::vector < Node * > & nodes);
481 virtual uint
rtti()
const {
return MESH_EDGE3_RTTI; }
484 virtual RVector3 rst(uint i)
const;
486 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
499class DLLEXPORT TriangleFace :
public Boundary{
503 TriangleFace(
const std::vector < Node * > & nodes);
505 virtual ~TriangleFace();
507 virtual uint
dim()
const {
return 2; }
509 virtual uint
rtti()
const {
return MESH_TRIANGLEFACE_RTTI; }
513 friend std::ostream & operator << (std::ostream & str,
const TriangleFace & e);
516 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
534class DLLEXPORT Triangle6Face :
public TriangleFace{
536 Triangle6Face(
const std::vector < Node * > & nodes);
540 virtual uint
rtti()
const {
return MESH_TRIANGLEFACE6_RTTI; }
543 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
546 virtual RVector3 rst(uint i)
const;
551class DLLEXPORT QuadrangleFace :
public Boundary{
555 QuadrangleFace(
const std::vector < Node * > & nodes);
557 virtual ~QuadrangleFace();
559 virtual uint
dim()
const {
return 2; }
561 virtual uint
rtti()
const {
return MESH_QUADRANGLEFACE_RTTI; }
564 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
568 friend std::ostream & operator << (std::ostream & str,
const TriangleFace & e);
573 std::cerr <<
"QuadrangleFace(const QuadrangleFace & quad)" << std::endl;
577class DLLEXPORT Quadrangle8Face :
public QuadrangleFace{
580 Quadrangle8Face(
const std::vector < Node * > & nodes);
582 virtual ~Quadrangle8Face();
584 virtual uint
rtti()
const {
return MESH_QUADRANGLEFACE8_RTTI; }
587 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
590 virtual RVector3 rst(uint i)
const;
598class DLLEXPORT PolygonFace :
public Boundary {
601 typedef Pos HoleMarker;
602 typedef std::vector < Pos > HoleMarkerList;
604 PolygonFace(
const std::vector < Node * > & nodes);
608 virtual uint
dim()
const {
return 3; }
610 virtual uint
rtti()
const {
return MESH_POLYGON_FACE_RTTI; }
615 void insertNode(
Node * node,
double tol=TOLERANCE);
620 void addSubface(
const std::vector < Node * > & nodes,
bool isHole=
false);
622 Index subfaceCount()
const {
return this->subfaces_.size();}
624 const std::vector < Node * > & subface(Index i)
const;
628 void addHoleMarker(
const RVector3 & pos);
630 void delHoleMarker(
const RVector3 & pos);
633 const HoleMarkerList & holeMarkers()
const;
639 std::vector < std::vector < Node * > > subfaces_;
640 HoleMarkerList holeMarker_;
645class DLLEXPORT EdgeCell :
public Cell {
649 EdgeCell(
const std::vector < Node * > & nodes);
653 virtual uint
dim()
const {
return 1; }
655 virtual uint
rtti()
const {
return MESH_EDGE_CELL_RTTI; }
657 virtual uint neighborCellCount()
const {
return 2; }
661 void setNodes(Node & n1, Node & n2);
663 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
669 virtual std::vector < Node * > boundaryNodes(Index i)
const;
671 friend std::ostream & operator << (std::ostream & str,
const EdgeCell & t);
677class DLLEXPORT Edge3Cell :
public EdgeCell {
679 Edge3Cell(
const std::vector < Node * > & nodes);
681 virtual ~Edge3Cell();
683 virtual uint
rtti()
const {
return MESH_EDGE3_CELL_RTTI; }
685 virtual RVector3 rst(uint i)
const;
687 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
702class DLLEXPORT Triangle :
public Cell {
706 Triangle(
const std::vector < Node * > & nodes);
710 virtual uint
dim()
const {
return 2; }
712 virtual uint
rtti()
const {
return MESH_TRIANGLE_RTTI; }
714 virtual uint neighborCellCount()
const {
return 3; }
718 void setNodes(Node & n1, Node & n2, Node & n3);
720 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
722 friend std::ostream & operator << (std::ostream & str,
const Triangle & t);
729 virtual std::vector < Node * > boundaryNodes(Index i)
const;
744class DLLEXPORT Triangle6 :
public Triangle {
746 Triangle6(
const std::vector < Node * > & nodes);
748 virtual ~Triangle6();
750 virtual uint
rtti()
const {
return MESH_TRIANGLE6_RTTI; }
752 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
774class DLLEXPORT Quadrangle :
public Cell {
778 Quadrangle(
const std::vector < Node * > & nodes);
780 virtual ~Quadrangle();
782 virtual uint
dim()
const {
return 2; }
784 virtual uint
rtti()
const {
return MESH_QUADRANGLE_RTTI; }
788 virtual uint neighborCellCount()
const {
return 4; }
792 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
794 friend std::ostream & operator << (std::ostream & str,
const Quadrangle & t);
796 virtual std::vector < Node * > boundaryNodes(Index i)
const;
813class DLLEXPORT Quadrangle8 :
public Quadrangle {
815 Quadrangle8(
const std::vector < Node * > & nodes);
817 virtual ~Quadrangle8();
819 virtual uint
rtti()
const {
return MESH_QUADRANGLE8_RTTI; }
821 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
856class DLLEXPORT Tetrahedron :
public Cell {
860 Tetrahedron(
const std::vector < Node * > & nodes);
862 virtual ~Tetrahedron();
864 virtual uint
dim()
const {
return 3; }
866 virtual uint
rtti()
const {
return MESH_TETRAHEDRON_RTTI; }
868 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
872 virtual uint neighborCellCount()
const {
return 4; }
876 friend std::ostream & operator << (std::ostream & str,
const Tetrahedron & t);
883 virtual std::vector < Node * > boundaryNodes(Index i)
const;
888 Tetrahedron(
const Tetrahedron& cell){ std::cerr <<
"Tetrahedron cell(const cell & cell)" << std::endl; }
891 Tetrahedron & operator = (
const Tetrahedron & cell){
893 std::cerr <<
"Tetrahedron cell=cell" << std::endl;
901static const uint8 Tet10NodeSplit[10][2] = {
902 {0,0},{1,1},{2,2},{3,3},
908static const uint8 Tet10NodeSplitZienk[10][2] = {
909 {0,0},{1,1},{2,2},{3,3},
914class DLLEXPORT Tetrahedron10 :
public Tetrahedron {
916 Tetrahedron10(
const std::vector < Node * > & nodes);
918 virtual ~Tetrahedron10();
920 virtual uint
rtti()
const {
return MESH_TETRAHEDRON10_RTTI; }
922 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
966class DLLEXPORT Hexahedron:
public Cell {
968 Hexahedron(
const std::vector < Node * > & nodes);
970 virtual ~Hexahedron();
972 virtual uint
dim()
const {
return 3; }
974 virtual uint
rtti()
const {
return MESH_HEXAHEDRON_RTTI; }
976 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
978 virtual uint neighborCellCount()
const {
return 6; }
980 friend std::ostream & operator << (std::ostream & str,
const Hexahedron & t);
983 virtual std::vector < Node * > boundaryNodes(Index i)
const;
988static const uint8 Hexahedron20FacesID[6][8] = {
989 {0,1,5,4,8,17,12,16},
990 {1,2,6,5,9,18,13,17},
991 {2,3,7,6,10,19,14,18},
992 {3,0,4,7,11,16,15,19},
994 {4,5,6,7,12,13,14,15},
997static const uint8 Hex20NodeSplit[20][2] = {
998 {0,0},{1,1},{2,2},{3,3},{4,4},{5,5},{6,6},{7,7},
999 {0,1},{1,2},{2,3},{3,0},
1000 {4,5},{5,6},{6,7},{7,4},
1001 {0,4},{1,5},{2,6},{3,7}
1025class DLLEXPORT Hexahedron20:
public Hexahedron {
1027 Hexahedron20(
const std::vector < Node * > & nodes);
1029 virtual ~Hexahedron20();
1031 virtual uint
rtti()
const {
return MESH_HEXAHEDRON20_RTTI; }
1033 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
1036 virtual std::vector < Node * > boundaryNodes(Index i)
const;
1064class DLLEXPORT TriPrism :
public Cell {
1066 TriPrism(
const std::vector < Node * > & nodes);
1068 virtual ~TriPrism();
1070 virtual uint
dim()
const {
return 3; }
1072 virtual uint
rtti()
const {
return MESH_TRIPRISM_RTTI; }
1074 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
1076 virtual uint neighborCellCount()
const {
return 5; }
1078 friend std::ostream & operator << (std::ostream & str,
const Hexahedron & t);
1081 virtual std::vector < Node * > boundaryNodes(Index i)
const;
1086static const uint8 Prism15NodeSplit[15][2] = {
1087 {0,0},{1,1},{2,2},{3,3},{4,4},{5,5},
1110class DLLEXPORT TriPrism15 :
public TriPrism {
1112 TriPrism15(
const std::vector < Node * > & nodes);
1114 virtual ~TriPrism15();
1116 virtual uint
rtti()
const {
return MESH_TRIPRISM15_RTTI; }
1118 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
1148class DLLEXPORT Pyramid :
public Cell {
1150 Pyramid(
const std::vector < Node * > & nodes);
1154 virtual uint
dim()
const {
return 3; }
1156 virtual uint
rtti()
const {
return MESH_PYRAMID_RTTI; }
1158 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
1160 virtual uint neighborCellCount()
const {
return 5; }
1163 virtual std::vector < Node * > boundaryNodes(Index i)
const;
1169static const uint8 Pyramid13NodeSplit[13][2] = {
1170 {0,0},{1,1},{2,2},{3,3},{4,4},
1171 {0,1},{1,2},{2,3},{3,0},
1172 {0,4},{1,4},{2,4},{3,4}
1193class DLLEXPORT Pyramid13 :
public Pyramid {
1195 Pyramid13(
const std::vector < Node * > & nodes);
1197 virtual ~Pyramid13();
1199 virtual uint
rtti()
const {
return MESH_PYRAMID13_RTTI; }
1201 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
1206DLLEXPORT std::ostream & operator << (std::ostream & str,
const std::set < GIMLI::MeshEntity * > & ents);
1208DLLEXPORT std::ostream & operator << (std::ostream & str,
const std::set < GIMLI::Boundary * > & bounds);
Definition meshentities.h:350
virtual uint parentType() const
Definition meshentities.h:357
bool outside() const
Definition meshentities.h:389
Boundary(const Boundary &bound)
Definition meshentities.h:404
const Cell & leftCell() const
Definition meshentities.h:364
virtual uint rtti() const
Definition meshentities.h:356
A abstract cell.
Definition meshentities.h:261
Cell()
Definition meshentities.cpp:394
virtual uint parentType() const
Definition meshentities.h:280
Cell(const Cell &cell)
Definition meshentities.h:334
virtual uint rtti() const
Definition meshentities.h:279
virtual std::vector< Node * > boundaryNodes(Index i) const
Definition meshentities.h:316
Cell * neighborCell(uint i)
Definition meshentities.h:294
bool operator==(const Cell &cell)
Definition meshentities.h:275
Definition meshentities.h:56
virtual uint rtti() const
Definition meshentities.h:683
virtual uint rtti() const
Definition meshentities.h:481
virtual uint rtti() const
Definition meshentities.h:655
virtual uint dim() const
Definition meshentities.h:653
Definition meshentities.h:445
virtual uint rtti() const
Definition meshentities.h:455
virtual uint dim() const
Definition meshentities.h:453
virtual uint rtti() const
Definition meshentities.h:1031
virtual uint rtti() const
Definition meshentities.h:974
virtual uint dim() const
Definition meshentities.h:972
ElementMatrix< double > uCache_
Definition meshentities.h:240
MeshEntity(const MeshEntity &ent)
Definition meshentities.h:247
virtual uint parentType() const
Definition meshentities.h:119
virtual uint rtti() const
Definition meshentities.h:116
virtual uint dim() const
Definition meshentities.h:113
MeshEntity()
Definition meshentities.cpp:203
virtual uint dim() const
Definition meshentities.h:428
virtual uint rtti() const
Definition meshentities.h:430
3D Node
Definition node.h:39
virtual uint dim() const
Definition meshentities.h:608
virtual uint rtti() const
Definition meshentities.h:610
HoleMarkerList & holeMarkers()
Definition meshentities.h:636
3 dimensional vector
Definition pos.h:73
virtual uint rtti() const
Definition meshentities.h:1199
virtual uint dim() const
Definition meshentities.h:1154
virtual uint rtti() const
Definition meshentities.h:1156
virtual uint rtti() const
Definition meshentities.h:584
virtual uint rtti() const
Definition meshentities.h:819
Definition meshentities.h:551
virtual uint dim() const
Definition meshentities.h:559
virtual uint rtti() const
Definition meshentities.h:561
virtual uint dim() const
Definition meshentities.h:782
virtual uint rtti() const
Definition meshentities.h:784
virtual uint rtti() const
Definition meshentities.h:920
virtual uint rtti() const
Definition meshentities.h:866
virtual uint dim() const
Definition meshentities.h:864
Tetrahedron(const Tetrahedron &cell)
Definition meshentities.h:888
virtual uint rtti() const
Definition meshentities.h:1116
virtual uint dim() const
Definition meshentities.h:1070
virtual uint rtti() const
Definition meshentities.h:1072
virtual uint rtti() const
Definition meshentities.h:540
virtual uint rtti() const
Definition meshentities.h:750
Definition meshentities.h:499
virtual uint dim() const
Definition meshentities.h:507
virtual uint rtti() const
Definition meshentities.h:509
virtual uint dim() const
Definition meshentities.h:710
virtual uint rtti() const
Definition meshentities.h:712
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
static const uint8 TriPrismFacesID[5][4]
Triangular prism.
Definition meshentities.h:1055
std::set< Node * > commonNodes(const ContainerOfMeshEntities &c)
Definition meshentities.h:70
static const uint8 HexahedronFacesID[6][4]
A Hexahedron.
Definition meshentities.h:957
static const uint8 PyramidFacesID[5][4]
A Pyramid.
Definition meshentities.h:1140
std::set< Boundary * > findBoundaries(const std::vector< Node * > &n)
Definition meshentities.cpp:79
static const uint8 TetrahedronFacesID[4][3]
A Tetrahedron.
Definition meshentities.h:845