19 "S_lr >= 0 & S_lr < 1",
20 "Liquid residual saturation. At liquid saturation = S_lr, the liquid relative permeability " 21 "is zero and the gas relative permeability is k_rg_max. Almost definitely you need to set " 22 "S_lr equal to the quantity used for your hysteretic capillary-pressure curve, if you are " 26 "S_gr_max >= 0 & S_gr_max < 1",
27 "Residual gas saturation. For liquid saturation = 1 - S_gr_max, the gas wetting " 28 "relative-permeability is zero, if the turning point was <= S_lr. 1 - S_gr_max is the " 29 "maximum liquid saturation for which the van Genuchten expression is valid for the liquid " 30 "relative-permeability wetting curve. You must ensure S_gr_max < 1 - S_lr. Often S_gr_max " 31 "= -0.3136 * ln(porosity) - 0.1334 is used");
33 "m",
"m > 0 & m < 1",
"van Genuchten m parameter. Suggested value is around 0.9");
34 params.
addPrivateParam<std::string>(
"pf_material_type",
"relative_permeability");
36 params.
addClassDescription(
"PorousFlow material that computes relative permeability for 1-phase " 37 "or 2-phase models that include hysteresis");
44 _s_lr(getParam<
Real>(
"S_lr")),
45 _s_gr_max(getParam<
Real>(
"S_gr_max")),
46 _m(getParam<
Real>(
"m")),
47 _saturation(_nodal_material
48 ? getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_saturation_nodal")
49 : getMaterialProperty<
std::vector<
Real>>(
"PorousFlow_saturation_qp")),
50 _hys_order(_nodal_material ? getMaterialProperty<unsigned>(
"PorousFlow_hysteresis_order_nodal")
51 : getMaterialProperty<unsigned>(
"PorousFlow_hysteresis_order_qp")),
52 _hys_order_old(_nodal_material
53 ? getMaterialPropertyOld<unsigned>(
"PorousFlow_hysteresis_order_nodal")
54 : getMaterialPropertyOld<unsigned>(
"PorousFlow_hysteresis_order_qp")),
58 "PorousFlow_hysteresis_saturation_tps_nodal")
60 "PorousFlow_hysteresis_saturation_tps_qp")),
61 _relative_permeability(
62 _nodal_material ? declareProperty<
Real>(
"PorousFlow_relative_permeability_nodal" + _phase)
63 : declareProperty<
Real>(
"PorousFlow_relative_permeability_qp" + _phase)),
64 _drelative_permeability_ds(
66 ? declarePropertyDerivative<
Real>(
"PorousFlow_relative_permeability_nodal" + _phase,
67 _saturation_variable_name)
68 : declarePropertyDerivative<
Real>(
"PorousFlow_relative_permeability_qp" + _phase,
69 _saturation_variable_name)),
70 _s_gr_tp0(_nodal_material
71 ? declareProperty<
Real>(
"PorousFlow_hysteresis_s_gr_tp0_nodal" + _phase)
72 : declareProperty<
Real>(
"PorousFlow_hysteresis_s_gr_tp0_qp" + _phase))
74 mooseAssert(_dictator.numPhases() <= 2,
75 "PorousFlowHystereticRelativePermeability Materials can only be used for " 76 "1-phase or 2-phase models. The Dictator proclaims that the number of phases " 77 "exceeds 2, and dictators are never incorrect.");
79 paramError(
"S_gr_max",
"Must be less than 1 - S_lr");
85 PorousFlowMaterialBase::initQpStatefulProperties();
95 PorousFlowMaterialBase::computeQpProperties();
107 return (1.0 - slDel) / (1.0 +
a * (1.0 - slDel));
const Real _s_lr
Liquid saturation at which the liquid relperm is zero and the gas relperm is k_rg_max.
static InputParameters validParams()
virtual void initQpStatefulProperties() override
virtual void computeRelPermQp()=0
Compute the relative permeability and its derivative wrt the _phase_num saturation, at the quadpoints, and store the result in _relative_permeability[_qp] and _drelative_permeability_ds[_qp].
MaterialProperty< Real > & _s_gr_tp0
Computed nodal or quadpoint values the Land expression, at the turning point from primary drying to f...
PorousFlowHystereticRelativePermeabilityBase(const InputParameters ¶meters)
constexpr unsigned MAX_HYSTERESIS_ORDER
Base class for all PorousFlow materials that provide phase-dependent properties.
virtual void computeQpProperties() override
const MaterialProperty< unsigned > & _hys_order
Hysteresis order, as computed by PorousFlowHysteresisOrder.
const MaterialProperty< unsigned > & _hys_order_old
Old value of hysteresis order, as computed by PorousFlowHysteresisOrder.
virtual void computeTurningPoint0Info(Real tp_sat)
Compute all relevant quantities at the zeroth turning point (the transition from primary drying to fi...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static InputParameters validParams()
const Real _s_gr_max
Gas residual saturation.
Real landSat(Real slDel) const
const MaterialProperty< std::array< Real, PorousFlowConstants::MAX_HYSTERESIS_ORDER > > & _hys_sat_tps
Saturation values at the turning points, as computed by PorousFlowHysteresisOrder.