Changed: Exit the prediction cycle loop, and subsequently the

entire simulation if a user-defined stop criterion has been met,
by checking S1->stopped()
This commit is contained in:
Knut Morten Okstad 2018-05-01 20:18:04 +02:00
parent f0b601b796
commit 48dad1c76a

View File

@ -69,12 +69,13 @@ public:
{ {
this->S1.saveState(); // Save current solution state internally this->S1.saveState(); // Save current solution state internally
int tranStep = this->tp.step; // Time step of next solution transfer int tranStep = this->tp.step; // Time step of next solution transfer
int lastRef = 0, refElms = 0; int lastRef = 1, refElms = 0;
// Prediction cycle loop, disable staggering cycles // Prediction cycle loop, disable staggering cycles
if (maxPred < 0) this->S1.enableStaggering(false); if (maxPred < 0) this->S1.enableStaggering(false);
for (int iPred = 0; iPred < abs(maxPred); iPred++) for (int iPred = 0; iPred < abs(maxPred) && lastRef > 0; iPred++)
{ {
lastRef = 0;
if (iPred > 0) if (iPred > 0)
{ {
// Reset time step counter to the last saved state // Reset time step counter to the last saved state
@ -88,21 +89,22 @@ public:
if (!this->S1.solveStep(this->tp)) if (!this->S1.solveStep(this->tp))
return 3; return 3;
if (maxPred > 0 && this->S1.stopped())
break; // Terminated due to other user-criterion
// Adapt the mesh based on current solution, and // Adapt the mesh based on current solution, and
// transfer the old solution variables onto the new mesh // transfer the old solution variables onto the new mesh
IFEM::cout <<"\n >>> Paused for mesh refinement at time=" IFEM::cout <<"\n >>> Paused for mesh refinement at time="
<< this->tp.time.t << std::endl; << this->tp.time.t << std::endl;
lastRef = this->S1.adaptMesh(beta,minFrac,maxRef); if ((lastRef = this->S1.adaptMesh(beta,minFrac,maxRef)))
if (lastRef == 0) this->dumpMesh(infile,false);
break; // No new mesh refinement, exit the prediction cycles
if (!this->dumpMesh(infile,false) || lastRef < 0)
return 4; // Something went wrong, bailing
refElms += lastRef; // Total number of refined elements refElms += lastRef; // Total number of refined elements
} }
if (refElms == 0) if (lastRef < 0)
return 4; // Something went wrong, bailing
else if (refElms == 0 && !this->tp.finished())
IFEM::cout <<" No refinement, resume from current state"<< std::endl; IFEM::cout <<" No refinement, resume from current state"<< std::endl;
if (lastRef == 0 && maxPred > 0) if (lastRef == 0 && maxPred > 0)