1

数値積分を実行する FORTRAN コードがあります。計算されたすべてのデータは、外部ファイル (data.out) に書き込まれます。ここにコードの簡単なスケッチがあります

OPEN(UNIT=10,FILE='data.out')
DO i=1,n

........

WRITE(10,'(7(E22.16,1x))')a,b,c,d,e,f,g

........

ENDDO
CLOSE(10)

数値積分が終了するまで、プログラムは長時間 (約 1.5 時間) 実行され続けます。実行中に、結果を .out ファイルに表示したいと思います。ただし、.exe の実行中に .out ファイルを開こうとすると、次のメッセージが表示されます。「ドキュメント data.out は別のアプリケーションで使用されているため、アクセスできません。」では、実行中に .out ファイルを開く方法はありますか? 出力値を観察することは重要です (上記の例のように 7 つだけではありません)。そのため、それらを画面出力で送信するのは便利ではありません (コードの速度が大幅に低下します)。よろしくお願いします。


* 編集 *


これは、上記のケースと非常によく似た別のシナリオです。ここで、統合ルーチンは入力ファイルから初期条件を読み取り、出力を別の外部ファイルに書き込みます。以下に、対応するコードのスケルトンを示します

     OPEN(UNIT=10,FILE='input.par',STATUS='UNKNOWN')
 2   READ(10,*,END=1) x_0,y_0

 !   INTEGRATION LOOP
     DO i=1,n
     ........
     ENDDO

     OPEN(UNIT=12,FILE='data.out')
     WRITE(12,'(7(E22.16,1x))')a,b,c,d,e,f,g

     GOTO 2

 1   CLOSE(10)
     CLOSE(12)

そのため、ルーチンは UNIT 10 を開き、初期条件を読み取り、積分を実行し、積分の最後に出力を UNIT 12 に書き込みます。次に、別の初期条件のセットを取得し、それがなくなるまで同じ手順を繰り返します。 UNIT 10 の初期条件。繰り返しますが、UNIT 12 を開いて監視できるようにしたいです。あなたのアプローチを試しましたが、この場合は適切に機能しません。UNIT 12 はいつでも開くことができますが、ルーチンはそこにすべての出力を書き込むわけではありません。実際、初期条件の最後のセットの出力のみを書き込みます。何か案は?あなたのアプローチを少し変更するだけでうまくいくと強く信じています。

4

2 に答える 2

1

結果を画面に出力する代わりに、各書き込み操作の後にファイルを閉じ、次の統合サイクルで再度開いて新しいデータを追加することもできます。

program test
  implicit none

  integer :: ii

  ! Create emtpy file
  open(10, file='data.out', status='REPLACE', action='WRITE')
  close(10)

  do ii = 1, 100
    !...
    ! Reopen file, append new information and close it again.
    open(10, file='data.out', status='OLD', action='WRITE', position='APPEND')
    write(10,'(7(E23.16,1x))') 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
    close(10)
  end do

end program test

編集: 主なアイデアは、何らかの種類のループを開始する前に、最初の open ステートメントで空のファイルを作成することです。

  open(10, file='data.out', status='REPLACE', action='WRITE')
  close(10)

次に、ループ内でそのファイルに追加するだけで、既に存在するコンテンツを置き換えないようにします。

open(10, file='data.out', status='OLD', action='WRITE', position='APPEND')
write(10,'(7(E23.16,1x))') 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
close(10)

openステートメントに渡される引数の違いに注意してください。

于 2013-03-14T22:38:46.213 に答える
0

これを行う論理的な方法は、出力を端末にエコーすることです。デフォルトでは、これはユニット 6 です。したがって、出力を次のように変更します。

WRITE(6,'(7(E22.16,1x))')a,b,c,d,e,f,g
WRITE(10,'(7(E22.16,1x))')a,b,c,d,e,f,g

試してみてください。それはうまくいくかもしれません。

于 2013-03-14T22:15:59.780 に答える