From 3ac3e68958aa6b542437b0754486f58e33a982bc Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Thu, 26 Oct 2017 15:23:56 +0200
Subject: [PATCH] [MaterialLib] Create class Permeability using Parameter.

---
 .../CreatePorousMediaProperties.cpp           |  5 +-
 .../PorousMedium/Permeability/Permeability.h  | 81 +++++++++++++++++++
 .../Permeability/createPermeabilityModel.cpp  | 48 ++++++-----
 .../Permeability/createPermeabilityModel.h    | 13 ++-
 .../PorousMedium/PorousMediaProperties.cpp    |  5 +-
 .../PorousMedium/PorousMediaProperties.h      | 13 +--
 .../CreateTwoPhaseFlowMaterialProperties.cpp  |  5 +-
 .../TwoPhaseFlowWithPPMaterialProperties.cpp  |  9 ++-
 .../TwoPhaseFlowWithPPMaterialProperties.h    |  5 +-
 .../ComponentTransportFEM.h                   |  4 +-
 ProcessLib/HT/HTFEM.h                         |  9 ++-
 .../CreateLiquidFlowMaterialProperties.cpp    |  5 +-
 .../LiquidFlowMaterialProperties.cpp          |  5 +-
 .../LiquidFlow/LiquidFlowMaterialProperties.h |  7 +-
 .../CreatePorousMediaProperties.cpp           |  5 +-
 .../PorousMediaProperties.cpp                 |  5 +-
 .../PorousMediaProperties.h                   | 12 ++-
 .../RichardsComponentTransportFEM-impl.h      | 12 +--
 .../CreateRichardsFlowMaterialProperties.cpp  |  5 +-
 .../RichardsFlowMaterialProperties.cpp        | 12 +--
 .../RichardsFlowMaterialProperties.h          |  6 +-
 ...teTwoPhaseFlowWithPPMaterialProperties.cpp |  7 +-
 .../TwoPhaseFlowWithPPMaterialProperties.cpp  |  9 ++-
 .../TwoPhaseFlowWithPPMaterialProperties.h    |  5 +-
 ...eateTwoPhaseFlowPrhoMaterialProperties.cpp |  7 +-
 ...TwoPhaseFlowWithPrhoMaterialProperties.cpp |  9 ++-
 .../TwoPhaseFlowWithPrhoMaterialProperties.h  |  5 +-
 27 files changed, 219 insertions(+), 94 deletions(-)
 create mode 100644 MaterialLib/PorousMedium/Permeability/Permeability.h

diff --git a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
index d1743048401..13b27c6a5bd 100644
--- a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
+++ b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
@@ -33,7 +33,8 @@ PorousMediaProperties createPorousMediaProperties(
         //! \ogs_file_param{material__porous_medium__porous_medium}
         configs.getConfigSubtree("porous_medium");
 
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -62,7 +63,7 @@ PorousMediaProperties createPorousMediaProperties(
             porous_medium_config.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_config));
+                permeability_config, parameters));
 
         // Configuration for the specific storage.
         auto const& storage_config =
