Search code examples
pythonarraysnumpyfortranf2py

Passing arrays from Python to Fortran with F2PY results error=2 (shape related)


I have Fortran code which I'd like to feed from Python with f2py. But I am not able to pass Numpy arrays of a known shape via f2py. (I'm on Python 2.7.10 and using gfortran and mingw32 as compilers).

Here is my Fortran code:

Subroutine test(nx,ny,mask)
  Integer, intent(inout) :: mask(ny,nx) 
  !f2py intent(in,out) mask
End

Which is called like this in Python:

from test import test
import numpy as np

nx = 2
ny = 2

mask = np.ones((nx,ny),dtype=int)

maskreturn = test(nx,ny,mask)

Running the script results in:

  error: (shape(mask,1)==nx) failed for 1st keyword nx: test:nx=2

I have no clue how to make it running (I'd need the correct passing of grids for a bigger model). Is there some terrible Fortran Noob mistake in there?


Solution

  • The following seems to work for me

    Fortran block in untitled.f90:

    subroutine test(nx,ny,mask)
      integer, intent(in) :: nx, ny
      integer, dimension(nx,ny), intent(inout) :: mask
      !f2py intent(in,out) mask                                                                                                                                                                                         
      print*,nx,ny,mask
    end subroutine test
    

    Compile with:

    f2py -c --fcompiler=gnu95 untitled.f90
    

    In python do:

    from untitled import test
    import numpy as np
    nx = 2 ; ny = 2
    mask = np.ones((nx,ny),dtype=np.int32)
    temp = test(mask,ny,nx) #Note the reversed order
    

    I hope this helps, but I'm not experienced with f2py so can't explain more why this works.

    Update After looking for potential duplicates I came across this answer which explains how/why the above works.