https://mooseframework.inl.gov
PorousFlowDictator.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 
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 
45  params.addParam<SolverSystemName>("solver_sys", "Name of the solver system for the porepressure");
46  params.addParamNamesToGroup("solver_sys", "Advanced");
47  return params;
48 }
49 
51  : GeneralUserObject(parameters),
52  Coupleable(this, false),
53  _num_variables(coupledComponents("porous_flow_vars")),
54  _num_phases(getParam<unsigned int>("number_fluid_phases")),
55  _num_components(getParam<unsigned int>("number_fluid_components")),
56  _num_aqueous_equilibrium(getParam<unsigned int>("number_aqueous_equilibrium")),
57  _num_aqueous_kinetic(getParam<unsigned int>("number_aqueous_kinetic")),
58  _aqueous_phase_number(getParam<unsigned int>("aqueous_phase_number")),
59  _consistent_fe_type(false),
60  _fe_type(0)
61 {
63  for (unsigned int i = 0; i < _num_variables; ++i)
64  _moose_var_num[i] = coupled("porous_flow_vars", i);
65 
66  if (_num_variables > 0)
67  {
68  _consistent_fe_type = true;
69  _fe_type = FEType(getFieldVar("porous_flow_vars", 0)->feType());
70  for (unsigned int i = 1; i < _num_variables; ++i)
71  if (getFieldVar("porous_flow_vars", i)->feType() != _fe_type)
72  _consistent_fe_type = false;
73  }
74 
75  _pf_var_num.assign(_sys.nVariables(),
76  _num_variables); // Note: the _num_variables assignment indicates that "this is
77  // not a PorousFlow variable"
78  for (unsigned int i = 0; i < _num_variables; ++i)
79  {
80  if (_moose_var_num[i] < _pf_var_num.size())
82  else
83  // should not couple AuxVariables to the Dictator (Jacobian entries are not calculated for
84  // them)
85  mooseError("PorousFlowDictator: AuxVariables variables must not be coupled into the Dictator "
86  "for this is against specification #1984. Variable '",
87  coupledName("porous_flow_vars", /*comp=*/i),
88  "' is either an AuxVariable or from a different nonlinear system.");
89  }
90 
92  mooseError("PorousflowDictator: The aqueous phase number must be less than the number of fluid "
93  "phases. The Dictator does not appreciate jokes.");
94 
95  // Don't include permeabiity derivatives in the Jacobian by default (overwrite using
96  // usePermDerivs()) when necessary in permeabiity material classes
97  _perm_derivs = false;
98 }
99 
100 unsigned int
102 {
103  return _num_variables;
104 }
105 
106 unsigned int
108 {
109  return _num_phases;
110 }
111 
112 unsigned int
114 {
115  return _num_components;
116 }
117 
118 unsigned int
120 {
122 }
123 
124 unsigned int
126 {
127  return _num_aqueous_kinetic;
128 }
129 
130 unsigned int
132 {
133  return _aqueous_phase_number;
134 }
135 
136 unsigned int
137 PorousFlowDictator::porousFlowVariableNum(unsigned int moose_var_num) const
138 {
139  if (moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables)
140  mooseError("The Dictator proclaims that the moose variable with number ",
141  moose_var_num,
142  " is not a PorousFlow variable. Exiting with error code 1984.");
143  return _pf_var_num[moose_var_num];
144 }
145 
146 unsigned int
147 PorousFlowDictator::mooseVariableNum(unsigned int porous_flow_var_num) const
148 {
149  if (porous_flow_var_num >= _num_variables)
150  mooseError("The Dictator proclaims that there is no such PorousFlow variable with number ",
151  porous_flow_var_num,
152  ". Exiting with error code 1984.");
153  return _moose_var_num[porous_flow_var_num];
154 }
155 
156 bool
157 PorousFlowDictator::isPorousFlowVariable(unsigned int moose_var_num) const
158 {
159  return !notPorousFlowVariable(moose_var_num);
160 }
161 
162 bool
163 PorousFlowDictator::notPorousFlowVariable(unsigned int moose_var_num) const
164 {
165  return moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables;
166 }
167 
168 bool
170 {
171  return _consistent_fe_type;
172 }
173 
174 FEType
176 {
177  return _fe_type;
178 }
bool _perm_derivs
Indicates whether the simulation includes derivatives of permeability.
const unsigned int _num_aqueous_equilibrium
Number of aqueous-equilibrium secondary species.
libMesh::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.
VariableName coupledName(const std::string &var_name, unsigned int comp=0) const
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
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...
void mooseError(Args &&... args) const
std::vector< unsigned int > _moose_var_num
_moose_var_num[i] = the moose variable number corresponding to porous flow variable i ...
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...
libMesh::FEType _fe_type
FE type used by the PorousFlow variables.
const MooseVariableFieldBase * getFieldVar(const std::string &var_name, unsigned int comp) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)