1

時間の一連の値(実際の値)をFORTRANのdatファイルに書き込もうとしています。これはMPIコードの一部であり、コードは長時間実行されます。そのため、タイムステップごとにデータを抽出してファイルに出力し、プログラムの実行中にいつでもファイルを読み取りたいと思います。現在、私が直面している問題は、プログラムが終了するまで時間の値がファイルに書き込まれないことです。doループの前にopenステートメントを置き、doループの終わりの後にcloseステートメントを置きました。

私のコードの部分は次のようになります:

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

3 に答える 3

0

Gfortranマニュアルから:

Fortran 2003 標準以降、組み込みFLUSHよりも優先すべきステートメントがあります。FLUSH

FLUSH組み込み文と Fortran 2003 文の効果FLUSHは同じです。これらはランタイム ライブラリの I/O バッファをフラッシュして、データが他のプロセスから見えるようにします。これは、データがディスクにコミットされることを保証するものではありません。

POSIX システムでは、I/O ユニットの POSIX ファイル記述子 (GNU 組み込み FNUM で取得) を引数として fsync 関数を呼び出すことにより、すべてのデータをストレージ デバイスに転送するように要求できます。次の例は、その方法を示しています。

    ! 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 に答える