OpenFOAM

最終更新日:2022年8月4日

OpenFOAM (Field Operation and Mnipulation)は、 複雑な条件の流体計算から分子動力学や電磁気学等、 さまざまな現象をシミュレートする構造化された統合ソルバー集です。 OpenFOAM は OpenCFD 社が開発している版 (vYYMM) と、 The OpenFOAM Foundation が開発している版 (4.x, 5.x, ..) があり、 ともに GPL ライセンスの下でオープンソースとして 開発と配布がなされています。

OpenFOAM に関する情報は以下をご覧下さい。
OpenFOAM 公式ドキュメント(英語)
OpenFOAM ユーザー会 Wiki
OpenCAE 学会

The OpenFOAM Foundation版は試験的に導入したものであるため、
利用方法や不具合についての問い合せは対応できない可能性が高いことを予めご了承ください。

利用環境


利用方法

下準備

計算を始める前の下準備は フロントエンドサーバ 上で対話処理にて行います。

OpenFOAM で実行可能な case 一式を既にお持ちの場合は 実行に進んでください。

◆セットアップスクリプトの実行

まず最初に OpenFOAM を利用するために必要な環境変数等の設定を行います。

ご利用のシェルと OpenFOAM のバージョンに応じて、 以下の要領で $HOME/.bashrc に記述してください。

◆環境設定

version: v1912

module load openfoam/v1912_ompi

version: v1812

module load openfoam/v1812_ompi

version: v1706

. /home/app/a/OpenFOAM/OpenFOAM-v1706/etc/bashrc

version: 5.0

. /home/app/a/OpenFOAM/OpenFOAM-5.0/etc/bashrc

◆case の作成

OpenFOAM で計算をする為の case を作成してください。
case の場所は $HOME 以下であれば何処でも構いませんが、
$WM_PROJECT_USER_DIR で指定されている場所に置く事が 推奨されています。

尚、チュートリアルが $WM_PROJECT_DIR/tutorials/ 以下にありますので、 case のサンプルとしてご利用戴けます。

◆pre-processing

次に前処理として、 メッシュの生成や 並列実行の為の メッシュ分割 などを行います。

尚、これらの処理がフロントエンドサーバ上で実行するには 重すぎると判断される時には、
あらかじめメッシュ分割を済ませた case を用意するか、 バッチ処理にてバックエンドで実行して下さい。

◆プログラムのコンパイル

自作のプログラムを OpenFOAM の機構に組み込んで利用する場合は wmake で コンパイル を行います。

コンパイルした実行形式は $FOAM_USER_APPBIN に入れてください。
ライブラリをコンパイルされた場合は $FOAM_USER_LIBBIN に入れてください。
これらの設定は、プログラム・ソースディレクトリにある Make/files で行います。

$ cat Make/files hogeFoam.C EXE = $(FOAM_USER_APPBIN)/hogeFoam

パスがデフォルトで設定されていますので、新たにパスの設定をしなくても そのまま利用できます。

実行方法(サブシステムA,B)

ここでは MPI を用いたバッチリクエストファイルの例を示します。

OpenFOAM-v1912

#!/bin/bash
#PJM -L "rscunit=ito-b"
#PJM -L "rscgrp=ito-g-16-dbg"
#PJM -L "vnode=4"
#PJM -L "vnode-core=36"
#PJM -L "elapse=1:00:00"
#PJM -P "vn-policy=abs-unpack"
#PJM -j

module load openfoam/v1912_ompi

export NPROCS=144

blockMesh > log.blockMesh 2>&1
decomposePar > log.decomposePar 2>&1
mpiexec -n 144 -machinefile "${PJM_O_NODEINF}" \
--map-by ppr:36:node -mca orte_rsh_agent /bin/pjrsh \
-mca btl_openib_warn_default_gid_prefix 0 \
${FOAM_APPBIN}/sonicFoam -parallel > ./log.sonicFoam 2>&1
reconstructPar > log.reconstructPar 2>&1
使用シェルがbashであることを指定
サブシステムBでの実行を指定
リソースグループをito-g-16-dbgに設定
仮想ノード数(OpenFOAMの場合は物理ノード数)を4に指定
仮想ノードの持つCPUコア数を指定(36が推奨)
最大経過時間を1時間に設定



環境設定
使用する OpenFOAM の版に応じて指定




sonicFoam を mpiexec で実行





OpenFOAM-v1706, 5.0

#!/bin/bash
#PJM -L "rscgrp=ito-g-16-dbg"
#PJM -L "rscunit=ito-b"
#PJM -L "vnode=4"
#PJM -L "vnode-core=36"
#PJM -L "elapse=1:00:00"
#PJM -j -X -S

## OpenFOAM-v1706
. /home/app/a/OpenFOAM/OpenFOAM-v1706/etc/bashrc
## OpenFOAM-5.0
#. /home/app/a/OpenFOAM/OpenFOAM-5.0/etc/bashrc

mpiexec -N 4 -n 144 -npernode 36 -machinefile "${PJM_O_NODEINF}" \
sonicFoam -parallel > ./log.sonicFoam 2>&1
使用シェルがbashであることを指定
サブシステムBでの実行を指定
リソースグループをito-g-16-dbgに設定
仮想ノード数(OpenFOAMの場合は物理ノード数)を4に指定
仮想ノードの持つCPUコア数を指定(36が推奨)
最大経過時間を1時間に設定



環境設定
使用する OpenFOAM の版に応じて指定


sonicFoam を mpiexec で実行

実行方法(フロントエンド)

フロントエンドは基本的では1ノード内での並列処理であり、ノード間並列を使わないため若干ジョブでのsolverの実行方法と異なる部分があります。
具体的には以下のように、フロントエンドでsolverを動かす際には、 -mca orte_rsh_agent で /bin/ssh を指定します。
mpiexec -n 36 -mca orte_rsh_agent /bin/ssh ${FOAM_APPBIN}/sonicFoam  -parallel > ./log.sonicFoam 2>&1

post-processing

スレッド毎に分割された出力ファイルに対して行う大半のポスト処理は、 MPI 並列実行する必要があるのでバッチ処理にて行います。

例えば sample コマンドを用いる場合のバッチリクエストファイルは、 主計算のファイル中のソルバーを sample コマンドにそのまま置き換 えたものになります。