Numerical Relativity 101: GPUで時空をシミュレーションする
著者: James (20k)
公開: 2024/07/31
一言で言うと
家のGPUでブラックホール衝突をシミュレートするための土台を作る話
今回はその第1回 → ブラックホール衝突に向けた地味だが必須の基礎工事
やりたいこと
ブラックホール同士の衝突などは解析的に解けない
→ 直接シミュレートするしかない
CPU実装より数桁速くなる可能性
なぜ難しいのか
普通のシミュレーションは「物が動く」
アプローチ:3+1分解
4次元時空を「3次元空間のスライス」に分解
時間方向に薄切りパンみたいに重ねる
各スライスの変形を順番に計算 → 時空の進化が追える
これがADM形式(Arnowitt–Deser–Misner) 最も標準的な3+1分解
第一の壁: ADM形式は爆発する
そのまま実装すると数値が発散して即死
「ADMの方程式はクソです」(意訳)
BSSN形式とは
ADMと中身は同じだが「爆発しにくい形」に書き直したもの
4つの工夫:
共形分解で計量を分離 ($\tilde{\gamma}_{ij} = W^2 \gamma_{ij}$)
外的曲率$K_{ij}$をトレースとトレースフリー部分に分割
新変数$\tilde{\Gamma}^i$を追加して動的に発展
拘束条件を代入して不安定項を除去
特異点近傍の挙動が良い
$\phi$スキーム(古い)、$\chi$スキーム(中)、$W^2$スキーム(新)
第二の壁: BSSNでも爆発する
「BSSNの方程式もクソです」(意訳)
数値的に安定させるための応急処置が必要
安定化の三種の神器
本来満たすべきルール($\tilde{\gamma}=1$、$\tilde{A}_{ij}$のトレース=0)を毎ステップ手動で補正
2. モーメンタム拘束ダンピング
$\tilde{A}_{ij}$の発展方程式に補正項を追加
「誤差が膨らむなら引き戻す」
画像のブラーみたいな数値フィルタ
6階微分を使って高周波ノイズだけ削る
時間発展のアルゴリズム
陰的解法 → BSSNのような硬い方程式に強い
GPU実装と相性が良い
メモリ消費が少ない
ステップサイズあたりの性能が良い
空間微分
境界条件は周期境界(今回のテストケース用)
2階微分は1階微分を保存して再度1階微分する方式
メモリ効率と精度のバランス良し
実装の特徴
表現木で微分を扱う仕組み
diff1(cY * cA, 0, scale) のように複合式を直接微分できる
32-bit floatで変数保存、16-bit floatで事前計算済み微分
16bitでも結果はほぼ変わらない → メモリ節約
テストケース: ゲージ波
いきなりブラックホールはムリ
解析的に挙動が分かる「波が伝わるだけ」のシンプルな時空でテスト
結果
$128^3$グリッド、タイムステップ0.001
16ms/ステップ(診断なし)
29ms/ステップ(診断あり)
波形は維持
モーメンタム拘束誤差は減少
ハミルトニアン拘束誤差も発散せず
「All in all: Great success」
次回予告
今回は地味な土台作り
個人的なポイント
数値相対論は参考資料が論文に散在していて独学が困難
GPUで時空シミュレーションに挑戦したい人には貴重なリソース
関連