Navier-Stokes方程式での移流項 (u・▽)u について
移流方程式†移流方程式 空間微分の離散化†風上差分(Upwind differencing)†移流方程式の時間微分を前進オイラー法で離散化すると, ![]() 1次元の場合を考える.グリッド ![]() ここで, 風上差分ではその名の通り,風上側の値を使って差分を行う1次精度の離散化法である.
1次元の場合, ![]() 風上差分はCFL(Courant-Friedreichs-Lewy)条件を満たしていれば安定である. CFL条件によるタイムステップ幅の制限は, ![]() タイムステップ幅は通常これよりもさらに小さい数を用いた方がよい.
係数:CFL数(CFL number)を ![]() ここで, 振動と数値拡散†風上差分の離散式( ![]()
さて,上式の微分を下で述べる中心差分で離散化してみる. ![]() 風上差分は中心差分に拡散項を加えたものであることが分かる. 中心差分では非常に大きな振動が発生する. その振動を拡散項により抑えているのが風上差分である. この振動を抑えるという考え方は重要である. より高次の関数を使って補間することで振動を抑えるのが,Lax-WendroffやQUICK,QUICKEST,河村・桑原スキームなどで, 2階,3階の微分を使って抑えるのがENOやWENOである. これらに対して,元の形状を保持するという考え方に基づき,異なるアプローチをとるのがCIP法,RCIP法などである. ちなみにRCIP法では数値拡散が発生してしまうので,これを抑えるためのSTAA手法では逆に数値拡散項を引くことで拡散を抑えている.
中心差分(Central differencing)†流れの速度 ![]() 前進オイラー法と組み合わせると, ![]()
Lax-Wendroff法†Lax-Wendroff法(または,ライス(Leith)法)*3では線形補間の代わりに2次多項式を使った補間で近似を行う.2次多項式の係数を求めるために,グリッドiとその両隣(i-1,i+1)の3つの値 2次多項式は, ![]() ここで各係数は, ![]()
![]() 風上差分と同様に中心差分に拡散項を加えたものになっている.拡散項の係数が異なるのが風上差分との違いである.
QUICK(Quadratic Upstream Interpolation for Convective Kinematics)†QUICK*4は ![]() これを移流方程式の離散化に用いると, ![]()
QUICKEST(QUICK with estimated streaming terms)†QUICKEST(QUICK with estimated streaming terms)はLax-Wendroffの3つ( ![]()
河村・桑原スキーム(Kawamura-Kuwabara scheme)†4次精度の中心差分( 4次精度の中心差分は以下. ![]() 4階微分項の差分式は, ![]() (4階微分の差分式の導出は4階微分を参照). 4階微分項に係数 ![]()
![]()
ENO(Essentially Non-Oscillatory polynomial interpolation)†ENO(Essentially Non-Oscillatory polynomial interpolation)は風上差分を改良し, 3次多項式の形で近似することで3次精度を実現した方法である. ENOの最初のアイデアは *6 で提案され, *7, *8 で数値計算に適用され, *9 でHamilton-Jacobi(HJ)方程式へ適用された(HJ ENO). 移流方程式はHJ方程式であるので,ここからは,HJ ENOについて説明する. HJ ENOの式を述べる前に,準備として差分式を定義しておく.
![]() となる.ここで,iはグリッド番号(座標値 1階差分はグリッド間(i-1/2とi+1/2)で定義される. ![]() ![]() 2階差分はi-1/2とi+1/2での1階差分値を使って,iで定義される. ![]() 同様に3階差分は, ![]() ![]() ENOでは3次多項式により ![]() ここで, ![]()
これらによって, ![]() により
WENO(Weighted Essentially Non-Oscillatory polynomial interpolation)†ENOを改良して,重み付き平均をとることで5次精度を実現したのがWENOである. 3次精度のENOでは ![]() 1+2+4, 1+2+5, 1+3+6, 1+3+7の4パターンになるが, 以下に示すように1+2+5と1+3+6が同じなので,組み合わせは3パターンになる. それぞれさらに展開してφiの式にする. ![]() 差分を ![]() ENO近似は結局この3つのパターンに集約される.
これらの内どれかが状況に応じて用いられる.
WENO(Weighted ENO)はその名の通り,これら3つの凸結合
*10
で ![]() ここで, 問題となるのは
![]() 先ほどの重みの組み合わせ( ![]() ここで, ![]()
![]() これらから, ![]() により
セミラグランジュ(semi-Lagrangian)法†CG分野でももっともポピュラーな方法.下図のように計算点xから-u方向にΔtだけバックトレースして,その位置での速度場u(x_bt, t)を次のステップの速度場u(x, t+Δt)とする方法.下図ではバックトレースに1次関数を用いている. この方法は大きなタイムステップ幅でも安定して計算できるのが大きな特徴である. セミラグランジュ法ではバックトレースした位置での値を周囲の値を使って補間しなければならない. 一番簡単なのは線形補間を用いる方法である.ただし線形補間は1次精度であり,上記の風上差分と同じぐらい拡散が発生する. より高精度な補間法を用いることで拡散を抑えることができる.例えば,上記のENOやWENO,下記で示す方法などである.
BFECC(Back and Forth Error Compensation and Correction)†BFECCはSemi-Lagrangian法においてバックトレースする際に,フォワードトレースにより誤差を求め, その誤差を修正することで高精度に移流を行う方法である. BFECCの最初のアイデアは *14 で提案され, 2005年にCG分野で移流方程式へ適用された *15, *16. Semi-Lagrangian法のバックトレースによる ![]() Lは直線を使った1次精度のバックトレース,uは速度場を表す. ![]() ここで, ![]()
BFECCの式を上の図を使って説明する. ![]() となる.上式から,誤差eは以下のように求められる. ![]() より正確な ![]()
MacCormack†CIP法(Constrained Interpolation Profile scheme)†高次多項式を用いた補間法では補間式を得るためにより多くのグリッドを必要とする.例えば,ENO,WENOだと自身も含めて6グリッド(ENOで実際に用いられるのは4グリッド)の値が必要.風上差分だと2グリッドであったことを考えると3倍になっている.これは当然のことで,高次多項式の係数を得るためには多くの関数値を必要とするからである.このように用いるグリッドが増えると,特に境界付近での処理が難しくなってくる.これに対して,風上差分と同様に2グリッドのみを用いつつ,勾配値を利用することで急激に変化する関数でも対応したのがCIP法(Constrained Interpolation Profile scheme)*17*18*19である*20. CIP法の基本的なアイデアは,移流式をxで微分したとき,その導関数 ![]() グリッド上の4拘束条件 ![]() この手法は非常に簡単に見えるが,その効果は非常に良好である.特に矩形波のように急激に変化する特徴を持つ関数を移流させた場合でも,その形状を維持したまま移流させることができる.
RCIP法(Rational Constrained Interpolation Profile scheme)†有理関数を使ったCIP法. CIP法の欠点は関数を移流させるとき,若干のオーバーシュートがでることである. このオーバーシュートは移流が進んでも大きくはならないため問題がないように思えるが, 水と空気の二相流など,計算したい物理量の差が非常に大きい場合に, 小さなオーバーシュートが大きな問題となる. RCIP法 *21, *22 はこの問題を解決する. RCIP法はCIP法の3次関数の代わりに有理関数 ![]() を用いる.
ここで, ![]() ここで, ![]() RCIP法以外にも,Tangent変換を用いることで オーバーシュートを抑える方法も提案されている *23. Tangent変換を用いた手法では物体界面がシャープに保たれるという特徴を持つ. これは数値流体計算上は非常に有益であるが, グラフィックスで用いた場合,グリッド解像度によっては 液体表面があまり滑らかにならず,保存性も保証されない. RCIP法による密度関数の移流では,界面を表す0から1への変化部分が拡散し, 関数の傾きがなだらかになる. この滑らかな界面はCGでの利用においては美しいレンダリング結果を生むが, シミュレーションでは数値的な不安定性を引き起こす. 密度関数の体積移動によるSTAA手法 *24 を使うことで, 界面拡散を抑制することができる. また,拡散をある程度の幅で制御する方法 *25 もある.
CIP-CSL法†CIP法では格子iのプロファイル CIP-CSL4†CIP-CSL4法*26,では,CIP法の4拘束条件に関数 ![]() つまり, ![]() の5拘束条件を満足させるために以下の4次多項式をプロファイルに用いるのが CIP-CSL4法である. ![]() ここで, 5拘束条件 ![]() CIP法では算出した係数
![]() ここで, ![]() である. CIP-CSL2†CIP-CSL2法*27,*28,*29は,
値 ![]() $D$の微分 ![]() これは1次元の移流方程式と同じであり,
CIP法での 格子点i内での ![]()
![]() CIP法における空間微分値gは ![]()
![]() また, ![]() これらの条件により係数 ![]()
![]() CIP-CSL3†CIP-CSL3法*30,*31,*32は,グリッドセル[ CIP-CSL3法による移流項の解法では,まず,nステップでの値 ![]() である. 移流速度場の方向により以下の補間を使い分ける. ![]() そして, ![]() 左側要素 ![]() ![]()
![]() ここで, ![]() となる.
また,積分値 ![]() ここで, ![]() これらにより算出した ![]() である. slope
体積保存を確かめるためにSin速度場で移流させた結果を示す. 矩形波(0.25 < x < 0.75で1,それ以外で0)をSin速度場(u=sin(πx/5))でt=5まで移流させた結果を示す.グリッド解像度N=128, シミュレーション空間の大きさL=5.0,グリッド幅Δx=L/N,タイムステップ幅Δt=0.1*Δx/uとした.青い線は速度場,灰色の細い線は1秒ごとの履歴を示している. 保存系セミラグランジュ法(Conservative Semi-Lagrangian scheme)†保存系セミラグランジュ法*36は,セミラグランジュ法の重みを正規化することで 体積保存を実現した移流法である. スカラー量 ![]() 密度 ![]() 移流方程式× ![]() 積の微分の法則( ![]() ここで, グリッド中心座標を ![]() ここで, 本来,完全に質量が保存されるならばどのグリッドにおいても,
最終的に正規化した重みを用いて値を更新する. ![]() 実装†
体積保存を確かめるためにSin速度場で移流させた結果を示す. #include(): Included already: Sin速度場 - 設定時間微分の離散化†前進オイラー法†空間微分 ![]() これは前進オイラー法と呼ばれている.これに対して,レベルセット法などでよく用いられるのがTVDルンゲクッタ(Total-Variation Diminishing Runge-Kutta:以下TVD RK)である.ルンゲクッタ法は時間方向の離散化法としてもっともポピュラーな方法であり,次数を上げていけばどんどん精度も上がる(高次(8次精度など)のルンゲクッタ(RK)は衛星の軌道計算などにも用いられているらしい).実際には前進オイラー法は1次精度のRKと同じである.TVD RKはTVDを満たすRKである.また,計算時間はかかるが安定した数値計算が可能な陰解法や予測子・修正子法などもある. ルンゲクッタ法(Runge-Kutta scheme)†ルンゲクッタ法(以下RK)は 移流方程式の時間微分以外の項を ![]() ここで, RK2(改良オイラー法)†2段2次のルンゲクッタは改良オイラー法(modified Eular method)とも呼ばれている. ![]() RK3†3段3次のルンゲクッタの式は以下. ![]() RK4†4段4次のルンゲクッタの式は以下. ![]() 例:矩形波の移流†矩形波(0.25 < x < 0.75で1,それ以外で0)を一定速度(u=0.75)で移流させた結果を示す.グリッド解像度N=128, シミュレーション空間の大きさL=5.0,グリッド幅Δx=L/N,タイムステップ幅Δt=(1.0/CFL)*Δx/uとして,CFL=7, 1.1, 0.535の場合を示す. ルンゲクッタの次数が上がるにつれてより大きなタイムステップでも安定して計算できるようになる.下2つのグラフではCFL=1.1, 0.535と中途半端な数字になっているが,これはRK2,RK3が振動を始める限界を探って設定したためである.ちなみにRK4の限界はCFL=0.49ぐらいなので,RK3とRK4の安定性は大きくは変わらない. TVDルンゲクッタ(Total-Variation Diminishing Runge-Kutta)†ルンゲクッタ法などの解法は1次元,一定幅グリッドではTV安定であるが, 多次元,可変幅グリッドではどうか?という問題がある. これに対して,TVDを満たすルンゲクッタがTVD RK¬e{Shu1988:C.-W. Shu and S. Osher, "Efficient implementation of essentially non-oscillatory shock capturing schemes", J. Comput. Phys. 77, pp.439-471, 1988.};である(TVDについては下参照). 移流方程式の時間微分以外の項を ![]() ここで, これに対して,TVD RKは以下である. ![]() ここで, ![]() TVD RK2†2次精度のTVD RKはRKにおける修正オイラー法(RK2)に対応する.
![]() ?から, ![]() ?から, ![]() ここで,通常のRKの ![]() よって, ![]() TVD RK2では
TVD RK3†
![]() ?から, ![]() ?から, ![]() ここで,通常のRKの ![]()
![]() よって, ![]() TVD RK3では3回の前進オイラー法の組み合わせ(
TVD RK4†
![]() 各係数の導出は長くなりそうなので省略(¬e{Shu1988};参照}. ![]() TVD,TVB†TVD(Total-Variation Diminishing)¬e{Harten1983:A. Harten, "High resolution schemes for hyperbolic conservation laws", J. Comput. Phys. 49, pp.357-393, 1983.};は非線形方程式の収束条件のひとつである. nステップ目でのTV(Total-Variation : 全変動)は以下のように定義される. ![]() これを離散化すると, ![]() となる.そして, ![]() を満たすとき,TV安定であるといい,その数値計算手法はTVDと呼ばれる. また, ![]() を満たすとき,TVB(Total-Variation Bounded)であるという.
ここで アダムス・バシュフォース法(Adams-Bashforth scheme)†
![]() 完全陰解法(full implicit scheme)†オイラーやルンゲクッタなどでは,求めたいステップでの値(例えば ![]() 時間微分以外に ![]() 一つの式に未知数が2つ( ![]() という行列方程式を得る.そしてこれを逆行列計算により解く. ![]() 数値流体解析ではこの行列 クランク・ニコルソン法(Crank-Nicolson scheme)†クランク・ニコルソン法は陰解法の一種であり,時間微分以外の項に ![]() クランク・ニコルソン法は2次精度であり,陰解法であるので行列方程式を解く必要がある. 予測子・修正子法(predictor-corrector scheme)†アダムス・バシュフォース法などの陽解法で予測子を求め,陰的な方法で予測子を修正することで |