www.mooseframework.org
Functions
PorousFlowVanGenuchten Namespace Reference

van Genuchten effective saturation, capillary pressure and relative permeability functions. More...

Functions

Real effectiveSaturation (Real p, Real alpha, Real m)
 Effective saturation as a function of porepressure. More...
 
Real dEffectiveSaturation (Real p, Real alpha, Real m)
 Derivative of effective saturation wrt porepressure. More...
 
Real d2EffectiveSaturation (Real p, Real alpha, Real m)
 Second derivative of effective saturation wrt porepressure. More...
 
Real capillaryPressure (Real seff, Real alpha, Real m, Real pc_max)
 Capillary pressure as a function of effective saturation. More...
 
Real dCapillaryPressure (Real seff, Real alpha, Real m, Real pc_max)
 Derivative of capillary pressure wrt effective saturation. More...
 
Real d2CapillaryPressure (Real seff, Real alpha, Real m, Real pc_max)
 Second derivative of capillary pressure wrt effective saturation. More...
 
Real relativePermeability (Real seff, Real m)
 Relative permeability as a function of effective saturation. More...
 
Real dRelativePermeability (Real seff, Real m)
 Derivative of relative permeability with respect to effective saturation. More...
 
Real d2RelativePermeability (Real seff, Real m)
 Second derivative of relative permeability with respect to effective saturation. More...
 
Real relativePermeabilityNW (Real seff, Real m)
 Relative permeability for a non-wetting phase as a function of effective saturation. More...
 
Real dRelativePermeabilityNW (Real seff, Real m)
 Derivative of relative permeability for a non-wetting phase with respect to effective saturation. More...
 
Real d2RelativePermeabilityNW (Real seff, Real m)
 Second derivative of relative permeability for a non-wetting phase with respect to effective saturation. More...
 

Detailed Description

van Genuchten effective saturation, capillary pressure and relative permeability functions.

Note: effective saturation is provided as a function of porepressure, not capillary pressure. Note: capillary pressure and relative permeability are functions of effective saturation. The derivatives are therefore given wrt effective saturation. These derivatives must be multiplied by the derivative of effective saturation wrt the true saturation in objects using these relations.

Based on van Genuchten, M. Th., A closed for equation for predicting the hydraulic conductivity of unsaturated soils, Soil Sci. Soc., 44, 892-898 (1980).

Function Documentation

◆ capillaryPressure()

Real PorousFlowVanGenuchten::capillaryPressure ( Real  seff,
Real  alpha,
Real  m,
Real  pc_max 
)

Capillary pressure as a function of effective saturation.

Parameters
seffeffective saturation
alphavan Genuchten parameter
mvan Genuchten exponent
pc_maxmaximum capillary pressure (Pa)
Returns
capillary pressure (Pa)

Definition at line 63 of file PorousFlowVanGenuchten.C.

64 {
65  if (seff >= 1.0)
66  return 0.0;
67  else if (seff <= 0.0)
68  return pc_max;
69  else
70  {
71  Real a = std::pow(seff, -1.0 / m) - 1.0;
72  return std::min(std::pow(a, 1.0 - m) / alpha, pc_max);
73  }
74 }

Referenced by PorousFlowCapillaryPressureVG::capillaryPressureCurve().

◆ d2CapillaryPressure()

Real PorousFlowVanGenuchten::d2CapillaryPressure ( Real  seff,
Real  alpha,
Real  m,
Real  pc_max 
)

Second derivative of capillary pressure wrt effective saturation.

Parameters
seffeffective saturation
alphavan Genuchten parameter
mvan Genuchten exponent
pc_maxmaximum capillary pressure (Pa)
Returns
second derivative of capillary pressure wrt effective saturation

Definition at line 93 of file PorousFlowVanGenuchten.C.

94 {
95  if (seff <= 0.0 || seff >= 1.0)
96  return 0.0;
97  else
98  {
99  Real a = std::pow(seff, -1.0 / m) - 1.0;
100  // Return 0 if pc > pc_max
101  if (std::pow(a, 1.0 - m) / alpha > pc_max)
102  return 0.0;
103  else
104  {
105  Real d2pc = -std::pow(a, -1.0 - m) * std::pow(seff, -2.0 - 2.0 / m) +
106  ((1.0 + m) / m) * std::pow(a, -m) * std::pow(seff, -1.0 / m - 2.0);
107  d2pc *= (1.0 - m) / m / alpha;
108  return d2pc;
109  }
110  }
111 }

Referenced by PorousFlowCapillaryPressureVG::d2CapillaryPressureCurve().

◆ d2EffectiveSaturation()

Real PorousFlowVanGenuchten::d2EffectiveSaturation ( Real  p,
Real  alpha,
Real  m 
)

Second derivative of effective saturation wrt porepressure.

Parameters
pporepressure
alphavan Genuchten parameter
mvan Genuchten exponent
Returns
second derivative of effective saturation wrt porepressure

