OGS
PhreeqcKernel.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <phreeqcpp/Phreeqc.h>
7
8#include <map>
9#include <vector>
10
14
15class cxxSolution;
16class cxxISolution;
17
18namespace ChemistryLib
19{
20namespace PhreeqcKernelData
21{
22class AqueousSolution;
23class ReactionRate;
24
25class PhreeqcKernel final : public ChemicalSolverInterface, private Phreeqc
26{
27public:
29 std::size_t const num_chemical_systems,
30 std::vector<std::pair<int, std::string>> const&
31 process_id_to_component_name_map,
32 std::string const& database, AqueousSolution aqueous_solution,
33 std::unique_ptr<EquilibriumReactants>&& equilibrium_reactants,
34 std::unique_ptr<Kinetics>&& kinetic_reactants,
35 std::vector<ReactionRate>&& reaction_rates);
36
37 void executeSpeciationCalculation(double const dt) override;
38
40 std::vector<GlobalVector*> const& process_solutions);
41
42 void callPhreeqc(std::vector<GlobalVector*>& process_solutions);
43
45 std::vector<GlobalVector*> const& process_solutions,
46 std::size_t const node_id);
47
48private:
49 void initializePhreeqcGeneralSettings() { do_initialize(); }
50
52 EquilibriumReactants const& equilibrium_reactants);
53
54 void loadDatabase(std::string const& database);
55
56 void reinitializeRates();
57
58 void setConvergenceTolerance() { convergence_tolerance = 1e-12; }
59
60 void configureOutputSettings() { pr.all = false; }
61
63 cxxSolution& aqueous_solution);
64
65 void setTimeStepSize(double const dt);
66
67 void reset(std::size_t const chemical_system_id);
68
69 std::map<int, struct master*> _process_id_to_master_map;
70 std::unique_ptr<cxxISolution const> _initial_aqueous_solution;
71 std::unique_ptr<cxxSolution const> _aqueous_solution;
72 std::vector<ReactionRate> const _reaction_rates;
73};
74} // namespace PhreeqcKernelData
75} // namespace ChemistryLib
Interface for coupling OpenGeoSys with an external geochemical solver.
MathLib::EigenLisLinearSolver GlobalLinearSolver
ChemicalSolverInterface(MeshLib::Mesh const &mesh, GlobalLinearSolver &linear_solver_)
std::vector< ReactionRate > const _reaction_rates
std::map< int, struct master * > _process_id_to_master_map
void setAqueousSolutions(std::vector< GlobalVector * > const &process_solutions)
void tidyEquilibriumReactants(EquilibriumReactants const &equilibrium_reactants)
void loadDatabase(std::string const &database)
void updateNodalProcessSolutions(std::vector< GlobalVector * > const &process_solutions, std::size_t const node_id)
PhreeqcKernel(MeshLib::Mesh const &mesh, GlobalLinearSolver &linear_solver, std::size_t const num_chemical_systems, std::vector< std::pair< int, std::string > > const &process_id_to_component_name_map, std::string const &database, AqueousSolution aqueous_solution, std::unique_ptr< EquilibriumReactants > &&equilibrium_reactants, std::unique_ptr< Kinetics > &&kinetic_reactants, std::vector< ReactionRate > &&reaction_rates)
std::unique_ptr< cxxSolution const > _aqueous_solution
cxxISolution * getOrCreateInitialAqueousSolution(cxxSolution &aqueous_solution)
std::unique_ptr< cxxISolution const > _initial_aqueous_solution
void callPhreeqc(std::vector< GlobalVector * > &process_solutions)
void executeSpeciationCalculation(double const dt) override
void reset(std::size_t const chemical_system_id)