mirror of
https://git.gfz-potsdam.de/naaice/poet.git
synced 2025-12-15 12:28:22 +01:00
fix: do pre-copy of fields in grid class
The idea is to later define chains of module in the input script by setting an input and output field and the according function to call. Currently, the code is not ready for such a chain, but the change is done in advance.
This commit is contained in:
parent
f53a69f014
commit
16eb78ae31
@ -56,6 +56,7 @@ inline double RunMasterLoop(SimParams ¶ms, RInside &R, Grid &grid,
|
||||
|
||||
double dStartTime = MPI_Wtime();
|
||||
for (uint32_t iter = 1; iter < maxiter + 1; iter++) {
|
||||
uint32_t tick = 0;
|
||||
// cout << "CPP: Evaluating next time step" << endl;
|
||||
// R.parseEvalQ("mysetup <- master_iteration_setup(mysetup)");
|
||||
|
||||
@ -72,9 +73,12 @@ inline double RunMasterLoop(SimParams ¶ms, RInside &R, Grid &grid,
|
||||
// TODO: transport to diffusion
|
||||
diffusion.simulate(dt);
|
||||
|
||||
grid.PreModuleFieldCopy(tick++);
|
||||
|
||||
cout << "CPP: Chemistry" << endl;
|
||||
|
||||
C.Simulate(dt);
|
||||
grid.PreModuleFieldCopy(tick++);
|
||||
|
||||
R["req_dt"] = dt;
|
||||
R["simtime"] = (sim_time += dt);
|
||||
@ -182,6 +186,10 @@ int main(int argc, char *argv[]) {
|
||||
Grid grid;
|
||||
|
||||
grid.InitModuleFromParams(GridParams(R));
|
||||
grid.PushbackModuleFlow(poet::DIFFUSION_MODULE_NAME,
|
||||
poet::BaseChemModule::CHEMISTRY_MODULE_NAME);
|
||||
grid.PushbackModuleFlow(poet::BaseChemModule::CHEMISTRY_MODULE_NAME,
|
||||
poet::DIFFUSION_MODULE_NAME);
|
||||
|
||||
params.initVectorParams(R, grid.GetSpeciesCount());
|
||||
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@ -41,6 +42,11 @@ using StateMemory = struct s_StateMemory {
|
||||
std::vector<std::string> props;
|
||||
};
|
||||
|
||||
using FlowInputOutputInfo = struct inOut_info {
|
||||
std::string input_field;
|
||||
std::string output_field;
|
||||
};
|
||||
|
||||
constexpr const char *GRID_MODULE_NAME = "grid_init";
|
||||
|
||||
/**
|
||||
@ -66,6 +72,9 @@ public:
|
||||
void SetGridSize(double s_x, double s_y = 0., double s_z = 0.);
|
||||
void SetPropNames(const std::vector<std::string> &prop_names);
|
||||
|
||||
void PushbackModuleFlow(const std::string &input, const std::string &output);
|
||||
void PreModuleFieldCopy(uint32_t tick);
|
||||
|
||||
void InitGridFromScratch(const Rcpp::DataFrame &init_cell);
|
||||
void InitGridFromRDS();
|
||||
void InitGridFromPhreeqc();
|
||||
@ -89,6 +98,7 @@ public:
|
||||
-> std::vector<double>;
|
||||
|
||||
private:
|
||||
std::vector<FlowInputOutputInfo> flow_vec;
|
||||
|
||||
std::uint8_t dim = 0;
|
||||
std::array<double, MAX_DIM> grid_size;
|
||||
|
||||
@ -103,18 +103,6 @@ void ChemMaster::Simulate(double dt) {
|
||||
|
||||
std::vector<double> &field = this->state->mem;
|
||||
|
||||
for (uint32_t i = 0; i < this->prop_names.size(); i++) {
|
||||
try {
|
||||
std::vector<double> t_prop_vec = this->grid.GetSpeciesByName(
|
||||
this->prop_names[i], poet::DIFFUSION_MODULE_NAME);
|
||||
|
||||
std::copy(t_prop_vec.begin(), t_prop_vec.end(),
|
||||
field.begin() + (i * this->n_cells_per_prop));
|
||||
} catch (...) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// HACK: transfer the field into R data structure serving as input for phreeqc
|
||||
R["TMP_T"] = field;
|
||||
|
||||
|
||||
@ -72,18 +72,6 @@ void ChemSeq::Simulate(double dt) {
|
||||
|
||||
std::vector<double> &field = this->state->mem;
|
||||
|
||||
for (uint32_t i = 0; i < this->prop_names.size(); i++) {
|
||||
try {
|
||||
std::vector<double> t_prop_vec = this->grid.GetSpeciesByName(
|
||||
this->prop_names[i], poet::DIFFUSION_MODULE_NAME);
|
||||
|
||||
std::copy(t_prop_vec.begin(), t_prop_vec.end(),
|
||||
field.begin() + (i * this->n_cells_per_prop));
|
||||
} catch (...) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// HACK: transfer the field into R data structure serving as input for phreeqc
|
||||
R["TMP_T"] = field;
|
||||
|
||||
|
||||
@ -167,21 +167,6 @@ void DiffusionModule::simulate(double dt) {
|
||||
|
||||
std::vector<double> &curr_field = this->state->mem;
|
||||
|
||||
// copy output of another module (in this case there is only the chemistry
|
||||
// module) as input for diffusion
|
||||
for (uint32_t i = 0; i < this->prop_names.size(); i++) {
|
||||
try {
|
||||
std::vector<double> t_prop_vec = this->grid.GetSpeciesByName(
|
||||
this->prop_names[i], poet::BaseChemModule::CHEMISTRY_MODULE_NAME);
|
||||
|
||||
std::copy(t_prop_vec.begin(), t_prop_vec.end(),
|
||||
curr_field.begin() + (i * this->n_cells_per_prop));
|
||||
} catch (...) {
|
||||
// TODO: there might be something wrong ...
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
this->diff_input.setTimestep(dt);
|
||||
|
||||
double *field = curr_field.data();
|
||||
|
||||
30
src/Grid.cpp
30
src/Grid.cpp
@ -101,6 +101,36 @@ void poet::Grid::SetPropNames(const std::vector<std::string> &prop_names) {
|
||||
this->prop_names = prop_names;
|
||||
}
|
||||
|
||||
void poet::Grid::PushbackModuleFlow(const std::string &input,
|
||||
const std::string &output) {
|
||||
FlowInputOutputInfo element = {input, output};
|
||||
this->flow_vec.push_back(element);
|
||||
}
|
||||
|
||||
void poet::Grid::PreModuleFieldCopy(uint32_t tick) {
|
||||
FlowInputOutputInfo curr_element = this->flow_vec.at(tick);
|
||||
|
||||
const std::string input_module_name = curr_element.input_field;
|
||||
StateMemory *out_state = this->GetStatePointer(curr_element.output_field);
|
||||
|
||||
std::vector<std::string> &mod_props = out_state->props;
|
||||
std::vector<double> &mod_field = out_state->mem;
|
||||
|
||||
// copy output of another module as input for another module
|
||||
for (uint32_t i = 0; i < mod_props.size(); i++) {
|
||||
try {
|
||||
std::vector<double> t_prop_vec =
|
||||
this->GetSpeciesByName(mod_props[i], input_module_name);
|
||||
|
||||
std::copy(t_prop_vec.begin(), t_prop_vec.end(),
|
||||
mod_field.begin() + (i * this->GetTotalCellCount()));
|
||||
} catch (...) {
|
||||
// TODO: there might be something wrong ...
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Grid::Grid() {
|
||||
this->n_cells.fill(0);
|
||||
this->grid_size.fill(0);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user