19#ifndef _GIMLI_Shape__H
20#define _GIMLI_Shape__H
23#include "polynomial.h"
24#include "curvefitting.h"
28 #include <boost/thread.hpp>
29 extern boost::mutex ShapeFunctionWriteCacheMutex__;
33 extern std::mutex ShapeFunctionWriteCacheMutex__;
40DLLEXPORT
double tetVolume(
const RVector3 & p0,
const RVector3 & p1,
41 const RVector3 & p2,
const RVector3 & p3);
44DLLEXPORT
double triSize(
const RVector3 & p0,
const RVector3 & p1,
48DLLEXPORT std::vector < PolynomialFunction < double > >
49createPolynomialShapeFunctions(
const std::vector < RVector3 > & pnts,
50 uint dim, uint nCoeff,
51 bool pascale,
bool serendipity,
52 const RVector & startVector);
55template <
class Ent > std::vector < PolynomialFunction < double > >
56 createPolynomialShapeFunctions(
const Ent & ent, uint nCoeff,
57 bool pascale,
bool serendipity,
58 const RVector & startVector){
60 std::vector < RVector3 > pnts;
61 for (Index i = 0; i < ent.nodeCount(); i ++){
62 pnts.push_back(ent.rst(i));
65 return createPolynomialShapeFunctions(pnts, ent.dim(), nCoeff, pascale,
66 serendipity, startVector);
70template <
class Ent > std::vector < PolynomialFunction < double > >
71 createPolynomialShapeFunctions(
const Ent & ent, uint nCoeff,
72 bool pascale,
bool serendipity){
74 return createPolynomialShapeFunctions(ent, nCoeff, pascale, serendipity, start);
77class DLLEXPORT ShapeFunctionCache :
public Singleton< ShapeFunctionCache > {
79 friend class Singleton< ShapeFunctionCache >;
81 template <
class Ent >
const std::vector < PolynomialFunction < double > > &
82 shapeFunctions(
const Ent & e)
const {
84 std::map < uint8, std::vector < PolynomialFunction < double > > >::const_iterator it =
shapeFunctions_.find(e.rtti());
87 this->createShapeFunctions_(e);
94 template <
class Ent >
const std::vector < PolynomialFunction < double > > &
95 deriveShapeFunctions(
const Ent & e , uint dim)
const {
96 std::map < uint8, std::vector < std::vector < PolynomialFunction < double > > > >::const_iterator it =
dShapeFunctions_.find(e.rtti());
99 this->createShapeFunctions_(e);
102 return (*it).second[dim];
111 std::vector< RMatrix3 > & RMatrix3Cache();
112 std::vector< RMatrix > & RMatrixCache(uint rtti);
114 RMatrix3 & cachedRMatrix3(uint i);
115 RMatrix & cachedRMatrix(uint rtti, uint i);
119 template <
class Ent >
void createShapeFunctions_(
const Ent & e)
const {
120 std::vector < PolynomialFunction < double > > N = e.createShapeFunctions();
128 boost::mutex::scoped_lock lock(ShapeFunctionWriteCacheMutex__);
135 std::unique_lock < std::mutex > lock(ShapeFunctionWriteCacheMutex__);
139 shapeFunctions_[e.rtti()] = N;
140 dShapeFunctions_[e.rtti()] = std::vector < std::vector < PolynomialFunction < double > > >();
142 dShapeFunctions_[e.rtti()].push_back(std::vector < PolynomialFunction < double > >());
143 dShapeFunctions_[e.rtti()].push_back(std::vector < PolynomialFunction < double > >());
144 dShapeFunctions_[e.rtti()].push_back(std::vector < PolynomialFunction < double > >());
146 for (uint i = 0; i < N.size(); i ++){
147 dShapeFunctions_[e.rtti()][0].push_back(N[i].derive(0));
148 dShapeFunctions_[e.rtti()][1].push_back(N[i].derive(1));
149 dShapeFunctions_[e.rtti()][2].push_back(N[i].derive(2));
154 ShapeFunctionCache(){}
156 virtual ~ShapeFunctionCache(){}
158 ShapeFunctionCache(
const ShapeFunctionCache &){};
160 void operator = (
const ShapeFunctionCache &){};
165 mutable std::map < uint8, std::vector < PolynomialFunction < double > > >
shapeFunctions_;
168 mutable std::map < uint8, std::vector< std::vector < PolynomialFunction < double > > > >
dShapeFunctions_;
170 mutable std::vector< RMatrix3 > _rMatrix3Cache;
171 mutable std::map< uint, std::vector< RMatrix > > _rMatrixCache;
175static const double NodeCoordinates[1][3] = {
192 virtual int dim()
const = 0;
195 virtual std::string
name()
const {
return "Shape"; }
201 Node & node(Index i)
const;
208 this->nodeVector_ = &n;
212 const std::vector< Node * > &
nodes()
const {
return * this->nodeVector_; }
217 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const ;
239 void createJacobian(RMatrix3 & J)
const;
241 RMatrix3 createJacobian()
const;
246 const RMatrix3 & invJacobian()
const;
250 virtual RVector N(
const RVector3 & L)
const;
255 virtual void N(
const RVector3 & L, RVector & ret)
const;
260 virtual void dNdrst(
const RVector3 & rst, RMatrix & MdNdrst)
const;
262 virtual RMatrix dNdrst(
const RVector3 & L)
const;
274 virtual void rst2xyz(
const RVector3 & rst, RVector3 & xyz)
const;
277 virtual RVector3 xyz(
const RVector3 & rst)
const;
284 virtual void xyz2rst(
const RVector3 & xyz, RVector3 & rst)
const;
287 virtual RVector3 rst(
const RVector3 & xyz)
const;
290 virtual RVector3 rst(Index i)
const;
295 inline double drstdxyz(uint rstI, uint xyzJ)
const {
303 virtual bool isInside(
const RVector3 & xyz,
bool verbose=
false)
const;
310 virtual bool isInside(
const RVector3 & xyz, RVector & sf,
311 bool verbose=
false)
const;
316 virtual bool touch(
const RVector3 & pos,
double tol=1e-6,
bool verbose=
false)
const;
321 virtual bool intersectRay(
const RVector3 & start,
const RVector3 & dir,
329 double domainSize()
const;
332 RVector3 center()
const;
335 virtual RVector3 norm()
const;
341 virtual Plane plane()
const;
346 double jacobianDeterminant()
const {
return det(this->createJacobian()); }
348 inline void resizeNodeSize_(Index n) { this->nodeCount_ = n; }
358 mutable double domSize_;
359 mutable bool hasDomSize_;
362 mutable RMatrix3 invJacobian_;
365 const std::vector < Node * > * nodeVector_;
368DLLEXPORT std::ostream & operator << (std::ostream & str,
const Shape & c);
370class DLLEXPORT NodeShape :
public Shape{
374 virtual ~NodeShape(){ }
376 virtual int rtti()
const {
return MESH_SHAPE_NODE_RTTI; }
378 virtual int dim()
const {
return 0; }
380 virtual std::string
name()
const {
return "NodeShape"; }
382 virtual RVector3 rst(Index i)
const;
386 virtual RVector3 norm()
const;
392static const double EdgeCoordinates[2][3] = {
397class DLLEXPORT EdgeShape :
public Shape {
401 virtual ~EdgeShape(){ }
403 virtual int rtti()
const {
return MESH_SHAPE_EDGE_RTTI; }
405 virtual int dim()
const {
return 1; }
407 virtual std::string
name()
const {
return "EdgeShape"; }
410 virtual RVector3 rst(Index i)
const;
415 virtual bool intersectRay(
const RVector3 & start,
const RVector3 & dir,
421 virtual bool touch(
const RVector3 & pos,
double tol=1e-6,
bool verbose=
false)
const;
423 double length()
const;
425 virtual RVector3 norm()
const;
432static const double TriCoordinates[3][3] = {
448class DLLEXPORT TriangleShape :
public Shape {
453 virtual ~TriangleShape(){ }
455 virtual int rtti()
const {
return MESH_SHAPE_TRIANGLE_RTTI; }
457 virtual int dim()
const {
return 2; }
459 virtual std::string
name()
const {
return "TriangleShape"; }
462 virtual RVector3 rst(Index i)
const;
465 virtual void xyz2rst(
const RVector3 & pos, RVector3 & rst)
const;
469 virtual RVector3 norm()
const;
474 virtual bool intersectRay(
const RVector3 & start,
const RVector3 & dir,
484static const double QuadCoordinates[4][3] = {
503class DLLEXPORT QuadrangleShape :
public Shape {
508 virtual ~QuadrangleShape(){ }
510 virtual int rtti()
const {
return MESH_SHAPE_QUADRANGLE_RTTI; }
512 virtual int dim()
const {
return 2; }
514 virtual std::string
name()
const {
return "QuadrangleShape"; }
517 virtual RVector3 rst(Index i)
const;
529 virtual RVector3 norm()
const;
531 virtual bool intersectRay(
const RVector3 & start,
const RVector3 & dir,
539class DLLEXPORT PolygonShape :
public Shape {
543 virtual ~PolygonShape();
545 virtual int rtti()
const {
return MESH_SHAPE_POLYGON_FACE_RTTI; }
547 virtual int dim()
const {
return 3; }
549 virtual std::string
name()
const {
return "PolygonFaceShape"; }
551 virtual RVector3 norm()
const;
553 virtual RVector3 rst(Index i)
const;
555 virtual bool isInside(
const RVector3 & xyz,
bool verbose)
const;
561static const double TetCoordinates[4][3] = {
572class DLLEXPORT TetrahedronShape :
public Shape {
574 TetrahedronShape(
MeshEntity * ent) :
Shape(ent) { resizeNodeSize_(4); }
576 virtual ~TetrahedronShape(){ }
578 virtual int rtti()
const {
return MESH_SHAPE_TETRAHEDRON_RTTI; }
580 virtual int dim()
const {
return 3; }
582 virtual std::string
name()
const {
return "TetrahedronShape"; }
585 virtual RVector3 rst(Index i)
const;
588 void xyz2rst(
const RVector3 & pos, RVector3 & rst)
const;
596 double volume()
const;
603static const int HexahedronSplit5TetID[5][4] = {
611static const int HexahedronSplit6TetID[6][4] = {
620static const double HexCoordinates[8][3] = {
645class DLLEXPORT HexahedronShape :
public Shape {
649 virtual ~HexahedronShape(){ }
651 virtual int rtti()
const {
return MESH_SHAPE_HEXAHEDRON_RTTI; }
653 virtual int dim()
const {
return 3; }
656 virtual RVector3 rst(Index i)
const;
658 virtual std::string
name()
const {
return "HexahedronShape"; }
660 double volume()
const;
664 virtual bool enforcePositiveDirection();
677static const uint8 TriPrimSplit3TetID[3][4] = {
683static const double PrismCoordinates[6][3] = {
704class DLLEXPORT TriPrismShape :
public Shape {
708 virtual ~TriPrismShape(){ }
710 virtual int rtti()
const {
return MESH_SHAPE_TRIPRISM_RTTI; }
712 virtual int dim()
const {
return 3; }
714 virtual std::string
name()
const {
return "TriagonalPrismShape"; }
717 virtual RVector3 rst(Index i)
const;
719 virtual std::vector < PolynomialFunction < double > > createShapeFunctions()
const;
721 double volume()
const;
728static const double PyramidCoordinates[5][3] = {
744class DLLEXPORT PyramidShape :
public Shape {
748 virtual ~PyramidShape(){ }
750 virtual int rtti()
const {
return MESH_SHAPE_PYRAMID_RTTI; }
752 virtual int dim()
const {
return 3; }
755 virtual RVector3 rst(Index i)
const;
virtual std::string name() const
Definition shape.h:407
virtual double domainSize_() const
Definition shape.h:429
virtual int rtti() const
Definition shape.h:403
virtual double domainSize_() const
Definition shape.h:674
virtual std::string name() const
Definition shape.h:658
virtual int rtti() const
Definition shape.h:651
Definition meshentities.h:103
virtual double domainSize_() const
Definition shape.h:384
virtual int rtti() const
Definition shape.h:376
virtual std::string name() const
Definition shape.h:380
3D Node
Definition node.h:39
A plane.
Definition plane.h:30
virtual int rtti() const
Definition shape.h:545
virtual std::string name() const
Definition shape.h:549
virtual int rtti() const
Definition shape.h:750
virtual std::string name() const
Definition shape.h:514
virtual double domainSize_() const
Definition shape.h:535
virtual int rtti() const
Definition shape.h:510
std::map< uint8, std::vector< std::vector< PolynomialFunction< double > > > > dShapeFunctions_
Definition shape.h:168
void clear()
Definition shape.h:106
std::map< uint8, std::vector< PolynomialFunction< double > > > shapeFunctions_
Definition shape.h:165
virtual std::string name() const
Definition shape.h:195
double drstdxyz(uint rstI, uint xyzJ) const
Definition shape.h:295
virtual double domainSize_() const
Definition shape.h:354
const RMatrix3 & invJacobian() const
Definition shape.cpp:311
void setNodesPtr(const std::vector< Node * > &n)
Definition shape.h:207
virtual int rtti() const =0
const std::vector< Node * > & nodes() const
Definition shape.h:212
Shape(MeshEntity *ent)
Definition shape.cpp:114
virtual bool intersectRay(const RVector3 &start, const RVector3 &dir, RVector3 &pos)
Definition shape.h:321
Index nodeCount() const
Definition shape.h:198
Singleton()
Definition gimli.h:634
virtual double domainSize_() const
Definition shape.h:600
virtual int rtti() const
Definition shape.h:578
virtual std::string name() const
Definition shape.h:582
double volume() const
Definition shape.cpp:718
virtual double domainSize_() const
Definition shape.h:725
virtual int rtti() const
Definition shape.h:710
virtual std::string name() const
Definition shape.h:714
virtual int rtti() const
Definition shape.h:455
virtual double domainSize_() const
Definition shape.h:480
virtual std::string name() const
Definition shape.h:459
GIMLi main namespace for the Geophyiscal Inversion and Modelling Library.
Definition baseentity.h:24
T det(const T &a, const T &b, const T &c, const T &d)
Definition matrix.h:1016
double triSize(const RVector3 &p0, const RVector3 &p1, const RVector3 &p2)
Definition shape.cpp:525
double tetVolume(const RVector3 &p0, const RVector3 &p1, const RVector3 &p2, const RVector3 &p3)
Definition shape.cpp:714