スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[OpenFOAM] OpenFOAM 1.7.x on Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(Symscape社の方法)

以下の Symscape社のページをもとに、「OpenFOAM on Windows(64bit)」のビルドを試みた。
http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi

●関連記事

[OpenFOAM] OpenFOAM 1.7.0 for Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(MSMPI編)
リンク先ページでは、OpenFOAM Wikiの方法でクロスコンパイルした。

●インストールの(私の)方針

インストール先ディレクトリは任意だが、今回は以下のディレクトリにインストールする。
・OpenFOAM   /media/sdb1/OpenFOAM-win-symscape
         ← (一時的に)シンボリックリンク $HOME/OpenFOAM
    (私の環境では、/media/sdb1は Windowsの Eドライブ)

●手順1【Symscape社のページの手順1、手順3、手順4】
  MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)のコンパイル/インストール

① 以下のページの手順を、順に実行する。既に実行済みであれば、飛ばしてよい。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その1)

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)


② 以下を実行し、コンパイルに必要なパッケージをインストール。

sudo apt-get install flex bison wget git-core


他にも必要かもしれない。

③ gmp、mpfr、mpc のインストール先が「/usr/local」の場合は、以下を実行(クロスコンパイラの実行に必要)。

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH


●手順2【Symscape社のページの手順2】
(Linux側)zlibをクロスコンパイラ用にコンパイル/インストール

入手先:http://zlib.net/
  最新バージョン「zlib-1.2.5.tar.gz」(ソース)を入手した。

①「zlib-1.2.5.tar.gz」をホームディレクトリに置き、端末で以下を実行。既に実行済みであれば、飛ばしてよい。

cd
tar zxf zlib-1.2.5.tar.gz
cd zlib-1.2.5
make -f win32/Makefile.gcc PREFIX='x86_64-w64-mingw32-'
sudo cp zconf.h /opt/mingw-4.5.2/x86_64-w64-mingw32/include
sudo cp zlib.h /opt/mingw-4.5.2/x86_64-w64-mingw32/include
sudo cp zlib1.dll /opt/mingw-4.5.2/bin
sudo cp libz.a /opt/mingw-4.5.2/x86_64-w64-mingw32/lib
sudo cp libzdll.a /opt/mingw-4.5.2/x86_64-w64-mingw32/lib


●手順3【Symscape社のページの手順5】
(Linux側)OpenFOAM 1.7.xの取得と、ThirdParty-1.7.1の展開

入手先:http://www.openfoam.com/download/source.php
  「ThirdParty-1.7.1.gtgz」(ソース)を入手した。

①「ThirdParty-1.7.1.gtgz」を「$HOME/Downloads」に置き、端末で以下を実行。

cd /media/sdb1 # Windowsの Eドライブ
mkdir OpenFOAM-win-symscape
cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
ln -s /media/sdb1/OpenFOAM-win-symscape OpenFOAM # 一時的にシンボリックリンク
cd OpenFOAM
tar zxf $HOME/Downloads/ThirdParty-1.7.1.gtgz # ThirdParty-1.7.1を展開
mv ThirdParty-1.7.1 ThirdParty-1.7.x
git clone git://github.com/OpenCFD/OpenFOAM-1.7.x.git # OpenFOAM 1.7.xを取得
cd OpenFOAM-1.7.x
git checkout 14b79332ee4a1827656951db39fe81cc5ba52d78 # Symscape社のページで指定されている番号に巻き戻す


●手順4【Symscape社のページの手順6】
(Linux側)クロスコンパイル用に、OpenFOAMにパッチを当てる

入手先:http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi
  「v5-mingw-openfoam-1-7-x.patch.gz」を入手した。

①「v5-mingw-openfoam-1-7-x.patch.gz」を「$HOME/Downloads」に置き、端末で以下を実行。

gzip -dc $HOME/Downloads/v5-mingw-openfoam-1-7-x.patch.gz | patch -p0 -b


●手順5
(Linux側)ソースコードの修正

クロスコンパイラのバージョンによっては、手順5は不要かもしれない。私の環境では、手順5を行わずにビルドすると、コンパイルは通るが、Windows環境で decomposeParやソルバが動かなかった(実行時エラー)。これを回避するため、以下のソースコード修正を行う。この修正により Windows環境で動くようになったが、その理由はよくわからない。

① 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H

エディタで「addValidParOptions」を検索して、

static void addValidParOptions(HashTable<string>& validParOptions);

        ↓ 変更

