From ceb378f60986453f51b0cb0aaf7295f13af36b6b Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Tue, 16 Apr 2024 19:31:46 +0200
Subject: [PATCH] [PL/TH2M] Extract darcy velocity model

---
 ProcessLib/TH2M/ConstitutiveRelations/Base.h  |  8 ++++
 .../ConstitutiveModels.h                      |  1 +
 .../ConstitutiveRelations/DarcyVelocity.cpp   | 43 +++++++++++++++++++
 .../ConstitutiveRelations/DarcyVelocity.h     | 18 ++++++++
 ProcessLib/TH2M/TH2MFEM-impl.h                | 28 ++++++------
 5 files changed, 83 insertions(+), 15 deletions(-)
 create mode 100644 ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.cpp

diff --git a/ProcessLib/TH2M/ConstitutiveRelations/Base.h b/ProcessLib/TH2M/ConstitutiveRelations/Base.h
index 8739cfbab38..e5ec55f00b4 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/Base.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/Base.h
@@ -59,6 +59,14 @@ using ReferenceTemperatureData =
 using GasPressureData = BaseLib::StrongType<double, struct GasPressureTag>;
 using CapillaryPressureData =
     BaseLib::StrongType<double, struct CapillaryPressureTag>;
+template <int DisplacementDim>
+using GasPressureGradientData =
+    BaseLib::StrongType<GlobalDimVector<DisplacementDim>,
+                        struct GasPressureGradientTag>;
+template <int DisplacementDim>
+using CapillaryPressureGradientData =
+    BaseLib::StrongType<GlobalDimVector<DisplacementDim>,
+                        struct CapillaryPressureGradientTag>;
 
 template <int DisplacementDim>
 using SpecificBodyForceData =
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
index df7bee1cd8a..3ac2a484076 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/ConstitutiveModels.h
@@ -85,6 +85,7 @@ struct ConstitutiveModels
     InternalEnergyModel internal_energy_model;
     EffectiveVolumetricEnthalpyModel effective_volumetric_enthalpy_model;
     GravityModel<DisplacementDim> gravity_model;
+    DarcyVelocityModel<DisplacementDim> darcy_velocity_model;
     FC1Model<DisplacementDim> fC_1_model;
     FC2aModel fC_2a_model;
     FC3aModel fC_3a_model;
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.cpp b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.cpp
new file mode 100644
index 00000000000..5083d8c65c2
--- /dev/null
+++ b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.cpp
@@ -0,0 +1,43 @@
+/**
+ * \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
+ */
+
+#include "DarcyVelocity.h"
+
+namespace ProcessLib::TH2M
+{
+namespace ConstitutiveRelations
+{
+template <int DisplacementDim>
+void DarcyVelocityModel<DisplacementDim>::eval(
+    CapillaryPressureGradientData<DisplacementDim> const& grad_p_cap,
+    FluidDensityData const& fluid_density_data,
+    GasPressureGradientData<DisplacementDim> const& grad_p_GR,
+    PermeabilityData<DisplacementDim> const& permeability_data,
+    SpecificBodyForceData<DisplacementDim> const& specific_body_force,
+    ViscosityData const& viscosity_data,
+    DarcyVelocityData<DisplacementDim>& darcy_velocity_data) const
+{
+    auto const k_over_mu_G =
+        permeability_data.Ki * permeability_data.k_rel_G / viscosity_data.mu_GR;
+    auto const k_over_mu_L =
+        permeability_data.Ki * permeability_data.k_rel_L / viscosity_data.mu_LR;
+
+    darcy_velocity_data.w_GS =
+        k_over_mu_G * fluid_density_data.rho_GR * specific_body_force() -
+        k_over_mu_G * grad_p_GR();
+    darcy_velocity_data.w_LS =
+        k_over_mu_L * grad_p_cap() +
+        k_over_mu_L * fluid_density_data.rho_LR * specific_body_force() -
+        k_over_mu_L * grad_p_GR();
+}
+
+template struct DarcyVelocityModel<2>;
+template struct DarcyVelocityModel<3>;
+}  // namespace ConstitutiveRelations
+}  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h
index 84e66d31d02..91751b830f4 100644
--- a/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h
+++ b/ProcessLib/TH2M/ConstitutiveRelations/DarcyVelocity.h
@@ -10,7 +10,10 @@
 #pragma once
 
 #include "Base.h"
+#include "FluidDensity.h"
+#include "PermeabilityData.h"
 #include "ProcessLib/Reflection/ReflectionData.h"
+#include "Viscosity.h"
 
 namespace ProcessLib::TH2M
 {
@@ -32,5 +35,20 @@ struct DarcyVelocityData
             R::makeReflectionData("velocity_liquid", &Self::w_LS)};
     }
 };
+
+template <int DisplacementDim>
+struct DarcyVelocityModel
+{
+    void eval(CapillaryPressureGradientData<DisplacementDim> const& grad_p_cap,
+              FluidDensityData const& fluid_density_data,
+              GasPressureGradientData<DisplacementDim> const& grad_p_GR,
+              PermeabilityData<DisplacementDim> const& permeability_data,
+              SpecificBodyForceData<DisplacementDim> const& specific_body_force,
+              ViscosityData const& viscosity_data,
+              DarcyVelocityData<DisplacementDim>& darcy_velocity_data) const;
+};
+
+extern template struct DarcyVelocityModel<2>;
+extern template struct DarcyVelocityModel<3>;
 }  // namespace ConstitutiveRelations
 }  // namespace ProcessLib::TH2M
diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index cc118746435..c87165fd500 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -162,6 +162,10 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         GlobalDimVectorType const gradpGR = gradNp * gas_pressure;
         GlobalDimVectorType const gradpCap = gradNp * capillary_pressure;
         GlobalDimVectorType const gradT = gradNp * temperature;
+        ConstitutiveRelations::GasPressureGradientData<DisplacementDim> const
+            grad_p_GR{gradpGR};
+        ConstitutiveRelations::CapillaryPressureGradientData<
+            DisplacementDim> const grad_p_cap{gradpCap};
 
         // medium properties
         models.elastic_tangent_stiffness_model.eval({pos, t, dt}, T_data,
@@ -487,21 +491,15 @@ TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         // Derivatives for Jacobian
         // ---------------------------------------------------------------------
 
-        auto const& b = this->process_data_.specific_body_force;
-        GlobalDimMatrixType const k_over_mu_G =
-            ip_out.permeability_data.Ki * ip_out.permeability_data.k_rel_G /
-            ip_cv.viscosity_data.mu_GR;
-        GlobalDimMatrixType const k_over_mu_L =
-            ip_out.permeability_data.Ki * ip_out.permeability_data.k_rel_L /
-            ip_cv.viscosity_data.mu_LR;
-
-        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;
+        models.darcy_velocity_model.eval(
+            grad_p_cap,
+            ip_out.fluid_density_data,
+            grad_p_GR,
+            ip_out.permeability_data,
+            ConstitutiveRelations::SpecificBodyForceData<DisplacementDim>{
+                this->process_data_.specific_body_force},
+            ip_cv.viscosity_data,
+            ip_out.darcy_velocity_data);
 
         models.fT_2_model.eval(ip_out.darcy_velocity_data,
                                ip_out.enthalpy_data,
-- 
GitLab