データフォーマット・データ作成 複数ステップの構造格子型データをMicroAVSで読み込むには?

対処方法

MicroAVSの構造格子型フィールドフォーマットファイルは複数ステップのデータを一つのヘッダーファイルで記述することができます。

複数ステップFieldフォーマットの基本

サンプルファイル m2.fld を例に説明します。

<MicroAVSインストールフォルダ>\DATA\FIELD\samples\m2.fld

複数ステップを記述するときは、通常のヘッダファイルに比べて以下の点が違います。

  • nstep でステップ数を記述する。
  • EOT で区切ってvariable とcoordの行を繰り返し記述する。
    繰り返し記述するときに、ステップ毎に異なるデータファイルや skipの値を指定します。
  • time file, time value で各ステップのコメントを記述する(省略可能)。
    time file はコメントを別のファイルから読込みます。time value はその後ろに直接コメントを書きます。
    (備考: time キーワードは単ステップの定義でも使えます)

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言語によるデータ作成とFieldヘッダーの例

複数ステップのデータを作るためのC言語サンプルプログラムと、作成されたデータを MicroAVS で読込むための *.fld ヘッダーファイルを以下に示します(クリックで表示またはダウンロード)。

※FLD_header.fld
※sampleprogram.c

ここでは、ノードデータ U, V 2 成分と座標値 X, Y, Z 3成分を読込みます。

ノードデータ (sample_node.dat)

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 となります。

座標値 (sample_coord.dat)

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つにまとめるか、ステップごとに分けるか

比較的小さいデータの場合は今回のように全てのステップを1つのファイルにまとめてclose=0を使うことでDO〜ENDDOによる繰り返し記述の省略が行えるので便利です。
しかし、データ(格子サイズやステップ数)が大きい場合、1つのファイルに全ステップを記述するとファイルサイズが巨大になり、CD-ROMに収録できない、32bitOSでの2GBの制限を超えてしまう、ステップ読み込みの時間が長くなってしまう、といったデメリットも生じます。ある程度以上のサイズ、ステップ数では、(*.fld作成の手間は増えますが)ステップごとにデータファイルを分けた方が取り回しが良くなる場合が多いです。

FORTRAN言語によるデータ作成とFieldヘッダーの例

複数ステップのデータを作るためのFORTRAN言語サンプルプログラムと、作成されたデータを MicroAVS で読込むための *.fld ヘッダーファイルを以下に示します(クリックで表示またはダウンロード)。 (プログラムは Fortran 95の自由形式で記述、フリーコンパイラG95で動作確認しています)

※FORTRANFLD_header.fld
※FORTRAN_sample.f95

FORTRAN プログラムでは write 文による書き出しを行いますが、このとき書き出されたデータの前後に “ヘッダー” と “フッター” が自動追加されるため、*.fld ファイルのskip にもそれを加味した数値を記述する必要があります。
このサンプルの例はヘッダー、フッターがそれぞれ 4 byte の場合です。
(環境によってヘッダー・フッターのバイト数は異なるため、確認が必要です)。

*.fld ファイルにおける skip の値は、
1ステップ目はヘッダーを読み飛ばすので skip=4
2ステップ目以降は、前のステップのフッターと、今のステップのヘッダーを続けて読み飛ばすので skip=8となります。

複数成分、複数ステップを全て1ファイルに出力すると、skip の計算が面倒になる場合が多いため、このサンプルの例では1成分ごとにファイルを分け、1つのファイルに 1つの成分の全ステップを出力しています。


MicroAVSお問い合わせ窓口
MicroAVS評価版ダウンロード