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
41#include "PhreeqcIOData/Knobs.h"
43
44namespace MeshLib
45{
46class Mesh;
47}
48
49namespace ChemistryLib
50{
51namespace PhreeqcIOData
52{
53struct ChemicalSystem;
54struct ReactionRate;
55struct Output;
56struct Dump;
57struct UserPunch;
58
115{
116public:
117 PhreeqcIO(MeshLib::Mesh const& mesh,
119 std::string const& project_file_name,
120 std::string&& database,
121 std::unique_ptr<ChemicalSystem>&& chemical_system,
122 std::vector<ReactionRate>&& reaction_rates,
123 std::unique_ptr<UserPunch>&& user_punch,
124 std::unique_ptr<Output>&& output,
125 std::unique_ptr<Dump>&& dump,
126 Knobs&& knobs,
127 bool use_stream_mode,
128 int num_chemistry_threads,
129 double concentration_warning_threshold);
130
131 ~PhreeqcIO();
132
133 void initialize() override;
134
136 std::vector<double> const& concentrations,
137 GlobalIndexType const& chemical_system_id,
138 MaterialPropertyLib::Medium const& medium,
140 double const t) override;
141
143 std::vector<double> const& concentrations,
144 GlobalIndexType const& chemical_system_id,
145 MaterialPropertyLib::Medium const* medium,
147 ParameterLib::SpatialPosition const& pos, double const t,
148 double const dt) override;
149
151
152 void executeSpeciationCalculation(double const dt) override;
153
154 double getConcentration(
155 int const component_id,
156 GlobalIndexType const chemical_system_id) const override;
157
158 friend std::ostream& operator<<(std::ostream& os,
159 PhreeqcIO const& phreeqc_io);
160
161 friend std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io);
162
164 GlobalIndexType const& chemical_system_id,
165 MaterialPropertyLib::Medium const& medium,
166 ParameterLib::SpatialPosition const& pos, double const porosity,
167 double const t, double const dt) override;
168
169 void updatePorosityPostReaction(GlobalIndexType const& chemical_system_id,
170 MaterialPropertyLib::Medium const& medium,
171 double& porosity) override;
172
174 std::size_t const ele_id,
175 std::vector<GlobalIndexType> const& chemical_system_indices) override;
176
177 std::vector<std::string> const getComponentList() const override;
178
179 std::string const _phreeqc_input_file;
180
181private:
182 void writeInputsToFile(double const dt);
183
186 void writeInputHeader(std::ostream& os) const;
187
200 void writeSystemBlock(std::ostream& os,
201 std::size_t chemical_system_id,
202 std::size_t solution_id,
203 std::size_t prev_solution_id,
204 double dt) const;
205
209 void updateSystemFromOutputLine(std::string_view line,
210 std::size_t chemical_system_id);
211
212 void setAqueousSolutionsPrevFromDumpString(std::string_view dump_content);
213
214 void callPhreeqc() const;
215
216 void readOutputsFromFile();
217
218 void executeSpeciationCalculationParallel(double const dt);
219
220 std::string generateInputForSystem(std::size_t chemical_system_id,
221 double const dt) const;
222
223 void parseOutputForSystem(std::string_view output_content,
224 std::size_t chemical_system_id);
225
227 std::vector<double> const& accepted_items,
228 std::size_t chemical_system_id);
229
230 PhreeqcIO& operator<<(double const dt)
231 {
232 _dt = dt;
233 return *this;
234 }
235
236 // Member variables are ordered by size (largest first) to minimize padding.
237
243 std::string const _database;
245 std::vector<ReactionRate> const _reaction_rates;
246 std::unique_ptr<ChemicalSystem> _chemical_system;
247 std::unique_ptr<UserPunch> _user_punch;
248 std::unique_ptr<Output> const _output;
249 std::unique_ptr<Dump> const _dump;
250 std::unique_ptr<PhreeqcInstancePool> instance_pool_;
251 double _dt = std::numeric_limits<double>::quiet_NaN();
252 std::size_t _num_chemical_systems = 0;
269};
270} // namespace PhreeqcIOData
271} // 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_)
void parseOutputForSystem(std::string_view output_content, std::size_t chemical_system_id)
std::string generateInputForSystem(std::size_t chemical_system_id, double const dt) const
friend std::ostream & operator<<(std::ostream &os, PhreeqcIO const &phreeqc_io)
void writeSystemBlock(std::ostream &os, std::size_t chemical_system_id, std::size_t solution_id, std::size_t prev_solution_id, double dt) const
void updateSystemFromOutputLine(std::string_view line, std::size_t chemical_system_id)
double getConcentration(int const component_id, GlobalIndexType const chemical_system_id) const override
void setAqueousSolutionsPrevFromDumpFile() override
std::unique_ptr< ChemicalSystem > _chemical_system
Definition PhreeqcIO.h:246
std::vector< ReactionRate > const _reaction_rates
Definition PhreeqcIO.h:245
std::unique_ptr< UserPunch > _user_punch
Definition PhreeqcIO.h:247
std::unique_ptr< PhreeqcInstancePool > instance_pool_
Definition PhreeqcIO.h:250
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:230
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, int num_chemistry_threads, double concentration_warning_threshold)
void executeSpeciationCalculationParallel(double const dt)
std::unique_ptr< Dump > const _dump
Definition PhreeqcIO.h:249
std::unique_ptr< Output > const _output
Definition PhreeqcIO.h:248
void computeSecondaryVariable(std::size_t const ele_id, std::vector< GlobalIndexType > const &chemical_system_indices) override
void updateChemicalSystemFromOutput(std::vector< double > const &accepted_items, std::size_t chemical_system_id)
void writeInputHeader(std::ostream &os) const
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
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
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.