この節では複数のプロセッサによる並列処理での
OpenFOAM
の実行方法について説明します.
OpenFOAM
による並列処理の方法はドメインの分割として知られており,ジオメトリと関連したフィールドを解析に用いるプロセッサに合わせてピースに分割します.並列処理には,
メッシュとフィールドの分割と,並列でのアプリケーションの実行がありますが,分割したケー スの前処理については以降の節で説明します.並列処理には,標準の
MPI (message passing interface)
の実装であるopenMPI
というパブリックドメインを使用しています.3.4.1
メッシュの分解と初期フィールド・データメッシュとフィールドは,
decomposePar
ユーティリティを用いて分割します.この根本的な 目的は,最小限の労力でドメインを分割しつつ,解析の効率性を向上させようとするものです.ジオメトリとフィールドのデータは,
decomposeParDict
と名前のつけられたディクショナリの 中で指定されたパラメータにより分割されますが,このディクショナリは対象とするケースのsystem
ディレクトリの中におかれている必要があります.もしユーザが必要とする場合には,interFoam/damBreak
チュートリアルからdecomposeParDict
ディクショナリをコピーすること ができます.そして,ディクショナリ中のエントリを次のように置き換えます.17 /*---*- C++ -*---*\
18 | ========= | |
19 | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
20 | \\ / O peration | Version: 2.2.0 |
21 | \\ / A nd | Web: www.OpenFOAM.com |
22 | \\/ M anipulation | |
23 \*---*/
24 FoamFile
25 {
26 version 2.0;
27 format ascii;
28 class dictionary;
29 location "system";
30 object decomposeParDict;
31 }
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 numberOfSubdomains 4;
35
36 method simple;
37
38 simpleCoeffs
39 {
40 n ( 2 2 1 );
41 delta 0.001;
42 }
43
44 hierarchicalCoeffs
45 {
46 n ( 1 1 1 );
47 delta 0.001;
48 order xyz;
49 }
50
51 manualCoeffs
52 {
53 dataFile "";
54 }
55
56 distributed no;
57
58 roots ( );
59 60
61 // ************************************************************************* //
ユーザは,以下に述べる
method
キーワードにより指定できる四つの分割方法から選択します.simple
簡単なジオメトリの分割:ドメインはx,y方向に,例えばx方向に二つに,y方向一 つにというように,ピースが分割されます.hierarchical
階層的なジオメトリの分割方法:基本的にはsimple
と同じですが,ユーザが,最初にy方向を,次にx方向を,というように,各方向の分割する順番を指定する点が 異なっています.
scotch Scotch
分割はユーザからのジオメトリの入力を必要とせず,プロセッサの限界の数値を最小化するよう試みます.ユーザは,任意指定の
processorWeights
キーワードに よりプロセッサ間の重み付けを行うことができるため,パフォーマンスの異なるマシン 同士を有効に使うことができます.また,もう一つstrategy
という任意のキーワード エントリがあり,複雑な文字列をScotch
に渡すことにより分割の戦略を制御できます.さらなる情報を得るには,ソースコードファイル
$FOAM_SRC/decompositionMethods/
decompositionMethods/scotchDecomp/scotchDecomp.C
を読んでください.manual
マニュアルでの分割:個別のプロセッサに対して,各々のセルの割り当てを直接指定します.
これらの各
method
については,ディクショナリのリストに示すように,<method>coeffs
と名 前の付けられたdecompositionDict
のサブディクショナリの中で指定された係数のセットがあります.
decompositionDict
ディクショナリの中にある入力のキーワードのフルセットの説明を,表3.4に示します.
decomposePar
ユーティリティは以下のように入力することで正常に実行されます.decomposePar
必須入力
numberOfSubdomains サブドメインの総数 N
method 分割方法
simple/
hierarchical/
scotch/ metis/
manual/
simpleCoeffsエントリ
n x,y,zのサブドメイン数 (nx, ny, nz)
delta セルのスキュー因数 一般的には,10−3
hierarchicalCoeffsエントリ
n x,y,zのサブドメイン数 (nx, ny, nz)
delta セルのスキュー因数 一般的には,10−3
order 分割の順序 xyz/xzy/yzx...
scotchCoeffsエントリ processorWeights
(省略可)
プロセッサへのセルの割当の重み係数の一覧.例:
<wt1>はプロセッサ1の重み係数.重みは規格化 され,どんな範囲の値も取ることが可能.
(<wt1>...<wtN>)
strategy 分割の戦略(省略可).デフォルトは"b"
manualCoeffsエントリ
dataFile プロセッサへのセルの割当のデータを含むファイ
ル名
"<fileName>"
分散型データの入力(省略可)—3.4.3項参照
distributed データはいくつかのディスクのに分散しますか? yes/no
roots ケースディレクトリへのルートパス.例:<rt1>
はノード1へのルートパス
(<rt1>...<rtN>)
表3.4 decompositionDictディクショナリのキーワード
最終的に,ケースディレクトリ内に各プロセッサに一つずつ一連のサブディレクトリが作成さ れるでしょう.そのディレクトリはプロセッサナンバを表すN = 0,1, . . .を用いて
processorN
と名づけられ,そして分割されたフィールドの説明を含むタイムディレクトリや分解されたメッ シュの説明を含むconstant/polyMesh
ディレクトリをもっています.3.4.2
分解ケースの実行分解された
OpenFOAM
のケースはMPI
のopenMPI
を使って並列実行されます.構成される
LAM
マルチコンピュータのホストマシンの名前があるファイルを作成する必要 があります.ファイルには名前とパスを与えることができます.以下の記述では,フルパスを 含んだ一般的な名前として<machines>
としています.この
<machines>
ファイルは,1
行ごとに1
台のマシンのリストをもっています.これらの名 前は,LAM
のスタート時にマシンの/etc/hosts
ファイルの中のホスト名と,完全に一致させる 必要があります.リストには,openMPI
を実行するマシンの名前をもたせる必要があります.ここに,マシンのノードは一つ以上のプロセッサをもっており,ノードの名称は
cpu=n
の登録 に依存しますが,このnはノード上でopenMPI
が実行されるプロセッサの数です.例として,
aaa
,二つのプロセッサをもつbbb
,ccc
というマシン構成からマシンaaa
をホストとして
openMPI
を実行させるものとします.<machines>
は次のようにします.aaa
bbb cpu=2 ccc
openMPI
はそのとき以下の実行によって起動されます.あるアプリケーションを
mpirun
を使って並列実行します.mpirun --hostfile <machines> -np <nProcs>
<foamExec> <otherArgs> -parallel > log &
ここにあげた
<nProcs>
はプロセッサーの数,<foamExec>
はicoFoam
のような実行可能なファ イル名であり,アウトプットはlog
と名前の付けられたファイルに変更されています.例えば,$FOAM_RUN/tutorials/incompressible/icoFoam
ディレクトリの中のcavity
チュートリアルにおいて
icoFoam
を四つのノード上で走らせる場合には,以下のコマンドを実行させる必要があります
mpirun --hostfile machines -np 4 icoFoam -parallel > log &
3.4.3
複数のディスクへのデータの分配例であげたように,ローカルのディスクのみのパフォーマンスを向上させるために,データ ファイルを分配する必要が生じる場合が考えられます.このようなケースでは,ユーザは異な るマシン間のケースディレクトリに対するパスを見つけなければなりません.その場合には,
distributed
とroots
のキーワードを使って,パスをdecomposeParDict
ディクショナリの中 に指定する必要があります.distributed
のエントリが以下のように読み込まれなければなり ません.distributed yes;
また,
roots
のエントリは,各々のノードである,<root0>
,<root1>
,. . .
,のルートパスの リストとなっています.roots
<nRoots>
(
"<root0>"
"<root1>"
...
);
<nRoots>
はルートの数です.各
processorN
ディレクトリは,decomposeParDict
ディクショナリの中で指定された各ルート パスにあるケースディレクトリの中に置かなければなりません.system
ディレクトリやconstant
ディレクトリ中のファイルについてもまた,各々のケースディレクトリの中にある必要があります.
constant
ディレクトリの中のファイル類は必要となりますが,polyMesh
ディレクトリは必要のないことに注意してください.
3.4.4
並列実行されたケースの後処理並列実行されたケースの後処理時には,ユーザにふたつのオプションがあります.
完全なドメインとフィールドを再生するためにメッシュとフィールドの再構築を行う.ここ ではノーマルとして後処理を行うことができます.分割されたドメインを個別に引数で後処理 を行う.
3.4.4.1
メッシュとデータの再構築ケースが並列処理された後に,後処理によって再構築を行うことができます.ケースは,時 刻ディレクトリの一つのセットの中にある各
processorN
ディレクトリから,時刻ディレクトリ のセットを合併操作することにより再構築されます.reconstructPar
ユーティリティは,次のよ うに,コマンドラインから実行することにより機能を発揮しますreconstructPar
データが異なるディスクに分散されるときには,最初に,再構築におけるローカルのケースディ レクトリにコピーされる必要があります.
3.4.4.2
分解ケースの後処理6.1節に示すように