Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 使用带mpi的一维FFT进行二维FFT_Fortran_Mpi_Fftw - Fatal编程技术网

Fortran 使用带mpi的一维FFT进行二维FFT

Fortran 使用带mpi的一维FFT进行二维FFT,fortran,mpi,fftw,Fortran,Mpi,Fftw,我正在尝试使用一个带有fftw_mpi子例程(版本3.3.2)的维数(nxn)的复数矩阵:对所有行进行1D FFT(复数到复数),然后对所有列进行1D FFT(复数到复数)。首先,我用Fortran编写了一个串行代码,一切都正常工作,但当我用mpi尝试fftw子例程时,结果并不像我预期的那样。1D FFT变换计划的创建方式是否有问题?下面是一个示例(仅行上的第一个1D FFT): ! 获取本地数据大小并分配(维度反转) alloc_local=fftw_mpi_local_size_2d(M

我正在尝试使用一个带有fftw_mpi子例程(版本3.3.2)的维数(nxn)的复数矩阵:对所有行进行1D FFT(复数到复数),然后对所有列进行1D FFT(复数到复数)。首先,我用Fortran编写了一个串行代码,一切都正常工作,但当我用mpi尝试fftw子例程时,结果并不像我预期的那样。1D FFT变换计划的创建方式是否有问题?下面是一个示例(仅行上的第一个1D FFT):

! 获取本地数据大小并分配(维度反转) alloc_local=fftw_mpi_local_size_2d(M,L,mpi_COMM_WORLD& 本地_M,本地_j_偏移) cdata=fftw\u alloc\u复合体(alloc\u本地) 调用c\u f\u指针(cdata、ldata、[L、本地\u M]) 调用c\u f\u指针(cdata、数据、[L、本地\u M]) ! 创建MPI计划 plan=fftw\U mpi\U plan\U MUN\U dft(1,L*local\U M,local\U M,fftw\U mpi\U默认块& FFTW\u MPI\u默认块、ldata、数据、MPI\u通信世界、FFTW\u转发、FFTW\u估计) do j=1,局部μM i=1,L吗 ldata(i,j)=我的函数 结束循环 结束循环 ! 计算变换 调用fftw\u mpi\u execute\u dft(计划、数据、数据) 调用fftw_销毁_计划(计划) 免费呼叫fftw\U(cdata) 调用MPI_FINALIZE(MPI_错误)
为什么结果不符合您的预期?我在Matlab中将结果与同一矩阵的1D FFT进行了比较,结果不同。如果我有一个维数为(16x16)的矩阵(在本例中,局部μM为2),则代码似乎只对每个进程上分配的第一列应用fft。我怀疑问题来自计划创建,但我无法跟踪或修复它。如果有任何建议,我将不胜感激。您是否尝试过将两者都策划好?一般来说,我记得FFTW以相反的顺序给出结果。串行FFTW可以吗?问题不在于值混淆,而在于fortran中的计算错误。我已经为同一个函数制作了一个带有fftw_mpi的2D FFT,它可以正常工作,但是我需要在列上使用1D FFT,在行上使用1D FFT。首先,我对列进行了1D FFT,并与Matlab的结果进行了比较,对于相同的函数,值是错误的。 ! get local data size and allocate (dimension reversal) alloc_local = fftw_mpi_local_size_2d(M, L, MPI_COMM_WORLD, & local_M, local_j_offset) cdata = fftw_alloc_complex(alloc_local) call c_f_pointer(cdata, ldata, [L,local_M]) call c_f_pointer(cdata, data, [L,local_M]) ! create MPI plan plan = fftw_mpi_plan_many_dft(1, L*local_M, local_M, FFTW_MPI_DEFAULT_BLOCK, & FFTW_MPI_DEFAULT_BLOCK, ldata, data, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_ESTIMATE) do j = 1, local_M do i = 1, L ldata(i,j)= my_function enddo enddo ! compute transform call fftw_mpi_execute_dft(plan, ldata, data) call fftw_destroy_plan(plan) call fftw_free(cdata) call MPI_FINALIZE(mpi_err)