CentOSにOpenFOAM v2006をインストール

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

# OpenFOAMのダウンロード

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

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

1つめのサイトはESIグループによるものです．一方，2つめのサイトはOpenFOAM Foundationによるものです．リリースされた年月でバージョンがついてるもの，すなわち今回のv2006(2020年6月リリース)は前者のESIのサイトから入手できます．

# インストールの種類

ESIのサイトでは，Windows，Mac，Linuxのバイナリがダウンロードできます．Windowsでは，Windows Subsystem for Linux (WSL)によるインストールもできます．ソースからビルドする方法については，Ubuntu 16.04LTS, CentOS 7.4, OpenSUSE Tumbleweed に対してインストールが可能であることが公式に確認されています．この記事ではOpenFOAMを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種類から構成されています．ここでは異なるバージョンも管理できるように`/opt/OpenFOAM`というディレクトリを作成し，その下に`wget`でダウンロードして展開します．

```bash
$ mkdir /opt/OpenFOAM
$ cd /opt/OpenFOAM
$ wget https://sourceforge.net/projects/openfoam/files/v2006/OpenFOAM-v2006.tgz
$ tar zxvf OpenFOAM-v2006.tgz
$ wget https://sourceforge.net/projects/openfoam/files/v2006/ThirdParty-v2006.tgz
$ tar zxvf ThirdParty-v2006.tgz
```
認証の関係でHTTPSのダウンロードができない場合は，`--no-check-certificate`をオプションを付けるか，[.wgetrcの設定](http://qiita.com/cuzic/items/b24803dc0858079b4fb3)などによって回避してください．

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

* `OpenFOAM-v2006/`

```
Allwmake         COPYING    README.md     bin  etc      src        wmake
CONTRIBUTORS.md  META-INFO  applications  doc  modules  tutorials
```

* `ThirdParty-v2006/`

```
ADIOS2-2.4.0     etc             makeKAHIP            makeParaView
Allclean         fftw-3.3.7      makeLLVM             makeParaView.example
Allwmake         kahip-2.12      makeMETIS            makeQt
BUILD.md         makeAdios2      makeMGridGen         makeSCOTCH
CGAL-4.12.2      makeCCMIO       makeMPICH            makeVTK
COPYING          makeCGAL        makeMVAPICH          makeVTK.example
ParaView-v5.6.3  makeCmake       makeMesa             minCmake
README.md        makeFFTW        makeMesa.example     openmpi-4.0.3
Requirements.md  makeGcc         makeOPENMPI          scotch_6.0.9
SOURCES.txt      makeGperftools  makeOPENMPI.example
boost_1_66_0     makeHYPRE       makePETSC
```

OpenFOAMのビルド方法は[OpenFOAM® Quick Build Guide](https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Build.md)に掲載されていますが，展開した`OpenFOAM-v2006`及び`ThirdParty-v2006`にある`README.md`，`Bequirements.md`，`BUILD.md`を熟読し，`SOURCES.txt`もチェックします．

# 最小限のシステム要件

[公式サイトで指定されている要件](https://develop.openfoam.com/Development/openfoam/blob/develop/doc/Requirements.md)は以下のとおりです．

* gcc: 4.8.5
* cmake: 3.8 (ParaViewとCGALのビルドに必要)
* boost: 1.48 (CGALのビルドに必要)
* fftw: 3.3.7 (FFTに関する機能を使う場合は必要)
* paraview: 5.5.2 (可視化用)
* Qt: 5.9 (ParaViewビルドに必要)

QtのバージョンはCentOSに元々入っているものはバージョンが古く，ParaViewの最新版を使うためにQtも新しいものが必要です．

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

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

* gcc-4.8.5, gmp-6.2.0, mpfr-4.0.2, mpc-1.1.0, openmpi-1.10.7(or openmpi-4.0.3), scotch_6.0.9, boost_1_66_0, CGAL-4.12.2, cmake-3.8.2, qt-5.6.3(or qt-5.9.3), fftw-3.3.7, libccmio-2.6.1

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

**GCC**

```bash
$ cd ThirdParty-v2006
$ 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.2.0.tar.xz
$ tar Jxvf gmp-6.2.0.tar.xz
$ wget ftp://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.xz
$ tar Jxvf mpfr-4.0.2.tar.xz
$ wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
$ tar zxvf mpc-1.1.0.tar.gz
```

**OpenMPI**

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

**Scotch**

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

**Boost**

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

**CGAL**

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

**Cmake**

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

**Qt (qmake)**

```bash
$ wget http://download.qt.io/new_archive/qt/5.6/5.6.3/single/qt-everywhere-opensource-src-5.6.3.tar.xz
$ tar xvf qt-everywhere-opensource-src-5.6.3.tar.xz
```

**FFTW**

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

**libccmio**

STAR-CCM+のメッシュコンバータが必要な場合のみビルドします．ダウンロード先が以前とは異なっています．

```bash
$ wget http://visit.ilight.com/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-v2006/etc/bashrc
```

**修正箇所**

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

メッシュのラベルサイズを32ビットから64ビットにしたい場合は以下のように変更してください．

```bash
# [WM_LABEL_SIZE] - Label size in bits:
# = 32 | 64
export WM_LABEL_SIZE=64
```

```bash
# [WM_MPLIB] - MPI implementation:
# = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
#   HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
# Also possible to use INTELMPI-xyz etc and define your own wmake rule
export WM_MPLIB=OPENMPI
```

```bash
# [projectDir] - directory containing this OpenFOAM version.
# \- When this file is located as $WM_PROJECT_DIR/etc/bashrc, the next lines
#    should work when sourced by BASH or ZSH shells. If this however fails,
#    set one of the fallback values to an appropriate path.
#
#    This can be removed if an absolute path is provided for WM_PROJECT_DIR
#    later on in this file
# --
projectDir="${BASH_SOURCE:-${ZSH_NAME:+$0}}";
[ -n "$projectDir" ] && projectDir="$(\cd $(dirname $projectDir)/.. && \pwd -L)" ||\
# projectDir="$HOME/OpenFOAM/OpenFOAM-$WM_PROJECT_VERSION"
projectDir="/opt/OpenFOAM/OpenFOAM-$WM_PROJECT_VERSION"
# projectDir="/usr/local/OpenFOAM/OpenFOAM-$WM_PROJECT_VERSION"
```

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

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

**変更箇所**

```bash
case "$WM_COMPILER_TYPE" in
ThirdParty)
    # Default versions of GMP, MPFR, MPC - override as necessary
    gmp_version=gmp-6.2.0
    mpfr_version=mpfr-4.0.2
    mpc_version=mpc-1.1.0
```

## GCCビルドの設定

```bash
$ vi makeGcc
```

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

```bash
[ "${WM_COMPILER#Gcc}" = "$WM_COMPILER" ] && WM_COMPILER=Gcc        # Force gcc
WM_COMPILER_TYPE=ThirdParty                # Ensure we get the correct settings

# Default GCC, mpfr, gmp and mpc versions from OpenFOAM etc/config.sh file:
_foamConfig 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
# CGAL, boost and gmp/mpfr versions from OpenFOAM etc/config.sh files.
# Get compiler first and let CGAL config override GMP and MPFR
_foamConfig compiler
_foamConfig CGAL

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

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

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

**確認箇所**

```bash
boost_version=boost_1_66_0
cgal_version=CGAL-4.12.2
```

## FFTWビルドの設定

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

```bash
vi makeFFTW
```

**確認箇所**

```bash
# FFTW version from OpenFOAM etc/config.sh file:
_foamConfig FFTW

fftwPACKAGE=${fftw_version:-fftw-system}
```

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

```bash
vi ../OpenFOAM-v2006/etc/config.sh/FFTW
```

**確認箇所**

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

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

## GCCのビルド

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

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

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

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

    Either install this compiler version, or use the system compiler by setting
    WM_COMPILER_TYPE to 'system' in $WM_PROJECT_DIR/etc/bashrc.
===============================================================================
```

```bash
$ ./makeGcc
```

ビルドしたGccを有効にするために，OpenFOAMの環境設定を再度読み込みます．

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

## Cmakeのビルド

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

```bash
./makeCmake cmake-3.8.2
```

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

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

```bash
$ . /opt/OpenFOAM/OpenFOAM-v2006/etc/bashrc 
$ ./Allwmake
```
ADIOS2のビルド時に以下のようなエラーが出てしまいます．

```bash
no patch found for ADIOS2-2.4.0
Using cmake=/usr/bin/cmake
CMake Error at CMakeLists.txt:6 (cmake_minimum_required):
  CMake 3.6 or higher is required.  You are running version 2.6.4

-- Configuring incomplete, errors occurred!
Error building: ADIOS2-2.4.0
    ---------------------------------------------------
    Optional component (ADIOS2) had build issues
    OpenFOAM will nonetheless remain largely functional
    ---------------------------------------------------
```
サードパーティ以下にビルドしたCmakeを利用していないようなので，PATHを明示的に設定してADIOS2を再ビルドします．

```bash
$ ./makeAdios2 -cmake $WM_THIRD_PARTY_DIR/platforms/linux64Gcc/cmake-3.8.2/bin/
```

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

```bash
$ foamSystemCheck
```

```bash
System check: PASS
==================
Can continue OpenFOAM installation.
```
`PASS`が表示されたら，OpenFOAM本体のビルドに移ります．

# OpenFOAM本体のビルド

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

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

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

# OpenFOAM本体のビルド検証

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

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

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

Done
```

`gcc -v`のバージョン出力で日本語が含まれる場合は上記の`foamInstallationTest`がエラーとなるので，その前に

```bash
export LANG=C
```

などとして日本語を使用しないようにしてください．

# ParaViewのビルド

## Qtのビルド

`makeQt`の中でバージョン・パッケージの指定の仕方を確認します．

```bash
$ more makeQt
```

**確認箇所**

```bash
# Description
#     Build script for QT (the qt-everywhere-opensource-src package)
#
# ----------------------------------------------
# NO USER-CONFIGURABLE SETTINGS WITHIN THIS FILE
#------------------------------------------------------------------------------
# Run from third-party directory only
cd ${0%/*} && wmakeCheckPwd "$WM_THIRD_PARTY_DIR" 2>/dev/null || {
    echo "Error (${0##*/}) : not located in \$WM_THIRD_PARTY_DIR"
    echo "    Check your OpenFOAM environment and installation"
    exit 1
}
. etc/tools/ThirdPartyFunctions
. etc/tools/QtFunctions
```
以前のOpenFOAMバージョンでは`makeQt`の中でユーザーが指定することができましたが，設定をここで変えることはできません．とりあえず，`makeQt`のヘルプを出してみます．

```bash
$ ./makeQt -h
```

```bash
usage: makeQt [OPTION] [qt-VERSION] [-- configure-options]
options:
  -gcc              Force gcc/g++ instead of the values from $WM_CC, $WM_CXX
  -help

* build qt-everywhere-opensource-src, version undefined
```

バージョンを指定して実行すればよいようなので，5.9.3をコンパイルしてみます．

```bash
$ ./makeQt　5.6.3
```
コンパイルに少々時間がかかり，何やら以下のようなエラーが出て失敗します．

```bash
/opt/OpenFOAM/ThirdParty-v2006/qt-everywhere-opensource-src-5.6.3/qtconnectivity/src/tools/sdpscanner/main.cpp:321:30: error: ‘htonl’ was not declared in this scope
```

エラーメッセージをGoogleで検索すると，[stack overflow](https://stackoverflow.com/questions/8402479/error-while-compiling-thrift-server) に対処法が載っているので，以下のようにソースに修正を加えます．

```bash
$ vi qt-everwhere-opensource-src-5.6.3/qtconnectivity/src/tools/sdpscanner/main.cpp
```

**追記部分**

```c++
#include <arpa/inet.h>
```
もう一度コンパイルしてエラーが出なければ成功です．

```bash
$ ./makeQt　5.6.3
```

##ParaViewのビルド

次にParaViewをビルドします．
qmake（Qt）及びCmakeのパスが設されていないのでスクリプトのオプションで指定します．
また，OpenGLライブラリ2.x以上の機能を利用しない(`-no-gl2`)のオプションを付けて実行します(CentOS 6のドライバーが対応していないため)．

```bash
$ ./makeParaView　-no-gl2 -qmake platforms/linux64Gcc/qt-5.6.3/bin -cmake platforms/linux64Gcc/cmake-3.8.2/bin
```

モジュール`paraview`ができてビルド完了です．

```bash
$ ls platforms/linux64Gcc/ParaView-5.6.0/bin/paraview
platforms/linux64Gcc/ParaView-5.6.0/bin/paraview
```

これでParaViewのインストールは完了です．以前のバージョンでは，この後に`paraFoam`コマンドを使うためにParaView Readerのビルドが必要だったのですが，該当する`PVReader`は見当たらないので必要ないようです．

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

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

```bash
$ . /opt/OpenFOAM/OpenFOAM-v2006/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に読み込める形式に変換し，ParaViewを起動して可視化する．

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

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

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