OGS
GasPressureDependentPermeability.cpp
Go to the documentation of this file.
1 
13 
14 #include <cmath>
15 #include <limits>
16 
17 #include "BaseLib/Error.h"
18 #include "MaterialLib/MPL/Medium.h"
19 #include "MathLib/MathTools.h"
21 #include "ParameterLib/Parameter.h"
22 
23 namespace MaterialPropertyLib
24 {
25 template <int DisplacementDim>
28  std::string name, ParameterLib::Parameter<double> const& k0,
29  double const a1, double const a2, double const pressure_threshold,
30  double const minimum_permeability, double const maximum_permeability,
31  ParameterLib::CoordinateSystem const* const local_coordinate_system)
32  : k0_(k0),
33  a1_(a1),
34  a2_(a2),
35  pressure_threshold_(pressure_threshold),
36  minimum_permeability_(minimum_permeability),
37  maximum_permeability_(maximum_permeability),
38  local_coordinate_system_(local_coordinate_system)
39 {
40  name_ = std::move(name);
41 }
42 
43 template <int DisplacementDim>
45 {
46  if (!std::holds_alternative<Medium*>(scale_))
47  {
48  OGS_FATAL(
49  "The property 'GasPressureDependentPermeability' is implemented on "
50  "the 'medium' scale only.");
51  }
52 }
53 
54 template <int DisplacementDim>
56  VariableArray const& variable_array,
57  ParameterLib::SpatialPosition const& pos, double const t,
58  double const /*dt*/) const
59 {
60  double const gas_pressure = std::get<double>(
61  variable_array[static_cast<int>(Variable::phase_pressure)]);
62 
63  auto k_data = k0_(t, pos);
64 
65  double const factor =
66  (gas_pressure <= pressure_threshold_)
67  ? (1.0 + a1_ * gas_pressure / 1.0e6)
68  : (a2_ * (gas_pressure - pressure_threshold_) / 1.0e6 + 1.0 +
69  a1_ * pressure_threshold_ / 1.0e6);
70 
71  for (auto& k_i : k_data)
72  {
73  k_i = std::clamp(k_i * factor, minimum_permeability_,
74  maximum_permeability_);
75  }
76 
77  // Local coordinate transformation is only applied for the case that the
78  // initial intrinsic permeability is given with orthotropic assumption.
79  if (local_coordinate_system_ && (k_data.size() == DisplacementDim))
80  {
81  Eigen::Matrix<double, DisplacementDim, DisplacementDim> const e =
82  local_coordinate_system_->transformation<DisplacementDim>(pos);
83  Eigen::Matrix<double, DisplacementDim, DisplacementDim> k =
84  Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
85 
86  for (int i = 0; i < DisplacementDim; ++i)
87  {
88  Eigen::Matrix<double, DisplacementDim, DisplacementDim> const
89  ei_otimes_ei = e.col(i) * e.col(i).transpose();
90 
91  k += k_data[i] * ei_otimes_ei;
92  }
93  return k;
94  }
95 
96  return fromVector(k_data);
97 }
98 
99 template <int DisplacementDim>
101  VariableArray const& /*variable_array*/, Variable const /*variable*/,
102  ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
103  double const /*dt*/) const
104 {
105  OGS_FATAL(
106  "The derivative of the intrinsic permeability of "
107  "GasPressureDependentPermeability"
108  "is not implemented.");
109 }
110 
113 } // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition: Error.h:26
A gas pressure dependent intrinsic permeability model.
GasPressureDependentPermeability(std::string name, ParameterLib::Parameter< double > const &k0, double const a1, double const a2, double const pressure_threshold, double const minimum_permeability, double const maximum_permeability, ParameterLib::CoordinateSystem const *const local_coordinate_system)
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
virtual PropertyDataType value() const
Definition: Property.cpp:72
PropertyDataType fromVector(std::vector< double > const &values)
Definition: Property.cpp:23
std::variant< double, Eigen::Matrix< double, 2, 1 >, Eigen::Matrix< double, 3, 1 >, Eigen::Matrix< double, 2, 2 >, Eigen::Matrix< double, 3, 3 >, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 > > PropertyDataType
Definition: Property.h:35
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray
Definition: VariableType.h:108