【问题标题】:F2PY cannot see module-scope variablesF2PY 看不到模块范围的变量
【发布时间】:2015-01-27 03:50:37
【问题描述】:

很抱歉对 Fortran 90 和 f2py 都是新手。

我正在使用 Windows 64 位、Python 3.4 64 位、gfortran。 Numpy 版本是 1.9.1,我 评论了“引发 NotImplementedError(”仅支持 MS 编译器 在 gnu.py 中使用 gfortran on win64")",按照此链接的说明: http://scientificcomputingco.blogspot.com.au/2013/02/f2py-on-64bit-windows-python27.html

我有一个fortran模块,写法如下,模块范围变量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

那么,如果我运行f2py -c testf2py.f90 -m testf2py

它会报错,说明dp没有被声明。

如果我将模块范围复制到函数范围,它会起作用。

! 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

不过,这看起来并不是最好的编码实践,因为 它很“湿”。

有什么想法吗?

【问题讨论】:

    标签: python numpy fortran fortran90 f2py


    【解决方案1】:

    这是一个变通方法,其中dp 被移动到types 模块,use types 语句被添加到函数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 [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
    

    更改类似于我在此答案中描述的第三个选项:f2py: Specifying real precision in fortran when interfacing with python?

    【讨论】:

    • 不错。我同意(并怀念我的 f2py fortran-python 日子...... :-/)。
    • @Warren 感谢您的回复!并对迟到的回复感到抱歉。我也从邮件列表中收到了电子邮件,但我认为这里的讨论可能会被更多人访问。我确实有一个问题,我不明白为什么会这样。我确实知道 f2py 不会占用 kind=kind(0.d0) 的位置,因为使用了 kind() 的函数调用。我的问题是:
    • 1) 如果我们先编译模块types,为什么dp会这样呢?是不是因为先编译所以不再是函数调用? 2) 如果use types, only : dp 语句在模块级别,为什么会失败?又为什么放在功能层面会起作用?
    • 所有好问题;我希望我有答案。也许@mgilson 可以恢复他的 f2py fortran-python 技能并提供一些智慧。 :-)
    • @ShawnWang -- 大多数情况下我猜测这是 f2py 解析器不是完整的语言解析器的结果。出于好奇,如果您将“整数、参数”声明移动到 原始帖子中的公共 dp 声明之上会发生什么?
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多