15 #include <type_traits>
18 #include <unordered_map>
25 #ifndef OGS_MAX_ELEMENT_DIM
26 static_assert(
false,
"The macro OGS_MAX_ELEMENT_DIM is undefined.");
29 #ifndef OGS_MAX_ELEMENT_ORDER
30 static_assert(
false,
"The macro OGS_MAX_ELEMENT_ORDER is undefined.");
36 #ifdef OGS_ENABLE_ELEMENT_SIMPLEX
37 #define ENABLED_ELEMENT_TYPE_SIMPLEX 1u
39 #define ENABLED_ELEMENT_TYPE_SIMPLEX 0u
42 #ifdef OGS_ENABLE_ELEMENT_CUBOID
43 #define ENABLED_ELEMENT_TYPE_CUBOID 1u << 1
45 #define ENABLED_ELEMENT_TYPE_CUBOID 0u
48 #ifdef OGS_ENABLE_ELEMENT_PRISM
49 #define ENABLED_ELEMENT_TYPE_PRISM 1u << 2
51 #define ENABLED_ELEMENT_TYPE_PRISM 0u
54 #ifdef OGS_ENABLE_ELEMENT_PYRAMID
55 #define ENABLED_ELEMENT_TYPE_PYRAMID 1u << 3
57 #define ENABLED_ELEMENT_TYPE_PYRAMID 0u
62 #define ENABLED_ELEMENT_TYPE_TRI \
63 ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
64 (ENABLED_ELEMENT_TYPE_PRISM))
66 #define ENABLED_ELEMENT_TYPE_QUAD \
67 ((ENABLED_ELEMENT_TYPE_CUBOID) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \
68 (ENABLED_ELEMENT_TYPE_PRISM))
71 #define OGS_ENABLED_ELEMENTS \
72 ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_CUBOID) | \
73 (ENABLED_ELEMENT_TYPE_PYRAMID) | (ENABLED_ELEMENT_TYPE_PRISM))
76 #if OGS_ENABLED_ELEMENTS != 0
81 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0
86 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0
91 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0
96 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0
102 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0
107 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0
116 namespace HydroMechanics
127 template <
typename LocalAssemblerInterface,
128 template <
typename,
typename,
typename,
int>
129 class LocalAssemblerDataMatrix,
130 template <
typename,
typename,
typename,
int>
131 class LocalAssemblerDataMatrixNearFracture,
132 template <
typename,
typename,
typename,
int>
133 class LocalAssemblerDataFracture,
134 int GlobalDim,
typename... ConstructorArgs>
141 const unsigned shapefunction_order)
144 if (shapefunction_order != 2)
147 "The given shape function order {:d} is not supported.\nOnly "
148 "shape functions of order 2 are supported.",
149 shapefunction_order);
153 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \
154 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
156 makeLocalAssemblerBuilder<NumLib::ShapeQuad8>();
158 makeLocalAssemblerBuilder<NumLib::ShapeQuad9>();
161 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
162 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
164 makeLocalAssemblerBuilder<NumLib::ShapeHex20>();
169 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \
170 OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
172 makeLocalAssemblerBuilder<NumLib::ShapeTri6>();
175 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
176 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
178 makeLocalAssemblerBuilder<NumLib::ShapeTet10>();
183 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
184 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
186 makeLocalAssemblerBuilder<NumLib::ShapePrism15>();
191 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
192 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
194 makeLocalAssemblerBuilder<NumLib::ShapePyra13>();
199 #if OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2
201 makeLocalAssemblerBuilder<NumLib::ShapeLine3>();
212 ConstructorArgs&&... args)
const
214 auto const type_idx = std::type_index(
typeid(mesh_item));
215 auto const it =
_builder.find(type_idx);
220 "You are trying to build a local assembler for an unknown mesh "
221 "element type ({:s})."
222 " Maybe you have disabled this mesh element type in your build "
223 "configuration, or a mesh element order does not match shape "
224 "function order given in the project file.",
230 bool const isPressureDeactivated = (varIDs.front() != 0);
231 std::vector<int> involved_varIDs;
232 involved_varIDs.reserve(varIDs.size() + 1);
233 if (isPressureDeactivated)
235 involved_varIDs.push_back(0);
237 involved_varIDs.insert(involved_varIDs.end(), varIDs.begin(),
240 std::vector<unsigned> dofIndex_to_localIndex;
243 dofIndex_to_localIndex.resize(n_local_dof);
244 std::vector<unsigned> vec_n_element_nodes;
246 vec_n_element_nodes.push_back(
248 auto const max_varID = *std::max_element(varIDs.begin(), varIDs.end());
249 for (
int i = 1; i < max_varID + 1; i++)
251 vec_n_element_nodes.push_back(
255 unsigned local_id = 0;
257 for (
unsigned i = 0; i < involved_varIDs.size(); i++)
259 auto const var_id = involved_varIDs[i];
260 auto const n_var_comp =
262 auto const n_var_element_nodes = vec_n_element_nodes[i];
263 for (
int var_comp_id = 0; var_comp_id < n_var_comp; var_comp_id++)
267 for (
unsigned k = 0; k < n_var_element_nodes; k++)
276 dofIndex_to_localIndex[dof_id++] = local_id;
283 return it->second(mesh_item, involved_varIDs.size(), n_local_dof,
284 dofIndex_to_localIndex,
285 std::forward<ConstructorArgs>(args)...);
291 std::size_t
const n_variables,
292 std::size_t
const local_matrix_size,
293 std::vector<unsigned>
const& dofIndex_to_localIndex,
294 ConstructorArgs&&...)>;
296 template <
typename ShapeFunctionDisplacement>
300 template <
typename ShapeFunctionDisplacement,
301 typename ShapeFunctionPressure>
303 ShapeFunctionDisplacement, ShapeFunctionPressure,
306 template <
typename ShapeFunctionDisplacement,
307 typename ShapeFunctionPressure>
309 ShapeFunctionDisplacement, ShapeFunctionPressure,
312 template <
typename ShapeFunctionDisplacement,
313 typename ShapeFunctionPressure>
315 ShapeFunctionDisplacement, ShapeFunctionPressure,
321 template <
typename ShapeFunctionDisplacement>
324 return makeLocalAssemblerBuilder<ShapeFunctionDisplacement>(
325 static_cast<std::integral_constant<
326 bool, (GlobalDim
>= ShapeFunctionDisplacement::DIM)>*>(
331 std::unordered_map<std::type_index, LADataBuilder>
_builder;
342 template <
typename ShapeFunctionDisplacement>
346 using ShapeFunctionPressure =
349 std::size_t
const n_variables,
350 std::size_t
const local_matrix_size,
351 std::vector<unsigned>
const& dofIndex_to_localIndex,
352 ConstructorArgs&&... args) {
355 if (n_variables == 2)
359 ShapeFunctionPressure>{
360 e, n_variables, local_matrix_size,
361 dofIndex_to_localIndex,
362 std::forward<ConstructorArgs>(args)...}};
365 ShapeFunctionDisplacement, ShapeFunctionPressure>{
366 e, n_variables, local_matrix_size, dofIndex_to_localIndex,
367 std::forward<ConstructorArgs>(args)...}};
370 ShapeFunctionPressure>{
371 e, local_matrix_size, dofIndex_to_localIndex,
372 std::forward<ConstructorArgs>(args)...}};
378 template <
typename ShapeFunctionDisplacement>
389 #undef ENABLED_ELEMENT_TYPE_SIMPLEX
390 #undef ENABLED_ELEMENT_TYPE_CUBOID
391 #undef ENABLED_ELEMENT_TYPE_PYRAMID
392 #undef ENABLED_ELEMENT_TYPE_PRISM
393 #undef ENABLED_ELEMENT_TYPE_TRI
394 #undef ENABLED_ELEMENT_TYPE_QUAD
395 #undef OGS_ENABLED_ELEMENTS
virtual unsigned getNumberOfNodes() const =0
virtual unsigned getNumberOfBaseNodes() 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::vector< int > getElementVariableIDs(std::size_t const mesh_item_id) const
static NUMLIB_EXPORT GlobalIndexType const nop
NumLib::LocalToGlobalIndexMap const & _dof_table
typename NumLib::GaussLegendreIntegrationPolicy< typename ShapeFunctionDisplacement::MeshElement >::IntegrationMethod IntegrationMethod
LocalAssemblerDataFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod< ShapeFunctionDisplacement >, GlobalDim > LAFractureData
std::function< LADataIntfPtr(MeshLib::Element const &e, std::size_t const n_variables, std::size_t const local_matrix_size, std::vector< unsigned > const &dofIndex_to_localIndex, ConstructorArgs &&...)> LADataBuilder
LADataIntfPtr operator()(std::size_t const id, MeshLib::Element const &mesh_item, ConstructorArgs &&... args) const
LocalDataInitializer(NumLib::LocalToGlobalIndexMap const &dof_table, const unsigned shapefunction_order)
static LADataBuilder makeLocalAssemblerBuilder(std::false_type *)
static LADataBuilder makeLocalAssemblerBuilder()
static LADataBuilder makeLocalAssemblerBuilder(std::true_type *)
LocalAssemblerDataMatrixNearFracture< ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod< ShapeFunctionDisplacement >, GlobalDim > LADataMatrixNearFracture
LocalAssemblerDataMatrix< ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod< ShapeFunctionDisplacement >, GlobalDim > LADataMatrix
std::unique_ptr< LocalAssemblerInterface > LADataIntfPtr
std::unordered_map< std::type_index, LADataBuilder > _builder
Mapping of element types to local assembler constructors.
std::size_t getNodeIndex(Element const &element, unsigned const idx)