如何在 f2py 中使用 FFTW3 link?
How to link with FFTW3 in 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)时,我收到以下错误消息:
Import Error: modf.so undefined symbol: dfftw_execute_dft_
我已经在 Google 上花了很多时间,但到目前为止我还没有发现任何有用的东西。有谁知道如何解决这个问题?
你能尝试直接使用 f2py 的标志而不是通过 --f90flags
吗?
目前,您告诉 fortran 编译器如何构建模块,但 f2py 对链接步骤一无所知。您需要的是最终 Python 可调用模块知道 fftw 的存在。
f2py -c -L/usr/lib -lfftw3 -I/usr/include -m modf myFun.f90
,选项在 Fortran 文件名之前给出
我正在尝试为我前段时间编写的 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)时,我收到以下错误消息:
Import Error: modf.so undefined symbol: dfftw_execute_dft_
我已经在 Google 上花了很多时间,但到目前为止我还没有发现任何有用的东西。有谁知道如何解决这个问题?
你能尝试直接使用 f2py 的标志而不是通过 --f90flags
吗?
目前,您告诉 fortran 编译器如何构建模块,但 f2py 对链接步骤一无所知。您需要的是最终 Python 可调用模块知道 fftw 的存在。
f2py -c -L/usr/lib -lfftw3 -I/usr/include -m modf myFun.f90
,选项在 Fortran 文件名之前给出