0

MD プログラムで作成したファイルのデータを使用する FORTRAN コードを書いています。データは値のリストですが、リストの更新のためにデータにブレークがあります (# Neighbor list update .. リスト内の 6527 インデックス)。これらのブレークはランダムな間隔であるため、x ごとにスキップすることはできません。

コードを実行すると、これらの行は無視されず、前のステップの値がランダムに追加されます。

1, 0.98510699999999995, 0.98510699999999995
2, 1.9654170000000000, 0.98031000000000001
3, 2.9427820000000002, 0.97736500000000004
4, 3.9186540000000001, 0.97587199999999996
4, 4.8945259999999999, 0.97587199999999996
5, 5.8697910000000002, 0.97526500000000005
note the double step 4 with an identical value from the true step 4

この行をスキップするにはどうすればよいですか。以下のサンプルコードを見つけてください

Open(Unit=10,File='prod._100.tup')

do i=1,50

Read(10,*,IOSTAT=ios)step,temp,kinetic,potential,total,pressure
If(IS_IOSTAT_END(ios)) Exit
test=test+temp
print*, step, test, temp
End Do
4

2 に答える 2

1

ファイルの「区切り」が何であるかは明確ではありません。空行ですか?その場合、次のコードが機能するはずです。

use, intrinsic :: iso_fortran_env

character (len=200) :: line

Open(Unit=10,File='prod._100.tup')

read_loop: do

   Read (10,'(A)',IOSTAT=ios) line
   If(ios == iostat_end) exit read_loop
   if (len_trim (line) == 0) then
      write (*, *) "blank line"
      cycle read_loop
   end if
   read (line, *) step,temp,kinetic,potential,total,pressure
   test=test+temp
   print*, step, test, temp

end do: read_loop

write (*, *) "total is", test

上記はテストされていません。「len_trim」テストは、空白行である不良レコードに基づいています。ブレークが別の方法で定義されている場合は、別のテストを作成する必要があります。

于 2012-05-05T01:03:51.500 に答える
0

試す:

i=1
do while (i<=50)
  Read(10,*,IOSTAT=ios)step,temp,kinetic,potential,total,pressure
  If(IS_IOSTAT_END(ios)) Exit
  IF(ios.ne.0) cycle
  test=test+temp
  i=i+1
enddo

不良レコードが読み取られると、ios にはシステム依存のゼロ以外の数値が割り当てられます (成功するとゼロになります)。ファイルの終わりに到達したかどうかを通知する関数 (IS_IOSTAT_END) を作成したようですが、他のエラー条件が存在する可能性があります (たとえば、読み取りステートメントがデータと一致しない)。これは、ファイル終了レコードとは異なるゼロ以外の ios を返すため、その時点でループを再開する必要があります (例: cycle)

ファイルから正確に 50 行を読み取りたいと想定しているので、doループを に変更しましたdo whileが、読み取るレコードの数が実際に問題にならない場合は、自由に変更して元に戻してください。

于 2012-05-05T00:31:30.190 に答える