www.mooseframework.org
PorousFlowMassVolumetricExpansion.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.addParam<unsigned int>(
29  "fluid_component", 0, "The index corresponding to the component for this kernel");
30  params.addRequiredParam<UserObjectName>(
31  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
32  params.addClassDescription("Component_mass*rate_of_solid_volumetric_expansion");
33  return params;
34 }
35 
37  const InputParameters & parameters)
38  : TimeKernel(parameters),
39  _fluid_component(getParam<unsigned int>("fluid_component")),
40  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
41  _var_is_porflow_var(!_dictator.notPorousFlowVariable(_var.number())),
42  _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")),
43  _porosity(getMaterialProperty<Real>("PorousFlow_porosity_nodal")),
44  _dporosity_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_nodal_dvar")),
45  _dporosity_dgradvar(
46  getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")),
47  _nearest_qp(_strain_at_nearest_qp
48  ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal")
49  : nullptr),
50  _fluid_density(getMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_nodal")),
51  _dfluid_density_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
52  "dPorousFlow_fluid_phase_density_nodal_dvar")),
53  _fluid_saturation(getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")),
54  _dfluid_saturation_dvar(
55  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_saturation_nodal_dvar")),
56  _mass_frac(getMaterialProperty<std::vector<std::vector<Real>>>("PorousFlow_mass_frac_nodal")),
57  _dmass_frac_dvar(getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>(
58  "dPorousFlow_mass_frac_nodal_dvar")),
59  _strain_rate_qp(getMaterialProperty<Real>("PorousFlow_volumetric_strain_rate_qp")),
60  _dstrain_rate_qp_dvar(getMaterialProperty<std::vector<RealGradient>>(
61  "dPorousFlow_volumetric_strain_rate_qp_dvar"))
62 {
64  mooseError("The Dictator proclaims that the number of components in this simulation is ",
66  " whereas you have used the Kernel PorousFlowComponetMassVolumetricExpansion with "
67  "component = ",
69  ". The Dictator is watching you");
70 }
71 
72 Real
74 {
75  mooseAssert(_fluid_component < _mass_frac[_i][0].size(),
76  "PorousFlowMassVolumetricExpansion: fluid_component is given as "
78  << " which must be less than the number of fluid components described by the "
79  "mass-fraction matrix, which is "
80  << _mass_frac[_i][0].size());
81  unsigned int num_phases = _fluid_density[_i].size();
82  mooseAssert(num_phases == _fluid_saturation[_i].size(),
83  "PorousFlowMassVolumetricExpansion: Size of fluid density = "
84  << num_phases << " size of fluid saturation = " << _fluid_saturation[_i].size()
85  << " but both these must be equal to the number of phases in the system");
86 
87  Real mass = 0.0;
88  for (unsigned ph = 0; ph < num_phases; ++ph)
89  mass +=
90  _fluid_density[_i][ph] * _fluid_saturation[_i][ph] * _mass_frac[_i][ph][_fluid_component];
91 
92  return _test[_i][_qp] * mass * _porosity[_i] * _strain_rate_qp[_qp];
93 }
94 
95 Real
97 {
98  return computedMassQpJac(_var.number()) + computedVolQpJac(_var.number());
99 }
100 
101 Real
103 {
104  return computedMassQpJac(jvar) + computedVolQpJac(jvar);
105 }
106 
107 Real
109 {
111  return 0.0;
112 
113  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
114 
115  unsigned int num_phases = _fluid_density[_i].size();
116  Real mass = 0.0;
117  for (unsigned ph = 0; ph < num_phases; ++ph)
118  mass +=
119  _fluid_density[_i][ph] * _fluid_saturation[_i][ph] * _mass_frac[_i][ph][_fluid_component];
120 
121  Real dvol = _dstrain_rate_qp_dvar[_qp][pvar] * _grad_phi[_j][_qp];
122 
123  return _test[_i][_qp] * mass * _porosity[_i] * dvol;
124 }
125 Real
127 {
129  return 0.0;
130 
131  const unsigned int pvar = _dictator.porousFlowVariableNum(jvar);
132  const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
133 
134  const unsigned int num_phases = _fluid_density[_i].size();
135  Real dmass = 0.0;
136  for (unsigned ph = 0; ph < num_phases; ++ph)
137  dmass += _fluid_density[_i][ph] * _fluid_saturation[_i][ph] *
138  _mass_frac[_i][ph][_fluid_component] * _dporosity_dgradvar[_i][pvar] *
139  _grad_phi[_j][nearest_qp];
140 
141  if (_i != _j)
142  return _test[_i][_qp] * dmass * _strain_rate_qp[_qp];
143 
144  for (unsigned ph = 0; ph < num_phases; ++ph)
145  {
146  dmass += _dfluid_density_dvar[_i][ph][pvar] * _fluid_saturation[_i][ph] *
147  _mass_frac[_i][ph][_fluid_component] * _porosity[_i];
148  dmass += _fluid_density[_i][ph] * _dfluid_saturation_dvar[_i][ph][pvar] *
149  _mass_frac[_i][ph][_fluid_component] * _porosity[_i];
150  dmass += _fluid_density[_i][ph] * _fluid_saturation[_i][ph] *
151  _dmass_frac_dvar[_i][ph][_fluid_component][pvar] * _porosity[_i];
152  dmass += _fluid_density[_i][ph] * _fluid_saturation[_i][ph] *
153  _mass_frac[_i][ph][_fluid_component] * _dporosity_dvar[_i][pvar];
154  }
155 
156  return _test[_i][_qp] * dmass * _strain_rate_qp[_qp];
157 }
PorousFlowMassVolumetricExpansion::_strain_rate_qp
const MaterialProperty< Real > & _strain_rate_qp
Strain rate.
Definition: PorousFlowMassVolumetricExpansion.h:86
PorousFlowMassVolumetricExpansion::computeQpResidual
virtual Real computeQpResidual() override
Definition: PorousFlowMassVolumetricExpansion.C:73
PorousFlowMassVolumetricExpansion::_fluid_density
const MaterialProperty< std::vector< Real > > & _fluid_density
Fluid density.
Definition: PorousFlowMassVolumetricExpansion.h:68
validParams< PorousFlowMassVolumetricExpansion >
InputParameters validParams< PorousFlowMassVolumetricExpansion >()
Definition: PorousFlowMassVolumetricExpansion.C:18
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
PorousFlowMassVolumetricExpansion::_strain_at_nearest_qp
const bool _strain_at_nearest_qp
Whether the porosity uses the volumetric strain at the closest quadpoint.
Definition: PorousFlowMassVolumetricExpansion.h:53
PorousFlowMassVolumetricExpansion::_porosity
const MaterialProperty< Real > & _porosity
Porosity.
Definition: PorousFlowMassVolumetricExpansion.h:56
PorousFlowMassVolumetricExpansion::_fluid_saturation
const MaterialProperty< std::vector< Real > > & _fluid_saturation
Fluid saturation.
Definition: PorousFlowMassVolumetricExpansion.h:74
PorousFlowDictator::porousFlowVariableNum
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
Definition: PorousFlowDictator.C:135
PorousFlowMassVolumetricExpansion::_dictator
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
Definition: PorousFlowMassVolumetricExpansion.h:41
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowMassVolumetricExpansion)
PorousFlowDictator
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
Definition: PorousFlowDictator.h:71
PorousFlowMassVolumetricExpansion::_dfluid_density_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_density_dvar
d(fluid density)/d(PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:71
PorousFlowMassVolumetricExpansion::_mass_frac
const MaterialProperty< std::vector< std::vector< Real > > > & _mass_frac
Mass fraction.
Definition: PorousFlowMassVolumetricExpansion.h:80
PorousFlowMassVolumetricExpansion::computedMassQpJac
Real computedMassQpJac(unsigned int jvar) const
Derivative of mass part of the residual with respect to the Variable with variable number jvar.
Definition: PorousFlowMassVolumetricExpansion.C:126
PorousFlowMassVolumetricExpansion::computedVolQpJac
Real computedVolQpJac(unsigned int jvar) const
Derivative of volumetric-strain part of the residual with respect to the Variable with variable numbe...
Definition: PorousFlowMassVolumetricExpansion.C:108
PorousFlowMassVolumetricExpansion::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: PorousFlowMassVolumetricExpansion.C:102
PorousFlowMassVolumetricExpansion::_dporosity_dvar
const MaterialProperty< std::vector< Real > > & _dporosity_dvar
d(porosity)/d(PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:59
PorousFlowMassVolumetricExpansion::_fluid_component
const unsigned int _fluid_component
The fluid component index.
Definition: PorousFlowMassVolumetricExpansion.h:38
PorousFlowMassVolumetricExpansion::_dporosity_dgradvar
const MaterialProperty< std::vector< RealGradient > > & _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:62
PorousFlowDictator::numComponents
unsigned int numComponents() const
The number of fluid components.
Definition: PorousFlowDictator.C:111
PorousFlowMassVolumetricExpansion::_dfluid_saturation_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_saturation_dvar
d(fluid saturation)/d(PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:77
PorousFlowMassVolumetricExpansion.h
PorousFlowMassVolumetricExpansion::_dstrain_rate_qp_dvar
const MaterialProperty< std::vector< RealGradient > > & _dstrain_rate_qp_dvar
d(strain rate)/d(PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:89
PorousFlowMassVolumetricExpansion
Kernel = mass_component * d(volumetric_strain)/dt where mass_component = porosity*sum_phases(density_...
Definition: PorousFlowMassVolumetricExpansion.h:27
PorousFlowMassVolumetricExpansion::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: PorousFlowMassVolumetricExpansion.C:96
PorousFlowMassVolumetricExpansion::_dmass_frac_dvar
const MaterialProperty< std::vector< std::vector< std::vector< Real > > > > & _dmass_frac_dvar
d(mass fraction)/d(PorousFlow variable)
Definition: PorousFlowMassVolumetricExpansion.h:83
PorousFlowMassVolumetricExpansion::PorousFlowMassVolumetricExpansion
PorousFlowMassVolumetricExpansion(const InputParameters &parameters)
Definition: PorousFlowMassVolumetricExpansion.C:36