OpenFOAMライブラリでプログラムを書く (4)入力ファイル
OpenFOAMはC++で書かれたCFD(Computational Fluid Dynamics)ライブラリです。今回はOpenFOAMの入力ファイルについて解説します。
OpenFOAMで使用する入力ファイル
OpenFOAMのアプリケーションが独自に扱うファイルの代表的なものを以下に示します。
OpenFOAMでは、これらの入力ファイルは自由形式で記述できるため、任意の空白類の位置で改行できます。また、入力ファイルは以下に示すフォーマットで記述します。
- 文: 先頭の文字からセミコロンまでを文と定義します。1行内に複数の文を記述することも、一つの文を複数行にわたって記述することもできます。
- ブロック: ひとつの文字列(キーワード)とそれに続く括弧{}に挟まれた範囲。括弧内には文に加えて、ブロックを入れ子にできます。
- コメント: C++言語と同様に、/*から*/までの範囲と、//以降はコメントとして扱われます。
- 空行: 空白類以外に何も記述されていない行。
OpenFOAMのフォーマットで書かれたファイルは、先頭にFoamFileという名(キーワード)のブロックからなるヘッダー部を記述します。
入力ファイルの読み込み
任意のファイルを読み込んで、プログラム内の変数に値を設定することもできます。たとえば、次のsampleFileというファイルを読み込み、変数に値を設定する場合を考えます。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location ””;
object sampleFile;
}
varA 999;
varB 99.9;
varC ( 1.0 2.0 3.0 );
coeff1 // ブロック(下位辞書)
{
varD ( 1 2 3 4 5 );
}
このファイルを読み込むには,IOdictionaryクラスのオブジェクトを次のように定義します。
IOdictionary dict
(
IOobject
(
”sampleFile”, // ファイル名
””, // ファイルの存在するディレクトリ名
mesh, // fvMesh型のオブジェクトを指定する
IOobject::READ_IF_PRESENT, // 読み込みフラグ
IOobject::NO_WRITE // 書き込みフラグ
)
);
ここで、ファイルの存在するディレクトリ名は、プログラムの実行ディレクトリからの相対パスか、絶対パスで指定します。また、読み込みフラグにIOobject::MUST_READと指定した場合、sampleFileというファイルが存在しないとエラー終了します。この時点で、ファイルの読み込みは終了しています。
次に、変数を初期化して定義します。
// 変数の定義と初期化
label a = 0;
scalar b = 0;
vector c( 0.0, 0.0, 0.0 );
labelList d(5, 0);
この初期値を、読み込んだファイルに記述されている値で置き換えます。
// ファイルが存在しない場合
if (!dict.typeHeaderOk<dictionary>(false))
{
Info<< "not found file: " << dict.name() << endl;
}
// ファイルが存在する場合
else
{
a = dict.lookupOrDefault<label>(“varA”, 0);
b = dict.lookupOrDefault<scalar>(“varB”, 0.0);
c = dict.lookupOrDefault<vector>(“varC”, vector(0, 0, 0));
// 下位辞書coeff1が存在する場合
if (dict.isDict(“coeff1”))
{
const dictionary& sDict = dict.subDict(“coeff1”);
d = sDict.lookupOrDefault<labelList>
(
”varD”,
labelList(5, 0)
);
}
}
ファイルが存在しない場合には、メッセージを出力して変数の値は初期値のままとします。ファイルが存在する場合には、各キーワードを用いて読み込んだ値を取り出し、対応する各変数に値を代入します。ここで、キーワードがファイルに記述されていない場合には、lookupOrDefault関数の第2引数で指定したデフォルト値が設定されます。
このように、IOdictionaryクラスのオブジェクトを定義すると、いつでもファイルから読み込んだデータを取り出すことができます。
関連記事/関連ページ
●OpenFOAM ライブラリでプログラムを書く (3) 変数の型
●OpenFOAM ライブラリでプログラムを書く (5) 関数オブジェクト
●OpenFOAM 解説書発刊のご案内