View 使用mpi\u类型\u创建\u子阵列收集分布式数据

View 使用mpi\u类型\u创建\u子阵列收集分布式数据,view,mpi,sub-array,mpi-io,View,Mpi,Sub Array,Mpi Io,我正在编写一个mpi代码,它需要将分布式数据写入单个文件。当我检查子数组函数时,子数组函数运行良好。但若使用文件集视图功能来收集数据,则文件包括数据正确数据和NaN或一些垃圾数据,如下所示 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.1000000000000000E+01 0.1000000000000000E+01 0.100

我正在编写一个mpi代码,它需要将分布式数据写入单个文件。当我检查子数组函数时,子数组函数运行良好。但若使用文件集视图功能来收集数据,则文件包括数据正确数据和NaN或一些垃圾数据,如下所示

0.0000000000000000E+00    0.0000000000000000E+00    0.0000000000000000E+00
0.0000000000000000E+00    0.1000000000000000E+01    0.1000000000000000E+01
0.1000000000000000E+01    0.1000000000000000E+01    0.2000000000000000E+01
0.2000000000000000E+01    0.0000000000000000E+00    0.0000000000000000E+00
0.0000000000000000E+00    0.0000000000000000E+00    0.1000000000000000E+01
0.1000000000000000E+01    0.1000000000000000E+01    0.1000000000000000E+01
0.2000000000000000E+01    0.2000000000000000E+01    0.3000000000000000E+01
0.3000000000000000E+01    0.3000000000000000E+01    0.3000000000000000E+01
0.3000000000000000E+01    0.0000000000000000E+00   0.2073889954983216E-316
0.2317786220294740E-309 NaN 0.2317786709764340E-309 0.2317786698253895E-309 0.0000000000000000 E+00 0.0000000000000000 E+00 0.2317786820155404E-309 0.6953355807072957E-309 0.2317786698253895E-309 0.2317786820155404E-309 0.2317786698250041E-309 0.2317786836681109E-309 0.207389954983216E-316 0.6953355807081653E-309 0.2317786674551244E-309 0.0000000000000000 E+00 0.0000000000000000 E+00 0.0000000000000000 E+00 0.2317788916456275E-309 0.0000000000000000 E+00 0.0000000000000000 E+00 0.6953355807081653E-309 0.2073889954983216E-316

我怎样才能解决这个问题

     program test
  use mpi
  implicit none
  integer ierr,istatus,myrank,NPROCS,SUBARRAY,NUM,fh
  INTEGER START(0:2),GSIZE(0:2),SUBSIZE(0:2),i,j,k
  real*8,dimensional(:,:,:),pointer:: buf
  real*8 f(0:9)  
      call mpi_init(ierr)
  call mpi_comm_size(MPI_COMM_WORLD,NPROCS,IERR)
  CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)

  GSIZE(0)=2
  GSIZE(1)=5
  GSIZE(2)=5

  IF(MYRANK.EQ.0)THEN
  allocate(buf(0:1,0:1,0:1))
  START(0)=0
  START(1)=0
  START(2)=0
  SUBSIZE(0)=2
  SUBSIZE(1)=2
  SUBSIZE(2)=2
  NUM=2*2*2
  buf=real(myrank)
  ELSEIF(MYRANK.EQ.1)THEN.
  allocate(buf(0:1,0:1,0:1))

  START(0)=0
  START(1)=2
  START(2)=0
  SUBSIZE(0)=2
  SUBSIZE(1)=2
  SUBSIZE(2)=2
  NUM=2*2*2
  buf=real(myrank)
  ELSEIF(MYRANK.EQ.2)THEN
  allocate(buf(0:1,1,0:1))

  START(0)=0
  START(1)=4
  START(2)=0      
  SUBSIZE(0)=2
  SUBSIZE(1)=1
  SUBSIZE(2)=2
  NUM=2*1*2
  buf=real(myrank)
  ELSEIF(MYRANK.EQ.3)THEN
  allocate(buf(0:1,0:4,0:1))

  START(0)=0
  START(1)=0
  START(2)=2      
  SUBSIZE(0)=2
  SUBSIZE(1)=5
  SUBSIZE(2)=2
      NUM=2*5*2  
  buf=real(myrank)
  ELSEIF(MYRANK.EQ.4)THEN
  allocate(buf(0:1,0:4,1))

  START(0)=0
  START(1)=0
  START(2)=4      
  SUBSIZE(0)=2
  SUBSIZE(1)=5
  SUBSIZE(2)=1
  NUM=2*5*1
  BUF=REAL(MYRANK)  

  ENDIF

  CALL MPI_TYPE_CREATE_SUBARRAY(3,GSIZE,SUBSIZE,START,
 &     MPI_ORDER_fortran,MPI_DOUBLE_PRECISION,SUBARRAY,IERR)
  CALL MPI_TYPE_COMMIT(SUBARRAY,IERR)

      call mpi_file_open(mpi_comm_world,'file',
 &    mpi_mode_wronly+mpi_mode_create,mpi_info_null,fh,ierr)

      call mpi_file_set_view(fh,0_mpi_offset_kind,
 &     mpi_double_precision,subarray,'native',mpi_info_null,ierr)
      call mpi_file_write_all(fh,buf,num,mpi_double_precision,
 &     istatus,ierr)

      call mpi_file_close(fh,ierr)



    CALL MPI_FINALIZE(IERR)

    END

如果你写
MPI\u DOUBLE\u PRECISION
你必须初始化
的第一个
num\u字节,但这不是你要做的。
istatus
应该是一个大小为
MPI\u STATUS\u size
的整数数组,而不是一个标量。Gilles Goulardet你的意思是我必须初始化buf数组,就像buf=0.d一样??我做了,但显示了任何差异。您可能希望声明一个分配缓冲区,并且只在每个列上分配确切的子项。谢谢您的回答。我尝试分配每个列组,但仍然出现相同的结果。如果我将文件集视图或文件全部写入3d分发数组中的代码,是否需要特殊处理?