www.mooseframework.org
PorousFlowPreDis.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 
10 #include "PorousFlowPreDis.h"
11 
12 registerMooseObject("PorousFlowApp", PorousFlowPreDis);
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<TimeKernel>();
19  params.addRequiredParam<std::vector<Real>>(
20  "mineral_density",
21  "Density (kg(precipitate)/m^3(precipitate)) of each secondary species in the "
22  "aqueous precipitation-dissolution reaction system");
23  params.addRequiredParam<UserObjectName>(
24  "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names.");
25  params.addRequiredParam<std::vector<Real>>("stoichiometry",
26  "A vector of stoichiometric coefficients for the "
27  "primary species that is the Variable of this Kernel: "
28  "one for each precipitation-dissolution reaction "
29  "(these are one columns of the 'reactions' matrix)");
30  params.addClassDescription("Precipitation-dissolution of chemical species");
31  return params;
32 }
33 
34 PorousFlowPreDis::PorousFlowPreDis(const InputParameters & parameters)
35  : TimeKernel(parameters),
36  _mineral_density(getParam<std::vector<Real>>("mineral_density")),
37  _dictator(getUserObject<PorousFlowDictator>("PorousFlowDictator")),
38  _aq_ph(_dictator.aqueousPhaseNumber()),
39  _porosity_old(getMaterialPropertyOld<Real>("PorousFlow_porosity_nodal")),
40  _saturation(getMaterialProperty<std::vector<Real>>("PorousFlow_saturation_nodal")),
41  _dsaturation_dvar(
42  getMaterialProperty<std::vector<std::vector<Real>>>("dPorousFlow_saturation_nodal_dvar")),
43  _reaction_rate(
44  getMaterialProperty<std::vector<Real>>("PorousFlow_mineral_reaction_rate_nodal")),
45  _dreaction_rate_dvar(getMaterialProperty<std::vector<std::vector<Real>>>(
46  "dPorousFlow_mineral_reaction_rate_nodal_dvar")),
47  _stoichiometry(getParam<std::vector<Real>>("stoichiometry"))
48 {
49  /* Not needed due to PorousFlow_mineral_reaction_rate already checking this condition
50  if (_dictator.numPhases() < 1)
51  mooseError("PorousFlowPreDis: The number of fluid phases must not be zero");
52  */
53 
55  paramError("mineral_density",
56  "The Dictator proclaims that the number of precipitation-dissolution secondary "
57  "species in this simulation is ",
59  " whereas you have provided ",
60  _mineral_density.size(),
61  ". The Dictator does not take such mistakes lightly");
62 
64  paramError("stoichiometry",
65  "The Dictator proclaims that the number of precipitation-dissolution secondary "
66  "species in this simulation is ",
68  " whereas you have provided ",
69  _stoichiometry.size(),
70  ". The Dictator does not take such mistakes lightly");
71 }
72 
73 Real
75 {
76  /*
77  *
78  * Note the use of the OLD value of porosity here.
79  * This strategy, which breaks the cyclic dependency between porosity
80  * and mineral concentration, is used in
81  * Kernel: PorousFlowPreDis
82  * Material: PorousFlowPorosity
83  * Material: PorousFlowAqueousPreDisChemistry
84  * Material: PorousFlowAqueousPreDisMineral
85  *
86  */
87  Real res = 0.0;
88  for (unsigned r = 0; r < _dictator.numAqueousKinetic(); ++r)
89  res += _stoichiometry[r] * _mineral_density[r] * _reaction_rate[_i][r];
90  return _test[_i][_qp] * res * _porosity_old[_i] * _saturation[_i][_aq_ph];
91 }
92 
93 Real
95 {
97  if (_dictator.notPorousFlowVariable(_var.number()))
98  return 0.0;
99  return computeQpJac(_dictator.porousFlowVariableNum(_var.number()));
100 }
101 
102 Real
104 {
107  return 0.0;
109 }
110 
111 Real
113 {
114  if (_i != _j)
115  return 0.0;
116 
117  Real res = 0.0;
118  Real dres = 0.0;
119  for (unsigned r = 0; r < _dictator.numAqueousKinetic(); ++r)
120  {
121  dres += _stoichiometry[r] * _mineral_density[r] * _dreaction_rate_dvar[_i][r][pvar];
122  res += _stoichiometry[r] * _mineral_density[r] * _reaction_rate[_i][r];
123  }
124 
125  return _test[_i][_qp] *
126  (dres * _saturation[_i][_aq_ph] + res * _dsaturation_dvar[_i][_aq_ph][pvar]) *
127  _porosity_old[_i];
128 }
PorousFlowPreDis
Kernel = sum (stoichiometry * density * porosity_old * saturation * reaction_rate) where the sum is o...
Definition: PorousFlowPreDis.h:25
PorousFlowPreDis::_reaction_rate
const MaterialProperty< std::vector< Real > > & _reaction_rate
Reaction rate of the yielding the secondary species.
Definition: PorousFlowPreDis.h:54
PorousFlowDictator::numAqueousKinetic
unsigned int numAqueousKinetic() const
The number of aqueous kinetic secondary species.
Definition: PorousFlowDictator.C:123
PorousFlowPreDis::_dreaction_rate_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dreaction_rate_dvar
d(reaction rate)/d(porflow variable)
Definition: PorousFlowPreDis.h:57
registerMooseObject
registerMooseObject("PorousFlowApp", PorousFlowPreDis)
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
PorousFlowPreDis.h
PorousFlowPreDis::computeQpResidual
virtual Real computeQpResidual() override
Definition: PorousFlowPreDis.C:74
PorousFlowDictator::porousFlowVariableNum
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
Definition: PorousFlowDictator.C:135
PorousFlowPreDis::_stoichiometry
const std::vector< Real > _stoichiometry
Stoichiometric coefficients.
Definition: PorousFlowPreDis.h:60
validParams< PorousFlowPreDis >
InputParameters validParams< PorousFlowPreDis >()
Definition: PorousFlowPreDis.C:16
PorousFlowDictator
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
Definition: PorousFlowDictator.h:71
PorousFlowPreDis::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: PorousFlowPreDis.C:103
PorousFlowPreDis::_saturation
const MaterialProperty< std::vector< Real > > & _saturation
Saturation.
Definition: PorousFlowPreDis.h:48
PorousFlowPreDis::_mineral_density
const std::vector< Real > _mineral_density
Density of the mineral species.
Definition: PorousFlowPreDis.h:36
PorousFlowPreDis::PorousFlowPreDis
PorousFlowPreDis(const InputParameters &parameters)
Definition: PorousFlowPreDis.C:34
PorousFlowPreDis::_porosity_old
const MaterialProperty< Real > & _porosity_old
Old value of porosity.
Definition: PorousFlowPreDis.h:45
PorousFlowPreDis::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: PorousFlowPreDis.C:94
PorousFlowPreDis::computeQpJac
Real computeQpJac(unsigned int pvar)
Derivative of residual with respect to PorousFlow variable number pvar This is used by both computeQp...
Definition: PorousFlowPreDis.C:112
PorousFlowPreDis::_dictator
const PorousFlowDictator & _dictator
PorousFlowDictator UserObject.
Definition: PorousFlowPreDis.h:39
PorousFlowPreDis::_aq_ph
const unsigned int _aq_ph
Aqueous phase number.
Definition: PorousFlowPreDis.h:42
PorousFlowPreDis::_dsaturation_dvar
const MaterialProperty< std::vector< std::vector< Real > > > & _dsaturation_dvar
d(saturation)/d(PorousFlow var)
Definition: PorousFlowPreDis.h:51