CentOSにOpenFOAM v2312をインストール

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

# OpenFOAMのダウンロード

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

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

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

# インストールの種類

ESIのサイトでは，Windows，Mac，Linuxのバイナリがダウンロードできます．Windowsでは，Windows Subsystem for Linux (WSL)によるインストールもできます．ソースからビルドする方法については，[レポジトリ](https://develop.openfoam.com/Development/openfoam/-/blob/master/doc/Build.md)に最新の情報が掲載されています．この記事ではOpenFOAMをCentOS 7.xにソースからビルドすることを試みます． CentOS 7.xではソースからビルドする以外に， [yumによるパッケージインストール](https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/redhat)や[spack](https://spack.readthedocs.io/en/latest/)によるビルドもできます．

# インストールの方針

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

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

* `OpenFOAM-v2312/`

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

* `ThirdParty-v2312/`

```
Allclean         makeAdios2      makeLLVM             makePETSC
Allwmake         makeCCMIO       makeMETIS            makeParaView
BUILD.md         makeCGAL        makeMGridGen         makeParaView.example
COPYING          makeCmake       makeMPICH            makeQt
Environ.md       makeFFTW        makeMVAPICH          makeSCOTCH
README.md        makeGcc         makeMesa             makeVTK
Requirements.md  makeGperftools  makeMesa.example     makeVTK.example
SOURCES.md       makeHYPRE       makeOPENMPI          minCmake
etc              makeKAHIP       makeOPENMPI.example  sources
```

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

# 最小限のシステム要件

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

* gcc: 7.5.0 (最小限、必ずしも推奨されるわけではない)
* cmake: 3.8 (ParaViewとCGALのビルドに必要)
* boost: 1.48 (CGALのビルドに必要)
* fftw: 3.3.7 (FFTに関する機能を使う場合は必要)
* paraview: 5.6.3 (可視化用)
* Qt: 5.9 (ParaViewビルドに必要)

元のOSシステムのgcc， cmake， openmpiのバージョンは以下のコマンドで確認できます．

```bash
$ gcc --version
$ cmake --version
$ orterun --version
```
私の環境では， gccは4.8.5，cmakeは2.8.12.2，openmpiは1.8.8でした．　以下の記事ではgccを`ThirdParty-v2312`以下でコンパイルしますが，システムのgccを使う方は読み替え等をお願いします．

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

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

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

* gcc-7.5, gmp-6.2.0, mpfr-4.0.2, mpc-1.1.0, openmpi-4.1.2, scotch_6.1.0, boost_1_74_0, CGAL-4.14.3, cmake-3.8.2(ParaView 5.7-5.8利用にはcmake-3.10が必要), qt-5.6.3 or qt-5.9.3 (ParaView 5.9にはqt-5.12以上), fftw-3.3.10, libccmio-2.6.1, kahip-3.15, ADIOS2-2.9.2

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

**GCC**

```bash
$ cd ThirdParty-v2312
$ wget https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz
$ tar zxvf gcc-7.5.0.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**

`sources`以下にあります．

**Scotch**

`sources`以下にあります．

**Boost**

`sources`以下にあります．

**CGAL**

`sources`以下にあります．

**Cmake**

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

**Qt (qmake)**

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

**FFTW**

`sources`以下にあります．

**libccmio**

STAR-CCM+のメッシュコンバータが必要な場合のみビルドします．以前のダウンロード先が無くなってしまったので，foam-extendから持ってきます．

```bash
$ wget https://sourceforge.net/projects/foam-extend/files/ThirdParty/libccmio-2.6.1.tar.gz
$ tar zxvf libccmio-2.6.1.tar.gz
```

**ParaView**

`sources`以下にあります．

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

## OpenFOAM本体の環境設定

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

```bash
$ vi ../OpenFOAM-v2312/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
# Specify SYSTEMOPENMPI1, SYSTEMOPENMPI2 for internal tracking (if desired)
# Can also 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-v2312/etc/config.sh/compiler
```

**変更箇所**

```bash
case "$WM_COMPILER_TYPE" in
ThirdParty)
    # Default/minimum versions (compiler, GMP, MPFR, MPC) - override as needed

    default_clang_version=llvm-5.0.2
    default_gcc_version=gcc-7.5.0

    default_gmp_version=gmp-6.2.0
    default_mpfr_version=mpfr-4.0.2
    default_mpc_version=mpc-1.1.0

    gmp_version="$default_gmp_version"
    mpfr_version="$default_mpfr_version"
    mpc_version="$default_mpc_version"