diff --git a/MaterialLib/PorousMedium/Permeability/Permeability.h b/MaterialLib/PorousMedium/Permeability/Permeability.h
new file mode 100644
index 00000000000..75c2fd700f6
--- /dev/null
+++ b/MaterialLib/PorousMedium/Permeability/Permeability.h
@@ -0,0 +1,81 @@
+/**
+ * \copyright
+ * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ * \file:   Permeability.h
+ *
+ */
+
+#pragma once
+
+#include <Eigen/Dense>
+
+#include "BaseLib/Error.h"
+#include "ProcessLib/Parameter/Parameter.h"
+
+namespace MaterialLib
+{
+namespace PorousMedium
+{
+/// The class implements a basic permeability model that employs a parameter
+/// (for instance a constant parameter or mesh cell dependend parameter) to fill
+/// the intrinsic permeability tensor.
+class Permeability
+{
+public:
+    explicit Permeability(
+        ProcessLib::Parameter<double> const& permeability_parameter,
+        int const dimension)
+        : _permeability_parameter(permeability_parameter), _dimension(dimension)
+    {
+        if (permeability_parameter.getNumberOfComponents() !=
+            _dimension * _dimension)
+        {
+            OGS_FATAL(
+                "The given parameter has %d components, but the permeability "
+                "tensor is defined for a %d dimensional problem.",
+                permeability_parameter.getNumberOfComponents(), _dimension);
+        }
+        _intrinsic_permeability_tensor =
+            Eigen::MatrixXd(_dimension, _dimension);
+    }
+
+    ~Permeability() = default;
+
+    /**
+     *  Get property value.
+     *  @param t point in time
+     *  @param pos spatial position
+     *  @param variable    A variable with any double type value.
+     *  @param temperature Temperature with any double type value.
+     */
+    Eigen::MatrixXd const& getValue(
+        const double t,
+        ProcessLib::SpatialPosition const& pos,
+        const double variable,
+        const double temperature) const
+    {
+        (void)variable;
+        (void)temperature;
+
+        _intrinsic_permeability_tensor =
+            Eigen::Map<Eigen::Matrix<double,
+                                     Eigen::Dynamic,
+                                     Eigen::Dynamic,
+                                     Eigen::RowMajor> const>(
+                _permeability_parameter(t, pos).data(), _dimension, _dimension);
+
+        return _intrinsic_permeability_tensor;
+    }
+
+private:
+    ProcessLib::Parameter<double> const& _permeability_parameter;
+    int const _dimension;
+    mutable Eigen::MatrixXd _intrinsic_permeability_tensor;
+};
+
+}  // end of namespace
+}  // end of namespace
diff --git a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
index 3927950dd2b..3b64875815d 100644
--- a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
+++ b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
@@ -18,39 +18,45 @@
 
 #include "BaseLib/Error.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
+#include "ProcessLib/Parameter/ConstantParameter.h"
+#include "ProcessLib/Parameter/SpatialPosition.h"
+#include "ProcessLib/Utils/ProcessUtils.h"
 
 namespace MaterialLib
 {
 namespace PorousMedium
 {
-Eigen::MatrixXd createPermeabilityModel(BaseLib::ConfigTree const& config)
+std::unique_ptr<Permeability> createPermeabilityModel(
+    BaseLib::ConfigTree const& config,
+    std::vector<std::unique_ptr<ProcessLib::ParameterBase>> const& parameters)
 {
-    auto const values =
-        //! \ogs_file_param{material__porous_medium__permeability__values}
-        config.getConfigParameter<std::vector<double>>("values");
+    //! \ogs_file_param{material__porous_medium__permeability__type}
+    auto const type = config.getConfigParameter<std::string>("type");
 
-    auto const data_size = values.size();
-
-    int dim = -1;
-    switch (data_size)
+    if (type == "Constant")
     {
-        case 1:
-            dim = 1;
-            break;
-        case 4:
-            dim = 2;
-            break;
-        case 9:
-            dim = 3;
-            break;
-        default:
+        auto const& permeability_parameter = ProcessLib::findParameter<double>(
+            config,
+            //! \ogs_file_param_special{material__porous_medium__permeability__permeability_tensor_entries}
+            "permeability_tensor_entries", parameters, 0);
+
+        int dimension = static_cast<int>(
+            std::sqrt(permeability_parameter.getNumberOfComponents()));
+        if (permeability_parameter.getNumberOfComponents() !=
+            dimension * dimension)
         {
             OGS_FATAL(
-                "Number of values for permeability tensor must be 1, 4 or 9.");
+                "The given parameter has %d components, but the permeability "
+                "tensor is defined for a %d dimensional problem.",
+                permeability_parameter.getNumberOfComponents(), dimension);
         }
-    }
 
-    return MathLib::toMatrix(values, dim, dim);
+        return std::make_unique<Permeability>(
+            permeability_parameter, dimension);
+    }
+    OGS_FATAL("The permeability type '%s' is unavailable.\n",
+              "The available types are \n\tConstant.",
+              type.data());
 }
 
 }  // end of namespace
