11 #include "MooseUtils.h"
12 #include "FEProblem.h"
14 #include "MooseError.h"
29 InputParameters params = validParams<Action>();
30 params.addRequiredParam<std::vector<NonlinearVariableName>>(
"primary_species",
31 "The list of primary species to add");
32 params.addParam<std::vector<AuxVariableName>>(
33 "secondary_species",
"The list of solid kinetic species to be output as aux variables");
34 params.addRequiredParam<std::string>(
"kin_reactions",
"The list of solid kinetic reactions");
35 params.addRequiredParam<std::vector<Real>>(
"log10_keq",
36 "The list of equilibrium constants for all reactions");
37 params.addRequiredParam<std::vector<Real>>(
38 "specific_reactive_surface_area",
39 "The list of specific reactive surface area for all minerals (m^2/L)");
40 params.addRequiredParam<std::vector<Real>>(
41 "kinetic_rate_constant",
"The list of kinetic rate constant for all reactions (mol/m^2/s)");
42 params.addRequiredParam<std::vector<Real>>(
43 "activation_energy",
"The list of activation energy values for all reactions (J/mol)");
44 params.addParam<Real>(
"gas_constant", 8.314,
"Gas constant. Default is 8.314 (J/mol/K)");
45 params.addRequiredParam<std::vector<Real>>(
46 "reference_temperature",
"The list of reference temperatures for all reactions (K)");
47 params.addRequiredCoupledVar(
"system_temperature",
48 "The system temperature for all reactions (K)");
49 params.addClassDescription(
"Adds solid kinetic Kernels and AuxKernels for primary species");
55 _primary_species(getParam<std::vector<NonlinearVariableName>>(
"primary_species")),
56 _secondary_species(getParam<std::vector<AuxVariableName>>(
"secondary_species")),
57 _kinetic_species_involved(_primary_species.size()),
58 _weights(_primary_species.size()),
59 _input_reactions(getParam<std::string>(
"kin_reactions")),
60 _logk(getParam<std::vector<Real>>(
"log10_keq")),
61 _r_area(getParam<std::vector<Real>>(
"specific_reactive_surface_area")),
62 _ref_kconst(getParam<std::vector<Real>>(
"kinetic_rate_constant")),
63 _e_act(getParam<std::vector<Real>>(
"activation_energy")),
64 _gas_const(getParam<Real>(
"gas_constant")),
65 _ref_temp(getParam<std::vector<Real>>(
"reference_temperature")),
66 _sys_temp(getParam<std::vector<VariableName>>(
"system_temperature"))
71 bool old_syntax =
false;
80 mooseError(
"Old solid kinetic reaction syntax present.\nReactions should now be comma "
81 "separated, and must have spaces between species and +/-/= operators.\n"
82 "See #9972 for details");
85 pcrecpp::RE re_reactions(
"(.+?)"
88 pcrecpp::RE_Options().set_extended(
true));
90 pcrecpp::RE re_terms(
"(\\S+)");
91 pcrecpp::RE re_coeff_and_species(
"(?: \\(? (.*?) \\)? )"
94 pcrecpp::RE_Options().set_extended(
true));
97 pcrecpp::StringPiece single_reaction, term;
98 std::string single_reaction_str;
101 while (re_reactions.FindAndConsume(&input, &single_reaction_str))
107 mooseError(
"No solid kinetic reaction provided!");
115 std::string species, coeff_str;
118 bool secondary =
false;
120 std::vector<Real> local_stos;
121 std::vector<VariableName> local_species_list;
124 while (re_terms.FindAndConsume(&single_reaction, &term))
127 if (re_coeff_and_species.PartialMatch(term, &coeff_str, &species))
129 if (coeff_str.length())
130 coeff = std::stod(coeff_str);
140 local_stos.push_back(coeff);
141 local_species_list.push_back(species);
145 else if (term ==
"+" || term ==
"=" || term ==
"-")
157 mooseError(
"Error parsing term: ", term.as_string());
160 _stos.push_back(local_stos);
178 _console <<
"Solid kinetic reactions:\n";
180 _console <<
" Reaction " << i + 1 <<
": " <<
_reactions[i] <<
"\n";
186 if (!std::is_permutation(
188 mooseError(
"All solid kinetic species must be added as secondary species");
192 mooseError(
"The number of values entered for log10_keq is not equal to the number of solid "
193 "kinetic reactions");
195 mooseError(
"The number of values entered for specific_reactive_surface_area is not equal to "
196 "the number of solid kinetic reactions");
198 mooseError(
"The number of values entered for kinetic_rate_constant is not equal to the number "
199 "of solid kinetic reactions");
201 mooseError(
"The number of values entered for activation_energy is not equal to the number of "
202 "solid kinetic reactions");
204 mooseError(
"The number of values entered for reference_temperature is not equal to the number "
205 "of solid kinetic reactions");
211 if (_current_task ==
"add_kernel")
216 InputParameters params_kin = _factory.getValidParams(
"CoupledBEKinetic");
218 params_kin.set<std::vector<Real>>(
"weight") =
_weights[i];
220 _problem->addKernel(
"CoupledBEKinetic",
_primary_species[i] +
"_" +
"_kin", params_kin);
224 if (_current_task ==
"add_aux_kernel")
229 InputParameters params_kin = _factory.getValidParams(
"KineticDisPreConcAux");
231 params_kin.defaultCoupledValue(
"log_k",
_logk[i]);
232 params_kin.set<Real>(
"r_area") =
_r_area[i];
233 params_kin.set<Real>(
"ref_kconst") =
_ref_kconst[i];
234 params_kin.set<Real>(
"e_act") =
_e_act[i];
235 params_kin.set<Real>(
"gas_const") =
_gas_const;
236 params_kin.set<Real>(
"ref_temp") =
_ref_temp[i];
237 params_kin.set<std::vector<VariableName>>(
"sys_temp") =
_sys_temp;
238 params_kin.set<std::vector<Real>>(
"sto_v") =
_stos[i];
240 _problem->addAuxKernel(