使用openfoam但不采用贴体网格计算圆柱绕流的方法,请各位同学老师指点一下,谢谢
-
@李东岳 李老师 是的 我尝试了体积力插到面上 代码是这样的 f是算好的。主要是三句:
surfaceScalarField phiIB(fvc::flux(rAtU*f)); fvScalarMatrix pEqn ( fvm::laplacian(rAtU(), p) == fvc::div(phiHbyA) + fvc::div(phiIB) ); U = HbyA - rAtU*fvc::grad(p) + rAtU*f;
即插值得到phiIB, 加到pEqn,然后下面是U
= HbyA - rAtU*fvc::grad(p) + rAtU*f
, 这样做无法收敛,时间步会无限小下去。不知道错在哪了,这是详细的Peqn.C:volScalarField rAU(1.0/UEqn.A()); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); surfaceScalarField phiHbyA ( "phiHbyA", fvc::flux(HbyA) + MRF.zeroFilter(fvc::interpolate(rAU)*fvc::ddtCorr(U, phi, Uf)) ); MRF.makeRelative(phiHbyA); if (p.needReference()) { fvc::makeRelative(phiHbyA, U); adjustPhi(phiHbyA, U, p); fvc::makeAbsolute(phiHbyA, U); } tmp<volScalarField> rAtU(rAU); if (pimple.consistent()) { rAtU = 1.0/max(1.0/rAU - UEqn.H1(), 0.1/rAU); phiHbyA += fvc::interpolate(rAtU() - rAU)*fvc::snGrad(p)*mesh.magSf(); HbyA -= (rAU - rAtU())*fvc::grad(p); } surfaceScalarField phiIB(fvc::flux(rAtU*f)); if (pimple.nCorrPiso() <= 1) { tUEqn.clear(); } // Update the pressure BCs to ensure flux consistency constrainPressure(p, U, phiHbyA, rAtU(), MRF); // Non-orthogonal pressure corrector loop while (pimple.correctNonOrthogonal()) { Info << "!herehrehrehrehrheh" << nl; fvScalarMatrix pEqn ( fvm::laplacian(rAtU(), p) == fvc::div(phiHbyA) + fvc::div(phiIB) ); pEqn.setReference(pRefCell, pRefValue); pEqn.solve(); if (pimple.finalNonOrthogonalIter()) { phi = phiHbyA - pEqn.flux(); } } #include "continuityErrs.H" // Explicitly relax pressure for momentum corrector p.relax(); U = HbyA - rAtU*fvc::grad(p) + rAtU*f; U.correctBoundaryConditions(); fvOptions.correct(U);
-
@李东岳
李老师 按您说的尝试了下 还是时间步无限减小surfaceScalarField phiIB(fvc::flux(rAtU*f)); ... fvm::laplacian(rAtU(), p) == fvc::div(phiHbyA) + fvc::div(phiIB) ... phi = phiHbyA - pEqn.flux() + phiIB; ... U = HbyA - rAtU*fvc::grad(p) + rAtU*f;
然后只能算步长0.02, 算2步到0.04秒就不收敛了,结果是错误的。全域一开始1m/s,入口1m/s,然后0.04s时速度和压强云图是这个样子,速度在圆柱一圈变得很大,到了20多米每秒,压强是一个很奇怪的完全一半一半对称的形状:
然后我也试着直接把f加到HbyA里。一样是不收敛的volVectorField HbyA(constrainHbyA(rAU*UEqn.H() + rAU*f, U, p));
奇怪了,感觉加个f而已应该很简单才对呀。