#pragma once #include #include #include #include #include #include #include #include #include #include #include #include class IPhreeqcPOET : public IPhreeqc { public: std::vector get_essential_values(std::size_t cell_number, const std::vector &order); void set_essential_values(std::size_t cell_number, const std::vector &order, std::vector &values); IPhreeqcPOET(const std::string &database, const std::string &input_script) : IPhreeqc() { this->LoadDatabase(database.c_str()); this->RunFile(input_script.c_str()); this->parseInitValues(); } std::vector getInitNames() const { std::vector names; for (auto &sol : this->initial_names) { names.insert(names.end(), sol.begin(), sol.end()); } return names; } std::vector> getInitValues() const { return this->initial_concentrations; } std::vector getSolutionIds() const { return this->solution_ids; } std::map raw_dumps() { std::map dumps; this->SetDumpStringOn(true); for (const auto &sol_id : this->solution_ids) { std::string call_string = "DUMP\n -cells " + std::to_string(sol_id); this->RunString(call_string.c_str()); dumps[sol_id] = this->GetDumpString(); } return dumps; } private: using essential_names = std::array, 5>; essential_names initial_names; std::vector> initial_concentrations; std::vector solution_ids; void parseInitValues(); essential_names dump_essential_names(std::size_t cell_number); cxxSolution *Get_solution(std::size_t n) { return Utilities::Rxn_find(this->PhreeqcPtr->Get_Rxn_solution_map(), n); } cxxExchange *Get_exchange(std::size_t n) { return Utilities::Rxn_find(this->PhreeqcPtr->Get_Rxn_exchange_map(), n); } cxxKinetics *Get_kinetic(std::size_t n) { return Utilities::Rxn_find(this->PhreeqcPtr->Get_Rxn_kinetics_map(), n); } cxxPPassemblage *Get_equilibrium(std::size_t n) { return Utilities::Rxn_find(this->PhreeqcPtr->Get_Rxn_pp_assemblage_map(), n); } cxxSurface *Get_surface(std::size_t n) { return Utilities::Rxn_find(this->PhreeqcPtr->Get_Rxn_surface_map(), n); } void resolveSolutionUseKW( const std::vector &unresolved, std::map>> &mapped_values); void valuesFromModule(const std::string &module_name, int cell_number, essential_names &names, std::vector &values); std::string subExchangeName(std::string name) { for (const auto &species : this->PhreeqcPtr->Get_species_list()) { const std::string &species_name = species.s->name; // check if `name` is a prefix of `species_name` if (species_name.compare(0, name.size(), name) == 0) { return species_name; } } return name; }; };