OpenFOAM 1.7.x on Windows 64 bit (MPICH2 版)

2011年3月8日

はじめに

Symscape の OpenFOAM 1.7.x on Windows 64-bit with Native MPI をもとに Windows バイナリを作ってみた。MPICH2 により並列計算に対応した。

環境

  • Ubuntu 10.04 LTS (x86_64)、Windows XP 64 bit、MinGW-w64 & MSYS
  • openSUSE 11.3 (x86_64)、Windows 7 64 bit、MinGW-w64 & MSYS

MinGW-w64 のセットアップ

ここ の "Toolchains targetting Win64" - "Automated Builds" から "mingw-w64-1.0-bin_x86_64-linux_20110214.tar.bz2" をダウンロードし、展開。

$ mkdir ~/mingw-w64
$ tar xvjf mingw-w64-1.0-bin_x86_64-linux_20110214.tar.bz2 -C ~/mingw-w64

~/.bashrc にパスを追加。

export PATH=~/mingw-w64/bin:$PATH

~/.bashrc を読み込む。

$ . ~/.bashrc

また、上のリンクの "External binary packages (Win64 hosted)" - "Binaries (64-bit)" から "zlib-1.2.5-bin-x64.zip" をダウンロードし、展開。

$ unzip zlib-1.2.5-bin-x64.zip

ファイルを配置。

$ cp zlib/include/zconf.h ~/mingw-w64/x86_64-w64-mingw32/include
$ cp zlib/include/zlib.h ~/mingw-w64/x86_64-w64-mingw32/include
$ cp zlib/bin/zlib1.dll ~/mingw-w64/bin
$ cp zlib/lib/libz.a ~/mingw-w64/x86_64-w64-mingw32/lib
$ cp zlib/lib/libzdll.a ~/mingw-w64/x86_64-w64-mingw32/lib

mingw-w64/lib/gcc/x86_64-w64-mingw32/4.5.3/include/float.h の最後に以下の行を追加。

#include_next <float.h>

OpenFOAM のセットアップ

OpenFOAM の入手。

$ git clone git://github.com/OpenCFD/OpenFOAM-1.7.x.git

設置。

$ mv OpenFOAM-1.7.x ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich

checkout。

$ cd ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich
$ git checkout 14b79332ee4a1827656951db39fe81cc5ba52d78

パッチ を当てる。

$ gzip -d v5-mingw-openfoam-1-7-x.patch.gz
$ mv v5-mingw-openfoam-1-7-x.patch ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich
$ cd ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich
$ patch -p0 < v5-mingw-openfoam-1-7-x.patch

~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/etc/bashrc の WM_PROJECT_VERSION を修正。

export WM_PROJECT_VERSION=1.7.x-mingw-mpich

また、その下に以下を追加。

export WM_OSTYPE=MSwindows
export WM_COMPILER=mingw-w64
export WM_ARCH_OPTION=64
export WM_CC='x86_64-w64-mingw32-gcc'
export WM_CXX='x86_64-w64-mingw32-g++'
export compilerInstall=system
export WM_MPLIB='MPICH'

~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/etc/settings.sh の MPICH のバージョンを使用するものに修正する。

MPICH)
    #mpi_version=mpich2-1.1.1p1
    mpi_version=mpich2-1.3.2p1

~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/etc/bashrc を読み込む。

$ . ~/OpenFOAM/OpenFOAM-1.7.x-mingw/etc/bashrc

ThirdParty は 1.7.1 のものを使う。

$ tar xvzf ThirdParty-1.7.1.gtgz
$ mv ThirdParty-1.7.1 ~/OpenFOAM/ThirdParty-1.7.x-mingw-mpich

MPICH2 のセットアップ

ここ から MPICH2 の Windows 版を入手し Windows マシンにインストールする。インストールされたフォルダ ("C:\Program Files\MPICH" など) を丸ごと Linux マシンに持ってくる。

MPICH のディレクトリを作成。

$ mkdir -p $MPI_ARCH_PATH

Windows 版 MPICH2 の中身を $MPI_ARCH_PATH にコピーする。

リンクされるライブラリを修正する。

~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/wmake/rules/linux64mingw-w64/mplibMPICH

#PLIBS      = -L$(MPI_ARCH_PATH)/lib -lmpich -lrt
PLIBS      = -L$(MPI_ARCH_PATH)/lib -lmpi -lmpicxx

Scotch のコンパイル

Scotch のコードを修正する。