#if 0
static void addValidParOptions(HashTable<string>& validParOptions);
#else
static bool addValidParOptions();
#endif


② 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/dummy/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{}
#else
bool Foam::Pstream::addValidParOptions()
{
return false;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/Pstream/mpi/Pstream.C

エディタで「addValidParOptions」を検索して、

void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}

        ↓ 変更

#if 0
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#else
bool Foam::Pstream::addValidParOptions()
{
return true;
}
#endif


③ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.x/src/OpenFOAM/global/argList/argList.C

エディタで「addValidParOptions」を検索して、

Pstream::addValidParOptions(validParOptions);

        ↓ 変更

#if 0
Pstream::addValidParOptions(validParOptions);
#else
if (Pstream::addValidParOptions()) {
validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file");
validParOptions.insert("p4wd", "directory");
validParOptions.insert("p4amslave", "");
validParOptions.insert("p4yourname", "hostname");
validParOptions.insert("GAMMANP", "number of instances");
validParOptions.insert("machinefile", "machine file");
}
#endif


●手順6【Symscape社のページの手順8の前半】
(Linux側)「ThirdParty-1.7.x」の中の「openmpi」と「scotch」を、Linux用にコンパイル

① 端末で以下を実行し、Linux用に環境変数を設定。

export MPI_ARCH_PATH=$HOME/OpenFOAM/ThirdParty-1.7.x/platforms/linux64Gcc/openmpi-1.4.1
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


② 引き続き以下を実行し、openmpiと scotchをコンパイルするためのスクリプト「Subwmake」(名前は何でもよい)を作成。

cd $WM_THIRD_PARTY_DIR
cp Allwmake Subwmake


Subwmakeをエディタで編集し、以下に示す 'if [ -d "$MPI_ARCH_PATH" ]' より下の行を全て削除。

(以下削除)
if [ -d "$MPI_ARCH_PATH" ]
then
echo "========================================"
echo "Build PTScotch decomposition library (requires MPI)"
(後略)


③ 端末で以下を実行して、openmpiと scotchをコンパイル。

./Subwmake


「$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch」の下に「libscotch.so」が生成されれば、コンパイル成功。

●手順7【Symscape社のページの手順9の前半】
(Linux側)OpenFOAMをビルドするためのツールを、Linux用にビルド

① 端末で以下を実行。

cd $WM_DIR/src
make
cd $WM_DIR/bin
ln -s linux64Gcc linux64mingw-w64


「$WM_DIR/bin/linux64mingw-w64」の下に「dirToString」と「wmkdep」が生成されれば、コンパイル成功。

●手順8【Symscape社のページの手順7】
(Linux側)クロスコンパイル用に、環境変数を設定し直す

① 端末で以下を実行。
 最終行でクロスコンパイル用に /etc/bashrcを source実行している。

export FOAM_INST_DIR="$HOME/OpenFOAM"
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='MSMPI'
export MPI_ARCH_PATH="/opt/msmpi"
source "$FOAM_INST_DIR/OpenFOAM-1.7.x/etc/bashrc"


●手順9【Symscape社のページの手順8の後半】
(Linux側)「ThirdParty-1.7.x」の中の「scotch」を、Windows用にコンパイル

① 端末で以下を実行。

