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[
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);
252 namespace 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];
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)