セル毎に異なる時間刻みを用いるか、それともセル全体で統一するかには選択の余地がある。 文献では後者を選択している。 この実装に一手間かかった。
これまでちゃんと知らなかった話だったので、ためになった。 特性理論からこのようになる様子。
亜音速流入 (subsonic inflow)
2変数(密度、温度)を固定
1変数(速度)を変動させる
超音速流出 (supersonic outflow)
3変数(密度、温度、速度)を変動させる
変動させる場合にはいずれも線形外挿を用いる。
文献での例と同様に1400ステップ回したときのマッハ数分布。 横軸に流れ方向位置、縦軸にマッハ数をとっていて、とりあえず解析解に一致する結果を得ることができた。 JuliaのPlots (GR) でプロットしている。
以下ははまりポイント:
最後に収束解が得られれば時間精度はいらないと思って、MacCormack法ではなく空間1次後退差分でやったら計算が発散した。2次中心でもまあ発散するよねという感じでうまくいかない。どこが悪いのかわからなかったので、結局1ステップ実行後の結果が一致するところまで検証を追い込む必要があった。
文献 [1] ではとても丁寧なことに、1ステップ実行後の結果が詳細に記述されている。はじめはここまではいらないだろうと思ったものの、おかげで助けられた。
MacCormack法は単に精度向上だけではなく、計算の安定性にも寄与していると考えられる。
Juliaの継続行の解釈ではまった。以下のコードでは所望の結果が得られないということに気付くまでに時間を要した。
今のところうまい解決策を思い当たっていないけど、とりあえず括弧で全部くくることで回避している。
drdt = - r[i] * ((u[i+1] - u[i]) / dx)
- r[i] * u[i] * ((log(a[i+1]) - log(a[i])) / dx)
- u[i] * ((r[i+1] - r[i]) / dx)
drdt = (
- r[i] * ((u[i+1] - u[i]) / dx)
- r[i] * u[i] * ((log(a[i+1]) - log(a[i])) / dx)
- u[i] * ((r[i+1] - r[i]) / dx)
)
断面積比が与えられたときのマッハ数は以下の式から求まる…はずだが、この式を解くのはそう単純でないことに気付いた。文献 [1] には陰解法で解けるとだけ書いてあって、具体的な解法は示されていない。調べたらNASAのサイト (Area Ratio)に計算スクリプトが用意されていたのでありがたい。ダウンロードしたアプレットを斜め読みするに、ニュートン法かなにかで解いている様子だったけど細かいところまでは追えていない。亜音速側の解がうまく得られなかったため、グラフにはスロート以降のの解だけをプロットしている。
準1次元ノズルフローをシミュレーションで解いて、解析解に一致するところまでを確認した。 次回は計算条件を変えて実行するなどやってみたい。
[1] | John D. Anderson, "Computational Fluid Dynamics: The Basics With Applications," McGraw-Hill Inc. (1995) |
[2] | ここでは段階、階層の意か。なお本文でのつづりはeschelonとなっている |