33template <
class ELEMENT_RULE>
38 static const unsigned n_all_nodes = ELEMENT_RULE::n_all_nodes;
44 static const unsigned dimension = ELEMENT_RULE::dimension;
54 std::size_t
id = std::numeric_limits<std::size_t>::max());
63 std::array<Node*, n_all_nodes>
const&
nodes,
64 std::size_t
id = std::numeric_limits<std::size_t>::max());
81 return ELEMENT_RULE::EdgeReturn::getEdge(
this, i);
87 return ELEMENT_RULE::getFace(
this, i);
93 if constexpr (std::is_convertible<ELEMENT_RULE, FaceRule>::value)
95 return ELEMENT_RULE::EdgeReturn::getEdge(
this, i);
97 if constexpr (std::is_convertible<ELEMENT_RULE, CellRule>::value)
99 return ELEMENT_RULE::getFace(
this, i);
101 OGS_FATAL(
"TemplateElement::getBoundary for boundary {:d} failed.", i);
107 if constexpr (std::is_convertible<ELEMENT_RULE, FaceRule>::value)
109 return ELEMENT_RULE::n_edges;
113 return ELEMENT_RULE::n_faces;
124 return ELEMENT_RULE::n_neighbors;
130 if (i < ELEMENT_RULE::n_neighbors)
136 ERR(
"Error in MeshLib::TemplateElement::getNeighbor() - Index {:d} "
150 return ELEMENT_RULE::mesh_elem_type;
156 bool isEdge(
unsigned idx1,
unsigned idx2)
const override;
166 double eps = std::numeric_limits<double>::epsilon())
const override
168 return ELEMENT_RULE::isPntInElement(
_nodes.data(), pnt, eps);
176 return ELEMENT_RULE::validate(
this);
182 return ELEMENT_RULE::identifyFace(
_nodes.data(),
nodes);
188 return ELEMENT_RULE::computeVolume(
_nodes.data());
201 return const_cast<Node*
>(
202 _nodes[ELEMENT_RULE::edge_nodes[edge_id][node_id]]);
214 return ELEMENT_RULE::testElementNodeOrder(*
this);
224#include "TemplateElement-impl.h"
Definition of ElementErrorCodes.
Definition of the Element class.
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition of the Node class.
Definition of the Point3d class.
Collects error flags for mesh elements.
const double * data() const
constexpr std::span< Node *const > nodes() const
Span of element's nodes, their pointers actually.
double computeVolume() override
Calculates the volume of a convex hexahedron by partitioning it into six tetrahedra.
const Element * getBoundary(unsigned i) const override
Returns the boundary i of the element.
std::array< Node *, n_all_nodes > _nodes
const Element * getEdge(unsigned i) const override
Returns the edge i of the element.
Element * clone() const override
Returns a copy of this object.
unsigned getNumberOfBoundaries() const override
Returns the number of boundaries of the element.
unsigned getNumberOfNodes() const override
Get the number of all nodes for this element.
bool isEdge(unsigned idx1, unsigned idx2) const override
Returns true if these two indices form an edge and false otherwise.
MeshElemType getGeomType() const override
Get the type of this element.
unsigned getNumberOfNeighbors() const override
Get the number of neighbors for this element.
static const unsigned n_all_nodes
Constant: The number of all nodes for this element.
void setNode(unsigned idx, Node *node) override
const Element * getFace(unsigned i) const override
Returns the face i of the element.
ElementErrorCode validate() const override
static const unsigned n_base_nodes
Constant: The number of base nodes for this element.
bool testElementNodeOrder() const override
unsigned getNumberOfFaces() const override
Get the number of faces for this element.
TemplateElement(Node *nodes[n_all_nodes], std::size_t id=std::numeric_limits< std::size_t >::max())
unsigned identifyFace(Node const *nodes[3]) const override
Returns the ID of a face given an array of nodes.
double getContent() const override final
Returns the length, area or volume of a 1D, 2D or 3D element.
const Element * getNeighbor(unsigned i) const override
Get the specified neighbor.
static const unsigned dimension
Constant: The dimension of this element.
CellType getCellType() const override
Get the FEM type of this element.
bool isPntInElement(MathLib::Point3d const &pnt, double eps=std::numeric_limits< double >::epsilon()) const override
unsigned getNumberOfEdges() const override
Get the number of edges for this element.
Node *const * getNodes() const override
Get array of element nodes.
Node * getEdgeNode(unsigned edge_id, unsigned node_id) const override
Return a specific edge node.
constexpr unsigned getDimension() const override
Get dimension of the mesh element.
const Node * getNode(unsigned idx) const override
unsigned getNumberOfBaseNodes() const override
Get the number of linear nodes for this element.
Element * clone(Node **nodes, std::size_t id) const override
CellType
Types of mesh elements supported by OpenGeoSys.
MeshElemType
Types of mesh elements supported by OpenGeoSys. Values are from VTKCellType enum.