< \(\require{physics}\)

ColumnFluxBoundaryの使い方

例:河川の追加

河川を追加する方法にいくつかあるが,ColumnFluxBoundaryが一番わかりやすい.この境界条件はコラムにフラックを与え,コラムに存在する(鉛直に積み上がった)全てのセルに指定した流量が分配される.指定する流量はテキストファイルで与える.必須である時刻(秒)・流量(m$^3$/s)のほか,水温や塩分などのセル平均値を時系列で与えることができる.データは時間に関して線形補完される.流量のプラスは水域への流入,マイナスは水域外への流出となり,流出の際は時刻・流量以外は無視される.また,与えられないデータは,流入先のセルと同様の値として扱われる.

時系列データの例(タブ区切り,一行目の項目名は必要)

time	flux	temperature	tracer
0	3.622	21.398	1
3600	2.634	21.345	1
7200	2.209	21.31	1
10800	1.957	21.312	1
14400	1.781	21.316	1
18000	1.64	21.318	1
21600	1.504	21.271	1
25200	1.401	21.212	1
28800	1.304	21.136	1
32400	1.22	21.046	1

モデルスクリプト内で利用するためには,以下のようにオブジェクトを作成し,そのオブジェクトに参加させるコラムをadd_columnで指定する.コンテナに含まれる全てのコラムを加えるためにはコンテナのindexを指定する.一方,コンテナ内の指定したコラムを個別に加える場合には,コンテナのindexに加えて,コンテナ内のコラムのindexを与える.一つのオブジェクトに加えるコラム数には上限がないが,時系列データで与えられたフラックスを全てのコラム(そして含まれるセル)で分配する事になる.もちろん,任意の数の河川(FluxColumnBoundaryオブジェクト)を生成し,計算を進めることができる.

river = fantom.ColumnFluxBoundary(water_body, "time_series.txt")
river:add_column(22, 54) -- コンテナに含まれる全てのコラム
river:add_column(22, 54, 0, 0) -- コンテナ内の特定のコラム

コンテナ(22, 54)の解像度が(2,2)の場合にadd_column(22, 54, 0, 0)で対象となるcolumnの場所は以下の図のようになる.

また,時間進行のループ内において,陰的スキームが始まる直前に以下のように境界条件を更新する必要がある.

for counter = 0, total_count do
  time = dt*counter
  -- other explicit terms
  river:update(time)
  -- implicit terms
end