diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c924723ea..f593d6b63 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,64 +1,64 @@ -add_subdirectory(DataStructures) +add_library(POETLib OBJECT) -add_library(poetinitlib - Init/InitialList.cpp - Init/GridInit.cpp +target_sources( + POETLib + PRIVATE + Init/InitialList.cpp + Init/GridInit.cpp Init/DiffusionInit.cpp + Init/ChemistryInit.cpp + PRIVATE + DataStructures/Field.cpp ) -target_link_libraries(poetinitlib PUBLIC - DataStructures - RRuntime - IPhreeqcPOET - tug +target_include_directories(POETLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") +target_link_libraries( + POETLib + PUBLIC RRuntime + PUBLIC IPhreeqcPOET + PRIVATE tug ) -target_include_directories(poetinitlib PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/Init" -) +# add_library(poetlib +# Base/Grid.cpp +# Base/SimParams.cpp +# Chemistry/ChemistryModule.cpp +# Chemistry/MasterFunctions.cpp +# Chemistry/WorkerFunctions.cpp +# Chemistry/SurrogateModels/DHT_Wrapper.cpp +# Chemistry/SurrogateModels/DHT.c +# Chemistry/SurrogateModels/HashFunctions.cpp +# Chemistry/SurrogateModels/InterpolationModule.cpp +# Chemistry/SurrogateModels/ProximityHashTable.cpp +# Transport/DiffusionModule.cpp +# ) -target_compile_definitions(poetinitlib PUBLIC STRICT_R_HEADERS) +# target_link_libraries(poetlib PUBLIC +# DataStructures +# Init +# MPI::MPI_C +# ${MATH_LIBRARY} +# RRuntime +# PhreeqcRM +# tug +# ) -add_library(poetlib - Base/Grid.cpp - Base/SimParams.cpp - Chemistry/ChemistryModule.cpp - Chemistry/MasterFunctions.cpp - Chemistry/WorkerFunctions.cpp - Chemistry/SurrogateModels/DHT_Wrapper.cpp - Chemistry/SurrogateModels/DHT.c - Chemistry/SurrogateModels/HashFunctions.cpp - Chemistry/SurrogateModels/InterpolationModule.cpp - Chemistry/SurrogateModels/ProximityHashTable.cpp - Transport/DiffusionModule.cpp -) +# target_compile_definitions(poetlib PUBLIC STRICT_R_HEADERS OMPI_SKIP_MPICXX) -target_link_libraries(poetlib PUBLIC - DataStructures - MPI::MPI_C - ${MATH_LIBRARY} - RRuntime - PhreeqcRM - tug - poetinitlib -) +# mark_as_advanced(PHREEQCRM_BUILD_MPI PHREEQCRM_DISABLE_OPENMP) +# set(PHREEQCRM_DISABLE_OPENMP ON CACHE BOOL "" FORCE) -target_compile_definitions(poetlib PUBLIC STRICT_R_HEADERS OMPI_SKIP_MPICXX) +# option(POET_DHT_DEBUG "Build with DHT debug info" OFF) -mark_as_advanced(PHREEQCRM_BUILD_MPI PHREEQCRM_DISABLE_OPENMP) -set(PHREEQCRM_DISABLE_OPENMP ON CACHE BOOL "" FORCE) +# if(POET_DHT_DEBUG) +# target_compile_definitions(poetlib PRIVATE DHT_STATISTICS) +# endif() -option(POET_DHT_DEBUG "Build with DHT debug info" OFF) +# option(POET_PHT_ADDITIONAL_INFO "Enables additional information in the PHT" OFF) -if(POET_DHT_DEBUG) - target_compile_definitions(poetlib PRIVATE DHT_STATISTICS) -endif() - -option(POET_PHT_ADDITIONAL_INFO "Enables additional information in the PHT" OFF) - -if (POET_PHT_ADDITIONAL_INFO) - target_compile_definitions(poetlib PRIVATE POET_PHT_ADD) -endif() +# if (POET_PHT_ADDITIONAL_INFO) +# target_compile_definitions(poetlib PRIVATE POET_PHT_ADD) +# endif() file(READ "${PROJECT_SOURCE_DIR}/R_lib/kin_r_library.R" R_KIN_LIB ) file(READ "${PROJECT_SOURCE_DIR}/R_lib/init_r_lib.R" R_INIT_LIB) @@ -70,7 +70,7 @@ configure_file(poet.hpp.in poet.hpp @ONLY) # target_include_directories(poet PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") add_executable(poet_init initializer.cpp) -target_link_libraries(poet_init PRIVATE poetinitlib RRuntime) +target_link_libraries(poet_init PRIVATE POETLib RRuntime) target_include_directories(poet_init PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") # install(TARGETS poet DESTINATION bin) diff --git a/src/DataStructures/CMakeLists.txt b/src/DataStructures/CMakeLists.txt index 025671340..bbc0263a8 100644 --- a/src/DataStructures/CMakeLists.txt +++ b/src/DataStructures/CMakeLists.txt @@ -1,11 +1,3 @@ -add_library(DataStructures OBJECT +target_sources(POETLib PRIVATE Field.cpp -) - -target_link_libraries(DataStructures - PUBLIC RRuntime -) - -target_include_directories(DataStructures - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) \ No newline at end of file diff --git a/src/Init/CMakeLists.txt b/src/Init/CMakeLists.txt new file mode 100644 index 000000000..47ce9eb3e --- /dev/null +++ b/src/Init/CMakeLists.txt @@ -0,0 +1,6 @@ +target_sources(POETLib PRIVATE + InitialList.cpp + GridInit.cpp + DiffusionInit.cpp + ChemistryInit.cpp +) \ No newline at end of file diff --git a/src/Init/ChemistryInit.cpp b/src/Init/ChemistryInit.cpp new file mode 100644 index 000000000..962fc3b73 --- /dev/null +++ b/src/Init/ChemistryInit.cpp @@ -0,0 +1,17 @@ +#include "InitialList.hpp" + +namespace poet { +InitialList::ChemistryInit InitialList::getChemistryInit() const { + ChemistryInit chem_init; + + chem_init.initial_grid = Field(initial_grid); + + chem_init.database = database; + chem_init.pqc_scripts = pqc_scripts; + chem_init.pqc_ids = pqc_ids; + + chem_init.pqc_sol_order = pqc_sol_order; + + return chem_init; +} +} // namespace poet \ No newline at end of file diff --git a/src/Init/GridInit.cpp b/src/Init/GridInit.cpp index 7e77a65d4..ba7e1716a 100644 --- a/src/Init/GridInit.cpp +++ b/src/Init/GridInit.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,7 @@ #include namespace poet { + static Rcpp::NumericMatrix pqcScriptToGrid(IPhreeqcPOET &phreeqc, RInside &R) { IPhreeqcPOET::PhreeqcMat phreeqc_mat = phreeqc.getPhreeqcMat(); @@ -55,13 +57,13 @@ replaceRawKeywordIDs(std::map raws) { return raws; } -static inline IPhreeqcPOET::ModulesArray -getModuleSizes(IPhreeqcPOET &phreeqc, const Rcpp::List &initial_grid) { +static inline uint32_t getSolutionCount(IPhreeqcPOET &phreeqc, + const Rcpp::List &initial_grid) { IPhreeqcPOET::ModulesArray mod_array; - Rcpp::Function unique("unique"); + Rcpp::Function unique_R("unique"); std::vector row_ids = - Rcpp::as>(unique(initial_grid["ID"])); + Rcpp::as>(unique_R(initial_grid["ID"])); // std::vector sizes_vec(sizes.begin(), sizes.end()); @@ -71,7 +73,7 @@ getModuleSizes(IPhreeqcPOET &phreeqc, const Rcpp::List &initial_grid) { // std::copy(sizes_vec.begin(), sizes_vec.end(), sizes.begin()); - return phreeqc.getModuleSizes(row_ids); + return phreeqc.getModuleSizes(row_ids)[POET_SOL]; } static std::string readFile(const std::string &path) { @@ -95,6 +97,7 @@ static std::string readFile(const std::string &path) { void InitialList::initGrid(const Rcpp::List &grid_input) { // parse input values + Rcpp::Function unique_R("unique"); std::string script; std::string database; @@ -155,26 +158,45 @@ void InitialList::initGrid(const Rcpp::List &grid_input) { this->phreeqc_mat = pqcScriptToGrid(phreeqc, R); this->initial_grid = matToGrid(R, this->phreeqc_mat, grid_def); - this->module_sizes = getModuleSizes(phreeqc, this->initial_grid); + const uint32_t solution_count = getSolutionCount(phreeqc, this->initial_grid); std::vector colnames = Rcpp::as>(this->initial_grid.names()); this->transport_names = this->pqc_sol_order = std::vector( colnames.begin() + 1, - colnames.begin() + 1 + this->module_sizes[POET_SOL]); + colnames.begin() + 1 + solution_count); // skip ID - // print module sizes - for (std::size_t i = 0; i < this->module_sizes.size(); i++) { - std::cout << this->module_sizes[i] << std::endl; + std::map pqc_raw_dumps; + + pqc_raw_dumps = replaceRawKeywordIDs(phreeqc.raw_dumps()); + + this->pqc_ids = + Rcpp::as>(unique_R(this->initial_grid["ID"])); + + for (const auto &id : this->pqc_ids) { + this->pqc_scripts.push_back(pqc_raw_dumps[id]); } - - this->pqc_raw_dumps = replaceRawKeywordIDs(phreeqc.raw_dumps()); - - // R["pqc_mat"] = this->phreeqc_mat; - // R["grid_def"] = initial_grid; - - // R.parseEval("print(pqc_mat)"); - // R.parseEval("print(grid_def)"); } + +InitialList::DiffusionInit InitialList::getDiffusionInit() const { + DiffusionInit diff_init; + + diff_init.n_cols = this->n_cols; + diff_init.n_rows = this->n_rows; + + diff_init.s_cols = this->s_cols; + diff_init.s_rows = this->s_rows; + + diff_init.constant_cells = this->constant_cells; + diff_init.transport_names = this->transport_names; + + diff_init.initial_grid = Field(this->initial_grid); + diff_init.boundaries = Field(this->boundaries); + diff_init.alpha_x = Field(this->alpha_x); + diff_init.alpha_y = Field(this->alpha_y); + + return diff_init; +} + } // namespace poet \ No newline at end of file diff --git a/src/Init/InitialList.cpp b/src/Init/InitialList.cpp index a433097a2..aa66f71a6 100644 --- a/src/Init/InitialList.cpp +++ b/src/Init/InitialList.cpp @@ -1,8 +1,80 @@ #include "InitialList.hpp" +#include +#include +#include +#include +#include +#include namespace poet { void InitialList::initializeFromList(const Rcpp::List &setup) { initGrid(setup[grid_key]); initDiffusion(setup[diffusion_key]); } + +void InitialList::importList(const Rcpp::List &setup) { + this->dim = Rcpp::as(setup[static_cast(ExportList::GRID_DIM)]); + + Rcpp::NumericVector grid_specs = + setup[static_cast(ExportList::GRID_SPECS)]; + this->n_rows = grid_specs[0]; + this->n_cols = grid_specs[1]; + + Rcpp::NumericVector spatial = + setup[static_cast(ExportList::GRID_SPATIAL)]; + this->s_rows = spatial[0]; + this->s_cols = spatial[1]; + + this->constant_cells = Rcpp::as>( + setup[static_cast(ExportList::GRID_CONSTANT)]); + + this->porosity = Rcpp::as>( + setup[static_cast(ExportList::GRID_POROSITY)]); + + this->transport_names = Rcpp::as>( + setup[static_cast(ExportList::DIFFU_TRANSPORT)]); + this->boundaries = + Rcpp::List(setup[static_cast(ExportList::DIFFU_BOUNDARIES)]); + this->alpha_x = Rcpp::as>( + setup[static_cast(ExportList::DIFFU_ALPHA_X)]); + this->alpha_y = Rcpp::as>( + setup[static_cast(ExportList::DIFFU_ALPHA_Y)]); + + this->database = + Rcpp::as(setup[static_cast(ExportList::CHEM_DATABASE)]); + this->pqc_scripts = Rcpp::as>( + setup[static_cast(ExportList::CHEM_PQC_SCRIPTS)]); + this->pqc_ids = Rcpp::as>( + setup[static_cast(ExportList::CHEM_PQC_IDS)]); + this->pqc_sol_order = Rcpp::as>( + setup[static_cast(ExportList::CHEM_PQC_SOL_ORDER)]); +} + +Rcpp::List InitialList::exportList() { + Rcpp::List out(static_cast(ExportList::ENUM_SIZE)); + + out[static_cast(ExportList::GRID_DIM)] = this->dim; + out[static_cast(ExportList::GRID_SPECS)] = + Rcpp::NumericVector::create(this->n_rows, this->n_cols); + out[static_cast(ExportList::GRID_SPATIAL)] = + Rcpp::NumericVector::create(this->s_rows, this->s_cols); + out[static_cast(ExportList::GRID_CONSTANT)] = + Rcpp::wrap(this->constant_cells); + out[static_cast(ExportList::GRID_POROSITY)] = Rcpp::wrap(this->porosity); + + out[static_cast(ExportList::DIFFU_TRANSPORT)] = + Rcpp::wrap(this->transport_names); + out[static_cast(ExportList::DIFFU_BOUNDARIES)] = this->boundaries; + out[static_cast(ExportList::DIFFU_ALPHA_X)] = this->alpha_x; + out[static_cast(ExportList::DIFFU_ALPHA_Y)] = this->alpha_y; + + out[static_cast(ExportList::CHEM_DATABASE)] = Rcpp::wrap(this->database); + out[static_cast(ExportList::CHEM_PQC_SCRIPTS)] = + Rcpp::wrap(this->pqc_scripts); + out[static_cast(ExportList::CHEM_PQC_IDS)] = Rcpp::wrap(this->pqc_ids); + out[static_cast(ExportList::CHEM_PQC_SOL_ORDER)] = + Rcpp::wrap(this->pqc_sol_order); + + return out; +} } // namespace poet \ No newline at end of file diff --git a/src/Init/InitialList.hpp b/src/Init/InitialList.hpp index fe1afcc59..060fc19a0 100644 --- a/src/Init/InitialList.hpp +++ b/src/Init/InitialList.hpp @@ -8,10 +8,11 @@ #include #include -#include -#include +#include #include +#include + namespace poet { using TugType = double; @@ -22,12 +23,29 @@ public: void initializeFromList(const Rcpp::List &setup); - void importList(const std::string &file_name); - Rcpp::List exportList(const std::string &file_name); + void importList(const Rcpp::List &setup); + Rcpp::List exportList(); private: RInside &R; + enum class ExportList { + GRID_DIM, + GRID_SPECS, + GRID_SPATIAL, + GRID_CONSTANT, + GRID_POROSITY, + DIFFU_TRANSPORT, + DIFFU_BOUNDARIES, + DIFFU_ALPHA_X, + DIFFU_ALPHA_Y, + CHEM_DATABASE, + CHEM_PQC_SCRIPTS, + CHEM_PQC_IDS, + CHEM_PQC_SOL_ORDER, + ENUM_SIZE + }; + // Grid members static constexpr const char *grid_key = "Grid"; @@ -65,18 +83,34 @@ private: double s_rows; std::vector constant_cells; + std::vector porosity; Rcpp::List initial_grid; // No export Rcpp::NumericMatrix phreeqc_mat; - // Initialized by grid - std::map pqc_raw_dumps; +public: + struct DiffusionInit { + std::uint32_t n_cols; + std::uint32_t n_rows; - // Chemistry members - IPhreeqcPOET::ModulesArray module_sizes; + double s_cols; + double s_rows; + std::vector constant_cells; + + std::vector transport_names; + + Field initial_grid; + Field boundaries; + Field alpha_x; + Field alpha_y; + }; + + DiffusionInit getDiffusionInit() const; + +private: // Diffusion members static constexpr const char *diffusion_key = "Diffusion"; @@ -112,5 +146,17 @@ private: std::vector pqc_ids; std::vector pqc_sol_order; + +public: + struct ChemistryInit { + Field initial_grid; + + std::string database; + std::vector pqc_scripts; + std::vector pqc_ids; + std::vector pqc_sol_order; + }; + + ChemistryInit getChemistryInit() const; }; } // namespace poet \ No newline at end of file diff --git a/src/initializer.cpp b/src/initializer.cpp index 8d1c0221e..1f95babed 100644 --- a/src/initializer.cpp +++ b/src/initializer.cpp @@ -30,6 +30,10 @@ int main(int argc, char **argv) { init.initializeFromList(setup); + Rcpp::Function save("saveRDS"); + + save(init.exportList(), "init.rds"); + // parseGrid(R, grid, results); return EXIT_SUCCESS; } \ No newline at end of file