diff --git a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h
index d7503a845d2..2979f7b8e58 100644
--- a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h
+++ b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.h
@@ -12,7 +12,9 @@
 
 #pragma once
 
-#include <Eigen/Dense>
+#include <memory>
+
+#include "Permeability.h"
 
 namespace BaseLib
 {
@@ -24,9 +26,14 @@ namespace MaterialLib
 namespace PorousMedium
 {
 /** Create a porosity model
- *  @param config  ConfigTree object has a tag of `<permeability>`
+ * @param config  ConfigTree object has a tag of `<permeability>` that
+ * describes the permeability relationsship and contains the name of the
+ * parameter
+ * @param parameters a vector containing the available parameters
  */
-Eigen::MatrixXd createPermeabilityModel(BaseLib::ConfigTree const& config);
+std::unique_ptr<Permeability> createPermeabilityModel(
+    BaseLib::ConfigTree const& config,
+    std::vector<std::unique_ptr<ProcessLib::ParameterBase>> const& parameters);
 
 }  // end of namespace
 }  // end of namespace
diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.cpp b/MaterialLib/PorousMedium/PorousMediaProperties.cpp
index c60da41fec6..b8cc5173804 100644
--- a/MaterialLib/PorousMedium/PorousMediaProperties.cpp
+++ b/MaterialLib/PorousMedium/PorousMediaProperties.cpp
@@ -28,10 +28,11 @@ MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity(
     return *_porosity_models[getMaterialID(pos)];
 }
 
