Fortranのwrite文は1回実行すると書き出したデータ本体の前後に<ヘッダ>と<フッタ>が付きます。
一方、MicroAVSにはデータ本体だけを読み込ませたいので、<ヘッダ><フッタ>はなるべく少なくした方がFLDヘッダーの定義が簡単になります。
つまり、Fortranプログラムにおけるバイナリ出力においては『1成分につき1つのwrite文を使って(全節点分の数値を)一度に書き出す』ことで、FLDヘッダーによる読み取りに都合がよくなります。
21×22×23の正規直行格子上に2つの成分がある時系列データ(10ステップ)の出力例です。
成分ごとに出力ファイルを分けていて、それぞれ10ステップ分を1つのファイルに書き出しています。
また、もう1つのファイルに各ステップの数値をアスキー出力しています。
parameter(nstep=10,nx=21,ny=22,nz=23,nall=nx*ny*nz) dimension u(nx,ny,nz) dimension v(nx,ny,nz) d open(30,file="f_time.dat",form="formatted",status="unknown") open(40,file="f_u.dat",form="unformatted",status="unknown") open(50,file="f_v.dat",form="unformatted",status="unknown") d DO 9000 n=1,nstep DO 1000 k=1,nz DO 2000 j=1,ny DO 3000 i=1,nx u(i,j,k) = i + j + k + n v(i,j,k) = i + j - k - n 3000 continue 2000 continue 1000 continue d write(30,*) n write(40) (((u(i,j,k),i=1,nx),j=1,ny),k=1,nz) write(50) (((v(i,j,k),i=1,nx),j=1,ny),k=1,nz) d 9000 continue close(30) close(40) close(50) d stop end
write文で書かれた<ヘッダ><フッタ>それぞれ4byteをskipで飛ばして読み込ませています。
2ステップ目以降は、<前ステップのフッタ><現ステップのヘッダ>と4byte×2をはじめに読み飛ばす必要があります。
※コンパイラによってはヘッダ、フッタのbyte数が異なる場合もあります。
# AVS field nstep=10 ndim = 3 dim1 = 21 dim2 = 22 dim3 = 23 nspace = 3 veclen = 2 data = float field = uniform # time start time file=./f_time.dat filetype=ascii skip=0 close=0 variable 1 file=./f_u.dat filetype=binary skip=4 close=0 variable 2 file=./f_v.dat filetype=binary skip=4 close=0 EOT DO time file=./f_time.dat filetype=ascii skip=0 close=0 variable 1 file=./f_u.dat filetype=binary skip=8 close=0 variable 2 file=./f_v.dat filetype=binary skip=8 close=0 EOT ENDDO