diff --git a/logger/examples/reader_example.py b/logger/examples/reader_example.py index 038a8ea5039c841007a1f07ec72210f08162a83d..b15446a6cd3d5b159038b56910eede5f571a6d07 100644 --- a/logger/examples/reader_example.py +++ b/logger/examples/reader_example.py @@ -51,6 +51,8 @@ print("time: %g" % time) t = logger.getTimeLimits(basename) data = logger.loadSnapshotAtTime(basename, time) +print("The data contains the following elements:") +print(data.dtype.names) pos = data["positions"] diff --git a/logger/logger_python_wrapper.c b/logger/logger_python_wrapper.c index a422a163f67c7664c057ddd282328a15cd250f9b..ee8042df8e6dc9fb4914c51fbf729149e4e3a6cf 100644 --- a/logger/logger_python_wrapper.c +++ b/logger/logger_python_wrapper.c @@ -35,6 +35,7 @@ typedef struct { } PyLoggerParticle; static PyTypeObject PyLoggerParticle_Type; +const char *particle_name = "Particle"; PyArray_Descr *logger_particle_descr; @@ -89,12 +90,16 @@ static PyObject *loadSnapshotAtTime(__attribute__((unused)) PyObject *self, PyArrayObject *out = (PyArrayObject *)PyArray_SimpleNewFromDescr( 1, &n_tot, logger_particle_descr); + /* Reference is stolen, therefore need to take it into account */ + Py_INCREF(logger_particle_descr); + + void *data = PyArray_DATA(out); /* Allows to use threads */ Py_BEGIN_ALLOW_THREADS; /* Read the particle. */ - logger_reader_read_all_particles(&reader, time, logger_reader_const, - PyArray_DATA(out), n_tot); + logger_reader_read_all_particles(&reader, time, logger_reader_const, data, + n_tot); /* No need of threads anymore */ Py_END_ALLOW_THREADS; @@ -129,7 +134,7 @@ static PyObject *getTimeLimits(__attribute__((unused)) PyObject *self, struct logger_reader reader; logger_reader_init(&reader, basename, verbose); - if (verbose > 1) message("Reading particles."); + if (verbose > 1) message("Reading time limits."); /* Get the time limits */ double time_min = logger_reader_get_time_begin(&reader); @@ -253,6 +258,13 @@ static struct PyModuleDef libloggermodule = { PyDict_SetItem(fields, PyUnicode_FromString(name), tuple); \ }) +void pylogger_particle_define_typeobject(void) { + + PyLoggerParticle_Type.tp_name = particle_name; + PyLoggerParticle_Type.tp_print = NULL; + PyType_Ready(&PyLoggerParticle_Type); +} + void pylogger_particle_define_descr(void) { /* Generate list of field names */ PyObject *names = PyTuple_New(9); @@ -269,14 +281,14 @@ void pylogger_particle_define_descr(void) { /* Generate list of fields */ PyObject *fields = PyDict_New(); CREATE_FIELD_3D(fields, "positions", pos, NPY_DOUBLE); - CREATE_FIELD(fields, "velocities", vel, NPY_FLOAT32); - CREATE_FIELD(fields, "accelerations", acc, NPY_FLOAT32); + CREATE_FIELD_3D(fields, "velocities", vel, NPY_FLOAT32); + CREATE_FIELD_3D(fields, "accelerations", acc, NPY_FLOAT32); CREATE_FIELD(fields, "entropies", entropy, NPY_FLOAT32); - CREATE_FIELD(fields, "smoothing_lenghts", h, NPY_FLOAT32); + CREATE_FIELD(fields, "smoothing_lengths", h, NPY_FLOAT32); CREATE_FIELD(fields, "densities", density, NPY_FLOAT32); CREATE_FIELD(fields, "masses", mass, NPY_FLOAT32); - CREATE_FIELD(fields, "ids", id, NPY_ULONGLONG); - CREATE_FIELD(fields, "times", id, NPY_DOUBLE); + CREATE_FIELD(fields, "ids", id, NPY_LONGLONG); + CREATE_FIELD(fields, "times", time, NPY_DOUBLE); /* Generate descriptor */ logger_particle_descr = PyObject_New(PyArray_Descr, &PyArrayDescr_Type); @@ -284,14 +296,15 @@ void pylogger_particle_define_descr(void) { // V if for an arbitrary kind of array logger_particle_descr->kind = 'V'; // Not well documented (seems any value is fine) - logger_particle_descr->type = 'p'; + logger_particle_descr->type = 'v'; // Native byte ordering logger_particle_descr->byteorder = '='; // Flags logger_particle_descr->flags = NPY_USE_GETITEM | NPY_USE_SETITEM; // id of the data type (assigned automatically) logger_particle_descr->type_num = 0; - // Size of an element + // Size of an element (using more size than required in order to log + // everything) logger_particle_descr->elsize = sizeof(struct logger_particle); // alignment (doc magic) logger_particle_descr->alignment = offsetof( @@ -320,6 +333,8 @@ PyMODINIT_FUNC PyInit_liblogger(void) { clocks_set_cpufreq(0); import_array(); + /* Define the type object */ + pylogger_particle_define_typeobject(); /* Define the descr of the logger_particle */ pylogger_particle_define_descr();