https://mooseframework.inl.gov
Loading...
Searching...
No Matches
PorousFlowHeatVolumetricExpansion.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
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
79Real
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
90Real
95
96Real
101
102Real
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}
118Real
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}
registerMooseObject("PorousFlowApp", PorousFlowHeatVolumetricExpansion)
void ErrorVector unsigned int
void suppressParameter(const std::string &name)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
unsigned int _qp
unsigned int _j
unsigned int _i
MooseVariable & _var
const VariableTestValue & _test
const VariablePhiGradient & _grad_phi
unsigned int number() const
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
Kernel = energy_density * d(volumetric_strain)/dt which is lumped to the nodes.
const MaterialProperty< Real > & _porosity
Porosity.
const MaterialProperty< Real > & _rock_energy_nodal
Nodal rock energy density.
const MaterialProperty< Real > & _strain_rate_qp
Strain rate.
const unsigned int _num_phases
Number of fluid phases.
const bool _strain_at_nearest_qp
Whether the porosity uses the volumetric strain at the closest quadpoint.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const MaterialProperty< std::vector< RealGradient > > & _dstrain_rate_qp_dvar
d(strain rate)/d(PorousFlow variable)
const MaterialProperty< std::vector< RealGradient > > & _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
Real computedVolQpJac(unsigned int jvar)
Derivative of volumetric-strain part of the residual with respect to the Variable with variable numbe...
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
PorousFlowHeatVolumetricExpansion(const InputParameters &parameters)
const MaterialProperty< std::vector< Real > > *const _fluid_density
Nodal fluid density.
Real computedEnergyQpJac(unsigned int jvar)
Derivative of energy part of the residual with respect to the Variable with variable number jvar.
const MaterialProperty< std::vector< Real > > & _dporosity_dvar
d(porosity)/d(PorousFlow variable)
const MaterialProperty< std::vector< Real > > & _drock_energy_nodal_dvar
d(nodal rock energy density)/d(PorousFlow variable)
static InputParameters validParams()