\(\require{physics}\)

リスタートファイルの使い方

数値計算を行う上で常に最初(多くの場合,静止状態)から計算するということが面倒なことがある.例えば,環境流体解析で多く行われる助走計算をした後の状態を初期条件として計算したい場合などは当てはまる.特に,トレーサー解析を行う際には,任意のタイミングで好きな場所に配置して試行錯誤したいことが多く,全て最初から流動を計算するのは無駄が多い.

そこで,FantomRefinedでは計算の途中でその瞬間の全ての変数をリスタートファイル(.rst)として保存することができる.このファイルはバイナリー形式であり,テキストエディターで中を除くことはできない.まずは,リスタートオブジェクトを他のオブジェクトと同様に(プリアンブルに)作成する.

restart = writer.Restart(water_body, case_name) 

保存方法は,通常の結果出力(テキスト, vtk)の場合と同じで時間ループ内で(例えば以下のように)適当なタイミングで出力するようにすれば良い.ただし,ファイルサイズが大きいため,あまり頻繁に出力しない方が良い.

if counter ~= 0 and counter % restart_interval == 0 then
  restart:write(counter, dt)
end

次に,作成したリスタートファイルを読み込んで計算を開始する方法(通常の実行と同様にluaスクリプトを別途用意する)を説明する.リスタートファイルを読み込んで計算を開始する際には,注意事項がいくつかある.まず,地形は必ず同じでなければならない(dzの設定も).また,リスタートファイルを作成した際に計算していた物理量(set_varしたもの)は同様に作成しなければ(set_varしなければ)ならない.さらに新しい変数を加えたい場合は,リスタートファイルを読み終えた後に加えることができる.また,水位はリスタートファイル内に記録されている値を利用するので,水位は指定してはならない.リスタートファイルを読み込んで計算を開始するスクリプトも同様にリスタートオブジェクトをプリアンブルで作成する.

restart = writer.Restart(water_body, case_name) 

次に,物理量を登録した(set_varの)後,用意したリスタートファイルを読み込む.

restart:read("xxxx-002000.rst")

この後(そして時間進行前)に追加したい物理量があればset_varで追加することができる.

また時間進行に関して,リスタートではカウントと時間が進んでいるため,リスタートからそれらの情報(start_counter, start_time)を 得て計算を進める(時間ループを進行する)必要がある.そうしないと境界条件など読み込むタイミングがずれてしまう.

for counter = restart:start_counter(), total_count do
  time = dt*(counter-restart:start_counter()) + restart:start_time()
  -- processes
end