www.mooseframework.org
PorousFlowHeatVolumetricExpansion.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 
12 #include "MooseVariable.h"
13 
15 
18 {
20  params.addParam<bool>("strain_at_nearest_qp",
21  false,
22  "When calculating nodal porosity that depends on strain, use the strain at "
23  "the nearest quadpoint. This adds a small extra computational burden, and "
24  "is not necessary for simulations involving only linear lagrange elements. "
25  " If you set this to true, you will also want to set the same parameter to "
26  "true for related Kernels and Materials");
27  params.addRequiredParam<UserObjectName>(
28  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
29  params.set<bool>("use_displaced_mesh") = false;
30  params.suppressParameter<bool>("use_displaced_mesh");
31  params.addClassDescription("Energy-density*rate_of_solid_volumetric_expansion. The "
32  "energy-density is lumped to the nodes");
33  return params;
34 }
35 
37  const InputParameters & parameters)
38  : TimeKernel(parameters),
39  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
40  _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
41  _num_phases(_dictator.numPhases()),
42  _fluid_present(_num_phases > 0),
43  _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")),
44  _porosity(getMaterialProperty<Real>("PorousFlow_porosity_nodal")),
45  _dporosity_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_nodal_dvar")),
46  _dporosity_dgradvar(
47  getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")),
48  _nearest_qp(_strain_at_nearest_qp
49  ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal")
50  : nullptr),
51  _rock_energy_nodal(getMaterialProperty<Real>("PorousFlow_matrix_internal_energy_nodal")),
52  _drock_energy_nodal_dvar(
53  getMaterialProperty<std::vector<Real>>("dPorousFlow_matrix_internal_energy_nodal_dvar")),
54  _fluid_density(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
55  "PorousFlow_fluid_phase_density_nodal")
56  : nullptr),
57  _dfluid_density_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
58  "dPorousFlow_fluid_phase_density_nodal_dvar")
59  : nullptr),
60  _fluid_saturation_nodal(
61  _fluid_present ? &getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")
62  : nullptr),
63  _dfluid_saturation_nodal_dvar(_fluid_present
64  ? &getMaterialProperty<std::vector<std::vector<Real>>>(
65  "dPorousFlow_saturation_nodal_dvar")
66  : nullptr),
67  _energy_nodal(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
68  "PorousFlow_fluid_phase_internal_energy_nodal")
69  : nullptr),
70  _denergy_nodal_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
71  "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
72  : nullptr),
73  _strain_rate_qp(getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")),
74  _dstrain_rate_qp_dvar(getMaterialProperty<std::vector<RealGradient>>(
75  "dPorousFlow_volumetric_strain_rate_qp_dvar"))
76 {
77 }
78 
79 Real
81 {
82  Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
83  for (unsigned ph = 0; ph < _num_phases; ++ph)
84  energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
85  (*_energy_nodal)[_i][ph] * _porosity[_i];
86 
87  return _test[_i][_qp] * energy * _strain_rate_qp[_qp];
88 }
89 
90 Real
92 {
94 }
95 
96 Real
98 {
99  return computedEnergyQpJac(jvar) + computedVolQpJac(jvar);
100 }
101 
102 Real
104 {
106  return 0.0;
107 
108  Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
109  for (unsigned ph = 0; ph < _num_phases; ++ph)
110  energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
111  (*_energy_nodal)[_i][ph] * _porosity[_i];
112 
113  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
114  Real dvol = _dstrain_rate_qp_dvar[_qp][pvar] * _grad_phi[_j][_qp];
115 
116  return _test[_i][_qp] * energy * dvol;
117 }
118 Real
120 {
122  return 0.0;
123 
124  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
125  const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
126 
127  Real denergy = -_dporosity_dgradvar[_i][pvar] * _grad_phi[_j][_i] * _rock_energy_nodal[_i];
128  for (unsigned ph = 0; ph < _num_phases; ++ph)
129  denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
130  (*_energy_nodal)[_i][ph] * _dporosity_dgradvar[_i][pvar] * _grad_phi[_j][nearest_qp];
131 
132  if (_i != _j)
133  return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
134 
135  denergy += _drock_energy_nodal_dvar[_i][pvar] * (1.0 - _porosity[_i]);
136  denergy -= _rock_energy_nodal[_i] * _dporosity_dvar[_i][pvar];
137  for (unsigned ph = 0; ph < _num_phases; ++ph)
138  {
139  denergy += (*_dfluid_density_dvar)[_i][ph][pvar] * (*_fluid_saturation_nodal)[_i][ph] *
140  (*_energy_nodal)[_i][ph] * _porosity[_i];
141  denergy += (*_fluid_density)[_i][ph] * (*_dfluid_saturation_nodal_dvar)[_i][ph][pvar] *
142  (*_energy_nodal)[_i][ph] * _porosity[_i];
143  denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
144  (*_denergy_nodal_dvar)[_i][ph][pvar] * _porosity[_i];
145  denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
146  (*_energy_nodal)[_i][ph] * _dporosity_dvar[_i][pvar];
147  }
148 
149  return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
150 }
Real computedVolQpJac(unsigned int jvar)
Derivative of volumetric-strain part of the residual with respect to the Variable with variable numbe...
Real computedEnergyQpJac(unsigned int jvar)
Derivative of energy part of the residual with respect to the Variable with variable number jvar...
Kernel = energy_density * d(volumetric_strain)/dt which is lumped to the nodes.
const MaterialProperty< std::vector< Real > > & _dporosity_dvar
d(porosity)/d(PorousFlow variable)
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
MooseVariable & _var
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int number() const
const VariablePhiGradient & _grad_phi
T & set(const std::string &name, bool quiet_mode=false)
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const MaterialProperty< std::vector< Real > > *const _fluid_density
Nodal fluid density.
registerMooseObject("PorousFlowApp", PorousFlowHeatVolumetricExpansion)
void addRequiredParam(const std::string &name, const std::string &doc_string)
PorousFlowHeatVolumetricExpansion(const InputParameters &parameters)
void suppressParameter(const std::string &name)
const VariableTestValue & _test
const MaterialProperty< Real > & _strain_rate_qp
Strain rate.
const MaterialProperty< Real > & _porosity
Porosity.
unsigned int _i
const MaterialProperty< std::vector< Real > > & _drock_energy_nodal_dvar
d(nodal rock energy density)/d(PorousFlow variable)
unsigned int _j
const MaterialProperty< std::vector< RealGradient > > & _dstrain_rate_qp_dvar
d(strain rate)/d(PorousFlow variable)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MaterialProperty< Real > & _rock_energy_nodal
Nodal rock energy density.
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
void addClassDescription(const std::string &doc_string)
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
const MaterialProperty< std::vector< RealGradient > > & _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
const unsigned int _num_phases
Number of fluid phases.
static InputParameters validParams()
void ErrorVector unsigned int
const bool _strain_at_nearest_qp
Whether the porosity uses the volumetric strain at the closest quadpoint.
unsigned int _qp