linch |
April 10, 2012 10:23 |
The new SIMPLE/PIMPLE loop control structure in OF 2.1
Hi guys,
since OF 2.1 there is a new control structure for SIMPLE & PIMPLE loops. So now the outer PIMPLE loop looks just like:
Code:
while (pimple.loop()) {...}
I would like to know how to use it properly. I mean, how can one define convergence criteria for the outer iteration loop?
I tried to look into the pimpleControl.C and hier it is:
Code:
bool Foam::pimpleControl::loop()
00174 {
00175 read();
00176
00177 corr_++;
00178
00179 if (debug)
00180 {
00181 Info<< algorithmName_ << " loop: corr = " << corr_ << endl;
00182 }
00183
00184 if (corr_ == nCorrPIMPLE_ + 1)
00185 {
00186 if ((!residualControl_.empty()) && (nCorrPIMPLE_ != 1))
00187 {
00188 Info<< algorithmName_ << ": not converged within "
00189 << nCorrPIMPLE_ << " iterations" << endl;
00190 }
00191
00192 corr_ = 0;
00193 mesh_.data::remove("finalIteration");
00194 return false;
00195 }
00196
00197 bool completed = false;
00198 if (converged_ || criteriaSatisfied())
00199 {
00200 if (converged_)
00201 {
00202 Info<< algorithmName_ << ": converged in " << corr_ - 1
00203 << " iterations" << endl;
00204
00205 mesh_.data::remove("finalIteration");
00206 corr_ = 0;
00207 converged_ = false;
00208
00209 completed = true;
00210 }
00211 else
00212 {
00213 Info<< algorithmName_ << ": iteration " << corr_ << endl;
00214 storePrevIterFields();
00215
00216 mesh_.data::add("finalIteration", true);
00217 converged_ = true;
00218 }
00219 }
00220 else
00221 {
00222 if (finalIter())
00223 {
00224 mesh_.data::add("finalIteration", true);
00225 }
00226
00227 if (corr_ <= nCorrPIMPLE_)
00228 {
00229 if (nCorrPIMPLE_ != 1)
00230 {
00231 Info<< algorithmName_ << ": iteration " << corr_ << endl;
00232 storePrevIterFields();
00233 }
00234
00235 completed = false;
00236 }
00237 }
00238
00239 return !completed;
00240 }
the first check is done to see if the maximum number of iterations is exceeded
Code:
if (corr_ == nCorrPIMPLE_ + 1)
if so,
Code:
mesh_.data::remove("finalIteration");
what does it mean?
Then convergence is checked
Code:
if (converged_ || criteriaSatisfied())
my question here is, why are there two different indicators of convergence "converged_" and "criteriaSatisfied()"? Where can one provide the criteria to be satisfied? I also looked on the bool Foam::pimpleControl::criteriaSatisfied(), but it also wasn't easy to understand, what is being done there.
I would really appreciate, if someone takes some time and explains it for such noobs as me.
Best regards,
Illya
|