From 0737e022c0e1a2e1cd97ecafc3be0e93c3320ecf Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Tue, 5 Jul 2022 13:24:35 +0200
Subject: [PATCH] [PL] Added constitutive model/data: Permeability

---
 .../Constitutive/Permeability.cpp             | 90 +++++++++++++++++++
 .../Constitutive/Permeability.h               | 44 +++++++++
 2 files changed, 134 insertions(+)
 create mode 100644 ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.cpp
 create mode 100644 ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.h

diff --git a/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.cpp b/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.cpp
new file mode 100644
index 00000000000..82f30329450
--- /dev/null
+++ b/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.cpp
@@ -0,0 +1,90 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2022, 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 "Permeability.h"
+
+#include "MaterialLib/MPL/Utils/FormEigenTensor.h"
+
+namespace ProcessLib::ThermoRichardsMechanics
+{
+template <int DisplacementDim>
+void PermeabilityModel<DisplacementDim>::eval(
+    SpaceTimeData const& x_t, MediaData const& media_data,
+    SaturationData const& S_L_data,
+    TemperatureData<DisplacementDim> const& T_data,
+    PorosityData const& poro_data, LiquidViscosityData const& mu_L_data,
+    PorosityData& transport_poro_data,
+    PorosityData const& transport_poro_data_prev,
+    SolidMechanicsDataStateless<DisplacementDim> const& s_mech_data,
+    PermeabilityData<DisplacementDim>& out) const
+{
+    namespace MPL = MaterialPropertyLib;
+
+    auto const& medium = media_data.medium;
+
+    MPL::VariableArray variables;
+    variables[static_cast<int>(MPL::Variable::liquid_saturation)] =
+        S_L_data.S_L;
+    variables[static_cast<int>(MPL::Variable::temperature)] = T_data.T;
+    MPL::VariableArray variables_prev;
+
+    if (medium.hasProperty(MPL::PropertyType::transport_porosity))
+    {
+        // Used in
+        // MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
+        variables_prev[static_cast<int>(MPL::Variable::transport_porosity)] =
+            transport_poro_data_prev.phi;
+
+        transport_poro_data.phi =
+            medium.property(MPL::PropertyType::transport_porosity)
+                .template value<double>(variables, variables_prev, x_t.x, x_t.t,
+                                        x_t.dt);
+        variables[static_cast<int>(MPL::Variable::transport_porosity)] =
+            transport_poro_data.phi;
+    }
+    else
+    {
+        variables[static_cast<int>(MPL::Variable::transport_porosity)] =
+            poro_data.phi;
+    }
+
+    out.k_rel = medium.property(MPL::PropertyType::relative_permeability)
+                    .template value<double>(variables, x_t.x, x_t.t, x_t.dt);
+    out.dk_rel_dS_L =
+        medium.property(MPL::PropertyType::relative_permeability)
+            .template dValue<double>(variables,
+                                     MPL::Variable::liquid_saturation,
+                                     x_t.x,
+                                     x_t.t,
+                                     x_t.dt);
+
+    // For stress dependent permeability.
+    using SymmetricTensor =
+        KelvinVector<DisplacementDim>;  // same data type, but different
+                                        // semantics
+    variables[static_cast<int>(MPL::Variable::total_stress)]
+        .emplace<SymmetricTensor>(
+            MathLib::KelvinVector::kelvinVectorToSymmetricTensor(
+                s_mech_data.sigma_total));
+
+    variables[static_cast<int>(
+        MaterialPropertyLib::Variable::equivalent_plastic_strain)] =
+        s_mech_data.equivalent_plastic_strain;
+
+    auto const K_intrinsic = MPL::formEigenTensor<DisplacementDim>(
+        medium.property(MPL::PropertyType::permeability)
+            .value(variables, x_t.x, x_t.t, x_t.dt));
+
+    out.Ki_over_mu = K_intrinsic / mu_L_data.viscosity;
+}
+
+template struct PermeabilityModel<2>;
+template struct PermeabilityModel<3>;
+}  // namespace ProcessLib::ThermoRichardsMechanics
diff --git a/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.h b/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.h
new file mode 100644
index 00000000000..c1cd17a2aba
--- /dev/null
+++ b/ProcessLib/ThermoRichardsMechanics/Constitutive/Permeability.h
@@ -0,0 +1,44 @@
+/**
+ * \file
+ * \copyright
+ * Copyright (c) 2012-2022, 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 "LiquidViscosity.h"
+#include "Porosity.h"
+#include "SolidMechanics.h"
+
+namespace ProcessLib::ThermoRichardsMechanics
+{
+template <int DisplacementDim>
+struct PermeabilityData
+{
+    double k_rel;
+    double dk_rel_dS_L;
+    GlobalDimMatrix<DisplacementDim> Ki_over_mu;
+};
+
+template <int DisplacementDim>
+struct PermeabilityModel
+{
+    void eval(SpaceTimeData const& x_t, MediaData const& media_data,
+              SaturationData const& S_L_data,
+              TemperatureData<DisplacementDim> const& T_data,
+              PorosityData const& poro_data,
+              LiquidViscosityData const& mu_L_data,
+              // TODO evaluate transport porosity evolution separately
+              PorosityData& transport_poro_data,
+              PorosityData const& transport_poro_data_prev,
+              SolidMechanicsDataStateless<DisplacementDim> const& s_mech_data,
+              PermeabilityData<DisplacementDim>& out) const;
+};
+
+extern template struct PermeabilityModel<2>;
+extern template struct PermeabilityModel<3>;
+}  // namespace ProcessLib::ThermoRichardsMechanics
-- 
GitLab