-Eigen::MatrixXd const& PorousMediaProperties::getIntrinsicPermeability(
+MaterialLib::PorousMedium::Permeability const&
+PorousMediaProperties::getIntrinsicPermeability(
     double /*t*/, ProcessLib::SpatialPosition const& pos) const
 {
-    return _intrinsic_permeability_models[getMaterialID(pos)];
+    return *_intrinsic_permeability_models[getMaterialID(pos)];
 }
 
 MaterialLib::PorousMedium::Storage const&
diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.h b/MaterialLib/PorousMedium/PorousMediaProperties.h
index 8aa143fa7c9..0706df63c1b 100644
--- a/MaterialLib/PorousMedium/PorousMediaProperties.h
+++ b/MaterialLib/PorousMedium/PorousMediaProperties.h
@@ -16,7 +16,7 @@
 #include <Eigen/Dense>
 #include "BaseLib/reorderVector.h"
 
-
+#include "Permeability/Permeability.h"
 #include "Porosity/Porosity.h"
 #include "Storage/Storage.h"
 
@@ -33,7 +33,8 @@ public:
     PorousMediaProperties(
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
-        std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+            intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
             specific_storage_models,
         std::vector<int>&& material_ids)
@@ -47,7 +48,8 @@ public:
 
     PorousMediaProperties(PorousMediaProperties&& other)
         : _porosity_models(std::move(other._porosity_models)),
-          _intrinsic_permeability_models(other._intrinsic_permeability_models),
+          _intrinsic_permeability_models(
+              std::move(other._intrinsic_permeability_models)),
           _specific_storage_models(std::move(other._specific_storage_models)),
           _material_ids(other._material_ids)
     {
@@ -56,7 +58,7 @@ public:
     MaterialLib::PorousMedium::Porosity const& getPorosity(
         double t, ProcessLib::SpatialPosition const& pos) const;
 
-    Eigen::MatrixXd const& getIntrinsicPermeability(
+    MaterialLib::PorousMedium::Permeability const& getIntrinsicPermeability(
         double t, ProcessLib::SpatialPosition const& pos) const;
 
     MaterialLib::PorousMedium::Storage const& getSpecificStorage(
@@ -67,7 +69,8 @@ private:
 private:
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
-    std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
         _specific_storage_models;
     std::vector<int> _material_ids;
diff --git a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
index 1e9530be7ce..9e43b6c08d4 100644
--- a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
+++ b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
@@ -59,7 +59,8 @@ createTwoPhaseFlowMaterialProperties(
     // Get porous properties
     std::vector<int> mat_ids;
     std::vector<int> mat_krel_ids;
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -84,7 +85,7 @@ createTwoPhaseFlowMaterialProperties(
         auto const& permeability_conf = conf.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_conf));
+                permeability_conf, parameters));
 
         //! \ogs_file_param{material__twophase_flow__material_property__porous_medium__porous_medium__porosity}
         auto const& porosity_conf = conf.getConfigSubtree("porosity");
diff --git a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
index aea1ec6a530..42cb8cc46e1 100644
--- a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
@@ -35,7 +35,8 @@ TwoPhaseFlowWithPPMaterialProperties::TwoPhaseFlowWithPPMaterialProperties(
     std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& liquid_viscosity,
     std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& gas_density,
     std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& gas_viscosity,
-    std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+        intrinsic_permeability_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
         porosity_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
@@ -119,10 +120,10 @@ double TwoPhaseFlowWithPPMaterialProperties::getGasViscosity(
 }
 
 Eigen::MatrixXd const& TwoPhaseFlowWithPPMaterialProperties::getPermeability(
-    const int material_id, const double /*t*/,
-    const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const
+    const int material_id, const double t,
+    const ProcessLib::SpatialPosition& pos, const int /*dim*/) const
 {
-    return _intrinsic_permeability_models[material_id];
+    return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0, 0);
 }
 
 double TwoPhaseFlowWithPPMaterialProperties::getPorosity(
diff --git a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h
index a88b56bde92..4eeb6caa84b 100644
--- a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h
+++ b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.h
@@ -64,7 +64,7 @@ public:
             gas_density,
         std::unique_ptr<MaterialLib::Fluid::FluidProperty>&&
             gas_viscosity,
-        std::vector<Eigen::MatrixXd>&&
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
             intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
@@ -124,7 +124,8 @@ private:
     std::unique_ptr<MaterialLib::Fluid::FluidProperty> const _gas_density;
     std::unique_ptr<MaterialLib::Fluid::FluidProperty> const _gas_viscosity;
 
-    std::vector<Eigen::MatrixXd> const _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> const
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> const
         _porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> const
diff --git a/ProcessLib/ComponentTransport/ComponentTransportFEM.h b/ProcessLib/ComponentTransport/ComponentTransportFEM.h
index 65ed5b0a8aa..f68dc8ece73 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportFEM.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportFEM.h
@@ -204,7 +204,7 @@ public:
 
             auto const& K =
                 _process_data.porous_media_properties.getIntrinsicPermeability(
-                    t, pos);
+                    t, pos).getValue(t, pos, 0.0, 0.0);
             // Use the viscosity model to compute the viscosity
             auto const mu = _process_data.fluid_properties->getValue(
                 MaterialLib::Fluid::FluidPropertyType::Viscosity, vars);
@@ -289,7 +289,7 @@ public:
 
             auto const& K =
                 _process_data.porous_media_properties.getIntrinsicPermeability(
-                    t, pos);
+                    t, pos).getValue(t, pos, 0.0, 0.0);
             auto const mu = _process_data.fluid_properties->getValue(
                 MaterialLib::Fluid::FluidPropertyType::Viscosity, vars);
             GlobalDimMatrixType const K_over_mu = K / mu;
diff --git a/ProcessLib/HT/HTFEM.h b/ProcessLib/HT/HTFEM.h
index 0bf467662fd..31bd9d10d02 100644
--- a/ProcessLib/HT/HTFEM.h
+++ b/ProcessLib/HT/HTFEM.h
@@ -172,9 +172,6 @@ public:
             auto const specific_storage =
                 _process_data.porous_media_properties.getSpecificStorage(t, pos)
                     .getValue(0.0);
-            auto const intrinsic_permeability =
-                _process_data.porous_media_properties.getIntrinsicPermeability(
-                    t, pos);
 
             auto const thermal_conductivity_solid =
                 _process_data.thermal_conductivity_solid(t, pos)[0];
@@ -197,6 +194,10 @@ public:
                 _process_data.porous_media_properties.getPorosity(t, pos)
                     .getValue(t, pos, 0.0, T_int_pt);
 
+            auto const intrinsic_permeability =
+                _process_data.porous_media_properties.getIntrinsicPermeability(
+                    t, pos).getValue(t, pos, 0.0, T_int_pt);
+
             double const thermal_conductivity =
                 thermal_conductivity_solid * (1 - porosity) +
                  thermal_conductivity_fluid * porosity;
@@ -318,7 +319,7 @@ public:
 
             auto const K =
                 _process_data.porous_media_properties.getIntrinsicPermeability(
-                    t, pos);
+                    t, pos).getValue(t, pos, 0.0, T_int_pt);
 
             auto const mu = _process_data.fluid_properties->getValue(
                 MaterialLib::Fluid::FluidPropertyType::Viscosity, vars);
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
index c55cba5e82f..5ac06dc06d7 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
@@ -51,7 +51,8 @@ createLiquidFlowMaterialProperties(
         MaterialLib::Fluid::createFluidProperties(fluid_config);
 
     // Get porous properties
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -75,7 +76,7 @@ createLiquidFlowMaterialProperties(
             porous_medium_config.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_config));
