\(\require{physics}\)
河川を追加する方法にいくつかあるが,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