OpenFOAMライブラリでプログラムを書く (6)コンテナクラス

OpenFOAMライブラリでプログラムを書く (6)コンテナクラス

OpenFOAMライブラリでプログラムを書く (6)コンテナクラス

 OpenFOAMはC++で書かれたCFD(Computational Fluid Dynamics)ライブラリです。今回はOpenFOAMのコンテナクラスについて解説します。





OpenFOAMで利用できるコンテナクラス

 多数の要素(変数)が必要となる場合,配列や動的にメモリを確保するためのポインタ変数を使用します。C++言語では,これらに加えてユーザが定義したコンテナクラスを利用できます。

 OpenFOAMでは多くのユーザ定義のコンテナクラスを提供しています。代表的なクラスを以下に示します。



リスト内検索の例

 今回は,シーケンスコンテナと連想コンテナの特徴を具体例を用いて紹介します。例として,リスト内に保存されている値の中に該当する値が存在するかどうかを調べます。リスト内検索では,検索にかかる時間が問題になります。

 シーケンスコンテナは,配列と同様に,要素に値を順番に保管するリストです。このため,要素をインデックスで先頭から(あるいは末尾から)順に操作することに向いています。以下の例では,リストに保存されている値のなかで該当する値TARGETが存在するかどうかを調べ,存在する場合,found変数にtrueを代入します。

word TARGET = “EXAMPLE”;
wordList str(100, “”); // typedef List<word> wordList;

calc(str); // ここでstrに値が入る。

bool found = false;

forAll(str, i)
{
    if (str[i] == TARGET)
    {
        found = true;
        break;
    }
}

 Listクラスを用いてこのような検索を行うと,最悪の場合,要素数分の走査が必要になります。なお,forAllはOpenFOAMで定義されているマクロで,指定したリストの要素数分走査します。

 一方,ハッシュテーブルを使用する連想コンテナを用いると,保存されている値を要素の先頭から走査することなく,該当するキーが保存されているかどうかを調べることができます。連想コンテナのHashSetクラスを用いて,同じことを行うと次のようになります。

word TARGET = “EXAMPLE”;
HashSet<word> str2(128);

calc2(str2); // ここでstr2に値が入る。

bool found = str2[TARGET];

 この例ではHashSetのキーとしてword型を用います。変数str2にTARGETという文字列が登録されている場合にはfoundはtrueになり,登録されていない場合にはfoundはfalseになります。

 以上のように,該当する値が存在するかどうかを調べるためには,連想コンテナを用いると効率的に検索することができます。



関連記事/関連ページ


OpenFOAM ライブラリでプログラムを書く (5) 関数オブジェクト
OpenFOAM 解説書発刊のご案内