この記事は流体解析のオープンソースソフトウェアであるOpenFOAMのバージョンv2106を,CentOS 7.xにインストールした際の手順を備忘録としてまとめたものです. 以前のバージョンではCentOS 6.xにインストールしていましたが,CentOS 6.xのサポートが切れましたので,手元のサーバのOSバージョンも (やっと) アップデートしました.
OpenFOAMのダウンロード
OpenFOAMのバイナリパッケージ及びソースコードは以下のサイトから入手できます.
1つめのサイトはESIグループによるものです.一方,2つめのサイトはOpenFOAM Foundationによるものです.リリースされた年月でバージョンがついてるもの,すなわち今回のv2106(2021年6月リリース)は前者のESIのサイトから入手できます.
インストールの種類
ESIのサイトでは,Windows,Mac,Linuxのバイナリがダウンロードできます.Windowsでは,Windows Subsystem for Linux (WSL)によるインストールもできます.ソースからビルドする方法については,レポジトリに最新の情報が掲載されています.この記事ではOpenFOAMをCentOS 7.xにソースからビルドすることを試みます. CentOS 7.xではソースからビルドする以外に, yumによるパッケージインストールやspackによるビルドもできます.
インストールの方針
- OpenFOAMはコンパイラやライブラリの要件があり,システムにインストール済みのものではバージョンが古いことがあります.システムにインストール済みのコンパイラ・ライブラリはアップデートせずに,OpenFOAMのサードパーティディレクトリで別途ビルドして環境構築を行うことにします(もとのシステム環境を汚さない).
- 通常のデスクトップPCへのインストールでは
$Home
にインストールすることがよくありますが、今回は他のユーザも利用する計算サーバへのインストールを想定し,/opt
以下にインストールします.
インストール手順の概要
- 管理者権限で必要なrpmパッケージをダウンロード・インストールする.
- OpenFOAM本体,サードパーティのビルドに必要となるソースパッケージをダウンロードし,展開する.
- 環境設定ファイル・ビルドスクリプトを編集する.
- サードパーティ(ツール,ライブラリ)のビルドする.
- OpenFOAM本体をビルドする.
- ビルドしたOpenFOAM本体(ソルバー)の動作検証を行う.
- 可視化に用いるParaViewをビルドする.
- 流体解析の一連の流れである,前処理(メッシュ生成),計算実行, 後処理(可視化)ができることを確認する.
手順7.のParaViewのビルドは失敗することが多々あり,どうしてもうまくいかないときはあきらめます.ParaViewはCentOSサーバ以外にも別途インストールできるので,計算データを手元の環境にダウンロードして可視化を行うことができます.
必要なrpmパッケージのインストール
必要なパッケージは以下のとおりです.
- git, gcc-c++, bison, flex, m4, glibc-devel, glibc-devel.i686, zlib-devel
管理者権限でyum
を使って上記のパッケージをインストールします.
$ yum install gcc gcc-c++ bison flex m4 glibc-devel glibc-devel.i686 zlib-devel
OpenFOAMソースパッケージのダウンロード・展開
OpenFOAMのパッケージは本体ソースコードとサードパーティパッケージの2種類から構成されています.ここでは異なるバージョンも管理できるように/opt/OpenFOAM
というディレクトリを作成し,その下にwget
でダウンロードして展開します.
$ mkdir /opt/OpenFOAM
$ cd /opt/OpenFOAM
$ wget https://dl.openfoam.com/source/v2106/OpenFOAM-v2106.tgz
$ tar zxvf OpenFOAM-v2106.tgz
$ wget https://dl.openfoam.com/source/v2106/ThirdParty-v2106.tgz
$ tar zxvf ThirdParty-v2106.tgz
認証の関係でHTTPSのダウンロードができない場合は,--no-check-certificate
をオプションを付けるか,.wgetrcの設定などによって回避してください.
各パッケージを展開したのちのディレクトリ・ファイルの構成は以下のようになります.
OpenFOAM-v2106/
Allwmake COPYING README.md bin etc src wmake
CONTRIBUTORS.md META-INFO applications doc modules tutorials
ThirdParty-v2106/
ADIOS2-2.6.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.9.1 makeCmake makeMesa minCmake
README.md makeFFTW makeMesa.example openmpi-4.0.3
Requirements.md makeGcc makeOPENMPI scotch_6.1.0
SOURCES.txt makeGperftools makeOPENMPI.example
boost_1_66_0 makeHYPRE makePETSC
OpenFOAMのビルド方法はOpenFOAM® Quick Build Guideに掲載されていますが,展開したOpenFOAM-v2106
及びThirdParty-v2106
にあるREADME.md
,Requirements.md
,BUILD.md
を熟読し,SOURCES.txt
もチェックします.
最小限のシステム要件
公式サイトで指定されている要件は以下のとおりです.
- gcc: 4.8.5 (intel compilerを使う場合は 17.0.1 20161005 以上)
- 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のバージョンは以下のコマンドで確認できます.
$ gcc --version
$ cmake --version
$ orterun --version
私の環境では, gccは4.8.5,cmakeは2.8.12.2,openmpiは1.8.8でした. gccはシステムのもので良さそうです.以下の記事ではgccをThirdParty-v2106
以下でコンパイルしますが,システムのgccを使う方は読み替え等をお願いします.
サードパーティパッケージに必要なソースのダウンロード・展開
上記のThirdParty-v2106
以下で必要となるコンパイラ・ライブラリは以下のとおりです
(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.1.0, boost_1_66_0, CGAL-4.12.2, 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.7, libccmio-2.6.1
コンパイラはGCC以外のintelコンパイラなどでも可能です.GCCのバージョンは4.8.5より新しいものでも大丈夫ですが,後で出てくる設定を合わせて変更する必要があります.
GCC
$ cd ThirdParty-v2106
$ 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)
$ 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
$ wget https://cmake.org/files/v3.13/cmake-3.13.5.tar.gz
$ tar zxvf cmake-3.13.5.tar.gz
Qt (qmake)
$ wget https://download.qt.io/official_releases/qt/5.12/5.12.11/single/qt-everywhere-src-5.12.11.tar.xz
$ tar xvf qt-everywhere-src-5.12.11.tar.xz
$ mv qt-everywhere-src-5.12.11 qt-everywhere-opensource-src-5.12.11
FFTW
すでにサードパーティディクトリにあります.
libccmio
STAR-CCM+のメッシュコンバータが必要な場合のみビルドします.ダウンロード先が以前とは異なっています.
$ 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
利用で説明します.
$ vi ../OpenFOAM-v2106/etc/bashrc
修正箇所
# [WM_COMPILER_TYPE] - Compiler location:
# = system | ThirdParty
export WM_COMPILER_TYPE=ThirdParty
メッシュのラベルサイズを32ビットから64ビットにしたい場合は以下のように変更してください.
# [WM_LABEL_SIZE] - Label size in bits:
# = 32 | 64
export WM_LABEL_SIZE=64
# [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
# [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ライブラリの指定を変更します.
$ vi ../OpenFOAM-v2106/etc/config.sh/compiler
変更箇所
case "$WM_COMPILER_TYPE" in
ThirdParty)
# Default/minimum versions (compiler, GMP, MPFR, MPC) - override as needed
default_clang_version=llvm-3.7.1
default_gcc_version=gcc-4.8.5
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ビルドの設定
$ vi makeGcc
確認箇所
先ほど編集したconfig.sh/compiler
からコンパイラ・GNUライブラリのバージョンを参照するので,
以下は確認するだけです.
[ "${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のビルドスクリプトを上と同様に確認します.
$ vi makeCGAL
確認箇所
# 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の設定を確認します.
vi ../OpenFOAM-v2106/etc/config.sh/CGAL
確認箇所
boost_version=boost_1_66_0
cgal_version=CGAL-4.12.2
FFTWビルドの設定
FFTWのビルドスクリプトを確認します.
vi makeFFTW
確認箇所
# FFTW version from OpenFOAM etc/config.sh file:
_foamConfig FFTW
fftwPACKAGE=${fftw_version:-fftw-system}
OpenFOAM本体でのFFTWの設定を確認します.
vi ../OpenFOAM-v2106/etc/config.sh/FFTW
確認箇所
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-v2106/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.
===============================================================================
No completions for /opt/OpenFOAM/OpenFOAM-v2106/platforms/linux64GccDPInt32Opt/bin
[ignore if OpenFOAM is not yet compiled]
$ ./makeGcc
ビルドしたGccを有効にするために,OpenFOAMの環境設定を再度読み込みます.
$ . /opt/OpenFOAM/OpenFOAM-v2106/etc/bashrc
Cmakeのビルド
Cmakeをビルドします.バージョンをオプションで指定する必要があります.
./makeCmake cmake-3.13.5
サードパーティパッケージのビルド
Cmakeのビルドが完了したら,残りのパッケージのビルドをAllwmake
で行います.実行する前にもう一度OpenFOAMの環境設定を読み込みます.
$ . /opt/OpenFOAM/OpenFOAM-v2106/etc/bashrc
$ ./Allwmake
ADIOS2のビルド時に以下のようなエラーが出てしまいます.
no patch found for ADIOS2-2.6.0
Using cmake=/usr/bin/cmake
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.6.0
---------------------------------------------------
Optional component (ADIOS2) had build issues
OpenFOAM will nonetheless remain largely functional
---------------------------------------------------
サードパーティ以下にビルドしたCmakeを利用していないようなので,PATHを明示的に設定してADIOS2を再ビルドします.
$ ./makeAdios2 -cmake $WM_THIRD_PARTY_DIR/platforms/linux64Gcc/cmake-3.13.5/bin/
以上のサードパーティのビルドが終わったら,OpenFOAM本体ビルドのための条件を満たしているかどうかを以下のコマンドでチェックします.
$ foamSystemCheck
System check: PASS
==================
Can continue OpenFOAM installation.
PASS
が表示されたら,OpenFOAM本体のビルドに移ります.
OpenFOAM本体のビルド
再度OpenFOAMの環境設定を読み込んでからビルドします.Allwmake
スクリプトを利用しますが,-j
オプションで並列コンパイルのcpu数を指定できるので,環境に合わせて設定します.また,エイリアスコマンドfoam
を用いると,OpenFOAMのプロジェクトディレクトリ(インストールディレクトリ)$WM_PROJECT_DIR
に移動できます.
$ . /opt/OpenFOAM/OpenFOAM-v2106/etc/bashrc
$ foam
$ ./Allwmake –j4
もしエラーが出て正常終了しないときは,エラーメッセージから足りないライブラリがないかどうかなどを確認します.
OpenFOAM本体のビルド検証
OpenFOAM本体のビルドが正常終了したら,環境設定読み込みを再度行い,テストのためのプログラムを実行します.
$ . /opt/OpenFOAM/OpenFOAM-v2106/etc/bashrc
$ foamInstallationTest
ライブラリパスなどの確認結果が出力され,最後に以下のような要約が出力されればOKです.
Summary
-------------------------------------------------------------------------------
Base configuration ok.
Critical systems ok.
Done
gcc -v
のバージョン出力で日本語が含まれる場合は上記のfoamInstallationTest
がエラーとなるので,その前に
export LANG=C
などとして日本語を使用しないようにしてください.
ParaViewのビルド
Qtのビルド
makeQt
の中でバージョン・パッケージの指定の仕方を確認します.
$ more makeQt
確認箇所
# 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%/*}" || 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
}
. etc/tools/ThirdPartyFunctions
. etc/tools/QtFunctions
以前のOpenFOAMバージョンではmakeQt
の中でユーザーが指定することができましたが,設定をここで変えることはできません.とりあえず,makeQt
のヘルプを出してみます.
$ ./makeQt -h
usage: makeQt [OPTION] [qt-VERSION] [-- configure-options]
options:
-force Force compilation, even if it already exists
-gcc Force use of gcc/g++
-help
* build qt-everywhere-opensource-src, version undefined
バージョンを指定して実行すればよいようなので,5.12.11をコンパイルしてみます (qt-5.9.3はParaView-v5.9.1の最低要件を満たしていません).
$ ./makeQt 5.12.11
エラーが出ないでビルドされることを確認します.
##ParaViewのビルド
次にParaViewをビルドします. ビルドを実行する前に,元々ThirdParty
以下にあるソースは古いgccに対するバグがあるため,以下のようにソースを修正しておきます(レポジトリより持ってきてもOK).
VTKExtensions/FiltersGeneral/vtkAnnotateGlobalDataFilter.cxx
の104-106行目を修正します ({ }
の追加).
$ vi ParaView-v5.9.1/VTKExtensions/FiltersGeneral/vtkAnnotateGlobalDataFilter.cxx
- std::array<char, 12> IntegralTypes = { VTK_CHAR, VTK_SIGNED_CHAR, VTK_UNSIGNED_CHAR, VTK_SHORT,
+ std::array<char, 12> IntegralTypes = { { VTK_CHAR, VTK_SIGNED_CHAR, VTK_UNSIGNED_CHAR, VTK_SHORT,
VTK_UNSIGNED_SHORT, VTK_INT, VTK_UNSIGNED_INT, VTK_LONG, VTK_UNSIGNED_LONG, VTK_ID_TYPE,
- VTK_LONG_LONG, VTK_UNSIGNED_LONG_LONG };
+ VTK_LONG_LONG, VTK_UNSIGNED_LONG_LONG } };
qmake(Qt)及びCmakeのパスが設されていないのでスクリプトのオプションで指定してビルドします.
$ ./makeParaView -qmake platforms/linux64Gcc/qt-5.12.11/bin -cmake platforms/linux64Gcc/cmake-3.13.5/bin
モジュールparaview
ができてビルド完了です.
$ ls platforms/linux64Gcc/ParaView-5.9.1/bin/paraview
platforms/linux64Gcc/ParaView-5.9.1/bin/paraview
しかしながら,この状態でparaFoam
を実行すると, ParaViewが起動した際にOpenGLのシステムのバージョンとParaViewが要求するバージョンが異なるため,ParaViewが利用できません. stack overflowの記事やCFD Onlineの記事を参照すると,MESAに関する環境変数の設定か,libglu1-mesa-dev
のインストールで回避できそうです.ここでは前者の方法を採用してみます.環境変数の設定を毎回するのは面倒なので,OpenFOAMのparaview設定ファイルに少し追記してみます.
$ vi /opt/OpenFOAM/OpenFOAM-v2106/etc/config.sh/paraview
# USER EDITABLE PART: Changes made here may be lost with the next upgrade
ParaView_VERSION=5.9.1
ParaView_QT=qt-system
export MESA_GL_VERSION_OVERRIDE=3.3
62行目に環境変数MESA_GL_VERSION_OVERRIDE
を設定して,ParaViewが要求するMESAのバージョンを強制認識させるようにしました. エラーを出さずにparaFoam
からParaViewが起動できたので多分大丈夫そうです.
OpenFOAMでの前処理,計算実行,後処理の動作確認
上記のインストール作業がすべて終了したら,OpenFOAMによって流体解析の一連の流れである,前処理(メッシュ作成),計算実行,後処理(可視化)が正常にできるかどうかを,チュートリアルケースであるpitzDaily
を利用して確かめます.
$ cd
$ . /opt/OpenFOAM/OpenFOAM-v2106/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).
$ run
$ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pipeCyclic ./
$ cd pipeCyclic
$ ./Allrun
Allrun
はメッシュ生成から解析条件設定・計算実行を自動的に行うスクリプトです.pitzDaily
及びpipeCyclic
がエラーなしで計算実行できれば無事にインストール完了です.