CentOSにOpenFOAM 4.0をインストール

この記事は流体解析のオープンソースソフトウェアであるOpenFOAMのバージョン4.0を，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によるものであり，バージョン4.0は現在の時点(2016/6)でこちらのサイトからのみ入手できます．なぜ2つのグループがあるのかはいろいろ経緯があるそうで，私も良く知りません．

# インストールの種類

OpenFOAM Foundationのサイトでは，ubuntuに`apt-get`でインストールする方法と，ソースからビルドする方法が掲載されています．ソースからビルドする方法については，ubuntu及びSuSEに対する手順がまとめられていますが，Red Hat/CentOSに関するインストール情報は載っていません．しかしながら，CentOSは数値計算用サーバのOSとして採用されることが多いため，この記事ではOpenFOAMをCentOS上でソースからビルドすることを試みます．CentOSのバージョンは6.xを対象としています．

# インストールの方針

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

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

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

手順7.のParaViewのビルドは失敗することが多々あり，どうしてもうまくいかないときはあきらめます．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種類から構成されています．ソースパッケージをOpenFOAM Foundationのサイトからダウンロードするとバージョンが'4.0'と付いているtar.gzファイルが入手できますが，gitを使うと'4.x'になっています．ここではgitを使ってパッケージをcloneし，バージョン名を'4.x'から'4.0'に変更します．

```bash
$ mkdir /opt/OpenFOAM
$ cd /opt/OpenFOAM
$ git clone git://github.com/OpenFOAM/OpenFOAM-4.x.git
$ mv OpenFOAM-4.x OpenFOAM-4.0
$ git clone git://github.com/OpenFOAM/ThirdParty-4.x.git
$ mv ThirdParty-4.x ThirdParty-4.0
```
各パッケージを展開したのちのディレクトリ・ファイルの構成は以下のようになります．

* `OpenFOAM-4.0/`

```
Allwmake	README.org	    bin/		etc/		tutorials/
COPYING		applications/	doc/		src/		wmake/
```

* `ThirdParty-4.0/`

```
Allclean		    README.org		makeLLVM
Allwmake		    etc/			makeParaView
AllwmakeLibccmio	makeCGAL		makeParaView3
COPYING			    makeCmake		scotch_6.0.3/
ParaView-5.0.1/		makeGcc
README.html		    makeGperftools
```

