適応格子細分化(AMR)
衝撃波や燃焼面だけを細かく解く適応格子の内部動作を、木構造・細分化基準・フラックス整合の原理から理解すると、精度を落とさず計算量を桁で削れる理由が説明できるようになる。
- AMRは解が急変する領域だけを局所的に細かい格子で解像し、滑らかな領域は粗いまま残すことで、一様細密格子に対し計算量とメモリを大幅に削減する。
- 実装はブロック構造型(一定サイズのパッチを重ねる)と木構造型(セルを再帰的に8分木/4分木で割る)に大別され、細分化基準は勾配・曲率やRichardson外挿による誤差指標で決める。
- レベル間はゴースト層への補間で結合するが、保存則を守るにはフラックス整合(refluxing)が必須で、動く細密領域は負荷分散と密結合する。
なぜ格子を「一様に」細かくしないのか
衝撃波、燃焼面、重力崩壊、乱流の渦など、科学技術計算で興味の対象になる現象の多くは、空間のごく一部でだけ解が急激に変化します。ところが有限差分法や有限体積法で必要な格子解像度は、この最も急峻な部分で決まってしまいます。計算領域全体をその解像度の一様格子で覆うと、実際には滑らかで粗い格子でも十分な広大な領域まで、無駄に細かい格子点を持つことになります。3次元では格子間隔を半分にすると格子点数は8倍、しかも陽解法では時間刻みもCFL条件で半分になり、総計算量は16倍に膨らみます。
適応格子細分化(Adaptive Mesh Refinement, AMR)は、この無駄を断つ手法です。解が急変する領域だけを局所的に細かい格子(高レベル)で覆い、滑らかな領域は粗い格子(低レベル)のまま残します。しかも現象が移動すれば細密領域もそれを追って動的に張り替えます。基盤となる離散化は有限差分法・有限体積法そのもので、AMRはその上に「どこをどれだけ細かくするか」を動的に管理する層を載せた枠組みだと捉えると整理しやすくなります。
ブロック構造型と木構造型
AMRのデータ構造は大きく2系統に分かれます。両者は「細分化の単位」が根本的に異なります。
横にスクロール
ブロック構造型AMR(block-structured / patch-based、Berger–Oliger–Colella法)は、細分化を一定サイズの矩形パッチ(ブロック)の集合として管理します。まず粗い格子(レベル0)で解を進め、細分化が必要と判定されたセル群を矩形で覆うようにクラスタリングし、その矩形領域を細分化率(refinement ratio、通常2)で細かくしたレベル1のパッチを重ねます。同じ操作をレベル1の上にレベル2、と再帰的に積み上げます。各パッチは内部が構造格子なので、パッチ単位ではキャッシュ効率の良い規則的なループが書け、既存の一様格子ソルバーをほぼそのまま再利用できるのが強みです。
木構造型AMR(tree-based / cell-based)は、セルそのものを再帰的に分割します。2次元なら1セルを4分木(quadtree)で4つ、3次元なら8分木(octree)で8つの子セルに割り、細分化が要ればさらにその子を割る、という形で木構造を作ります。細分化の単位がセル1個なので、細密領域の形状を必要な範囲にぴったり合わせられ、ブロック単位で切り上げる無駄(過剰細分化)が出にくい反面、隣接関係が木の探索を要し、間接参照が増える傾向があります。
| 観点 | ブロック構造型(パッチ) | 木構造型(8分木/4分木) |
|---|---|---|
| 細分化の単位 | 一定サイズの矩形パッチの集合 | セル1個を再帰的に分割 |
| 形状の適合性 | 矩形で覆うため周囲に過剰細分化が出やすい | 必要な範囲にほぼ密着でき無駄が少ない |
| ソルバー再利用 | パッチ内は構造格子で既存コードを流用しやすい | セル単位で間接参照が増えループが不規則 |
| 隣接アクセス | パッチ内は連続、パッチ境界のみ特別扱い | 木の探索または近傍リンクが必要 |
| 代表実装 | AMReX(旧BoxLib)・Chombo・Enzo | p4est・Dendro・RAMSES系 |
細分化率は空間だけの話ではありません。陽的な時間積分ではCFL条件により、空間刻みを1/2にした高レベルは時間刻みも1/2にする必要があります。このため多くのAMRはサブサイクリングを採用し、粗い格子が1ステップ進む間に細かい格子は2ステップ進めます。レベルが1つ上がるたびに時間ステップ数が倍になるこの入れ子構造が、レベル間の解の受け渡しタイミングを規定します。
細分化基準と誤差指標
「どのセルを細分化するか」を決めるのが細分化基準(refinement criterion)で、AMRの精度と効率を直接左右します。方式は大きく2つに分かれます。
第一は、物理量の特徴に基づくヒューリスティックな指標です。密度や圧力の勾配(隣接セルとの差)、あるいは2階差分による曲率が閾値を超えたセルを細分化対象とします。実装が軽く物理的な直感に合う一方、閾値がケース依存で、なぜその値かを原理的に正当化しにくい弱点があります。
第二は、離散化誤差そのものを推定する誤差指標です。代表がRichardson外挿に基づく推定で、同じ領域を現在の格子で解いた結果と、2倍粗い格子(または2ステップ分の積分)で解いた結果を比較します。手法の打ち切り誤差の次数が既知なら、両者の差から局所打ち切り誤差の大きさを見積もれます。これを閾値と比較し、誤差が許容値を超える領域を細分化します。
Richardson外挿による局所誤差推定(概念、2次精度の例)
誤差 τ ≈ | u_fine - u_coarse | / (2^p - 1)
u_fine : 現在の格子での解
u_coarse : 2倍粗い格子での解
p : 手法の精度次数(2次精度なら p=2)
τ が閾値を超えるセル → 細分化(レベルを上げる)
τ が下限を下回る領域 → 粗視化(デリファイン、レベルを下げる)
AMRは細分化(refine)だけでなく粗視化(coarsen / derefine)も持って初めて意味を持ちます。衝撃波が通り過ぎた後の領域を細かいまま放置すれば、一様細密格子に近づいて利点が消えます。実装では、ヒステリシス(細分化する閾値より粗視化する閾値を十分低く取る)を設け、境界付近で毎ステップ細分化と粗視化が振動しないようにするのが定石です。
隣り合うセル同士のレベル差を1以内に制限する規則を、多くのAMRが課します(proper nesting / 2:1 balance)。レベルが2段以上飛ぶと、境界での補間の次数が保証できず、フラックスの整合も破綻しやすくなるためです。細分化フラグを立てた後、この制約を満たすまで周囲のセルへ細分化を伝播させる「バランシング」処理が必要になります。
レベル間の補間とフラックス整合
異なるレベルの格子は境界で接するため、そこを正しく結合しないと解が破綻します。ここがAMRの実装で最も繊細な部分です。
まず粗→細の受け渡しです。細かい格子は自分の外側にゴースト層(ハロ)を必要としますが、その一部は粗い格子の領域にかかります。ここは粗い格子の値を空間補間(prolongation)して埋めます。補間の次数が本体スキームの精度より低いと、細密領域の境界だけ精度が落ちて誤差の発生源になるため、スキームと整合した次数の補間が求められます。ゴースト層交換そのものの考え方は領域分割法のハロ通信と同型で、AMRではそこにレベル間補間が加わると理解すると見通しが良くなります。
逆に細→粗の受け渡しは平均化(restriction)です。細かい格子で更新された領域は、対応する粗いセルの値を細かいセルの平均で上書きし、細密解の情報を粗い階層へ反映します。この制限/補間の往復は、複数解像度を行き来する点でマルチグリッド法と発想を共有しますが、目的は誤差の減衰ではなくレベル間の解の一貫性維持にあります。
そして保存則を扱う(有限体積法の)AMRで決定的に重要なのがフラックス整合(flux matching / refluxing)です。有限体積法ではセル境界を通過するフラックスの収支でセル値を更新するため、質量・運動量・エネルギーが厳密に保存されます。ところがレベル境界では、粗いセルが計算したフラックスと、そこに接する複数の細かいセルが計算したフラックスの合計が一致しません。両者を放置すると、レベル境界を横切るたびに保存量が生成・消失し、衝撃波の速度がずれるといった致命的な誤差になります。
リフラックス(フラックス補正)の考え方
1. レベル境界で、粗いセル側の面フラックス F_coarse を記録する
2. 同じ面に接する細かいセル群のフラックス総和 ΣF_fine を記録する
(細かい側はサブサイクルで複数回進むので時間積分して合算)
3. 差分 (ΣF_fine − F_coarse) を粗いセルに事後補正として加える
→ レベル境界を挟んだフラックスの不一致を打ち消し、
全体として保存則を厳密に満たす
フラックス整合を怠ると、誤差は「小さく滑らかに」ではなく保存則の破れとして蓄積します。例えば衝撃波管問題でレベル境界を衝撃波が通過するたびに質量が漏れ、波の到達位置が系統的にずれます。勾配ベースの細分化基準は衝撃波を確実に高レベルで覆うため、皮肉にも最も精度が要る場所が必ずレベル境界をまたぐことになり、リフラックスの有無が結果の正否を分けます。
負荷分散との相互作用
AMRの細密領域は現象を追って時々刻々と移動し、しかも高レベルほど時間ステップ数が多いため、計算負荷は空間的にも時間的にも激しく偏ります。一様格子なら領域を等分するだけで済む負荷分散が、AMRでは本質的に動的な問題になります。
各セルの作業コストはレベルごとに異なる(高レベルはサブサイクルの分だけ重い)ため、単純なセル数の等分では均等になりません。実務では各セルにレベル依存の重みを与え、空間充填曲線(モートン順序・ヒルベルト曲線)で全セルを1次元に並べて重みの累積和を等分する方式が広く使われます。木構造型AMRは8分木の走査順が自然にモートン順序と一致するため、この分割と特に相性が良いのが利点です。
- ブロック構造型は矩形パッチ単位で構造格子ソルバーを流用でき、木構造型はセル単位で形状に密着できる。「細分化の単位が矩形か1セルか」で対比できれば十分。
- 細分化基準は勾配・曲率などのヒューリスティックと、Richardson外挿による誤差推定に大別される。後者は打ち切り誤差の次数を使い格子解を比較して誤差を見積もる。
- レベル間は補間(粗→細)と平均化(細→粗)で結合し、有限体積AMRでは保存則を守るためフラックス整合(refluxing)が必須。これを省くと保存量が漏れる。
- 細密領域が動くため負荷分散は動的問題になり、レベル依存の重みを空間充填曲線で等分するのが定石。
まとめ
- AMRは解が急変する領域だけを高レベルの細かい格子で覆い、滑らかな領域を粗いまま残すことで、一様細密格子に対し計算量とメモリを桁で削減する枠組み。
- データ構造はブロック構造型(矩形パッチで構造格子ソルバーを流用)と木構造型(8分木/4分木でセル単位に密着)に大別され、それぞれ再利用性と形状適合性のどちらを取るかで住み分ける。
- 細分化基準は勾配・曲率のヒューリスティックとRichardson外挿による誤差指標があり、細分化と粗視化をヒステリシス付きで対に設計し、2:1バランスを保つのが実装の要点。
- レベル間は補間と平均化で結合し、有限体積AMRではフラックス整合(refluxing)で保存則を厳密に守る必要がある。動く細密領域はレベル依存重みと空間充填曲線による動的負荷分散と密結合する。
HPC・科学技術計算の記事ガイド
適応格子細分化(AMR)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
HPC
比較で見る軸
難易度: advanced / カテゴリ: HPC・科学技術計算 / タグ数: 6
導入後に効く点
実装はブロック構造型(一定サイズのパッチを重ねる)と木構造型(セルを再帰的に8分木/4分木で割る)に大別され、細分化基準は勾配・曲率やRichardson外挿による誤差指標で決める。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- HPC・科学技術計算
- タグ数
- 6
判断チェックリスト
- 自社の用途が「HPC / AMR」に近いか確認する。
- 強みである「AMRは解が急変する領域だけを局所的に細かい格子で解像し、滑らかな領域は粗いまま残すことで、一様細密格子に対し計算量とメモリを大幅に削減する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。