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