From b4200a7b867c536d8b16240b3362256783e1fbae Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Mon, 7 Jan 2019 15:53:32 +0100
Subject: [PATCH] [deactivation] Minor changes according to the comments by
 Dima and Tom

---
 ProcessLib/PhaseField/PhaseFieldProcess.cpp   |  9 ++--
 ProcessLib/Process.cpp                        | 24 ++---------
 ProcessLib/Process.h                          |  2 +-
 ProcessLib/ProcessVariable.cpp                | 21 +++++-----
 ProcessLib/ProcessVariable.h                  |  2 +-
 .../SmallDeformationNonlocalProcess.cpp       | 42 +++++++++++++------
 ProcessLib/UncoupledProcessesTimeLoop.cpp     |  2 +-
 7 files changed, 53 insertions(+), 49 deletions(-)

diff --git a/ProcessLib/PhaseField/PhaseFieldProcess.cpp b/ProcessLib/PhaseField/PhaseFieldProcess.cpp
index 9e93feee663..1496e1e52c5 100644
--- a/ProcessLib/PhaseField/PhaseFieldProcess.cpp
+++ b/ProcessLib/PhaseField/PhaseFieldProcess.cpp
@@ -368,10 +368,13 @@ void PhaseFieldProcess<DisplacementDim>::postNonLinearSolverConcreteProcess(
 
         DBUG("PostNonLinearSolver crack volume computation.");
 
-        GlobalExecutor::executeMemberOnDereferenced(
+        ProcessLib::ProcessVariable const& pv
+            = getProcessVariables(process_id)[0];
+        GlobalExecutor::executeSelectedMemberOnDereferenced(
             &LocalAssemblerInterface::computeCrackIntegral, _local_assemblers,
-            dof_tables, x, t, _process_data.crack_volume,
-            _use_monolithic_scheme, _coupled_solutions);
+            pv.getActiveElementIDs(), dof_tables, x, t,
+            _process_data.crack_volume, _use_monolithic_scheme,
+            _coupled_solutions);
 
         INFO("Integral of crack: %g", _process_data.crack_volume);
 
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 34b533e3ab2..41523f2316d 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -49,7 +49,7 @@ Process::Process(
           return pcs_BCs;
       }(_process_variables.size())),
       _source_term_collections([&](const std::size_t number_of_processes)
-                               -> std::vector<SourceTermCollection> {
+                                   -> std::vector<SourceTermCollection> {
           std::vector<SourceTermCollection> pcs_sts;
           pcs_sts.reserve(number_of_processes);
           for (std::size_t i = 0; i < number_of_processes; i++)
@@ -59,23 +59,6 @@ Process::Process(
           return pcs_sts;
       }(_process_variables.size()))
 {
-    // If there are deactivated subdomains, check whether MaterialIDs exist in
-    // mesh data.
-    for (auto const& per_process_process_variables : _process_variables)
-    {
-        for (auto const& process_variable : per_process_process_variables)
-        {
-            if ((!process_variable.get()
-                      .getDeactivatedSubdomains()
-                      .empty()) &&
-                (!materialIDs(mesh)))
-            {
-                OGS_FATAL(
-                    "The mesh does not contain matertialIDs for the "
-                    "deactivation of subdomains. The program terminates now.");
-            }
-        }
-    }
 }
 
 void Process::initializeProcessBoundaryConditionsAndSourceTerms(
@@ -190,12 +173,13 @@ MathLib::MatrixSpecifications Process::getMatrixSpecifications(
             &l.getGhostIndices(), &_sparsity_pattern};
 }
 
-void Process::checkElementDeactivation(double const time, const int process_id)
+void Process::updateDeactivatedSubdomains(double const time,
+                                          const int process_id)
 {
     auto const& variables_per_process = getProcessVariables(process_id);
     for (auto const& variable : variables_per_process)
     {
-       variable.get().checkElementDeactivation(time);
+        variable.get().updateDeactivatedSubdomains(time);
     }
 }
 
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index 8d6984e5bd3..d1d22bdfb41 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -90,7 +90,7 @@ public:
         _coupled_solutions = coupled_solutions;
     }
 
-    void checkElementDeactivation(double const time, const int process_id);
+    void updateDeactivatedSubdomains(double const time, const int process_id);
 
     bool isMonolithicSchemeUsed() const { return _use_monolithic_scheme; }
     virtual void setCoupledTermForTheStaggeredSchemeToLocalAssemblers() {}
diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp
index caf14c5cb77..d85f0c06c46 100644
--- a/ProcessLib/ProcessVariable.cpp
+++ b/ProcessLib/ProcessVariable.cpp
@@ -9,8 +9,6 @@
 
 #include "ProcessVariable.h"
 
-#include <iostream>
-
 #include <algorithm>
 #include <utility>
 
@@ -119,7 +117,7 @@ ProcessVariable::ProcessVariable(
 
     // Boundary conditions
     if (auto bcs_config =
-        //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions}
+            //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions}
         config.getConfigSubtreeOptional("boundary_conditions"))
     {
         for (
@@ -237,10 +235,10 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains(
 
     for (auto const& deactivated_subdomain : _deactivated_subdomains)
     {
-        auto const& deactivated_sudomain_meshes =
-            (*deactivated_subdomain).deactivated_sudomain_meshes;
-        for (auto const& deactivated_sudomain_mesh :
-             deactivated_sudomain_meshes)
+        auto const& deactivated_subdomain_meshes =
+            deactivated_subdomain->deactivated_subdomain_meshes;
+        for (auto const& deactivated_subdomain_mesh :
+             deactivated_subdomain_meshes)
         {
             for (int component_id = 0;
                  component_id < dof_table.getNumberOfComponents();
@@ -249,16 +247,17 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains(
                 // Copy the time interval.
                 std::unique_ptr<BaseLib::TimeInterval> time_interval =
                     std::make_unique<BaseLib::TimeInterval>(
-                        (*(*deactivated_subdomain).time_interval));
+                        *deactivated_subdomain->time_interval);
 
                 auto bc = std::make_unique<
                     DirichletBoundaryConditionWithinTimeInterval>(
                     std::move(time_interval), parameter,
-                    (*(*deactivated_sudomain_mesh).mesh),
-                    (*deactivated_sudomain_mesh).inactive_nodes, dof_table,
+                    *(deactivated_subdomain_mesh->mesh),
+                    deactivated_subdomain_mesh->inactive_nodes, dof_table,
                     variable_id, component_id);
 
 #ifdef USE_PETSC
+                // TODO: make it work under PETSc too.
                 if (bc == nullptr)
                 {
                     continue;
@@ -270,7 +269,7 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains(
     }
 }
 
-void ProcessVariable::checkElementDeactivation(double const time)
+void ProcessVariable::updateDeactivatedSubdomains(double const time)
 {
     if (_deactivated_subdomains.empty())
     {
diff --git a/ProcessLib/ProcessVariable.h b/ProcessLib/ProcessVariable.h
index ef4a8855f2c..55fb76147be 100644
--- a/ProcessLib/ProcessVariable.h
+++ b/ProcessLib/ProcessVariable.h
@@ -63,7 +63,7 @@ public:
         return _deactivated_subdomains;
     }
 
-    void checkElementDeactivation(double const time);
+    void updateDeactivatedSubdomains(double const time);
 
     std::vector<std::size_t>& getActiveElementIDs() const
     {
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
index 1c5ca55d366..b4de897c3c8 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
@@ -140,7 +140,6 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::
         &LocalAssemblerInterface::nonlocal, _local_assemblers,
         _local_assemblers);
 
-
     // Set initial conditions for integration point data.
     for (auto const& ip_writer : _integration_point_writer)
     {
@@ -230,10 +229,14 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::assembleConcreteProcess(
 
     std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
         dof_table = {std::ref(*_local_to_global_index_map)};
+
+    const int process_id = 0;
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
     // Call global assembler for each local assembly item.
-    GlobalExecutor::executeMemberDereferenced(
+    GlobalExecutor::executeSelectedMemberDereferenced(
         _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
-        dof_table, t, x, M, K, b, _coupled_solutions);
+        pv.getActiveElementIDs(), dof_table, t, x, M, K, b, _coupled_solutions);
 }
 
 template <int DisplacementDim>
@@ -243,10 +246,14 @@ void SmallDeformationNonlocalProcess<
 {
     DBUG("preAssemble SmallDeformationNonlocalProcess.");
 
+    const int process_id = 0;
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
     // Call global assembler for each local assembly item.
-    GlobalExecutor::executeMemberDereferenced(
+    GlobalExecutor::executeSelectedMemberDereferenced(
         _global_assembler, &VectorMatrixAssembler::preAssemble,
-        _local_assemblers, *_local_to_global_index_map, t, x);
+        _local_assemblers, pv.getActiveElementIDs(),
+        *_local_to_global_index_map, t, x);
 }
 
 template <int DisplacementDim>
@@ -262,11 +269,15 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::
 
     std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
         dof_table = {std::ref(*_local_to_global_index_map)};
+
+    const int process_id = 0;
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
     // Call global assembler for each local assembly item.
-    GlobalExecutor::executeMemberDereferenced(
+    GlobalExecutor::executeSelectedMemberDereferenced(
         _global_assembler, &VectorMatrixAssembler::assembleWithJacobian,
-        _local_assemblers, dof_table, t, x, xdot, dxdot_dx, dx_dx, M, K, b, Jac,
-        _coupled_solutions);
+        _local_assemblers, pv.getActiveElementIDs(), dof_table, t, x, xdot,
+        dxdot_dx, dx_dx, M, K, b, Jac, _coupled_solutions);
 
     b.copyValues(*_nodal_forces);
     std::transform(_nodal_forces->begin(), _nodal_forces->end(),
@@ -285,9 +296,12 @@ void SmallDeformationNonlocalProcess<
     _process_data.dt = dt;
     _process_data.t = t;
 
-    GlobalExecutor::executeMemberOnDereferenced(
+    const int process_id = 0;
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
+    GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::preTimestep, _local_assemblers,
-        *_local_to_global_index_map, x, t, dt);
+        pv.getActiveElementIDs(), *_local_to_global_index_map, x, t, dt);
 }
 
 template <int DisplacementDim>
@@ -300,9 +314,13 @@ SmallDeformationNonlocalProcess<DisplacementDim>::postIterationConcreteProcess(
 
     DBUG("PostNonLinearSolver crack volume computation.");
 
-    GlobalExecutor::executeMemberOnDereferenced(
+    const int process_id = 0;
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
+    GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::computeCrackIntegral, _local_assemblers,
-        *_local_to_global_index_map, x, _process_data.crack_volume);
+        pv.getActiveElementIDs(), *_local_to_global_index_map, x,
+        _process_data.crack_volume);
 
     INFO("Integral of crack: %g", _process_data.crack_volume);
 
diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp
index 22ed4a62feb..aaadfbe38d8 100644
--- a/ProcessLib/UncoupledProcessesTimeLoop.cpp
+++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp
@@ -546,7 +546,7 @@ bool UncoupledProcessesTimeLoop::loop()
         int process_id = 0;
         for (auto& process_data : _per_process_data)
         {
-            process_data->process.checkElementDeactivation(t, process_id);
+            process_data->process.updateDeactivatedSubdomains(t, process_id);
             ++process_id;
         }
 
-- 
GitLab