OGS
MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem Class Referencefinal

Detailed Description

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

\[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*}

Definition at line 37 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)
 
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
 
- 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. More...
 
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 Member Functions

double computeValue (const double S_L) const
 
double computeDerivative (const double S_L) const
 
double computeSaturationForMinimumRelativePermeability () const
 

Private Attributes

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

Additional Inherited Members

- Protected Attributes inherited from MaterialPropertyLib::Property
std::string name_
 
PropertyDataType value_
 The single value of a property. More...
 
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 
)
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}}\)

Definition at line 24 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

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

References MaterialPropertyLib::checkVanGenuchtenExponentRange(), m_, MaterialPropertyLib::name, and MaterialPropertyLib::Property::name_.

Member Function Documentation

◆ checkScale()

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

Reimplemented from MaterialPropertyLib::Property.

Definition at line 56 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

57  {
58  if (!std::holds_alternative<Medium*>(scale_))
59  {
60  OGS_FATAL(
61  "The property 'RelPermNonWettingPhaseVanGenuchtenMualem' is "
62  "implemented on the 'media' scale only.");
63  }
64  }
#define OGS_FATAL(...)
Definition: Error.h:26
std::variant< Medium *, Phase *, Component * > scale_
Definition: Property.h:287

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

◆ computeDerivative()

double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::computeDerivative ( const double  S_L) const
private

Computes

\[\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 limit zero.

Parameters
S_LLiquid saturation.
Returns
\( \frac{\mathrm{d} k_{rel}^n}{\mathrm{d}S^L} \).

Definition at line 84 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

86 {
87  if (std::fabs(S_L - S_L_max_) < std::numeric_limits<double>::epsilon())
88  {
89  return 0.0;
90  }
91 
92  const double Se = (S_L - S_L_r_) / (S_L_max_ - S_L_r_);
93 
94  const double val1 = std::sqrt(1.0 - Se);
95  const double val2 = 1.0 - std::pow(Se, 1.0 / m_);
96 
97  return (-0.5 * std::pow(val2, 2.0 * m_) / val1 -
98  2.0 * std::pow(Se, -1.0 + 1.0 / m_) * val1 *
99  std::pow(val2, 2.0 * m_ - 1.0)) /
100  (S_L_max_ - S_L_r_);
101 }

References m_, S_L_max_, and S_L_r_.

Referenced by computeSaturationForMinimumRelativePermeability(), and dValue().

◆ computeSaturationForMinimumRelativePermeability()

double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::computeSaturationForMinimumRelativePermeability ( ) const
private

Computes the saturation that gives the minimum relative permeability by using the Newton-Raphson method.

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

Definition at line 102 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

104 {
105  double S_for_k_rel_min = 0.5 * (S_L_r_ + S_L_max_);
106  const double tolerance = 1.e-16;
107  const double r0 = computeValue(S_for_k_rel_min) - krel_min_;
108  for (int iterations = 0; iterations < 1000; ++iterations)
109  {
110  const double r = computeValue(S_for_k_rel_min) - krel_min_;
111  S_for_k_rel_min = std::clamp(S_for_k_rel_min, S_L_r_, S_L_max_);
112  S_for_k_rel_min -= r / computeDerivative(S_for_k_rel_min);
113 
114  if (std::fabs(r / r0) < tolerance)
115  {
116  return S_for_k_rel_min;
117  }
118  }
119 
120  OGS_FATAL(
121  "The given minimum relative permeability, {:g}, is not "
122  "associated with the saturation in the range of '('{:f}, {:f}')'. "
123  "Please try another one in '(0, 1)', which should be close to zero",
125 }
static const double r
static double const tolerance

References computeDerivative(), computeValue(), krel_min_, OGS_FATAL, MathLib::r, S_L_max_, S_L_r_, and ParameterLib::tolerance.

◆ computeValue()

double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::computeValue ( const double  S_L) const
private
Parameters
S_LLiquid saturation.
Returns
\return \(k_{rel}^n \).

Definition at line 76 of file RelPermNonWettingPhaseVanGenuchtenMualem.cpp.

78 {
79  const double Se = (S_L - S_L_r_) / (S_L_max_ - S_L_r_);
80  return std::sqrt(1.0 - Se) *
81  std::pow(1.0 - std::pow(Se, 1.0 / m_), 2.0 * m_);
82 }

References m_, S_L_max_, and S_L_r_.

Referenced by computeSaturationForMinimumRelativePermeability(), and value().

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

58 {
59  if (variable != Variable::liquid_saturation)
60  {
61  OGS_FATAL(
62  "RelPermNonWettingPhaseVanGenuchtenMualem::dValue is implemented "
63  "for the derivative with respect to liquid saturation only.");
64  }
65 
66  const double S_L = std::get<double>(
67  variable_array[static_cast<int>(Variable::liquid_saturation)]);
68  if (S_L < S_L_r_ || S_L > S_L_for_krel_min_)
69  {
70  return 0.0;
71  }
72 
73  return computeDerivative(S_L);
74 }

References computeDerivative(), MaterialPropertyLib::liquid_saturation, OGS_FATAL, and S_L_for_krel_min_.

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

44 {
45  const double S_L = std::clamp(
46  std::get<double>(
47  variable_array[static_cast<int>(Variable::liquid_saturation)]),
48  S_L_r_, S_L_max_);
49 
50  const double krel = computeValue(S_L);
51  return std::max(krel_min_, krel);
52 }

References computeValue(), krel_min_, MaterialPropertyLib::liquid_saturation, S_L_max_, and S_L_r_.

Member Data Documentation

◆ krel_min_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::krel_min_
private

Minimum relative permeability.

Definition at line 81 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

Referenced by computeSaturationForMinimumRelativePermeability(), and value().

◆ 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 83 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

Referenced by dValue().

◆ S_L_max_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::S_L_max_
private

Maximum saturation of wetting phase.

Definition at line 79 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

Referenced by computeDerivative(), computeSaturationForMinimumRelativePermeability(), computeValue(), and value().

◆ S_L_r_

const double MaterialPropertyLib::RelPermNonWettingPhaseVanGenuchtenMualem::S_L_r_
private

Residual saturation of wetting phase.

Definition at line 78 of file RelPermNonWettingPhaseVanGenuchtenMualem.h.

Referenced by computeDerivative(), computeSaturationForMinimumRelativePermeability(), computeValue(), and value().


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