21#include "libmesh/node.h"
22#include "libmesh/elem.h"
23#include "libmesh/reference_elem.h"
24#include "libmesh/libmesh_singleton.h"
25#include "libmesh/threads.h"
26#include "libmesh/enum_to_string.h"
27#include "libmesh/enum_elem_type.h"
45#pragma GCC diagnostic ignored "-Woverlength-strings"
46#include "reference_elem.data"
47#pragma GCC diagnostic warning "-Woverlength-strings"
56typedef std::map<ElemType, const char *> FileMapType;
57FileMapType ref_elem_file;
65 virtual ~SingletonCache() =
default;
67 std::vector<std::unique_ptr<Node>> node_list;
68 std::vector<std::unique_ptr<Elem>> elem_list;
97SingletonCache * singleton_cache =
nullptr;
101void read_ref_elem (
const ElemType type_in,
111 in >>
n_elem; std::getline (in, dummy); libmesh_assert_equal_to (n_elem, 1);
112 in >>
n_nodes; std::getline (in, dummy);
113 in >> dummy; std::getline (in, dummy);
114 in >> dummy; std::getline (in, dummy);
115 in >> dummy; std::getline (in, dummy);
116 in >> dummy; std::getline (in, dummy);
117 in >>
n_elem; std::getline (in, dummy); libmesh_assert_equal_to (n_elem, 1);
119 in >> elem_type_read;
122 libmesh_assert_equal_to (elem_type_read,
static_cast<unsigned int>(type_in));
126 auto & uelem = singleton_cache->elem_list.emplace_back(
Elem::build(type_in));
129 for (
unsigned int n=0; n<
n_nodes; n++)
132 libmesh_assert_equal_to (n,nn);
135 for (
unsigned int n=0; n<
n_nodes; n++)
140 singleton_cache->node_list.emplace_back(
Node::build(x,y,z,n));
142 uelem->set_node(n, new_node.get());
147 libmesh_error_msg_if(!in,
"ERROR while creating element singleton!");
150 ref_elem_map[type_in] = uelem.get();
155void init_ref_elem_table()
158 if (singleton_cache !=
nullptr)
163 InitMutex::scoped_lock lock(init_mtx);
167 if (singleton_cache !=
nullptr)
175 singleton_cache =
new SingletonCache;
179 ref_elem_file.clear();
182 ref_elem_file[
NODEELEM] = ElemDataStrings::one_nodeelem;
185 ref_elem_file[
EDGE2] = ElemDataStrings::one_edge;
186 ref_elem_file[
EDGE3] = ElemDataStrings::one_edge3;
187 ref_elem_file[
EDGE4] = ElemDataStrings::one_edge4;
190 ref_elem_file[
TRI3] = ElemDataStrings::one_tri;
191 ref_elem_file[
TRI6] = ElemDataStrings::one_tri6;
192 ref_elem_file[
TRI7] = ElemDataStrings::one_tri7;
194 ref_elem_file[
QUAD4] = ElemDataStrings::one_quad;
195 ref_elem_file[
QUAD8] = ElemDataStrings::one_quad8;
196 ref_elem_file[
QUAD9] = ElemDataStrings::one_quad9;
199 ref_elem_file[
HEX8] = ElemDataStrings::one_hex;
200 ref_elem_file[
HEX20] = ElemDataStrings::one_hex20;
201 ref_elem_file[
HEX27] = ElemDataStrings::one_hex27;
203 ref_elem_file[
TET4] = ElemDataStrings::one_tet;
204 ref_elem_file[
TET10] = ElemDataStrings::one_tet10;
205 ref_elem_file[
TET14] = ElemDataStrings::one_tet14;
207 ref_elem_file[
PRISM6] = ElemDataStrings::one_prism;
208 ref_elem_file[
PRISM15] = ElemDataStrings::one_prism15;
209 ref_elem_file[
PRISM18] = ElemDataStrings::one_prism18;
210 ref_elem_file[
PRISM20] = ElemDataStrings::one_prism20;
211 ref_elem_file[
PRISM21] = ElemDataStrings::one_prism21;
213 ref_elem_file[
PYRAMID5] = ElemDataStrings::one_pyramid;
214 ref_elem_file[
PYRAMID13] = ElemDataStrings::one_pyramid13;
215 ref_elem_file[
PYRAMID14] = ElemDataStrings::one_pyramid14;
216 ref_elem_file[
PYRAMID18] = ElemDataStrings::one_pyramid18;
224 for (
const auto & [elem_type, filename] : ref_elem_file)
226 std::istringstream stream(filename);
227 read_ref_elem(elem_type, stream);
252namespace ReferenceElem
271 init_ref_elem_table();
275 libmesh_error_msg_if(ref_elem_map[base_type] ==
nullptr || type_in ==
INVALID_ELEM,
276 "No reference elem data available for ElemType " << type_in
279 return *ref_elem_map[base_type];
This is the base class from which all geometric element types are derived.
static const unsigned int type_to_n_nodes_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the number of nodes in the element...
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
static std::unique_ptr< Node > build(const Node &n)
Base class for all library singleton objects.
const Elem & get(const ElemType type_in)
std::string enum_to_string(const T e)
The libMesh namespace provides an interface to certain functionality in the library.
ElemType
Defines an enum for geometric element types.
const dof_id_type n_nodes