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}\) ステップでの値に相当する.