Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在MPI进程之间发送带有可分配数组的派生类型_Arrays_Fortran_Mpi_Allocation_Derived Types - Fatal编程技术网

Arrays 在MPI进程之间发送带有可分配数组的派生类型

Arrays 在MPI进程之间发送带有可分配数组的派生类型,arrays,fortran,mpi,allocation,derived-types,Arrays,Fortran,Mpi,Allocation,Derived Types,在此背景下,在我的CFD模拟中,我的计算域被划分为块。每个块都有自己的单元数,每个单元包含各种信息。块通过区域分解算法分布在进程之间,以实现负载平衡 计算域的网格划分仅由进程0执行(我不想在每个进程中存储整个网格,因为这将是灾难性的内存使用)。实际上,网格编码为块的1D数组,每个块都是复杂的派生类型,具有其他派生类型的可分配语句: TYPE something integer :: i,j,k END TYPE something !------ TYPE cell intege

在此背景下,在我的CFD模拟中,我的计算域被划分为块。每个块都有自己的单元数,每个单元包含各种信息。块通过区域分解算法分布在进程之间,以实现负载平衡

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

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\u SCATTERV
(每个进程处理不同数量的块),将我的数组
mesh
中的块分配给其他进程。最后,如果需要,我使用
MPI\u GATHERV
来恢复整个域。问题是我必须传输复杂的派生类型

我想我必须用
MPI\u type\u CREATE\u STRUCT
定义MPI派生类型,因为我有非齐次数据。我也读过关于MPI_PACK的
。无论哪种方式,我都会陷入困境,因为我必须在每个派生类型中处理可分配数组


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

不能对所有具有可分配组件的变量使用单一的派生类型。它们将以随机地址存储可分配组件。那么使用
sequence
关键字强制在每种类型中连续存储阵列数据会怎么样?这不会以任何方式影响可分配组件。因此,无法使用可分配组件定义MPI派生类型?那么我如何与其他进程通信?您可以自己打包或单独发送组件。