#pragma once #include "Base/RInsidePOET.hpp" #include "DataStructures/NamedVector.hpp" #include "POETInit.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace poet { using TugType = double; class InitialList { public: InitialList(RInside &R) : R(R){}; void initializeFromList(const Rcpp::List &setup); void importList(const Rcpp::List &setup, bool minimal = false); Rcpp::List exportList(); Field getInitialGrid() const { return Field(this->initial_grid); } private: RInside &R; enum class ExportList { GRID_DIM, GRID_SPECS, GRID_SPATIAL, GRID_CONSTANT, GRID_POROSITY, GRID_INITIAL, DIFFU_TRANSPORT, DIFFU_BOUNDARIES, DIFFU_INNER_BOUNDARIES, DIFFU_ALPHA_X, DIFFU_ALPHA_Y, CHEM_DATABASE, CHEM_FIELD_HEADER, CHEM_PQC_SCRIPTS, CHEM_PQC_IDS, CHEM_PQC_SOLUTIONS, CHEM_PQC_SOLUTION_PRIMARY, CHEM_PQC_EXCHANGER, CHEM_PQC_KINETICS, CHEM_PQC_EQUILIBRIUM, CHEM_PQC_SURFACE_COMPS, CHEM_PQC_SURFACE_CHARGES, CHEM_DHT_SPECIES, CHEM_INTERP_SPECIES, CHEM_HOOKS, AI_SURROGATE_INPUT_SCRIPT, ENUM_SIZE // Hack: Last element of the enum to show enum size }; // Grid members static constexpr const char *grid_key = "Grid"; enum class GridMembers { PQC_SCRIPT_STRING, PQC_SCRIPT_FILE, PQC_DB_STRING, PQC_DB_FILE, GRID_DEF, GRID_SIZE, CONSTANT_CELLS, POROSITY, ENUM_SIZE }; static constexpr std::size_t size_GridMembers = static_cast(InitialList::GridMembers::ENUM_SIZE); static constexpr std::array GridMembersString = {"pqc_in_string", "pqc_in_file", "pqc_db_string", "pqc_db_file", "grid_def", "grid_size", "constant_cells", "porosity"}; constexpr const char *GRID_MEMBER_STR(GridMembers member) const { return GridMembersString[static_cast(member)]; } std::unique_ptr phreeqc; void prepareGrid(const Rcpp::List &grid_input); std::uint8_t dim{0}; std::uint32_t n_cols{0}; std::uint32_t n_rows{0}; double s_cols{0}; double s_rows{0}; std::vector constant_cells; std::vector porosity; Rcpp::List initial_grid; // No export Rcpp::NumericMatrix phreeqc_mat; public: struct DiffusionInit { using BoundaryMap = std::map>>; using InnerBoundaryMap = std::map, TugType>>; uint8_t dim; std::uint32_t n_cols; std::uint32_t n_rows; double s_cols; double s_rows; std::vector constant_cells; std::vector transport_names; BoundaryMap boundaries; InnerBoundaryMap inner_boundaries; Field alpha_x; Field alpha_y; }; DiffusionInit getDiffusionInit() const; private: // Diffusion members static constexpr const char *diffusion_key = "Diffusion"; enum class DiffusionMembers { BOUNDARIES, INNER_BOUNDARIES, ALPHA_X, ALPHA_Y, ENUM_SIZE }; static constexpr std::size_t size_DiffusionMembers = static_cast(InitialList::DiffusionMembers::ENUM_SIZE); static constexpr std::array DiffusionMembersString = {"boundaries", "inner_boundaries", "alpha_x", "alpha_y"}; constexpr const char *DIFFU_MEMBER_STR(DiffusionMembers member) const { return DiffusionMembersString[static_cast(member)]; } void initDiffusion(const Rcpp::List &diffusion_input); std::pair resolveBoundaries(const Rcpp::List &boundaries_list, const Rcpp::List &inner_boundaries); Rcpp::List boundaries; Rcpp::List inner_boundaries; Rcpp::List alpha_x; Rcpp::List alpha_y; std::vector transport_names; // Chemistry Members static constexpr const char *chemistry_key = "Chemistry"; void initChemistry(const Rcpp::List &chem_input); std::vector field_header; std::string database; std::vector pqc_scripts; std::vector pqc_ids; std::vector pqc_solutions; std::vector pqc_solution_primaries; Rcpp::List pqc_exchanger; Rcpp::List pqc_kinetics; Rcpp::List pqc_equilibrium; Rcpp::List pqc_surface_comps; Rcpp::List pqc_surface_charges; NamedVector dht_species; NamedVector interp_species; // Path to R script that the user defines in the input file std::string ai_surrogate_input_script; Rcpp::List chem_hooks; const std::set hook_name_list{"dht_fill", "dht_fuzz", "interp_pre", "interp_post"}; public: struct ChemistryHookFunctions { RHookFunction dht_fill; RHookFunction> dht_fuzz; RHookFunction> interp_pre; RHookFunction interp_post; }; struct ChemistryInit { uint32_t total_grid_cells; // std::vector field_header; std::string database; // std::vector pqc_scripts; // std::vector pqc_ids; std::map pqc_config; // std::vector pqc_sol_order; NamedVector dht_species; NamedVector interp_species; ChemistryHookFunctions hooks; std::string ai_surrogate_input_script; }; ChemistryInit getChemistryInit() const; }; } // namespace poet