cd $WM_THIRD_PARTY_DIR/scotch_5.1/src
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/Make.inc/* Make.inc/.
cp $WM_PROJECT_DIR/mingw-extra/scotch/src/libscotch/* libscotch/.
unlink Makefile.inc
ln -s Make.inc/Makefile.inc.mingw-w64 Makefile.inc
cd libscotch
make clean
make


「libscotch.a」と「libscotch.dll」が生成されれば、コンパイル成功。

② 手順6と手順9のコンパイル結果を、然るべき場所に転送。

mkdir -p $FOAM_LIBBIN
cp libscotch.* $FOAM_LIBBIN


●手順10【Symscape社のページの手順9の後半】
(Linux側)OpenFOAMをビルド

① 端末で以下を実行。

cd $WM_PROJECT_DIR
chmod u+x applications/utilities/parallelProcessing/Allwmake # なぜか実行権限が付与されていなかった
./Allwmake # 時間がかかる


② コンパイルエラーが発生していないか確かめるために、以下を実行してエディタで a.txtを確認した。

./Allwmake 2> a.txt


a.txtの中に、「error:」や「エラー」の文字は見当たらず、コンパイルは成功したようだ。

●手順11【Symscape社のページの手順10】
 OpenFOAMのコンパイル結果を、Windows環境に転送

① 以下のファイルが Windowsで必要とのこと。

<OpenFOAM-1.7.x>/etc/*
<OpenFOAM-1.7.x>/applications/bin/linux64mingw-w64DPOpt/*.exe
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/*.dll
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/dummy/*.dll
<OpenFOAM-1.7.x>/lib/linux64mingw-w64DPOpt/msmpi/*.dll


今回は Windowsの「E:\OpenFOAM-win-symscape」にインストールしたので、何もしなかった。

② Linuxの端末で以下を実行して、チュートリアルをコピー。

mkdir -p $FOAM_RUN
cp -r $FOAM_TUTORIALS $FOAM_RUN


Windowsの「E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials」にコピーされた。

●手順12【Symscape社のページの手順11】
 MinGW-w64のランタイムDLLを、Windows環境に転送

① 以下のファイルが Windowsで必要とのこと。

/opt/mingw-4.5.2/bin/zlib1.dll
/opt/mingw-4.5.2/bin/libgcc_s_sjlj-1.dll
/opt/mingw-4.5.2/bin/libstdc++-6.dll


Linuxの端末で、このようにして転送した。

cd $WM_PROJECT_INST_DIR
mkdir bin
cd bin
cp /opt/mingw-4.5.2/bin/*.dll .


Windowsの「E:\OpenFOAM-win-symscape\bin」に転送された。

●後始末(Linux側)

① ホームディレクトリの下の、ターボールを展開した以下のディレクトリは、ディレクトリごと削除した。

zlib-1.2.5


② ホームディレクトリの下の、一時的なシンボリックリンク「OpenFOAM」を消去した。

cd
unlink OpenFOAM


●手順13【Symscape社のページの手順12】
(Windows側)ソフトのインストールと、環境変数の設定

① ParaViewをインストール。
入手先:http://www.paraview.org/

 今回は最新バージョンの Release 3.10.1 をインストールした。

② 今回は「E:\OpenFOAM-win-symscape」にインストールしたので、以下のように環境変数を設定する必要がある。
 ただし手順14を先に行い、動作確認が成功してから、何らかの方法で環境変数を設定することにした。

WM_PROJECT_DIR

E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x


MPI_BUFFER_SIZE

20000000


PATHに追加

C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin
C:\Program Files (x86)\ParaView 3.10.1\bin
E:\OpenFOAM-win-symscape\bin
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\applications\bin\linux64mingw-w64DPOpt
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt
E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\msmpi


●手順14【Symscape社のページの手順13】
(Windows側)1ノードで動作確認

① コマンドプロンプトで以下を実行し、環境変数を設定。

set WM_PROJECT_DIR=E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x
set MPI_BUFFER_SIZE=20000000
set PATH=C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin;%PATH%
set PATH=%PATH%;C:\Program Files (x86)\ParaView 3.10.1\bin
set PATH=%PATH%;E:\OpenFOAM-win-symscape\bin
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\applications\bin\linux64mingw-w64DPOpt
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt
set PATH=%PATH%;E:\OpenFOAM-win-symscape\OpenFOAM-1.7.x\lib\linux64mingw-w64DPOpt\msmpi


② 以下を実行して、作業ディレクトリに移動し、動作確認用にチュートリアルをコピー。

E:
cd E:\OpenFOAM-win-symscape\usrname-1.7.x\run
:rd /s /q cavity_test
xcopy /E E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials\incompressible\icoFoam\cavity cavity_test\
cd cavity_test
copy E:\OpenFOAM-win-symscape\usrname-1.7.x\run\tutorials\multiphase\interFoam\laminar\damBreak\system\decomposeParDict system


xcopyコマンドは「C:\Windows\System32」にあった。

③ チュートリアルを動かしてみた。

blockMesh
decomposePar
mpiexec -n 4 icoFoam.exe -parallel
reconstructPar
echo.>case.foam
start paraview.exe --data="case.foam"


動いた。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

カネダック

Author:カネダック
 
普通のC++プログラマですが、業務で流体解析をやっていて格子職人と呼ばれています。
J.S.バッハ等、古楽をピリオド楽器による演奏で聴くのが好き。
リュート演奏にあこがれつつ、クラシックギターを弾きます。

保有資格
・中小企業診断士
・Oracle Master 8 Platinum(今のGold相当)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。