我在使用带有fortran的FFTW时遇到了一个故障的分段错误,而我却无法找出原因。在线搜索也没有运气。这是我的代码:
integer, parameter :: Nx=128, Ny=Nx, Nz=Nx
integer, parameter :: NORM=Nx*Ny*Nz,Ntop=MAX(Nx,Ny,Nz)/2, LX1=Nx/2+1
double precision, parameter :: Etot=0.5
double complex, dimension(LX1,Ny,Nz) :: fbx, fby, fbz
double precision, dimension(Nx,Ny,Nz) :: bx, by, bz
real
! ...
! Assign values to fbx, fby, fbz
! ...
call dfftw_plan_dft_c2r_3d(plan,Nx,Ny,Nz,fbx,bx,FFTW_ESTIMATE)
call dfftw_execute_dft_c2r(plan, fbx, bx)
call dfftw_execute_dft_c2r(plan, fby, by)
call dfftw_execute_dft_c2r(plan, fbz, bz)
call dfftw_destroy_plan(plan)
! et = sum(abs(fbx)**2+abs(fby)**2+abs(fbz)**2)
! bx=bx*sqrt(Etot/et); by=by*sqrt(Etot/et); bz=bz*sqrt(Etot/et)
! Write bx, by, bz to files
代码以这种方式运行良好。当我取消对计算et和重新缩放bx的行的注释时,问题就出现了。当我取消注释这些行时,我得到分段错误,说“无效的内存引用”。在第一次执行dfftw_execute_dft_c2r()
时发生seg错误我在两台不同的机器上使用ifort和gfortran尝试了fftw 3.2和fftw 3.4,并且没有任何成功。
这让我发疯!我需要帮助!为什么会这样?
谢谢!
答案 0 :(得分:3)
您正在使用应用于不同阵列的相同计划。只有在内存中对齐时,FFTW才适用于这种情况 - 参见例如final point here,以及文档中有关为何难以保证的相关部分。
我在文档或其他地方看到的两个建议是
此外,您似乎正在使用legacy Fortran interface。如果可能的话,最好使用"Modern" interface,但我过去的经验是,有些编译器不能很好地使用它。