在MPI进程之间发送带有可分配数组的derived-type

时间:2016-05-21 10:26:06

标签: arrays fortran mpi allocation derived-types

对于上下文,在我的CFD模拟中,我的计算域被分成块。每个块都有自己的单元格数,每个单元格包含各种信息。块通过域分解算法在进程间分布,以实现平衡负载。

计算域的网格划分仅由进程0执行(我不希望在每个进程中存储整个网格,因为在使用的内存方面它将是灾难性的)。实际上,网格被编码为一维块数组,每个块都是一个复杂的派生类型,具有其他派生类型的可分配语句:

TYPE something
    integer :: i,j,k
END TYPE something
!------
TYPE cell
    integer :: var1
    real, dimension(3) :: var2
    type(something), dimension(:), allocatable :: var3
END TYPE
!------
TYPE block
    integer :: var4
    real    :: var5
    type(cell), dimension(:), allocatable :: var6
END TYPE block

并将网格定义为:

TYPE(block), dimension(n) :: mesh

然后我的想法是使用MPI_SCATTERV(每个进程处理不同数量的块)从进程0将数组mesh的块分发给其他进程。最后,如果需要,我会使用MPI_GATHERV来恢复整个域。问题是我必须转移复杂的派生类型。

我认为我必须使用MPI_TYPE_CREATE_STRUCT定义MPI派生类型,因为我有非同类数据。我还读到了MPI_PACK,但它似乎受到内存开销的影响。无论哪种方式,我都被卡住了,因为我必须处理每个派生类型中的可分配数组。

如何使用可分配数组定义MPI派生类型?当然,在发送数据之前,这些数组是分配的,但是在编译时,没有。我需要使用MPI_GET_ADDRESS计算每个数据之间的偏移量,但我不知道如何使用可分配数组。我需要切换到固定长度的数组吗?我是否需要定义上述三种类型中的每一种并构造一个“超级”MPI派生类型块?我正在考虑在每个块的每个单元格上循环并逐个发送数据,这似乎不是正确的方法,因为它需要大量的mpi调用,我正在寻找一个真正的“块块” '沟通。

0 个答案:

没有答案