install
コンパイル
スクリプト
ビルド
OpenFOAM
OpenFOAMDay 18

OpenFOAM自動ビルドスクリプトinstallOpenFOAM

OpenFOAM自動ビルドスクリプトinstallOpenFOAM

Gitリポジトリ

これは何か

スーパーコンピュータのように管理者権限が無いシステム上で,指定したバージョンのOpenFOAMと,依存するソフトウェアを自動的にソースからビルドしてインストールするbashスクリプトです.

OpenFOAMのソースからのビルドは面倒

  • OpenFOAMをビルドするには,MPIライブラリ,Gccコンパイラ,GMP,MPFR,boostなどの依存ソフトウェアが必要
  • 依存ソフトウェアがシステムに無い時,それらソースからビルドする必要が生じる
  • 種々の依存ソフトウェアのバージョン制限を考え,適切なバージョンのソースをダウンロードし,適切な順序でビルドしていくのは面倒

自動ビルドスクリプトの特徴

  • installOpenFOAMは単なるbashスクリプト
    • 管理者権限が不要なパッケージ管理システムとしては,Mac用のHomebrewやそのLinux版であるLinuxbrewがあるが,rubyで記述されており,rubyのビルドも必要となってしまうので,利用しないことにした
  • ソースを自動でダウンロード
    • OpenFOAM,ThirdParty,依存ソフトのソースを自動ダウンロード
    • downloadディレクトリに予めインストールファイルを置いておけば,ダウンロード不可の計算機でもOK
  • 依存ソフトウェアのバージョンを指定可能
    • 指定したバージョンの依存ソフトウェアをビルドして使用するようにOpenFOAM付随の各種スクリプトを自動で変更
  • ビルドした依存ソフトウェアの再利用(-lや-cオプションを付けた場合)
    • 異なるOpenFOAMのバージョンにおいて既にビルドした依存ソフトウェアが見付かった場合には,シンボリックリンクを貼る(-lオプション),もしくはコピーする(-cオプション).ただし,デフォルトでは再ビルドを行う.

設定ファイル

etc/system

ポスト名からシステム名の自動判別を行うbashスクリプト.

etc/system

以下のシステムは設定済.
- Oakforest-PACS (JCAHPC)
- Reedbush-U (東京大学)
- ITO (九州大学)
- FOCUS (計算科学振興財団)
- default(通常のLinuxマシン)

その他のシステムでは適宜書き変えてください.

etc/url

ダウンロードURLを設定しているbashスクリプト

etc/url

etc/version

ThirdPartyのソフトウェアバージョンを設定しているbashスクリプト

etc/version

system/システム名/settings

各システム用にコンパイラやMPIライブラリの設定をしているbashスクリプト

Reedbush-Uでのsettings

system/システム名/bashrc

  • インストールしたいOpenFOAM_VERSION,COMPILER,MPLIB等の組み合わせを列記する

Reedbush-Uでのbashrcの例

一般的なビルド方法

$HOME/OpenFOAM にOpenFOAMをインストールすると仮定します.

OpenFOAM用ディレクトリの作成

mkdir $HOME/OpenFOAM

レポジトリの取得

cd $HOME/OpenFOAM
git clone git@gitlab.com:OpenCAE/installOpenFOAM.git

設定ファイルの変更

既出の設定ファイルを適宜変更します.

ビルド

./install.sh OpenFOAM_VERSION=OpenFOAM-2.3.0,COMPILER_TYPE=system,COMPILER=Gcc4_8_5,COMPILE_OPTION=Opt,ARCH_OPTION=64,PRECISION_OPTION=DP,LABEL_SIZE=32,MPLIB=OpenMPI

引数にはsystem/システム名/bashrcにおけるOpenFOAM_BUILD_OPTION_LIST配列で定義しているビルドするバージョンが指定できます.引数を指定しないと,OpenFOAM_BUILD_OPTION_LIST配列で定義した全てのバージョンをビルドします.

./install.sh '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'

引数がOpenFOAM_BUILD_OPTION_LIST配列の要素とのマッチにはexprコマンドを用いているため,上記の例のように正規表現で記述することも可能です.

環境設定

'.'(ドット)またはsourceコマンドを用いて,install.shを-sオプションを付きで実行すると,引数で指定したバージョンのOpenFOAMの環境設定のみを行います.

. $HOME/OpenFOAM/installOpenFOAM/install.sh -s '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'

Reedbush-Uでのビルド方法

Reedbushのログインノードでは並列実行・コンパイルが禁止されており,また負荷がかかるプロセスも動作不可です.また,計算ノードではファイルのダウンロードができません.そこで,ログインノードではOpenFOAMやThirdPartyおよび依存ソフトウェアのインストールファイルのダウンロードとファイルの展開のみを行い,バッチジョブを用い36コアの計算ノードで最大36並列の並列ビルドを行います.

また,Reedbushでは計算ノードから参照できるよう,OpenFOAMをlustreファイルシステムにインストールする必要があります.しかし,ログインノードからは通常通り$HOME/OpenFOAMとして参照できるほうが便利です.従って,ここでは,OpenFOAMはlustreファイルシステム内の計算データ用領域である/lustre/グループ名/ユーザー名/OpenFOAMにインストールし,$HOME/OpenFOAMからシンボリックリンクを貼ることします.既に$HOME/OpenFOAMのディレトリやファイルがある場合には,予め別名にするか別の場所に移動していおいてから以下を実行してください.

