はじめに
以前から宇宙物理関連のシミュレーションを試してみたいと思っていて、enzo、gadget、gizmo等を調べていた。たまたまAthenaを知り、調べてみると東北大学の富田賢吾准教授が日本語のページを管理されており、日本語の情報もあるので、試してみることにした。
ここでは、インストールしてチュートリアルを実行するところまでをまとめたのでポストする。
情報源
- Athena++ 本家のページ。
- Athena++日本語サポートページ 富田さんが管理されている日本語のページ。日本語なのでとても助かる。
- Running C++ Numerical Simulations in Docker Athena++をdockerコンテナ環境で動作させる記事。
- Tutorial インストール後に学んでいくチュートリアル、上記の情報源からも行ける。
方針
Athena++はdockerコンテナとしてインストールし、チュートリアルを実行することにする。先ずは、最初のチュートリアルが実行できる、必要最低限のソフトをコンテナ組み込む。必要に応じてコンテナにソフトを組み込んでいくことにする。例えば、今後マルチノードで試す場合にMPI等をdockerコンテナに組み込んでいく。
インストール
最初のDockerfile
インストールして、チュートリアルの「1次元流体力学/磁気流体力学シュミレーション:衝撃波菅問題」を実行できるまでのDockerコンテナを作る。以下はそのためのDockerfileである。
# JupyterLabが使えるDockerイメージ作成用のDockefileを元にして、
# athena++開発・実行で使えるDockerコンテナを作成する。
# ubuntu 22.04の最新版をベースとする。
FROM ubuntu:jammy-20240111
# Set bash as the default shell
ENV SHELL=/bin/bash
# Build with some basic utilities
RUN apt update && apt install -y \
build-essential \
python3-pip apt-utils vim \
git git-lfs \
curl unzip wget gnuplot
# alias python='python3'
RUN ln -s /usr/bin/python3 /usr/bin/python
# install python package to need
RUN pip install -U pip setuptools \
&& pip install numpy scipy h5py mpmath
# Create a working directory
WORKDIR /workdir
# command prompt
CMD ["/bin/bash"]
Dockerを起動
前節で示したDockerfileからコンテナイメージを作成し起動する。
ホストマシン上で、公開されているAthena++ Githubリポジトリからダウンロードすることにし、その領域を/ext/nfs/athena++とした。
$ sudo docker build -t athena ./
$ sudo docker run -it --rm -v /ext/nfs/athena++:/workdir athena:latest
リポジトリからのダウンロード
ホストマシン上でダウンロードした。これで、dockerコンテナからは、/workdir/athenaでダウンロードしたコードが参照できる。
$ cd /ext/nfs/athena++
$ git clone https://github.com/PrincetonUniversity/athena
リグレッションテストを実行
情報源1.ではQuick -StartのTesting that the code runs、情報源2.では、Athena++クイックスタートのとりあえずはしらせてみる。以下は、情報源2.のやり方。
以下は起動したdockerコンテナでの操作。
# pwd
/workdir/athena/tst/regression
# python run_tests.py
・・・
Setup complete, entering main loop...
・・・
実は、上記のリグレッションテストを実行してエラーが出たので、必要なpythonのパッケージを追加した。 前述のDockerfileは、それを反映したもの。
チュートリアルを実行
1D Shock Tubeを実行
以下は起動したdockerコンテナでの操作。
所定のディレクトリに移動
# pwd
/workdir/athena
設定(Makefileを作る)
# python configure.py --prob shock_tube
Your Athena++ distribution has now been configured with the following options:
Problem generator: shock_tube
Coordinate system: cartesian
Equation of state: adiabatic
Riemann solver: hllc
Magnetic fields: OFF
Number of scalars: 0
Number of chemical species: 0
Special relativity: OFF
General relativity: OFF
Radiative Transfer: OFF
Implicit Radiation: OFF
Cosmic Ray Transport: OFF
Frame transformations: OFF
Self-Gravity: OFF
Super-Time-Stepping: OFF
Chemistry: OFF
KIDA rates: OFF
ChemRadiation: OFF
chem_ode_solver: OFF
Debug flags: OFF
Code coverage flags: OFF
Linker flags:
Floating-point precision: double
Number of ghost cells: 2
MPI parallelism: OFF
OpenMP parallelism: OFF
FFT: OFF
HDF5 output: OFF
Compiler: g++
Compilation command: g++ -O3 -std=c++11
コンパイル
# make clean
# make
上記によって、binディレクトリ配下にathenaという名前のa.outが作成される。
以下、dockerコンテナ内の作業用のディレクトリでの操作。以下の例では、/workdir/kenjiが作業用ディレクトリ。
# pwd
/workdir/kenji
# cp /workdir/athena/inputs/hydro/athinput.sod .
# /workdir/athena/bin/athena -i athinput.sod
Setup complete, entering main loop...
cycle=0 time=0.0000000000000000e+00 dt=2.6411070460266146e-03
cycle=1 time=2.6411070460266146e-03 dt=1.5116606032023513e-03
・・・
cycle=175 time=2.5000000000000000e-01 dt=1.4248899766177968e-03
Terminating on time limit
time=2.5000000000000000e-01 cycle=175
tlim=2.5000000000000000e-01 nlim=-1
zone-cycles = 44800
cpu time used = 5.6783000000000000e-02
zone-cycles/cpu_second = 7.8896852931335079e+05
gnuplotによるグラフ化
# gnuplot
gnuplot> set terminal pngcairo
gnuplot> plot "Sod.block0.out1.00025.tab" using 2:3 with lines
gnuplot> set out "xxx.png"
gnuplot> replot
上記で得られたxxx.pngは以下の通り。
matplotlibによるグラフ化
情報源3.の"Data Visualization"のコードによるグラフ化も実行した。
このポストで作成したjupyterlabのdockerコンテナのnotebookのディレクトリをAthena++用のdockerコンテナの/workdirディレクトリになるように、-vで指定すれば、以下の通りmatplotlibで表示できる。
import matplotlib.pyplot as plt
import pandas as pd
# Density
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
df = pd.read_fwf('Sod.block0.out1.00000.tab',skiprows=1)
ax1.plot(df.x1v, df.rho, 'b', linewidth = 3); ax1.set_title('t=0')
ax1.set_ylabel('Density', fontsize=12)
df = pd.read_fwf('Sod.block0.out1.00008.tab',skiprows=1)
ax2.plot(df.x1v, df.rho, 'b', linewidth = 3); ax2.set_title('t=8')
ax2.set_ylabel('Density', fontsize=12)
df = pd.read_fwf('Sod.block0.out1.00016.tab',skiprows=1)
ax3.plot(df.x1v, df.rho, 'b', linewidth = 3); ax3.set_title('t=16')
ax3.set_xlabel('shock tube', fontsize=12); ax3.set_ylabel('Density', fontsize=12)
df = pd.read_fwf('Sod.block0.out1.00024.tab',skiprows=1)
ax4.plot(df.x1v, df.rho, 'b', linewidth = 3); ax4.set_title('t=24')
ax4.set_xlabel('shock tube', fontsize=12); ax4.set_ylabel('Density', fontsize=12)
plt.show()
上記コードの各文字列を以下の表の様に変更すれば、圧力、速度のグラフが得られる。
密度 | 圧力 | 速度 |
---|---|---|
df.rho | df.press | df.vel1 |
‘b’ | ‘g’ | ‘r’ |
‘Density’ | ‘Pressure’ | ‘Velocity’ |
今後について
今回は、電磁流体力学シミュレーションソフトAthena++をインストールして、最初のチュートリアルを実行するところまでできた。今後は、更にチュートリアルを実行して、Athena++をもう少し理解していきたい。
将来的には次のことにチャレンジしていきたい。物理の領域としては、星間ガスから恒星がうまれるところをシミュレーションできたら面白い。計算機インフラの領域としては、複数ノードで分散処理することで高速化を実現したい。