Add Init/CMakeLists.txt and ChemistryInit.cpp files, and update initializer.cpp and InitialList.hpp

This commit is contained in:
Max Lübke 2024-03-20 23:46:57 +00:00
parent 4e86e7f86d
commit 94a4f71038
8 changed files with 243 additions and 84 deletions

View File

@ -1,64 +1,64 @@
add_subdirectory(DataStructures)
add_library(POETLib OBJECT)
add_library(poetinitlib
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)

View File

@ -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}
)

6
src/Init/CMakeLists.txt Normal file
View File

@ -0,0 +1,6 @@
target_sources(POETLib PRIVATE
InitialList.cpp
GridInit.cpp
DiffusionInit.cpp
ChemistryInit.cpp
)

View File

@ -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

View File

@ -4,6 +4,7 @@
#include <RInside.h>
#include <Rcpp/Function.h>
#include <Rcpp/vector/instantiation.h>
#include <cstdint>
#include <map>
#include <regex>
#include <sstream>
@ -11,6 +12,7 @@
#include <vector>
namespace poet {
static Rcpp::NumericMatrix pqcScriptToGrid(IPhreeqcPOET &phreeqc, RInside &R) {
IPhreeqcPOET::PhreeqcMat phreeqc_mat = phreeqc.getPhreeqcMat();
@ -55,13 +57,13 @@ replaceRawKeywordIDs(std::map<int, std::string> 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<int> row_ids =
Rcpp::as<std::vector<int>>(unique(initial_grid["ID"]));
Rcpp::as<std::vector<int>>(unique_R(initial_grid["ID"]));
// std::vector<std::uint32_t> 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<std::string> colnames =
Rcpp::as<std::vector<std::string>>(this->initial_grid.names());
this->transport_names = this->pqc_sol_order = std::vector<std::string>(
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<int, std::string> pqc_raw_dumps;
pqc_raw_dumps = replaceRawKeywordIDs(phreeqc.raw_dumps());
this->pqc_ids =
Rcpp::as<std::vector<int>>(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

View File

@ -1,8 +1,80 @@
#include "InitialList.hpp"
#include <Rcpp/internal/wrap.h>
#include <Rcpp/proxy/ProtectedProxy.h>
#include <Rcpp/vector/instantiation.h>
#include <cstdint>
#include <string>
#include <vector>
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<uint8_t>(setup[static_cast<int>(ExportList::GRID_DIM)]);
Rcpp::NumericVector grid_specs =
setup[static_cast<int>(ExportList::GRID_SPECS)];
this->n_rows = grid_specs[0];
this->n_cols = grid_specs[1];
Rcpp::NumericVector spatial =
setup[static_cast<int>(ExportList::GRID_SPATIAL)];
this->s_rows = spatial[0];
this->s_cols = spatial[1];
this->constant_cells = Rcpp::as<std::vector<uint32_t>>(
setup[static_cast<int>(ExportList::GRID_CONSTANT)]);
this->porosity = Rcpp::as<std::vector<double>>(
setup[static_cast<int>(ExportList::GRID_POROSITY)]);
this->transport_names = Rcpp::as<std::vector<std::string>>(
setup[static_cast<int>(ExportList::DIFFU_TRANSPORT)]);
this->boundaries =
Rcpp::List(setup[static_cast<int>(ExportList::DIFFU_BOUNDARIES)]);
this->alpha_x = Rcpp::as<std::vector<double>>(
setup[static_cast<int>(ExportList::DIFFU_ALPHA_X)]);
this->alpha_y = Rcpp::as<std::vector<double>>(
setup[static_cast<int>(ExportList::DIFFU_ALPHA_Y)]);
this->database =
Rcpp::as<std::string>(setup[static_cast<int>(ExportList::CHEM_DATABASE)]);
this->pqc_scripts = Rcpp::as<std::vector<std::string>>(
setup[static_cast<int>(ExportList::CHEM_PQC_SCRIPTS)]);
this->pqc_ids = Rcpp::as<std::vector<int>>(
setup[static_cast<int>(ExportList::CHEM_PQC_IDS)]);
this->pqc_sol_order = Rcpp::as<std::vector<std::string>>(
setup[static_cast<int>(ExportList::CHEM_PQC_SOL_ORDER)]);
}
Rcpp::List InitialList::exportList() {
Rcpp::List out(static_cast<int>(ExportList::ENUM_SIZE));
out[static_cast<int>(ExportList::GRID_DIM)] = this->dim;
out[static_cast<int>(ExportList::GRID_SPECS)] =
Rcpp::NumericVector::create(this->n_rows, this->n_cols);
out[static_cast<int>(ExportList::GRID_SPATIAL)] =
Rcpp::NumericVector::create(this->s_rows, this->s_cols);
out[static_cast<int>(ExportList::GRID_CONSTANT)] =
Rcpp::wrap(this->constant_cells);
out[static_cast<int>(ExportList::GRID_POROSITY)] = Rcpp::wrap(this->porosity);
out[static_cast<int>(ExportList::DIFFU_TRANSPORT)] =
Rcpp::wrap(this->transport_names);
out[static_cast<int>(ExportList::DIFFU_BOUNDARIES)] = this->boundaries;
out[static_cast<int>(ExportList::DIFFU_ALPHA_X)] = this->alpha_x;
out[static_cast<int>(ExportList::DIFFU_ALPHA_Y)] = this->alpha_y;
out[static_cast<int>(ExportList::CHEM_DATABASE)] = Rcpp::wrap(this->database);
out[static_cast<int>(ExportList::CHEM_PQC_SCRIPTS)] =
Rcpp::wrap(this->pqc_scripts);
out[static_cast<int>(ExportList::CHEM_PQC_IDS)] = Rcpp::wrap(this->pqc_ids);
out[static_cast<int>(ExportList::CHEM_PQC_SOL_ORDER)] =
Rcpp::wrap(this->pqc_sol_order);
return out;
}
} // namespace poet

View File

@ -8,10 +8,11 @@
#include <cstdint>
#include <IPhreeqcPOET.hpp>
#include <map>
#include <utility>
#include <string>
#include <vector>
#include <DataStructures/Field.hpp>
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<std::uint32_t> constant_cells;
std::vector<double> porosity;
Rcpp::List initial_grid;
// No export
Rcpp::NumericMatrix phreeqc_mat;
// Initialized by grid
std::map<int, std::string> 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<std::uint32_t> constant_cells;
std::vector<std::string> 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<int> pqc_ids;
std::vector<std::string> pqc_sol_order;
public:
struct ChemistryInit {
Field initial_grid;
std::string database;
std::vector<std::string> pqc_scripts;
std::vector<int> pqc_ids;
std::vector<std::string> pqc_sol_order;
};
ChemistryInit getChemistryInit() const;
};
} // namespace poet

View File

@ -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;
}