OpenFOAM用ディレクトリの作成

mkdir /lustre/$(id -gn)/$(id -un)/OpenFOAM

homeファイルシステムからのリンク作成

ln -s /lustre/$(id -gn)/$(id -un)/OpenFOAM $HOME/OpenFOAM

レポジトリの取得

cd /lustre/$(id -gn)/$(id -un)/OpenFOAM
git clone git@gitlab.com:OpenCAE/installOpenFOAM.git

インストールファイルのダウンロードと展開

Reedbushのログインノードでinstall.shを実行すると,ファイルのダウンロードと展開のみが行われます.

cd installOpenFOAM
./install.sh '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'

install.shの引数にはsystem/Reedbush-U/bashrcにおけるOpenFOAM_BUILD_OPTION_LIST配列で定義しているビルドするバージョンを指定します.

バッチジョブでのビルド

バッチジョブによリ1ノード36並列でビルドします.当然トークンは消費されますが,それほど多くはありません.

予めsystem/Reedbush-U/jobScriptの内容をビルドするバージョン用に書き変えてから,ジョブを投入します.

qsub -W group_list=グループ名 system/Reedbush-U/jobScript

ただし,上記のjobScriptではすぐに実行できるよう,debugキューを指定しており,debugキューの最大経過時間30分を指定しているので,1回の実行ではビルドが完了しない可能性があります.そこで,ビルドが終了するまで上記を何回か繰り返す必要あります(コンパイラとOpenFOAMのバージョンの組み合わせにつき概ね2から3回).チェーンジョブを用いて後続ジョブを自動投入するには,以下のスクリプトを実行してください.なお,job.sh内の最大投入ジョブ数(MAX_QUEUE)は適宜変更してください.

system/Reedbush-U/job.sh

環境設定

例えば以下のようにします.

. /lustre/$(id -gn)/$(id -un)/OpenFOAM/installOpenFOAM/install.sh -s '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'

Oakforest-PACSでのビルド方法

Oakforest-PACSのログインノード(CPU: Intel Xeon CPU E5-2690 v4, Broadwell, 2.60GHz)では並列実行・コンパイルが禁止されており,また負荷がかかるプロセスも動作不可です.また,計算ノードではファイルのダウンロードができません.さらに,コア単体性能が低いXeon Phiの計算ノードでビルドするのは効率が悪いです.そこで,ログインノードではOpenFOAMやThirdPartyおよび依存ソフトウェアのインストールファイルのダウンロードとファイルの展開のみを行い,ログインノードとCPUが同じであるprepostのインタラクティブキューを用い最大28並列の並列ビルドを行います.

また,Oakforest-PACSでは計算ノードから参照できるよう,OpenFOAMをworkファイルシステムにインストールする必要があります.しかし,ログインノードからは通常通り$HOME/OpenFOAMとして参照できるほうが便利です.従って,ここでは,OpenFOAMはworkファイルシステム内の計算データ用領域である/work/グループ名/ユーザー名/OpenFOAMにインストールし,$HOME/OpenFOAMからシンボリックリンクを貼ることします.既に$HOME/OpenFOAMのディレトリやファイルがある場合には,予め別名にするか別の場所に移動していおいてから以下を実行してください.

OpenFOAM用ディレクトリの作成

mkdir /work/$(id -gn)/$(id -un)/OpenFOAM

Homeファイルシステムからのリンク作成

ln -s /work/$(id -gn)/$(id -un)/OpenFOAM $HOME/OpenFOAM

レポジトリの取得

cd /work/$(id -gn)/$(id -un)/OpenFOAM
git clone git@gitlab.com:OpenCAE/installOpenFOAM.git

インストールファイルのダウンロードと展開

Oakforest-PACSのログインノードでinstall.shを実行すると,ファイルのダウンロードと展開のみが行われます.

cd installOpenFOAM
./install.sh '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'

install.shの引数にはsystem/Oakforest-PACS/bashrcにおけるOpenFOAM_BUILD_OPTION_LIST配列で定義しているビルドするバージョンを指定します.

prepostインタラクティブキューでのビルド

まず,prepostキューのインタラクティブジョブを実行します.もし,id -gnの結果と異なるグループ名を指定したい場合には,適宜変更してください.なお,prepostキューではトークンは消費されません.

pjsub --interact -g $(id -gn) -L rscgrp=prepost --mpi proc=28

インタラクティブジョブが実行されて,prepost用のノードにログインしたら,通常通りinstall.shをビルドすると,最大28並列でビルドします.

./install.sh '.*OpenFOAM-2.3.1.*Gcc4_8_5.*' >& log.install.sh &
tail -f log.install.sh

prepostキューの最大経過時間は6時間ですが,制限時間内に途中終了した場合には,prepostキューのインタラクティブジョブを実行から再度やり直します.

環境設定

例えば以下のようにします.

. /work/$(id -gn)/$(id -un)/OpenFOAM/installOpenFOAM/install.sh -s '.*OpenFOAM-2.3.1.*Gcc4_8_5.*'