diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.C b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.C index 4f6b82efc2..86a884ab12 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2022 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -88,10 +88,12 @@ Foam::convergenceControl::~convergenceControl() bool Foam::convergenceControl::converged() { + const convergenceData cd(criteriaSatisfied()); + if ( control_.time().timeIndex() != control_.time().startTimeIndex() - && criteriaSatisfied() + && cd.checked && cd.satisfied ) { Info<< nl << control_.algorithmName() << " solution converged in " diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.H b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.H index 7785f9c2eb..9c9529af3e 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/convergenceControl/convergenceControl.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2020 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -62,6 +62,13 @@ public: scalar absTol; }; + //- Convergence data structure + struct convergenceData + { + bool checked; + bool satisfied; + }; + // Static Functions @@ -151,7 +158,7 @@ public: virtual bool hasResidualControls() const = 0; //- Return true if all convergence checks are satisfied - virtual bool criteriaSatisfied() const = 0; + virtual convergenceData criteriaSatisfied() const = 0; //- Flag to indicate whether convergence has been reached bool converged(); diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C index 5f394b4d63..120276727c 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C @@ -140,15 +140,15 @@ bool Foam::singleRegionConvergenceControl::hasResidualControls() const } -bool Foam::singleRegionConvergenceControl::criteriaSatisfied() const +Foam::convergenceControl::convergenceData +Foam::singleRegionConvergenceControl::criteriaSatisfied() const { if (!hasResidualControls()) { - return false; + return {false, false}; } - bool achieved = true; - bool checked = false; // ensure that some checks were actually performed + convergenceData cs{false, true}; if (control_.debug) { @@ -160,8 +160,7 @@ bool Foam::singleRegionConvergenceControl::criteriaSatisfied() const forAll(fieldNames, i) { const word& fieldName = fieldNames[i]; - const label fieldi = - residualControlIndex(fieldName, residualControl_); + const label fieldi = residualControlIndex(fieldName, residualControl_); if (fieldi != -1) { scalar residual; @@ -174,11 +173,11 @@ bool Foam::singleRegionConvergenceControl::criteriaSatisfied() const residual ); - checked = true; + cs.checked = true; - bool absCheck = residual < residualControl_[fieldi].absTol; + const bool absCheck = residual < residualControl_[fieldi].absTol; - achieved = achieved && absCheck; + cs.satisfied = cs.satisfied && absCheck; if (control_.debug) { @@ -190,7 +189,7 @@ bool Foam::singleRegionConvergenceControl::criteriaSatisfied() const } } - return checked && achieved; + return cs; } diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H index 2a20064e46..0be9c14593 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H @@ -103,7 +103,7 @@ public: virtual bool hasResidualControls() const; //- Return true if all convergence checks are satisfied - virtual bool criteriaSatisfied() const; + virtual convergenceData criteriaSatisfied() const; }; diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.C b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.C index 69cabe6ee4..3b583b7bd2 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.C @@ -128,11 +128,11 @@ Foam::pimpleMultiRegionControl::~pimpleMultiRegionControl() bool Foam::pimpleMultiRegionControl::hasResidualControls() const { - bool result = true; + bool result = false; forAll(pimpleControls_, i) { - result = result && pimpleControls_[i].hasResidualControls(); + result = result || pimpleControls_[i].hasResidualControls(); } return result; @@ -141,27 +141,34 @@ bool Foam::pimpleMultiRegionControl::hasResidualControls() const bool Foam::pimpleMultiRegionControl::hasCorrResidualControls() const { - bool result = true; + bool result = false; forAll(pimpleControls_, i) { - result = result && pimpleControls_[i].hasCorrResidualControls(); + result = result || pimpleControls_[i].hasCorrResidualControls(); } return result; } -bool Foam::pimpleMultiRegionControl::criteriaSatisfied() const +Foam::convergenceControl::convergenceData +Foam::pimpleMultiRegionControl::criteriaSatisfied() const { - bool result = true; + convergenceData cs{false, true}; forAll(pimpleControls_, i) { - result = pimpleControls_[i].criteriaSatisfied() && result; + const convergenceData csi(pimpleControls_[i].criteriaSatisfied()); + + cs.checked = csi.checked || cs.checked; + if (csi.checked) + { + cs.satisfied = csi.satisfied && cs.satisfied; + } } - return result; + return cs; } diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.H index 11016ad6bc..7861e8fe4f 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleMultiRegionControl/pimpleMultiRegionControl.H @@ -120,7 +120,7 @@ public: virtual bool hasCorrResidualControls() const; //- Return true if all convergence checks are satisfied - virtual bool criteriaSatisfied() const; + virtual convergenceData criteriaSatisfied() const; //- Return true if all correction convergence checks are satisfied virtual bool corrCriteriaSatisfied() const; diff --git a/tutorials/multiRegion/CHT/circuitBoardCooling/system/baffle3D/fvSolution b/tutorials/multiRegion/CHT/circuitBoardCooling/system/baffle3D/fvSolution index 713c72aa97..949f911671 100644 --- a/tutorials/multiRegion/CHT/circuitBoardCooling/system/baffle3D/fvSolution +++ b/tutorials/multiRegion/CHT/circuitBoardCooling/system/baffle3D/fvSolution @@ -29,6 +29,11 @@ solvers PIMPLE { nNonOrthogonalCorrectors 0; + + residualControl + { + e 1e-4; + } } diff --git a/tutorials/multiRegion/CHT/circuitBoardCooling/system/controlDict b/tutorials/multiRegion/CHT/circuitBoardCooling/system/controlDict index 41bc2c7e0e..6c69171ccc 100644 --- a/tutorials/multiRegion/CHT/circuitBoardCooling/system/controlDict +++ b/tutorials/multiRegion/CHT/circuitBoardCooling/system/controlDict @@ -27,7 +27,7 @@ startTime 0; stopAt endTime; -endTime 2500; +endTime 5000; deltaT 1; diff --git a/tutorials/multiRegion/CHT/circuitBoardCooling/system/fluid/fvSolution b/tutorials/multiRegion/CHT/circuitBoardCooling/system/fluid/fvSolution index a176d609e3..157d1670d8 100644 --- a/tutorials/multiRegion/CHT/circuitBoardCooling/system/fluid/fvSolution +++ b/tutorials/multiRegion/CHT/circuitBoardCooling/system/fluid/fvSolution @@ -37,14 +37,13 @@ solvers PIMPLE { - momentumPredictor no; + momentumPredictor yes; nNonOrthogonalCorrectors 0; pRefCell 0; pRefValue 0; residualControl { - p_rgh 1e-3; U 1e-4; h 1e-4;