Definition at line 46 of file PorousFlowVanGenuchten.C.

47 {
48  if (p >= 0.0)
49  return 0.0;
50  else
51  {
52  Real n = 1.0 / (1.0 - m);
53  Real inner = 1.0 + std::pow(-alpha * p, n);
54  Real dinner_dp = -n * alpha * std::pow(-alpha * p, n - 1.0);
55  Real d2inner_dp2 = n * (n - 1.0) * alpha * alpha * std::pow(-alpha * p, n - 2.0);
56  Real d2seff_dp2 = m * (m + 1.0) * std::pow(inner, -m - 2.0) * std::pow(dinner_dp, 2.0) -
57  m * std::pow(inner, -m - 1.0) * d2inner_dp2;
58  return d2seff_dp2;
59  }
60 }

Referenced by PorousFlowCapillaryPressureVG::d2EffectiveSaturation().

◆ d2RelativePermeability()

Real PorousFlowVanGenuchten::d2RelativePermeability ( Real  seff,
Real  m 
)

Second derivative of relative permeability with respect to effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
second derivative of relative permeability wrt effective saturation

Definition at line 143 of file PorousFlowVanGenuchten.C.

144 {
145  // Guard against division by zero
146  if (seff <= 0.0 || seff >= 1.0)
147  return 0.0;
148 
149  const Real a = 1.0 - std::pow(seff, 1.0 / m);
150  const Real da = -1.0 / m * std::pow(seff, 1.0 / m - 1.0);
151  const Real d2a = -(1.0 / m) * (1.0 / m - 1.0) * std::pow(seff, 1.0 / m - 2.0);
152  const Real b = 1.0 - std::pow(a, m);
153  const Real db = -m * std::pow(a, m - 1.0) * da;
154  const Real d2b = -m * (m - 1.0) * std::pow(a, m - 2.0) * da * da - m * std::pow(a, m - 1.0) * d2a;
155 
156  return -0.25 * std::pow(seff, -1.5) * Utility::pow<2>(b) + 2.0 * std::pow(seff, -0.5) * b * db +
157  2.0 * std::sqrt(seff) * db * db + 2.0 * std::sqrt(seff) * b * d2b;
158 }

◆ d2RelativePermeabilityNW()

Real PorousFlowVanGenuchten::d2RelativePermeabilityNW ( Real  seff,
Real  m 
)

Second derivative of relative permeability for a non-wetting phase with respect to effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
second derivative of relative permeability wrt effective saturation

Definition at line 190 of file PorousFlowVanGenuchten.C.

191 {
192  // Guard against division by zero
193  if (seff <= 0.0 || seff >= 1.0)
194  return 0.0;
195 
196  const Real a = std::pow(1.0 - seff, 1.0 / m);
197  const Real da = -1.0 / m * a / (1.0 - seff);
198  const Real d2a = 1.0 / m * (1.0 / m - 1) * std::pow(1.0 - seff, 1.0 / m - 2.0);
199  const Real b = std::pow(1.0 - a, 2.0 * m);
200  const Real db = -2.0 * m * b / (1.0 - a) * da;
201  const Real d2b =
202  -2.0 * m * (db / (1.0 - a) * da + b * Utility::pow<2>(da / (1.0 - a)) + b / (1.0 - a) * d2a);
203 
204  return -0.25 * std::pow(seff, -1.5) * b + std::pow(seff, -0.5) * db + std::sqrt(seff) * d2b;
205 }

◆ dCapillaryPressure()

Real PorousFlowVanGenuchten::dCapillaryPressure ( Real  seff,
Real  alpha,
Real  m,
Real  pc_max 
)

Derivative of capillary pressure wrt effective saturation.

Parameters
seffeffective saturation
alphavan Genuchten parameter
mvan Genuchten exponent
pc_maxmaximum capillary pressure (Pa)
Returns
derivative of capillary pressure wrt effective saturation

Definition at line 77 of file PorousFlowVanGenuchten.C.

78 {
79  if (seff <= 0.0 || seff >= 1.0)
80  return 0.0;
81  else
82  {
83  Real a = std::pow(seff, -1.0 / m) - 1.0;
84  // Return 0 if pc > pc_max
85  if (std::pow(a, 1.0 - m) / alpha > pc_max)
86  return 0.0;
87  else
88  return (m - 1.0) * std::pow(a, -m) * std::pow(seff, -1.0 - 1.0 / m) / m / alpha;
89  }
90 }

Referenced by PorousFlowCapillaryPressureVG::dCapillaryPressureCurve().

◆ dEffectiveSaturation()

Real PorousFlowVanGenuchten::dEffectiveSaturation ( Real  p,
Real  alpha,
Real  m 
)

Derivative of effective saturation wrt porepressure.

