diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp index 270433a5725e896e8ded14746dc265291edfbf13..311377ea6df090f0d537575ac2b1eba796fea326 100644 --- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp @@ -33,13 +33,12 @@ static std::vector<MeshLib::Element*> getClonedElements( namespace ProcessLib { -std::unique_ptr<BoundaryCondition> createBoundaryCondition( + +std::unique_ptr<BoundaryCondition> BoundaryConditionBuilder::createBoundaryCondition( const BoundaryConditionConfig& config, - const NumLib::LocalToGlobalIndexMap& dof_table, - const MeshLib::Mesh& mesh, - const int variable_id, - const unsigned integration_order, - std::vector<std::unique_ptr<ParameterBase>> const& parameters) + const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh, + const int variable_id, const unsigned integration_order, + const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters) { MeshGeoToolsLib::MeshNodeSearcher& mesh_node_searcher = MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher(mesh); @@ -102,4 +101,5 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition( } } + } // ProcessLib diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.h b/ProcessLib/BoundaryCondition/BoundaryCondition.h index 678225250f7c7ac6a8b52e61b8237aa313248cdd..71286bad329d1efd08b92c41e1ef1ea742210804 100644 --- a/ProcessLib/BoundaryCondition/BoundaryCondition.h +++ b/ProcessLib/BoundaryCondition/BoundaryCondition.h @@ -55,11 +55,17 @@ public: virtual ~BoundaryCondition() = default; }; -std::unique_ptr<BoundaryCondition> createBoundaryCondition( - const BoundaryConditionConfig& config, - const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh, - const int variable_id, const unsigned integration_order, - const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters); +class BoundaryConditionBuilder +{ +public: + virtual ~BoundaryConditionBuilder() {} + + virtual std::unique_ptr<BoundaryCondition> createBoundaryCondition( + const BoundaryConditionConfig& config, + const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh, + const int variable_id, const unsigned integration_order, + const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters); +}; } // ProcessLib diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index 9ec3550201849ce563af204bf89e2fd5f16597ec..a53c7d6d2f946aefbe7138630b9ba0296fe660df 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -30,7 +30,8 @@ ProcessVariable::ProcessVariable( _initial_condition(findParameter<double>( //! \ogs_file_param{prj__process_variables__process_variable__initial_condition} config.getConfigParameter<std::string>("initial_condition"), - parameters, _n_components)) + parameters, _n_components)), + _bc_builder(new BoundaryConditionBuilder()) { DBUG("Constructing process variable %s", _name.c_str()); @@ -95,7 +96,8 @@ ProcessVariable::ProcessVariable(ProcessVariable&& other) _mesh(other._mesh), _n_components(other._n_components), _initial_condition(std::move(other._initial_condition)), - _bc_configs(std::move(other._bc_configs)) + _bc_configs(std::move(other._bc_configs)), + _bc_builder(std::move(other._bc_builder)) { } @@ -139,7 +141,7 @@ ProcessVariable::createBoundaryConditions( std::vector<std::unique_ptr<BoundaryCondition>> bcs; for (auto& config : _bc_configs) - bcs.emplace_back(createBoundaryCondition( + bcs.emplace_back(_bc_builder->createBoundaryCondition( config, dof_table, _mesh, variable_id, integration_order, parameters)); return bcs; diff --git a/ProcessLib/ProcessVariable.h b/ProcessLib/ProcessVariable.h index f722056647948abf92949eba77f084b54d9c762a..db444a2fa60d43b51f1a998224fad1c7e1156a1d 100644 --- a/ProcessLib/ProcessVariable.h +++ b/ProcessLib/ProcessVariable.h @@ -22,6 +22,8 @@ template <typename T> class PropertyVector; namespace ProcessLib { +class BoundaryConditionBuilder; + /// A named process variable. Its properties includes the mesh, and the initial /// and boundary conditions. class ProcessVariable @@ -42,6 +44,11 @@ public: /// Returns the number of components of the process variable. int getNumberOfComponents() const { return _n_components; } + void setBoundaryConditionBuilder(std::unique_ptr<BoundaryConditionBuilder> bc_builder) + { + _bc_builder = std::move(bc_builder); + } + std::vector<std::unique_ptr<BoundaryCondition>> createBoundaryConditions( const NumLib::LocalToGlobalIndexMap& dof_table, const int variable_id, unsigned const integration_order, @@ -64,6 +71,7 @@ private: Parameter<double> const& _initial_condition; std::vector<BoundaryConditionConfig> _bc_configs; + std::unique_ptr<BoundaryConditionBuilder> _bc_builder; }; } // namespace ProcessLib