Skip to content
Snippets Groups Projects
Commit 02704bc5 authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Merge branch 'logger_add_incref' into 'master'

Logger add incref

See merge request !974
parents 28ea87dd 6c149cd8
Branches
Tags
1 merge request!974Logger add incref
...@@ -51,6 +51,8 @@ print("time: %g" % time) ...@@ -51,6 +51,8 @@ print("time: %g" % time)
t = logger.getTimeLimits(basename) t = logger.getTimeLimits(basename)
data = logger.loadSnapshotAtTime(basename, time) data = logger.loadSnapshotAtTime(basename, time)
print("The data contains the following elements:")
print(data.dtype.names)
pos = data["positions"] pos = data["positions"]
......
...@@ -35,6 +35,7 @@ typedef struct { ...@@ -35,6 +35,7 @@ typedef struct {
} PyLoggerParticle; } PyLoggerParticle;
static PyTypeObject PyLoggerParticle_Type; static PyTypeObject PyLoggerParticle_Type;
const char *particle_name = "Particle";
PyArray_Descr *logger_particle_descr; PyArray_Descr *logger_particle_descr;
...@@ -89,12 +90,16 @@ static PyObject *loadSnapshotAtTime(__attribute__((unused)) PyObject *self, ...@@ -89,12 +90,16 @@ static PyObject *loadSnapshotAtTime(__attribute__((unused)) PyObject *self,
PyArrayObject *out = (PyArrayObject *)PyArray_SimpleNewFromDescr( PyArrayObject *out = (PyArrayObject *)PyArray_SimpleNewFromDescr(
1, &n_tot, logger_particle_descr); 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 */ /* Allows to use threads */
Py_BEGIN_ALLOW_THREADS; Py_BEGIN_ALLOW_THREADS;
/* Read the particle. */ /* Read the particle. */
logger_reader_read_all_particles(&reader, time, logger_reader_const, logger_reader_read_all_particles(&reader, time, logger_reader_const, data,
PyArray_DATA(out), n_tot); n_tot);
/* No need of threads anymore */ /* No need of threads anymore */
Py_END_ALLOW_THREADS; Py_END_ALLOW_THREADS;
...@@ -129,7 +134,7 @@ static PyObject *getTimeLimits(__attribute__((unused)) PyObject *self, ...@@ -129,7 +134,7 @@ static PyObject *getTimeLimits(__attribute__((unused)) PyObject *self,
struct logger_reader reader; struct logger_reader reader;
logger_reader_init(&reader, basename, verbose); logger_reader_init(&reader, basename, verbose);
if (verbose > 1) message("Reading particles."); if (verbose > 1) message("Reading time limits.");
/* Get the time limits */ /* Get the time limits */
double time_min = logger_reader_get_time_begin(&reader); double time_min = logger_reader_get_time_begin(&reader);
...@@ -253,6 +258,13 @@ static struct PyModuleDef libloggermodule = { ...@@ -253,6 +258,13 @@ static struct PyModuleDef libloggermodule = {
PyDict_SetItem(fields, PyUnicode_FromString(name), tuple); \ 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) { void pylogger_particle_define_descr(void) {
/* Generate list of field names */ /* Generate list of field names */
PyObject *names = PyTuple_New(9); PyObject *names = PyTuple_New(9);
...@@ -269,14 +281,14 @@ void pylogger_particle_define_descr(void) { ...@@ -269,14 +281,14 @@ void pylogger_particle_define_descr(void) {
/* Generate list of fields */ /* Generate list of fields */
PyObject *fields = PyDict_New(); PyObject *fields = PyDict_New();
CREATE_FIELD_3D(fields, "positions", pos, NPY_DOUBLE); CREATE_FIELD_3D(fields, "positions", pos, NPY_DOUBLE);
CREATE_FIELD(fields, "velocities", vel, NPY_FLOAT32); CREATE_FIELD_3D(fields, "velocities", vel, NPY_FLOAT32);
CREATE_FIELD(fields, "accelerations", acc, NPY_FLOAT32); CREATE_FIELD_3D(fields, "accelerations", acc, NPY_FLOAT32);
CREATE_FIELD(fields, "entropies", entropy, 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, "densities", density, NPY_FLOAT32);
CREATE_FIELD(fields, "masses", mass, NPY_FLOAT32); CREATE_FIELD(fields, "masses", mass, NPY_FLOAT32);
CREATE_FIELD(fields, "ids", id, NPY_ULONGLONG); CREATE_FIELD(fields, "ids", id, NPY_LONGLONG);
CREATE_FIELD(fields, "times", id, NPY_DOUBLE); CREATE_FIELD(fields, "times", time, NPY_DOUBLE);
/* Generate descriptor */ /* Generate descriptor */
logger_particle_descr = PyObject_New(PyArray_Descr, &PyArrayDescr_Type); logger_particle_descr = PyObject_New(PyArray_Descr, &PyArrayDescr_Type);
...@@ -284,14 +296,15 @@ void pylogger_particle_define_descr(void) { ...@@ -284,14 +296,15 @@ void pylogger_particle_define_descr(void) {
// V if for an arbitrary kind of array // V if for an arbitrary kind of array
logger_particle_descr->kind = 'V'; logger_particle_descr->kind = 'V';
// Not well documented (seems any value is fine) // Not well documented (seems any value is fine)
logger_particle_descr->type = 'p'; logger_particle_descr->type = 'v';
// Native byte ordering // Native byte ordering
logger_particle_descr->byteorder = '='; logger_particle_descr->byteorder = '=';
// Flags // Flags
logger_particle_descr->flags = NPY_USE_GETITEM | NPY_USE_SETITEM; logger_particle_descr->flags = NPY_USE_GETITEM | NPY_USE_SETITEM;
// id of the data type (assigned automatically) // id of the data type (assigned automatically)
logger_particle_descr->type_num = 0; 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); logger_particle_descr->elsize = sizeof(struct logger_particle);
// alignment (doc magic) // alignment (doc magic)
logger_particle_descr->alignment = offsetof( logger_particle_descr->alignment = offsetof(
...@@ -320,6 +333,8 @@ PyMODINIT_FUNC PyInit_liblogger(void) { ...@@ -320,6 +333,8 @@ PyMODINIT_FUNC PyInit_liblogger(void) {
clocks_set_cpufreq(0); clocks_set_cpufreq(0);
import_array(); import_array();
/* Define the type object */
pylogger_particle_define_typeobject();
/* Define the descr of the logger_particle */ /* Define the descr of the logger_particle */
pylogger_particle_define_descr(); pylogger_particle_define_descr();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment