2013-01-04 34 views
1

我正在嘗試在FORTRAN中的一個dat文件中寫入一系列時間值(實際值)。這是MPI代碼的一部分,代碼運行很長時間。因此,我想在每個時間步驟提取數據並將其打印到文件中,並在程序執行期間隨時讀取文件。目前,我面臨的問題是,直到程序結束時,時間的值才寫入文件。我已經在do循環之前放置了open語句,在do循環結束之後放置了close語句。在程序運行期間從FORTRAN中寫入的文件中檢索數據

我的代碼的部分看起來像:

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

如何查看文件運行時的內容? –

+0

而不是打開,寫入,關閉,打開,讀取......,你可以打開,寫入,倒帶,閱讀。 –

+0

懷疑他想通過外部查看文件來監視進度。 – agentp

回答

0

嘗試call flush(unit)。檢查你的編譯器文檔,因爲這是我認爲的一個擴展。

你提到MPI:對於並行代碼,我認爲你需要給每個線程自己的文件/單元, 或採取其他措施以避免衝突。

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" 
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,...迭代塊之後寫入數據可能會更有效。