https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ReactionNetworkPhysicsBase.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
11#include <sstream>
12
15{
17 params.addClassDescription("Base class to create a reaction network Physics from.");
18
19 // Variables parameters
20 params.addRequiredParam<std::vector<VariableName>>("solver_variables", "Species to solve for");
21 params.addRequiredParam<std::vector<AuxVariableName>>(
22 "auxiliary_variables",
23 "Additional species to output the concentration of, which do not require an additional "
24 "equation to obtain");
25 params.transferParam<MooseEnum>(MooseVariableBase::validParams(), "order", "variable_order");
26 params.addParam<std::vector<Real>>("equation_scaling",
27 "Scaling factor to apply to each equation");
28
29 // Initial conditions
30 params.addParam<std::vector<MooseFunctorName>>("initial_conditions",
31 "Initial conditions for the species to solve for");
32
33 // Reaction network
34 params.addParam<std::string>("reactions", "The list of chemical reactions");
35
36 return params;
37}
38
40 : PhysicsBase(parameters),
41 _solver_species(getParam<std::vector<VariableName>>("solver_variables")),
42 _num_solver_species(_solver_species.size()),
43 _aux_species(getParam<std::vector<AuxVariableName>>("auxiliary_variables")),
44 _num_aux_species(_aux_species.size()),
45 _reactions(
46 ReactionNetworkUtils::parseReactionNetwork(getParam<std::string>("reactions"), _verbose)),
47 _num_reactions(_reactions.size())
48{
49 // Keep track of variables
50 for (const auto & var_name : _solver_species)
51 saveSolverVariableName(var_name);
52 for (const auto & var_name : _aux_species)
53 saveAuxVariableName(var_name);
54
55 // Parameter checking
56 if (isParamValid("initial_conditions"))
57 checkVectorParamsSameLength<VariableName, MooseFunctorName>("solver_variables",
58 "initial_conditions");
59 if (isParamValid("equation_scaling"))
60 checkVectorParamsSameLength<VariableName, Real>("solver_variables", "equation_scaling");
61
62 addRequiredPhysicsTask("add_ic");
63 addRequiredPhysicsTask("add_variable");
64 addRequiredPhysicsTask("add_aux_variable");
65 addRequiredPhysicsTask("init_physics");
66
67 // Parse the lines in the reaction
68 std::stringstream reactions_param(getParam<std::string>("reactions"));
69 std::string line;
70 while (std::getline(reactions_param, line, '\n'))
71 _reactions_input.push_back(line);
72 mooseAssert(_num_reactions == _reactions_input.size(),
73 "Should be the same size. Extra line break in the reaction network?");
74}
75
76void
78{
79 for (const auto i : index_range(_solver_species))
80 {
81 const auto & var_name = _solver_species[i];
82 // If the variable was added outside the Physics
83 if (variableExists(var_name, /*error_if_aux*/ true))
84 {
86 {"variable_order", "system_names", "equation_scaling"}, "MooseVariable", var_name);
87 continue;
88 }
89
90 const std::string variable_type = "MooseVariable";
91 InputParameters params = getFactory().getValidParams(variable_type);
92 params.set<MooseEnum>("order") = getParam<MooseEnum>("variable_order");
93 if (isParamValid("equation_scaling"))
94 // all our variables have a single component
95 params.set<std::vector<Real>>("scaling") = {
96 getParam<std::vector<Real>>("equation_scaling")[i]};
97 assignBlocks(params, _blocks);
98 params.set<SolverSystemName>("solver_sys") = getSolverSystem(var_name);
99
100 getProblem().addVariable(variable_type, var_name, params);
101 }
102}
103
104void
106{
107 for (const auto i : index_range(_aux_species))
108 {
109 const auto & var_name = _aux_species[i];
110 // If the variable was added outside the Physics
111 if (variableExists(var_name, /*error_if_aux*/ false))
112 {
113 reportPotentiallyMissedParameters({"variable_order"}, "MooseVariable", var_name);
114 continue;
115 }
116
117 const std::string variable_type = "MooseVariable";
118 InputParameters params = getFactory().getValidParams(variable_type);
119 params.set<MooseEnum>("order") = getParam<MooseEnum>("variable_order");
120 assignBlocks(params, _blocks);
121 getProblem().addAuxVariable(variable_type, var_name, params);
122 }
123}
124
125void
127{
128 // TODO: identify fully independent or sequential groups in the reaction network
129 // Solve using a segregated approach in the order of the sequence
130}
131
132void
134{
135 for (const auto & block : component.blocks())
136 _blocks.push_back(block);
137}
138
139void
141{
142 InputParameters params = getFactory().getValidParams("FunctorIC");
143 assignBlocks(params, _blocks);
144 std::vector<MooseFunctorName> empty_functor_vector;
145 const auto & initial_functors =
146 isParamValid("initial_conditions")
147 ? getParam<std::vector<MooseFunctorName>>("initial_conditions")
148 : empty_functor_vector;
149
150 for (const auto i : index_range(_solver_species))
151 {
152 const auto & var_name = _solver_species[i];
153 // always obey the user specification of initial conditions
154 // Base class does not have a default but derived classes could set one
155 if (isParamValid("initial_conditions") &&
156 shouldCreateIC(var_name,
157 _blocks,
158 /*whether IC is a default*/ !isParamSetByUser("initial_conditions"),
159 /*error if already an IC*/ true))
160 {
161 params.set<VariableName>("variable") = var_name;
162 params.set<MooseFunctorName>("functor") = initial_functors[i];
163 getProblem().addInitialCondition("FunctorIC", prefix() + var_name + "_ic", params);
164 }
165 }
166}
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters &parameters)
virtual void addAuxVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
InputParameters getValidParams(const std::string &name) const
void addRequiredParam(const std::string &name, const std::string &doc_string)
void transferParam(const InputParameters &source_param, const std::string &name, const std::string &new_name="", const std::string &new_description="")
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)
T & set(const std::string &name, bool quiet_mode=false)
bool isParamSetByUser(const std::string &name) const
bool isParamValid(const std::string &name) const
static InputParameters validParams()
static InputParameters validParams()
virtual FEProblemBase & getProblem()
Factory & getFactory()
bool shouldCreateIC(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool ic_is_default_ic, const bool error_if_already_defined) const
void assignBlocks(InputParameters &params, const std::vector< SubdomainName > &blocks) const
void reportPotentiallyMissedParameters(const std::vector< std::string > &param_names, const std::string &object_type, const std::string &object_name="") const
void saveSolverVariableName(const VariableName &var_name)
std::string prefix() const
bool variableExists(const VariableName &var_name, bool error_if_aux) const
const SolverSystemName & getSolverSystem(unsigned int variable_index) const
void saveAuxVariableName(const VariableName &var_name)
std::vector< SubdomainName > _blocks
void addRequiredPhysicsTask(const std::string &task)
virtual void addPreconditioning() override
Add default preconditioning options (not implemented at this time)
virtual void addSolverVariables() override
Add solver variables (currently coded for CGFE)
ReactionNetworkPhysicsBase(const InputParameters &parameters)
void addComponent(const ActionComponent &component) override
std::vector< std::string > _reactions_input
Reaction network as a vector of lines for pretty output.
virtual void addInitialConditions() override
Add initial conditions for the solver variable (auxiliary not implemented)
virtual void addAuxiliaryVariables() override
Add nodal auxiliary variables.
static InputParameters validParams()
const std::vector< AuxVariableName > & _aux_species
Name of the species variables that can be computed without additional solves, simply auxkernels.
const unsigned int _num_reactions
Number of reactions involved in the network.
const std::vector< VariableName > & _solver_species
Name of the species variables to solve for in the reaction network.