Jon Olav Vik wrote:
> Yes, ydot is allocated by CVODE (though not initialized to zero, as I learned 
> the hard way). I do need to allocate y, however.
> 
> As a start, I would like Cython to compile the following line of code:
> 
> y0 = N_VNew_Serial(N)
> 
> However, I'm unsure how much of the C declarations I need to duplicate (with 
> ctypedef?). N_VNew_Serial returns an N_Vector:
> include/nvector/nvector_serial.h:N_Vector N_VNew_Serial(long int vec_length);
> 
> The generic definition of an N_Vector is here:
> 
> == BEGIN include/sundials/sundials_nvector.h (excerpt) ==
> #include <sundials/sundials_types.h>
> 
> /*
>  * -----------------------------------------------------------------
>  * Generic definition of N_Vector
>  * -----------------------------------------------------------------
>  */
> 
> /* Forward reference for pointer to N_Vector_Ops object */
> typedef struct _generic_N_Vector_Ops *N_Vector_Ops;
> 
> /* Forward reference for pointer to N_Vector object */
> typedef struct _generic_N_Vector *N_Vector;
> 
> /* Define array of N_Vectors */
> typedef N_Vector *N_Vector_S;
> 
> /* Structure containing function pointers to vector operations  */  
> struct _generic_N_Vector_Ops {
>   N_Vector    (*nvclone)(N_Vector);
>   N_Vector    (*nvcloneempty)(N_Vector);
>   void        (*nvdestroy)(N_Vector);
...
> 
> struct _generic_N_Vector {
>   void *content;
>   struct _generic_N_Vector_Ops *ops;
> };

> The abovementioned realtype (and booleantype) is defined in
> include/sundials/sundials_types.h
> from which I roughly quote some conditional defines:
> #if defined(SUNDIALS_SINGLE_PRECISION)
> typedef float realtype;
> #elif defined(SUNDIALS_DOUBLE_PRECISION)
> typedef double realtype;
> #elif defined(SUNDIALS_EXTENDED_PRECISION)
> typedef long double realtype;
> 
> As for the structs, I've tried and failed along these lines:
> cdef extern from "sundials/sundials_nvector.h":
>     ctypedef struct _generic_N_Vector
>     ctypedef struct _generic_N_Vector *N_Vector
>                                      ^
> ------------------------------------------------------------
> /xanadu/home/jonvi/svn/trunk/cysundials/hello.pyx:8:38: Syntax error in 
> struct 
> or union definition
> 
> Do I really have to replicate the entire struct definition?

(Trivia: This is a lot like NumPy's source code.)

No, you just have to write "enough" for Cython to know what C code to 
output. Knowing what that is probably takes some C experience though; 
I'll try to help.

First, the #if-s cannot be expressed in Cython, but Cython is going in 
the direction of the type of external typedefs not to matter. I think 
you can safely do

cdef extern from ...:
     ctypedef double realtype

It should work also when Sundials is compiled with float or long double.

Then N_Vector etc. can probably be expressed like this:

cdef extern from ....:
     cdef struct _generic_N_Vector:
         void* content
         # not necesarry to declare ops unless you will be using
         # the contents of ops from Cython

     ctypedef _generic_N_Vector* N_vector

     N_Vector N_VNew_Serial(long int vec_length)

Then you will be able to do

cdef NVector v = N_VNew_Serial(10)
cdef realtype* v_data = <realtype*>v.content
v_data[0] = 34

-- 
Dag Sverre
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to