https://mooseframework.inl.gov
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 
76 void
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 
104 void
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 
125 void
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 
132 void
134 {
135  for (const auto & block : component.blocks())
136  _blocks.push_back(block);
137 }
138 
139 void
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 }
static InputParameters validParams()
std::string prefix() const
void assignBlocks(InputParameters &params, const std::vector< SubdomainName > &blocks) const
Factory & getFactory()
std::vector< std::string > _reactions_input
Reaction network as a vector of lines for pretty output.
void addRequiredPhysicsTask(const std::string &task)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const unsigned int _num_reactions
Number of reactions involved in the network.
static const std::string component
Definition: NS.h:157
T & set(const std::string &name, bool quiet_mode=false)
InputParameters getValidParams(const std::string &name) const
void reportPotentiallyMissedParameters(const std::vector< std::string > &param_names, const std::string &object_type, const std::string &object_name="") const
const std::vector< VariableName > & _solver_species
Name of the species variables to solve for in the reaction network.
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 addComponent(const ActionComponent &component) override
virtual void addAuxVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
static InputParameters validParams()
std::vector< SubdomainName > _blocks
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters &parameters)
void saveAuxVariableName(const VariableName &var_name)
virtual FEProblemBase & getProblem()
const SolverSystemName & getSolverSystem(unsigned int variable_index) const
const std::vector< AuxVariableName > & _aux_species
Name of the species variables that can be computed without additional solves, simply auxkernels...
void transferParam(const InputParameters &source_param, const std::string &name, const std::string &new_name="", const std::string &new_description="")
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters &params)
virtual void addPreconditioning() override
Add default preconditioning options (not implemented at this time)
bool variableExists(const VariableName &var_name, bool error_if_aux) const
static InputParameters validParams()
std::vector< Reaction > parseReactionNetwork(const std::string &reaction_network_string, bool output_to_cout)
Parses the reaction network from a string form to a vector a Reaction.
virtual void addInitialConditions() override
Add initial conditions for the solver variable (auxiliary not implemented)
virtual void addAuxiliaryVariables() override
Add nodal auxiliary variables.
virtual void addSolverVariables() override
Add solver variables (currently coded for CGFE)
void addClassDescription(const std::string &doc_string)
bool isParamValid(const std::string &name) const
ReactionNetworkPhysicsBase(const InputParameters &parameters)
bool isParamSetByUser(const std::string &name) const
void saveSolverVariableName(const VariableName &var_name)
auto index_range(const T &sizable)