スポンサーサイト

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

[OpenFOAM] GPU Linear Solver Library for OpenFOAM を Ubuntu 64bitでビルドする

以下の Symscape社のページをもとに、GPU Linear Solver Library for OpenFOAM のビルドを試みた。
http://www.symscape.com/gpu-openfoam

●記事修正
(2011/6/02) 動作確認の部分を書き換えました。

●環境

・OS          Ubuntu 10.10 64bit
・CUDAバージョン    4.0.13

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

インストール先ディレクトリは任意だが、今回は以下のディレクトリにインストールする。
・OpenFOAM   $HOME/OpenFOAM-cuda
         ← (一時的に)シンボリックリンク $HOME/OpenFOAM

・ofgpu     $HOME/OpenFOAM-cuda/ofgpu

●ダウンロードするファイルの保存先

$HOME/Downloads

●手順1【Symscape社のページの Preparationの4番目】
  必要なパッケージをインストール。

① 端末で以下を実行し、CMake等、必要なパッケージをインストール。

sudo apt-get install cmake g++ git-core flex


他にも必要かもしれない。
g++のバージョンは以下の通り。

$ g++ --version
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 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.


●手順2【Symscape社のページの Preparationの1~2番目】
  CUDAをインストール。

入手先:http://developer.nvidia.com/cuda-toolkit-40
  最新バージョンのドライバとツールキットを入手した。

① インストール方法は他のサイトに詳しいので、概略だけ示す:
  端末で以下を実行。ただし、ドライバのインストールだけは gdmを停止して行う。

cd
sudo Downloads/devdriver_4.0_linux_64_270.40.run
sudo Downloads/cudatoolkit_4.0.13_linux_64_ubuntu10.10.run
sudo Downloads/cudatools_4.0.13_linux_64.run
Downloads/gpucomputingsdk_4.0.13_linux.run


②「$HOME/.bashrc」の最後に、以下の2行を追加。

#### CUDA
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64


端末でも以下を実行。

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64


③ CUDAの動作確認を行うため、「test.cu」を作成した。

#include <iostream>
#include <cstdlib>

__global__ void calc(double* answer, double lhs, double rhs)
{
*answer = lhs / rhs;
}

int main()
{
cudaError_t err;
double answer;
double* dev_answer;

err = cudaMalloc(&dev_answer, sizeof(double));
if (err != cudaSuccess) {
std::cerr << cudaGetErrorString(err) << std::endl;
return EXIT_FAILURE;
}
calc<<<1, 1>>>(dev_answer, 5.0, 2.0);
cudaMemcpy(&answer, dev_answer, sizeof(double), cudaMemcpyDeviceToHost);
std::cout << "answer = " << answer << std::endl;
cudaFree(dev_answer);
return 0;
}


以下を実行して、倍精度でコンパイルして動かしてみた。

nvcc -arch=sm_13 -o test test.cu
./test


「answer = 2.5」と表示されれば成功。

CUDAの動作確認として、「$HOME/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/deviceQuery」もコンパイル/実行してみると良いだろう。

●手順3【Symscape社のページの Preparationの3番目】
  Cusp(& Thrust)をインストール。

Cuspの入手先:http://code.google.com/p/cusp-library/
  最新バージョン「cusp-v0.1.2.zip」を入手した。
Thrustの入手先:http://code.google.com/p/thrust/

① 端末で以下を実行。古いバージョンの CUDAには Thrustが入っていないので、そのときは Thrustもインストールする(今回は不要)。

cd /usr/local/cuda/include
sudo unzip $HOME/Downloads/cusp-v0.1.2.zip
# sudo unzip $HOME/Downloads/thrust-1.4.0.zip # CUDA 4では不要


「/usr/local/cuda/include/cusp/」の下にヘッダファイルがコピーされれば、Cuspのインストール成功。

② Cuspの動作確認を行うため、「/usr/local/cuda/include/cusp/README」をもとに「version.cu」を作成した。

#include <thrust/version.h>
#include <cusp/version.h>
#include <iostream>

int main(void)
{
int thrust_major = THRUST_MAJOR_VERSION;
int thrust_minor = THRUST_MINOR_VERSION;

int cusp_major = CUSP_MAJOR_VERSION;
int cusp_minor = CUSP_MINOR_VERSION;

std::cout << "Thrust v" << thrust_major << "." << thrust_minor << std::endl;
std::cout << "Cusp v" << cusp_major << "." << cusp_minor << std::endl;

return 0;
}


以下を実行して、コンパイルして動かしてみた。

nvcc version.cu -o version
./version


以下のように表示された。

Thrust v1.4
Cusp v0.1



●手順4
  zlibをコンパイル/インストール。

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

① 端末で以下を実行。

cd
tar zxf Downloads/zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure
make
sudo make install


「/usr/local/include」の下に「zlib.h」がコピーされれば、インストール成功。

●手順5【Symscape社のページの Preparationの5番目】
  OpenFOAM 1.7.xの取得と、ThirdParty-1.7.1の展開

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

① 端末で以下を実行。

cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
mkdir OpenFOAM-cuda
ln -s OpenFOAM-cuda 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社のページで指定されている番号に巻き戻す


●手順6【Symscape社のページの手順1~3】
  ofgpu libraryをコンパイル/インストール。

入手先:http://www.symscape.com/gpu-openfoam
  「ofgpu-0_1.tgz」(ソース)を入手した。

① 端末で以下を実行。

cd $HOME/OpenFOAM
tar zxf $HOME/Downloads/ofgpu-0_1.tgz
cd ofgpu/src



② 倍精度でコンパイルする場合は、「ofgpu/CMakeLists.txt」をエディタで編集し、2行挿入する。

set(LIB_NAME ofgpu)

set(SRCS
pbicg.cu
pcg.cu
sparsematrixsystem.cu
)

cuda_add_library(${LIB_NAME} SHARED ${SRCS})

install(TARGETS ${LIB_NAME} DESTINATION ${OFGPU_INSTALL_DIR})

     ↓ 変更

set(LIB_NAME ofgpu)

set(SRCS
pbicg.cu
pcg.cu
sparsematrixsystem.cu
)

# 以下の2行を挿入
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -arch=sm_13)
add_definitions(-DOF_DOUBLE_PRECISION)

cuda_add_library(${LIB_NAME} SHARED ${SRCS})

install(TARGETS ${LIB_NAME} DESTINATION ${OFGPU_INSTALL_DIR})


③ 引き続き端末で以下を実行。

cmake -DCMAKE_INSTALL_PREFIX=`pwd`/../install
make
make install


「$HOME/OpenFOAM/ofgpu/install/lib」の下に「libofgpu.so」が生成されれば、インストール成功。

●手順7【Symscape社のページの手順4~5】
  GPU用に、OpenFOAMにパッチを当てる。

入手先:http://www.symscape.com/gpu-openfoam
  「v7-mingw-openfoam-1-7-x.patch.gz」を入手した。

① 端末で以下を実行して、OpenFOAMにパッチを当てる。

cd $HOME/OpenFOAM/OpenFOAM-1.7.x
gzip -dc $HOME/Downloads/v7-mingw-openfoam-1-7-x.patch.gz | patch -p0 -b


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

chmod ug+x src/gpu/Allwmake


●手順8【Symscape社のページの手順6】
  OpenFOAMをビルド。

① 単精度でコンパイルする場合は、「$HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc」をエディタで以下のように変更する。

: ${WM_PRECISION_OPTION:=DP}; export WM_PRECISION_OPTION
     ↓ 変更
: ${WM_PRECISION_OPTION:=SP}; export WM_PRECISION_OPTION


② 端末で以下を実行。

export WM_GPU='CUDA'
export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


③ 倍精度でコンパイルする場合は、「$WM_DIR/rules/linux64Gcc/c++Opt」をエディタで編集し、コンパイルオプションに「-DOF_DOUBLE_PRECISION」を追加する。

c++OPT = -O3
#c++OPT = -march=nocona -O3

     ↓ 変更

c++OPT = -O3 -DOF_DOUBLE_PRECISION
#c++OPT = -march=nocona -O3 -DOF_DOUBLE_PRECISION



④ このままビルドしたら以下のエラーが出た。

+ wmake decomposePar
~/OpenFOAM/OpenFOAM-1.7.x/lib/linux64GccDPOpt/libscotch.so: undefined reference to `SCOTCH_errorPrintW'
~/OpenFOAM/OpenFOAM-1.7.x/lib/linux64GccDPOpt/libscotch.so: undefined reference to `SCOTCH_errorPrint'
collect2: ld returned 1 exit status
make[1]: *** [~/OpenFOAM/OpenFOAM-1.7.x/applications/bin/linux64GccDPOpt/decomposePar] エラー 1


このエラーを回避するため、あらかじめ「$WM_PROJECT_DIR/src/decompositionMethods/scotchDecomp/Make/options」をエディタで編集し、「libscotcherrexit.so」をリンク先に加える。

LIB_LIBS = \
-ldecompositionMethods \
-lscotch

     ↓ 変更

LIB_LIBS = \
-ldecompositionMethods \
-lscotch -lscotcherrexit


⑤ ビルドを行う。ただし、パッチを当てた後の「Allwmake」を実行すると、以下のエラーが出た。

OPwrite.C:29:17: error: mpi.h: No such file or directory


そこで、パッチを当てる前の「Allwmake.orig」を実行。

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


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

./Allwmake.orig 2> a.txt


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

倍精度の場合は、「$WM_PROJECT_DIR/lib/linux64GccDPOpt/cuda/」と「$WM_PROJECT_DIR/lib/linux64GccDPOpt/gpuless/」の下に「libgpu.so」が生成されれば、コンパイル成功。

単精度の場合は、「$WM_PROJECT_DIR/lib/linux64GccSPOpt/cuda/」と「$WM_PROJECT_DIR/lib/linux64GccSPOpt/gpuless/」の下に「libgpu.so」が生成されれば、コンパイル成功。

⑦ チュートリアルをコピーしておいた。

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


●後始末

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

zlib-1.2.5


●動作確認【Symscape社のページの Example Case】
ケース入手先:http://www.symscape.com/gpu-openfoam
  「pitzDailyGpu.tgz」を入手した。

GPUを使って OpenFOAMを動かしてみた。

① 環境変数の設定。

GPUを使う場合は、端末を再起動後、以下を実行する。

export WM_GPU='CUDA'
export CUDA_ARCH_PATH=$HOME/OpenFOAM/ofgpu
source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc


GPUを使わない場合は、端末を再起動後、以下を実行する。

source $HOME/OpenFOAM/OpenFOAM-1.7.x/etc/bashrc



② pitzDailyGpuケースの実施

格子点数が少ないときは、CPUの方が速かった。
格子点数を増やすと逆転して、GPUの方が速くなった。

[OSコマンド] Windows 7上でアプリケーションの実行時間を測定する

Windows 7上で、アプリケーションの実行時間を測定したい。

● 失敗

timeitコマンドを試したが..
http://www.atmarkit.co.jp/fwin2k/win2ktips/422timecmd/timecmd.html

私の環境では、以下のメッセージが出て動かなかった。
----------------------------- (begin) ---------------------------------------
Unable to query system performance data (c0000004)
------------------------------ (end) ----------------------------------------

● 成功?

Cygwinの timeコマンドを使用した。
少なくとも、実時間(real)はまともな数値が出た。

必要なファイルは以下の2つだった。
----------------------------- (begin) ---------------------------------------
C:\cygwin\bin\cygwin1.dll
C:\cygwin\bin\time.exe
  → gtime.exeにリネームして使用した(Windowsのtimeコマンドと紛らわしいので)
------------------------------ (end) ----------------------------------------
Cygwinがインストールされている別のマシンから、この2つだけコピーして使用した。

● WindowsとUbuntuで表示フォーマットを統一する

Windowsのコマンドプロンプトで、Cygwinのtimeコマンドを実行すると、GNUフォーマットで表示された。
----------------------------- (begin) ---------------------------------------
>gtime notepad
0.00user 0.03system 0:01.15elapsed 2%CPU (0avgtext+0avgdata 270848maxresident)k
0inputs+0outputs (1175major+0minor)pagefaults 0swaps
------------------------------ (end) ----------------------------------------

一方、Ubuntuの端末で timeコマンドを実行すると、POSIXフォーマットで表示された。
----------------------------- (begin) ---------------------------------------
$ time ls > /dev/null

real  0m0.003s
user  0m0.010s
sys   0m0.000s
------------------------------ (end) ----------------------------------------

WindowsとUbuntuで表示フォーマットが異なるので比較しづらい。
表示フォーマットを合わせるため、以下を試した。

(1) POSIXフォーマットに統一

Windows側で「-p」オプションをつけてtimeコマンドを起動。
----------------------------- (begin) ---------------------------------------
>gtime -p notepad
real 1.07
user 0.01
sys 0.00
------------------------------ (end) ----------------------------------------

(2) GNUフォーマットに統一

Ubuntu側で「/usr/bin/time」をフルパスで起動(GNUバージョンのtimeコマンドが動く)。
----------------------------- (begin) ---------------------------------------
$ /usr/bin/time ls > /dev/null
0.01user 0.00system 0:00.00elapsed 500%CPU (0avgtext+0avgdata 4176maxresident)k
0inputs+0outputs (0major+323minor)pagefaults 0swaps
------------------------------ (end) ----------------------------------------
VMware Player上で試したら、500%CPUと表示されたけど、これ何?

●timeコマンドの出力の意味を調べるには

Linuxで「man time」

音楽ネタ第一弾:私のギター演奏、いかが?

趣味の音楽ネタもぼちぼち書いていこうと思います。
第一弾は、私のクラシックギター演奏をどうぞ!
MP3ファイルのサイズが大きめなので、ご注意ください。

・使用楽器:アントニオ・マリン・モンテロ(98年)松、ハカランダ
・使用弦:プロアルテ ノーマル

●タレガ作曲「アルハンブラの思い出」 (録音日:2003-09-01)

ここからダウンロードできます。MP3形式です。
alhambra.mp3(2,106,899byte、演奏時間3:31)

新古品のアントニオ・マリン・モンテロを入手後、すぐに録音してみました。
弦を張り替えた直後に録音したため、少々ピッチが低くなっております..

●カタロニア民謡「聖母の御子」リョベート編 (録音日:2004-01-03)

ここからダウンロードできます。MP3形式です。
seibo.mp3(995,911byte、演奏時間1:39)

●アルベニス作曲「マジョルカ」 (録音日:2004-01-03)

ここからダウンロードできます。MP3形式です。
mallorca.mp3(3,944,352byte、演奏時間6:34)

一人で揺れました

金曜の午後。
みんな出張で出払って、研究室には私一人でした。
一人で揺れました。
耐震工事したばかりの建物に被害はありませんでしたが、街からサイレンの音が聞こえてきて怖かった。
スパコンが緊急停止して、計算が止まりました。
アパートに帰ったら、部屋が散らかっていました。

日曜日。
前々から行く予定だった、東京オペラ・プロデュースのオペラが決行されました。
チケットの払い戻しはされないとのことで、余震が不安だったけど行きました。
ご一緒したAさんも、帰れるかどうか不安そう。
二人とも無事に帰宅できて、一安心。

月曜日。
金曜日に出張していた方々の無事を確認し、ほっとしました。
節電のため、スパコンは停止したままです。
帰り際に、自宅待機命令が出ました。
明日から今週いっぱい、自宅待機です。
新大久保の南大門市場で買いだめした一品ジャージャー麺が、当面の主食になりそうです。

被災された皆様へ心よりお見舞い申し上げます。

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

以下の OpenFOAM Wikiのページをもとに、「OpenFOAM for Windows(32bit)」のビルドを試みた。
ただし、MPIを MPICH2から MS-MPIに変更する。
Tip Cross Compiling OpenFOAM 1.7 in Linux For Windows with MinGW - OpenFOAMWiki

●関連記事

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

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

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

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

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

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

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

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


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

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


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

sudo apt-get install flex bison wget


●手順2~手順3

以下のページの手順2~手順3と同じ。既に実行済みであれば、飛ばしてよい。

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


再掲しておく。

○手順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_msmpi
cd
unlink OpenFOAM # 既存のシンボリックリンクを消去
ln -s /media/sdb1/OpenFOAM32_msmpi 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
(Linux側)MPIを MPICH2から MS-MPIに変更

① 以下のファイルを新規作成する。
$HOME/OpenFOAM/OpenFOAM-1.7.0/wmake/rules/linuxi686-w64-mingw32/mplibMSMPI

内容は以下の通り。

PFLAGS =
PINC = -I$(MPI_ARCH_PATH)/Include
PLIBS = -L$(MPI_ARCH_PATH)/Lib/i386 -lmsmpi


② 以下のファイルを修正する。
$HOME/OpenFOAM/OpenFOAM-1.7.0/etc/bashrc-i686-w64-mingw32

エディタで「MPICH」を検索。

: ${WM_MPLIB:=MPICH}; export WM_MPLIB
  ↓ 変更
: ${WM_MPLIB:=MSMPI}; export WM_MPLIB


