From d7dd37a6dab427a8e43d5ee36df7c3b95e83e02b Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Fri, 5 Apr 2024 16:31:14 +0200
Subject: [PATCH] [PL/TH2M] Move darcy velocity to output data

---
 .../ConstitutiveRelations/ConstitutiveData.h  |   5 +-
 .../ConstitutiveRelations/DarcyVelocity.h     |  36 ++++++
 ProcessLib/TH2M/IntegrationPointData.h        |   3 -
 ProcessLib/TH2M/LocalAssemblerInterface.h     |  12 --
 ProcessLib/TH2M/TH2MFEM-impl.h                | 108 ++++++------------
 ProcessLib/TH2M/TH2MFEM.h                     |  15 ---
 ProcessLib/TH2M/TH2MProcess.cpp               |   7 --
 7 files changed, 75 insertions(+), 111 deletions(-)
 create mode 100644 ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h

diff --git a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
index 847a62eb2d1..7c4611cea70 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveData.h
@@ -12,6 +12,7 @@
 #include "Biot.h"
 #include "Bishops.h"
 #include "ConstitutiveDensity.h"
+#include "DarcyVelocity.h"
 #include "DiffusionVelocity.h"
 #include "ElasticTangentStiffnessData.h"
 #include "Enthalpy.h"
@@ -105,6 +106,7 @@ struct OutputData
     PorosityData porosity_data;
     SolidDensityData solid_density_data;
     DiffusionVelocityData<DisplacementDim> diffusion_velocity_data;
+    DarcyVelocityData<DisplacementDim> darcy_velocity_data;
 
     static auto reflect()
     {
@@ -118,7 +120,8 @@ struct OutputData
                                               &Self::vapour_pressure_data,
                                               &Self::porosity_data,
                                               &Self::solid_density_data,
-                                              &Self::diffusion_velocity_data);
+                                              &Self::diffusion_velocity_data,
+                                              &Self::darcy_velocity_data);
     }
 };
 
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h
new file mode 100644
index 00000000000..84e66d31d02
--- /dev/null
+++ b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h
@@ -0,0 +1,36 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ */
+
+#pragma once
+
+#include "Base.h"
+#include "ProcessLib/Reflection/ReflectionData.h"
+
+namespace ProcessLib::TH2M
+{
+namespace ConstitutiveRelations
+{
+template <int DisplacementDim>
+struct DarcyVelocityData
+{
+    GlobalDimVector<DisplacementDim> w_GS;
+    GlobalDimVector<DisplacementDim> w_LS;
+
+    static auto reflect()
+    {
+        using Self = DarcyVelocityData<DisplacementDim>;
+        namespace R = ProcessLib::Reflection;
+
+        return std::tuple{
+            R::makeReflectionData("velocity_gas", &Self::w_GS),
+            R::makeReflectionData("velocity_liquid", &Self::w_LS)};
+    }
+};
+}  // namespace ConstitutiveRelations
+}  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/IntegrationPointData.h b/ProcessLib/TH2M/IntegrationPointData.h
index 76ff44a96f0..dffc86438d0 100644
--- a/ProcessLib/TH2M/IntegrationPointData.h
+++ b/ProcessLib/TH2M/IntegrationPointData.h
@@ -36,9 +36,6 @@ struct IntegrationPointData final
     typename ShapeMatricesTypePressure::NodalRowVectorType N_p;
     typename ShapeMatricesTypePressure::GlobalDimNodalMatrixType dNdx_p;
 
-    GlobalDimVectorType w_GS;
-    GlobalDimVectorType w_LS;
-
     double integration_weight = std::numeric_limits<double>::quiet_NaN();
 
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
diff --git a/ProcessLib/TH2M/LocalAssemblerInterface.h b/ProcessLib/TH2M/LocalAssemblerInterface.h
index aafc2bddafa..30e624d0b54 100644
--- a/ProcessLib/TH2M/LocalAssemblerInterface.h
+++ b/ProcessLib/TH2M/LocalAssemblerInterface.h
@@ -66,18 +66,6 @@ struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface,
         std::string_view name, double const* values,
         int const integration_order) = 0;
 
