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で使用している不要なメモリを解放することもできます。
関連記事/関連ページ