From 74e3fc2393c6e39bb9ed78bf98f4b1bab2fb1bbd Mon Sep 17 00:00:00 2001
From: Jan Thiedau <Jan.Thiedau@bgr.de>
Date: Fri, 13 Jan 2023 14:22:55 +0100
Subject: [PATCH] [PL/CT] Add residual output for all components -- continued

---
 .../ComponentTransportProcess.cpp             | 83 +++++++++++++++----
 .../ComponentTransportProcess.h               |  1 +
 2 files changed, 67 insertions(+), 17 deletions(-)

diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
index 88022dfc031..95af9b5969b 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
@@ -19,6 +19,7 @@
 #include "MathLib/LinAlg/FinalizeVectorAssembly.h"
 #include "MathLib/LinAlg/LinAlg.h"
 #include "NumLib/DOF/ComputeSparsityPattern.h"
+#include "ProcessLib/Process.h"
 #include "ProcessLib/SurfaceFlux/SurfaceFlux.h"
 #include "ProcessLib/SurfaceFlux/SurfaceFluxData.h"
 #include "ProcessLib/Utils/ComputeResiduum.h"
@@ -49,13 +50,31 @@ ComponentTransportProcess::ComponentTransportProcess(
       _surfaceflux(std::move(surfaceflux)),
       _chemical_solver_interface(std::move(chemical_solver_interface))
 {
-    std::size_t n_processes = _process_variables.size();
-    _molar_flow_rate.resize(n_processes - 1);
-    for (int process_id = 0; process_id < n_processes - 1; ++process_id)
+    _hydraulic_flow = MeshLib::getOrCreateMeshProperty<double>(
+        mesh, "LiquidFlowRate", MeshLib::MeshItemType::Node, 1);
+
+    if (_use_monolithic_scheme)
+    {
+        const int process_id = 0;
+        for (auto pv_iter = std::next(_process_variables[process_id].begin());
+             pv_iter != _process_variables[process_id].end();
+             ++pv_iter)
+        {
+            _molar_flow_rate.push_back(MeshLib::getOrCreateMeshProperty<double>(
+                mesh, pv_iter->get().getName() + "FlowRate",
+                MeshLib::MeshItemType::Node, 1));
+        }
+    }
+    else
     {
-        _molar_flow_rate[process_id] = MeshLib::getOrCreateMeshProperty<double>(
-            mesh, "MolarFlowRate_" + std::to_string(process_id),
-            MeshLib::MeshItemType::Node, 1);
+        for (auto pv_iter = std::next(_process_variables.begin());
+             pv_iter != _process_variables.end();
+             ++pv_iter)
+        {
+            _molar_flow_rate.push_back(MeshLib::getOrCreateMeshProperty<double>(
+                mesh, (*pv_iter)[0].get().getName() + "FlowRate",
+                MeshLib::MeshItemType::Node, 1));
+        }
     }
 }
 
@@ -180,11 +199,37 @@ void ComponentTransportProcess::assembleConcreteProcess(
     MathLib::finalizeMatrixAssembly(M);
     MathLib::finalizeMatrixAssembly(K);
     MathLib::finalizeVectorAssembly(b);
-
     auto const residuum = computeResiduum(*x[0], *xdot[0], M, K, b);
-    transformVariableFromGlobalVector(residuum, 0, *_local_to_global_index_map,
-                                      *_molar_flow_rate[process_id],
-                                      std::negate<double>());
+    auto copyRhs = [&](int const variable_id, auto& output_vector)
+    {
+        if (_use_monolithic_scheme)
+        {
+            transformVariableFromGlobalVector(residuum, variable_id,
+                                              dof_tables[0], output_vector,
+                                              std::negate<double>());
+        }
+        else
+        {
+            transformVariableFromGlobalVector(
+                residuum, 0, dof_tables[process_id], output_vector,
+                std::negate<double>());
+        }
+    };
+    if (_use_monolithic_scheme || process_id == 0)
+    {
+        copyRhs(0, *_hydraulic_flow);
+    }
+    if (_use_monolithic_scheme)
+    {
+        for (std::size_t c_idx = 0; c_idx < _molar_flow_rate.size(); ++c_idx)
+        {
+            copyRhs(c_idx + 1, *_molar_flow_rate[c_idx]);
+        }
+    }
+    if (process_id > 0)
+    {
+        copyRhs(process_id, *_molar_flow_rate[process_id - 1]);
+    }
 }
 
 void ComponentTransportProcess::assembleWithJacobianConcreteProcess(
@@ -209,16 +254,20 @@ void ComponentTransportProcess::assembleWithJacobianConcreteProcess(
         _local_assemblers, pv.getActiveElementIDs(), dof_tables, t, dt, x, xdot,
         process_id, M, K, b, Jac);
 
+    // b is the negated residumm used in the Newton's method.
+    // Here negating b is to recover the primitive residuum.
     if (process_id == _process_data.hydraulic_process_id)
     {
-        return;
+        transformVariableFromGlobalVector(b, 0, *_local_to_global_index_map,
+                                          *_hydraulic_flow,
+                                          std::negate<double>());
+    }
+    else
+    {
+        transformVariableFromGlobalVector(b, 0, *_local_to_global_index_map,
+                                          *_molar_flow_rate[process_id - 1],
+                                          std::negate<double>());
     }
-
-    // b is the negated residumm used in the Newton's method.
-    // Here negating b is to recover the primitive residuum.
-    transformVariableFromGlobalVector(
-        b, process_id, *_local_to_global_index_map,
-        *_molar_flow_rate[process_id], std::negate<double>());
 }
 
 Eigen::Vector3d ComponentTransportProcess::getFlux(
diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.h b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
index da1ac9fb79b..9c9702e225e 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
@@ -170,6 +170,7 @@ private:
     std::unique_ptr<ChemistryLib::ChemicalSolverInterface>
         _chemical_solver_interface;
 
+    MeshLib::PropertyVector<double>* _hydraulic_flow = nullptr;
     std::vector<MeshLib::PropertyVector<double>*> _molar_flow_rate;
 };
 
-- 
GitLab