[Numpy-discussion] F2PY cannot see module-scope variables
Warren Weckesser
warren.weckesser at gmail.com
Mon Jan 26 23:56:19 EST 2015
On 1/26/15, Yuxiang Wang <yw5aj at virginia.edu> wrote:
> Dear all,
>
> Sorry about being new to both Fortran 90 and f2py.
>
> I have a module in fortran, written as follows, with a module-scope variable
> dp:
>
> ========================================
> ! testf2py.f90
> module testf2py
> implicit none
> private
> public dp, i1
> integer, parameter :: dp=kind(0.d0)
> contains
> real(dp) function i1(m)
> real(dp), intent(in) :: m(3, 3)
> i1 = m(1, 1) + m(2, 2) + m(3, 3)
> return
> end function i1
> end module testf2py
> ========================================
>
> Then, if I run f2py -c testf2py.f90 -m testf2py
>
> It would report an error, stating that dp was not declared.
>
> If I copy the module-scope to the function-scope, it would work.
>
> ========================================
> ! testf2py.f90
> module testf2py
> implicit none
> private
> public i1
> integer, parameter :: dp=kind(0.d0)
> contains
> real(dp) function i1(m)
> integer, parameter :: dp=kind(0.d0)
> real(dp), intent(in) :: m(3, 3)
> i1 = m(1, 1) + m(2, 2) + m(3, 3)
> return
> end function i1
> end module testf2py
> ========================================
>
> However, this does not look like the best coding practice though, as
> it is pretty "wet".
>
> Any ideas?
>
> Thanks,
>
> Shawn
>
Shawn,
I posted a suggestion as an answer to your question on stackoverflow:
http://stackoverflow.com/questions/28162922/f2py-cannot-see-module-scope-variables
For the mailing-list-only folks, here's what I wrote:
Here's a work-around, in which `dp` is moved to a `types` module, and
the `use types` statement is added to the function `i1`.
! testf2py.f90
module types
implicit none
integer, parameter :: dp=kind(0.d0)
end module types
module testf2py
implicit none
private
public i1
contains
real(dp) function i1(m)
use types
real(dp), intent(in) :: m(3, 3)
i1 = m(1, 1) + m(2, 2) + m(3, 3)
return
end function i1
end module testf2py
In action:
In [6]: import numpy as np
In [7]: m = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
In [8]: import testf2py
In [9]: testf2py.testf2py.i1(m)
Out[9]: 150.0
The change is similar to the third option that I described in this
answer: http://stackoverflow.com/questions/12523524/f2py-specifying-real-precision-in-fortran-when-interfacing-with-python/12524403#12524403
Warren
> --
> Yuxiang "Shawn" Wang
> Gerling Research Lab
> University of Virginia
> yw5aj at virginia.edu
> +1 (434) 284-0836
> https://sites.google.com/a/virginia.edu/yw5aj/
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
More information about the NumPy-Discussion
mailing list