我正在尝试将一系列时间值(实际值)写入FORTRAN的dat文件中。这是MPI代码的一部分,代码运行很长时间。因此,我想在每个时间步骤提取数据并将其打印到文件中,并在程序执行期间随时读取文件。目前,我面临的问题是,在程序结束之前,时间值不会写入文件。我在do循环之前放置了open语句,在do循环结束之后放了close语句。
我的代码部分如下:
open(unit=57,file='inst.dat')
do loop starts
.
.
.
write(57,*) time
.
.
.
end do
close(57)
答案 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,...迭代块之后写入数据可能会更有效。