2

タイトルにあるように、私はFFTW(バージョン3.2.2)とFortran 90/95を使用して、実データ(実際には乱数のフィールド)の2DFFTを実行しています。私は前進のステップが機能していると思います(少なくとも私はいくつかの出力を得ています)。ただし、IFFTを実行してすべてをチェックし、元の入力を再構築できるかどうかを確認したいと思いました。残念ながら、complex to realルーチンを呼び出すと、何も起こらず、エラー出力も得られないため、少し混乱しています。コードスニペットは次のとおりです。

implicit none

include "fftw3.f"

! - im=501, jm=401, and lm=60

real*8    :: u(im,jm,lm),recov(im,jm,lm)
complex*8 :: cu(1+im/2,jm)
integer*8 :: planf,planb    
real*8    :: dv

! - Generate array of random numbers
dv=4.0
call random_number(u)
u=u*dv
recov=0.0

k=30

! - Forward step (FFT)

call dfftw_plan_dft_r2c_2d(planf,im,jm,u(:,:,k),cu,FFTW_ESTIMATE)
call dfftw_execute_dft_r2c(planf,u(:,:,k),cu)
call dfftw_destroy_plan(planf)

! - Backward step (IFFT)

call dfftw_plan_dft_c2r_2d(planb,im,jm,cu,recov(:,:,k),FFTW_ESTIMATE)
call dfftw_execute_dft_c2r(planb,cu,recov(:,:,k))
call dfftw_destroy_plan(planb)

上記の順方向ステップは機能しているようですが(r2c)、逆方向ステップは機能していないようです。u配列とrecov配列を区別してこれを確認しましたが、最終的にはゼロではなくなりました。さらに、recov配列の最大値と最小値は両方ともゼロでした。これは、何も変更されていないことを示しているようです。

私はFFTWのドキュメントを調べ、次のページhttp://www.fftw.org/fftw3_doc/Fortran-Examples.html#Fortran-Examplesに基づいて実装しました。問題がインデックス作成に関連しているのかどうか疑問に思っています。少なくとも、それが私が傾いている方向です。とにかく、誰かが助けを提供できれば、それは素晴らしいことです!

ありがとう!

4

1 に答える 1