OGS
StrainDependentPermeability.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <cmath>
7#include <limits>
8
9#include "BaseLib/Error.h"
11#include "MathLib/MathTools.h"
14
15namespace MaterialPropertyLib
16{
17template <int DisplacementDim>
19 std::string name, ParameterLib::Parameter<double> const& k0,
20 double const b1, double const b2, double const b3,
21 double const minimum_permeability, double const maximum_permeability,
22 ParameterLib::CoordinateSystem const* const local_coordinate_system)
23 : k0_(k0),
24 b1_(b1),
25 b2_(b2),
26 b3_(b3),
27 minimum_permeability_(minimum_permeability),
28 maximum_permeability_(maximum_permeability),
29 local_coordinate_system_(local_coordinate_system)
30{
31 name_ = std::move(name);
32}
33
34template <int DisplacementDim>
36{
37 if (!std::holds_alternative<Medium*>(scale_))
38 {
40 "The property 'StrainDependentPermeability' is "
41 "implemented on the 'medium' scale only.");
42 }
43}
44
45template <int DisplacementDim>
47 VariableArray const& variable_array,
48 ParameterLib::SpatialPosition const& pos, double const t,
49 double const /*dt*/) const
50{
51 double const e_vol = variable_array.volumetric_strain;
52 double const e_vol_pls = variable_array.equivalent_plastic_strain;
53
54 auto k_data = k0_(t, pos);
55
56 double const ten_base_exponent = e_vol > 0.0 ? b3_ * e_vol : b2_ * e_vol;
57 double const factor =
58 std::pow(10.0, ten_base_exponent) * std::exp(b1_ * e_vol_pls);
59
60 for (auto& k_i : k_data)
61 {
62 k_i = std::clamp(k_i * factor, minimum_permeability_,
64 }
65
66 // Local coordinate transformation is only applied for the case that the
67 // initial intrinsic permeability is given with orthotropic assumption.
68 if (local_coordinate_system_ && (k_data.size() == DisplacementDim))
69 {
70 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const e =
71 local_coordinate_system_->transformation<DisplacementDim>(pos);
72 Eigen::Matrix<double, DisplacementDim, DisplacementDim> k =
73 Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
74
75 for (int i = 0; i < DisplacementDim; ++i)
76 {
77 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const
78 ei_otimes_ei = e.col(i) * e.col(i).transpose();
79
80 k += k_data[i] * ei_otimes_ei;
81 }
82 return k;
83 }
84
85 return fromVector(k_data);
86}
87
88template <int DisplacementDim>
90 VariableArray const& /*variable_array*/, Variable const variable,
91 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
92 double const /*dt*/) const
93{
94 if (variable == Variable::mechanical_strain)
95 {
96 return 0.;
97 }
98
100 "The derivative of the intrinsic permeability of "
101 "StrainDependentPermeabilityis not implemented.");
102}
103template class StrainDependentPermeability<2>;
104template class StrainDependentPermeability<3>;
105} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
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)
ParameterLib::Parameter< double > const & k0_
Initial intrinsic 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)
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 >, Eigen::MatrixXd > PropertyDataType
A local coordinate system used for tensor transformations.