escript  Revision_
FinleyElements.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2020 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14 * Development from 2019 by School of Earth and Environmental Sciences
15 **
16 *****************************************************************************/
17 
18 #ifndef __WEIPA_FINLEYELEMENTS_H__
19 #define __WEIPA_FINLEYELEMENTS_H__
20 
21 #include <weipa/ElementData.h>
22 #include <weipa/FinleyNodes.h>
23 
24 #ifdef USE_DUDLEY
25 #include <dudley/Dudley.h> // for DUDLEY_...
26 #include <dudley/ElementType.h> // for dudley::ElementTypeId
27 #endif
28 #ifdef USE_FINLEY
29 #include <finley/ReferenceElements.h> // for finley::ElementTypeId
30 #endif
31 
32 class DBfile;
33 
34 #ifdef NETCDF4
35 #include <ncFile.h>
36 #define NCFTYPE netCDF::NcFile&
37 #else
38 class NcFile;
39 #define NCFTYPE NcFile*
40 #endif
41 
42 namespace dudley {
43  class ElementFile;
44 }
45 
46 namespace finley {
47  class ElementFile;
48 }
49 
50 namespace weipa {
51 
55 {
59  const size_t* multiCellIndices;
61  int quadDim;
62 };
63 
64 class FinleyElements;
65 typedef boost::shared_ptr<FinleyElements> FinleyElements_ptr;
66 
77 {
78 public:
79 
81  FinleyElements(const std::string& elementName, FinleyNodes_ptr nodes);
82 
85 
87  virtual ~FinleyElements() {}
88 
90  bool initFromDudley(const dudley::ElementFile* dudleyFile);
91 
93  bool initFromFinley(const finley::ElementFile* finleyFile);
94 
96  bool readFromNc(NCFTYPE ncfile);
97 
100  void reorderGhostZones(int ownIndex);
101 
103  void removeGhostZones(int ownIndex);
104 
106  virtual void writeConnectivityVTK(std::ostream& os);
107 
113  bool writeToSilo(DBfile* dbfile, const std::string& siloPath,
114  const StringVec& labels, const StringVec& units,
115  bool writeMeshData);
116 
118  virtual StringVec getMeshNames() const;
119 
121  virtual StringVec getVarNames() const;
122 
124  virtual int getNumElements() const { return numElements; }
125 
127  virtual int getNodesPerElement() const { return nodesPerElement; }
128 
130  virtual int getGhostCount() const { return numGhostElements; }
131 
133  virtual ZoneType getType() const { return type; }
134 
135 #ifdef USE_FINLEY
136  finley::ElementTypeId getFinleyTypeId() const { return finleyTypeId; }
138 #endif
139 
141  virtual const IntVec& getNodeList() const { return nodes; }
142 
144  virtual const IntVec& getIDs() const { return ID; }
145 
149  virtual const IntVec& getVarDataByName(const std::string varName) const;
150 
152  virtual NodeData_ptr getNodes() const { return nodeMesh; }
153 
156 
158  virtual const QuadMaskInfo& getQuadMask(int functionSpace) const;
159 
163  virtual int getElementFactor() const { return elementFactor; }
164 
165 private:
167 #ifdef USE_DUDLEY
168  FinleyElementInfo getDudleyTypeInfo(dudley::ElementTypeId typeId);
169 #endif
170 #ifdef USE_FINLEY
171  FinleyElementInfo getFinleyTypeInfo(finley::ElementTypeId typeId);
172  finley::ElementTypeId finleyTypeId;
173 #endif
174  void buildMeshes();
176  IntVec prepareGhostIndices(int ownIndex);
177  void reorderArray(IntVec& v, const IntVec& idx, int elementsPerIndex);
178  QuadMaskInfo buildQuadMask(const CoordArray& quadNodes, int numQNodes);
179 
183  std::string name;
193 };
194 
195 } // namespace weipa
196 
197 #undef NCFTYPE
198 #endif // __WEIPA_FINLEYELEMENTS_H__
199 
weipa::FinleyElements::reducedQuadMask
QuadMaskInfo reducedQuadMask
Definition: FinleyElements.h:191
dudley::ElementFile::Tag
int * Tag
Tag[i] is the tag of element i.
Definition: dudley/src/ElementFile.h:121
finley::Rec4_Contact
@ Rec4_Contact
Definition: ReferenceElements.h:89
finley::Line3
@ Line3
Definition: ReferenceElements.h:44
weipa::inside3D
bool inside3D(float x, float y, float z, float cx, float cy, float cz, float r)
Definition: FinleyElements.cpp:1104
dudley::Dudley_Point1
@ Dudley_Point1
Definition: ElementType.h:26
finley::Rec9
@ Rec9
Definition: ReferenceElements.h:52
FINLEY_REDUCED_FACE_ELEMENTS
#define FINLEY_REDUCED_FACE_ELEMENTS
Definition: Finley.h:57
finley::Rec8Face_Contact
@ Rec8Face_Contact
Definition: ReferenceElements.h:102
weipa::FinleyElements::getNodeList
virtual const IntVec & getNodeList() const
Returns a vector of the node IDs used by the elements.
Definition: FinleyElements.h:141
weipa::FinleyElements::buildQuadMask
QuadMaskInfo buildQuadMask(const CoordArray &quadNodes, int numQNodes)
Definition: FinleyElements.cpp:1198
finley::Hex20Face_Contact
@ Hex20Face_Contact
Definition: ReferenceElements.h:110
weipa::FinleyElements::buildMeshes
void buildMeshes()
Definition: FinleyElements.cpp:711
weipa::FinleyElements::getVarDataByName
virtual const IntVec & getVarDataByName(const std::string varName) const
Returns an array of data values for the name provided.
Definition: FinleyElements.cpp:516
weipa::FinleyElementInfo::elementType
ZoneType elementType
Definition: FinleyElements.h:56
FINLEY_REDUCED_ELEMENTS
#define FINLEY_REDUCED_ELEMENTS
Definition: Finley.h:56
FINLEY_REDUCED_CONTACT_ELEMENTS_1
#define FINLEY_REDUCED_CONTACT_ELEMENTS_1
Definition: Finley.h:58
weipa::FinleyElements::tag
IntVec tag
Definition: FinleyElements.h:189
weipa::FinleyElementInfo
Holds information that is used to convert from finley element types to elements supported by Silo and...
Definition: FinleyElements.h:55
weipa::FinleyElements::numGhostElements
int numGhostElements
Definition: FinleyElements.h:185
finley::const_ReferenceElementSet_ptr
boost::shared_ptr< const ReferenceElementSet > const_ReferenceElementSet_ptr
Definition: ReferenceElementSets.h:80
weipa::FinleyElements::writeToSilo
bool writeToSilo(DBfile *dbfile, const std::string &siloPath, const StringVec &labels, const StringVec &units, bool writeMeshData)
Writes element data into given directory in given Silo file.
Definition: FinleyElements.cpp:771
dudley::Dudley_Tet4Face
@ Dudley_Tet4Face
Definition: ElementType.h:32
finley::Tet4Face_Contact
@ Tet4Face_Contact
Definition: ReferenceElements.h:106
finley::Line3_Contact
@ Line3_Contact
Definition: ReferenceElements.h:83
weipa::ZONETYPE_HEX
@ ZONETYPE_HEX
Definition: ElementData.h:30
weipa::QuadMaskInfo::mask
std::vector< IntVec > mask
Definition: ElementData.h:41
weipa::FinleyElements::~FinleyElements
virtual ~FinleyElements()
Destructor.
Definition: FinleyElements.h:87
weipa::sameSide
bool sameSide(float d1, float d2)
Definition: FinleyElements.cpp:1112
weipa::FinleyElements::prepareGhostIndices
IntVec prepareGhostIndices(int ownIndex)
Definition: FinleyElements.cpp:646
weipa::FinleyElements::getGhostCount
virtual int getGhostCount() const
Returns the number of "ghost" elements.
Definition: FinleyElements.h:130
weipa::FinleyElementInfo::elementSize
int elementSize
Definition: FinleyElements.h:58
hex20indices
static const size_t hex20indices[36 *3]
Definition: FinleyElements.cpp:93
finley::Tet10
@ Tet10
Definition: ReferenceElements.h:56
finley::ElementFile::Tag
int * Tag
Tag[i] is the tag of element i.
Definition: finley/src/ElementFile.h:129
dudley::ElementFile::Nodes
index_t * Nodes
Nodes[INDEX(k, i, numNodes)] is the k-th node in the i-th element.
Definition: dudley/src/ElementFile.h:133
weipa::FinleyElements::getNumElements
virtual int getNumElements() const
Returns the number of elements.
Definition: FinleyElements.h:124
finley::Tet10Macro
@ Tet10Macro
Definition: ReferenceElements.h:116
weipa::FinleyElements::initFromDudley
bool initFromDudley(const dudley::ElementFile *dudleyFile)
Initialises with data from a Dudley ElementFile instance.
Definition: FinleyElements.cpp:169
weipa::FinleyElements::getQuadMask
virtual const QuadMaskInfo & getQuadMask(int functionSpace) const
Returns a QuadMaskInfo structure for given functionspace code.
Definition: FinleyElements.cpp:535
weipa::FinleyElements::elementFactor
int elementFactor
Definition: FinleyElements.h:192
weipa::ZONETYPE_TRIANGLE
@ ZONETYPE_TRIANGLE
Definition: ElementData.h:34
weipa::FinleyElements::reorderGhostZones
void reorderGhostZones(int ownIndex)
Moves "ghost" elements (whose owner does not match ownIndex) and the corresponding data to the end of...
Definition: FinleyElements.cpp:670
weipa::QuadMaskInfo
This struct holds a mask (0's and 1's) that indicates which quad nodes contribute to a sub-element wh...
Definition: ElementData.h:40
finley::Tri6Face
@ Tri6Face
Definition: ReferenceElements.h:66
finley::Tet4Face
@ Tet4Face
Definition: ReferenceElements.h:74
finley::Line3Face
@ Line3Face
Definition: ReferenceElements.h:63
dudley::Dudley_Tri3Face
@ Dudley_Tri3Face
Definition: ElementType.h:31
weipa::FinleyElements::numElements
int numElements
Definition: FinleyElements.h:184
weipa::FinleyElements::ID
IntVec ID
Definition: FinleyElements.h:189
weipa::FinleyElementInfo::multiCellIndices
const size_t * multiCellIndices
Definition: FinleyElements.h:59
dudley::ElementFile::Owner
int * Owner
Owner[i] contains the rank that owns element i.
Definition: dudley/src/ElementFile.h:124
tri6indices
static const size_t tri6indices[4 *3]
Definition: FinleyElements.cpp:63
finley::Tet10Face
@ Tet10Face
Definition: ReferenceElements.h:75
finley::Tri6Face_Contact
@ Tri6Face_Contact
Definition: ReferenceElements.h:98
weipa::ZONETYPE_UNKNOWN
@ ZONETYPE_UNKNOWN
Definition: ElementData.h:28
finley::Rec8Face
@ Rec8Face
Definition: ReferenceElements.h:70
weipa::FinleyElements::getVarNames
virtual StringVec getVarNames() const
Returns a vector with the mesh variable names.
Definition: FinleyElements.cpp:503
finley::ElementFile::Nodes
index_t * Nodes
Definition: finley/src/ElementFile.h:144
finley::Rec8_Contact
@ Rec8_Contact
Definition: ReferenceElements.h:90
weipa::FinleyElements::nodesPerElement
int nodesPerElement
Definition: FinleyElements.h:186
weipa
Definition: DataVar.cpp:51
finley::Tri3
@ Tri3
Definition: ReferenceElements.h:46
finley::Rec9Macro
@ Rec9Macro
Definition: ReferenceElements.h:115
finley::Hex27
@ Hex27
Definition: ReferenceElements.h:60
finley::Line2Face
@ Line2Face
Definition: ReferenceElements.h:62
weipa::ZoneType
ZoneType
Definition: ElementData.h:27
finley::Rec9_Contact
@ Rec9_Contact
Definition: ReferenceElements.h:91
weipa::FinleyElements::getMeshNames
virtual StringVec getMeshNames() const
Returns the names of the meshes associated with the elements.
Definition: FinleyElements.cpp:487
weipa::QuadMaskInfo::factor
IntVec factor
Definition: ElementData.h:42
finley::Point1_Contact
@ Point1_Contact
Definition: ReferenceElements.h:81
tet10indices
static const size_t tet10indices[8 *4]
Definition: FinleyElements.cpp:83
paso::util::copy
void copy(dim_t N, double *out, const double *in)
out = in
Definition: PasoUtil.h:88
rec9indices
static const size_t rec9indices[4 *4]
Definition: FinleyElements.cpp:77
weipa::FinleyElementInfo::useQuadNodes
bool useQuadNodes
Definition: FinleyElements.h:60
finley::ElementFile::numElements
dim_t numElements
number of elements
Definition: finley/src/ElementFile.h:122
dudley
A suite of factory methods for creating 2D and 3D dudley domains.
Definition: dudley/src/Assemble.h:32
hex27indices
static const size_t hex27indices[8 *8]
Definition: FinleyElements.cpp:107
weipa::det4x4
static float det4x4(float m_00, float m_01, float m_02, float m_03, float m_10, float m_11, float m_12, float m_13, float m_20, float m_21, float m_22, float m_23, float m_30, float m_31, float m_32, float m_33)
Definition: FinleyElements.cpp:1119
finley::ElementFile::Owner
int * Owner
Owner[i] contains the rank that owns element i.
Definition: finley/src/ElementFile.h:132
weipa::FinleyElements_ptr
boost::shared_ptr< FinleyElements > FinleyElements_ptr
Definition: FinleyElements.h:64
dudley::Dudley_Line2Face
@ Dudley_Line2Face
Definition: ElementType.h:30
line3indices
static const size_t line3indices[2 *2]
Definition: FinleyElements.cpp:59
dudley::ElementFile::numElements
dim_t numElements
number of elements
Definition: dudley/src/ElementFile.h:113
weipa::FinleyElements::removeGhostZones
void removeGhostZones(int ownIndex)
Removes "ghost" elements.
Definition: FinleyElements.cpp:690
weipa::CoordArray
std::vector< float * > CoordArray
Definition: weipa.h:62
weipa::pointInTet
static bool pointInTet(float x, float y, float z, const float *p0, const float *p1, const float *p2, const float *p3)
Definition: FinleyElements.cpp:1138
dudley::ElementFile
Definition: dudley/src/ElementFile.h:53
finley::Tri6Macro
@ Tri6Macro
Definition: ReferenceElements.h:114
NCFTYPE
#define NCFTYPE
Definition: FinleyElements.h:39
finley::Hex27Macro
@ Hex27Macro
Definition: ReferenceElements.h:117
finley::Rec8
@ Rec8
Definition: ReferenceElements.h:51
dudley::ElementFile::Id
index_t * Id
Definition: dudley/src/ElementFile.h:118
finley::NoRef
@ NoRef
Definition: ReferenceElements.h:118
finley::Rec4Face
@ Rec4Face
Definition: ReferenceElements.h:69
weipa::ElementData_ptr
boost::shared_ptr< ElementData > ElementData_ptr
Definition: weipa.h:67
weipa::ElementData
Stores and manipulates one type of domain elements.
Definition: ElementData.h:50
finley::ElementFile::Color
index_t * Color
Definition: finley/src/ElementFile.h:150
weipa::FinleyElements::initFromFinley
bool initFromFinley(const finley::ElementFile *finleyFile)
Initialises with data from a Finley ElementFile instance.
Definition: FinleyElements.cpp:202
weipa::FinleyElements::getReducedElements
virtual ElementData_ptr getReducedElements() const
Returns the reduced elements.
Definition: FinleyElements.h:155
weipa::FinleyElements::type
ZoneType type
Definition: FinleyElements.h:187
finley::Hex8Face_Contact
@ Hex8Face_Contact
Definition: ReferenceElements.h:109
finley::Point1
@ Point1
Definition: ReferenceElements.h:42
weipa::FinleyElements::buildReducedElements
void buildReducedElements(const FinleyElementInfo &f)
Definition: FinleyElements.cpp:573
weipa::FinleyElements::getElementFactor
virtual int getElementFactor() const
If the original element type is not supported they are subdivided into N smaller elements (e....
Definition: FinleyElements.h:163
weipa::FinleyElementInfo::reducedElementType
ZoneType reducedElementType
Definition: FinleyElements.h:56
weipa::FinleyElements::nodeMesh
FinleyNodes_ptr nodeMesh
Definition: FinleyElements.h:181
finley::ElementFile::Id
index_t * Id
Definition: finley/src/ElementFile.h:126
finley::Hex20
@ Hex20
Definition: ReferenceElements.h:59
weipa::FinleyElements::reducedElements
FinleyElements_ptr reducedElements
Definition: FinleyElements.h:180
finley::Line3Face_Contact
@ Line3Face_Contact
Definition: ReferenceElements.h:95
finley::Tri3Face
@ Tri3Face
Definition: ReferenceElements.h:65
weipa::FinleyElements::getType
virtual ZoneType getType() const
Returns the type of the elements.
Definition: FinleyElements.h:133
weipa::FinleyElements::originalMesh
FinleyNodes_ptr originalMesh
Definition: FinleyElements.h:182
finley::Tri6_Contact
@ Tri6_Contact
Definition: ReferenceElements.h:86
weipa::FinleyElements::nodes
IntVec nodes
Definition: FinleyElements.h:188
rec8indices
static const size_t rec8indices[6 *3]
Definition: FinleyElements.cpp:69
weipa::ZONETYPE_QUAD
@ ZONETYPE_QUAD
Definition: ElementData.h:32
finley::Rec4Face_Contact
@ Rec4Face_Contact
Definition: ReferenceElements.h:101
weipa::FinleyElementInfo::reducedElementSize
int reducedElementSize
Definition: FinleyElements.h:58
weipa::FinleyElementInfo::quadDim
int quadDim
Definition: FinleyElements.h:61
finley::Hex8Face
@ Hex8Face
Definition: ReferenceElements.h:77
finley::Hex8
@ Hex8
Definition: ReferenceElements.h:58
finley::Tri6
@ Tri6
Definition: ReferenceElements.h:47
finley::Tri3_Contact
@ Tri3_Contact
Definition: ReferenceElements.h:85
weipa::FinleyElements::getNodes
virtual NodeData_ptr getNodes() const
Returns the node mesh instance used by the elements.
Definition: FinleyElements.h:152
finley::Line2Face_Contact
@ Line2Face_Contact
Definition: ReferenceElements.h:94
finley::Line2
@ Line2
Definition: ReferenceElements.h:43
finley::ElementTypeId
ElementTypeId
Definition: ReferenceElements.h:41
weipa::FinleyElements::writeConnectivityVTK
virtual void writeConnectivityVTK(std::ostream &os)
Writes connectivity data to a stream in VTK text format.
Definition: FinleyElements.cpp:734
weipa::pointInTri
static bool pointInTri(float x, float y, const float *p0, const float *p1, const float *p2)
Definition: FinleyElements.cpp:1174
finley::Line3Macro
@ Line3Macro
Definition: ReferenceElements.h:113
finley::Tet4
@ Tet4
Definition: ReferenceElements.h:55
dudley::Dudley_Tet4
@ Dudley_Tet4
Definition: ElementType.h:29
weipa::FinleyElements::name
std::string name
Definition: FinleyElements.h:183
weipa::NodeData_ptr
boost::shared_ptr< NodeData > NodeData_ptr
Definition: weipa.h:69
finley::Hex20Face
@ Hex20Face
Definition: ReferenceElements.h:78
weipa::StringVec
std::vector< std::string > StringVec
Definition: weipa.h:61
weipa::inside2D
bool inside2D(float x, float y, float cx, float cy, float r)
Definition: FinleyElements.cpp:1098
weipa::ZONETYPE_TET
@ ZONETYPE_TET
Definition: ElementData.h:33
finley::ElementFile
Definition: finley/src/ElementFile.h:63
weipa::inside1D
bool inside1D(float x, float c, float r)
Definition: FinleyElements.cpp:1092
weipa::FinleyElements::owner
IntVec owner
Definition: FinleyElements.h:190
dudley::ElementFile::Color
index_t * Color
Definition: dudley/src/ElementFile.h:138
finley::const_ShapeFunction_ptr
boost::shared_ptr< const ShapeFunction > const_ShapeFunction_ptr
Definition: ShapeFunctions.h:102
weipa::ZONETYPE_POLYGON
@ ZONETYPE_POLYGON
Definition: ElementData.h:31
finley::ReferenceElementSet
Definition: ReferenceElementSets.h:27
weipa::FinleyNodes
Stores and manipulates finley mesh nodes.
Definition: FinleyNodes.h:52
weipa::FinleyElements::color
IntVec color
Definition: FinleyElements.h:189
weipa::FinleyNodes_ptr
boost::shared_ptr< FinleyNodes > FinleyNodes_ptr
Definition: FinleyNodes.h:43
weipa::FinleyElements::readFromNc
bool readFromNc(NcFile *ncfile)
Reads element data from escript/finley NetCDF file.
Definition: FinleyElements.cpp:383
finley::ElementFile::referenceElementSet
const_ReferenceElementSet_ptr referenceElementSet
the reference element to be used
Definition: finley/src/ElementFile.h:120
weipa::FinleyElements::FinleyElements
FinleyElements()
Definition: FinleyElements.h:166
weipa::FinleyElements::quadMask
QuadMaskInfo quadMask
Definition: FinleyElements.h:191
weipa::FinleyElementInfo::elementFactor
int elementFactor
Definition: FinleyElements.h:57
weipa::FinleyElements::reorderArray
void reorderArray(IntVec &v, const IntVec &idx, int elementsPerIndex)
Definition: FinleyElements.cpp:549
dudley::Dudley_Line2
@ Dudley_Line2
Definition: ElementType.h:27
weipa::IntVec
std::vector< int > IntVec
Definition: weipa.h:60
weipa::FinleyElements
Stores and manipulates one type of finley mesh elements (cells, faces or contacts).
Definition: FinleyElements.h:77
finley
A suite of factory methods for creating various finley domains.
Definition: finley/src/Assemble.h:32
dudley::Dudley_Tri3
@ Dudley_Tri3
Definition: ElementType.h:28
finley::Tri3Face_Contact
@ Tri3Face_Contact
Definition: ReferenceElements.h:97
dudley::ElementTypeId
ElementTypeId
Definition: ElementType.h:25
dudley::ElementFile::etype
ElementTypeId etype
element type ID
Definition: dudley/src/ElementFile.h:153
finley::Line2_Contact
@ Line2_Contact
Definition: ReferenceElements.h:82
weipa::ZONETYPE_BEAM
@ ZONETYPE_BEAM
Definition: ElementData.h:29
finley::Tet10Face_Contact
@ Tet10Face_Contact
Definition: ReferenceElements.h:107
dudley::ElementFile::numNodes
int numNodes
number of nodes per element
Definition: dudley/src/ElementFile.h:130
weipa::FinleyElements::getIDs
virtual const IntVec & getIDs() const
Returns a vector of element IDs.
Definition: FinleyElements.h:144
finley::Rec4
@ Rec4
Definition: ReferenceElements.h:50
finley::ElementFile::numNodes
int numNodes
number of nodes per element
Definition: finley/src/ElementFile.h:138
weipa::FinleyElements::getNodesPerElement
virtual int getNodesPerElement() const
Returns the number of nodes per element.
Definition: FinleyElements.h:127