diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H index 00a6f39bf468159df59e8de6983c4452be65c5ef..4150cd7503f41d781ce066ae50ee9acfd915e00c 100644 --- a/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/UEqn.H @@ -35,7 +35,12 @@ { pZones.addResistance(UEqn()); - solve(UEqn() == -fvc::grad(p)); + eqnResidual = solve + ( + UEqn() == -fvc::grad(p) + ). initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); trAU = 1.0/UEqn().A(); trAU().rename("rAU"); diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H b/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c --- /dev/null +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/convergenceCheck.H @@ -0,0 +1,9 @@ +// check convergence + +if (maxResidual < convergenceCriterion) +{ + Info<< "reached convergence criterion: " << convergenceCriterion << endl; + runTime.writeAndEnd(); + Info<< "latestTime = " << runTime.timeName() << endl; +} + diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H index e5d60199fe7638498a04749a6e3d9d9f38384de3..8eb03f95eb46b687a79f9f68c09152bbd269224a 100644 --- a/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/hEqn.H @@ -11,7 +11,8 @@ hEqn.relax(); - hEqn.solve(); + eqnResidual = hEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); thermo->correct(); } diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H b/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b --- /dev/null +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/initConvergenceCheck.H @@ -0,0 +1,7 @@ +// initialize values for convergence checks + + scalar eqnResidual = 1, maxResidual = 0; + scalar convergenceCriterion = 0; + + simple.readIfPresent("convergence", convergenceCriterion); + diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H index 558a57c86bed684ed2c4d46e194c746a485d2509..ae41da9e36fd7af8dd172b163b16dd8829a93b8b 100644 --- a/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/pEqn.H @@ -26,7 +26,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) } tpEqn().setReference(pRefCell, pRefValue); - tpEqn().solve(); + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = tpEqn().solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + tpEqn().solve(); + } if (nonOrth == nNonOrthCorr) { diff --git a/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C b/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C index 4042dc43f140d34a3bc7aaf49b1293a2409f5cf1..cba0c2dce171dcef9122ced75c5c9c3e1ad35c10 100644 --- a/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C +++ b/applications/solvers/compressible/rhoPorousSimpleFoam/rhoPorousSimpleFoam.C @@ -56,6 +56,7 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" +# include "initConvergenceCheck.H" p.storePrevIter(); rho.storePrevIter(); @@ -70,10 +71,11 @@ int main(int argc, char *argv[]) turbulence->correct(); runTime.write(); - Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; + +# include "convergenceCheck.H" } Info<< "End\n" << endl; diff --git a/applications/solvers/compressible/rhoSimpleFoam/UEqn.H b/applications/solvers/compressible/rhoSimpleFoam/UEqn.H index f1bed4d071e985d92c9057c777ca9e216b174c54..c41bc9b6c7b93cab65751d97b441f519e4b3d05f 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/UEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/UEqn.H @@ -9,4 +9,9 @@ UEqn().relax(); - solve(UEqn() == -fvc::grad(p)); + eqnResidual = solve + ( + UEqn() == -fvc::grad(p) + ).initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); diff --git a/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H b/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c --- /dev/null +++ b/applications/solvers/compressible/rhoSimpleFoam/convergenceCheck.H @@ -0,0 +1,9 @@ +// check convergence + +if (maxResidual < convergenceCriterion) +{ + Info<< "reached convergence criterion: " << convergenceCriterion << endl; + runTime.writeAndEnd(); + Info<< "latestTime = " << runTime.timeName() << endl; +} + diff --git a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H index e5d60199fe7638498a04749a6e3d9d9f38384de3..8eb03f95eb46b687a79f9f68c09152bbd269224a 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H @@ -11,7 +11,8 @@ hEqn.relax(); - hEqn.solve(); + eqnResidual = hEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); thermo->correct(); } diff --git a/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H b/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b --- /dev/null +++ b/applications/solvers/compressible/rhoSimpleFoam/initConvergenceCheck.H @@ -0,0 +1,7 @@ +// initialize values for convergence checks + + scalar eqnResidual = 1, maxResidual = 0; + scalar convergenceCriterion = 0; + + simple.readIfPresent("convergence", convergenceCriterion); + diff --git a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H index 87f82991efab27ed09108b586047497f87fc18ba..9f7e576919221f54f8286fa1bf0cad6ab7366c44 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H @@ -12,7 +12,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) ); pEqn.setReference(pRefCell, pRefValue); - pEqn.solve(); + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pEqn.solve(); + } if (nonOrth == nNonOrthCorr) { diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C index b5b2aeb152c206980769de73809320f30ce6e144..edfe32990257558342f2fd34ec326ac365b09e0a 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C +++ b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C @@ -26,8 +26,7 @@ Application rhoSimpleFoam Description - Steady-state solver for turbulent flow of compressible fluids for - ventilation and heat-transfer. + Steady-state solver for turbulent flow of compressible fluids \*---------------------------------------------------------------------------*/ @@ -56,6 +55,7 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" +# include "initConvergenceCheck.H" p.storePrevIter(); rho.storePrevIter(); @@ -74,6 +74,8 @@ int main(int argc, char *argv[]) Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; + +# include "convergenceCheck.H" } Info<< "End\n" << endl; diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H index d58a70a54e4f3a533ee3f149a757ed68c0438f14..5bc4c4738ccc963dadfa1666a1886deb56cd5b5b 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/UEqn.H @@ -9,4 +9,10 @@ UEqn().relax(); - solve(UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh); + eqnResidual = solve + ( + UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh + ).initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); + diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C b/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C index 932deb1fed6013dee7da3d3ddcf4bea8a9347989..3beb759bd717a875dc0fe8b98221a636f1d8daeb 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/buoyantSimpleFoam.C @@ -26,8 +26,7 @@ Application buoyantSimpleFoam Description - Steady-state solver for buoyant, turbulent flow of compressible fluids for - ventilation and heat-transfer. + Steady-state solver for buoyant, turbulent flow of compressible fluids \*---------------------------------------------------------------------------*/ @@ -57,6 +56,7 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" +# include "initConvergenceCheck.H" pd.storePrevIter(); rho.storePrevIter(); @@ -64,9 +64,7 @@ int main(int argc, char *argv[]) // Pressure-velocity SIMPLE corrector { # include "UEqn.H" - # include "hEqn.H" - # include "pEqn.H" } @@ -77,6 +75,8 @@ int main(int argc, char *argv[]) Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; + +# include "convergenceCheck.H" } Info<< "End\n" << endl; diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c --- /dev/null +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/convergenceCheck.H @@ -0,0 +1,9 @@ +// check convergence + +if (maxResidual < convergenceCriterion) +{ + Info<< "reached convergence criterion: " << convergenceCriterion << endl; + runTime.writeAndEnd(); + Info<< "latestTime = " << runTime.timeName() << endl; +} + diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H index 5ff3394ac0ae9efa6878bc14da8839702b42a81e..dad078c2193a6797d2f08ed9751cdac4ca4ff157 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/hEqn.H @@ -11,7 +11,8 @@ hEqn.relax(); - hEqn.solve(); + eqnResidual = hEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); thermo->correct(); } diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b --- /dev/null +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/initConvergenceCheck.H @@ -0,0 +1,7 @@ +// initialize values for convergence checks + + scalar eqnResidual = 1, maxResidual = 0; + scalar convergenceCriterion = 0; + + simple.readIfPresent("convergence", convergenceCriterion); + diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H index 6f7aa582f078a471d7db384fd5d3729416277e6d..4c8d0939a8b53526a4ee07d4f91d6a5b3692a821 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H @@ -13,7 +13,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) ); pdEqn.setReference(pdRefCell, pdRefValue); - pdEqn.solve(); + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pdEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pdEqn.solve(); + } if (nonOrth == nNonOrthCorr) { diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H index d58a70a54e4f3a533ee3f149a757ed68c0438f14..5bc4c4738ccc963dadfa1666a1886deb56cd5b5b 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/UEqn.H @@ -9,4 +9,10 @@ UEqn().relax(); - solve(UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh); + eqnResidual = solve + ( + UEqn() == -fvc::grad(pd) - fvc::grad(rho)*gh + ).initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); + diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C index 034134eeb55773e5ff440cde7824068a6274db4a..4bb432d53ea832e69b95492f41fc2bef80b06ee5 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/buoyantSimpleRadiationFoam.C @@ -58,6 +58,7 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" +# include "initConvergenceCheck.H" pd.storePrevIter(); rho.storePrevIter(); @@ -65,9 +66,7 @@ int main(int argc, char *argv[]) // Pressure-velocity SIMPLE corrector { # include "UEqn.H" - # include "hEqn.H" - # include "pEqn.H" } @@ -78,6 +77,8 @@ int main(int argc, char *argv[]) Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; + +# include "convergenceCheck.H" } Info<< "End\n" << endl; diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c --- /dev/null +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/convergenceCheck.H @@ -0,0 +1,9 @@ +// check convergence + +if (maxResidual < convergenceCriterion) +{ + Info<< "reached convergence criterion: " << convergenceCriterion << endl; + runTime.writeAndEnd(); + Info<< "latestTime = " << runTime.timeName() << endl; +} + diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H index 88094369d4107068cf0fc9eeb788322a7f0158da..31462927b94bdd60bba71db3718e6d98a7e9defb 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/hEqn.H @@ -12,7 +12,8 @@ hEqn.relax(); - hEqn.solve(); + eqnResidual = hEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); thermo->correct(); diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b --- /dev/null +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/initConvergenceCheck.H @@ -0,0 +1,7 @@ +// initialize values for convergence checks + + scalar eqnResidual = 1, maxResidual = 0; + scalar convergenceCriterion = 0; + + simple.readIfPresent("convergence", convergenceCriterion); + diff --git a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H index 6f7aa582f078a471d7db384fd5d3729416277e6d..4c8d0939a8b53526a4ee07d4f91d6a5b3692a821 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleRadiationFoam/pEqn.H @@ -13,7 +13,16 @@ for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) ); pdEqn.setReference(pdRefCell, pdRefValue); - pdEqn.solve(); + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pdEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pdEqn.solve(); + } if (nonOrth == nNonOrthCorr) { diff --git a/applications/solvers/incompressible/simpleFoam/UEqn.H b/applications/solvers/incompressible/simpleFoam/UEqn.H index e6fb6bf89edccff6f683313796f1b7a46157d781..9f9d9f6dd41457397ce54c3b69901d33b27a21c1 100644 --- a/applications/solvers/incompressible/simpleFoam/UEqn.H +++ b/applications/solvers/incompressible/simpleFoam/UEqn.H @@ -8,4 +8,10 @@ UEqn().relax(); - solve(UEqn() == -fvc::grad(p)); + eqnResidual = solve + ( + UEqn() == -fvc::grad(p) + ).initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); + diff --git a/applications/solvers/incompressible/simpleFoam/convergenceCheck.H b/applications/solvers/incompressible/simpleFoam/convergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..8958063193af348a058fd8f3baecb2547c00da3c --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/convergenceCheck.H @@ -0,0 +1,9 @@ +// check convergence + +if (maxResidual < convergenceCriterion) +{ + Info<< "reached convergence criterion: " << convergenceCriterion << endl; + runTime.writeAndEnd(); + Info<< "latestTime = " << runTime.timeName() << endl; +} + diff --git a/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H b/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H new file mode 100644 index 0000000000000000000000000000000000000000..b56197f22a50cfd07b04fc14d40b9a5454da8c5b --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/initConvergenceCheck.H @@ -0,0 +1,7 @@ +// initialize values for convergence checks + + scalar eqnResidual = 1, maxResidual = 0; + scalar convergenceCriterion = 0; + + simple.readIfPresent("convergence", convergenceCriterion); + diff --git a/applications/solvers/incompressible/simpleFoam/pEqn.H b/applications/solvers/incompressible/simpleFoam/pEqn.H index abdfaff3fcddfe65cdc4814344c19f8cc098ff81..dd9cae30a9c3a94d4be9c1bd3d5ab2df2d65f998 100644 --- a/applications/solvers/incompressible/simpleFoam/pEqn.H +++ b/applications/solvers/incompressible/simpleFoam/pEqn.H @@ -15,7 +15,16 @@ ); pEqn.setReference(pRefCell, pRefValue); - pEqn.solve(); + // retain the residual from the first iteration + if (nonOrth == 0) + { + eqnResidual = pEqn.solve().initialResidual(); + maxResidual = max(eqnResidual, maxResidual); + } + else + { + pEqn.solve(); + } if (nonOrth == nNonOrthCorr) { diff --git a/applications/solvers/incompressible/simpleFoam/simpleFoam.C b/applications/solvers/incompressible/simpleFoam/simpleFoam.C index 6fb4f3312d0c5112c6f12064a401dfe2a47ed7fb..7c378fe8ff714f44ddb56f898968fa607d986850 100644 --- a/applications/solvers/incompressible/simpleFoam/simpleFoam.C +++ b/applications/solvers/incompressible/simpleFoam/simpleFoam.C @@ -54,6 +54,7 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; # include "readSIMPLEControls.H" +# include "initConvergenceCheck.H" p.storePrevIter(); @@ -70,6 +71,8 @@ int main(int argc, char *argv[]) Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl; + +# include "convergenceCheck.H" } Info<< "End\n" << endl;