请问如何设置一个入口边界条件:该入口边界值与出口的物理量相关?

各位大佬,请教一个问题:
比如,在某一容器中,有一释热源,流体从容器出口流出,经过外部冷却后再重新经入口流入容器,假如该容器的入口边界条件与出口处的值满足如下关系:
T_in = 0.9 * T_out
请问该如何实现这个边界条件?我想到了codedFixedValue边界条件,但是不知道该如何获取出口处的物理量,望各位大佬赐教!

祝好!

经过这几天的学习,我在网上一些博客中找到了一些答案,但是他们给出的代码有问题,编译不能通过。下面,我将给出两个不同帖子中关于如何修改入口处温度值的方案:

方案一:

label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
scalarField &patchField = T.boundaryField()[patchIndex];

forAll(patchField, i) {
    patchField[i] = 10.0;
}

我发现,在进行wmake编译时,会出错。问题在于" &patchField "前面的取址符号&。虽然去掉上述代码中取址符号&,编译可以通过,但并不能改变入口处温度场的值(即入口处温度场的值仍是原来的值,这段代码便没有意义了),下面为编译报错情况:

方案二

label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
scalarField patchField = T.boundaryField()[patchIndex];

forAll(patchField, i) {
    T.boundaryField()[patchIndex][i] = 10.0;
}

然而,编译仍然不能通过,下面为报错情况:

别人博文上的东西照理说应该是正确的呀,真不知道该怎么办了,跪求各位老师,大神,大佬指点!!

可以直接用

label patchIndex = mesh.boundaryMesh().findPatchID("inlet");

T.boundaryField()[patchIndex] == scalar(10.0);

可以考虑使用 swak4Foam.

inlet
{
    type        groovyBC;
    value      uniform 0;
    valueExpression "0.9*Toutlet";
    variables "Toutlet{outlet} = T;";
}

如果出口的 T 不是一样的,可以平均处理

    variables "Toutlet{outlet}= sum(T*mag(Sf()))/sum(mag(sf()));";

语法方面可以参考 https://openfoamwiki.net/index.php/Contrib_groovyBC#Expression_syntax

谢谢前辈的答复,我还想问个问题,我使用codeFixedValue边界条件,如下所示:

inlet
    {
        type            codedFixedValue;
        value           uniform 0;
        redirectType    C1_in;
        code
        #{
            label patchId = this->patch().boundaryMesh().findPatchID("outlet");
            const volScalarField& D1 = this->db().objectRegistry::lookupObject<volScalarField>("D1");
            ……
        #}

请教二个小问题:

  • this->patch() 在本帖中应该是指代该边界,但我不太清楚OpenFOAM中this指针具体意义,还有patch()函数的意思是什么呢?前辈可以给一点说明吗?
  • db() 是一个什么函数呢?

谢谢!祝好!

在 C++ 中,this 指的是对象的指针。在本例中, 对象是温度,那么 this 就指向 T 的 inlet 边界场,this->patch() 就获取了 T 在边界的地址 (引用),boundaryMesh() 就获取了 (所有的) 边界列表的地址 (引用),其实也是一个对象,因此可以有成员函数。

inlet 的 T 的类型是 fvPatchField, 这个类里面有 patch() 函数,
https://www.openfoam.com/documentation/guides/latest/api/fvPatchField_8H_source.html#l00343

patch() 函数返回 fvPatch 类,fvPatch 有成员函数 boundaryMesh() 获取了所有的边界列表的地址 (引用)。
https://www.openfoam.com/documentation/guides/latest/api/fvPatch_8H_source.html#l00187

this->db() 获取到的是 mesh (类) 的地址 (引用),源代码可参考:https://www.openfoam.com/documentation/guides/latest/api/fvPatchField_8C_source.html#l00198

由于 mesh 的类是 objectRegistry,这样,就可以获取整个 case 里面的所有注册对象了。

这里面涉及了 OpenFOAM 中对象的注册机制。