はじめに
Eclipse を使って OpenFOAM のソースコードを探索する。
使用バージョン
Eclipse Helios (3.6.1) 64 bit Windows 版、JDK 6 64 bit Windows 版、OpenFOAM 1.7.1
JDK のインストール
Eclipse を動かすには Java が必要。JDK (Java Development Kit) を ここ からダウンロードし、インストールする。
Eclipse のインストール
ここ から Eclipse の C/C++ 用をダウンロードし、インストールする。
セットアップ
- Eclipse を起動。workspace の場所を聞かれるが、気にせず OK する。
- メニュー [New]-[Makefile Project with Existing Code] を選ぶ。
- "Project Name" を "OpenFOAM" に設定。"Existing Code Location" に OpenFOAM ディレクトリを設定。"Finish" ボタンを押し、しばし待つ。
使い方
- たとえば、画面左の Project Explorer から simpleFoam のソースコード (OpenFOAM/OpenFOAM-1.7.1/applications/solvers/incompressible/simpleFoam/simpleFoam.C) を開く。
- Ctrl を押しながら
#include "createFields.H"
を左クリックすると、createFields.H が表示される。
- createFields.H の
volScalarField p
の "volScalarField" を Ctrl + 左クリックすると、volFieldsFwd.H が開き volScalarField の定義が表示される。
- Ctrl + 左クリックの代わりに F3 でもよい。たまに複数の候補が提示される場合があるが、それっぽいのを 1 つ選べばよい。表示する候補を 1 つも見つけられない場合もある。
- 画面右の Outline を使うと、ファイル内の関数などへのアクセスが速くて便利。
- クラス名にカーソルを合わせて F4 を押すと、クラス階層 (Type Hierarchy) が表示される。表示できない場合もあるが、親クラスや子クラスでクラス階層を表示してやるとうまくいったりする。
- 表示しているファイルを画面左の Project Explorer に表示するには、右クリックのポップアップメニューで [Show In]-[Project Explorer] を選ぶ。
探索例
simpleFoam の運動方程式の左辺はつぎのように表されている (UEqn.H)
tmp<fvVectorMatrix> UEqn
(
fvm::div(phi, U)
+ turbulence->divDevReff(U)
);
この第 2 項の divDevReff() は何ものかというのを調べてみる。
- ここでは turbulence の正体がわからないので、turbulence、divDevReff どちらのキーワードを Ctrl + 左クリックしてもその定義には移動できない。そこで、turbulence が定義されている createFields.H を Project Explorer で開く。
- turbulence はつぎのように定義されている (createFields.H)。
autoPtr<incompressible::RASModel> turbulence
(
incompressible::RASModel::New(U, phi, laminarTransport)
);
RASModel を Ctrl + 左クリック。RASModel.H が開く。
- RASModel クラスの定義が表示される (RASModel.H)。
class RASModel
:
public turbulenceModel,
public IOdictionary
{
...
画面左の Outline で Foam - incompressible - RASModel を展開すると、RASModel のメンバのリストが表示される。そこから divDevReff() を選ぶ (ダブルクリックする) と、つぎの箇所が表示される。
//- Return the source term for the momentum equation
virtual tmp<fvVectorMatrix> divDevReff(volVectorField& U) const = 0;
RASModel はレイノルズ平均乱流モデルのインタフェースクラスであり、実装は子クラスが行う。したがってこの divDevReff() は具体的な実装をもたない (行末の "= 0;" というのはそういう意味) ので、具体的な実装を見るために子クラスを調べてみよう。ここでは k-εモデルのクラス kEpsilon を調べてみる。
- RASModel にカーソルを合わせて F4 を押すと、画面左にクラス階層 (Type Hierarchy) が表示される。そこに RASModel を継承しているクラスのリストが表示されるので、その中から kEpsilon を選択する。Type Hierarchy のクラスリストの下にクラスのメンバが表示されるので、その中から divDevReff() を選択すると、つぎの箇所が表示される (kEpsilon.H)。
//- Return the source term for the momentum equation
virtual tmp divDevReff(volVectorField& U) const;
ここで divDevReff を Ctrl + 左クリックすると…なぜかなにも起こらない。しかたないので右クリックし、ポップアップメニューから [Show In]-[Project Explorer] を選択。画面左の Project Explorer に kEpsilon.H が表示されるので、近くにある kEpsilon.C を選択するか、kEpsilon.C を展開して divDevReff() を選択するかしてつぎの箇所を表示する。
tmp<fvVectorMatrix> kEpsilon::divDevReff(volVectorField& U) const
{
return
(
- fvm::laplacian(nuEff(), U)
- fvc::div(nuEff()*dev(fvc::grad(U)().T()))
);
}
これで目的の箇所に到達した。
- 上の dev() や T() が気になる場合は、さらに dev() や fvc::grad() を調べてみるとよい。dev(), fvc::grad() を Ctrl + 左クリックすると表示の候補が複数出てくるが、引数の型を考えて選ぶ。
|