MicroAVSの構造格子型フィールドフォーマットファイルは複数ステップのデータを一つのヘッダーファイルで記述することができます。
サンプルファイル m2.fld を例に説明します。
<MicroAVSインストールフォルダ>\DATA\FIELD\samples\m2.fld
複数ステップを記述するときは、通常のヘッダファイルに比べて以下の点が違います。
m2.fld ファイルをテキストエディタで開いて見るとvariableとcoordがEOT区切りで繰り返し記述されています。
この m2.fld が参照している m2.dat が実際のデータファイルです。
各ステップがコメントで区切られていて、data, x, y, z の順番でデータが4列に並んでいます。
1行目がコメントなので skip=1 です。
データが4列なので stride=4 になります。
offset は各データで異なっていて、data は列の先頭なので offset=0、
Xはdataを読み飛ばすので offset=1、
YはdataとXの2つを読み飛ばすのでoffset=2、
Zはdata, X, Yの3つを読み飛ばすので offset=3となります。
data, X, Y, Z で close=0 が指定されています。この場合、ひとつのステップを読み終わった時点でのファイルポインタの位置を記憶していて、次のステップはその位置からデータを読み始めます。
ファイルを 『閉じない』 で連続して読込むように見えるので close=0 です。
close=1 にすると、次のステップもファイルの先頭から読み込み始めます(いったんファイルを 『閉じて』、次のステップで再び 『開く』)。
各ステップでデータファイルが異なる場合は close=1 となります。
(close を省略した場合はclose=1 とみなされます)
クリックで画像拡大
close=0 を使うと各ステップの variable と coord の記述が同じになる場合があります。
この場合、DO〜ENDDOを使った繰り返し記述が行えます。
m2.fldをDO〜ENDDOを使って書き直すと以下のようになります。
----------------------------------------------- # AVS field multistep example, coords and data vary at each step, don't #close file until last step read ndim = 2 dim1 = 4 dim2 = 2 nspace =3 veclen = 1 data = float field =irregular nstep=8 DO time file=m2.dat filetype=ascii skip=1 close=0 variable 1 file=m2.dat filetype=ascii skip= 1 offset=0 stride=4 close=0 coord 1 file=m2.dat filetype=ascii skip= 1 offset=1 stride=4 close=0 coord 2 file=m2.dat filetype=ascii skip= 1 offset=2 stride=4 close=0 coord 3 file=m2.dat filetype=ascii skip= 1 offset=3 stride=4 close=0 EOT ENDDO -----------------------------------------------
なお、ndim、dim1、dim2、dim3 は各ステップで異なる値が指定できません。格子数が変わる場合はステップごとに異なる *.fld ファイルとして作成する(ステップ数分の *.fld を作成する)か、非構造格子(UCD)フォーマットとして定義する必要があります。
複数ステップのデータを作るためのC言語サンプルプログラムと、作成されたデータを MicroAVS で読込むための *.fld ヘッダーファイルを以下に示します(クリックで表示またはダウンロード)。
※FLD_header.fld
※sampleprogram.c
ここでは、ノードデータ U, V 2 成分と座標値 X, Y, Z 3成分を読込みます。
U(1), U(2), U(3), ... 中略 ... , U(end), V(1), V(2), ... , V(end)この後ろに同じ並び方で2ステップ目が続きます。
1ステップ目の V を読込むためには U を読み飛ばす必要があるのでskip の値は10 x 15 x 20 x 4 (float型のサイズ) = 12000 (byte) となります。
2ステップ目以降の U では、 前ステップの V を読み飛ばす必要があるので同様の計算からskip=12000 となります。
X(1), Y(1), Z(1), X(2), Y(2), Z(2), ... , X(end), Y(end), Z(end)同じくこの後ろに同じ並び方で2ステップ目が続きます。
X, Y, Z の3成分なので stride=3 です。
YはXを読み飛ばすので skip=4 byte (float型のサイズ)Zは X, Yを読み飛ばすので skip=8 です。
1ステップ目の stride=3 が読み込み最後に効くので2ステップ目からはskip=0です。
※上記では、ノードデータと座標値のデータの並べ方をあえて変えています。
この場合、ノードデータの並べ方のほうが読み込み速度は速くなります。
比較的小さいデータの場合は今回のように全てのステップを1つのファイルにまとめてclose=0を使うことでDO〜ENDDOによる繰り返し記述の省略が行えるので便利です。
しかし、データ(格子サイズやステップ数)が大きい場合、1つのファイルに全ステップを記述するとファイルサイズが巨大になり、CD-ROMに収録できない、32bitOSでの2GBの制限を超えてしまう、ステップ読み込みの時間が長くなってしまう、といったデメリットも生じます。ある程度以上のサイズ、ステップ数では、(*.fld作成の手間は増えますが)ステップごとにデータファイルを分けた方が取り回しが良くなる場合が多いです。
複数ステップのデータを作るためのFORTRAN言語サンプルプログラムと、作成されたデータを MicroAVS で読込むための *.fld ヘッダーファイルを以下に示します(クリックで表示またはダウンロード)。 (プログラムは Fortran 95の自由形式で記述、フリーコンパイラG95で動作確認しています)
※FORTRANFLD_header.fld
FORTRAN プログラムでは write 文による書き出しを行いますが、このとき書き出されたデータの前後に “ヘッダー” と “フッター” が自動追加されるため、*.fld ファイルのskip にもそれを加味した数値を記述する必要があります。
このサンプルの例はヘッダー、フッターがそれぞれ 4 byte の場合です。
(環境によってヘッダー・フッターのバイト数は異なるため、確認が必要です)。
*.fld ファイルにおける skip の値は、
1ステップ目はヘッダーを読み飛ばすので skip=4
2ステップ目以降は、前のステップのフッターと、今のステップのヘッダーを続けて読み飛ばすので skip=8となります。
複数成分、複数ステップを全て1ファイルに出力すると、skip の計算が面倒になる場合が多いため、このサンプルの例では1成分ごとにファイルを分け、1つのファイルに 1つの成分の全ステップを出力しています。