```

## 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

GMP_PACKAGE="${gmp_version:-gmp-system}"
MPFR_PACKAGE="${mpfr_version:-mpfr-system}"
MPC_PACKAGE="${mpc_version:-mpc-system}"
GCC_PACKAGE="$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

BOOST_PACKAGE="${boost_version:-boost-system}"
GMP_PACKAGE="${gmp_version:-gmp-system}"
MPFR_PACKAGE="${mpfr_version:-mpfr-system}"
CGAL_PACKAGE="$cgal_version"
```

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

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

**確認箇所**

```bash
boost_version=boost_1_74_0
cgal_version=CGAL-4.14.3
```

## FFTWビルドの設定

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

```bash
vi makeFFTW
```

**確認箇所**

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

PACKAGE="${fftw_version:-none}"
```

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

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

**確認箇所**

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

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

## GCCのビルド

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

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

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

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

    Either install this compiler version, or use the system compiler by setting
    WM_COMPILER_TYPE to 'system' in $WM_PROJECT_DIR/etc/bashrc.
===============================================================================
No completions for /opt/OpenFOAM/OpenFOAM-v2312/platforms/linux64GccDPInt32Opt/bin
[ignore if OpenFOAM is not yet compiled]
```

```bash
$ ./makeGcc
```

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

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

## Cmakeのビルド

Cmakeをビルドします．バージョンをオプションで指定する必要があります．以前はバージョン3.12や3.13で大丈夫でしたが，以降のADIOS2のビルドの際に失敗するので3.14を利用します．

```bash
./makeCmake cmake-3.14.5
```

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

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

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

```bash
Build adios library ADIOS2-2.9.2 for openmpi-4.1.2

Starting build: ADIOS2-2.9.2 (using cmake)

no patch found for ADIOS2-2.9.2
Using cmake=/usr/bin/cmake
+ /usr/bin/cmake -DCMAKE_INSTALL_PREFIX=/opt/OpenFOAM/ThirdParty-v2312/platforms/linux64Gcc/ADIOS2-2.9.2 -DCMAKE_BUILD_TYPE=Release -DADIOS2_USE_Fortran=FALSE -DADIOS2_BUILD_EXAMPLES=FALSE /opt/OpenFOAM/ThirdParty-v2312/sources/adios/ADIOS2-2.9.2
CMake Error at CMakeLists.txt:6 (cmake_minimum_required):
  CMake 3.12 or higher is required.  You are running version 2.8.12.2


-- Configuring incomplete, errors occurred!
Error building: ADIOS2-2.9.2

    ---------------------------------------------------
    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.14.5/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-v2312/etc/bashrc
$ foam
$ ./Allwmake –j4
```

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

# OpenFOAM本体のビルド検証

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

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

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

Done
```

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

```bash
export LANG=C
```

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

# ParaViewのビルド

## Qtのビルド

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

```bash
$ cd $WM_THIRD_PARTY_DIR
$ more makeQt
```

**確認箇所**

```bash
# Description
#     Build script for QT (the qt-everywhere-opensource-src package)
#
# ----------------------------------------------
# NO USER-CONFIGURABLE SETTINGS WITHIN THIS FILE
#------------------------------------------------------------------------------
if :    # Run from third-party directory
then
    cd "${0%/*}" || exit
    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
    }
fi
. "${WM_THIRD_PARTY_DIR:?}"/etc/tools/ThirdPartyFunctions
. "${WM_THIRD_PARTY_DIR:?}"/etc/tools/QtFunctions
```
以前のOpenFOAMバージョンでは`makeQt`の中でユーザーが指定することができましたが，設定をここで変えることはできません．とりあえず，`makeQt`のヘルプを出してみます．

```bash
$ ./makeQt -help
```

```bash
Usage: makeQt [OPTION] [qt-VERSION] [-- configure-options]
options:
  -force        Force compilation, even if it already exists
  -gcc          Force use of gcc/g++
  -list         List available unpacked source versions
  -help         Display usage help

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

バージョンを指定して実行すればよいようなので，5.12.11をコンパイルしてみます (qt-5.9.3はParaView-v5.9.1の最低要件を満たしていません)．

```bash
$ ./makeQt　5.12.11
```

エラーが出ないでビルドされることを確認します．

## ParaViewのビルド

次にParaViewをビルドします． qmake（Qt）及びCmakeのパスが設されていないのでスクリプトのオプションで指定してビルドします．今回はParaView 5.11.2をビルドします．

```bash
$  ./makeParaView -qmake platforms/linux64Gcc/qt-5.12.11/bin -cmake platforms/linux64Gcc/cmake-3.14.5/bin 5.11.2
```

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

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

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

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

```bash
$ cd
$ . /opt/OpenFOAM/OpenFOAM-v2312/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であり，利用しているシステムのCPU数(コア数)が少ない場合はエラーとなるので，その場合は`system/decomposeParDict`を修正して並列数を変更します．

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

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