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