OGS
RelPermGeneralizedPowerNonwettingPhase.cpp
Go to the documentation of this file.
1
12
13#include <cmath>
14
16
17namespace MaterialPropertyLib
18{
20 std::string name,
21 const double residual_liquid_saturation,
22 const double residual_gas_saturation,
23 const double min_relative_permeability,
24 const double a,
25 const double lambda)
26 : residual_liquid_saturation_(residual_liquid_saturation),
27 residual_gas_saturation_(residual_gas_saturation),
28 min_relative_permeability_(min_relative_permeability),
29 a_(a),
30 lambda_(lambda)
31{
32 name_ = std::move(name);
33}
34
36 VariableArray const& variable_array,
37 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
38 double const /*dt*/) const
39{
40 const double S_L = variable_array.liquid_saturation;
41
42 if (std::isnan(S_L))
43 {
45 "In RelPermGeneralizedPowerNonwettingPhase::value, the liquid "
46 "saturation is "
47 "NaN.");
48 }
49
50 auto const S_L_res = residual_liquid_saturation_;
51 auto const S_L_max = 1. - residual_gas_saturation_;
52
53 auto const S_e = (S_L - S_L_res) / (S_L_max - S_L_res);
54
55 if (S_e >= 1.0)
56 {
57 // fully saturated medium
59 }
60 if (S_e <= 0.0)
61 {
62 // dry medium
63 return a_;
64 }
65
66 auto const S_e_g = (1. - S_e);
67
68 return a_ * std::pow(S_e_g, lambda_);
69}
71 VariableArray const& variable_array, Variable const variable,
72 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
73 double const /*dt*/) const
74{
75 if (variable != Variable::liquid_saturation)
76 {
78 "RelPermGeneralizedPowerNonwettingPhase::dValue is implemented for "
79 "derivatives with respect to liquid saturation only.");
80 }
81
82 const double S_L = variable_array.liquid_saturation;
83
84 auto const S_L_res = residual_liquid_saturation_;
85 auto const S_L_max = 1. - residual_gas_saturation_;
86 auto const S_e = (S_L - S_L_res) / (S_L_max - S_L_res);
87
88 if ((S_e < 0.) || (S_e > 1.))
89 {
90 return 0.;
91 }
92
93 auto const dS_e_dS_L = 1. / (S_L_max - S_L_res);
94
95 auto const dk_rel_GR_dS_e = -lambda_ * a_ * std::pow(1. - S_e, lambda_ - 1);
96 return dk_rel_GR_dS_e * dS_e_dS_L;
97}
98
99} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:26
virtual PropertyDataType value() const
Definition Property.cpp:76
RelPermGeneralizedPowerNonwettingPhase(std::string name, const double residual_liquid_saturation, const double residual_gas_saturation, const double min_relative_permeability, const double a, const double lambda)
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
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
Definition Property.h:31