AdaptiveTimeStepping.hpp
Go to the documentation of this file.
1/*
2*/
3#ifndef OPM_ADAPTIVE_TIME_STEPPING_HPP
4#define OPM_ADAPTIVE_TIME_STEPPING_HPP
5
8
15
16#ifdef RESERVOIR_COUPLING_ENABLED
20#endif
21
22#include <functional>
23#include <memory>
24#include <set>
25#include <string>
26#include <tuple>
27#include <vector>
28
29namespace Opm::Parameters {
30
31struct SolverContinueOnConvergenceFailure { static constexpr bool value = false; };
32struct SolverMaxRestarts { static constexpr int value = 10; };
33struct SolverVerbosity { static constexpr int value = 1; };
34struct TimeStepVerbosity { static constexpr int value = 1; };
35struct InitialTimeStepInDays { static constexpr double value = 1.0; };
36struct FullTimeStepInitially { static constexpr bool value = false; };
37struct TimeStepControl { static constexpr auto value = "pid+newtoniteration"; };
38struct TimeStepControlTolerance { static constexpr double value = 1e-1; };
39struct TimeStepControlTargetIterations { static constexpr int value = 30; };
40struct TimeStepControlTargetNewtonIterations { static constexpr int value = 8; };
41struct TimeStepControlDecayRate { static constexpr double value = 0.75; };
42struct TimeStepControlGrowthRate { static constexpr double value = 1.25; };
43struct TimeStepControlDecayDampingFactor { static constexpr double value = 1.0; };
44struct TimeStepControlGrowthDampingFactor { static constexpr double value = 3.2; };
45struct TimeStepControlFileName { static constexpr auto value = "timesteps"; };
46struct MinTimeStepBeforeShuttingProblematicWellsInDays { static constexpr double value = 0.01; };
47struct MinTimeStepBasedOnNewtonIterations { static constexpr double value = 0.0; };
48struct TimeStepControlSafetyFactor { static constexpr double value = 0.8; };
49struct TimeStepControlRejectCompletedStep { static constexpr bool value = false; };
50struct TimeStepControlToleranceTestVersion { static constexpr auto value = "standard"; };
51struct TimeStepControlMaxReductionTimeStep { static constexpr double value = 0.1; };
52struct TimeStepControlParameters { static constexpr auto value = "0.125;0.25;0.125;0.75;0.25"; };
53
54} // namespace Opm::Parameters
55
56namespace Opm {
57
58struct Tuning;
59class UnitSystem;
60struct StepReport;
61
62namespace detail {
63 void logTimer(const AdaptiveSimulatorTimer& substep_timer);
64
65 std::set<std::string>
66 consistentlyFailingWells(const std::vector<StepReport>& sr,
67 bool requireRepeatedFailures);
69
70 std::tuple<TimeStepControlType, std::unique_ptr<TimeStepControlInterface>, bool>
71 createController(const UnitSystem& unitSystem);
72}
73
91template<class TypeTag>
93{
94public:
117 using TuningUpdateCallback = std::function<bool(double elapsed,
118 double substep_length,
119 int sub_step_number)>;
120
121private:
123
124 template <class Solver>
125 class SolutionTimeErrorSolverWrapper : public RelativeChangeInterface
126 {
127 public:
128 explicit SolutionTimeErrorSolverWrapper(const Solver& solver);
129 double relativeChange() const;
130
131 private:
132 const Solver& solver_;
133 };
134
135 // Forward declaration of SubStepIteration
136 template <class Solver> class SubStepIteration;
137
152 template <class Solver>
153 class SubStepper {
154 public:
155 SubStepper(AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping,
156 const SimulatorTimer& simulator_timer,
157 Solver& solver,
158 const bool is_event,
159 const TuningUpdateCallback& tuning_updater);
160
161 AdaptiveTimeStepping<TypeTag>& getAdaptiveTimerStepper();
162
166 SimulatorReport run();
167 friend class SubStepIteration<Solver>;
168
169 private:
170 bool isReservoirCouplingMaster_() const;
171 bool isReservoirCouplingSlave_() const;
172
187 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(const double originalTimeStep);
188
191 bool maybeUpdateTuning_(double elapsed, double substep_length, int sub_step_number) const;
192
193 double maxTimeStep_() const;
194
197 SimulatorReport runStepOriginal_();
198#ifdef RESERVOIR_COUPLING_ENABLED
203 void checkIfSlaveIsTerminated_();
204
205 // Reservoir coupling master: pick the sync-step length for the next outer-loop
206 // iteration of `runStepReservoirCouplingMaster_()`, including the chop
207 // against slave-report boundaries. See the helper's own comment for
208 // details.
209 double getRcMasterSyncStepLength_(double prev_step, double current_time, double step_end_time);
210 ReservoirCouplingMaster<Scalar>& reservoirCouplingMaster_();
211 ReservoirCouplingSlave<Scalar>& reservoirCouplingSlave_();
212
217 SimulatorReport runStepReservoirCouplingMaster_();
218
222 SimulatorReport runStepReservoirCouplingSlave_();
223#endif
224 double suggestedNextTimestep_() const;
225
226 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
227 const SimulatorTimer& simulator_timer_;
228 Solver& solver_;
229 const bool is_event_;
230 const TuningUpdateCallback& tuning_updater_;
231 };
232
245 template <class Solver>
246 class SubStepIteration {
247 public:
248 SubStepIteration(SubStepper<Solver>& substepper,
249 AdaptiveSimulatorTimer& substep_timer,
250 const double original_time_step,
251 const bool final_step);
252
255 SimulatorReport run();
256
257 private:
258 bool checkContinueOnUnconvergedSolution_(double dt) const;
259 void checkTimeStepMaxRestartLimit_(const int restarts) const;
260 void checkTimeStepMinLimit_(const double new_time_step) const;
261 void chopTimeStep_(const double new_time_step);
262 bool chopTimeStepOrCloseFailingWells_(const double new_time_step);
263 boost::posix_time::ptime currentDateTime_() const;
264 int getNumIterations_(const SimulatorReportSingle& substep_report) const;
265 double growthFactor_() const;
266 bool ignoreConvergenceFailure_() const;
267 bool isReservoirCouplingMaster_() const;
268 bool isReservoirCouplingSlave_() const;
269 void markFirstSubStepAsFinished_() const;
270 void maybeReportSubStep_(SimulatorReportSingle substep_report) const;
271 double maybeRestrictTimeStepGrowth_(const double dt,
272 double dt_estimate,
273 const int restarts) const;
274 void maybeUpdateLastSubstepOfSyncTimestep_(double dt);
275
293 void maybeUpdateTuningAndTimeStep_();
294 double maxGrowth_() const;
295 double minTimeStepBeforeClosingWells_() const;
296 double minTimeStep_() const;
297 double restartFactor_() const;
298 SimulatorReportSingle runSubStep_();
299 int solverRestartMax_() const;
300 double suggestedNextTimestep_() const;
301 void setSuggestedNextStep_(double step);
302 void setTimeStep_(double dt_estimate);
303 Solver& solver_() const;
304 bool solverVerbose_() const;
305 const SimulatorTimer& simulatorTimer_() const;
306 boost::posix_time::ptime startDateTime_() const;
307#ifdef RESERVOIR_COUPLING_ENABLED
308 ReservoirCouplingMaster<Scalar>& reservoirCouplingMaster_() const;
309 ReservoirCouplingSlave<Scalar>& reservoirCouplingSlave_() const;
310#endif
311 double timeStepControlComputeEstimate_(const double dt,
312 const int iterations,
313 const AdaptiveSimulatorTimer& substepTimer) const;
314 bool timeStepVerbose_() const;
315 void updateSuggestedNextStep_();
316 bool useNewtonIteration_() const;
317 double writeOutput_() const;
318
319 SubStepper<Solver>& substepper_;
320 AdaptiveSimulatorTimer& substep_timer_;
321 const double original_time_step_;
322 const bool final_step_;
323 std::string cause_of_failure_;
324 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
325 };
326
327public:
329
330 AdaptiveTimeStepping(const UnitSystem& unitSystem,
331 const SimulatorReport& full_report,
332 const double max_next_tstep = -1.0,
333 const bool terminalOutput = true);
334
335 AdaptiveTimeStepping(double max_next_tstep,
336 const Tuning& tuning,
337 const UnitSystem& unitSystem,
338 const SimulatorReport& full_report,
339 const bool terminalOutput = true);
340
341 bool operator==(const AdaptiveTimeStepping<TypeTag>& rhs) const;
342
343 static void registerParameters();
344
346 void setSuggestedNextStep(const double x);
347
351 double suggestedNextStep() const;
352
354
373 template <class Solver>
374 SimulatorReport step(const SimulatorTimer& simulator_timer,
375 Solver& solver,
376 const bool is_event,
377 const TuningUpdateCallback& tuning_updater);
378
388 void updateTUNING(double max_next_tstep, const Tuning& tuning);
389
397 void updateNEXTSTEP(double max_next_tstep);
398
399 template<class Serializer>
400 void serializeOp(Serializer& serializer);
401
403
409
410private:
411 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(const double original_time_step,
412 const bool is_event);
413
414 template<class Controller>
415 static AdaptiveTimeStepping<TypeTag> serializationTestObject_();
416
417 template<class T, class Serializer>
418 void allocAndSerialize(Serializer& serializer);
419
420 template<class T>
421 bool castAndComp(const AdaptiveTimeStepping<TypeTag>& Rhs) const;
422
423protected:
424 void init_(const UnitSystem& unitSystem);
425
426 using TimeStepController = std::unique_ptr<TimeStepControlInterface>;
427
432 double growth_factor_{};
433 double max_growth_{};
434 double max_time_step_{};
435 double min_time_step_{};
438 bool solver_verbose_{false};
439 bool timestep_verbose_{false};
444
447 // We store a copy of the full simulator run report for output purposes,
448 // so it can be updated and passed to the summary writing code every
449 // substep (not just every report step).
451};
452
453} // namespace Opm
454
456
457#endif // OPM_ADAPTIVE_TIME_STEPPING_HPP
Defines a type tags and some fundamental properties all models.
Simulation timer for adaptive time stepping.
Definition: AdaptiveSimulatorTimer.hpp:42
Adaptive time-stepping coordinator for the black-oil simulator.
Definition: AdaptiveTimeStepping.hpp:93
double max_growth_
factor that limits the maximum growth of a time step
Definition: AdaptiveTimeStepping.hpp:433
double max_time_step_
maximal allowed time step size in days
Definition: AdaptiveTimeStepping.hpp:434
bool solver_verbose_
solver verbosity
Definition: AdaptiveTimeStepping.hpp:438
int solver_restart_max_
how many restart of solver are allowed
Definition: AdaptiveTimeStepping.hpp:437
double timestep_after_event_
suggested size of timestep after an event
Definition: AdaptiveTimeStepping.hpp:442
void init_(const UnitSystem &unitSystem)
Definition: AdaptiveTimeStepping_impl.hpp:429
void setSuggestedNextStep(const double x)
Set the suggested length for the next substep [s].
Definition: AdaptiveTimeStepping_impl.hpp:300
double suggestedNextStep() const
Definition: AdaptiveTimeStepping_impl.hpp:308
SimulatorReport report_
Definition: AdaptiveTimeStepping.hpp:450
bool operator==(const AdaptiveTimeStepping< TypeTag > &rhs) const
Definition: AdaptiveTimeStepping_impl.hpp:140
static AdaptiveTimeStepping< TypeTag > serializationTestObjectSimple()
Definition: AdaptiveTimeStepping_impl.hpp:283
bool ignore_convergence_failure_
continue instead of stop when minimum time step is reached
Definition: AdaptiveTimeStepping.hpp:436
void serializeOp(Serializer &serializer)
Definition: AdaptiveTimeStepping_impl.hpp:212
void updateTUNING(double max_next_tstep, const Tuning &tuning)
Apply TUNING keyword parameters.
Definition: AdaptiveTimeStepping_impl.hpp:337
double suggested_next_timestep_
suggested size of next timestep
Definition: AdaptiveTimeStepping.hpp:440
TimeStepControlType time_step_control_type_
type of time step control object
Definition: AdaptiveTimeStepping.hpp:429
std::unique_ptr< TimeStepControlInterface > TimeStepController
Definition: AdaptiveTimeStepping.hpp:426
const TimeStepControlInterface & timeStepControl() const
Definition: AdaptiveTimeStepping_impl.hpp:316
std::function< bool(double elapsed, double substep_length, int sub_step_number)> TuningUpdateCallback
Callback invoked at the start of each substep to apply TUNING, NEXTSTEP (via ACTIONX),...
Definition: AdaptiveTimeStepping.hpp:119
bool full_timestep_initially_
beginning with the size of the time step from data file
Definition: AdaptiveTimeStepping.hpp:441
SimulatorReport step(const SimulatorTimer &simulator_timer, Solver &solver, const bool is_event, const TuningUpdateCallback &tuning_updater)
Run one report step by orchestrating adaptive substepping.
Definition: AdaptiveTimeStepping_impl.hpp:197
double growth_factor_
factor to multiply time step when solver recovered from failed convergence
Definition: AdaptiveTimeStepping.hpp:432
double restart_factor_
factor to multiply time step with when solver fails to converge
Definition: AdaptiveTimeStepping.hpp:431
double min_time_step_
minimal allowed time step size before throwing
Definition: AdaptiveTimeStepping.hpp:435
void updateNEXTSTEP(double max_next_tstep)
Set suggested_next_timestep_ to max_next_tstep iff max_next_tstep > 0.
Definition: AdaptiveTimeStepping_impl.hpp:325
static AdaptiveTimeStepping< TypeTag > serializationTestObjectHardcoded()
Definition: AdaptiveTimeStepping_impl.hpp:259
TimeStepController time_step_control_
time step control object
Definition: AdaptiveTimeStepping.hpp:430
static AdaptiveTimeStepping< TypeTag > serializationTestObjectPIDIt()
Definition: AdaptiveTimeStepping_impl.hpp:275
double min_time_step_before_shutting_problematic_wells_
< shut problematic wells when time step size in days are less than this
Definition: AdaptiveTimeStepping.hpp:446
static AdaptiveTimeStepping< TypeTag > serializationTestObject3rdOrder()
Definition: AdaptiveTimeStepping_impl.hpp:291
SimulatorReport & report()
Definition: AdaptiveTimeStepping_impl.hpp:251
static AdaptiveTimeStepping< TypeTag > serializationTestObjectPID()
Definition: AdaptiveTimeStepping_impl.hpp:267
bool timestep_verbose_
timestep verbosity
Definition: AdaptiveTimeStepping.hpp:439
static void registerParameters()
Definition: AdaptiveTimeStepping_impl.hpp:186
bool use_newton_iteration_
use newton iteration count for adaptive time step control
Definition: AdaptiveTimeStepping.hpp:443
Definition: TimeStepControlInterface.hpp:34
Definition: ReservoirCouplingMaster.hpp:38
Definition: ReservoirCouplingSlave.hpp:40
Definition: SimulatorTimer.hpp:39
Definition: TimeStepControlInterface.hpp:51
Definition: blackoilnewtonmethodparams.hpp:31
void logTimer(const AdaptiveSimulatorTimer &substep_timer)
void registerAdaptiveParameters()
std::set< std::string > consistentlyFailingWells(const std::vector< StepReport > &sr, bool requireRepeatedFailures)
std::tuple< TimeStepControlType, std::unique_ptr< TimeStepControlInterface >, bool > createController(const UnitSystem &unitSystem)
Definition: blackoilbioeffectsmodules.hh:45
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
TimeStepControlType
Definition: TimeStepControl.hpp:32
The Opm property system, traits with inheritance.
Definition: AdaptiveTimeStepping.hpp:36
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:36
Definition: AdaptiveTimeStepping.hpp:35
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:35
Definition: AdaptiveTimeStepping.hpp:47
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:47
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:46
Definition: AdaptiveTimeStepping.hpp:31
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:31
Definition: AdaptiveTimeStepping.hpp:32
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:32
Definition: AdaptiveTimeStepping.hpp:33
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:33
Definition: AdaptiveTimeStepping.hpp:43
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:43
Definition: AdaptiveTimeStepping.hpp:41
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:41
Definition: AdaptiveTimeStepping.hpp:45
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:45
Definition: AdaptiveTimeStepping.hpp:44
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:44
Definition: AdaptiveTimeStepping.hpp:42
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:42
Definition: AdaptiveTimeStepping.hpp:51
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:51
Definition: AdaptiveTimeStepping.hpp:52
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:52
Definition: AdaptiveTimeStepping.hpp:37
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:37
Definition: AdaptiveTimeStepping.hpp:49
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:49
Definition: AdaptiveTimeStepping.hpp:48
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:48
Definition: AdaptiveTimeStepping.hpp:39
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:39
Definition: AdaptiveTimeStepping.hpp:40
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:40
Definition: AdaptiveTimeStepping.hpp:38
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:38
Definition: AdaptiveTimeStepping.hpp:50
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:50
Definition: AdaptiveTimeStepping.hpp:34
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:34
Definition: SimulatorReport.hpp:122
Definition: ConvergenceReport.hpp:460