2013年12月の記事一覧

OpenFOAM の演算子 == について

オープンCAE勉強会@富山のメンバーから,OpenFOAMのソースコードに関する質問がありました。
演算子 == についてです。興味深い内容です。回答を共有します。間違いなどがあれば,ご指摘をお願いします。

(質問の要旨 ここから)--
 laplacianFoam.C では,
            solve
            (
                fvm::ddt(T) - fvm::laplacian(DT, T)
            );
と表記してありますが、
            solve
            (
                fvm::ddt(T) == fvm::laplacian(DT, T)
            );
としても良いのですか?
 OpenFOAMでの ”==” の意味がよくわかりません。
--(質問の要旨 ここまで)

(回答)

 上記2つの表記は,どちらでも良いです。同じ意味になります。
 これには,演算子”==”のオーバーロードが関係しています。

 ソースコードを見ながら確認します。

 演算子は,どのクラスに対しての演算子なのか,に注意して調べる必要があります。
 今の質問では,fvm::ddt(T) と fvm::laplacian(DT, T) との演算です。両者のクラスは何になるでしょう?

 fvmLaplacian.Cを見ます。fvm::laplacian(DT, T)  からの戻り値は  tmp<fvMatrix<Type> > 型となります。 ここでのTypeは,laplacianメソッドに渡した T と同じになります。
  238 template<class Type, class GType>
  239 tmp<fvMatrix<Type> >
  240 laplacian
  241 (
  242     const GeometricField<GType, fvPatchField, volMesh>& gamma,
  243     const GeometricField<Type, fvPatchField, volMesh>& vf
  244 )

 ということは, fvm::ddt(T) == fvm::laplacian(DT, T) では,tmp<fvMatrix<Type> >に対しての演算子”==”を確認する必要があります。

 fvMatrix.H にGlobal operators としてoperator== が記載されています。
  615 template<class Type>
  616 tmp<fvMatrix<Type> > operator==
  617 (
  618     const tmp<fvMatrix<Type> >&,
  619     const tmp<fvMatrix<Type> >&
  620 );

 fvMatrix.C に定義があります。演算子“==”の左側にあるtmp<fvMatrix<Type> > をtAという名前で,右側にあるtmp<fvMatrix<Type> >をtBという名前で受取ります。演算の結果としては,return の後にあるもの(tA - tB)が返されます。つまり,左辺ー右辺の行列(tmp<fvMatrix<Type> > 型)を戻すことになります。
1495 template<class Type>
1496 Foam::tmp<Foam::fvMatrix<Type> > Foam::operator==
1497 (
1498     const tmp<fvMatrix<Type> >& tA,
1499     const tmp<fvMatrix<Type> >& tB
1500 )
1501 {
1502     checkMethod(tA(), tB(), "==");
1503     return (tA - tB);
1504 }

 なお,ここで使った演算子” - ”自体も,fvMatrixクラス用にオーバーロードしたものが使われています。オリジナルのコードで使われているのと同じです。こちらは直感的にわかるので,疑問に感じないかもしれませんが。

 勉強会で,2つの表記方法のソルバを作成して,同じであることを確かめる演習でも実施しようかな。

(参考)
オペレータ(演算子)のオーバーロードについて。
http://homepage2.nifty.com/well/Operator.html
http://www.geocities.jp/ky_webid/cpp/language/017.html
http://www.geocities.jp/penguinitis2002/study/OpenFOAM/OpenFOAM-cpp_primer.html
0