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 47 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 32 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

39 : S_L_r_(S_L_r),
40 S_L_max_(1. - S_n_r),
41 m_(m),
42 krel_min_(krel_min),
44 a_(a)
45{
46 name_ = std::move(name);
48}
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 68 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

69 {
70 if (!std::holds_alternative<Medium*>(scale_))
71 {
73 "The property 'RelPermNonWettingPhaseVanGenuchtenMualem' is "
74 "implemented on the 'media' scale only.");
75 }
76 }
#define OGS_FATAL(...)
Definition Error.h:26
std::variant< Medium *, Phase *, Component * > scale_
Definition Property.h:297

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 98 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

100{
101 auto f = [this](double S_L) -> double
102 {
103 return computeVanGenuchtenMualemValue(S_L, this->S_L_r_, this->S_L_max_,
104 this->m_) -
105 this->krel_min_;
106 };
107
108 auto root_finder =
110 f, S_L_r_, S_L_max_);
111
112 root_finder.step(1000);
113
114 return root_finder.getResult();
115}
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:137

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 63 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

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

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 50 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

54{
55 const double S_L =
56 std::clamp(variable_array.liquid_saturation, S_L_r_, S_L_max_);
57
58 const double krel =
60 return std::max(krel_min_, a_ * krel);
61}

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 102 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: