スポンサーサイト

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

[OpenFOAM] OpenFOAM 1.7.0 for Windows(32bit) を Ubuntu 64bitでクロスコンパイルする(MPICH2編)

以下の OpenFOAM Wikiのページをもとに、「OpenFOAM for Windows(32bit)」のビルドを試みた。
Tip Cross Compiling OpenFOAM 1.7 in Linux For Windows with MinGW - OpenFOAMWiki

●関連記事

[OpenFOAM] OpenFOAM 1.7.0 for Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(MPICH2編)
今回の記事の 64bitバージョンです。

[OpenFOAM] OpenFOAM 1.7.0 for Windows(32bit) を Ubuntu 64bitでクロスコンパイルする(MSMPI編)
今回の記事の MS-MPIバージョンです。

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

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

・Windowsにインストールする MPICH2のバージョンは「1.2.1p1」とする。
 それ以外のバージョンを使用するときは、OpenFOAM Wikiのページの手順5が必要。

●手順1
  MinGW-w64クロスコンパイラ(i686-w64-mingw32)のコンパイル/インストール

① 以下のページの手順を、順に実行する。

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


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

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


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

sudo apt-get install flex bison wget


●手順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='i686-w64-mingw32-'
sudo cp zconf.h /opt/mingw32-4.5.2/i686-w64-mingw32/include
sudo cp zlib.h /opt/mingw32-4.5.2/i686-w64-mingw32/include
sudo cp zlib1.dll /opt/mingw32-4.5.2/bin
sudo cp libz.a /opt/mingw32-4.5.2/i686-w64-mingw32/lib
sudo cp libzdll.a /opt/mingw32-4.5.2/i686-w64-mingw32/lib


●手順3
(Linux側)regexをクロスコンパイラ用にコンパイル/インストール

入手先:http://sourceforge.net/projects/mingw/
        → Browse all files
        → UserContributed
        → regex
        → mingw-regex-2.5.1
  「mingw-libgnurx-2.5.1-src.tar.gz」(ソース)を入手した。

①「mingw-libgnurx-2.5.1-src.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar xzf mingw-libgnurx-2.5.1-src.tar.gz
cd mingw-libgnurx-2.5.1
mkdir build
cd build
#../configure --help
../configure --host=i686-w64-mingw32 --prefix=/opt/mingw32-4.5.2
make
sudo make install
sudo ln -s /opt/mingw32-4.5.2/include/regex.h /opt/mingw32-4.5.2/i686-w64-mingw32/include


「/opt/mingw32-4.5.2/i686-w64-mingw32/include/regex.h」と「/opt/mingw32-4.5.2/lib/libregex.a」が生成されれば、インストール成功。

●手順4【OpenFOAM Wikiのページの手順2】
(Linux側)OpenFOAM 1.7.0と ThirdParty-1.7.0の展開

入手先:http://sourceforge.net/projects/foam/files/foam/1.7.0/
  「OpenFOAM-1.7.0.gtgz」と「ThirdParty-1.7.0.gtgz」(ソース)を入手した。

①「OpenFOAM-1.7.0.gtgz」と「ThirdParty-1.7.0.gtgz」をホームディレクトリに置き、端末で以下を実行。

cd /media/sdb1 # Windowsの Eドライブ
mkdir OpenFOAM32_mpich
cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
ln -s /media/sdb1/OpenFOAM32_mpich OpenFOAM # 一時的にシンボリックリンク
cd OpenFOAM
tar zxf $HOME/OpenFOAM-1.7.0.gtgz
tar zxf $HOME/ThirdParty-1.7.0.gtgz


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

入手先:Tip Cross Compiling OpenFOAM 1.7 in Linux For Windows with MinGW - OpenFOAMWiki
  「PatchesNBatches170.tar.gz」を入手した。

①「PatchesNBatches170.tar.gz」をホームディレクトリに置き、端末で以下を実行。

tar zxf $HOME/PatchesNBatches170.tar.gz


「pnb17」というサブディレクトリが出来た。

② 引き続き以下を実行して、パッチを当てる。

patch -p0 -b < pnb17/OpenFOAM-1.7.0_patch
patch -p0 -b < pnb17/ThirdParty-1.7.0_patch


ThirdParty-1.7.0へのパッチ当てで、以下のように表示された。

Hunk #1 FAILED at 58.
Hunk #2 FAILED at 74.
2 out of 2 hunks FAILED -- saving rejects to file b/scotch_5.1/src/libscotch/Makefile.rej


リジェクトされたパッチの内容は、以下のファイルに書かれていた。
$HOME/OpenFOAM/b/scotch_5.1/src/libscotch/Makefile.rej

--- a/scotch_5.1/src/libscotch/Makefile
+++ b/scotch_5.1/src/libscotch/Makefile
@@ -58,9 +58,9 @@
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
- libscotch$(LIB) \
libscotcherr$(LIB) \
- libscotcherrexit$(LIB)
+ libscotcherrexit$(LIB) \
+ libscotch$(LIB)

#ptscotch : clean
# $(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
@@ -74,9 +74,9 @@
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
- libptscotch$(LIB) \
libptscotcherr$(LIB) \
- libptscotcherrexit$(LIB)
+ libptscotcherrexit$(LIB) \
+ libptscotch$(LIB)

install :
-$(CP) scotch.h scotchf.h $(includedir)


これを見ながら、以下のファイルに手動でパッチを当てた。
$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch/Makefile

57行目~

scotch : clean
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
libscotch$(LIB) \
libscotcherr$(LIB) \
libscotcherrexit$(LIB)

       ↓ 変更

scotch : clean
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
libscotcherr$(LIB) \
libscotcherrexit$(LIB) \
libscotch$(LIB)


73行目~

ptscotch : clean
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
libptscotch$(LIB) \
libptscotcherr$(LIB) \
libptscotcherrexit$(LIB)

       ↓ 変更

ptscotch : clean
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
libptscotcherr$(LIB) \
libptscotcherrexit$(LIB) \
libptscotch$(LIB)


③ 引き続き以下を実行して、シェルスクリプトに実行権限を付与する。

chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/tutowin
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/foamDiff
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/backupSourceFolder
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/backupFullFolder
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/chtMultiRegionFixK
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/fixPatchExeNames
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/multiBuilder
find $HOME/OpenFOAM/OpenFOAM-1.7.0/ -name "Allwmake" | xargs chmod +x
find $HOME/OpenFOAM/OpenFOAM-1.7.0/ -name "Allclean" | xargs chmod +x
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwcleanRegEx
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwcleanZLib
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeMinGWScotch
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeRegEx
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeZLib
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-mingw44
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-mingw45
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-pexports
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/fixSystemMingw
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/genMPICH2stubs
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/getMinGWBin
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/makeGcc


④ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.0/wmake/wmakeVerifyExeDependencies

1行目

#!/bin/sh
  ↓ 変更
#!/bin/bash


●手順6【OpenFOAM Wikiのページの手順6】
(Linux側)環境変数の設定

① クロスコンパイル用に <OpenFOAM-1.7.0>/etc/bashrc-i686-w64-mingw32を source実行。

source $HOME/OpenFOAM/OpenFOAM-1.7.0/etc/bashrc-i686-w64-mingw32


●手順7【OpenFOAM Wikiのページの手順7.3.1】
(Linux側)コンパイルオプションの修正

① 端末で以下を実行して、-O2のときのコンパイルオプションを修正。

cd $WM_DIR/rules
sed -i -e 's=-O2 -DNDEBUG=-O2 -DNDEBUG -fno-strict-aliasing=' \
"$WM_ARCH$WM_COMPILER/c++Opt"


-O2以外だったら、気にしなくて良いようだ。

●手順8【OpenFOAM Wikiのページの手順8】
(Linux側)OpenFOAMをビルド

① 端末で以下を実行。

cd $WM_PROJECT_DIR
./Allwmake # 時間がかかる


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

./Allwmake 2> a.txt


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

③ オプションで以下を実行。

sudo apt-get install doxygen graphviz texlive-latex-base qt4-dev-tools
wmake all doc # 時間がかかる
wmake all tutorials


「$WM_PROJECT_DIR/doc/Doxygen/html/」と「$WM_PROJECT_DIR/doc/Doxygen/qt_qch/」の下にドキュメントが生成されれば、docのビルドは成功。
「$WM_PROJECT_USER_DIR/applications/bin/linuxi686-w64-mingw32DPOpt/MRFSimpleFoam.exe」等が生成されれば、tutorialsのビルドは成功。

●手順9【OpenFOAM Wikiのページの手順9】
(Linux側)OpenFOAMのコンパイル結果を、Windows環境に転送

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

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


Windowsの「E:\OpenFOAM32_mpich\usrname-1.7.0\tutorials」にコピーされた。

② chtMultiRegionチュートリアルを Windows用に修正。

cd $FOAM_RUN/../tutorials
chtMultiRegionFixK heatTransfer/chtMultiRegionFoam/multiRegionHeater
chtMultiRegionFixK heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater
chtMultiRegionFixK heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeater


③ motorBikeケースの STLファイルを Windows用に修正。

cd $FOAM_RUN/../tutorials/incompressible/simpleFoam/motorBike
chmod 744 fixForWindows
./fixForWindows


④ nozzleFlow2Dケースを修正。

以下のファイルをエディタで修正する。
$FOAM_RUN/../tutorials/multiphase/interFoam/les/nozzleFlow2D/Allrun

エディタで「runApplication blockMesh」を検索し、その行の下に ifブロックを追加。

runApplication blockMesh

             ↓ 変更

runApplication blockMesh

if [ "$WM_PRECISION_OPTION" = "DP" ]; then
firstiter=1e-008
else
firstiter=1e-08
fi


