CentOSにOpenFOAM v1612+をインストール

この記事は流体解析のオープンソースソフトウェアであるOpenFOAMのバージョンv1612+を，CentOSにインストールした際の手順を備忘録としてまとめたものです．

# OpenFOAMのダウンロード

OpenFOAMのバイナリパッケージ及びソースコードは以下のサイトから入手できます．

* [OpenFOAM - The Open Source CFD Toolbox](http://www.openfoam.com/)
* [The OpenFOAM Foundation](http://openfoam.org/)

1つめのサイトはESIグループによるものでLinux版以外にもWindows版も入手できます．一方，2つめのサイトはOpenFOAM Foundationによるものです．[過去の記事](http://qiita.com/yotakagi77/items/e1bf6eeeac560de849c9)でバージョンv1606+のインストール方法を紹介しましたが，今回も前者のESIのサイトからのみ入手できます．


# インストールの種類

ESIのサイトでは，Dockerでインストールする方法と，ソースからビルドする方法が掲載されています．Windowsに関してはインストーラーが提供されていますが，内部はDockerとなっています．ソースからビルドする方法については，Ubuntu 15.10, Ubuntu 14.04.3 LTS, CentOS, OpenSUSE Tumbleweed に対してインストールが可能であることが公式に確認されています．この記事ではOpenFOAMをCentOS上でソースからビルドすることを試みます．CentOSのバージョンは6.xを対象としています．

# インストールの方針

* OpenFOAMはコンパイラやライブラリの要件があり，システムにインストール済みのものではバージョンが古いことがあります．システムにインストール済みのコンパイラ・ライブラリはアップデートせずに，OpenFOAMのサードパーティディレクトリで別途ビルドして環境構築を行うことにします(もとのシステム環境を汚さない)．
* 通常のデスクトップPCへのインストールでは`$Home`にインストールすることがよくありますが、今回は他のユーザも利用する計算サーバへのインストールを想定し，`/opt`以下にインストールします．

# インストール手順の概要

1. 管理者権限で必要なrpmパッケージをダウンロード・インストールする．
2. OpenFOAM本体，サードパーティのビルドに必要となるソースパッケージをダウンロードし，展開する．
3. 環境設定ファイル・ビルドスクリプトを編集する．
4. サードパーティ(ツール，ライブラリ)のビルドする．
5. 可視化に用いるParaViewをビルドする．
6. OpenFOAM本体をビルドする．
7. ビルドしたOpenFOAM本体(ソルバー)の動作検証を行う．
8. 可視化用データリーダーをリビルドする．
9. 流体解析の一連の流れである，前処理(メッシュ生成)，計算実行, 後処理(可視化)ができることを確認する．

手順5.のParaViewのビルドは失敗することが多々あり，どうしてもうまくいかないときはあきらめます(ParaView 5.2.0はOpenFOAMのデータリーダーがうまく機能しないそうなので、最新版はインストールしないほうが良さそうです)．ParaViewはCentOSサーバ以外にも別途インストールできるので，計算データを手元の環境にダウンロードして可視化を行うことができます．

# 必要なrpmパッケージのインストール

必要なパッケージは以下のとおりです．

* git, gcc-c++, bison, flex, m4, glibc-devel, glibc-devel.i686, zlib-devel

管理者権限で`yum`を使って上記のパッケージをインストールします．

```bash
$ yum install gcc gcc-c++ bison flex m4 glibc-devel glibc-devel.i686 zlib-devel
```

# OpenFOAMソースパッケージのダウンロード・展開

OpenFOAMのパッケージは本体ソースコードとサードパーティパッケージの2種類から構成されています．ここでは異なるバージョンも管理できるように`/opt/OpenFOAM`というディレクトリを作成し，その下に`wget`でダウンロードして展開します．

```bash
$ mkdir /opt/OpenFOAM
$ cd /opt/OpenFOAM
$ wget https://sourceforge.net/projects/openfoamplus/files/v1612+/OpenFOAM-v1612+.tgz
$ tar zxvf OpenFOAM-v1612+.tgz
$ wget https://sourceforge.net/projects/openfoamplus/files/v1612+/ThirdParty-v1612+.tgz
$ tar zxvf ThirdParty-v1612+.tgz
```

各パッケージを展開したのちのディレクトリ・ファイルの構成は以下のようになります．

* `OpenFOAM-v1612+/`

```
Allwmake		applications/		src/
BuildIssues.txt		bin/			tutorials/
COPYING			doc/			wmake/
README.md		etc/
```

* `ThirdParty-v1612+/`

```
Allclean		makeADIOS		makeParaView.example
Allwmake		makeCCMIO		makeQt
BUILD.md		makeCGAL		makeTecio
CGAL-4.9/		makeCmake		makeVTK
COPYING			makeFFTW		makeVTK.example
ParaView-5.0.1/		makeGcc		minCmake
README.md		makeGperftools		openmpi-1.10.4/
boost_1_62_0/		makeLLVM		scotch_6.0.3/
etc/			makeMesa		sources.txt
fftw-3.3.5/		makeParaView
```

OpenFOAMのビルド方法は[OpenFOAM®  Installation From Source](http://www.openfoam.com/download/install-source.php)，[OpenFOAM®  Build Guide](http://www.openfoam.com/code/build-guide.php)に詳しく掲載されていますが，展開した`OpenFOAM-v1612+`及び`ThirdParty-v1612+`にある`README.md`，`BuildIssues.txt，`及び`BUILD.md`も熟読します．

# 最小限のシステム要件

[公式サイトで指定されている要件](http://www.openfoam.com/documentation/system-requirements.php)は以下のとおりです．

* gcc: 4.8.0
* cmake: 2.8.11 (ParaViewとCGALのビルドに必要)
* boost: 1.48 (CGALのビルドに必要)
* Qt: 4.7.2 (ParaViewのビルドに必要)

QtのバージョンはCentOSに元々入っているものはバージョンが古く，4.7以上が必要とされます．

# サードパーティパッケージに必要なソースのダウンロード・展開

上記の`ThirdPart-v1612+`以下で必要となるコンパイラ・ライブラリは以下のとおりです
(`BUILD.md`にダウンロード先の記載があります)．

* gcc-4.8.5, gmp-6.1.0, mpfr-3.1.4, mpc-1.0.3, openmpi-1.10.4, scotch_6.0.3, boost_1_62_0, CGAL-4.9, cmake-3.5.2, qt-4.8.7, fftw-3.3.5, libccmio-2.6.1

コンパイラはGCC以外のintelコンパイラなどでも可能ですが，OpenFOAMの実行速度はそれほど変わらないようです．GCCのバージョンは4.8.5より新しいものでも大丈夫ですが，後で出てくる設定を合わせて変更する必要があります．

**GCC**

```bash
$ cd ThirdParty-v1612+
$ wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
$ tar zxvf gcc-4.8.5.tar.gz
```

**GNUライブラリ(gmp, mpfr, mpc)**

```bash
$ wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.0.tar.bz2
$ tar jxvf gmp-6.1.0.tar.bz2
$ wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.4.tar.bz2
$ tar jxvf mpfr-3.1.4.tar.bz2
$ wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
$ tar zxvf mpc-1.0.3.tar.gz
```

**OpenMPI**

すでにサードパーティディクトリにあります．

**Scotch**

すでにサードパーティディクトリにあります．

**Boost**

すでにサードパーティディクトリにあります．

**CGAL**

すでにサードパーティディクトリにあります．

**Cmake**

```bash
$ wget http://www.cmake.org/files/v3.5/cmake-3.5.2.tar.gz
$ tar zxvf cmake-3.5.2.tar.gz
```

認証の関係でHTTPSのダウンロードができない場合は，`--no-check-certificate`をオプションを付けるか，[.wgetrcの設定](http://qiita.com/cuzic/items/b24803dc0858079b4fb3)などによって回避してください．

**Qt (qmake)**

```bash
$ wget http://download.qt.io/official_releases/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz
$ tar zxvf qt-everywhere-opensource-src-4.8.7.tar.gz
```

**FFTW**

すでにサードパーティディクトリにあります．

**libccmio**

STAR-CCM+のメッシュコンバータが必要な場合のみビルドします．

```bash
$ wget http://portal.nersc.gov/svn/visit/trunk/third_party/libccmio-2.6.1.tar.gz
$ tar zxvf libccmio-2.6.1.tar.gz
```

# 環境設定ファイル・ビルドスクリプトを編集

## OpenFOAM本体の環境設定

OpenFOAM本体の環境設定を，`vi`や`emacs`などの適当なエディタで編集します．シェルは`bash`利用で説明します．

```bash
$ vi ../OpenFOAM-v1612+/etc/bashrc
```

**修正箇所**

```bash
# FOAM_INST_DIR is the location of the OpenFOAM installation which defaults to
# the directory containing this file if sourced by a bash shell.
#
# Please set to the appropriate path if the default is not correct.
#
[ $BASH_SOURCE ] && FOAM_INST_DIR=$(\cd ${BASH_SOURCE%/*/*/*} && \pwd -P) || \
# FOAM_INST_DIR=$HOME/$WM_PROJECT
# FOAM_INST_DIR=~$WM_PROJECT
FOAM_INST_DIR=/opt/$WM_PROJECT
# FOAM_INST_DIR=/usr/local/$WM_PROJECT
```

```bash
#- Compiler location:
#    WM_COMPILER_TYPE= system | ThirdParty
export WM_COMPILER_TYPE=ThirdParty
```

```bash
#- MPI implementation:
#    WM_MPLIB = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPICH | MPICH-GM | HPMPI
#               | MPI | FJMPI | QSMPI | SGIMPI | INTELMPI
export WM_MPLIB=OPENMPI
```
**注意!**
バージョン3.0以降では`export WM_LABEL_SIZE=`でメッシュのラベルサイズを32ビットから64ビットに拡張できるようになりました．必要があれば以下のように変更してください．

```bash
#- Label size:
#    WM_LABEL_SIZE = 32 | 64
export WM_LABEL_SIZE=64
```

コンパイラ・GNUライブラリの指定に関して，GNUライブラリの指定を変更します．

```bash
$ vi ../OpenFOAM-v1612+/etc/config.sh/compiler
```

**変更箇所**

```bash
case "$WM_COMPILER_TYPE" in
OpenFOAM | ThirdParty)
    # Default versions of GMP, MPFR and MPC, override as necessary
    gmp_version=gmp-6.1.0
    mpfr_version=mpfr-3.1.4
    mpc_version=mpc-1.0.3
```

## GCCビルドの設定

```bash
$ vi makeGcc
```

**確認箇所**
先ほど編集した`config.sh/compiler`からコンパイラ・GNUライブラリのバージョンを参照するので，
以下は確認するだけです．

```bash
# get default GCC, mpfr, gmp and mpc versions
WM_COMPILER_TYPE=ThirdParty       # ensure we get the correct compiler settings
: ${WM_COMPILER:=Gcc}             # this will still fail if 'Clang' was set

. $WM_PROJECT_DIR/etc/config.sh/functions
_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/compiler)

gmpPACKAGE=${gmp_version:-gmp-system}
mpfrPACKAGE=${mpfr_version:-mpfr-system}
mpcPACKAGE=${mpc_version:-mpc-system}
gccPACKAGE=$gcc_version
```

## CGALビルドの設定

CGALのビルドスクリプトを上と同様に確認します．

```bash
$ vi makeCGAL
```

**確認箇所**

```bash
# Get CGAL, boost and gmp/mpfr versions
. $WM_PROJECT_DIR/etc/config.sh/functions
unset -f _foamAddPath _foamAddLib _foamAddMan   # get settings only
unset BOOST_ARCH_PATH CGAL_ARCH_PATH            # purge current values

# compiler first, let CGAL config override GMP (eg, when there is no GMP)
_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/compiler)
_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/CGAL)

boostPACKAGE=${boost_version:-boost-system}
gmpPACKAGE=${gmp_version:-gmp-system}
mpfrPACKAGE=${mpfr_version:-mpfr-system}
cgalPACKAGE=$cgal_version
```

OpenFOAM本体でのCGALの設定を確認します．

```bash
vi ../OpenFOAM-v1612+/etc/config.sh/CGAL
```

**確認箇所**

```bash
boost_version=boost_1_62_0
cgal_version=CGAL-4.9
```

## FFTWビルドの設定

FFTWのビルドスクリプトを確認します．

```bash
vi makeFFTW
```

**確認箇所**

```bash
# Get FFTW versions
. $WM_PROJECT_DIR/etc/config.sh/functions
unset -f _foamAddPath _foamAddLib _foamAddMan # get settings only
_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/FFTW)
fftwPACKAGE=${fftw_version:-fftw-system}
```

OpenFOAM本体でのFFTWの設定を確認します．

```bash
vi ../OpenFOAM-v1612+/etc/config.sh/FFTW
```

**変更箇所**

```bash
fftw_version=fftw-3.3.5
export FFTW_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$fftw_version
```

# サードパーティのビルド

## GCCのビルド

はじめにOpenFOAMの環境設定を読み込みます．

```
$ . /opt/OpenFOAM/OpenFOAM-v1612+/etc/bashrc
```

このとき，下記のようなメッセージが出力されますが，GCCがビルドがまだなので当たり前のエラーであり，GCCのビルドを進めます．

```
Warning in /opt/OpenFOAM/OpenFOAM-v1612+/etc/config.sh/settings:
Cannot find Gcc compiler installation /opt/OpenFOAM/ThirdParty-v1612+/platforms/linux64/gcc-4.8.5

    Either install this compiler version, or use the system compiler by setting
    WM_COMPILER_TYPE to 'system' in /opt/OpenFOAM/OpenFOAM-v1612+/etc/bashrc.
```

```bash
$ ./makeGcc
```

## サードパーティパッケージのビルド

Gccのビルドが完了したら，残りのパッケージのビルドを`Allwmake`で行います．実行する前にもう一度OpenFOAMの環境設定を読み込みます．

```bash
$ . /opt/OpenFOAM/OpenFOAM-v1612+/etc/bashrc 
$ ./Allwmake
```

## Cmakeのビルド

Cmakeをビルドします．バージョンをオプションで指定する必要があります．

```bash
./makeCmake cmake-3.5.2
```

# ParaViewのビルド

## Qtのビルド

`makeQt`の中でバージョンを確認します．

```bash
$ vi makeQt
```

**確認箇所**

```bash
qtVERSION=4.8.7
qtTYPE=qt-everywhere-opensource-src
```

Qtをビルドします．

```bash
$ ./makeQt
```

次にParaViewをビルドしますが，ビルドスクリプト`makeParaView`の中ではqmake(Qt)及びCmakeのパスが設定されていないので追記します．

```bash
$ vi makeParaView
```

**追記箇所**

```bash
# Set the path to the Qt-4.5 (or later) qmake if the system Qt is older
QMAKE_PATH="/opt/OpenFOAM/ThirdParty-v1612+/platforms/linux64Gcc/qt-4.8.7/bin"

# Set the path to cmake
CMAKE_PATH="/opt/OpenFOAM/ThirdParty-v1612+/platforms/linux64Gcc/cmake-3.5.2/bin"
```

また，ParaViewでPythonスクリプトを使いたい場合は，`makeParaView`中で`withPYTHON=true`とし，`PYTHON_LIBRARY=""`に適切なパスを設定します(今回は設定しない)．

**注意!**
v1606+以降のビルドスクリプトではParaView 5.0.1がビルドされ，OpenGLに関する設定が増えています．しかしながら，システムで利用できるOpenGLのバージョンが2.xより古い場合，ビルドできてもParaViewが起動しません．OpenGLのドライバをアップデートするか，もしくは以下のようにOpenGLライブラリ2.x以上の機能を利用しないようにします．

```bash
$ vi makeParaView
```

**変更箇所**

```bash
# New rendering backend (starting with paraview 5.0).
# Default to auto-config based on paraview version
withGL2=false
```

ParaViewをビルドします．

```bash
$ ./makeParaView
```

以上のサードパーティ，ParaViewのビルドが終わったら，OpenFOAM本体ビルドのための条件を満たしているかどうかを以下のコマンドでチェックします．

```bash
$ foamSystemCheck
```

# OpenFOAM本体のビルド

再度OpenFOAMの環境設定を読み込んでからビルドします．`Allwmake`スクリプトを利用しますが，`-j`オプションで並列コンパイルのcpu数を指定できるので，環境に合わせて設定します．また，エイリアスコマンド`foam`を用いると，OpenFOAMのプロジェクトディレクトリ(インストールディレクトリ)`$WM_PROJECT_DIR`に移動できます．

```bash
$ . /opt/OpenFOAM/OpenFOAM-v1612+/etc/bashrc
$ foam
$ ./Allwmake –j4
```

もしエラーが出て正常終了しないときは，エラーメッセージから足りないライブラリがないかどうかなどを確認します．

# OpenFOAM本体のビルド検証

OpenFOAM本体のビルドが正常終了したら，環境設定読み込みを再度行い，テストのためのプログラムを実行します．

```bash
$ . /opt/OpenFOAM/OpenFOAM-4.0/etc/bashrc 
$ foamInstallationTest
```
ライブラリパスなどの確認結果が出力され，最後に以下のような要約が出力されればOKです．

```
Summary
-------------------------------------------------------------------------------
Base configuration ok.
Critical systems ok.

Done
```


---
引き続いてParaView Readerをビルドします．一度クリーンしてからビルドします．

```bash
$ cd $FOAM_UTILITIES/postProcessing/graphics/PVReaders 
$ ./Allwclean
$ ./Allwmake
```

ここで`$FOAM_UTILITIES`はOpenFOAMのユーティリティがインストールされたパスを表すOpenFOAMの環境変数です．

# OpenFOAMでの前処理，計算実行，後処理の動作確認

上記のインストール作業がすべて終了したら，OpenFOAMによって流体解析の一連の流れである，前処理(メッシュ作成)，計算実行，後処理(可視化)が正常にできるかどうかを，チュートリアルケースである`cavity`を利用して確かめます．

```bash
$ . /opt/OpenFOAM/OpenFOAM-4.0/etc/bashrc
$ mkdir –p $FOAM_RUN
$ run
$ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily ./
$ cd pitzDaily
$ blockMesh
$ simpleFoam
$ paraFoam
```

ここで出てくるOpenFOAMのコマンドの意味は以下のとおりです．

* `run`: ユーザの計算実行ディレクトリ`$FOAM_RUN`に移動する．
* `blockMesh`: 基本的なメッシュを生成する．
* `simpleFoam`: 非圧縮性流体計算用の定常解析ソルバー`simpleFoam`の実行．
* `paraFoam`: OpenFOAMの計算出力をParaView Readerによって読み込み，ParaViewを起動して可視化する．

---
ここで行った動作確認では並列計算の確認ができていません．並列計算を行うチュートリアルケースはどれも計算時間がかかるので気軽に動作確認ができませんが，比較的軽い計算として`pipeCyclic`を実行してみます(並列数はデフォルでは5)．

```bash
$ run
$ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pipeCyclic ./
$ cd pipeCyclic
$ ./Allrun
```

`Allrun`はメッシュ生成から解析条件設定・計算実行を自動的に行うスクリプトです．`pitzDaily`及び`pipeCyclic`がエラーなしで計算実行できれば無事にインストール完了です．