OGS
MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem Class Referencefinal

Detailed Description

van Genuchten-Mualem relative permeability function for non-wetting phase in terms of effective wetting-phase saturation [25] :

\[k_{rel}^n= (1 - S_e)^{1/2} (1 - S_e^{1/m})^{2m}\]

with

\[S_e=\frac{S^L-S^L_r}{S^L_{\mbox{max}}-S^L_r}\]

where

\begin{eqnarray*} &S^L_r& \mbox{residual saturation of wetting phase,}\\ &S^L_{\mbox{max}}& \mbox{maximum saturation of wetting phase,}\\ &m\, \in (0, 1) & \mbox{ exponent.}\\ \end{eqnarray*}

The derivative of the relative permeability with respect to saturation is computed as

\[\frac{\mathrm{d} k_{rel}^n}{\mathrm{d}S^L}= -(\dfrac{[1-S_e^{1/m}]^{2m}}{2\sqrt{1-S_e}}+2\sqrt{1-S_e} {(1-S_e^{1/m})}^{2*m-1} S_e^{1/m-1})/(S^L_\mbox{max}-S^L_r) \]

As \(S^L \to S^L_\mbox{max}\), or \(S_e \to 1\), \(\dfrac{[1-S_e^{1/m}]^{2m}}{2\sqrt{1-S_e}}\) has a limit of zero.

Definition at line 39 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

#include <RelPermNonWettingPhaseVanGenuchtenMualem.h>

Inheritance diagram for MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem:
[legend]
Collaboration diagram for MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem:
[legend]

Public Member Functions

 RelPermNonWettingPhaseVanGenuchtenMualem (std::string name, const double S_L_r, const double S_n_r, const double m, const double krel_min, const double a)
