1

我正在尝试将一系列时间值(实际值)写入 FORTRAN 中的 dat 文件。这是 MPI 代码的一部分,代码运行时间很长。所以我想在每个时间步提取数据并将其打印到文件中,并在程序执行期间随时读取文件。目前,我面临的问题是,在程序结束之前时间值不会写入文件。我将 open 语句放在 do 循环之前,将 close 语句放在 do 循环结束之后。

我的代码部分如下所示:

open(unit=57,file='inst.dat')
do loop starts
.
.
.
write(57,*) time
.
.
.
end do
close(57)
4

3 回答 3

0

在每个时间步之后关闭文件怎么样(假设时间步之间经过了合理的时间)?

do loop starts
.
.
  !Note: an if statement should wrap the following so that it is
  !only called by one processor.
  open(unit=57,file='inst.dat')
  write(57,*) time
  close(57)
.
.
end do

或者,如果时间步长之间的时间很短,则在 10、100、... 迭代块之后写入数据可能更有效。

于 2015-02-05T09:38:51.740 回答
0

来自 Gfortran手册

从 Fortran 2003 标准开始,有一个FLUSH语句应该优于FLUSH内在语句。

FLUSH内在语句和 Fortran 2003语句具有相同的FLUSH效果:它们刷新运行时库的 I/O 缓冲区,以便数据对其他进程可见。这并不能保证将数据提交到磁盘。

在 POSIX 系统上,您可以通过调用 fsync 函数请求将所有数据传输到存储设备,并将 I/O 单元的 POSIX 文件描述符作为参数(使用 GNU 内部 FNUM 检索)。以下示例显示了如何:

    ! Declare the interface for POSIX fsync function
    interface
      function fsync (fd) bind(c,name="fsync")
      use iso_c_binding, only: c_int
        integer(c_int), value :: fd
        integer(c_int) :: fsync
      end function fsync
    end interface

    ! Variable declaration
    integer :: ret

    ! Opening unit 10
    open (10,file="foo")

    ! ...
    ! Perform I/O on unit 10
    ! ...

    ! Flush and sync
    flush(10)
    ret = fsync(fnum(10))

    ! Handle possible error
    if (ret /= 0) stop "Error calling FSYNC"
于 2013-01-04T12:58:39.240 回答
0

试试call flush(unit)。检查您的编译器文档,因为我认为这是一个扩展。

您提到 MPI:对于并行代码,我认为您需要为每个线程提供自己的文件/单元,或采取其他措施来避免冲突。

于 2013-01-04T01:13:53.987 回答