[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