https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
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 _is_fv(false)
62{
64 for (unsigned int i = 0; i < _num_variables; ++i)
65 _moose_var_num[i] = coupled("porous_flow_vars", i);
66
67 if (_num_variables > 0)
68 {
70 _is_fv = getFieldVar("porous_flow_vars", 0)->isFV();
71 _fe_type = FEType(getFieldVar("porous_flow_vars", 0)->feType());
72 for (unsigned int i = 1; i < _num_variables; ++i)
73 if (getFieldVar("porous_flow_vars", i)->feType() != _fe_type)
74 _consistent_fe_type = false;
75 }
76
78 _num_variables); // Note: the _num_variables assignment indicates that "this is
79 // not a PorousFlow variable"
80 for (unsigned int i = 0; i < _num_variables; ++i)
81 {
82 if (_moose_var_num[i] < _pf_var_num.size())
84 else
85 // should not couple AuxVariables to the Dictator (Jacobian entries are not calculated for
86 // them)
87 mooseError("PorousFlowDictator: AuxVariables variables must not be coupled into the Dictator "
88 "for this is against specification #1984. Variable '",
89 coupledName("porous_flow_vars", /*comp=*/i),
90 "' is either an AuxVariable or from a different nonlinear system.");
91 }
92
94 mooseError("PorousflowDictator: The aqueous phase number must be less than the number of fluid "
95 "phases. The Dictator does not appreciate jokes.");
96
97 // Don't include permeabiity derivatives in the Jacobian by default (overwrite using
98 // usePermDerivs()) when necessary in permeabiity material classes
99 _perm_derivs = false;
100}
101
102unsigned int
107
108unsigned int
110{
111 return _num_phases;
112}
113
114unsigned int
119
120unsigned int
125
126unsigned int
131
132unsigned int
137
138unsigned int
139PorousFlowDictator::porousFlowVariableNum(unsigned int moose_var_num) const
140{
141 if (moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables)
142 mooseError("The Dictator proclaims that the moose variable with number ",
143 moose_var_num,
144 " is not a PorousFlow variable. Exiting with error code 1984.");
145 return _pf_var_num[moose_var_num];
146}
147
148unsigned int
149PorousFlowDictator::mooseVariableNum(unsigned int porous_flow_var_num) const
150{
151 if (porous_flow_var_num >= _num_variables)
152 mooseError("The Dictator proclaims that there is no such PorousFlow variable with number ",
153 porous_flow_var_num,
154 ". Exiting with error code 1984.");
155 return _moose_var_num[porous_flow_var_num];
156}
157
158bool
159PorousFlowDictator::isPorousFlowVariable(unsigned int moose_var_num) const
160{
161 return !notPorousFlowVariable(moose_var_num);
162}
163
164bool
165PorousFlowDictator::notPorousFlowVariable(unsigned int moose_var_num) const
166{
167 return moose_var_num >= _pf_var_num.size() || _pf_var_num[moose_var_num] == _num_variables;
168}
169
170bool
175
176FEType
178{
179 return _fe_type;
180}
181
182bool
184{
185 return _is_fv;
186}
registerMooseObject("PorousFlowApp", PorousFlowDictator)
void ErrorVector unsigned int
const MooseVariableFieldBase * getFieldVar(const std::string &var_name, unsigned int comp) const
VariableName coupledName(const std::string &var_name, unsigned int comp=0) const
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
static InputParameters validParams()
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
virtual bool isFV() const
This holds maps between the nonlinear variables used in a PorousFlow simulation and the variable numb...
unsigned int numPhases() const
The number of fluid phases.
bool _consistent_fe_type
Whether the porous_flow_vars all have the same fe_type.
unsigned int numVariables() const
The number of PorousFlow variables.
bool _is_fv
Whether the PorousFlow variables are finite-volume variables.
std::vector< unsigned int > _pf_var_num
_pf_var_num[i] = the porous flow variable corresponding to moose variable i
unsigned int numAqueousEquilibrium() const
The number of aqueous equilibrium secondary species.
unsigned int aqueousPhaseNumber() const
The aqueous phase number.
const unsigned int _num_aqueous_equilibrium
Number of aqueous-equilibrium secondary species.
unsigned int numComponents() const
The number of fluid components.
libMesh::FEType feType() const
The FEType of the first porous_flow_variable.
bool _perm_derivs
Indicates whether the simulation includes derivatives of permeability.
unsigned int porousFlowVariableNum(unsigned int moose_var_num) const
The PorousFlow variable number.
libMesh::FEType _fe_type
FE type used by the PorousFlow variables.
const unsigned int _aqueous_phase_number
Aqueous phase number.
unsigned int numAqueousKinetic() const
The number of aqueous kinetic secondary species.
const unsigned int _num_components
Number of fluid components.
bool isPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is a porous flow variable.
const unsigned int _num_phases
Number of fluid phases.
bool notPorousFlowVariable(unsigned int moose_var_num) const
Returns true if moose_var_num is not a porous flow variabe.
bool isFV() const
Whether the PorousFlow variables are finite-volume variables.
bool consistentFEType() const
Whether the porous_flow_vars all have the same FEType or if no porous_flow_vars were provided.
unsigned int mooseVariableNum(unsigned int porous_flow_var_num) const
The Moose variable number.
std::vector< unsigned int > _moose_var_num
_moose_var_num[i] = the moose variable number corresponding to porous flow variable i
const unsigned int _num_aqueous_kinetic
Number of aqeuous-kinetic secondary species that are involved in mineralisation.
PorousFlowDictator(const InputParameters &parameters)
static InputParameters validParams()
const unsigned int _num_variables
Number of PorousFlow variables.
virtual unsigned int nVariables() const
SystemBase & _sys