head_img

出力ファイルの内容と活用

ファイル構成

Flowsquare+を用いたシミュレーション中、プロジェクト・フォルダ内の./dumpディレクトリにパラメータで設定するnfileごとの瞬時場データが保存されます。瞬時場データは、以下のファイルから構成され、これらは時間ステップにより命名されるフォルダ内に格納され、./dumpディレクトリに出力されます。

  • info.txt
    本ファイルには、当該瞬時場の出力されたシミュレーション中の物理時刻や時間ステップ幅、メッシュ数など、シミュレーションに関する基本情報がテキスト形式で格納されています。
  • ufld.raw
    X方向速度成分の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • vfld.raw
    Y方向速度成分の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • wfld.raw
    Z方向速度成分の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • yfld.raw
    流体中の物質の質量分率の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • afld.raw
    流体の検査領域内における滞留時間(age変数)の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • pfld.raw
    presWからの圧力差の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です。
  • rfld.raw
    流体密度の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です(cmode=1のみ)。
  • tfld.raw
    流体温度の3次元場を構成する3次元バイナリデータで、(nx, ny, nz)サイズを有する倍精度浮動小数点です(cmode=1のみ)。

これらのバイナリファイルは、Flowsquare+の解析モードで再度読み込み、データの可視化・詳細な解析を行うことも可能ですが、Paraviewなどの外部の可視化ソフトなどで読み込み・可視化を行うことも可能です。

上記の3次元データは、(lx, ly, lz)のシミュレーション領域を等間隔の(nx, ny, nz)格子点で離散化したデータであり、x, y, z方向の格子点間隔は、それぞれlx/(nx-1), ly/(ny-1), lz/(nz-1)で計算することが可能です。

参考までに、以下にデータ読み込み及び、任意の物理座標 (x,y,z) における値出力、任意の格子点座標 (i,j,k) における値出力及び任意のXY断面のCSV出力を行うPythonコードをご紹介します。下記コード以内の値は、ソフトウェアに同梱のケースファイルに基づきます。

import numpy as np

filepath="./ufld.raw"

# from parameter
nx = 60
ny = 30
nz = 30
lx = 10.0
ly = 5.0
lz = 5.0

dx = lx / float(nx-1)
dy = ly / float(ny-1)
dz = lz / float(nz-1)

def load_field():
    try:
        with open(filepath, "rb") as f:
            return np.fromfile(f,dtype='float')
    except:
        print('File not found at "'+filepath + '"')    

def save_xy_plane_csv(k, field, csv_filepath):
    # save an xy plane at k in a csv format.
    xy = field[nx*ny*k:nx*ny*(k+1)].reshape(ny,nx)
    np.savetxt(csv_filepath, np.flipud(xy), delimiter=',', fmt='%.5e')

def get_value_at_xyz(x,y,z,field):
    # get a value at nearest mesh point from (x,y,z) on the field.
    if x<0 or y<0 or z<0 or x>lx or y>ly or z>lz:
        return -1
    i = int(x / dx)
    j = int(y / dy)
    k = int(z / dz)
    return field[i + nx * (j + ny * k)]

def get_value_at_ijk(i,j,k,field):
    # get a value at (i,j,k).
    if i<0 or j<0 or k<0 or i>nx-1 or j>ny-1 or k>nz-1:
        return -1
    return field[i + nx * (j + ny * k)]


field = load_field()

print(get_value_at_xyz(10.0,0,0,field))

print(get_value_at_ijk(10,0,0,field))

save_xy_plane_csv(14, field, './test.csv')


Top