BREAKING CHANGE: use dump mechanism of PhreeqcRM-GFZ to get and set

internal variables

feat: enables exchange

data: added exchange only benchmark

data: applied required changes to benchmarks
This commit is contained in:
Max Luebke 2023-04-17 12:31:39 +02:00
parent 315ac84423
commit 3fdf586e0d
17 changed files with 372 additions and 251 deletions

View File

@ -21,7 +21,6 @@
#include "poet/ChemistryModule.hpp"
#include <RInside.h>
#include <Rcpp.h>
#include <Rcpp/internal/wrap.h>
#include <cstdint>
#include <cstdlib>
#include <poet/DiffusionModule.hpp>
@ -100,7 +99,8 @@ inline double RunMasterLoop(SimParams &params, RInside &R, Grid &grid,
ChemistryParams &chem_params,
const GridParams &g_params, uint32_t nxyz_master) {
DiffusionModule diffusion(poet::DiffusionParams(R), grid);
DiffusionParams d_params{R};
DiffusionModule diffusion(d_params, grid);
/* Iteration Count is dynamic, retrieving value from R (is only needed by
* master for the following loop) */
uint32_t maxiter = R.parseEval("mysetup$iterations");
@ -112,7 +112,8 @@ inline double RunMasterLoop(SimParams &params, RInside &R, Grid &grid,
set_chem_parameters(chem, nxyz_master, chem_params.database_path);
chem.RunInitFile(chem_params.input_script);
chem.InitializeField(grid.GetTotalCellCount(), DFToHashMap(g_params.init_df));
poet::ChemistryModule::SingleCMap init_df = DFToHashMap(d_params.initial_t);
chem.mergeFieldWithModule(init_df, grid.GetTotalCellCount());
if (params.getNumParams().dht_enabled) {
chem.SetDHTEnabled(true, params.getNumParams().dht_size_per_process);

View File

@ -21,7 +21,6 @@
#include "poet/ChemistryModule.hpp"
#include <RInside.h>
#include <Rcpp.h>
#include <Rcpp/internal/wrap.h>
#include <cstdint>
#include <cstdlib>
#include <poet/DiffusionModule.hpp>
@ -99,7 +98,6 @@ inline double RunMasterLoop(SimParams &params, RInside &R, Grid &grid,
set_chem_parameters(chem, nxyz_master, chem_params.database_path);
chem.RunInitFile(chem_params.input_script);
chem.SetSelectedOutputOn(true);
chem.SetTimeStep(0);
chem.RunCells();

View File

@ -1,4 +1,4 @@
## Time-stamp: "Last modified 2023-04-13 17:10:30 mluebke"
## Time-stamp: "Last modified 2023-04-14 11:02:31 mluebke"
database <- normalizePath("../share/poet/bench/barite/db_barite.dat")
input_script <- normalizePath("../share/poet/bench/barite/barite.pqi")
@ -29,7 +29,7 @@ grid <- list(
n_cells = c(n, m),
s_cells = c(1, 1),
type = types[1],
init_cell = as.data.frame(init_cell),
init_cell = as.data.frame(init_cell, check.names = FALSE),
props = names(init_cell),
database = database,
input_script = input_script
@ -43,13 +43,13 @@ grid <- list(
## initial conditions
init_diffu <- c(
init_diffu <- list(
"H" = 110.0124,
"O" = 55.5087,
"Charge" = -1.217E-09,
"Ba" = 1.E-10,
"Cl" = 1.E-10,
"S" = 6.205E-4,
"S(6)" = 6.205E-4,
"Sr" = 6.205E-4
)
@ -60,7 +60,7 @@ injection_diff <- list(
"Charge" = -3.337E-08,
"Ba" = 0.1,
"Cl" = 0.2,
"S" = 0,
"S(6)" = 0,
"Sr" = 0)
)
@ -71,7 +71,7 @@ alpha_diffu <- c(
"Charge" = 1E-06,
"Ba" = 1E-06,
"Cl" = 1E-06,
"S" = 1E-06,
"S(6)" = 1E-06,
"Sr" = 1E-06
)
@ -91,9 +91,12 @@ boundary <- list(
diffu_list <- names(alpha_diffu)
vecinj <- do.call(rbind.data.frame, injection_diff)
names(vecinj) <- names(init_diffu)
diffusion <- list(
init = init_diffu,
vecinj = do.call(rbind.data.frame, injection_diff),
init = as.data.frame(init_diffu, check.names = FALSE),
vecinj = vecinj,
# vecinj_inner = vecinj_inner,
vecinj_index = boundary,
alpha = alpha_diffu

View File

@ -1,4 +1,4 @@
## Time-stamp: "Last modified 2023-01-10 13:51:40 delucia"
## Time-stamp: "Last modified 2023-04-17 12:25:25 mluebke"
database <- normalizePath("../share/poet/examples/phreeqc_kin.dat")
input_script <- normalizePath("../share/poet/bench/dolo_inner.pqi")
@ -17,7 +17,7 @@ init_cell <- list(
"H" = 110.683,
"O" = 55.3413,
"Charge" = -5.0822e-19,
"C" = 1.2279E-4,
"C(4)" = 1.2279E-4,
"Ca" = 1.2279E-4,
"Cl" = 0,
"Mg" = 0,
@ -30,7 +30,7 @@ grid <- list(
n_cells = c(n, m),
s_cells = c(1, 1),
type = types[1],
init_cell = as.data.frame(init_cell),
init_cell = as.data.frame(init_cell, check.names = FALSE),
props = names(init_cell),
database = database,
input_script = input_script
@ -43,11 +43,11 @@ grid <- list(
##################################################################
## initial conditions
init_diffu <- c(
init_diffu <- list(
"H" = 110.683,
"O" = 55.3413,
"Charge" = -5.0822e-19,
"C" = 1.2279E-4,
"C(4)" = 1.2279E-4,
"Ca" = 1.2279E-4,
"Cl" = 0,
"Mg" = 0
@ -58,7 +58,7 @@ alpha_diffu <- c(
"H" = 1E-6,
"O" = 1E-6,
"Charge" = 1E-6,
"C" = 1E-6,
"C(4)" = 1E-6,
"Ca" = 1E-6,
"Cl" = 1E-6,
"Mg" = 1E-6
@ -70,7 +70,7 @@ vecinj_diffu <- list(
"H" = 110.683,
"O" = 55.3413,
"Charge" = 1.90431e-16,
"C" = 0,
"C(4)" = 0,
"Ca" = 0,
"Cl" = 0.002,
"Mg" = 0.001
@ -79,7 +79,7 @@ vecinj_diffu <- list(
"H" = 110.683,
"O" = 55.3413,
"Charge" = 1.90431e-16,
"C" = 0,
"C(4)" = 0,
"Ca" = 0.0,
"Cl" = 0.004,
"Mg" = 0.002
@ -102,9 +102,12 @@ boundary <- list(
diffu_list <- names(alpha_diffu)
vecinj <- do.call(rbind.data.frame, vecinj_diffu)
names(vecinj) <- names(init_diffu)
diffusion <- list(
init = init_diffu,
vecinj = do.call(rbind.data.frame, vecinj_diffu),
init = as.data.frame(init_diffu, check.names = FALSE),
vecinj = vecinj,
vecinj_inner = vecinj_inner,
vecinj_index = boundary,
alpha = alpha_diffu

View File

@ -1,4 +1,4 @@
## Time-stamp: "Last modified 2023-01-10 13:51:40 delucia"
## Time-stamp: "Last modified 2023-04-17 12:27:27 mluebke"
database <- normalizePath("../share/poet/examples/phreeqc_kin.dat")
input_script <- normalizePath("../share/poet/bench/dolo_inner.pqi")
@ -30,7 +30,7 @@ grid <- list(
n_cells = c(n, m),
s_cells = c(2, 1),
type = types[1],
init_cell = as.data.frame(init_cell),
init_cell = as.data.frame(init_cell, check.names = FALSE),
props = names(init_cell),
database = database,
input_script = input_script
@ -43,7 +43,7 @@ grid <- list(
##################################################################
## initial conditions
init_diffu <- c(
init_diffu <- list(
"H" = 110.683,
"O" = 55.3413,
"Charge" = -5.0822e-19,
@ -102,9 +102,12 @@ boundary <- list(
diffu_list <- names(alpha_diffu)
vecinj <- do.call(rbind.data.frame, vecinj_diffu)
names(vecinj) <- names(init_diffu)
diffusion <- list(
init = init_diffu,
vecinj = do.call(rbind.data.frame, vecinj_diffu),
init = as.data.frame(init_diffu, check.names = FALSE),
vecinj = vecinj,
vecinj_inner = vecinj_inner,
vecinj_index = boundary,
alpha = alpha_diffu

View File

@ -1,6 +1,8 @@
install(FILES
surfex.R
SurfExBase.pqi
ExBase.pqi
ex.R
#surfex.R
#SurfExBase.pqi
SMILE_2021_11_01_TH.dat
DESTINATION
share/poet/bench/surfex

39
bench/surfex/ExBase.pqi Normal file
View File

@ -0,0 +1,39 @@
## Time-stamp: "Last modified 2023-03-21 11:49:43 mluebke"
KNOBS
-logfile false
-iterations 10000
-convergence_tolerance 1E-12
-step_size 2
-pe_step_size 2
SELECTED_OUTPUT
-reset false
-high_precision true
-solution true
-state true
-step true
-pH true
-pe true
-ionic_strength true
-water true
SOLUTION 1
temp 13
units mol/kgw
pH 7.06355
pe -2.626517
C(4) 0.001990694
Ca 0.02172649
Cl 0.3227673 charge
Fe 0.0001434717
K 0.001902357
Mg 0.01739704
Na 0.2762882
S(6) 0.01652701
Sr 0.0004520361
U(4) 8.147792e-12
U(6) 2.237946e-09
-water 0.00133
EXCHANGE 1
-equil 1
Z 0.0012585
Y 0.0009418
END

144
bench/surfex/ex.R Normal file
View File

@ -0,0 +1,144 @@
## Time-stamp: "Last modified 2023-04-17 12:29:27 mluebke"
database <- normalizePath("./SMILE_2021_11_01_TH.dat")
input_script <- normalizePath("./ExBase.pqi")
cat(paste(":: R This is a test 1\n"))
#################################################################
## Section 1 ##
## Grid initialization ##
#################################################################
n <- 100
m <- 100
types <- c("scratch", "phreeqc", "rds")
init_cell <- list(H = 1.476571028625e-01,
O = 7.392297218936e-02,
Charge = -1.765225732724e-18,
`C(-4)` = 2.477908970828e-21,
`C(4)` = 2.647623016916e-06,
Ca = 2.889623169138e-05,
Cl = 4.292806181039e-04,
`Fe(2)` =1.908142472666e-07,
`Fe(3)` =3.173306589931e-12,
`H(0)` =2.675642675119e-15,
K = 2.530134809667e-06,
Mg =2.313806319294e-05,
Na =3.674633059628e-04,
`S(-2)` = 8.589766637180e-15,
`S(2)` = 1.205284362720e-19,
`S(4)` = 9.108958772790e-18,
`S(6)` = 2.198092329098e-05,
Sr = 6.012080128154e-07,
`U(4)` = 1.039668623852e-14,
`U(5)` = 1.208394829796e-15,
`U(6)` = 2.976409147150e-12)
grid <- list(
n_cells = c(n, m),
s_cells = c(1, 1),
type = "scratch",
init_cell = as.data.frame(init_cell, check.names = FALSE),
props = names(init_cell),
database = database,
input_script = input_script
)
##################################################################
## Section 2 ##
## Diffusion parameters and boundary conditions ##
##################################################################
vecinj_diffu <- list(
list(H = 0.147659686316291,
O = 0.0739242798146046,
Charge = 7.46361643222701e-20,
`C(-4)` = 2.92438561098248e-21,
`C(4)` = 2.65160558871092e-06,
Ca = 2.89001071336443e-05,
Cl = 0.000429291158114428,
`Fe(2)` = 1.90823391198114e-07,
`Fe(3)` = 3.10832423034763e-12,
`H(0)` = 2.7888235127385e-15,
K = 2.5301787e-06,
Mg = 2.31391999937907e-05,
Na = 0.00036746969,
`S(-2)` = 1.01376078438546e-14,
`S(2)` = 1.42247026981542e-19,
`S(4)` = 9.49422092568557e-18,
`S(6)` = 2.19812504654191e-05,
Sr = 6.01218519999999e-07,
`U(4)` = 4.82255946569383e-12,
`U(5)` = 5.49050615347901e-13,
`U(6)` = 1.32462838991902e-09)
)
vecinj <- do.call(rbind.data.frame, vecinj_diffu)
names(vecinj) <- grid$props
## diffusion coefficients
alpha_diffu <- c(H = 1E-6, O = 1E-6, Charge = 1E-6, `C(-4)` = 1E-6,
`C(4)` = 1E-6, Ca = 1E-6, Cl = 1E-6, `Fe(2)` = 1E-6,
`Fe(3)` = 1E-6, `H(0)` = 1E-6, K = 1E-6, Mg = 1E-6,
Na = 1E-6, `S(-2)` = 1E-6, `S(2)` = 1E-6,
`S(4)` = 1E-6, `S(6)` = 1E-6, Sr = 1E-6,
`U(4)` = 1E-6, `U(5)` = 1E-6, `U(6)` = 1E-6)
## list of boundary conditions/inner nodes
## vecinj_inner <- list(
## list(1,1,1)
## )
boundary <- list(
"N" = rep(1, n),
"E" = rep(0, n),
"S" = rep(0, n),
"W" = rep(0, n)
)
diffu_list <- names(alpha_diffu)
vecinj <- do.call(rbind.data.frame, vecinj_diffu)
names(vecinj) <- names(init_cell)
diffusion <- list(
init = as.data.frame(init_cell, check.names = FALSE),
vecinj = vecinj,
# vecinj_inner = vecinj_inner,
vecinj_index = boundary,
alpha = alpha_diffu
)
#################################################################
## Section 3 ##
## Chemistry module (Phreeqc) ##
#################################################################
chemistry <- list(
database = database,
input_script = input_script
)
#################################################################
## Section 4 ##
## Putting all those things together ##
#################################################################
iterations <- 10
dt <- 200
setup <- list(
grid = grid,
diffusion = diffusion,
chemistry = chemistry,
iterations = iterations,
timesteps = rep(dt, iterations),
store_result = TRUE
)

@ -1 +1 @@
Subproject commit f862889b693507458d450c6319abe5e1dce030f7
Subproject commit ade4f56605b8d0e81b7ccad510f2db21f46b5ff9

View File

@ -5,8 +5,10 @@
#include "PhreeqcRM.h"
#include "poet/DHT_Wrapper.hpp"
#include <array>
#include <cstddef>
#include <cstdint>
#include <map>
#include <mpi.h>
#include <string>
#include <unordered_map>
@ -127,35 +129,14 @@ public:
};
/**
* Initializes field with a "DataFrame" containing a single value for each
* species.
* Merge initial values from existing module with the chemistry module and set
* according internal variables.
*
* Each species must have been previously found by
* ChemistryModule::RunInitFile.
*
* \exception std::domain_error Species name of map is not defined.
*
* \param n_cells Count of cells for each species.
* \param mapped_values Unordered map containing one double value for each
* specified species.
* \param input_map Map with name and initial values of another module like
* Diffusion.
* \param n_cells number of cells used to initialize the field with.
*/
void InitializeField(uint32_t n_cells, const SingleCMap &mapped_values);
/**
* Initializes field with a "DataFrame" containing a vector of values for each
* species.
*
* Each species must have been previously found by
* ChemistryModule::RunInitFile.
*
* There is no check if vector length matches count of grid cells defined.
*
* \exception std::domain_error Species name of map is not defined.
*
* \param mapped_values Unordered map containing a vector of multiple values.
* Size of the vectors shall be the count of grid cells defined previously.
*/
void InitializeField(const VectorCMap &mapped_values);
void mergeFieldWithModule(const SingleCMap &input_map, std::uint32_t n_cells);
/**
* **Only called by workers!** Start the worker listening loop.
@ -298,6 +279,7 @@ protected:
enum {
CHEM_INIT,
CHEM_WP_SIZE,
CHEM_INIT_SPECIES,
CHEM_DHT_ENABLE,
CHEM_DHT_SIGNIF_VEC,
CHEM_DHT_PROP_TYPE_VEC,
@ -365,9 +347,6 @@ protected:
std::vector<int32_t> &vecMapping,
double dSimTime, double dTimestep);
void GetWPFromInternals(std::vector<double> &vecWP, uint32_t wp_size);
void SetInternalsFromWP(const std::vector<double> &vecWP, uint32_t wp_size);
std::vector<uint32_t> CalculateWPSizesVector(uint32_t n_cells,
uint32_t wp_size) const;
@ -397,6 +376,7 @@ protected:
double idle_t = 0.;
double seq_t = 0.;
double send_recv_t = 0.;
#endif
double chem_t = 0.;
@ -405,8 +385,9 @@ protected:
uint32_t prop_count = 0;
std::vector<std::string> prop_names;
std::vector<double> field;
std::vector<uint32_t> speciesPerModule;
static constexpr uint32_t MODULE_COUNT = 5;
static constexpr uint32_t MODULE_COUNT = 4;
std::array<std::uint32_t, 4> speciesPerModule{};
};
} // namespace poet

View File

@ -21,7 +21,6 @@
#ifndef PARSER_H
#define PARSER_H
#include <bits/stdint-uintn.h>
#include <string>
#include <string_view>
#include <vector>
@ -85,7 +84,7 @@ using GridParams = struct s_GridParams {
};
using DiffusionParams = struct s_DiffusionParams {
std::vector<std::string> prop_names;
Rcpp::DataFrame initial_t;
Rcpp::NumericVector alpha;
Rcpp::List vecinj_inner;

View File

@ -2,11 +2,15 @@
#include "PhreeqcRM.h"
#include "poet/DHT_Wrapper.hpp"
#include <algorithm>
#include <bits/stdint-uintn.h>
#include <cassert>
#include <cstdint>
#include <map>
#include <mpi.h>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>
#ifndef POET_USE_PRM
@ -58,44 +62,12 @@ void poet::ChemistryModule::RunInitFile(const std::string &input_script_path) {
this->FindComponents();
std::vector<std::string> props;
this->speciesPerModule.reserve(this->MODULE_COUNT);
PhreeqcRM::initializePOET(this->speciesPerModule, this->prop_names);
this->prop_count = prop_names.size();
std::vector<std::string> curr_prop_names = this->GetComponents();
props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
this->speciesPerModule.push_back(curr_prop_names.size());
curr_prop_names = this->GetEquilibriumPhases();
props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
char equilibrium = (curr_prop_names.empty() ? -1 : 1);
this->speciesPerModule.push_back(curr_prop_names.size());
curr_prop_names = this->GetExchangeNames();
props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
char exchange = (curr_prop_names.empty() ? -1 : 1);
this->speciesPerModule.push_back(curr_prop_names.size());
curr_prop_names = this->GetSurfaceNames();
props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
char surface = (curr_prop_names.empty() ? -1 : 1);
this->speciesPerModule.push_back(curr_prop_names.size());
// curr_prop_names = this->GetGasComponents();
// props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
// char gas = (curr_prop_names.empty() ? -1 : 1);
// this->speciesPerModule.push_back(curr_prop_names.size());
// curr_prop_names = this->GetSolidSolutionNames();
// props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
// char ssolutions = (curr_prop_names.empty() ? -1 : 1);
// this->speciesPerModule.push_back(curr_prop_names.size());
curr_prop_names = this->GetKineticReactions();
props.insert(props.end(), curr_prop_names.begin(), curr_prop_names.end());
char kinetics = (curr_prop_names.empty() ? -1 : 1);
this->speciesPerModule.push_back(curr_prop_names.size());
this->prop_count = props.size();
char exchange = (speciesPerModule[1] == 0 ? -1 : 1);
char kinetics = (speciesPerModule[2] == 0 ? -1 : 1);
char equilibrium = (speciesPerModule[3] == 0 ? -1 : 1);
#ifdef POET_USE_PRM
std::vector<int> ic1;
@ -105,7 +77,7 @@ void poet::ChemistryModule::RunInitFile(const std::string &input_script_path) {
ic1[i] = 1; // Solution 1
ic1[nxyz + i] = equilibrium; // Equilibrium 1
ic1[2 * nxyz + i] = exchange; // Exchange none
ic1[3 * nxyz + i] = surface; // Surface none
ic1[3 * nxyz + i] = -1; // Surface none
ic1[4 * nxyz + i] = -1; // Gas phase none
ic1[5 * nxyz + i] = -1; // Solid solutions none
ic1[6 * nxyz + i] = kinetics; // Kinetics 1
@ -113,61 +85,105 @@ void poet::ChemistryModule::RunInitFile(const std::string &input_script_path) {
this->InitialPhreeqc2Module(ic1);
#else
if (!this->is_master || this->is_sequential) {
std::vector<int> ic1;
ic1.resize(this->nxyz * 7, -1);
// TODO: hardcoded reaction modules
for (int i = 0; i < nxyz; i++) {
ic1[i] = 1; // Solution 1
ic1[nxyz + i] = equilibrium; // Equilibrium 1
ic1[2 * nxyz + i] = exchange; // Exchange none
ic1[3 * nxyz + i] = surface; // Surface none
ic1[4 * nxyz + i] = -1; // Gas phase none
ic1[5 * nxyz + i] = -1; // Solid solutions none
ic1[6 * nxyz + i] = kinetics; // Kinetics 1
}
this->InitialPhreeqc2Module(ic1);
std::vector<int> ic1;
ic1.resize(this->nxyz * 7, -1);
// TODO: hardcoded reaction modules
for (int i = 0; i < nxyz; i++) {
ic1[i] = 1; // Solution 1
ic1[nxyz + i] = equilibrium; // Equilibrium 1
ic1[2 * nxyz + i] = exchange; // Exchange none
ic1[3 * nxyz + i] = -1; // Surface none
ic1[4 * nxyz + i] = -1; // Gas phase none
ic1[5 * nxyz + i] = -1; // Solid solutions none
ic1[6 * nxyz + i] = kinetics; // Kinetics 1
}
this->InitialPhreeqc2Module(ic1);
#endif
this->prop_names = props;
}
#ifndef POET_USE_PRM
void poet::ChemistryModule::InitializeField(
uint32_t n_cells, const poet::ChemistryModule::SingleCMap &mapped_values) {
if (this->is_master) {
this->field.reserve(this->prop_count * n_cells);
for (const std::string &prop_name : this->prop_names) {
const auto m_it = mapped_values.find(prop_name);
if (m_it == mapped_values.end()) {
throw std::domain_error(
"Prop names vector does not match any key in given map.");
}
void poet::ChemistryModule::mergeFieldWithModule(const SingleCMap &input_map,
std::uint32_t n_cells) {
const std::vector<double> field_row(n_cells, m_it->second);
const auto chem_field_end = this->field.end();
this->field.insert(chem_field_end, field_row.begin(), field_row.end());
}
this->n_cells = n_cells;
if (is_master) {
int f_type = CHEM_INIT_SPECIES;
PropagateFunctionType(f_type);
}
}
void poet::ChemistryModule::InitializeField(
const poet::ChemistryModule::VectorCMap &mapped_values) {
if (this->is_master) {
for (const std::string &prop_name : this->prop_names) {
const auto m_it = mapped_values.find(prop_name);
if (m_it == mapped_values.end()) {
throw std::domain_error(
"Prop names vector does not match any key in given map.");
std::vector<std::string> essentials_backup{
prop_names.begin() + speciesPerModule[0], prop_names.end()};
std::vector<std::string> new_solution_names{
this->prop_names.begin(), this->prop_names.begin() + speciesPerModule[0]};
if (is_master) {
for (const auto &init_val : input_map) {
std::string name = init_val.first;
if (std::find(new_solution_names.begin(), new_solution_names.end(),
name) == new_solution_names.end()) {
int size = name.size();
ChemBCast(&size, 1, MPI_INT);
ChemBCast(name.data(), name.size(), MPI_CHAR);
new_solution_names.push_back(name);
}
const auto field_row = m_it->second;
const auto chem_field_end = this->field.end();
this->field.insert(chem_field_end, field_row.begin(), field_row.end());
}
this->n_cells = mapped_values.begin()->second.size();
int end = 0;
ChemBCast(&end, 1, MPI_INT);
} else {
constexpr int MAXSIZE = 128;
MPI_Status status;
int recv_size;
char recv_buffer[MAXSIZE];
while (1) {
ChemBCast(&recv_size, 1, MPI_INT);
if (recv_size == 0) {
break;
}
ChemBCast(recv_buffer, recv_size, MPI_CHAR);
recv_buffer[recv_size] = '\0';
new_solution_names.push_back(std::string(recv_buffer));
}
}
// now sort the new values
std::sort(new_solution_names.begin() + 3, new_solution_names.end());
// and append other processes than solutions
std::vector<std::string> new_prop_names = new_solution_names;
new_prop_names.insert(new_prop_names.end(), essentials_backup.begin(),
essentials_backup.end());
std::vector<std::string> old_prop_names{this->prop_names};
this->prop_names = std::move(new_prop_names);
this->prop_count = prop_names.size();
this->SetPOETSolutionNames(new_solution_names);
if (is_master) {
this->n_cells = n_cells;
this->field.clear();
this->field.reserve(this->prop_count * n_cells);
std::vector<double> init_values;
this->getDumpedField(init_values);
const std::vector<std::string> ess_names = old_prop_names;
for (const auto &name : this->prop_names) {
auto it_find = std::find(ess_names.begin(), ess_names.end(), name);
double value;
if (it_find != ess_names.end()) {
int index = it_find - ess_names.begin();
value = init_values[index];
} else {
auto map_it = input_map.find(name);
value = map_it->second;
}
std::vector<double> curr_vec(n_cells, value);
this->field.insert(field.end(), curr_vec.begin(), curr_vec.end());
}
}
}
@ -274,89 +290,26 @@ void poet::ChemistryModule::ReadDHTFile(const std::string &input_file) {
}
}
void poet::ChemistryModule::GetWPFromInternals(std::vector<double> &vecWP,
uint32_t wp_size) {
std::vector<double> vecCurrOutput;
vecWP.clear();
vecWP.reserve(this->prop_count * wp_size);
this->GetConcentrations(vecCurrOutput);
vecWP.insert(vecWP.end(), vecCurrOutput.begin(), vecCurrOutput.end());
if (this->speciesPerModule[1] != 0) {
this->GetPPhaseMoles(vecCurrOutput);
vecWP.insert(vecWP.end(), vecCurrOutput.begin(), vecCurrOutput.end());
}
// NOTE: Block for 'Surface' and 'Exchange' is missing because of missing
// Getters @ PhreeqcRM
// ...
// BLOCK_END
if (this->speciesPerModule[4] != 0) {
this->GetKineticsMoles(vecCurrOutput);
vecWP.insert(vecWP.end(), vecCurrOutput.begin(), vecCurrOutput.end());
}
}
void poet::ChemistryModule::SetInternalsFromWP(const std::vector<double> &vecWP,
uint32_t wp_size) {
uint32_t iCurrElements;
auto itStart = vecWP.begin();
auto itEnd = itStart;
// this->SetMappingForWP(iCurrWPSize);
int nchem = this->GetChemistryCellCount();
iCurrElements = this->speciesPerModule[0];
itEnd += iCurrElements * wp_size;
this->SetConcentrations(std::vector<double>(itStart, itEnd));
itStart = itEnd;
// Equlibirum Phases
if ((iCurrElements = this->speciesPerModule[1]) != 0) {
itEnd += iCurrElements * wp_size;
this->SetPPhaseMoles(std::vector<double>(itStart, itEnd));
itStart = itEnd;
}
// // NOTE: Block for 'Surface' and 'Exchange' is missing because of missing
// // setters @ PhreeqcRM
// // ...
// // BLOCK_END
if ((iCurrElements = this->speciesPerModule[4]) != 0) {
itEnd += iCurrElements * wp_size;
this->SetKineticsMoles(std::vector<double>(itStart, itEnd));
itStart = itEnd;
}
}
#else //POET_USE_PRM
#else // POET_USE_PRM
inline void poet::ChemistryModule::PrmToPoetField(std::vector<double> &field) {
GetConcentrations(field);
int col = GetSelectedOutputColumnCount();
int rows = GetSelectedOutputRowCount();
field.reserve(field.size() + 3 * rows);
std::vector<double> so;
GetSelectedOutput(so);
for (int j = 0; j < col; j += 2) {
const auto start = so.begin() + (j * rows);
const auto end = start + rows;
field.insert(field.end(), start, end);
}
this->getDumpedField(field);
}
void poet::ChemistryModule::RunCells() {
PhreeqcRM::RunCells();
PrmToPoetField(this->field);
std::vector<double> tmp_field;
PrmToPoetField(tmp_field);
this->field = tmp_field;
for (uint32_t i = 0; i < field.size(); i++) {
uint32_t back_i = static_cast<uint32_t>(i / this->nxyz);
uint32_t mod_i = i % this->nxyz;
field[i] = tmp_field[back_i + (mod_i * this->prop_count)];
}
}
#endif

View File

@ -233,9 +233,12 @@ void poet::ChemistryModule::RunCells() {
}
void poet::ChemistryModule::MasterRunSequential() {
SetInternalsFromWP(this->field, this->nxyz);
std::vector<double> shuffled_field =
shuffleField(field, n_cells, prop_count, 1);
this->setDumpedField(shuffled_field);
PhreeqcRM::RunCells();
GetWPFromInternals(this->field, this->nxyz);
this->getDumpedField(shuffled_field);
unshuffleField(shuffled_field, n_cells, prop_count, 1, this->field);
}
void poet::ChemistryModule::MasterRunParallel() {

View File

@ -5,6 +5,7 @@
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <map>
#include <mpi.h>
#include <stdexcept>
#include <string>
@ -42,6 +43,12 @@ void poet::ChemistryModule::WorkerLoop() {
RunInitFile(get_string(0, this->group_comm));
break;
}
case CHEM_INIT_SPECIES: {
SingleCMap dummy_map;
std::uint32_t n_cells_dummy;
mergeFieldWithModule(dummy_map, n_cells_dummy);
break;
}
case CHEM_DHT_ENABLE: {
bool enable;
ChemBCast(&enable, 1, MPI_CXX_BOOL);
@ -339,32 +346,16 @@ poet::ChemistryModule::WorkerRunWorkPackage(std::vector<double> &vecWP,
return IRM_OK;
}
std::vector<double> vecCopy;
vecCopy = vecWP;
for (uint32_t i = 0; i < this->prop_count; i++) {
for (uint32_t j = 0; j < this->wp_size; j++) {
vecWP[(i * this->wp_size) + j] = vecCopy[(j * this->prop_count) + i];
}
}
IRM_RESULT result;
this->PhreeqcRM::CreateMapping(vecMapping);
this->SetInternalsFromWP(vecWP, this->wp_size);
this->setDumpedField(vecWP);
this->PhreeqcRM::SetTime(dSimTime);
this->PhreeqcRM::SetTimeStep(dTimestep);
result = this->PhreeqcRM::RunCells();
this->GetWPFromInternals(vecWP, this->wp_size);
vecCopy = vecWP;
for (uint32_t i = 0; i < this->prop_count; i++) {
for (uint32_t j = 0; j < this->wp_size; j++) {
vecWP[(j * this->prop_count) + i] = vecCopy[(i * this->wp_size) + j];
}
}
this->getDumpedField(vecWP);
return result;
}

View File

@ -74,7 +74,8 @@ void DiffusionModule::initialize(poet::DiffusionParams args) {
// const poet::DiffusionParams args(this->R);
// name of props
this->prop_names = args.prop_names;
//
this->prop_names = Rcpp::as<std::vector<std::string>>(args.initial_t.names());
this->prop_count = this->prop_names.size();
this->state =
@ -91,7 +92,9 @@ void DiffusionModule::initialize(poet::DiffusionParams args) {
// initial input
this->alpha.push_back(args.alpha[this->prop_names[i]]);
std::vector<double> prop_vec = grid.GetSpeciesByName(this->prop_names[i]);
double val = args.initial_t[prop_names[i]];
std::vector<double> prop_vec(n_cells_per_prop, val);
std::copy(prop_vec.begin(), prop_vec.end(),
field.begin() + (i * this->n_cells_per_prop));
if (this->dim == this->DIM_2D) {

View File

@ -21,7 +21,6 @@
#include "poet/SimParams.hpp"
#include <RInside.h>
#include <Rcpp.h>
#include <Rcpp/internal/wrap.h>
#include <algorithm>
#include <cassert>
#include <cstdint>

View File

@ -19,7 +19,6 @@
*/
#include "poet/DHT_Types.hpp"
#include <bits/stdint-uintn.h>
#include <poet/SimParams.hpp>
#include <RInside.h>
@ -51,8 +50,8 @@ poet::GridParams::s_GridParams(RInside &R) {
}
poet::DiffusionParams::s_DiffusionParams(RInside &R) {
this->prop_names = Rcpp::as<std::vector<std::string>>(
R.parseEval("names(mysetup$diffusion$init)"));
this->initial_t =
Rcpp::as<Rcpp::DataFrame>(R.parseEval("mysetup$diffusion$init"));
this->alpha =
Rcpp::as<Rcpp::NumericVector>(R.parseEval("mysetup$diffusion$alpha"));
if (Rcpp::as<bool>(