最も簡単な流体シミュレーション・ソフトウェア
出力ファイルの内容と活用
ファイル構成
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')
EN