OpenFOAMライブラリでプログラムを書く (7)NamedEnumクラス

OpenFOAMライブラリでプログラムを書く (7)NamedEnumクラス

OpenFOAMライブラリでプログラムを書く (7)NamedEnumクラス

 OpenFOAMはC++で書かれたCFD(Computational Fluid Dynamics)ライブラリです。今回はOpenFOAMのNamedEnumクラスを説明します。





NamedEnumクラス

 プログラム内で分岐をする処理をif文やswitch文で行うとき、分岐の条件式では何らかの値を用いて判断されます。プログラム内にこの判断に用いられる値を直接記述すると、値を変えるたびに、ソースコードの修正とコンパイルが必要となります。このようなとき、判断に用いる値をファイルから読み込むようにすると、プログラムの汎用性が増します。

 ファイルからの入力値を数字とすると、その数字がどのような条件を表すのかがわかりにくくなります。したがって、入力値には条件の内容を表す文字列を用いると、プログラムの使用者は、条件の内容把握が容易になります。

 NamedEnumクラスは、ファイルからの入力を文字列として受け取り、文字列を条件式で用いられる列挙体に変換するためのクラスです。

使用例

 ファイルから読み込んだ文字列を列挙体に変換するため、 NamedEnumクラスのメンバー変数を含んだクラスを次のように作成します。

class input2Enum
{
public:
    enum paramType
    {
        ptType1,
        ptType2,
        ptType3
    };

private:
    static const NamedEnum<paramType, 3> paramTypeNames_;

public:
    paramType param_;
 
    void setParam(const dictionary& dict)
    {
        if (dict.found(“param”))
        {
            param_ = paramTypeNames_.read
                     (
                          dict.lookup(“param”)
                     );
        }         
    }
};
 

template<>
const char* Foam::NamedEnum<input2Enum::paramType, 3>
::names[]=
{
   “Type1”, “Type2”, “Type3”
};


const Foam::NamedEnum<input2Enum::paramType, 3>
    input2Enum::paramTypeNames_;

 はじめに、input2Enumクラスに列挙体を宣言します(4行目から9行目)。次に、NamedEnum型の変数paramTypeNames_(12行目)と、列挙体の変数param_(15行目)を宣言します。ここでNamedEnumクラスの1番目のテンプレート引数には列挙体名、2番目の引数には列挙子数を指定します。

 30行目から35行目では、NamedEnumクラスのstaticメンバー変数namesの初期化を行っています。ここで指定する文字列は、input2Enumクラスの列挙体paramTypeの列挙子に符合した名称を付けておきます。ここで指定した文字列が、ファイルに記述する文字列となります。

 ファイルから読み込んだ文字列を列挙体として保存するための変数param_はstatic変数であるため、変数の定義を38行目と39行目で行います。

 入力ファイルでは次のように入力値を設定します。

 FoamFile
 {
   version  2;
   format  ascii;
   class   dictionary;
   location  “system”;
   object   sampleFile;
 }

 param Type3;

 このファイルの読み込みにはdictionaryクラスを用います。dictionaryクラスでファイルからの入力値を保存する方法に関しては、「OpenFOAMライブラリでプログラムを書く(4)入力ファイル」をご参照ください。

 input2Enumクラスを使用して条件分岐を行う例を以下に示します。

void sample(const dictionary& dict)
{
    input2Enum test;

    test.setParam(dict);

    switch(test.param_)
    {
    case func1::ptType1:
         // ......
         break;
    case func1::ptType2:
         // ......
         break;
    case func1::ptType3:
         // ......
         break;
     }
}

 directoryクラスの変数dictに読み込まれているファイルからの入力値である文字列は、44行目のinput2Enum::setParam関数の呼び出しで、input2Enumクラスのメンバー変数param_に列挙体型として保存されます(17行目から26行目)。

 このようにNamedEnumクラスを用いると、入力ファイルに記述した文字列を条件式で用いる列挙子として利用することができます。



関連記事/関連ページ


OpenFOAM ライブラリでプログラムを書く (6) コンテナクラス
OpenFOAM 解説書発刊のご案内
OpenFOAM コンサルティングサービス