大家好,新年快乐!
我正在尝试在简单的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,错误的复制/粘贴代码......
答案 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
或者我可能会误解某些事情,但我想这值得一试:)