エディタで「cp -r 1e-08/polyMesh/* constant/polyMesh」を検索し、2行修正。

cp -r 1e-08/polyMesh/* constant/polyMesh
rm -rf 1e-08

             ↓ 変更

cp -r ${firstiter}/polyMesh/* constant/polyMesh
rm -rf ${firstiter}


⑤「Windows Vista」や「Windows 7」で動かす予定があるなら、以下を実行。

fixPatchExeNames


⑥ 以下のディレクトリ配下のファイルが Windowsで必要とのこと。

<OpenFOAM-1.7.0>/applications/bin/linuxi686-w64-mingw32DPOpt
<OpenFOAM-1.7.0>/etc
<OpenFOAM-1.7.0>/bin
<OpenFOAM-1.7.0>/lib/linuxi686-w64-mingw32DPOpt
<ThirdParty-1.7.0>/platforms/linuxi686-w64-mingw32/mpich2-1.2.1p1
<USER-1.7.0>/applications/bin/linuxi686-w64-mingw32DPOpt
<USER-1.7.0>/tutorials

以下、オプション
<OpenFOAM-1.7.0>/doc/Guides-a4 または /doc/Guides-usletter
<OpenFOAM-1.7.0>/doc/Doxygen/qt_qch または /doc/Doxygen/html
<ThirdParty-1.7.0>/mpich2-1.2.1p1/source
<ThirdParty-1.7.0>/platforms/linuxi686-w64-mingw32DPOpt


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

●手順10
 MinGW-w64のランタイムDLLを、Windows環境に転送

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

/opt/mingw32-4.5.2/bin/libgcc_s_sjlj-1.dll
/opt/mingw32-4.5.2/bin/libstdc++-6.dll
/opt/mingw32-4.5.2/bin/zlib1.dll
/opt/mingw32-4.5.2/bin/libgnurx-0.dll (libregex.dllという名前でも必要)


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

cd $WM_PROJECT_INST_DIR
mkdir bin
cd bin
cp /opt/mingw32-4.5.2/bin/*.dll .
cp libgnurx-0.dll libregex.dll


Windowsの「E:\OpenFOAM32_mpich\bin」に転送された。

●後始末(Linux側)

① ビルド(Allwmake)時に自動的にダウンロードされたターボールは削除した。

rm $HOME/OpenFOAM/ThirdParty-1.7.0/download/*


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

zlib-1.2.5
mingw-libgnurx-2.5.1


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

cd
unlink OpenFOAM


●手順11
(Windows側)ソフトのインストールと、環境変数の設定

① MPICH2をインストール。
入手先:http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.2.1p1/
  「mpich2-1.2.1p1-win-ia32.msi」を入手。

 インストールは、入手した「mpich2-1.2.1p1-win-ia32.msi」を実行するだけ。

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

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

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

WM_PROJECT_DIR

E:\OpenFOAM32_mpich\OpenFOAM-1.7.0


MPI_BUFFER_SIZE

20000000


PATHに追加

E:\OpenFOAM32_mpich\bin
E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\applications\bin\linuxi686-w64-mingw32DPOpt
E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt
E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt\mpich2-1.2.1p1
C:\Program Files\ParaView 3.10.0-RC1\bin
C:\Program Files\MPICH2\bin


●手順12
(Windows側)1ノードで動作確認

① 生成された OpenFOAMを、Windows XP Professional(32bit)上で動かしてみることにした。
 コマンドプロンプトで以下を実行し、環境変数を設定。

set WM_PROJECT_DIR=E:\OpenFOAM32_mpich\OpenFOAM-1.7.0
set MPI_BUFFER_SIZE=20000000
set PATH=%PATH%;E:\OpenFOAM32_mpich\bin
set PATH=%PATH%;E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\applications\bin\linuxi686-w64-mingw32DPOpt
set PATH=%PATH%;E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt
set PATH=%PATH%;E:\OpenFOAM32_mpich\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt\mpich2-1.2.1p1
set PATH=%PATH%;C:\Program Files\ParaView 3.10.0-RC1\bin
set PATH=C:\Program Files\MPICH2\bin;%PATH%


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

E:
cd E:\OpenFOAM32_mpich\usrname-1.7.0\run
:rd /s /q cavity_test
xcopy /E E:\OpenFOAM32_mpich\usrname-1.7.0\tutorials\incompressible\icoFoam\cavity cavity_test\
cd cavity_test
copy E:\OpenFOAM32_mpich\usrname-1.7.0\tutorials\multiphase\interFoam\laminar\damBreak\system\decomposeParDict system


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

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

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


動いた。

スポンサーサイト

[OpenFOAM] OpenFOAM 1.7.0 for Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(MPICH2編)

以下の OpenFOAM Wikiのページをもとに、「OpenFOAM for Windows(64bit)」のビルドを試みた。
Tip Cross Compiling OpenFOAM 1.7 in Linux For Windows with MinGW - OpenFOAMWiki

●関連記事

[OpenFOAM] OpenFOAM 1.7.0 for Windows(32bit) を Ubuntu 64bitでクロスコンパイルする(MPICH2編)
今回の記事の 32bitバージョンです。

[OpenFOAM] OpenFOAM 1.7.0 for Windows(64bit) を Ubuntu 64bitでクロスコンパイルする(MSMPI編)
今回の記事の MS-MPIバージョンです。

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

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

・Windowsにインストールする MPICH2のバージョンは「1.2.1p1」とする。
 それ以外のバージョンを使用するときは、OpenFOAM Wikiのページの手順5が必要。

●手順1
  MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)のコンパイル/インストール

① 以下のページの手順を、順に実行する。

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


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

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


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

sudo apt-get install flex bison wget


●手順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
(Linux側)regexをクロスコンパイラ用にコンパイル/インストール

入手先:http://sourceforge.net/projects/mingw/
        → Browse all files
        → UserContributed
        → regex
        → mingw-regex-2.5.1
  「mingw-libgnurx-2.5.1-src.tar.gz」(ソース)を入手した。

①「mingw-libgnurx-2.5.1-src.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar xzf mingw-libgnurx-2.5.1-src.tar.gz
cd mingw-libgnurx-2.5.1
mkdir build
cd build
#../configure --help
../configure --host=x86_64-w64-mingw32 --prefix=/opt/mingw-4.5.2
make
sudo make install
sudo ln -s /opt/mingw-4.5.2/include/regex.h /opt/mingw-4.5.2/x86_64-w64-mingw32/include


「/opt/mingw-4.5.2/x86_64-w64-mingw32/include/regex.h」と「/opt/mingw-4.5.2/lib/libregex.a」が生成されれば、インストール成功。

●手順4【OpenFOAM Wikiのページの手順2】
(Linux側)OpenFOAM 1.7.0と ThirdParty-1.7.0の展開

入手先:http://sourceforge.net/projects/foam/files/foam/1.7.0/
  「OpenFOAM-1.7.0.gtgz」と「ThirdParty-1.7.0.gtgz」(ソース)を入手した。

①「OpenFOAM-1.7.0.gtgz」と「ThirdParty-1.7.0.gtgz」をホームディレクトリに置き、端末で以下を実行。

cd /media/sdb1 # Windowsの Eドライブ
mkdir OpenFOAM64_mpich
cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
ln -s /media/sdb1/OpenFOAM64_mpich OpenFOAM # 一時的にシンボリックリンク
cd OpenFOAM
tar zxf $HOME/OpenFOAM-1.7.0.gtgz
tar zxf $HOME/ThirdParty-1.7.0.gtgz


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

入手先:Tip Cross Compiling OpenFOAM 1.7 in Linux For Windows with MinGW - OpenFOAMWiki
  「PatchesNBatches170.tar.gz」を入手した。

①「PatchesNBatches170.tar.gz」をホームディレクトリに置き、端末で以下を実行。

tar zxf $HOME/PatchesNBatches170.tar.gz


「pnb17」というサブディレクトリが出来た。

② 引き続き以下を実行して、パッチを当てる。

patch -p0 -b < pnb17/OpenFOAM-1.7.0_patch
patch -p0 -b < pnb17/ThirdParty-1.7.0_patch


ThirdParty-1.7.0へのパッチ当てで、以下のように表示された。

Hunk #1 FAILED at 58.
Hunk #2 FAILED at 74.
2 out of 2 hunks FAILED -- saving rejects to file b/scotch_5.1/src/libscotch/Makefile.rej


リジェクトされたパッチの内容は、以下のファイルに書かれていた。
$HOME/OpenFOAM/b/scotch_5.1/src/libscotch/Makefile.rej

--- a/scotch_5.1/src/libscotch/Makefile
+++ b/scotch_5.1/src/libscotch/Makefile
@@ -58,9 +58,9 @@
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
- libscotch$(LIB) \
libscotcherr$(LIB) \
- libscotcherrexit$(LIB)
+ libscotcherrexit$(LIB) \
+ libscotch$(LIB)

#ptscotch : clean
# $(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
@@ -74,9 +74,9 @@
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
- libptscotch$(LIB) \
libptscotcherr$(LIB) \
- libptscotcherrexit$(LIB)
+ libptscotcherrexit$(LIB) \
+ libptscotch$(LIB)

install :
-$(CP) scotch.h scotchf.h $(includedir)


これを見ながら、以下のファイルに手動でパッチを当てた。
$WM_THIRD_PARTY_DIR/scotch_5.1/src/libscotch/Makefile

57行目~

scotch : clean
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
libscotch$(LIB) \
libscotcherr$(LIB) \
libscotcherrexit$(LIB)

       ↓ 変更

scotch : clean
$(MAKE) CC="$(CCS)" CCD="$(CCSS)" SCOTCHLIB=scotch \
scotch.h \
scotchf.h \
libscotcherr$(LIB) \
libscotcherrexit$(LIB) \
libscotch$(LIB)


73行目~

ptscotch : clean
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
libptscotch$(LIB) \
libptscotcherr$(LIB) \
libptscotcherrexit$(LIB)

       ↓ 変更

ptscotch : clean
$(MAKE) CFLAGS="$(CFLAGS) -DSCOTCH_PTSCOTCH" CC="$(CCP)" SCOTCHLIB=ptscotch \
scotch.h \
scotchf.h \
libptscotcherr$(LIB) \
libptscotcherrexit$(LIB) \
libptscotch$(LIB)


③ 引き続き以下を実行して、シェルスクリプトに実行権限を付与する。

chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/tutowin
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/foamDiff
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/backupSourceFolder
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/backupFullFolder
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/chtMultiRegionFixK
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/bin/fixPatchExeNames
chmod 744 $HOME/OpenFOAM/OpenFOAM-1.7.0/multiBuilder
find $HOME/OpenFOAM/OpenFOAM-1.7.0/ -name "Allwmake" | xargs chmod +x
find $HOME/OpenFOAM/OpenFOAM-1.7.0/ -name "Allclean" | xargs chmod +x
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwcleanRegEx
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwcleanZLib
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeMinGWScotch
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeRegEx
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/AllwmakeZLib
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-mingw44
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-mingw45
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/build-pexports
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/fixSystemMingw
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/genMPICH2stubs
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/getMinGWBin
chmod 744 $HOME/OpenFOAM/ThirdParty-1.7.0/makeGcc


④ 以下のファイルをエディタで修正。
$HOME/OpenFOAM/OpenFOAM-1.7.0/wmake/wmakeVerifyExeDependencies

1行目

#!/bin/sh
  ↓ 変更
#!/bin/bash


●手順6【OpenFOAM Wikiのページの手順6】
(Linux側)環境変数の設定

① クロスコンパイル用に <OpenFOAM-1.7.0>/etc/bashrc-x86_64-w64-mingw32を source実行。

source $HOME/OpenFOAM/OpenFOAM-1.7.0/etc/bashrc-x86_64-w64-mingw32


●手順7【OpenFOAM Wikiのページの手順7.3.1】
(Linux側)コンパイルオプションの修正

① 端末で以下を実行して、-O2のときのコンパイルオプションを修正。

cd $WM_DIR/rules
sed -i -e 's=-O2 -DNDEBUG=-O2 -DNDEBUG -fno-strict-aliasing=' \
"$WM_ARCH$WM_COMPILER/c++Opt"


-O2以外だったら、気にしなくて良いようだ。

●手順8【OpenFOAM Wikiのページの手順8】
(Linux側)OpenFOAMをビルド

① 端末で以下を実行。

cd $WM_PROJECT_DIR
./Allwmake # 時間がかかる


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

./Allwmake 2> a.txt


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

③ オプションで以下を実行。

sudo apt-get install doxygen graphviz texlive-latex-base qt4-dev-tools
wmake all doc # 時間がかかる
wmake all tutorials


「$WM_PROJECT_DIR/doc/Doxygen/html/」と「$WM_PROJECT_DIR/doc/Doxygen/qt_qch/」の下にドキュメントが生成されれば、docのビルドは成功。
「$WM_PROJECT_USER_DIR/applications/bin/linuxx86_64-w64-mingw32DPOpt/MRFSimpleFoam.exe」等が生成されれば、tutorialsのビルドは成功。

●手順9【OpenFOAM Wikiのページの手順9】
(Linux側)OpenFOAMのコンパイル結果を、Windows環境に転送

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

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


Windowsの「E:\OpenFOAM64_mpich\usrname-1.7.0\tutorials」にコピーされた。

② chtMultiRegionチュートリアルを Windows用に修正。

cd $FOAM_RUN/../tutorials
chtMultiRegionFixK heatTransfer/chtMultiRegionFoam/multiRegionHeater
chtMultiRegionFixK heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater
chtMultiRegionFixK heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeater


③ motorBikeケースの STLファイルを Windows用に修正。

cd $FOAM_RUN/../tutorials/incompressible/simpleFoam/motorBike
chmod 744 fixForWindows
./fixForWindows


④ nozzleFlow2Dケースを修正。

以下のファイルをエディタで修正する。
$FOAM_RUN/../tutorials/multiphase/interFoam/les/nozzleFlow2D/Allrun

エディタで「runApplication blockMesh」を検索し、その行の下に ifブロックを追加。

runApplication blockMesh

             ↓ 変更

runApplication blockMesh

if [ "$WM_PRECISION_OPTION" = "DP" ]; then
firstiter=1e-008
else
firstiter=1e-08
fi


エディタで「cp -r 1e-08/polyMesh/* constant/polyMesh」を検索し、2行修正。

cp -r 1e-08/polyMesh/* constant/polyMesh
rm -rf 1e-08

             ↓ 変更

cp -r ${firstiter}/polyMesh/* constant/polyMesh
rm -rf ${firstiter}


⑤「Windows Vista」や「Windows 7」で動かす予定があるなら、以下を実行。

fixPatchExeNames


⑥ 以下のディレクトリ配下のファイルが Windowsで必要とのこと。

<OpenFOAM-1.7.0>/applications/bin/linuxx86_64-w64-mingw32DPOpt
<OpenFOAM-1.7.0>/etc
<OpenFOAM-1.7.0>/bin
<OpenFOAM-1.7.0>/lib/linuxx86_64-w64-mingw32DPOpt
<ThirdParty-1.7.0>/platforms/linuxx86_64-w64-mingw32/mpich2-1.2.1p1
<USER-1.7.0>/applications/bin/linuxx86_64-w64-mingw32DPOpt
<USER-1.7.0>/tutorials

以下、オプション
<OpenFOAM-1.7.0>/doc/Guides-a4 または /doc/Guides-usletter
<OpenFOAM-1.7.0>/doc/Doxygen/qt_qch または /doc/Doxygen/html
<ThirdParty-1.7.0>/mpich2-1.2.1p1/source
<ThirdParty-1.7.0>/platforms/linuxx86_64-w64-mingw32DPOpt


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

●手順10
 MinGW-w64のランタイムDLLを、Windows環境に転送

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

/opt/mingw-4.5.2/bin/libgcc_s_sjlj-1.dll
/opt/mingw-4.5.2/bin/libstdc++-6.dll
/opt/mingw-4.5.2/bin/zlib1.dll
/opt/mingw-4.5.2/bin/libgnurx-0.dll (libregex.dllという名前でも必要)


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

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


Windowsの「E:\OpenFOAM64_mpich\bin」に転送された。

●後始末(Linux側)

① ビルド(Allwmake)時に自動的にダウンロードされたターボールは削除した。

rm $HOME/OpenFOAM/ThirdParty-1.7.0/download/*


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

zlib-1.2.5
mingw-libgnurx-2.5.1


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

cd
unlink OpenFOAM


●手順11
(Windows側)ソフトのインストールと、環境変数の設定

① MPICH2をインストール。
入手先:http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.2.1p1/
  「mpich2-1.2.1p1-win-x86-64.msi」を入手。

 インストールは、入手した「mpich2-1.2.1p1-win-x86-64.msi」を実行するだけ。

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

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

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

WM_PROJECT_DIR

E:\OpenFOAM64_mpich\OpenFOAM-1.7.0


MPI_BUFFER_SIZE

20000000


PATHに追加

E:\OpenFOAM64_mpich\bin
E:\OpenFOAM64_mpich\OpenFOAM-1.7.0\applications\bin\linuxx86_64-w64-mingw32DPOpt
E:\OpenFOAM64_mpich\OpenFOAM-1.7.0\lib\linuxx86_64-w64-mingw32DPOpt
E:\OpenFOAM64_mpich\OpenFOAM-1.7.0\lib\linuxx86_64-w64-mingw32DPOpt\mpich2-1.2.1p1
C:\Program Files (x86)\ParaView 3.10.0-RC1\bin
C:\Program Files\MPICH2\bin


●手順12
(Windows側)1ノードで動作確認

① 生成された「E:\OpenFOAM64_mpich\*」を、ノートPC(Windows 7 Home Premium)の Cドライブに転送して動かしてみることにした。
 コマンドプロンプトで以下を実行し、環境変数を設定。

set WM_PROJECT_DIR=C:\OpenFOAM64_mpich\OpenFOAM-1.7.0
set MPI_BUFFER_SIZE=20000000
set PATH=%PATH%;C:\OpenFOAM64_mpich\bin
set PATH=%PATH%;C:\OpenFOAM64_mpich\OpenFOAM-1.7.0\applications\bin\linuxx86_64-w64-mingw32DPOpt
set PATH=%PATH%;C:\OpenFOAM64_mpich\OpenFOAM-1.7.0\lib\linuxx86_64-w64-mingw32DPOpt
set PATH=%PATH%;C:\OpenFOAM64_mpich\OpenFOAM-1.7.0\lib\linuxx86_64-w64-mingw32DPOpt\mpich2-1.2.1p1
set PATH=%PATH%;C:\Program Files (x86)\ParaView 3.10.0-RC1\bin
set PATH=C:\Program Files\MPICH2\bin;%PATH%


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

C:
cd C:\OpenFOAM64_mpich\usrname-1.7.0\run
:rd /s /q cavity_test
xcopy /E C:\OpenFOAM64_mpich\usrname-1.7.0\tutorials\incompressible\icoFoam\cavity cavity_test\
cd cavity_test
copy C:\OpenFOAM64_mpich\usrname-1.7.0\tutorials\multiphase\interFoam\laminar\damBreak\system\decomposeParDict system


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

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

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


最初は 3行目(mpiexec)が動かなかったが、以下のページを参考にして、
http://d.hatena.ne.jp/arakik10/20101128/p1
http://raeyoan.blog120.fc2.com/blog-entry-65.html

・ファイアウォールを止めてみたり、
・UAC (User Account Control) の設定をいじってみたり、
・smpdや mpiexecを管理者権限で実行してみたり、

いろいろ試行錯誤したら、いつのまにか動くようになった。

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

Windowsで動くプログラムを、Linuxでコンパイルするための、MinGW-w64クロスコンパイラ(i686-w64-mingw32)を構築してみた。
 ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)
 ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 32bit(今回は Windows XP)

後に出てくる用語を整理しておくと、
 ・target:クロスコンパイラによってコンパイルされたプログラムが動く環境(=Windows)
 ・host:クロスコンパイラが動く環境(=Linux)
 ・build:クロスコンパイラをビルドする環境(=Linux)

●関連記事

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その2:MSMPI編)
MS-MPIをリンクするプログラムのクロスコンパイルを試みます。この記事の続編です。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その1)
今回の記事の 64bitバージョンです。

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

今回インストールするクロスコンパイラは、gcc-4.5.2 である。
「/opt/mingw32-4.5.2」にインストールすることにする。

クロスコンパイラのビルドに使用したコンパイラは、以下のように「gcc 4.4.3」である。

$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


●手順1(Linux側):binutilsのコンパイル/インストール
入手先:http://ftp.gnu.org/gnu/binutils/
  最新バージョン「binutils-2.21.tar.gz」(ソース)を入手した。

①「binutils-2.21.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar zxf binutils-2.21.tar.gz
cd binutils-2.21
mkdir build
cd build
../configure --target=i686-w64-mingw32 --disable-multilib \
--with-sysroot=/opt/mingw32-4.5.2 --prefix=/opt/mingw32-4.5.2 \
--with-windres
make
sudo make install
sudo cp /opt/mingw32-4.5.2/bin/i686-w64-mingw32-windmc \
/opt/mingw32-4.5.2/i686-w64-mingw32/bin/windmc
sudo cp /opt/mingw32-4.5.2/bin/i686-w64-mingw32-windres \
/opt/mingw32-4.5.2/i686-w64-mingw32/bin/windres


「/opt/mingw32-4.5.2/bin」の下に、「i686-w64-mingw32-ar」等がコピーされればインストール成功。

●手順2(Linux側):「mingw-w64 toolchain」の中の、headerをインストール
入手先:http://sourceforge.net/projects/mingw-w64/
  「mingw-w64-v1.0-snapshot-20101003.tar.bz2」を入手した。

①「mingw-w64-v1.0-snapshot-20101003.tar.bz2」をホームディレクトリに置き、端末で以下を実行。

cd
tar jxf mingw-w64-v1.0-snapshot-20101003.tar.bz2
cd mingw-w64-v1.0-20101003
mkdir build-header
cd build-header
../mingw-w64-headers/configure --host=i686-w64-mingw32 \
--prefix=/opt/mingw32-4.5.2
sudo make install
cd /opt/mingw32-4.5.2
sudo ln -s i686-w64-mingw32 mingw


「/opt/mingw32-4.5.2/i686-w64-mingw32/include」の下に、ヘッダファイルがコピーされればインストール成功。

●手順3(Linux側):gcc(クロスコンパイラ)のコア部分のコンパイル/インストール
入手先:ftp://ftp.gnu.org/gnu/gcc/
  最新バージョン「gcc-4.5.2.tar.gz」(ソース)を入手した。

①「gcc-4.5.2.tar.gz」をホームディレクトリに置き、以下を実行。

私の環境には、gccのインストールに必要な m4、gmp、mpfr、mpc が、すでに「/usr/local」にインストールされていた。
これらのインストール法については、http://kanedaq.blog24.fc2.com/blog-entry-1.html を参照。

cd
tar zxf gcc-4.5.2.tar.gz
cd gcc-4.5.2
mkdir build
cd build
../configure --target=i686-w64-mingw32 --disable-multilib \
--prefix=/opt/mingw32-4.5.2 --with-sysroot=/opt/mingw32-4.5.2 \
--with-gmp=/usr/local
make all-gcc
sudo make install-gcc


「/opt/mingw32-4.5.2/bin」の下に、「i686-w64-mingw32-gcc」等がコピーされればインストール成功。

●手順4(Linux側):「mingw-w64 toolchain」の中の、crt関連をインストール

①「$HOME/.bashrc」の最後に、以下の2行を追加しておく。

#### MinGW-w64 Cross Compiler (32bit)
export PATH=$PATH:/opt/mingw32-4.5.2/bin



② 端末で以下を実行。

export PATH=$PATH:/opt/mingw32-4.5.2/bin
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
cd
cd mingw-w64-v1.0-20101003
mkdir build-crt
cd build-crt
../mingw-w64-crt/configure --host=i686-w64-mingw32 \
--prefix=/opt/mingw32-4.5.2 --with-sysroot=/opt/mingw32-4.5.2
make
sudo make install



「sudo make install」を実行したとき、以下のエラーが出た。

/bin/bash: line 5: i686-w64-mingw32-ranlib: コマンドが見つかりません



whichで調べてみると、

$ which i686-w64-mingw32-ranlib
/opt/mingw32-4.5.2/bin/i686-w64-mingw32-ranlib



コマンドへのPATHは通っている。
エラーを回避するため、Makefileを修正することにした。
エディタで「ranlib」(小文字)を検索し、以下のように ranlibをフルパスで指定した。

RANLIB = i686-w64-mingw32-ranlib
  ↓ 変更
RANLIB = /opt/mingw32-4.5.2/bin/i686-w64-mingw32-ranlib



再び以下を実行したら、インストールできた。

sudo make install


「/opt/mingw32-4.5.2/i686-w64-mingw32/lib」の下に、lib*.aがコピーされればインストール成功。

●手順5(Linux側):gcc(クロスコンパイラ)の残りをコンパイル/インストール

① 端末で以下を実行。

cd
cd gcc-4.5.2/build
make
sudo make install


「/opt/mingw32-4.5.2/bin」の下に、「libstdc++-6.dll」等のdllがコピーされればインストール成功。

●手順6(Linux側):ファイル修正

① float.hを修正。

以下のページの手順3によると、float.hの修正が必要らしい。
http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi

この手順に従い、以下のファイルを修正する。
/opt/mingw32-4.5.2/lib/gcc/i686-w64-mingw32/4.5.2/include/float.h

エディタでファイルの末尾に行き、「#endif /* _FLOAT_H___ */」の前にinclude_next文を追加した。

#endif /* __STDC_WANT_DEC_FP__ */

#endif /* _FLOAT_H___ */

  ↓ 変更

#endif /* __STDC_WANT_DEC_FP__ */

#include_next <float.h>

#endif /* _FLOAT_H___ */



●手順7:DLLを Windows環境に転送

①「/opt/mingw32-4.5.2/bin/*.dll」を Windows環境に転送し、PATHを通す。

●後始末(Linux側)

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

binutils-2.21
mingw-w64-v1.0-20101003
gcc-4.5.2



●テスト

① Linux側で「hello.cpp」を作成した。

#include <iostream>

int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}



② Linuxの端末で以下を実行し、クロスコンパイルした。
「-static」オプションを与えると、スタティックリンクされる。

i686-w64-mingw32-g++ -o hello32_d.exe hello.cpp
i686-w64-mingw32-g++ -o hello32_s.exe hello.cpp -static


生成された exeを Windows上(コマンドプロンプト)で動かしてみたら、いずれも動いた。
ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。
スタティックリンクの exeは、これらの dllがなくても動いた。

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

MSMPIを使うプログラムのクロスコンパイルを試みた。
 ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)
 ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 64bit(今回は Windows 7)

●記事修正
(2011/6/01) 「Microsoft HPC SDK SP2」をインストールしたとき、環境の違いにより、異なる版の「msmpi.dll」がインストールされる現象を確認しました。32ビット版らしき「msmpi.dll」がインストールされた場合、それを Linux側にコピーすると後の作業が失敗するため、「msmpi.dll」を Linux側にコピーする手順を大幅に書き換えました。

(2011/2/18) インストール先を「/usr/local」から「/opt」に変更し、インストールを再検証しました。

(2011/2/18) 姫野ベンチマークを再実行し、新しい結果を載せました。前回はタスクマネージャを立ち上げた状態で姫野ベンチを実行したため、おかしな結果になったみたいです。

●関連記事

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

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その2:MSMPI編)
今回の記事の 32bitバージョンです。

●参考URL
http://www.symscape.com/configure-msmpi-for-mingw-w64

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

以下のディレクトリにインストールすることにする。

・MSMPI    /opt/ms-hpc-2008-sp2
       ← シンボリックリンク /opt/msmpi

・gendef   /opt/mingw-4.5.2/bin

●手順1:Windows側で「Microsoft HPC SDK SP2」をインストールし、Linux側にコピー
入手先:http://www.microsoft.com/downloads/en/details.aspx?familyid=13644DCD-4022-4BBC-B18F-1C9E9461D5BD&displaylang=en
  「sdk_x64.msi」を入手。

インストールは、入手した「sdk_x64.msi」を実行するだけ。

①「C:\Program Files\Microsoft HPC Pack 2008 SDK\*」を Linux側にコピー

インストールされた以下のファイルが、Linux側で必要となる。
C:\Program Files\Microsoft HPC Pack 2008 SDK\*

このディレクトリは、私の環境では Linux側から以下の名前でアクセスできる。
/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK

これをディレクトリごと Linux側にコピーする。
まず「$HOME/ms-hpc-2008-sp2」にコピーし、若干の作業の後に「/opt/ms-hpc-2008-sp2」に移すことにする。
Linuxの端末で、以下を実行した。

cd
cp -r '/media/sda1/Program Files/Microsoft HPC Pack 2008 SDK' ms-hpc-2008-sp2



②「sdk_x64.msi」から「msmpi64.dll」を抽出して Linux側にコピー

Windows上に「Microsoft HPC SDK SP2」をインストールすると、「C:\Windows\System32」の下に「msmpi.dll」がコピーされる。この DLLが 64ビット版であれば、そのまま Linux側にコピーしても良い。しかし Windows OSが 64ビット版であっても、環境により 32ビット版らしき「msmpi.dll」がコピーされる現象を確認した。これを Linux側にコピーすると、後の作業が失敗する。そこで、「sdk_x64.msi」から 64ビット版の「msmpi.dll」を抽出し、これを Linux側にコピーすることにした。

まず、msixコマンドを使用して、「sdk_x64.msi」に含まれる全ファイルを抽出する。
msixコマンドの入手法と使用法については、以下のページを参照。
http://www.atmarkit.co.jp/fwin2k/win2ktips/865msix/msix.html

Windowsのコマンドプロンプトで、以下を実行。

msix sdk_x64.msi /out sdk_x64 /ext


次に、抽出された「product.cab.cab」を WinRAR等のソフトを使って解凍する。
WinRARの入手先:http://www.diana.dti.ne.jp/~winrar/

解凍されたファイルの中に、以下があった。
・msmpi.dll (32ビット版らしい)
・msmpi64.dll (64ビット版らしい)

「msmpi64.dll」を、Linux側に「msmpi.dll」という名前でコピーする。

cd $HOME/ms-hpc-2008-sp2/Lib/amd64
cp '/media/sda1/msmpi64.dll' ./msmpi.dll



●手順2(Linux側):gendefをコンパイル/インストール
入手先:http://sourceforge.net/apps/trac/mingw-w64/wiki/gendef
  「mingw-w64-gendef.tar.gz」(ソース)を入手した。

①「mingw-w64-gendef.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar zxf mingw-w64-gendef.tar.gz
cd gendef
mkdir build
cd build
#../configure -h
../configure --prefix=/opt/mingw-4.5.2
make
sudo make install


「/opt/mingw-4.5.2/bin」の下に、「gendef」がコピーされればインストール成功。

●手順3(Linux側):「libmsmpi.a」を作成

① gmp、mpfr、mpc が「/usr/local」にインストールされている場合は、端末で以下を実行。

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


② 端末で以下を実行。

cd
cd ms-hpc-2008-sp2/Lib/amd64
gendef msmpi.dll
x86_64-w64-mingw32-dlltool -d msmpi.def -l libmsmpi.a -D msmpi.dll


「libmsmpi.a」が生成されれば作業成功。

●手順4(Linux側):ファイル修正

① mpi.hを修正。

以下のページによると、mpi.hの修正が必要らしい。
http://www.symscape.com/configure-msmpi-for-mingw-w64

このページの手順に従い、以下のファイルを修正する。
$HOME/ms-hpc-2008-sp2/Include/mpi.h

エディタでファイルの先頭に行き、「#define MPI_INCLUDED」の下あたりに include文を1行追加した。

#ifndef MPI_INCLUDED
#define MPI_INCLUDED

#include <stdint.h>



●手順5(Linux側):MS-MPIを「/opt/ms-hpc-2008-sp2」に転送

① 端末で以下を実行。

cd
sudo mv ms-hpc-2008-sp2 /opt
cd /opt
sudo ln -s ms-hpc-2008-sp2 msmpi



●後始末(Linux側)

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

gendef



●テスト(その1)

① Linux側で「mpitest.cpp」を作成した。

#include <iostream>
#include "mpi.h"

int main(int argc, char* argv[])
{
int myrank;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
std::cout << "myrank = " << myrank << std::endl;
MPI_Finalize();
return 0;
}



② Linuxの端末で以下を実行して、クロスコンパイルした。
「-static」オプションを与えると、スタティックリンクされる。

x86_64-w64-mingw32-g++ -O3 -o mpitest_d.exe mpitest.cpp \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi
x86_64-w64-mingw32-g++ -O3 -o mpitest_s.exe mpitest.cpp \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi -static


「mpitest_d.exe」と「mpitest_s.exe」が生成されれば、コンパイル成功。

③ 生成された exeを、Windows(コマンドプロンプト)で動かしてみた。

>mpiexec -n 4 mpitest_d.exe
myrank = 1
myrank = 0
myrank = 3
myrank = 2

>mpiexec -n 4 mpitest_s.exe
myrank = 0
myrank = 1
myrank = 2
myrank = 3


いずれも動いた。
ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。
スタティックリンクの exeは、これらの dllがなくても動いた。

●テスト(その2):姫野ベンチマーク
入手先:http://accc.riken.jp/HPC/HimenoBMT/download2.html
  「cc_himenoBMTxp_mpi.lzh」(ソースコード、C + MPI、static allocate version)を入手した。

① もし Linuxに lhaが入っていなかったら、lhaをインストール。

sudo apt-get install lha-sjis



②「cc_himenoBMTxp_mpi.lzh」を Linuxのホームディレクトリに置き、端末で以下を実行。

cd
mkdir cc_himenoBMTxp_mpi
cd cc_himenoBMTxp_mpi
lha e ../cc_himenoBMTxp_mpi.lzh
mv himenobmtxps.c himenoBMTxps.c # lhaで解凍するとファイル名が小文字になってしまうので
chmod u+x paramset.sh



③ 引き続き以下を実行して、逐次処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 1
x86_64-w64-mingw32-gcc -O3 -o himeno1.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno1.exe」が生成されればコンパイル成功。

④ 引き続き、2並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 2
x86_64-w64-mingw32-gcc -O3 -o himeno2.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno2.exe」が生成されればコンパイル成功。

⑤ 引き続き、4並列処理用プログラムをクロスコンパイルした。

rm param.h
./paramset.sh S 1 1 4
x86_64-w64-mingw32-gcc -O3 -o himeno4.exe himenoBMTxps.c \
-I/opt/msmpi/Include -L/opt/msmpi/Lib/amd64 -lmsmpi


「himeno4.exe」が生成されればコンパイル成功。

⑥ 生成された exeを、WindowsノートPCに転送して動かしてみた。
 このノートPCの CPUは 2コアで、ハイパースレッディング=オンのため 4コアに見える。
 本当はハイパースレッディングをオフにしたいが、この機種は BIOSでオフに設定できなかった。

mpiexec -n 1 himeno1.exe
mpiexec -n 2 himeno2.exe
mpiexec -n 4 himeno4.exe



逐次処理の結果

>mpiexec -n 1 himeno1.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 129
imax = 64 jmax = 64 kmax =128
I-decomp = 1 J-decomp = 1 K-decomp =1
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1467.350528 time(s): 0.033668 3.288628e-003

Now, start the actual measurement process.
The loop will be excuted in 5346 times
This will take about one minute.
Wait for a while

cpu : 44.068811 sec.
Loop executed for 5346 times
Gosa : 6.575345e-007
MFLOPS measured : 1997.700906
Score based on Pentium III 600MHz : 24.115173



2並列の結果

>mpiexec -n 2 himeno2.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 67
imax = 64 jmax = 64 kmax =65
I-decomp = 1 J-decomp = 1 K-decomp =2
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 2082.186924 time(s): 0.023727 3.302404e-003

Now, start the actual measurement process.
The loop will be excuted in 7586 times
This will take about one minute.
Wait for a while

cpu : 39.938608 sec.
Loop executed for 7586 times
Gosa : 2.382049e-008
MFLOPS measured : 3127.899239
Score based on Pentium III 600MHz : 37.758320



4並列の結果

>mpiexec -n 4 himeno4.exe
Sequential version array size
mimax = 65 mjmax = 65 mkmax = 129
Parallel version array size
mimax = 65 mjmax = 65 mkmax = 35
imax = 64 jmax = 64 kmax =33
I-decomp = 1 J-decomp = 1 K-decomp =4
Start rehearsal measurement process.
Measure the performance in 3 times.

MFLOPS: 1869.251395 time(s): 0.026429 3.293020e-003

Now, start the actual measurement process.
The loop will be excuted in 6810 times
This will take about one minute.
Wait for a while

cpu : 42.718009 sec.
Loop executed for 6810 times
Gosa : 7.458185e-008
MFLOPS measured : 2625.239633
Score based on Pentium III 600MHz : 31.690483


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

Windowsで動くプログラムを、Linuxでコンパイルするための、MinGW-w64クロスコンパイラ(x86_64-w64-mingw32)を構築してみた。
 ・クロスコンパイラが動く環境:Linux(今回は Ubuntu 64bit)
 ・クロスコンパイラによってコンパイルされたプログラムが動く環境:Windows 64bit(今回は Windows 7)

後に出てくる用語を整理しておくと、
 ・target:クロスコンパイラによってコンパイルされたプログラムが動く環境(=Windows)
 ・host:クロスコンパイラが動く環境(=Linux)
 ・build:クロスコンパイラをビルドする環境(=Linux)

●記事修正
(2011/2/18) インストール先を「/usr/local」から「/opt」に変更し、インストールを再検証しました。

●関連記事

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 64bitで動かす(その2:MSMPI編)
MS-MPIをリンクするプログラムのクロスコンパイルを試みます。この記事の続編です。

[gcc備忘録] C/C++プログラムを Ubuntu 64bitでコンパイルし、Windows 32bitで動かす(その1)
今回の記事の 32bitバージョンです。

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

今回インストールするクロスコンパイラは、gcc-4.5.2 である。
「/opt/mingw-4.5.2」にインストールすることにする。

クロスコンパイラのビルドに使用したコンパイラは、以下のように「gcc 4.4.3」である。

$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


●手順1(Linux側):binutilsのコンパイル/インストール
入手先:http://ftp.gnu.org/gnu/binutils/
  最新バージョン「binutils-2.21.tar.gz」(ソース)を入手した。

①「binutils-2.21.tar.gz」をホームディレクトリに置き、端末で以下を実行。

cd
tar zxf binutils-2.21.tar.gz
cd binutils-2.21
mkdir build
cd build
../configure --target=x86_64-w64-mingw32 --disable-multilib \
--with-sysroot=/opt/mingw-4.5.2 --prefix=/opt/mingw-4.5.2 \
--with-windres
make
sudo make install
sudo cp /opt/mingw-4.5.2/bin/x86_64-w64-mingw32-windmc \
/opt/mingw-4.5.2/x86_64-w64-mingw32/bin/windmc
sudo cp /opt/mingw-4.5.2/bin/x86_64-w64-mingw32-windres \
/opt/mingw-4.5.2/x86_64-w64-mingw32/bin/windres


「/opt/mingw-4.5.2/bin」の下に、「x86_64-w64-mingw32-ar」等がコピーされればインストール成功。

●手順2(Linux側):「mingw-w64 toolchain」の中の、headerをインストール
入手先:http://sourceforge.net/projects/mingw-w64/
  「mingw-w64-v1.0-snapshot-20101003.tar.bz2」を入手した。

①「mingw-w64-v1.0-snapshot-20101003.tar.bz2」をホームディレクトリに置き、端末で以下を実行。

cd
tar jxf mingw-w64-v1.0-snapshot-20101003.tar.bz2
cd mingw-w64-v1.0-20101003
mkdir build-header
cd build-header
../mingw-w64-headers/configure --host=x86_64-w64-mingw32 \
--prefix=/opt/mingw-4.5.2
sudo make install
cd /opt/mingw-4.5.2
sudo ln -s x86_64-w64-mingw32 mingw
cd mingw
sudo ln -s lib lib64


「/opt/mingw-4.5.2/x86_64-w64-mingw32/include」の下に、ヘッダファイルがコピーされればインストール成功。

私は最初、hostは Linux、targetは Windowsのはずだから、configureのオプションで--hostを省略し、「--target=x86_64-w64-mingw32」と与えていた。ところが、これではちっともうまくいかず、思い切りハマってしまった。試行錯誤の結果、--targetの代わりに「--host=x86_64-w64-mingw32」とすればうまくいくことが判明した(理屈はわからない)。

●手順3(Linux側):gcc(クロスコンパイラ)のコア部分のコンパイル/インストール
入手先:ftp://ftp.gnu.org/gnu/gcc/
  最新バージョン「gcc-4.5.2.tar.gz」(ソース)を入手した。

①「gcc-4.5.2.tar.gz」をホームディレクトリに置き、以下を実行。

私の環境には、gccのインストールに必要な m4、gmp、mpfr、mpc が、すでに「/usr/local」にインストールされていた。
これらのインストール法については、http://kanedaq.blog24.fc2.com/blog-entry-1.html を参照。

cd
tar zxf gcc-4.5.2.tar.gz
cd gcc-4.5.2
mkdir build
cd build
../configure --target=x86_64-w64-mingw32 --disable-multilib \
--prefix=/opt/mingw-4.5.2 --with-sysroot=/opt/mingw-4.5.2 \
--with-gmp=/usr/local
make all-gcc
sudo make install-gcc


「/opt/mingw-4.5.2/bin」の下に、「x86_64-w64-mingw32-gcc」等がコピーされればインストール成功。

●手順4(Linux側):「mingw-w64 toolchain」の中の、crt関連をインストール

①「$HOME/.bashrc」の最後に、以下の2行を追加しておく。

#### MinGW-w64 Cross Compiler (64bit)
export PATH=$PATH:/opt/mingw-4.5.2/bin



② 端末で以下を実行。

export PATH=$PATH:/opt/mingw-4.5.2/bin
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
cd
cd mingw-w64-v1.0-20101003
mkdir build-crt
cd build-crt
../mingw-w64-crt/configure --host=x86_64-w64-mingw32 \
--prefix=/opt/mingw-4.5.2 --with-sysroot=/opt/mingw-4.5.2
make
sudo make install



「sudo make install」を実行したとき、以下のエラーが出た。

/bin/bash: line 5: x86_64-w64-mingw32-ranlib: コマンドが見つかりません



whichで調べてみると、

$ which x86_64-w64-mingw32-ranlib
/opt/mingw-4.5.2/bin/x86_64-w64-mingw32-ranlib



コマンドへのPATHは通っている。
エラーを回避するため、Makefileを修正することにした。
エディタで「ranlib」(小文字)を検索し、以下のように ranlibをフルパスで指定した。

RANLIB = x86_64-w64-mingw32-ranlib
  ↓ 変更
RANLIB = /opt/mingw-4.5.2/bin/x86_64-w64-mingw32-ranlib



再び以下を実行したら、インストールできた。

sudo make install


「/opt/mingw-4.5.2/x86_64-w64-mingw32/lib」の下に、lib*.aがコピーされればインストール成功。

●手順5(Linux側):gcc(クロスコンパイラ)の残りをコンパイル/インストール

① 端末で以下を実行。

cd
cd gcc-4.5.2/build
make
sudo make install


「/opt/mingw-4.5.2/bin」の下に、「libstdc++-6.dll」等のdllがコピーされればインストール成功。

●手順6(Linux側):ファイル修正

① float.hを修正。

以下のページの手順3によると、float.hの修正が必要らしい。
http://www.symscape.com/openfoam-1-7-x-on-windows-64-mpi

この手順に従い、以下のファイルを修正する。
/opt/mingw-4.5.2/lib/gcc/x86_64-w64-mingw32/4.5.2/include/float.h

エディタでファイルの末尾に行き、「#endif /* _FLOAT_H___ */」の前にinclude_next文を追加した。