void checkScale () const override
PropertyDataType value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
PropertyDataType dValue (VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
double computeSaturationForMinimumRelativePermeability () const
Public Member Functions inherited from MaterialPropertyLib::Property
virtual ~Property ()
virtual PropertyDataType initialValue (ParameterLib::SpatialPosition const &pos, double const t) const
virtual PropertyDataType value () const
virtual PropertyDataType value (VariableArray const &variable_array, VariableArray const &variable_array_prev, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
virtual PropertyDataType dValue (VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
virtual PropertyDataType d2Value (VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
 Default implementation: 2nd derivative of any constant property is zero.
virtual void setProperties (std::vector< std::unique_ptr< Phase > > const &phases)
 Default implementation:
void setScale (std::variant< Medium *, Phase *, Component * > scale)
template<typename T>
initialValue (ParameterLib::SpatialPosition const &pos, double const t) const
template<typename T>
value () const
template<typename T>
value (VariableArray const &variable_array, VariableArray const &variable_array_prev, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
dValue (VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
dValue (VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
d2Value (VariableArray const &variable_array, Variable const &variable1, Variable const &variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const

Private Attributes

const double S_L_r_
 Residual saturation of wetting phase.
const double S_L_max_
 Maximum saturation of wetting phase.
const double m_
 Exponent \( m \).
const double krel_min_
 Minimum relative permeability.
const double S_L_for_krel_min_
 Liquid saturation that gives krel_min_.
const double a_

Additional Inherited Members

Protected Attributes inherited from MaterialPropertyLib::Property
std::string name_
PropertyDataType value_
 The single value of a property.
PropertyDataType dvalue_
std::variant< Medium *, Phase *, Component * > scale_

Constructor & Destructor Documentation

◆ RelPermNonWettingPhaseVanGenuchtenMualem()

MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::RelPermNonWettingPhaseVanGenuchtenMualem ( std::string name,
const double S_L_r,
const double S_n_r,
const double m,
const double krel_min,
const double a )
Parameters
nameName of the property,
S_L_rResidual saturation of the wetting phase, \( S^L_r \)
S_n_rResidual saturation of the non-wetting phase, \( S^n_{r} \)
mExponent, \( m \in [0,1]\)
krel_minMinimum relative permeability, \( k_{rel}^n_{\mbox{min}}\)
aMultiplier

Definition at line 24 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

31 : S_L_r_(S_L_r),
32 S_L_max_(1. - S_n_r),
33 m_(m),
34 krel_min_(krel_min),
36 a_(a)
37{
38 name_ = std::move(name);
40}
void checkVanGenuchtenExponentRange(const double m)

References a_, MaterialPropertyLib::checkVanGenuchtenExponentRange(), computeSaturationForMinimumRelativePermeability(), krel_min_, m_, MaterialPropertyLib::name, MaterialPropertyLib::Property::name_, S_L_for_krel_min_, S_L_max_, and S_L_r_.

Member Function Documentation

◆ checkScale()

void MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::checkScale ( ) const
inlineoverridevirtual

Reimplemented from MaterialPropertyLib::Property.

Definition at line 60 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

61 {
62 if (!std::holds_alternative<Medium*>(scale_))
63 {
65 "The property 'RelPermNonWettingPhaseVanGenuchtenMualem' is "
66 "implemented on the 'media' scale only.");
67 }
68 }
#define OGS_FATAL(...)
Definition Error.h:19
std::variant< Medium *, Phase *, Component * > scale_

References OGS_FATAL, and MaterialPropertyLib::Property::scale_.

◆ computeSaturationForMinimumRelativePermeability()

double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::computeSaturationForMinimumRelativePermeability ( ) const

Computes the saturation that gives the minimum relative permeability by using the Regula–Falsi Method.

Returns
\( S^L\) that gives the minimum relative permeability.

Definition at line 90 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

92{
93 auto f = [this](double S_L) -> double
94 {
95 return computeVanGenuchtenMualemValue(S_L, this->S_L_r_, this->S_L_max_,
96 this->m_) -
97 this->krel_min_;
98 };
99
100 auto root_finder =
102 f, S_L_r_, S_L_max_);
103
104 root_finder.step(1000);
105
106 return root_finder.getResult();
107}
double computeVanGenuchtenMualemValue(const double S_L, const double S_L_r, const double S_L_max, const double m)
RegulaFalsi< SubType, Function > makeRegulaFalsi(Function &&f, double const a, double const b)
Definition Root1D.h:130

References MaterialPropertyLib::computeVanGenuchtenMualemValue(), krel_min_, m_, MathLib::Nonlinear::makeRegulaFalsi(), S_L_max_, and S_L_r_.

Referenced by RelPermNonWettingPhaseVanGenuchtenMualem().

◆ dValue()

PropertyDataType MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::dValue ( VariableArray const & variable_array,
Variable const variable,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual
Returns
\( \frac{\mathrm{d} k_{rel}^n}{\mathrm{d}S^L} \).

Reimplemented from MaterialPropertyLib::Property.

Definition at line 55 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

59{
60 if (variable != Variable::liquid_saturation)
61 {
63 "RelPermNonWettingPhaseVanGenuchtenMualem::dValue is implemented "
64 "for the derivative with respect to liquid saturation only.");
65 }
66
67 const double S_L = variable_array.liquid_saturation;
68 if (S_L < S_L_r_ || S_L > S_L_for_krel_min_)
69 {
70 return 0.0;
71 }
72
73 if (std::fabs(S_L - S_L_max_) < std::numeric_limits<double>::epsilon())
74 {
75 return 0.0;
76 }
77
78 const double Se = (S_L - S_L_r_) / (S_L_max_ - S_L_r_);
79
80 const double val1 = std::sqrt(1.0 - Se);
81 const double val2 = 1.0 - std::pow(Se, 1.0 / m_);
82
83 return a_ *
84 (-0.5 * std::pow(val2, 2.0 * m_) / val1 -
85 2.0 * std::pow(Se, -1.0 + 1.0 / m_) * val1 *
86 std::pow(val2, 2.0 * m_ - 1.0)) /
87 (S_L_max_ - S_L_r_);
88}

References a_, MaterialPropertyLib::liquid_saturation, MaterialPropertyLib::VariableArray::liquid_saturation, m_, OGS_FATAL, S_L_for_krel_min_, S_L_max_, and S_L_r_.

◆ value()

PropertyDataType MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::value ( VariableArray const & variable_array,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual
Returns
\(k_{rel}^n \).

Reimplemented from MaterialPropertyLib::Property.

Definition at line 42 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

46{
47 const double S_L =
48 std::clamp(variable_array.liquid_saturation, S_L_r_, S_L_max_);
49
50 const double krel =
52 return std::max(krel_min_, a_ * krel);
53}

References a_, MaterialPropertyLib::computeVanGenuchtenMualemValue(), krel_min_, MaterialPropertyLib::VariableArray::liquid_saturation, m_, S_L_max_, and S_L_r_.

Member Data Documentation

◆ a_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::a_
private

◆ krel_min_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::krel_min_
private

◆ m_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::m_
private

◆ S_L_for_krel_min_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::S_L_for_krel_min_
private

Liquid saturation that gives krel_min_.

Definition at line 94 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

Referenced by RelPermNonWettingPhaseVanGenuchtenMualem(), and dValue().

◆ S_L_max_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::S_L_max_
private

◆ S_L_r_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::S_L_r_
private

The documentation for this class was generated from the following files: