diff --git a/applications/solvers/incompressible/nonNewtonianIcoFoam/nonNewtonianIcoFoam.C b/applications/solvers/incompressible/nonNewtonianIcoFoam/nonNewtonianIcoFoam.C index 6420661d7..624c47c6c 100644 --- a/applications/solvers/incompressible/nonNewtonianIcoFoam/nonNewtonianIcoFoam.C +++ b/applications/solvers/incompressible/nonNewtonianIcoFoam/nonNewtonianIcoFoam.C @@ -26,6 +26,10 @@ Application Description Transient solver for incompressible, laminar flow of non-Newtonian fluids. + Consistent formulation without time-step and relaxation dependence by Jasak + +Author + Hrvoje Jasak, Wikki Ltd. All rights reserved \*---------------------------------------------------------------------------*/ @@ -39,7 +43,7 @@ int main(int argc, char *argv[]) # include "setRootCase.H" # include "createTime.H" -# include "createMeshNoClear.H" +# include "createMesh.H" # include "createFields.H" # include "initContinuityErrs.H" @@ -56,32 +60,36 @@ int main(int argc, char *argv[]) fluid.correct(); - fvVectorMatrix UEqn + // Convection-diffusion matrix + fvVectorMatrix HUEqn ( - fvm::ddt(U) - + fvm::div(phi, U) + fvm::div(phi, U) - fvm::laplacian(fluid.nu(), U) ); - solve(UEqn == -fvc::grad(p)); + // Time derivative matrix + fvVectorMatrix ddtUEqn(fvm::ddt(U)); + + solve(ddtUEqn + HUEqn == -fvc::grad(p)); + + // Prepare clean Ap without time derivative contribution + // HJ, 26/Oct/2015 + volScalarField aU = HUEqn.A(); // --- PISO loop for (int corr = 0; corr < nCorr; corr++) { - volScalarField rUA = 1.0/UEqn.A(); - - U = rUA*UEqn.H(); - phi = (fvc::interpolate(U) & mesh.Sf()) - + fvc::ddtPhiCorr(rUA, U, phi); + U = HUEqn.H()/aU; + phi = (fvc::interpolate(U) & mesh.Sf()); adjustPhi(phi, U, p); - for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) + for (int nonOrth = 0; nonOrth <= nNonOrthCorr; nonOrth++) { fvScalarMatrix pEqn ( - fvm::laplacian(rUA, p) == fvc::div(phi) + fvm::laplacian(1/aU, p) == fvc::div(phi) ); pEqn.setReference(pRefCell, pRefValue); @@ -95,7 +103,12 @@ int main(int argc, char *argv[]) # include "continuityErrs.H" - U -= rUA*fvc::grad(p); + // Note: cannot call H(U) here because the velocity is not complete + // HJ, 22/Jan/2016 + U = 1.0/(aU + ddtUEqn.A())* + ( + U*aU - fvc::grad(p) + ddtUEqn.H() + ); U.correctBoundaryConditions(); } diff --git a/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/fvSchemes b/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/fvSchemes index 1a04dfafd..5e09611e2 100644 --- a/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/fvSchemes +++ b/tutorials/incompressible/nonNewtonianIcoFoam/offsetCylinder/system/fvSchemes @@ -28,7 +28,7 @@ gradSchemes divSchemes { default none; - div(phi,U) Gauss linear; + div(phi,U) Gauss linearUpwind leastSquares; } laplacianSchemes