#endif /* __STDC_WANT_DEC_FP__ */

#endif /* _FLOAT_H___ */

  ↓ 変更

#endif /* __STDC_WANT_DEC_FP__ */

#include_next <float.h>

#endif /* _FLOAT_H___ */



●手順7:DLLを Windows環境に転送

①「/opt/mingw-4.5.2/bin/*.dll」を Windows環境に転送し、PATHを通す。

●後始末(Linux側)

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

binutils-2.21
mingw-w64-v1.0-20101003
gcc-4.5.2



●テスト

① Linux側で「hello.cpp」を作成した。

#include <iostream>

int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}



② Linuxの端末で以下を実行し、クロスコンパイルした。
「-static」オプションを与えると、スタティックリンクされる。

x86_64-w64-mingw32-g++ -o hello_d.exe hello.cpp
x86_64-w64-mingw32-g++ -o hello_s.exe hello.cpp -static


生成された exeを Windows上(コマンドプロンプト)で動かしてみたら、いずれも動いた。
ダイナミックリンクの exeは、libstdc++-6.dllと libgcc_s_sjlj-1.dllが必要だった。
スタティックリンクの exeは、これらの dllがなくても動いた。

●課題

・boostのインストール
  必要に迫られたら試したい。
プロフィール

カネダック

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

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

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

この人とブロともになる

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