#pragma once #include #include #include #include #include #include #include #include #include #include "Exchange.h" #include "PPassemblage.h" #include "Solution.h" #include "Surface.h" #include "cxxKinetics.h" enum { POET_SOL = 0, POET_EXCH, POET_KIN, POET_EQUIL, POET_SURF }; class PhreeqcInit : public IPhreeqc { public: PhreeqcInit(const std::string &database, const std::string &input_script); struct PhreeqcMat { std::vector names; std::vector ids; std::vector> values; }; PhreeqcMat getPhreeqcMat() const { return pqc_mat; }; std::map raw_dumps(); using essential_names = std::array, 5>; using ModulesArray = std::array; ModulesArray getModuleSizes(const std::vector &cell_ids); std::vector getSolutionPrimaries() { return std::vector(this->surface_primaries.begin(), this->surface_primaries.end()); } std::vector getSolutionNames(int cell_id) { return this->raw_initials[cell_id].first[POET_SOL]; } std::vector getExchanger(int id) { if (this->exchanger.contains(id)) { return this->exchanger[id]; } return {}; } std::vector getKineticsNames(int id) { if (this->kinetics.contains(id)) { return this->kinetics[id]; } return {}; } std::vector getEquilibriumNames(int id) { if (this->equilibrium.contains(id)) { return this->equilibrium[id]; } return {}; } std::vector getSurfaceCompNames(int id) { if (this->surface_comps.contains(id)) { return this->surface_comps[id]; } return {}; } std::vector getSurfaceChargeNames(int id) { if (this->surface_charge.contains(id)) { return this->surface_charge[id]; } return {}; } private: // required only for simulation essential_names initial_names; void parseInitValues(); void parseInit(); std::vector dump_solution_names(int cell_number); void dump_reactant_names(int cell_number, const std::vector union_sol_names, essential_names &names); std::vector find_all_valence_states(const std::vector &solution_names, const std::size_t offset); 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); } PhreeqcMat pqc_mat; PhreeqcMat buildPhreeqcMat(); std::map> exchanger; std::map> kinetics; std::map> equilibrium; std::map> surface_comps; std::map> surface_charge; std::set surface_primaries; using RawMap = std::map>>; essential_names union_raws(const RawMap &raws); std::vector> conc_from_essentials(const RawMap &raws, const essential_names &names); // void valuesFromModule(const std::string &module_name, int cell_number, // essential_names &names, std::vector &values); std::string subExchangeName(std::string name); std::vector get_essential_values_init(std::size_t cell_number, const std::vector &order); RawMap raw_initials; };