OGS
StrainDependentPermeability.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>
27  std::string name, ParameterLib::Parameter<double> const& k0,
28  double const b1, double const b2, double const b3,
29  double const minimum_permeability, double const maximum_permeability,
30  ParameterLib::CoordinateSystem const* const local_coordinate_system)
31  : k0_(k0),
32  b1_(b1),
33  b2_(b2),
34  b3_(b3),
35  minimum_permeability_(minimum_permeability),
36  maximum_permeability_(maximum_permeability),
37  local_coordinate_system_(local_coordinate_system)
38 {
39  name_ = std::move(name);
40 }
41 
42 template <int DisplacementDim>
44 {
45  if (!std::holds_alternative<Medium*>(scale_))
46  {
47  OGS_FATAL(
48  "The property 'StrainDependentPermeability' is "
49  "implemented on the 'medium' scale only.");
50  }
51 }
52 
53 template <int DisplacementDim>
55  VariableArray const& variable_array,
56  ParameterLib::SpatialPosition const& pos, double const t,
57  double const /*dt*/) const
58 {
59  double const e_vol = std::get<double>(
60  variable_array[static_cast<int>(Variable::volumetric_strain)]);
61  double const e_vol_pls = std::get<double>(
62  variable_array[static_cast<int>(Variable::equivalent_plastic_strain)]);
63 
64  auto k_data = k0_(t, pos);
65 
66  double const ten_base_exponent = e_vol > 0.0 ? b3_ * e_vol : b2_ * e_vol;
67  double const factor =
68  std::pow(10.0, ten_base_exponent) * std::exp(b1_ * e_vol_pls);
69 
70  for (auto& k_i : k_data)
71  {
72  k_i = std::clamp(k_i * factor, minimum_permeability_,
73  maximum_permeability_);
74  }
75 
76  // Local coordinate transformation is only applied for the case that the
77  // initial intrinsic permeability is given with orthotropic assumption.
78  if (local_coordinate_system_ && (k_data.size() == DisplacementDim))
79  {
80  Eigen::Matrix<double, DisplacementDim, DisplacementDim> const e =
81  local_coordinate_system_->transformation<DisplacementDim>(pos);
82  Eigen::Matrix<double, DisplacementDim, DisplacementDim> k =
83  Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
84 
85  for (int i = 0; i < DisplacementDim; ++i)
86  {
87  Eigen::Matrix<double, DisplacementDim, DisplacementDim> const
88  ei_otimes_ei = e.col(i) * e.col(i).transpose();
89 
90  k += k_data[i] * ei_otimes_ei;
91  }
92  return k;
93  }
94 
95  return fromVector(k_data);
96 }
97 
98 template <int DisplacementDim>
100  VariableArray const& /*variable_array*/, Variable const variable,
101  ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
102  double const /*dt*/) const
103 {
104  if (variable == Variable::mechanical_strain)
105  {
106  return 0.;
107  }
108 
109  OGS_FATAL(
110  "The derivative of the intrinsic permeability of "
111  "StrainDependentPermeabilityis not implemented.");
112 }
113 template class StrainDependentPermeability<2>;
114 template class StrainDependentPermeability<3>;
115 } // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition: Error.h:26
virtual PropertyDataType value() const
Definition: Property.cpp:72
A strain dependent intrinsic permeability model.
StrainDependentPermeability(std::string name, ParameterLib::Parameter< double > const &k0, double const b1, double const b2, double const b3, 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
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