FORTRANバイナリ出力とその読み込み

科学技術計算の分野では、解析プログラムに FORTRAN を使用されているというケースも多いと思います。

ここでは、MicroAVS に読ませるデータを作成する FORTRAN プログラムの簡単な例を示します。


FORTRAN の write 文(バイナリ出力)は、1 回実行すると書き出したデータ本体の前後に

<ヘッダ><フッタ> が付きます。このような FORTRAN の出力を

MicroAVS に読み込ませる場合、この <ヘッダ> <フッタ> を読み飛ばすように

FLD ヘッダーファイルの skip, offset, stride の値を決める必要があります。

<ヘッダ> <フッタ> がなるべく少なくなるようにプログラムを工夫することで

FLD ヘッダーの定義が簡単になります。

 

FORTRAN のバイナリ出力プログラムにおけるその工夫とは、

1 成分につき 1 つの write 文を使って (全節点分の数値を) 一度に書き出す』 ことです。

以下で具体的なプログラム例を見ていきましょう。 

 

FORTRANプログラム例: outputData.f95

以下は 21×22×23 の正規直行格子上に 2 つの成分 (U, V) がある

時系列データ (10ステップ) を出力する FORTRAN プログラムの例です。

U成分 (f_u.dat) 、V成分 (f_v.dat) の2つのファイルに

それぞれ 10 ステップ分のバイナリデータが出力されます。

また、もう1つのファイル (f_time.dat) に各ステップのステップ番号をアスキー出力しています。

つまり、成分値ファイル 2 つ、ステップ番号ファイル 1 つの計 3 ファイルが出力されます。

 

 

※バイナリデータの成分値は繰り返し処理用の変数を使ったダミーの値となっています。

※Fortran 95 の自由形式(ファイル拡張子 .f95)で記述し、フリーコンパイラ G95 で動作確認しています。

 

------------------------------------------------------------------------

program main 

    implicit none

 

    ! ステップ数、格子数

    integer,parameter :: nstep=10, nx=21, ny=22, nz=23

    ! 1ステップ分の成分(速度u,v)格納配列

    real,dimension(nx,ny,nz) :: u

    real,dimension(nx,ny,nz) :: v

    ! 繰り返し処理用変数

    integer i, j, k, n

 

    ! 出力用ファイルオープン

    ! 時刻 (アスキー形式)

    open(30,file="f_time.dat",form="formatted",status="replace")

    ! 速度 U, V (バイナリ形式)

    open(40,file="f_u.dat",form="unformatted",status="replace")

    open(50,file="f_v.dat",form="unformatted",status="replace")

 

    ! ループ処理:全ステップの全格子点

    DO n=1, nstep

        ! 成分格納配列に成分値を代入

        DO k=1, nz

            DO j=1, ny

                DO i=1, nx

                    u(i,j,k) = i + j + k + n   ! 速度U成分(※ダミー値)

                    v(i,j,k) = i + j - k - n   ! 速度V成分(※ダミー値)

                END DO

            END DO

        END DO

        ! 1ステップぶん、出力用ファイルに数値を書き込み

        write(30,*) n 

        write(40) u     ! 全格子点の u の値を一度に書き込む

        write(50) v     ! 全格子点の v の値を一度に書き込む

    END DO  ! ステップループここまで

 

    ! ファイルクローズ

    close(30)

    close(40)

    close(50)

 

end

------------------------------------------------------------------------

 

FLDヘッダーファイル定義例: sample.fld

上記バイナリ出力を読み込む為の FLD ヘッダーファイルを以下に示します。

variable 1 (速度U成分の読込み)

variable 2 (速度V成分の読込み) の行において、

write 文により付加される <ヘッダ><フッタ> それぞれ 4byte(※1) を

skip で読み飛ばす定義をしています。

 ※1 コンパイラによってはヘッダ、フッタの byte 数が異なる場合もあります。

 

------------------------------------------------------------------------

# AVS field

nstep=10      # ステップ数

ndim = 3

dim1 = 21

dim2 = 22

dim3 = 23

nspace = 3

veclen = 2      # 成分数

data = float

field = uniform

label = U V     # 成分名

 

# 1ステップ目の読み込み

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

 

# 2ステップ目以降の読み込み

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

------------------------------------------------------------------------

 

variable 行の 1 ステップ目は <ヘッダ> をひとつ読み飛ばすので skip=4 となります。

1 ステップ目のすべての格子点の値を読んだ後、close=0 指定 (※2) により

読み込み位置 (ファイルポインタ) は最後の値の次の位置 (1ステップ目の

<フッタ> の手前) に留まります。

 

EOT がステップの区切りを表します。

 

2 ステップ目以降の読み込み (DOENDDO で囲まれた行) では、

<前ステップのフッタ><現ステップのヘッダ> 、つまり

4byte × 2 = 8byte をはじめに読み飛ばす必要があります (skip=8)。

 

 ※2 "close=1" (デフォルト) の場合は、ファイルポインタはステップ毎に

  ファイルの先頭位置まで戻る(ファイルを一旦 "閉じて" 開きなおす)ため、

  skip の値はファイル先頭位置から現在のステップまでの数値となります。

  この場合、ステップ毎に skip の値が異なるので DO ~ ENDDO による

  繰り返し記述はできなくなります(全ステップの time file, variable の

  記述が必要となります)。

 

time file 行では 1 行に数値(現在のステップ数)が 1 つ記述された

アスキーファイルから数値を 『文字列』 として読み込んでいます。

ここで読み込まれた文字列は MicroAVS の物体の表示窓にそのまま表示されます。

 

time file, variable 1, variable 2 の3つのファイルポインタは

それぞれ別々に動きます(読込先が同一ファイルの場合も同様です)。

今回のサンプルにはありませんが、座標値読み込みを行う場合も

coord 1, coord 2, coord 3 それぞれのファイルポインタは別々に動きます。

 


MicroAVSの機能紹介や体験セミナーのご案内など、詳しくは製品Webサイトで!