Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在f2py中链接FFTW3?_Python_Fortran_Wrapper_Fftw_F2py - Fatal编程技术网

Python 如何在f2py中链接FFTW3?

Python 如何在f2py中链接FFTW3?,python,fortran,wrapper,fftw,f2py,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 int

我正在尝试为我不久前编写的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未定义符号:dfftw\u execute\u dft_


我已经在谷歌上花了相当长的时间,但不知怎么的,到目前为止我没有发现任何有用的东西。有人知道如何解决这个问题吗

您是否可以尝试直接使用f2py的标志,而不是通过
--f90flags

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

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

这些选项在Fortran文件名之前给出,因为

非常简单,但非常有效。谢谢!顺便说一句,dfftw*过程是为
双精度
参数定义的。丑陋的
kind=8
不能保证与之兼容。谢谢,是的,在生产代码中,我将其作为
双精度
-尽管仍然使用“旧”格式。。