Nek5000をインストールしてみた


この記事は流体解析のオープンソースソフトウェアであるNek5000をとりあえずインストールして使ってみるための備忘録として書かれています．Linux or UNIX環境にインストールします．

# Nek5000とは

Nek5000はアメリカのアルゴンヌ国立研究所で開発されているオープンソースの流体解析ソフトウェアである．解析できる流れ場は熱・物質移動を含む非圧縮性流れであり，スペクトル要素法(Spectral Element Method, SEM)を用いて離散化された基礎方程式を解く．スペクトル要素法であるので，用いることができる計算格子は四角形(二次元)，六面体(三次元)のマルチブロック構造格子に限定される．ソースコードはカーネル部分がFortranで書かれており，一部Cも使われている．高精度かつMPIによる超並列計算が可能であるため(ゴードンベル賞を受賞している)，主に欧米での研究用途で使われている．

# ダウンロード

Nek5000の[公式ページ](https://nek5000.mcs.anl.gov/)の"DOWNLOAD"をクリックすると，最新版のv17.0.0-beta2(2017年10月現在)をダウンロードできる．適当なところに移動orコピーして解凍する．

```bash
$ tar zxvf nek5000_v17.0.0-beta2.tar.gz
```

Gitが使える場合はNek5000のGithubからクローンできる．

```bash
$ git clone https://github.com/Nek5000/Nek5000.git -b master
$ git clone https://github.com/Nek5000/NekExamples.git -b master
$ git clone https://github.com/Nek5000/NekDoc.git -b master
$ mv NekExamples ./Nek5000/examples
$ mv NekDoc ./Nek5000/doc
```

ダウンロードしたものとGithubからクローンしたものは中身が異なるので注意が必要である．特にダウンロードしたものには`doc`が含まれていない(ディレクトリがあるが中身は空)．

# インストール

## ディレクトリ構成

インストールディレクトリ`Nek5000`の構成は以下のとおりである．インストール先を`HOME`ディレクトリと仮定する．

```bash
$ cd ~/Nek5000
$ tree -L 1
```
```
.
├── 3rd_party
├── bin
├── core
├── doc
├── examples
├── LICENSE
├── README.md
├── RELEASE.md
├── run
├── short_tests
└── tools

8 directories, 3 files
```

## システム要件

ソースコードがFortran，Cで書かれているので，対応するコンパイラが必要である．デフォルトのビルドスクリプトではgcc，gfortranが指定されている．もちろん，その他のコンパイラ(インテルコンパイラなど)でもビルド可能である．並列計算を行う場合には，MPIの環境が必要である．

計算メッシュ作成に関しては簡単なメッシャーが用意されているが，使い慣れたメッシャーを利用して作成したメッシュを変換しても良い．後処理の可視化に関しては，VisItとParaViewのフォーマットで可視化用データを書き出すことができ，VisItに関しては可視化用データ出力を介さずに直接VisItを起動して可視化ができるコマンド`postx`が用意されている．VisItまたはParaViewは別途インストールしておく必要がある．

## ビルド

外部ライブラリをほとんど必要としないので，

1. 環境変数を設定する(といっても，PATHを通すだけ)
2. 共通の`tools`をコンパイルする．

を最初に行うだけである．すなわち，端末で，

```bash
$ export PATH=$HOME/Nek5000/bin:$PATH
$ cd ~/Nek5000/tools
$ maketools all
```

とする．実際の解析を行う際には，例題があるので希望のもの(自分の解析対象に近いもの)をコピーしてコンパイルし，生成されたオブジェクトモジュールを実行するだけである．境界条件，初期条件は例題ケースに含まれている(ケース名)`.f`を編集してユーザ定義のものに簡単に変更できる．

## First tutorial run (eddyケース)

比較的軽い計算例題が`short_tests`ディレクトリにいくつか用意されている．ユーザガイドにはeddyケースが最初のチュートリアルとして掲載されているので，実行してみる．

```bash
$ cd ~/Nek5000/run
$ cp -r ~/Nek5000/short_tests/eddy ./
$ cd eddy
$ makenek eddy_uv
```

`makenek`は実行モジュールをmakeするためのスクリプトファイルで，スクリプトを実行する際には引数としてケース名をしている．今回のeddyケースでは，`eddy_uv.rea`や`eddy_uv.usr`といった設定ファイルが含まれており，拡張子を取った`eddy_uv`が指定するケース名である．無事にコンパイルが終了すると，`Nek5000`という実行モジュールができる．

解析を流す前に，ディレクトリにはじめから用意されている`README`を読むとどのような解析例題なのかがわかる．

```bash
$ less README
```

`README`の最後に，以下のように参考文献が示されているので，論文を入手でき興味がある場合はよく読むとなぜこのような例題計算をするのかがわかる．

>[1] Owen Walsh, "Eddy Solutions of the Navier-Stokes Equations," in The Navier-Stokes Equations II - Theory and Numerical Methods, Proceedings, Oberwolfach 1991, J. G. Heywood, K. Masuda, R. Rautmann, S. A. Solonnikov, Eds., Springer-Verlag, pp. 306--309 (1992).

参考文献を読まなくても，CFDをやったことがある人ならば，`README`を読むとコードのVerificationによく使うTaylor-Green Vortexの問題であることがわかる．

だいたいどのような計算をしているのかがわかったので，解析を実行してみる．

```bash
$ genmap
```
ケース名を聞かれるので，`eddy_uv`を入力し，プロンプトが返ってこなくなるのでリターンキーを押す．`genmap`は簡単な要素分割(メッシュ生成)を行うコマンドである．そして計算を実行する．

```bash
$ nek eddy_uv
```

`nek`は計算を実行するためのスクリプトで，逐次計算をforegroundで行う．計算実行のためのスクリプトはそのほかに，

* `nekb`: 逐次計算, background
* `nekmpi`: 並列計算, foreground
* `nekbmpi`: 並列計算, background
* `neknek`: 重なり有ったメッシュ要素を持つ2ケース(調査していないので詳細は不明)

などがある．計算が完了したら，VisItやParaViewで可視化ができる．ユーザガイドにあるように，VisItを利用する場合は，

```bash
$ postx
``` 

または

```bash
$ visnek eddy_uv
$ visit -o eddy_uv.nek5000
```

とする．前者はVisItが直接起動してカスタマイズされたインターフェース(可視化用メニュー)が表示されるのに対し，後者ではVisItで読み込み可能なファイル形式が作成されたのちにVisItで起動・読み込みを行う．VisItは記事を書いている私が不慣れなので，使い方については多く説明ができない．可視化が終了したらVisItを終了する．

## Second tutorial run (turbChannelケース)

Nek5000は大規模な乱流解析を並列計算で行うのがメインなので，次に乱流DNS・LESでポピュラーなチャネル流れ(平行平板間流れ)の解析を行ってみる．`examples`ディレクトリに，`turbChannel`があるのでそれを実行してみる．

```bash
$ cd ~/Nek5000/run
$ cp -r ../examples/turbChannel ./
$ cd turbChannel
$ makenek turbChannel
$ genmap  # ケース名を聞かれたらturbChannelを入力する
$ nekbmpi turbChannel 4
$ tail -f logfile
```

`nekbmpi`の一つめの引数はケース名，二つめの引数はランク(並列数)である．eddyケースと違い，三次元の乱流解析なのでそれなりに計算時間がかかる．`nekbmpi`で並列計算をbackgroundで実行しているが，クラスタ計算機やスパコンなのバッチジョブキューイングシステムではこの`b`がついたコマンドがうまく動作しないので，PBSなどのジョブスクリプトを書いてジョブ投入する際は`b`がついてない`nekmpi`を利用する．計算が終了したら，適宜VisItで可視化を行う．

## まとめ

今回，Nek5000をダウンロードしてインストールし，とりあえず簡単なチュートリアル計算を行ってみた．インストールは難しくなく，Fortranで書かれた流体解析コードを使ったことがある方ならば比較的簡単に解析が実行できると思われる．複雑な幾何形状を持つ流れ場は難しいが，ERCOFTACのような乱流解析データベースに載っているようなチュートリアルケースはすでに用意されているので(要素分割とパラメータ設定は自分で検討しないといけないが)，大規模解析を行える流体解析ソフトウェア(コード)としてはかなり良さそうである．



C