2017-03-20 7 views
1

私は少し前に書いたPython実装のスピードアップをしようとしており、そのためにf2pyを使うことに決めました。私は現在、まだいくつかのものをテストしており、FFTW3を動作させるためにいくつかの助けが必要だと思っています。最初のテストのために、私は次のサブルーチンを書いた: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" 

問題は、私は(輸入MODFと)Pythonで作成したモジュールをインポートしようとすると、私は、次のようなエラー・メッセージが表示されますことを、次のとおりです。

Import Error: modf.so undefined symbol: dfftw_execute_dft_

私はGoogleとかなりの時間を過ごしましたが、何とか今まで何も役に立たなかったようです。誰かがこれを解決するためのアイデアを持っていますか?

+0

ごとところでdfftw *手順が二重precision'引数 'のために定義されているようなオプションは、前にFortranのファイル名を与えられています。醜い 'kind = 8'はそれとの互換性が保証されていません。 –

+0

ありがとう、ええ、私は '倍精度'としてそれを持っています - まだ "古い"形式にも使用されています。 – rammelmueller

答えて

3

--f90flagsの代わりにf2pyのフラグを直接使用してみることはできますか?

現在のところ、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

+0

シンプルでしかも効果的です。どうもありがとう! – rammelmueller

関連する問題