在程序运行期间从FORTRAN中写入的文件中检索数据

时间:2013-01-04 00:46:06

标签: fortran

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

我的代码部分如下:

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

来自Gfortran manual

从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"

答案 2 :(得分: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,...迭代块之后写入数据可能会更有效。