47 _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
48 _num_phases(_dictator.numPhases()),
49 _fluid_present(_num_phases > 0),
50 _strain_at_nearest_qp(this->template getParam<bool>(
"strain_at_nearest_qp")),
51 _porosity(this->template getGenericMaterialProperty<Real, is_ad>(
"PorousFlow_porosity_nodal")),
52 _dporosity_dvar(is_ad ? nullptr
53 : &this->template getMaterialProperty<
std::vector<Real>>(
54 "dPorousFlow_porosity_nodal_dvar")),
55 _dporosity_dgradvar(is_ad ? nullptr
56 : &this->template getMaterialProperty<
std::vector<RealGradient>>(
57 "dPorousFlow_porosity_nodal_dgradvar")),
58 _nearest_qp(_strain_at_nearest_qp ? &this->template getMaterialProperty<unsigned
int>(
59 "PorousFlow_nearestqp_nodal")
61 _rock_energy_nodal(this->template getGenericMaterialProperty<Real, is_ad>(
62 "PorousFlow_matrix_internal_energy_nodal")),
63 _drock_energy_nodal_dvar(is_ad ? nullptr
64 : &this->template getMaterialProperty<
std::vector<Real>>(
65 "dPorousFlow_matrix_internal_energy_nodal_dvar")),
66 _fluid_density(_fluid_present
67 ? &this->template getGenericMaterialProperty<
std::vector<Real>, is_ad>(
68 "PorousFlow_fluid_phase_density_nodal")
70 _dfluid_density_dvar(_fluid_present && !is_ad
71 ? &this->template getMaterialProperty<
std::vector<
std::vector<Real>>>(
72 "dPorousFlow_fluid_phase_density_nodal_dvar")
74 _fluid_saturation_nodal(
75 _fluid_present ? &this->template getGenericMaterialProperty<
std::vector<Real>, is_ad>(
76 "PorousFlow_saturation_nodal")
78 _dfluid_saturation_nodal_dvar(
79 _fluid_present && !is_ad
80 ? &this->template getMaterialProperty<
std::vector<
std::vector<Real>>>(
81 "dPorousFlow_saturation_nodal_dvar")
83 _energy_nodal(_fluid_present
84 ? &this->template getGenericMaterialProperty<
std::vector<Real>, is_ad>(
85 "PorousFlow_fluid_phase_internal_energy_nodal")
87 _denergy_nodal_dvar(_fluid_present && !is_ad
88 ? &this->template getMaterialProperty<
std::vector<
std::vector<Real>>>(
89 "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
91 _strain_rate_qp(this->template getGenericMaterialProperty<Real, is_ad>(
92 "PorousFlow_volumetric_strain_rate_qp")),
93 _dstrain_rate_qp_dvar(is_ad ? nullptr
94 : &this->template getMaterialProperty<
std::vector<RealGradient>>(
95 "dPorousFlow_volumetric_strain_rate_qp_dvar"))
129 if constexpr (!is_ad)
131 if (_dictator.notPorousFlowVariable(jvar))
134 Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
135 for (
unsigned ph = 0; ph < _num_phases; ++ph)
136 energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
137 (*_energy_nodal)[_i][ph] * _porosity[_i];
139 const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
140 Real dvol = (*_dstrain_rate_qp_dvar)[_qp][pvar] * _grad_phi[_j][_qp];
142 return _test[_i][_qp] * energy * dvol;
146 libmesh_ignore(jvar);
155 if constexpr (!is_ad)
157 if (_dictator.notPorousFlowVariable(jvar))
160 const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
161 const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
163 Real denergy = -(*_dporosity_dgradvar)[_i][pvar] * _grad_phi[_j][_i] * _rock_energy_nodal[_i];
164 for (
unsigned ph = 0; ph < _num_phases; ++ph)
165 denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
166 (*_energy_nodal)[_i][ph] * (*_dporosity_dgradvar)[_i][pvar] *
167 _grad_phi[_j][nearest_qp];
170 return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
172 denergy += (*_drock_energy_nodal_dvar)[_i][pvar] * (1.0 - _porosity[_i]);
173 denergy -= _rock_energy_nodal[_i] * (*_dporosity_dvar)[_i][pvar];
174 for (
unsigned ph = 0; ph < _num_phases; ++ph)
176 denergy += (*_dfluid_density_dvar)[_i][ph][pvar] * (*_fluid_saturation_nodal)[_i][ph] *
177 (*_energy_nodal)[_i][ph] * _porosity[_i];
178 denergy += (*_fluid_density)[_i][ph] * (*_dfluid_saturation_nodal_dvar)[_i][ph][pvar] *
179 (*_energy_nodal)[_i][ph] * _porosity[_i];
180 denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
181 (*_denergy_nodal_dvar)[_i][ph][pvar] * _porosity[_i];
182 denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
183 (*_energy_nodal)[_i][ph] * (*_dporosity_dvar)[_i][pvar];
186 return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
190 libmesh_ignore(jvar);