Piso Basic ------ One step prediction of U, multiple iterations over P.
------- On low courant number, Linear velocity pressure coupling is more important than
non-linear convection coupling UU.
------- Therefore, velocity can be updated once through momentum equation, but
pressure must be corrected several times.
------- Piso algorithm must be used in good mesh quality and low courant no.
------- On low courant number, Linear velocity pressure coupling is more important than
non-linear convection coupling UU.
------- Therefore, velocity can be updated once through momentum equation, but
pressure must be corrected several times.
------- Piso algorithm must be used in good mesh quality and low courant no.
Substitute above equation into incompressible continuity equation. Below equation is achieved: | fvVectorMatrix UEqn ( fvm::ddt(U) + fvm::div(phi, U) - fvm::laplacian(nu, U) ); //define UEqn as left 1st equation. Convection term is discretized with phi from previous time step // phi at the 1st time step ---->0/U ----------------------------------------------------------------------------- solve (UEqn == -fvc::grad(p)); //solve left 2nd equation to predict U ---> momentum predictor. ----------------------------------------------------------------------------- volScalarField rAU(1.0/UEqn.A()); //Discretize left 2nd equation and write it as left 3rd equation . //Update ap from predicted U. ----------------------------------------------------------------------------- volVectorField HbyA("HbyA", U); HbyA = rAU*UEqn.H(); //Update HbyA from predicted U ----------------------------------------------------------------------------- surfaceScalarField phiHbyA ( "phiHbyA", (fvc::interpolate(HbyA) & mesh.Sf()) + fvc::interpolate(rAU)*fvc::ddtCorr(U, phi) ); adjustPhi(phiHbyA, U, p); //Project HbyA over cell faces. //Ensure mass conservation through the domain by adjusting in-coming and out-coming flux if BC is ill-defined. eg: Newmann BC is given instead of Dirichlet BC. ODE has no solutions unless reference P is prescribed below. ----------------------------------------------------------------------------- fvScalarMatrix pEqn ( fvm::laplacian(1.0/AU, p) == fvc::div(phi) ); pEqn.setReference(pRefCell, pRefValue); pEqn.solve(); //Define pEqn as left 5th equation. //Set reference P if Newmann BC is provided. //Solve pEqn. ----------------------------------------------------------------------------- phi = phiHbyA - pEqn.flux(); //Update the right value of phi, flux velocity, which is also Up,f(1) on the left 6th equation. ----------------------------------------------------------------------------- U = HbyA - rAU*fvc::grad(p); U.correctBoundaryConditions(); //Velocity correction. //extrapolation from cell center to the boundary face. |
References:
[1] Description-of-icoFoam (English)
[2] Look Inside IcoFoam.pdf (English)
[2] www.dyfluid.com/icoFoam.html (Simplified Chinese)
[1] Description-of-icoFoam (English)
[2] Look Inside IcoFoam.pdf (English)
[2] www.dyfluid.com/icoFoam.html (Simplified Chinese)