OpenFOAMライブラリでプログラムを書く (2)ListクラスとDynamicListクラス

OpenFOAMライブラリでプログラムを書く (2)ListクラスとDynamicListクラス

OpenFOAMライブラリでプログラムを書く ( 2 )ListクラスとDynamicListクラス

 OpenFOAMはC++で書かれたCFD(Computational Fluid Dynamics)ライブラリです。今回はOpenFOAMライブラリの中から、コンテナクラスのListクラスとDynamicListクラスをご紹介します。





ListクラスとDynamicListクラスの違い

 OpenFOAMはC++で書かれたCFD(Computational Fluid Dynamics)ライブラリです。今回はOpenFOAMライブラリの中から、コンテナクラスのListクラスとDynamicListクラスをご紹介します。コンテナクラスは、配列のように使えて、配列以上の機能を持つクラスです。

 ListクラスとDynamicListのオブジェクトを定義するとき、値を保存する要素数を指定します。たとえば、要素サイズを100、label型の値0で初期化してオブジェクトを定義する場合、次のように記述します。

   labelList a(100, 0); // labelListはList<label>の別名
   DynamicList<label> b(100, 0);

 指定の要素にアクセスしたい場合には、[]演算子を用います。たとえば、100番目の要素(要素番号は0から始まる)に1を代入する場合には、次のように記述します。

   a[99] = 1;
   b[99] = 1;

 ListクラスとDynamicListクラスでは、オブジェクトを定義したときに確保した要素数を超えて、末尾の要素に値を保存したい場合、次の例のように、どちらのクラスもメンバ関数のappendを使用します。

   for (label i = 100; i < 1100; ++i)
   {
     a.append(i);
     b.append(i);
   }

 この例では、labelListクラスのオブジェクトaとDynamicList<label>クラスのオブジェクトbのそれぞれの末尾要素にiを保存します。Listクラスはひとつの要素を末尾に追加するたびに、要素一つ分だけ増加したメモリ領域を再確保します。これに対してDynamicListクラスでは、要素数の増加が必要となるとき、確保してある要素数の2倍のメモリ領域を再確保します。したがって、上述のfor文では、labelListクラスのaは1000回のメモリの拡張が行われるのに対して、DynamicListクラスのbは4回のメモリ拡張ですみます。

 プログラムを実行する前に確保したい要素数がわからない場合や、プログラム実行中に要素数が変化する場合があります。このような場合には、Listクラスを用いるよりもDynamicListクラスを用いた方が便利で、プログラムの実行速度が速くなります。DynamicListは実際には使用していないメモリも確保することになりますが、一旦、リストを構築してしまえば、メンバー関数のshrinkで使用している不要なメモリを解放することもできます。



関連記事/関連ページ


OpenFOAM ライブラリでプログラムを書く (1)関数形
OpenFOAM 解説書発刊のご案内