N体シミュレーションコード「FastPM」インストールと動作確認

# はじめに
この度、研究でN体シミュレーションを行うことになり、[FastPM](https://github.com/fastpm/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の略で、科学技術計算に必要な関数をまとめたライブラリです。インストールにあたっては、[こちら](https://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA:gsl)の記事を参考にしました。

gslの[公式サイト](https://www.gnu.org/software/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を行うためのライブラリです。インストールにあたっては、[公式サイト](https://www-user.tu-chemnitz.de/~potts/workgroup/pippig/software.php.en#scripts)を参考にしました。

まずは、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のパスを通しておきます。
```setup_env.sh
#!/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と同様のジョブスクリプトを作成します。
```run-test-fastpm.job
#!/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のインストールと動作確認は完了です。今回は、計算クラスター上でのインストールを行いましたが、ローカル環境でも同様にインストールできると思います。