対流項の発散スキームの比較2019年6月26日 | |
はじめに対流項の発散スキームを比較する。 使用バージョンOpenFOAM v6 ファイル対流項の発散スキームの比較scalarTransportFoam で 1 次元問題を解き、対流項 div(phi,T) のスキームを比較する。以下のスキームを比較する。 内挿スキーム
風上差分スキーム
TVD スキーム
NVD スキーム
制限関数適用 (limitWith)
勾配制限
1 次元領域のスカラー値を初期値 0 とし、左端のスカラー値を 1 に設定、左から右に向かって流れを作る。スカラーの前面が領域の中央に来た時のスカラーの分布形状を比較する。速度は 1m/s、格子幅は 0.01 m、時間刻み幅は 1e-4 s、時間のスキームは Euler である。 中心差分・風上差分スキームの結果を示す。 ![]() upwind の結果ががかなりなまっている (数値拡散が大きい) のがわかる。また linear や cubic といった単純な内挿スキームは大きな振動が起こっていることが見て取れる。 差がよく見えるように表示範囲を絞る。 ![]() linearUpwind で少しオーバーシュートやアンダーシュートが起こっている。"linearUpwind with faceLimited" は勾配計算に faceLimited を使用したものだが、制限なしの場合に比べてオーバーシュートやアンダーシュートが抑えられている。QUICK と quadraticUpwindFit (セル界面の値を 2 次多項式で風上側に補間する) の結果はほぼ一致しているが、これは QUICK の定式化の仕方を考えると当然であろう。cubicUpwindFit が拡散が小さくて精度がよさそうであるが、QUICK もそれに近い結果を与えている。 つぎに、代表的な TVD スキーム (2 次精度 TVD スキーム) の結果を示す。 ![]() ちょうど Minmod と SuperBee の間に収まっているのがわかる。制限付き linearUpwind は MUSCL とまったく同じ結果を示している。 Gamma スキームの結果を示す。 ![]() これは TVD スキームと少し異なった傾向を示している。 続いて、limitedLinear スキームの結果を示す。 ![]() これは次の図に示しているように、Gamma スキームの結果に近い。パラメタを 0 にしたものは両者の結果が一致している (重なってしまって見えないが)。安定側であるパラメタ 1 は Gamma のほうが拡散が大きい。 ![]() limitedCubic スキームの結果を示す。 ![]() ちょうどオーバーシュートを抑えた QUICK のような挙動を示している。 limitedLinear と limitedCubic の比較を次に示す。limitedCubic のほうが若干拡散が小さいのがわかる。 ![]() limitWith を使って QUICK に制限関数を適用した結果を示す。 ![]() 拡散が大きくなったりアンダーシュートが起こったり、あまりいい結果は得られていない。UMIST は QUICK に vanAlbada 制限関数を適用したものに近い。QUICK の制限版である UMIST よりもむしろ limitedCubic のほうが QUICK の結果に近い。 linearUpwind に提供する勾配制限のタイプを比較した結果を次に示す。拡散の様子はあまり変わらない。cubic については、パラメータを大きくすると拡散が大きくなっている。 ![]() おまけ: WENOTobias Martin 氏により WENO スキームのライブラリ WENOEXT が公開されている。libWENOEXT を wmake でコンパイルする (最新の OpenFOAM で使うためには多少修正が必要: 修正版)。使う時には controlDict でライブラリの指定がいる。 libs ( "libWENOEXT.so" ); 実行時にメッシュから constant に WENOBase2 あるいは WENOBase3 ディレクトリが作成される。あれば読み込むようになるが、情報がメッシュと関連しているため、メッシュが変わったら消して実行する。 結果を以下に示す。少し振動している。 ![]() ![]() どれを選ぶべきかスキームを選ぶ観点は、以下のものがあげられる。
安定性と精度は相反する。また、オーバーシュート・アンダーシュートを抑えるとどうしても数値拡散が導入されてしまう。安定性を最優先するなら upwind を選べばよい。振動を抑制しつつ精度の高いものが欲しいなら TVD/NVD スキームを使えばよい。TVD/NVD スキームは、安定側から高精度側までいくつも提案されており、性能もさほど変わらないので、どれを選ぶかは好みの問題のように見える。ただし、計算時間の問題がある。以下に、計算時間を計測した結果を示す。 ![]() 各スキームを 10 回ずつ計算して平均を取り、upwind の時間で割っている。つまり、upwind の何倍の時間がかかるかを示している。平均を取っても計測のたびに結果が結構入れ替わるので、ひとつの目安である。だいたい計算手順の複雑さに比例して時間がかかっている。2次精度 TVD は SuperBee が高精度な上に計算速度も速いことになる。UMIST は TVD の中では時間がかかっている。ざっくりいえば、除算があると時間がかかるようである。linearUpwind は TVD より時間がかかっている。勾配制限が入るとさらにかかる。勾配制限付き linearUpwind は "MUSCL" と結果的には同じもののはずだが、計算時間は結構違う。この結果からすると、わざわざ linearUpwind を使う理由はないかもしれない。withLimited 系は時余計な処理を負荷するわけだから、当然時間がかかる。 ほんとか? simpleFoam/pitzDaily ケースでの性能を調べてみた。チュートリアルケースのまま最大ステップ数を 500 に設定し、収束判定で止まるものは止まるままとした。速度の対流項のみスキームを変更する。まず、ステップ数。 ![]() "QUICK with SuperBee" は発散したので除いた。主要な TVD スキームのほとんどは収束せずに最大ステップ数に達している。結果を見ると、速度分布がゆらゆらとゆらめいており、落ち着く様子はない。linearUpwind は upwind についで少ないステップ数で収束している。勾配制限の差はほとんどなさそうである。基本的には勾配制限付き linearUpwind と同一のスキームであると考えられる "MUSCL" が異なる挙動を示している。メッシュの不均一性により差が出たか? つづいては計算時間。 ![]() ステップ数が少ないだけあってか、linearUpwind 系が上位を占めている。1 ステップあたりの計算時間が多くても、トータルの時間でスピードを稼いでいるわけである。勾配制限の差はあまり大きくない。強いて言えば、cellLimited では Venkatakrishnan が一番速いが、そう言い切ってよいのだろうか? 後続に limitedLinear および Gamma が来ている。挙動が似ているためか、性能も似ている。quadraticUpwindFit、cubicUpwindFit は、途中で収束しているにも関わらず時間がかかっている。 1 次元のスカラー輸送での検討結果だけからは予想できない結果になった。問題によって変わりそうでもある。以上の検討結果からなんとなく判断すると、スキーム選択の指針は次のようになろうか。
| |
| PENGUINITIS | |