設定ファイルの書式

2020年12月23日

はじめに

OpenFOAM の設定ファイルの書式について。

使用バージョン

OpenFOAM v2006、v8

設定ファイルの書式

OpenFOAM の設定ファイルは、C++ 言語のソースコードに似た書式で書かれている。

コメント

C++ と同じ形式のコメント文を使うことができる。すなわち、"/*" と "*/" の間および "//" から行末まではコメントとみなされ、無視される。

ヘッダー

設定ファイルは、次のようなヘッダーを持つ。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "constant";
    object      transportProperties;
}

基本的には「おまじない」と思ってよい。フィールドデータの場合、class には以下のようなフィールドのクラスを書くようになっている。

  • volScalarField : スカラー場 (圧力や温度など)
  • volVectorField : ベクトル場 (速度など)
  • volSymmTensorField : 対称テンソル場 (レイノルズ応力など)

辞書

OpenFOAM のデータには辞書 (dictionary) という形式が用いられている。辞書は次のように記述する。

<辞書名>
{
    ... キーワードエントリ ...
}

キーワードエントリ (keyword entries) の部分は、つぎのような形式である。

<キーワード> <項目 1> <項目 2> ... <項目 N>;

最後に必ずセミコロンを付ける必要がある。

たとえば、次のような感じである。

boundaryField
{
    inlet
    {
        type            fixedValue;
        value           uniform (1 0 0);
    }

    outlet
    {
        type            zeroGradient;
    }

    wall
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
}

上の例のように、辞書は入れ子にすることができる。入れ子の中の辞書を sub dictionary という。

辞書名やキーワードには、二重引用符で囲むことで正規表現を用いることができる。すべてに当てはまるようにする場合は ".*" と表す。名前の最後に Final と付くものだけに当てはまるようにする場合は ".*Final" と表す。k か epsilon に当てはまるようにするには "(k|epsilon)" と表す。kFinal か epsilonFinal に当てはまるようにするには "(k|epsilon)Final" と表す。以下に使用例を示す。

relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        "(k|epsilon|omega|R)" 0.7;
    }
}

リスト

括弧で囲んで複数のデータをまとめたものをリストという。リストは次のような形式で指定する。

<リスト名>
<リスト数>
(
  ... 項目 ...
);

リスト名やリスト数は省略される場合がある。また、次のように項目のクラスを指定する形式もある。

<リスト名>
List<クラス名>
<リスト数>
(
  ... 項目 ...
);

ベクトルとテンソル

ベクトルは、たとえば X 方向に 1 m/s、Y 方向、Z 方向に 0 m/s の速度を表す場合は、次のように表現する。

(1 0 0)

(2 階の) テンソルの場合は、9 成分を並べて書く。単位テンソルを行列風に書くのであれば、次のように表現できる。

(
    1 0 0
    0 1 0
    0 0 1
)

対称テンソルの場合は、6 成分を指定する。単位テンソルを行列風に書くと、次のようになる。

(
    1 0 0
      1 0
        1
)

単位付きデータ

単位付きのデータは、たとえば次のように指定する。

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

最初の "nu" はキーワード、次の "nu" はデータの名前 (普通はキーワードと同じにする)、その次の項目は単位 (dimension)、最後は値である。

単位は、次のような形式で各単位の指数を指定する。

[kg m s K mol A Cd]

たとえば、m/s であれば "[ 0 1 -1 0 0 0 0 ]" とする。

最近のバージョンでは、次のような書き方もできる。

nu              nu [m^2/s] 1e-05;

また、データの名前や単位はあってもなくてもよい。

nu              1e-05;

ただ、単位くらいは書いておいたほうがわかりやすいかもしれない。

nu              [m^2/s] 1e-05;

ファイルの取り込み

#include 文でファイルを取り込むことができる。

#include "ファイル名"

OpenFOAM 2.4.0 から、$FOAM_ETC 以下のファイルを取り込むために #includeEtc も使える。

#includeEtc "caseDicts/setConstraintTypes"

値の参照

"$名前" で辞書やキーワードの値を参照することができる (これをマクロという)。

solvers
{
    p
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0.01;
    }

    pFinal
    {
        $p;
        tolerance       1e-06;
        relTol          0;
    }

    ... 省略 ...
}

上記の例では、"$p" により辞書 p の項目を辞書 pFinal の中に取り込んでいる。

辞書名やキーワードには、基本的にはソルバーやユーティリティなどのプログラムが必要とするものを指定するが、任意の名前を使うこともできるし、それを参照させることもできる。

式

値の指定のために、式を使うことができる。

value           uniform (#eval "pow(200.,2)/(pow(50.,2)*pi())*10." 0 0);

#eval は OpenCFD 版で使える。式を囲むのは、"..." の代わりに {...} でもよい。

Foundation 版でも使えるものとして、#calc もあるが、#eval のほうが便利である。

コード

値をコードで計算して指定することができる。

        L               200.;
        D               50.;
        Ux0             10.;
        Ux              #codeStream
        {
            code
            #{
                const scalar pi = constant::mathematical::pi;
                os<< pow($L, 2)/(pow($D, 2)*pi)*$Ux0;
            #};
        };
        value           uniform ($Ux 0 0);