OGS
PhreeqcIO.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
35#pragma once
36
37#include <memory>
38
40#include "PhreeqcIOData/Knobs.h"
41
42namespace MeshLib
43{
44class Mesh;
45}
46
47namespace ChemistryLib
48{
49namespace PhreeqcIOData
50{
51struct ChemicalSystem;
52struct ReactionRate;
53struct Output;
54struct Dump;
55struct UserPunch;
56
111{
112public:
113 PhreeqcIO(MeshLib::Mesh const& mesh,
115 std::string const& project_file_name,
116 std::string&& database,
117 std::unique_ptr<ChemicalSystem>&& chemical_system,
118 std::vector<ReactionRate>&& reaction_rates,
119 std::unique_ptr<UserPunch>&& user_punch,
120 std::unique_ptr<Output>&& output,
121 std::unique_ptr<Dump>&& dump,
122 Knobs&& knobs,
123 bool use_stream_mode);
124
125 ~PhreeqcIO();
126
127 void initialize() override;
128
130 std::vector<double> const& concentrations,
131 GlobalIndexType const& chemical_system_id,
132 MaterialPropertyLib::Medium const& medium,
134 double const t) override;
135
137 std::vector<double> const& concentrations,
138 GlobalIndexType const& chemical_system_id,
139 MaterialPropertyLib::Medium const* medium,
141 ParameterLib::SpatialPosition const& pos, double const t,
142 double const dt) override;
143
145
146 void executeSpeciationCalculation(double const dt) override;
147
148 double getConcentration(
149 int const component_id,
150 GlobalIndexType const chemical_system_id) const override;
151
152 friend std::ostream& operator<<(std::ostream& os,
153 PhreeqcIO const& phreeqc_io);
154
155 friend std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io);
156
158 GlobalIndexType const& chemical_system_id,
159 MaterialPropertyLib::Medium const& medium,
160 ParameterLib::SpatialPosition const& pos, double const porosity,
161 double const t, double const dt) override;
162
163 void updatePorosityPostReaction(GlobalIndexType const& chemical_system_id,
164 MaterialPropertyLib::Medium const& medium,
165 double& porosity) override;
166
168 std::size_t const ele_id,
169 std::vector<GlobalIndexType> const& chemical_system_indices) override;
170
171 std::vector<std::string> const getComponentList() const override;
172
173 std::string const _phreeqc_input_file;
174
175private:
176 void writeInputsToFile(double const dt);
177
178 std::stringstream writeInputsToStringStream(double const dt);
179
180 void setAqueousSolutionsPrevFromDumpString(std::string_view dump_content);
181
182 void callPhreeqc() const;
183
184 void callPhreeqcWithString(std::string const& input_content) const;
185
186 std::string_view retrieveSelectedOutputString() const;
187
188 std::string_view retrieveDumpString() const;
189
190 void readOutputsFromFile();
191
192 void readOutputsFromStringView(std::string_view output_content);
193
194 PhreeqcIO& operator<<(double const dt)
195 {
196 _dt = dt;
197 return *this;
198 }
199
200 std::string const _database;
201 std::unique_ptr<ChemicalSystem> _chemical_system;
202 std::vector<ReactionRate> const _reaction_rates;
203 std::unique_ptr<UserPunch> _user_punch;
204 std::unique_ptr<Output> const _output;
205 std::unique_ptr<Dump> const _dump;
207 double _dt = std::numeric_limits<double>::quiet_NaN();
208 const int phreeqc_instance_id = 0;
209 std::size_t _num_chemical_systems = -1;
210 bool _use_stream_mode = false;
211};
212} // namespace PhreeqcIOData
213} // namespace ChemistryLib
Interface for coupling OpenGeoSys with an external geochemical solver.
MathLib::EigenLisLinearSolver GlobalLinearSolver
GlobalMatrix::IndexType GlobalIndexType
ChemicalSolverInterface(MeshLib::Mesh const &mesh, GlobalLinearSolver &linear_solver_)
friend std::ostream & operator<<(std::ostream &os, PhreeqcIO const &phreeqc_io)
double getConcentration(int const component_id, GlobalIndexType const chemical_system_id) const override
void setAqueousSolutionsPrevFromDumpFile() override
PhreeqcIO(MeshLib::Mesh const &mesh, GlobalLinearSolver &linear_solver, std::string const &project_file_name, std::string &&database, std::unique_ptr< ChemicalSystem > &&chemical_system, std::vector< ReactionRate > &&reaction_rates, std::unique_ptr< UserPunch > &&user_punch, std::unique_ptr< Output > &&output, std::unique_ptr< Dump > &&dump, Knobs &&knobs, bool use_stream_mode)
std::unique_ptr< ChemicalSystem > _chemical_system
Definition PhreeqcIO.h:201
std::vector< ReactionRate > const _reaction_rates
Definition PhreeqcIO.h:202
std::unique_ptr< UserPunch > _user_punch
Definition PhreeqcIO.h:203
void writeInputsToFile(double const dt)
void setChemicalSystemConcrete(std::vector< double > 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
PhreeqcIO & operator<<(double const dt)
Definition PhreeqcIO.h:194
std::unique_ptr< Dump > const _dump
Definition PhreeqcIO.h:205
std::unique_ptr< Output > const _output
Definition PhreeqcIO.h:204
void readOutputsFromStringView(std::string_view output_content)
void callPhreeqcWithString(std::string const &input_content) const
std::string_view retrieveDumpString() const
void computeSecondaryVariable(std::size_t const ele_id, std::vector< GlobalIndexType > const &chemical_system_indices) override
void initializeChemicalSystemConcrete(std::vector< double > const &concentrations, GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Medium const &medium, ParameterLib::SpatialPosition const &pos, double const t) override
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
std::string_view retrieveSelectedOutputString() const
void executeSpeciationCalculation(double const dt) override
void setAqueousSolutionsPrevFromDumpString(std::string_view dump_content)
friend std::istream & operator>>(std::istream &in, PhreeqcIO &phreeqc_io)
std::vector< std::string > const getComponentList() const override
std::stringstream writeInputsToStringStream(double const dt)
void updatePorosityPostReaction(GlobalIndexType const &chemical_system_id, MaterialPropertyLib::Medium const &medium, double &porosity) override
Complete description of one local reactive system passed to PHREEQC.
Specification of which PHREEQC output columns are imported into OpenGeoSys.