ユーザーガイド 1.5系 - 3.4 アプリケーションの並列実行
出典: OFWikiJa
[編集] 3.4 アプリケーションの並列実行
この節では複数のプロセッサーによる並列処理でのOpenFOAMの実行方法について説明します。OpenFOAMによる並列処理の方法はドメインの分割として知られており,ジオメトリと関連したフィールドを解析に用いるプロセッサーに合わせてピースに分割します。並列処理には、メッシュとフィールドの分割と、並列でのアプリケーションの実行がありますが、分割したcaseのポスト・プロセスについては以降のセクションで説明します。 並列処理には,標準のMPI(message passing interface)の実装であるopenMPIというパブリックドメインを使用しています。 OpenFOAMはB.1で述べているように,MPIの実装であるMPICHも使用することもできます。
[編集] 3.4.1 メッシュの分解と初期フィールド・データ
メッシュとフィールドは,decomposeParユーティティを用いて分割します。この根本的な目的は,最小限の労力でドメインを分割しつつ,解析の効率性を向上させようとするものです。ジオメトリとフィールドのデータは,decomposeParDictと名前のつけられたディレクトリの中で指定されたパラメータにより分割されますが,このディレクトリは対象とするcaseのsystemディレクトリの中に置かれている必要があります。例えば,ユーザーがこのことを行いたい場合には,dictionaryの登録を次のように置き換えることによってinterFoam/damBreakチュートリアルからdecomposeParDictディレクトリをコピーすることができます。
23 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
24
25
26 numberOfSubdomains 4;
27
28 method simple;
29
30 simpleCoeffs
31 {
32 n (2 2 1);
33 delta 0.001;
34 }
35
36 hierarchicalCoeffs
37 {
38 n (1 1 1);
39 delta 0.001;
40 order xyz;
41 }
42
43 metisCoeffs
44 {
45 processorWeights
46 (
47 1
48 1
49 1
50 1
51 );
52 }
53
54 manualCoeffs
55 {
56 dataFile "";
57 }
58
59 distributed no;
60
61 roots
62 (
63 );
64
65
66 // ************************************************************************* //
ユーザーは,以下に述べるmethodキーワードにより指定できる4つの分割方法から選択します。
simple 簡単なジオメトリの分割:ドメインはx,y方向に,例えばx方向に2つに,y方向1つにというように,ピースが分割されます。
hierarchical 階層的なジオメトリの分割方法:基本的にはsimpleと同じですが,ユーザーが,最初にy-方向を,次にx-方向を,というように,各方向の分割する順番を指定する点が異なっています。
metis METIS分割はユーザーからのジオメトリの入力を必要とせず,プロセッサーの限界の数値を最小化するよう試みます。ユーザーは,プロセッサー間の重み付けを行うことができるため,パフォーマンスの異なるマシン同士を有効に使うことができます。
manual マニュアルでの分割:個別のプロセッサーに対して,各々のセルの割り当てを直接指定します。
これらの各\texttt{method\/}については,dictionaryのリストに示すように,<method>coeffsと名前の付けられたdecompositionDictのsubdictionaryの中で指定された係数のセットがあります。decompositionDict dictionaryの中にある入力のキーワードのフルセットの説明を,表 3.4に示します。
| 必須入力 | ||
| numberOfSubdomains | サブドメインの総数 | N |
| method | 分割法方 | simple/ hierarchical/ metis/ manual/ |
| simpleCoeffs 入力 | ||
| n | 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x,y,z のサブドメイン数 | (構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_{x},n_{y},n_{z}
) |
| delta | セルのスキュー因数 | 一般的に、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^{-3} |
| hierarchicalCoeffs 入力 | ||
| n | 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x,y,z のサブドメイン数 | (構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_{x},n_{y},n_{z}
) |
| delta | セルのスキュー因数 | 一般的に、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^{-3} |
| order | 分割の順序 | xyz/xzy/yzx... |
| metisCoeffs 入力 | ||
| processorWeights | プロセッサーへのセルの割当の重み係数の一覧。例:<wt1>はプロセッサー1の重み係数。 重みは規格化され、どんな範囲の値も取ることが可能。 | (<wt1>...<wtN>) |
| manualCoeffs 入力 | ||
| dataFile | プロセッサーへのセルの割当のデータを含むファイル名 | "<fileName>" |
| 分散型データの入力(オプション) -- 3.4.3参照 | ||
| distributed | データはいくつかのディスクのに分散しますか? | yes/no |
| roots | ケースディレクトリへのルートパス。例:<rt1>はノード1へのルートパス | (<rt1>...<rtN>) |
表3.4 decompositionDict辞書のキーワード
decomposePar ユーティリティは以下のように入力することで正常に実行されます。
decomposePar
最終的に、ケースディレクトリ内に各プロセッサにひとつずつ一連のサブディレクトリが作成されるでしょう。そのディレクトリはプロセッサナンバーを表すN=0,1,...を用いてプロセッサNと名づけられ、そして分割されたフィールドの説明を含むタイムディレクトリや分解されたメッシュの説明を含むconstant/polyMeshディレクトリを持っています。
[編集] 3.4.2 分解ケースの実行
分解されたOpenFOAMのケースはMPI (openMPI)の openMPI を使って並列実行されます。
構成されるLAMマルチコンピュータのホストマシンの名前があるファイルを作成する必要があります。ファイルには名前とパスを与えることができます。以下の記述では,フルパスを含んだ一般的な名前として<machines>としています。
この<machines>ファイルは,1行ごとに1台のマシンのリストを持っています。これらの名前は,LAMのスタート時にマシンの/etc/hostsファイルの中のホスト名と,完全に一致させる必要があります。 リストには,openMPIを実行するマシンの名前を持たせる必要があります。 ここに,マシンのノードは1つ以上のプロセッサーを持っており,ノードの名称はcpu=構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n の登録に依存しますが,このnはノード上でopenMPIが実行されるプロセッサーの数です。
例として,aaa、2つのプロセッサーを持つ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/icoFoamディレクトリの中のcavityチュートリアルにおいてicoFoamを4つのノード上で走らせる場合には,以下のコマンドを実行させる必要があります:
mpirun --hostfile machines -np 4 icoFoam
$FOAM_RUN/tutorials/icoFoam -parallel > log
[編集] 3.4.3 複数のディスクへのデータの分配
例で挙げたように,ローカルのディスクのみのパフォーマンスを向上させるために,データファイルを分配する必要が生じる場合が考えられます。このようなケースでは,ユーザーは異なるマシン間のcaseディレクトリに対するパスを見つけなければなりません。その場合には,distributedと rootsのキーワードを使って,パスをdecomposeParDict dictionaryの中に指定する必要があります。distributedのエントリーが以下のように読み込まれなければなりません。
distributed yes;
また,rootsのエントリーは,各々のノードである、<root0>, <root1>, . . . 、 のルートパスのリストとなっています。
roots <nRoots> ( "<root0>" "<root1>" ... );
<nRoots>はルーとのナンバーです。
各processorNdictionaryは,decomposeParDictdictionaryの中で指定された各ルートパスでcaseディレクトリの中に置かなければなりません。constantディレクトリの中のsystemディレクトリとファイル類についてもまた,各々のcaseディレクトリの中にある必要があります。 constantディレクトリの中のファイル類は必要となりますが,polyMeshディレクトリは必要のないことに注意してください。
[編集] 3.4.4 後処理並列プロセスケース
並列実行されたケースの後処理時には、ユーザーにふたつのオプションがあります。
- 完全なドメインとフィールドを再生するためにメッシュとフィールドの再構築を行う。ここではノーマルとしてポスト・プロセスを行うことができます。
- 分割されたドメインを個別に引数でポスト・プロセスを行う。
[編集] 3.4.4.1 メッシュとデータの再構築
caseが並列処理された後に,ポスト・プロセスによって再構築を行うことができます。caseは,timeディレクトリのsingle setの中にある各processorNディレクトリから,timeディレクトリのセットを合併操作することにより再構築されます。reconstructParユーティティは,次のように,コマンドラインから実行することにより機能を発揮します:
reconstructPar
データが異なるディスクに分散される時には,最初に,再構築におけるローカルのcaseディレクトリにコピーされる必要があります。
[編集] 3.4.4.2 分解ケースの後処理
6.1に示すようにparaFoamポストプロセッサーを使って分割された各caseのポスト・プロセスを行えます。 シミュレーション全体はケースを再構築することで後処理できますし、またはその代わりに個々のプロセッサーディレクトリをそれ自体でひとつのケースとして扱うことで個々に分解されたドメインのセグメントを後処理することもできます。
