工学系大学院生のブログ

2人の大学院生による雑記ブログ

第6-1回 時間二次精度化(ルンゲクッタ法、有限体積法)[python]



第5回では、有限体積法を用いてSod shock tubeに対する数値解析を行い、次の結果を得ました。

青:厳密解  赤:解析解


定性的に特徴は捉えられていますが、時間、空間ともに一次精度であるため、急峻な変化をとらえることができていません。(x=0.7,0.85付近)



そこで、第6回を通して時間、空間の高次精度化を行いたいと思います。




まず、ルンゲクッタ法を用いて時間の二次精度化を行います。


この方法は、時間一次精度の数値流束をnステップとn+1ステップにおいて求め平均化し、n+1/2ステップの数値流束を用いて時間を進めるという方法になります。


式としては次のようになります。*は結果として用いる値でなく、計算途中で出てきた値と思ってください。



一次精度で次の時間の保存量を求めます。
$$(Q^*_i)^{n+1}=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^n- \tilde{f}_{i-1/2}^n)$$



一次精度で次の時間のフラックスを求めます。(FVSなど、右辺の取り方は様々)
$$ (\tilde{f}^*_{i+1/2})^{n+1}=F((Q^*)^{n+1} ) $$


nとn+1のフラックスの平均を取り、二次精度のフラックスを作ります。
$$\tilde{f}^{n+1/2}_{i+1/2}=\frac{1}{2}( \tilde{f}^*_{i+1/2})^{n+1} + \tilde{f}_{i+1/2})^{n} )$$


上記のフラックスを用いて、時間を進めます。
$$Q^{n+1}_i=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^{n+1/2}- \tilde{f}_{i-1/2}^{n+1/2}) $$


この方法は時間項に対して何もしていませんが、フラックスの時間項が変化しており、全体として時間二次精度になっています。




方法としては終わりですが、プログラミングの際にフラックスの枠を一つで済ませるように、プログラミング用の式を書いておきます。


一次精度で次の時間の保存量を求めます。
$$(Q^*_i)^{n+1}=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^n- \tilde{f}_{i-1/2}^n)$$


一次精度で次の時間のフラックスを求めます。(FVSなど、右辺の取り方は様々)
$$ (\tilde{f}^*_{i+1/2})^{n+1}=F((Q^*)^{n+1} ) $$


上記の値を用いて、時間を進めます。
$$Q^{n+1}_i=\frac{1}{2}(Q^n_i+(Q^*_i)^{n+1}-\frac{\Delta t}{\Delta x}(
(\tilde{f}^*_{i+1/2})^{n+1} –
(\tilde{f}^*_{i+1/2})^{n+1} ))$$




次回は空間高次精度化を行いたいと思います。


*第6-5回にコードは書いてあります。


by hide

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL: https://teru-hide.com/cfd-second-order-accuracy-runge-kutta/trackback/
にほんブログ村 英語ブログへ
にほんブログ村