Store whether timestep failed or not
Used in flow ebos to tell the simulator to recalculate the cached quantities for failed timesteps.
This commit is contained in:
parent
e53b0a58fa
commit
2a3a825895
@ -42,6 +42,7 @@ namespace Opm
|
|||||||
, dt_( 0.0 )
|
, dt_( 0.0 )
|
||||||
, current_step_( 0 )
|
, current_step_( 0 )
|
||||||
, steps_()
|
, steps_()
|
||||||
|
, lastStepFailed_( false )
|
||||||
{
|
{
|
||||||
// reserve memory for sub steps
|
// reserve memory for sub steps
|
||||||
steps_.reserve( 10 );
|
steps_.reserve( 10 );
|
||||||
|
@ -93,6 +93,12 @@ namespace Opm
|
|||||||
/// \brief start date time of simulation
|
/// \brief start date time of simulation
|
||||||
boost::posix_time::ptime startDateTime() const;
|
boost::posix_time::ptime startDateTime() const;
|
||||||
|
|
||||||
|
/// \brief Return true if last time step failed
|
||||||
|
bool lastStepFailed() const {return lastStepFailed_;}
|
||||||
|
|
||||||
|
/// \brief tell the timestepper whether timestep failed or not
|
||||||
|
void setLastStepFailed(bool lastStepFailed) {lastStepFailed_ = lastStepFailed;}
|
||||||
|
|
||||||
/// return copy of object
|
/// return copy of object
|
||||||
virtual std::unique_ptr< SimulatorTimerInterface > clone() const;
|
virtual std::unique_ptr< SimulatorTimerInterface > clone() const;
|
||||||
|
|
||||||
@ -108,6 +114,8 @@ namespace Opm
|
|||||||
int current_step_;
|
int current_step_;
|
||||||
|
|
||||||
std::vector< double > steps_;
|
std::vector< double > steps_;
|
||||||
|
bool lastStepFailed_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Opm
|
} // namespace Opm
|
||||||
|
@ -295,12 +295,13 @@ namespace Opm {
|
|||||||
last_well_state = well_state;
|
last_well_state = well_state;
|
||||||
|
|
||||||
report.converged = substepTimer.done();
|
report.converged = substepTimer.done();
|
||||||
|
substepTimer.setLastStepFailed(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
else // in case of no convergence (linearIterations < 0)
|
else // in case of no convergence (linearIterations < 0)
|
||||||
{
|
{
|
||||||
report.converged = false;
|
report.converged = false;
|
||||||
|
substepTimer.setLastStepFailed(true);
|
||||||
// increase restart counter
|
// increase restart counter
|
||||||
if( restarts >= solver_restart_max_ ) {
|
if( restarts >= solver_restart_max_ ) {
|
||||||
const auto msg = std::string("Solver failed to converge after ")
|
const auto msg = std::string("Solver failed to converge after ")
|
||||||
|
@ -110,6 +110,10 @@ namespace Opm
|
|||||||
/// Return true if op++() has been called numSteps() times.
|
/// Return true if op++() has been called numSteps() times.
|
||||||
bool done() const;
|
bool done() const;
|
||||||
|
|
||||||
|
/// Always return false. Timestep failures is handled in the
|
||||||
|
/// substepTimer
|
||||||
|
bool lastStepFailed() const {return false;}
|
||||||
|
|
||||||
/// return copy of object
|
/// return copy of object
|
||||||
virtual std::unique_ptr< SimulatorTimerInterface > clone() const;
|
virtual std::unique_ptr< SimulatorTimerInterface > clone() const;
|
||||||
|
|
||||||
|
@ -101,6 +101,9 @@ namespace Opm
|
|||||||
return std::mktime(&t);
|
return std::mktime(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return true if last time step failed
|
||||||
|
virtual bool lastStepFailed() const = 0;
|
||||||
|
|
||||||
/// return copy of current timer instance
|
/// return copy of current timer instance
|
||||||
virtual std::unique_ptr< SimulatorTimerInterface > clone () const = 0;
|
virtual std::unique_ptr< SimulatorTimerInterface > clone () const = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user