Simple, Piso, Icofoam等不可压求解器

来源:互联网 发布:日本校园霸凌 知乎 编辑:程序博客网 时间:2024/06/08 18:45

首先三者求解的方程略有不同
icofoam中的方程:

(u)=0

ut+(uu)=pρ+(u)

而simplefoam中无时间项。

Simple 算法

while (simple.loop()){    ***    solve(UEqn() == -fvc::grad(p));    surfaceScalarField phiHbyA("phiHbyA",fvc::interpolate(HbyA) & mesh.Sf());    //通量,用来构建压力方程    while(simple.correctNonOrthogonal())    {        fvScalarMatrix pEqn        (            fvm::laplacian(rAU, p) == fvc::div(phiHbyA)        );        pEqn.setReference(pRefCell, pRefValue);        pEqn.solve();        if (simple.finalNonOrthogonalIter())        {            phi = phiHbyA - pEqn.flux();            //非正交修正结束后,重新计算通量,此时应该满足连续方程        }    }    // Explicitly relax pressure for momentum corrector    p.relax();      //这个是与piso重要区别之一    // Momentum corrector    U = HbyA - rAU*fvc::grad(p);    //修正速度,    U.correctBoundaryConditions();    ***}

PISO算法

PISO算法求解瞬态问题,需要时间信息,受时间步影响。
其主要循环如下:

while (runTime.loop()){    ***    if (momentumPredictor)    {     solve(UEqn == -fvc::grad(p));    }    // --- PISO loop        for (int corr=0; corr<nCorr; corr++)    {        ***        surfaceScalarField phiHbyA        (           "phiHbyA", (fvc::interpolate(HbyA) & mesh.Sf())          + fvc::interpolate(rAU)*fvc::ddtCorr(U, phi)        );        for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)        {            fvScalarMatrix pEqn            (              fvm::laplacian(rAU, p) == fvc::div(phiHbyA)            );            pEqn.setReference(pRefCell, pRefValue);            if (corr == nCorr-1 && nonOrth == nNonOrthCorr)            {                pEqn.solve(mesh.solver("pFinal"));                //这是什么作用?在piso修正过多时提前退出?            }            else            {                pEqn.solve();            }            if (nonOrth == nNonOrthCorr)            {                phi = phiHbyA - pEqn.flux();            }            }        U = HbyA - rAU*fvc::grad(p);        U.correctBoundaryConditions();    }    }

可以看出没有用到压力松弛。压力松弛和瞬态的关系?理论还不太清楚

icofoam

icofoam貌似用的是pisofoam,两者在压力求解的时候有细微差别,前者没有用到pFinal,实际有差别吗?

Pimple

结合了SIMPLE和PISO,可以用大时间步求解瞬态问题,不至于发散。
主要循环如下:

 while (runTime.run()) {    while (pimple.loop())    {        #include "UEqn.H"        while (pimple.correct())        {          #include "pEqn.H"        }        if (pimple.turbCorr())        {          turbulence->correct();        }    } }

在每个时间都内都有一个pimple循环,而在pEqn里面,UEan的rAU没有变化,即压力方程的系数没有变,但是phiHbyA会更新,因为速度也更新了。

Pimple的具体的设置可参考[1].

Refenrence

[1] http://www.cfd-online.com/Forums/blogs/tobi/2489-all-about-pimple-algorithm-part-i.html
[2] http://www.cfd-online.com/Forums/blogs/tobi/2490-all-about-pimple-algorithm-part-ii.html
[3] http://www.dyfluid.com/icoFoam.html

疑问

虽然大体上知道了这些求解器的区别,但是对于其理论,即应用缺乏了解。
如在PISO内循环中,速度长多次更新,这个和时间推进中的更新是什么关系?

0 0
原创粉丝点击