Discussion:
[Numpy-discussion] f2py NotImplementedError
andy buzza
2016-07-24 19:54:49 UTC
Permalink
Hello all,

I have been trying to compile a relatively simple pair of Fortran files,
one referencing a subroutine from another file (mainmodule.f90 references
othermodule.f90). I have been able to compile them using a Fortran
compiler, but receive a NotImplementedError when using f2py.

Steps I use for f2py:

$gfortran -shared -o othermodule.so othermodule.f90 -fPIC

$f2py -c -l/path/othermodule -m mainmodule mainmodule.f90

I am running this on linux and wasn't sure how to correct the error.

othermodule.f90

module moderator

implicit none
integer*1 :: i
integer*8 :: fact,len
real*8,dimension(:),allocatable :: ex

contains

subroutine submarine(ii,ff,exex)

implicit none
integer*1 :: ii
integer*8 :: ff
real*8 :: exex

exex=exp(real(ii))/ff

end subroutine submarine

end module moderator


mainmodule.f90

program mains

use moderator

implicit none

len=10
allocate(ex(len))
fact=1
do i=1,len
fact=fact*i
call submarine(i,fact,ex(i))
if (i==1) then
print*,"here's your ",i,"st number: ",ex(i)
elseif (i==2) then
print*,"here's your ",i,"nd number: ",ex(i)
elseif (i==3) then
print*,"here's your ",i,"rd number: ",ex(i)
else
print*,"here's your ",i,"th number: ",ex(i)
endif
enddo
deallocate(ex)

end program


Thanks for the help,
Andy
Aronne Merrelli
2016-07-26 13:19:02 UTC
Permalink
Hello Andy,

I'm not an expert on f2py, but I've used it in a few cases. I can
recreate a NotImplementedError by copying your commands. The problem
is that you are using -l (lower case L), which I think is supposed to
specify the library name, not a path. The NotImplementedError is not
really what the code should produce in this case, but I don't know
what is going on there.

I think you normally want to use the typical flags, like "-lfoo
-L/path/to/foo" or similar. In any case for this simple example, you
don't really need to use those flags. I can get your code to compile
with this command (I have to specify fcompiler here, otherwise it uses
ifort on my system):

$ gfortran -fPIC -c othermodule.f90 -o othermodule.o
$ f2py --fcompiler=gfortran -m mainmodule -c mainmodule.f90 othermodule.o

This compiles, but then the shared object has no functions in it when
you import it in python. I think that's because your main file is a
program, and I do not think f2py wraps fortran programs, rather only
subroutines/functions. If you change the mainmodule file slightly,
replacing the 'program mains' with:

module mains
use moderator
contains
subroutine foo
...
end subroutine foo
end module mains

Compile it similarly, then it looks to work:

$ python -c "import mainmodule ; mainmodule.mains.foo()"
here's your 1 st number: 2.7182817459106445
here's your 2 nd number: 3.6945281028747559
here's your 3 rd number: 3.3475894927978516
here's your 4 th number: 2.2749228477478027
here's your 5 th number: 1.2367763519287109
here's your 6 th number: 0.56031775474548340
here's your 7 th number: 0.21758595108985901
here's your 8 th number: 7.3932491242885590E-002
here's your 9 th number: 2.2329926490783691E-002
here's your 10 th number: 6.0699032619595528E-003
Post by andy buzza
Hello all,
I have been trying to compile a relatively simple pair of Fortran files, one
referencing a subroutine from another file (mainmodule.f90 references
othermodule.f90). I have been able to compile them using a Fortran
compiler, but receive a NotImplementedError when using f2py.
$gfortran -shared -o othermodule.so othermodule.f90 -fPIC
$f2py -c -l/path/othermodule -m mainmodule mainmodule.f90
I am running this on linux and wasn't sure how to correct the error.
othermodule.f90
module moderator
implicit none
integer*1 :: i
integer*8 :: fact,len
real*8,dimension(:),allocatable :: ex
contains
subroutine submarine(ii,ff,exex)
implicit none
integer*1 :: ii
integer*8 :: ff
real*8 :: exex
exex=exp(real(ii))/ff
end subroutine submarine
end module moderator
mainmodule.f90
program mains
use moderator
implicit none
len=10
allocate(ex(len))
fact=1
do i=1,len
fact=fact*i
call submarine(i,fact,ex(i))
if (i==1) then
print*,"here's your ",i,"st number: ",ex(i)
elseif (i==2) then
print*,"here's your ",i,"nd number: ",ex(i)
elseif (i==3) then
print*,"here's your ",i,"rd number: ",ex(i)
else
print*,"here's your ",i,"th number: ",ex(i)
endif
enddo
deallocate(ex)
end program
Thanks for the help,
Andy
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
Loading...