22 std::size_t
const num_chemical_systems,
23 std::vector<std::pair<int, std::string>>
const&
24 process_id_to_component_name_map,
25 std::string
const& database,
27 std::unique_ptr<EquilibriumReactants>&& equilibrium_reactants,
28 std::unique_ptr<Kinetics>&& kinetic_reactants,
29 std::vector<ReactionRate>&& reaction_rates)
40 for (std::size_t chemical_system_id = 0;
41 chemical_system_id < num_chemical_systems;
45 Rxn_solution_map.emplace(chemical_system_id,
48 use.Set_solution_in(
true);
51 if (equilibrium_reactants)
55 for (std::size_t chemical_system_id = 0;
56 chemical_system_id < num_chemical_systems;
59 equilibrium_reactants->setChemicalSystemID(chemical_system_id);
60 Rxn_pp_assemblage_map.emplace(
61 chemical_system_id, *equilibrium_reactants->castToBaseClass());
64 equilibrium_reactants.reset(
nullptr);
66 use.Set_pp_assemblage_in(
true);
70 if (kinetic_reactants)
72 for (std::size_t chemical_system_id = 0;
73 chemical_system_id < num_chemical_systems;
76 kinetic_reactants->setChemicalSystemID(chemical_system_id);
77 Rxn_kinetics_map.emplace(chemical_system_id,
78 *kinetic_reactants->castToBaseClass());
81 kinetic_reactants.reset(
nullptr);
83 use.Set_kinetics_in(
true);
93 for (
auto const& map_pair : process_id_to_component_name_map)
95 auto const transport_process_id = map_pair.first;
96 auto const& transport_process_variable = map_pair.second;
99 master_bsearch(transport_process_variable.c_str());
144 rates[rate_id].name = reaction_rate.kinetic_reactant.data();
147 rates[rate_id].commands =
static_cast<char*
>(
148 malloc(
sizeof(
char) * reaction_rate.commands().size() + 1));
149 if (rates[rate_id].commands ==
nullptr)
151 OGS_FATAL(
"Could not allocate memory for rate[{:d}] commands.",
154 reaction_rate.commands().copy(rates[rate_id].commands,
156 rates[rate_id].commands[reaction_rate.commands().size()] =
'\0';
158 rates[rate_id].new_def = 1;
159 rates[rate_id].linebase =
nullptr;
160 rates[rate_id].varbase =
nullptr;
161 rates[rate_id].loopbase =
nullptr;
184 std::vector<GlobalVector*>
const& process_solutions)
186 assert(!process_solutions.empty());
188 std::size_t
const num_chemical_systems = process_solutions[0]->size();
189 for (std::size_t chemical_system_id = 0;
190 chemical_system_id < num_chemical_systems;
191 ++chemical_system_id)
193 auto& aqueous_solution = Rxn_solution_map[chemical_system_id];
195 auto initial_aqueous_solution =
198 auto& components = initial_aqueous_solution->Get_comps();
203 auto const transport_process_id = map_pair.first;
204 auto const& master_species = map_pair.second;
206 auto& transport_process_solution =
207 process_solutions[transport_process_id];
209 char const*
const element_name = master_species->elt->name;
210 auto const concentration =
211 transport_process_solution->get(chemical_system_id);
215 double const pH = -std::log10(concentration);
216 aqueous_solution.Set_ph(
pH);
219 auto hydrogen = components.find(
"H(1)");
220 if (hydrogen != components.end())
222 hydrogen->second.Set_input_conc(
pH);
229 components[element_name].Set_input_conc(concentration);
259 if (process_solutions.empty())
261 OGS_FATAL(
"About to access an empty process solutions vector.");
263 std::size_t
const num_chemical_systems = process_solutions[0]->size();
264 for (std::size_t chemical_system_id = 0;
265 chemical_system_id < num_chemical_systems;
266 ++chemical_system_id)
268 Rxn_new_solution.insert(chemical_system_id);
270 use.Set_n_solution_user(chemical_system_id);
272 if (!Rxn_pp_assemblage_map.empty())
274 Rxn_new_pp_assemblage.insert(chemical_system_id);
275 use.Set_pp_assemblage_in(
true);
276 use.Set_n_pp_assemblage_user(chemical_system_id);
279 if (!Rxn_kinetics_map.empty())
281 use.Set_kinetics_in(
true);
282 use.Set_n_kinetics_user(chemical_system_id);
285 initial_solutions(
false);
291 reset(chemical_system_id);
298 Rxn_new_solution.clear();
303 Rxn_solution_map[chemical_system_id].Set_n_user_both(
305 Rxn_solution_map[chemical_system_id].Set_pe(-s_eminus->la);
309 if (!Rxn_pp_assemblage_map.empty())
311 Rxn_new_pp_assemblage.clear();
312 for (
int j = 0; j < count_unknowns; j++)
314 if (x ==
nullptr || x[j]->type != PP)
317 auto& phase_components = Rxn_pp_assemblage_map[chemical_system_id]
318 .Get_pp_assemblage_comps();
319 phase_components[x[j]->pp_assemblage_comp_name].Set_moles(
325 if (!Rxn_kinetics_map.empty())
327 Rxn_kinetics_map[chemical_system_id].Get_steps().clear();
332 std::vector<GlobalVector*>
const& process_solutions,
333 std::size_t
const node_id)
337 auto const transport_process_id = map_pair.first;
338 auto const& master_species = map_pair.second;
340 auto& transport_process_solution =
341 process_solutions[transport_process_id];
343 char const*
const element_name = master_species->elt->name;
347 auto const hydrogen_concentration = std::pow(10, s_hplus->la);
348 transport_process_solution->set(node_id, hydrogen_concentration);
353 auto const concentration =
354 master_species->primary
355 ? master_species->total_primary / mass_water_aq_x
356 : master_species->total / mass_water_aq_x;
357 transport_process_solution->set(node_id, concentration);