【发布时间】:2021-03-21 10:15:46
【问题描述】:
我在使用 cufftPlanMany 时遇到问题。创建计划并进行正向和反向 FFT 后,我无法取回原始数据。请在附件中找到代码的最低版本。
program test_cufft
use cudafor
use cufft
integer :: plan_r2c
integer :: plan_c2r
real,allocatable,dimension(:,:,:,:), device :: eta_d
complex,allocatable,dimension(:,:,:,:), device :: etak_d
nv = 4
nx = 256
ny = 512
nz = 512
nx21 = nx/2+1
allocate( eta_d(nv,nx,ny,nz) )
allocate( etak_d(nv,nx21,ny,nz) )
batch = nv;
rank = 3;
n = (/ nx, ny, nz /);
idist = nx*ny*nz;
odist = nx21*ny*nz;
inembed = (/ nx, ny, nz /);
onembed = (/ nx21, ny, nz /);
istride = 1;
ostride = 1;
istat = cufftPlanMany( plan_r2c, rank, n, inembed, istride, idist, &
onembed, ostride, odist, CUFFT_R2C, batch )
istat = cufftPlanMany( plan_c2r, rank, n, onembed, ostride, odist, &
inembed, istride, idist, CUFFT_C2R, batch )
! Initialize eta_d
istat = cufftExecR2C( plan_r2c, eta_d, etak_d )
istat = cufftExecC2R( plan_c2r, etak_d, eta_d )
eta_d = eta_d/idist
end program test_cufft
问题是在我进行了正向和反向 FFT 之后,我无法取回原始数据。
请问,我做错了什么?
数据的排序应该是eta_d(batch,nx,ny,nz) or eta_d(nx,ny,nz,batch)吗?
【问题讨论】:
-
这种正向/反向变换不会返回原始数据,除非您将最终结果除以变换的大小,即
idist。见here。 -
罗伯特说得对。我确实除以
idist。我已经编辑了问题以表明这一点。我不确定的是n, inembed, inembed的排序。