在FORTRAN 90结构中使用MPI_类型_连续和MPI_类型_创建_子数组

在FORTRAN 90结构中使用MPI_类型_连续和MPI_类型_创建_子数组,fortran,mpi,fortran90,Fortran,Mpi,Fortran90,嗨 我正在尝试像这样使用fortran结构 type some u ! actual code will have 17 such scalars end type some TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatyp

嗨 我正在尝试像这样使用fortran结构

type some
   u                ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars
 CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatype of the object to make it in to contiguous memory
 CALL MPI_TYPE_COMMIT(MPI_METVARS,ierr)
现在,我的测试程序的目标是将10个数字从一个处理器发送到另一个处理器,但这10个数字的起点将是我的选择(例如,如果我有一个向量,比如说20个数字,我将把前10个数字带到下一个处理器,但假设我的选择是从5到15)。所以首先你要像这样使用mpi类型

type some
   u                ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars
 CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatype of the object to make it in to contiguous memory
 CALL MPI_TYPE_COMMIT(MPI_METVARS,ierr)
我做了发送记录,并且能够将前10个数字发送到另一个处理器(我正在测试2个处理器)

我要寄这个

现在 对于第二部分,我使用了mpi_TYPE_CREATE_子数组 然后

我不知道该怎么做

我听到一个错误说

[flatm1001:14066] *** An error occurred in MPI_Recv
[flatm1001:14066] *** on communicator MPI_COMM_WORLD
[flatm1001:14066] *** MPI_ERR_TRUNCATE: message truncated
[flatm1001:14066] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
我在本地机器中使用openmpi。我能够在没有mpi_type_连续部分的情况下使用subarray命令。但是,如果我将两者结合起来,因为在这种情况下,我需要这样做,因为我在实际代码中有一个带有fortran的结构。我也不知道是否有更好的方法。感谢任何形式的帮助和建议。
提前感谢

我假设您的自定义类型包含1个real,因为它没有指定。首先构造10个这些变量的连续类型,即MPI_METVARS表示10个连续实数。现在,我不知道这是否真的是问题所在,因为您发布的代码可能不完整,但现在看来,您构建了一个包含10个MPI_METVARS类型的子数组,这意味着您在newtype和newtype2中实际上有100个连续的实数

处理结构的“正确”方法是使用MPI\U type\U create\U STRUCT为其创建一个类型,该类型应该是您的MPI\U METVARS类型


因此,请为您的自定义类型提供正确的代码,并检查新类型的大小。

选择代码片段并按{}按钮以正确设置代码格式。谢谢,我想这就是我问题的答案。您好,这是关于并行IO的实现。