如何在f2py中与FFTW3建立链接?

时间:2017-03-20 11:02:58

标签: python fortran wrapper fftw f2py

我正在尝试为我之前写的Python实现获得一些加速,并决定使用f2py。我目前仍在测试一些东西,并认为我需要一些帮助才能使FFTW3工作。对于第一个测试,我编写了以下子例程:

subroutine initFFT(planF, a, res, n)
    implicit none
    include "fftw3.f"
    integer, INTENT(IN) :: n
    complex(KIND=8), dimension(n) :: a, res
    integer(KIND=8), intent(OUT) :: planF

    call dfftw_plan_dft(planF, 1, n, a, res, FFTW_FORWARD, FFTW_MEASURE)
end subroutine initFFT

subroutine operation(a, res, n, planF)
    implicit none
    INCLUDE 'fftw3.f'
    integer :: n
    integer(KIND=8) :: planF
    complex(KIND=8), dimension(n), intent(IN) :: a
    complex(KIND=8), dimension(n), intent(OUT) :: res

    call dfftw_execute_dft(planF, a, res)
end subroutine operation

我用一个简单的主程序测试了这个

program test
    implicit none
    integer, parameter :: n = 3
    integer(KIND=8) :: planF
    complex(KIND=8), dimension(n) :: res, a

    call initFFT(planF, a, res, n)

    a = (/ 1., 1., 1./)
    call operation(a, res, n, planF)
end program test

并使用

编译
gfortran -o ftest myFun.f90 -L/usr/lib -lfftw3 -I/usr/include

一切正常并返回正确的结果。现在我尝试以下列方式使用f2py:

f2py -c myFun.f90 -m modf --f90flags="-L/usr/lib -lfftw3 -I/usr/include"

问题是,当我尝试在Python中导入创建的模块时(使用import modf),我收到以下错误消息:

  

导入错误:modf.so undefined symbol:dfftw_execute_dft _

我已经花了很长时间在Google上,但到目前为止我找不到任何有用的东西。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

你能尝试直接使用f2py的标志而不是--f90flags吗?

目前,您告诉fortran编译器如何构建模块,但f2py然后不知道链接步骤。你需要的是最终的Python可调用模块知道fftw的存在。

f2py -c -L/usr/lib -lfftw3 -I/usr/include -m modf myFun.f90

根据https://docs.scipy.org/doc/numpy/f2py/usage.html ,在 Fortran文件名之前选项