-    virtual std::vector<double> const& getIntPtDarcyVelocityGas(
-        const double t,
-        std::vector<GlobalVector*> const& x,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
-        std::vector<double>& cache) const = 0;
-
-    virtual std::vector<double> const& getIntPtDarcyVelocityLiquid(
-        const double t,
-        std::vector<GlobalVector*> const& x,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
-        std::vector<double>& cache) const = 0;
-
     // TODO move to NumLib::ExtrapolatableElement
     unsigned getNumberOfIntegrationPoints() const
     {
diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index ff308665c59..2f14daaaeeb 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -428,14 +428,17 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                                     ip_cv.dS_L_dp_cap() /
                                     ip_cv.viscosity_data.mu_LR;
 
-        ip_data.w_GS = k_over_mu_G * ip_out.fluid_density_data.rho_GR * b -
-                       k_over_mu_G * gradpGR;
-        ip_data.w_LS = k_over_mu_L * gradpCap +
-                       k_over_mu_L * ip_out.fluid_density_data.rho_LR * b -
-                       k_over_mu_L * gradpGR;
+        ip_out.darcy_velocity_data.w_GS =
+            k_over_mu_G * ip_out.fluid_density_data.rho_GR * b -
+            k_over_mu_G * gradpGR;
+        ip_out.darcy_velocity_data.w_LS =
+            k_over_mu_L * gradpCap +
+            k_over_mu_L * ip_out.fluid_density_data.rho_LR * b -
+            k_over_mu_L * gradpGR;
 
         ip_cv.drho_GR_h_w_eff_dp_GR_Npart =
-            c.drho_GR_dp_GR * ip_out.enthalpy_data.h_G * ip_data.w_GS +
+            c.drho_GR_dp_GR * ip_out.enthalpy_data.h_G *
+                ip_out.darcy_velocity_data.w_GS +
             ip_out.fluid_density_data.rho_GR * ip_out.enthalpy_data.h_G *
                 k_over_mu_G * c.drho_GR_dp_GR * b;
         ip_cv.drho_GR_h_w_eff_dp_GR_gradNpart =
@@ -445,7 +448,8 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                 k_over_mu_L;
 
         ip_cv.drho_LR_h_w_eff_dp_cap_Npart =
-            -drho_LR_dp_cap * ip_out.enthalpy_data.h_L * ip_data.w_LS -
+            -drho_LR_dp_cap * ip_out.enthalpy_data.h_L *
+                ip_out.darcy_velocity_data.w_LS -
             ip_out.fluid_density_data.rho_LR * ip_out.enthalpy_data.h_L *
                 k_over_mu_L * drho_LR_dp_cap * b;
         ip_cv.drho_LR_h_w_eff_dp_cap_gradNpart =
@@ -454,10 +458,14 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             k_over_mu_L;
 
         ip_cv.drho_GR_h_w_eff_dT =
-            c.drho_GR_dT * ip_out.enthalpy_data.h_G * ip_data.w_GS +
-            ip_out.fluid_density_data.rho_GR * c.dh_G_dT * ip_data.w_GS +
-            c.drho_LR_dT * ip_out.enthalpy_data.h_L * ip_data.w_LS +
-            ip_out.fluid_density_data.rho_LR * c.dh_L_dT * ip_data.w_LS;
+            c.drho_GR_dT * ip_out.enthalpy_data.h_G *
+                ip_out.darcy_velocity_data.w_GS +
+            ip_out.fluid_density_data.rho_GR * c.dh_G_dT *
+                ip_out.darcy_velocity_data.w_GS +
+            c.drho_LR_dT * ip_out.enthalpy_data.h_L *
+                ip_out.darcy_velocity_data.w_LS +
+            ip_out.fluid_density_data.rho_LR * c.dh_L_dT *
+                ip_out.darcy_velocity_data.w_LS;
         // TODO (naumov) + k_over_mu_G * drho_GR_dT * b + k_over_mu_L *
         // drho_LR_dT * b
 
@@ -1327,8 +1335,10 @@ void TH2MLocalAssembler<
         fT.noalias() -= NTT * rho_u_eff_dot * w;
 
         fT.noalias() += gradNTT *
-                        (rhoGR * ip_out.enthalpy_data.h_G * ip.w_GS +
-                         rhoLR * ip_out.enthalpy_data.h_L * ip.w_LS) *
+                        (rhoGR * ip_out.enthalpy_data.h_G *
+                             ip_out.darcy_velocity_data.w_GS +
+                         rhoLR * ip_out.enthalpy_data.h_L *
+                             ip_out.darcy_velocity_data.w_LS) *
                         w;
 
         fT.noalias() += gradNTT *
@@ -1340,9 +1350,10 @@ void TH2MLocalAssembler<
                              ip_out.diffusion_velocity_data.d_WG) *
                         w;
 
-        fT.noalias() +=
-            NTT * (rhoGR * ip.w_GS.transpose() + rhoLR * ip.w_LS.transpose()) *
-            b * w;
+        fT.noalias() += NTT *
+                        (rhoGR * ip_out.darcy_velocity_data.w_GS.transpose() +
+                         rhoLR * ip_out.darcy_velocity_data.w_LS.transpose()) *
+                        b * w;
 
         // ---------------------------------------------------------------------
         //  - displacement equation
@@ -2057,8 +2068,10 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
 
         // fT_2
         fT.noalias() += gradNTT *
-                        (rhoGR * ip_out.enthalpy_data.h_G * ip.w_GS +
-                         rhoLR * ip_out.enthalpy_data.h_L * ip.w_LS) *
+                        (rhoGR * ip_out.enthalpy_data.h_G *
+                             ip_out.darcy_velocity_data.w_GS +
+                         rhoLR * ip_out.enthalpy_data.h_L *
+                             ip_out.darcy_velocity_data.w_LS) *
                         w;
 
         // dfT_2/dp_GR
