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