OpenFOAMライブラリでプログラムを書く (4)入力ファイル

OpenFOAMライブラリでプログラムを書く (4)入力ファイル

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 解説書発刊のご案内