1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんにちは。
数値相対論用ツールキットの中で、最もやさしいと言われる Einstein Toolkit を動かしてみたので、そのレポートをしたいと思います。
なお、今回使用しているのは 2025/5/29 版です。

数値相対論とは

一般相対論における Einstein 方程式を数値的に解く手法を研究する物理学の分野です。

数値相対論の重要性

検出器の出力は大変小さいため、重力波検出器で検出されるパターンを予め計算しておき、予測と実測を比較することで、どのような物理現象が発生したか調べます。

Einstein Toolkit とは

数値計算フレームワーク Cactus 上で動作する数値相対論ツールキットです。
https://einsteintoolkit.org/

Cactus とは

MPI, OpenMP を隠ぺいする数値計算フレームワークです。PC からスーパーコンピュータまで動作し、1台でも動作するのが特徴です。
またデータインタフェースが厳密に決まっており、FORTRAN90, C, C++ で書かれたプログラムを混在させることができます。

Einstein Toolkit を実行するための前提条件

ハードウェア条件

今回は中性子星の定常状態を扱うため、それほどリソースは喰いませんが、連星系の衝突等をシミュレートするには多くのリソースが必要になります。今回利用した H/W は以下となります。

項目 内容
CPU 13世代 Core i7 13700KF (3.4GHz) 10 core 20 threads
RAM DDR4-2400 128GB

ソフトウェア条件

Windows の WSL2 に Ubuntu 24.04.2 をインストールして実施しました。まず、必要な依存ライブラリをインストールします。

sudo apt-get install build-essential libopenmpi-dev openmpi-bin gfortran git subversion curl gnuplot gnuplot-x11

さらに、

sudo apt-get install pkg-config libfftw3-dev libgsl0-dev libatlas-base-dev libjpeg-dev libssl-dev libhdf5-serial-dev libhwloc-dev

これだけだと udev でエラーが出るため、以下を実行しました。

sudo apt-get install libudev-dev

また、make ではなく、scons を利用するため、これもインストールしておきます。

sudo apt-get install scons

Einstein Toolkit のダウンロードと実行

https://einsteintoolkit.org/download.html
に従ってダウンロードします。最初に curl でダウンローダ GetComponents をダウンロードし、これを使って残りのツールキットをダウンロードします。Cactus は GetComponents を実行する際に、自動的にダウンロードされます。GetComponents はこの他に SimFactry, thornlist もダウンロードします。
ホームページではこのほかのコンポーネントをダウンロードするような記述がありますが、中性子星定常状態の設定ファイルは Cactus ディレクトリの下に揃っていますので、必要ありません。

初期化

Einstein Toolkit を初期化し、マシン情報を生成してファイルに書き込みます。
Cactus ディレクトリに入って操作します。

cd ~/Cactus
./simfactory/bin/sim setup-client

ビルド

Thornlist に従ってビルドします。(とても時間がかかります...。20分くらい)

./simfactory/bin/sim build -j10 --thornlist manifest/einsteintoolkit.th

中性子星の定常状態のシミュレーション

par ディレクトリの下の tov_ET.par ファイルを指定してシミュレーションを実行します。

./simfactory/bin/sim create-run tov_ET \
  --parfile=par/tov_ET.par \
  --procs=1 \
  --num-threads=10 \
  --walltime=0:20:0

成功すると、以下のディレクトリが作成されます。(ホーム直下に作成されることに注意。)

~/simulations/tov_ET/output-0000/tov_ET

Kuibit による可視化

可視化ツールは ParaView や GnuPlot など色々ありますが、ここでは python の可視化ツール Kuibit を使ってみます。python3.7 が必要ですが、Ubuntu 24.04.2 は標準で 3.12.3 が入っていますので、問題ありません。依存ライブラリ(NumPy, SciPy, h5py など)も自動でインストールされます。Tk を使って可視化するため、python3-tk もインストールしておきます。

pip3 install kuibit
sudo apt install python3-tk

手始めに最大密度の時間変化をプロットしてみます。

from kuibit.simdir import SimDir
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

sim = SimDir("/home/minosys/simulations/tov_ET/output-0000/tov_ET")
rho_max = sim.timeseries["maximum"]["rho"]

plt.plot(rho_max.t, rho_max.y)
plt.xlabel("Time [s]")
plt.ylabel("Max Density")
plt.title("Maximum Density over Time")
plt.grid()
plt.show()

スクリーンショット 2025-07-13 084807.png

次に、密度の時間変化をアニメーション化します。ただし、定常状態なので、何も変わりません。😜

from kuibit.simdir import SimDir
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

# シミュレーションディレクトリを指定
sim = SimDir("/home/minosys/simulations/tov_ET/output-0000/tov_ET")

# 変数と平面を指定(例:rho の xy スライス)
grid_xy = sim.gridfunctions["xy"]["rho"]

# 時間ステップを取得
iterations = sorted(grid_xy.iterations)

# 描画の初期設定
fig, ax = plt.subplots()
grid0 = grid_xy[iterations[0]][1]
combined = np.squeeze(np.vstack([d.data_xyz for d in grid0]))
im = ax.imshow(combined,
               origin="lower",
               cmap="viridis")
ax.set_title("Density Slice (xy plane)")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.colorbar(im, ax=ax)

# アニメーション更新関数
def update(i):
    data = grid_xy[iterations[i]][1]
    combined = np.squeeze(np.vstack([d.data_xyz for d in data]))
    im.set_array(combined)
    ax.set_title(f"Density Slice at iteration {iterations[i]}")
    return [im]

# アニメーション作成
ani = animation.FuncAnimation(fig, update, frames=len(iterations), interval=200)

plt.show()

スクリーンショット 2025-07-13 173210.png

おわりに

本稿では、数値相対論のシミュレーションを行うツールキットである、Einstein Toolkit について説明しました。
私が学生だった頃(PC-9801 の時代です)は、PC でこのようなシミュレーションができるようになるとは夢にも思いませんでした。
定常状態の中性子星のシミュレーションは動かないので、あまり面白いアニメーションにはなりませんでしたが、そのうち中性子星の衝突やブラックホールの衝突のシミュレーションを実行してみたいと思います。(それには、現在の PC ではリソースが不足していますが。)
現在、このツールは CUDA 等の GPU アクセラレーションには対応していないので、コア数の多い CPU で実行する方が有利ですが、他のフレームワークでは対応しているものがあるようです。

参考文献

他にもありますが、とりあえず読んだものだけ列挙します。
[1] 柴田 大, 「一般相対論の世界を探る」2007, 東京大学出版会
[2] T.W. Baumgarte, S.L.Shapiro, "Numerical Relativity Starting from Scratch", 2021, Cambridge University Press
[3] 重力波検出器

おまけ: grid_xy[z] の構成

grid_xy[z] はリファインメントレベルリストから構成されます。リファインメントレベルとは、メッシュの粗さを表します。例えば、レベル0は空間分解能が2.0, 2.0、レベル1は空間分解能が1.0, 1.0となります。この例では、レベルが上がるにつれ、分解能が上がります。リファインメントレベルリストの要素を kuibit では component と呼びます。
Component は複数のデータチャンク(patch)を持ち、patch のリストとして表現されます。1つの patch は場の部分集合に相当します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?