From efc47edf0f47400610db70ba4cf3ba4e54a4bcba Mon Sep 17 00:00:00 2001 From: Norihiro Watanabe <norihiro.watanabe@ufz.de> Date: Tue, 20 Sep 2016 09:00:06 +0200 Subject: [PATCH] [PCS/PV/BC] introduce BoundaryConditionBuilder --- .../BoundaryCondition/BoundaryCondition.cpp | 12 ++++++------ ProcessLib/BoundaryCondition/BoundaryCondition.h | 16 +++++++++++----- ProcessLib/ProcessVariable.cpp | 8 +++++--- ProcessLib/ProcessVariable.h | 8 ++++++++ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp index 270433a5725..311377ea6df 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 678225250f7..71286bad329 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 9ec35502018..a53c7d6d2f9 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 f7220566479..db444a2fa60 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 -- GitLab