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
使用MPI IO将数组附加到现有文件_Io_Fortran_Mpi - Fatal编程技术网

使用MPI IO将数组附加到现有文件

使用MPI IO将数组附加到现有文件,io,fortran,mpi,Io,Fortran,Mpi,当运行并行程序时,我们可能需要将结果写入文件进行后处理。这些文件通常具有特定的格式,例如:标题(字符/字符串)+二进制数组(实/浮点)。这可以通过两个步骤完成:1。使用主处理器创建新文件并写入标题。2.使用MPI IO将阵列数据附加到此文件。我尝试在MPI_FILE_OPEN中使用MPI_MODE_APPEND as amod将数据追加到现有文件中,但此步骤失败。FORTRAN代码是(我尝试了MPI_MODE_APPEND only和MPI_MODE_APPEND+MPI_MODE_WRONLY

当运行并行程序时,我们可能需要将结果写入文件进行后处理。这些文件通常具有特定的格式,例如:标题(字符/字符串)+二进制数组(实/浮点)。这可以通过两个步骤完成:1。使用主处理器创建新文件并写入标题。2.使用MPI IO将阵列数据附加到此文件。我尝试在MPI_FILE_OPEN中使用MPI_MODE_APPEND as amod将数据追加到现有文件中,但此步骤失败。FORTRAN代码是(我尝试了MPI_MODE_APPEND only和MPI_MODE_APPEND+MPI_MODE_WRONLY)


此外,新结果将覆盖旧数据。我该如何纠正这一说法?非常感谢

感谢@Vladimir的提醒。我想我成功了。原始代码片段是

 integer (kind=MPI_OFFSET_KIND) :: disp = 0
 integer :: n1, n2, n3
 double precision, dimension(0:n1+1,0:n2+1,0:n3+1) :: iodata
 integer, dimension(ndim) :: arraysize, arraystart
 integer, dimension(ndim) :: arraygsize, arraysubsize

   ...

  call MPI_Type_create_subarray(ndim, arraygsize, arraysubsize, arraystart, &
                                MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, &
                                filetype, ierr)

  call MPI_Type_commit(filetype, ierr)


  arraystart(:) = 1

  call MPI_Type_create_subarray(ndim, arraysize, arraysubsize, arraystart, &
                                MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, &
                                mpi_subarray, ierr)

  call MPI_Type_commit(mpi_subarray, ierr)


  call MPI_File_open(cartcomm, filename,    MPI_MODE_APPEND+MPI_MODE_WRONLY, &
                     MPI_INFO_NULL, fh, ierr)

  call MPI_File_set_view(fh, disp, MPI_DOUBLE_PRECISION, filetype, 'native', &
                         MPI_INFO_NULL, ierr)

  call MPI_File_write_all(fh, iodata, 1, mpi_subarray, status, ierr)
实际上,我使用了正确的模式:MPI\u mode\u APPEND+MPI\u mode\u WRONLY。但是,我没有设置偏移量/位移,并将并行数据附加为0位移,这意味着覆盖文件

我应该在MPI_FILE_OPEN之后添加另一条语句,这是

call MPI_FILE_GET_POSITION(fh, disp, ierr)

它使用参数disp获取当前位置。disp为附加到现有文件的数据提供了正确的位置。

完整的代码是什么?您是否使用与中的testmpi.f90相同的步骤设置视图?也为其他人显示代码。
call MPI_FILE_GET_POSITION(fh, disp, ierr)