Fortran语言中FFTW与FFT并行运算
我的目标是并行化用Fortran编写的串行FFTW代码,它告诉我们材料中的有限应变分布。我只需要将前向傅里叶变换和后向傅里叶变换并行化就可以保持原样。 首先有可能做到这一点吗?我试过这样做,但是遇到了一些分割错误。我实际上可以粘贴整个代码,但它有1600行,但我会在错误仍然存在的地方附加 假设初始化其他琐碎的变量和所需的头Fortran语言中FFTW与FFT并行运算,fortran,mpi,fftw,Fortran,Mpi,Fftw,我的目标是并行化用Fortran编写的串行FFTW代码,它告诉我们材料中的有限应变分布。我只需要将前向傅里叶变换和后向傅里叶变换并行化就可以保持原样。 首先有可能做到这一点吗?我试过这样做,但是遇到了一些分割错误。我实际上可以粘贴整个代码,但它有1600行,但我会在错误仍然存在的地方附加 假设初始化其他琐碎的变量和所需的头 complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), pointer :: in_forward !>
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), pointer :: in_forward !> @var Array input in FFT
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), pointer :: out_forward !> @var Array output in FFT
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), allocatable :: in_backward !> @var Array input of FFT-1
complex ( C_DOUBLE_COMPLEX ) , dimension ( : , : , : ), allocatable :: out_backward !> @var Array output for FFT-1
ALLOCATE delta(3,3,npts1,npts2,local_npts3))
integer (kind = i4b ) :: plan_forward
integer (kind = i4b ) :: plan_backward
integer :: AllocateStatus
CALL MPI_INIT(ier)
CALL fftw_mpi_init
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, IER)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, IER)
ur0=0
open(ur0,file='elfft.in',status='old')
read(ur0,'(a)') prosa
read(ur0,*),npts1,npts2,npts3
npts1_c = npts1
npts2_c = npts2
npts3_c = npts3
alloc_local = fftw_mpi_local_size_3d(npts3_c, npts2_c, npts1_c, MPI_COMM_WORLD, local_npts3_c, local_j_offset_c)
local_npts3 = local_npts3_c
local_j_offset = local_j_offset_c
cdata = fftw_alloc_complex(alloc_local)
CALL C_F_POINTER(cdata, in_forward, [npts1_c, npts2_c, local_npts3_c])
do vii=1,3
do vjj=1,3
in_forward(:,:,:) = CMPLX(delta(vii,vjj,:,:,:),0)
if (imicro == 1 .and. iter == 1 .and. vii == 1 .and. vjj == 1 ) then
plan = fftw_mpi_plan_dft_3d(local_npts3_c,npts2_c,npts1_c, in_forward , out_forward, MPI_COMM_WORLD, FFTW_FORWARD, FFTW_ESTIMATE)
print *, 'successful plan creation for forward'
endif
call fftw_mpi_execute_dft( plan,in_forward, out_forward )
.
.
call fftw_destroy_plan(plan)
call fftw_free(cdata)
编译并运行程序后,我得到了这个错误。
我仍然觉得我做了一些不完整的事情,希望有更好的理解。因此,如果有人能向我推荐任何示例源代码或参考资料,那就太好了。
对不起,我已经试过了,但还没有找到合适的来源。我想我需要更多的搜索。我编辑并添加了我尝试过的部分。它可能看起来很慢。请给我任何形式的反馈。“假设初始化了其他琐碎的变量和所需的标题。”不要这样做,在这里放一个,注意单词complete。我们应该能够编译和测试代码。如果太长,删除不相关的部分,但是代码应该保持可编译性,并且仍然应该有错误。您删除的是必要的部分,而不是无关的部分。欢迎使用Stackoverflow!当调用
C\u F\u指针(cdata,in\u forward,…)
时,它将分配的C指针分配给fortran指针。然而,fortran数组out\u forward
似乎没有分配,这可能会触发报告的错误。请参阅此示例,其中分配函数被调用两次,一次用于输入,一次用于输出。
Error in `./a.out': munmap_chunk(): invalid pointer successful plan creation for forward
successful plan creation for forward
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.