www.mooseframework.org
PorousFlowDictator.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 "PorousFlowDictator.h"
11 #include "NonlinearSystem.h"
12 
13 registerMooseObject("PorousFlowApp", PorousFlowDictator);
14 
17 {
19  params.addClassDescription("Holds information on the PorousFlow variable names");
20  params.addRequiredCoupledVar("porous_flow_vars",
21  "List of primary variables that are used in the PorousFlow "
22  "simulation. Jacobian entries involving derivatives wrt these "
23  "variables will be computed. In single-phase models you will just "
24  "have one (eg \'pressure\'), in two-phase models you will have two "
25  "(eg \'p_water p_gas\', or \'p_water s_water\'), etc.");
26  params.addRequiredParam<unsigned int>("number_fluid_phases",
27  "The number of fluid phases in the simulation");
28  params.addRequiredParam<unsigned int>("number_fluid_components",
29  "The number of fluid components in the simulation");
30  params.addParam<unsigned int>("number_aqueous_equilibrium",
31  0,
32  "The number of secondary species in the aqueous-equilibrium "
33  "reaction system. (Leave as zero if the simulation does not "
34  "involve chemistry)");
35  params.addParam<unsigned int>("number_aqueous_kinetic",
36  0,
37  "The number of secondary species in the aqueous-kinetic reaction "
38  "system involved in precipitation and dissolution. (Leave as zero "
39  "if the simulation does not involve chemistry)");
40  params.addParam<unsigned int>("aqueous_phase_number",
41  0,
42  "The fluid phase number of the aqueous phase in which the "
43  "equilibrium and kinetic chemical reactions occur");
44  return params;
45 }
46 
48  : GeneralUserObject(parameters),
49  Coupleable(this, false),
50  _num_variables(coupledComponents("porous_flow_vars")),
51  _num_phases(getParam<unsigned int>("number_fluid_phases")),
52  _num_components(getParam<unsigned int>("number_fluid_components")),
53  _num_aqueous_equilibrium(getParam<unsigned int>("number_aqueous_equilibrium")),
54  _num_aqueous_kinetic(getParam<unsigned int>("number_aqueous_kinetic")),
55  _aqueous_phase_number(getParam<unsigned int>("aqueous_phase_number")),
56  _consistent_fe_type(false),
57  _fe_type(0)
58 {
60  for (unsigned int i = 0; i < _num_variables; ++i)
61  _moose_var_num[i] = coupled("porous_flow_vars", i);
62 
63  if (_num_variables > 0)
64  {
65  _consistent_fe_type = true;
66  _fe_type = FEType(getFieldVar("porous_flow_vars", 0)->feType());
67  for (unsigned int i = 1; i < _num_variables; ++i)
68  if (getFieldVar("porous_flow_vars", i)->feType() != _fe_type)
69  _consistent_fe_type = false;
70  }
71 
72  _pf_var_num.assign(_sys.nVariables(),
73  _num_variables); // Note: the _num_variables assignment indicates that "this is
74  // not a PorousFlow variable"
75  for (unsigned int i = 0; i < _num_variables; ++i)
76  if (_moose_var_num[i] < _pf_var_num.size())
78  else
79  // should not couple AuxVariables to the Dictator (Jacobian entries are not calculated for
80  // them)
81  mooseError("PorousFlowDictator: AuxVariables variables must not be coupled into the Dictator "
82  "for this is against specification #1984. Variable number ",
83  i,
84  " is an AuxVariable.");
85 
87  mooseError("PorousflowDictator: The aqueous phase number must be less than the number of fluid "
88  "phases. The Dictator does not appreciate jokes.");
89 
90  // Don't include permeabiity derivatives in the Jacobian by default (overwrite using
91  // usePermDerivs()) when necessary in permeabiity material classes
92  _perm_derivs = false;
93 }
94 
95 unsigned int
97 {
98  return _num_variables;
99 }
100 
101 unsigned int
103 {
104  return _num_phases;
105 }
106 
107 unsigned int
109 {
110  return _num_components;
111 }
112 
113 unsigned int
115 {
117 }
118 
119 unsigned int
121 {
122  return _num_aqueous_kinetic;
123 }
124 
125 unsigned int
127 {
128  return _aqueous_phase_number;
129 }
130 
131 unsigned int
132 PorousFlowDictator::porousFlowVariableNum(unsigned int moose_var_num) const
133 {
134  if (moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables)
135  mooseError("The Dictator proclaims that the moose variable with number ",
136  moose_var_num,
137  " is not a PorousFlow variable. Exiting with error code 1984.");
138  return _pf_var_num[moose_var_num];
139 }
140 
141 unsigned int
142 PorousFlowDictator::mooseVariableNum(unsigned int porous_flow_var_num) const
143 {
144  if (porous_flow_var_num >= _num_variables)
145  mooseError("The Dictator proclaims that there is no such PorousFlow variable with number ",
146  porous_flow_var_num,
147  ". Exiting with error code 1984.");
148  return _moose_var_num[porous_flow_var_num];
149 }
150 
151 bool
152 PorousFlowDictator::isPorousFlowVariable(unsigned int moose_var_num) const
153 {
154  return !notPorousFlowVariable(moose_var_num);
155 }
156 
157 bool
158 PorousFlowDictator::notPorousFlowVariable(unsigned int moose_var_num) const
159 {
160  return moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables;
161 }
162 
163 bool
165 {
166  return _consistent_fe_type;
167 }
168 
169 FEType
171 {
172  return _fe_type;
173 }
bool _perm_derivs
Indicates whether the simulation includes derivatives of permeability.
const unsigned int _num_aqueous_equilibrium
Number of aqueous-equilibrium secondary species.
FEType feType() const
The FEType of the first porous_flow_variable.
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
const unsigned int _num_aqueous_kinetic
Number of aqeuous-kinetic secondary species that are involved in mineralisation.
bool _consistent_fe_type
Whether the porous_flow_vars all have the same fe_type.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
const unsigned int _num_components
Number of fluid components.
static InputParameters validParams()
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
registerMooseObject("PorousFlowApp", PorousFlowDictator)
const unsigned int _num_variables
Number of PorousFlow variables.
unsigned int numComponents() const
The number of fluid components.
unsigned int aqueousPhaseNumber() const
The aqueous phase number.
bool isPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is a porous flow variable.
void addRequiredParam(const std::string &name, const std::string &doc_string)
PorousFlowDictator(const InputParameters &parameters)
virtual unsigned int nVariables() const
FEType _fe_type
FE type used by the PorousFlow variables.
std::vector< unsigned int > _pf_var_num
_pf_var_num[i] = the porous flow variable corresponding to moose variable i
const unsigned int _aqueous_phase_number
Aqueous phase number.
unsigned int mooseVariableNum(unsigned int porous_flow_var_num) const
The Moose variable number.
SystemBase & _sys
unsigned int numPhases() const
The number of fluid phases.
unsigned int numVariables() const
The number of PorousFlow variables.
unsigned int numAqueousKinetic() const
The number of aqueous kinetic secondary species.
static InputParameters validParams()
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
std::vector< unsigned int > _moose_var_num
_moose_var_num[i] = the moose variable number corresponding to porous flow variable i ...
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
unsigned int numAqueousEquilibrium() const
The number of aqueous equilibrium secondary species.
void ErrorVector unsigned int
const unsigned int _num_phases
Number of fluid phases.
bool consistentFEType() const
Whether the porous_flow_vars all have the same FEType or if no porous_flow_vars were provided...
const MooseVariableFieldBase * getFieldVar(const std::string &var_name, unsigned int comp) const