Performance Fortran二维网格w/周期边界条件-高效实现

Performance Fortran二维网格w/周期边界条件-高效实现,performance,multidimensional-array,fortran,fft,numerical-methods,Performance,Multidimensional Array,Fortran,Fft,Numerical Methods,我正在使用Fortran来解决一些耦合偏微分方程使用有限差分法和谱方法。在某一点上,这些网格被送入FFTW。 我假设域是周期性的,我正在努力找到最有效的方法来处理索引问题。选项: 1-重影单元: 我将网格定义为 real :: y(0:nx+1,0:ny+1) (do finite differences) call update_ghost(y) 问题: 当我使用FFTW时,我希望输入是没有重影单元的网格,所以我会: call fftw(phi(1:nx,1:ny),phi_k) 这会

我正在使用Fortran来解决一些耦合偏微分方程使用有限差分法和谱方法。在某一点上,这些网格被送入FFTW。 我假设域是周期性的,我正在努力找到最有效的方法来处理索引问题。选项:

1-重影单元: 我将网格定义为

real :: y(0:nx+1,0:ny+1)

(do finite differences)

call update_ghost(y)
问题: 当我使用FFTW时,我希望输入是没有重影单元的网格,所以我会:

call fftw(phi(1:nx,1:ny),phi_k)
这会导致临时数组的创建,因为数据不是连续的

2-间接寻址: 然后,我用邻域的坐标计算向量,并考虑PBC,然后进行计算

do j=1,ny
   do i=1,nx
      laplacian(i,j) = y(xnext(i),j) + y(xprev(i),j) + ...
   enddo
enddo
问题:间接寻址很昂贵

3-计算循环内的索引 问题:额外的计算


有人有其他选择吗?现在我使用选项1,但想到所有在幕后进行的临时数组创建,我会感到非常痛苦。

您不必总是创建新的临时数组。自己创建一个,只需复制数据。要花些时间吗?是的。太多了吗?测量!!!让我看看我是否理解:``real::y(0:nx+1,0:ny+1),infft(nx,ny);infft=y(1:nx,1:ny);fftt(输入,输出);`是吗?是的。注释长度必须至少为15个字符。与3有关的另一种方法(顺便说一句,我认为你写错了)可能是在中心单元上循环,你知道你不需要模函数,然后分别处理边。但是你必须对每个解决方案进行计时,以确定哪一个是最快的,这也是一个好主意。是的,它写错了:)我要做基准测试。
do j=1,ny
   do i=1,nx
      laplacian(i,j) = y(xnext(i),j) + y(xprev(i),j) + ...
   enddo
enddo
do j=1,ny
   do i=1,nx
      xnext = modulo(i+2,nx) + 1
      ynext = modulo(i,nx) + 1
      xprev = modulo(j+2,ny) + 1
      yprev = modulo(j,ny) + 1
      laplacian(i,j) = y(xnext,j) + y(xprev(i),j) + ...
   enddo
enddo