OpenFOAMのインストール方法は[OpenFOAM Foundation](http://openfoam.org/)に詳しく掲載されていますが，展開した`OpenFOAM-4.0`及び`ThirdParty-4.0`にある`Readme.org`も熟読します．

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

上記の`ThirdPart-4.0`以下で必要となるコンパイラ・ライブラリは以下のとおりです．

* gcc-4.8.5, gmp-5.1.2, mpfr-3.1.2, mpc-1.0.1, openmpi-1.10.2, scotch_6.0.3, boost_1_58_0, CGAL-4.8, cmake-3.2.1, qt-4.8.6

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

**GCC**

```bash
$ cd ThirdParty-4.0.x
$ 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 http://ftp.gnu.org/gnu/gmp/gmp-5.1.2.tar.bz2 
$ tar jxvf gmp-5.1.2.tar.bz2
$ wget http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.2.tar.gz 
$ tar zxvf mpfr-3.1.2.tar.gz
$ wget http://ftp.gnu.org/gnu/mpc/mpc-1.0.1.tar.gz 
$ tar zxvf mpc-1.0.1.tar.gz
```
**OpenMPI**

```bash
$ wget https://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.2.tar.gz
$ tar zxvf openmpi-1.10.2.tar.gz
```
認証の関係でHTTPSのダウンロードができない場合は，`--no-check-certificate`をオプションを付けるか，[.wgetrcの設定](http://qiita.com/cuzic/items/b24803dc0858079b4fb3)などによって回避してください．

**Scotch**

```bash
$ wget https://gforge.inria.fr/frs/download.php/file/34099/scotch_6.0.3.tar.gz
$ tar zxvf scotch_6.0.3.tar.gz
```

**Boost**

```bash
$ wget http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.gz
$ tar zxvf boost_1_58_0.tar.gz
```

**CGAL**

```bash
$ wget https://github.com/CGAL/cgal/releases/download/releases/CGAL-4.8/CGAL-4.8.tar.xz
$ tar Jxvf CGAL-4.8.tar.xz
```

**Cmake**

```bash
$ wget https://cmake.org/files/v3.2/cmake-3.2.1.tar.gz
$ tar zxvf cmake-3.2.1.tar.gz
```

**Qt (qmake)**

```bash
$ wget https://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz
$ tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
```
# 環境設定ファイル・ビルドスクリプトを編集

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

```bash
$ vi ../OpenFOAM-4.0/etc/bashrc
```
**修正箇所**

```bash
export WM_PROJECT=OpenFOAM
export WM_PROJECT_VERSION=4.0
# Please set to the appropriate path if the default is not
correct.
#
[ $BASH_SOURCE ] && \
export FOAM_INST_DIR=${BASH_SOURCE%/*/*/*} || \
# export FOAM_INST_DIR=$HOME/$WM_PROJECT
# export FOAM_INST_DIR=~$WM_PROJECT
export FOAM_INST_DIR=/opt/$WM_PROJECT
# export FOAM_INST_DIR=/usr/local/$WM_PROJECT
```
```bash
#- Compiler location:
#    WM_COMPILER_TYPE= system | ThirdParty (OpenFOAM)
export WM_COMPILER_TYPE=ThirdParty
```
```bash
#- MPI implementation:
#    WM_MPLIB = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPICH | MPICH-GM | HPMPI
#               | MPI | QSMPI | SGIMPI
export WM_MPLIB=OPENMPI
```

コンパイラ・GNUライブラリの指定は上記のパッケージをダウンロードしていれば問題ありませんが，念のため確認します．

```bash
$ more ../OpenFOAM-4.0/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-5.1.2
    mpfr_version=mpfr-3.1.2
    mpc_version=mpc-1.0.1

    case "$WM_COMPILER" in
    Gcc | Gcc48)
        gcc_version=gcc-4.8.5
        ;;
```

CGALのビルドスクリプトを編集します．

```bash
$ vi makeCGAL
```

**変更箇所**

```bash
cgalPACKAGE=${cgal_version:-CGAL-4.8}
boostPACKAGE=boost_1_58_0
gmpPACKAGE=gmp-5.1.2
mpfrPACKAGE=mpfr-3.1.2
```

OpenFOAM本体でのCGALの設定を変更します．

```bash
vi ../OpenFOAM-4.0/etc/config.sh/CGAL
```

**変更箇所**

```bash
boost_version=boost_1_58_0
cgal_version=CGAL-4.8
```

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

## GCCのビルド

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

```
$ . /opt/OpenFOAM/OpenFOAM-4.0/etc/bashrc
```

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

```
Warning in /opt/OpenFOAM/OpenFOAM-4.0/etc/config.sh/
settings:
    Cannot find /opt/OpenFOAM/ThirdParty-4.0/platforms/linux64/gcc-4.8.5 installation.
    Please install this compiler version or if you wish to use the system compiler,
    change the 'WM_COMPILER_TYPE' setting to 'system'
```

```bash
$ ./makeGcc
```

## Cmakeのビルド

Cmakeをビルドします．

```bash
./makeCmake
```

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

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

```bash
$ . /opt/OpenFOAM/OpenFOAM-4.0/etc/bashrc 
$ ./Allwmake
```

# OpenFOAM本体のビルド

再度OpenFOAMの環境設定を読み込んでからビルドします．`Allwmake`スクリプトを利用しますが，`-j`オプションで並列コンパイルのcpu数を指定できるので，環境に合わせて設定します．

```bash
$ . /opt/OpenFOAM/OpenFOAM-4.0/etc/bashrc
$ cd /opt/OpenFOAM/OpenFOAM-4.0/
$ ./Allwmake –j4
```

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

# OpenFOAM本体のビルド検証

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

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

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

Done
```

# ParaView及びParaView Readerのビルド

## Qtのビルド

OpenFOAM 3.0.xまではQtをビルドするためのスクリプト`makeQt`が用意されていましたが，OpenFOAM 4.0ではなぜか見当たりません．3.0.xのものが利用できるので，`QtFunctions`という設定ファイルと併せてコピーし，`makeQt`を編集します．

```bash
$ cd /opt/OpenFOAM
$ git clone git://github.com/OpenFOAM/ThirdParty-3.0.x.git
$ cd /opt/OpenFOAM/ThirdParty-4.0
$ cp /opt/OpenFOAM/ThirdParty-3.0.x/makeQt ./
$ cp /opt/OpenFOAM/ThirdParty-3.0.x/etc/tools/QtFunctions ./etc/tools/ 
$ vi makeQt
```

**変更箇所**

```bash
qtVERSION=4.8.6
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-4.0/platforms/linux64Gcc/qt-4.8.6/bin/"

# Set the path to cmake
CMAKE_PATH="/opt/OpenFOAM/ThirdParty-4.0/platforms/linux64Gcc/cmake-3.2.1/bin"
```

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

ParaViewをビルドします．今回のビルドスクリプトではParaView 5.0.1がビルドされます．

```bash
$ ./makeParaView
```

引き続いて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/icoFoam/cavity/cavity ./ 
$ cd cavity
$ blockMesh
$ icoFoam
$ paraFoam
```

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

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

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

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

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