From 1a592fc7fe74095b16eb12fee3e1d48fb839bfd6 Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Tue, 26 Jul 2022 09:34:24 +0200 Subject: [PATCH] [PL/BHE] Removed tpl param from local assembler factory --- .../LocalAssemblers/CreateLocalAssemblers.h | 16 ++- .../LocalAssemblers/LocalDataInitializer.h | 104 ++++++++++-------- 2 files changed, 67 insertions(+), 53 deletions(-) diff --git a/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h b/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h index 13538466077..9261bd418d2 100644 --- a/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h +++ b/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h @@ -23,14 +23,16 @@ namespace HeatTransportBHE { namespace detail { -template <template <typename, typename> class LocalAssemblerSoilImplementation, - template <typename, typename, typename> +template <template <typename /* shp fct */> + class LocalAssemblerSoilImplementation, + template <typename /* shp fct */, typename /* bhe type */> class LocalAssemblerBHEImplementation, typename LocalAssemblerInterface, typename... ExtraCtorArgs> void createLocalAssemblers( NumLib::LocalToGlobalIndexMap const& dof_table, std::vector<MeshLib::Element*> const& mesh_elements, std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers, + NumLib::IntegrationOrder const integration_order, std::unordered_map<std::size_t, BHE::BHETypes*> const& element_to_bhe_map, ExtraCtorArgs&&... extra_ctor_args) { @@ -44,7 +46,7 @@ void createLocalAssemblers( // Populate the vector of local assemblers. local_assemblers.resize(mesh_elements.size()); - LocalDataInitializer initializer(dof_table); + LocalDataInitializer initializer(dof_table, integration_order); DBUG("Calling local assembler builder for all mesh elements."); GlobalExecutor::transformDereferenced( @@ -64,21 +66,23 @@ void createLocalAssemblers( * The first two template parameters cannot be deduced from the arguments. * Therefore they always have to be provided manually. */ -template <template <typename, typename> class LocalAssemblerSoilImplementation, - template <typename, typename, typename> +template <template <typename /* shp fct */> + class LocalAssemblerSoilImplementation, + template <typename /* shp fct */, typename /* bhe type */> class LocalAssemblerBHEImplementation, typename LocalAssemblerInterface, typename... ExtraCtorArgs> void createLocalAssemblers( std::vector<MeshLib::Element*> const& mesh_elements, NumLib::LocalToGlobalIndexMap const& dof_table, std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers, + NumLib::IntegrationOrder const integration_order, ExtraCtorArgs&&... extra_ctor_args) { DBUG("Create local assemblers for the HeatTransportBHE process."); detail::createLocalAssemblers<LocalAssemblerSoilImplementation, LocalAssemblerBHEImplementation>( - dof_table, mesh_elements, local_assemblers, + dof_table, mesh_elements, local_assemblers, integration_order, std::forward<ExtraCtorArgs>(extra_ctor_args)...); } } // namespace HeatTransportBHE diff --git a/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h b/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h index 517139808cd..7160214d11a 100644 --- a/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h +++ b/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h @@ -20,6 +20,7 @@ #include "MeshLib/Elements/Elements.h" #include "NumLib/DOF/LocalToGlobalIndexMap.h" #include "NumLib/Fem/Integration/GaussLegendreIntegrationPolicy.h" +#include "NumLib/Fem/Integration/IntegrationMethodRegistry.h" #include "ProcessLib/HeatTransportBHE/BHE/BHETypes.h" #include "ProcessLib/Utils/EnabledElements.h" @@ -33,9 +34,9 @@ namespace HeatTransportBHE /// For example for MeshLib::Quad a local assembler data with template argument /// NumLib::ShapeQuad4 is created. template <typename LocalAssemblerInterface, - template <typename, typename> + template <typename /* shp fct */> class LocalAssemblerDataSoil, - template <typename, typename, typename> + template <typename /* shp fct */, typename /* bhe type */> class LocalAssemblerDataBHE, typename... ConstructorArgs> class LocalDataInitializer final @@ -54,7 +55,8 @@ public: using LADataIntfPtr = std::unique_ptr<LocalAssemblerInterface>; explicit LocalDataInitializer( - NumLib::LocalToGlobalIndexMap const& dof_table) + NumLib::LocalToGlobalIndexMap const& dof_table, + NumLib::IntegrationOrder const integration_order) : _dof_table(dof_table) { // 3D soil elements @@ -63,13 +65,13 @@ public: std::declval<IsNDElement<3>>())); BaseLib::TMP::foreach<Enabled3DElementTraits>( - [this]<typename ET>(ET*) + [this, integration_order]<typename ET>(ET*) { using MeshElement = typename ET::Element; using ShapeFunction = typename ET::ShapeFunction; _builder[std::type_index(typeid(MeshElement))] = - makeLocalAssemblerBuilder<ShapeFunction>(); + makeLocalAssemblerBuilder<ShapeFunction>(integration_order); }); // 1D BHE elements @@ -78,13 +80,14 @@ public: std::declval<IsNDElement<1>>())); BaseLib::TMP::foreach<Enabled1DElementTraits>( - [this]<typename ET>(ET*) + [this, integration_order]<typename ET>(ET*) { using MeshElement = typename ET::Element; using ShapeFunction = typename ET::ShapeFunction; _builder[std::type_index(typeid(MeshElement))] = - makeLocalAssemblerBuilderBHE<ShapeFunction>(); + makeLocalAssemblerBuilderBHE<ShapeFunction>( + integration_order); }); } @@ -127,77 +130,84 @@ private: ConstructorArgs&&...)>; template <typename ShapeFunction> - using IntegrationMethod = typename NumLib::GaussLegendreIntegrationPolicy< - typename ShapeFunction::MeshElement>::IntegrationMethod; - - // local assembler builder implementations. - template <typename ShapeFunction> - using LADataSoil = - LocalAssemblerDataSoil<ShapeFunction, IntegrationMethod<ShapeFunction>>; - - template <typename ShapeFunction> - static LADataBuilder makeLocalAssemblerBuilder() + static LADataBuilder makeLocalAssemblerBuilder( + NumLib::IntegrationOrder const integration_order) { - return [](MeshLib::Element const& e, - std::unordered_map<std::size_t, BHE::BHETypes*> const& - /* unused */, - ConstructorArgs&&... args) -> LADataIntfPtr { + return [integration_order]( + MeshLib::Element const& e, + std::unordered_map<std::size_t, BHE::BHETypes*> const& + /* unused */, + ConstructorArgs&&... args) -> LADataIntfPtr + { + auto const& integration_method = NumLib::IntegrationMethodRegistry:: + template getIntegrationMethod< + typename ShapeFunction::MeshElement>(integration_order); + if (e.getDimension() == 3) // soil elements { - return LADataIntfPtr{new LADataSoil<ShapeFunction>{ - e, std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{new LocalAssemblerDataSoil<ShapeFunction>{ + e, integration_method, + std::forward<ConstructorArgs>(args)...}}; } return nullptr; }; } - template <typename ShapeFunction, typename BHEType> - using LADataBHE = LocalAssemblerDataBHE<ShapeFunction, - IntegrationMethod<ShapeFunction>, - BHEType>; template <typename ShapeFunction> - static LADataBuilder makeLocalAssemblerBuilderBHE() + static LADataBuilder makeLocalAssemblerBuilderBHE( + NumLib::IntegrationOrder const integration_order) { - return [](MeshLib::Element const& e, - std::unordered_map<std::size_t, BHE::BHETypes*> const& - element_to_bhe_map, - ConstructorArgs&&... args) -> LADataIntfPtr { + return [integration_order]( + MeshLib::Element const& e, + std::unordered_map<std::size_t, BHE::BHETypes*> const& + element_to_bhe_map, + ConstructorArgs&&... args) -> LADataIntfPtr + { + auto const& integration_method = NumLib::IntegrationMethodRegistry:: + template getIntegrationMethod< + typename ShapeFunction::MeshElement>(integration_order); + auto& bhe = *element_to_bhe_map.at(e.getID()); if (std::holds_alternative<BHE::BHE_1U>(bhe)) { - return LADataIntfPtr{new LADataBHE<ShapeFunction, BHE::BHE_1U>{ - e, std::get<BHE::BHE_1U>(bhe), - std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{ + new LocalAssemblerDataBHE<ShapeFunction, BHE::BHE_1U>{ + e, integration_method, std::get<BHE::BHE_1U>(bhe), + std::forward<ConstructorArgs>(args)...}}; } if (std::holds_alternative<BHE::BHE_CXA>(bhe)) { - return LADataIntfPtr{new LADataBHE<ShapeFunction, BHE::BHE_CXA>{ - e, std::get<BHE::BHE_CXA>(bhe), - std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{ + new LocalAssemblerDataBHE<ShapeFunction, BHE::BHE_CXA>{ + e, integration_method, std::get<BHE::BHE_CXA>(bhe), + std::forward<ConstructorArgs>(args)...}}; } if (std::holds_alternative<BHE::BHE_CXC>(bhe)) { - return LADataIntfPtr{new LADataBHE<ShapeFunction, BHE::BHE_CXC>{ - e, std::get<BHE::BHE_CXC>(bhe), - std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{ + new LocalAssemblerDataBHE<ShapeFunction, BHE::BHE_CXC>{ + e, integration_method, std::get<BHE::BHE_CXC>(bhe), + std::forward<ConstructorArgs>(args)...}}; } if (std::holds_alternative<BHE::BHE_2U>(bhe)) { - return LADataIntfPtr{new LADataBHE<ShapeFunction, BHE::BHE_2U>{ - e, std::get<BHE::BHE_2U>(bhe), - std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{ + new LocalAssemblerDataBHE<ShapeFunction, BHE::BHE_2U>{ + e, integration_method, std::get<BHE::BHE_2U>(bhe), + std::forward<ConstructorArgs>(args)...}}; } if (std::holds_alternative<BHE::BHE_1P>(bhe)) { - return LADataIntfPtr{new LADataBHE<ShapeFunction, BHE::BHE_1P>{ - e, std::get<BHE::BHE_1P>(bhe), - std::forward<ConstructorArgs>(args)...}}; + return LADataIntfPtr{ + new LocalAssemblerDataBHE<ShapeFunction, BHE::BHE_1P>{ + e, integration_method, std::get<BHE::BHE_1P>(bhe), + std::forward<ConstructorArgs>(args)...}}; } OGS_FATAL( "Trying to create local assembler for an unknown BHE type."); -- GitLab