39 _phase0_porepressure(_nodal_material
40 ? this->template coupledGenericDofValue<is_ad>(
"phase0_porepressure")
41 : this->template coupledGenericValue<is_ad>(
"phase0_porepressure")),
42 _phase0_gradp_qp(this->template coupledGenericGradient<is_ad>(
"phase0_porepressure")),
43 _phase0_porepressure_varnum(coupled(
"phase0_porepressure")),
44 _p0var(_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)
45 ? _dictator.porousFlowVariableNum(_phase0_porepressure_varnum)
48 _phase1_porepressure(_nodal_material
49 ? this->template coupledGenericDofValue<is_ad>(
"phase1_porepressure")
50 : this->template coupledGenericValue<is_ad>(
"phase1_porepressure")),
51 _phase1_gradp_qp(this->template coupledGenericGradient<is_ad>(
"phase1_porepressure")),
52 _phase1_porepressure_varnum(coupled(
"phase1_porepressure")),
53 _p1var(_dictator.isPorousFlowVariable(_phase1_porepressure_varnum)
54 ? _dictator.porousFlowVariableNum(_phase1_porepressure_varnum)
60 if (this->_nodal_material)
61 this->checkNodalVariables({
"phase0_porepressure",
"phase1_porepressure"});
63 mooseError(
"The Dictator announces that the number of phases is ",
64 _dictator.numPhases(),
65 " whereas PorousFlow2PhasePP can only be used for 2-phase simulation. When you "
66 "have an efficient government, you have a dictatorship.");
84 const auto pc = buildQpPPSS();
85 const auto ds = _pc_uo.dSaturation(pc);
89 (*_gradp_qp)[_qp][0] = _phase0_gradp_qp[_qp];
90 (*_gradp_qp)[_qp][1] = _phase1_gradp_qp[_qp];
91 (*_grads_qp)[_qp][0] = ds * ((*_gradp_qp)[_qp][0] - (*_gradp_qp)[_qp][1]);
92 (*_grads_qp)[_qp][1] = -(*_grads_qp)[_qp][0];
99 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum))
101 (*_dporepressure_dvar)[_qp][0][_p0var] = 1.0;
102 if (!_nodal_material)
103 (*_dgradp_qp_dgradv)[_qp][0][_p0var] = 1.0;
106 if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum))
108 (*_dporepressure_dvar)[_qp][1][_p1var] = 1.0;
109 if (!_nodal_material)
110 (*_dgradp_qp_dgradv)[_qp][1][_p1var] = 1.0;
113 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum))
115 (*_dsaturation_dvar)[_qp][0][_p0var] = ds;
116 (*_dsaturation_dvar)[_qp][1][_p0var] = -ds;
119 if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum))
121 (*_dsaturation_dvar)[_qp][0][_p1var] = -ds;
122 (*_dsaturation_dvar)[_qp][1][_p1var] = ds;
125 if (!_nodal_material)
127 const auto d2s_qp = _pc_uo.d2Saturation(pc);
129 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum))
131 (*_dgrads_qp_dgradv)[_qp][0][_p0var] = ds;
132 (*_dgrads_qp_dv)[_qp][0][_p0var] = d2s_qp * _phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp];
133 (*_dgrads_qp_dgradv)[_qp][1][_p0var] = -ds;
134 (*_dgrads_qp_dv)[_qp][1][_p0var] = -d2s_qp * _phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp];
137 if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum))
139 (*_dgrads_qp_dgradv)[_qp][0][_p1var] = -ds;
140 (*_dgrads_qp_dv)[_qp][0][_p1var] = -d2s_qp * _phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp];
141 (*_dgrads_qp_dgradv)[_qp][1][_p1var] = ds;
142 (*_dgrads_qp_dv)[_qp][1][_p1var] = d2s_qp * _phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp];
152 _porepressure[_qp][0] = _phase0_porepressure[_qp];
153 _porepressure[_qp][1] = _phase1_porepressure[_qp];
155 const auto pc = _phase0_porepressure[_qp] - _phase1_porepressure[_qp];
156 const auto sat = _pc_uo.saturation(pc);
157 _saturation[_qp][0] = sat;
158 _saturation[_qp][1] = 1.0 - sat;