www.mooseframework.org
PorousFlowMassRadioactiveDecay.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 
14 #include "libmesh/quadrature.h"
15 
16 #include <limits>
17 
19 
20 template <>
21 InputParameters
23 {
24  InputParameters params = validParams<TimeKernel>();
25  params.addParam<bool>("strain_at_nearest_qp",
26  false,
27  "When calculating nodal porosity that depends on strain, use the strain at "
28  "the nearest quadpoint. This adds a small extra computational burden, and "
29  "is not necessary for simulations involving only linear lagrange elements. "
30  " If you set this to true, you will also want to set the same parameter to "
31  "true for related Kernels and Materials");
32  params.addParam<unsigned int>(
33  "fluid_component", 0, "The index corresponding to the fluid component for this kernel");
34  params.addRequiredParam<Real>("decay_rate",
35  "The decay rate (units 1/time) for the fluid component");
36  params.addRequiredParam<UserObjectName>(
37  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
38  params.addClassDescription("Radioactive decay of a fluid component");
39  return params;
40 }
41 
43  : TimeKernel(parameters),
44  _decay_rate(getParam<Real>("decay_rate")),
45  _fluid_component(getParam<unsigned int>("fluid_component")),
46  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
47  _var_is_porflow_var(_dictator.isPorousFlowVariable(_var.number())),
48  _num_phases(_dictator.numPhases()),
49  _strain_at_nearest_qp(getParam<bool>("strain_at_nearest_qp")),
50  _porosity(getMaterialProperty<Real>("PorousFlow_porosity_nodal")),
51  _dporosity_dvar(getMaterialProperty<std::vector<Real>>("dPorousFlow_porosity_nodal_dvar")),
52  _dporosity_dgradvar(
53  getMaterialProperty<std::vector<RealGradient>>("dPorousFlow_porosity_nodal_dgradvar")),
54  _nearest_qp(_strain_at_nearest_qp
55  ? &getMaterialProperty<unsigned int>("PorousFlow_nearestqp_nodal")
56  : nullptr),
57  _fluid_density(getMaterialProperty<std::vector<Real>>("PorousFlow_fluid_phase_density_nodal")),
58  _dfluid_density_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
59  "dPorousFlow_fluid_phase_density_nodal_dvar")),
60  _fluid_saturation_nodal(getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")),
61  _dfluid_saturation_nodal_dvar(
62  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_saturation_nodal_dvar")),
63  _mass_frac(getMaterialProperty<std::vector<std::vector<Real>>>("PorousFlow_mass_frac_nodal")),
64  _dmass_frac_dvar(getMaterialProperty<std::vector<std::vector<std::vector<Real>>>>(
65  "dPorousFlow_mass_frac_nodal_dvar"))
66 {
68  paramError(
69  "fluid_component",
70  "The Dictator proclaims that the maximum fluid component index in this simulation is ",
72  " whereas you have used ",
74  ". Remember that indexing starts at 0. The Dictator does not take such mistakes lightly.");
75 }
76 
77 Real
79 {
80  Real mass = 0.0;
81  for (unsigned ph = 0; ph < _num_phases; ++ph)
82  mass += _fluid_density[_i][ph] * _fluid_saturation_nodal[_i][ph] *
84 
85  return _test[_i][_qp] * _decay_rate * _porosity[_i] * mass;
86 }
87 
88 Real
90 {
91  // If the variable is not a PorousFlow variable (very unusual), the diag Jacobian terms are 0
93  return 0.0;
94  return computeQpJac(_dictator.porousFlowVariableNum(_var.number()));
95 }
96 
97 Real
99 {
100  // If the variable is not a PorousFlow variable, the OffDiag Jacobian terms are 0
102  return 0.0;
104 }
105 
106 Real
108 {
109  const unsigned nearest_qp = (_strain_at_nearest_qp ? (*_nearest_qp)[_i] : _i);
110 
111  // porosity is dependent on variables that are lumped to the nodes,
112  // but it can depend on the gradient
113  // of variables, which are NOT lumped to the nodes, hence:
114  Real dmass = 0.0;
115  for (unsigned ph = 0; ph < _num_phases; ++ph)
116  dmass += _fluid_density[_i][ph] * _fluid_saturation_nodal[_i][ph] *
117  _mass_frac[_i][ph][_fluid_component] * _dporosity_dgradvar[_i][pvar] *
118  _grad_phi[_j][nearest_qp];
119 
120  if (_i != _j)
121  return _test[_i][_qp] * _decay_rate * dmass;
122 
123  // As the fluid mass is lumped to the nodes, only non-zero terms are for _i==_j
124  for (unsigned ph = 0; ph < _num_phases; ++ph)
125  {
126  dmass += _dfluid_density_dvar[_i][ph][pvar] * _fluid_saturation_nodal[_i][ph] *
127  _mass_frac[_i][ph][_fluid_component] * _porosity[_i];
128  dmass += _fluid_density[_i][ph] * _dfluid_saturation_nodal_dvar[_i][ph][pvar] *
129  _mass_frac[_i][ph][_fluid_component] * _porosity[_i];
130  dmass += _fluid_density[_i][ph] * _fluid_saturation_nodal[_i][ph] *
131  _dmass_frac_dvar[_i][ph][_fluid_component][pvar] * _porosity[_i];
132  dmass += _fluid_density[_i][ph] * _fluid_saturation_nodal[_i][ph] *
133  _mass_frac[_i][ph][_fluid_component] * _dporosity_dvar[_i][pvar];
134  }
135  return _test[_i][_qp] * _decay_rate * dmass;
136 }
PorousFlowMassRadioactiveDecay::computeQpJac
Real computeQpJac(unsigned int pvar)
Derivative of residual with respect to PorousFlow variable number pvar This is used by both computeQp...
Definition: PorousFlowMassRadioactiveDecay.C:107
PorousFlowMassRadioactiveDecay::_var_is_porflow_var
const bool _var_is_porflow_var
Whether the Variable for this Kernel is a PorousFlow variable according to the Dictator.
Definition: PorousFlowMassRadioactiveDecay.h:46
PorousFlowMassRadioactiveDecay::_strain_at_nearest_qp
const bool _strain_at_nearest_qp
Whether the porosity uses the volumetric strain at the closest quadpoint.
Definition: PorousFlowMassRadioactiveDecay.h:52
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
PorousFlowMassRadioactiveDecay::_dporosity_dgradvar
const MaterialProperty< std::vector< RealGradient > > & _dporosity_dgradvar
d(porosity)/d(grad PorousFlow variable) - remember these derivatives will be wrt grad(vars) at qps
Definition: PorousFlowMassRadioactiveDecay.h:61
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
PorousFlowMassRadioactiveDecay::_dfluid_density_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_density_dvar
d(nodal fluid density)/d(PorousFlow variable)
Definition: PorousFlowMassRadioactiveDecay.h:70
PorousFlowMassRadioactiveDecay::_dmass_frac_dvar
const MaterialProperty< std::vector< std::vector< std::vector< Real > > > > & _dmass_frac_dvar
d(nodal mass fraction)/d(PorousFlow variable)
Definition: PorousFlowMassRadioactiveDecay.h:82
PorousFlowMassRadioactiveDecay::_dfluid_saturation_nodal_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dfluid_saturation_nodal_dvar
d(nodal fluid saturation)/d(PorousFlow variable)
Definition: PorousFlowMassRadioactiveDecay.h:76
PorousFlowMassRadioactiveDecay::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: PorousFlowMassRadioactiveDecay.C:98
PorousFlowMassRadioactiveDecay::_decay_rate
const Real _decay_rate
The decay rate.
Definition: PorousFlowMassRadioactiveDecay.h:37
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowMassRadioactiveDecay)
PorousFlowMassRadioactiveDecay::_dictator
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
Definition: PorousFlowMassRadioactiveDecay.h:43
PorousFlowMassRadioactiveDecay::_num_phases
const unsigned int _num_phases
Number of fluid phases.
Definition: PorousFlowMassRadioactiveDecay.h:49
PorousFlowMassRadioactiveDecay::_mass_frac
const MaterialProperty< std::vector< std::vector< Real > > > & _mass_frac
Nodal mass fraction.
Definition: PorousFlowMassRadioactiveDecay.h:79
PorousFlowDictator::porousFlowVariableNum
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
Definition: PorousFlowDictator.C:135
PorousFlowMassRadioactiveDecay.h
PorousFlowDictator
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
Definition: PorousFlowDictator.h:71
PorousFlowMassRadioactiveDecay::PorousFlowMassRadioactiveDecay
PorousFlowMassRadioactiveDecay(const InputParameters &parameters)
Definition: PorousFlowMassRadioactiveDecay.C:42
PorousFlowMassRadioactiveDecay::computeQpResidual
virtual Real computeQpResidual() override
Definition: PorousFlowMassRadioactiveDecay.C:78
PorousFlowDictator::numComponents
unsigned int numComponents() const
The number of fluid components.
Definition: PorousFlowDictator.C:111
PorousFlowMassRadioactiveDecay::_porosity
const MaterialProperty< Real > & _porosity
Porosity at the nodes, but it can depend on grad(variables) which are actually evaluated at the qps.
Definition: PorousFlowMassRadioactiveDecay.h:55
PorousFlowMassRadioactiveDecay::_fluid_density
const MaterialProperty< std::vector< Real > > & _fluid_density
Nodal fluid density.
Definition: PorousFlowMassRadioactiveDecay.h:67
PorousFlowMassRadioactiveDecay
Kernel = _decay_rate * masscomponent where mass_component = porosity*sum_phases(density_phase*saturat...
Definition: PorousFlowMassRadioactiveDecay.h:26
validParams< PorousFlowMassRadioactiveDecay >
InputParameters validParams< PorousFlowMassRadioactiveDecay >()
Definition: PorousFlowMassRadioactiveDecay.C:22
PorousFlowMassRadioactiveDecay::_dporosity_dvar
const MaterialProperty< std::vector< Real > > & _dporosity_dvar
d(porosity)/d(PorousFlow variable) - these derivatives will be wrt variables at the nodes
Definition: PorousFlowMassRadioactiveDecay.h:58
PorousFlowMassRadioactiveDecay::_fluid_saturation_nodal
const MaterialProperty< std::vector< Real > > & _fluid_saturation_nodal
Nodal fluid saturation.
Definition: PorousFlowMassRadioactiveDecay.h:73
PorousFlowMassRadioactiveDecay::_fluid_component
const unsigned int _fluid_component
The fluid component index.
Definition: PorousFlowMassRadioactiveDecay.h:40
PorousFlowMassRadioactiveDecay::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: PorousFlowMassRadioactiveDecay.C:89