fix: write fields using R after chem simulation

This commit is contained in:
Max Luebke 2023-02-14 16:37:56 +01:00 committed by Max Lübke
parent e6819b59bc
commit 32d35190cb
4 changed files with 24 additions and 1 deletions

View File

@ -164,6 +164,7 @@ inline double RunMasterLoop(SimParams &params, RInside &R, Grid &grid,
chem.RunCells();
chem_state->mem = chem.GetField();
grid.WriteFieldsToR(R);
grid.PreModuleFieldCopy(tick++);
R["req_dt"] = dt;

View File

@ -39,7 +39,7 @@ namespace poet {
*
*/
constexpr const char *DIFFUSION_MODULE_NAME = "state_t";
constexpr const char *DIFFUSION_MODULE_NAME = "state_T";
class DiffusionModule {
public:

View File

@ -22,6 +22,7 @@
#define GRID_H
#include "poet/SimParams.hpp"
#include <RInside.h>
#include <Rcpp.h>
#include <array>
#include <cstddef>
@ -97,6 +98,8 @@ public:
std::string module_name = poet::GRID_MODULE_NAME) const
-> std::vector<double>;
void WriteFieldsToR(RInside &R);
private:
std::vector<FlowInputOutputInfo> flow_vec;

View File

@ -19,7 +19,9 @@
*/
#include "poet/SimParams.hpp"
#include <RInside.h>
#include <Rcpp.h>
#include <Rcpp/internal/wrap.h>
#include <algorithm>
#include <cassert>
#include <cstdint>
@ -253,3 +255,20 @@ auto poet::Grid::GetSpeciesByName(std::string name,
return std::vector<double>(module_memory->mem.begin() + begin_vec,
module_memory->mem.begin() + end_vec);
}
// HACK: Helper function
void poet::Grid::WriteFieldsToR(RInside &R) {
for (auto const &elem : this->state_register) {
std::string field_name = elem.first;
StateMemory *field = elem.second;
const uint32_t n_cells_per_prop = field->mem.size() / field->props.size();
R["TMP"] = Rcpp::wrap(field->mem);
R["TMP_PROPS"] = Rcpp::wrap(field->props);
R.parseEval(std::string(
"mysetup$" + field_name + " <- setNames(data.frame(matrix(TMP, nrow=" +
std::to_string(n_cells_per_prop) + ")), TMP_PROPS)"));
}
}