FFTW fortran 90:当N> 20时,可分配切成两半

时间:2014-01-06 14:27:58

标签: fortran fortran90 fftw

大家好,新年快乐!

我正在尝试在简单的fortran 90代码中使用fftw库(是的,旧的fortran ......)。 这是一个非常简单的代码,用于计算向量的FFT = 1,2,...,N。我很惊讶,对于N <20,它可以工作。对于N> = 20,它不再起作用。我想我错过了一些重要但却无法弄清楚的东西......并且想知道你是否可以帮助我...... 我用这个命令编译我的代码

ifort test.f90 -o test -lfftw3f

代码如下

program test

implicit none
include "fftw3.f"
integer, parameter :: fp =4
integer*8 :: N
double complex, allocatable, dimension (:) :: in, out, aux
integer*8 :: plan
integer*8 :: i, errflag

N=10
allocate(in(N), stat=errflag)
allocate(out(N), stat=errflag)

do i=1,N
in(i) = i
end do

call sfftw_plan_dft_1d(plan, N, in, out, -1, 0)

do i=1,N
print *, in(i)
end do
print *, "================================================"
do i=1,N
print *, out(i)
end do
call sfftw_execute_dft(plan, in, out)
call sfftw_destroy_plan(plan)

deallocate(in, out)

end program test

Surpringly(对我来说),在行

之后修改了矢量“in”
call sfftw_plan_dft_1d(plan, N, in, out, -1, 0)

实际上,在N> 20的情况下,矢量被“切成两半”,意思是:

in(i) = 0 if i < N/2
in(i) = i otherwise

然而,例如N = 10,结果似乎很好(与scilab fft函数获得的结果相同)。

我有点失落,并不完全熟悉fortran。我错过了重要的事情吗?

提前非常感谢你!

编辑:whoups,错误的复制/粘贴代码......

1 个答案:

答案 0 :(得分:0)

看看你的旗帜意味着什么,我在这里找到了 http://www.fftw.org/fftw3_doc/Planner-Flags.html#Planner-Flags

  
    

重要提示:计划程序会在计划期间覆盖输入数组,除非已为此问题提供已保存的计划(请参阅Wisdom),因此您应在创建计划后初始化输入数据。唯一的例外是FFTW_ESTIMATE和FFTW_WISDOM_ONLY标志,如下所述。

  

也许试试

call sfftw_plan_dft_1d(plan, N, in, out, -1, 0)

do i=1,N
in(i) = i
end do

或者我可能会误解某些事情,但我想这值得一试:)