$ cd ~/OpenFOAM/ThirdParty-1.7.x-mingw-mpich
$ cp ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/mingw-extra/scotch/src/Make.inc/* scotch_5.1/src/Make.inc
$ cp ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/mingw-extra/scotch/src/libscotch/* scotch_5.1/src/libscot
ch

~/OpenFOAM/ThirdParty-1.7.x-mingw-mpich/Allwmake から Scotch をコンパイルする部分

echo ========================================
echo Build Scotch decomposition library
echo
if [ -r $FOAM_LIBBIN/libscotch.so -a -r $FOAM_LIBBIN/libscotcherrexit.so ]
then
から
if [ -d "$MPI_ARCH_PATH" ]
の前までを取り出して makeScotch というファイルを作り、実行する。

$ chmod +x makeScotch
$ ./makeScotch

エラーで止まるかもしれないが気にしない。

さらに続けてコンパイル。

$ cd scotch_5.1/src
$ rm Makefile.inc
$ ln -s Make.inc/Makefile.inc.mingw-w64
$ cd libscotch
$ make

libscotch.dll などができていれば OK。できたファイルをコピー。

$ mkdir -p $FOAM_LIBBIN
$ cp libscotch.* $FOAM_LIBBIN

OpenFOAM のコンパイル

$FOAM_SRC/OpenFOAM/Make/options の以下の部分

ifeq ($(LINK_PLIB),)
 LIB_LIBS = $(FOAM_LIBBIN)/dummy/libPstream.o
else
 LIB_LIBS = -L$(FOAM_LIBBIN)/dummy -lPstream
endif
を次の 1 行に置き換える。
LIB_LIBS = -L$(FOAM_LIBBIN)/dummy -lPstream

$FOAM_APP/utilities/mesh/manipulation/setSet/Allwmake を下記のように修正。

READLINE=0
#if [ "mingw32" != "$WM_COMPILER" -a -f /usr/include/readline/readline.h ]
#then
#    echo "Found readline/readline.h  --  enabling readline support."
#    READLINE=1
#    export READLINELINK="-lreadline -lncurses"
#    break
#fi
export READLINE

$FOAM_APP/utilities/parallelProcessing/Allwmake の実行権限がはずれているので、実行権限を与える。

$ cd $FOAM_APP/utilities/parallelProcessing
$ chmod +x Allwmake

コンパイル。

$ cd ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich/wmake/src
$ make
$ cd ../..
$ ./Allwmake

Windows 用パッケージを作成する。

$ mkdir -p ~/OpenFOAM-1.7.x-mingw-w64-mpich/bin
$ cd ~/OpenFOAM/OpenFOAM-1.7.x-mingw-mpich
$ cp -r etc ~/OpenFOAM-1.7.x-mingw-w64-mpich
$ cp applications/bin/linux64mingw-w64DPOpt/*.exe ~/OpenFOAM-1.7.x-mingw-w64-mpich/bin
$ cp lib/linux64mingw-w64DPOpt/*.dll ~/OpenFOAM-1.7.x-mingw-w64-mpich/bin
$ cp lib/linux64mingw-w64DPOpt/mpich2-1.3.2p1/*.dll ~/OpenFOAM-1.7.x-mingw-w64-mpich/bin
$ cp -r tutorials ~/OpenFOAM-1.7.x-mingw-w64-mpich

MinGW-w64 のライブラリもコピー。

$ cd ~/mingw-w64/bin
$ cp zlib1.dll libgcc_s_sjlj-1.dll libstdc++-6.dll ~/OpenFOAM-1.7.x-mingw-w64-mpich/bin

圧縮。

$ cd
$ zip -r OpenFOAM-1.7.x-mingw-w64-mpich.zip OpenFOAM-1.7.x-mingw-w64-mpich

Windows での OpenFOAM のセットアップ

作成したパッケージを MSYS のホームディレクトリに設置。

環境変数を設定。

~/.bashrc

export WM_PROJECT_DIR=~/OpenFOAM-1.7.x-mingw-w64-mpich
export USERNAME="openfoam"
export PATH=~/OpenFOAM-1.7.x-mingw-w64-mpich/bin:$PATH

export PATH="/c/Program Files/MPICH2/bin":$PATH
export MPI_BUFFER_SIZE=20000000

.bashrc を読み込む。

$ . ~/.bashrc

実行

icoFoam のチュートリアルケース cavity を実行。

$ cp -r ~/OpenFOAM-1.7.x-mingw-w64-mpich/tutorials/incompressible/icoFoam/cavity .
$ cd cavity
$ blockMesh
$ icoFoam

結果を ParaView で見るために cavity.foam を作成。

$ touch cavity.foam

並列計算の実行

並列計算を行う場合は、管理者でサーバー smpd を起動し、mpiexec で計算を実行する。

Windows XP の場合、smpd 起動時にレジストリのエラーが出た。regedit で HKEY_LOCAL_MACHINE\SOFTWARE\MPICH を消してから作り直したら、smpd が起動した。

Windows 7 の場合もエラーで smpd が起動しなかった。コントロールパネルのユーザーアカウントの "ユーザーアカウント制御設定の変更" で "コンピューターに対する変更の通知を受け取るタイミングの選択" を "通知しない" に設定してコンピュータを再起動すると、smpd が起動した。

smpd のインストールおよび起動。

$ smpd -install

interFoam のチュートリアルケース damBreak を実行。

$ cp -r ~/OpenFOAM-1.7.x-mingw-w64-mpich/tutorials/multiphase/interFoam/laminar/damBreak .
$ cd damBreak
$ blockMesh
$ vi system/decomposeParDict
  ... decomposeParDict を編集 ...
$ decomposePar
$ mpiexec -localonly 2 interFoam -parallel

ベンチマーク

damBreak に 1 度だけ refineMesh を適用したモデル (セル数約 9,000) でベンチマークを行った。計算は Core i5 M450 2.4 GHz のマシンで行った。

並列数計算時間
1226 s
2181 s

うーん…微妙。