適応型メッシュ細分化(AMR)
理論:必要な場所だけ細かくする
概要
液滴が落ちて水面に当たるCFDをしたいのですが、界面を細かく表そうとすると格子が何千万にもなってしまいます。
界面は計算領域のほんの一部なのに、全体を同じ細かさにしているからだね。AMRは計算の途中で解を見て、界面や衝撃波のように値が急に変わる場所だけ格子を分割し、何も起きていない場所は粗いままにする。界面が動けば細かい場所も一緒に動く。うまく使えば、同じ精度でセル数を1桁以上減らせることも珍しくない。ただし、どこを細かくするかを決める『指標』の選び方と、粗い格子と細かい格子の境目の扱いに注意が要るんだ。
細分化の指標
$h_i$ はセルの大きさ、2階微分は解の曲がり具合。線形補間の誤差はおよそ $h^2$ と曲率の積なので、これが大きいセルを分割し、十分小さいセルは粗くする。実際のソルバーでは、勾配の大きさ、体積率(界面)、渦度など、問題に合った量を指標にする。
時間刻みへの影響
陽解法では時間刻みが最も小さいセルで決まる。AMRで1段細かくするたびにセルの大きさは半分になり、時間刻みも半分になる。細かいセルだけ小さな刻みで進める『局所時間刻み』(サブサイクリング)を使うと、全体の計算時間を抑えられる。
天体物理と衝撃波から始まった
AMRの考え方は1980年代、BergerとOligerが双曲型の方程式(衝撃波などの波を扱う式)のために、細かい格子のブロックを重ねていく方法として示し、Bergerと Colellaが衝撃波の計算に広げた。星の爆発や銀河の形成のように、広い空間の中で小さな領域だけが激しく変化する天体物理の計算で特に重宝された。今では、自由表面の流れ、燃焼、噴流など、商用のCFDソフトでも普通に使える機能になっている。
計算例:急な前線を表すのに必要なセル数
区間[0, 1]で $u = \tanh((x-0.5)/w)$ という急な前線を、各セル内の線形補間で表す。誤差の最大値がしきい値以下になるのに必要なセル数を、一様な格子と、誤差の大きいセルだけ2分割していく方法(AMR)で比べた。
| 前線の幅 | 許容誤差 | 一様な格子 | AMR | 比 | 最小セル |
|---|---|---|---|---|---|
| 0.01 | 1% | 317 | 26 | 12 | 0.0020 |
| 0.01 | 0.1% | 992 | 56 | 18 | 0.0010 |
| 0.002 | 1% | 1,545 | 30 | 52 | 0.00049 |
| 0.002 | 0.1% | 5,009 | 70 | 72 | 0.00012 |
前線が鋭いほど、AMRの効果が大きいんですね。
そう。一様な格子は前線の幅に合わせて全体を細かくしないといけないけど、AMRは前線の近くだけ細かくすればいい。これは1次元の話で、2次元・3次元では一様な格子のセル数は細かさの2乗・3乗で増えるのに、AMRは前線(線や面)の近くだけなので、差はもっと大きくなる。ただしAMRのセルは細かさがばらばらなので、1セルあたりの計算の手間やデータの管理は一様な格子より重い。セル数の比がそのまま計算時間の比にはならないことも覚えておこう。
使い方と注意点
設定のポイント
- 指標は、見たい現象を最もよく表す量を選ぶ(界面なら体積率、衝撃波なら圧力勾配、渦なら渦度)。
- 最大の細分化レベルを決め、最小セルが現象の最小の大きさを表せるか確かめる。
- 細分化の頻度を決める。前線がセル1個分より速く動くと、細かい領域の外に出てしまう。
- しきい値を変えて、結果が変わらないことを確かめる(AMRでのメッシュ独立性)。
注意点
- 粗密の境目:隣り合うセルの大きさの比は2倍までに抑える。境目で保存量が漏れない補正も必要。
- 壁の近く:境界層のインフレーション層とAMRは相性が悪いことがある。壁の近くは固定の格子にすることが多い。
- 並列計算の負荷:細かい領域が一部のプロセッサに集まると、計算が偏って遅くなる。負荷の再配分が要る。
「細かくする場所が遅れてついてくる」
高速で動く火炎や衝撃波をAMRで追うと、細かい領域が前線に追いつかず、前線が粗い格子の中に出てしまうことがある。そうなると前線がぼやけ、指標の値も小さくなって、さらに細かくされないという悪循環になる。細分化の間隔を短くするか、前線の少し先まで余裕をもって細かくする(バッファ層)のが対策だ。静止した現象ではうまくいったAMRの設定が、動く現象ではそのまま使えないことがあるので、前線の位置と細かい領域の位置を時間を追って確かめよう。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 指標が現象に合わない | 必要な場所が粗いまま | 現象を表す量を選ぶ |
| 細分化の間隔が長い | 前線が粗い格子に出る | 間隔を短く・バッファ層 |
| しきい値の感度を見ない | 結果が設定に依存 | しきい値を変えて比較 |
| セル数の比で時間を見積もる | 計算時間を過小評価 | 小さい刻み・管理の負荷も考慮 |
| 粗密の境目の保存性を無視 | 質量などが漏れる | 保存型の補正を使う |
メッシュの細かさの影響を自分でも試したいです。
メッシュ収束ツールとメッシュ独立性検討ツールでメッシュの細かさと誤差、CFDメッシュ品質チェックで格子の品質を試せるよ。ほかの格子の工夫はオーバーセット格子、インフレーション層、多面体メッシュ、確かめ方はメッシュ独立性の記事にある。
関連トピック
なった
詳しく
報告