如何设置一个入口边界条件:入口边界值为出口平均值的一半
-
@东岳 老师好,经过这几天的学习,我在网上一些博客中找到了一些答案,但是他们给出的代码有问题,编译不能通过。下面,我将给出两个不同帖子中关于如何修改入口处的x方向温度值的方案:
方案一:
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; }
然而,编译仍然不能通过,下面为报错情况:
别人博文上的东西照理说应该是正确的呀,真不知道该怎么办了,跪求各位老师,大神,大佬指点!!
-
上面说错了一点点,是:修改入口处的温度值的方案;不是:修改入口处x方向的温度值的方案。温度是标量,刚才不小心打错了
-
@D-Benjamin 在 如何设置一个入口边界条件:入口边界值为出口平均值的一半 中说:
scalarField &patchField = T.boundaryField()[patchIndex];
单说这句应该改为
scalarField& patchField = T.boundaryFieldRef()[patchIndex];
-
@东岳 非常感谢
-
@东岳 老师,又来叨绕你了。以上问题已经解决,编译可以通过,FOAM也可以成功进行计算。然而,不能并行计算。似乎在求解器中修改边界条件,会对并行计算产生影响。我的猜测是,并行计算需要将网格分裂成许多块,这样它们就只能根据0字典下的边界条件进行计算。在求解器中强制对边界条件进行修改,使得入口温度是出口的一半,由于网格分块并行,在某些块中不能获取到出口的值,因而并行计算时就会报错。
所以,想请教一下,有没有什么解决的办法?使其可以并行计算呢?谢谢 -
你试试这个
// get patch ID on opposite side label oPatchID = this->patch().boundaryMesh(). findPatchID(oPatchName); // get pressure on other side const volScalarField& p = this->db(). objectRegistry::lookupObject<volScalarField>("p"); // patch field on opposite side for single processor const scalarField& fieldOSP = p.boundaryField()[oPatchID]; // get patch field size from each processor labelList fSizePerProc( Pstream::nProcs(), 0.0 ); label thisProcNo = Pstream::myProcNo(); fSizePerProc[thisProcNo] = fieldOSP.size(); // combine field sizes from all processors reduce( fSizePerProc, sumOp<labelList>() ); // get field values from all processors label totalFSize = sum( fSizePerProc ); // get field from each processor scalarField fieldOAP( totalFSize, 0.0 ); // if patch is on current proc if( fSizePerProc[thisProcNo] > 0 ) { // get field size on previous processors label prevFSize = 0; for (label i = 0; i < thisProcNo; ++i) { prevFSize += fSizePerProc[i]; } // write field from patch on current proc for (label i = 0; i < fSizePerProc[thisProcNo]; ++i) { fieldOAP[i + prevFSize] = fieldOSP[i]; } } // combine fields from all processors reduce( fieldOAP, sumOp<scalarField>() ); // get pressure gradient from caseDict #include "readgradp.H" // write pressure from opposite side to this patch, add gradP scalarField& pField = *this; forAll(pField, faceI) { pField[faceI] = fieldOAP[faceI] + gradP; }
-
@东岳 @yuan_neu 两位老师好,我尝试了上面东岳老师推荐的并行方法,编译可以通过,且可以并行运行计算,但是,我发现计算结果与串行相比,具有较大偏差(初步估计大了3-5%)。
同样一行代码(如下所示):
// 串行 const scalarField C_outlet = C.boundaryField()[patchId]; Info << "C_outlet:" << C_outlet << endl; // 并行 const scalarField C_outlet_SP = T.boundaryField()[patchId]; Info << "C_outlet_SP:" << C_outlet_SP << endl;
C_outlet与C_outlet_SP的结果相差较大(并行读取结果偏大),由于我的入口边界条件是对所有网格的C_outlet进行面平均的0.95倍:
C_inlet = 0.95 * C_outlet_avarage;
由于并行读取结果偏大,最后导致了入口值反而大于出口值。这是不是并行的bug?
求解答,祝好!
-
@D-Benjamin 您好,我目前想要实现两相出口固相通量等于入口通量,能不能打扰您,向您咨询下这个怎么实现?
-
@D-Benjamin 您好,我想咨询一下,我用codedFixedValue边界条件
label patchIndex =this->patch(). boundary. findPatchID(”“outlet”); const volVector& U=this->db(). lookupObject<volVectorField>("U.particles");
这两行读取的速度就是outlet的出口颗粒速度吧
-
@D-Benjamin 如果那两行是它的速度的话,然后我再U去获得它的x方向速度,令它等于入口x的速度,这样子就可以了吧?非常感谢
-
@D-Benjamin 大佬,冒昧问一句可否加个联系方式交流交流,我看到您要实现的也是进出口的通量关系,论坛可能不方便qq1533317221
-
@D-Benjamin 刚才试了加上最后面那个面标号,运行好像出了点错误,待我明早去实验室确定一下。