18#ifndef LIBMESH_FE_REFERENCE_ELEMENT_TRAITS_H
19#define LIBMESH_FE_REFERENCE_ELEMENT_TRAITS_H
21#include "libmesh/libmesh.h"
53template <
unsigned int Rows,
unsigned int Cols>
72template <
class FirstOrder,
unsigned int Edges>
73constexpr NodeMapTable<Edges, 3>
77 for (
unsigned int e = 0; e != Edges; ++e)
79 t.
values[e][0] = FirstOrder::edge_nodes_map[e][0];
80 t.values[e][1] = FirstOrder::edge_nodes_map[e][1];
81 t.values[e][2] = FirstOrder::num_nodes + e;
91template <
class FirstOrder>
95 for (
unsigned int k = 0; k != FirstOrder::nodes_per_side; ++k)
105template <
unsigned int Edges>
107 const unsigned int a,
108 const unsigned int b)
110 for (
unsigned int e = 0; e != Edges; ++e)
111 if ((edges[e][0] == a && edges[e][1] ==
b) ||
112 (edges[e][0] ==
b && edges[e][1] == a))
124template <
class FirstOrder,
unsigned int Sides,
unsigned int Cols,
125 unsigned int Edges,
class FaceNode>
126constexpr NodeMapTable<Sides, Cols>
131 for (
unsigned int s = 0; s != Sides; ++s)
133 const unsigned int nv = n_side_vertices<FirstOrder>(s);
135 for (
unsigned int k = 0; k != nv; ++k)
136 t.values[s][n++] = FirstOrder::side_nodes_map[s][k];
137 for (
unsigned int k = 0; k != nv; ++k)
139 FirstOrder::side_nodes_map[s][k],
140 FirstOrder::side_nodes_map[s][(k+1) % nv]);
142 t.values[s][n++] = face_node(s);
143 for (; n != Cols; ++n)
154template <
class FirstOrder,
unsigned int S
ides>
155constexpr NodeMapTable<Sides, 3>
159 for (
unsigned int s = 0; s != Sides; ++s)
161 t.
values[s][0] = FirstOrder::side_nodes_map[s][0];
162 t.values[s][1] = FirstOrder::side_nodes_map[s][1];
163 t.values[s][2] = FirstOrder::num_nodes + s;
The libMesh namespace provides an interface to certain functionality in the library.
constexpr unsigned int n_side_vertices(const unsigned int s)
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
static constexpr unsigned int unused_side_node
The second-order elements' node maps are not independent facts.
constexpr unsigned int no_face_node(const unsigned int)
The face-node rule for elements with no face nodes.
constexpr unsigned int mid_edge_node(const unsigned int(&edges)[Edges][3], const unsigned int a, const unsigned int b)
constexpr NodeMapTable< Edges, 3 > derived_edge_nodes()
constexpr NodeMapTable< Sides, 3 > derived_side_nodes()
A fixed-size table that constexpr functions can return.
unsigned int values[Rows][Cols]