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
14
15#if HAVE_MPI
16#define RESERVOIR_COUPLING_ENABLED
17#endif
18#ifdef RESERVOIR_COUPLING_ENABLED
22#endif
23
24#include <functional>
25#include <memory>
26#include <set>
27#include <string>
28#include <tuple>
29#include <vector>
30
31namespace Opm::Parameters {
32
33struct SolverContinueOnConvergenceFailure { static constexpr bool value = false; };
34struct SolverMaxRestarts { static constexpr int value = 10; };
35struct SolverVerbosity { static constexpr int value = 1; };
36struct TimeStepVerbosity { static constexpr int value = 1; };
37struct InitialTimeStepInDays { static constexpr double value = 1.0; };
38struct FullTimeStepInitially { static constexpr bool value = false; };
39struct TimeStepControl { static constexpr auto value = "pid+newtoniteration"; };
40struct TimeStepControlTolerance { static constexpr double value = 1e-1; };
41struct TimeStepControlTargetIterations { static constexpr int value = 30; };
42struct TimeStepControlTargetNewtonIterations { static constexpr int value = 8; };
43struct TimeStepControlDecayRate { static constexpr double value = 0.75; };
44struct TimeStepControlGrowthRate { static constexpr double value = 1.25; };
45struct TimeStepControlDecayDampingFactor { static constexpr double value = 1.0; };
46struct TimeStepControlGrowthDampingFactor { static constexpr double value = 3.2; };
47struct TimeStepControlFileName { static constexpr auto value = "timesteps"; };
48struct MinTimeStepBeforeShuttingProblematicWellsInDays { static constexpr double value = 0.01; };
49struct MinTimeStepBasedOnNewtonIterations { static constexpr double value = 0.0; };
50struct TimeStepControlSafetyFactor { static constexpr double value = 0.8; };
51struct TimeStepControlRejectCompletedStep { static constexpr bool value = false; };
52struct TimeStepControlToleranceTestVersion { static constexpr auto value = "standard"; };
53struct TimeStepControlMaxReductionTimeStep { static constexpr double value = 0.1; };
54struct TimeStepControlParameters { static constexpr auto value = "0.125;0.25;0.125;0.75;0.25"; };
55
56} // namespace Opm::Parameters
57
58namespace Opm {
59
60struct Tuning;
61class UnitSystem;
62struct StepReport;
63
64namespace detail {
65 void logTimer(const AdaptiveSimulatorTimer& substep_timer);
66
67 std::set<std::string>
68 consistentlyFailingWells(const std::vector<StepReport>& sr,
69 bool requireRepeatedFailures);
71
72 std::tuple<TimeStepControlType, std::unique_ptr<TimeStepControlInterface>, bool>
73 createController(const UnitSystem& unitSystem);
74}
75
76template<class TypeTag>
78{
79public:
80 using TuningUpdateCallback = std::function<bool(const double, const double, const int)>;
81
82private:
84
85 template <class Solver>
86 class SolutionTimeErrorSolverWrapper : public RelativeChangeInterface
87 {
88 public:
89 explicit SolutionTimeErrorSolverWrapper(const Solver& solver);
90 double relativeChange() const;
91
92 private:
93 const Solver& solver_;
94 };
95
96 // Forward declaration of SubStepIteration
97 template <class Solver> class SubStepIteration;
98
99 template <class Solver>
100 class SubStepper {
101 public:
102 SubStepper(AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping,
103 const SimulatorTimer& simulator_timer,
104 Solver& solver,
105 const bool is_event,
106 const TuningUpdateCallback& tuning_updater);
107
108 AdaptiveTimeStepping<TypeTag>& getAdaptiveTimerStepper();
109 SimulatorReport run();
110 friend class SubStepIteration<Solver>;
111
112 private:
113 bool isReservoirCouplingMaster_() const;
114 bool isReservoirCouplingSlave_() const;
115 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(const double originalTimeStep);
116 bool maybeUpdateTuning_(double elapsed, double dt, int sub_step_number) const;
117 double maxTimeStep_() const;
118 SimulatorReport runStepOriginal_();
119#ifdef RESERVOIR_COUPLING_ENABLED
120 ReservoirCouplingMaster& reservoirCouplingMaster_();
121 ReservoirCouplingSlave& reservoirCouplingSlave_();
122 SimulatorReport runStepReservoirCouplingMaster_();
123 SimulatorReport runStepReservoirCouplingSlave_();
124#endif
125 double suggestedNextTimestep_() const;
126
127 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
128 const SimulatorTimer& simulator_timer_;
129 Solver& solver_;
130 const bool is_event_;
131 const TuningUpdateCallback& tuning_updater_;
132 };
133
134 template <class Solver>
135 class SubStepIteration {
136 public:
137 SubStepIteration(SubStepper<Solver>& substepper,
138 AdaptiveSimulatorTimer& substep_timer,
139 const double original_time_step,
140 const bool final_step);
141
142 SimulatorReport run();
143
144 private:
145 bool checkContinueOnUnconvergedSolution_(double dt) const;
146 void checkTimeStepMaxRestartLimit_(const int restarts) const;
147 void checkTimeStepMinLimit_(const double new_time_step) const;
148 void chopTimeStep_(const double new_time_step);
149 bool chopTimeStepOrCloseFailingWells_(const double new_time_step);
150 boost::posix_time::ptime currentDateTime_() const;
151 int getNumIterations_(const SimulatorReportSingle& substep_report) const;
152 double growthFactor_() const;
153 bool ignoreConvergenceFailure_() const;
154 void maybeReportSubStep_(SimulatorReportSingle substep_report) const;
155 double maybeRestrictTimeStepGrowth_(const double dt,
156 double dt_estimate,
157 const int restarts) const;
158 void maybeUpdateTuningAndTimeStep_();
159 double maxGrowth_() const;
160 double minTimeStepBeforeClosingWells_() const;
161 double minTimeStep_() const;
162 double restartFactor_() const;
163 SimulatorReportSingle runSubStep_();
164 int solverRestartMax_() const;
165 double suggestedNextTimestep_() const;
166 void setSuggestedNextStep_(double step);
167 void setTimeStep_(double dt_estimate);
168 Solver& solver_() const;
169 bool solverVerbose_() const;
170 const SimulatorTimer& simulatorTimer_() const;
171 boost::posix_time::ptime startDateTime_() const;
172 double timeStepControlComputeEstimate_(const double dt,
173 const int iterations,
174 const AdaptiveSimulatorTimer& substepTimer) const;
175 bool timeStepVerbose_() const;
176 void updateSuggestedNextStep_();
177 bool useNewtonIteration_() const;
178 double writeOutput_() const;
179
180 SubStepper<Solver>& substepper_;
181 AdaptiveSimulatorTimer& substep_timer_;
182 const double original_time_step_;
183 const bool final_step_;
184 std::string cause_of_failure_;
185 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
186 };
187
188public:
190
191 AdaptiveTimeStepping(const UnitSystem& unitSystem,
192 const SimulatorReport& full_report,
193 const double max_next_tstep = -1.0,
194 const bool terminalOutput = true);
195
196 AdaptiveTimeStepping(double max_next_tstep,
197 const Tuning& tuning,
198 const UnitSystem& unitSystem,
199 const SimulatorReport& full_report,
200 const bool terminalOutput = true);
201
203
204 static void registerParameters();
205 void setSuggestedNextStep(const double x);
206 double suggestedNextStep() const;
208
209 template <class Solver>
210 SimulatorReport step(const SimulatorTimer& simulator_timer,
211 Solver& solver,
212 const bool is_event,
213 const TuningUpdateCallback& tuning_updater);
214
215 void updateTUNING(double max_next_tstep, const Tuning& tuning);
216 void updateNEXTSTEP(double max_next_tstep);
217
218 template<class Serializer>
219 void serializeOp(Serializer& serializer);
220
222
228
229private:
230 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(const double original_time_step,
231 const bool is_event);
232
233 template<class Controller>
234 static AdaptiveTimeStepping<TypeTag> serializationTestObject_();
235
236 template<class T, class Serializer>
237 void allocAndSerialize(Serializer& serializer);
238
239 template<class T>
240 bool castAndComp(const AdaptiveTimeStepping<TypeTag>& Rhs) const;
241
242protected:
243 void init_(const UnitSystem& unitSystem);
244
245 using TimeStepController = std::unique_ptr<TimeStepControlInterface>;
246
251 double growth_factor_{};
252 double max_growth_{};
253 double max_time_step_{};
254 double min_time_step_{};
257 bool solver_verbose_{false};
258 bool timestep_verbose_{false};
263
266 // We store a copy of the full simulator run report for output purposes,
267 // so it can be updated and passed to the summary writing code every
268 // substep (not just every report step).
270};
271
272} // namespace Opm
273
275
276#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:41
Definition: AdaptiveTimeStepping.hpp:78
double max_growth_
factor that limits the maximum growth of a time step
Definition: AdaptiveTimeStepping.hpp:252
double max_time_step_
maximal allowed time step size in days
Definition: AdaptiveTimeStepping.hpp:253
bool solver_verbose_
solver verbosity
Definition: AdaptiveTimeStepping.hpp:257
int solver_restart_max_
how many restart of solver are allowed
Definition: AdaptiveTimeStepping.hpp:256
double timestep_after_event_
suggested size of timestep after an event
Definition: AdaptiveTimeStepping.hpp:261
void init_(const UnitSystem &unitSystem)
Definition: AdaptiveTimeStepping_impl.hpp:427
void setSuggestedNextStep(const double x)
Definition: AdaptiveTimeStepping_impl.hpp:298
double suggestedNextStep() const
Definition: AdaptiveTimeStepping_impl.hpp:306
SimulatorReport report_
Definition: AdaptiveTimeStepping.hpp:269
std::function< bool(const double, const double, const int)> TuningUpdateCallback
Definition: AdaptiveTimeStepping.hpp:80
static AdaptiveTimeStepping< TypeTag > serializationTestObjectSimple()
Definition: AdaptiveTimeStepping_impl.hpp:281
bool ignore_convergence_failure_
continue instead of stop when minimum time step is reached
Definition: AdaptiveTimeStepping.hpp:255
void serializeOp(Serializer &serializer)
Definition: AdaptiveTimeStepping_impl.hpp:210
void updateTUNING(double max_next_tstep, const Tuning &tuning)
Definition: AdaptiveTimeStepping_impl.hpp:335
double suggested_next_timestep_
suggested size of next timestep
Definition: AdaptiveTimeStepping.hpp:259
TimeStepControlType time_step_control_type_
type of time step control object
Definition: AdaptiveTimeStepping.hpp:248
std::unique_ptr< TimeStepControlInterface > TimeStepController
Definition: AdaptiveTimeStepping.hpp:245
const TimeStepControlInterface & timeStepControl() const
Definition: AdaptiveTimeStepping_impl.hpp:314
bool full_timestep_initially_
beginning with the size of the time step from data file
Definition: AdaptiveTimeStepping.hpp:260
bool operator==(const AdaptiveTimeStepping< TypeTag > &rhs)
Definition: AdaptiveTimeStepping_impl.hpp:134
SimulatorReport step(const SimulatorTimer &simulator_timer, Solver &solver, const bool is_event, const TuningUpdateCallback &tuning_updater)
step method that acts like the solver::step method in a sub cycle of time steps
Definition: AdaptiveTimeStepping_impl.hpp:195
double growth_factor_
factor to multiply time step when solver recovered from failed convergence
Definition: AdaptiveTimeStepping.hpp:251
double restart_factor_
factor to multiply time step with when solver fails to converge
Definition: AdaptiveTimeStepping.hpp:250
double min_time_step_
minimal allowed time step size before throwing
Definition: AdaptiveTimeStepping.hpp:254
void updateNEXTSTEP(double max_next_tstep)
Definition: AdaptiveTimeStepping_impl.hpp:323
static AdaptiveTimeStepping< TypeTag > serializationTestObjectHardcoded()
Definition: AdaptiveTimeStepping_impl.hpp:257
TimeStepController time_step_control_
time step control object
Definition: AdaptiveTimeStepping.hpp:249
static AdaptiveTimeStepping< TypeTag > serializationTestObjectPIDIt()
Definition: AdaptiveTimeStepping_impl.hpp:273
double min_time_step_before_shutting_problematic_wells_
< shut problematic wells when time step size in days are less than this
Definition: AdaptiveTimeStepping.hpp:265
static AdaptiveTimeStepping< TypeTag > serializationTestObject3rdOrder()
Definition: AdaptiveTimeStepping_impl.hpp:289
SimulatorReport & report()
Definition: AdaptiveTimeStepping_impl.hpp:249
static AdaptiveTimeStepping< TypeTag > serializationTestObjectPID()
Definition: AdaptiveTimeStepping_impl.hpp:265
bool timestep_verbose_
timestep verbosity
Definition: AdaptiveTimeStepping.hpp:258
static void registerParameters()
Definition: AdaptiveTimeStepping_impl.hpp:180
bool use_newton_iteration_
use newton iteration count for adaptive time step control
Definition: AdaptiveTimeStepping.hpp:262
Definition: TimeStepControlInterface.hpp:34
Definition: ReservoirCouplingMaster.hpp:35
Definition: ReservoirCouplingSlave.hpp:35
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: blackoilboundaryratevector.hh:39
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:38
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:38
Definition: AdaptiveTimeStepping.hpp:37
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:37
Definition: AdaptiveTimeStepping.hpp:49
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:49
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:48
Definition: AdaptiveTimeStepping.hpp:33
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:33
Definition: AdaptiveTimeStepping.hpp:34
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:34
Definition: AdaptiveTimeStepping.hpp:35
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:35
Definition: AdaptiveTimeStepping.hpp:45
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:45
Definition: AdaptiveTimeStepping.hpp:43
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:43
Definition: AdaptiveTimeStepping.hpp:47
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:47
Definition: AdaptiveTimeStepping.hpp:46
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:46
Definition: AdaptiveTimeStepping.hpp:44
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:44
Definition: AdaptiveTimeStepping.hpp:53
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:53
Definition: AdaptiveTimeStepping.hpp:54
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:54
Definition: AdaptiveTimeStepping.hpp:39
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:39
Definition: AdaptiveTimeStepping.hpp:51
static constexpr bool value
Definition: AdaptiveTimeStepping.hpp:51
Definition: AdaptiveTimeStepping.hpp:50
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:50
Definition: AdaptiveTimeStepping.hpp:41
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:41
Definition: AdaptiveTimeStepping.hpp:42
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:42
Definition: AdaptiveTimeStepping.hpp:40
static constexpr double value
Definition: AdaptiveTimeStepping.hpp:40
Definition: AdaptiveTimeStepping.hpp:52
static constexpr auto value
Definition: AdaptiveTimeStepping.hpp:52
Definition: AdaptiveTimeStepping.hpp:36
static constexpr int value
Definition: AdaptiveTimeStepping.hpp:36
Definition: SimulatorReport.hpp:122
Definition: ConvergenceReport.hpp:447