プロが教える店舗&オフィスのセキュリティ対策術

Fortran90初心者です。

実験でたとえば

時刻 温度 流速
t1   T1  v1 (CR/LF)
... ... ...
tn   Tn  vn (CR/LF)
のような ascii data file (FILE.dat)を得ています。

実験ごとに n の値、つまり、行数が違っており、このファイル内のデータを
次のようなFortran.90のプログラムで読み取って、その後処理を行っています。

integer :: Nl ! number of lines
integer :: i
character(180) :: dummy_line ! for void reading
real(8), allocatable :: time(:), temp(:), velocity(:)

open (5,file='FILE.dat', status='unknown',form='formatted')

Nl = 0
do
read(5,*, end = 99) dummy_line ! void read is absurd !!
Nl = Nl + 1
end do
99 write(*,*)"eof encountered at Nl = ", Nl ! total lines in the file

allocate(time(Nl), temp(Nl), velocity(Nl)) ! allocation of variables

rewind(5) ! read pointer is set to the beginning of the file
do i=1, Nl
read(5,*) time(i), temp(i), velocity(i)
end do

この方法だと、元のファイルを2度読み込むことになりますので、あまり
賢い方法ではないと怒られています。実験データを出力する機器の方でファイルの
先頭にデータ数 n を吐き出させることもできません。

Fortran90だけでデータを読みながら動的配列を増やしてゆく方法があったら
ご教示のほどお願いします。

Cならリスト処理やreallocで可能かとも思いますし、Linux上なら wc -lと
Cのpopenとでも可能かとは思うのですが、プラットフォームはwindows7
で、intel fortranを使用しています。
(最終手段は入力部はCで、処理部はFortranで、linkするのでしょうか。)

よろしくお願いします。

A 回答 (3件)

read(5,*, end = 99) dummy_line ! void read is absurd !!


だとデータを読み込むことになりますが
read(5,'()')であればその行をスキップすることになるので
幾分早くなるかとは思いますがいかがでしょうか?

要はこんな↓感じ
Integer :: NI, stat
NI = 0
DO
READ(5,'()',IOSTAT = stat)
IF(stat == 0) THEN
NI = NI + 1
ELSE IF(stat < 0) THEN
EXIT
END IF
END DO
REWIND(5)
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

なるほど空読みするにしてもスキップしながら行数を数えるのですね。
形式上2度読み込むにしても、1回目は実質読んではいないので少し効率は
良くなりますね。
当初期待していたCのリスト処理に対応するものとはイメージが異なりますが、
処理が速くなるので怒られなくてすみそうです。

ありがとうございました。

お礼日時:2014/05/07 21:43

C の realloc 相当のことを自力でやればいいんだろうけど....



あえて「Fortran を使わない」というオプションはなし?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

はい、読み込むところをCで読み込ませて、動的配列をlist処理で格好よく確保する
部分(関数)をつくり、確保した配列をFortran90のサブルーチンに渡すことは
考えられますが、先生がFortran90/95にこだわるので…

お礼日時:2014/05/07 21:39

例えば、nの値がわかれば1行目に入れることはできないですか?


先にわかれば前半はいらないですよね。

あるいは、nの取りうる最大値があればその最大値ぶん配列を作るというのは?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

測定器が賢くないもので、最初に測定点数を吐き出してくれないのです。
最大値も長時間(たとえば2週間)測定しているときには、10万行程度になり、
1日ですと数千行なので、無駄なメモリを宣言するのも何ですので…

お礼日時:2014/05/07 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!