③ 以下のファイルを修正する。
$HOME/OpenFOAM/OpenFOAM-1.7.0/etc/settings.sh

エディタで「MPICH)」を検索し、MPICH)の前あたりに MSMPI用の処理を挿入した。

MSMPI)
# export MPI_HOME=/opt/msmpi32
export MPI_ARCH_PATH=/opt/msmpi32
export FOAM_MPI_LIBBIN=$FOAM_LIBBIN/msmpi-2008-sp2
;;


④ 以下のファイルを修正する。
$HOME/OpenFOAM/ThirdParty-1.7.0/scotch_5.1/src/Make.inc/Makefile.inc.i686-w64-mingw32

・「$(MPI_ARCH_PATH)/include」を「$(MPI_ARCH_PATH)/Include」に置換
・「$(MPI_ARCH_PATH)/lib」を「$(MPI_ARCH_PATH)/Lib/i386」に置換
・「-lmpi」を「-lmsmpi」に置換

CFLAGS = -O3 -Wall -Dlinux -DNDEBUG -DWIN32 -DLITTLE_ENDIAN -Drestrict=__restrict -DCOMMON_RANDOM_RAND -DCOMMON_STUB_FORK -DSCOTCH_PTSCOTCH -D'pipe(pfds)=_pipe(pfds,1024,0x8000)' -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -I$(WM_THIRD_PARTY_DIR)/zlib-1.2.5 -I$(MPI_ARCH_PATH)/include
# -DCOMMON_TIMING_OLD
LDFLAGS_P1 = -lz -lm -L$(MPI_ARCH_PATH)/lib -lmpi -L$(WM_PROJECT_DIR)/lib/$(WM_OPTIONS)

  ↓ 変更

CFLAGS = -O3 -Wall -Dlinux -DNDEBUG -DWIN32 -DLITTLE_ENDIAN -Drestrict=__restrict -DCOMMON_RANDOM_RAND -DCOMMON_STUB_FORK -DSCOTCH_PTSCOTCH -D'pipe(pfds)=_pipe(pfds,1024,0x8000)' -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -I$(WM_THIRD_PARTY_DIR)/zlib-1.2.5 -I$(MPI_ARCH_PATH)/Include
# -DCOMMON_TIMING_OLD
LDFLAGS_P1 = -lz -lm -L$(MPI_ARCH_PATH)/Lib/i386 -lmsmpi -L$(WM_PROJECT_DIR)/lib/$(WM_OPTIONS)


●手順7【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


●手順8【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以外だったら、気にしなくて良いようだ。

●手順9【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のビルドは成功。

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

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

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


Windowsの「E:\OpenFOAM32_msmpi\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/msmpi-2008-sp2
<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>/msmpi-2008-sp2/source
<ThirdParty-1.7.0>/platforms/linuxi686-w64-mingw32DPOpt


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

●手順11
 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_msmpi\bin」に転送された。

●後始末(Linux側)

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

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


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

zlib-1.2.5
mingw-libgnurx-2.5.1


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

cd
unlink OpenFOAM


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

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

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

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

WM_PROJECT_DIR

E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0


MPI_BUFFER_SIZE

20000000


PATHに追加

E:\OpenFOAM32_msmpi\bin
E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\applications\bin\linuxi686-w64-mingw32DPOpt
E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt
E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt\msmpi-2008-sp2
C:\Program Files\ParaView 3.10.0-RC1\bin
C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin


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

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

set WM_PROJECT_DIR=E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0
set MPI_BUFFER_SIZE=20000000
set PATH=%PATH%;E:\OpenFOAM32_msmpi\bin
set PATH=%PATH%;E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\applications\bin\linuxi686-w64-mingw32DPOpt
set PATH=%PATH%;E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt
set PATH=%PATH%;E:\OpenFOAM32_msmpi\OpenFOAM-1.7.0\lib\linuxi686-w64-mingw32DPOpt\msmpi-2008-sp2
set PATH=%PATH%;C:\Program Files\ParaView 3.10.0-RC1\bin
set PATH=C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin;%PATH%


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

E:
cd E:\OpenFOAM32_msmpi\usrname-1.7.0\run
:rd /s /q cavity_test
xcopy /E E:\OpenFOAM32_msmpi\usrname-1.7.0\tutorials\incompressible\icoFoam\cavity cavity_test\
cd cavity_test
copy E:\OpenFOAM32_msmpi\usrname-1.7.0\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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。