From 15fd633f8d8fa28541ab52bbde0cf2f807f74368 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Wed, 17 Aug 2016 10:36:01 +0200
Subject: [PATCH] [PL] Neumann BC uses Parameter

---
 .../UniformNeumannBoundaryCondition.cpp       | 14 ++++++++-----
 .../UniformNeumannBoundaryCondition.h         |  6 ++++--
 ...rmNeumannBoundaryConditionLocalAssembler.h | 20 ++++++++++++-------
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp
index 7217de49932..7d85001af52 100644
--- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.cpp
@@ -8,6 +8,7 @@
  */
 
 #include "UniformNeumannBoundaryCondition.h"
+#include "ProcessLib/Utils/ProcessUtils.h"
 
 namespace ProcessLib
 {
@@ -17,20 +18,23 @@ createUniformNeumannBoundaryCondition(
     std::vector<MeshLib::Element*>&& elements,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     int const component_id, unsigned const integration_order,
-    unsigned const global_dim)
+    unsigned const global_dim,
+    std::vector<std::unique_ptr<ParameterBase>> const& parameters)
 {
     DBUG("Constructing NeumannBcConfig from config.");
     //! \ogs_file_param{boundary_condition__type}
     config.checkConfigParameter("type", "UniformNeumann");
 
-    //! \ogs_file_param{boundary_condition__UniformNeumann__value}
-    double const value = config.getConfigParameter<double>("value");
-    DBUG("Using value %g", value);
+    //! \ogs_file_param{boundary_condition__UniformNeumann__parameter}
+    auto const param_name = config.getConfigParameter<std::string>("parameter");
+    DBUG("Using parameter %g", param_name);
+
+    auto& param = findParameter<double>(param_name, parameters, 1);
 
     return std::unique_ptr<UniformNeumannBoundaryCondition>(
         new UniformNeumannBoundaryCondition(
             integration_order, dof_table, variable_id, component_id,
-            global_dim, std::move(elements), value));
+            global_dim, std::move(elements), param));
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h
index 1504b0768d5..312d438b9f6 100644
--- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryCondition.h
@@ -10,13 +10,14 @@
 #ifndef PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITION_H
 #define PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITION_H
 
+#include "ProcessLib/Parameter/Parameter.h"
 #include "GenericNaturalBoundaryCondition.h"
 #include "UniformNeumannBoundaryConditionLocalAssembler.h"
 
 namespace ProcessLib
 {
 using UniformNeumannBoundaryCondition = GenericNaturalBoundaryCondition<
-    double, UniformNeumannBoundaryConditionLocalAssembler>;
+    Parameter<double> const&, UniformNeumannBoundaryConditionLocalAssembler>;
 
 std::unique_ptr<UniformNeumannBoundaryCondition>
 createUniformNeumannBoundaryCondition(
@@ -24,7 +25,8 @@ createUniformNeumannBoundaryCondition(
     std::vector<MeshLib::Element*>&& elements,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     int const component_id, unsigned const integration_order,
-    unsigned const global_dim);
+    unsigned const global_dim,
+    std::vector<std::unique_ptr<ParameterBase>> const& parameters);
 
 }  // ProcessLib
 
diff --git a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h
index 2256c5d4485..7b254d78ad3 100644
--- a/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/UniformNeumannBoundaryConditionLocalAssembler.h
@@ -11,6 +11,8 @@
 #define PROCESSLIB_UNIFORMNEUMANNBOUNDARYCONDITIONLOCALASSEMBLER_H
 
 #include "NumLib/DOF/DOFTableUtil.h"
+#include "ProcessLib/Parameter/Parameter.h"
+#include "GenericNaturalBoundaryConditionLocalAssembler.h"
 
 namespace ProcessLib
 {
@@ -30,7 +32,7 @@ public:
         MeshLib::Element const& e,
         std::size_t const local_matrix_size,
         unsigned const integration_order,
-        double neumann_bc_value)
+        Parameter<double> const& neumann_bc_value)
         : Base(e, integration_order),
           _neumann_bc_value(neumann_bc_value),
           _local_rhs(local_matrix_size)
@@ -42,19 +44,23 @@ public:
                   double const t, const GlobalVector& /*x*/,
                   GlobalMatrix& /*K*/, GlobalVector& b) override
     {
-        (void)t;  // TODO time-dependent Neumann BCs
-
         _local_rhs.setZero();
 
         IntegrationMethod integration_method(Base::_integration_order);
         std::size_t const n_integration_points =
             integration_method.getNumberOfPoints();
 
-        for (std::size_t ip(0); ip < n_integration_points; ip++) {
+        SpatialPosition pos;
+        pos.setElementID(id);
+
+        for (std::size_t ip(0); ip < n_integration_points; ip++)
+        {
+            pos.setIntegrationPoint(ip);
             auto const& sm = Base::_shape_matrices[ip];
             auto const& wp = integration_method.getWeightedPoint(ip);
-            _local_rhs.noalias() +=
-                sm.N * _neumann_bc_value * sm.detJ * wp.getWeight();
+            _local_rhs.noalias() += sm.N *
+                                    _neumann_bc_value.getTuple(t, pos).front() *
+                                    sm.detJ * wp.getWeight();
         }
 
         auto const indices = NumLib::getIndices(id, dof_table_boundary);
@@ -62,7 +68,7 @@ public:
     }
 
 private:
-    double const _neumann_bc_value;
+    Parameter<double> const& _neumann_bc_value;
     typename Base::NodalVectorType _local_rhs;
 };
 
-- 
GitLab