無料で使えて手軽な流体シミュレーション・ソフトウェア
出力ファイルの内容と活用
ファイル構成
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')