15 #include <type_traits>
18 #include <unordered_map>
24 #ifndef OGS_MAX_ELEMENT_DIM
25 static_assert(
false,
"The macro OGS_MAX_ELEMENT_DIM is undefined.");
28 #ifndef OGS_MAX_ELEMENT_ORDER
29 static_assert(
false,
"The macro OGS_MAX_ELEMENT_ORDER is undefined.");
35 #ifdef OGS_ENABLE_ELEMENT_SIMPLEX
36 #define ENABLED_ELEMENT_TYPE_SIMPLEX 1u
38 #define ENABLED_ELEMENT_TYPE_SIMPLEX 0u
41 #ifdef OGS_ENABLE_ELEMENT_CUBOID
42 #define ENABLED_ELEMENT_TYPE_CUBOID 1u << 1
44 #define ENABLED_ELEMENT_TYPE_CUBOID 0u
47 #ifdef OGS_ENABLE_ELEMENT_PRISM
48 #define ENABLED_ELEMENT_TYPE_PRISM 1u << 2
50 #define ENABLED_ELEMENT_TYPE_PRISM 0u
53 #ifdef OGS_ENABLE_ELEMENT_PYRAMID
54 #define ENABLED_ELEMENT_TYPE_PYRAMID 1u << 3
56 #define ENABLED_ELEMENT_TYPE_PYRAMID 0u
61 #define ENABLED_ELEMENT_TYPE_TRI \
62 ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
63 (ENABLED_ELEMENT_TYPE_PRISM))
65 #define ENABLED_ELEMENT_TYPE_QUAD \
66 ((ENABLED_ELEMENT_TYPE_CUBOID) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
67 (ENABLED_ELEMENT_TYPE_PRISM))
70 #define OGS_ENABLED_ELEMENTS \
71 ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_CUBOID) | \
72 (ENABLED_ELEMENT_TYPE_PYRAMID) | (ENABLED_ELEMENT_TYPE_PRISM))
75 #if OGS_ENABLED_ELEMENTS != 0
80 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0
85 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0
90 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0
95 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0
101 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0
106 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0
115 namespace SmallDeformation
122 template <
typename LocalAssemblerInterface,
123 template <
typename,
typename,
int>
class LocalAssemblerDataMatrix,
124 template <
typename,
typename,
int>
125 class LocalAssemblerDataMatrixNearFracture,
126 template <
typename,
typename,
int>
class LocalAssemblerDataFracture,
127 int GlobalDim,
typename... ConstructorArgs>
142 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \
143 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
145 makeLocalAssemblerBuilder<NumLib::ShapeQuad4>();
148 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
149 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
151 makeLocalAssemblerBuilder<NumLib::ShapeHex8>();
154 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \
155 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
157 makeLocalAssemblerBuilder<NumLib::ShapeQuad8>();
159 makeLocalAssemblerBuilder<NumLib::ShapeQuad9>();
162 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
163 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
165 makeLocalAssemblerBuilder<NumLib::ShapeHex20>();
170 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \
171 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
173 makeLocalAssemblerBuilder<NumLib::ShapeTri3>();
176 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
177 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
179 makeLocalAssemblerBuilder<NumLib::ShapeTet4>();
182 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \
183 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
185 makeLocalAssemblerBuilder<NumLib::ShapeTri6>();
188 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
189 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
191 makeLocalAssemblerBuilder<NumLib::ShapeTet10>();
196 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
197 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
199 makeLocalAssemblerBuilder<NumLib::ShapePrism6>();
202 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
203 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
205 makeLocalAssemblerBuilder<NumLib::ShapePrism15>();
210 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
211 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
213 makeLocalAssemblerBuilder<NumLib::ShapePyra5>();
216 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
217 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
219 makeLocalAssemblerBuilder<NumLib::ShapePyra13>();
223 #if OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
225 makeLocalAssemblerBuilder<NumLib::ShapeLine2>();
228 #if OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
230 makeLocalAssemblerBuilder<NumLib::ShapeLine3>();
241 ConstructorArgs&&... args)
const
243 auto const type_idx = std::type_index(
typeid(mesh_item));
244 auto const it =
_builder.find(type_idx);
249 "You are trying to build a local assembler for an unknown mesh "
250 "element type ({:s})."
251 " Maybe you have disabled this mesh element type in your build "
252 "configuration, or a mesh element order does not match shape "
253 "function order given in the project file.",
258 auto const n_global_components =
262 std::vector<unsigned> dofIndex_to_localIndex;
264 n_global_components > GlobalDim)
266 dofIndex_to_localIndex.resize(n_local_dof);
268 unsigned local_id = 0;
269 for (
auto i : varIDs)
284 dofIndex_to_localIndex[dof_id++] = local_id;
292 return it->second(mesh_item, varIDs.size(), n_local_dof,
293 dofIndex_to_localIndex,
294 std::forward<ConstructorArgs>(args)...);
300 std::size_t
const n_variables,
301 std::size_t
const local_matrix_size,
302 std::vector<unsigned>
const& dofIndex_to_localIndex,
303 ConstructorArgs&&...)>;
305 template <
typename ShapeFunction>
309 template <
typename ShapeFunction>
311 LocalAssemblerDataMatrix<ShapeFunction,
317 template <
typename ShapeFunction>
320 return makeLocalAssemblerBuilder<ShapeFunction>(
321 static_cast<std::integral_constant<
322 bool, (GlobalDim
>= ShapeFunction::DIM)>*>(
nullptr));
326 std::unordered_map<std::type_index, LADataBuilder>
_builder;
330 template <
typename ShapeFunction>
334 template <
typename ShapeFunction>
336 LocalAssemblerDataFracture<ShapeFunction,
346 template <
typename ShapeFunction>
350 std::size_t
const n_variables,
351 std::size_t
const local_matrix_size,
352 std::vector<unsigned>
const& dofIndex_to_localIndex,
353 ConstructorArgs&&... args) {
356 if (dofIndex_to_localIndex.empty())
359 e, local_matrix_size,
360 std::forward<ConstructorArgs>(args)...}};
365 e, n_variables, local_matrix_size,
366 dofIndex_to_localIndex,
367 std::forward<ConstructorArgs>(args)...}};
370 e, n_variables, local_matrix_size, dofIndex_to_localIndex,
371 std::forward<ConstructorArgs>(args)...}};
377 template <
typename ShapeFunction>
388 #undef ENABLED_ELEMENT_TYPE_SIMPLEX
389 #undef ENABLED_ELEMENT_TYPE_CUBOID
390 #undef ENABLED_ELEMENT_TYPE_PYRAMID
391 #undef ENABLED_ELEMENT_TYPE_PRISM
392 #undef ENABLED_ELEMENT_TYPE_TRI
393 #undef ENABLED_ELEMENT_TYPE_QUAD
394 #undef OGS_ENABLED_ELEMENTS
virtual unsigned getNumberOfNodes() const =0
virtual constexpr unsigned getDimension() const =0
Get dimension of the mesh element.
std::size_t getMeshID() const
return this mesh ID
std::size_t getNumberOfElementDOF(std::size_t const mesh_item_id) const
GlobalIndexType getGlobalIndex(MeshLib::Location const &l, int const variable_id, int const component_id) const
int getNumberOfVariableComponents(int variable_id) const
MeshLib::MeshSubset const & getMeshSubset(int const variable_id, int const component_id) const
std::size_t getNumberOfElementComponents(std::size_t const mesh_item_id) const
std::vector< int > getElementVariableIDs(std::size_t const mesh_item_id) const
static NUMLIB_EXPORT GlobalIndexType const nop
std::size_t getNodeIndex(Element const &element, unsigned const idx)