OGS
GasPressureDependentPermeability.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>
20 std::string name, ParameterLib::Parameter<double> const& k0,
21 double const a1, double const a2, double const pressure_threshold,
22 double const minimum_permeability, double const maximum_permeability,
23 ParameterLib::CoordinateSystem const* const local_coordinate_system)
24 : k0_(k0),
25 a1_(a1),
26 a2_(a2),
27 pressure_threshold_(pressure_threshold),
28 minimum_permeability_(minimum_permeability),
29 maximum_permeability_(maximum_permeability),
30 local_coordinate_system_(local_coordinate_system)
31{
32 name_ = std::move(name);
33}
34
35template <int DisplacementDim>
37{
38 if (!std::holds_alternative<Medium*>(scale_))
39 {
41 "The property 'GasPressureDependentPermeability' is implemented on "
42 "the 'medium' scale only.");
43 }
44}
45
46template <int DisplacementDim>
48 VariableArray const& variable_array,
49 ParameterLib::SpatialPosition const& pos, double const t,
50 double const /*dt*/) const
51{
52 double const gas_pressure = variable_array.gas_phase_pressure;
53
54 auto k_data = k0_(t, pos);
55
56 double const factor =
57 (gas_pressure <= pressure_threshold_)
58 ? (1.0 + a1_ * gas_pressure / 1.0e6)
59 : (a2_ * (gas_pressure - pressure_threshold_) / 1.0e6 + 1.0 +
60 a1_ * pressure_threshold_ / 1.0e6);
61
62 for (auto& k_i : k_data)
63 {
64 k_i = std::clamp(k_i * factor, minimum_permeability_,
66 }
67
68 // Local coordinate transformation is only applied for the case that the
69 // initial intrinsic permeability is given with orthotropic assumption.
70 if (local_coordinate_system_ && (k_data.size() == DisplacementDim))
71 {
72 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const e =
73 local_coordinate_system_->transformation<DisplacementDim>(pos);
74 Eigen::Matrix<double, DisplacementDim, DisplacementDim> k =
75 Eigen::Matrix<double, DisplacementDim, DisplacementDim>::Zero();
76
77 for (int i = 0; i < DisplacementDim; ++i)
78 {
79 Eigen::Matrix<double, DisplacementDim, DisplacementDim> const
80 ei_otimes_ei = e.col(i) * e.col(i).transpose();
81
82 k += k_data[i] * ei_otimes_ei;
83 }
84 return k;
85 }
86
87 return fromVector(k_data);
88}
89
90template <int DisplacementDim>
92 VariableArray const& /*variable_array*/, Variable const /*variable*/,
93 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
94 double const /*dt*/) const
95{
97 "The derivative of the intrinsic permeability of "
98 "GasPressureDependentPermeability"
99 "is not implemented.");
100}
101
104} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
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)
ParameterLib::Parameter< double > const & k0_
Initial intrinsic permeability.
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
ParameterLib::CoordinateSystem const *const local_coordinate_system_
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
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.