@@ -2088,9 +2101,10 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
             .noalias() -= gradNTT * ip_cv.drho_GR_h_w_eff_dT * NT * w;
 
         // fT_3
-        fT.noalias() +=
-            NTT * (rhoGR * ip.w_GS.transpose() + rhoLR * ip.w_LS.transpose()) *
-            b * w;
+        fT.noalias() += NTT *
+                        (rhoGR * ip_out.darcy_velocity_data.w_GS.transpose() +
+                         rhoLR * ip_out.darcy_velocity_data.w_LS.transpose()) *
+                        b * w;
 
         fT.noalias() += gradNTT *
                         (current_state.constituent_density_data.rho_C_GR *
@@ -2223,58 +2237,6 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         .noalias() += KUpC;
 }
 
-template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
-          int DisplacementDim>
-std::vector<double> const& TH2MLocalAssembler<
-    ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
-    getIntPtDarcyVelocityGas(
-        const double /*t*/,
-        std::vector<GlobalVector*> const& /*x*/,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
-        std::vector<double>& cache) const
-{
-    unsigned const n_integration_points =
-        this->integration_method_.getNumberOfPoints();
-
-    cache.clear();
-    auto cache_matrix = MathLib::createZeroedMatrix<Eigen::Matrix<
-        double, DisplacementDim, Eigen::Dynamic, Eigen::RowMajor>>(
-        cache, DisplacementDim, n_integration_points);
-
-    for (unsigned ip = 0; ip < n_integration_points; ip++)
-    {
-        cache_matrix.col(ip).noalias() = _ip_data[ip].w_GS;
-    }
-
-    return cache;
-}
-
-template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
-          int DisplacementDim>
-std::vector<double> const& TH2MLocalAssembler<
-    ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
-    getIntPtDarcyVelocityLiquid(
-        const double /*t*/,
-        std::vector<GlobalVector*> const& /*x*/,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
-        std::vector<double>& cache) const
-{
-    unsigned const n_integration_points =
-        this->integration_method_.getNumberOfPoints();
-
-    cache.clear();
-    auto cache_matrix = MathLib::createZeroedMatrix<Eigen::Matrix<
-        double, DisplacementDim, Eigen::Dynamic, Eigen::RowMajor>>(
-        cache, DisplacementDim, n_integration_points);
-
-    for (unsigned ip = 0; ip < n_integration_points; ip++)
-    {
-        cache_matrix.col(ip).noalias() = _ip_data[ip].w_LS;
-    }
-
-    return cache;
-}
-
 template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           int DisplacementDim>
 void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
diff --git a/ProcessLib/TH2M/TH2MFEM.h b/ProcessLib/TH2M/TH2MFEM.h
index 288d78f32a6..ca7e25ccbba 100644
--- a/ProcessLib/TH2M/TH2MFEM.h
+++ b/ProcessLib/TH2M/TH2MFEM.h
@@ -188,21 +188,6 @@ private:
         return Eigen::Map<const Eigen::RowVectorXd>(N_u.data(), N_u.size());
     }
 
-    // TODO: Here is some refactoring potential. All secondary variables could
-    // be stored in some container to avoid defining one method for each
-    // variable.
-
-    std::vector<double> const& getIntPtDarcyVelocityGas(
-        const double t,
-        std::vector<GlobalVector*> const& x,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
-        std::vector<double>& cache) const override;
-    std::vector<double> const& getIntPtDarcyVelocityLiquid(
-        const double t,
-        std::vector<GlobalVector*> const& x,
-        std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
-        std::vector<double>& cache) const override;
-
     std::tuple<
         std::vector<ConstitutiveRelations::ConstitutiveData<DisplacementDim>>,
         std::vector<
diff --git a/ProcessLib/TH2M/TH2MProcess.cpp b/ProcessLib/TH2M/TH2MProcess.cpp
index 51cd4a76d80..b3289ca9d14 100644
--- a/ProcessLib/TH2M/TH2MProcess.cpp
+++ b/ProcessLib/TH2M/TH2MProcess.cpp
@@ -163,13 +163,6 @@ void TH2MProcess<DisplacementDim>::initializeConcreteProcess(
         LocalAssemblerInterface<DisplacementDim>::getReflectionDataForOutput(),
         _secondary_variables, getExtrapolator(), local_assemblers_);
 
-    add_secondary_variable(
-        "velocity_gas", mesh.getDimension(),
-        &LocalAssemblerInterface<DisplacementDim>::getIntPtDarcyVelocityGas);
-    add_secondary_variable(
-        "velocity_liquid", mesh.getDimension(),
-        &LocalAssemblerInterface<DisplacementDim>::getIntPtDarcyVelocityLiquid);
-
     //
     // enable output of internal variables defined by material models
     //
-- 
GitLab