From f4c027ce5d23b5ab334927fe3b936df38f559468 Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Wed, 17 Aug 2016 10:33:37 +0200 Subject: [PATCH] [PL] BCs are constructed with parameters --- ProcessLib/BoundaryCondition/BoundaryCondition.cpp | 5 +++-- ProcessLib/BoundaryCondition/BoundaryCondition.h | 8 ++++---- .../BoundaryCondition/BoundaryConditionCollection.cpp | 2 +- .../BoundaryCondition/BoundaryConditionCollection.h | 7 +++++++ .../GroundwaterFlow/CreateGroundwaterFlowProcess.cpp | 2 +- ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp | 3 ++- ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h | 1 + ProcessLib/Process.cpp | 4 +++- ProcessLib/Process.h | 1 + ProcessLib/ProcessVariable.cpp | 5 +++-- ProcessLib/ProcessVariable.h | 6 +++--- ProcessLib/TES/CreateTESProcess.cpp | 4 ++-- ProcessLib/TES/TESProcess.cpp | 3 ++- ProcessLib/TES/TESProcess.h | 1 + 14 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp index 7a50c929523..8232c573869 100644 --- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp +++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp @@ -38,7 +38,8 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition( const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh, const int variable_id, - const unsigned integration_order) + const unsigned integration_order, + std::vector<std::unique_ptr<ParameterBase>> const& parameters) { MeshGeoToolsLib::MeshNodeSearcher& mesh_node_searcher = MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher(mesh); @@ -66,7 +67,7 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition( config.config, getClonedElements(boundary_element_searcher, config.geometry), dof_table, variable_id, config.component_id, integration_order, - mesh.getDimension()); + mesh.getDimension(), parameters); } else if (type == "UniformRobin") { return createUniformRobinBoundaryCondition( diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.h b/ProcessLib/BoundaryCondition/BoundaryCondition.h index d13ff3e8a9c..ea15b454fee 100644 --- a/ProcessLib/BoundaryCondition/BoundaryCondition.h +++ b/ProcessLib/BoundaryCondition/BoundaryCondition.h @@ -25,6 +25,7 @@ class LocalToGlobalIndexMap; namespace ProcessLib { struct BoundaryConditionConfig; +struct ParameterBase; class BoundaryCondition { @@ -39,10 +40,9 @@ public: 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 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/BoundaryCondition/BoundaryConditionCollection.cpp b/ProcessLib/BoundaryCondition/BoundaryConditionCollection.cpp index 0b88492f4ea..df611ca5715 100644 --- a/ProcessLib/BoundaryCondition/BoundaryConditionCollection.cpp +++ b/ProcessLib/BoundaryCondition/BoundaryConditionCollection.cpp @@ -46,7 +46,7 @@ void BoundaryConditionCollection::addBCsForProcessVariables( { ProcessVariable& pv = process_variables[variable_id]; auto bcs = pv.createBoundaryConditions(dof_table, variable_id, - integration_order); + integration_order, _parameters); std::move(bcs.begin(), bcs.end(), std::back_inserter(_boundary_conditions)); diff --git a/ProcessLib/BoundaryCondition/BoundaryConditionCollection.h b/ProcessLib/BoundaryCondition/BoundaryConditionCollection.h index a8f4a3cc780..646aa2ce751 100644 --- a/ProcessLib/BoundaryCondition/BoundaryConditionCollection.h +++ b/ProcessLib/BoundaryCondition/BoundaryConditionCollection.h @@ -19,6 +19,12 @@ namespace ProcessLib class BoundaryConditionCollection final { public: + BoundaryConditionCollection( + std::vector<std::unique_ptr<ParameterBase>> const& parameters) + : _parameters(parameters) + { + } + void apply(const double t, GlobalVector const& x, GlobalMatrix& K, GlobalVector& b); @@ -38,6 +44,7 @@ public: private: std::vector<NumLib::IndexValueVector<GlobalIndexType>> _dirichlet_bcs; std::vector<std::unique_ptr<BoundaryCondition>> _boundary_conditions; + std::vector<std::unique_ptr<ParameterBase>> const& _parameters; }; diff --git a/ProcessLib/GroundwaterFlow/CreateGroundwaterFlowProcess.cpp b/ProcessLib/GroundwaterFlow/CreateGroundwaterFlowProcess.cpp index bb7919629c5..71728cf8ea6 100644 --- a/ProcessLib/GroundwaterFlow/CreateGroundwaterFlowProcess.cpp +++ b/ProcessLib/GroundwaterFlow/CreateGroundwaterFlowProcess.cpp @@ -62,7 +62,7 @@ std::unique_ptr<Process> createGroundwaterFlowProcess( ProcessOutput process_output{config.getConfigSubtree("output")}; return std::unique_ptr<Process>{new GroundwaterFlowProcess{ - mesh, nonlinear_solver, std::move(time_discretization), + parameters, mesh, nonlinear_solver, std::move(time_discretization), std::move(convergence_criterion), std::move(process_variables), std::move(process_data), std::move(secondary_variables), std::move(process_output), std::move(named_function_caller)}}; diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp index f8345c26556..46af91c86c1 100644 --- a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp +++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.cpp @@ -18,6 +18,7 @@ namespace ProcessLib namespace GroundwaterFlow { GroundwaterFlowProcess::GroundwaterFlowProcess( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, Base::NonlinearSolver& nonlinear_solver, std::unique_ptr<Base::TimeDiscretization>&& time_discretization, @@ -27,7 +28,7 @@ GroundwaterFlowProcess::GroundwaterFlowProcess( SecondaryVariableCollection&& secondary_variables, ProcessOutput&& process_output, NumLib::NamedFunctionCaller&& named_function_caller) - : Process(mesh, nonlinear_solver, std::move(time_discretization), + : Process(parameters, mesh, nonlinear_solver, std::move(time_discretization), std::move(convergence_criterion), std::move(process_variables), std::move(secondary_variables), std::move(process_output), std::move(named_function_caller)), diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h index 8856d8213c6..b0e2365c3c8 100644 --- a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h +++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h @@ -26,6 +26,7 @@ class GroundwaterFlowProcess final : public Process public: GroundwaterFlowProcess( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, Base::NonlinearSolver& nonlinear_solver, std::unique_ptr<Base::TimeDiscretization>&& time_discretization, diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 857e24c9689..8c42836da92 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -19,6 +19,7 @@ namespace ProcessLib { Process::Process( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, NonlinearSolver& nonlinear_solver, std::unique_ptr<TimeDiscretization>&& time_discretization, @@ -34,7 +35,8 @@ Process::Process( _nonlinear_solver(nonlinear_solver), _time_discretization(std::move(time_discretization)), _convergence_criterion(std::move(convergence_criterion)), - _process_variables(std::move(process_variables)) + _process_variables(std::move(process_variables)), + _boundary_conditions(parameters) { } diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index 1f04c0707da..870960a9746 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -39,6 +39,7 @@ public: using TimeDiscretization = NumLib::TimeDiscretization; Process( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, NonlinearSolver& nonlinear_solver, std::unique_ptr<TimeDiscretization>&& time_discretization, diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index 6043cf3ee13..9ec35502018 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -133,13 +133,14 @@ std::vector<std::unique_ptr<BoundaryCondition>> ProcessVariable::createBoundaryConditions( const NumLib::LocalToGlobalIndexMap& dof_table, const int variable_id, - unsigned const integration_order) + unsigned const integration_order, + std::vector<std::unique_ptr<ParameterBase>> const& parameters) { std::vector<std::unique_ptr<BoundaryCondition>> bcs; for (auto& config : _bc_configs) bcs.emplace_back(createBoundaryCondition( - config, dof_table, _mesh, variable_id, integration_order)); + config, dof_table, _mesh, variable_id, integration_order, parameters)); return bcs; } diff --git a/ProcessLib/ProcessVariable.h b/ProcessLib/ProcessVariable.h index 2a29dabc3fb..f7220566479 100644 --- a/ProcessLib/ProcessVariable.h +++ b/ProcessLib/ProcessVariable.h @@ -43,9 +43,9 @@ public: int getNumberOfComponents() const { return _n_components; } std::vector<std::unique_ptr<BoundaryCondition>> createBoundaryConditions( - const NumLib::LocalToGlobalIndexMap& dof_table, - const int variable_id, - unsigned const integration_order); + const NumLib::LocalToGlobalIndexMap& dof_table, const int variable_id, + unsigned const integration_order, + std::vector<std::unique_ptr<ParameterBase>> const& parameters); Parameter<double> const& getInitialCondition() const { diff --git a/ProcessLib/TES/CreateTESProcess.cpp b/ProcessLib/TES/CreateTESProcess.cpp index 43d7e8ccd8d..41748152207 100644 --- a/ProcessLib/TES/CreateTESProcess.cpp +++ b/ProcessLib/TES/CreateTESProcess.cpp @@ -22,7 +22,7 @@ std::unique_ptr<Process> createTESProcess( std::unique_ptr<Process::TimeDiscretization>&& time_discretization, std::unique_ptr<NumLib::ConvergenceCriterion>&& convergence_criterion, std::vector<ProcessVariable> const& variables, - std::vector<std::unique_ptr<ParameterBase>> const& /*parameters*/, + std::vector<std::unique_ptr<ParameterBase>> const& parameters, BaseLib::ConfigTree const& config) { //! \ogs_file_param{process__type} @@ -46,7 +46,7 @@ std::unique_ptr<Process> createTESProcess( ProcessOutput process_output{config.getConfigSubtree("output")}; return std::unique_ptr<Process>{new TESProcess{ - mesh, nonlinear_solver, std::move(time_discretization), + parameters, mesh, nonlinear_solver, std::move(time_discretization), std::move(convergence_criterion), std::move(process_variables), std::move(secondary_variables), std::move(process_output), std::move(named_function_caller), config}}; diff --git a/ProcessLib/TES/TESProcess.cpp b/ProcessLib/TES/TESProcess.cpp index 77493a774f4..73affd4a525 100644 --- a/ProcessLib/TES/TESProcess.cpp +++ b/ProcessLib/TES/TESProcess.cpp @@ -54,6 +54,7 @@ namespace ProcessLib namespace TES { TESProcess::TESProcess( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, Process::NonlinearSolver& nonlinear_solver, std::unique_ptr<Process::TimeDiscretization>&& time_discretization, @@ -63,7 +64,7 @@ TESProcess::TESProcess( ProcessOutput&& process_output, NumLib::NamedFunctionCaller&& named_function_caller, const BaseLib::ConfigTree& config) - : Process(mesh, nonlinear_solver, std::move(time_discretization), + : Process(parameters, mesh, nonlinear_solver, std::move(time_discretization), std::move(convergence_criterion), std::move(process_variables), std::move(secondary_variables), std::move(process_output), std::move(named_function_caller)) diff --git a/ProcessLib/TES/TESProcess.h b/ProcessLib/TES/TESProcess.h index 33a0f883b18..1546937f0b3 100644 --- a/ProcessLib/TES/TESProcess.h +++ b/ProcessLib/TES/TESProcess.h @@ -32,6 +32,7 @@ class TESProcess final : public Process { public: TESProcess( + std::vector<std::unique_ptr<ParameterBase>> const& parameters, MeshLib::Mesh& mesh, Process::NonlinearSolver& nonlinear_solver, std::unique_ptr<Process::TimeDiscretization>&& time_discretization, -- GitLab