11 #include "libmesh/utility.h"
20 params.addRequiredRangeCheckedParam<Real>(
22 "simm >= 0 & simm < 1",
23 "Immobile saturation. Must be between 0 and 1. Define s = "
24 "(seff - simm)/(1 - simm). Then relperm = s^(1/2) * (1 - (1 "
26 params.addRequiredRangeCheckedParam<Real>(
29 "van-Genuchten m parameter. Must be between 0 and 1, and optimally "
30 "should be set >0.5. Define s = (seff - simm)/(1 - simm). Then "
31 "relperm = s^(1/2) * (1 - (1 - s^(1/m))^m)^2");
32 params.addClassDescription(
"VG form of relative permeability. Define s = (seff - simm)/(1 - "
33 "simm). Then relperm = s^(1/2) * (1 - (1 - s^(1/m))^m)^2, if s>0, "
34 "and relperm=0 otherwise");
39 :
RichardsRelPerm(parameters), _simm(getParam<Real>(
"simm")), _m(getParam<Real>(
"m"))
52 Real s_internal = (seff -
_simm) / (1.0 -
_simm);
53 Real krel = std::sqrt(s_internal) *
74 Real s_internal = (seff -
_simm) / (1.0 -
_simm);
75 Real tmp = 1.0 -
std::pow(s_internal, 1.0 /
_m);
76 Real tmpp = -1.0 /
_m *
std::pow(s_internal, 1.0 /
_m - 1.0);
81 0.5 *
std::pow(s_internal, -0.5) * tmp2 * tmp2 + 2.0 * std::sqrt(s_internal) * tmp2 * tmp2p;
82 return krelp / (1.0 -
_simm);
94 Real s_internal = (seff -
_simm) / (1.0 -
_simm);
95 Real tmp = 1.0 -
std::pow(s_internal, 1.0 /
_m);
96 Real tmpp = -1.0 /
_m *
std::pow(s_internal, 1.0 /
_m - 1.0);
97 Real tmppp = -1.0 /
_m * (1.0 /
_m - 1.0) *
std::pow(s_internal, 1.0 /
_m - 2);
100 Real tmp2pp = -
_m * (
_m - 1.0) *
std::pow(tmp,
_m - 2.0) * tmpp * tmpp -
105 Real krelpp = -0.25 *
std::pow(s_internal, -1.5) * tmp2 * tmp2 +
106 2.0 * 0.5 *
std::pow(s_internal, -0.5) * 2.0 * tmp2 * tmp2p +
107 2.0 * std::sqrt(s_internal) * (tmp2p * tmp2p + tmp2 * tmp2pp);
109 return krelpp / Utility::pow<2>(1.0 -
_simm);