+                permeability_config, parameters));
 
         auto const& porosity_config =
             //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property__porous_medium__porous_medium__porosity}
diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
index e8f54f5dc47..a6297371edc 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
+++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
@@ -118,10 +118,11 @@ double LiquidFlowMaterialProperties::getMassCoefficient(
 }
 
 Eigen::MatrixXd const& LiquidFlowMaterialProperties::getPermeability(
-    const int material_id, const double /*t*/, const SpatialPosition& /*pos*/,
+    const int material_id, const double t, const SpatialPosition& pos,
     const int /*dim*/) const
 {
-    return _intrinsic_permeability_models[material_id];
+    return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0,
+                                                                 0.0);
 }
 
 double LiquidFlowMaterialProperties::getSolidThermalExpansion(
diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
index 59f2d718717..8145d0bd743 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
@@ -20,6 +20,7 @@
 #include "MaterialLib/Fluid/FluidProperties/FluidProperties.h"
 
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
+#include "MaterialLib/PorousMedium/Permeability/Permeability.h"
 #include "MaterialLib/PorousMedium/Storage/Storage.h"
 
 namespace MaterialLib
@@ -61,7 +62,8 @@ public:
 
     LiquidFlowMaterialProperties(
         std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties,
-        std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+            intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
@@ -146,7 +148,8 @@ private:
     const std::unique_ptr<MaterialLib::Fluid::FluidProperties>
         _fluid_properties;
 
-    const std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
     const std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
diff --git a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp
index 032e078c643..94ff92b4d3c 100644
--- a/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp
+++ b/ProcessLib/RichardsComponentTransport/CreatePorousMediaProperties.cpp
@@ -31,7 +31,8 @@ PorousMediaProperties createPorousMediaProperties(
 {
     DBUG("Create PorousMediaProperties.");
 
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -65,7 +66,7 @@ PorousMediaProperties createPorousMediaProperties(
             porous_medium_config.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_config));
+                permeability_config, parameters));
 
         // Configuration for the specific storage.
         auto const& storage_config =
diff --git a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp
index c89ce7c999e..9afd76ad7a4 100644
--- a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp
+++ b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.cpp
@@ -27,10 +27,11 @@ MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity(
     return *_porosity_models[getMaterialID(pos)];
 }
 
-Eigen::MatrixXd const& PorousMediaProperties::getIntrinsicPermeability(
+MaterialLib::PorousMedium::Permeability const&
+PorousMediaProperties::getIntrinsicPermeability(
     double /*t*/, SpatialPosition const& pos) const
 {
-    return _intrinsic_permeability_models[getMaterialID(pos)];
+    return *_intrinsic_permeability_models[getMaterialID(pos)];
 }
 
 MaterialLib::PorousMedium::Storage const&
diff --git a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h
index 6b538c77133..1c49d089a74 100644
--- a/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h
+++ b/ProcessLib/RichardsComponentTransport/PorousMediaProperties.h
@@ -16,6 +16,7 @@
 #include <Eigen/Dense>
 #include "BaseLib/reorderVector.h"
 
+#include "MaterialLib/PorousMedium/Permeability/Permeability.h"
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
 #include "MaterialLib/PorousMedium/Storage/Storage.h"
 #include "MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h"
@@ -34,7 +35,8 @@ public:
     PorousMediaProperties(
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
-        std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+            intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
             specific_storage_models,
         std::vector<std::unique_ptr<
@@ -58,7 +60,8 @@ public:
 
     PorousMediaProperties(PorousMediaProperties&& other)
         : _porosity_models(std::move(other._porosity_models)),
-          _intrinsic_permeability_models(other._intrinsic_permeability_models),
+          _intrinsic_permeability_models(
+              std::move(other._intrinsic_permeability_models)),
           _specific_storage_models(std::move(other._specific_storage_models)),
           _capillary_pressure_saturation_models(
               std::move(other._capillary_pressure_saturation_models)),
@@ -71,7 +74,7 @@ public:
     MaterialLib::PorousMedium::Porosity const& getPorosity(
         double t, SpatialPosition const& pos) const;
 
-    Eigen::MatrixXd const& getIntrinsicPermeability(
+    MaterialLib::PorousMedium::Permeability const& getIntrinsicPermeability(
         double t, SpatialPosition const& pos) const;
 
     MaterialLib::PorousMedium::Storage const& getSpecificStorage(
@@ -89,7 +92,8 @@ private:
 private:
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
-    std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
         _specific_storage_models;
     std::vector<
diff --git a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
index fc42d20c110..9c71041cc35 100644
--- a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
+++ b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
@@ -155,9 +155,9 @@ void LocalAssemblerData<ShapeFunction, IntegrationMethod, GlobalDim>::assemble(
         auto const& molecular_diffusion_coefficient =
             _process_data.molecular_diffusion_coefficient(t, pos)[0];
 
-        auto const& K =
-            _process_data.porous_media_properties.getIntrinsicPermeability(t,
-                                                                           pos);
+        auto const& K = _process_data.porous_media_properties
+                            .getIntrinsicPermeability(t, pos)
+                            .getValue(t, pos, 0.0, 0.0);
         auto const& k_rel = _process_data.porous_media_properties
                                 .getRelativePermeability(t, pos)
                                 .getValue(Sw);
@@ -246,9 +246,9 @@ LocalAssemblerData<ShapeFunction, IntegrationMethod, GlobalDim>::
 
         pos.setIntegrationPoint(ip);
 
-        auto const& K =
-            _process_data.porous_media_properties.getIntrinsicPermeability(t,
-                                                                           pos);
+        auto const& K = _process_data.porous_media_properties
+                            .getIntrinsicPermeability(t, pos)
+                            .getValue(t, pos, 0.0, 0.0);
         auto const mu = _process_data.fluid_properties->getValue(
             MaterialLib::Fluid::FluidPropertyType::Viscosity, vars);
 
diff --git a/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp b/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp
index 291851eef74..7bc235f5e31 100644
--- a/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp
+++ b/ProcessLib/RichardsFlow/CreateRichardsFlowMaterialProperties.cpp
@@ -49,7 +49,8 @@ createRichardsFlowMaterialProperties(
     // Get porous properties
     std::vector<int> mat_ids;
     std::vector<int> mat_krel_ids;
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -74,7 +75,7 @@ createRichardsFlowMaterialProperties(
         auto const& permeability_conf = conf.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_conf));
+                permeability_conf, parameters));
 
         //! \ogs_file_param{prj__processes__process__RICHARDS_FLOW__material_property__porous_medium__porous_medium__porosity}
         auto const& porosity_conf = conf.getConfigSubtree("porosity");
diff --git a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp
index e9c8b6e613e..8ca45d945dd 100644
--- a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp
+++ b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.cpp
@@ -31,7 +31,8 @@ namespace RichardsFlow
 RichardsFlowMaterialProperties::RichardsFlowMaterialProperties(
     boost::optional<MeshLib::PropertyVector<int> const&> const material_ids,
     std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties,
-    std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+        intrinsic_permeability_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
         porosity_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
@@ -44,7 +45,7 @@ RichardsFlowMaterialProperties::RichardsFlowMaterialProperties(
         relative_permeability_models)
     : _material_ids(material_ids),
       _fluid_properties(std::move(fluid_properties)),
-      _intrinsic_permeability_models(intrinsic_permeability_models),
+      _intrinsic_permeability_models(std::move(intrinsic_permeability_models)),
       _porosity_models(std::move(porosity_models)),
       _storage_models(std::move(storage_models)),
       _capillary_pressure_models(std::move(capillary_pressure_models)),
@@ -85,10 +86,11 @@ double RichardsFlowMaterialProperties::getFluidViscosity(const double p,
 }
 
 Eigen::MatrixXd const& RichardsFlowMaterialProperties::getPermeability(
-    const int material_id, const double /*t*/,
-    const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const
+    const int material_id, const double t,
+    const ProcessLib::SpatialPosition& pos, const int /*dim*/) const
 {
-    return _intrinsic_permeability_models[material_id];
+    return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0,
+                                                                 0.0);
 }
 
 double RichardsFlowMaterialProperties::getPorosity(
diff --git a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h
index cf6db124c52..71eb46151d3 100644
--- a/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h
+++ b/ProcessLib/RichardsFlow/RichardsFlowMaterialProperties.h
@@ -51,7 +51,8 @@ public:
     RichardsFlowMaterialProperties(
         boost::optional<MeshLib::PropertyVector<int> const&> const material_ids,
         std::unique_ptr<MaterialLib::Fluid::FluidProperties>&& fluid_properties,
-        std::vector<Eigen::MatrixXd>&& intrinsic_permeability_models,
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
+            intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
@@ -104,7 +105,8 @@ private:
     const std::unique_ptr<MaterialLib::Fluid::FluidProperties>
         _fluid_properties;
 
-    std::vector<Eigen::MatrixXd> const _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>> const
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>> const
         _porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>> const
diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp
index 1dbd72700e2..bf88de94c1c 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPMaterialProperties.cpp
@@ -58,7 +58,8 @@ createTwoPhaseFlowWithPPMaterialProperties(
     // Get porous properties
     std::vector<int> mat_ids;
     std::vector<int> mat_krel_ids;
-    std::vector<Eigen::MatrixXd> intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -83,7 +84,7 @@ createTwoPhaseFlowWithPPMaterialProperties(
         auto const& permeability_conf = conf.getConfigSubtree("permeability");
         intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_conf));
+                permeability_conf, parameters));
 
         //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PP__material_property__porous_medium__porous_medium__porosity}
         auto const& porosity_conf = conf.getConfigSubtree("porosity");
@@ -130,7 +131,7 @@ createTwoPhaseFlowWithPPMaterialProperties(
     return std::make_unique<TwoPhaseFlowWithPPMaterialProperties>(
         material_ids, std::move(liquid_density), std::move(liquid_viscosity),
         std::move(gas_density), std::move(gas_viscosity),
-        intrinsic_permeability_models, std::move(porosity_models),
+        std::move(intrinsic_permeability_models), std::move(porosity_models),
         std::move(storage_models), std::move(capillary_pressure_models),
         std::move(relative_permeability_models));
 }
diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp
index 457d78de520..f376df17324 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.cpp
@@ -37,7 +37,7 @@ TwoPhaseFlowWithPPMaterialProperties::TwoPhaseFlowWithPPMaterialProperties(
         gas_density,
     std::unique_ptr<MaterialLib::Fluid::FluidProperty>
         gas_viscosity,
-    std::vector<Eigen::MatrixXd>
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
         intrinsic_permeability_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
         porosity_models,
@@ -122,10 +122,11 @@ double TwoPhaseFlowWithPPMaterialProperties::getGasViscosity(
 }
 
 Eigen::MatrixXd const& TwoPhaseFlowWithPPMaterialProperties::getPermeability(
-    const int material_id, const double /*t*/,
-    const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const
+    const int material_id, const double t,
+    const ProcessLib::SpatialPosition& pos, const int /*dim*/) const
 {
-    return _intrinsic_permeability_models[material_id];
+    return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0,
+                                                                 0.0);
 }
 
 double TwoPhaseFlowWithPPMaterialProperties::getPorosity(
diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h
index fd3b0657d01..510e8d4dd59 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h
+++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPMaterialProperties.h
@@ -55,7 +55,7 @@ public:
             gas_density,
         std::unique_ptr<MaterialLib::Fluid::FluidProperty>
             gas_viscosity,
-        std::vector<Eigen::MatrixXd>
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
             intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
@@ -112,7 +112,8 @@ protected:
     */
     boost::optional<MeshLib::PropertyVector<int> const&> const _material_ids;
 
-    std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
diff --git a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
index c28e8116b70..5383548d5a5 100644
--- a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
@@ -58,7 +58,8 @@ createTwoPhaseFlowPrhoMaterialProperties(
     // Get porous properties
     std::vector<int> mat_ids;
     std::vector<int> mat_krel_ids;
-    std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
@@ -83,7 +84,7 @@ createTwoPhaseFlowPrhoMaterialProperties(
         auto const& permeability_conf = conf.getConfigSubtree("permeability");
         _intrinsic_permeability_models.emplace_back(
             MaterialLib::PorousMedium::createPermeabilityModel(
-                permeability_conf));
+                permeability_conf, parameters));
 
         //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_PRHO__material_property__porous_medium__porous_medium__porosity}
         auto const& porosity_conf = conf.getConfigSubtree("porosity");
@@ -130,7 +131,7 @@ createTwoPhaseFlowPrhoMaterialProperties(
     return std::make_unique<TwoPhaseFlowWithPrhoMaterialProperties>(
         material_ids, std::move(_liquid_density), std::move(_viscosity),
         std::move(_gas_density), std::move(_gas_viscosity),
-        _intrinsic_permeability_models, std::move(_porosity_models),
+        std::move(_intrinsic_permeability_models), std::move(_porosity_models),
         std::move(_storage_models), std::move(_capillary_pressure_models),
         std::move(_relative_permeability_models));
 }
diff --git a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
index 2f635f90521..6554bcbdb2c 100644
--- a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
@@ -42,7 +42,7 @@ TwoPhaseFlowWithPrhoMaterialProperties::TwoPhaseFlowWithPrhoMaterialProperties(
         gas_density,
     std::unique_ptr<MaterialLib::Fluid::FluidProperty>
         gas_viscosity,
-    std::vector<Eigen::MatrixXd>
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
         intrinsic_permeability_models,
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
         porosity_models,
@@ -127,10 +127,11 @@ double TwoPhaseFlowWithPrhoMaterialProperties::getGasViscosity(
 }
 
 Eigen::MatrixXd const& TwoPhaseFlowWithPrhoMaterialProperties::getPermeability(
-    const int material_id, const double /*t*/,
-    const ProcessLib::SpatialPosition& /*pos*/, const int /*dim*/) const
+    const int material_id, const double t,
+    const ProcessLib::SpatialPosition& pos, const int /*dim*/) const
 {
-    return _intrinsic_permeability_models[material_id];
+    return _intrinsic_permeability_models[material_id]->getValue(t, pos, 0.0,
+                                                                 0.0);
 }
 
 double TwoPhaseFlowWithPrhoMaterialProperties::getPorosity(
diff --git a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h
index 5566d363867..295c88390a9 100644
--- a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h
+++ b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.h
@@ -48,7 +48,7 @@ public:
             gas_density,
         std::unique_ptr<MaterialLib::Fluid::FluidProperty>
             gas_viscosity,
-        std::vector<Eigen::MatrixXd>
+        std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>&&
             intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>&&
             porosity_models,
@@ -119,7 +119,8 @@ protected:
     */
     boost::optional<MeshLib::PropertyVector<int> const&> const _material_ids;
 
-    std::vector<Eigen::MatrixXd> _intrinsic_permeability_models;
+    std::vector<std::unique_ptr<MaterialLib::PorousMedium::Permeability>>
+        _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Porosity>>
         _porosity_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
-- 
GitLab