21 "Variable that is the porepressure of the gas phase");
24 "temperature", 20,
"The fluid temperature (C or K, depending on temperature_unit)");
25 params.
addCoupledVar(
"xnacl", 0,
"The salt mass fraction in the brine (kg/kg)");
26 params.
addRequiredParam<UserObjectName>(
"fluid_state",
"Name of the FluidState UserObject");
28 "variables and a vapor-liquid flash");
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])
102 template <
bool is_ad>
109 _fs.clearFluidStateProperties(_fsp);
110 _fs.thermophysicalProperties(_gas_porepressure[_qp], Tk, _Xnacl[_qp], (*_Z[0])[_qp], _qp, _fsp);
113 template <
bool is_ad>
120 template <
bool is_ad>
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] *
std::vector< unsigned int > _Zvar
PorousFlow variable number of Z.
Moose::GenericType< Real, is_ad > GenericReal
virtual void thermophysicalProperties() override
Calculates all required thermophysical properties and derivatives for each phase and fluid component...
registerMooseObject("PorousFlowApp", PorousFlowFluidState)
virtual void initQpStatefulProperties() override
void mooseError(Args &&... args)
Compositional flash routines for miscible multiphase flow classes with multiple fluid components...
static InputParameters validParams()
virtual void initQpStatefulProperties() override
std::vector< const GenericVariableGradient< is_ad > * > _gradZ_qp
Gradient(s) of total mass fraction(s) of the gas component(s) (only defined at the qps) ...
static InputParameters validParams()
Fluid state class using a persistent set of primary variables for the mutliphase, multicomponent case...
virtual void computeQpProperties() override
const PorousFlowFluidStateMultiComponentBase & _fs
FluidState UserObject.
std::vector< unsigned int > _Z_varnum
Moose variable number of Z.
PorousFlowFluidStateTempl(const InputParameters ¶meters)
std::vector< const GenericVariableValue< is_ad > * > _Z
Total mass fraction(s) of the gas component(s) summed over all phases.
virtual void computeQpProperties() override
Fluid state base class using a persistent set of primary variables for multiphase, single and multicomponent cases.
const unsigned int _num_phases
Number of phases.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
unsigned int numPhases() const
The maximum number of phases in this model.
const unsigned int _num_Z_vars
Number of coupled total mass fractions. Should be _num_phases - 1.