压力方程 “pEqn.H”
{volScalarField rAU("rAU", 1.0/UEqn.A()); // rAU:在速度方程的的最后一个解中,矩阵对角项系数的倒数surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU)); //转换为表面标量场volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p_rgh)); //定义HbyAsurfaceScalarField phiHbyA("phiHbyA",fvc::flux(HbyA)+ fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)); //将上述体积矢量场转化为面心标量场(参考有限体积法),并保证速度通量的全局守恒,以确保压力方程有解MRF.makeRelative(phiHbyA); //将绝对通量转化为相对于面的通量(参考动网格技术)adjustPhi(phiHbyA, U, p_rgh); //对方程进行修正,保证速度边界条件守恒surfaceScalarField phig ((mixture.surfaceTensionForce()- ghf*fvc::snGrad(rho))*rAUf*mesh.magSf());phiHbyA += phig; //更新面通量场constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF); // Update the pressure BCs to ensure flux consistencywhile (pimple.correctNonOrthogonal()) // 非正交压力修正循环 ,根据fvSolution字典文件中设定值n,求解以下方程n-1次 {fvScalarMatrix p_rghEqn(fvm::laplacian(rAUf, p_rgh) == fvc::div(phiHbyA));//只有求解区域所有的压力边界都为第二类边界条件时,上面的值才会用到。//如果有第一类边界条件,压力参考值为该点处边界值。//对于不可压缩流动压力值为相对值,上面的参考值的大小对结果无影响,除非存在边界压力。p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell));p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); //通过查询system/fvSolution下的PIMPLE更新压力参考网格并重新设定参考值if (pimple.finalNonOrthogonalIter()) //若外迭代次数为n,则压力场的松弛仅在n-1次外循环前进行;若外迭代次数为1,这里使用piso算法,压力不进行亚松驰{phi = phiHbyA - p_rghEqn.flux(); //在最后一次非正交内循环中,使用最新压力校正通量p_rgh.relax();U = HbyA + rAU*fvc::reconstruct((phig - p_rghEqn.flux())/rAUf); //校正速度,满足边界条件(主要针对第二类边界条件)U.correctBoundaryConditions();fvOptions.correct(U);}}#include "continuityErrs.H" //计算连续性方程误差p == p_rgh + rho*gh; // 计算总压=动压+静压if (p_rgh.needReference()){p += dimensionedScalar("p",p.dimensions(),pRefValue - getRefCellValue(p, pRefCell)); p_rgh = p - rho*gh; //更新动压}
}
p.relax(); || UEqn().relax();
场松弛会改变压力的值,方程松弛会改变压力的变化量。
UEqn.H
MRF.correctBoundaryVelocity(U); //MRF:基于旋转坐标系下的N-S方程修正边界速度,不需要可忽略
fvVectorMatrix UEqn
(fvm::ddt(rho, U) + fvm::div(rhoPhi, U)+ MRF.DDt(rho, U)+ turbulence->divDevRhoReff(rho, U) //该项包含两部分:1.分子扩散项 2.雷诺应力的偏分量(dev)的散度。雷诺应力主分量(hyd)的散度归结到了压力项中,这是大多数雷诺时均和大涡模型实现的一贯做法。因此压力比层流模型中多了一项,那就是雷诺应力的主分量,通常被称为湍动压力(动压:p_rgh) ==fvOptions(rho, U) //源项或约束,不需要可忽略
);
UEqn.relax(); //松弛迭代,加速收敛
fvOptions.constrain(UEqn); //更正边界条件,维持通量守恒
//momentumPredictor:动量预测求解开关,对多相流以及低雷诺数一般设置为off;如果进行速度预测(on),则求解完整的动量方程得到预测速度;如果不进行速度预测(off),则预测速度直接取当前已知时间步的速度
if (pimple.momentumPredictor())
{solve(UEqn==fvc::reconstruct //显示重构网格中心面(光滑了整个分布情况),转换为体中心通量((mixture.surfaceTensionForce() //表面张力项- ghf*fvc::snGrad(rho) //体积力项(垂直梯度)- fvc::snGrad(p_rgh) // `p_rgh:动压`;压力梯度项) * mesh.magSf() //网格面矢量绝对值 ));fvOptions.correct(U); 保证动量守恒
}