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 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<TimeKernel>();
21  params.addParam<bool>("strain_at_nearest_qp",
22  false,
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");
31  return params;
32 }
33 
35  const InputParameters & parameters)
36  : TimeKernel(parameters),
37  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
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")),
44  _dporosity_dgradvar(
45  getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")),
46  _nearest_qp(_strain_at_nearest_qp
47  ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal")
48  : nullptr),
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")
54  : nullptr),
55  _dfluid_density_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
56  "dPorousFlow_fluid_phase_density_nodal_dvar")
57  : nullptr),
58  _fluid_saturation_nodal(
59  _fluid_present ? &getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")
60  : nullptr),
61  _dfluid_saturation_nodal_dvar(_fluid_present
62  ? &getMaterialProperty<std::vector<std::vector<Real>>>(
63  "dPorousFlow_saturation_nodal_dvar")
64  : nullptr),
65  _energy_nodal(_fluid_present ? &getMaterialProperty<std::vector<Real>>(
66  "PorousFlow_fluid_phase_internal_energy_nodal")
67  : nullptr),
68  _denergy_nodal_dvar(_fluid_present ? &getMaterialProperty<std::vector<std::vector<Real>>>(
69  "dPorousFlow_fluid_phase_internal_energy_nodal_dvar")
70  : nullptr),
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"))
74 {
75 }
76 
77 Real
79 {
80  Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
81  for (unsigned ph = 0; ph < _num_phases; ++ph)
82  energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
83  (*_energy_nodal)[_i][ph] * _porosity[_i];
84 
85  return _test[_i][_qp] * energy * _strain_rate_qp[_qp];
86 }
87 
88 Real
90 {
91  return computedEnergyQpJac(_var.number()) + computedVolQpJac(_var.number());
92 }
93 
94 Real
96 {
97  return computedEnergyQpJac(jvar) + computedVolQpJac(jvar);
98 }
99 
100 Real
102 {
104  return 0.0;
105 
106  Real energy = (1.0 - _porosity[_i]) * _rock_energy_nodal[_i];
107  for (unsigned ph = 0; ph < _num_phases; ++ph)
108  energy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
109  (*_energy_nodal)[_i][ph] * _porosity[_i];
110 
111  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
112  Real dvol = _dstrain_rate_qp_dvar[_qp][pvar] * _grad_phi[_j][_qp];
113 
114  return _test[_i][_qp] * energy * dvol;
115 }
116 Real
118 {
120  return 0.0;
121 
122  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
123  const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
124 
125  Real denergy = -_dporosity_dgradvar[_i][pvar] * _grad_phi[_j][_i] * _rock_energy_nodal[_i];
126  for (unsigned ph = 0; ph < _num_phases; ++ph)
127  denergy += (*_fluid_density)[_i][ph] * (*_fluid_saturation_nodal)[_i][ph] *
128  (*_energy_nodal)[_i][ph] * _dporosity_dgradvar[_i][pvar] * _grad_phi[_j][nearest_qp];
129 
130  if (_i != _j)
131  return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
132 
133  denergy += _drock_energy_nodal_dvar[_i][pvar] * (1.0 - _porosity[_i]);
134  denergy -= _rock_energy_nodal[_i] * _dporosity_dvar[_i][pvar];
135  for (unsigned ph = 0; ph < _num_phases; ++ph)
136  {
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] *
144  (*_energy_nodal)[_i][ph] * _dporosity_dvar[_i][pvar];
145  }
146 
147  return _test[_i][_qp] * denergy * _strain_rate_qp[_qp];
148 }
PorousFlowHeatVolumetricExpansion::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: PorousFlowHeatVolumetricExpansion.C:89
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
PorousFlowDictator::notPorousFlowVariable
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
Definition: PorousFlowDictator.C:161
PorousFlowHeatVolumetricExpansion::computedEnergyQpJac
Real computedEnergyQpJac(unsigned int jvar)
Derivative of energy part of the residual with respect to the Variable with variable number jvar.
Definition: PorousFlowHeatVolumetricExpansion.C:117
PorousFlowHeatVolumetricExpansion::computeQpResidual
virtual Real computeQpResidual() override
Definition: PorousFlowHeatVolumetricExpansion.C:78
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowHeatVolumetricExpansion)
PorousFlowHeatVolumetricExpansion::_porosity
const MaterialProperty< Real > & _porosity
Porosity.
Definition: PorousFlowHeatVolumetricExpansion.h:50
PorousFlowHeatVolumetricExpansion
Kernel = energy_density * d(volumetric_strain)/dt which is lumped to the nodes.
Definition: PorousFlowHeatVolumetricExpansion.h:24
PorousFlowHeatVolumetricExpansion::PorousFlowHeatVolumetricExpansion
PorousFlowHeatVolumetricExpansion(const InputParameters &parameters)
Definition: PorousFlowHeatVolumetricExpansion.C:34
PorousFlowHeatVolumetricExpansion::_num_phases
const unsigned int _num_phases
Number of fluid phases.
Definition: PorousFlowHeatVolumetricExpansion.h:41
PorousFlowDictator::porousFlowVariableNum
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
Definition: PorousFlowDictator.C:135
PorousFlowHeatVolumetricExpansion::_fluid_density
const MaterialProperty< std::vector< Real > > *const _fluid_density
Nodal fluid density.
Definition: PorousFlowHeatVolumetricExpansion.h:68
PorousFlowHeatVolumetricExpansion::_dstrain_rate_qp_dvar
const MaterialProperty< std::vector< RealGradient > > & _dstrain_rate_qp_dvar
d(strain rate)/d(PorousFlow variable)
Definition: PorousFlowHeatVolumetricExpansion.h:89
PorousFlowDictator
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
Definition: PorousFlowDictator.h:71
PorousFlowHeatVolumetricExpansion::_rock_energy_nodal
const MaterialProperty< Real > & _rock_energy_nodal
Nodal rock energy density.
Definition: PorousFlowHeatVolumetricExpansion.h:62
PorousFlowHeatVolumetricExpansion::_dporosity_dvar
const MaterialProperty< std::vector< Real > > & _dporosity_dvar
d(porosity)/d(PorousFlow variable)
Definition: PorousFlowHeatVolumetricExpansion.h:53
PorousFlowHeatVolumetricExpansion::_strain_at_nearest_qp
const bool _strain_at_nearest_qp
Whether the porosity uses the volumetric strain at the closest quadpoint.
Definition: PorousFlowHeatVolumetricExpansion.h:47
PorousFlowHeatVolumetricExpansion::_dporosity_dgradvar
const MaterialProperty< std::vector< RealGradient > > & _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
Definition: PorousFlowHeatVolumetricExpansion.h:56
PorousFlowHeatVolumetricExpansion::computedVolQpJac
Real computedVolQpJac(unsigned int jvar)
Derivative of volumetric-strain part of the residual with respect to the Variable with variable numbe...
Definition: PorousFlowHeatVolumetricExpansion.C:101
PorousFlowHeatVolumetricExpansion::_drock_energy_nodal_dvar
const MaterialProperty< std::vector< Real > > & _drock_energy_nodal_dvar
d(nodal rock energy density)/d(PorousFlow variable)
Definition: PorousFlowHeatVolumetricExpansion.h:65
PorousFlowHeatVolumetricExpansion::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: PorousFlowHeatVolumetricExpansion.C:95
PorousFlowHeatVolumetricExpansion::_strain_rate_qp
const MaterialProperty< Real > & _strain_rate_qp
Strain rate.
Definition: PorousFlowHeatVolumetricExpansion.h:86
validParams< PorousFlowHeatVolumetricExpansion >
InputParameters validParams< PorousFlowHeatVolumetricExpansion >()
Definition: PorousFlowHeatVolumetricExpansion.C:18
PorousFlowHeatVolumetricExpansion.h
PorousFlowHeatVolumetricExpansion::_dictator
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
Definition: PorousFlowHeatVolumetricExpansion.h:35