Finished early binding
This commit is contained in:
parent
ab1a181bb6
commit
6dc94056f1
4 changed files with 192 additions and 10 deletions
|
@ -42,7 +42,7 @@ if (WIN32 AND NOT CYGWIN)
|
|||
endif (WIN32 AND NOT CYGWIN)
|
||||
|
||||
INSTALL(TARGETS _cosmotool
|
||||
LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES}/flints
|
||||
LIBRARY DESTINATION ${PYTHON_SITE_PACKAGES}/cosmotool
|
||||
)
|
||||
|
||||
INSTALL(DIRECTORY cosmotool DESTINATION ${PYTHON_SITE_PACKAGES}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
from libcpp cimport bool
|
||||
import numpy as np
|
||||
cimport numpy as np
|
||||
from cpython cimport PyObject, Py_INCREF
|
||||
|
||||
np.import_array()
|
||||
|
||||
|
||||
cdef extern from "loadSimu.hpp" namespace "CosmoTool":
|
||||
|
@ -12,11 +15,11 @@ cdef extern from "loadSimu.hpp" namespace "CosmoTool":
|
|||
|
||||
np.float_t Omega_M
|
||||
np.float_t Omega_Lambda
|
||||
np.int64_t TotalNumParticles
|
||||
np.int64_t NumParticles
|
||||
np.int64_t TotalNumPart
|
||||
np.int64_t NumPart
|
||||
np.int64_t *Id
|
||||
np.float_t *Pos[3]
|
||||
np.float_t *Vel[3]
|
||||
float *Pos[3]
|
||||
float *Vel[3]
|
||||
int *type
|
||||
|
||||
cdef const int NEED_GADGET_ID
|
||||
|
@ -29,23 +32,94 @@ cdef extern from "loadGadget.hpp" namespace "CosmoTool":
|
|||
SimuData *loadGadgetMulti(const char *fname, int id, int flags) except +
|
||||
|
||||
|
||||
|
||||
cdef class Simulation:
|
||||
|
||||
cdef float BoxSize
|
||||
cdef float Hubble
|
||||
cdef list Position
|
||||
cdef list Velocities
|
||||
cdef list positions
|
||||
cdef list velocities
|
||||
|
||||
cdef SimuData *data
|
||||
|
||||
property BoxSize:
|
||||
def __get__(Simulation self):
|
||||
return self.data.BoxSize
|
||||
|
||||
property Hubble:
|
||||
def __get__(Simulation self):
|
||||
return self.data.Hubble
|
||||
|
||||
property Omega_M:
|
||||
def __get__(Simulation self):
|
||||
return self.data.Omega_M
|
||||
|
||||
property positions:
|
||||
def __get__(Simulation self):
|
||||
return self.positions
|
||||
|
||||
property velocities:
|
||||
def __get__(Simulation self):
|
||||
return self.velocities
|
||||
|
||||
property numParticles:
|
||||
def __get__(Simulation self):
|
||||
return self.data.NumPart
|
||||
|
||||
def __cinit__(Simulation self):
|
||||
self.data = <SimuData *>0
|
||||
|
||||
def __dealloc__(Simulation self):
|
||||
if self.data != <SimuData *>0:
|
||||
print("Clearing simulation data")
|
||||
del self.data
|
||||
|
||||
|
||||
cdef class ArrayWrapper:
|
||||
cdef void* data_ptr
|
||||
cdef int size
|
||||
|
||||
cdef set_data(self, int size, void* data_ptr):
|
||||
""" Set the data of the array
|
||||
|
||||
This cannot be done in the constructor as it must recieve C-level
|
||||
arguments.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
size: int
|
||||
Length of the array.
|
||||
data_ptr: void*
|
||||
Pointer to the data
|
||||
|
||||
"""
|
||||
self.data_ptr = data_ptr
|
||||
self.size = size
|
||||
|
||||
def __array__(self):
|
||||
""" Here we use the __array__ method, that is called when numpy
|
||||
tries to get an array from the object."""
|
||||
cdef np.npy_intp shape[1]
|
||||
|
||||
shape[0] = <np.npy_intp> self.size
|
||||
# Create a 1D array, of length 'size'
|
||||
ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_FLOAT, self.data_ptr)
|
||||
return ndarray
|
||||
|
||||
def __dealloc__(self):
|
||||
""" Frees the array. This is called by Python when all the
|
||||
references to the object are gone. """
|
||||
pass
|
||||
|
||||
cdef object wrap_float_array(float *p, np.uint64_t s):
|
||||
cdef np.ndarray ndarray
|
||||
cdef ArrayWrapper wrapper
|
||||
|
||||
wrapper = ArrayWrapper()
|
||||
wrapper.set_data(s, <void *>p)
|
||||
ndarray = np.array(wrapper, copy=False)
|
||||
ndarray.base = <PyObject*> wrapper
|
||||
Py_INCREF(wrapper)
|
||||
|
||||
return ndarray
|
||||
|
||||
def loadGadget(str filename, int snapshot_id, bool loadPosition = True, bool loadVelocity = True):
|
||||
|
||||
cdef int flags
|
||||
|
@ -62,4 +136,9 @@ def loadGadget(str filename, int snapshot_id, bool loadPosition = True, bool loa
|
|||
|
||||
simu = Simulation()
|
||||
simu.data = data
|
||||
if loadPosition:
|
||||
simu.positions = [wrap_float_array(data.Pos[i], data.NumPart) for i in xrange(3)]
|
||||
if loadVelocity:
|
||||
simu.velocities = [wrap_float_array(data.Vel[i], data.NumPart) for i in xrange(3)]
|
||||
|
||||
return simu
|
||||
|
|
1
python/cosmotool/__init__.py
Normal file
1
python/cosmotool/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from _cosmotool import *
|
Loading…
Add table
Add a link
Reference in a new issue