/** * \file * \copyright * Copyright (c) 2012-2021, 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 "ChemicalSolverInterface.h" #include "PhreeqcIOData/Knobs.h" namespace MeshLib { class Mesh; } namespace ChemistryLib { namespace PhreeqcIOData { struct ChemicalSystem; struct ReactionRate; struct Output; struct SurfaceSite; struct ExchangeSite; struct Dump; struct UserPunch; class PhreeqcIO final : public ChemicalSolverInterface { public: PhreeqcIO(std::string const& project_file_name, std::string&& database, std::unique_ptr&& chemical_system, std::vector&& reaction_rates, std::vector&& surface, std::vector&& exchange, std::unique_ptr&& user_punch, std::unique_ptr&& output, std::unique_ptr&& dump, Knobs&& knobs); void initialize() override; void initializeChemicalSystemConcrete( std::vector const& concentrations, GlobalIndexType const& chemical_system_id, MaterialPropertyLib::Medium const& medium, ParameterLib::SpatialPosition const& pos, double const t) override; void setChemicalSystemConcrete( std::vector const& concentrations, GlobalIndexType const& chemical_system_id, MaterialPropertyLib::Medium const* medium, MaterialPropertyLib::VariableArray const& vars, ParameterLib::SpatialPosition const& pos, double const t, double const dt) override; void setAqueousSolutionsPrevFromDumpFile() override; void executeSpeciationCalculation(double const dt) override; std::vector getIntPtProcessSolutions() const override; friend std::ostream& operator<<(std::ostream& os, PhreeqcIO const& phreeqc_io); friend std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io); void updateVolumeFractionPostReaction( GlobalIndexType const& chemical_system_id, MaterialPropertyLib::Medium const& medium, ParameterLib::SpatialPosition const& pos, double const porosity, double const t, double const dt) override; void updatePorosityPostReaction(GlobalIndexType const& chemical_system_id, MaterialPropertyLib::Medium const& medium, double& porosity) override; void computeSecondaryVariable( std::size_t const ele_id, std::vector const& chemical_system_indices) override; std::vector const getComponentList() const override; std::string const _phreeqc_input_file; private: void writeInputsToFile(double const dt); void callPhreeqc(); void readOutputsFromFile(); PhreeqcIO& operator<<(double const dt) { _dt = dt; return *this; } std::string const _database; std::unique_ptr _chemical_system; std::vector const _reaction_rates; std::vector const _surface; std::vector const _exchange; std::unique_ptr _user_punch; std::unique_ptr const _output; std::unique_ptr const _dump; Knobs const _knobs; double _dt = std::numeric_limits::quiet_NaN(); const int phreeqc_instance_id = 0; std::size_t _num_chemical_systems = -1; }; } // namespace PhreeqcIOData } // namespace ChemistryLib