コード埋め込み型境界条件で他のパッチの値を参照する方法

57 views
Skip to first unread message

YLa321

unread,
Feb 1, 2023, 7:19:28 AM2/1/23
to OpenFOAM
こんにちは。
初めて質問させていただきます。

現在私はOpenFOAMを用いて研究を行っております。
chtMultiRegionFoamのチュートリアルである「snappyMultiRegionHeater」の境界条件をコード埋め込み型に変更したいと思っています.

具体的にはTopairの入口温度を,Topairの出口温度を参照して動的に変化させたいです.現状,codedFixedValueを使って以下のように関数化する方法を試しているのですが,出口温度を参照する方法がわかりません.

    const_cast scalar Tout = patch().Sf[i][ ]

のSfで出口境界面の温度を参照しようとしているのですが,2つ目の[]の中に何を入れればよいのかがわからず,また,minXの境界条件を設定しているところで出口の境界面の値を参照することはできるのかというのがわからないです.

   minX
    {
        type        codedFixedValue;
        name        userdefinedT;
        value        uniform 300;

    code
    #{
   
   
    fvPatchField<scalar> f
    (
    patch().lookupPatchField<volScalarField,scalar>("T")
    );
   
    forAll(f,i){
   
    const_cast scalar Tout = patch().Sf[i][]
   
    f[i] = scalar(Tout - 10);
   
     }
     
    operator == (f);
   
    #};
   
    }
    
const_cast scalar Tout = patch().Sf[i][]

この問題の原因や解決策をご存じの方がおられましたら、ご教示いただけると幸いです。
なお、OpenFOAMはDEXCS2020 for OpenFOAMを用いて導入し、バージョンはv2006です。

よろしくお願いいたします。

k k

unread,
Feb 2, 2023, 5:04:05 AM2/2/23
to OpenFOAM
こんにちは。kです。

試していないので合っているかわかりませんが、SfはSurfaceVectorFieldのことでしょうか。
SurfaceVectorFieldはセルの面ベクトルの情報が取れるだけではないでしょうか。

べた書きするなら以下の流れかと思います。

・メッシュ情報を取得
    // mesh
    fvMesh mesh
    (
        IOobject
        (
            fvMesh::defaultRegion,
            runTime.timeName(),
            runTime,
            IOobject::MUST_READ
        )
    );

・volScalarFieldでTを定義

    volScalarField T
    (
        IOobject
        (
            "T",
            runTime.timeName(), // word
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        mesh
    );

volScalarFieldはGeometricFieldのスカラーなので、実態はGeometricFieldです。GeometricFieldを調べれば使える関数がわかります。
https://www.openfoam.com/documentation/guides/latest/api/classFoam_1_1GeometricField.html
例えば境界面の情報を取得する関数として boundaryMesh()があります。

・面の名前に対応した境界のIDを取得
    label inletPatchID = mesh.boundaryMesh().findPatchID("Xminl");

・取得したIDから境界でのTのリストを作成
    const fvPatchScalarField& TinletList = T.boundaryField()[inletPatchID];

・for文で繰り返して値を取得(この時に必要な計算式を埋め込む)
    forAll(TinletList, fi)
    {
        Info << "T[" << fi  << "] =" << TinletList[fi] << endl;
    }
こちらで以前試した類似の内容を書いています。
https://note.com/kamakiriphysics/n/nfb2f1176479d
参考程度ですが、よろしくお願いいたします。

2023年2月1日水曜日 21:19:28 UTC+9 YLa321:
Reply all
Reply to author
Forward
0 new messages