• 検索結果がありません。

アプリケーションの並列実行

ドキュメント内 OpenFOAM User Guide (ページ 86-90)

この節では複数のプロセッサによる並列処理での

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

簡単なジオメトリの分割:ドメインはxy方向に,例えば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 セルのスキュー因数 一般的には,103

hierarchicalCoeffsエントリ

n x,y,zのサブドメイン数 (nx, ny, nz)

delta セルのスキュー因数 一般的には,103

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節に示すように

paraFoam

ポストプロセッサを使って分割された各ケースの後処理を行え ます.シミュレーション全体はケースを再構築することで後処理できますし,またはその代わ りに個々のプロセッサディレクトリをそれ自体でひとつのケースとして扱うことで個々に分解 されたドメインのセグメントを後処理することもできます.

ドキュメント内 OpenFOAM User Guide (ページ 86-90)