diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C index 87c3f13090bf012ef6f41d39361664e04167ea2a..d3b295cdf29f2491f0ff76c6fad99a28f025d5e5 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C @@ -42,8 +42,10 @@ void Foam::pimpleControl::read() // Read solution controls const dictionary& pimpleDict = dict(); - nOuterCorr_ = pimpleDict.lookupOrDefault<label>("nOuterCorrectors", 1); - nCorr_ = pimpleDict.lookupOrDefault<label>("nCorrectors", 1); + nCorrPIMPLE_ = pimpleDict.lookupOrDefault<label>("nOuterCorrectors", 1); + nCorrPISO_ = pimpleDict.lookupOrDefault<label>("nCorrectors", 1); + nCorrNonOrtho_ = + pimpleDict.lookupOrDefault<label>("nNonOrthogonalCorrectors", 1); turbOnFinalIterOnly_ = pimpleDict.lookupOrDefault<Switch>("turbOnFinalIterOnly", true); } @@ -51,12 +53,14 @@ void Foam::pimpleControl::read() bool Foam::pimpleControl::criteriaSatisfied() { - if ((corr_ == 0) || residualControl_.empty() || finalIter()) + // no checks on first iteration - nothing has been calculated yet + if ((corrPIMPLE_ == 1) || residualControl_.empty() || finalIter()) { return false; } - bool firstIter = corr_ == 1; + + bool storeIni = this->storeInitialResiduals(); bool achieved = true; bool checked = false; // safety that some checks were indeed performed @@ -73,7 +77,7 @@ bool Foam::pimpleControl::criteriaSatisfied() checked = true; - if (firstIter) + if (storeIni) { residualControl_[fieldI].initialResidual = sp.first().initialResidual(); @@ -83,7 +87,7 @@ bool Foam::pimpleControl::criteriaSatisfied() bool relCheck = false; scalar relative = 0.0; - if (!firstIter) + if (!storeIni) { const scalar iniRes = residualControl_[fieldI].initialResidual @@ -97,9 +101,10 @@ bool Foam::pimpleControl::criteriaSatisfied() if (debug) { - Info<< algorithmName_ << "loop statistics:" << endl; + Info<< algorithmName_ << " loop:" << endl; - Info<< " " << variableName << " iter " << corr_ + Info<< " " << variableName + << " PIMPLE iter " << corrPIMPLE_ << ": ini res = " << residualControl_[fieldI].initialResidual << ", abs tol = " << residual @@ -120,25 +125,28 @@ bool Foam::pimpleControl::criteriaSatisfied() Foam::pimpleControl::pimpleControl(fvMesh& mesh) : solutionControl(mesh, "PIMPLE"), - nOuterCorr_(0), - nCorr_(0), - corr_(0), + nCorrPIMPLE_(0), + nCorrPISO_(0), + nCorrNonOrtho_(0), + corrPIMPLE_(0), + corrPISO_(0), + corrNonOrtho_(0), turbOnFinalIterOnly_(true) { read(); - if (nOuterCorr_ > 1) + if (nCorrPIMPLE_ > 1) { Info<< nl; if (residualControl_.empty()) { Info<< algorithmName_ << ": no residual control data found. " - << "Calculations will employ " << nOuterCorr_ + << "Calculations will employ " << nCorrPIMPLE_ << " corrector loops" << nl << endl; } else { - Info<< algorithmName_ << ": max iterations = " << nOuterCorr_ + Info<< algorithmName_ << ": max iterations = " << nCorrPIMPLE_ << endl; forAll(residualControl_, i) { diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H index 3b891a5aa93097e3041aa042b97ee8482b3c17f6..0e6b2195056df34d965ae914ccc63a38c5565c53 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H @@ -55,13 +55,22 @@ protected: // Solution controls //- Maximum number of PIMPLE correctors - label nOuterCorr_; + label nCorrPIMPLE_; //- Maximum number of PISO correctors - label nCorr_; + label nCorrPISO_; + + //- Maximum number of non-orthogonal correctors + label nCorrNonOrtho_; //- Current PIMPLE corrector - label corr_; + label corrPIMPLE_; + + //- Current PISO corrector + label corrPISO_; + + //- Current non-orthogonal corrector + label corrNonOrtho_; //- Flag to indicate whether to only solve turbulence on final iter bool turbOnFinalIterOnly_; @@ -105,41 +114,50 @@ public: // Access - //- Current corrector index - inline label corr() const; - //- Maximum number of PIMPLE correctors - inline label nOuterCorr() const; + inline label nCorrPIMPLE() const; //- Maximum number of PISO correctors - inline label nCorr() const; + inline label nCorrPISO() const; + //- Maximum number of non-orthogonal correctors + inline label nCorrNonOrtho() const; + + //- Current PIMPLE corrector index + inline label corrPIMPLE() const; + + //- Current PISO corrector index + inline label corrPISO() const; + + //- Current non-orthogonal corrector index + inline label corrNonOrtho() const; - // Solution control - //- Loop start - inline bool start(); + // Solution control - //- Loop loop + //- PIMPLE loop inline bool loop(); + //- Corrector loop + inline bool correct(); + + //- Non-orthogonal corrector loop + inline bool correctNonOrthogonal(); + + //- Helper function to identify when to store the intial residuals + inline bool storeInitialResiduals() const; + //- Helper function to identify final PIMPLE (outer) iteration inline bool finalIter() const; + //- Helper function to identify final non-orthogonal iteration + inline bool finalNonOrthogonalIter() const; + //- Helper function to identify final inner iteration - inline bool finalInnerIter - ( - const label corr, - const label nonOrth - ) const; + inline bool finalInnerIter() const; //- Helper function to identify whether to solve for turbulence inline bool turbCorr() const; - - - // Member Operators - - void operator++(int); }; diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H index 59e4e14204a754d61fa545b71a6afa65190dac9d..791c71b730f3b31ff17aa4d7d48bc79922879386 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControlI.H @@ -25,42 +25,71 @@ License // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -inline Foam::label Foam::pimpleControl::corr() const +inline Foam::label Foam::pimpleControl::nCorrPIMPLE() const { - return corr_; + return nCorrPIMPLE_; } -inline Foam::label Foam::pimpleControl::nOuterCorr() const +inline Foam::label Foam::pimpleControl::nCorrPISO() const { - return nOuterCorr_; + return nCorrPISO_; } -inline Foam::label Foam::pimpleControl::nCorr() const +inline Foam::label Foam::pimpleControl::nCorrNonOrtho() const { - return nCorr_; + return nCorrPISO_; } -inline bool Foam::pimpleControl::start() +inline Foam::label Foam::pimpleControl::corrPIMPLE() const { - corr_ = 0; + return corrPIMPLE_; +} + + +inline Foam::label Foam::pimpleControl::corrPISO() const +{ + return corrPISO_; +} + - return true; +inline Foam::label Foam::pimpleControl::corrNonOrtho() const +{ + return corrNonOrtho_; } inline bool Foam::pimpleControl::loop() { - read(); + corrPIMPLE_++; - if (criteriaSatisfied()) + if (debug) { - Info<< algorithmName_ << ": converged in " << corr_ << " iterations" - << endl; + Info<< algorithmName_ << " loop: corrPIMPLE = " << corrPIMPLE_ << endl; + } + + if (corrPIMPLE_ == nCorrPIMPLE_ + 1) + { + if ((!residualControl_.empty()) && (nCorrPIMPLE_ != 1)) + { + Info<< algorithmName_ << ": not converged within " + << nCorrPIMPLE_ << " iterations" << endl; + } + + corrPIMPLE_ = 0; + mesh_.data::remove("finalIteration"); return false; } + + bool completed = false; + if (criteriaSatisfied()) + { + Info<< algorithmName_ << ": converged in " << corrPIMPLE_ + << " iterations" << endl; + completed = true; + } else { if (finalIter()) @@ -68,63 +97,96 @@ inline bool Foam::pimpleControl::loop() mesh_.data::add("finalIteration", true); } - if (corr_ < nOuterCorr_) + if (corrPIMPLE_ <= nCorrPIMPLE_) { - if (nOuterCorr_ != 1) + if (nCorrPIMPLE_ != 1) { - Info<< algorithmName_ << ": iteration " << corr_ + 1 << endl; + Info<< algorithmName_ << ": iteration " << corrPIMPLE_ << endl; storePrevIterFields(); } - return true; + completed = false; } - else - { - if ((!residualControl_.empty()) && (nOuterCorr_ != 1)) - { - Info<< algorithmName_ << ": not converged within " - << nOuterCorr_ << " iterations" << endl; - } + } - return false; - } + return !completed; +} + + +inline bool Foam::pimpleControl::correct() +{ + corrPISO_++; + + if (debug) + { + Info<< algorithmName_ << " correct: corrPISO = " << corrPISO_ << endl; + } + + if (corrPISO_ <= nCorrPISO_) + { + return true; + } + else + { + corrPISO_ = 0; + return false; } } -inline bool Foam::pimpleControl::finalIter() const +inline bool Foam::pimpleControl::correctNonOrthogonal() { - return corr_ == nOuterCorr_-1; + corrNonOrtho_++; + + if (debug) + { + Info<< algorithmName_ << " correctNonOrthogonal: corrNonOrtho = " + << corrNonOrtho_ << endl; + } + + if (corrNonOrtho_ <= nCorrNonOrtho_ + 1) + { + return true; + } + else + { + corrNonOrtho_ = 0; + return false; + } } -inline bool Foam::pimpleControl::finalInnerIter -( - const label corr, - const label nonOrth -) const +inline bool Foam::pimpleControl::storeInitialResiduals() const { - return - corr_ == nOuterCorr_-1 - && corr == nCorr_-1 - && nonOrth == nNonOrthCorr_; + // start from second PIMPLE iteration + return (corrPIMPLE_ == 2) && (corrPISO_ == 0) && (corrNonOrtho_ == 0); } -inline bool Foam::pimpleControl::turbCorr() const +inline bool Foam::pimpleControl::finalIter() const { - return !turbOnFinalIterOnly_ || finalIter(); + return corrPIMPLE_ == nCorrPIMPLE_; } -inline void Foam::pimpleControl::operator++(int) +inline bool Foam::pimpleControl::finalNonOrthogonalIter() const { - if (finalIter()) - { - mesh_.data::remove("finalIteration"); - } + return corrNonOrtho_ == nCorrNonOrtho_ + 1; +} + - corr_++; +inline bool Foam::pimpleControl::finalInnerIter() const +{ + return + corrPIMPLE_ == nCorrPIMPLE_ + && corrPISO_ == nCorrPISO_ + && corrNonOrtho_ == nCorrNonOrtho_ + 1; +} + + +inline bool Foam::pimpleControl::turbCorr() const +{ + return !turbOnFinalIterOnly_ || finalIter(); }