From 1ff3c76711ea32978c50f075ffa44612a6af6c89 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Mon, 12 Aug 2024 17:16:21 +0200
Subject: [PATCH] [PL/HM] Use assembly mixins residuum output

---
 .../HydroMechanics/HydroMechanicsProcess.cpp  | 53 ++++++++-----------
 .../HydroMechanics/HydroMechanicsProcess.h    |  7 +--
 2 files changed, 26 insertions(+), 34 deletions(-)

diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index fb1b871093f..eabd64447c1 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -45,12 +45,6 @@ HydroMechanicsProcess<DisplacementDim>::HydroMechanicsProcess(
           *_jacobian_assembler},
       process_data_(std::move(process_data))
 {
-    nodal_forces_ = MeshLib::getOrCreateMeshProperty<double>(
-        mesh, "NodalForces", MeshLib::MeshItemType::Node, DisplacementDim);
-
-    hydraulic_flow_ = MeshLib::getOrCreateMeshProperty<double>(
-        mesh, "MassFlowRate", MeshLib::MeshItemType::Node, 1);
-
     _integration_point_writer.emplace_back(
         std::make_unique<MeshLib::IntegrationPointWriter>(
             "sigma_ip",
@@ -339,31 +333,6 @@ void HydroMechanicsProcess<DisplacementDim>::
 
     AssemblyMixin<HydroMechanicsProcess<DisplacementDim>>::assembleWithJacobian(
         t, dt, x, x_prev, process_id, b, Jac);
-
-    auto const dof_tables = getDOFTables(x.size());
-    auto copyRhs = [&](int const variable_id, auto& output_vector)
-    {
-        if (use_monolithic_scheme)
-        {
-            transformVariableFromGlobalVector(b, variable_id, *dof_tables[0],
-                                              output_vector,
-                                              std::negate<double>());
-        }
-        else
-        {
-            transformVariableFromGlobalVector(b, 0, *dof_tables[process_id],
-                                              output_vector,
-                                              std::negate<double>());
-        }
-    };
-    if (process_id == process_data_.hydraulic_process_id)
-    {
-        copyRhs(0, *hydraulic_flow_);
-    }
-    if (process_id == process_data_.mechanics_related_process_id)
-    {
-        copyRhs(1, *nodal_forces_);
-    }
 }
 
 template <int DisplacementDim>
@@ -382,6 +351,28 @@ void HydroMechanicsProcess<DisplacementDim>::preTimestepConcreteProcess(
     }
 }
 
+template <int DisplacementDim>
+std::vector<std::vector<std::string>>
+HydroMechanicsProcess<DisplacementDim>::initializeAssemblyOnSubmeshes(
+    std::vector<std::reference_wrapper<MeshLib::Mesh>> const& meshes)
+{
+    INFO("HydroMechanicsProcess initializeSubmeshOutput().");
+    std::vector<std::vector<std::string>> per_process_residuum_names;
+    if (_process_variables.size() == 1)  // monolithic
+    {
+        per_process_residuum_names = {{"MassFlowRate", "NodalForces"}};
+    }
+    else  // staggered
+    {
+        per_process_residuum_names = {{"MassFlowRate"}, {"NodalForces"}};
+    }
+
+    AssemblyMixin<HydroMechanicsProcess<DisplacementDim>>::
+        initializeAssemblyOnSubmeshes(meshes, per_process_residuum_names);
+
+    return per_process_residuum_names;
+}
+
 template <int DisplacementDim>
 void HydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x,
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
index b47cbca7dbb..033e1f02db5 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
@@ -113,6 +113,10 @@ private:
     NumLib::LocalToGlobalIndexMap const& getDOFTable(
         const int process_id) const override;
 
+    std::vector<std::vector<std::string>> initializeAssemblyOnSubmeshes(
+        std::vector<std::reference_wrapper<MeshLib::Mesh>> const& meshes)
+        override;
+
     bool isMonolithicSchemeUsed() const override
     {
         return process_data_.isMonolithicSchemeUsed();
@@ -154,9 +158,6 @@ private:
     {
         return process_id == process_data_.mechanics_related_process_id;
     }
-
-    MeshLib::PropertyVector<double>* nodal_forces_ = nullptr;
-    MeshLib::PropertyVector<double>* hydraulic_flow_ = nullptr;
 };
 
 extern template class HydroMechanicsProcess<2>;
-- 
GitLab