12/10/2019
FantomRefined luaファイル解説マニュアル
【注意】Fantomの実行は,luaのプログラムを実行することです.流体解析モジュールやその他のモジュールはluaのライブラリーとなっており,必要に応じて利用(require)します.
- luaファイル先頭のpackage.cpath行は.モジュール(*.so, *.dll)がluaファイルと異なるフォルダーに入っている場合に指定します.同じフォルダーにモジュールが入っている場合には必要ありません.
- requireを利用して必要なモジュールだけをロードします.多くの場合,流体モジュールのfantomと出力用モジュールのwriterは常に利用します.具体的には以下のようにロードします
require('fantom')
require('writer')
- string_vectorという関数をユーティリティーとして用意しています.これはluaの文字列テーブルをそのままC++オブジェクトに渡せないために用意したもので,この関数でluaテーブルからC++のstd::vector<std::string>に変更してから,C++オブジェクトに渡します.(注意:doubel_vectorという実数用の変換関数も同様に利用することがあります)
- luaファイルの前半部分で,基本的なパラメータを設定します.
- case_name: 計算ケースの名前で,出力ファイル名に利用されて他の出力と区別できるようにします.
- dx, dy: コンテナのx,y方向のサイズです(コンテナについては論文参照).
- dt: 計算タイムステップです.一回のループで進む時間です.CFL条件などを考慮して決定します.
- total_count: 総計算ステップ数です.計算する時間はtotal_count*dtとなります.
- save_interval: 計算結果を書き出す間隔を決めます.
- limit_depth: 冠水・干出が生じる場合に水域であるための最低水深です.小さい方がいいですが,小さいとdtの制限がきつくなります.
- fantom.Parameter_Theta: theta-methodを利用している水面変動計算と鉛直拡散計算のためのパラメーターです.0.5で2次精度となります.水面変動の時間変化が重要でない場合(もしくはdtが十分に小さい場合)には1.0で問題なく,安定して解くことができます(1次精度).
- num_threads: 利用できるcoreの数を指定します.hyper-threadingを利用し仮想core数でなく,物理的に実装されているcore数を利用した方が良いです(場合によっては仮想coreを含めたほうが早くなることもあります).
- dzは鉛直方向の格子幅を指定します.C++のvector(double)形式で渡すか,fantom.single_line_data関数を用いてファイル(一列データ)を読み込みます.いずれの場合にも一行目は最下層(水底側)のセル厚さで,最終行が最上層(水面側)のセル厚さになります.
- オブジェクトの生成
- water_body(fantom.WaterBody)は最も基本的なオブジェクトで,その名の通り水塊を構築します.地形情報,離散化情報を渡してオブジェクトを作成します.
- advection(移流オブジェクト群): 運動量,スカラー,乱流量を移流させます.引数には後で設定るす変数(var)の名前を与えます.
- diffusion(拡散オブジェクト群): 運動量,スカラーの水平・鉛直方向の拡散を計算します(乱流量に関しては乱流モデルの中で実行しています).変数名に関しては移流と同じです.
- surface(fantom.SurfaceSolver): 陰的に水面変動の時間発展を解きます.
- gls: 乱流モデル(Generic Length scale closure model)のオブジェクトです.一般的な現地スケールの計算はこの乱流モデルで良いと思います.
- baroclinic (fantom.BaroclinicForce): 密度成層がある際に水平密度勾配に基づく傾圧力が計算されます.
- weather: 水面での気象による熱フラックス,運動量フラックスの計算をおこないます(色々な種類があります.fantom.UniformWindは風応力のみ).
- coriolis (fantom.CriolisForce): コリオリ力を計算します.緯度を引数に渡します.
- writer関連: writer.VTKWriter,writer.TextWriterはそれぞれvtkファイル出力,テキスト出力用のオブジェクトを作成します.
- water_body:set_uniform_surface_level()はfantom.WaterBodyの関数で,計算開始の初期水位(一定値)を与えるコマンドです.(設定を変えない限り)水位ゼロはグリッドの最下層です.
- water_body:set_var()は計算する変数を登録するコマンドです.任意の変数を加えることができますが,u,v,wは必ず付け加える必要があります.引数は,名前,初期値,(以降省略可)高次精度移流計算ONの最小差分,プラントル数,乱流プラントル数).変数の追加は計算開始時のセル体積を決めた後(update_wet_compunents)に行う必要がある.
- 時間進行について(time marching)
- time = dt*counterで現在計算している時間を求めている(total_countだけ繰り返す).
- counterがsave_intervalの倍数になったら結果をファイル出力(text, vtkなど)する.
- ループの先頭部分で,セル境界面で定義されている運動量u,v,wのセル平均値を求める(construct_box_variables()).
- 乱流渦粘性・渦拡散係数をアップデートする(gls:apply())
- 様的なアップデートを行う(移流や水平拡散など).
- 運動量の鉛直拡散,水面変動など陰的計算を行う.
- スカラーの移流は水面計算の後に行う.
- 静水圧の場合,連続式から鉛直流速を求める(hydrostatic_continuity()).
- 水面変動に従って,計算セルの大きさをアップデートする(update_wet_components())