run-time selectionについて

OpenFOAMer(コード解読修行中)と,いろいろと話をしました。

コードリーディングで苦戦している理由の1つが,様々な物理モデルの使い分けを容易にしてくれている仕組み「runTime Selection」だと感じました。前から気付いてはいたのですが。

ソルバを利用する時には,とても便利な機能です。しかし,ソルバーのコードを読んでいるときには,使いたい物理モデルにたどり着かないといった事態を引き起こします。

run-time セレクションについては,OpenFOAMの特徴欄にも記載があります。
http://www.openfoam.org/features/extending-libraries.php
Run-time selection
At run-time, OpenFOAM automatically creates lists of names of models and methods defined in libraries, from which the user can make a selection. For example, when a turbulence model library is used, a list of turbulence models is constructed at run-time, from which the user choose a model within one of the case input files. When a library is extended or a new one added, the new models/methods are automatically picked up by the run-time selection mechanism, so are available to the user.

日本語でも説明しているサイトがありました。
http://www.idaj.co.jp/sp_iconcfd/02/02.html
ランタイムセレクション
OpenFOAMは、アプリケーションレイヤーのコードを書きやすくするため、また多くの物理モデルなどを簡単に実装するため、Strategy デザインパターンライクな実装を行っています。これをランタイムセレクションと呼びます。
以下にRANS系非圧縮乱流モデルのクラス図を示します。乱流モデルは多種多様にあり、それに合わせてアプリケーションレイヤーのコードを書き換えるのは効率的ではありません。
Strategyパターンを使って乱流モデルを実装し、アプリケーションレイヤーのコードが乱流モデルを利用するときに変わったとしても、コードを変更する必要がない設計になっています。
うまく説明されています。が,超初心者に対しては,さらなく混乱を招くかもしれません。


この仕組みについては,OpenFOAM Wikiに詳しい解説ページがあります。ただし,このページは,この仕組みをカスタムクラスに実装したい人向けでしょう。コードを読んでいるときに感じる理解しにくさには,触れていないと感じます。
http://openfoamwiki.net/index.php/OpenFOAM_guide/runTimeSelection_mechanism


勉強会@富山で開催した「OpenFOAM(R)ソースコード入門pt1 熱伝導方程式の解法から有限体積法の実装について考える」の後編資料では,こっそりと説明したつもりです。ddtSchemes からEulerDdtScheme.Cにつながる部分です。混乱を避けるために,あっさりとしか説明していません。

コードを読む(だけ)の立場から説明する資料を作りたい。あるいは,勉強中に学生さんに作って欲しい,です。
これについては,デバッガを使って,実行状態を追いかける方が,てっとりばやいとも思います。

ということで,netBeans を使ってデバッグする方法の解説書類を作成中です。近日中に公開することを目指します。