12 #include "FEProblem.h"
14 #include "MooseError.h"
16 #include "libmesh/string_to_enum.h"
29 InputParameters params = validParams<Action>();
30 params.addRequiredParam<std::vector<NonlinearVariableName>>(
31 "primary_species",
"The list of primary variables to add");
32 params.addParam<std::vector<AuxVariableName>>(
33 "secondary_species",
"The list of aqueous equilibrium species to be output as aux variables");
34 params.addParam<std::string>(
"reactions",
"The list of aqueous equilibrium reactions");
35 params.addParam<std::vector<VariableName>>(
"pressure",
"Pressure variable");
36 RealVectorValue g(0, 0, 0);
37 params.addParam<RealVectorValue>(
"gravity", g,
"Gravity vector (default is (0, 0, 0))");
38 params.addClassDescription(
"Adds coupled equilibrium Kernels and AuxKernels for primary species");
44 _primary_species(getParam<std::vector<NonlinearVariableName>>(
"primary_species")),
45 _secondary_species(getParam<std::vector<AuxVariableName>>(
"secondary_species")),
46 _weights(_primary_species.size()),
47 _primary_participation(_primary_species.size()),
48 _sto_u(_primary_species.size()),
49 _sto_v(_primary_species.size()),
50 _coupled_v(_primary_species.size()),
51 _input_reactions(getParam<std::string>(
"reactions")),
52 _pressure_var(getParam<std::vector<VariableName>>(
"pressure")),
53 _gravity(getParam<RealVectorValue>(
"gravity"))
56 pcrecpp::RE re_reaction(
66 pcrecpp::RE_Options().set_extended(
true));
68 pcrecpp::RE re_terms(
"(\\S+)");
69 pcrecpp::RE re_coeff_and_species(
"(?: \\(? (.*?) \\)? )"
72 pcrecpp::RE_Options().set_extended(
true));
76 pcrecpp::StringPiece single_reaction, term;
77 std::string single_reaction_str;
81 while (re_reaction.FindAndConsume(&input, &single_reaction_str, &eq_coeff))
90 mooseError(
"No equilibrium reaction provided!");
92 if (_pars.isParamValid(
"secondary_species"))
102 std::string species, coeff_str;
105 bool secondary =
false;
107 std::vector<Real> local_stos;
108 std::vector<VariableName> local_species_list;
111 while (re_terms.FindAndConsume(&single_reaction, &term))
114 if (re_coeff_and_species.PartialMatch(term, &coeff_str, &species))
116 if (coeff_str.length())
117 coeff = std::stod(coeff_str);
127 local_stos.push_back(coeff);
128 local_species_list.push_back(species);
132 else if (term ==
"+" || term ==
"=" || term ==
"-")
146 mooseError(
"Error parsing term: ", term.as_string());
149 _stos.push_back(local_stos);
189 _console <<
"Aqueous equilibrium reactions:\n";
191 _console <<
" Reaction " << i + 1 <<
": " <<
_reactions[i] <<
", log10(Keq) = " <<
_eq_const[i]
199 if (_current_task ==
"add_kernel")
208 InputParameters params_sub = _factory.getValidParams(
"CoupledBEEquilibriumSub");
210 params_sub.set<Real>(
"weight") =
_weights[i][j];
211 params_sub.defaultCoupledValue(
"log_k",
_eq_const[j]);
212 params_sub.set<Real>(
"sto_u") =
_sto_u[i][j];
213 params_sub.set<std::vector<Real>>(
"sto_v") =
_sto_v[i][j];
214 params_sub.set<std::vector<VariableName>>(
"v") =
_coupled_v[i][j];
215 _problem->addKernel(
"CoupledBEEquilibriumSub",
219 InputParameters params_cd = _factory.getValidParams(
"CoupledDiffusionReactionSub");
221 params_cd.set<Real>(
"weight") =
_weights[i][j];
222 params_cd.defaultCoupledValue(
"log_k",
_eq_const[j]);
223 params_cd.set<Real>(
"sto_u") =
_sto_u[i][j];
224 params_cd.set<std::vector<Real>>(
"sto_v") =
_sto_v[i][j];
225 params_cd.set<std::vector<VariableName>>(
"v") =
_coupled_v[i][j];
226 _problem->addKernel(
"CoupledDiffusionReactionSub",
231 if (_pars.isParamValid(
"pressure"))
233 InputParameters params_conv = _factory.getValidParams(
"CoupledConvectionReactionSub");
235 params_conv.set<Real>(
"weight") =
_weights[i][j];
236 params_conv.defaultCoupledValue(
"log_k",
_eq_const[j]);
237 params_conv.set<Real>(
"sto_u") =
_sto_u[i][j];
238 params_conv.set<std::vector<Real>>(
"sto_v") =
_sto_v[i][j];
239 params_conv.set<std::vector<VariableName>>(
"v") =
_coupled_v[i][j];
240 params_conv.set<std::vector<VariableName>>(
"p") =
_pressure_var;
241 params_conv.set<RealVectorValue>(
"gravity") =
_gravity;
242 _problem->addKernel(
"CoupledConvectionReactionSub",
251 if (_current_task ==
"add_aux_kernel")
258 InputParameters params_eq = _factory.getValidParams(
"AqueousEquilibriumRxnAux");
259 params_eq.set<AuxVariableName>(
"variable") =
_eq_species[j];
260 params_eq.defaultCoupledValue(
"log_k",
_eq_const[j]);
261 params_eq.set<std::vector<Real>>(
"sto_v") =
_stos[j];
263 _problem->addAuxKernel(
"AqueousEquilibriumRxnAux",
"aux_" +
_eq_species[j], params_eq);