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())
81 " phases are allowed. Please check the number of phases entered in the dictator is "
92 _Z[i] = (_nodal_material ? &this->
template coupledGenericDofValue<is_ad>(
"z", i)
93 : &this->
template coupledGenericValue<is_ad>(
"z", i));
94 _gradZ_qp[i] = &this->
template coupledGenericGradient<is_ad>(
"z", i);
97 ? _dictator.porousFlowVariableNum(
_Z_varnum[i])
130 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
134 if (_dictator.isPorousFlowVariable(_gas_porepressure_varnum))
136 (*_dporepressure_dvar)[_qp][ph][_pvar] = _fsp[ph].pressure.derivatives()[_pidx];
137 (*_dsaturation_dvar)[_qp][ph][_pvar] = _fsp[ph].saturation.derivatives()[_pidx];
138 (*_dfluid_density_dvar)[_qp][ph][_pvar] = _fsp[ph].density.derivatives()[_pidx];
139 (*_dfluid_viscosity_dvar)[_qp][ph][_pvar] = _fsp[ph].viscosity.derivatives()[_pidx];
140 (*_dfluid_enthalpy_dvar)[_qp][ph][_pvar] = _fsp[ph].enthalpy.derivatives()[_pidx];
141 (*_dfluid_internal_energy_dvar)[_qp][ph][_pvar] =
142 _fsp[ph].internal_energy.derivatives()[_pidx];
144 for (
unsigned int comp = 0; comp < _num_components; ++comp)
145 (*_dmass_frac_dvar)[_qp][ph][comp][_pvar] =
146 _fsp[ph].mass_fraction[comp].derivatives()[_pidx];
150 if (_dictator.isPorousFlowVariable(_Z_varnum[0]))
152 (*_dporepressure_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].pressure.derivatives()[_Zidx];
153 (*_dsaturation_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].saturation.derivatives()[_Zidx];
154 (*_dfluid_density_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].density.derivatives()[_Zidx];
155 (*_dfluid_viscosity_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].viscosity.derivatives()[_Zidx];
156 (*_dfluid_enthalpy_dvar)[_qp][ph][_Zvar[0]] = _fsp[ph].enthalpy.derivatives()[_Zidx];
157 (*_dfluid_internal_energy_dvar)[_qp][ph][_Zvar[0]] =
158 _fsp[ph].internal_energy.derivatives()[_Zidx];
160 for (
unsigned int comp = 0; comp < _num_components; ++comp)
161 (*_dmass_frac_dvar)[_qp][ph][comp][_Zvar[0]] =
162 _fsp[ph].mass_fraction[comp].derivatives()[_Zidx];
167 if (_dictator.isPorousFlowVariable(_temperature_varnum))
169 (*_dporepressure_dvar)[_qp][ph][_Tvar] = _fsp[ph].pressure.derivatives()[_Tidx];
170 (*_dsaturation_dvar)[_qp][ph][_Tvar] = _fsp[ph].saturation.derivatives()[_Tidx];
171 (*_dfluid_density_dvar)[_qp][ph][_Tvar] = _fsp[ph].density.derivatives()[_Tidx];
172 (*_dfluid_viscosity_dvar)[_qp][ph][_Tvar] = _fsp[ph].viscosity.derivatives()[_Tidx];
173 (*_dfluid_enthalpy_dvar)[_qp][ph][_Tvar] = _fsp[ph].enthalpy.derivatives()[_Tidx];
174 (*_dfluid_internal_energy_dvar)[_qp][ph][_Tvar] =
175 _fsp[ph].internal_energy.derivatives()[_Tidx];
177 for (
unsigned int comp = 0; comp < _num_components; ++comp)
178 (*_dmass_frac_dvar)[_qp][ph][comp][_Tvar] =
179 _fsp[ph].mass_fraction[comp].derivatives()[_Tidx];
183 if (_dictator.isPorousFlowVariable(_Xnacl_varnum))
185 (*_dporepressure_dvar)[_qp][ph][_Xvar] = _fsp[ph].pressure.derivatives()[_Xidx];
186 (*_dsaturation_dvar)[_qp][ph][_Xvar] = _fsp[ph].saturation.derivatives()[_Xidx];
187 (*_dfluid_density_dvar)[_qp][ph][_Xvar] += _fsp[ph].density.derivatives()[_Xidx];
188 (*_dfluid_viscosity_dvar)[_qp][ph][_Xvar] += _fsp[ph].viscosity.derivatives()[_Xidx];
189 (*_dfluid_enthalpy_dvar)[_qp][ph][_Xvar] = _fsp[ph].enthalpy.derivatives()[_Xidx];
190 (*_dfluid_internal_energy_dvar)[_qp][ph][_Xvar] =
191 _fsp[ph].internal_energy.derivatives()[_Xidx];
193 for (
unsigned int comp = 0; comp < _num_components; ++comp)
194 (*_dmass_frac_dvar)[_qp][ph][comp][_Xvar] =
195 _fsp[ph].mass_fraction[comp].derivatives()[_Xidx];
203 if (!_nodal_material)
204 if constexpr (!is_ad)
207 const Real dpc = _pc.dCapillaryPressure(_fsp[_aqueous_phase_number].saturation.value(), _qp);
209 _pc.d2CapillaryPressure(_fsp[_aqueous_phase_number].saturation.value(), _qp);
212 (*_grads_qp)[_qp][_gas_phase_number] =
213 (*_dsaturation_dvar)[_qp][_gas_phase_number][_pvar] * _gas_gradp_qp[_qp] +
214 (*_dsaturation_dvar)[_qp][_gas_phase_number][_Zvar[0]] * (*_gradZ_qp[0])[_qp] +
215 (*_dsaturation_dvar)[_qp][_gas_phase_number][_Tvar] * (*_gradT_qp)[_qp];
216 (*_grads_qp)[_qp][_aqueous_phase_number] = -(*_grads_qp)[_qp][_gas_phase_number];
218 (*_gradp_qp)[_qp][_gas_phase_number] = _gas_gradp_qp[_qp];
219 (*_gradp_qp)[_qp][_aqueous_phase_number] =
220 _gas_gradp_qp[_qp] - dpc * (*_grads_qp)[_qp][_aqueous_phase_number];
223 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component] =
224 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_pidx] *
226 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Zidx] *
227 (*_gradZ_qp[0])[_qp] +
228 _fsp[_aqueous_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Tidx] *
230 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_gas_fluid_component] =
231 -(*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component];
233 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component] =
234 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_pidx] *
236 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Zidx] *
237 (*_gradZ_qp[0])[_qp] +
238 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Tidx] *
240 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_gas_fluid_component] =
241 -(*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component];
244 if (_dictator.isPorousFlowVariable(_gas_porepressure_varnum))
246 for (
unsigned int ph = 0; ph < _num_phases; ++ph)
247 (*_dgradp_qp_dgradv)[_qp][ph][_pvar] = 1.0;
249 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_pvar] +=
250 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_pvar];
252 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_pvar] =
253 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
254 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_pvar];
257 if (_dictator.isPorousFlowVariable(_Z_varnum[0]))
259 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Zvar[0]] =
260 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Zvar[0]];
262 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Zvar[0]] =
263 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
264 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Zvar[0]];
267 if (_dictator.isPorousFlowVariable(_temperature_varnum))
269 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Tvar] =
270 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Tvar];
272 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Tvar] =
273 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
274 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Tvar];
278 if (_dictator.isPorousFlowVariable(_Xnacl_varnum))
280 (*_dgradp_qp_dgradv)[_qp][_aqueous_phase_number][_Xvar] =
281 -dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar];
283 (*_grads_qp)[_qp][_aqueous_phase_number] +=
284 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
286 (*_grads_qp)[_qp][_gas_phase_number] -=
287 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
289 (*_gradp_qp)[_qp][_aqueous_phase_number] -=
290 dpc * (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar] * _grad_Xnacl_qp[_qp];
292 (*_dgradp_qp_dv)[_qp][_aqueous_phase_number][_Xvar] =
293 -d2pc * (*_grads_qp)[_qp][_aqueous_phase_number] *
294 (*_dsaturation_dvar)[_qp][_aqueous_phase_number][_Xvar];
296 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_salt_component] = _grad_Xnacl_qp[_qp];
297 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_aqueous_fluid_component] +=
298 _fsp[_aqueous_phase_number]
299 .mass_fraction[_aqueous_fluid_component]
300 .derivatives()[_Xidx] *
302 (*_grad_mass_frac_qp)[_qp][_aqueous_phase_number][_gas_fluid_component] -=
303 _fsp[_aqueous_phase_number]
304 .mass_fraction[_aqueous_fluid_component]
305 .derivatives()[_Xidx] *
307 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_aqueous_fluid_component] +=
308 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Xidx] *
310 (*_grad_mass_frac_qp)[_qp][_gas_phase_number][_gas_fluid_component] -=
311 _fsp[_gas_phase_number].mass_fraction[_aqueous_fluid_component].derivatives()[_Xidx] *