From 1eff4d3e7a7280b1caf0dc9dc16ede6b9e184ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ga=C5=82ecki?= Date: Mon, 6 Nov 2023 14:53:00 +1000 Subject: [PATCH] fixed Python support --- src/Handlers/cbPythonCall.cpp | 16 +++--- src/Lattice.cpp.Rt | 102 ++++++++++++++++++++++++++++++++++ src/Lattice.h.Rt | 4 ++ 3 files changed, 115 insertions(+), 7 deletions(-) diff --git a/src/Handlers/cbPythonCall.cpp b/src/Handlers/cbPythonCall.cpp index 9ca46392c..d042c83a0 100644 --- a/src/Handlers/cbPythonCall.cpp +++ b/src/Handlers/cbPythonCall.cpp @@ -84,7 +84,9 @@ int cbPythonCall::DoIt () { pModule = PyImport_ImportModule(module.value()); //Py_DECREF(pName); - + + const auto lattice = solver->getCartLattice(); + if (pModule != NULL) { int buff_id = 0; pFunc = PyObject_GetAttrString( pModule, function.value() ); @@ -104,7 +106,7 @@ int cbPythonCall::DoIt () { real_t * buffer; long int dims[3]; - long int size = solver->getComponentIntoBuffer(component, buffer, dims, offsets ); + long int size = lattice->getComponentIntoBuffer(component, buffer, dims, offsets ); if (sizeof(real_t) == sizeof(float) ) { pInputData = PyArray_SimpleNewFromData(3, dims, NPY_FLOAT, buffer); @@ -128,7 +130,7 @@ int cbPythonCall::DoIt () { real_t * buffer; long int dims[4]; - long int size = solver->getQuantityIntoBuffer(quantity, buffer, dims, offsets ); + long int size = lattice->getQuantityIntoBuffer(quantity, buffer, dims, offsets ); if (sizeof(real_t) == sizeof(float) ) { pInputData = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT, buffer); @@ -153,9 +155,9 @@ int cbPythonCall::DoIt () { } pGlobalSize = PyTuple_New(3); - PyTuple_SetItem(pGlobalSize, 0, PyLong_FromLong(solver->info.region.nx)); - PyTuple_SetItem(pGlobalSize, 1, PyLong_FromLong(solver->info.region.ny)); - PyTuple_SetItem(pGlobalSize, 2, PyLong_FromLong(solver->info.region.nz)); + PyTuple_SetItem(pGlobalSize, 0, PyLong_FromLong(lattice->connectivity.global_region.nx)); + PyTuple_SetItem(pGlobalSize, 1, PyLong_FromLong(lattice->connectivity.global_region.ny)); + PyTuple_SetItem(pGlobalSize, 2, PyLong_FromLong(lattice->connectivity.global_region.nz)); //first one defines number of extra arguments used PyTuple_SetItem(pArgs, 0, PyLong_FromLong( extra_args )); @@ -199,7 +201,7 @@ int cbPythonCall::DoIt () { for (int k =0; k < 10; k++){ debug1("PythonCall after,comp %s, buffer %d, value %d: %f\n",component,buff_id,k, buffers[buff_id][k]); } - int status = solver->loadComponentFromBuffer(component, buffers[buff_id]); + int status = lattice->loadComponentFromBuffer(component, buffers[buff_id]); buff_id++; } for (; buff_id <= all_buff; buff_id++){ diff --git a/src/Lattice.cpp.Rt b/src/Lattice.cpp.Rt index d0ef07a9c..4e46338b6 100644 --- a/src/Lattice.cpp.Rt +++ b/src/Lattice.cpp.Rt @@ -1308,6 +1308,108 @@ int Lattice::loadComp(const char* filename, const char* comp) const { return 0; } + +int Lattice::getComponentIntoBuffer(const char* comp, real_t* &buf, long int* dim, long int* offsets ) { + const auto& region = getLocalRegion(); + int n = region.size(); + + dim[0] = region.nx; + dim[1] = region.ny; + dim[2] = region.nz; + + offsets[0] = region.dx; + offsets[1] = region.dy; + offsets[2] = region.dz; + + buf = new real_t[n]; + + output("Providing component %s to buffer..\n", comp); + bool somethingWritten = false; + + if (std::string_view(comp) == "") { + Get_(buf); + somethingWritten = true; + } + + if (!somethingWritten){ + output("Possible densities:\n"); + output("-> \n") ; + } + assert(somethingWritten); + if (somethingWritten) { + output("...provided %s\n", comp); + } else { + output("...not saved %s\n", comp); + } + return n; +} + +int Lattice::getQuantityIntoBuffer(const char* comp, real_t* &buf, long int* dim, long int* offsets ) { + const auto& region = getLocalRegion(); + int n = region.size(); + + dim[0] = region.nx; + dim[1] = region.ny; + dim[2] = region.nz; + dim[3] = 1; + + offsets[0] = region.dx; + offsets[1] = region.dy; + offsets[2] = region.dz; + + output("Providing quantity %s to buffer..\n", comp); + bool somethingWritten = false; + + if (std::string_view(comp) == "") { + * tmp_ = new [n]; + + dim[3] = 3; + + Get(region, tmp_, 1); + buf = (real_t*)tmp_; + somethingWritten = true; + } + + if (!somethingWritten){ + output("Possible quantities:\n"); + output("-> \n"); + } + assert(somethingWritten); + if (somethingWritten) { + output("...provided %s\n", comp); + } else { + output("...not saved %s\n", comp); + } + return n; +} + + +int Lattice::loadComponentFromBuffer(const char* comp, real_t* buf) { + int n = getLocalRegion().size(); + + if (std::string_view(comp) == "") Set_(buf); + delete [] buf; + return 0; +} + void Lattice::resetAverage() { data.reset_iter = data.iter; diff --git a/src/Lattice.h.Rt b/src/Lattice.h.Rt index eb3cd889c..892ffa0d9 100644 --- a/src/Lattice.h.Rt +++ b/src/Lattice.h.Rt @@ -165,6 +165,10 @@ void GetQuantity(int quant, const lbRegion& over, real_t * tab, real_t scale); int getPar(const ParStruct& par_struct, double * wb); int setPar(const ParStruct& par_struct, double * w); + int getComponentIntoBuffer(const char*, real_t *&, long int* , long int* ); + int loadComponentFromBuffer(const char*, real_t*); + int getQuantityIntoBuffer(const char*, real_t*&, long int*, long int*); + void updateAllSamples(); void resetAverage(); };