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 OGS_ENABLED_ELEMENTS \
63 ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_CUBOID) | \
64 (ENABLED_ELEMENT_TYPE_PYRAMID) | (ENABLED_ELEMENT_TYPE_PRISM))
67 #if OGS_ENABLED_ELEMENTS != 0
72 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0
77 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0
82 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0
87 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0
94 namespace HeatTransportBHE
101 template <
typename LocalAssemblerInterface,
102 template <
typename,
typename>
103 class LocalAssemblerDataSoil,
104 template <
typename,
typename,
typename>
105 class LocalAssemblerDataBHE,
106 typename... ConstructorArgs>
118 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
119 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
121 makeLocalAssemblerBuilder<NumLib::ShapeHex8>();
124 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \
125 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
127 makeLocalAssemblerBuilder<NumLib::ShapeHex20>();
131 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
132 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
134 makeLocalAssemblerBuilder<NumLib::ShapeTet4>();
137 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \
138 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
140 makeLocalAssemblerBuilder<NumLib::ShapeTet10>();
145 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
146 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
148 makeLocalAssemblerBuilder<NumLib::ShapePrism6>();
151 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \
152 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
154 makeLocalAssemblerBuilder<NumLib::ShapePrism15>();
159 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
160 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1
162 makeLocalAssemblerBuilder<NumLib::ShapePyra5>();
165 #if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \
166 OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
168 makeLocalAssemblerBuilder<NumLib::ShapePyra13>();
172 #if OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1
174 makeLocalAssemblerBuilderBHE<NumLib::ShapeLine2>();
177 #if OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2
179 makeLocalAssemblerBuilderBHE<NumLib::ShapeLine3>();
191 std::unordered_map<std::size_t, BHE::BHETypes*>
const&
193 ConstructorArgs&&... args)
const
195 auto const type_idx = std::type_index(
typeid(mesh_item));
196 auto const it =
_builder.find(type_idx);
201 "You are trying to build a local assembler for an unknown mesh "
202 "element type ({:s})."
203 " Maybe you have disabled this mesh element type in your build "
204 "configuration, or a mesh element order does not match shape "
205 "function order given in the project file.",
209 return it->second(mesh_item,
211 std::forward<ConstructorArgs>(args)...);
217 std::unordered_map<std::size_t, BHE::BHETypes*>
const&
219 ConstructorArgs&&...)>;
221 template <
typename ShapeFunction>
226 template <
typename ShapeFunction>
228 LocalAssemblerDataSoil<ShapeFunction, IntegrationMethod<ShapeFunction>>;
230 template <
typename ShapeFunction>
234 std::unordered_map<std::size_t, BHE::BHETypes*>
const&
240 e, std::forward<ConstructorArgs>(args)...}};
247 template <
typename ShapeFunction,
typename BHEType>
251 template <
typename ShapeFunction>
255 std::unordered_map<std::size_t, BHE::BHETypes*>
const&
258 auto& bhe = *element_to_bhe_map.at(e.
getID());
260 if (std::holds_alternative<BHE::BHE_1U>(bhe))
263 e, std::get<BHE::BHE_1U>(bhe),
264 std::forward<ConstructorArgs>(args)...}};
267 if (std::holds_alternative<BHE::BHE_CXA>(bhe))
270 e, std::get<BHE::BHE_CXA>(bhe),
271 std::forward<ConstructorArgs>(args)...}};
274 if (std::holds_alternative<BHE::BHE_CXC>(bhe))
277 e, std::get<BHE::BHE_CXC>(bhe),
278 std::forward<ConstructorArgs>(args)...}};
281 if (std::holds_alternative<BHE::BHE_2U>(bhe))
284 e, std::get<BHE::BHE_2U>(bhe),
285 std::forward<ConstructorArgs>(args)...}};
288 if (std::holds_alternative<BHE::BHE_1P>(bhe))
291 e, std::get<BHE::BHE_1P>(bhe),
292 std::forward<ConstructorArgs>(args)...}};
295 "Trying to create local assembler for an unknown BHE type.");
300 std::unordered_map<std::type_index, LADataBuilder>
_builder;
307 #undef ENABLED_ELEMENT_TYPE_SIMPLEX
308 #undef ENABLED_ELEMENT_TYPE_CUBOID
309 #undef ENABLED_ELEMENT_TYPE_PYRAMID
310 #undef ENABLED_ELEMENT_TYPE_PRISM
311 #undef OGS_ENABLED_ELEMENTS
virtual constexpr unsigned getDimension() const =0
Get dimension of the mesh element.
virtual std::size_t getID() const final
Returns the ID of the element.
LADataIntfPtr operator()(std::size_t const, MeshLib::Element const &mesh_item, std::unordered_map< std::size_t, BHE::BHETypes * > const &element_to_bhe_map, ConstructorArgs &&... args) const
LocalDataInitializer(NumLib::LocalToGlobalIndexMap const &dof_table)
typename NumLib::GaussLegendreIntegrationPolicy< typename ShapeFunction::MeshElement >::IntegrationMethod IntegrationMethod
static LADataBuilder makeLocalAssemblerBuilder()
LocalAssemblerDataSoil< ShapeFunction, IntegrationMethod< ShapeFunction > > LADataSoil
std::function< LADataIntfPtr(MeshLib::Element const &e, std::unordered_map< std::size_t, BHE::BHETypes * > const &element_to_bhe_map, ConstructorArgs &&...)> LADataBuilder
std::unique_ptr< LocalAssemblerInterface > LADataIntfPtr
static LADataBuilder makeLocalAssemblerBuilderBHE()
std::unordered_map< std::type_index, LADataBuilder > _builder
Mapping of element types to local assembler constructors.
NumLib::LocalToGlobalIndexMap const & _dof_table
LocalAssemblerDataBHE< ShapeFunction, IntegrationMethod< ShapeFunction >, BHEType > LADataBHE