diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/checkResidualControls.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/checkResidualControls.H new file mode 100644 index 000000000..3c8b936d6 --- /dev/null +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/checkResidualControls.H @@ -0,0 +1,68 @@ +// Residual control used? +bool resControlUsed = false; +int nFluidControlled = fluidRegions.size(); +int nSolidControlled = solidRegions.size(); + +// Check wheater there is a single regions that uses residual control +forAll(fluidRegions, i) +{ + if (residualControlUsedFluid[i]) + { + resControlUsed = true; + break; + } +} + +forAll(solidRegions, i) +{ + if(residualControlUsedSolid[i]) + { + resControlUsed = true; + break; + } +} + +if (resControlUsed) +{ + int nFluidConv = 0; + int nSolidConv = 0; + + // Sum of all converged regions (Note: if no residual control is used + // the residualReached* flag is already set to true) + forAll(fluidRegions, i) + { + if (residualReachedFluid[i]) + { + nFluidConv++; + } + } + + forAll(solidRegions, i) + { + if (residualReachedSolid[i]) + { + nSolidConv++; + } + } + + if (nFluidConv == nFluidControlled && nSolidConv == nSolidControlled) + { + // Activate flag to go to the 'Final' loop using the 'Final' + // relaxation factors + allRegionsConverged = true; + } +} + +if (!runTime.run()) +{ + Info<< "\nRegions not converged after " << runTime.timeName() + << " iterations" << endl; +} +else if (runTime.run() && resControlUsed && allRegionsConverged) +{ + Info<< "\nRegions converged after " << runTime.timeName() + << " iterations" << endl; + + // Leave SIMPLE loop + break; +} diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/chtMultiRegionSimpleFoam.C b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/chtMultiRegionSimpleFoam.C index 86f20d515..229794069 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/chtMultiRegionSimpleFoam.C +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/chtMultiRegionSimpleFoam.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -54,9 +54,13 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "initContinuityErrs.H" + // Residual control + bool allRegionsConverged = false; - while (runTime.loop()) + while (runTime.run()) { + runTime++; + Info<< "Time = " << runTime.timeName() << nl << endl; forAll(fluidRegions, i) @@ -65,7 +69,9 @@ int main(int argc, char *argv[]) << fluidRegions[i].name() << endl; #include "setRegionFluidFields.H" #include "readFluidMultiRegionSIMPLEControls.H" + #include "readFluidMultiRegionResidualControls.H" #include "solveFluid.H" + #include "residualControlsFluid.H" } forAll(solidRegions, i) @@ -74,9 +80,13 @@ int main(int argc, char *argv[]) << solidRegions[i].name() << endl; #include "setRegionSolidFields.H" #include "readSolidMultiRegionSIMPLEControls.H" + #include "readSolidMultiRegionResidualControls.H" #include "solveSolid.H" + #include "residualControlsSolid.H" } + #include "checkResidualControls.H" + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/EEqn.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/EEqn.H index daf3af8f2..04f246c7c 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/EEqn.H +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/EEqn.H @@ -20,7 +20,7 @@ fvOptions.constrain(EEqn); - EEqn.solve(); + solvPerfE = EEqn.solve(); fvOptions.correct(he); diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/UEqn.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/UEqn.H index ed0402c2d..636c29ff9 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/UEqn.H +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/UEqn.H @@ -16,17 +16,20 @@ fvOptions.constrain(UEqn); - solve - ( - UEqn - == - fvc::reconstruct + if (momentumPredictor) + { + solvPerfU = solve ( + UEqn + == + fvc::reconstruct ( - - ghf*fvc::snGrad(rho) - - fvc::snGrad(p_rgh) - )*mesh.magSf() - ) - ); + ( + - ghf*fvc::snGrad(rho) + - fvc::snGrad(p_rgh) + )*mesh.magSf() + ) + ); + } fvOptions.correct(U); diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/createFluidFields.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/createFluidFields.H index aabee1cd3..6fe538d36 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/createFluidFields.H +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/createFluidFields.H @@ -15,6 +15,9 @@ List initialMassFluid(fluidRegions.size()); List