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" 56 typedef std::map<ElemType, const char *> FileMapType;
57 FileMapType 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;
97 SingletonCache * singleton_cache =
nullptr;
101 void 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();
155 void 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[
EDGE2] = ElemDataStrings::one_edge;
183 ref_elem_file[
EDGE3] = ElemDataStrings::one_edge3;
184 ref_elem_file[
EDGE4] = ElemDataStrings::one_edge4;
187 ref_elem_file[
TRI3] = ElemDataStrings::one_tri;
188 ref_elem_file[
TRI6] = ElemDataStrings::one_tri6;
189 ref_elem_file[
TRI7] = ElemDataStrings::one_tri7;
191 ref_elem_file[
QUAD4] = ElemDataStrings::one_quad;
192 ref_elem_file[
QUAD8] = ElemDataStrings::one_quad8;
193 ref_elem_file[
QUAD9] = ElemDataStrings::one_quad9;
196 ref_elem_file[
HEX8] = ElemDataStrings::one_hex;
197 ref_elem_file[
HEX20] = ElemDataStrings::one_hex20;
198 ref_elem_file[
HEX27] = ElemDataStrings::one_hex27;
200 ref_elem_file[
TET4] = ElemDataStrings::one_tet;
201 ref_elem_file[
TET10] = ElemDataStrings::one_tet10;
202 ref_elem_file[
TET14] = ElemDataStrings::one_tet14;
204 ref_elem_file[
PRISM6] = ElemDataStrings::one_prism;
205 ref_elem_file[
PRISM15] = ElemDataStrings::one_prism15;
206 ref_elem_file[
PRISM18] = ElemDataStrings::one_prism18;
207 ref_elem_file[
PRISM20] = ElemDataStrings::one_prism20;
208 ref_elem_file[
PRISM21] = ElemDataStrings::one_prism21;
210 ref_elem_file[
PYRAMID5] = ElemDataStrings::one_pyramid;
211 ref_elem_file[
PYRAMID13] = ElemDataStrings::one_pyramid13;
212 ref_elem_file[
PYRAMID14] = ElemDataStrings::one_pyramid14;
213 ref_elem_file[
PYRAMID18] = ElemDataStrings::one_pyramid18;
221 for (
const auto & [elem_type, filename] : ref_elem_file)
223 std::istringstream stream(filename);
224 read_ref_elem(elem_type, stream);
249 namespace ReferenceElem
268 init_ref_elem_table();
272 libmesh_error_msg_if(ref_elem_map[base_type] ==
nullptr || type_in ==
INVALID_ELEM,
273 "No reference elem data available for ElemType " << type_in
276 return *ref_elem_map[base_type];
Base class for all library singleton objects.
ElemType
Defines an enum for geometric element types.
This is the base class from which all geometric element types are derived.
The libMesh namespace provides an interface to certain functionality in the library.
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...
const dof_id_type n_nodes
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
std::string enum_to_string(const T e)
static std::unique_ptr< Node > build(const Node &n)