#author("2018-05-01T14:06:03+09:00","default:pbcglab_user","pbcglab_user") #author("2018-05-01T14:07:52+09:00","default:pbcglab_user","pbcglab_user") 保存系セミラグランジュ法((M. Lentine, J. T. Gretarsson and R. Fedkiw, "An unconditionally stable fully conservative semi-Lagrangian method", J. Comput. Phys. 230(8), pp.2857-2879, 2011))は,セミラグランジュ法の重みを正規化することで 体積保存を実現した移流法である. スカラー量 &ref(eqa_phi.gif,nolink,70%); の移流方程式 #ref(eqa_csl1.gif,nolink,70%) 密度 &ref(eqa_rho.gif,nolink,70%); を用いた質量保存式 #ref(eqa_csl2.gif,nolink,70%) 移流方程式×&ref(eqa_rho.gif,nolink,70%); + 質量保存式×&ref(eqa_phi.gif,nolink,70%);で, #ref(eqa_csl3.gif,nolink,70%) 積の微分の法則( &ref(eqa_csl4.gif,nolink,70%); )より以下の式が導かれる. #ref(eqa_csl5.gif,nolink,70%) ここで,&ref(eqa_csl6.gif,nolink,70%); とすると,&ref(eqa_hat_phi.gif,nolink,70%); は保存量として扱える. グリッド中心座標を&ref(eqa_Vxi.gif,nolink,70%); とすると,セミラグランジュ法など移流法は基本的には以下のように重み付き和で表すことができる. #ref(eqa_csl7.gif,nolink,70%) ここで,&ref(eqa_wij.gif,nolink,70%); は重みで,&ref(eqa_csl8.gif,nolink,70%); . 本来,完全に質量が保存されるならばどのグリッドにおいても,&ref(eqa_csl9.png,nolink,70%); となるべきであるが, 本来,完全に質量が保存されるならばどのグリッドにおいても,&ref(eqa_csl9.png,nolink,35%); となるべきであるが, 全グリッドで移流した後に &ref(eqa_sigma_j.gif,nolink,70%); を調べると,&ref(eqa_csl10.gif,nolink,70%); や &ref(eqa_csl11.gif,nolink,70%); が起こりうる.これを &ref(eqa_csl12.gif,nolink,70%);と なるように修正する. -&ref(eqa_csl13.gif,nolink,70%);の場合~ &ref(eqa_csl13.gif,nolink,70%);の場合は簡単で,単純に重みを&ref(eqa_sigma_j.gif,nolink,70%);で割る. #ref(eqa_csl14.gif,nolink,70%) -&ref(eqa_csl11.gif,nolink,70%);の場合~ &ref(eqa_csl11.gif,nolink,70%);の場合は,足りない物理量を足す必要がある. そのため,フォワードトレースした結果を追加する. フォワードトレースしたときの重みを &ref(eqa_fij.gif,nolink,70%); とすると正規化した重みは以下となる. #ref(eqa_csl15.gif,nolink,70%) 最終的に正規化した重みを用いて値を更新する. #ref(eqa_csl16.gif,nolink,70%) ***実装 [#d7bab86b] +バックトレースで &ref(eqa_csl17.gif,nolink,70%); を計算し,重み &ref(eqa_wij.gif,nolink,70%); を変数に格納しておく. +各グリッドで &ref(eqa_csl18.gif,nolink,70%); を計算 +&ref(eqa_csl11.gif,nolink,70%); ならば,&ref(eqa_fij.gif,nolink,70%); をフォワードトレースで求め,正規化した重み &ref(eqa_csl19.gif,nolink,70%); を算出.&ref(eqa_csl13.gif,nolink,70%); ならば,&ref(eqa_csl20.gif,nolink,70%); を計算. +正規化した重みで &ref(eqa_phin+1.gif,nolink,70%); を算出