[SciPy-Dev] f2py: questions on array arguments
Sturla Molden
sturla@molden...
Mon Jul 19 09:07:56 CDT 2010
Ramon Crehuet skrev:
> real function trace(m)
> !f2py integer,depend(m) :: n=shape(m,0)
> !f2py real, dimension(n,n), intent(in) :: m
> real, dimension(:,:), intent(in) :: m
>
> But it does not work. Is there a workaround to avoid passing the
> dimension of the matrix as a fortran argument?
If you know your compiler's "dope vector" (known for most compilers, or
just ask the vendor), we could implement an ndarray to Fortran 90 array
converter in C, and pass a pointer to a dope vector struct.
If you don't know this, you will need a Fortran wrapper/proxy function.
There are several ways that could work:
Either:
- Pass in all information about the array (shape and strides), then pass
on a Fortran pointer or a slice.
Or:
- A C utility function could expose the PyArrayObject fields to Fortran.
- The Fortran compiler might support C structures as an extension (e.g.
Absoft).
- Fortran 2003 ISO C bindings: C structures are supported.
After the ndarray's meta-information is obtained, from any of those
three, you can:
- Use non-standard Cray pointers to access the buffer.
- Use Fortran 2003 ISO C bindings to access the buffer: c_f_pointer
converts a C pointer to a Fortran pointer.
There is actually a Cython-related project called 'fwrap' that works
somewhat like this.
But if you have a Fortran contiguous array, or can create one, f2py will
mean much less work.
Sturla
More information about the SciPy-Dev
mailing list