0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenFOAM9の実行時コードの変更点

Posted at

はじめに

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のバグを避けるために使うなどの記述があるので、テンプレートを使う方法の方が良いのかもしれない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?