PARIS Code Simulatorをインストールして使ってみる

この記事は流体解析のオープンソースの一つであるPARIS Code Simulatorをインストールして計算を走らせてみるまでの備忘録です．

# PARIS Simulator Code

PARIS Simulator CodeはフランスのSephane Zaleskiを中心として開発されている混相流解析ソルバーであり， A PArallel Robust Interface Simulator that combines VOF and Front-Trackingの頭文字をとってPARISと呼ばれている． PARISは以下の3種類のソースコードをマージして作られたものである．

* FTC3D2011
* Surfer VOF code
* Gerris Flow solver

このうち，FTC3D2011が[Gretar TryggvasonのFront Tracking](https://deepblue.lib.umich.edu/bitstream/handle/2027.42/30059/0000428.pdf?sequence=1)に対応するコードである． PARISで使われている数値スキームの特徴については書籍[Direct Numerical Simulations of Gas–Liquid Multiphase Flows](https://www.cambridge.org/core/books/direct-numerical-simulations-of-gasliquid-multiphase-flows/C6282C4E426F95C1AC8642DA7569CF0C)を参照されたい．

今回は一般的なLinux OS (Ubuntu 18.04)にPARISを導入する方法を試みる．

# PARISのバージョンと入手先

PARISはZaleski教授の[HP](http://www.ida.upmc.fr/~zaleski/paris/)から入手できる．　`paris-stable.tar.gz`という名前のtarアーカイブで提供されているのでこれをダウンロードする．

以降，端末でのコマンド操作を順次示す．

```bash
$ cd
$ wget http://www.ida.upmc.fr/~zaleski/paris/paris-stable.tar.gz
$ tar zxvf paris-stable.tar.gz
$ cd paris-stable
```

解凍したparis-stableディレクトリには，`Devel`，`Documentation`，`Tests`，`util`というサブディレクトリと，ソースコード，インストールの説明文(`INSTALL`)，メイクファイル(`Makefile`)などが入っている．インスールの手順はZaleskiのHPよりは`INSTALL`に詳しいので、それに沿って進める．

# Fortranのインストール

PARISのソースコードは主にFortranで書かれているため，Fortranコンパイラが入っていない場合はgfortaranをインストールする．

```bash
$ sudo apt-get install gfortran
```

# gitのインストール

一部のライブラリはgitレポジトリからダウンロードするため，`git`が入っていなければインストールする．

```bash
$ sudo apt-get install git
```

# Vofiのインストール

`INSTALL`の説明には，PARIS本体以外に，

* Vofi: VOF関数の初期値作成
* HYPRE: 高速なPoissionソルバー
* SILO: 並列分割データの圧縮出力

などのライブラリもインストールした方がよいとされている．

まず，Vofiをインストールする．

```bash
$ git clone https://github.com/VOFTracking/Vofi
$ cd Vofi
$ ./configure
$ make
$ sudo make install
```

Vofiは標準では`/usr/local`にインストールされるため，ユーザのホームディレクトリにインストールしたい場合は以下のように`prefix`をつけてインストールする．

```bash
$ ./configure --prefix=/home/hoge/Vofi
$ make
$ sudo make install
```

# HYPREのインストール

次にHYPREをインストールする．

```bash
$ cd
$ wget http://computation.llnl.gov/projects/hypre-scalable-linear-solvers-multigrid-method/download/hypre-2.11.2.tar.gz
$ tar zxvf hypre-2.11.2.tar.gz
$ cd hypre-2.11.2/src
$ ./configure
$ make
$ sudo make install
```
# SILOのインストール

最後にSILOをインストールする．

```bash
$ cd
$ wget https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo/silo-4.10.2/silo-4.10.2.tar.gz
$ tar zxvf silo-4.10.2.tar.gz
$ cd silo-4.10.2
$ ./configure
$ make
$ make check
$ sudo make install
```

# PARIS本体のインストール

PARISをコンパイルする前に，`Makefile`を一部編集して修正する．

```bash
$ cd
$ cd paris-stable
$ vi Makefile
...
#SILO_DIR = $(HOME)/cfd/libs/silo-4.10.2
SILO_DIR = $(HOME)/silo-4.10.2

#HYPRE_DIR = $(HOME)/cfd/libs/hypre-2.10.0b/src/lib
HYPRE_DIR = $(HOME)/hypre-2.11.2/src/lib
...
#VOFI_DIR = $(HOME)/lib
VOFI_DIR = /usr/local/lib
```

`Makefile`の編集が終わったら，オプションをつけて`make`する．

```bash
$ make HAVE_VOFI=1 HAVE_SILO=1
```

先にコンパイルしたVofi及びSILOをライブラリリンクするオプションをつけたが，このとき以下のエラーが出て正常にコンパイルができない．

```bash
vofmodules.o: 関数 `__module_vof_MOD_levelset2vof' 内:
vofmodules.f90:(.text+0xe71e): `get_fh_' に対する定義されていない参照です
vofmodules.f90:(.text+0xe960): `get_cc_' に対する定義されていない参照です
vofmodules.o: 関数 `__module_vof_MOD_initconditions_vof' 内:
vofmodules.f90:(.text+0x116dc): `get_fh_' に対する定義されていない参照です
vofmodules.f90:(.text+0x1191f): `get_cc_' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
Makefile:78: recipe for target 'install' failed
make: *** [install] Error 1
```

`vofmodules.f90`内で`get_fh`，`get_cc`の参照が間違っているので，`sed`で修正する．

```bash
$ sed -i 's/get_fh/vofi_get_fh/g' vofmodules.f90
$ sed -i 's/get_cc/vofi_get_cc/g' vofmodules.f90
```

再度コンパイルして実行モジュール`paris`が生成される．

```bash
$ make HAVE_VOFI=1 HAVE_SILO=1
```

最後に`PATH`の設定をするため，`.bashrc`の末尾に追記する(`bash`を利用する場合)．

```bash
$ cd
$ vi .bashrc
...
PATH="$PATH:$HOME/bin"
```

`PATH`の設定を反映させる．

```bash
$ . .bashrc
```

# PARISのテスト計算

`paris-stable`ディレクトリの中に`Tests`ディレクトリがあり，いくつかのテスト計算が置かれている．

```bash
$ cd $HOME/paris-stable/Tests
$ ls
Bubble             FrontBubble        PresDisk         VOF
CapWave            FrontDroplet       PresPoiseuille   beginreport.html
ComplexSolid       Height             README.txt       clean.sh
Curvature          InflowDisk         RainDrop         distribute_inputfiles.sh
CylinderAdvection  Kelvin-Hemlholtz   RainDrop4paper   endreport.html
Disk               Mini               ShearMultiphase  runlongtests.sh
Droplet            ParasiticCurrents  Speed            runtests.sh
ExpandingCavity    PoissonMG          TagDrop
```

`Bubble`，`Droplet`に対応して`FrontBubble`，`FrontDroplet`があり，VOF法で解くケースとFront Tracking法で解くケースの両者が用意されている．`FrontBubble`のケースを実行してみる．

```bash
$ cd
$ mkdir paris-run
$ cd paris-run
$ cp -r ../paris-stable/Tests/FrontBubble ./
$ cd FrontBubble
$ ls
inputlong   inputvof     plot.sh   reference_Ek.txt
inputshort  longtest.sh  plot4.gp  run.sh
$ ./run.sh &
```

ここで実行したスクリプト`run.sh`の中身は以下のようになっている．

```bash
#!/bin/bash
#set -x

rm -fR input out
ln -s inputshort input
mpirun -np 3 paris > tmpout
echo `awk ' /Step:/ { cpu = $8 } END { print "cpu = " cpu } ' < tmpout`
rm -f input

cat stats | awk '{ print $1 , $13+$14 }' | tail +2 > test_Ek.txt
sh plot.sh

precision=2e-1
pariscompare test_Ek.txt reference_Ek.txt $precision 1 0

GREEN="\\033[1;32m"
NORMAL="\\033[0m"
```

`mpirun`で3並列計算を実行し，出力から`gnuplot`によるプロットを生成する(グラフを画像出力するには`plot4.gp`を修正する必要がある)．計算が終了すると，`out`ディレクトリが作られ，この中に計算結果がまとめられており，ParaViewやVisItを用いて可視化ができる．

# まとめ

今回，PARISのインストールを行い，計算実行までを確認した．PARISは直交不等間隔格子のみで計算が可能であり(物体形状の表現にはカットセルを用いると思われる)，どちらかというと基礎研究向けのソルバーである．しかしながら，Fortranで書かれていて(Modernかと聞かれるとどうかはわからない)，記事を書いている私には親しみやすいので細々と機能を検証するつもりである．