Parameters
pporepressure
alphavan Genuchten parameter
mvan Genuchten exponent
Returns
derivative of effective saturation wrt porepressure

Definition at line 31 of file PorousFlowVanGenuchten.C.

32 {
33  if (p >= 0.0)
34  return 0.0;
35  else
36  {
37  Real n = 1.0 / (1.0 - m);
38  Real inner = 1.0 + std::pow(-alpha * p, n);
39  Real dinner_dp = -n * alpha * std::pow(-alpha * p, n - 1.0);
40  Real dseff_dp = -m * std::pow(inner, -m - 1) * dinner_dp;
41  return dseff_dp;
42  }
43 }

Referenced by PorousFlowCapillaryPressureVG::dEffectiveSaturation().

◆ dRelativePermeability()

Real PorousFlowVanGenuchten::dRelativePermeability ( Real  seff,
Real  m 
)

Derivative of relative permeability with respect to effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
derivative of relative permeability wrt effective saturation

Definition at line 128 of file PorousFlowVanGenuchten.C.

129 {
130  // Guard against division by zero
131  if (seff <= 0.0 || seff >= 1.0)
132  return 0.0;
133 
134  const Real a = 1.0 - std::pow(seff, 1.0 / m);
135  const Real da = -1.0 / m * std::pow(seff, 1.0 / m - 1.0);
136  const Real b = 1.0 - std::pow(a, m);
137  const Real db = -m * std::pow(a, m - 1.0) * da;
138 
139  return 0.5 * std::pow(seff, -0.5) * Utility::pow<2>(b) + 2.0 * std::sqrt(seff) * b * db;
140 }

Referenced by PorousFlowRelativePermeabilityVG::dRelativePermeability().

◆ dRelativePermeabilityNW()

Real PorousFlowVanGenuchten::dRelativePermeabilityNW ( Real  seff,
Real  m 
)

Derivative of relative permeability for a non-wetting phase with respect to effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
derivative of relative permeability wrt effective saturation

Definition at line 175 of file PorousFlowVanGenuchten.C.

176 {
177  // Guard against division by zero
178  if (seff <= 0.0 || seff >= 1.0)
179  return 0.0;
180 
181  const Real a = std::pow(1.0 - seff, 1.0 / m);
182  const Real da = -1.0 / m * a / (1.0 - seff);
183  const Real b = std::pow(1.0 - a, 2.0 * m);
184  const Real db = -2.0 * m * b / (1.0 - a) * da;
185 
186  return 0.5 * std::pow(seff, -0.5) * b + std::sqrt(seff) * db;
187 }

Referenced by PorousFlowRelativePermeabilityVG::dRelativePermeability().

◆ effectiveSaturation()

Real PorousFlowVanGenuchten::effectiveSaturation ( Real  p,
Real  alpha,
Real  m 
)

Effective saturation as a function of porepressure.

Note: seff = 1 for p >= 0

Parameters
pporepressure
alphavan Genuchten parameter
mvan Genuchten exponent
Returns
effective saturation

Definition at line 16 of file PorousFlowVanGenuchten.C.

17 {
18  Real n, seff;
19 
20  if (p >= 0.0)
21  return 1.0;
22  else
23  {
24  n = 1.0 / (1.0 - m);
25  seff = 1.0 + std::pow(-alpha * p, n);
26  return std::pow(seff, -m);
27  }
28 }

Referenced by PorousFlowCapillaryPressureVG::effectiveSaturation().

◆ relativePermeability()

Real PorousFlowVanGenuchten::relativePermeability ( Real  seff,
Real  m 
)

Relative permeability as a function of effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
relative permeability

Definition at line 114 of file PorousFlowVanGenuchten.C.

115 {
116  if (seff <= 0.0)
117  return 0.0;
118  else if (seff >= 1.0)
119  return 1.0;
120 
121  const Real a = 1.0 - std::pow(seff, 1.0 / m);
122  const Real b = 1.0 - std::pow(a, m);
123 
124  return std::sqrt(seff) * Utility::pow<2>(b);
125 }

Referenced by PorousFlowRelativePermeabilityVG::relativePermeability().

◆ relativePermeabilityNW()

Real PorousFlowVanGenuchten::relativePermeabilityNW ( Real  seff,
Real  m 
)

Relative permeability for a non-wetting phase as a function of effective saturation.

Parameters
seffeffective saturation
mvan Genuchten exponent
Returns
relative permeability

Definition at line 161 of file PorousFlowVanGenuchten.C.

162 {
163  if (seff <= 0.0)
164  return 0.0;
165  else if (seff >= 1.0)
166  return 1.0;
167 
168  const Real a = std::pow(1.0 - seff, 1.0 / m);
169  const Real b = std::pow(1.0 - a, 2.0 * m);
170 
171  return std::sqrt(seff) * b;
172 }

Referenced by PorousFlowRelativePermeabilityVG::relativePermeability().

pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673