【问题标题】:FFTW fortran 90: allocatable cut in half when N>20FFTW fortran 90:N>20 时可分配的减半
【发布时间】:2014-01-06 14:27:57
【问题描述】:

大家好,新年快乐!

我正在尝试在一个简单的 fortran 90 代码中使用 fftw 库(是的,一个旧的 fortran ......)。 这是一个计算向量 in=1,2,..., N 的 FFT 的非常简单的代码。令我惊讶的是,对于 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

出乎意料(对我来说),向量“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,代码中的错误复制/粘贴...

【问题讨论】:

  • 什么是 m,为什么它似乎没有分配一个值,而您仍在循环中使用它?
  • 抱歉,复制/粘贴错误。没有“m”,以前是“m=N”,复制/粘贴时,我(错误地)擦除了这一行......对不起

标签: fortran fortran90 fftw


【解决方案1】:

四处寻找您的标志的含义,我在这里找到了 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

或者我可能误读了一些完全不相关的东西,但我想这值得一试:)

【讨论】:

  • 是的,它可以工作 \o/ 但是,如果我改变它,它可以工作,此外,双复数,可分配...在复数,可分配...非常感谢!
  • 乐于助人 :) 我以为我在 93 年上过一门课程后就再也见不到 Fortran 了(那是 Fortran74 :()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2018-03-20
  • 2011-03-08
  • 2019-12-27
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多