35 _gas_porepressure(_nodal_material
36 ? this->template coupledGenericDofValue<is_ad>(
"gas_porepressure")
37 : this->template coupledGenericValue<is_ad>(
"gas_porepressure")),
38 _gas_gradp_qp(this->template coupledGenericGradient<is_ad>(
"gas_porepressure")),
39 _gas_porepressure_varnum(coupled(
"gas_porepressure")),
40 _pvar(_dictator.isPorousFlowVariable(_gas_porepressure_varnum)
41 ? _dictator.porousFlowVariableNum(_gas_porepressure_varnum)
43 _num_Z_vars(coupledComponents(
"z")),
44 _is_Xnacl_nodal(isCoupled(
"xnacl") ? getFieldVar(
"xnacl", 0)->isNodal() : false),
45 _Xnacl(_nodal_material && _is_Xnacl_nodal
46 ? this->template coupledGenericDofValue<is_ad>(
"xnacl")
47 : this->template coupledGenericValue<is_ad>(
"xnacl")),
48 _grad_Xnacl_qp(this->template coupledGenericGradient<is_ad>(
"xnacl")),
49 _Xnacl_varnum(coupled(
"xnacl")),
50 _Xvar(_dictator.isPorousFlowVariable(_Xnacl_varnum)
51 ? _dictator.porousFlowVariableNum(_Xnacl_varnum)
54 _aqueous_phase_number(_fs.aqueousPhaseIndex()),
55 _gas_phase_number(_fs.gasPhaseIndex()),
56 _aqueous_fluid_component(_fs.aqueousComponentIndex()),
57 _gas_fluid_component(_fs.gasComponentIndex()),
58 _salt_component(_fs.saltComponentIndex()),
60 this->template getGenericMaterialProperty<Real, is_ad>(
"PorousFlow_temperature" + _sfx)),
61 _gradT_qp(_nodal_material ? nullptr
62 : &this->template getGenericMaterialProperty<RealGradient, is_ad>(
63 "PorousFlow_grad_temperature" + _sfx)),
64 _dtemperature_dvar(is_ad ? nullptr
65 : &this->template getMaterialProperty<
std::vector<Real>>(
66 "dPorousFlow_temperature" + _sfx +
"_dvar")),
67 _temperature_varnum(coupled(
"temperature")),
68 _Tvar(_dictator.isPorousFlowVariable(_temperature_varnum)
69 ? _dictator.porousFlowVariableNum(_temperature_varnum)
71 _pidx(_fs.getPressureIndex()),
72 _Tidx(_fs.getTemperatureIndex()),
73 _Zidx(_fs.getZIndex()),
74 _Xidx(_fs.getXIndex())
78 if (this->_nodal_material)
79 this->checkNodalVariables({
"gas_porepressure",
"z"});
85 " phases are allowed. Please check the number of phases entered in the dictator is "
96 _Z[i] = (_nodal_material ? &this->
template coupledGenericDofValue<is_ad>(
"z", i)
97 : &this->
template coupledGenericValue<is_ad>(
"z", i));
98 _gradZ_qp[i] = &this->
template coupledGenericGradient<is_ad>(
"z", i);
101 ? _dictator.porousFlowVariableNum(
_Z_varnum[i])
134 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
138 if (_dictator.isPorousFlowVariable(_gas_porepressure_varnum))
140 (*_dporepressure_dvar)[_qp][ph][_pvar] = _fsp[ph].pressure.derivatives()[_pidx];
141 (*_dsaturation_dvar)[_qp][ph][_pvar] = _fsp[ph].saturation.derivatives()[_pidx];
142 (*_dfluid_density_dvar)[_qp][ph][_pvar] = _fsp[ph].density.derivatives()[_pidx];
143 (*_dfluid_viscosity_dvar)[_qp][ph][_pvar] = _fsp[ph].viscosity.derivatives()[_pidx];
144 (*_dfluid_enthalpy_dvar)[_qp][ph][_pvar] = _fsp[ph].enthalpy.derivatives()[_pidx];
145 (*_dfluid_internal_energy_dvar)[_qp][ph][_pvar] =
146 _fsp[ph].internal_energy.derivatives()[_pidx];
148 for (
unsigned int comp = 0; comp < _num_components; ++comp)
149 (*_dmass_frac_dvar)[_qp][ph][comp][_pvar] =
150 _fsp[ph].mass_fraction[comp].derivatives()[_pidx];
154 if (_dictator.isPorousFlowVariable(_Z_varnum[0]))
156 (*_dporepressure_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].pressure.derivatives()[_Zidx];
157 (*_dsaturation_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].saturation.derivatives()[_Zidx];
158 (*_dfluid_density_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].density.derivatives()[_Zidx];
159 (*_dfluid_viscosity_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].viscosity.derivatives()[_Zidx];
160 (*_dfluid_enthalpy_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].enthalpy.derivatives()[_Zidx];
161 (*_dfluid_internal_energy_dvar)[_qp][ph][_Zvar[0]] =
162 _fsp[ph].internal_energy.derivatives()[_Zidx];
164 for (
unsigned int comp = 0; comp < _num_components; ++comp)
165 (*_dmass_frac_dvar)[_qp][ph][comp][_Zvar[0]] =
166 _fsp[ph].mass_fraction[comp].derivatives()[_Zidx];
171 if (_dictator.isPorousFlowVariable(_temperature_varnum))
173 (*_dporepressure_dvar)[_qp][ph][_Tvar] = _fsp[ph].pressure.derivatives()[_Tidx];
174 (*_dsaturation_dvar)[_qp][ph][_Tvar] = _fsp[ph].saturation.derivatives()[_Tidx];
175 (*_dfluid_density_dvar)[_qp][ph][_Tvar] = _fsp[ph].density.derivatives()[_Tidx];
176 (*_dfluid_viscosity_dvar)[_qp][ph][_Tvar] = _fsp[ph].viscosity.derivatives()[_Tidx];
177 (*_dfluid_enthalpy_dvar)[_qp][ph][_Tvar] = _fsp[ph].enthalpy.derivatives()[_Tidx];
178 (*_dfluid_internal_energy_dvar)[_qp][ph][_Tvar] =
179 _fsp[ph].internal_energy.derivatives()[_Tidx];
181 for (
unsigned int comp = 0; comp < _num_components; ++comp)
182 (*_dmass_frac_dvar)[_qp][ph][comp][_Tvar] =
183 _fsp[ph].mass_fraction[comp].derivatives()[_Tidx];
187 if (_dictator.isPorousFlowVariable(_Xnacl_varnum))
189 (*_dporepressure_dvar)[_qp][ph][_Xvar] = _fsp[ph].pressure.derivatives()[_Xidx];
190 (*_dsaturation_dvar)[_qp][ph][_Xvar] = _fsp[ph].saturation.derivatives()[_Xidx];
191 (*_dfluid_density_dvar)[_qp][ph][_Xvar] += _fsp[ph].density.derivatives()[_Xidx];
192 (*_dfluid_viscosity_dvar)[_qp][ph][_Xvar] += _fsp[ph].viscosity.derivatives()[_Xidx];
193 (*_dfluid_enthalpy_dvar)[_qp][ph][_Xvar] = _fsp[ph].enthalpy.derivatives()[_Xidx];
194 (*_dfluid_internal_energy_dvar)[_qp][ph][_Xvar] =
195 _fsp[ph].internal_energy.derivatives()[_Xidx];
197 for (
unsigned int comp = 0; comp < _num_components; ++comp)
198 (*_dmass_frac_dvar)[_qp][ph][comp][_Xvar] =
199 _fsp[ph].mass_fraction[comp].derivatives()[_Xidx];
207 if (!_nodal_material)
208 if constexpr (!is_ad)
211 const Real dpc = _pc.dCapillaryPressure(_fsp[_aqueous_phase_number].saturation.value(), _qp);
213 _pc.d2CapillaryPressure(_fsp[_aqueous_phase_number].saturation.value(), _qp);
216 (*_grads_qp)[_qp][_gas_phase_number] =
217 (*_dsaturation_dvar)[_qp][_gas_phase_number][_pvar] * _gas_gradp_qp[_qp] +
218 (*_dsaturation_dvar)[_qp][_gas_phase_number][_Zvar[0]] * (*_gradZ_qp[0])[_qp] +
219 (*_dsaturation_dvar)[_qp][_gas_phase_number][_Tvar] * (*_gradT_qp)[_qp];
220 (*_grads_qp)[_qp][_aqueous_phase_number] = -(*_grads_qp)[_qp][_gas_phase_number];
222 (*_gradp_qp)[_qp][_gas_phase_number] = _gas_gradp_qp[_qp];
223 (*_gradp_qp)[_qp][_aqueous_phase_number] =
224 _gas_gradp_qp[_qp] - dpc * (*_grads_qp)[_qp][_aqueous_phase_number];
227 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component] =
228 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_pidx] *
230 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Zidx] *
231 (*_gradZ_qp[0])[_qp] +
232 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Tidx] *
234 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_gas_fluid_component] =
235 -(*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component];
237 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component] =
238 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_pidx] *
240 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Zidx] *
241 (*_gradZ_qp[0])[_qp] +
242 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Tidx] *
244 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_gas_fluid_component] =
245 -(*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component];
248 if (_dictator.isPorousFlowVariable(_gas_porepressure_varnum))
250 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
251 (*_dgradp_qp_dgradv)[_qp][ph][_pvar] = 1.0;
253 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_pvar] +=
254 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_pvar];
256 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_pvar] =
257 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
258 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_pvar];
261 if (_dictator.isPorousFlowVariable(_Z_varnum[0]))
263 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Zvar[0]] =
264 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Zvar[0]];
266 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Zvar[0]] =
267 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
268 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Zvar[0]];
271 if (_dictator.isPorousFlowVariable(_temperature_varnum))
273 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Tvar] =
274 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Tvar];
276 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Tvar] =
277 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
278 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Tvar];
282 if (_dictator.isPorousFlowVariable(_Xnacl_varnum))
284 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Xvar] =
285 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar];
287 (*_grads_qp)[_qp][_aqueous_phase_number] +=
288 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
290 (*_grads_qp)[_qp][_gas_phase_number] -=
291 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
293 (*_gradp_qp)[_qp][_aqueous_phase_number] -=
294 dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
296 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Xvar] =
297 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
298 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar];
300 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_salt_component] = _grad_Xnacl_qp[_qp];
301 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component] +=
302 _fsp[_aqueous_phase_number]
303 .mass_fraction[_aqueous_fluid_component]
304 .derivatives()[_Xidx] *
306 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_gas_fluid_component] -=
307 _fsp[_aqueous_phase_number]
308 .mass_fraction[_aqueous_fluid_component]
309 .derivatives()[_Xidx] *
311 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component] +=
312 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Xidx] *
314 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_gas_fluid_component] -=
315 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Xidx] *