首页 文章

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

提问于
浏览
1

我试图将一系列时间值(实际值)写入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

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

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

  • 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,...迭代的块之后写入数据可能更有效 .

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

相关问题