15 #include "libmesh/utility.h"
24 params.addRequiredRangeCheckedParam<Real>(
27 "Low saturation. This must be < Ss, and non-negative. This is BW's "
28 "initial effective saturation, below which effective saturation never goes "
29 "in their simulations/models. If Kn=0 then Sn is the immobile saturation.");
30 params.addRangeCheckedParam<Real>(
34 "High saturation. This must be > Sn and <= 1. Effective saturation "
35 "where porepressure = 0. Effective saturation never exceeds this "
36 "value in BW's simulations/models.");
37 params.addRangeCheckedParam<Real>(
38 "Kn", 0.0,
"Kn >= 0",
"Relative permeability at Seff = Sn. Must be < Ks");
39 params.addRangeCheckedParam<Real>(
40 "Ks", 1.0,
"Ks <= 1",
"Relative permeability at Seff = Ss. Must be > Kn");
41 params.addRequiredRangeCheckedParam<Real>(
44 "BW's C parameter. Must be > 1. Define s = (seff - Sn)/(Ss - Sn). Then "
45 "relperm = Kn + s^2(c-1)(Kn-Ks)/(c-s) if 0<s<1, otherwise relperm = Kn if "
46 "s<=0, otherwise relperm = Ks if s>=1.");
47 params.addClassDescription(
"Broadbridge-White form of relative permeability. Define s = (seff - "
48 "Sn)/(Ss - Sn). Then relperm = Kn + s^2(c-1)(Kn-Ks)/(c-s) if 0<s<1, "
49 "otherwise relperm = Kn if s<=0, otherwise relperm = Ks if s>=1.");
55 _sn(getParam<Real>(
"Sn")),
56 _ss(getParam<Real>(
"Ss")),
57 _kn(getParam<Real>(
"Kn")),
58 _ks(getParam<Real>(
"Ks")),
59 _c(getParam<Real>(
"C"))
62 mooseError(
"In BW relative permeability Sn set to ",
66 " but these must obey Ss > Sn");
68 mooseError(
"In BW relative permeability Kn set to ",
72 " but these must obey Ks > Kn");
85 const Real s_internal = (seff -
_sn) / (
_ss -
_sn);
86 const Real krel =
_kn +
_coef * Utility::pow<2>(s_internal) / (
_c - s_internal);
99 const Real s_internal = (seff -
_sn) / (
_ss -
_sn);
100 const Real krelp =
_coef * (2.0 * s_internal / (
_c - s_internal) +
101 Utility::pow<2>(s_internal) / Utility::pow<2>(
_c - s_internal));
102 return krelp / (
_ss -
_sn);
114 const Real s_internal = (seff -
_sn) / (
_ss -
_sn);
116 _coef * (2.0 / (
_c - s_internal) + 4.0 * s_internal / Utility::pow<2>(
_c - s_internal) +
117 2.0 * Utility::pow<2>(s_internal) / Utility::pow<3>(
_c - s_internal));
118 return krelpp / Utility::pow<2>(
_ss -
_sn);