OpenFOAM ユーザーガイド 1.5系の和訳全文

出典: OFWikiJa

目次


OPubCiF


[編集] 第2章 チュートリアル

この章ではOpenFOAMを動かす基本的な手順をユーザーに説明することを主な目標として、OpenFOAMのいくつかのテストケースでセットアップ、シミュレーションおよび後処理のプロセスを詳しく記述します。 $FOAM_TUTORIALSのディレクトリにはOpenFOAMが提供するすべてのソルバーと多くのユーティリティを使い方を示す数多くのケースがあります。 チュートリアルを始める前にユーザーは最初にOpenFOAMが正しくインストールされていることを確かめなければなりません。

チュートリアルのケースはblockMeshの前処理ツールを使用して記述し、OpenFOAMのソルバーで動かし、paraFoamを使用して後処理を行います。 OpenFOAMのサポートするサードパーティーの後処理ツールでアクセスするユーザーには次の選択肢があります。 paraFoamを使用しチュートリアルを進めるか、または後処理が必要な際に、6章で述べるサードパーティー製品の使い方を参照するかです。

すべてのチュートリアルのコピーはOpenFOAMをインストールしたチュートリアルのディレクトリから利用できます。 チュートリアルはソルバーのサブディレクトリーに組み込まれています。 例えばicoFoamのすべてのケースはサブディレクトリーのicoFoamの内にあります。 ユーザにはtutorialsのディレクトリをローカルの実行ディレクトリにコピーすることを強く勧めます。 そうでなかったら、次のようにタイプすることで容易にコピーすることができます。

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


[編集] 2.1 天井駆動のキャビティー流れ

このチュートリアルは二次元正方形領域の等温非圧縮性流れに関して、プリプロセス、計算、ポストプロセスする方法を解説します。 図2.1に正方形のすべての境界が壁面境界であるジオメトリーを示します。上の壁面境界はx軸方向に1m/sの速度で動き、他の3つの壁面境界は静止しています。 チュートリアルにおいてはこれを解くにあたって、まず層流を仮定し、層流等温非圧縮性流れのためのicoFoamソルバーを使用し均一メッシュ上で解きます。チュートリアルでは、メッシュの解像度の増加や壁方向への勾配の影響を調べます。これにより流れのレイノルズ数を増加させ、turbFoamソルバーを乱流、等温、非圧縮性流れに使用します。

図2.1: 天井駆動キャビティーのジオメトリ

[編集] 2.1.1 前処理

ケースはOpenFOAMでケースファイルを編集することで設定します。ケースファイルはemacsvigeditkateneditなどのテキストエディタで作成・編集します。それは、入出力が初心者でもわかりやすいキーワードを持つ辞書形式が使われているからです。以前のバージョンではFoamXというGUIケースエディタがありましたが、利用者がエディタによって編集できるファイルを好んでおり、メンテナンスをあまりしないためバージョン1.5ではなくなりました。

解析ケースはメッシュ、物理量、物性、コントロールパラメータなどの要素を含んでいますが4.1において示すように、多くのCFDソフトが1つのファイルにこれらのデータを格納するのに対し、OpenFOAMは一連のファイルセットとして解析ケースディレクトリに格納します。解析ケースのディレクトリには、(最初のチュートリアルの例題が単純にcavityであるように)わかりやすい名前を与えます。

解析ケースを編集・実行する前の準備として、まず解析対象のディレクトリに移動します。

cd $FOAM_RUN/tutorials/icoFoam/cavity
[編集] 2.1.1.1 メッシュ生成

OpenFOAMは常に3次元デカルト座標系で動くため、全てのジオメトリーを3次元で生成します。 OpenFOAMはデフォルトの設定において問題を3次元として解きますが、2次元を解く場合は、解決が必要でない(第3)次元方向に垂直な境界に『特別な』emptyという境界条件を指定します。

x-y平面上の一辺の長さ構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): d=0.1\textrm{m} の正方形から成るcavityの領域に、まず20×20セルの均一なメッシュを設定します。このブロック構造を図2.2に示します。

図2.2: キャビティーのメッシュのブロック構造

OpenFOAMで提供されるメッシュ・ジェネレーターblockMeshconstant/polyMeshディレクトリにある入力辞書blockMeshDictで指定された記述からメッシュを生成します。 このケースのblockMeshDictは、以下の通りです:

1  /*--------------------------------*- C++ -*----------------------------------*\
2  | =========                 |                                                 |
3  | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
4  |  \\    /   O peration     | Version:  1.5                                   |
5  |   \\  /    A nd           | Web:      http://www.OpenFOAM.org               |
6  |    \\/     M anipulation  |                                                 |
7  \*---------------------------------------------------------------------------*/
8  FoamFile
9  {
10      version     2.0;
11      format      ascii;
12      class       dictionary;
13      object      blockMeshDict;
14  }
15  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
16  
17  convertToMeters 0.1;
18  
19  vertices
20  (
21      (0 0 0)
22      (1 0 0)
23      (1 1 0)
24      (0 1 0)
25      (0 0 0.1)
26      (1 0 0.1)
27      (1 1 0.1)
28      (0 1 0.1)
29  );
30  
31  blocks
32  (
33      hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
34  );
35  
36  edges
37  (
38  );
39  
40  patches
41  (
42      wall movingWall
43      (
44          (3 7 6 2)
45      )
46      wall fixedWalls
47      (
48          (0 4 7 3)
49          (2 6 5 1)
50          (1 5 4 0)
51      )
52      empty frontAndBack
53      (
54          (0 3 2 1)
55          (4 5 6 7)
56      )
57  );
58  
59  mergePatchPairs
60  (
61  );
62  
63  // ************************************************************************* //

ファイルの最初はバナー(1-7行)形式のヘッダー情報で、ファイル情報はFoamFileサブ辞書を含み、({...})で囲まれます。

今後は: 簡便化とスペースの都合上、バナーとFoamFileサブ辞書を含むファイルヘッダーはケースファイルの引用の際に省きます。

まずファイルは初めにブロックの頂点の座標verticesを指定します。それに続き、頂点名とセル番号からblocks(ここでは1つのみ)を定義します。そして最後に境界パッチを定義します。 blockMeshDictファイルの記述の詳細を理解するには5.3を参照してください。

メッシュはblockMeshDictファイル上でblockMeshを実行すると生成されます。ケースディレクトリ内から以下をターミナルに入力するだけです。

blockMesh

blockMeshの実行状況はターミナルウインドウに表示されます。 blockMeshDictファイルの誤りがあった場合、エラーメッセージが表示され、ファイルのどの行に問題があるかを教えてくれます。 今この段階でエラーメッセージが出ることはないでしょう。

[編集] 2.1.1.2 境界条件と初期条件

メッシュの生成が完了すると、物理的条件の初期状態を確認することができます。 このケースは開始時刻が構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): t=0 に設定されているので解析領域の初期状態のデータはcavityディレクトリの0というサブディレクトリに格納されています。 0には圧力(p)と速度(U)の2つのファイルがあり、圧力(p)と速度(U)の初期値と境界条件を設定する必要があります。 pのファイルを例に説明します。

17  dimensions      [0 2 -2 0 0 0 0];
18  
19  internalField   uniform 0;
20  
21  boundaryField
22  {
23      movingWall
24      {
25          type            zeroGradient;
26      }
27  
28      fixedWalls
29      {
30          type            zeroGradient;
31      }
32  
33      frontAndBack
34      {
35          type            empty;
36      }
37  }
38  
39  // ************************************************************************* //

物理的条件のデータファイルには3つの主要な項目があります。

dimensions
物理量の次元を定義。ここではkinematic圧力,つまり構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathrm{m^2 s^{-2}}
(4.2.6に詳述) 
internalField
内部の物理量は単一の値で記述すれば一様となり、一様でない場合はすべての値を指定する必要があります (4.2.8に詳述)
boundaryField
境界面の物理量は境界条件と境界パッチに与えるデータを記述します(4.2.8に詳述)

このcavity流れの解析ケースでは境界は壁面のみですが、2つのパッチが使用されています。 (1)キャビティの固定された側面と底面用のfixedwallと(2)キャビティの駆動天井面用のmovingwallです。 どちらもpの値がzeroGradientですが、これは圧力の勾配が0であるということです。 frontAndBackは2次元の問題の場合の表裏の平面を示していて、本ケースでは当然emptyとなっています。

このケースでは、もっともよく目にするものでありますが、物理量の初期条件がuniform(一様)になっています。 ここでは圧力は動圧のみの非圧縮ケースであるため、絶対値は解析と関係ないので便宜上uniform 0としています。

0/Uの速度のファイルにおいても同様です。 dimensionsは速度であり、内部の初期条件はベクトル量で3成分とも0を意味するuniform (0 0 0)になっています (4.2.5に詳述) 。

速度の境界条件はfrontAndBackパッチと同じ条件です。 fixedWallに関してはすべりなしのためuniform(0 0 0)となります。上面は1m/sで移動するのでuniform(1 0 0)で固定値を設定します。

[編集] 2.1.1.3 物理量

ケースの物理量は、名前に・・・Propertiesという語尾を与えられて辞書に保存され、Dictionariesディレクトリツリーに置かれます。 icoFoamケースでは、transportProperties辞書に保存される動粘性係数を指定するだけです。

transportProperties辞書を開いてとエントリを見たり、編集することができますので、動粘性係数が正しくセットされることを確かめてください。 動粘性係数は、nu(方程式で見受けられるギリシア語シンボル構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nu の音声ラベル)というキーワードになります。 まず最初に、このケースはレイノルズ数を10で計算します。レイノルズ数は次のように定義されます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle Re = \frac{d |\mathbf{\mathrm{U}}|}{\nu}


構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): d構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathbf{\mathrm{U}} はそれぞれ特性長さと速度を表し、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nu は動粘性係数を表します。 ここで、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): d=0.1\mathrm{m} ,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathbf{\mathrm{U}}= 1 \mathrm{m/s} ,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): Re=10 とすると、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nu = 0.01 \mathrm{m^2/s} となります。 動粘性係数の適切な設定は以下のようになります。

17  nu              nu [0 2 -1 0 0 0 0] 0.01;
18  
19  // ************************************************************************* //
[編集] 2.1.1.4 制御

計算時間の制御、解のデータの読み書きに関する入力データは、controlDict辞書から読み取られます。 これはsystemディレクトリにありますので、ケースを制御するファイルとして参照してください。

まず最初にスタート/停止時間と時間ステップを設定しなければなりません。 OpenFOAMは、柔軟性の高い時間制御を提供しますが、詳しくは4.3章で述べます。 このチュートリアルでは、時間 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): t=0 から実行を始めたいと思います。 つまり、OpenFOAMは0というディレクトリからフィールド・データを読む必要があることになります(ケースファイル構造の詳しい情報に関して4.1章を見てください)。 したがって、startTimestartFromキーワードを設定して、次に0になるようにstartTimeキーワードを指定します。

終了時間には、流れがキャビティー周りを循環している定常解に達することを目標にするわけですが、概して、流体は層流で定常状態に到達するために領域を10回通り抜けなければなりません。 今回(cavityケース)は、入口も出口もないので、流れが解析領域を通り抜けません。 代わりに、ふたがキャビティーを10回移動する時間(すなわち1秒)を終了時間としてセットしてもいいでしょう。 実際は、後の知見により、0.5秒で十分であるとわかるので、この値を採用するつもりです。 この終了時間を指定するために、stopAtキーワードとして endTimeを指定して、endTimeキーワードを0.5に設定しなければなりません。

次に、時間ステップを設定する必要がありますが、これはキーワードdeltaTによって表されます。 icoFoamを動かす時、時間の精度と安定性を達成するために、1未満のクーラン数が必要です。 クーラン数は以下のように定義されます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle Co = \frac{\delta t|\mathbf{\mathrm{U}}|}{\delta x}


δtは時間ステップ、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): |\mathbf{\mathrm{U}}| はセルを通る流速の大きさ、そして構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta x は流速方向のセルサイズです。 流速が領域内で変化しても必ず構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): Co<1 を成り立たせる必要があります。 だから、最も悪い場合(つまり、大きな流速と小さなセルサイズの組合わせによる最大の構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): Co )を元に構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta t を決定します。 ここでは、セルサイズは解析領域中全域で固定されているので、最大構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): Co はふた付近に生じ、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1\mathrm{ms^{-1}} に近い流速になるでしょう。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \delta x = \frac{d}{n} = \frac{0.1}{20} = 0.005 \mathrm{m}


したがって、領域中で1以下のクーラン数を達成するために、時間ステップdeltaTを次のようにセットしなくてはいけません:

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \delta t = \frac{Co \delta x}{|\mathbf{\mathrm{U}}|} = \frac{1 \times 0.005}{1} = 0.005 \mathrm{s}


シミュレーションが進行する時、後でポスト処理パッケージで見ることができるように、ある一定の時間間隔での結果の書き出しをもとめる際、 writeControlキーワードは結果が書かれる時間を決めるためのいくつかのオプションを提示します。 timeStepオプションは、結果が構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n 回時間ステップ毎に結果を書き出すということを意味し、その時の構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n 値はwriteIntervalキーワードで指定されます。 0.1, 0.2, ・・・, 0.5秒で結果を書きたいとしましょう。 したがって、0.005秒の時間ステップなので、時間ステップ20回毎に結果を出力する必要があります。 よってwriteIntervalに20を設定します。

OpenFOAMは4.1章で議論するデータセットを書き込む毎に例えば0.1秒という現在時間にちなんで名付けられた新しいディレクトリを作成します。 icoFoamソルバーでは、Upの各項目毎に結果を時間ディレクトリに書き込みます。 このケースでは、controlDictの記述内容は以下の通りです。

17  application icoFoam;
18  
19  startFrom       startTime;
20  
21  startTime       0;
22  
23  stopAt          endTime;
24  
25  endTime         0.5;
26  
27  deltaT          0.005;
28  
29  writeControl    timeStep;
30  
31  writeInterval   20;
32  
33  purgeWrite      0;
34  
35  writeFormat     ascii;
36  
37  writePrecision  6;
38  
39  writeCompression uncompressed;
40  
41  timeFormat      general;
42  
43  timePrecision   6;
44  
45  runTimeModifiable yes;
46  
47  // ************************************************************************* // 
[編集] 2.1.1.5 離散化と線形ソルバーの設定

ユーザはfvSchemes辞書(systemディレクトリ)内で有限体積離散化法を選択するかどうか指定します。 線形方程式ソルバーとトレランスおよび他のアルゴリズムコントロールの指定はfvSolution辞書内に作られています。 ユーザは自由にこれらの辞書を見ることができますが、fvSolution<i>辞書の<i>PISOサブディレクトリのpRefCellpRefValueを除いて、現在のところ、それらすべての項について議論する必要はありません。 キャビティーのような閉じた非圧縮系では、圧力は相対的であり、重要なのは(絶対値ではなく)圧力範囲です。 このような場合では、ソルバーはセルpRefCellpRefValueによる参照レベルをセットします。 この例では、両方が0に設定されます。 しかし、これらの値のどちらかを変えると絶対圧力(速度と相対圧力ではなく)が変化します。

[編集] 2.1.2 メッシュの確認

解析を実行する前に正しくメッシュができているか確認しましょう。 メッシュはOpenFoamが提供するポスト処理ソフトのparaFoamで確認します。 paraFoamは解析ケースのディレクトリ上でターミナルから起動します。

paraFoam

あるいは、オプションに-caseをつけることで他のディレクトリからでも起動することができます。

paraFoam -case $FOAM_RUN/tutorials/icoFoam/cavity 

図6.1に示すようにParaViewのウインドウが開きます。 PipelineBrowserにてParaViewがcavity.OpenFOAM、キャビティケースのモデュールを開いていることが確認できます。 Applyボタンをクリックする前にRegion Statusとパネルから表示する要素を選択する必要があります。 解析ケースが単純なのでRegion Statusパネルのチェックボックスで全てのデータを選択することが簡単です。パネル内の全要素を自動的にチェックすることが出来ます。

ParaViewでジオメトリを読込むためにはApplyボタンをクリックします。Displayタブを開き選択したモジュールの表示形式を調整します。図2.3に示すように(1)set color by Solid Color設定;(2)Set Solid Colorをクリックし適当な色(背景が白の場合は黒など)を選択;(3)StyleパネルではRepresentationメニューからWireframeを選択します。 背景色はトップメニューパネルでEditからView Settings...を選択して設定します。

図2.3: paraFoamでのメッシュの表示

6.1.5で述べるように視点操作を試してみましょう。 特に本ケースは2次元なのでEditメニューのView SettingsのGeneralパネルでUse Parallel Projectionを選択するのがよいでしょう。 詳しくは6.1.5.1で述べます。軸の方向をマウスのドラッグ&ドロップによって操作することができます。

[編集] 2.1.3 アプリケーションの実行

あらゆるUNIX/Linuxの実行ファイルと同様に、OpenFOAMアプリケーションは2つの方法で実行することができます。 1つ目はフォアグラウンドのプロセスで、コマンドプロンプトを与えるのにシェルが命令終了まで待つものです。 2つ目はバックグラウンドプロセスで、シェルがさらなる命令を受け入れるのに命令完了の必要がないものです。

ここでは、フォアグランドでicoFoamを動かしましょう。 icoFoamソルバはケースディレクトリ内に入って、コマンドプロンプト上で

icoFoam

と入力することで実行できますが、

あるいはオプションに-caseをつけることで他のディレクトリからでも起動することができます。

icoFoam -case $FOAM_RUN/tutorials/icoFoam/cavity

ジョブの進捗は、ターミナルウインドウに表示されます。現在の時刻、最大クーラン数、全てのフィールドの初期値と最終的結果を表示します。

[編集] 2.1.4 ポスト・プロセッシング

結果が時間ディレクトリに書かれるとすぐに、paraFoamを使って見ることができます。 paraFoamウインドウに戻って、cavity.foamケースモジュールのためにParametersパネルを選んでください。 ケースモジュールのためのパネルが存在していないようならば、cavity.foamが黄色でハイライトされているか/それと並んだeyeボタンにグラフィックスが可能であることを示すスイッチは入っているか/フォームのViewメニュー中でSourceが選ばれているかを確認してください。

見たいデータを表示するparaFoamを準備するには、最初に必須の実行時間として0.5s分のデータを読込まなければなりません。 ケースが実行中で一方ParaViewを開いている場合、時間ディレクトリの出力データは ParaViewに自動的にロードはされません。データをロードするためには、Properties画面でUpdate GUIを選択し、緑のApplyボタンをクリックします。 そうすれば時間データはロードされます。

[編集] 2.1.4.1 コンタープロット

圧力を見るにはDisplayパネルを開き、選択したモジュールの表示形式を調整します。 圧力分布を見るには図2.4に示すようにStylePanelのRepresentationメニューをsurfaceにしてColorPanelのSet Color byを・p、そしてRescale to Data Rangeボタンをクリックし、メニューバーの下のツールバーにあるVCR ControlsまたはCurrent timeを0.5にしてt=0.5sにおける解析結果を表示します。 それらのパネルは図6.4に示すようにParaViewウィンドウのトップメニューの下にあります。 圧力場の解析結果は図2.5のように左上が低く、右上が高い圧力分布になるはずです。

圧力分布を作成するには図2.4に示すようにStylePanelでRepresentationメニューからSurfaceを選択し、Colorパネルで・p、そしてRescale to Data RangeボタンによってColorを選択します。メニューバーの下のツールバーにあるVCR ControlsまたはCurrent timeを0.5にしてt=0.5sにおける解析結果を表示します。

画像:user48x.png.jpegのアイコンで圧力分布をセル間を補完した連続分布を表示します。もしColor byメニューからセルアイコンを選択しなければ各々のセルが等級づけなしで一つの色によって意味されるように、圧力のための一つの値は各々のセルに起因しています。

Active Variable ControlsツールバーのToggle Color Legend VisibilityボタンをクリックするかViewメニューからShow Color Legendを選択することで、カラーバーを表示させることができます。 Active Variable Controls toolbarかDisplay windowのColor panelにあるEdit Color Map buttonをクリックするとフォントの大きさや種類、スケールの番号付けの形式など、カラーバーの設定を変更することができます。カラーバーはドラッグアンドドロップによりimageウインドウに置くことも可能です。

イメージを回転をさせるとすべての表面に圧力分布で色づけされていることが確認できます。 正しいコンター図を得るために断面を作成するか、6.1.6.1に示すsliceフィルターを用いてジオメトリを‘slice’します。 6.1.6.1に示すsliceフィルターを用います。 断面の中心座標は(0.05,0.05,0.005)、基準点は(0,0,1)とします。 断面を作成後、6.1.6に示すcontourフィルターによってコンターを描画します。

図2.4: キャビティーケースでの圧力等圧線のディスプレイ

図2.5: キャビティーケースでの圧力

[編集] 2.1.4.2 ベクトルプロット

流速ベクトルを描画する前に、先に作成した断面やコンターなどの他のモジュールは不要なので取り除きましょう。 Pipeline Browserでそれらのモジュールを選択し、Properties PanelのDeleteをクリックして削除するか、Pipeline Browserで目の形のボタンをクリックしてそれらのモジュールを非表示にします。

各格子の中心におけるベクトルグラフを作成することにしましょう。 まず、6.1.7.1に述べるように格子の中心のデータのみに絞り込みます。 Pipeline Browser上で強調表示されているcavity.OpenFOAMのモジュールを選択し、FilterメニューからCell Centersを選択してApplyをクリックします。

Centersが強調表示され、FilterメニューからGlyphを選択します。 2.6のようなPropertiesウインドウが表示されます。 Propertiesパネルの結果ではvectorsメニューはベクトル場は速度のみなので速度場Uが選択されています。 Scale Modeは速度のVector Magnitudeが初期値として選択されていますが、offを選択し、Set Scale Factorに0.005をにして全体のの速度を見ます。 Applyをクリックすると単色、例えば白、のベクトルが表示されます。 通常はDisplayパネルでColor by Uを選択して大きさに応じた色付けをします。 Edit Color MapをShow Color Legendに設定し、速度の凡例を表示させましょう。 出力結果は図2.7のようになります。 凡例にはTimes Romanフォントが使用され、Automatic Label Formatを解除してLabel Formatテキストボックスに%-#6.2fが入力することで2つの有効数字でラベルを固定しています。 背景色はView SettingsのGeneral Panelで白に設定されています。

図2.6: Glyphフィルターのパラメータパネル

図2.7: キャビティーケースの速度

[編集] 2.1.4.3 流線プロット

ParaViewでポストプロセスを続ける前に、上述のベクトルプロットのモジュールは不要なので削除しましょう。 そうしたら、6.1.8章の記述のように流速の流線をプロットしましょう。

Pipeline Browserでcavity.foamモジュールをハイライトした状態で、FilterメニューからStream Tracerを選択し、Applyをクリックします。 そうすると、図2.8に示すようにPropatiesウィンドウが現れます。 Seed点は、ジオメトリーの中心を垂直に通って、Line Sourseに沿うように(例えば(0.05,0,0.005)から(0.05,0.1,0.005)まで)指定しましょう。 このガイドに掲載した図ではPoint Resolutionを21に、Max.PropagationをLengthで0.5に、Init.Step LenをCell Lengthで0.01に、Integration DirectionをBOTHという設定を行いました。 また、Runge-Kutta 2 Integrator Typeはデフォルトパラメータを使いました。

Applyをクリックすると、トレーサーが生成されます。 そこでFilterメニューからTubesを選択することで、高品質の流線図を作ることができます。 このレポートでは、次の設定を使いました:Num.sidesを20、Radiusを0.003、Radius factorを10にしました。 Acceptを押すことで、図2.9ができます。


図2.8: Stream Tracerフィルターのパラメータパネル

図2.9: キャビティーケースの流線

[編集] 2.1.5 メッシュの解像度を増やす

メッシュの解像度を各々の方向で2倍に増やします。 問題の初期条件として使うために、粗いメッシュでの結果を、細かいメッシュ上に写像します。 そして、細かいメッシュの解を粗いメッシュの解と比較します。

[編集] 2.1.5.1 既存ケースを用いた新しいケースの作成

cavityを複製し、修正することで解析ケースcavityFineを作成します。 まずcavityと同じ階層に新しいディレクトリを作成します。

cd $FOAM_RUN/tutorials/icoFoam
mkdir cavityFine

基本となる解析ケースcavityの内容を解析ケースcavityFineにコピーし、cavityFineに移動します。

cp -r cavity/constant cavityFine
cp -r cavity/system cavityFine
cd cavityFine
[編集] 2.1.5.2 細かいメッシュの作成

blockMeshを使って計算格子数を増やしましょう。 blockMeshDictファイルをエディターで開き、blocksに関する記述を修正します。 blocksを特定するにはblocksというキーワードを用いましょう。 block定義の対称性に関しては5.3.1.3で詳しく述べるので、ここではhexが最初の頂点リストで、各方向の計算格子の番号リストがあることを知ればよいでしょう。 これは、先のcavityケースでは(20 20 1)になっています。 これを(40 40 1)に変え、保存します。 ここでblockMeshをrunさせることで新しい、より細かいメッシュを生成することができます。

[編集] 2.1.5.3 粗いメッシュの結果を細かなメッシュにマッピングする

mapFieldsユーティリティは、他のジオメトリ対応するフィールドの上へ与えられたジオメトリに関した一つ以上のフィールドをマッピングします。 本チュートリアルの例では、入力フィールドと求める結果のフィールド両方のジオメトリ・境界の種類・境界条件が同一であるので、フィールドは『首尾一貫している』と考えられます。 この例でmapFieldsを実行するとき、-consistent コマンドラインオプションを使います。

mapFields mapsのフィールドデータは、目的ケース(すなわち結果が図にされている)のcontrolDict内のtartFrom/startTimeで指定される時間ディレクトリから読まれます。 この例では、cavityFineケースの細かいメッシュ上にcavityケースから粗いメッシュの最終結果をマッピングしましょう。 これらの結果がcavityの0.5のディレクトリに格納されているので、startTimeをcontrolDict辞書で0.5秒に、startFromをstartTimeにセットします。 これらの変更を保存しましょう。

mapFieldsを実行する準備ができました。 mapFields -help と打ち込むとmapFieldsの実行には入力ケースのディレクトリを指定する必要があることがわかります。-consistentオプションを使うので、次のようにユーティリティはcavityFineディレクトリから実行される。

mapFields ../cavity -consistent

mapFieldsが実行され次のように出力されるでしょう。

Source: ".." "cavity"
Target: "." "cavityFine"

Create databases as time

Source time: 0.5
Target time: 0.5
Create meshes

Source mesh size: 400   Target mesh size: 1681

Consistently creating and mapping fields for time 0.5

    interpolating p
    interpolating U

End
[編集] 2.1.5.4 設定の調整

さて、全てのセルの寸法が半分になったので、1より小さいクーラン数を維持するためには2.1.1.4で述べるように時間ステップを半分にしなければいけません。 deltaTをcontrolDict辞書にて0.0025sにセットしましょう。 いままでは、フィールドデータを固定のステップ回数のもとでの時間間隔で出力する方法を示してきましたが、今回は固定の計算時間でデータ出力を指定する方法を示してみましょう。 controlDictのwriteControlキーワード下において、timeStepエントリーで固定のステップ回数で出力する代わりに、runTimeを使って固定の計算時間を指定して結果を出力することができます。

このケースでは0.1秒ごとの出力を指定します。 したがって、writeControlをrunTimeに、writeIntervalを0.1にセットしましょう。 このようにすることで、ケースは粗いメッシュでの解を入力条件として計算をはじめるので、定常状態に収束するには適切な短い時間だけ動かせばよいのです。 したがって、endTimeは0.7秒でよいでしょう。 これらのセッティングが正しいことを確認し、ケースを保存しましょう。

[編集] 2.1.5.5 バックグラウンドプロセスとしてコードを動かす

icoFormをバックグラウンドプロセスとして動かしてみて、最終的な結果を後で見ることができるようにlogファイルに出力しましょう。 cavitiyFineディレクトリにおいて次のコマンドを実行してください。

icoFoam > log &
cat log
[編集] 2.1.5.6 精密なメッシュによるベクトルプロット

各々の新しいケースは本質的には単なるPipeline Browserに現れる他のモジュールであるので、ParaViewで同時に複数のケースを開くことができます。 若干不便なことには、ParaViewで新しいケースを開けるときには、選ばれたデータが拡張子を含むファイル名である必要があります。 しかし、OpenFOAMにおいて、各々のケースは特定のディレクトリ構造の中に拡張子なしで複数のファイルに保存されます。 解決方法として、paraFoamスクリプトが自動的に拡張子「.OpenFOAM 」が付けたダミーファイルを作成することになっています。 それゆえに、cavityケースモジュールはcavity.OpenFOAMと呼ばれています。

ParaView内から他のケースディレクトリを開けたいならば、そのようなダミーファイルを作成する必要があります。 たとえば、cavityFineケースを読み込むには、コマンドプロンプトで次のようにタイプしてファイルを作成します。

cd $FOAM_RUN/tutorials/icoFoam 
touch cavityFine/cavityFine.foam 

こうしてFileメニューからOpen Dataを選んでディレクトリツリーをたどり、cavityFine.foamを選ぶことで、cavityFineケースをParaViewに読み込めるようになりました。 さて、ParaViewで精密なメッシュの結果のベクトルプロットを作ることができます。 同時に両方のケースのglyphを見られるようににすることによって、cavityFineケースのプロットをcavityケースと比較することができます。

図2.10: グラフ作図のためのフィールド選択

[編集] 2.1.5.7 グラフを描く

OpenFOAMは、速度のスカラー値を抽出して2次元のグラフに描画したい場合のデータの取り扱いに長けています。 データを操作するための特別なユーティリティが多数あり、単純な計算をfoamCalcによって組み合わせることができます。 次のようにユーティリティを指定して実行します。

foamCalc <calcType> <fieldName1 ... fieldNameN>

処理を規定する<calcType>にはdiv、components、mag、magGrad、magSqrを指定することができます。 calcTypeのリストを見るには、意図的に無効な処理を要求することでエラーメッセージとともに見ることができます。

>> foamCalc xxxx
Selecting calcType xxxx
    unknown calcType type xxxx, constructor not in hash table
    Valid calcType selections are:

5
(
div
components
mag
magGrad
magSqr
)

comonentsおよびmagのcalcTypeはスカラー速度を計測するのに有用です。 ケースにて"foamCalc components U"を動かすと、各時刻のディレクトリから速度のベクトル場を読み込み、各ディレクトリに各軸方向成分のスカラー場Ux、Uy、Uzを書き出します。 同様に"foamCalc mag U"とは各時刻のディレクトリにスカラー場magUを書き込みます。

foamCalcはcavityとcavityFineのどちらに対しても実行することができます。 例として次のように入力しcavityに対して実行します。

foamCalc components U -case $FOAM_RUN/tutorials1.5/icoFoam/cavity

それぞれのコンポーネントがParaView内でグラフとして描画されます。 簡単に、早く、しかもラベル付けや形式化の調整ができるので、とても高性能な出力を表示ができます。 しかしながら、出版用にグラフを作成するならばgnuplotやGrace/xmgrなどの専用のグラフ描画ソフトを使って生データから作画するのがよいでしょう。 これを行うには、2.2.3または6.5で述べるsampleユーティリティを使うとよいでしょう。

描画をする前に、新しく生成されたUx、Uy、UzのデータをParaViewに読み込ませる必要があります。 作業をしている基本のモジュール、この場合cavity.foamのPropertiesパネルの上部にあるUpdate GUIボタンをチェックしします。 ApplyをクリックすることでVol Field Statusウインドウに新しいデータが読み込まれます。 新しいデータの選択と変更の適用を確認し、必要ならApplyをもう一度クリックします。 境界領域がRegion Statusパネルで選択されていると境界部分のデータ補完が不適切に行われています。 したがってmovingwallやfixedwall、frontAndBackといったRegion Statusパネルのパッチの選択を解除して変更を適用します。 ここでParaViewの図を描画します。 まずは描画したいモジュールを選択し、Plot Over LineフィルターをFilter→Data Analisysから選択します。 3D Viewウインドウの傍に新しいXY Plotウインドウが開きます。 Propertiesウインドウで線の終点を指定するとPlobelineモジュールが作成されます。 この例ではPoint1を(0.05,0,0.005)、Point2を(0.05,0.1,0.005)と指定して線を領域の中心の真上に置きます。 Resolutionは100まで設定できます。 ApplyをクリックするとXY Plotウインドウに図が描画されます。 DisplayパネルのPlot TypeをScatter Plotに設定し、Attribute Mode Point Dataにします。 Use Data Arrayオプションのarc_lengthでX軸データのがcavityの基部からの距離になります。 DisplaysウインドウのLine Seriesパネルから表示するデータを選択することができます。 表示されているスカラー場のリストから、ベクトルの大きさや成分を初期値とすることもできます。 つまり、UxをfoamCalcから計算する必要はありません。 それでも、Ux以外の系列の選択はすべて解除しましょう。 選択した系列の上の四角形の色が線の色です。 この上でダブルクリックをすれば簡単に変更することができます。 グラフを初期化するにはXY Plot自体を動かします。 カーソルがグラフ上にある状態で右クリックをするとメニューからPropertiesを選択します。 各軸のタイトルや形式の設定をするChart Optionsウインドウが表示されます。 各軸のメニューはダブルクリックをしてLayout and Tytleにすることで拡大することができます。 フォントや色、軸名の位置、軸の値の範囲や線形か対数かといった設定が行うことができます。 図2.11はParaViewによって作画された図です。 望みどおりのグラフが作成できます。 図2.11は軸のオプションとしてStandard type of Notation、Specify Axis Rangeを選択し、フォントはSans Serifの12ポイントです。

図2.11: paraFoamでのグラフ作図

[編集] 2.1.6 勾配メッシュ

解の誤差は、正しい解の形と選択した数値スキームで想定される形とが大きく異なる領域で出ます。 例えば、数セルにわたる変数の線形変化に基づく数値スキームは、正しい解自体が線形の場合にしか正確な解を導くことができません。 例えば勾配の変化が最も大きいところのような正しい解が線形から一番大きく外れる領域で誤差は最も大きくなります。 セルの大きさに従って、誤差は減少します。

どんな問題も取りかかる前に解のフォームの直感的予測ができるといいです。 次に、誤差が最も大きくなるところとを予測し、メッシュ幅に勾配をつけ、最も小さいセルがこれらの領域にくるようにします。 キャビティの場合、壁の近くで速度の大きい変化があることを予想できるので、チュートリアルのこの部分では、メッシュがこの領域で、より小さくなるように勾配付けします。 同じ数のセルを使用することによって、コンピュータの負荷をあまり増加させずに、より精度を上げられます。

lid-drivenキャビティ問題のために壁に向かって勾配を付けた20×20セルのメッシュを作り、2.1.5.2の細かいメッシュの結果を初期条件として勾配付けされたメッシュに適用しましょう。 そして、勾配付けされたメッシュの結果を前のメッシュの結果と比較してみましょう。 blockMeshDict辞書の書換えはとても重要であるので、チュートリアルのこの部分を使ったケース(cavityGrade)は$FOAM_RUN/tutorials/icoFoamディレクトリに入れておきました。

[編集] 2.1.6.1 勾配メッシュの作成

ここで、4つの異なるメッシュ間隔の計算メッシュが計算領域の上下左右のブロックに必要となります。 このメッシュのブロック構造を図2.12に示します。

図2.12: cavityケースの勾配メッシュのブロック構造(ブロック番号)

cavityGradeのconstant/polyMeshサブディレクトリでblockMeshDictファイルを見ることができます。 念のためblockMeshDictの重要な要素を以下に述べます。 それぞれのブロックはx方向、y方向に10セルを有し、もっとも大きなセルともっとも小さなセルとの大きさの比は2です。

 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 convertTOMeters 0.1;
 
 vertics
 (
    (0 0 0)
    (0.5 0 0)
    (1 0 0)
    (0 0.5 0)
    (0.5 0.5 0)
    (1 0.5 0)
    (1 1 0)
    (0 0 0.1)
    (0.5 0 0.1)
    (1 0 0.1)
    (0 0.5 0.1)
    (0.5 0.5 0.1)
    (1 0.5 0.1)
    (1 1 0.1)
 );
 
 blocks
 (
    hex (0 1 4 3 9 10 13 12) (10 10 1) simpleGrading (2 2 1)
    hex (1 2 5 4 10 11 14 13) (10 10 1) simpleGrading (0.5 2 1)
    hex (3 4 7 6 12 13 16 15) (10 10 1) simpeGrading (2 0.5 1)
    hex (4 5 8 7 13 14 17 16) (10 10 1) simpleGrading (0.5 0.5 1)
 );
 
 edges
 (
 );
 
 patches
 (
    wall movingWall
    (
       (6 15 16 7)
       (7 16 17 8)
    )
    wall fixedWalls
    (
       (3 12 15 6)
       (0 9 12 3)
       (0 1 10 9)
       (1 2 11 10)
       (2 5 14 11)
       (5 8 17 14)
    )
    empty frontAndBack
    (
       (0 3 4 1)
       (1 4 5 2)
       (3 6 7 4)
       (4 7 8 5)
       (9 10 13 12)
       (10 11 14 13)
       (12 13 16 15)
       (13 14 17 16)
     )
 );
 
 mergePatchPairs
 (
 );
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

コマンドラインからblockMeshを実行できます。 いったんこのケースのblockMeshDictファイルを理解しておけば、後はコマンドラインからblockMeshを実行できます。 2.1.2に示したparaFoamを使用することで勾配付けされたメッシュを見ることができます。

[編集] 2.1.6.2 計算時間、時間ステップの変更

もっとも速い速度と小さいセルが上蓋に面することになり、したがって、セクション2.1.1.4で示したように、もっとも高いクーラント数が上蓋に面するセルに生じます。 このようなことから上蓋に面するセルの大きさを見積もることは、本ケースにて適当な時間ステップを計算する上で有効です。

不一様なメッシュ勾配を使用している場合、blockMeshは形状に関する数列をもちいてセルの大きさを算出します。 長さlに沿って、最初と最後のセルとの間に、比Rのn個の計算セルが必要であるならば、もっとも小さいセルの大きさ構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta x_s は、次のように与えられます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \delta x_s = l \frac{r-1}{\alpha r -1}


ここで、rはあるセルの大きさとその隣のセルの大きさとの比であり、次式で表されます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle r = R^{\frac{1}{n-1}}


そして、

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \alpha = \begin{cases} R^n & \text{for R $>$ 1.}\\ R^{1/n} & \text{for R $<$ 1. \end{cases}


cavityGradeケースにおいては、各方向のセルの数は10であり、もっとも大きなセルと小さなセルとの比は2、ブロックの縦横は0.05mです。 したがって、もっとも小さなセルサイズは3.45mmとなります。 式2.2から時間ステップは、クラーント数を1以下に抑えるために3.45ms以下にしなければなりません。 有意な解析結果を得るためには、時間ステップdeltaTを2.5msまで短くし、writeIntervalを40とします。 これより解析結果は0.1s毎に書き出されることとなります。

このように、各設定に対応したファイルを編集することにより、ケースディクショナリの各種条件を変更することができます。 ここで時間ないし計算経過の書き出しを操作したいならば、/cavityGrade/system/controlDictファイル内にそれらのパラメーターは納められており、任意のエディタでこのファイルを開くことが出来ます。 先に述べたように、計算を収束させるための保証として、このケースでは時間ステップdeltaTは0.25e-3に、writeIntervalは40とします。

startTimeはそのcavityFineケースの最終的な条件、すなわち0.7に設定される必要があります。 cavityとcavityFineが規定されたランタイムの中でよく収束させるためには、cavityGradeケースのためのランタイムをから0.1sに設定、すなわちendTimeを0.8とします。

[編集] 2.1.6.3 解析場のマッピング

2.1.5.3にあるようにmapFieldsを使用して、cavityFineケースの最終的な結果をcavityGradeケースのメッシュにマッピングします。 以下のようにcavityGradeディレクトリに入り、mapFieldsを実行してください。

cd $FOAM_RUN/tutorials/icoFoam/cavityGrade
mapFields ../cavityFine -consistent

今度は、ケースディレクトリからicoFoamを実行します。 そして、ランタイム情報をモニタリングしますそして、このケースの完全に収束した結果を見て、以前に2.1.5.6と2.1.5.7で説明した後処理ツールを使って他の結果と比較します。

[編集] 2.1.7 レイノルズ数の増大

これまで解いたケースはレイノルズ数が10でした。 これは大変に低い条件であり、したがってcavityの底部中央に小さな二次渦を伴うのみで、迅速に安定解を導くことができました。 しかし、ここでレイノルズ数を50に上げると、収束解を得るのにより長い時間を要することになります。 そこでcavityケースのメッシュを初期条件として使用することとします。 cavityケースディレクトリをcavityHighReという名前でコピーします。

cd $FOAM_RUN/tutorials/icoFoam
cp -r cavity cavityHighRe
[編集] 2.1.7.1 プリプロセッシング

cavityHighReケースに入り、transportProperties辞書を編集します。 レイノルズ数を10倍に増加させるためには、動粘性係数を10分の1まで減らす必要があります(例えば10から構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1 \times 10^{-3} \mathrm{m^2s^{-1}} )。 これでcavityケースの実行結果からリスタートして、このケースを実行できます。 これを実行するために、startingFromキーワードをlatestTimeにオプションを切り替えることにより、icoFoamは、最新の時間ディレクトリを初期データとして使用します(例えば0.5)。 endTimeは2秒に設定し、本ケースを保存します。

[編集] 2.1.7.2 コードの実行

まずはケースディレクトリからicoFoamを実行し、ランタイム情報を見ます。バックグラウンドでジョブを実行するときには、以下のUNIXコマンドが便利です。

nohup
ユーザがログアウト後も稼働し続けるコマンド
nice
カーネル・スケジューラのジョブの優先順位を変えるコマンド;-20が最優先で、19は最も低い優先度

これらのコマンドは、例えば、ユーザがリモートマシンでケースを実行できるよう設定し、頻繁にモニターしなくてもいいような場合、リモートマシンではケース実行をあまり優先させたくないでしょうが、そのような場合に便利です。その場合、ユーザはnohupコマンドで稼働しているリモートマシンをログアウトしてジョブを実行し続けることができます。一方、niceは優先度を19に設定します。試しに、以下のようにコマンドを実行してみましょう。

cd $FOAM_RUN/tutorials/icoFoam
nohup nice -n 19 icoFoam > log &
cat log

お気づきかもしれませんが、前述の解析方法ではicoFoamは、速度Uの計算が止まっても、それよりもずっと長い間もしくは解析が終わるまで圧力pの計算をし続けていました。 実際には、icoFoamがいったんUの計算をやめ、pの初期の残差、寛容以下はfvSolution辞書で決められた公差(一般的には構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^{-6} )を下回ると結果が効率的に収束するので、フィールド・データをいったん時間ディレクトリに書出して計算を止めることができます。 例として、cavityHighRenのケースの収束のlogファイルを以下に示します。 示したとおり、1.62秒後に速度はすでに収束し、初期圧力の残差は小さくなります。 logにおいてNo Iterations 0は、Uの計算が止まったことを示しています。

1  
2  Time = 1.63
3  
4  Courant Number mean: 0.108642 max: 0.818175
5  DILUPBiCG:  Solving for Ux, Initial residual = 7.86044e-06, Final residual = 7.86044e-06,
6  No Iterations 0
7  DILUPBiCG:  Solving for Uy, Initial residual = 9.4171e-06, Final residual = 9.4171e-06,
8  No Iterations 0
9  DICPCG:  Solving for p, Initial residual = 3.54721e-06, Final residual = 7.13506e-07,
10  No Iterations 4
11  time step continuity errors : sum local = 6.46788e-09, global = -9.44516e-19,
12  cumulative = 1.04595e-17
13  DICPCG:  Solving for p, Initial residual = 2.15824e-06, Final residual = 9.95068e-07,
14  No Iterations 3
15  time step continuity errors : sum local = 8.67501e-09, global = 7.54182e-19,
16  cumulative = 1.12136e-17
17  ExecutionTime = 1.02 s  ClockTime = 1 s
18  
19  Time = 1.635
20  
21  Courant Number mean: 0.108643 max: 0.818176
22  DILUPBiCG:  Solving for Ux, Initial residual = 7.6728e-06, Final residual = 7.6728e-06,
23  No Iterations 0
24  DILUPBiCG:  Solving for Uy, Initial residual = 9.19442e-06, Final residual = 9.19442e-06,
25  No Iterations 0
26  DICPCG:  Solving for p, Initial residual = 3.13107e-06, Final residual = 8.60504e-07,
27  No Iterations 4
28  time step continuity errors : sum local = 8.15435e-09, global = -5.84817e-20,
29  cumulative = 1.11552e-17
30  DICPCG:  Solving for p, Initial residual = 2.16689e-06, Final residual = 5.27197e-07,
31  No Iterations 14
32  time step continuity errors : sum local = 3.45666e-09, global = -5.62297e-19,
33  cumulative = 1.05929e-17
34  ExecutionTime = 1.02 s  ClockTime = 1 s

[編集] 2.1.8 高レイノルズ数流れ

では、paraFoamによる結果を確認し、速度ベクトルを表示してください。 計算領域の角における二次渦が幾分増大していることがわかります。 このような時、ユーザーは粘性係数を下げることによりレイノルズ数を増大させた計算ケースを再度実行できます。 渦の数が増加するにともない、より複雑な流れを解くために当該領域でのメッシュ解像度を上げる必要が出てきます。 更に、レイノルズ数は収束に要する時間を増加させます。 このような場合、残差をモニターし、解を収束させるためにendTimeを延長したほうがよいでしょう。

空間および時間解像度の増加を要することは、流れが乱流域に移行するという非現実的な状態となり、解法の安定性の問題が生じることとなります。 もちろん、多くのエンジニアリングな問題は極めて高いレイノルズ数条件となっており、したがって、乱流挙動を直接解くのに多くのコストを負担することとなり、実行不可能であります。 Reynolds-averaged stress(RAS)にかわり乱流モデルが平均流れの挙動を解くのに用いられ、ゆらぎの統計値が計算されています。 壁関数を伴う標準構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k-\epsilon モデルが本チュートリアルの上面が移動するキャビティケース(レイノルズ数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^4 )を解くのに用いられています。 二つの追加変数が解かれています: それは、乱流エネルギー構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k 、乱流消散速度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon です。 乱流のための追加の方程式およびモデルはturbFoamと呼ばれるOpenFOAMソルバーにおいて実行されます。

[編集] 2.1.8.1 プリプロセッシング

$FOAM_RUN/tutorials/turbFoamディレクトリのcavityケースに移動します。 今まで通り、blockMeshを走らせ、メッシュを生成します。 壁関数付き標準構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k-\epsilon モデルを用いる場合は、壁近傍のセルにおける流れがモデル化されることにより、壁方向へのメッシュ勾配は必ずしも必要ではありません。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle k

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon のファイル(0/k0/epsilon )を開き、境界条件を確かめます。 壁タイプの境界条件の選択には、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon についてはzeroGradient境界条件を、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k についてはfixedValue 0を指定します。 いかにして構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon の初期値を決めるでしょうか。 しかし、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon については、解法アルゴリズムにてゼロ割を避けるために、正の値を与えます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle k

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon の適当な初期条件は、速度変動構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): U' と乱流長さスケール構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): l を用いて設定することが出来、次式に示すように表されます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle k = \frac{1}{2} \overline{\bf U' \cdot U'}


構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \epsilon = \frac{C_\mu^{0.75} k^{1.5}}{l}


ここで構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_\mu構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k-\epsilon モデルの定数であり、その値は0.09です。カーデシアン座標系では構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k は、

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle k = \frac{1}{2} ( U'_x^2 + U'_y^2 + U'_z^2)


で表されます。 各項はx、y、z方向速度ゆらぎ成分です。 ここで、初期乱流が等方的であると仮定します。 例えば、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): U'_x^2 = U'_y^2 = U'_z^2 となり、これら速度は上面速度の5%に等しく、また、乱流長さスケール構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): l はボックス幅0.1mの20%に等しいとすると、次のように表されます。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle U'_x = U'_y = U'_z = \frac{5}{100} 1 ms^{-1}


構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \rightarrow k = \frac{3}{2} \left( \frac{5}{100} \right)^2 m^2s^{-2} = 3.75 \times 10^{-3} m^2s^{-2}


構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \displaystyle \epsilon = \frac{C_\mu^{0.75}k^{1.5}}{l} \sim 7.65 \times 10^{-4} m^2s^{-3}


上記のとおり構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \epsilon を設定してください。 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): U構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): p に対する初期条件は前と同じように、それぞれ(0,0,0)と0です。

次いで、transportPropertiesディクショナリの層流動粘度を設定します。 レイノルズ数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^4 を実現するために、式2.1のレイノルズ数の定義式に示されるように、動粘度を構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^{-5} mにする必要があります。

RASPropertiesディクショナリを開き、RAS乱流モデルを選択します。 乱流モデルはRASModelエントリーで選択されます。 表3.9に示すように多くの使用可能なモデルが与えられています。 ユーザーは標準構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): k-\epsilon モデルを表すkEpsilonをここでは選択します。 そして、turbulenceのスイッチをonにします。 乱流モデルに関する係数は標準ディクショナリのkEpsilonCoeffs以下に、また、同ディクショナリにwallFunctionCoeffsの設定もあります。

次いで、controlDictstartTimestopTimedeltaT、そしてwriteIntervalを設定します。 クーラン数の制限を満たすためにdeltaTを0.005sに設定し、endTimeは10sとします。

[編集] 2.1.8.2 コードの実行

ケースディレクトリに入り、"turbFoam"とタイプすることでturbFoamを実行します。 粘性が小さいこの計算ケースでは、移動している上面近傍の境界層は極めてうすく、そして、上面に面するセルは比較的大きいことから、上面速度よりもそれらセル中心の流体速度は極めて小さいです。 事実、100時間ステップ後、上面に隣接したセルにおける速度は、上限である0.2ms-1程度です。したがって最大クーラン数は0.2以上にはなりません。 クーラン数がより1に近接するように時間ステップを大きくし、解析時間を増やすことは理にかなっています。 したがって、deltaTを0.02sにセットし直し、これに伴い、startFromlatestTimeにセットします。 本操作は、turbFoamが最新のディレクトリ、例えば10.0、からスタートデータを読み込むように指示するものです。 endTimeは層流条件よりも収束に時間を要するため、20sにセットします。 従来通り計算をリスタートし、解析の収束をモニターします。 解析が進行したら、連続した時間における結果を見てください。 そして解析が安定状態に収束するか、もしくは周期的に振動しているか確認してください。 後者の場合には、収束は決して起こりませんが、結果が不正確であるという意味ではありません。

[編集] 2.1.9 ケース形状の変更

計算ケースの形状を変更し、新たな解析を行いたい場合、新たな解析のスタート条件としてオリジナルの解析の全てないし一部を保持しておくことは有効でしょう。 しかし、これは少し複雑になります。 なぜなら、オリジナルの解析の物理量が、新しい解析ケースの物理量と一致しないからです。 しかし、mapFieldsユーティリティは、形状や境界のタイプもしくはその両者が不一致な場を位置づけることが出来ます。

例であるように、icoFoamディクショナリ内にあるcavityClippedケースを開きます。 このケースは、標準的なcavityケースから成りますが、底部右側、長さ0.04mの正方形を除いたものであり、blockMeshDictは以下のようになっています。

 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 convertToMeters 0.1;
 
 vertices
 (
    (0 0 0)
    (0.6 0 0)
    (0 0.4 0)
    (0.6 0.4 0)
    (1 0.4 0)
    (0 1 0)
    (0.6 1 0)
    (1 1 0)
    (0 0 0.1)
    (0.6 0 0.1)
    (0 0.4 0.1)
    (0.6 0.4 0.1)
    (1 0.4 0.1)
    (0 1 0.1)
    (0.6 1 0.1)
    (1 1 0.1)
 );
 
 blocks
 (
    hex (0 1 3 2 8 9 11 10) (12 8 1) simpleGrading (1 1 1)
    hex (2 3 6 5 10 11 14 13) (12 12 1) simpleGrading (1 1 1)
    hex (3 4 7 6 11 12 15 14) (8 12 1) simpleGrading (1 1 1)
 );
 
 edges
 (
 );
 
 patches
 (
    wall lid
    (
        (5 13 14 6)
        (6 14 15 7)
    )
    wall fixedWalls
    (
        (0 8 10 2)
        (2 10 13 5)
        (7 15 12 4)
        (4 12 11 3)
        (3 11 9 1)
        (1 9 8 0)
    )
    empty frontAndBack
    (
        (0 2 3 1)
        (2 5 6 3)
        (3 6 7 4)
        (8 9 11 10)
        (10 11 14 13)
        (11 12 15 14)
    )
 );
 
 mergePatchPairs
 (
 );
 // ************************************************************************* //

blockMeshを実行してメッシュを生成します。パッチはcavityケースと同様に設定されています。 物理量の適用の過程を明確にするために、元となるケースcavityでmovingWallであったupper wallはlidという名前に変更されています。

パッチが一致しない場合、すべての物理量のデータが元のケースからマップされるという保証はありません。 残っているデータは元のケースと同一であるべきです。 従ってマッピングする前に時間のディレクトリに物理量のデータが存在している必要があります。 controlDictのstartTimeが0.5 sに設定されているのでcavityClippedケースにおけるマッピングは時刻0.5 sに予定されています。 従って初期状態の物理量のデータ、たとえば時刻0からをコピーする必要があります。

cd $FOAM_RUN/tutorials/icoFoam/cavityClipped
cp -r 0 0.5

データをマッピングする前に0.5sにおける形状と物理量の状況を見ておきましょう。

速度場と圧力場をcavityからcavityClippedにマップしようとしています。 パッチが一致しないため、systemディレクトリのmapFieldsDictを編集する必要があります。 patchMapとcuttingPatchesという2つの入力項目があります。 patchMapリストは元となる物理量のパッチとマッピング対象となる物理量のパッチを含みます。 対象物理量のパッチに元となる物理量のパッチの値を引き継ぎたいときに利用します。 cavityClippedにおいてlidの境界値をcavityのmovingWallから引き継ぎたいので次のようにpatchMapに記述します。

patchMap
(
   lid movingWall
);

図2.13: cavityケースで解いた速度場をcavityClipped上にマッピングした図

図2.14: 速度フィールドのcavityClippedの解法

cuttingPatchesリストは、対象パッチを削除した、元の場の内部の値を写像した対象のパッチを含みます。 本ケースでは、fixedWallsを内挿プロセスの実例説明に用いることとします。

cuttingPatches
(
  fixedWalls
);

ここで、mapFieldsを次のコマンドから実行することができます。

 mapFields ../cavity

図2.13に示すような場を確認することが出来ます。 境界パッチは、期待したように元のケースからの値が引き継がれています。 この実例において、fixedWallsパッチの速度を(0,0,0)にリセットしたい場合があります。 このときは、Uをエディタで開き、fixedWallsをnonuniformからuniform (0,0,0)に変更します。 そして、icoFoamを実行すればよいです。

[編集] 2.1.10 修正した形状の事後処理

最初と最後の解析の比較のために、この解析ケースのベクトル図を、最初の時刻は0.5s、次いで0.6sのように作成することができます。 さらに、Foamは2次元解析を行うに注意を要する幾何形状のアウトラインを提供します。 ユーザはFilter menuからExtract Partsを選択することができ、Parameter panelにて、興味のあるパッチ、すなわち、lidとfixedWallsを、ハイライトすることができます。 Acceptボタンをクリックすると、形状のこれらのアイテムは、ディスプレイ・パネルに表面ワイヤーフレームの選択により表示することができます。 図2.14は、パッチを黒で表示し、修正した形状の底部角部分において形成される渦を示しています。

wuzbfpgxjljkb, <a href="http://outstandingofferszone.com/">uniform city promo codes</a>, inUizQD, [url=http://outstandingofferszone.com/]uniform city codes[/url], MGvGSRm, http://outstandingofferszone.com/ uniform city coupon codes, HEXmlot, <a href="http://awesomediscountnow.com/">mog android</a>, NSSiIBT, [url=http://awesomediscountnow.com/]mog android[/url], lEzWolF, http://awesomediscountnow.com/ mog price, HhajHDg, <a href="http://superiorofferspot.com/">metrodate review</a>, sFewXHy, [url=http://superiorofferspot.com/]metrodate ottawa[/url], ZLuqRaI, http://superiorofferspot.com/ metrodate uk, BTpMpMw, <a href="http://landscapelink.com/">Baby shower invitation pictures</a>, IRONBTE, [url=http://landscapelink.com/]Abortion baby pictures[/url], KryBAGp, http://landscapelink.com/ Baby headgehogs pictures, OrfAuxr, <a href="http://awesomedealszone.com/">amazon coupon codes</a>, FrQRBMy, [url=http://awesomedealszone.com/]amazon promo codes[/url], Eyemhxx, http://awesomedealszone.com/ amazon coupons, uJkVAib, <a href="http://bestdiscountszone.com/">popcap games</a>, nztYFlK, [url=http://bestdiscountszone.com/]pop cap games coupon[/url], zxQhxEy, http://bestdiscountszone.com/ popcap games coupon code, LHgExCM.

[編集] 2.3 ダムの決壊

このチュートリアルでは、interFoamを用いて、単純化したダム決壊の2次元問題を解くことにします。 この問題の特徴は、くっきりとした界面や自由表面によって隔てられている2つの流体による非定常の流れ場であることです。 interFoamにおける2相流体を解くアルゴリズムは、Volume of fluid(VOF)法によるものであり、ここでは特別な輸送方程式を解いて、計算格子における2相の体積分率、もしくは相比率を決定します。 各物理量は、この相比率に(各流体の)密度をかけた平均的な値として算出されます。 個々の物質の界面は、VOF法ではその性質上明示的には解かれず、相比率場の特性として浮き上がってくるということになります。 相比率は0から1の間の任意の値をとり得るため、界面は決してくっきりと定義されませんので、本来のくっきりとした界面が存在するべき領域の周辺を、(計算上の)界面がぼんやりと占めることになります。

計算条件では、貯水池の左側に、膜で仕切られた水柱が最初存在します。 時刻t=0sに、膜が取り除かれて、水柱が崩れだします。崩壊している間、水流はは貯水槽の底にある出っ張りにぶつかり、いくつかの気泡を含む、複雑な流れ場の様相を呈します。 計算形状と初期条件は図2.20に示しました。

図2.20 ダム決壊の計算形状

[編集] 2.3.1 格子の生成

$FOAM_RUN/tutorials/interFoamにあるdamBreakのケースディレクトリに移動しましょう。 前に述べた方法でblockMeshを走らせて格子を生成してください。 このdamBreakの格子は5つのブロックで構成されます。 blockMeshDictの中身を以下に示します。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
24  
25  convertToMeters 0.146;
26  
27  vertices
28  (
29      (0 0 0)
30      (2 0 0)
31      (2.16438 0 0)
32      (4 0 0)
33      (0 0.32876 0)
34      (2 0.32876 0)
35      (2.16438 0.32876 0)
36      (4 0.32876 0)
37      (0 4 0)
38      (2 4 0)
39      (2.16438 4 0)
40      (4 4 0)
41      (0 0 0.1)
42      (2 0 0.1)
43      (2.16438 0 0.1)
44      (4 0 0.1)
45      (0 0.32876 0.1)
46      (2 0.32876 0.1)
47      (2.16438 0.32876 0.1)
48      (4 0.32876 0.1)
49      (0 4 0.1)
50      (2 4 0.1)
51      (2.16438 4 0.1)
52      (4 4 0.1)
53  );
54  
55  blocks
56  (
57      hex (0 1 5 4 12 13 17 16) (23 8 1) simpleGrading (1 1 1)
58      hex (2 3 7 6 14 15 19 18) (19 8 1) simpleGrading (1 1 1)
59      hex (4 5 9 8 16 17 21 20) (23 42 1) simpleGrading (1 1 1)
60      hex (5 6 10 9 17 18 22 21) (4 42 1) simpleGrading (1 1 1)
61      hex (6 7 11 10 18 19 23 22) (19 42 1) simpleGrading (1 1 1)
62  );
63  
64  edges
65  (
66  );
67  
68  patches
69  (
70      wall leftWall
71      (
72          (0 12 16 4)
73          (4 16 20 8)
74      )
75      wall rightWall
76      (
77          (7 19 15 3)
78          (11 23 19 7)
79      )
80      wall lowerWall
81      (
82          (0 1 13 12)
83          (1 5 17 13)
84          (5 6 18 17)
85          (2 14 18 6)
86          (2 3 15 14)
87      )
88      patch atmosphere
89      (
90          (8 20 21 9)
91          (9 21 22 10)
92          (10 22 23 11)
93      )
94  );
95  
96  mergePatchPairs
97  (
98  );
99  
100  // ************************************************************************* //

[編集] 2.3.2 境界条件

constant/polyMeshディレクトリのboundaryファイルを見ることでblockMeshで生成された境界の形状を確認しましょう。leftWall, rightWall, lowerWall, atmosphere, defaultFacesの5つの境界パッチがあります。パッチの種類について理解しておきましょう。 atmosphereは何の属性もなく、単に境界条件によって規定される標準のパッチです。defaultFacesは、本ケースでは2次元であるためパッチの法線方向を解析の対象としないため、emptyとします。leftWall, rightWall, lowerWallはそれぞれwallです。plainと同様にwallもメッシュについて形状や位相の情報を持ちませんが、wallとして識別することができるので、アプリケーションに特殊な壁表面のモデリングを明示するためにwallと定義しています。

interFoamのソルバーが、界面と壁面との接点における表面張力に対するモデルを含んでいる、というのがよい例です。このモデルはgamma(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma )場のgammaContactAngleの境界条件と関連付けられています。 その場合、静的な接触角度theta0 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \theta_0 や、前縁や後縁における動的な接触角度であるthetaA 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \theta_A とthetaR 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \theta_R 、そして、動的な接触角度において速度に比例する係数uThetaを指定する必要があります。

このチュートリアルでは、壁面と界面間の表面張力による効果を無視することにしたいと思います。 それは、静的な接触角度を 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \theta_0=90^{\circ} に、速度比例係数を0と設定することで可能です。 しかしながら、壁の境界条件として、通常のwallタイプの境界条件を指定する別なやり方もあります。 この場合、gammaに対してgammaContactの境界条件を設定する代わり、zeroGradientの境界条件を課すことになります。

topの境界は大気に対して開放されていることから、atmosphereタイプの境界条件を与えます。また、この2次元問題において、前後の面のようなdefaultFacesの境界条件は通常通りemptyタイプです。

[編集] 2.3.3 初期条件の設定

これまでのケースと異なり、ここでは相比率構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma に対して、以下のような非一様な初期条件を与えます。

これは、setFieldsユーティリティーを実行することによって行ないます。 この実行にはsystemディレクトリ内のsetFieldsDictを必要とします。 このケースにおけるsetFieldsDictファイルの内容を以下に示します。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
24  
25  defaultFieldValues
26  (
27      volScalarFieldValue gamma 0
28      volVectorFieldValue U (0 0 0)
29  );
30  
31  regions
32  (
33      boxToCell
34      {
35          box (0 0 -1) (0.1461 0.292 1);
36  
37          fieldValues
38          (
39              volScalarFieldValue gamma 1
40          );
41      }
42  );
43  
44  
45  // ************************************************************************* // 

 ここで、defaultFieldValuesは場の規定値を設定するものであり、regionsのサブ辞書において別途指定されない場合に場に与えられる値です。 regionsのサブ辞書は、指定された領域において、規定値を上書きするfieldValuesを含んだサブ辞書のリストを含んでいます。 領域の定義は、ある位相幾何学的な制約に基づいて、点や格子、界面等の集合を生成するtopoSetSourceによって行います。 ここでは、boxToCellを使って、大きいほうと小さいほうの二つの座標点で定義されるバウンディング・ボックスを生成し、液体の領域における格子の集合を定義しています。 また、この領域における相比率構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma を1と指定しています。

さて、setFieldsを他のプログラムと同様に起動してください。 そうしたら、paraFoamを用いて、初期のgamma場が図2.21のように望むような分布になっているかどうか確かめてください。


図2.21 相比率gammaの初期条件

[編集] 2.3.4 流体の物性値

constantディレクトリのtransportPropertiesファイルを確認しましょう。このファイルは、phase1とphase2に分かれて、各流体の物性値を保持しています。

各相の輸送モデルは、transportModelによって選択されます。

ここで、動粘性係数がnuというキーワードで指定され、一定値であるNewtonianモデルを選んでください。

CrossPowerLawといったその他のモデルにおける粘性係数の指定は、この例におけるCrossPowerLawCoeffsといったように、<model>Coeffsという名のサブ辞書の中で行います。

密度の指定は、rhoキーワードで行います。

二つの相の間の表面張力は、sigmaキーワードで指定します。

このチュートリアルで用いた値を表2.3に挙げます。

phase1の物性
動粘性率構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): {\rm m}^{2}{\rm s}^{-1} nu構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1.0\times 10^{-6}
密度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): {\rm kgm}^{-3} rho構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1.0\times 10^{3}
phase2の物性
動粘性率構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): {\rm m}^{2}{\rm s}^{-1} nu構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1.48\times 10^{-5}
密度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): {\rm kgm}^{-3} rho構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 1.0
両phaseの物性
表面張力構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): N{\rm m}^{-1} sigma構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 0.07

表2.1: 鋼の機械的性質

environmentalPropertiesの辞書は、重力加速度ベクトルを指定していますが、このチュートリアルでは、この値は(0,9.81,0)ms-2としてください。

[編集] 2.3.5 タイムステップの制御

自由界面の捕捉においては、タイムステップの制御は重要です。というのも、界面捕捉のアルゴリズムは、通常の流体計算に比べ、クーラン数Coに対してかなり鋭敏だからです。 理想的には、界面がある領域において、およそ0.2であるCoの上限値を超えてはいけません。 伝播速度の予測が容易であるようなケースでは、Coの制限を守るような固定したタイムステップを指定することができますが、より複雑なケースの場合タイムステップの指定はずっと困難になります。 そこで、interFoamでは、controlDictにおいて、タイムステップの自動修正を指定することをお勧めします。adjustTimeStepをonにして、Coの最大値maxCoを0.2にしましょう。 タイムステップの上限maxDeltaTはこのシミュレーションでは超えようのない値、たとえば1.0等に設定すればよいでしょう。

ただし、自動タイムステップ制御を用いると、ステップ自体は決して使いやすい値に丸められることはありません。 従って、固定のタイムステップ間隔でOpenFOAMに結果を出力させた場合、その時刻はきりの良い値になりません。 ところがこの自動タイムステップ制御を用いていても、OPENFORMでは決まった時刻に結果を出力するように指定することが可能です。 この場合、OpenFOAMは、結果の出力に指定された時刻ぴったりに合うように時間刻みを補正しつつ、自動時間刻みの制御を行います。 これを行うには、controlDict辞書におけるwriteControlに対して、adjustableRunTimeオプションを選んでください。 controlDict辞書の中身は以下のようになります。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
24  
25  application interFoam;
26  
27  startFrom       startTime;
28  
29  startTime       0;
30  
31  stopAt          endTime;
32  
33  endTime         1;
34  
35  deltaT          0.001;
36  
37  writeControl    adjustableRunTime;
38  
39  writeInterval   0.05;
40  
41  purgeWrite      0;
42  
43  writeFormat     ascii;
44  
45  writePrecision  6;
46  
47  writeCompression uncompressed;
48  
49  timeFormat      general;
50  
51  timePrecision   6;
52  
53  runTimeModifiable yes;
54  
55  adjustTimeStep  yes;
56  
57  maxCo           0.5;
58  
59  maxDeltaT       1;
60  
61  
62  // ************************************************************************* //

[編集] 2.3.6 離散化スキーム

OpenFOAMにおける自由表面の扱いは、乱流の影響を考慮しません。 これは乱流モデルに対するレイノルズ平均モデルの手法が空気と水の間のごく 薄い表面の概念と適合しない事実に基づいています。 結果として、全ての自由表面シミュレーションは流体の直接数値シミュレーション(DNS)としてみることができます。

DNSはメッシュ数に対して一定の要求があり、それは我々のテストケースにお けるメッシュの解像度を遥かに超えています。 このソルバはOpenFormで開発されたMulti dimetional universal Limiter for explicit solution(MULES)法を用いて おり、基礎を成す数値的スキームやメッシュ構造から独立な段階分数の有界性を保存するために使います。 したがって、対流スキームの選択はそれが静的であるか、また閉鎖系であるかによって制限されません。

従って、運動量の式における対流項では風上差分を使用して計算を安定させる こととします。風上差分によって導入された数値拡散は計算を安定させること でしょう。 風上の設定は、fvSchemes辞書のdivSchemesサブディレクトリ 内に作成されており、運動量方程式における構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\rho \phi \mathbf{U}) 項に対応する div(rho*phi,U)キーワードは、Gauss upwindを読みこみます。 相構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma に対する2つの方程式における対流項には幾つかの注意を必要とします。適切な精度を維持しつつ有界性を保証しなくてはならないため、対流項内での補完間のためには、有界なスカラーに対するリミッタ付きの線形なスキームであるlimitedLinear01を用います。

リミッタ付きの線形なスキームは4.4.1に記述される係数を必要とします。ここで安定性を最重視して、キーワードdiv(phi,gamma)に対応する構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\phi \gamma) 項、キーワードdiv(phirb,gamma)に対応する構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\phi_{rb} \gamma) 項で構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi=1.0 の状態を選びます。

その他の離散化項は一般に決ったスキームを使用します。 それゆえfvSchemesディクショナリーのエントリーは以下のようになるべきです。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //  
24                                                                                   
25  ddtSchemes                                                                       
26  {                                                                                
27      default Euler;                                                               
28  }                                                                                
29                                                                                   
30  gradSchemes                                                                      
31  {                                                                                
32      default         Gauss linear;                                                
33      grad(U)         Gauss linear;                                                
34      grad(gamma)     Gauss linear;                                                
35  }                                                                                
36                                                                                   
37  divSchemes                                                                       
38  {                                                                                
39      div(rho*phi,U)  Gauss upwind;                                                
40      div(phi,gamma)  Gauss limitedLinear01 1;                                     
41      div(phirb,gamma) Gauss limitedLinear01 1;                                    
42  }                                                                                
43                                                                                   
44  laplacianSchemes                                                                 
45  {                                                                                
46      default         Gauss linear corrected;                                      
47  }                                                                                
48                                                                                   
49  interpolationSchemes                                                             
50  {                                                                                
51      default         linear;                                                      
52  }                                                                                
53                                                                                   
54  snGradSchemes                                                                    
55  {                                                                                
56      default         corrected;                                                   
57  }                                                                                
58                                                                                   
59  fluxRequired                                                                     
60  {                                                                                
61      default         no;                                                          
62      pd;                                                                          
63      pcorr;                                                                       
64      gamma;                                                                       
65  }                                                                                
66                                                                                   
67                                                                                   
68  // ************************************************************************* //  

[編集] 2.3.7 線形ソルバーの制御

fvSolutionでは、PISOサブ辞書がinterFoamに特化した要素を含んでいます。 ここには、通常と同じく運動量方程式に対する反復数だけでなく、相方程式のPISOループに対する反復数も指定します。 特に興味深いものはnGammaSubCyclescGammaキーワードです。 nGammaSubCycles構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma 方程式内のsub-cycleの数を表してあり、ここで、sub-cyclesは与えられた時間ステップ内での方程式に対する付加的な解の点数です。 それは、時間ステップや計算時間の莫大な増加なしで解を安定させることができるようにするものです。 ここでは、4つのsub-cycleを指定しており、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \gamma 方程式は実際の各時間ステップ内で4分の1の幅の時間スッテプで4回解かれていることを意味します。

cGammaキーワードは界面の圧縮を制御する要素です。 つまり、0は無圧縮に対応し、1は保存的な圧縮に対応し、1以上は拡張された界面の圧縮を意味します。 通常はこの例題で用いられている1.0の値が推奨されます。

[編集] 2.3.8 コードの実行

コードの実行方法については、前述のチュートリアルに詳細に記述しています。 以下を試してください。teeによって計算内容をターミナルウインドウに表示しつつ、ログファイルに記録します。

cd $FOAM_RUN/tutorials/interFoam                                                 
interFoam | tee log                                                   

コードは、出力のコピーをlogファイル内に記録しつつ、対話形式で実行されます。

[編集] 2.3.9 事後処理

結果の事後処理は、通常の方法で行えます。 図2.22のように参照時間の経過とともに相比率gammaの発達を見ることができます。

(a)At t=0.25s

(b)At t=0.50s

図2.22: γフェーズのスナップショット

[編集] 2.3.10 並列計算

前述の例の結果はかなり目の粗い格子を使って得られました。ここでは格子の解像度を増やして再計算します。新しいケースは、一般的に1つのプロセッサでは計算するのに数時間を要するので、複数のプロセッサにアクセスしているのであれば、OpenFOAMの並列計算という能力を試してみてもよいでしょう。

まず初めに、damBreakケースのコピーをしてください。

    cd $FOAM_RUN/tutorials/interFoam
    mkdir damBreakFine
    cp -r damBreak/0 damBreakFine
    cp -r damBreak/system damBreakFine
    cp -r damBreak/constant damBreakFine

新しいケースはdamBreakFineと名づけてください。新しいケースディレクトリを開いてblockMeshDictファイル内のblocksの記述を以下の様に変更してください。

    blocks 
    ( 
        hex (0 1 5 4 12 13 17 16) (46 10 1) simpleGrading (1 1 1) 
        hex (2 3 7 6 14 15 19 18) (40 10 1) simpleGrading (1 1 1) 
        hex (4 5 9 8 16 17 21 20) (46 76 1) simpleGrading (1 2 1) 
        hex (5 6 10 9 17 18 22 21) (4 76 1) simpleGrading (1 2 1) 
        hex (6 7 11 10 18 19 23 22) (40 76 1) simpleGrading (1 2 1) 
    ); 

上記で、入力はblockMeshDictファイルで表示されているように、つまりは、格子の密度を変更しなければなりません。例えば46 10 1という入力や1 2 1という格子幅の勾配の入力の様にです。入力内容が正しければ、格子を生成します。

ここで格子がdamBreakの例から変更されると、時刻0のディレクトリ内のgammaというフェーズ場を再初期化しなければなりません。というのもgammaは新しい格子とは合致しないいくつかの要素を含んでいるからです。ここで、Uやpというフィールドは変更する必要が無いことに注意しましょう。それらはuniformとして明記されておりフィールド内の要素の数と独立だからです。フィールドの初期化はシャープな界面を持つように行いたいものです。つまり、その要素がγ=1かγ=0を持つようにです。mapFieldsでのフィールドの更新は界面に補間された値0<γ<1が生成されるかもしれないので、setFieldsユーティリティーを以下の様に再実行したほうがよいでしょう。その前に初期条件の一様なγのバックアップファイル0/gamma.org0/gammaにコピーします。

cd $FOAM_RUN/tutorials/interFoam/damBreakFine
cp -r 0/gamma.org 0/gamma 
setFields $FOAM_RUN/tutorials/interFoam damBreakFine 

OpenFOAMで用いられる並列計算の手法はいわゆる領域分割であり、幾何形状やそれに関連する場が領域毎に分解されて、解析のため個々のプロセッサに割り当てられます。 そのため、並列計算を実行するために必要な最初の段階は、decomposeParを用いて領域を分解することです。decomposeParの設定はsystem ディレクトリにある、decomposeParDictというファイルです。他のユーティリティ同様、初期状態のファイルがユーティリティのソースコードのディレクトリ($FOAM_UTILITIES/parallelProcessing/decomposePar)にあります。

最初の入力のnumberOfSubdomainsにおいて何個のサブ領域に分割するかを指定します。通常はこのケースに利用できるプロセッサの数と対応します。

このチュートリアルでは、分解の手法はsimpleで、対応するsimpleCoeffsは以下の基準の様に編集しましょう。領域は、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x ,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): y ,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): z 方向で部分かサブ領域に分けられ、各方向へのサブ領域の数はベクトルnとして与えられます。この幾何形状は2次元なので、3次元方向の構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): z には分割され得ず、それゆえ必ず構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_z は1になります。構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_x構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_y構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x ,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): y 方向の領域の分割数nを構成し、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_x構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): n_y の積で表されるサブ領域の数がnumberOfSubdomainに指定したものと等しくなる必要があります。隣接するサブ領域間のセル面の数を最小にしたほうがよいので、正方形の幾何形状では、x,y方向を均等に分割するのが良いでしょう。deltaキーワードは0.001に設定しましょう。

例として、4つのプロセッサで計算を実行するとします。numberOfSubdomainを4に、n=(2,2,1)に設定します。decomposeParDictを閉じて、decomposeParを実行します。decomposeParのスクリーンメッセージが確認でき、分解はプロセッサ間で均等に分配されたと表示されます。

セクション3.4に並列計算の方法についての詳細があるので参照してください。このチュートリアルでは並列計算の一例を示しているに過ぎません。openMPIを用いて標準のメッセージパッシングインターフェース(MPI)を実装しています。ここでは、テストとしてローカルホストのみの単独ノードで実行します。

mpirun -np 4 interFoam -parallel > log &

3.4.2に後述しますが、ケースが実行されるマシンのホストネームを列記したファイルを作っておけばネットワーク上のより多くのノードを使って計算することも可能です。ケースはバックグラウンドで実行し、進行状況をlogファイルで監視するのがよいでしょう。

図2.33: 並列プロセスケースでのプロセッサ2のメッシュ


(a)At t=0.25s

(b)At t=0.50s

図2.34: 正確なメッシュのγフェーズのスナップショット

[編集] 2.3.11 並列計算ケースのポスト処理

一度ケースの実行が完了したら、分解されたフィールドとメッシュはreconstructParを実行してポスト処理のために再統合します。コマンドラインから容易に実行できます。細かい格子による結果はFigure 2.30に表されます。インターフェースでの結果は粗い格子のものと比較して著しく改良されたことが見てとれます。

また、単に個々のプロセッサの領域を一つのケースと扱うことで、分解された領域の部分を個々にポスト処理することもできます。

例えば、paraFoamを以下の様に起動します。

paraFoam -case processor1 

そしてprocessor1はParaViesのケースモジュールとして表れます。

simpleメソッドを使った領域分割を行なったprocessor1からFigure2.31のような格子が見えます。


[編集] 第3章 アプリケーションとライブラリ

繰り返し言いますが、OpenFOAMは実行のために、基本的にC++のライブラリを用いています。OpenFOAMはプリコンパイル済みの数多くのアプリケーションで構成されていますがユーザーが独自に作成したり従来のものを修正しても構いません。アプリケーションは大きく2つのカテゴリに分けられています。

ソルバは数値連続体力学の特定の問題を解くためのもの

ユーティリティは主にデータ操作や代数計算を主に行うプリ・ポストプロセスを実行するもの

OpenFOAMは一連のプリコンパイル済ライブラリに分けられ、それらはソルバとユーティリティの集合体をダイナミックにリンクします。ユーザーが適宜独自のモデルをライブラリに追加できるように物理的モデルのこのようなライブラリィはソースコードとして与えられます。

この章ではソルバ、ユーティリティ、ライブラリィの概説とこれらの作成、修正、編集、実行方法についてのべます。ソルバとユーティリティのコードの実際の書き方についてはここでは述べませんがプログラマーガイドに記載してあります。尚、プログラマーガイドは現在改訂中ですので、もし何か不明な点がありましたら、OpenFOAMの討議グループやOpenFOAMのウェブサイトで新たな情報が得られるかもしれません。


[編集] 3.1 OpenFOAMのプログラミング言語

OpenFOAMライブラリィの働きを理解するためにはOpenFOAMの基本言語であるC++の予備知識がいくらか必要となります。そのために不可欠な知識が本章にあります。その前に重要なことは、オブジェクト指向プログラミングやOpenFOAMのメインプログラミング言語としてのC++の選択の背景として一般論で様々な考えを説明するための言語の概念に着目することです。

[編集] 3.1.1 言語とは

口話と数学が普及には、特に抽象的な概念を表現する際の効率性が重要でした。

(概念を表現する際の効率性の)例として、流量について、「速度場(velocity field)」という言葉を私たちが使うとき、流れの性質の言及もせず何ら具体的な速度データがなくとも使っています。その言葉の中には、運動の向きと大きさやその他の物理的性質との関係の概念が要約されています。 これを数学にすると、「速度場」をUなどの簡易な記号で表し、また速度場の大きさを表したいときには|U|として表記します。数学は口話よりも効率性に優れ、複雑な概念を極めて明快に表現できます。

連続体力学の中で解析しようとしている問題は、固有の構成要素やタイプとして表現されたものでもなく、コンピュータの認識する、いわゆるビット、バイト、数値などの概念とも異なります。 問題はいつも、まず口話で提起され、空間と時間の三次元での偏微分方程式として表現されます。それらの方程式はスカラー、ベクトル、テンソルそしてそれらの場、テンソル代数、テンソル解析、次元単位などの概念を含んでおり、これらの解は離散化手法やマトリクス、ソルバそして解法アルゴリズムを必要とします。 テンソル数学と値計算法についてはプログラマーガイドの第1章と第2章に記載しています。

[編集] 3.1.2 オブジェクト指向とC++

C++のようなオブジェクト指向のプログラミング言語は,宣言の型としてクラスという考え方を採用しており,口語の部分や科学計算や技術計算に用いられる数学的な言語を取り扱っています。先に紹介した速度場はプログラミングコードでは記号Uで表され、速度フィールドの大きさはmag(U)で表されます。速度はベクトル場であり、オブジェクト指向コードではvectorFieldクラスとなります。速度フィールドUは,オブジェクト指向の項であることことから,この場合vectorFieldクラスのインスタンス,あるいはオブジェクトとということになります。

プログラミングの中で、物理的なオブジェクトと抽象的な構成要素を表現するオブジェクト指向の持っている明瞭さを過小評価してはいけません。クラス構造は,クラス自身など、開発したコードの領域を包含する集合であるから,容易にコードを管理することができます。新しいクラスには,他のクラスからのプロパティを継承させることができることから,vectorFieldにはvectorクラスとFieldクラスを継承させることができます。C++はテンプレートクラスのメカニズムを備えています。例えばテンプレートクラスField<Type>はscalar、vector、tensorなどどんな<Type>のFieldも表現できます。テンプレートクラスの一般的な特性はテンプレートから作成されるどんなクラスにも通じます。テンプレート化や継承はコードの重複を減らし、コードの全体構造を決めるクラスのヒエラルキーを作ります。

[編集] 3.1.3 方程式の説明

OpenFOAMの設計の中心的なテーマは,OpenFOAMのクラスを用いて書かれたソルバーのアプリケーションであり,偏微分方程式の解法と非常に似た構造を持っています。例えば方程式

はコード

solve 
( 
    fvm::ddt(rho, U) 
  + fvm::div(phi, U) 
  - fvm::laplacian(mu, U) 
    == 
  - fvc::grad(p) 
); 

で表されます。

これらの必要条件としてOpenFOAMの主たるプログラミング言語が継承やテンプレートクラスや仮想関数や演算子の多重定義等オブジェクト指向的特徴を持っていることが必要です。これらのことは,オブジェクト指向を意図した多くの言語でできるわけではなく,実際,FORTRAN-90,C++といった限られたオブジェクト指向の言語でのみ可能となっており,これらの特性をすべての持つ上に,信頼性のあるコンパイラが効率よく実行することから,標準的な仕様で広く使われているという優位性を持っています。だからOpenFOAMの主要言語なのです。

[編集] 3.1.4 ソルバコード

ソルバコードは、解法アルゴリズムと方程式の手続き上の説明のようなものなので当然のようにほとんど手続きです。 オブジェクト指向やソルバを書くためのC++プログラミングへの深い知識は必要ありませんがオブジェクト指向やクラスの原理やいくらかC++コードの構文の基礎知識は知っておくべきでしょう。 基礎的な方程式やモデルや解法の理解やアルゴリズムは非常に重要です。

ユーザーはたいていの場合OpenFOAMクラスのどんなコードでも深く考える必要はありません。 オブジェクト指向の真髄はユーザーが何もしなくてもよいところにあります。 単にクラスの在り方と機能の知識だけでクラスを使うのに十分です。 それぞれのクラスやその機能などの説明は、OpenFOAMの配布物の中にDoxygenで生成されたHTMLのドキュメントとして供給されており、$WM_PROJECT_DIR/doc/Doxygen/html/index.htmlにあります。


[編集] 3.2 アプリケーションやライブラリのコンパイル

コンパイルはアプリケーションの開発には必要不可欠の部分であり,各々のコードのピースがそれ自身,OpenFOAMのライブラリに依存しているコンポーネントに アクセスすることから,細心の管理が必要となります。多くの場合、これらの構築はUNIX/Linuxシステムでは標準のUNIX makeユーティティを使ってコンパイルします。しかしながら、OpenFOAMはより用途が広く簡便性に優れている,wmakeでのコンパイルスクリプトを提供しています。 実際、wmakeはOpenFOAMのライブラリだけでなく、どのコードにも使われています。 コンパイルのプロセスを理解するために,最初にC++のある側面とそのファイル構成について図3.1で説明します。クラスとは、オブジェクトの構築様式,データの格納およびクラスのメンバー関数のような命令文のセットで定義されるものです。クラスの定義を含むファイルは.Cの拡張子を持っており,例えばクラスncであればファイルnc.C.と書かれます。このファイルは,他のコードとは独立にコンパイルしてnc.soのような拡張子.soを持つオブジェクトライブラリーとして知られるバイナリ実行ライブラリファイルとすることができます。 コードの一部を、仮にnewApp.Cなどとしてコンパイルする時,ユーザーはncクラスを使うことにより,nc.Cを再コンパイルしなくてもランタイムとしてnewApp.Cnc.soを呼び出せば良いことになります。これがダイナミックリンクといわれるものです。

図3.1: ヘッダーファイル、ソースファイル、コンパイル、リンク

[編集] 3.2.1 ヘッダーH.ファイル

エラーチェックをおこなうにあたって、コンパイルするコードの部分がどのクラスで用いられるか、また実際の操作でどのように振舞うかを認識しなければなりません。 それゆえ、(例えばnc.Hのような).Hファイル拡張子を持つヘッダーファイルによってクラス宣言が必要です。このようなヘッダーファイルにはクラス名とその機能が表記されています。

このファイルは,クラスを用いるあらゆるコード(クラス宣言のためのコードも含め)の最初の部分に置きます。 .Cコードではどの部分でいくつのクラスを用いてもかまいませんが、かならずクラス宣言のために.Hファイルではじめる必要があります。クラスは他のクラスのリソースとして使うことができますが、その場合も関連付けた.Hファイルではじめます。 クラスヒエラルキーを再帰的に検索することで、結局、上位.Cコードが依存しているクラス(これらの.Hファイルはdependencyと呼ばれる)で、すべてのクラスに関するヘッダーファイルのリストをコンパイルすることができます。dependencyリストがあればコンパイラはソースファイルが最終コンパイル以来アップデートされているかどうかチェックでき、選択的に必要な部分だけコンパイルできます。

ヘッダーファイルは、例えば

# include "otherHeader.H";

のような# include命令文を使ったコードに含まれていますが、このようなコードはコンパイラに特定のファイルを読ませるために現在のファイルの読み込みを一時中断させます。 すべての内蔵コードはヘッダーファイルに入れること、コード可読性を高めるためにメインコードにrelevant locationに含めることができます。 例えば多くのOpenFOAMアプリケーションでは、作成フィールドや読み込みフィールドの入力データのコードはコードの始めにcreateFields.Hと名づけられたファイルに含まれます。この方法では,ヘッダーファイルは単独でクラスの宣言として使われるだけではありません。以下のようなその他の機能と共に依存リストファイルを維持管理するタスクを実行するのがWMAKEなのです。

  • ソースファイルと,それらが依存しているファイルの依存関係リストの自動作成と管理 
  • マルチ・プラットフォームコンパイル適切なディレクトリ構造を通じてハンドルされたマルチプラットフォームでのコンパイルとリンク 
  • マルチ・ランゲージコンパイルとCやC++やJava等のリンケージ
  • CやC++,Javaのようなマルチ言語でのコンパイルとリンク
  • デバッグや最適化,並列処理,分析といったマルチオプションでのコンパイルとリンク
  • ソースコードの作成プログラムのサポート,lex, yacc, IDL, MOC
  • ソースファイルリストの簡潔なシンタックス
  • 新規のコードリストのソースファイルリストの自動生成
  • 多重分割あるいは静的ライブラリの簡潔なハンドリング
  • 新しいタイプのマシンへの拡張性  
  • make; sh, ksh or csh; lex, ccを持ついかなるマシンでの作業に対する優れた移植性
  • Apollo, SUN, SGI, HP (HPUX), Compaq (DEC), IBM (AIX), Cray,Ardent,Stardent, PC Linux, PPC Linux, NEC, SX4, Fujitsu VP1000で  の動作確認

[編集] 3.2.2 wmakeによるコンパイル

OpenFOAMのアプリケーションは各アプリケーションのソースコードがそのアプリケーション名のディレクトリに置かれるという一般的決まりで編成されます。最上位ソースファイルはアプリケーション名に拡張子.Cをつけます。例えば、newAppというアプリケーションのソースコードは図3.2に示すようにnewAppのディレクトリに存在し、最上位ファイルはnewApp.C となります。

図3.2: アプリケーションのディレクトリ構成

ディレクトリはoptionsとfilesのふたつのファイルを含んだMakeというサブディレクトリも持っており、それについては次節で述べます。

[編集] 3.2.2.1 ヘッダーのインクルード

コンパイラは、以下の順でwmakeで-Iオプションが指定されたヘッダーファイルを検索します。

  1. $WM_PROJECT_DIR/src/OpenFOAM/lnInclude ディレクトリ
  2. newApp/lnIncludeのようなローカルディレクトリ
  3. newAppのようなローカルディレクトリ
  4. /usr/X11/include and $(MPICH_ARCH_PATH)/includeのように,プラットフォームに依存する$WM_PROJECT_DIR/wmake/rules/$WM_ARCH/ディレクトリの中のファイルに設定されているパス
  5. -Iオプションを持つMake/optionsファイルの中で明確に指定されている他のディレクトリ

Make/optionsファイルは構文を使っているヘッダーファイルを配置するためのフルディレクトリパスを含みます。

EXE_INC = \ 
    -I<directoryPath1> \ 
    -I<directoryPath2> \ 
    ...                \ 
    -I<directoryPathN> 

ディレクトリ名は頭に-Iをつけ、各行ではEXE_INCを続けるために構文は\を使い、最終記入後は\をつけないことに注意してください。

[編集] 3.2.2.2 ライブラリへのリンク

コンパイラは、以下のwmakeの-Lオプションで指定されたディレクトリパスのオブジェクトライブラリファイルにリンクします。 

  1. $FOAM_LIBBIN ディレクトリ
  2. $WM_DIR/rules/$WM_ARCH/デイレクトリの中に設定された機種に依存するパス,例えば,/usr/X11/や$(MPICH_ARCH_PATH)/lib
  3. Make/optionsファイルで指定された他のディレクトリ

リンクされる実際のライブラリファイルは-lオプションで指定し,接頭辞lib,ライブラリファイルの拡張子.soをを外さなければなりません。例えばライブラリlibnew.soはフラグ-lnewに含まれます。

デフォルトでは,wmakeは以下のライブラリをロードするようになっています

  1. $FOAM_LIBBINディレクトリからのlibOpenFOAM.soライブラリ;
  2. $WM_DIR/rules/$WM_ARCH/ディレクトリの中のファイルに設定された機種に依存するライブラリ,例えば,/usr/X11/libにおけるlibm.soや,$(LAM ARCH PATH)/libにおけるliblam.so;
  3. Make/optionsファイルで指定された他のライブラリ

Make/optionsファイルは構文を使っているヘッダーファイルを置くための全ディレクトリパスを含みます。

EXE_LIBS = \ 
    -L<libraryPath1> \ 
    -L<libraryPath2> \ 
    ...              \ 
    -L<libraryPathN> \ 
    -l<library1>     \ 
    -l<library2>     \ 
    ...              \ 
    -l<libraryN>

繰り返しになりますが、ディレクトリパスは頭に-Lフラグを付け、ライブラリ名は頭に-lフラグをつけます。

[編集] 3.2.2.3 コンパイルすべきソースファイル

コンパイラはコンパイルすべき.Cソースファイルのリストが必要です。リストはメインの.Cファイルだけではなく特定のアプリケーションのために生成されるがクラスライブラリの中に含まれない他のソースファイルも含まれなければなりません。 例えば、新しいクラスを作成したり、特定のアプリケーション用のクラスに新しい機能をつけくわえることができます。.CソースファイルのフルリストはMake/filesファイルに含む必要があります。当然、アプリケーションは多くなるので、フルリストには(例えば前述のアプリケーション例におけるnewApp.Cのような)メイン.Cファイルの名前だけを入れます。 Make/filesファイルはEXE =構文によって指定されたコンパイル済み実行ファイルの名前とフルパスも含みます。一般的な決まりでは"newApp"のようにアプリケーション名をつけることが規定されています。OpenFOAMのリリースにはパスのために便利な2つの選択肢があります。標準的なリリースではアプリケーションは$FOAM_APPBINに保存されますが、ユーザーにより開発されたアプリケーションは$FOAM_USER_APPBINに保存されます。

もしアプリケーションを開発したら、個人のOpenFOAMアプリケーションのためのソースコードを含む$WM_PROJECT_USER_DIRディレクトリにアプリケーションサブディレクトリを作ることをお薦めします。スタンダードアプリケーションと同様に各OpenFOAMアプリケーションのソースコードも各ディレクトリ内に保存しておいてください。ユーザーアプリケーションとスタンダードリリースのものの違いはMake/filesファイルが$FOAM_USER_APPBINディレクトリ内に書き込まれている実行可能ファイルを指定していることだけです。例としてのMake/filesを以下に記載します。

newApp.C 

EXE = $(FOAM_USER_APPBIN)/newApp
[編集] 3.2.2.4 wmakeの実行

wmakeのスクリプトは以下のように入力することで実行されます。

wmake <optionalArguments> <optionalDirectory> 

<optionalDirectory>はコンパイル中のアプリケーションのディレクトリパスです。通常、<optionalDirectory>が省略可能な場合にはwmakeはコンパイル中のアプリケーションのディレクトリ内から実行されます。

アプリケーションファイルを作成したい場合には<optionalArguments>は必要ありません。しかし<optionalArguments>は表3.1に示すようにライブラリ等の作成の際には指定されることになります。

Argument 編集の種類
lib 静的にリンクされたライブラリの作成
libso 動的にリンクされたライブラリの作成
libo 静的にリンクされたオブジェクトファイルライブラリの作成
jar JAVAアーカイブの作成
exe 特定のプロジェクトライブラリから独立したアプリケーションの作成

表3.1: wmakeのオプション編集Argument.

[編集] 3.2.2.5 wmakeの環境変数

参考として、wmakeで使われる環境変数の設定を表3.2に示します。

主なパス
$WM_PROJECT_INST_DIR インストールディレクトリへのフルパス 例:$HOME/OpenFOAM
$WM_PROJECT コンパイルされたプロジェクトの名前: OpenFOAM
$WM_PROJECT_VERSION コンパイルされたプロジェクトのバージョン: 1.5
$WM_PROJECT_DIR OpenFOAMのバイナリ実行ファイル置き場へのフルパス 例:$HOME/OpenFOAM/OpenFOAM-1.5
$WM_PROJECT_USER_DIR ユーザーのバイナリ実行ファイル置き場へのフルパス 例:$HOME/OpenFOAM/${USER}-1.5
その他のパスと設定
$WM_ARCH マシン構造: cray decAlpha dec ibm linux linuxPPC sgi3 sgi32 sgi64 sgiN32 solaris sx4 t3d
$WM_COMPILER 使用するコンパイラ: Gcc3 - gcc 4.1.2, KAI - KAI
$WM_COMPILER_DIR コンパイラインストールディレクトリ
$WM_COMPILER_BIN コンパイラインストールバイナリ $WM_COMPILER_BIN/bin
$WM_COMPILER_LIB コンパイラインストールライブラリ $WM_COMPILER_BIN/lib
$WM_COMPILE_OPTION コンパイルオプション: Debug - debugging, Opt optimisation.
$WM_DIR wmakeディレクトリのフルパス
$WM_JAVAC_OPTION JAVAのためのコンパイルオプション: Debug - debugging, Opt optimisation.
$WM_LINK_LANGUAGE ライブラリや実行ファイルのリンクに使うコンパイラ。多言語プロジェクトにおいて$WM_LINK_LANGUAGEは主要言語を決める。
$WM_MPLIB 並列通信ライブラリ: LAM, MPI, MPICH, PVM
$WM_OPTIONS = $WM_ARCH$WM_COMPILER... ...$WM_COMPILE_OPTION$WM_MPLIB 例:linuxGcc3OptMPICH
$WM_PROJECT_LANGUAGE プロジェクトのプログラミング言語 例:c++
$WM_SHELL wmakeスクリプト(bash, csh, ksh, tcsh)に使うシェル

表3.2: wmakeの環境変数の設定

[編集] 3.2.3 依存リストの削除:wcleanとrmdepall

実行に際して,例題におけるnewApp.depのように,wmakeは拡張子として.depを持った依存関係のリストファイルを構築し,Make/$WM_OPTIONSディレクトリの中にファイルのリストを格納します。コードを変更してmakeした後などこれらファイルを除去したい場合には,wcleanを入力してスクリプトを実行します。

 wclean <optionalArguments> <optionalDirectory>

さらに、<optionalDirectory>はコンパイルされるアプリケーションのディレクトリへのパスです。通常、パスが省略できる場合にはwcleanはアプリケーションのディレクトリ範囲内で実行されます。 もしMakeディレクトリから依存ファイルとファイルを削除したい場合には、<optionalArguments>は必要ありません。しかしもしlibが <optionalArguments> に指定されていたらローカルのInIncludeディレクトリも削除される必要があります。

追加のスクリプト,rmdepallは実行時に、再帰的にディレクトリツリー下の依存関係にあるすべての.depファイルを除去します。これはOpenFOAMのライブラリが更新された時には有効な方法です。

[編集] 3.2.4 コンパイルの例:turbFoamアプリケーション

アプリケーションturbFoamのソースコードは$FOAM_APP/solvers/turbFoamディレクトリ内にあり、最上位ソースファイルはturbFoam.Cという名前です。turbFoam.Cソースコードは

1  /*---------------------------------------------------------------------------*\ 
2    =========                 | 
3    \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox 
4     \\    /   O peration     | 
5      \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd. 
6       \\/     M anipulation  | 
7  ------------------------------------------------------------------------------- 
8  License 
9      This file is part of OpenFOAM. 
10   
11      OpenFOAM is free software; you can redistribute it and/or modify it 
12      under the terms of the GNU General Public License as published by the 
13      Free Software Foundation; either version 2 of the License, or (at your 
14      option) any later version. 
15   
16      OpenFOAM is distributed in the hope that it will be useful, but WITHOUT 
17      ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
18      FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
19      for more details. 
20   
21      You should have received a copy of the GNU General Public License 
22      along with OpenFOAM; if not, write to the Free Software Foundation, 
23      Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 
24   
25  Application 
26      turbFoam 
27   
28  Description 
29      Transient solver for incompressible, turbulent flow. 
30   
31  \*---------------------------------------------------------------------------*/ 
32   
33  #include "fvCFD.H" 
34  #include "incompressible/singlePhaseTransportModel/singlePhaseTransportModel.H" 
35  #include "incompressible/turbulenceModel/turbulenceModel.H" 
36   
37  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 
38   
39  int main(int argc, char *argv[]) 
40  { 
41   
42  #   include "setRootCase.H" 
43   
44  #   include "createTime.H" 
45  #   include "createMesh.H" 
46  #   include "createFields.H" 
47  #   include "initContinuityErrs.H" 
48   
49  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 
50   
51      Info<< "\nStarting time loop\n" << endl; 
52   
53      for (runTime++; !runTime.end(); runTime++) 
54      { 
55          Info<< "Time = " << runTime.timeName() << nl << endl; 
56   
57  #       include "readPISOControls.H" 
58  #       include "CourantNo.H" 
59   
60          // Pressure-velocity PISO corrector 
61          { 
62              // Momentum predictor 
63   
64              fvVectorMatrix UEqn 
65              ( 
66                  fvm::ddt(U) 
67                + fvm::div(phi, U) 
68                + turbulence->divR(U) 
69              ); 
70   
71              if (momentumPredictor) 
72              { 
73                  solve(UEqn == -fvc::grad(p)); 
74              } 
75   
76              // --- PISO loop 
77   
78              for (int corr=0; corr<nCorr; corr++) 
79              { 
80                  volScalarField rUA = 1.0/UEqn.A(); 
81   
82                  U = rUA*UEqn.H(); 
83                  phi = (fvc::interpolate(U) & mesh.Sf()) 
84                      + fvc::ddtPhiCorr(rUA, U, phi); 
85   
86                  adjustPhi(phi, U, p); 
87   
88                  // Non-orthogonal pressure corrector loop 
89                  for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) 
90                  { 
91                      // Pressure corrector 
92   
93                      fvScalarMatrix pEqn 
94                      ( 
95                          fvm::laplacian(rUA, p) == fvc::div(phi) 
96                      ); 
97   
98                      pEqn.setReference(pRefCell, pRefValue); 
99                      pEqn.solve(); 
100   
101                      if (nonOrth == nNonOrthCorr) 
102                      { 
103                          phi -= pEqn.flux(); 
104                      } 
105                  } 
106   
107  #               include "continuityErrs.H" 
108   
109                  U -= rUA*fvc::grad(p); 
110                  U.correctBoundaryConditions(); 
111              } 
112          } 
113   
114          turbulence->correct(); 
115   
116          runTime.write(); 
117   
118          Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" 
119              << "  ClockTime = " << runTime.elapsedClockTime() << " s" 
120              << nl << endl; 
121      } 
122   
123      Info<< "End\n" << endl; 
124   
125      return(0); 
126  } 
127   
128   
129  // ************************************************************************* //


コードはアプリケーションを説明している記述で始まり,この中で1行のコメントは(//)で,複数行に渡るコメントは($\backslash$*...*/)で記述されます。それに続き、コードはコンパイラに現在のファイルの読み込みを一時停止させ、turbFoam.CにfvCFD.Hを読み込ませるための例えば#include "fvCFD.H"のような様々な# include 命令文を含んでいます。

turbFoamはCFDツール(cfdTools)やincompressibleRASModelsやincompressibleTransportModelsライブラリを提供し、それゆえEXE_INC = -I... オプションとライブラリにリンクするEXE LIBS = -l...オプションにより指定されるヘッダーファイルが必要となります。Make/optionsはそれゆえ以下のようになります。

1  EXE_INC = \ 
2      -I$(LIB_SRC)/finiteVolume/lnInclude \ 
3      -I$(LIB_SRC)/turbulenceModels \ 
4      -I$(LIB_SRC)/transportModels 
5   
6  EXE_LIBS = \ 
7      -lincompressibleTurbulenceModels \ 
8      -lincompressibleTransportModels \ 
9      -lfiniteVolume \ 
10      -lmeshTools 
11   

turbFoamはturbFoam.Cソースしか含みまず、実行ファイルはすべての標準的なアプリケーションと同様に$FOAM_APPBINに書き込まれます。Make/filesはそれゆえ以下のようになります。

1  turbFoam.C 
2   
3  EXE = $(FOAM_APPBIN)/turbFoam 

$FOAM_CFD/turbFoamディレクトリでwmakeとタイプすればturbFoamをコンパイルできます。

コードはコンパイルされ以下のようなメッセージをが作成されます。

  Making dependency list for source file turbFoam.C 

SOURCE_DIR=. 
SOURCE=turbFoam.C ; 
g++ -DFOAM_EXCEPTION -Dlinux -DlinuxOptMPICH 
-DscalarMachine -DoptSolvers -DPARALLEL -DUSEMPI -Wall -O2 -DNoRepository 
-ftemplate-depth-17 -I/export/warhol/chris/OpenFOAM/OpenFOAM-1.4/src/OpenFOAM/lnInclude 
-IlnInclude 
-I. 
……
-lmpich -L/usr/X11/lib -lm 
-o /export/warhol/chris/OpenFOAM/OpenFOAM-1.4/applications/bin/linuxOptMPICH/turbFoam 

再コンパイルすることも可能ですが、実行ファイルが最新でコンパイルする必要がないというときには以下のようなメッセージが返ってきます。

  make: Nothing to be done for `allFiles'. 
make: `Make/linuxOptMPICH/dependencies' is up to date. 

make: `/export/warhol/chris/OpenFOAM/OpenFOAM-1.4/applications/bin/linuxOptMPICH/turbFoam' 
is up to date. 
 wclean

を使って依存リストを削除し、wmakeを起動することでゼロからアプリケーションをコンパイルできます。

[編集] 3.2.5 デバッグメッセージと最適化スイッチ

OpenFOAMは実行時に書き込まれるメッセージの出力システムを提供しており,このことにより,OpenFOAMのcaseの実行時に出会うデバッグの問題の解決に有効です。 スイッチは$WM_PROJECT_DIR/.OpenFOAM-1.3/controlDictファイルの 中にあり、設定を変更したい場合には,$HOMEディレクトリに(例えば$HOME/.OpenFOAM-1.3/controlDictファイルのように)コピーを作成します。スイッチが可能なリストは非常に多く,foamDebugSwitchesアプリケーションを実行することにより閲覧できます。スイッチのほとんどは,クラスまたは機能性のレンジと一致しており,設定を1にすることにより,controlDictファイルの中にあるそれ自身により変更できます。例えば,OpenFOAMでは,dimensionSetスイッチを1に設定することにより,すべての計算におけるディメンションをチェックする機能があります。表3.3に示すものはより高機能にメッセージをコントロールできるスイッチです。

加えて,いくつかのオペレーションと最適化をコントロールするスイッチがあります。これらのスイッチについても図3.3に示します。特に重要なものはfileModificationSkewであり,OpenFOAMでは,変更をチェックするためにデータファイルの書き込み時間をスキャンしています。異なるマシンでクロックの設定に不整合が生じた状態でNFSを実行すると,先駆けしてフィールドデータの修正が表示されます。このことは,OpenFOAMが新規に修正されたとしてファイルを閲覧する場合と,このデータを再読み込みしようとする場合には問題を引き起こすことになります。キーワードileModificationSkewは秒単位の時間であり,OpenFOAMは,ファイルが新しく修正されたかどうか調べる時には,ファイルの書き込み時間から差し引きます。

ハイレベルデバッグスイッチ - サブ辞書 DebugSwitches
level OpenFOAMのデバッグメッセージの全体のレベル - - 0, 1, 2の3レベル
lduMatrix 実行中のソルバの収束メッセージ - 0, 1, 2の3レベル
最適化スイッチ - サブ辞書 OptimisationSwitches
fileModificationSkewNFSの上でNFSのアップデートの最大遅れとOpenFOAM実行のための差分クロックより長く設定すべき時間(秒)。
nProcsSimpleSum並列処理のために全領域の和を最適化します。階層和は線形和(デフォルトで16)よりよく機能し、プロセッサの数を設定します。

表3.3: ランタイムメッセージスイッチ

[編集] 3.2.6 現在のアプリケーションへの新しいユーザー定義ライブラリのリンク

タイトルのような状況は、新しいライブラリ(例えば"new"を)作成する時、新しい宣言およびアプリケーションのレンジを越えてライブラリの中に入れ込みたい場合に生じることが考えられます。例えば,ユーザーが新規の境界条件を作成し,newの中でコンパイルし,ソルバーのアプリケーションや,プリおよびポスト・プロセス用のユーティリティ,メッシュツール等々の範囲で認識させる必要があることがあります。通常の環境下では,ユーザーはすべてのアプリケーションを,リンクさせるためにnewで再コンパイルする必要があります。代わりに,OpenFOAMは再コンパイルの必要性を評価するためにfoamUserと呼ばれる特別なライブラリを用いています。これはデフォルトにより,最初に各アプリケーションの中にコンパイルされたfoamUserライブラリをもたせることにより有効になります。foamUserライブラリは,$FOAM_SRC/foamUserのディレクトリの中にあるコードからコンパイルされます。ユーザーが行うことは,foamUserと再コンパイルされたfoamUserのMake/optionsファイルの中にリンクされたライブラリにnewライブラリを追加するだけです。

 前述の例の場合であれば、ユーザーはformUserディレクトリのローカルコピーを作り、例えば以下のようなディレクトリに移してください。

cp -r $WM_PROJECT_DIR/src/foamUser $WM_PROJECT_USER_DIR/applications 
cd $WM_PROJECT_USER_DIR/applications/foamUser

このfoamUserライブラリを$FOAM_USER_LIBBINの中にローカルにコンパイルするように,Make/filesのファイルを次のように修正しましょう

libfoamUser.C 
LIB = $(FOAM_USER_LIBBIN)/libfoamUser 

新しいライブラリをMake/options内のLIB_LIBSに追加しましょう。

LIB_LIBS = \ 
    -l...  \ 
    -lnew 

最後に、ライブラリを以下のコマンドで再コンパイルしましょう。

wmake libso


[編集] 3.3 アプリケーションの実行

各アプリケーションは,ターミナルのコマンドラインから実行されるようになっており,個別のcaseに関連したデータファイルのセットの書き込み と読み込みが行われるようになっています。caseに関するデータファイルは節4.1で述べているように,caseの後に名前をつけられたディレクトリの中に格納されており,ここではフルパスを持つディレクトリ名は一般名<caseDir>としています。

どのアプリケーションにおいても、コマンドラインの入力フォームはコマンドラインでアプリーション名に-helpオプションをつけて入力するだけで見つけられます。例えば

blockMesh -help

と入力すると以下を含むデータが返ってきます。

Usage: blockMesh [-region region name] [-case dir] [-blockTopology]
    [-help] [-doc] [-srcDoc]

大括弧 [ ]内の引数はオプショナルフラグです。アプリケーションがケースディレクトリ内で実行されると、そのケースを作動します。あるいは、ケース(<caseDir>)オプションでは、直接ファイリングシステムでどこからでもアプリケーションを実行できるようにケースを指定することもできます。

すべてのUNIX/Linuxの実行方法と同様に,アプリケーションは,バックグラウンドのプロセスで実行しており,ユーザーがシェルに追加コマンドを与える必要はありません。blockMeshのサンプルをバックグラウンドのプロセスで実行し,caseの進捗をログファイルに出力したい場合には,以下のように入力します。

blockMesh > log &


[編集] 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のポスト・プロセスを行えます。 シミュレーション全体はケースを再構築することで後処理できますし、またはその代わりに個々のプロセッサーディレクトリをそれ自体でひとつのケースとして扱うことで個々に分解されたドメインのセグメントを後処理することもできます。


[編集] 3.5 標準のソルバ

OpenFOAMのディストリビューションのソルバーは$FOAM_APP/solversディレクトリの中にあり,コマンドラインからappと入力すれば素早く到達できます。 このディレクトリはさらに,非圧縮流体のような連続体力学,対流および固体応力解析等のカテゴリにより,いくつかのディレクトリに再分割されています。 各ソルバーには,非圧縮性,層流のicoFoamソルバー,非圧縮性,乱流のturbFoamソルバー,といったように分かり易い名前が付けられています。 このOpenFOAMで提供されているソルバーのリストを表 3.5に示します。

基礎的なCFDコード
laplacianFoam 固体の熱拡散のような単純なラプラス方程式を解く
potentialFoamシンプルなポテンシャル流のコード.完全ナビエ-ストークスコードを解く際の保存された初期値の生成にも使用できる
scalarTransportFoamパッシブスカラーの輸送方程式を解く
非圧縮性流れ
boundaryFoam1次元の乱流用の定常状態ソルバで、通常、解析では流入口で境界層条件を発生させます。
icoDyMFoamダイナミック・メッシュを持つニュートン流体の非圧縮性、層流の一時ソルバ 
icoFoam非圧縮性、層流の速度-圧力ソルバ.非ニュートン流体も可
nonNewtonianIcoFoam非ニュートン流体の非圧縮性、層流の一時ソルバ 
simpleFoam非ニュートン流体の非圧縮性、乱流の定常状態ソルバ
turbDyMFoamダイナミックメッシュを持つニュートン流体の非圧縮性、乱流の一時ソルバ
turbFoam非圧縮性、乱流の一時ソルバ
圧縮性流れ
coodles圧縮性のLESソルバ
rhopSonicFoam圧力密度に基づいた圧縮性流れのソルバ 
rhoSimpleFoam換気と熱輸送のある圧縮性流体の乱流の定常状態ソルバ
rhoSonicFoam密度に基づいた圧縮性流れのソルバ
rhoTurbFoam圧縮性、乱流の一時ソルバ
sonicFoam圧縮性,遷音速/超音速層流気体ソルバ
sonicFoamAutoMotion移動メッシュをもつ圧縮性,遷音速/超音速層流気体ソルバ
sonicLiquidFoam圧縮性,遷音速/超音速層流液体ソルバ
sonicTurbFoam圧縮性,遷音速/超音速乱流ソルバ
多層流
bubbleFoam液体の中の気泡のように非圧縮分散性2相2流体ソルバ
compressibleLes-InterFoam 界面を捕獲するやり方で流体占有率を求め(VOF法),不混和性の圧縮性等温2相流をLESで解くソルバ
interDyMFoam VOF法と補助的な格子移動を用いて,界面を捕獲する非圧縮性の2相流のソルバ
interFoamVOF法を用いて界面を捕獲する非圧縮性の2相流のソルバ
interPhaseChangeFoamVOF法を用いて,キャビテーション等の相変化を伴なう不混和性の非圧縮性等温2相流を解くソルバ
lesCavitatingFoamLES乱流モデルによる非定常のキャビテーション用コード
lesInterFoamインターフェースを持つ非圧縮2相流のソルバ。乱流のモデル化は各種の非圧縮性LESモデルにより,これはら実行時に変更できる。 
multiphaseInterFoamVOF法を使った多数のインターフェースを持つ非圧縮非混合性流れの任意数のソルバ
rasCavitatingFoamRAS乱流モデルによる非定常のキャビテーション用コード
rasInterFoamインターフェースを持った2層の非圧縮性流れのソルバ。乱流は各種の非圧縮性RASモデルのランタイムを使ってモデル化される
settlingFoam分散相の設定シミュレーション用の非圧縮2相流コード
twoLiquidMixingFoam2層の非圧縮性流れを混合したソルバ
twoPhaseEulerFoam液体の中の気体の泡のように分散した状態の2層の非圧縮性流れのシステム
直接数値シミュレーション(DNS)
dnsFoam直方体中の等方性乱流のための直接数値解法(DNS)コード
燃焼
coldEngineFoam内燃機関のコールドフローのソルバ 
dieselEngineFoamディーゼルエンジン用噴射・燃焼用コード
dieselFoamディーゼル噴射・燃焼用コード
engineFoamエンジン内部の燃焼用コード
PDRFoam

格子では解像できないくらい小さな固体による抵抗を扱うために、多孔質の抵抗を分布させるPDRモデルを内蔵した圧縮性予混合/部分的予混合乱流燃焼コード

reactingFoam化学反応コード 
XiFoam圧縮性予混合/部分的予混合乱流燃焼コード
Xoodles圧縮性予混合/部分的予混合乱流燃焼ラージ・エディ・シミュレーション(LES)コード
熱輸送
buoyantFoam換気と熱輸送がある圧縮性乱流・浮力流用の非定常ソルバ
buoyantSimpleFoam
buoyantSimpleRadiationFoam放射と換気、熱輸送がある圧縮性乱流・浮力流用の定常ソルバ
chtMultiRegionFoam浮力駆動の流れと固体との熱輸送を連成するソルバ
lesBuoyantFoam換気と熱輸送がある圧縮性乱流・浮力流用のLES乱流モデルによる非定常ソルバ
電磁流体
electrostaticFoam静電方程式コード
mhdFoam磁場の影響によって誘発される非圧縮性層流の電磁流体(MHD)用ソルバ
固体応力解析
solidDisplacementFoam選択が自由な熱拡散と熱応力を持った線形弾性や固体の微小ひずみの一時分離有限体積ソルバ
solidEquilibriumDisplacementFoam固体の線形弾性や微小ひずみの定常状態分離有限体積ソルバ
分子力学
gnemdFoam任意形状の解析領域における原子を解析する汎用の分子力学用ソルバであり、場のデータを作成するために原子や分子の量を格子内で平均する
mdEquilibrationFoam

分子力学系の平衡やその前提条件を解く

金融工学
financialFoam物価に対するBlack-Scholes方程式を解く

表 3.5: 標準ライブラリソルバ


[編集] 3.6 標準のアプリケーション

OpenFOAMで提供されているユーティティは$FOAM_APP/utilitiesディレクトリの中にあり,コマンドラインでutilと打つことにより簡単にアクセスできます。名称は内容を記述するようになっており,例えば,magUは速度場のデータから速度を計算し,deasToFoamはI-DEASのフォーマットで書かれたデータをOpenFOAMのフォーマットに変換します。OpenFOAMで配布されている最新のユーティリティリストを表3.6に示しておきます。

前処理
boxTurb与えられたエネルギースペクトラルに適合し、自由に発散する乱流のboxを生成する
engineSwirlエンジン計算のために旋回流を発生させる 
FoamX(不明)
mapFields両ケースの時間ディレクトリの全ての場を読み込み、補間し、体積場を1つのメッシュから他のメッシュにマップする。並列・非並列のどちらのケースでも再構築せずに実行可能
setFields辞書でセルのセットを選択する
メッシュの生成 -- 5.3節参照
blockMeshメッシュを生成する
extrudeMesh既存のパッチやファイルから読み込んだパッチを押し出す
メッシュの変換 -- 5.5節参照
ansysToFoamI-DEASから出力したANSYSインプットメッシュファイルをOpenFOAM形式へ変換する
ccm26ToFoamCCMバージョン2.6のライブラリを利用してCCMをを変換する
cfxToFoamCFXメッシュをOpenFOAM形式へ変換する
fluentMeshToFoamFluentのメッシュを複数の領域と領域の境界の処理を含むOpenFOAM形式に変換する
foamMeshToFluentOpenFOAMメッシュをFluentメッシュ形式で出力する
gambitToFoam GAMBITメッシュをOpenFOAM形式へ変換する
gmshToFoamGmshによって書かれた.mshファイルを読み込む
ideasUnvToFoamI-DEAS .unv 形式メッシュをOpenFOAM形式へ変換する
kivaToFoamKIVA3vfグリッドをOpenFOAM形式へ変換する
mshToFoamアドベンチャーシステムによって作られた.msh形式を読み込む
netgenNeutralToFoamNetgen4.4によって書かれたNeutralファイル形式を読み込む
plot3dToFoam Plot3dメッシュ(アスキー形式)をOpenFOAM形式に変換
polyDualMesh(不明)
sammToFoamSTAR-CDSAMMメッシュをOpenFOAM形式へ変換する
starToFoamSTAR-CDPROSTARメッシュをOpenFOAM形式へ変換する
tetgenToFoamtetgenにより書かれた.ele .node .faceファイルを読み込む
writeMeshObjメッシュのデバッグのため:たとえばjavaviewで見れる、3つの別々のOBJファイルとしてメッシュを書く
メッシュの操作
attachMesh 指定されたメッシュ修正ユーティリティによって位相的に独立したメッシュを付加する
autoPatch ユーザーが指定した角度に基づいて外部面をパッチに分割する
cellSet ディクショナリでセルのセットを選択する
checkMeshメッシュの妥当性をチェックする
couplePatches 周期的なプロセッサのパッチを再編成する
createPatch 選択した境界面の外部にパッチを作成する。面は既存のパッチかfaceSetから選択する
deformedGeomPolyMeshを変位場Uと引数として与えられた尺度因子により変形させる
faceSet ディクショナリで面のセットを選択する
flattenMesh 2次元デカルトメッシュの前後の面を平らにする
insideCells 面の内側に中心があるセルを抽出する。面は閉じていて、個々に接続している必要がある
mergeMeshes 2つのメッシュを合体させる
mirrorMesh(不明)
moveDynamicMesh メッシュの動作と位相変化のユーティリティ
moveEngineMeshエンジンシミュレーションのためにメッシュを動かすソルバ
moveMeshメッシュを動かすソルバ
objToVTK obj 線(面ではない)のファイルを読み込み、vtkに変換する
patchTool(不明)
pointSet ディクショナリで点のセットを選択する
refineMesh 複数の方向にあるセルを細分化する。-allオプションを適用してすべてのセル(3次元には3次元細分化を;2次元には2次元細分化を)を細分化するか、refineMeshDictの-cellSet to refineを読み込んでいくつかの方向を細分化する。
renumberMesh行列の帯幅を狭くするためにセルリストに順番を付け直す。全てのタイムディレクトリから全ての計算領域を読み込み、順番を付け直すことで行う  
rotateMeshメッシュおよび場を方向n1から方向n2へと回転させる
splitMesh 内部の面の外面を作ることでメッシュを分割する。attachDetachを用いる
splitMeshRegions メッシュを複数の領域に分割し、それらを連続したタイムディレクトリに書く。各領域は、セル-面-セルと辿ることによって届くことができる領域として指定される。meshWaveを使用する。平行して動くことはできるが、テストはされていない
stitchMeshメッシュを縫う
subsetMeshcellSetに基づいたメッシュの区分を選択する
tetDecomposition面とセルの中心の分解を利用してメッシュを4面体に分解する
transformPointsオプションにしたがって、polyMeshディレクトリのメッシュの点を変形させる。
zipUpMesh有効な形をもった全ての多面体のセルが閉じていることを確実にするために、ぶら下がった頂点を持つメッシュを読み込み、セルを締め上げる
画像の後処理 -- 6章参照
ensight76FoamExec変換せずにOpenFOAMのデータを直接読むためのEnSight 7.6のモジュール
paraFoam(不明)
データ変換の後処理 -- 6章参照
foamDataToFluentOpenFOAMデータをFluent形式へ変換する
foamToEnsightOpenFOAMデータをEnSight形式へ変換する
foamToFieldview9OpenFOAMのメッシュをバージョン3.0Fieldview-UNS形式(バイナリ)へ変換する。Fieldviewリリース9のレファレンスマニュアルで付録D(体系化されていないデータの形式)を参照してください。Fieldviewリストのuns/write_binary_uns.cから各種借用する
foamToGMV形式の出力をGMVで読めるファイルに変換する。http://www-xdiv.lanl.gov/XCM/gmv/から入手できるバイナリを用いて後処理を行う
foamToVTKレガシーのVTKファイル形式のライター。volScalar, volVector, pointScalar, pointVector, surfaceScalar場を操作する。メッシュの接続形態が変化する。asciiとバイナリの両方が用いられる。一度の操作で書き出す。部分集合だけを書き出す。セルが自動的に分解する。vtkによって操作されたため分解された境界上の多角形である
smapToFoamSTAR-CD SMAPデータファイルをOpenFOAMの計算領域の形式に変換する
速度場の後処理
Coプログラムを書く上で設定可能なグラフ
divU 各時間の速度場Uの発散を計算し、書き出す
enstrophy 各時間の速度場Uのエンストロフィーを計算し、書き出す
flowType 各時間の速度場UのflowTypeを計算し、書き出す
Lambda2 各時間の、速度勾配テンソルの対称、非対称部分の正方形の合計のうち2番目に大きな固有値を計算し、書き出す
Mach 各時間の速度場Uのローカルマッチ番号を計算し、書き出す
magGradU 各時間の速度場Uの計数規模を計算し、書き出す
magU 各時間の速度場Uの勾配の計数規模を計算し、書き出す
Pe 各時間のファイの場から得られるsurfaceScalarFieldとしてPe番号を計算し、書き出す
Q 各時間の速度勾配テンソルの2番目の不変条件を計算し、書き出す
streamFunction 各時間の速度場Uの流れ機能を計算し、書き出す
Ucomponents各時間の速度場Uにおける各要素について、Ux,Uy,Uzの3つのスカラー場を書き出す
uprime 各時間のuプライム(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): sqrt{{\frac{2}{3}}{k}}

)のスカラー場を計算し、書き出す

vorticity 各時間の速度場Uの渦巻き運動を計算し、書き出す
圧力場の後処理
R 現在のステップについてのレイノルズ圧力Rを計算し、書き出す
Rcomponents 各時間のレイノルズ圧力Rの6つの要素のスカラー場を計算し、書き出す
stressComponents 各時間の圧力テンソルsigmaの6つの要素のスカラー場を計算し、書き出す
壁の後処理
checkYPlusデータベースの各時間について、全ての壁のパッチに対するyPlusを計算し、リポートする
wallGradU 壁におけるUの勾配を計算し、書き出す
wallHeatFlux volScalar場の境界面として全てのパッチに対する熱フラックスを計算し、書き出す。そして全ての壁に対する不可欠なフラックスも書き出す
wallShearStress 現在のタイムステップで壁の受ける応力を計算して書き出す
yPlusLES LESのために壁近傍のセルのyplusを計算する
パッチの後処理
patchAverageすべてのパッチにわたって領域の平均を計算する
patchIntegrate すべてのパッチにわたって領域を融合する
様々な後処理
engineCompRatio幾何的圧縮の係数を計算する。BDCとTCDで体積を計算するので、バルブと非有効体積があるかどうか注意すること
postChannel チャンネル流計算のポストプロセスデータ
ptot 毎回、全圧を計算する
sample 展開スキームを選択し、計算領域をサンプリングする。その際、オプションをサンプリングしてフォーマットをかき出す
sampleSurface 並行処理の際に表面をサンプリングする。(ただし、点は結合しない)
wdot wdotを毎回計算し、書き出す
writeCellCentres 3つのコンポーネントを、閾値化してポストプロセスで使えるようにvolScalarFieldsとして書き出す
並行処理 -- 3.4節参照
decomposePar Openformの平衡計算のためにケースのメッシュと計算領域を自動的に分割する
reconstructPar Openformの平衡計算のために分割したメッシュと計算領域を再構成する
reconstructParMesh 幾何情報のみを使ってメッシュを再結合し、あとでreconstructParが計算領域を再構成できるように点/面/セルprocAddressingに書き込む
熱物理に関連したユーティリティ
adiabaticFlameT 与えられた燃料の種類・燃焼していない気体の温度と平衡定数に対して断熱状態の炎の温度を計算する
chemkinToFoam CHEMKIN 3の熱運動と反応のデータファイルをOpenFormのフォーマットに変換する
equilibriumCO 一酸化炭素の平衡状態を計算する
equilibriumFlameT 与えられた燃料の種類・燃焼していない気体の温度と平衡定数に対して酸素、水、二酸化炭素の分離の影響を考慮して平衡状態の炎の温度を計算する
mixtureAdiabaticFlameT与えられた混合・温度に対して断熱状態の炎の温度を計算する
エラーの推量
estimateScalarError 標準フォームによるスカラー輸送方程式の解の誤差を予想する
icoErrorEstimate 非圧縮性層流CFDアプリケーションicoFormの解の誤差を予想する
icoMomentError 非圧縮性層流CFDアプリケーションicoFormの解の誤差を予想する
momentScalarError 標準フォームによるスカラー輸送方程式の解の誤差を予想する
様々なユーティリティ
foamDebugSwitches すべてのライブラリーのデバッグスイッチを書き出す
foamInfoExec ケースを調べ、スクリーンに情報を表示する

表 3.6: 標準ライブラリユーティリティ


[編集] 3.7 標準のライブラリ

OpenFOAM配布のライブラリは$FOAM_LIB/$WM_OPTIONSディレクトリ内にあり、コマンド欄にlibと入力すればすぐに見つかります。一方、名前はlibを前につけて、例えばincompressibleTransportModelsが非圧縮性の輸送モデルのライブラリを含むというように合理的でかつ説明的です。表現を簡単にするためにライブラリは2つのタイプに分けられます。

一般的ライブラリ
これらは一般的なクラスや表3.7に記載したような関連機能を備えています。
モデルライブラリ
これらは表3.8、3.9、3.10に記載した計算連続体力学で使われるモデルを定めます。
Library of basic OpenFOAM tools -- OpenFOAM
algorithms アルゴリズム
containers コンテナクラス
db データベースクラス
dimensionSet 次元設定クラス
dimensionedTypes 次元<Type>クラスと導関数
fields 領域クラス
finiteVolume 有限体積離散化クラス
global 広域設定
interpolations 補間スキーム
matrices 行列クラス
meshes メッシュクラス
primitives 初期クラス
CFDツールライブラリィ -- cfdTools
adjustPhi 境界フラックスの調整
bound スカラー領域境界
compressible 圧縮性流れ用CFDツール
incompressible 非圧縮性流れ用CFDツール
wallDist 壁面境界に関する計算
後処理ライブラリ
incompressiblePostProcessing 比圧縮性流れのデータの後処理用ツール
sampling 領域における特定の場所での領域データの抽出用ツール
解法とメッシュ操作のライブラリ
cellDecompFiniteElement 有限要素スキームのセル分割
dynamicMesh 移動メッシュを持つシステムの解法
edgeMesh Foredge-basedメッシュ記述の操作のため
errorEstimation 誤差推定ツール
faceDecompFiniteElement Face decomposed 有限要素スキームの面分割
ODE 常微分方程式のソルバ
shapeMeshTools 標準形で定義されたセルを持つメッシュの操作のためのツール
meshToolsOpenFOAMメッシュ操作のためのツール
triSurface 標準三角surface-basedメッシュ記述の操作のため
ラグランジュ粒子追跡ライブラリ
dieselSpray ディーゼル噴霧追跡解スキーム
lagrangian 基本ラグランジュもしくは粒子追跡解スキーム
共有ドメインライブラリ
mico-2.3.13 共通オブジェクト・リクエスト・ブローカー・アーキテクチャ (CORBA)の実装
mpich-1.2.4 並列処理のための移植可能message-passingインターフェイス
zlib-1.2.1 汎用データの圧縮
さまざまなライブラリ
engine 計算エンジンのツール
Gstream 二次元グラフィックス流れ
randomProcesses分析と生成のランダムプロセスのツール

表 3.7: 一般的使用のための共有オブジェクトライブラリ


基本熱物理モデル -- basicThermophysicalModels
hThermo エンタルピーに基づく一般熱物理モデル計算
pureMixture パッシブガス混合物の一般熱物理モデル計算
燃焼モデル -- combustionThermophysicalModels
hMixtureThermo 混合気燃焼のエンタルピー計算
hhuMixtureThermo 不燃気体と混合気のエンタルピー計算
homogeneousMixture 標準燃料質量分率 b に基づく混合気燃焼
inhomogeneousMixture b と総燃料質量分率 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): f_t

に基づく混合気燃焼

veryInhomogeneousMixture b、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): f_t

と不燃燃料質量分率 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): f_u に基づく混合気燃焼

dieselMixture 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): f_t

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): f_u に基づく混合気燃焼

multiComponentMixture 複数の要素に基づく混合気燃焼[**]
chemkinMixture CHEMKIN熱力学と反応スキームデータベースファイルを使った混合気燃焼
層流火炎速度モデル -- laminarFlameSpeedModels
constLaminarFlameSpeed 一定層流火炎速度
guldersLaminarFlameSpeed Gülderの層流火炎速度モデル
液体の熱物理特性 -- <b>liquids
nHeptane nHeptaneの熱物理特性
nOctane nOctaneの熱物理特性
nDecane nDecaneの熱物理特性
nDodecane nDodecaneの熱物理特性
isoOctane isoOctaneの熱物理特性
diMethylEther diMethylEtherの熱物理特性
diEthylEther diEthylEtherの熱物理特性
water 水の熱物理特性
ガス種の熱物理特性 -- specie
perfectGas 理想気体に対する状態方程式
hConstThermo エンタルピー h とエントロピー s に関する一定比熱 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p

モデル

janafThermo h や s のようなJANAF熱力学テーブルの係数を持つ関数によって評価した構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p
specieThermo 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p

、h そして/または s から派生するような熱物理特性

constTransport 一定の輸送特性
sutherlandTransport 温度依存輸送特性のためのサザーランドの公式
熱物理特性の関数/表 -- thermophysicalFunctions
NSRDSfunctions 標準参照データシステム (NSRDS) - 米国化学工学会(AICHE)のデータ編集表
APIfunctions 蒸気拡散のための米国石油協会 (API) の関数
確率密度関数 -- pdf
RosinRammler ロジン・ラムラー分布
normal 正規分布
uniform 一様分布
exponential 指数分布
general 一般化分布
化学モデル -- chemistryModel
chemistryModel 化学反応モデル
chemistrySolver化学反応ソルバ

表 3.8: 熱物理モデルのライブラリ


非圧縮性流れ用乱流モデル -- incompressibleTurbulenceModels
laminar 層流用ダミー乱流モデル
kEpsilon 壁関数付き標準構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

RNGkEpsilon 壁関数付きRNG 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

NonlinearKEShih 壁関数付き非線形Shih 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

LienCubicKE 壁関数付きLien cubic 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

QZeta 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{q}-\zeta

モデル

LaunderSharmaKE Launder-Sharma 低-Re構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon
モデル
LamBremhorstKE Lam-Bremhorst低-Re構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon
モデル
LienCubicKELowRE Lien cubic 低-Re構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon
モデル
LienLeschzinerLowRE Lien-Leschziner 低-Re構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon
モデル
LRR 壁関数付きLaunder-Reece-Rodi RSTM
LaunderGibsonRSTM wall-reflection条件と壁関数付きLaunder-Gibson RSTM
SpalartAllmaras 外部流のためのSpalart-Allmaras 1-eqn mixing-lengthモデル
圧縮性流れ用RAS乱流モデル -- compressibleTurbulenceModels
laminar 層流用のダミー乱流モデル
kEpsilon 壁関数付き標準構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

RNGkEpsilon 壁関数付きRNG 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon

モデル

LaunderSharmaKE Launder-Sharma 低-Re構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mathit{k}-\epsilon
モデル
LRR 壁関数付きLaunder-Reece-Rodi RSTM
LaunderGibsonRSTM wall-reflection条件と壁関数付きLaunder-Gibson RSTM
Large-eddyシミュレーション(LES)フィルター -- LESfilters
laplaceFilter ラプラスフィルター
simpleFilter 単一フィルター
anisotropicFilter 異方性フィルター
Large-eddyシミュレーション差分 -- LESdeltas
PrandtlDelta プラントルデルタ
cubeRootVolDelta セル体積の立方根差分
smoothDelta 差分のスムージング
非圧縮LESモデル -- incompressibleLESmodels
Smagorinsky Smagorinskyモデル
Smagorinsky2 三次元フィルタ付きSmagorinskyモデル
dynSmagorinsky 同時Smagorinsky
scaleSimilarity スケール相似モデル
mixedSmagorinsky Smagorinskyとスケール相似の混合モデル
dynMixedSmagorinsky 同時Smagorinskyとスケール相似の混合モデル
oneEqEddy k-方程式eddy-viscosityモデル
dynOneEqEddy 同時k-方程式eddy-viscosityモデル
locDynOneEqEddy 局部同時k-方程式eddy-viscosityモデル
spectEddyVisc スペクトルeddy-viscosityモデル
LRDDiffStress LRR差応力モデル
DeardorffDiffStress Deardorff差応力モデル
SpalartAllmaras Spalart-Allmarasモデル
圧縮性LESモデル -- compressibleLESmodels
Smagorinsky Smagorinskyモデル
oneEqEddy k-方程式eddy-viscosityモデル
dynOneEqEddy 同時k-方程式eddy-viscosityモデル
lowReOneEqEddy 低-Re k-方程式eddy-viscosityモデル
DeardorffDiffStress Deardorff差応力モデル

表 3.9: 乱流モデルとLESモデルのライブラリ

非圧縮性流れ用輸送モデル -- incompressibleTransportModels
Newtonian 線形粘性流れモデル
CrossPowerLaw Cross Power低非線形粘性モデル
BirdCarreau Bird-Carreau非線形粘性モデル

表 3.10 移送モデルの共有オブジェクトライブラリ


[編集] 第4章 OpenFOAMのケース

本章では、OpenFOAMのケースのファイル構造と構成を取扱います。 通常,ユーザーはケースに名前を割り当てます(例えばチュートリアルのcavityの中の流れのケースは単純にcavityと名付けられています)。 この名前は、すべてのケースファイルとサブディレクトリが収納されているディレクトリの名前になります。 このケースディレクトリ自体はどこにでも置くことができますが、第2章の冒頭で述べたように、$HOME/OpenFOAM/${USER}-1.5のように、ユーザーのプロジェクトのサブディレクトリ、runの中に置くことを推奨します。 この利点の1つは、$FOAM_RUNの環境変数がデフォルトで$HOME/OpenFOAM/${USER}-1.5に設定されることです。 コマンドラインでプリセットエイリアス、runを実行することにより、素早くこのディレクトリに移動することができます。 OpenFOAMの配布の際に添付されているチュートリアルのケースは、ケースのディレクトリ構造の有用な例を提供しています。 チュートリアルは$FOAM_TUTORIALSのディレクトリに置かれており、コマンドラインでtutエイリアスを実行することにより素早くたどり着けます。 この章を読みながら,チュートリアルの例を参照して下さい。


[編集] 4.1 OpenFOAMのケースのファイル構造

アプリケーションを実行するために必要な最小限のファイルを含む、OpenFOAMケースの基本的なディレクトリ構造を図4.1に示し、以下で説明します。

図4.1: ケースディレクトリの構造

constantディレクトリ
サブディレクトリのpolyMesh内のケースメッシュと物理的性質を定めるファイルの完全な説明と関連するアプリケーション、例えばtransportPropertiesを含みます。
systemディレクトリ
解析の手順そのもののためのパラメータの設定に関するディレクトリです。少なくとも以下の3つのファイルを含みます。パラメータが開始/終了時間や時間ステップおよびデータのアウトプットのためのパラメータを含んでいるようにコントロールを実行するcontrolDict、実行時に選択される解析に使われるスキームを記述しているfvSchemes、そして方程式のソルバ、許容誤差およびその他のアルゴリズム制御を実行のために設定するfvSolutionです。
‘時刻’ディレクトリ
特定領域のためにデータの個別のファイルを持っています。データは、問題を定義するためにユーザーが指定する初期値と境界条件、または書き込まれたOpenFOAMのファイルの結果として存在し得ます。OpenFOAMのフィールドは、定常状態の問題のように厳密に解く必要のない場合であっても,常に初期化する必要があることに留意して下さい。各タイムディレクトリの名称は、データが書き込まれた時点のシミュレーションが行われた時間に基づいており、詳細については4.3に記述されています。私達は通常時間通常$t=0$で私達のシミュレーションを始めて、初期の条件は指定された名前のフォーマットに依存して0または0.000000e+00と名付けられたディレクトリの中に通常収納されるため、十分といえます。例えば,cavityのチュートリアルで,速度場のUと圧力場のpそれぞれファイルO/UO/pから初期化されます。


[編集] 4.2 基本的な入出力ファイルのフォーマット

OpenFOAMは、文字列、スカラー、ベクトル、テンソル、リスト、およびフィールド等のデータ構造の範囲を読み込む必要があります。入出力(I/O)ファイルのフォーマットはユーザーがOpenFOAMのアプリケーションをできる限り容易に修正できるよう、非常にフレキシブルに設計されています。このI/Oは、ファイルの作成が非常に簡単に理解しやすい単純なルール類に従っているものであり、ファイルの書式は特に難しいものではなく直感的に理解できる多くのソフトウエアパッケージを持っていますが、これらについては特に記載はしておりません。OpenFOAMのファイルフォーマットの書式についての説明は次のセクションで行います。

[編集] 4.2.1 一般的な構文規則

フォーマットは以下のC++ソースコードのいくつかの一般的な原理に従います。

  • ファイルは自由な形式を持ち、不特定のどんなカラムにも割り当てられ,複数行にわたる場合の指示を指定する必要はありません。
  • //のコメントデリミターでOpenFOAMは最後の行までテキストを無視しますが,その他については、行は特に意味を持っていません。
  • 複数行にわたるコメントは,/*と*/で囲んで終了させます。

[編集] 4.2.2 辞書

OpenFOAMは,データを特定する最も一般的な手段としてディクショナリを用いています。ディクショナリは、keywordを用いて、I/Oにより読み出すことができるセットとしてデータエントリーを含んでいます。キーワードの見出し語は一般的な形式に従います。

<keyword>  <dataEntry1> ... <dataEntryN>; 

ほとんどの入力項目は単一のデータ入力の書式になっています:

<keyword>  <dataEntry>;

ほとんどのOpenFOAMのデータファイルはそれ自体1セットのキーワード入力を含む辞書です。辞書は論理的なカテゴリにエントリーを構成するための手段を提供しており、階層的に指定できるので、どんな辞書もそれ自体が1つ以上の辞書エントリーを含んでいます。辞書の方式は以下のように波括弧{}で囲まれた入力に従い、辞書名を指定します。

<dictionaryName> 
{ 
    ... keyword entries ... 
}

[編集] 4.2.3 データファイルヘッダー

OpenFOAMによって読み書きされるすべてのデータファイルは、表4.1に記載されており、キーワード入力の標準セットを含むFoamFileと名付けられた辞書から始まる。表は、

キーワード説明入力
version入出力形式のバージョン2.0
formatデータ形式ascii / binary
location"..."ファイルへのパス(オプション)
class関連するデータファイルから構成されたOpenFOAMのクラス一般的にdictionaryもしくは領域 例:volVectorField
objectファイル名例:controlDict

表 4.1: データファイルのためのヘッダーのキーワード入力


おそらくクラスの注目すべき例外はあるものの、ほとんどの入力において十分な各入力の短い説明を提供します。クラスの入力はファイル内のデータから構成されるOpenFOAMライブラリでのC++クラスの名前です。読み込まれるファイル呼び出す基礎的なコードの知識やOpenFOAMクラスの知識がなくては、ユーザーはおそらくクラスの入力を正確に推測することはできません。しかし、単純なキーワード入力を持つほとんどのデータファイルは内部のディクショナリクラスの中に読に読み込まれ、それゆえそれらの場合、クラスの入力はディクショナリとなります。

以下の例は今のところ記載されている入力のタイプを使ったケースへのデータ供給のキーワードの使い方を示しています。fvSolutionディクショナリファイルからの解凍には2つの辞書、ソルバ、PISOを含みます。ソルバ辞書はソルバのための複数のデータ入力とpとUそれぞれのキーワードによって表現される圧力方程式と速度方程式それぞれのための許容誤差を含み、PISO辞書は制御アルゴリズムを含みます。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 
24   
25  solvers 
26  { 
27      p PCG 
28      { 
29          preconditioner   DIC; 
30          tolerance        1e-06; 
31          relTol           0; 
32      }; 
33   
34      U PBiCG 
35      { 
36          preconditioner   DILU; 
37          tolerance        1e-05; 
38          relTol           0; 
39      }; 
40  } 
41   
42  PISO 
43  { 
44      nCorrectors     2; 
45      nNonOrthogonalCorrectors 0; 
46      pRefCell        0; 
47      pRefValue       0; 
48  } 
49   
50   
51  // ************************************************************************* // 

[編集] 4.2.4 リスト

OpenFOAMアプリケーションは、例えば頂点のリストはメッシュ記述のために調節するリストを含んでいます。リストは一般的にI/Oにあり独自のフォーマットを持っていて、入力は丸括弧( )内にされます。また、丸括弧の前のフォーマットの選択もあります。

simple
キーワードに続いてすぐに丸括弧がくる。
    <listName> 
    ( 
        ... entries ... 
    ); 
numbered
キーワードに続いてリスト内の要素数<n>がくる。
    <listName> 
    <n> 
    ( 
        ... entries ... 
    ); 
token identifier
キーワードに続いてクラス名の識別子ラベル<Type>がくる。<Type>はリストに何が入っているかを記載したもので、例えばスカラーエレメントのリストであれば次のようになる。
    <listName> 
    List<scalar> 
    <n>        // optional 
    ( 
        ... entries ... 
    ); 

ここで留意すべきはリスト<scalar>での<scalar>は一般名ではなく入力された実際の文字列です。単純なフォーマットは、リストを書くときの便利な方法です。その他のフォーマットはリストのサイズがデータを読み込む前にメモリーに割り当てられるのでコードがより早くデータを読み込めます。それゆえ単純なフォーマットは読み込み時間が最小の短いリストに適しており、その他のフォーマットは長いリストに適しています。

[編集] 4.2.5 スカラーとベクトル、テンソル

スカラーはデータファイルでは表示された一つの数字である。ベクトルはランク1のVectorSpaceで3次元であり、要素数はいつも3に決まっているので単純なリストフォーマットで使われる。それゆえ、ベクトル(1.0,1.1,1.2)は次のように書かれる。

(1.0 1.1 1.2) 

OpenFOAMでは、テンソルはランク2のVectorSpaceで3次元であり、それゆえデータ入力はいつも9つの実数と決まっている。それゆえプログラマーズガイドのセクション1.3.7中で説明されている同一のテンソルは以下のように書かれる。

( 
    1 0 0 
    0 1 0 
    0 0 1 
) 

この例は入力が複数の行に上書きできるようにOpenFOAMがその行に戻るのを無視する方法をしめしています。一行に数字を羅列することと扱いは違いません。

( 1 0 0 0 1 0 0 0 1 ) 

[編集] 4.2.6 次元ユニット

連続体力学では、プロパティはある決められた単位で表現されます。例えば、質量ならキログラム(kg)、体積なら立法メートル(㎥)、圧力ならパスカル(kgms-2)というように。代数の演算は統一した測定単位を用いて実行されなければなりません。特に、足し算、引き算、および等式は同じ次元の単位の物理的特性においてのみ意味があります。無意味な操作を実行することへの安全装置として、OpenFOAMはフィールドデータと物理的特性に次元を付けて、どのようなテンソル操作についても次元をチェックして実行します。 dimensionSetの入出力形式は角括弧内の7つのスカラ量です。 例えば、

[0 2 -1 0 0 0 0]
No. プロパティ SI単位系 USCS単位系
1 質量 キログラム(kg) ポンド(lbm)
2 長さ メーター(m) フィート(ft)
3 時間 秒(s)
4 温度 ケルビン(K) ランキン温度(o)
5 物質量 キログラム-モル(kgmol) ポンド-モル(lbmol)
6 電流 アンペア(A)
7 光度 カンデラ(cd)

表 4.2: SIとUSCSの基本単位

表4.2に記載するように各値は計測基準単位のそれぞれの物理量に対応しています。表はSystème International (SI)とthe United States Customary System (USCS) の基本単位ですがOpenFOAMはどの単位系も使えます。要求されることは入力データが選択した単位に合っているということです。特に重要なのは、OpenFOAMがいくつかの次元化された物理定数を必要とするということを知っておくことです。例えば熱力学のモデル化したある計算のための一般気体定数 R などがいい例です。これらの次元定数はOpenFOAMインストール($WM_PROJECT_DIR/etc/controlDict)のメインcontrolDictファイルのDimensionedConstantサブディクショナリで指定されます。デフォルトでは、これらの定数はSI単位系で設定されます。USCSもしくはその他の単位系を使用したい場合は、選択した単位系に合わせてこれらの定数を変更してください。

[編集] 4.2.7 次元付の型

物理特性は一般にそれらの関連する次元によって特定されます。これらの入力は、dimensionedScalarの以下の例が示すフォーマットを持っています。

nu             nu  [0 2 -1 0 0 0 0]  1; 

最初のnuはキーワード、二番目のnuはクラスのwordの名前で、通常キーワードと同じものが選ばれる。その次の入力はdimensionSetで最終的な入力はスカラ値です。

[編集] 4.2.8 フィールド

OpenFOAMの入出力データの多くはテンソルフィールド、例えば速度や圧力のデータにあり、タイムディレクトリから読み込みタイムディレクトリに書き込まれます。表4.3中で説明されるように、キーワード入力を使って、OpenFOAMはフィールドデータを書きこみます。

キーワード説明
dimensions領域の次元[1 1 -2 0 0 0 0]
internalField内部領域の値uniform (1 0 0)
boundaryField境界領域4.2.8のファイル参照

表4.3 フィールド辞書で使われる主なキーワード

そのデータはそれ自体のdimentionの入力から始まり、次にreferenceLevel値が続きます。フィールド変数は基準レベルの入力と関連した値として保存されます。基準レベルは通常0に設定されるが解法の正確さを改善させるために他の値に設定することもできます。これに続いて、ひとつの例として以下のような方法で書かれるinternalFieldがあります。

一様フィールド
ただひとつの値にそのフィールド内で全ての要素が対応していて、以下のようなフォームをとります。
internalField uniform <entry>; 
非一様フィールド
各フィールドの要素は、固有の値を割り当てられ、リストの識別子トークンフォームにある以下のフォームを取ることが推奨されます。
internalField nonuniform <List>; 

boundaryFieldはpolyMeshディレクトリ内のboundaryファイルにある境界パッチのそれぞれの名前に対応する名前の一連の入力を含んだ辞書である。各パッチの入力はそれ自体がキーワード入力のリストを含む辞書となります。強制的な入力、typeはパッチのフィールドを分類するためのフィールド条件を書きます。残りの入力は選択されたパッチのフィールド条件のタイプに対応し、一般的にはパッチフェイスで初期条件を分類するフィールドデータを含みます。OpenFOAMで使えるパッチのフィールド条件は説明とそれを分類するデータともに表6.2と表6.3に記載してあります。速度Uのフィールドの辞書入力の例を以下に示します。

23  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 
24   
25   
26  dimensions      [0 1 -1 0 0 0 0]; 
27   
28  internalField   uniform (0 0 0); 
29   
30  boundaryField 
31  { 
32      movingWall 
33      { 
34          type            fixedValue; 
35          value           uniform (1 0 0); 
36      } 
37   
38      fixedWalls 
39      { 
40          type            fixedValue; 
41          value           uniform (0 0 0); 
42      } 
43   
44      frontAndBack 
45      { 
46          type            empty; 
47      } 
48  } 
49   
50   
51  // ************************************************************************* // 

[編集] 4.2.9 ディレクティブとマクロ置換

OpenFOAMのケースファイルを柔軟に設定するためのディレクティブや代替マクロといったオプションのファイル構文があります。ディレクティブはケースファイル内で#から始まるコマンドとして記述されます。代替マクロは$から始まります。

OpenFOAMでは現在2種類のディレクティブが利用可能できます。

  • #include "<fileName>":<fileName>という名前のファイルを読み込む
  • #inputMode:2つのオプションがある。mergeは連続する辞書のキーワードのエントリを統合する。つまりある場所で指定されたキーワードのエントリを継承して以後の同一キーワードのエントリが指定される。overwriteは辞書全体を上書きする。通常はmergeを使う。

一度使われた圧力の初期値を、内部フィールドと境界の初期値に設定する例を示します。以下の記述を含むinitialConditionsというファイルを作成していたとします。

pressure 1e+05;
#inputMode merge

この圧力をフィールド内部と境界に用いるために、以下の代替マクロを圧力場のファイルpに記述します。

#include "initialConditions"
internalField $pressure
boundaryField
{
    patch1
    {
        type fixedValue;
        value $pressure;
    }
}

あくまでもこれはこの機能のはたらきを提示するだけの、単純でつまらない例です。 この機能はケースデータを要求を満たすよう一般化する手段としてなど、多くのより便利な使い方で用いることができます。 例えば同一のRSA乱流モデルの設定を用いるケースがいくつかある場合、その設定を記述したファイルを一つ作成し、各ケースのRSAPropertiesファイルにincludeによって組み込めばよいのです。 代替マクロは単独の値にとどまりません。 例えば、単独のマクロで境界条件のまとまりを事前に定義して、それを呼び出すことができます。 適用範囲はほぼ限りないといえるでしょう。


[編集] 4.3 時間とデータの入出力制御

OpenFOAMのソルバは全て、データベースをセットアップすることによって、動き始めます。 データベースは入出力を制御し、またデータの出力は通常実行中、時間ごとに要求されるので、時間はデータベースにとって不可避の要素です。controlDict辞書はデータベースの作成に不可欠な入力パラメタを設定します。controlDictのキーワード入力項目は表4.4に記載されています。時間制御方式とwriteInterval入力だけは完全に強制的で、省略できる任意の項目には表4.4で示されたデフォルト値のデータベースが用いられます。

時間制御
startFrom 解析の開始時間の制御
- firstTime 時間ディレクトリの設定から初期のタイムステップ
- startTime startTimeの項目の入力により定める時間
- latestTime 時間ディレクトリの設定で最近のタイムステップ
startTime startFromのstartTimeを用いた解析の開始時間
stopAt 解析の終了時間の制御
- endTime endTimeの項目の入力により定める時間
- writeNow 現在のタイムステップで解析を止めデータを書き出す
- noWriteNow 現在のタイムステップで解析を止めデータは書き出さない
- nextWrite writeControlで指定した次のデータ書き出しのタイムステップで解析を止める
endTime stopAtのendTimeで指定した解析の終了時間
deltaT 解析の時間間隔
データの書き出し
writeControl ファイルへのデータの書き出しのタイミングの制御
- timeStep† タイムステップのwriteInterval毎にデータを書き出す
- runTime</t> 解析時間の秒のwriteInterval毎にデータを書き出す
<tt>- adjustableRunTime 解析時間の秒のwriteInterval毎にデータを書き出す、必要ならタイムステップをwriteIntervalと一致するように調整する--自動タイムステップ調整を行う場合に使用する。
- cpuTime CPUの時間の秒のwriteInterval毎にデータを書き出す
- clockTime 実時間の秒のwriteInterval毎にデータを書き出す
writeInterval 上記のwriteControlと関連して用いられるスカラー
purgeWrite 周期的ベースで時間ディレクトリを上書きすることによって保存される時間ディレクトリの数の限界を表す整数。 例:t0=5s,derutat=1s,purgeWrite 2s;8のデータが6に上書きされたり9のデータが7に上書きされる前に6と7、2つのディレクトリに書かれたデータ。

時間ディレクトリ限界を無効にするには、purgeWrite 0とする。†

定常状態解析では、以前の反復計算の結果をpurgeWrite 1とすることで連続して上書きできる。

writeFormat データファイルのフォーマットを指定する
- ascii† ASCIIフォーマット、writePrecisionの有効桁まで書かれる
- binary バイナリー・フォーマット
writePrecision 上記のwriteFormatに関連して使用される整数、デフォルトでは6.
writeCompression  データファイルの圧縮を指定する
- uncompressed 非圧縮†
- compressed gzip圧縮
timeFormat 時間ディレクトリのネーミングのフォーマットの選択
- fixed ±m.ddddddのdの数がtimePrecisionで決められる
- scientific ±m.dddddde±xxのdの数がtimePrecisionで決められる
- general† 指数が−4未満もしくはtimePrecisionで指定された指数以上のときscientificのフォーマットを指定する
timePrecision 上記のtimeFormatに関連して使用される整数、デフォルトでは6
graphFormat アプリケーションによって描かれるグラフデータのフォーマット
- raw† 横書きの生のASCII形式
- gnuplot gnuplot形式のデータ
- xmgr Grace/xmgr形式のデータ
- jplot jPlot形式のデータ
データの読み込み
runTimeModifiable controlDictのようないずれかの辞書のyes†/noスイッチは各タイムステップの始めにOpenFOAMによって再度読み込まれる。
Run-time loadable functionality
libs ランタイムにロードする($LD_LIBRARY_PATH上の)追加ライブラリのリスト。例えば( "libUser1.so" "libUser2.so" )
functions 機能のリスト。例えばランタイムにロードするprobesは$FOAM_TUTORIALSの例を見る。
† 関連キーワードが省略されるなら、デフォルト入力を表示します。

表4.4:controlDict辞書のキーワード項目


以下にcontrolDict辞書の入力例を示します。

17  application icoFoam; 
18   
19  startFrom       startTime; 
20   
21  startTime       0; 
22   
23  stopAt          endTime; 
24   
25  endTime         0.5; 
26   
27  deltaT          0.005; 
28   
29  writeControl    timeStep; 
30   
31  writeInterval   20; 
32   
33  purgeWrite      0; 
34   
35  writeFormat     ascii; 
36   
37  writePrecision  6; 
38   
39  writeCompression uncompressed; 
40   
41  timeFormat      general; 
42   
43  timePrecision   6; 
44   
45  runTimeModifiable yes; 
46   
47  // ************************************************************************* //


[編集] 4.4 数値スキーム

systemディレクトリにあるfvSchemes辞書は、アプリケーションの実行時に現われる、方程式における導関数等の項に対する数値スキームを設定します。 この節では、fvSchemes辞書においてどのように、これらのスキームを指定するかを説明します。 スキームの数学的な解説は、プログラマーズガイドの2.4節を見てください。

fvSchemesにおいて数値スキームを割り充てなければならない典型的な項は、例えば空間勾配構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla といった導関数項や、一つの点集合から他の集合へと値を補間する項等です。 OpenFOAMでは、ユーザーに制限無くスキームを選択できるようにしたいと思っています。 例えば、線形補間は多くのケースで効率的ですが、OpenFOAMでは、全ての補間項に対して幅広い補間スキームの中から自由に選択ができるようになっています。

導関数項では、より一層この選択の自由が顕著です。 ユーザーは、まず離散化手法を選択することができますが、ここではガウスによる有限体積積分を用いるのが一般的です。 ガウス積分は格子の界面における値を足していくことで実現されますが、界面での値は格子中心での値から補間しなければなりません。 この補間スキームにおいてもユーザは自由に選ぶことができ、特定の導関数項、特に対流項に用いる発散項構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot には、特別に設計されたいくつかのスキームが用意されています。 数値スキームを指定しなければならない項はいろいろありますが、それらはfvSchemes辞書において表4.5に示すカテゴリに分類されます。 表4.5における各キーワードはサブ辞書の名前ですが、それらは各々特定のタイプの項を持っているわけです。 例えば、gradSchemesにはgrad(p)(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p と表現される)といった全ての勾配項があります。 その他の例は、以下に示したfvSchemes辞書の抜粋をご覧ください。

キーワード 数学的タームのカテゴリ
interpolationSchemes 2点間の値の補間
snGradSchemes 格子界面の法線方向勾配の各要素
gradSchemes 勾配 ∇
divSchemes 発散 ∇・
laplacianSchemes ラプラシアン ∇2
timeScheme 1次と2次の時間導関数 ∂/∂t,∂2/∂2t
fluxRequired フラックスの生成が必要な物理量

表4.5: fvSchemesで使用する主なキーワード

17  ddtSchemes 
18  { 
19      default         Euler; 
20  } 
21   
22  gradSchemes 
23  { 
24      default         Gauss linear; 
25      grad(p)         Gauss linear; 
26  } 
27   
28  divSchemes 
29  { 
30      default         none; 
31      div(phi,U)      Gauss linear; 
32  } 
33   
34  laplacianSchemes 
35  { 
36      default         none; 
37      laplacian(nu,U) Gauss linear corrected; 
38      laplacian((1|A(U)),p) Gauss linear corrected; 
39  } 
40   
41  interpolationSchemes 
42  { 
43      default         linear; 
44      interpolate(HbyA) linear; 
45  } 
46   
47  snGradSchemes 
48  { 
49      default         corrected; 
50  } 
51   
52  fluxRequired 
53  { 
54      default         no; 
55      p; 
56  } 
57   
58  // ************************************************************************* //

この例を見るとfvSchemes辞書は以下の要素から成りたっていることがわかります。

  • 6...Schemesのサブ辞書には、指定した各項に対するキーワードが書いてあり、defaultのキーワードも指定できますが、その他にも、例えば構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p

についてはgrad(p)というように、特定の項に対して名前を書くことで、それに対応するキーワードを指定することが出来ます。

  • fluxRequiredのサブ辞書には、例えばpのように、アプリケーションの中でフラックスが生成される場が書かれています。


もし、defaultのスキームが特定の...Schemesの副辞書で指定された場合には、副辞書が参照している全ての項にそのスキームが適用されます。 例えば、gradSchemesにおいてdefaultが指定されている場合には、アプリケーションにおける構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla \textrm{\bold{U}} といった全ての勾配項に対して、そのスキームが適用される訳です。 defaultが指定されている時には、その副辞書において各項のスキームをいちいち指定する必要がなくなります。 この例では、grad(p)grad(U)の行がそれです。 しかしながら、特定の項の行が挿入された場合、その項に対しては、指定されたスキームがdefaultより優先されます。

代わりに、ユーザーはnoneエントリーにより、あえてdefaultスキームを使わないようにもできます。 この場合には、ユーザーはその副辞書の中の全ての項を個々に指定しなければなりません。 defaultは上書きすることができるのですから、defaultnoneを設定することはやりすぎかもしれません。 しかしながら、noneを指定することは、ユーザーに全ての項を個別に指定しなければならないことから、そのアプリケーションに実際にどの項が存在するかを明白にするという点では有用です。

次の節では、表4.5に示したそれぞれのカテゴリーの項について、選択できるスキームを述べます。

[編集] 4.4.1 補間スキーム

interpolationSchemes副辞書には、通常、セル中心から界面中心へ値を内挿する項があります。 OpenFOAMでの内挿スキームの選択肢を表4.6に示しますが、これは4つのカテゴリに分けられます。 1つのカテゴリは一般的なスキームが、そして他の3つのカテゴリは、4.4.5節で説明するように、主に流体での対流(発散)項のガウスの離散化と一緒に使われるものです。 ユーザーがinterpolationSchemes副辞書において、対流特有のスキームを一般的なフィールドの内挿に適用することは、「ほとんどない」のですが、有効な内挿スキームとして4.4.5節よりもむしろここで説明しておきます。 なお、UMISTのようなスキームもOpenFOAMでは利用可能なことに注意すべきですが、一般的に推奨されるスキームのみを表4.6に示します。

普通のスキームは、単にキーワードとエントリーのみを記すことで指定でき、例えばlinearスキームをdefaultとして指定するには以下のようにします。

default linear;

対流特有のスキームは、流れの速度による流束に基づいて内挿を行います。 これらのスキームを指定する場合には、内挿のベースとなる流束場の名前が必要ですが、ほとんどのOpenFOAMのアプリケーションでは、これはphiとなっており、この名前は、通常、surfaceScalarFieldの速度の流束構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi に対応するものです。 このガイドの中では、対流特有のスキームの3つのカテゴリーは、general convection, normalised variable (NV), そして、total variation diminishing (TVD)と記述されます。 blendedスキームを除いて、general convectionとTVDスキームは、そのスキーム名と流束場によって指定され、例えば流束phiに基づくupwindスキームをdefaultとして指定するには以下のようにします。

default upwind phi;

いくつかのTVD/NVDスキームには、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 0 \le \psi \le 1 の範囲の係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が必要ですが、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi=1 はTVD条件に従うことに対応し、通常最も良い収束性を示すのに対し、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =0 は最も良い精度を与えます。 通常構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =1 での実行がお勧めです。 流束phiに基づく構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =1.0 でのlimitedLinearスキームを、defaultとして指定するには以下のようにします。

default limitedLinear 1.0 phi;
[編集] 4.4.1.1 厳密に範囲が限定されるスカラー量に対するスキーム

厳密に範囲が限定される必要のあるスカラ量のために、いくつかの制限付きスキームという拡張版があります。 ユーザーが指定した範囲に限定するためには、スキームの名前にはlimitedという語が頭に付けられ、下限と上限それぞれを続けて指定します。 例えば、vanLeerスキームを-2と3の間で厳密に制限するためには、次のように指定します。

default limitedVanLeer -2.0 3.0;

良く使われる0と1の間で限定されるスカラー場のために特化された版もあります。 それらは、スキームの名前に01を付けることで選択できます。 例えば、vanLeerスキームを0と1の間で厳密に限定するためには、以下のように指定します。

default vanLeer01;

厳密に範囲が限定する拡張版は、limitedLinear, vanLeer, Gamma, limitedCubic, MUSCL, SuperBeeのスキームで利用することができます。

[編集] 4.4.1.2 ベクトル場に対するスキーム

ベクトル場に対する制限付きスキームについては、場の方向を考慮にいれて構成された制限を行なう改良版があります。 これらのスキームは、通常のスキームの名前に'V'を加えることで選択することができ、limitedLinearに対してはlimitedLinearVといった具合です。 これら'V'版はlimitedLinearVvanLeerVGammaVlimitedCubicVSFCDVといったスキームで利用することができます。

中心スキーム
linear 線形補間 (中心差分)
cubicCorrection 体積スキーム
midPoint 均等重み付け線形補間
風上対流スキーム
upwind 風上差分
linearUpwind 線形風上差分
skewLinear ひずみ補正付き線形
QUICK 二次風上差分
TVDスキーム
limitedLinear 有限線形差分
vanLeer van Leer リミッター
MUSCL MUSCL リミッター
limitedCubic 体積リミッター
NVDスキーム
SFCD 自動フィルター中心差分
Gamma ψ ガンマ差分

表 4.6: 補間スキーム

[編集] 4.4.2 表面法線方向勾配スキーム

snGradSchemes副辞書は、表面法線方向勾配の項によるものです。 表面法線方向勾配は、格子の界面で評価されますが、それは、界面が接続している2つの格子の中心における値の勾配の、界面の法線方向の成分です。 表面法線方向勾配は、それ自体を使うためにも指定されますが、ガウス積分を使ってラプラス項を評価する際にも必要となります。

利用可能なスキームを表4.7に示しますが、これらは単にキーワードとエントリーを記述することで指定できます。 ただ、limitedは例外で、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 0 \lt \psi \lt 1 の範囲の係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi を必要とします。

ここで、

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \Psi = \left\{\begin{array}{ll} 0 & {\rm corresponds to uncorrected,} \\ 0.333 & {\rm non-orthogonal correction \leq 0.5 \times orthogonal part,} \\ 0.5 & {\rm non-orthogonal correction \leq orthogonal part,} \\ 1 & {\rm corresponds to corrected.} \\ \end{array}\right.

です。

よって、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi=0.5limitedスキームをdefaultとして指定するには次のようにします。

default limited 0.5;
スキーム 説明
corrected 陽的非直交補正
uncorrected 非直交補正なし
limited ψ 有限非直交補正
bounded ポジティブスカラーの有界補正
fourth 四次元

表4.7: 表面法線方向勾配スキーム

[編集] 4.4.3 勾配スキーム

gradSchemes副辞書には勾配項を記述します。 各項の離散化スキームは、表4.8の中から選択することができます。

離散化スキーム説明
Gauss 一次のガウス積分
leastSquares 二次の最小二乗法
fourth 四次の最小二乗法
limited 上記のスキームの制限バージョン

表4.8: gradSchemesにおいて使用できる離散化スキーム

leastSquaresfourthの場合には、離散化スキームの指定は次のようにそのスキーム名を指定するだけで十分です。

grad(p) leastSqueares;

Gaussキーワードは、ガウス積分による標準的な有限体積法の離散化を指定するもので、これは、格子の中心から界面の中心への値の内挿を必要とします。 このため、Gaussエントリーでは、表4.6のような内挿スキームを続けて指定する必要があります。 一般的な内挿スキーム以外を選択することはほとんど無く、ほとんどのケースでは次のようにlinearスキームを選ぶのが効率的です。

grad(p) Gauss linear;

3つの基本的な勾配スキーム(Gauss, leastSquares, fourth)の範囲限定版は、次のlimited Gauss スキームの例のように、離散化スキームの前にlimitedを付けることで選択できます。

grad(p) limited Gauss linear;

[編集] 4.4.4 ラプラシアン スキーム

laplacianSchemes副辞書にはラプラス項を記述します。 流体力学の中で見られる構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\nu\nabla\textrm{\bold{U}}) といった典型的なラプラス項をどのようにエントリーに記述するかというと、laplacian(nu, U)といったword識別子で与えます。 離散化手法として選べるのはGaussスキームだけですが、さらに拡散係数(この例では構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nu )の内挿スキームや、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\textrm{\bold{U}) に対する表面法線方向勾配スキームの両方を選択する必要があります。 つまり、このエントリーは以下のようになります。

Gauss <interpolationScheme> <snGradScheme>

内挿スキームは表4.6から選択しますが、通常は一般的なスキームから選択され、ほとんどの場合linearにします。 表面法線方向勾配スキームは表4.7から選択し、表4.9に書かれているようにスキームの選択は数値的性質を決定します。 先の例でのラプラス項の典型的なエントリーは以下のようになります。

laplacian(nu, U) Gauss linear corrected;
スキーム数値的性質
corrected 無制限、二次、保守的
uncorrected 制限、一次、非保守的
limited ψ 補正と非補正の混合
bounded 制限スカラーの一次
fourth 無制限、四次、保守的

表4.9: laplacianSchemesにおける表面法線方向スキームの性質

[編集] 4.4.5 発散スキーム

divSchemes副辞書には発散項を記述します。 流体力学の中で見られる典型的な対流項構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\rho\textrm{\bold{U}}\textrm{\bold{U}}) はどうように記述するかというと、OpenFOAMのアプリケーションでは通常div(phi, U)という識別子で与えます。 ここでphiはフラックス構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi=\rho\textrm{\bold{U}} です。

離散化手法として選べるのはGaussスキームだけですが、さらに対象の場(この例では構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \textrm{\bold{U}} )の内挿スキームを選択する必要があります。 つまり、このエントリーは以下のようになります。

Gauss <interpolationScheme>

内挿スキームは、一般的なもの以外にも対流特有のものも含め、表4.6の中から選択します。 表4.10に示すように、これらスキームにより数値的性質が大きく変わってきます。 対流特有の内挿スキームを指定する場合でも、流束は特定の項として既に値がわかっているものとし、流束の内挿スキームは記述しません。 つまり、例えばdiv(phi, U)の場合では、流束はphiとして既知ですので、さらにその内挿スキームを指定すると矛盾が生じるだけです。 よって、先の例での風上型内挿スキームの指定は次のようになります。

div(phi, U) Gauss upwind;


スキーム数値的性質
linear 二次、無制限
skewLinear 二次、(より) 無制限、ひずみ補正
cubicCorrected 四次、無制限
upwind 四次、制限
linearUpwind 一次/二次、制限
QUICK 一次/二次、制限
TVD schemes 一次/二次、制限
SFCD 二次、制限
NVD schemes 一次/二次、制限

表4.10: divSchemesにおいて使用される補間スキームの性質

[編集] 4.4.6 時間スキーム

一次の時間微分項(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \partial/\partial t )は、ddtSchemes副辞書で指定します。 各項に対する離散化スキームは表4.11から選ぶことができます。

CrankNicholsonスキームでは、Eularスキームと混合させる割合を決める係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi を用います。 係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が1の場合には純粋なCrankNicholson構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が0の場合は純粋なEularに対応します。 純粋なCrankNicholsonでは不安定なケースにおいては、混合係数をいじることで計算を安定化させることができることがあります。


スキーム 説明
Euler 一次、制限、陰的
CrankNicholson ψ 二次、制限、陰的
backward 二次、陰的
steadyState 時間導関数について解かない

表4.11: ddtSchemesにおいて使用可能な離散化スキーム

時間スキームを指定するときは、非定常問題用のアプリケーションは定常状態で実行する必要はなく、またその逆も同じであることに注意してください。 例えば、非定常の層流非圧縮流れのコードであるicoFoamを実行するときに、steadyStateを指定したら、おそらく解は収束しないので、定常の非圧縮流れのためにはsimpleFoamを使うべきです。

2次時間微分項は、d2dt2Schemes副辞書の中で指定します。 d2dt2Schemesとしては、Eulerスキームのみが利用可能です。

[編集] 4.4.流束の算出

fluxRequired副辞書には、アプリケーションの中で流束を生成する場を書き出します。 例えば、多くの液体力学アプリケーションでは、圧力の方程式を解くと流束が生成するので、そのようなケースではfluxRequired副辞書には単に圧力のためのword識別子であるpを記載します。

fluxRequired
{
    p;
}


[編集] 4.5 解法とアルゴリズム制御

方程式のソルバ(求解機)、公差、およびアルゴリズムはシステム・ディレクトリのfvSolution辞書から制御されます。以下に示すのは、icoFoamソルバに必要なfvSolution辞書からの入力例です。

17  solvers
18  {
19      p PCG
20      {
21          preconditioner   DIC;
22          tolerance        1e-06;
23          relTol           0;
24      };
25  
26      U PBiCG
27      {
28          preconditioner   DILU;
29          tolerance        1e-05;
30          relTol           0;
31      };
32  }
33  
34  PISO
35  {
36      nCorrectors     2;
37      nNonOrthogonalCorrectors 0;
38      pRefCell        0;
39      pRefValue       0;
40  }
41  
42  // ************************************************************************* //

fvSolutionは実行されるソルバ特有のサブ辞書を含んでいます。しかし、標準のソルバに使われる大部分については標準のサブ辞書の小さなセットがあります。これらのサブ辞書はこのセクションの後半で説明するsolvers、relaxationFactors、PISO、およびSIMPLEを含んでいます。

[編集] 4.5.1 線形ソルバ制御

 例に挙げた最初のサブ辞書やすべてのソルバアプリケーションのサブ辞書はsolversです。それは各離散化方程式に使用されるそれぞれの線形ソルバを指定します。強調して言っておきますと特定の問題を解くために方程式とアルゴリズムを書いたアプリケーションソルバとは対照的にこのタームの線形ソルバは線形方程式の解の演算方法になります。‘線形ソルバ'という言葉は以下意味が明確な場合には‘ソルバ'と省略して使うこともあります。用語の文脈においていかなる曖昧も避けたいと思います。 ソルバの中の各項目の構文は特定の方程式で解かれる変数に関連するキーワードで始まります。例えば、icoFoamは速度Uと圧力pの方程式、つまりUとpの項を解きます。変数名の後にソルバが使用するパラメタを含むソルバ名と辞書が続きます。OpenFOAMで使えるソルバを表4.12で記載します。toleranceを含むrelTol、preconditionerなどのパラメタは次の節で説明します。


ソルバキーワード
初期条件付き共役勾配 PCG/PBiCG†
スムーサーを使ったソルバ smoothSolver
汎用幾何学的代数マルチグリッド GAMG
†PCGは対称用、PBiCGは非対称用

表4.12:線形ソルバ

ソルバは左右対称のマトリクスと非対称のマトリクスを区別します。行列の対称は解かれている方程式の構造に依存し、ユーザーがこれを決定するこも可能ですが、例えばOpenFOAMが不適当なソルバーが選ばれているかどうかをユーザーにアドバイスするためにエラーメッセージを出すので、それは必須ではありません。

    --> FOAM FATAL IO ERROR : Unknown asymmetric matrix solver PCG
    Valid asymmetric matrix solvers are :
    3
    (
    PBiCG
    smoothSolver
    GAMG
    )
[編集] 4.5.1.1 解の公差

疎行列ソルバは反復計算、すなわち解の連続性により方程式残差を減少させることに基づいています。残差は表面上、解の誤差の尺度なので小さければ小さいほど、より正確な解となります。より正確には、残差は、現在の解を方程式に代入して、左右両側の差の大きさを取ることによって評価されます。これはまた解析する問題のスケールにかかわらず正規化されます。 特定のフィールドで方程式を解く前に、初期の残差はそのフィールドの現在値に基づいて値を決めます。それぞれのソルバの反復計算の後に、残差は再評価されます。 以下の条件のどちらかを満たせばソルバは停止します。

・残差がソルバの公差以下に減少する、tolerance;

・初期残差比率がソルバの相対的な公差以下に減少する、relTol;

ソルバの公差は解が十分正確であると考えることができるくらい小さい残差レベルにまでするべきです。ソルバの相対的な公差が初期値から最終的な解への相対的な再計算を制限します。解をソルバの公差に収束させるためにはソルバの相対的公差を0に設定するのが一般的です。公差、tolerance、およびrelTolは全てのソルバによって辞書に定められる。

[編集] 4.5.1.2 共役勾配ソルバの前提条件

ソルバ辞書のpreconditionerのキーワードにあるようなマトリクスの条件決めのためのさまざまなオプションの範囲が共役勾配ソルバにあります。preconditionersを表4.13に記載します。

Preconditionerキーワード
対角不完全コレスキー分解 (対称) DIC
高速対角不完全コレスキー分解 (キャッシング付きDIC) FDIC
対角不完全LU (非対称) DILU
対角 diagonal
幾何学的代数マルチグリッド GAMG
preconditioningなし none

表4.13 Preconditionerオプション

[編集] 4.5.1.2 平滑化ソルバ

スムーサーを使うソルバは、特定のスムーサーが必要です。 スムーサーオプションを表4.14に記載します。一般にGaussSeidelは最も信頼できるオプションですが、マトリクスがおかしい場合でも、DICであればより収束しやすくなります。場合によっては、GaussSeidelを使った増設のポスト・スムージングいわゆるDICGaussSeidelと呼ばれる方法がさらに有益です。

スムーサーキーワード
ガウス-シーデル GaussSeidel
対角不完全コレスキー分解 (対称) DIC
ガウス-シーデル対角不完全コレスキー分解(対称) DICGaussSeidel

表4.14:スムーサー・オプション

また、公差パラメタに従って、残差が再計算される前にnSweepsというキーワードによってスイープの数も定めなければなりません。

[編集] 4.5.1.3 代数幾何マルチグリッドソルバ

代数幾何マルチグリッド(GAMG)の一般化されたメソッドは以下の原則に従います:セル数が少ないメッシュで素早く解を導きます。そして、この解をより細かいメッシュに写します。正確な解を出すのに細かいメッシュ上に初期の推測としてその値を使います。最初により粗いメッシュを解く時の速度の増加がメッシュ改良とフィールド・データに関するマッピングによる負荷の増加より重いときに、GAMGは標準の方法より速くなります。実際には、GAMGは指定されたメッシュから計算を始め、徐々にメッシュを粗くもしくは細かくしていきます。ユーザはセルのnCoarsestCellsの数に関して最も粗いレベルにおける大体のメッシュサイズを指定するだけで構いません。  セルの統合はagglomeratorキーワードによって指定されたアルゴリズムで実行されます。今のところ、faceAreaPairメソッドを薦めます。MGridGenの共有されたオブジェクト・ライブラリを指定する追加入力が必要なMGridGenオプションがあることに注意する必要があります。

geometricGamgAgglomerationLibs ("libMGridGenGamgAgglomeration.so");

OpenCFDでは経験上、MGridGenメソッドよりもfaceAreaPairメソッドの方が優れています。すべての方法において、cacheAgglomerationスイッチによって統合を任意にキャッシュできます。  平滑化は4.5.1.3で説明したようにスムーサーによって指定されます。スムーサーによって異なったレベルのメッシュ密度で使われるスイープの数はnPreSweepsやnPostSweeps、nFinestSweepsのキーワードによって指定されます。nPreSweepshへの入力はアルゴリズムがメッシュを粗くする時に使われ,nPostSweepsへの入力はアルゴリズムがメッシュを細分割する時に使われ、nFinestSweepsは解が最も細かいレベルにある時に使われます。

 mergeLevelsキーワードは粗さもしくは細かさのレベルによって実行速度を制御します。例えばmergeLevels 1のように、単一のレベルで行うことは最適です。場合によって、特に簡単なメッシュに関しては、例えばmergeLevels2のように一度に2レベル粗くまたは細かくすることによって、解析を確実に早くできます。

[編集] 4.5.2 緩和解析

OpenFOAMでよく使われるfvSolutionの2番目のサブ辞書は緩和して制御するrelaxationFactorsで、計算の安定性を改良するのに使用されるテクニックなのですが、特に定常状態問題を解析する際に使われます。緩和は、領域の解析の前に解のマトリクスとソースを変更するか、または直接領域を変更することによって、反復計算時の変数の変化を制限することで行われます。緩和係数α(0<α≦1)は緩和の量を指定し、0からα=1まで変化し、強さはα→0に従って増加します。α=0は連続した反復計算で変数を全く変化させない場合の解であり、極端なケースです。最適なαの選択は安定した計算を確実にすることができるくらい小さく、また反復計算をスムーズに進められる程度大きくしなければなりません。0.9程度のαの値であれば多くの場合安定性が確保されます。ただし著しく低い値、例えば0.2は反復計算を遅くする場合等の非常に限られた値です。  ユーザは最初に、ある領域に関連しているwordを要素として最初に指定することによって、特定の領域の緩和係数を指定できます。以下で非圧縮定常状態層流のsimpleFoamのチュートリアルの例で使われる緩和係数を参照できます。

17  solvers
18  {
19      p PCG
20      {
21          preconditioner   DIC;
22          tolerance        1e-06;
23          relTol           0.01;
24      };
25      U PBiCG
26      {
27          preconditioner   DILU;
28          tolerance        1e-05;
29          relTol           0.1;
30      };
31      k PBiCG
32      {
33          preconditioner   DILU;
34          tolerance        1e-05;
35          relTol           0.1;
36      };
37      epsilon PBiCG
38      {
39          preconditioner   DILU;
40          tolerance        1e-05;
41          relTol           0.1;
42      };
43      R PBiCG
44      {
45          preconditioner   DILU;
46          tolerance        1e-05;
47          relTol           0.1;
48      };
49      nuTilda PBiCG
50      {
51          preconditioner   DILU;
52          tolerance        1e-05;
53          relTol           0.1;
54      };
55  }
56  
57  SIMPLE
58  {
59      nNonOrthogonalCorrectors 0;
60  }
61  
62  relaxationFactors
63  {
64      p               0.3;
65      U               0.7;
66      k               0.7;
67      epsilon         0.7;
68      R               0.7;
69      nuTilda         0.7;
70  }
71  
72  // ************************************************************************* //

 

[編集] 4.5.3 PISOとSIMPLEアルゴリズム

OpenFOAMのほとんどの流体力学ソルバアプリケーションはpressure-implicit split-operator (PISO)もしくはsemi-implicit method for pressure-linked equations (SIMPLE)アルゴリズムを使用します。これらのアルゴリズムは、速度と圧力の方程式を解くための反復法で、PISOは過渡状態の問題に、SIMPLEは定常状態の問題に使います。 両アルゴリズムはいくつかの初期解を求め、次に、それらを修正するという方法をとります。SIMPLEは1の修正しかしませんが、PISOは1以上で概して4以下の修正をします。したがって、本節冒頭の入力例に示したようにnCorrectorsキーワードでPISO辞書の補正数を定めます。  非直交性メッシュから成る追加補正は標準のOpenFOAMソルバアプリケーションのSIMPLEとPISOの両方で利用できます。例えば面が直行座標系に並べられる6面体のセルのメッシュのように、メッシュ内の各面において隣接するセルの中心間のベクトルに面が平行であるなら、メッシュは直交しています。非直交の補正数は本節中の入力例に示すようにnNonOrthogonalCorrectorsキーワードによって定めます。例えば、直交メッシュを0として非直交性の度合いによって最大で20まで増加するようにするなど非直交の補正数は解くケースのメッシュに対応させます。

[編集] 4.5.3.1 圧力参照

非圧縮の閉鎖系では圧力は相対的で、重要なのは絶対値ではなく範囲です。この場合、ソルバはセル内のpRefValueの基準面を、pが圧力の変数解の名前の場合、pRefCellに設定します。圧力がpdであるところでは、名前はそれぞれpdRefValueとpdRefCellです。これらの入力は、一般にPISO/SIMPLEサブ辞書に格納されて、ケースに応じてソルバがそれらを必要とした時に使われます。もしこれを忘れるとソルバは実行されずに、エラーメッセージが出ます。

[編集] 4.5.4 その他のパラメタ

標準のOpenFOAMソルバアプリケーションの多くのfvSolutions辞書には、これまでこのセクションで説明した以外の項目はありません。しかし、一般に、fvSolution辞書はソルバ、アルゴリズム、または実際の何かを制御するどんなパラメタを持っていてもおかしくありません。どんなソルバでも、必要なパラメタを把握するためにソースコードを見ることができます。 結局、何かパラメタやサブ辞書がなければ、ソルバが実行される時、詳細なエラーメッセージが印字されて終了するでしょう。その時、それに応じて不足のパラメタを加えて下さい。


[編集] 第5章 メッシュの生成と変換

本章では、OpenFOAMにおけるメッシュの生成に関する話題について述べます。 5.1節ではOpenFOAMにおいてメッシュがどのように記述されるか概説します。 5.3節では六面体格子ブロックのメッシュの生成を行なうblockMeshユーティリティについて説明します。 5.4節では三角表面形状から自動的に六面体格子や分割六面体格子の複雑なメッシュを生成するsnappyHexMeshユーティリティについて説明します。 5.5節ではサードパーティの製品で生成したメッシュを、OpenFOAMで読み込むことができるフォーマットに変換する手法もあることを述べます。


[編集] 5.1 メッシュの記法

この節では、OpenFOAMのC++のクラスがどのようにメッシュを扱うか、その仕様について説明します。 メッシュは数値解析において不可欠のものであり、妥当で精密な解を得るためには一定の条件を満している必要があります。 OpenFOAMは、実行時、メッシュが妥当かどうかの一連の条件を満しているか厳しくチェックし、もしそあの条件を満していない場合には、実行を止めます。 このためOpenFOAMが実行する前に、サードパーティ製のメッシャーで生成した大規模なメッシュを修正することに疲れてしまうかもしれません。 OpenFOAM上で受けいれられるようにするために、根気良く修正する羽目に陥いることがあります。 それは残念なことではありますが、メッシュの妥当性のチェックを行わなかったら、計算が始まる前に解は発散してしまうこともあるわけですから、OpenFOAMがメッシュの妥当性を常にチェックすることは決して悪いことではありません。

通常、OpenFOAMは、任意の多角形の面に囲まれた3次元で定義される任意の多面体格子によってメッシュを定義しますので、格子の界面の数は無制限であり、その界面についても、辺の数は無制限で配列についても何の制約もありません。 このような汎用性が高いメッシュをOpenFOAMではpolyMeshと定義しています。 プログラマー・ガイドの2.3節においてより詳細に述べますが、このような形式のメッシュを用いていると、特に計算領域の幾何形状が複雑であったり、それらが何度も変更される時に、メッシュの生成やその操作においてとても大きな自由度があることだけを、ここでは述べておくことにします。 しかしながら、このようにメッシュが無条件の汎用性を持った代償として、従来のツールによって生成されたメッシュを変換するのは難しいこともあります。 そのため、OpenFOAMのライブラリは、既存の格子形状リストを元にした従来のメッシュのフォーマットを上手く扱うcellShapeツールを提供しています。

[編集] 5.1.1 メッシュの仕様と妥当性の制約

OpenFOAMのメッシュのフォーマットであるpolyMeshcellShapeツールを説明する前に、まず、OpenFOAMにおけるメッシュの妥当性の制約について述べたいと思います。メッシュが満していなければならない条件とは以下の通りです。

[編集] 5.1.1.1 点

点というのは、3次元空間における位置であり、メートル(m)単位のベクトルによって定義されます。点の集まりはリストに蓄積され、個々の点はリストにおける位置を表わし、0から始まるラベルにより参照されます。 この点のリストには、別々の点でありながら位置が全く同一である点や、一つの界面にも属さない点が含まれることはありません。

[編集] 5.1.1.2 界面

界面は点を順番に並べたものであり、ひとつひとつの点はラベルによって参照されます。 界面における点のラベル順は、隣接した二つの点が一つの辺によって接続されるように付けられるため、界面の周囲をぐるっと廻るように点の番号を追うことになります。 点と同様に、界面の集まりはリストで管理され、個々の界面は、リストにおける位置を表わすラベルによって参照されます。 界面の法線方向ベクトルの向きは右手の法則により決まります。すなわち、図5.1のように、界面に向って見た時、点の順序が反時計廻りであったら、法線方向ベクトルはこちらを向いていることになります。

図5.1 界面における点の順序から決まる界面面積(法線)ベクトル

界面には2種類あります。

内部の界面
これらの界面は必ず2つの格子に接続されており、その数が2を超えることはありません。また、内部の界面において、その法線方向ベクトルが、より大きなラベルを持つ格子に向くように、点のラベルの番号付けがなされます。つまり、格子2と格子5を接続している界面だったら、その法線は格子5を向くわけです。
境界の界面
これらは領域の境界にあるので、1つの格子にしか属しません。従って、ある境界の界面を参照するのは、1つの格子と境界パッチだけです。点ラベルの番号付けは、界面の法線が計算領域の外側に向くように設定されます。
[編集] 5.1.1.3 格子

格子は、界面を任意の順序で並べたものです。 格子は以下に示す性質が必ず必要です。

切れ目なく連続である
格子群は計算領域全体を完全にカバーしており、かつ、お互いに重複してはなりません。
凸である
全ての格子は凸で、かつ、格子中心は格子の内側にある必要があります。
閉じている
全ての格子は幾何的にも位相的(トポロジー的)にも閉じていなければなりません。ここで、格子が幾何的に閉じているためには、全ての界面の面積ベクトルが格子の外側を向いているとして、それらのベクトル和が、正確にゼロ・ベクトルとなる必要があります。また、格子が位相的に閉じているためには、問題において、格子中の全ての辺が、2つの界面により使用されている必要があります。
直交性がある
メッシュ内部の全ての界面に対し、中心間ベクトルというのを、隣接する2つの格子の中心間を、小さいほうのラベルの格子中心から大きいほうのラベルの格子中心への向きで結んだベクトルとして定義することができます。直交性の制約というのは、内部の全ての界面に対し、先に述べた界面の面積ベクトルと中心間ベクトルのなす角が、常に90度未満であることを言います。
[編集] 5.1.3 境界

境界というのはパッチのリスト(集合)であり、これら一つ一つは、ある境界条件が割り当てられています。 ここで、パッチというのは界面のラベルのリストであり、境界の界面のみで形成され、内部の界面を含みません。 この境界は閉じていることが条件であるので、境界における全界面面積ベクトルの和は、数値計算上ゼロ・ベクトルになります。

[編集] 5.1.4 polyMeshの記述

constantディレクトリのサブディレクトリであるpolyMeshには、そのケースのpolyMeshデータが全て収められています。 このpolyMeshの記述は界面ベースであり、既に述べましたように、内部の格子は2つの格子と接続し、境界面は格子と境界のパッチを指定します。 各界面には「保有」格子と「隣接」格子が割り当てられ、界面を通じた接続は、保有格子と隣接格子のラベルによって簡潔に記述することが出来ます。 境界の場合には、界面に接続された格子がその界面の保有者であり、隣接格子には-1のラベルが割り充てられます。 以上を踏まえた上で、以下のファイルで構成される入出力の詳細をご覧ください。

points
格子の頂点を記述するベクトルのリストです。ここで、リストにおける最初のベクトルは頂点0、次のベクトルの頂点1という風に番号付けします。
faces
界面のリストです。各界面は点中の頂点の番号のリストで成り立ってます。ここで、先程と同様に、リスト中の最初の界面の番号は0です。
owner
保有格子のラベルのリストです。界面のリストと同じ順番に並んでますので、リストの最初のラベルは0番の界面の保有格子のラベル、次のラベルは1番の界面の保有格子のラベルということになります。
neighbour
隣接格子のラベルのリストです。
boundary
パッチのリストです。以下のように、パッチ名の宣言で始まる各パッチに対する辞書で構成されます。startFaceはそのパッチにおける最初の界面のラベル番号です。またnFacesは、そのパッチ中の界面数です。
movingWall
{
    type patch;
    nFaces 20;
    startFace 760;
}

備考: 計算対象にいくつ格子があるか知りたい場合には、ownerファイルのFoamFileヘッダにおけるnCellsを見てください。

[編集] 5.1.3 cellShapeツール

別の標準的(でより単純)なメッシュ形式を、OpenFOAMのライブラリで扱えるように変換する際に、特に必要となるであろうcellShapeというツールについても説明しておきたいと思います。

多くのメッシュ・ジェネレータやポスト処理システムは、実際にあり得る多面体格子の形状種類に対し、その一部だけをサポートするものがほとんどです。 それらは、メッシュを格子形状セットといった、3次元の格子幾何形状の限られた組み合わせで定義します。 OpenFOAMのライブラリには、これらの一般的な形状集の定義がありますので、上記のようなメッシュを先の節で述べたpolyMesh形式に変換することができます。

OpenFOAMによってサポートされる格子形状モデルを表5.1に示します。 これらの形状は、形状モデルにおける番号付けスキームに従って付けれらた頂点ラベルの順序によって定義されます。 点や界面、辺に対する番号付けスキームも表5.1に描いております。 点の番号付けは、形状がねじれたり、他の形状に変化することが無いようにしなければならないので、同じ点番号は1度以上は使用できないことになります。 さらに、重複した点はOpenFOAMでは使う必要はありません。 なぜなら、OpenFOAMで使用可能な形状は、6面体の変種を全てカバーしているからです。

格子の記述は、形状モデルの名前と、ラベルの順序リストという2つの部分より行ないます。 例えば、以下の点のリストを使うと、

8
    (
        (0 0 0)
        (1 0 0)
        (1 1 0)
        (0 1 0)
        (0 0 0.5)
        (1 0 0.5)
        (1 1 0.5)
        (0 1 0.5)
    )

六面体格子は以下のように書けます。

(hex 8(0 1 2 3 4 5 6 7))

ここで、六面体の格子形状はhexというキーワードで記述しましたが、他の形状については、表5.1に示したキーワードを使って記述できます。

(a) Hexahedron: keyword hex

(b) Wedge: keyword wedge

(c) Prism: keyword prism

(d) Pyramid: keyword pyr

(e) Tetrahedron: keyword tet

(f) Tetradehral wedge: keyword tetWedge

表5.1 cellShapesにおける頂点、界面、辺の番号付け

[編集] 5.1.4 1次元や2次元、軸対称問題

OpenFOAMは3次元の空間用に設計されており、全てのメッシュもそのように定義します。 しかしながら、OpenFOAMでは、1次元や2次元そして軸対称問題も解くことができ、それには、法線方向が意図する方向であるパッチに対して、特殊な境界条件を適用します。 具体的には、1次元や2次元問題ではemptyのパッチタイプを使い、軸対称問題ではwedgeタイプを使います。 両者の使用法については5.2.2節で触れ、軸対称問題用のwedge幾何形状の生成 法については5.3.3節において述べます。


[編集] 5.2 境界

本節では境界について述べます。境界はやや複雑です。なぜなら、形状の構成によって規定される単純なものではなく、境界条件や境界間の接続を通して解法を規定する不可欠の部分であるためです。境界はメッシュ、物理量、離散化、計算法といった多くの要素に関連しており、便宜上この章で扱います。

まず考えるべきことは、境界条件の適用のために、境界はバラバラにされてパッチの組み合わせになるということです。1つのパッチは1つ以上の境界面に閉じられた領域をもち、それらが物理的に接続している必要はありません。

下に階層を示すように、パッチに関する性質は4種類あり、図5.2では各レベルにおけるさまざまなパッチの名前を挙げています。下で示す階層はOpenFOAMライブラリの階層構造と類似しています。

Base type(基底型)
形状や情報の伝達を規定
Primitive type (基本型)
物理量の境界条件を規定
Derived type(派生型)
Primitive typeから派生した、複雑な境界条件を規定

図5.2 境界の型の階層

[編集] 5.2.1 パッチの形式の類型化

パッチの種類はメッシュと物理量のファイルに規定されます。

  • 基底型はconstant/polyMeshディレクトリ内のboundaryファイルにおいて各パッチのtypeをtypeキーワードに従って記述する
  • 基本型、派生型は物理量のファイルのtypeをtypeキーワードに従って記述する

例としてsonicFoamのケースにおけるboundaryファイルとpファイル(圧力物理量ファイル)を示します。

17  6
18  (
19  inlet
20  {
21      type patch;
22      nFaces 50;
23      startFace 10325;
24  }
25  
26  outlet
27  {
28      type patch;
29      nFaces 40;
30      startFace 10375;
31  }
32  
33  bottom
34  {
35      type symmetryPlane;
36      nFaces 25;
37      startFace 10415;
38  }
39  
40  top
41  {
42      type symmetryPlane;
43      nFaces 125;
44      startFace 10440;
45  }
46  
47  obstacle
48  {
49      type patch;
50      nFaces 110;
51      startFace 10565;
52  }
53  
54  defaultFaces
55  {
56      type empty;
57      nFaces 10500;
58      startFace 10675;
59  }
60  )
61  
62  // ************************************************************************* //
17  dimensions      [1 -1 -2 0 0 0 0];
18  
19  internalField   uniform 1;
20  
21  boundaryField
22  {
23      inlet
24      {
25          type            fixedValue;
26          value           uniform 1;
27      }
28  
29      outlet
30      {
31          type            waveTransmissive;
32          field           p;
33          phi             phi;
34          rho             rho;
35          psi             psi;
36          gamma           1.4;
37          fieldInf        1;
38          lInf            3;
39          value           uniform 1;
40      }
41  
42      bottom
43      {
44          type            symmetryPlane;
45      }
46  
47      top
48      {
49          type            symmetryPlane;
50      }
51  
52      obstacle
53      {
54          type            zeroGradient;
55      }
56  
57      defaultFaces
58      {
59          type            empty;
60      }
61  }
62  
63  // ************************************************************************* // 

boundaryファイルにおけるtypeにはsymmetryPlaneemptyなど、形態的制約を受けるものを除いたパッチはpatchと記述されています。pファイルにはinletbottomに適用される基本型とoutletに適用される複雑な派生型が記述されています。2つのファイルを比較すると、基底型は一貫しており、単純なpatch、つまりsymmetryPlaneemptyではありません。

[編集] 5.2.2 基底型

以下に基底型の種類を挙げます。これらを規定するキーワードは表5.2にまとめてあります。

図5.3 wedgeパッチを利用した軸対象形状

種類 意味
patch 一般的なパッチ
symmetryPlane 対称面
empty 2次元形状の前後の面
wedge くさび型の前後
cyclic 周期境界面
wall 壁面 (乱流の壁関数に使用)
processor 並列計算時のプロセッサ間の境界

表5.2 基底型の境界の種類


図5.4 cyclicパッチを利用した周期境界の連続形状


patch メッシュに対する形状的、位相的情報をなにも持たないパッチ条件のための基礎的なパッチ(wallの場合を除く)。流入口や流出口など。

wall 特に専門家が壁の境界を規定するときに、壁に適合するパッチが以下のように特定可能である必要がある場合があります。良い例としては、壁がwallパッチの型で特定されなければならない壁乱流モデルがあり、壁に隣接する格子の中心からの距離がパッチの一部として格納されます。

symmetryPlane 対称面

empty OpenFOAMが常に3次元で形状を生成する一方で、2次元(1次元)を解くことも可能です。そのためには、解が必要とされない3番目(2番目)の次元に法線が向いている各パッチに特別なempty条件を当てはめます。

wedge シリンダのような2次元の軸対称ケースでは、図5.3で示すように、座標面の一つにまたがり、角度5度で左右対称面を走っている1つの格子の密集したくさびとして形状は特定されます。軸対称くさび面はくさび型の別のパッチである必要があります。blockMeshを使ったくさびの形状の生成に関する詳細は5.3.3節に述べられています。

cyclic 熱交換管のような繰り返しの多い形状では、2つのパッチをあたかも1つのように扱うことができるようにする場合があります。単一のcyclicパッチは、faceListにおいて界面を2つに分割します。そして図5.4に示すように、2つの界面のセットを結び付けます。界面の各組は同じ領域のものである必要がありますが、同じ方向のものである必要はありません。

processor 数多くの処理の中で、計算が平行して行われている場合は、だいたい同じ数の格子を各処理が計算するために、メッシュは分けられる必要があります。メッシュの中の異なる部分間の境界はprocessor境界と呼ばれます。

[編集] 5.2.3 基本型

表5.3に基本型の種類を挙げます。

種類 物理量φに対して与える条件 Data to specify
fixedValue φの値が一定 value
fixedGradient φの勾配が一定 gradient
zeroGradient φの勾配が0 --
calculated φの境界条件が他の物理量から決まる --
mixed fixedValueとfixedGradientの組み合わせ、valueFractionに依存する条件refValue, refGradient, valueFraction, value
directionMixed パッチの法線方向に対してmixed、接線方向に対してfixedGradientrefValue, refGradient, valueFraction, value

表5.3 基本型のパッチの種類

[編集] 5.2.4 派生型

表5.4に派生型の種類を挙げます。

fixedValueから派生 意味 指定するデータ
movingWallVelocity ノーマルパッチの値を置き換えるのでパッチのフラックスは0 value
pressureInletVelocity 流入口のpが分かっている時、Uは、フラックスから評価され、パッチはノーマル。 value
pressureDirectedInletVelocity 流入口のpが分かっている時、Uは、inletDirectionのフラックスから計算される。 value, inletDirection
surfaceNormalFixedValue 大きさによって、ベクトル境界条件をノーマルパッチに指定します。 ベクトルの+veはドメインを指す。 value
totalPressure 全圧 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): p_0=p+\frac{1}{2}\rho|U|^2 は固定;Uが変わるとそれに従い P も調整される。 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): p_0

turbulentInlet 平均値のスケールに基づく変動変数について計算する referenceField, fluctuationScale
fixedGradient/zeroGradientから派生
fluxCorrectedVelocity フラックスから流入口のUの法線成分を計算する value
wallBuoyantPressure 気圧勾配に基づくfixedGradient圧を設定する--
mixedから派生
inletOutlet Uの向きによってfixedValueとzeroGradientの間でUとpを切り替える inletValue, value
outletInlet Uの向きによってfixedValueとzeroGradientの間でUとpを切り替える outletValue, value
pressureInletOutletVelocity pressureInletVelocityとinletOutletの組み合わせ value
pressureDirectedInletOutletVelocity pressureDirectedInletVelocityとinletOutletの組み合わせ value, inletDirection
pressureTransmissive 周囲の圧力P∞に超音速圧縮波を伝える pInf
supersonicFreeStream 斜めの衝撃をP∞、T∞、U∞の環境に伝える pInf, TInf, UInf
その他
slip 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi

がスカラーならzeroGradient、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi

がベクトルなら法線成分はfixedValue 0で接線成分はzeroGradient
--
partialSlip 混合zeroGradient/slip条件はvalueFractionに依る; = 1(slipの場合)valueFraction

Note: pは圧力, Uは速度

表5.4 派生型の種類


[編集] 5.3 blockMeshユーティリティを使ったメッシュ生成

 このセクションでは、OpenFOAMとともに供給されるメッシュ生成ユーティリティのblockMeshについて説明します。 blockMeshユーティリティは階層付けされている曲がった辺でパラメトリックメッシュを作成します。

 メッシュはケースのconstant/polyMeshディレクトリに位置するblockMeshDictという辞書ファイルから生成します。 blockMeshはこの辞書を読み込んでメッシュを生成し、同じディレクトリのpoints, faces, cellsおよびboundaryファイルにメッシュ・データを書き出します。

 blockMeshがよりどころとする原則は、1つあるいは複数の3次元の6面体のブロックに領域を分割することです。 ブロックの辺は、直線、円弧またはスプラインであるかもしれません。 メッシュは、ブロックの各方向の多くのセルとして表面上指定され、これはblockMeshがメッシュ・データを生成するのに十分な情報です。

 各ブロックの幾何形状は8つの頂点、6面体の各隅のひとつによって定義されます。 頂点はラベルを使用することで各頂点にアクセスできるようにリストに書かれています。 OpenFOAMは常にC++の慣習に従って、リストの最初の要素をラベル‘0'とします。 リストに従って、各頂点に番号付けがされているブロックの例を図5.5に示します。 頂点1と5を接続する辺は、blockMeshで曲がった辺を指定できるのを読者に思いおこさせるために曲がっています。

 セクション5.3.3で説明されるように、1組以上の頂点をお互いの上で潰すことによって8つ未満の頂点を持つブロックを生成することが可能です。

 各ブロックは、右手系である局所座標系構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): (x_{1}, x_{2}, x_{3}) を持ちます。 右手系の軸群は、Oz軸を見下ろしたとき、Ox軸上の点からOy軸上への円弧が時計回りとなるように定義されます。 局所座標系は以下に従ってブロックの定義で提示された頂点の順序に従って定義されます。

  • 軸の原点はブロックの定義における最初の入力です。私たちの例では頂点0です。
  • 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{1}

の方向は、頂点0から頂点1まで動くことによって示されます。

  • 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{2}

の方向は、頂点1から頂点2まで動くことによって示されます。

  • 頂点0、1、2、3は構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{3}=0

の平面を定義します。

  • 頂点4は頂点0から構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{3}

方向に動くことによって、見つけられます。

  • 頂点5、6、および7は、頂点1、2、および3からそれぞれ構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{3}

の方向に動くことで、同様に見つけられます。

図5.5 ひとつのブロック

キーワード 説明 指定するデータ
convertToMeters頂点座標の倍率0.001 scales to mm
vertices頂点座標のリスト (0 0 0)
edgesarcもしくはsplineの辺を書くために使用 arc 1 4 (0.939 0.342 -0.5)
block頂点ラベルとメッシュサイズの順序リスト hex (0 1 2 3 4 5 6 7) (10 10 1)

simpleGrading (1.0 1.0 1.0)

patchesパッチのリストsymmetryPlane base

( (0 1 2 3) )

表5.5 blockMeshDictに使用するキーワード

[編集] 5.3.1 blockMeshDictファイルの記述

 blockMeshDictファイルはTable5.5で説明されたキーワードを使用する辞書です。 convertToMetersキーワードは、メッシュ記述におけるすべての頂点の座標に掛けられる尺度因子を指定します。 例えば、

convertToMeters 0.001;

は、すべての座標に0.001をかけることを意味します。 すなわち、blockMeshDictファイルで引用された値がmmになります。

[編集] 5.3.1.1 頂点

 メッシュのブロックの頂点は、verticesと名づけられた標準のリストとして以下のように与えられます。 例えば図5.5での私たちの例のブロックに関しては、頂点は以下の通りです。

vertices
(
( 0 0 0 ) // vertex number 0
( 1 0 0.1) // vertex number 1
( 1.1 1 0.1) // vertex number 2
( 0 1 0.1) // vertex number 3
(-0.1 -0.1 1 ) // vertex number 4
( 1.3 0 1.2) // vertex number 5
( 1.4 1.1 1.3) // vertex number 6
( 0 1 1.1) // vertex number 7
);
[編集] 5.3.1.2 辺

 2頂点をつなぐ辺のそれぞれは、デフォルトでまっすぐであると仮定されています。 しかしながら、どんな辺も、edgesと名づけられるリストにおける入力で曲がるように指定されるかもしれません。 そのリストはオプションです。 幾何形状がどんな曲がった辺も含んでいないなら、それは省略されるかもしれません。

 曲がった辺のための各入力は、表5.6に挙げられているものからカーブのタイプを指定するキーワードとともに始まります。

キーワード選択 説明 備考
arc円弧単一補間点
simpleSplineスプライン曲線補間点リスト
polyLine線群補間点リスト
polySplineスプライン群補間点リスト
line直線--

表5.6 blockMeshDict辞書で使用可能なエッジタイプ

 そして、キーワードの後には辺が接続する2つの頂点のラベルが続きます。 それに続いて、辺が通り過ぎる内挿点を指定しなければなりません。 arcには、円弧が横切ることになる単一の内挿点が必要です。 simpleSplinepolyLine、およびpolySplineに関しては、内挿点のリストが必要です。 line辺は、デフォルトとして実行されるオプションと全く同等であり、内挿点を全く必要としません。 line辺を使用する必要は全くありませんが、それが完全性のために含まれていることに注意してください。 図5.6での私たちの例のブロックでは、内挿点(1.1, 0.0, 0.5)を通して以下のように頂点1と5をつなぐarc辺を指定します。

edges
(
arc 1 5 (1.1 0.0 0.5)
);
[編集] 5.3.1.3 ブロック

 ブロックの定義はblocksと名づけられたリストに含まれています。 各ブロックの定義は、セクション5.3で示された順序を持つ頂点ラベルのリストから成る複合入力です。 ベクトルが各方向に必要なセルの数、タイプ、および各方向のセル拡大比のリストを与えます。

 そして、ブロックは以下の通り定義されます。

blocks
(
hex (0 1 2 3 4 5 6 7) // vertex numbers
(10 10 10) // numbers of cells in each direction
simpleGrading (1 2 3) // cell expansion ratios
);

それぞれのブロックの定義は以下の通りです。

  • Vertex numbering   OpenFOAM-1.4/cellModelsファイルに定義されているように、最初の入力がブロックの形状識別子です。いつもブロックが六面体であるので、いつも形はhexです。ページU-130で説明された方法で並べられた頂点番号のリストが従います。
  • Number of cells 2番目の入力はそのブロックの構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{1}
構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{2}

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{3} それぞれの方向のセルの数を与えます。

  • Cell expansion ratios 3番目の入力はブロックにおける各方向へのセルの拡大比を与えます。

拡大比は、メッシュが指定された方向に段階的なものにするか、または精製されるのを可能にします。 比率は図5.6に示すように、ブロックのひとつの辺に沿った終わりのセルの幅構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta_{e} の、辺に沿った始めのセル幅構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta_{s} への比です。 以下のキーワードのそれぞれはblockMeshで利用可能な段階付けの仕様の2つのタイプのひとつを指定します。

  • simpleGrading 簡単な記述で、局所的な構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{1}
構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{2}

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): x_{3} 方向それぞれに一様な拡大比を、3つの拡大比だけで指定します。例えば

simpleGrading (1 2 3)
  • edgeGrading 完全なセルの拡大比の記述は、図5.5に矢印で「最初のセルから最後のセル」の方向を表したスキームに従って番号付けられたブロックの各辺に比率を与えます。

例えば、このようなものです。

edgeGrading (1 1 1 1 2 2 2 2 3 3 3 3)

これは、辺0-3に沿ったセル幅の比率が1、辺4-7に沿った比率が2であり、辺8-11に沿った比率が3であるということであることを意味しており、上述したsimpleGradingの例にまったく同等です。

図5.6ブロックの辺に沿って段階わけされたメッシュ

[編集] 5.3.1.4 パッチ

 patchesというリストでメッシュのパッチを与えます。 リストにおける各パッチは以下を含む複合記入です。

  • パッチタイプ、いくつかの境界条件が適用されている一般的なパッチか、表5.1にリストアップされていてセクション5.2.2で説明される特定の幾何的条件のどちらか。
  • パッチを作るブロックの面のリスト、便利にパッチを特定できる名前が推奨されるものの、名前はユーザーの選択に任されます。例えば、quoteTextinlet; この名前は、境界条件をフィールドデータファイルに設定するための識別子として使用されます。

 blockMeshpatchesリストから省かれるどんな境界パッチからも面を集め、それらにdefaultFacesと呼ばれるemptyタイプからなるデフォルトパッチを割り当てます。 これは、2次元の幾何形状において、それらが必要に応じてemptyパッチに集められるのを知りながら、ユーザーは2次元平面にあるブロック面を省略する選択ができることを意味します。

 図5.5での例のブロックに戻って、もし左面に流入があり、右面における流出があり、他の4つの表面が壁であるならば、以下の通りパッチは定義できるでしょう。

patches // keyword
(
patch // patch type for patch 0
inlet // patch name
(
(0 4 7 3) // block face in this patch
) // end of 0th patch definition
patch // patch type for patch 1
outlet // arbitrary patch name
(
(1 2 6 5)
)
wall
walls
(
(0 1 5 4)
(0 3 2 1)
(3 7 6 2)
(4 5 6 7)
)
);

それぞれのブロック面は4つの頂点番号のリストによって定義されます。 頂点が与えられる順序は、ブロックの中から見て、どの頂点からも始めても、他の頂点を定義するために時計回りに面を回るようなものにならなければなりません。

[編集] 5.3.2 複数のブロック

 1ブロック以上を使用することでメッシュを作成できます。 そのような事情では、メッシュは前述のテキストで説明されるように作成されます。 唯一の追加設定がブロック間の接続です。 そこに、2つの異なる可能性があります。

  • face matching あるブロックのパッチを包括する面の組が、別のブロックのパッチを包括する面の組と全く同じ位置にあるものです。
  • face merging あるブロックのパッチからの面のグループは、2つのブロックをつなげながら新しい内部の面の組を作成するために、別のブロックのパッチからの面の別のグループに関連づけられます。

 face matchingで2ブロックをつなげるためには、接続を形成する2つのパッチがpatchesリストから単に無視されるべきです。blockMeshは、面が外部の境界を形成せず、同じところに位置する各組を、2ブロックからのセルを接続する、ひとつの内部面に結合するのを特定します。

 もうひとつのface margingは、併合されるブロックパッチがまずpatchesリストで定義されることを必要とします。 面が併合されるパッチのそれぞれの組が、mergePatchPairsというオプションリストに含まなければなりません。 mergePatchPairsの形式は以下の通りです。

mergePatchPairs
(
( <masterPatch> <slavePatch> ) // merge patch pair 0
( <masterPatch> <slavePatch> ) // merge patch pair 1
...
)

 パッチの組は、最初のパッチはマスターになり、2番目はスレイブになると解釈されます。 併合するための規則は以下の通りです

  • マスターパッチの面は元々定義されているままで、すべての頂点は元の位置にあります。
  • スレイブパッチの面は、スレイブとは多少異なるマスターパッチに投影されます。
  • スレイブ面のどんな頂点の位置も、面の最小許容値より短いあらゆる辺を除去するために、blockMeshによって調整されるかもしれません。
  • パッチが図5.7に示されるように重なるなら、併合しない各面が、境界条件を適用しなければならない、元のパッチの外部面として残ります。
  • パッチのすべての面が併合されているなら、パッチ自体は表面を全く含まないので、除去されます。

図5.7 重なったパッチを併合すること

 結果的に、スレイブパッチのオリジナルの幾何形状が、併合の間必ずしも、完全に保存されるというわけではないということです。 したがって、たとえば、円筒状のブロックが、より大きいブロックにつなげられている場合では、円筒状の形が正しく保存されるように、マスターパッチを円筒状のブロックにするのが賢いでしょう。 併合手順を確実に成功させるためのいくつかの追加の推奨策があります。

  • 2次元の幾何学形状では、2次元平面の外での3次元目のセルサイズは、2次元平面でのセルの幅/高さと同様であるべきです。
  • 二度パッチを併合すること、すなわち、mergePatchPairsで二度それを含めるのは勧められません。
  • 併合されるべきパッチが、他の併合されるパッチと共通の辺を共有するところでは、両方がマスターパッチとして宣言されるべきです。

[編集] 5.3.3 8頂点未満のブロックの作成

 8つ未満の頂点でブロックを作成するために、1組以上の頂点をお互いの上で潰すことが可能です。 頂点を潰す最も一般的な例としては、セクション5.2.2で説明したwedgeパッチタイプを使用する2次元の軸対称問題のための6面のくさび型ブロックを作成する時があります。 図5.8に示す私たちの例における、ブロックの簡易型のバージョンを使用することで、過程をわかりやすく例証します。 頂点7を頂点4に、頂点6を頂点5に置いて潰すことによって、くさび型ブロックを作成したいということです。 これは、ブロック番号7を4で、6を5でそれぞれ交換することによって簡単にできます。 するとブロック番号はこのようになります。

hex (0 1 2 3 4 5 5 4)

図5.8 くさび形をしたブロックを6つの接点で作る

 潰れている頂点を含むブロック面を考えることで、同じことがパッチにも適用でき、以前(4 5 6 7)だったものが、(4 5 5 4)になります。 これは面積を持たないブロック面で、polyMeshで面のないパッチを生成します。 これはboundaryファイルにおいて同様の場合でも見ることができることと同じです。 パッチはblockMeshDictで、emptyとして指定されるべきです。 そしてどんなフィールドの境界条件も結果的にemptyであるはずです。

[編集] 5.3.4 blockMeshの実行

 セクション3.3で説明されたように、blockMeshを実行するためには、以下のようにすればコマンドラインで実行できます。

blockMesh

blockMeshDictファイルは、サブディレクトリconstant/polyMeshに存在しなければなりません。


[編集] 5.4 snappyHexMeshユーティリティを使ったメッシュ生成

OpenFOAMのメッシュ生成ユーティリティsnappyHexMeshについて解説します。snappyHexMeshはSTL形式の三角の表面形状から六面体と分割六面体の3次元メッシュを自動的に生成します。はじめのメッシュの細分化と、後に現れる分割の六進法のメッシュの表面形状への変形を繰り返して表面形状に近づいていきます。オプションとして、現れたメッシュを縮小させ、レイヤーセルを挿入することができます。メッシュの細分化のレベルは非常に柔軟性が高く、表面の処理は予め定義したメッシュの水準に適合します。snappyHexMeshは毎回負荷を平均化して並列動作をします。

図5.9 snappyHexMeshにおける2次元メッシュ問題の概略図

[編集] 5.4.1 snappyHexMeshによるメッシュ生成の過程

図5.9に示す概略図を用いてメッシュをsnappyHexMeshによって生成する流れを説明します。STL形式の表面形状で描かれた対象を囲む長方形の部分(図中のグレーの部分)にメッシュを作成することを目的とします。これは外部の空気力学のシミュレーションにおいて典型的な手法です。あくまでもsnappyHexMeshは3次元メッシュの生成ツールですが、簡単のためここでは2次元の図を使用しています。

snappyHexMeshを実行するには以下の準備が必要です。

  • 2進法またはASCIIで表されたSTL形式による表面形状データをケースディレクトリのtriSurfaceサブディレクトリに置く。
  • セクション5.4.2で述べるblockMeshを使用して、解析領域の範囲とメッシュ密度の基準を決めるために六角形の基礎メッシュを作成しておく。
  • ケースのSystemディレクトリにあるsnappyHexMeshDict辞書に、適切な内容を入力する。

snappyHexMeshDict辞書には、メッシュの生成の様々な段階を管理する最上位での変更や、各過程における個々のサブディレクトリがあります。入力例を表5.7に示します。

キーワード 意味
castellatedMesh ギザギザのメッシュを作成するかどうか true
snap 表面のスナップの有無 true
doLayers レイヤーの追加の有無 true
mergeTolerance 初期メッシュの有界ボックスの比として許容値をまとめる 1e-06
debug 中間メッシュと画面プリントの記述の制御
最終メッシュのみ記述 0
中間メッシュの記述 1
後処理のためcellLevelを付けたvolScalarFieldを記述 2
.objファイルとして現在の交点を記述 4
geometry 表面に使用した全ての幾何学のサブ辞書
castellatedMeshControls 城壁メッシュ制御のサブ辞書
snapControls 表面スナップ制御のサブ辞書
addLayersControls レイヤ追加制御のサブ辞書
meshQualityControls メッシュ特性制御のサブ辞書

表5.6 snappyHexMeshDictの最上位のキーワード

snappyHexMeshで読み込む形状はsnappyHexMeshDict内のgeometoryの部分に記述します。形状はSTL形状またはOpenFOAMにおける幾何実体によって指定されます。以下に例を示します。

geometry
  {
      sphere.stl // STL filename
      {
          type triSurfaceMesh;
          regions
          {
              secondSolid             // Named region in the STL file
              {
                  name mySecondPatch; // User-defined patch name
              }                       // otherwise given sphere.stl_secondSolid
          }
      }
  
      box1x1x1  // User defined region name
      {
          type   searchableBox;       // region defined by bounding box
          min    (1.5 1 -0.5);
          max    (3.5 2 0.5);
      }
  
      sphere2  // User defined region name
      {
          type   searchableSphere;    // region defined by bounding sphere
          centre (1.5 1.5 1.5);
          radius 1.03;
      }
  };

[編集] 5.4.2 六面体基礎メッシュの作成

snappyHexMeshを実行する前にblockMeshを使用して図5.10が示すように、解析領域をカバーする六面体セルのメッシュを作成します。 基礎メッシュの生成時は以下の点に注意しなければなりません。

  • メッシュは六面体のみで構成されていること
  • セルのアスペクト比がほぼ1であること。少なくとも連続したスナップが行われる表面近傍でそうでなければスナップの収束に時間がかかり、不良の原因となる。
  • STLの表面とセルのエッジが最低でも一箇所は交差すること。つまり、1つのセルだけのメッシュでは機能しない。


図5.11 snappyHexMesh実行前の基礎メッシュの生成

[編集] 5.4.3 面と輪郭に合わせたセルの分割

セルの分割は、snappyHexMeshDictcastellatedMeshControlsサブ辞書において設定して実行します。castellatedMeshControlsの入力の例を表5.8に示します。

Keyword Description Example
locationInMesh メッシュが作成される領域内の位置ベクトル (5 0 0)
ベクトルが細分化の前または最中にセルの面と一致してはいけない
maxLocalCells 細分化中におけるプロセッサあたりのセルの数の最大値 1e+06
maxGlobalCells 細分化中におけるセルの数の総数 (i.e. 除去の前) 2e+06
minRefinementCells 細分化すべきセルの数の最低値。この値以下だと停止 0
nCellsBetweenLevels 異なる細分化レベル間のセルの緩衝レイヤーの数 1
resolveFeatureAngle 角度がこの値を超えている交点をもつセルに最高レベルの細分化を行う 30
features 細分化に対する機能リスト
refinementSurfaces 細分化に対する表面辞書
refinementRegions 細分化に対する領域辞書
表5.8 snappyHexMeshDictcastellatedMeshControlsサブ辞書のキーワード

図5.11で示されたように、最初に領域内で指定された輪郭に従って選択されたセルで分割が開始します。

図5.11 snappyHexMeshDictの輪郭によるセルの分割

castellatedMeshControlsサブ辞書の輪郭のリストにおいてedgeMeshファイルの名前と細分化のレベルを記述します。

features
  (
      {
          file "someLine.eMesh"; // file containing edge mesh
          level 2;               // level of refinement
      }
  );

輪郭の細分化に続き、図5.12に示すように、指定された表面における分割のためにセルが選択されます。

図5.12 snappyHexMeshDictの表面によるセルの分割


castellatedMeshControlsのrefinementSurface辞書で、各STL表面の辞書入力と、型の最小、最大細分化のデフォルトレベルの指定を行います。(<min> <max>) 最小レベルは表面のいたるところに適用され、最大レベルはresolveFeatureAngleに規定される角度を超過する交点を持つセルに適用されます。

細分化はSTL表面の特定領域に対して複数回行うことができます。領域の入力はregionsサブ辞書に収められています。各領域の入力に対するキーワードは領域の名前そのものであり、細分化のレベルはさらにサブの辞書に含まれます。以下の入力例を参考にしてください。

refinementSurfaces
  {
      sphere.stl
      {
          level (2 2); // default (min max) refinement for whole surface
          regions
          {
              secondSolid
              {
                  level (3 3); // optional refinement for secondSolid region
              }
          }
      }
  }

[編集] 5.4.4 セルの除去

輪郭と表面の分割が完了するとセルの除去が始まります。セルの除去には領域内の有界表面によって完全に囲まれる1つ以上の範囲が必要です。セルが保持される領域は、castellatedMeshControlsのlocationInMeshキーワードに指定される領域内の位置ベクトルによって特定されます。セルの体積のほぼ50%以上が領域内に存在する場合保持されます。残りのセルは図5.13に示すように除去されます。


図5.13 snappyHexMeshにおけるメッシュの除去

[編集] 5.4.5 特定領域内のセルの分割

特定領域に含まれるセルはさらに細分化されます。図5.14では長方形の濃いグレーの領域が該当します。 castellatedMeshControls内のrefinementRegionsサブ辞書では、geometryサブ辞書において指定された領域の細分化の入力を行います。細分化のモードと対象領域は以下の通りです。

・inside 領域の内部を細分化します。

・outside 領域の外部を細分化します。

・distance 表面からの距離にしたがって細分化します。レベルキーワードを用いることで複数の距離にある異なるレベルにも適用できます。

refinementRegionsでは、細分化のレベルをレベル入力リストによって(<レベル><距離>)のように記述します。insideとoutsideの細分化の場合、<distance>は不要で無視されますが、指定する必要があります。以下に入力例を示します。

 refinementRegions
  {
      box1x1x1
      {
          mode inside;
          levels ((1.0 4));         // refinement level 4 (1.0 entry ignored)
      }
  
      sphere.stl
      {                             // refinement level 5 within 1.0 m
          mode distance;            // refinement level 3 within 2.0 m
          levels ((1.0 5) (2.0 3)); // levels must be ordered nearest first
      }
  }

図5.14 snappyHexMeshの領域によるセルの分割

[編集] 5.4.6 面へのスナップ

メッシュを生成する次の段階として、メッシュを平滑化するためにセルの頂点を表面に移動します。その手順は以下の通りです。

  1. ギザギザの境界面の頂点をSTL表面上に移動する
  2. 最後に移動した境界の頂点を用いて内部メッシュの緩和を求める
  3. メッシュの水準に影響をもたらす頂点を探す
  4. 最初の数値(1)での頂点の移動を減らし、2からメッシュの質が満足できるレベルに達するまで繰り返す。

表5.9に示すsnappyHexMeshDictsnapControlsサブ辞書において設定をします。

キーワード意味
nSmoothPatch 表面との一致に至る前に行うパッチの平滑化の回数 3
tolerance 局所的な輪郭の最大長さに対する点と表面の距離の比の許容範囲 4.0
nSolveIter メッシュの置き換え時の緩和計算の回数 30
nRelaxIter メッシュのスナップ時の緩和計算の最大回数 5
表5.9 snapControlsのキーワード

図5.15に概略図に例を示します。(メッシュの動きは多少現実と異なるように見えています。)


図5.15 snappyHexMeshにおける表面のスナップ

[編集] 5.4.7 レイヤーメッシュ

境界面に沿った不規則なセルを作りもしますが、スナップによるメッシュの生成は目的に合致するでしょう。メッシュをかける過程にはさらにオプションがあり、図5.16の暗く影のついた部分が示すように、境界面に沿って並べられた六面体のセルのレイヤを追加します。


図5.16 レイヤーの挿入

メッシュのレイヤの追加は、以下の手順のように既存のメッシュを境界から縮小させ、レイヤを挿入することで行われます。

  1. 表面に対して法線方向の厚み分だけメッシュを投影させる
  2. 最後に移動した境界面の頂点をもとに内部メッシュの緩和を計算する
  3. 有効性を確認し、満足されていない場合は投影された厚みを減らし、2からやり直す。いかなる厚みでも有効性が満足できない場合はレイヤを挿入しない。
  4. 有効性が確認できたらレイヤメッシュを挿入する。
  5. メッシュを再度チェックし、不良箇所が見られる場合はレイヤを除去し2に戻る。

レイヤの追加の手順はsnappyHexMeshDictaddLayersControls サブ辞書の設定によって行われます。入力されるものは表5.10に示す通りです。

キーワード 意味
layers レイヤーの辞書
expansionRatio レイヤーメッシュの拡大比率 1.0
finalLayerRatio レイヤの外側の歪められていないセルの大きさに比例した壁から最も遠い層の厚さ 0.3
minThickness レイヤの外側の歪められていないセルの大きさに比例したセルのレイヤーの最小の厚さ 0.25
nGrow 点がなければ生成されない面に結合されたレイヤの数。輪郭に近いレイヤ追加の収束に役立つ。 1
featureAngle この角度以上では表面は押し出されない 60
nRelaxIter 緩和反復のスナップ最大数 5
nSmoothSurfaceNormals 表面法線のスムージング反復数 1
nSmoothNormals 内部メッシュの運動方向のスムージング反復数 3
nSmoothThickness 表面パッチ上の滑らかなレイヤの厚さ 10
maxFaceThicknessRatio 極端にゆがんでいるセルでレイヤの生成を止める 0.5
maxThicknessToMedialRatio 中間の距離と厚さの比が大きくなるとレイヤの生成を減少する 0.3
minMedianAxisAngle 中間の軸点選択に使う角度 130
nBufferCellsNoExtrude 新しいレイヤの末端のためのバッファ領域を作成 0
表 5.10 snappyHexMeshDictaddLayersControlsサブ辞書のキーワード

 レイヤのサブ辞書はレイヤが適用される各パッチと必要な表面レイヤの数の入力を含んでいます。パッチ名は、レイヤ追加が表面幾何形状ではなく既存メッシュに関連付けられるので使われ、したがって、表面領域ではなく、パッチに適用されます。 レイヤの入力例は以下の通りです。


 layers
  {
      sphere.stl_firstSolid
      {
          nSurfaceLayers 1;
      }
      maxY
      {
          nSurfaceLayers 1;
      }
  }
キーワード 意味
maxNonOrtho 非直交性上限角;180は不可 65
maxBoundarySkewness 境界面ひずみ上限値;<0は不可 20
maxInternalSkewness 内部面ひずみ上限値;<0は不可 4
maxConcave 凹み上限角;180は不可 80
minFlatness 実際の領域に対する最小の投影面積比率;-1は不可 0.5
minVol 最小のピラミッドボリューム;大きな負の数(例 -1e30)は不可 1e-13
minArea 最小面領域;<0は不可
minTwist 最小面ねじれ;<-1は不可 0.05
minDeterminant 最小正常セルの行列式;1=hex;<=0は不法なセル 0.001
minFaceWeight 0→0.5 0.05
minVolRatio 0→1.0 0.01
minTriangleTwist Fluent計算可能性では >0
nSmoothScale エラー分布反復数 4
errorReduction エラー点の置換のための減少量
表 5.11 snappyHexMeshDictmeshQualityControls サブ辞書のキーワード

[編集] 5.4.8 メッシュの水準

メッシュの水準はsnappyHexMeshDictmeshQualityControls サブ辞書へ入力することで制御できます。入力は表5.11に示します。


[編集] 5.5 メッシュの変換

ユーザは、他のパッケージを使用してメッシュを生成し、OpenFOAMが用いる形式にそれらを変換できます。 メッシュ変換コードは、命名規則に従います。 利用可能なメッシュコンバータは以下の通りです。

  • fluentMeshToFoamは、2次元、3次元両方の場合に動くFluent.mshメッシュファイルを読みます。
  • starToFoamは、STAR-CD PROSTARのメッシュファイルを読みます。
  • gambitToFoamは、GAMBIT .neuのニュートラルファイルを読みます。
  • ideasToFoamは、ANSYS .ans形式で書かれたI-DEASメッシュを読みます。
  • cfxToFoamは、.geo形式で書かれたCFXメッシュを読みます。

[編集] 5.5.1 fluentMeshToFoam

 Fluentは、.msh拡張子をもつ単一のファイルに、メッシュ・データを書き出します。 ASCII書式でファイルを書かなければなりませんが、それは、Fluentのデフォルトの選択ではありません。 2次元の幾何形状を含んでいる単一の流れのFluentメッシュを変換することは可能です。 OpenFOAMでは、2次元幾何形状は、現在のところ、3次元でメッシュを定義することで扱われます。 そこでは、前面と背面はempty境界パッチタイプと定義されます。 2次元のFluentメッシュを読みこむときに、コンバータは、自動的に3次元目の方向にメッシュを拡張し、frontAndBackPlanesと名づけ、空のパッチを加えます。

 また、以下の特徴が見られます。

  • OpenFOAMコンバータは、Fluentの境界条件の定義をできるだけ把握しようと試みるでしょう。しかしながら、OpenFOAMとFluentの境界条件の間に明確で、直接的な対応は全くないので、ユーザはケースを実行する前に境界条件をチェックするべきです。
  • 2次元メッシュから軸対称なメッシュを生成することは現在サポートされていませんが、ご要望があれば実装されるでしょう。
  • 複数の媒質からなるメッシュは受入れられません。もし複数の流体媒質が存在していると、それらは単一のOpenFOAMメッシュに変換されるでしょう。もし固体領域が検出されると、コンバータは、それを排除しようと試みるでしょう。
  • Fluentはメッシュの内部にパッチを定義することをユーザーに許しています。つまり、面の両側にセルが存在する場合です。そのようなパッチはOpenFOAMでは許容されていないので、コンバータはそれらを排除しようと試みるでしょう。
  • 現在、埋め込まれたインタフェースと細分化のツリーに関するサポートは全くありません。

 Fluent .mshファイルの変換は、必要なディレクトリーとファイルを作成することによってまず新しいOpenFOAMケースを作ることで始まります。ケースディレクトリはsystem のサブディレクトリにcontrolDict ファイルを含みます。そしてコマンド・プロンプトにおいて、ユーザは以下を実行することになります。

fluentMeshToFoam <meshFile>

ここで<meshFile>は絶対パスか相対パスを含む.mshファイルの名前です。

[編集] 5.5.2 starToFoam

 このセクションはSTAR-CDコードで生成されたメッシュを、OpenFOAMのメッシュのクラスが読むことができる書式に変換する方法を説明します。 メッシュはSTAR-CDとともに供給されるどのパッケージでも生成できます。 例えばPROSTAR、SAMM、ProAMおよびそれらの派生物です。 コンバータは、統合された任意のカップルマッチングを含むどんなただ一つの流れのメッシュも受け入れ、すべてのセルタイプがサポートされます。 コンバータがサポートしない特徴は以下の通りです。

  • 複数の流れのメッシュの仕様。
  • バッフル、すなわち、領域内に挿入された厚さなしの壁。
  • 部分境界、カップルマッチのうちの覆われていない部分は境界面であると考えられます。
  • スライドするインターフェース。

 複数の流れのメッシュに関しては、メッシュ変換は、別々のメッシュとしてそれぞれの個々の流れを書くことによって実現され、OpenFOAMでそれらを組み立て直すことができます。

 OpenFOAMは、セクション5.1で指定されたかなり厳しい妥当性評価基準に整合しているメッシュの入力だけを受け入れるという方針を採ります。 無効なメッシュを用いて実行されることはなく、それ自体が無効なメッシュは変換できません。 以下のセクションは、STAR-CDとともに供給されたメッシュ生成パッケージを用いてメッシュを生成する際に、OpenFOAM形式に変換できることを保証するために取らなければならない方法を説明します。 これからのセクションにおいて重複を避けるために、STAR-CDとともに供給されるメッシュ生成ツールは、STAR-CDという総称によって参照されることにします。


[編集] 5.5.2.1 変換における一般的なアドバイス

 ユーザはstarToFoamの変換を試みる前に、STAR-CDのメッシュをチェックするツールを動かすべきです。 そして、変換の後に、checkMeshユーティリティは新たに変換されたメッシュで実行されるべきです。 あるいはまた、starToFoamはユーザーが問題のあるセルをより近くで見ることができるようにするためのPROSTARコマンドを含む警告を発行するかもしれません。 問題の多いセルとマッチは、OpenFOAMを用いてメッシュを使おうとする前に、チェックされ修正されるべきです。 無効なメッシュはOpenFOAMで動きませんが、それが正当性評価基準を課さない別の環境では動くかも知れないということを覚えていてください。

 コンバータにおいて許容度を合わせることで、許容度のマッチングに関するいくつかの問題を克服できます。 しかしながら、有効性への限界があり、デフォルトレベルからマッチング許容度を増加させることが明らかに必要であるということは、オリジナルのメッシュが正確でないことを示します。


[編集] 5.5.2.2 不要なデータの消去

 メッシュ生成が終了したら、流体セルが作成されて、他のすべてのセルが取り除かれると仮定して、あらゆる不要な頂点を取り除き、セル境界と頂点番号を圧縮してください。これは以下のPROSTARコマンドで実行されます。

CSET NEWS FLUID
CSET INVE

 CSETは空であるべきです。 これがそうでないなら、CSETでセルを調べて、モデルを調整してください。 もしセルを本当に必要としていないなら、PROSTARコマンドを使用することでそれらを取り除くことができます。

CDEL CSET

 同様に、頂点も取り除かれる必要があるでしょう。

CSET NEWS FLUID
VSET NEWS CSET
VSET INVE

 これらの必要とされていない頂点を取り除く前に、必要とされていない境界面は、除かれる前に、集められなければなりません。

CSET NEWS FLUID
VSET NEWS CSET
BSET NEWS VSET ALL
BSET INVE

 BSETが空でないなら、必要とされていない境界面は以下のコマンドを使用して削除することができます。

BDEL BSET

 このとき、モデルは定義された境界面と同様に、流体セルとそれを支持する頂点だけを含むべきです。 すべての境界面はセルの頂点によって完全に支えられるべきです。 もしそうでないなら、すべてが正常になるまで幾何学形状を正常化し続けます。

[編集] 5.5.2.3 デフォルトの境界条件の削除

 デフォルトで、STAR-CDは明示的に境界領域に関連づけられていないどんな境界面に対して壁境界を適用します。 残っている境界面は、割り当てられた境界タイプ0としてdefault境界領域に集められます。 OpenFOAMは、人為ミスを誘発するので、意図的に未定義の界面のためのdefault境界条件の概念を持っていません。例えば、すべての関連付けられていない面にデフォルト条件を意図して与えたかどうかをチェックする手段は全くありません。

 したがって、メッシュが首尾よく変換されるために、各OpenFOAMメッシュに対するすべての境界を指定しなければなりません。 default境界は、以下で説明された手順を用いることで実体を持つものに変えられる必要があります。

  1. Wire Surfaceオプションで幾何学形状をプロットしてください。
  2. default領域0と同じパラメータで余分な境界領域を定義してください。そして、すべての見えている面を、境界ツールでゾーンオプションを選択して、モデルのスクリーンに描かれている全体の周りに多角形を描くことによって、10といった新しい領域に加えてください。PROSTARの以下のコマンドを発行することによって、これができます。
RDEF 10 WALL
BZON 10 ALL

3. 私たちはセットからすべての以前に定義された境界タイプを外すことになるでしょう。境界領域に行ってください。

BSET NEWS REGI 1
BSET NEWS REGI 2
... 3, 4, ...

境界セットに関連している頂点を集め、次に頂点に関連している境界面を集めてください。それらは元のセットのように2倍あるでしょう。

BSET NEWS REGI 1
VSET NEWS BSET
BSET NEWS VSET ALL
BSET DELE REGI 1
REPL

 これは境界領域1の上で定義された境界領域10の面を与えるはずです。BDEL BSETと共にそれらを削除してください。すべての領域にこれらを繰り返してください。

[編集] 5.5.2.4 モデルの再番号付け

 コマンドを使用することでモデルの番号を付け替えて、チェックしてください。

CSET NEW FLUID
CCOM CSET
VSET NEWS CSET
VSET INVE (Should be empty!)
VSET INVE
VCOM VSET
BSET NEWS VSET ALL
BSET INVE (Should be empty also!)
BSET INVE
BCOM BSET
CHECK ALL
GEOM

 内部のPROSTARの照合は、最後の2つのコマンドで実行されます。コマンドはいくつかの予見できない誤りを明らかにするかもしれません。また、PROSTARは幾何学形状にではなく、STAR-CDのために因子を適用するだけであるので、スケール因子に注意してください。因子が1でないなら、OpenFOAMのscalePointsユーティリティを使用してください。

[編集] 5.5.2.5 メッシュデータの出力

 メッシュがいったん完成されたら、モデルのすべての統合されたマッチをカップルタイプ1に置いてください。 他のすべてのタイプが、任意のマッチを示すのに使用されるでしょう。

CPSET NEWS TYPE INTEGRAL
CPMOD CPSET 1

そして、計算格子の構成要素をそれら自身のファイルに書かなければなりません。 これはコマンドを発行し、境界に対してPROSTARを用いることで行われます。

BWRITE

デフォルトでは、これは.23ファイル(3.0の前のバージョン)か.bndファイル(バージョン3.0以降)に書きます。 セルに対しては、以下のコマンド、

CWRITE

がセルを.14.celファイルに出力します。頂点に対しては、以下のコマンド、

VWRITE

.15.vrtファイルに出力します。 現在の既定の設定では、ASCII書式でファイルを書き出します。 カップルが存在しているなら、拡張子.cplを持つ追加カップルファイルが以下のコマンドをタイプすることによって書きだされる必要があります。

CPWRITE

 3つのファイルに出力した後に、PROSTARを終了するか、ファイルを閉じてください。 パネルに目を通して、すべてのSTAR-CDのサブモデル、材料、および流体の特性に注目してください。 材料の特性と数学的モデルは、OpenFOAM辞書ファイルを作成し、編集することで設定される必要があるでしょう。

 PROSTARファイルを変換する手順は最初に、必要なディレクトリを作成することで新しいOpenFOAMのケースを作ることです。 同じディレクトリの中にPROSTARファイルを格納しなければなりません。 そして、ユーザはファイル拡張子を変えなければなりません。 .23.14.15(STAR-CDバージョン3.0以前)か、.pcs.cls.vtx(STAR-CDバージョン3.0以降)から、それぞれ.bnd.cel、および.vrtに変えます。

[編集] 5.5.2.6 .vrtファイルの問題

 .vrtファイルは、フリー・フォーマットというよりむしろ指定された幅に関するデータ列で書かれています。 座標値が続く頂点番号を与えるデータの典型的な行は、以下の通りであるかもしれません。

19422   -0.105988957   -0.413711881E-02   0.000000000E+00

縦座標が科学表記法で書かれていて、負であるなら、値の間には、スペースが全くないかもしれません。例えば以下のような状況です。

19423   -0.953953117E-01-0.338810333E-02 0.000000000E+00

starToFoamコンバータは、縦座標の値を区切るためにスペースを区切り文字としてデータを読むので、前の例を読むとき、問題になります。 したがって、OpenFOAMは必要なところで値の間にスペースを挿入するための簡単なスクリプト、foamCorrectVrtを含んでいます。 すると、それが前の例を以下のように変換するでしょう。

19423   -0.953953117E-01 -0.338810333E-02  0.000000000E+00

したがって、必要ならばstarToFoamコンバータを動かす前に、以下のようにタイプすることでfoamCorrectVrtスクリプトを実行するべきです。

foamCorrectVrt <file>.vrt
[編集] 5.5.2.7 OpenFOAMのフォーマットへのメッシュの変換

 ここで、OpenFOAMの実行に必要な境界、セル、およびポイントファイルを作成するために、変換ユーティリティstarToFoamを実行できます。


starToFoam <meshFilePrefix>


<meshFilePrefix>は、メッシュファイルの絶対か相対パスを含んでいる接頭語の名前です。 ユーティリティの実行後に、OpenFOAM境界タイプはboundaryファイルを手で編集することによって指定されるべきです。

[編集] 5.5.3 gambitToFoam

 GAMBITは.neu拡張子を持つ単一のファイルにメッシュ・データを書き出します。 GAMBITの.neuファイルを変換する手順は、最初に新しいOpenFOAMケースを作成し、そしてユーザがコマンド・プロンプトで以下のコマンドを実行します。

gambitToFoam <meshFile>

ここで<meshFile>は絶対か相対パスを含む.neuファイルの名前です。

 GAMBITファイル形式は例えば、壁、対称面、周期境界といったような境界パッチの種類に関する情報を提供しません。 したがって、すべてのパッチがタイプパッチとして作成されます。 メッシュ変換の後に必要に応じてリセットしてください。

[編集] 5.5.4 ideasToFoam

OpenFOAMはI-DEASによって生成されたメッシュを変換できますが、.ansファイルとしてANSYS形式で書きだされます。 .ansファイルを変換する手順は最初に新しいOpenFOAMケースを作成し、そしてユーザがコマンド・プロンプトから以下のように実行します。

ideasToFoam <meshFile>

ここで<meshFile>は絶対か相対パスを含む.ansファイルの名前です。

[編集] 5.5.5 cfxToFoam

 CFXは.geo拡張子を持つ単一のファイルにメッシュ・データを書き出します。 CFXのメッシュ形式は、ブロック構造です。 すなわち、メッシュは相互の関係と頂点の位置の情報を持つブロックの組として指定されます。 OpenFOAMはメッシュを変換して、できるだけよくCFX境界条件を得ようと試みるでしょう。 単一のOpenFOAMメッシュに変換される全ての領域とともに、多孔質や固体領域などに関する情報を含むCFXの3次元の‘パッチ'定義は無視されます。 CFXは‘デフォルト'パッチの概念をサポートし、そこでは、境界条件が定義されていない外部の面のそれぞれが壁として扱われます。 これらの面はコンバータで集められ、OpenFOAMメッシュのdefaultFacesパッチに入れられ、タイプwallが与えられます。 もちろん、それに続けてパッチタイプを変えることができます。

 CFXでのOpenFOAMの2次元幾何形状は、1つのセルの厚さ[**]の3次元メッシュとして作成されます。 もしユーザがCFXによって作成されたメッシュで2次元のケースを動かしたいなら、前後の面に関する境界条件はemptyとして設定されるべきです。 ユーザは、計算面の他のすべての面に関する境界条件が正しく設定されていることを確かめるべきです。 現在、2次元のCFXメッシュから軸対称の幾何形状を作成するための機能はありません。

 CFXの.geoファイルを変換する手順は最初に新しいOpenFOAMケースを作成し、そしてユーザがコマンド・プロンプトから以下のように実行します。

cfxToFoam <meshFile>

ここで<meshFile>は絶対か相対パスを含む.geoファイルの名前です。


[編集] 5.6 異なるジオメトリ間のフィールドマッピング

 mapFieldsユーティリティは、別のジオメトリーに対応するフィールドに与えられたジオメトリーに関連する1つ以上のフィールドをマップします。 フィールドが関連するジオメトリーの間のどんな類似性も必要とされないほど完全に一般化されています。 しかしながら、ジオメトリーが一貫している場合は、マッピングの過程を簡素化する特別なオプションを用いてmapFieldsを実行できます。

 mapFieldsについて述べるために、いくつかの用語を定義する必要があります。 まず、データがソースからターゲットまでマップされると言います。 ソースとターゲットフィールドの両方の幾何形状と境界タイプ、あるいは条件がまったく同じであるなら、フィールドは一貫していると考えられます。mapFieldsがマップするフィールド・データは、ターゲットとなるケースのcontrolDictstartFrom/startTimeによって指定された時間ディレクトリの中のフィールドです。 データは、ソースとなるケースの同等な時間ディレクトリから読み込まれて、ターゲットとなるケースの同等な時間ディレクトリに写像されます。


[編集] 5.6.1 一貫したフィールドのマップ

 一貫したフィールドのマッピングは、以下の-consistentコマンドラインオプションを使用しながら、mapFieldsを(ターゲット)ケース上で実行することによって、簡単に実行されます。

mapFields <source dir> -consistent

[編集] 5.6.2 一貫しないフィールドのマッピング

 フィールドが図5.17のように一貫していないとき、mapFieldsはターゲットとなるケースのsystem ディレクトリにmapFieldsDict辞書を必要とします。 以下の規則がマッピングに適用されます。

  • フィールド・データはどこでも、可能である限り、ソースからターゲットにマップされます。すなわち、私たちの例では、代替されないままで残っている網掛け領域を除いて、ターゲットとなる幾何形状に含まれるすべてのフィールド・データがソースからマップされます。
  • 別の方法でmapFieldsDict辞書で指定されない限り、パッチフィールド・データは代替されないままです。

 mapFieldsDict辞書は、パッチデータに関するマッピングを指定する2つのリストを含んでいます。 最初のリストは、図5.17のように幾何形状が一致するソースとターゲットとなるパッチの組の間のデータのマッピングを指定するpatchMapです。 リストは、ソースとターゲットとなるパッチの名前のそれぞれの組を含んでいます。2番目のリストは、ターゲットとなるパッチの名前を含むcuttingPatchesです。そのターゲットのパッチの値は、ターゲットとなるパッチが切断するソースの内部のフィールドからマップされます。私たちの例における左下のターゲットとなるパッチにように、ターゲットとなるパッチがソースの内部のフィールドの一部を切断するだけの状況では、内部のフィールドに含まれるそれらの値はマップされ、外部にある値は変わりません。 mapFieldsDict辞書の例は以下に示します。

図5.17 一貫しないフィールドをマップする

17 patchMap
18 (
19 lid movingWall
20 );
21
22 cuttingPatches
23 (
24 fixedWalls
25 );
26
27 // ************************************************************************* //
mapFields <source dir>

[編集] 5.6.3 並列なケースをマップすること

 mapFieldsを実行するとき、並列計算のためにソースとターゲットとなるケースのどちらかもしくは両方を分解するなら、追加オプションが必要になります。

  • -parallelSource ソースケースが並列計算のために分解される場合
  • -parallelTarget ターゲットケースが並列計算のために分解される場合

[編集] 第6章 後処理

本章では、OpenFOAMでのポスト・プロセスのオプションについて述べます。 OpenFOAMにはオープンソースの可視化アプリケーションであるParaViewを用いたポスト・プロセスのユーティリティであるparaFoamが提供されており、これについては6.1節で述べています。 ポスト・プロセスの別の方法としては、EnSightAVS/Express等のサードパーティから供給されている製品を使う方法やFluentのポスト・プロセスを使う方法があります。


[編集] 6.1 paraFoam

OpenFOAMで提供されているメインのポスト・プロセス用のツールは,オープンソースの可視化アプリケーションであるParaViewで走る読み込みのモジュールです。 モジュールはOpenFOAMにより提供されているParaViewのバージョン3.3を用いている2つのライブラリであるPV3FoamReaderとvtkPV3Foamにコンパイルされています。 最新のバイナリでリリースされているソフトウエアについても適切に走るはずですが,このバージョンのParaViewをお使いになることを推奨します。 ParaViewに関する詳細な内容およびドキュメントについては http://www.paraview.orghttp://www.kitware.com/products/paraviewguide.html のサイトから入手することができます。

ParaViewはそのデータ処理とレンダリングのエンジンに可視化ツールキット(VTK)を使っているため、VTKフォーマットであれば,どのようなデータでも読み込むことができます。 OpenFOAMにはfoamToVTKユーティリティがあり,ネイティブな書式のデータをVTKの書式に変換することができ,このことは,VTKベースの画像ツールであれば,OpenFOAMのcaseのポスト・プロセスとして使えることを意味しています。 このことは,OpenFOAMでparaViewを使うことの代替法を提供しています。 ユーザーには高度な使い方,並列処理における可視化を経験してほしいことから,フリーのVisltを推奨します。これは, http://llnl.gov/visit/ から入手できます。

要約すると,OpenFoamのポスト・プロセス用のツールとしては,paraViewの読み込みモジュールを推奨します。 代わりの方法としては,OpenFOAMのデータをparaViewに読み込ませるためにVTKフォーマットに変換する方法と,VTKベースのグラフィックツールを用いる方法があります。

[編集] 6.1.1 paraFoamの概要

paraFoamは,OpenFoamで提供されている読み込みモジュールを用いて,ParaViewを立ち上げる厳密なスクリプトです。 他のOpenFoamのユーティリティ同様に,ルートディレクトリのパスまたは-caseオプションと,引数としてのcase名を入力して実行されます:

paraFoam -case <caseDir>

ParaViewが立ち上がり,オープンすると図6.1 のようになります。 caseは左側のパネルでコントロールされますが,それには次のような項目があります:

  • Pipeline Browserは,paraViewの中でオープンしているモジュールをリストアップしており,選択されたモジュールは黄色にハイライトされ,このモジュールに関するグラフィックスは,脇のeyeボタンをクリックすることにより,有効/無効の切り替えができます。
  • Properties panelには,時間や領域,およびフィールドなどのcaseに関する入力条件の選択項目があります。
  • Display panelは,カラー等の選択されたモジュールの可視化の描画をコントロールします。
  • Information panelはメッシュのジオメトリとサイズのようなcaseの統計値を表示します。

図6.1 paraFoamの画面

ParaViewはツリー構成に基づいた構造で操作するようになっており,その中で,トップレベルのcaseのジュールからサブモジュールのcaseを作成するフィルターをかけることができます。 例えば,圧力のコンターのプロットは,すべての圧力データを持つcaseモジュールのサブモジュールとすることができます。 ParaViewの長所は,ユーザーが数多くのサブモジュールを作ることができることと,画像やアニメーションのどちらでも作ることができるという点にあります。 例えば,ソリッドのジオメトリー,メッシュおよび速度ベクトル,圧力のコンターのプロットなどが追加できますし,これらアイテムについては必要に応じてオン/オフすることができます。

システムの一般的な操作は選択をし,Properties panelの緑の Applyボタンをクリックすることを基本としています。 追加項目ボタンとしては、必要に応じてGUIのリセットを行うResetボタン、アクティブになっているモジュールを削除するDeleteボタンがあります。

[編集] 6.1.2 プロパティパネル

caseモジュールのProperties Panelにはタイムステップや領域,およびフィールドの設定の機能があります。 コントロール方法については,図6.2に説明を記載しています。 現在の読み込みモジュールにおいて,ディレクトリ内のデータをParaViewに書き込むことは、特に価値はありません。 6.1.4節に書いてあるように、現在の読み込みモジュールにおいて、Current Time ControlsあるいはVCR Controlsツールバー内のボタンで、表示のための時間データを選択することができます。 paraFoamの操作においては,何らかの変更を行った時にはAcceptをクリックする必要があります。 このAcceptボタンは,ユーザーが変更するつもりがなかった場合を考慮して,警告を与えるために緑色にハイライトされます。 この操作方法は,承諾する前に多くの選択ができるという長所を持っており,特に,大きなcaseでは,データ処理が最小限で行えるという便利さがあります。 しばしばファイルのcaseデータが変更され、(たとえばフィールドデータが新しい時間ディレクトリに書き込まれたりしたために)ParaViewを書き換える必要がある場合があります。変更を書き込む際には、Propertiesパネル一番上のUpdate GUIボタンをチェックすることによって変更します。

図6.2 caseモジュールのプロパティパネル

[編集] 6.1.3 表示パネル

Displayパネルには,与えられたcaseモジュールのデータの可視化に関する機能があります。

図6.3 Displayパネル

以下が特に重要な点です:

  • データのレンジは,フィールドのmax/minの限界に対して自動的に更新はされませんので,特に,初期のcaseモジュールをロードした時には,適切なインターバルをRescale to Data Rangeで選択するように注意する必要があります。
  • Edit Color Mapボタンでは、2つのパネルによるウィンドウが開きます。

1:Color Scale パネルではスケールの色を選択することができます。標準の青~赤のCFDスケールを選択するには、Choose presetをクリックし、 Blue to Red Rainbox HSVを選択します。
2:Color Legend パネルでは カラーバーの凡例の色を切り替えたり、フォントのような凡例のレイアウトを決定します。

  • 基本となるメッシュはRepresentationメニューのWriteframeを選択することにより表示されます。
  • Writeframeが選択されている場合のメッシュのようなジオメトリはColor byメニューからSolid Colorを選択し,Set Solid Colorウィンドウで指定することにより可視化することができます。
  • イメージはOpacityの値(1=solid,0=invisible)を修正することにより半透明にすることができます。

[編集] 6.1.4 ボタンツールバー

ParaViewの各機能はメインウインドウ上部のメニューバーのプルダウンメニューだけでなく、その下にあるボタンツールバーから選択することもできます。 表示するツールバーはViewメニューのToolbarsから選択することができます。各ツールバーの初期設定の配置は図6.4のようになっており、それぞれどのプルダウンメニューの項目に対応するかを示しています。多くのボタンの機能はアイコンから明快ですし、Helpメニューのtooltipsにチェックがされていればポインタを上に置いたときに簡潔な注を表示させることができます。

図6.4:ParaViewのツールバー

[編集] 6.1.5 ビューの操作

本セクションでは,paraFoamにおけるオブジェクトのビューの設定と取り扱いに関する操作について説明します。

[編集] 6.1.5.1 View settings

View SettingsEdit menuから選択すると、General, Lights, Annotationの3項目からなるRender View Optionsウインドウが表示されます。Generalには開始時に設定すべき以下の項目があります。

  • 背景色、印刷物には白が望ましい
  • CFD、特に2次元のケースではparallel projection(平行投影)が通常用いられる

LightsにはLight Kitパネルに光源の詳細設定があります。Headlightパネルでは直接光をコントロールします。Headlightボタンを白色光の強度1にすれば鮮明な色の画像を得られるでしょう。

Annotationでは、ビューウィンドウにおける軸や原点などの注釈の表示の有無を設定します。Orientation Axesでx,y,z軸の色など、軸の表示設定をします。

[編集] 6.1.5.2 General settings

SettingsEditメニューから選択するとGeneralRender Viewの項目からなるOptionsウインドウが表示されます。

GeneralパネルではParaViewの挙動の初期値を設定します。特に、Auto AcceptをチェックするとPropertiesウインドウで行った変更がApplyボタンをクリックすることなく自動で表示に反映されるようになります。大きな解析ケースではこのオプションは使わない方がよいでしょう。というのもいくつもの変更を行う際にそのつど再描画されるのは煩わしく、一度で反映させた方がよいと思われるからです。

Render ViewパネルにはGeneral, Camera, Serverの3つの項目があります。Generalパネルではlevel of detail (LOD)で回転や平行移動、サイズ変更といった操作時のレンダリングの精度を設定できます。レベルを下げることで多数のセルからなるケースにおいても視点操作時の再描画速度を早くすることができます。

Cameraパネルでは3Dまたは2Dにおける視点の移動を設定します。回転、平行移動、ズームといった操作をマウスとshiftキー、controlキーを組み合わせて行うことができますが、割当ては任意に設定することができます。

[編集] 6.1.6 コンターのプロット

コンターのプロットは,上部のメニューバーのFilterメニューからContourを選択することにより作成することができます。 フィルターはあたえられたモジュール上で役割を果たすことから,モジュール自体が3Dのcaseの場合には,コンターはconstant valueを表す2D表示(同一面:アイソサーフェス)に設定されます。 コンターに関するPropertiesにはユーザーが編集できるIsosurfacesのリストがあり,New Rangeウィンドウにより使いやすくなっています。スカラーフィールドはプルダウンメニューにより選択することができます。

[編集] 6.1.6.1 cutting planeの使い方

希に,同一面でのコンターの作成でなく,断面のコンターを作成したい場合があります。 このためには,最初にSliceフィルターを用いて,コンターをプロットしたい切断面を作成する必要があります。 このSliceフィルターにより,ユーザーはそれぞれcenternormal/radiusを使って,Slice Typeメニューの中にPlane,BoxまたはSphereのカッティングを指定することができます。 マウスを使っても同じように切断面の操作を行うことができます。

その後,コンターのラインを作成するために,切断された面でContourフィルターを実行することができます。

[編集] 6.1.7 ベクトルのプロット

ベクトルのプロットはGlyphフィルターを用いて作成します。 フィルターはVectorsで選択されたフィールドを読み込み,Arrowによりクリアなベクトル画像を提供するためのGlyph Typesのレンジを用意します。それぞれのグリフは,ユーザーが最も効果的にパネルをコントロールするために選択されています。 Promertiesパネルのリマインダーには、グリフのための主要なScale Modeメニューがあります。その中でも最もよく使うオプションは、ベクトルの大きさに比例したグリフの長さのVector、各々のグリフの長さが同じにするOff、また、Set Scale Factorはグリフの基本的な長さをコントロールします。

[編集] 6.1.7.1 セルの中心でのプロット

ベクトルは,デフォルトによりセルの頂点上に作成されますが,セルの中心にプロットデータを作成したい場合もあります。 この場合には,最初にcaseモジュールに対してCell Centersを適用し,その後セルの中心の計算結果のためにGlyphフィルターを適用します。

[編集] 6.1.8 流線

流線は,Stream Tracerフィルターを用いて作成されたトレーサーラインを用いて作成されます。 トレーサーのSeed画面で,Line SourceあるいはPoint Cloud全般のトレーサポイントの配分を指定します。ユーザーは線のようなトレーサーソースを見ることができますが、白で表示させている場合は背景を変更しなければなりません。 トレーサーの軌跡の間隔とトレーサーのステップの長さはStream Tracerパネルの下にあるテキストボックスで指定します。 望み通りのトレーサーのラインを作成するプロセスは大部分が試行錯誤であり,ステップの長さを減少させることによりと同じように円滑にはっきりと表示することができますが,反面計算時間が長くなります。 トレーサーのラインが作成できた後は,よりり高品質な画像を作り出すためにTubesフィルターをTracerモジュールに適用することができます。 このtubesは各々のトレーサーのラインをたどっており,厳密な円筒型にはなっていませんが,固定された側面と半径の数値を持っています。 上述のように側面の数値が10に設定された時,tubesは円筒型として表示されますが,くどいようですが,これには計算コストがかかります。

[編集] 6.1.9 画像の出力

画像を出力する最も簡単な方法はFileメニューからSave Screeshotを選択することです。選択すると、保存する画像の解像度を指定するウインドウが現れます。自動的に解像度が設定されるよう、アスペクト比を固定するボタンがあります。ピクセル解像度を設定すると画像が保存されます。より高画質で保存するには、解像度を幅1000ピクセル以上にするとよいでしょう。A4サイズの書面やPDFの図として、シャープな仕上がりになります。

[編集] 6.1.10 アニメーション出力

アニメーションを作成するには、まずFileメニューからSave Animationを選択します。解像度などいくつかの項目を設定するダイアログウインドウが表示されるので、必要な解像度を指定します。それ以外では、タイムステップごとのフレーム数が重要です。これは直感的には1と設定するでしょうが、アニメーションのフレーム数を多くするためにより大きな値にしてもかまいません。この方法は特に、mpegなど、動画プレイヤーの再生速度に制限がある場合に、アニメーションの速度を遅くしたいときに有効です。

Save Animationボタンを押すと、ファイル名やファイル形式を設定する別のウインドウが現れます。OKを押すと、"<ファイル名>_<画像番号>.<拡張子>"という名前で一群の画像ファイルが保存されます。例えばanimationというケースの3番目の画像は、"animation_0002.jpg"となります。(画像番号は0000から始まります)

一連の画像が保存されると、適当なソフトを使って動画に変換することができます。ImageMagickパッケージに含まれる変換ユーティリティは、以下のようにコマンドラインから実行できます。

convert animation*jpg movie.mpg

mpeg動画を作成する際に初期設定のquality-90%から動画のクオリティを上げるといいでしょう。これによって粒状ノイズを削減することができます。


[編集] 6.2 Fluentによる後処理

Fluentを、OpenFOAMで実行したケースに、ポストプロセッサとして適用することも可能です。 その目的のために、2つの変換器が提供されています。 foamMeshToFluentは、OpenFOAMのメッシュをFluentフォーマットに変換し、それを.mshファイルとして書き出します。 そして、foamDataToFluentは、OpenFOAMの結果のデータを、Fluentが読むことができる.datファイルに変換します。 foamMeshToFluentは、普通の方法で実行することができます。 その結果のメッシュは、そのケースディレクトリのfluentInterfaceサブディレクトリに書き出されます。 すなわち、<caseName>/fluentInterface/.mshです。

foamDataToFluentは、OpenFOAMのデータの結果を、Fluentフォーマットに変換します。 変換は、2つのファイルに制御されます。 まず、controlDict辞書は、startTimeを設定し、変換される結果のセットを与えます。 これは、変換される結果のセットを与えます。 もしあなたが、最新の結果を変換したければ、startFromlatestTimeと設定することができます。 translationを指定する2番目のファイルは、foamDataToFluentDict辞書です。 このファイルは、constantディレクトリに置かれています。 foamDataToFluentDict辞書の例を以下に示します。

 1 /*--------------------------------*- C++ -*----------------------------------*\
 2 | =========                 |                                                 |
 3 | \\       / F ield         | OpenFOAM: The Open Source CFD Toolbox           |
 4 | \\      /  O peration     | Version: 1.5                                    |
 5 |    \\ /    A nd           | Web:      http://www.OpenFOAM.org               |
 6 |     \\/    M anipulation |                                                  |
 7 \*---------------------------------------------------------------------------*/
 8 FoamFile
 9 {
10      version    2.0;
11      format     ascii;
12      class      dictionary;
13      object     foamDataToFluentDict;
14 }
15 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
16
17 p               1;
18
19 U               2;
20
21 T               3;
22
23 h               4;
24
25 k               5;
26
27 epsilon         6;
28
29 gamma           150;
30
31 // ************************************************************************* //

辞書は、次の形式のエントリーを含んでいます。

<fieldName> <fluentUnitNumber>

<fluentUnitNumber>は、Fluentポストプロセッサーが使うラベルです。 Fluentは、ある決まったセットのフィールドしか認識しません。 <fluentUnitNumber>の数の基本的なセットは、表6.1に引用されています。

フルーエント名 ユニット番号 共通OpenFOAM名
PRESSURE 1 p
MOMENTUM 2 U
TEMPERATURE 3 T
ENTHALPY 4 h
TKE 5 k
TED 6 epsilon
SPECIES 7 ---
G 8 ---
XF RF DATA VOF 150 gamma
TOTAL PRESSURE 192 ---
TOTAL TEMPERATURE 193 ---

表 6.1: ポストプロセッサのためのFluentのユニット番号

辞書は、ユーザーがポストプロセスに必要とする、全てのエントリーを含まなければなりません。 たとえば、我々の例では、圧力pと速度Uのためのエントリーをいれています。 デフォルトエントリーのリストは、表6.1に記述されています。 ユーザーは、他のユーティリティの様に、foamDataToFluentを実行することができます。

Fluentでその結果を見るためには、ケースのディレクトリのfluentInterfaceサブディレクトリに移動して、3次元のバージョンのFluentを次のようにして開始します。

fluent 3d

メッシュとデータファイルは、ロードされ、その結果が可視化されます。 メッシュは、FileメニューのRead Caseを選択することで読むことができます。 あるデータタイプを読むためには、サポートアイテムを選択するべきです。 例えば、kepsilonの乱流データを読むには、ユーザーは、Define->Models->Viscousメニューからk-epsilonを選択することになります。 次に、データファイルは、FileメニューのRead Dataを選択することで、読むことができます。

注意すべき点:ユーザーは、OpenFOAM形式に変換されたオリジナルのFluentメッシュファイルを、Fluentフォーマットに変換されたOpenFOAMの解と結合して使ってはなりません。 なぜなら、ゾーンの番号付けの配列が保証できないからです。


[編集] 6.3 Fieldviewによる後処理

OpenFOAMは、OpenFOAMのケースをFieldviewでポストプロセスする為の機能を提供しています。 後処理ユーティリティのfoamToFieldviewを使って、OpenFOAMのケースデータをFieldview.uns ファイルの形式に変換する事ができます。

foamToFieldviewは、他のOpenFoamのユーティリティと同じように実行することができます。 foamToFieldviewFieldview というディレクトリをケースディレクトリの中に作成します。すでにFieldview ディレクトリが存在していた場合は削除されます。

デフォルトでは、foamToFieldviewは全てのtimeディレクトリのデータを読み込んで、<case>_nn.unsのようなファイルのセットに出力します。nnは連番で、最初のtimeディレクトリの時刻歴データでは1から始まり、その後2,3,4と続きます。

ユーザーは、オプション"-time <time>"を使用して、特定のtimeディレクトリのデータだけを変換することも出来ます。<time>は、一般的、科学的、または固定の形式です。

Fieldviewの一部の機能は、境界条件に関する情報を必要とします。たとえば流線を計算する時、境界面についての情報を使用します。foamToFieldviewはデフォルトで境界面の情報を含むように試みます。 ユーザーは、コマンドオプション"-noWall"を使って、境界面情報を含まないように変換することも出来ます。

Fieldviewのunsファイルの拡張子は".uns"です。変換元となったOpenFOAMのケース名にドット'.'を含んでいる場合、Fieldviewは一連のデータを時系列データと解釈することができず、単一のデータ(定常データ)と見なすかもしれません。


[編集] 6.4 EnSightによる後処理

foamToEnsightを使ってOpenFOAMのデータをEnSightの形式に変換するか、ensight74FoamExecモジュールを使って直接EnSightから読み込むことによってEnSightで事後処理を行うことができます。

[編集] 6.4.1 EnSightの形式への変換

foamToEnSightはOpenFOAMのデータをEnSightの形式に変換します。foamToEnSightは普通のアプリケーションと同様に実行できます。foamToEnsightはケースディレクトリ内にEnsightというディレクトリを作成します。この際、既存のEnsightディレクトリは削除されます。各時間のディレクトリを読み込み、ケースファイルとデータファイルのまとまりとして書き込みます。ケースファイルはEnSight_Caseという名前でデータファイルの詳細が含まれます。各データファイルはEnSight_nn.extという名前で、nnは最初の時間ディレクトリの時刻を1として通し番号が入ります。extは物理量に応じた拡張子です。たとえば、Tは温度で、meshはメッシュです。変換が完了するとEnSightで通常の方法で読み込むことができます。

  1. EnSightのGUIにおいて、File→Data(Reader)を選択する。
  2. ファイルボックス内で適切なEnSight_Caseファイルを強調表示させる。
  3. Formatの選択肢は、EnSightのデフォルトのCaseです。
  4. Caseをクリックし、Okayを選択する。

[編集] 6.4.2 ensight74FoamExec readerモジュール

EnSightではユーザー定義のモジュールを用いて他の形式のファイルをEnSightに変換することが可能です。OpneFOAMにはensight74FoamExecというモジュールがlibuserd-foamライブラリにコンパイルされています。EnSightに必要なのはこのライブラリで、次節で述べるファイルシステムに置かれる必要があります。

[編集] 6.4.2.1 EnSightの読込モジュールの設定

EnSightリーダーの実行には、環境変数が適切である必要があります。$WM_PROJECT_DIR/etc/apps/ensightFoam内のbashrcまたはcshrcファイルで設定を行います。EnSightに関する環境変数は6.2の$CEI_や$ENSIGHT7_です。EnSightの通常インストール時のパス設定では、 $CEI_HOMEのみ手動で設定すればよいはずです。


環境変数説明とオプション
$CEI_HOME EnSightがインストールされるパス(例:/usr/local/ensight)はデフォルトでシステムパスに加わる
$CEI_ARCH $CEI_HOME/ensight74/machinesのマシンディレクトリ名に対応する名前から選択したマシン構造;デフォルト設定ではlinux_2.4sgi_6.5_n32含む
$ENSIGHT7_READER EnSightがユーザーの定義したlibuserd-foam読込みライブラリを探すパス、デフォルトでは$FOAM_LIBBINに設定
$ENSIGHT7_INPUT デフォルトではdummyに設定

表6.2: EnSightで用いる環境変数の設定

[編集] 6.4.2.2 読込モジュールの利用

EnSight readerを使う際の主要な問題は、解析ケースをOpenFOAMではディレクトリで定義するのに対し、EnSightでは特定のファイルによって定義されている必要があるということです。EnSightはディレクトリ名の選択ができないので、以下の手順で、特にケースの詳細を選択する際に注意しながら読込モジュールを使います。

  1. EnSightのGUIにおいて、File→Data(Reader)を選択します。
  2. FormatメニューからOpenFOAMの選択ができるはずです。できない場合は、環境変数の設定に問題があります。
  3. File Selectionウインドウからケースディレクトリを探し、Directories欄の/.または/..で終わる、上2つのうち1つを強調表示させ、(Set)Geometryを選択します。
  4. パスフィールドには解析ケースが入っています。(Set)Geometryの欄には/が含まれるはずです。
  5. OkayをクリックするとEnSightがデータを読み込み始めます。
  6. データが読込まれると、新しくData Part Loaderウインドウが現れ、どの部分を読込むか尋ねられるので、Load allを選択します。
  7. Data Part Loaderのウインドウが表示されているといくつかの機能が動かないので、メッシュがEnSightのウインドウに表示されたら閉じます。


[編集] 6.5 データのサンプリング

OpenFOAMはフィールドデータの任意の位置における値を取得するユーティリティ、sampleを提供しています。 グラフ上にプロットするために1次元の線上、または等値面画像を表示するために2次元平面上のデータが取得されます。 データ取得位置は、ケースのsystemディレクトリにある、sampleDictで指定します。データは良く知られているグラフパッケージ、Grace/xmgr, gnuplot, jPlotのような様々な形式で書き出すことができます。

sampleDictは、$FOAM_UTILITIES/postProcessing/sampling/sampleにあるsampleソースコードディレクトリに 例として添付しているsampleDictをコピーすることで作成できます。 $FOAM_TUTORIALS/solidDisplacementFoamのplateHoleチュートリアルのケースにも1D線型データ取得のための記述例があります。

17 interpolationScheme cellPoint;
18
19 setFormat      raw;
20
21 sets
22 (
23     leftPatch
24     {
25          type           uniform;
26          axis           y;
27          start          (0 0.5 0.25);
28          end            (0 2 0.25);
29          nPoints        100;
30     }
31 );
32
33 surfaces
34 ();
35
36 fields
37 (
38     sigmaxx
39 );
40
41 // ************************************************************************* //
キーワード オプション 説明
interpolation- cell セル中心の値でセル全体が一定とみなす
Scheme cellPoint セルの値から線型重み付け補間
cellPointFace 線型重み付けまたはセル表面から補間
setFormat raw ASCII生データ
gnuplot gnuplot形式データ
xmgr Grace/xmgr形式データ
jplot jPlot形式データ
surfaceFormat null 出力しない
foamFile 点,面,値のファイル
dx DX スカラー または ベクトル形式
vtk VTK ASCII 形式
raw xyz座標と値 gnuplotsplotなど向け
stl ASCII STL; 表面のみ,値なし
fields サンプルするフィールドのリスト、例として速度 U:
U Uの全成分を出力
U.component(0) 成分0を出力 i.e. Ux
U.component(1) 成分1を出力 i.e. Uy
mag(U) ベクトル、テンソルの大きさを出力 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): {|U|}
sets 1次元のsetsサブディクショナリのリスト — Table 6.4を参照
surfaces 2次元のsurfacesサブディクショナリリスト — Table 6.5 および Table 6.6を参照

表 6.3: sampleDictにおけるキーワード指定

このファイルには、次の入力項目があります。

  • interpolationScheme データ内挿のスキーム
  • sets フィールドが線型サンプルされる(1D)解析領域の中の位置
  • surfaces フィールドが面型サンプルされる(2D)解析領域の中の位置
  • setFormat 線データ出力のフォーマット
  • surfaceFormat 面データ出力のフォーマット
  • fields サンプルされるフィールド

interpolationSchemeには、多面体の各セルを四面体に分割し、サンプルされる値が四面体頂点の値から補間されるcellPointcellPointFaceオプションがあります。 cellPointでは、四面体の頂点は、多面体のセルの中心と、面の頂点3つから成ります。セルの中心と一致する頂点は、セル中心のフィールド値を継承し、他の頂点はセルの中心の値から内挿した値をとります。cellPointFaceでは、四面体頂点の内の1つが、面の中心とも一致します。面が交差するセルの中心での値による内挿スキームによって、フィールド値を継承します。

ラインサンプリングのためのsetFormatエントリーは、生データフォーマットと、グラフ描画パッケージのためのgnuplot, Grace/xmgr, jPlotフォーマットがあります。データは、ケースディレクトリのsetsディレクトリに書き出されます。そのディレクトリは、一連の時間ディレクトリに分割され、データファイルは、その中に格納されます。各々のデータファイルは、フィールド名、サンプルセット名、そして出力フォーマットに関係した拡張子を持つ名前が付けられます。拡張子は、生データでは.xyGrace/xmgr用には.agrjPlotには.datとなります。gnuplotのフォーマットは、生の形式のデータと、それに加えてコマンドファイルを含んでいます。このコマンドファイルは、.gpltという拡張子を持ち、グラフを生成するためのものです。 sampleが実行されるときは、既存のsetsディレクトリが削除されるので注意してください。

サーフェスサンプリングのためのsurfaceFormatエントリーは、生データフォーマットとグラフ描画パッケージのためのgnuplot, Grace/xmgr, jPlotフォーマットがあります。データは、ケースディレクトリの、surfacesディレクトリに書き出されます。そのディレクトリは時間ディレクトリに分割され、データファイルはsetsと同様にその中に格納されます。

fieldsリストは、データを取得したいフィールドが記述されます。 sampleユーティリティは、次の限定された関数を、ベクトルやテンソルフィールドを修正することができるように、解析することができます。 例えば、Uのためには、

U.component(n) これは、ベクトル(テンソル)のn番目の要素を書く。n=0,1,....

mag(U) これは、ベクトル(テンソル)の大きさを書く

setsリストは、サンプルされるべきデータの位置の、サブディクショナリで構成されます。 各サブディクショナリは、そのセットの名前に従って名前が付けられ、表6.4にも示すようにデータ取得位置に関する記述がなされます。

例えば、uniformサンプリングは、startendポイントで指定した直線上に、均等に分割したn<tt>点でデータを取得します。 全てのsetsには、<tt>typeとグラフ用の縦軸の長さを指定するaxisキーワードを与えます。


サンプル型 データ取得位置 必要項目
nameaxisstartendnPointspoints
uniform 線上に一様配分
face 指定された線とセル表面の交点
midPoint 線/面の交点と交点の中点
midPointAndFace midPointおよびface
curve 曲線に沿った指定された点
cloud 指定された点


入力項目 説明 オプション
type データ取得の型 上の一覧参照
axis Output of sample location x x ordinate
y y ordinate
z z ordinate
xyz xyz coordinates
distance distance from point 0
start データ取得線の始点 e.g.(0.0 0.0 0.0)
end データ取得線の終点e.g.(0.0 2.0 0.0)
nPoints データ取得点の数 e.g.200
points データ取得点一覧

表 6.4: sets副辞書におけるエントリ


キーワード 説明 オプション
basePoint 平面上の点 e.g.(0 0 0)
normalVector 平面の法線ベクトル e.g.(1 0 0)
interpolate 補間の有無 true/false
triangulate 三角形で分割するか (任意) true/false

表 6.5: surfaces副辞書におけるsurfaces用のエントリ


キーワード 説明 オプション
patchName パッチ名 e.g.movingWall
interpolate データ補間の有無 true/false
triangulate 三角形で分割するか (任意) true/false

表 6.6: surfacesサブディクショナリにおけるpatch用のエントリ

surfacesリストは、データ取得位置のサブディクショナリのリストによって構成されます。各サブディクショナリは、表面の名前に従った名前が付けられ、typeで始まる一連の記述で構成されます。平面上の点と法線ベクトルで定義され、表6.5に示される項目の記述がなされる、planeか、または、既存の境界パッチと一致し、表6.6に示される項目の記述がなされるpatchのいずれかです。


[編集] 6.6 ジョブのモニタと管理

本節では、まず正しく実行されたOpenFOAMのジョブについて言及し、3.3節で説明したソルバーの基本的な実行についてまで述べます。 $WM_PROJECT_DIR/etc/controlDictファイルのDebugSwitchesの、levelデバッグスイッチが1または2(デフォルト)であったなら、ソルバーの実行時に方程式の解の状態を標準出力、例えばスクリーンに出力します。以下ではcavityチュートリアルを解く際の出力の冒頭部分を例として挙げています。ここから解かれる各々の方程式について、レポート行に、ソルバー名、解かれる変数、その初期と最終の残差、そして反復回数が書かれていることが読み取れます。

    Starting time loop

Time = 0.005

Max Courant Number = 0
BICCG: Solving for Ux, Initial residual = 1, Final residual = 2.96338e-06, No Iterations 8
ICCG: Solving for p, Initial residual = 1, Final residual = 4.9336e-07, No Iterations 35
time step continuity errors : sum local = 3.29376e-09, global = -6.41065e-20, cumulative = -6.41065e-20
ICCG: Solving for p, Initial residual = 0.47484, Final residual = 5.41068e-07, No Iterations 34
time step continuity errors : sum local = 6.60947e-09, global = -6.22619e-19, cumulative = -6.86725e-19
ExecutionTime = 0.14 s

Time = 0.01

Max Courant Number = 0.585722
BICCG: Solving for Ux, Initial residual = 0.148584, Final residual = 7.15711e-06, No Iterations 6
BICCG: Solving for Uy, Initial residual = 0.256618, Final residual = 8.94127e-06, No Iterations 6
ICCG: Solving for p, Initial residual = 0.37146, Final residual = 6.67464e-07, No Iterations 33
time step continuity errors : sum local = 6.34431e-09, global = 1.20603e-19, cumulative = -5.66122e-19
ICCG: Solving for p, Initial residual = 0.271556, Final residual = 3.69316e-07, No Iterations 33
time step continuity errors : sum local = 3.96176e-09, global = 6.9814e-20, cumulative = -4.96308e-19
ExecutionTime = 0.16 s

Time = 0.015

Max Courant Number = 0.758267
BICCG: Solving for Ux, Initial residual = 0.0448679, Final residual = 2.42301e-06, No Iterations 6
BICCG: Solving for Uy, Initial residual = 0.0782042, Final residual = 1.47009e-06, No Iterations 7
ICCG: Solving for p, Initial residual = 0.107474, Final residual = 4.8362e-07, No Iterations 32
time step continuity errors : sum local = 3.99028e-09, global = -5.69762e-19, cumulative = -1.06607e-18
ICCG: Solving for p, Initial residual = 0.0806771, Final residual = 9.47171e-07, No Iterations 31
time step continuity errors : sum local = 7.92176e-09, global = 1.07533e-19, cumulative = -9.58537e-19
ExecutionTime = 0.19 s

[編集] 6.6.1 計算実行用のfoamJobスクリプト

残差や反復回数、Courant数などがレポートデータとしてスクリーンを横切るのをモニターすれば満足でしょう。 代わりに、レポートをログファイルにリダイレクトすることで計算速度を向上させることもできます。 このためにfoamJobスクリプトは、便利なオプションを提供しています。 <solver>を指定して実行することで、計算がバックグラウンドで実行され、出力をlogという名前のファイルに記録します。

foamJob <solver> 

その他のオプションは、foamJob -h を実行することで見ることができます。 logファイルは、UNIXtailコマンドを用いることで見たいときに見ることができます。一般的には、"follow"を意味する-fオプションを 一緒に用いることでlogファイルに新しいデータが記録されるのを捉えることができます。

tail -f log

[編集] 6.6.2 計算モニター用のfoamLogスクリプト

logファイルを読むことで、ジョブをモニターするには、限界があります。 特に、長い期間に渡って、傾向を抽出するのは困難です。したがって、foamLogスクリプトによって残差や反復回数、Courant数のデータを抽出し、グラフにプロットできるように一連のファイルとして出力することができます。スクリプトは次のように実行します。

foamLog <logFile>  


ファイルは、ケースディレクトリのlogsという名前のサブディレクトリの中に保存されます。 各々のファイルは、<var>_<subIter>という名前が付けられます。ここで、<var>は、ログファイルの中で指定される変数の名前で、<subIter>は、タイムステップの繰り返し回数です。 解かれる変数である、初期残差は、変数名をとり<var>、最終残差は<var>FinalResという名前をとります。 デフォルトでは、ファイルは、時間と抽出された値という2列のフォーマットで表されます。

例として、cavityチュートリアルでは、解が定常状態に収束するのかを見るために、観察したいのはUx方程式の初期残差です。 この場合、logs/Ux_0ファイルからデータを取り出し、図6.5のようにプロットします。 ここでは、残差は単調に収束許容値構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 10^{-5} まで減少しているが読み取れます。


foamLogは、logファイルから、うまくそれができるようにファイルを作成する。 cavityチュートリアルの例では次のファイルがあります。

  • Courant数、Courant_0
  • Ux方程式の初期と最終の残差である、Ux_0UxFinalRes_0、そして反復回数のUxIters_0(そしてこれと同等のUyデータ)
  • 累積、全体そしてローカルの連続誤差。これは、p方程式毎に出す。contCumulative_0, contGlobal_0, contLocal_0contCumulative_1, contGlobal_1, contLocal_1
  • p方程式から、残差と反復回数p_0, pFinalRes_0, pIters_0, p_1, pFinalRes_1, pIters_1
  • 実行時間 executionTime

図6.5 cavityチュートリアルにおけるUxの初期残差


[編集] 第7章 モデルと物性値

OpenFOAMは特定のクラスの問題に対し,各々に対応した幅広い範囲のソルバーを内蔵しています。 ユーザーは,特定のケースに対してモデリングを行う際に最初にソルバーの選択ができるように,その方程式とアルゴリズムは一つ一つが異なったものとなっています。 ソルバーは,一般的には3.5節に,ケースに対して適切なソルバーが見つけやすいように記述してありますので,この中から選択して下さい。 各々のcaseを定義するためには,最終的にはパラメータと物理的特性が必要となりますが,いくつかのモデリングのオプションはcaseのconstantディレクトリの中のdictionaryに登録されている中から実行時に指定することができます。 本章では,一般的なモデルと,実行時に指定される関連したプロパティについて詳しく説明します。


[編集] 7.1 熱物理モデル

熱物性モデルは,エネルギー,熱および物理的な特性が関与しています。

thermophysicalPropertiesディレクトリは,thermophysicalモデルのライブラリを使用するすべてのソルバーにより読み込まれます。 熱物性モデルは,OpenFOAMの中では,その他のプロパティについても計算される圧力温度(p-T)システムとして構築されます。 これは,シミュレーションの中で使用される完全な熱物性モデルを指定するthermoTypeと呼ばれる必須のdictionary登録です。 熱物性のモデリングは,状態の基礎方程式を定義しているレイヤーからスタートし,前のレイヤーからプロパティを読込んだモデリングのレイヤーを追加します。 thermoTypeの名称は,表7.1にリストアップしているモデリングのマルチレイヤーを意味しています。


状態方程式 -- equationOfState
perfectGas 理想気体状態方程式
標準熱特性 -- thermo
hConstThermo エンタルピ h とエントロピー s を持つ一定の比熱 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): c_p

モデル

janafThermo 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): c_p
evaluated by a function with coefficients from JANAF thermodynamic tables, from which h, s are evaluated
派生熱特性 -- specieThermo
specieThermo cp、h、そして/または、sから得られた特殊な熱特性
輸送特性 -- transport
constTransport 一定の輸送特性
sutherlandTransport 温度依存する輸送輸送のためのサザーランドの公式
混合特性 -- mixture
pureMixture パッシブガス混合の一般熱モデル計算
homogeneousMixture 正規化燃料質量分率 b に基づく混合気燃焼
inhomogeneousMixture b と総燃料質量分率 ft に基づく混合気燃焼
veryInhomogeneousMixture b と ft と未燃燃料質量分率 fu に基づく混合気燃焼
dieselMixture ft と fu に基づく混合気燃焼
multiComponentMixture 複数の成分に基づく混合気燃焼 [**]
chemkinMixture CHEMKIN熱力学と反応スキームデータベースファイルを用いた混合気燃焼
熱モデル -- thermoModel
hThermo エンタルピー h に基づく一般熱モデル計算
hMixtureThermo 混合気燃焼のエンタルピー計算
hhuMixtureThermo 未燃ガスと混合気燃焼のエンタルピー計算

表 7.1: 熱物性モデリングの階層

thermoTypeのエントリーは、次の形式をとる。

thermoModel<mixture<transport<specieThermo<thermo<equationOfState>>>>> 

それで、次に示すのは、thermoTypeのエントリーの例である。

hThermo<pureMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>>

[編集] 7.1.1 熱物性データ

基本的な熱物理の性質は、入力データから、各々の種(species)のために指定される。そのデータは、種のために、次に示す形式の複合的なエントリーを使って指定される。 この複合的なエントリーは、キーワードmixtureが使われる。

 mixture <specieCoeffs> <thermoCoeffs> <transportCoeffs>

物性係数<specieCoeffs>は、表7.2にリストされるエントリーを含み、その順番は入力で指定される順番となる。

説明 入力
文字列名 e.g.mixture
この種のモル数 nmoles
分子量 W (kg/kmol)

表 7.2: 物性係数

熱物理の係数<thermoCoeffs>は、見掛け上、他の性質がそれから導出される、比熱容量構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p を評価することに関連している。 現在のthermoモデルは、以下に示す通りである。

hConstThermo
一定の構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p

と融解熱 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): H_f を仮定する。これらは、単純に<specieCoeffs>の後に2つの値 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): H_f を続けて指定する。

janafThermo
構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p

を温度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T の関数として計算する。このとき、一連の係数は、熱力学のJANAFテーブルのものを用いる。順序づけられた係数のリストを、表7.3に示した。関数は、下限 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_l と上限構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_h の間で妥当性が確認されている。係数のセットが2つ指定される。最初のセットは常温構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_c 以上の温度についてのものである。(そして、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_h 以下である。2つめのセットは構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_c より低く構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_l より高い範囲についてのもの)。構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): C_p を温度の関数として表すと、

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): c_p = R((((a_4 T + a_3 )T + a_2 )T + a_1 )T + a_0 )
加えて、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): a_5

,構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): a_6 という積分定数がある。これらは、それぞれ、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): h構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): s を評価するために使われ、高温と低温の両方で同じ定数が用いられる。

説明 入力
下限温度 Tl (K)
上限温度 Th (K)
常温 Tc (K)
高温度係数 a0 . . . a4
高温度エンタルピー補正 a5
高温度エントロピー補正 a6
低温度係数 a0 . . . a4
低温度エンタルピー補正 a5
低温度エントロピー補正 a6

表 7.3: JANAF熱力学的係数


移動係数<transportCoeffs>は、動的粘性率構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu 、熱伝導度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \kappa 、層流熱伝導度(エンタルピー方程式のため)構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \alpha を評価するために使われる。 現在のtransportモデルは、以下に説明する通りである。

constTransport
構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu

とPrandtl数 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): P_r = C_p \mu/\kappa が一定であると仮定する。ここでは、<thermoCoeffs>の後に構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): P_r の2つの値を続けて指定する。

sutherlandTransport
構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu

を温度構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T の関数として計算する。これには、Sutherland係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): A_s とSutherland temperature 構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): T_s を用いる。この2つの数は、<thermoCoeffs>の後に続けて指定する。構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu は、次のように計算される。

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \mu=\frac{A_s\sqrt{T}}{ 1 + T_s/T}


次は、fuelという名前の種についての、エントリーの例である。 これは、sutherlandTransportjanafThermoを使ってモデルされている。また、エントリーの説明のためにコメントが入っている。

fuel                                          // keyword
fuel 1 44.0962                                // specie
200 5000 1000                                 // -- janafThermo --
7.53414 0.0188722 -6.27185e-06 9.14756e-10 -4.78381e-14
-16467.5 -17.8923
0.933554 0.0264246 6.10597e-06 -2.19775e-08 9.51493e-12
-13958.5 19.2017                              // -----------------
1.67212e-06 170.672;                          // sutherlandTransport

次に示すのは、airという名前の種についての、エントリーの例である。 これは、constTransporthConstThermoでモデルされている。エントリーの説明のためにコメントが入っている。

mixture        // keyword
air 1 28.9     // specie
1000 2.544e+06 // hConstThermo
1.8e-05 0.7;   // constTransport


[編集] 7.2 乱流モデル

RASPropertiesdictionaryは、乱流モデルとしてReynolds-averaged stress(RAS)モデルを使っているソルバーが読み込みます。 LESPropertiesdictionaryは、乱流モデルとしてlarge-eddy simulation (LES)モデルを使っているソルバーが読み込みます。 RASPropertiesに必要なエントリーは、表7.4に示します。 また、LESPropertiesdictionaryのエントリーは、表7.5に示します。


RASModel RASモデルの名前
turbulence 乱流モデルのon/offスイッチ
Coeffs 各RASModelにおける係数
wallFunctionCoeffs 壁関数の係数

表 7.4: RASPropertiesdictionaryにおけるキーワード・エントリ

LESmodel LESモデルの名前
delta デルタ構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta

モデルの名前

Coeffs 各LESモデルにおける係数
Coeffs 各デルタ構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \delta

モデルにおける係数

kappa フォン・カルマン定数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \kappa
wallFunctionCoeffs 壁関数の係数

表 7.5: LESPropertiesdictionaryにおけるキーワード・エントリ

非圧縮性および圧縮性のRAS乱流モデル、等容変化および非等容変化LESモデル、そしてデルタモデルは、表3.9に示しています。 関連するケースのturbulencePropertiesdictionaryを見て、各々のモデルのために必要とされる係数のリストとデフォルト値を参考にしてください。必要とされる 係数は、RASモデルが非圧縮性か圧縮性かにより、あるいはLESモデルが等容変化か非等容変化かによって異なります。 参考として、それらのモデルはそれぞれ、$FOAM_TUTORIALSの中にある以下の例題ケースのRASPropertiesLESPropertiesdictionaryに示しています。

  • turbFoam/cavity 非圧縮性RASモデル;
  • sonicTurbFoam/prism 圧縮性RASモデル;
  • oodles/pitzDaily 等容LESモデル;
  • Xoodles/pitzDaily 非等容LESモデル;

[編集] 付録A ケースマネージャ

OpenFOAMは,caseの実行を管理するためのFoamXユーティリティと一緒に提供されています。 FoamXはGUIであり,ほとんどの場合はローカルマシンのcaseの管理に使われていますが、インターネットのようなネットワーク上に割り当てられたcaseを管理することもできます。

本章は主に,FoamXに関する参考資料となっており,section A.3とsection A.4でFoamXの一般的な使い方に関する有効なアドバイスを提示していますが,新規のユーザーはFoamXの使い方を習得するために,最初にチュートリアル(2章)を参照して下さい。

ネットワーク上でcaseを実行するメカニズムは,他のマシンのJAVA GUIから呼び出すことができるサービスを提供するホストマシンを持つことによって成立しています。 JAVA GUIとこれらサービス(ホストブラウザ,case ブラウザ,およびcaseサーバ。C++で書かれています。)の間のインタフェースは,Common ObjectRequest Broker Architecture(CORBA)を実装しているMICOです。ローカルのマシンでcaseを管理するだけの場合には,そのマシンからホストブラウザとJAVA GUIの両方を立ち上げることができます。

以下のセクションにおいては,これをノーマルモードとすることにします。オプション類を以下に要約します:

ローカルでホストブラウザが実行(ノーマルモード):この場合には,ユーザーはrunFoamXを実行させることにより,ホストブラウザとGUIの両方を立ち上げることができます。

runFoamX

リモートでホストブラウザが実行(リモートモード):この場合には,最初にrunFoamXHBによって、ホストブラウザがホストマシン上で立ち上げられます。

runFoamXHB

そして実行中のホストブラウザに接続するrunFoamXを実行することにより,GUIがローカルで立ち上げられます。

runFoamX

これらのオプションの中に含まれているプロセスを図A.1に示します。 runFoamXが実行される時,runFoamは実行中のホストブラウザを探します。 どれか1つが実行中であれば,すなわち先にrunFoamXHBが立ち上がっていれば,runFoamXはこれに接続します;そうでなければ,自分自身がホストブラウザを起動します。 section A.1, section A.2, section A.3では、FoamXの一般的な操作方法が、ネットワーク上でどのように操作されるかを特に強調しながら述べられています。続いてsection A.4では、case serverを通じたOpenFOAMのケースの実行について述べられ、section A.5ではFoamXに関係した設定について述べられています。


[編集] A.1 ネームサーバーとホストブラウザ

ホストマシン上でFoamXのホストブラウザを起動させるためには,runFoamXHBスクリプトを走らせるか,あるいはホストブラウザがローカルで動いているケース(ノーマルモード)では,runFoamXを走らせることでrunFoamX自身がrunFoamXHBを立ち上げます。 runFoamXの2つの機能を図A.2に示します。

(a) ネームサーバnsdの起動

(b) FoamXHostBrowserの起動

図A.2 runFoamXHBの実行

  • nsdと呼ばれるプロセスであるMICOネームサーバは,ホストマシンからスタートされます。MICOはホストネームとデフォルトのポートアドレスを使用します。このポートアドレスは.OpenFOAM-1.5/apps/FoamXディレクトリの中にあるFoamXClient.cfgファイルへのorg.omg.CORBA.ORBInitialHostorg.omg.CORBA.ORBInitialPort=のエントリによりマニュアルで設定できます。ネームサーバは同じディレクトリの中にあるns.refにIORのhost/portを書き込みます。
  • FoamXHostBrowserプロセスは,nsdがスタートされ,FoamXHostBrowserという名で登録されているhost/port上でスタートされます。

したがって、コマンドプロンプトで次のようにタイピングしてrunFoamXHBを実行することにより,

runFoamXHB

画面に以下のように出力させるネームサーバとホストブラウザが立ち上げられます:

Starting NameServer with inet:<host>:<port>...
Starting FoamX Host Browser with inet:<host>:<port>...

ここで,<host>:<port>は,デフォルトで設定されているか,あるいはFoamXClient.cfgファイルの中で指定されています。 FoamXHostBrowserはOpenFOAMのロゴの商号と,正しく実行しているかどうかのステータスの詳細を画面上に表示します。

[編集] A.1.1 ネームサーバーの実行に関する注記

  • ns.refファイルは,以下のようにタイピングすることにより変換され,閲覧できます
iordump < $FOAMX_USER CONFIG/ns.ref
  • MICOに関する管理者用ツールは,以下のようにタイピングすることによりスタートします
nsadmin -ORBNamingAddr inet:<host>:<port>

ここで,inet:<host>:<port>エントリは,ns.refファイルを閲覧することにより見つけられます。 登録されたサービスをリストするためにlsを含んでいるツールの中のオプションを閲覧するためには,helpをタイプしてください。


[編集] A.2 JAVA GUI

すべてのリモートマシン,あるいはホストマシン自体は,IORを提供するために先に作成されns.refファイルのコピーを使って,ネームサーバに接続することができます。 リモートマシンでもまた,FoamXClient.cfgファイルのホストマシンの名前に設定するために,A.1.1節で述べた/etc/hostsファイルへの対応する入力とともに、org.omg.CORBA.ORBInitialHost=を入力する必要があります。

(a) ネームサーバへの接続

(b) FoamXCaseBrowserの実行

図 A.3: runFoamXの実行

図A.3 (a) に示しているように,リモートマシンでFoamXJAVAGUIをスタートするためには,runFoamXスクリプトを走らせる必要があります。このスクリプトはrunFoamXHBにより既に立ち上げられているネームサーバを探します。 ユーザーは,このサーバに接続しようとすることを認めるようコマンドラインで促されます:

Found server reference \$FOAMX\_USER\_CONFIG/ns.ref
Do you want to connect to this server ? (n)

ユーザーが既存のネームサーバに接続しない場合や,runFoamXHBが実行されておらず,ネームサーバが無い場合には,新規のネームサーバがローカルに作成されます。これにより,ホストブラウザとGUI の両方がローカルで走っているときは,runFoamXHBを走らせることなく,runFoamXを実行させれば十分です。コマンドプロンプトで,次のようにタイピングすることにより,図A.4に示すように,JAVAのブラウザ画面が開きます。

runFoamX

ブラウザは以下の領域に分割されています。

Menu bar and buttons(上部)
caseの作成と構築,および実行に用いる操作があります。
Case panel(左側)
case ブラウザの中のcase ディレクトリと、caseサーバの中のOpenFOAMのcaseのコンテンツがあります。
Editing panel(右側 ブルーの部分)
caseの入力が修正されます。
Progress history panel(上部)
実行された動作に関する情報を提示するダイアログボックスです。

図A.4: FoamXのメイン・ブラウザ画面

デフォルトにより,caseパネルはネームサーバが走っているホストマシンを表示します。 他のリモートマシンのcaseにアクセスしたい場合には.OpenFOAM-1.5/controlDictファイルのホストにマシンをリストする必要があります。 FoamXの画面は,通常の方法で大きさの変更ができます。FoamXの中の個々の画面は、画面を分割している斑点のバーをクリックし,カーソルをドラッグすることにより大きさを変更できます。

ブラウザへのパスコマンドには3通りの方法があります。

  • アイテムを選択し,ダブルクリックします。一般的なコンテンツの開き方です。
  • アイテムを選択し,マウスの右ボタンをクリックして,このアイテムで実行可能なメニューを表示させます。
  • メニューバーとボタンからアイテムを選択することにより,他の操作を行うことができます。

注記:メニューボタンの上にカーソルを重ねると,カーソルの下に小さいダイアログボックスが表れ,簡単な用途の記述が表示されます。


[編集] A.3 ケースブラウザ

JAVA GUIから,ケースパネルの中にリストアップされているマシンのケースブラウザを開くためには:ホストアイコンをダブルクリックするか、あるいはシングルクリックでホストをハイライトさせてメニューボタンかマウスの右のボタンからOpen Case Browserで選択します。 この操作は図A.3 bに示しているように,FoamXCaseBrowserを開くためにFoamXHostBrowserを呼び出しています。 このFoamXCaseBrowserはネームサーバを参照して自らを登録するためにns.refファイルを読み込みます。 その後,JAVA GUIはFoamXCaseBrowserを調べることができるようになり,たとえばケース上で作業を開始するためにFoamXCaseServerを起動するときにFoamXCaseBrowserを呼び出します。 FoamXCaseServerは自らをネームサーバ上に登録し,サービスを登録したり呼び出したりしてプロセスは続いていきます。

ケースブラウザは,引数としてホスト名を持たせてrunFoamXを実行することにより,JAVA GUIが立ち上がるときに自動的に開きます。

runFoamX [host]

ホストマシンでケースブラウザをスタートすると,図A.5に示すように,OpenFOAMが格納されているルートパスディレクトリのツリーのリストが作られます。 ユーザーの.OpenFOAM-1.5/controlDictファイルの中で指定されたケースのルートについて,その追加や削除に関してはA.5.2節を参照して下さい。

図A.5: ケースのルートディレクトリのツリー

以下のマニュアルでの注意: 本文中に書かれたFoamXに関するあらゆる操作は、特に注記がない限り、メニューバーまたはボタンから、あるいはマウスで右クリックすることにより選択されたものです。

図A.6に示すように、ケースブラウザは一連の機能を提供しています。ルートディレクトリのアイコンを選択することにより,ユーザーはディレクトリを開いたり、新しいケースを作成したり,ケースをインポートしたり、ユーティリティを走らせることができます;ケースの名前のアイコンをハイライトさせることにより,ケースのオープン,削除,複製あるいは開放,ケース上でのOpemFOAMのユーティリティの実行を行うことができます。

(a) ケース・ディレクトリの選択

(b) ケース・ネームの選択

図A.6: ケース・ブラウザの機能

[編集] A.3.1 ルートディレクトリのオープン

図A.6(a)に示すように,カーソルをルートディレクトリの上に置いて右クリックしてメニューを表示するか,あるいはルートディレクトリのアイコンをダブルクリックすることでOpen Rootの機能を選択することにより,ケースのルートディレクトリの中にある現在のケースのセットを閲覧することができます。 図A.7に示すように,ルートディレクトリのケースのツリーを表示するためにディレクトリを開きます。

図A.7: ケース・ルートを開く

[編集] A.3.2 新規のケースの作成

図A.8に示すように,メニューボタンから、もしくはカーソルをホストのアイコンかケースのディレクトリの上に置いて右クリックしてCreate Case機能を選択することにより,新規のケースを作成することができます。 図A.8に示すように,ClassCase NameおよびCase Rootへのデータの登録ボックスを伴った小さなウィンドウが現れます。

図A.8: 新規ケースの作成

Classは,icoFoamやturbFoamのようなOpenFOAMのソルバーの名前を含んだスクロールメニューを提供しています。 FoamXは,選択されたソルバーにより要求されるケースファイルの中に必要なデータを入力します。したがって、正しいソルバーを選ぶことは非常に重要です。 Case NameCase Rootはそれぞれ,ディレクトリパスとディレクトリ名となっており,その中でケースのデータは,4.1節で述べてられているファイル構造にしたがって格納されています。 正しく入力できたらOKをクリックします。新規のケースのケースサーバが開かれ,A.4節で述べるように,ケースファイルの修正,ソルバーやユーティリティの実行などができるようになります。

[編集] A.3.3 既存のケースを開く

図A.9に示すように,Open Caseの機能は,ケースサーバの中にある既存のケースを開きます。 A.4節で述べるように,ケースサーバではケースファイルの修正,ソルバーやユーティリティの実行ができるようになっています。

図A.9: 既存ケースを開く

[編集] A.3.4 既存のケースの削除

ハードディスクからケースディレクトリを削除するためには,ケースをハイライトさせ,Delete Case機能を選択します。 図A.10に示すように,機能に関する画面が表示され,削除するかどうかを聞いてきますので,同意する場合にはYesボタンを,そうでない場合にはNoボタンをクリックします。


図A.10: 既存ケースの削除

[編集] A.3.5 既存のケースの複製

Clone Case機能は選択されたケースから既存のファイルをコピーする新しいケースを作成します。 図A.11に示すように,最初に複製をしたいケースをハイライトさせ,Clone Case機能を選択する必要があります。 これによりテーブルを開きますが、このテーブルの中で新しいケース名が指定されていなければならず,またルートパスとapplicationClassは複製されるケースのものに変更されるかもしれません。 最後に,timesの入力を行うことで複製の作業中にコピーされるtimeディレクトリを選ぶことができます。 このオプションを表A.1に示します。

オプション内容
firstTime 最も古いtimeディレクトリをコピーします
latestTime 一番新しいtimeディレクトリをコピーします
allTime すべてのtimeディレクトリをコピーします
noTime timeディレクトリをコピーしません

表A.1: Clone ケース操作におけるtime directoriesのコピーのオプション

的確な情報を入力し,Closeボタンをクリックすると,複製操作が完了したことが知らされます。 A.3.3節で説明しているように,新しいケースを開くことができるようになります。


図A.11: 既存のケースの複製

[編集] A.3.6 既存のケースを解放

ケースが作成されているとき,あるいは開かれている時には,このケースが異なるサーバでオープンされることを防ぐためにロックファイルが作成されます。ケースが閉じられる時には,再度開くことができるように,このロックファイルは取り除かれます。 ある種の環境では,たとえケースサーバでケースがそれ以上進行できなくなるとしても,ロックファイルは削除されないかもしれません。例えば,ケースサーバでケースが開かれているのにホストブラウザが閉じられてしまうような場合がこれに該当します。 このため、Unlock Case機能はロックファイルを削除するオプションを備えています。 図A.12に示すように,ケースが他のユーザーによって進められているかもしれないことを警告する画面が表示されます。 その時には,ロックファイルの削除を受け入れる前に他の場所でケースが進められていないことを確認することはユーザーの責任となります。

図A.12: 既存のケースのロックを解除する

[編集] A.3.7 プロセスエディタ

Start Process Editor機能は,終了した、あるいは現在実行中のすべてのOpenFOAMのジョブをモニターできるエディタを開きます。 エディタは単純なGUIで,インストール時に$FOAM_LIC_DIRディレクトリの中に置かれており、runningJobsfinishedJobsのディレクトリにあるファイルを読み込みます。 これは図A.13に示すような構成になっています。

(a) 実行中のジョブ一覧

(b) 終了したジョブ一覧

図A.13: プロセスノ管理

 それは図A.13に示すような画面から成ります。 タグで、runningJobsテーブルとfinishedJobsテーブルを切り替えられます。 テーブルは非常にわかりやすいジョブの詳細が入っています。 runningJobsテーブルの左上に表A.2にリストアップされたタスクを実行するボタンがあります。runningJobsテーブル上でクリックすることによって、ジョブを選択することもできます。 するとテーブルの右上のボタンが有効になります。これらのボタンで、表A.2に記載されているジョブを制御することができます。

メインボタン
read runningJobsとfinishedJobsディレクトリのジョブを再度読込む
status ジョブのステータスを更新するためにホストマシンに接続する
purge これ以上実行しないジョブを取り除く
ジョブ実行ボタン
Info ジョブの情報画面を表示する
endNow 次のタイムステップでジョブを終わらせる
end ジョブがフィールドデータをファイルに出力する次のタイムステップでジョブを終わらせる
kill 即座にジョブを終了
suspend 即座にジョブを一時停止
cont 一時停止したジョブを再実行
チェックボックス
My Jobs 現在のユーザーのジョブのみ見る
Compact リストからFoamX関連のジョブを取り除く

表A.2:プロセスエディタボタン

 finishedJobsテーブルはOpenFOAMで実行されたが何らかの理由で終了されたジョブの情報のアーカイブです。 役立つ入力は保存して、そうでないものは削除することが自由に出来ます。 テーブルには入力を削除するための2個のボタンがあります: パージボタンは7日以上前に終了しているジョブを削除します; リムーブボタンはテーブルから選択された入力を取り除きます。

プロセスエディタ画面の下部に、表A.2に記載してあるように、どのジョブがrunningJobsテーブルに入り、どのジョブがfinishedJobsテーブルに入るかを管理するチェックボックスが2つあります。

[編集] A.3.8 OpenFOAMユーティリティの実行

Foam Utilities機能では、OpenFOAMユーティリティを実行することができます。 この機能はケースサーバでも提供されており、そこで使う方がより一般的です。それについてはA.4で説明します。


[編集] A.4 ケースサーバー

caseブラウザからケースを開くと、ケースサーバが起動します。 図5.14に示すように,ケース画面にディレクトリのツリーが表示されます。 ユーザーはケース画面の底部にあるタグを用いて新規のcaseとケースブラウザのやりとりを行うことができます。 ディレクトリのツリーには,トップレベルの3種類の入力項目があります。

  • Dictionaries ケースのコントロールと物理特性を設定するdictionariesを持っています。
  • Fields フィールドの初期条件と境界条件を設定します。
  • Mesh メッシュの読み込みとインポート,メッシュのパッチに関する境界条件を設定します。

図A.14: ケースサーバのウィンドウ

[編集] A.4.1 既存のメッシュのインポート

ケースにはメッシュが必要であり,そのメッシュは5.3節で述べているblockMeshユーティリティを使うか、あるいはOpenFOAMのメッシュ変換機と結合したサードパーティのソフトウエアを用いて作成されます。 OpenFOAMのメッシュはケースのconstant/polyMeshディレクトリに以下のものとして保存されます:boundary,cells等のOpenFOAMのメッシュを構成するファイル;OpenFOAMのメッシュを作成するためにblockMeshDictが使うblockMeshDictファイル;あるいはその両方があります。 図A.15に示すように,ユーザーはこれらすべてのファイルをImport Meshファンクションを使って既存のconstant/polyMeshディレクトリからそれぞれのcaseにインポートします。

図A.15: OpenFOAMのメッシュのインポート

[編集] A.4.2 メッシュの読み込み

constant/polyMeshディレクトリの中に、直接インポートされた,またはblockMeshかメッシュの変換ユーティリティにより生成されたメッシュファイルが存在すると、Read Mesh&Fields機能を用いてcaseサーバにこれらを読み込むことができるようになります。

図A.16: OpenFOAMメッシュの読み込み

この機能を試すには,チュートリアルの例のいずれかのファイルを開き,A.4.8節で述べているblockMeshユーティティを使ってメッシュを生成する必要があります。

[編集] A.4.3 境界のパッチの設定

図A.16に示すように,Read Mesh& Fieldsファンクションを実行した後は,directoryのツリーはメッシュに関する境界のパッチのリストを表示するようになります。その後,パッチをハイライトさせ,DefineBoundary Type機能を選択することにより,物理的な境界条件をパッチに合わせることができます。

図A.17: 物理的境界条件の選択

これにより、編集パネルの中にpatch description(パッチの記述)画面が表示されます。 図A.17のイラストに示すように,Boundary Typeの表示の右側の. . .ボタンをクリックすることにより,物理的な境界条件のタイプを選択することができます。特定のソルバに利用可能な物理的な境界条件のタイプのリストが画面に現れます。リストから選択して、OKをクリックすると、ウィンドウは閉じ、patch description画面に戻ります。物理的なBoundary Typeの表示の下には、ソルバの初期変数や解析時のそれらのパッチタイプ、または境界条件をリストした表があります。このとき、二次元のケースにおいて一列に並んだ前後のパッチがempty typeになるように注意してすべてのパッチに対して物理的な境界条件のタイプを選択します。

[編集] A.4.4 領域の設定

いったん全ての物理的なパッチタイプを決定すると、いつものようにハイライトさせて右クリックするかアイコンをダブルクリックすることによって選択される領域は、Edit Field機能を使って編集できます。

図A.18: 領域の編集とパッチ条件の設定

Edit Field機能は図A.18に示すように編集パネルに領域画面を表示します。表は4.2.8節で概説した各領域で必要な一連のデータ値を記載しており、internalFieldやreferenceLevel、そして物理的タイプの決定に必要な1個以上のパッチに対応する全ての値が記されています。物理的なパッチタイプの仕様の変化に対応するためにパッチリストはアップデートされることに注意してください。値を変える時にはValue欄の入力箇所をクリックします。図A.18では例としてmovingWallという名のパッチで(1,0,0)m/sの等速度の設定を示しています。

[編集] A.4.5 辞書の編集

図A.19:辞書画面の例:controlDict

辞書のデータは編集可能です。辞書は図A.19に示すcontrolDictや4.3、4.4、4.5でそれぞれ示したfvSchemesやfvSolution、そしてマテリアルプロパティの元となるものを含んでいます。辞書は右欄にデータ入力箇所を持つ表形式の入力となっています。入力箇所をクリックすることで値を直接編集でき、また同じ方法により値が編集可能なサブ辞書を開くことも出来ます。例えば図A.19のapplicationClassのように灰色で表示された入力箇所は編集できないので注意してください。また入力箇所によってはSelection Editorから選択することもあり、この場合には選択された入力欄は緑色にハイライトされます。

[編集] A.4.6 データの保存

ボタンバーからSave Case機能を選択すれば、ケースへの変更を保存できます。辞書や領域、メッシュのデータが保存されます。

[編集] A.4.7 ソルバの実行

ソルバは2つの方法から選択して実行できます。フォアグラウンドですぐに実行したい場合は、ボタンバーからStart Calculation Now機能を選択します。詳しい情報の表示なくOpenFOAMソルバはすぐに実行されます。

一方、ボタンバーからstart Calculation機能を選択することもできます。これは図A.20に示すようにRun Applicationの画面を表示します。

図A.20:Start Calculation機能を使ったソルバの実行

Start Runボタンを押す前にバックグラウンドボタンをクリックすると、バックグラウンドでケースは実行されます。バックグラウンドで実行したケースの場合、途中経過はログテキストボックスで指定されたログファイルに書かれ、View Logボタンを押せば見ることが出来ます。

[編集] A.4.8 実行ユーティリティ

OpenFOAMには多くのユーティリティが供給されており、図A.21に示すようにケースサーバ画面でケース名アイコンをハイライトさせ、右クリックでユーティリティを含むメニューの階層を開くことで実行できます。

図A.21:ユーティリティの実行

図A.22の例ではblockMeshのユーティリティを選択すると、もしそのユーティリティに関連のある辞書があれば編集画面が開きます。必須のコマンドラインの変数は編集されているケースのデフォルト値に設定されています。ユーザーは表から任意の変数を選択できます。

図A.22:ユーティリティ辞書の表示

[編集] A.4.9 ケースサーバーの終了

ケースサーバ画面を閉じて、ケースブラウザに戻るためにはClose Caseボタンをクリックしてください。


[編集] A.5 FoamXの設定

FoamXユーザ設定ファイルはuserのOpenFOAM-1.5/apps/FoamXディレクトリにあり、ディレクトリの構造を保持しています。そしてそのファイルはユーザーの$HOMEにコピーされているかもしれません。ユーザが設定可能なファイルは以下の通りです。

FoamXClient.cfg ではFoamXのネットワークや外観を設定します。特に以下の設定が可能です。

・org.omg.CORBA.ORBInitialHost=やorg.omg.CORBA.ORBInitialPort=へ入力することにより与えられるhost/portアドレスの設定。 ・FoamX.Browser=を編集してnetscapeやmozilla、konqueror等のブラウザへの入力を行ったり、URLが与えられている実行ファイルを編集することによるデフォルトブラウザの設定。 ・FoamX.Editor=に関連のある入力をコメントアウト(#)し、internalやnedit、xemacs等からその編集を削除することによるデフォルトエディターの設定。

FoamX.cfg では編集可能なprocessControlを設定します。特に、リモート・シェルかセキュア・シェルのどちらを実行しているかによってrshまたはsshにremoteShellを設定します。このファイルでは接続の時間切れやコマンドの再試行に関する時間の設定もでき、問題が発生したときのコマンドを増やすこともできます。

FoamX編集に関する環境変数は$FOAMX_によって前に置かれ、表A.3に記載してあります。

環境変数 説明とオプション
$FOAMX_PATH FoamXインストールへのパス、$FOAM_UTIL/FoamX
$FOAMX_SYSTEM_CONFIG FoamXシステム構成ファイルへのパス、$FOAMX_PATH/config
FOAMX_USER_CONFIG FoamXユーザ構成ファイルへのパス、$HOME/$FOAM_DOT_DIR/apps/FoamX

表A.3 FoamXの環境変数

[編集] A.5.1 JAVA

FoamXケースブラウザーは必ず必要なバージョンというわけではないかもしれませんが標準でインストールされているJAVA1.5を使います。そのためOpenFOAMに付属しており、$JAVA_HOMEの環境変数はJAVAの最上位ディレクトリの$WM_PROJECT_DIR/.bashrc(もしくは.cshrc)におけるデフォルトで決められています。システム管理者は適宜$JAVA_HOMEの設定を行うことで、代わりの場所にJAVA1.5をインストールしても構いません。

[編集] A.5.2 ケースファイルへのパス

FoamXは.OpenFOAM-1.5/controlDictファイルへのcaseRootsの入力からユーザのケース・ファイルへのパスを見つけます。デフォルトでは以下のように設定されています。

caseRoots
(
    "."
    "$FOAM_RUN/tutorials/icoFoam"
    "$FOAM_RUN/tutorials/turbFoam"
    ...
);

デフォルトでは$FOAM_RUNは$HOME/OpenFOAM/${USER}-1.5/runのディレクトリを示します。これは、デフォルトでは、runディレクトリにコピーされたチュートリアルのディレクトリの中にあるケースや、FoamXが起動されるディレクトリの中のケースを開くことができることを意味します。もしそれらパスを設定したい場合は、$HOME/.OpenFOAM-1.5ディレクトリのcontrolDictファイルのローカルコピーの中で設定を行ってください。


[編集] 付録B その他の参考情報

現在本章は、ユーザガイドの主要部分に入れるのに相応わしくないと思われる情報の置き場になっており、それは例えば、情報が細かすぎるとか、古いとかの理由なのですが、特定の状況ではユーザの役に立つかもしれません。


[編集] B.1 MPICHを用いた領域分解ケースの並列実行

この節では、3.4.2で説明したopenMPIではなく、MPI/MPICHを使ってOpenFOAMのケースを並列計算する方法を説明します。

実行するアプリケーションがすべてのプロセッサノードに同じパス名を持っているかどうかでMPI/MPICHの起動は異なります。以下の2つの場合では、実行ファイルへのパス名は異なります。

・プロセッサが全て同じUNIX/Linux構造に属さない場合。

・すべてのノードから実行ファイルへのアクセスができるネットワークファイルシステム(NFS)がなく、したがって、それは異なったノードの異なった場所にインストールされる場合。

[編集] B.1.1 全てのノードで同じ実行パス名の場合

プロセッサノードがすべてローカルである単一マシンにおいて、以下のコマンドを実行します。その際は ` は逆向きの引用文字であり一般的にはキーボードの最上部右側にある( ' ではない)ことに気をつけてください。

mpirun -np <nProcs> `which <foamExec>`
  <otherArgs> -parallel < /dev/null >& log &

<nProcs>はプロセッサの数です。 <foamExec>は実行ファイル、例えば、icoFoamです。 そして、出力はログというファイルに転記されます。例えば、icoFoamが、$FOAM_RUN/tutorials/icoFoamディレクトリのキャビティチュートリアルの3つのノードで実行する場合は、以下のコマンドを実行します。

mpirun -np 3 `which icoFoam` $FOAM_RUN/tutorials/icoFoam cavity
  -parallel < /dev/null >& log &

アクセスしたいプロセッサがマシンのクラスタの向こう側にあるとき、以下のコマンドを実行します。

mpirun  -machinefile <machinesFile> -np <nProcs> `which <foamExec>` <otherArgs> -parallel < /dev/null >& log &

ノード名を含む<machinesFile>ファイルが角行にひとつあり、現在ユーザがログオンしているマシンが最初のものであることを除いて、従来と同じです。<machinesFile>は、MPICHで読まれるファイルであり、したがって、マシン名と各マシンで使用するプロセッサ数が必要なだけで、ヘッダーは必要ありません。例えば、マシンarpで1プロセッサ、マシンnoddyで2プロセッサ実行するには、ファイルは以下のようにします。

arp:1
noddy:2

注意: 共有メモリを持つマシンのクラスタにおける性能の最適化は、MPICHライブラリを再コンパイルする必要があるかもしれません。やり方はMPICH資料を見てください。

[編集] B.1.2 ノード間で実行パス名が異なる場合

異なるパス名を持つ実行ファイルを異なるノードで実行するには、全てのノードに同じバーションのOpenFOAMをインストールしrshを使用して実行する能力が必要です。後者は全てのノードで、例えばicoFoamのようなアプリケーションを実行することで確認できます。

rsh <machineName> icoFoam <root> <case>

実行ファイルの異なったパス名はノード名とそれぞれの実行ファイルへのパス名を含む<p4pgFile>ファイルを通してを指定できます。例えばリナックスマシンarpとソラリスマシンnoddy上でicoFoamを実行するためには、<p4pgFile>は以下のように入力します。

arp  0 /usr/local/OpenFOAM/OpenFOAM-1.5/applications/bin/linuxOptMPICH/icoFoam
noddy 1 /usr/local/OpenFOAM/OpenFOAM-1.5/applications/bin/solarisOptMPICH/icoFoam

各行の2番目の入力、ここでは0と1、は各マシンあたりの追加プロセスの数です。MPIの実行がarpから始められるので、マスタープロセスはそこで実行され、他の追加プロセスはそこで始めてはいけません。ジョブは実行によって始まります。

mpirun  -p4pg <p4pgFile> `which <foamExec>`
<otherArgs> -parallel < /dev/null >& log &