はじめに
この度、研究でN体シミュレーションを行うことになり、FastPMを使うことになりました。FastPMには、N体シミュレーションを行うコードで、Pythonのラッパーも用意されています。ですが、計算クラスター上ではC言語の方が都合がいいため、C言語でコンパイルしました。今回は、FastPMのインストール方法と、実際にN体シミュレーションを行う方法をまとめます。
環境
- gcc version 9.3.0 (crosstool-NG 1.24.0.131_87df0e6_dirty)
- CentOS Linux 7 (Core)
- GSL 2.7.1
- FFTW 3.3.4
- PFFT 1.0.8
- FastPM 1.0.54fdc781e6
まずは必要なライブラリ「gsl」と「pfft」をインストールします。GCCは既にインストールされているものとします。
gslのインストール
gslは、GNU Scientific Libraryの略で、科学技術計算に必要な関数をまとめたライブラリです。インストールにあたっては、こちらの記事を参考にしました。
gslの公式サイトから、最新版のソースコード(今回はgsl-2.7.1)をダウンロードします。その後、展開してディレクトリに移動します。
wget https://mirror.ibcp.fr/pub/gnu/gsl/gsl-latest.tar.gz
tar zxvf gsl-latest.tar.gz
cd gsl-2.7.1
次に、インストール先のディレクトリを指定して、コンパイルします。今回は、計算クラスター上の個人作業ディレクトリ/lustre/work/akira.tokiwa/local/gsl-2.7.1にインストールすることにします。
INSTALL_DIR=/lustre/work/akira.tokiwa/local
./configure --prefix=$INSTALL_DIR/gsl-2.7.1
make
make install
これでgslのインストールは完了です。
pfftのインストール
pfftは、Parallel FFTの略で、並列FFTを行うためのライブラリです。インストールにあたっては、公式サイトを参考にしました。
まずは、pfftの前提となるfftwのソースコードをダウンロードとコンパイルをします。今回は、fftw-3.3.4を使用します。MPI環境の有無によって、コンパイル方法が異なります。今回は、諸々のMPIオプションを付けてコンパイルします。
configure: error: don't know how to enable OpenMP とのことだったので--enable-openmpは外しました。
wget http://www.fftw.org/fftw-3.3.4.tar.gz
tar zxvf fftw-3.3.4.tar.gz
cd fftw-3.3.4
./configure --prefix=$INSTALL_DIR/fftw-3.3.4 \
--enable-mpi --enable-threads --disable-shared \
CC="mpicc" F77="mpif90" MPICC="mpicc" \
CFLAGS="-O3" FFLAGS="-O3" \
MPILIBS=" "
make -j 4
make install
次に、pfftのソースコードをダウンロードして、コンパイルします。今回は、pfft-1.0.8を使用します。
wget http://www.tu-chemnitz.de/~potts/workgroup/pippig/software/pfft-1.0.8-alpha3-fftw3.tar.gz
tar zxvf pfft-1.0.8-alpha3-fftw3.tar.gz
cd pfft-1.0.8-alpha3-fftw3
./configure --prefix=$INSTALL_DIR/pfft-1.0.8-alpha3-fftw3 --disable-shared \
CPPFLAGS="-I$INSTALL_DIR/fftw-3.3.4/include" \
LDFLAGS="-L$INSTALL_DIR/fftw-3.3.4/lib64" \
FC=mpif90 CC=mpicc MPICC=mpicc MPIFC=mpif90
make -j 4
make install
これでpfftのインストールは完了です。
FastPMのインストール
先程インストールしたgslとpfftのパスを通しておきます。
#!/bin/bash
INSTALL_DIR=/lustre/work/akira.tokiwa/local
# Define the GSL paths based on the provided directory
GSL_DIR="$INSTALL_DIR/gsl-2.7.1"
GSL_LIB="$GSL_DIR/lib"
GSL_BIN="$GSL_DIR/bin"
# Define the fftw3 paths based on the provided directory
FFTW3_DIR="$INSTALL_DIR/fftw-3.3.4"
FFTW3_LIB="$FFTW3_DIR/lib"
FFTW3_BIN="$FFTW3_DIR/bin"
# Modify PATH and LD_LIBRARY_PATH
export PATH="$GSL_BIN:$FFTW3_BIN:$PATH"
export LD_LIBRARY_PATH="$GSL_LIB:$FFTW3_LIB:$LD_LIBRARY_PATH"
FastPMのソースコードをクローンし、READMEに従ってMakefile.localをコピーし編集します。makeを実行すると、srcディレクトリ下にfastpmという実行ファイルが生成されます。
git clone https://github.com/fastpm/fastpm.git
cd fastpm
cp Makefile.local.example Makefile.local
make
これでFastPMのインストールは完了です。
FastPMの動作確認
testsディレクトリ下にあるrun-test-nbodykit.shと同様のジョブスクリプトを作成します。
#!/bin/bash
#PBS -N fastPM_test
#PBS -o /lustre/work/akira.tokiwa/fastpm/log/test.out
#PBS -e /lustre/work/akira.tokiwa/fastpm/log/test.err
#PBS -l select=1:ncpus=4
#PBS -l walltime=99:00:00
#PBS -q mini
cd /lustre/work/akira.tokiwa/fastpm/
mpiexec -n 4 ./src/fastpm ./tests/nbodykit.lua
ジョブを投入し実行が問題なく終了すれば、nbodykitディレクトリが作成され、その中のfastpmディレクトリにnbodykit形式で異なる赤方偏移zでのダークマター粒子スナップショットが保存されているはずです。これがN体シミュレーションの結果となります。
まとめ
以上で、FastPMのインストールと動作確認は完了です。今回は、計算クラスター上でのインストールを行いましたが、ローカル環境でも同様にインストールできると思います。