はじめに
Foundation版のOpenFOAMのバージョン9で、物理量をコンストラクタで取得することができなくなった。
原因の調査および対策を考えたので、ここに記す。
状況
境界条件(たとえばcodedMixed)に次のようにコードが含まれていたとする。
code
#{
fvPatchField<scalar> rhop
(
patch().lookupPatchField<volScalarField, scalar>("rho")
);
fvsPatchField<scalar> phip
(
patch().lookupPatchField<surfaceScalarField, scalar>("phi")
);
#};
これらのコードは実行時コンパイルでエラーが発生して、計算ができない。
原因
OpenFOAM9でコンストラクタを使用したコピーが禁止されたため。
$FOAM_SRC/finiteVolume/fields/fvPatchFields/fvPatchFields/fvPatchField.H
196 //- Disallow copy without setting internal field reference
197 fvPatchField(const fvPatchField<Type>&) = delete;
$FOAM_SRC/finiteVolume/fields/fvsPatchFields/fvsPatchFields/fvsPatchField.H
182 //- Disallow copy without setting internal field reference
183 fvsPatchField(const fvsPatchField<Type>&) = delete;
対策
ポインタを使う。
const fvPatchScalarField& rhop =
patch().lookupPatchField<volScalarField, scalar>("rho");
const fvsPatchField<scalar>& phip =
patch().lookupPatchField<surfaceScalarField, scalar>("phi");
テンプレートを使う方法もある。
const fvPatchScalarField& rhop =
this->patch().template lookupPatchField<volScalarField, scalar>
(
"rho"
);
const fvsPatchField<scalar>& phip =
this->patch().template lookupPatchField<surfaceScalarField, scalar>
(
"phi"
);
おわりに
C++はどうも苦手で、コンストラクタとかポインタとか書いたが合っているのかイマイチである。
テンプレートも調べたのだが、gccのバグを避けるために使うなどの記述があるので、テンプレートを使う方法の方が良いのかもしれない。