ユーザーガイド 1.5系 - 4.2 基本的な入出力ファイルのフォーマット
出典: OFWikiJa
[編集] 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によって組み込めばよいのです。 代替マクロは単独の値にとどまりません。 例えば、単独のマクロで境界条件のまとまりを事前に定義して、それを呼び出すことができます。 適用範囲はほぼ限りないといえるでしょう。
