Re: [f2py] "natural" Fortran calling conventions?
Kevin Mitchell <[email protected]>
| Newsgroups | gmane.comp.python.f2py.user |
|---|---|
| Message-ID | <[email protected]> |
While browsing the f2py manpage, I stubled upon the following interesting option: """ -DF2PY_REPORT_ON_ARRAY_COPY=<int> To send a message to stderr whenever F2PY interface makes a copy of an array. Integer <int> sets the threshold for array sizes when a message should be shown. """ Kevin On Mon, May 25, 2009 at 5:09 AM, Kevin Mitchell<[email protected]> wrote: >> I don't want my Fortran subroutine to have intent(c); if I did that, >> I'd have to write an intent(c) wrapper for every Fortran routine I >> want to call, which defeats the purpose. Or if I write Fortran code >> optimized for intent(c), it won't be idiomatic Fortran and hard to >> maintain. > > You don't have to write a whole wrapper to do this, you can use the > commenting method: > > subroutine f2py_trsps_f(n,m,l,h) > !f2py intent(c) h > implicit none > integer :: n,m,l > real*8 :: h(n,m,l) > print*,h(1:8,1,1) > return > end subroutine f2py_trsps_f > > If you f2py this with "f2py -c f2py_trsps_f.f90" (and as far as I know > the same thing should work with fortran 77), you'll note that > > <<< import time,f2py_trsps_f > <<< l,n,m=2**10,2**6,2**6 > <<< h=arange(l*n*m).reshape([l,n,m]) > <<< st=time.time();f2py_trsps_f.f2py_trsps_f(h);print 'c-order=',time.time()-st > 0.0000000000000000 1.0000000000000000 > 2.0000000000000000 3.0000000000000000 4.0000000000000000 > 5.0000000000000000 6.0000000000000000 > 7.0000000000000000 > c-order= 0.0583457946777 > <<< h=asfortranarray(h) > <<< st=time.time();f2py_trsps_f.f2py_trsps_f(h);print 'f-order=',time.time()-st > 0.0000000000000000 1.0000000000000000 > 2.0000000000000000 3.0000000000000000 4.0000000000000000 > 5.0000000000000000 6.0000000000000000 > 7.0000000000000000 > f-order= 0.225140094757 > > That is, things work as expected (and more efficiently) if you give it > a python-natual c-order array. I agree that getting this behaviour > from "inent(c)" is a little counter-intuitive, but I think its the > closest thing to what you're looking for. > > Once you get into the Fortran subroutine everything works normally. > You can forget that python or c was even involved once you get past > the f2py comment which the compiler doesn't see anyway. So no, I > wouldn't say this is idiomatic Fortran. > >> And I'd like that with an error message if it can't be done >> efficiently > As far as I know, this can't currently be done, but I would say it's a > good idea. > > Kevin >