[SciPy-user] doctest fortran I/O synchronization
Todd Miller
jmiller at stsci.edu
Fri Oct 10 11:09:09 EDT 2003
Hi Pearu,
Sorry about the example mismatch. Your explanation of what to do with
the array loops will eventually be a big help. Thanks!
Todd
On Fri, 2003-10-10 at 10:54, Pearu Peterson wrote:
>
> Hi Todd,
>
> On 10 Oct 2003, Todd Miller wrote:
>
> > I'm trying to make a doctest to verify that the different flow patterns
> > of f2py interfaces work with different varieties of numarrays (normal,
> > byte-swapped, misaligned, dis-contiguous, type-converted). I'm trying
> > to test this out under Linux with g77, and (it seems like) I'm having
> > trouble synchronizing the Fortran I/O with Python's C I/O.
> >
> > Given foo.f:
> >
> > subroutine in_c(a,m,n)
> > real*8 a(n,m)
> > Cf2py intent(in,c) a
> > Cf2py depend(a) :: n=shape(a,0), m=shape(a,1)
> > do j=1,m
> > do i=1,n
> > write (6,1) a(i,j)
> > 1 format( $, 1F3.0, ', ')
> > enddo
> > print *,''
> > enddo
> > end
> >
> > And given f2py_tests.py:
>
> > """
> > >>> foo.in_f(a)
> <snip>
>
> I could not run given tests as they were not complete and had typos.
> For instance, foo.f defines in_c but in test string you are using in_f.
> Also AFAIK, Python I/O will not catch I/O from Fortran.
This is good to know. FWIW, it seems Python I/O eventually catches
some of Fortran I/O, just not all of it.
>
> Any way, when I modify in_c to in_f then the following code
>
> a = numarray.arange(15., shape=(3,5))
> print a
> foo.in_f(a)
>
> outputs:
>
> [[ 0. 1. 2. 3. 4.]
> [ 5. 6. 7. 8. 9.]
> [ 10. 11. 12. 13. 14.]]
> 0., 1., 2.,
> 3., 4., 5.,
> 6., 7., 8.,
> 9., 10., 11.,
> 12., 13., 14.,
>
> You probaly would not expect this. This is related to different storage
> order in C and Fortran, of cource, and you have disabled f2py ability to
> take into account this by using intent(c).
>
> So, when you would not use intent(c), that is, in foo.f is a line
>
> Cf2py intent(in) a
>
> then the following output occurs:
>
> [[ 0. 1. 2. 3. 4.]
> [ 5. 6. 7. 8. 9.]
> [ 10. 11. 12. 13. 14.]]
> 0., 5., 10.,
> 1., 6., 11.,
> 2., 7., 12.,
> 3., 8., 13.,
> 4., 9., 14.,
>
> The arrays look transposed because in Fortran your row index varies
> faster, that is, a transposed array is displayed.
>
> To sum up, don't use intent(c) and change the order of loops in in_f
> function to get matching results.
>
> HTH,
> Pearu
>
> _______________________________________________
> SciPy-user mailing list
> SciPy-user at scipy.net
> http://www.scipy.net/mailman/listinfo/scipy-user
--
Todd Miller jmiller at stsci.edu
STSCI / ESS / SSB
More information about the SciPy-User
mailing list