12 #include "MooseVariable.h"
20 InputParameters params = validParams<TimeKernel>();
21 params.addParam<
bool>(
"strain_at_nearest_qp",
23 "When calculating nodal porosity that depends on strain, use the strain at "
24 "the nearest quadpoint. This adds a small extra computational burden, and "
25 "is not necessary for simulations involving only linear lagrange elements. "
26 " If you set this to true, you will also want to set the same parameter to "
27 "true for related Kernels and Materials");
28 params.addRequiredParam<UserObjectName>(
29 "PorousFlowDictator",
"The UserObject that holds the list of PorousFlow variable names.");
30 params.addClassDescription(
"Energy-density*rate_of_solid_volumetric_expansion");
35 const InputParameters & parameters)
36 : TimeKernel(parameters),
38 _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
39 _num_phases(_dictator.numPhases()),
40 _fluid_present(_num_phases > 0),
41 _strain_at_nearest_qp(getParam<bool>(
"strain_at_nearest_qp")),
42 _porosity(getMaterialProperty<Real>(
"PorousFlow_porosity_nodal")),
43 _dporosity_dvar(getMaterialProperty<std::vector<Real>>(
"dPorousFlow_porosity_nodal_dvar")),
45 getMaterialProperty<std::vector<
RealGradient>>(
"dPorousFlow_porosity_nodal_dgradvar")),
46 _nearest_qp(_strain_at_nearest_qp
47 ? &getMaterialProperty<unsigned int>(
"PorousFlow_nearestqp_nodal")
49 _rock_energy_nodal(getMaterialProperty<Real>(
"PorousFlow_matrix_internal_energy_nodal")),
50 _drock_energy_nodal_dvar(
51 getMaterialProperty<std::vector<Real>>(
"dPorousFlow_matrix_internal_energy_nodal_dvar")),
52 _fluid_density(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
53 "PorousFlow_fluid_phase_density_nodal")
55 _dfluid_density_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
56 "dPorousFlow_fluid_phase_density_nodal_dvar")
58 _fluid_saturation_nodal(
59 _fluid_present ? &getMaterialProperty<std::vector<Real>>(
"PorousFlow_saturation_nodal")
61 _dfluid_saturation_nodal_dvar(_fluid_present
62 ? &getMaterialProperty<std::vector<std::vector<Real>>>(
63 "dPorousFlow_saturation_nodal_dvar")
65 _energy_nodal(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
66 "PorousFlow_fluid_phase_internal_energy_nodal")
68 _denergy_nodal_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
69 "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
71 _strain_rate_qp(getMaterialProperty<Real>(
"PorousFlow_volumetric_strain_rate_qp")),
72 _dstrain_rate_qp_dvar(getMaterialProperty<std::vector<
RealGradient>>(
73 "dPorousFlow_volumetric_strain_rate_qp_dvar"))
82 energy += (*
_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
108 energy += (*
_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
109 (*_energy_nodal)[_i][ph] *
_porosity[_i];
114 return _test[_i][_qp] * energy * dvol;
127 denergy += (*
_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
137 denergy += (*_dfluid_density_dvar)[_i][ph][pvar] * (*_fluid_saturation_nodal)[_i][ph] *
138 (*_energy_nodal)[_i][ph] *
_porosity[_i];
139 denergy += (*_fluid_density)[_i][ph] * (*_dfluid_saturation_nodal_dvar)[_i][ph][pvar] *
140 (*_energy_nodal)[_i][ph] *
_porosity[_i];
141 denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
142 (*_denergy_nodal_dvar)[_i][ph][pvar] *
_porosity[_i];
143 denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *