From eaafa23883ec0c2581132b7d726202b7d2b69d6e Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Mon, 28 Jan 2019 16:07:03 +0100
Subject: [PATCH] [PL] Infrastructure for setInitialConditions().

Some processes might require setup of the initial
conditions dependent variables in local assemblers.
The new interface allows such implementations.
---
 ProcessLib/LocalAssemblerInterface.cpp | 10 ++++++++++
 ProcessLib/LocalAssemblerInterface.h   |  9 +++++++++
 ProcessLib/Process.cpp                 |  2 ++
 ProcessLib/Process.h                   |  4 ++++
 4 files changed, 25 insertions(+)

diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp
index bdc455178f1..98c59588e90 100644
--- a/ProcessLib/LocalAssemblerInterface.cpp
+++ b/ProcessLib/LocalAssemblerInterface.cpp
@@ -78,6 +78,16 @@ void LocalAssemblerInterface::computeSecondaryVariable(
     computeSecondaryVariableConcrete(t, local_x);
 }
 
+void LocalAssemblerInterface::setInitialConditions(
+    std::size_t const mesh_item_id,
+    NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x)
+{
+    auto const indices = NumLib::getIndices(mesh_item_id, dof_table);
+    auto const local_x = x.get(indices);
+
+    setInitialConditionsConcrete(local_x);
+}
+
 void LocalAssemblerInterface::preTimestep(
     std::size_t const mesh_item_id,
     NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x,
diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h
index 4c22ce42d91..02cb41bcd1b 100644
--- a/ProcessLib/LocalAssemblerInterface.h
+++ b/ProcessLib/LocalAssemblerInterface.h
@@ -34,6 +34,10 @@ class LocalAssemblerInterface
 public:
     virtual ~LocalAssemblerInterface() = default;
 
+    virtual void setInitialConditions(
+        std::size_t const mesh_item_id,
+        NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x);
+
     virtual void preAssemble(double const /*t*/,
                              std::vector<double> const& /*local_x*/){};
 
@@ -96,6 +100,11 @@ public:
     }
 
 private:
+    virtual void setInitialConditionsConcrete(
+        std::vector<double> const& /*local_x*/)
+    {
+    }
+
     virtual void preTimestepConcrete(std::vector<double> const& /*local_x*/,
                                      double const /*t*/, double const /*dt*/)
     {
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 5c6bb2843b3..57ef8b47d93 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -121,6 +121,7 @@ void Process::setInitialConditions(const int process_id, double const t,
          variable_id < per_process_variables.size();
          variable_id++)
     {
+        MathLib::LinAlg::setLocalAccessibleVector(x);
         SpatialPosition pos;
 
         auto const& pv = per_process_variables[variable_id];
@@ -163,6 +164,7 @@ void Process::setInitialConditions(const int process_id, double const t,
             }
         }
     }
+    setInitialConditionsConcreteProcess(x);
 }
 
 MathLib::MatrixSpecifications Process::getMatrixSpecifications(
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index d1d22bdfb41..44c099591af 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -176,6 +176,10 @@ private:
     /// processes. It is called by initialize().
     virtual void initializeBoundaryConditions();
 
+    virtual void setInitialConditionsConcreteProcess(GlobalVector const& /*x*/)
+    {
+    }
+
     virtual void preAssembleConcreteProcess(const double /*t*/,
                                             GlobalVector const& /*x*/)
     {
-- 
GitLab