From 8df4d40c150471e51f66bbcdcc6bc12c2cb3fd02 Mon Sep 17 00:00:00 2001
From: renchao_lu <renchao.lu@gmail.com>
Date: Mon, 23 Nov 2020 16:54:18 +0100
Subject: [PATCH] [PL] Update postTimeStep interface for other processes.

---
 ProcessLib/HydroMechanics/HydroMechanicsFEM.h |  2 +-
 .../HydroMechanics/HydroMechanicsProcess.cpp  | 16 ++++++++++++--
 .../HydroMechanics/HydroMechanicsProcess.cpp  | 21 +++++++++++++------
 .../HydroMechanicsLocalAssemblerInterface.h   |  8 +++----
 ProcessLib/PhaseField/PhaseFieldFEM.h         |  2 +-
 .../RichardsMechanics/RichardsMechanicsFEM.h  |  2 +-
 .../RichardsMechanicsProcess.cpp              | 14 +++++++++----
 .../SmallDeformation/SmallDeformationFEM.h    |  2 +-
 .../SmallDeformationProcess.cpp               |  8 ++++---
 .../SmallDeformationNonlocalFEM.h             |  2 +-
 .../SmallDeformationNonlocalProcess.cpp       |  8 ++++---
 .../ThermoHydroMechanicsFEM.h                 |  2 +-
 .../ThermoHydroMechanicsProcess.cpp           | 17 +++++++++++++--
 .../ThermoMechanicalPhaseFieldFEM.h           |  2 +-
 .../ThermoMechanicalPhaseFieldProcess.cpp     | 16 +++++++++++---
 .../ThermoMechanics/ThermoMechanicsFEM.h      |  2 +-
 .../ThermoMechanicsProcess.cpp                | 13 ++++++++----
 17 files changed, 97 insertions(+), 40 deletions(-)

diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
index 0c60ac50520..628493238d2 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
@@ -178,7 +178,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index 9a49750ad68..1de73f25004 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -492,12 +492,24 @@ void HydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep HydroMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
+
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
-        dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
index b28d2aeff66..3d36d63cfe9 100644
--- a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
@@ -459,19 +459,28 @@ void HydroMechanicsProcess<GlobalDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, const double t, double const dt,
     int const process_id)
 {
-    DBUG("Compute the secondary variables for HydroMechanicsProcess.");
-    const auto& dof_table = getDOFTable(process_id);
-
+    if (process_id == 0)
     {
+        DBUG("PostTimestep HydroMechanicsProcess.");
+        std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+        auto const n_processes = x.size();
+        dof_tables.reserve(n_processes);
+        for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+        {
+            dof_tables.push_back(&getDOFTable(process_id));
+        }
+
         ProcessLib::ProcessVariable const& pv =
             getProcessVariables(process_id)[0];
-
         GlobalExecutor::executeSelectedMemberOnDereferenced(
             &HydroMechanicsLocalAssemblerInterface::postTimestep,
-            _local_assemblers, pv.getActiveElementIDs(), dof_table,
-            *x[process_id], t, dt);
+            _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt);
     }
 
+    DBUG("Compute the secondary variables for HydroMechanicsProcess.");
+
+    const auto& dof_table = getDOFTable(process_id);
+
     // Copy displacement jumps in a solution vector to mesh property
     // Remark: the copy is required because mesh properties for primary
     // variables are set during output and are not ready yet when this function
diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
index ae1a9a5f649..28b2b3057c9 100644
--- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
+++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
@@ -100,13 +100,11 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& local_x_,
-                              const double t, double const dt) override
+    void postTimestepConcrete(Eigen::VectorXd const& local_x_, const double t,
+                              double const dt) override
     {
-        auto const local_dof_size = local_x_.size();
-
         _local_u.setZero();
-        for (unsigned i = 0; i < local_dof_size; i++)
+        for (Eigen::Index i = 0; i < local_x_.rows(); i++)
         {
             _local_u[_dofIndex_to_localIndex[i]] = local_x_[i];
         }
diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h
index 99eb32c2e26..4cf82b832f9 100644
--- a/ProcessLib/PhaseField/PhaseFieldFEM.h
+++ b/ProcessLib/PhaseField/PhaseFieldFEM.h
@@ -240,7 +240,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
index 1144d6202c3..21ee566a251 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
@@ -147,7 +147,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
index eef023aebb2..9c25eb185a4 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
@@ -543,16 +543,22 @@ void RichardsMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
-    DBUG("PostTimestep RichardsMechanicsProcess.");
-
     if (hasMechanicalProcess(process_id))
     {
+        DBUG("PostTimestep RichardsMechanicsProcess.");
+        std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+        auto const n_processes = x.size();
+        dof_tables.reserve(n_processes);
+        for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+        {
+            dof_tables.push_back(&getDOFTable(process_id));
+        }
+
         ProcessLib::ProcessVariable const& pv =
             getProcessVariables(process_id)[0];
         GlobalExecutor::executeSelectedMemberOnDereferenced(
             &LocalAssemblerIF::postTimestep, _local_assemblers,
-            pv.getActiveElementIDs(), *_local_to_global_index_map,
-            *x[process_id], t, dt);
+            pv.getActiveElementIDs(), dof_tables, x, t, dt);
     }
 }
 
diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
index 514af43e48c..364fbacea23 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
@@ -319,7 +319,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const t, double const dt) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
index 18ae3ae47e8..0dce94e2b84 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
+++ b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
@@ -245,13 +245,15 @@ void SmallDeformationProcess<DisplacementDim>::postTimestepConcreteProcess(
     int const process_id)
 {
     DBUG("PostTimestep SmallDeformationProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    dof_tables.reserve(x.size());
+    std::generate_n(std::back_inserter(dof_tables), x.size(),
+                    [&]() { return _local_to_global_index_map.get(); });
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 
     std::unique_ptr<GlobalVector> material_forces;
     ProcessLib::SmallDeformation::writeMaterialForces(
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
index a228f3314fa..1e3f34bde55 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
@@ -529,7 +529,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
index 5b3db21887d..32e9cb34673 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
@@ -302,13 +302,15 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::
                                 int const process_id)
 {
     DBUG("PostTimestep SmallDeformationNonlocalProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    dof_tables.reserve(x.size());
+    std::generate_n(std::back_inserter(dof_tables), x.size(),
+                    [&]() { return _local_to_global_index_map.get(); });
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
index e2815f5570b..e75c3f3f64f 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
@@ -109,7 +109,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
index 541a9bd7185..f2005fef5eb 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
@@ -350,10 +350,23 @@ void ThermoHydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep ThermoHydroMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
+
     GlobalExecutor::executeMemberOnDereferenced(
-        &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        getDOFTable(process_id), *x[process_id], t, dt);
+        &LocalAssemblerInterface::postTimestep, _local_assemblers, dof_tables,
+        x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
index e30adfb8d2a..0b96b2c5b2d 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
+++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
@@ -254,7 +254,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
index be8b63c9ecb..c35d0d6e4a3 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
+++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
@@ -286,14 +286,24 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>::
                                 double const dt,
                                 int const process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep ThermoMechanicalPhaseFieldProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &ThermoMechanicalPhaseFieldLocalAssemblerInterface::postTimestep,
-        _local_assemblers, pv.getActiveElementIDs(), getDOFTable(process_id),
-        *x[process_id], t, dt);
+        _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
index 2e0a384c3e7..844c7512586 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
@@ -182,7 +182,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
index 6b73b7bf16d..3be338663c5 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
@@ -415,19 +415,24 @@ void ThermoMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     int const process_id)
 {
-    if (process_id != _process_data.mechanics_process_id)
+    if (process_id != 0)
     {
         return;
     }
 
     DBUG("PostTimestep ThermoMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
-- 
GitLab