宇宙物理学用磁気流体シュミレーションコードAthena++を試す

はじめに

以前から宇宙物理関連のシミュレーションを試してみたいと思っていて、enzo、gadget、gizmo等を調べていた。たまたまAthenaを知り、調べてみると東北大学の富田賢吾准教授が日本語のページを管理されており、日本語の情報もあるので、試してみることにした。

ここでは、インストールしてチュートリアルを実行するところまでをまとめたのでポストする。

情報源

  1. Athena++ 本家のページ。
  2. Athena++日本語サポートページ 富田さんが管理されている日本語のページ。日本語なのでとても助かる。
  3. Running C++ Numerical Simulations in Docker Athena++をdockerコンテナ環境で動作させる記事。
  4. 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は以下の通り。

gnuplot

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()

matplotlib

上記コードの各文字列を以下の表の様に変更すれば、圧力、速度のグラフが得られる。

密度 圧力 速度
df.rho df.press df.vel1
‘b’ ‘g’ ‘r’
‘Density’ ‘Pressure’ ‘Velocity’

press

vel1

今後について

今回は、電磁流体力学シミュレーションソフトAthena++をインストールして、最初のチュートリアルを実行するところまでできた。今後は、更にチュートリアルを実行して、Athena++をもう少し理解していきたい。

将来的には次のことにチャレンジしていきたい。物理の領域としては、星間ガスから恒星がうまれるところをシミュレーションできたら面白い。計算機インフラの領域としては、複数ノードで分散処理することで高速化を実現したい。