对于上下文,在我的CFD模拟中,我的计算域被分成块 . 每个块都有自己的单元格数,每个单元格包含各种信息 . 块通过域分解算法在进程间分布,以实现 balancer 负载 .
网格计算域仅由进程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
我的想法是从进程0使用 MPI_SCATTERV
(每个进程处理不同数量的块)以将我的数组 mesh
的块分发给其他进程 . 最后,如果需要,我会使用 MPI_GATHERV
来恢复整个域 . 问题是我必须转移复杂的派生类型 .
我想我必须用 MPI_TYPE_CREATE_STRUCT
定义MPI派生类型,因为我有非同类数据 . 我也读过 MPI_PACK
但它似乎受到内存开销的影响 . 无论哪种方式,我都被卡住了,因为我必须处理每个派生类型中的可分配数组 .
如何使用可分配数组定义MPI派生类型?当然,在发送数据之前,这些数组是分配的,但是在编译时,没有 . 我需要使用 MPI_GET_ADDRESS
来计算每个数据之间的偏移量,但我没有通过这种方法来进行通信 .