fix the end-of-episode detection code

This commit is contained in:
Andreas Lauser 2016-08-08 14:58:25 +02:00
parent f29bf8f694
commit adb8a2cf96
2 changed files with 34 additions and 8 deletions

View File

@ -173,6 +173,7 @@ namespace Opm {
false } )
, terminal_output_ (terminal_output)
, current_relaxation_(1.0)
, isBeginReportStep_(false)
{
const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
const V depth = Opm::AutoDiffGrid::cellCentroidsZToEigen(grid_);
@ -1432,6 +1433,18 @@ namespace Opm {
}
}
public:
void beginReportStep()
{
isBeginReportStep_ = true;
}
void endReportStep()
{
ebosSimulator_.problem().endEpisode();
}
private:
void assembleMassBalanceEq(const SimulatorTimerInterface& timer,
const int iterationIdx,
const ReservoirState& reservoirState,
@ -1448,26 +1461,32 @@ namespace Opm {
static int prevEpisodeIdx = 10000;
// notify ebos about the end of the previous episode and time step if applicable
#warning "TODO: move this to the SimulatorFullyImplicitBlackoilEbos class"
if (isBeginReportStep_) {
isBeginReportStep_ = false;
ebosSimulator_.problem().beginEpisode();
}
// doing the notifactions here is conceptually wrong and also causes the
// endTimeStep() and endEpisode() methods to be not called for the
// simulation's last time step and episode.
if (ebosSimulator_.model().newtonMethod().numIterations() == 0 && prevEpisodeIdx >= 0)
if (ebosSimulator_.model().newtonMethod().numIterations() == 0
&& prevEpisodeIdx < timer.reportStepNum())
{
ebosSimulator_.problem().endTimeStep();
if (ebosSimulator_.episodeIndex() != prevEpisodeIdx && prevEpisodeIdx >= 0)
ebosSimulator_.problem().endEpisode();
}
if (ebosSimulator_.episodeIndex() != prevEpisodeIdx)
ebosSimulator_.problem().beginEpisode();
ebosSimulator_.setTimeStepSize( timer.currentStepLength() );
if (ebosSimulator_.model().newtonMethod().numIterations() == 0)
{
ebosSimulator_.problem().beginTimeStep();
}
ebosSimulator_.problem().beginIteration();
ebosSimulator_.model().linearizer().linearize();
ebosSimulator_.problem().endIteration();
prevEpisodeIdx = ebosSimulator_.episodeIndex();
convertResults(ebosSimulator_, /*sparsityPattern=*/state.saturation[0]);
updateLegacyState(ebosSimulator_, state);
@ -1891,6 +1910,9 @@ namespace Opm {
double drMaxRel() const { return param_.dr_max_rel_; }
double maxResidualAllowed() const { return param_.max_residual_allowed_; }
public:
bool isBeginReportStep_;
};
} // namespace Opm

View File

@ -259,6 +259,8 @@ public:
OpmLog::info(step_msg.str());
}
solver->model().beginReportStep();
// If sub stepping is enabled allow the solver to sub cycle
// in case the report steps are too large for the solver to converge
//
@ -272,6 +274,8 @@ public:
solver->step(timer, state, well_state);
}
solver->model().endReportStep();
// update the derived geology (transmissibilities, pore volumes, etc) if the
// has geology changed for the next report step
const int nextTimeStepIdx = timer.currentStepNum() + 1;