/** * \file * \copyright * Copyright (c) 2012-2023, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #pragma once #include #include #include #include "ChemicalSolverInterface.h" #include "PhreeqcKernelData/EquilibriumReactants.h" #include "PhreeqcKernelData/KineticReactant.h" class cxxSolution; class cxxISolution; namespace ChemistryLib { namespace PhreeqcKernelData { class AqueousSolution; class ReactionRate; class PhreeqcKernel final : public ChemicalSolverInterface, private Phreeqc { public: PhreeqcKernel(MeshLib::Mesh const& mesh, GlobalLinearSolver& linear_solver, std::size_t const num_chemical_systems, std::vector> const& process_id_to_component_name_map, std::string const& database, AqueousSolution aqueous_solution, std::unique_ptr&& equilibrium_reactants, std::unique_ptr&& kinetic_reactants, std::vector&& reaction_rates); void executeSpeciationCalculation(double const dt) override; void setAqueousSolutions( std::vector const& process_solutions); void callPhreeqc(std::vector& process_solutions); void updateNodalProcessSolutions( std::vector const& process_solutions, std::size_t const node_id); private: void initializePhreeqcGeneralSettings() { do_initialize(); } void tidyEquilibriumReactants( EquilibriumReactants const& equilibrium_reactants); void loadDatabase(std::string const& database); void reinitializeRates(); void setConvergenceTolerance() { convergence_tolerance = 1e-12; } void configureOutputSettings() { pr.all = false; } cxxISolution* getOrCreateInitialAqueousSolution( cxxSolution& aqueous_solution); void setTimeStepSize(double const dt); void reset(std::size_t const chemical_system_id); std::map _process_id_to_master_map; std::unique_ptr _initial_aqueous_solution; std::unique_ptr _aqueous_solution; std::vector const _reaction_rates; }; } // namespace PhreeqcKernelData } // namespace ChemistryLib