OpenFOAM関連情報:公開
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
演算子 == についてです。興味深い内容です。回答を共有します。間違いなどがあれば,ご指摘をお願いします。
(質問の要旨 ここから)--
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
1
2
0
6
4
0
2
2
アクセス
富山県立大学へのアクセス方法は,下記サイトをご覧ください。
富山県立大学へのアクセス
最寄り駅は,JR 小杉駅 です。
JR小杉駅南口から徒歩約20分(約2Km),または,
射水市コミュニティバス 「14.小杉駅・太閤山線」に乗車約5分です。
外部リンク:射水市コミュニティバス「14.小杉駅・太閤山線」
<お車>
無料駐車場がご利用いただけます。下記学内マップをご参照ください。
富山県立大学学内マップ
プライバシーポリシー
本サイトでは,Googleによるアクセス解析ツール「Googleアナリティクス」を使用しています。Googleアナリティクスはデータの収集のためにCookieを使用します。データは匿名で収集されており,個人を特定するものではありません。
なお,Cookieを無効にすることで収集を拒否することが出来ます。お使いのブラウザの設定をご確認ください。この規約の詳細は Googleアナリティクスサービス利用規約 や Googleポリシーと規約 をご覧ください。