diff --git a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp index 0766abc63371ebf994dce48e57230b3fb96f9d18..4a665b0526ba67ae29d57082530d9ba170882226 100644 --- a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp @@ -123,11 +123,27 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition( } if (type == "NormalTraction") { - return ProcessLib::NormalTractionBoundaryCondition:: - createNormalTractionBoundaryCondition( - config.config, config.boundary_mesh, dof_table, variable_id, - integration_order, shapefunction_order, - bulk_mesh.getDimension(), parameters); + switch (bulk_mesh.getDimension()) + { + case 2: + return ProcessLib::NormalTractionBoundaryCondition:: + createNormalTractionBoundaryCondition<2>( + config.config, config.boundary_mesh, dof_table, + variable_id, integration_order, shapefunction_order, + parameters); + case 3: + return ProcessLib::NormalTractionBoundaryCondition:: + createNormalTractionBoundaryCondition<3>( + config.config, config.boundary_mesh, dof_table, + variable_id, integration_order, shapefunction_order, + parameters); + default: + OGS_FATAL( + "NormalTractionBoundaryCondition can not be instantiated " + "for mesh dimensions other than two or three. " + "{}-dimensional mesh was given.", + bulk_mesh.getDimension()); + } } if (type == "PhaseFieldIrreversibleDamageOracleBoundaryCondition") { diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h index b9e114b60a9a017137905078cd9f8a5d31aa17f7..bbb047ecf80a2050489f795d29de2e755481b1fb 100644 --- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h +++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h @@ -22,14 +22,13 @@ namespace ProcessLib { namespace NormalTractionBoundaryCondition { -template <template <typename, typename, unsigned> - class LocalAssemblerImplementation> -NormalTractionBoundaryCondition<LocalAssemblerImplementation>:: +template <int GlobalDim, template <typename, typename, unsigned> + class LocalAssemblerImplementation> +NormalTractionBoundaryCondition<GlobalDim, LocalAssemblerImplementation>:: NormalTractionBoundaryCondition( unsigned const integration_order, unsigned const shapefunction_order, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, - int const variable_id, unsigned const global_dim, - MeshLib::Mesh const& bc_mesh, + int const variable_id, MeshLib::Mesh const& bc_mesh, ParameterLib::Parameter<double> const& pressure) : _bc_mesh(bc_mesh), _integration_order(integration_order), @@ -53,15 +52,15 @@ NormalTractionBoundaryCondition<LocalAssemblerImplementation>:: _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap( variable_id, component_ids, std::move(bc_mesh_subset))); - createLocalAssemblers<LocalAssemblerImplementation>( - global_dim, _bc_mesh.getElements(), *_dof_table_boundary, - shapefunction_order, _local_assemblers, _bc_mesh.isAxiallySymmetric(), - _integration_order, _pressure); + createLocalAssemblers<GlobalDim, LocalAssemblerImplementation>( + *_dof_table_boundary, shapefunction_order, _bc_mesh.getElements(), + _local_assemblers, _bc_mesh.isAxiallySymmetric(), _integration_order, + _pressure); } -template <template <typename, typename, unsigned> - class LocalAssemblerImplementation> -void NormalTractionBoundaryCondition<LocalAssemblerImplementation>:: +template <int GlobalDim, template <typename, typename, unsigned> + class LocalAssemblerImplementation> +void NormalTractionBoundaryCondition<GlobalDim, LocalAssemblerImplementation>:: applyNaturalBC(const double t, std::vector<GlobalVector*> const& x, int const /*process_id*/, GlobalMatrix& K, GlobalVector& b, GlobalMatrix* Jac) @@ -71,13 +70,13 @@ void NormalTractionBoundaryCondition<LocalAssemblerImplementation>:: _local_assemblers, *_dof_table_boundary, t, x, K, b, Jac); } +template <int GlobalDim> std::unique_ptr<NormalTractionBoundaryCondition< - NormalTractionBoundaryConditionLocalAssembler>> + GlobalDim, NormalTractionBoundaryConditionLocalAssembler>> createNormalTractionBoundaryCondition( BaseLib::ConfigTree const& config, MeshLib::Mesh const& bc_mesh, NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id, unsigned const integration_order, unsigned const shapefunction_order, - unsigned const global_dim, std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters) { DBUG("Constructing NormalTractionBoundaryCondition from config."); @@ -92,9 +91,9 @@ createNormalTractionBoundaryCondition( auto const& pressure = ParameterLib::findParameter<double>( parameter_name, parameters, 1, &bc_mesh); return std::make_unique<NormalTractionBoundaryCondition< - NormalTractionBoundaryConditionLocalAssembler>>( - integration_order, shapefunction_order, dof_table, variable_id, - global_dim, bc_mesh, pressure); + GlobalDim, NormalTractionBoundaryConditionLocalAssembler>>( + integration_order, shapefunction_order, dof_table, variable_id, bc_mesh, + pressure); } } // namespace NormalTractionBoundaryCondition diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h index 346f579add809dd88cfe959afd86d8bc48934bbd..423ab2c6ff939f4c1cb13de39d19b551be34deb4 100644 --- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h +++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h @@ -27,8 +27,8 @@ class NormalTractionBoundaryConditionLocalAssemblerInterface; /// \bar{t} := \sigma \mathbf{n} = p \mathbf{n}, /// \f] /// where \f$p\f$ is the value on the boundary given by the parameter tag. -template <template <typename, typename, unsigned> - class LocalAssemblerImplementation> +template <int GlobalDim, template <typename, typename, unsigned> + class LocalAssemblerImplementation> class NormalTractionBoundaryCondition final : public BoundaryCondition { public: @@ -38,8 +38,7 @@ public: NormalTractionBoundaryCondition( unsigned const integration_order, unsigned const shapefunction_order, NumLib::LocalToGlobalIndexMap const& dof_table_bulk, - int const variable_id, unsigned const global_dim, - MeshLib::Mesh const& bc_mesh, + int const variable_id, MeshLib::Mesh const& bc_mesh, ParameterLib::Parameter<double> const& pressure); /// Calls local assemblers which calculate their contributions to the global @@ -72,13 +71,13 @@ private: ParameterLib::Parameter<double> const& _pressure; }; +template <int GlobalDim> std::unique_ptr<NormalTractionBoundaryCondition< - NormalTractionBoundaryConditionLocalAssembler>> + GlobalDim, NormalTractionBoundaryConditionLocalAssembler>> createNormalTractionBoundaryCondition( BaseLib::ConfigTree const& config, MeshLib::Mesh const& bc_mesh, NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id, unsigned const integration_order, unsigned const shapefunction_order, - unsigned const global_dim, std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters);