CentOSにOpenFOAM 10をインストール

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

# OpenFOAMのダウンロード

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

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

1つめのサイトはESIグループによるもので，4桁のバージョン名(yymm)が付いたものが入手できます．一方，2つめのサイトはOpenFOAM Foundationによるものであり，今回インストールするバージョン10はこちらのサイトから入手できます．

# インストールの種類

OpenFOAM Foundationのサイトによれば，以下の方法でインストールできます．

* Windows 10: WSLを使ってUbuntuパッケージ上でインストール
* Mac OS: Dockerを使ってインストール
* Ubuntu: Ubuntu 18.04，20.04，22.04でパッケージ管理システムでインストール
* その他Linux distribution: Dockerを使う，もしくはソースからビルドする

ソースからビルドする方法については，Ubuntu 18.04，20.04，22.04，OpenSuSE Tumbleweed, Centos 8に対してビルドできることが公式で確認されています．当方の計算機サーバはCentOS 7であるため，ソースからビルドすることを自己責任で試みます．

# インストールの方針

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

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

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

手順7.のParaViewのビルドは失敗することが多々あり，どうしてもうまくいかないときはあきらめます．ParaViewはCentOSサーバ以外にも別途インストールできるので，計算データを手元の環境にダウンロードして可視化を行うことができます．

<!-- 
**注意**
ParaViewは今回バージョン5.4.0までインストールできるようですが，何かと失敗&面倒であったため，今回の記事では5.0.1をインストールしています．
-->

# 必要な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のサイトと同様にwgetでダウンロード，tarで展開します．本体ソースコードはパッチを当ててバグ修正されているものがあったので，そちらを利用します．バージョン名が'10-20220727'や'10-version-10'となっていますので，公式サイトと同様に'10'に変更します．

```bash
$ mkdir /opt/OpenFOAM
$ cd /opt/OpenFOAM
$ wget -O - http://dl.openfoam.org/source/10.20220727 | tar xvz
$ wget -O - http://dl.openfoam.org/third-party/10 | tar xvz
$ mv OpenFOAM-10-20220727 OpenFOAM-10
$ mv ThirdParty-10-version-10 ThirdParty-10
```
各パッケージを展開したのちのディレクトリ・ファイルの構成は以下のようになります．

* `OpenFOAM-10/`

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

* `ThirdParty-10/`

```
Allclean          ParaView-5.6.3.patch  makeCmake       makeMesa
Allwmake          README.html           makeGcc         makeParaView
AllwmakeLibccmio  README.org            makeGperftools  scotch_6.0.9/
COPYING           etc/                  makeLLVM
```

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

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

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

* gcc-5.5.0, gmp-5.1.2, mpfr-3.1.2, mpc-1.0.1, openmpi-2.1.1, scotch_6.0.9, boost_1_72_0, CGAL-5.0.2, Zoltan-3.90, cmake-3.9.0, qt-5.9.6, ParaView-v5.6.3

コンパイラはGCC以外のintelコンパイラなどでも可能です．GCCのバージョンは`README`に書いてある最小要件の4.8.5ではc++14でのコンパイル時にエラーになるため，5.x以上のGCCを入れる必要があります．QtのバージョンはCentOSに元々入っているものはバージョンが古く，ParaViewのビルドには5.x以上が必要とされます．

**GCC**

```bash
$ cd ThirdParty-10
$ wget https://ftp.gnu.org/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.gz
$ tar zxvf gcc-5.5.0.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
```
認証の関係でHTTPSのダウンロードができない場合は，`--no-check-certificate`をオプションを付けるか，[.wgetrcの設定](http://qiita.com/cuzic/items/b24803dc0858079b4fb3)などによって回避してください．
**OpenMPI**

```bash
$ wget  https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.1.tar.bz2
$ tar jxvf openmpi-2.1.1.tar.bz2
```
**Scotch**

すでに`ThirdParty`内にあるのでダウンロード不要です．

**Boost**

```bash
$ wget --no-check-certificate https://sourceforge.net/projects/boost/files/boost/1.72.0/boost_1_72_0.tar.bz2
$ tar jxvf boost_1_72_0.tar.bz2
```

**CGAL**

```bash
$ wget https://github.com/CGAL/cgal/releases/download/releases%2FCGAL-5.0.2/CGAL-5.0.2.tar.xz
$ tar Jxvf CGAL-5.0.2.tar.xz
```

**Zoltan**

```bash
$ wget https://github.com/sandialabs/Zoltan/archive/refs/tags/v3.90.tar.gz
$ tar zxvf v3.90.tar.gz 
```

**Cmake**

```bash
$ wget https://www.cmake.org/files/v3.9/cmake-3.9.0.tar.gz
$ tar zxvf cmake-3.9.0.tar.gz
```

**Qt (qmake)**

```bash
$ wget https://download.qt.io/archive/qt/5.9/5.9.6/single/qt-everywhere-opensource-src-5.9.6.tar.xz
$ tar Jxvf qt-everywhere-opensource-src-5.9.6.tar.xz
```

**ParaView**

```bash
$ wget http://www.paraview.org/files/v5.6/ParaView-v5.6.3.tar.gz
$ tar zxvf ParaView-v5.6.3.tar.gz
```

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

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

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

```bash
export WM_PROJECT=OpenFOAM
export WM_PROJECT_VERSION=10

################################################################################
# USER EDITABLE PART: Changes made here may be lost with the next upgrade
#
# 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" -o "$ZSH_NAME" ] && \
export FOAM_INST_DIR=$(cd $(dirname ${BASH_SOURCE:-$0})/../.. && pwd -P) || \
# 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

#- Compiler:
#    WM_COMPILER = Gcc | Gcc48 ... Gcc62 | Clang | Icx
export WM_COMPILER=Gcc55
unset WM_COMPILER_ARCH WM_COMPILER_LIB_ARCH
```

```bash
#- MPI implementation:
#    WM_MPLIB = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPICH | MPICH-GM | HPMPI
#               | MPI | QSMPI | SGIMPI
export WM_MPLIB=OPENMPI
```

ラベルサイズを32bitから64bitに変更したいときは以下のように指定します．

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

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

```bash
$ more ../OpenFOAM-10/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
    Gcc48)
        gcc_version=gcc-4.8.5
        ;;
    Gcc49)
        gcc_version=gcc-4.9.4
        ;;
    Gcc55)
        gcc_version=gcc-5.5.0
        ;;
```
<!--
CGALのビルドスクリプトを編集します．

```bash
$ vi makeCGAL
```

**変更箇所**

```bash
cgalPACKAGE=${cgal_version:-CGAL-4.8.1}
boostPACKAGE=boost_1_55_0
gmpPACKAGE=gmp-5.1.2
mpfrPACKAGE=mpfr-3.1.2
```
-->

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

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

**変更箇所**

```bash
#boost_version=boost-system
#boost_version=boost-1.55.0
boost_version=boost-1.72.0

#cgal_version=cgal-system
#cgal_version=CGAL-4.10
cgal_version=CGAL-5.0.2
```

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

## GCCのビルド

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

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

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

```
Warning in /opt/OpenFOAM/OpenFOAM-10/etc/config.sh/settings:
    Cannot find /opt/OpenFOAM/ThirdParty-10/platforms/linux64/gcc-5.5.0 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-10/etc/bashrc 
$ ./Allwmake
```

ここで，私の環境では以下のエラーをOpenMPIのビルド中に出して失敗してしまいました．

```bash
libtool:   error: require no space between '-L' and '-lrt'
make[2]: *** [mca_pml_ucx.la] エラー 1
```

このエラーについて検索すると，[こちらの記事](https://github.com/easybuilders/easybuild-easyconfigs/issues/5805)に解決方法が示されており，`configure`するときに`--without-ucx`オプションを付ければ良いとのことでした．`Allwmake`スクリプトの該当する部分に１行追加します．

```bash
$ vi Allwmake
```
**変更箇所**

```bash
echo ========================================
echo Build MPI libraries if required
echo
case "$WM_MPLIB" in
OPENMPI)
    if [ -r $MPI_ARCH_PATH/lib${WM_COMPILER_LIB_ARCH}/libmpi.so ]
    then
 ~~ 省略 ~~
        ./configure \
            --prefix=$MPI_ARCH_PATH \
            --disable-orterun-prefix-by-default \
            --enable-shared --disable-static \
            --enable-mpi-thread-multiple \
            --libdir=$MPI_ARCH_PATH/lib${WM_COMPILER_LIB_ARCH} \
            --enable-mpi-fortran=none \
            --disable-mpi-profile \
            --without-ucx \  # 追加した
            $configOpt \
            ;
```

修正したら，再度`Allwmake`します．

```bash
$ ./Allwmake
```

# OpenFOAM本体のビルド

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

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

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

# OpenFOAM本体のビルド検証

OpenFOAM 4.xまでは，OpenFOAM本体のビルドが正常終了したら，環境設定読み込みを再度行い，テストのためのプログラム`foamInstallationTest`を以下のように実行するのが慣例でした．しかし，OpenFOAM 5.0以降では`foamInstallationTest`が**無い**ので以下はスキップします．

```bash
$ . /opt/OpenFOAM/OpenFOAM-10/etc/bashrc 
$ foamInstallationTest
```

# ParaView及びParaView Readerのビルド

## Qtのビルド

OpenFOAM 3.0.xまではQtをビルドするためのスクリプト`makeQt`が用意されていましたが，OpenFOAM 4.0以降では見当たりません．どうやらFoundation版のOpenFOAMでは`makeQt`が廃止されたようです．
    ESI版のOpenFOAMではまだ`makeQt`があるので，ESI版のレポジトリ[ThirdParty-common](https://develop.openfoam.com/Development/ThirdParty-common)にあるスクリプトを利用します．

```bash
$ cd /opt/OpenFOAM/ThirdParty-10
$ curl https://develop.openfoam.com/Development/ThirdParty-common/-/raw/main/makeQt > makeQt
$ chmod u+x makeQt
```

`makeQt`を実行するには以下のスクリプトも`ThirdParty`以下に準備する必要があります．

* `etc/tools/QtFunctions`
* `etc/tools/ThirdPartyFunctions`

このうち，`QtFunctions`はFoundation版とESI版では同じものですが，`ThirdPartyFunctions`は全く内容が異なるので，**Qtビルドのときだけ**スクリプトファイルを差し替えます．

```bash
$ mv etc/tools/ThirdPartyFunctions etc/tools/ThirdPartyFunctions.org
$ curl https://develop.openfoam.com/Development/ThirdParty-common/-/raw/main/etc/tools/ThirdPartyFunctions > etc/tools/ThirdPartyFunctions
```

必要なスクリプトの準備ができたら，バージョンを指定してQtをビルドします．

```bash
$ ./makeQt 5.9.6
```

Qtのビルドが完了したら，上述の`ThirdPartyFunctions`は元に戻しておきます．

```bash
$ mv etc/tools/ThirdPartyFunctions.org etc/tools/ThirdPartyFunctions
```

次に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-10/platforms/linux64Gcc55/qt-5.9.6/bin/"

# Set the path to cmake
CMAKE_PATH="/opt/OpenFOAM/ThirdParty-10/platforms/linux64Gcc55/cmake-3.9.0/bin/"
```

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

ビルドするバージョンを`OpenFOAM-10/etc/config.sh/paraview'で確認します．

```bash
$ more ../OpenFOAM-10/etc/config.sh/paraview
```

**確認箇所**

```bash
#- ParaView version, automatically determine major version
#export ParaView_VERSION=4.0.1
#export ParaView_VERSION=4.1.0
#export ParaView_VERSION=4.3.1
#export ParaView_VERSION=4.4.0
#export ParaView_VERSION=5.0.0
#export ParaView_VERSION=5.0.1
#export ParaView_VERSION=5.4.0
#export ParaView_VERSION=5.5.0
export ParaView_VERSION=5.6.3
export ParaView_MAJOR=detect
```

ParaViewをビルドします．今回はParaView 5.6.3がビルドされます．

```bash
$ ./makeParaView
$ wmRefresh
```

モジュール`paraview`ができますが，実際にParaViewを起動すると，OpenGLのシステムのバージョンとParaViewが要求するバージョンが異なるため，ParaViewが利用できませんでした．以前の[OpenFOAM v2206のインストール記事](https://qiita.com/yotakagi77/items/111ca4b5bda996ef437e)ではMESAに関する環境変数の設定でOpenGLを使わないように回避できましたが，今回はうまくいきませんでした．

ParaView 5.0.1以降のビルドでは，OpenGLに関する指定ができるので，以下のようにOpenGLライブラリ2.x以上の機能を利用しないようにし，古いOpenGLライブラリでのビルドを試みてみます．

```bash
$ vi makeParaView
```

**修正箇所(OpenGL2からOpenGLに変更)**

```bash
# Selection of the rendering backend, usually associated to the OpenGL version
RENDERING_BACKEND=OpenGL
# RENDERING_BACKEND=OpenGL2
```
再度，ParaViewをビルドします．しかしながら，以下のエラーで失敗してしまいました．

```bash
$ ./makeParaView
```

```bash
  There are no modules for VTK_RENDERING_BACKEND: 'OpenGL', forcing it to the
  default value of 'OpenGL2'.
Call Stack (most recent call first):
  VTK/CMake/vtkModuleTop.cmake:51 (include)
  VTK/CMakeLists.txt:94 (include)


-- Backend OpenGL2 modules: vtkDomainsChemistryOpenGL2;vtkIOExportOpenGL2;vtkImagingOpenGL2;vtkRenderingContextOpenGL2;vtkRenderingGL2PSOpenGL2;vtkRenderingLICOpenGL2;vtkRenderingOpenGL2;vtkRenderingOpenVR;vtkRenderingVolumeOpenGL2
-- Enabling modules for OpenGL2.
CMake Error at VTK/CMake/vtkModuleTop.cmake:56 (message):
  No such module "vtkRenderingVolumeOpenGL" needed by "VisItLib"
Call Stack (most recent call first):
  VTK/CMake/vtkModuleTop.cmake:72 (vtk_module_check)
  VTK/CMake/vtkModuleTop.cmake:79 (vtk_module_check)
  VTK/CMakeLists.txt:94 (include)
```

`OpenGL2`ではなく`OpenGL`を指定してビルドしようとしていますが，対応する古いモジュールが無いらしくダメだったようです．ParaViewの古いパッケージから該当するモジュールを持ってきて試してみたりもしましたが解決せず，今回は諦めることにしました．

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

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

```bash
$ . /opt/OpenFOAM/OpenFOAM-10/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`がエラーなしで計算実行できれば無事にインストール完了です．