34 _liquid_porepressure(_nodal_material
35 ? this->template coupledGenericDofValue<is_ad>(
"porepressure")
36 : this->template coupledGenericValue<is_ad>(
"porepressure")),
37 _liquid_gradp_qp(this->template coupledGenericGradient<is_ad>(
"porepressure")),
38 _liquid_porepressure_varnum(coupled(
"porepressure")),
39 _pvar(_dictator.isPorousFlowVariable(_liquid_porepressure_varnum)
40 ? _dictator.porousFlowVariableNum(_liquid_porepressure_varnum)
42 _enthalpy(_nodal_material ? this->template coupledGenericDofValue<is_ad>(
"enthalpy")
43 : this->template coupledGenericValue<is_ad>(
"enthalpy")),
44 _gradh_qp(this->template coupledGenericGradient<is_ad>(
"enthalpy")),
45 _enthalpy_varnum(coupled(
"enthalpy")),
46 _hvar(_dictator.isPorousFlowVariable(_enthalpy_varnum)
47 ? _dictator.porousFlowVariableNum(_enthalpy_varnum)
50 _aqueous_phase_number(_fs.aqueousPhaseIndex()),
51 _gas_phase_number(_fs.gasPhaseIndex()),
53 this->template declareGenericProperty<Real, is_ad>(
"PorousFlow_temperature" + _sfx)),
54 _grad_temperature_qp(_nodal_material
56 : &this->template declareGenericProperty<RealGradient, is_ad>(
57 "PorousFlow_grad_temperature_qp")),
58 _dtemperature_dvar(is_ad ? nullptr
59 : &this->template declareProperty<
std::vector<Real>>(
60 "dPorousFlow_temperature" + _sfx +
"_dvar")),
61 _dgrad_temperature_dgradv(is_ad || _nodal_material
63 : &this->template declareProperty<
std::vector<Real>>(
64 "dPorousFlow_grad_temperature_qp_dgradvar")),
65 _dgrad_temperature_dv(is_ad ? nullptr
68 : &this->template declareProperty<
std::vector<RealGradient>>(
69 "dPorousFlow_grad_temperature_qp_dvar")),
70 _pidx(_fs.getPressureIndex()),
71 _hidx(_fs.getEnthalpyIndex())
73 this->checkNodalVariables({
"porepressure",
"enthalpy"});
80 " phases are allowed. Please check the number of phases entered in the dictator is "
117 _temperature[_qp] = genericValue(_fsp[_aqueous_phase_number].temperature) - _T_c2k;
121 (*_dtemperature_dvar)[_qp][_pvar] =
122 _fsp[_aqueous_phase_number].temperature.derivatives()[_pidx];
123 (*_dtemperature_dvar)[_qp][_hvar] =
124 _fsp[_aqueous_phase_number].temperature.derivatives()[_hidx];
129 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
131 (*_dporepressure_dvar)[_qp][ph][_pvar] = _fsp[ph].pressure.derivatives()[_pidx];
132 (*_dporepressure_dvar)[_qp][ph][_hvar] = _fsp[ph].pressure.derivatives()[_hidx];
134 (*_dsaturation_dvar)[_qp][ph][_pvar] = _fsp[ph].saturation.derivatives()[_pidx];
135 (*_dsaturation_dvar)[_qp][ph][_hvar] = _fsp[ph].saturation.derivatives()[_hidx];
137 (*_dfluid_density_dvar)[_qp][ph][_pvar] = _fsp[ph].density.derivatives()[_pidx];
138 (*_dfluid_density_dvar)[_qp][ph][_hvar] = _fsp[ph].density.derivatives()[_hidx];
140 (*_dfluid_viscosity_dvar)[_qp][ph][_pvar] = _fsp[ph].viscosity.derivatives()[_pidx];
141 (*_dfluid_viscosity_dvar)[_qp][ph][_hvar] = _fsp[ph].viscosity.derivatives()[_hidx];
143 (*_dfluid_enthalpy_dvar)[_qp][ph][_pvar] = _fsp[ph].enthalpy.derivatives()[_pidx];
144 (*_dfluid_enthalpy_dvar)[_qp][ph][_hvar] = _fsp[ph].enthalpy.derivatives()[_hidx];
146 (*_dfluid_internal_energy_dvar)[_qp][ph][_pvar] =
147 _fsp[ph].internal_energy.derivatives()[_pidx];
148 (*_dfluid_internal_energy_dvar)[_qp][ph][_hvar] =
149 _fsp[ph].internal_energy.derivatives()[_hidx];
156 if (!_nodal_material)
157 if constexpr (!is_ad)
161 const Real dp = 1.0e-5 * _liquid_porepressure[_qp];
162 const Real dh = 1.0e-5 * _enthalpy[_qp];
165 _fs.thermophysicalProperties(_liquid_porepressure[_qp] + dp, _enthalpy[_qp], _qp, fsp_dp);
168 _fs.thermophysicalProperties(_liquid_porepressure[_qp], _enthalpy[_qp] + dh, _qp, fsp_dh);
171 (*_grad_temperature_qp)[_qp] = (*_dtemperature_dvar)[_qp][_pvar] * _liquid_gradp_qp[_qp] +
172 (*_dtemperature_dvar)[_qp][_hvar] * _gradh_qp[_qp];
173 (*_dgrad_temperature_dgradv)[_qp][_pvar] = (*_dtemperature_dvar)[_qp][_pvar];
174 (*_dgrad_temperature_dgradv)[_qp][_hvar] = (*_dtemperature_dvar)[_qp][_hvar];
176 const auto d2T_dp2 = (fsp_dp[_aqueous_phase_number].temperature.derivatives()[_pidx] -
177 _fsp[_aqueous_phase_number].temperature.derivatives()[_pidx]) /
180 const auto d2T_dh2 = (fsp_dh[_aqueous_phase_number].temperature.derivatives()[_hidx] -
181 _fsp[_aqueous_phase_number].temperature.derivatives()[_hidx]) /
184 const auto d2T_dph = (fsp_dp[_aqueous_phase_number].temperature.derivatives()[_hidx] -
185 _fsp[_aqueous_phase_number].temperature.derivatives()[_hidx]) /
187 (fsp_dh[_aqueous_phase_number].temperature.derivatives()[_pidx] -
188 _fsp[_aqueous_phase_number].temperature.derivatives()[_pidx]) /
191 (*_dgrad_temperature_dv)[_qp][_pvar] =
192 d2T_dp2 * _liquid_gradp_qp[_qp] + d2T_dph * _gradh_qp[_qp];
193 (*_dgrad_temperature_dv)[_qp][_hvar] =
194 d2T_dph * _liquid_gradp_qp[_qp] + d2T_dh2 * _gradh_qp[_qp];
197 (*_grads_qp)[_qp][_gas_phase_number] =
198 (*_dsaturation_dvar)[_qp][_gas_phase_number][_pvar] * _liquid_gradp_qp[_qp] +
199 (*_dsaturation_dvar)[_qp][_gas_phase_number][_hvar] * _gradh_qp[_qp];
200 (*_grads_qp)[_qp][_aqueous_phase_number] = -(*_grads_qp)[_qp][_gas_phase_number];
202 (*_dgrads_qp_dgradv)[_qp][_gas_phase_number][_pvar] =
203 (*_dsaturation_dvar)[_qp][_gas_phase_number][_pvar];
204 (*_dgrads_qp_dgradv)[_qp][_aqueous_phase_number][_pvar] =
205 -(*_dgrads_qp_dgradv)[_qp][_gas_phase_number][_pvar];
207 (*_dgrads_qp_dgradv)[_qp][_gas_phase_number][_hvar] =
208 (*_dsaturation_dvar)[_qp][_gas_phase_number][_hvar];
209 (*_dgrads_qp_dgradv)[_qp][_aqueous_phase_number][_hvar] =
210 -(*_dgrads_qp_dgradv)[_qp][_gas_phase_number][_hvar];
212 const Real d2s_dp2 = (fsp_dp[_gas_phase_number].saturation.derivatives()[_pidx] -
213 _fsp[_gas_phase_number].saturation.derivatives()[_pidx]) /
216 const Real d2s_dh2 = (fsp_dh[_gas_phase_number].saturation.derivatives()[_hidx] -
217 _fsp[_gas_phase_number].saturation.derivatives()[_hidx]) /
220 const Real d2s_dph = (fsp_dp[_gas_phase_number].saturation.derivatives()[_hidx] -
221 _fsp[_gas_phase_number].saturation.derivatives()[_hidx]) /
223 (fsp_dh[_gas_phase_number].saturation.derivatives()[_pidx] -
224 _fsp[_gas_phase_number].saturation.derivatives()[_pidx]) /
227 (*_dgrads_qp_dv)[_qp][_gas_phase_number][_pvar] =
228 d2s_dp2 * _liquid_gradp_qp[_qp] + d2s_dph * _gradh_qp[_qp];
229 (*_dgrads_qp_dv)[_qp][_aqueous_phase_number][_pvar] =
230 -(*_dgrads_qp_dv)[_qp][_gas_phase_number][_pvar];
232 (*_dgrads_qp_dv)[_qp][_gas_phase_number][_hvar] =
233 d2s_dh2 * _gradh_qp[_qp] + d2s_dph * _liquid_gradp_qp[_qp];
234 (*_dgrads_qp_dv)[_qp][_aqueous_phase_number][_hvar] =
235 -(*_dgrads_qp_dv)[_qp][_gas_phase_number][_hvar];
239 const Real dpc = _pc.dCapillaryPressure(_fsp[_aqueous_phase_number].saturation.value());
240 const Real d2pc = _pc.d2CapillaryPressure(_fsp[_aqueous_phase_number].saturation.value());
242 (*_gradp_qp)[_qp][_aqueous_phase_number] = _liquid_gradp_qp[_qp];
243 (*_gradp_qp)[_qp][_gas_phase_number] =
244 _liquid_gradp_qp[_qp] + dpc * (*_grads_qp)[_qp][_aqueous_phase_number];
246 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
247 (*_dgradp_qp_dgradv)[_qp][ph][_pvar] = 1.0;
249 (*_dgradp_qp_dgradv)[_qp][_gas_phase_number][_pvar] +=
250 dpc * (*_dgrads_qp_dgradv)[_qp][_aqueous_phase_number][_pvar];
251 (*_dgradp_qp_dgradv)[_qp][_gas_phase_number][_hvar] =
252 dpc * (*_dgrads_qp_dgradv)[_qp][_aqueous_phase_number][_hvar];
254 (*_dgradp_qp_dv)[_qp][_gas_phase_number][_pvar] =
255 d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
256 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_pvar] +
257 dpc * (*_dgrads_qp_dv)[_qp][_aqueous_phase_number][_pvar];
259 (*_dgradp_qp_dv)[_qp][_gas_phase_number][_hvar] =
260 d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
261 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_hvar] +
262 dpc * (*_dgrads_qp_dv)[_qp][_aqueous_phase_number][_hvar];