平林孝太@東京大学研究のはなし、個人的なメモ書きなどのページになる予定です。。。 |
3rd-order TVD Runge-Kutta method
TVD条件を満たすように開発された Runge-Kutta 法の亜種. メモリを食わない3次精度のものがよく使われるが, 本来は空間精度に合わせるべし.
実装
時間・空間に関する偏微分方程式を考える. MHD方程式なんかはその典型. 空間方向にはメッシュを切って離散化すると, 次のような常微分方程式の形に書ける:
\[ \frac{d \mathbf{U}}{d t} = \mathcal{L} \left( \mathbf{U} \right) \]
ここで \(\mathcal{L}\) は時間微分以外の項をまとめたもの.
3次の TVD Runge-Kutta では, これをオイラー前進差分の組み合わせで3ステップに分けて積分する.
\begin{align*} \mathbf{U}^{(1)} &= \mathbf{U}^{n} + \Delta t \ \mathcal{L} \left( \mathbf{U}^{n} \right) \\ \mathbf{U}^{(2)} &= \frac{3}{4} \mathbf{U}^{n} + \frac{1}{4} \left( \mathbf{U}^{(1)} + \Delta t \ \mathcal{L} \left( \mathbf{U}^{(1)} \right) \right) \\ \mathbf{U}^{n+1} &= \frac{1}{3} \mathbf{U}^{n} + \frac{2}{3} \left( \mathbf{U}^{(2)} + \Delta t \ \mathcal{L} \left( \mathbf{U}^{(2)} \right) \right) \end{align*}
計算中は \(\mathbf{U}^n\) のみを保存しておけば \(\mathbf{U}^{(1)}\) や \(\mathbf{U}^{(2)}\) は in-place に更新してよいので, メモリ消費的にはお得. 4次精度になるとこの特長はなくなる.
ちなみに Courant 数は 0.6 くらいまでとれたような気がする.
サブステップの時間のとり方
Runge-Kutta のようなサブサイクルを用いる方法一般に言えることだが,
時間に陽に依存する境界条件やソース項を考える際には注意が必要.
\(\mathbf{U}^{(1)}\) は \(n+1\) ステップで評価しなければいけないし,
\(\mathbf{U}^{(2)}\) は \(n+\frac{1}{2}\) ステップでの値に相当する.