#pragma once #include "Base/RInsidePOET.hpp" #include "DataStructures/NamedVector.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); 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_PQC_SCRIPTS, CHEM_PQC_IDS, CHEM_PQC_SOL_ORDER, CHEM_DHT_SPECIES, CHEM_INTERP_SPECIES, CHEM_HOOKS, 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; std::uint32_t n_cols; std::uint32_t n_rows; double s_cols; double s_rows; 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::string database; std::vector pqc_scripts; std::vector pqc_ids; std::vector pqc_sol_order; NamedVector dht_species; NamedVector interp_species; 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::string database; std::vector pqc_scripts; std::vector pqc_ids; std::vector pqc_sol_order; NamedVector dht_species; NamedVector interp_species; ChemistryHookFunctions hooks; }; ChemistryInit getChemistryInit() const; }; } // namespace poet