输出三维数组的算法

时间:2014-01-09 18:47:30

标签: arrays algorithm fortran mpi fortran90

我正在努力想出一个输出3D数组的算法。我基本上有一个9个2D阵列的阵列,我需要将它组合成一个3X3网格,并作为矩阵输出到文本文件中。 所以我有:

real:: array3D(9,16,16)

我需要按顺序(从左到右,从上到下)将这些9,16x16阵列组合成3x3网格:

real:: array2D(48,48)

任何帮助都会很棒。

[编辑:评论信息]: 这是MPI程序的一部分,其中48x48矩阵被分成9个16x16矩阵,其中9个进程中的每一个被分配给较大阵列的一个“子网格”。像评论中提到的数独网格一样,每个进程将公式应用于其自己的子网格中的每个元素。然后,需要将每个过程计算的最终值放回到48x48矩阵中,以便显示在文本文件中。目前看起来像这样:

if(procID.ne.0)then!Send all arrays to root
    call MPI_SEND (array, row*col, MPI_REAL, 0, procID+1000, MPI_COMM_WORLD, ierr)
else
    complete(1,:,:)=array(:,:)
    do i=2, 9
        call MPI_RECV (recvArray, row*col, MPI_REAL, i-1, (i-1)+1000, MPI_COMM_WORLD, status, ierr)
        complete(i,:,:)=recvArray   
    end do

我想要得到的是一种算法,我可以用它来显示文本文件中的complete作为矩阵,这样我就可以阅读。 (我知道变量名称与上面的不同,但我尽可能地简化/概括了我原来的问题。array再次有维度48x48,但我只对{{1}感兴趣每个块内的块(9个数独谜题,只需要每个子网格)我想要的16x16块由16x16 / complete的第一个索引定义:1-9,我想要获取这些子块并将它们排列在另一个array3D数组中,说48x48 / arrayOut)。如果我写的东西没有多大意义,我会尝试对问题进行图解说明。

感谢@george的答案如下,将其放入您需要的数组中:

array2D

2 个答案:

答案 0 :(得分:1)

无需复制到新阵列即可输出。

伪代码:(我可能已经转换了行/列,但很容易修复)

do majorrow=1,3
 do minorrow=1,16
   do majorcol=1,3
    subblock=(majorrow-1)*3+majorcol
    do minorcol=1,16 
           write(advance=no)array3D(subblock,minorrow,minorcol)
    enddo
   enddo !end of row
   write() ! to advance line at end of row.
enddo
enddo

请注意,最里面的循环可以替换为

 write(advance=no)array3D(subblock,minorrow,:)

由于每行有三次写入,因此您仍然无需提前。

答案 1 :(得分:0)

如果你采用简单的do-loop结构,你只需要以块方式循环遍历大的2d数组,然后将3d数组中的相应元素存储在2d数组的正确块中。

BLKSZ=16
NBLOCK=3
DO IB=1,NBLOCK
  ISTA=BLKSZ*(IB-1)+1
  IEND=ISTA+BLKSZ-1
  DO JB=1,NBLOCK
    JSTA=BLKSZ*(JB-1)+1
    JEND=JSTA+BLKSZ-1
    array2D(ISTA:IEND,JSTA:JEND)=array3D(JB+NBLOCK*(IB-1),:,:)
  END DO
END DO

请注意,3d数组的排序效率不高,因为块索引是最快的索引。最好是它应该是最后一个索引(避免缓存未命中)。