3#ifndef OPM_ADAPTIVE_TIME_STEPPING_HPP
4#define OPM_ADAPTIVE_TIME_STEPPING_HPP
9#include <opm/simulators/flow/rescoup/ReservoirCouplingEnabled.hpp>
10#include <opm/simulators/timestepping/AdaptiveSimulatorTimer.hpp>
11#include <opm/simulators/timestepping/SimulatorReport.hpp>
12#include <opm/simulators/timestepping/SimulatorTimer.hpp>
13#include <opm/simulators/timestepping/TimeStepControl.hpp>
14#include <opm/simulators/timestepping/TimeStepControlInterface.hpp>
16#ifdef RESERVOIR_COUPLING_ENABLED
17#include <opm/simulators/flow/rescoup/ReservoirCoupling.hpp>
18#include <opm/simulators/flow/rescoup/ReservoirCouplingMaster.hpp>
19#include <opm/simulators/flow/rescoup/ReservoirCouplingSlave.hpp>
29namespace Opm::Parameters {
66 consistentlyFailingWells(
const std::vector<StepReport>& sr,
67 bool requireRepeatedFailures);
68 void registerAdaptiveParameters();
70 std::tuple<TimeStepControlType, std::unique_ptr<TimeStepControlInterface>,
bool>
71 createController(
const UnitSystem& unitSystem);
74template<
class TypeTag>
75class AdaptiveTimeStepping
78 using TuningUpdateCallback = std::function<bool(
const double,
const double,
const int)>;
83 template <
class Solver>
87 explicit SolutionTimeErrorSolverWrapper(
const Solver& solver);
91 const Solver& solver_;
95 template <
class Solver>
class SubStepIteration;
97 template <
class Solver>
100 SubStepper(AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping,
104 const TuningUpdateCallback& tuning_updater);
106 AdaptiveTimeStepping<TypeTag>& getAdaptiveTimerStepper();
108 friend class SubStepIteration<Solver>;
111 bool isReservoirCouplingMaster_()
const;
112 bool isReservoirCouplingSlave_()
const;
113 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(
const double originalTimeStep);
114 bool maybeUpdateTuning_(
double elapsed,
double dt,
int sub_step_number)
const;
115 double maxTimeStep_()
const;
117#ifdef RESERVOIR_COUPLING_ENABLED
123 double suggestedNextTimestep_()
const;
125 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
128 const bool is_event_;
129 const TuningUpdateCallback& tuning_updater_;
132 template <
class Solver>
133 class SubStepIteration {
135 SubStepIteration(SubStepper<Solver>& substepper,
137 const double original_time_step,
138 const bool final_step);
143 bool checkContinueOnUnconvergedSolution_(
double dt)
const;
144 void checkTimeStepMaxRestartLimit_(
const int restarts)
const;
145 void checkTimeStepMinLimit_(
const double new_time_step)
const;
146 void chopTimeStep_(
const double new_time_step);
147 bool chopTimeStepOrCloseFailingWells_(
const double new_time_step);
148 boost::posix_time::ptime currentDateTime_()
const;
150 double growthFactor_()
const;
151 bool ignoreConvergenceFailure_()
const;
152 bool isReservoirCouplingMaster_()
const;
153 bool isReservoirCouplingSlave_()
const;
154 void markFirstSubStepAsFinished_()
const;
156 double maybeRestrictTimeStepGrowth_(
const double dt,
158 const int restarts)
const;
159 void maybeUpdateLastSubstepOfSyncTimestep_(
double dt);
160 void maybeUpdateTuningAndTimeStep_();
161 double maxGrowth_()
const;
162 double minTimeStepBeforeClosingWells_()
const;
163 double minTimeStep_()
const;
164 double restartFactor_()
const;
166 int solverRestartMax_()
const;
167 double suggestedNextTimestep_()
const;
168 void setSuggestedNextStep_(
double step);
169 void setTimeStep_(
double dt_estimate);
170 Solver& solver_()
const;
171 bool solverVerbose_()
const;
173 boost::posix_time::ptime startDateTime_()
const;
174#ifdef RESERVOIR_COUPLING_ENABLED
178 double timeStepControlComputeEstimate_(
const double dt,
179 const int iterations,
181 bool timeStepVerbose_()
const;
182 void updateSuggestedNextStep_();
183 bool useNewtonIteration_()
const;
184 double writeOutput_()
const;
186 SubStepper<Solver>& substepper_;
188 const double original_time_step_;
189 const bool final_step_;
190 std::string cause_of_failure_;
191 AdaptiveTimeStepping<TypeTag>& adaptive_time_stepping_;
195 AdaptiveTimeStepping() =
default;
197 AdaptiveTimeStepping(
const UnitSystem& unitSystem,
199 const double max_next_tstep = -1.0,
200 const bool terminalOutput =
true);
202 AdaptiveTimeStepping(
double max_next_tstep,
203 const Tuning& tuning,
204 const UnitSystem& unitSystem,
206 const bool terminalOutput =
true);
208 bool operator==(
const AdaptiveTimeStepping<TypeTag>& rhs)
const;
210 static void registerParameters();
211 void setSuggestedNextStep(
const double x);
212 double suggestedNextStep()
const;
215 template <
class Solver>
219 const TuningUpdateCallback& tuning_updater);
221 void updateTUNING(
double max_next_tstep,
const Tuning& tuning);
222 void updateNEXTSTEP(
double max_next_tstep);
224 template<
class Serializer>
225 void serializeOp(Serializer& serializer);
229 static AdaptiveTimeStepping<TypeTag> serializationTestObjectHardcoded();
230 static AdaptiveTimeStepping<TypeTag> serializationTestObjectPID();
231 static AdaptiveTimeStepping<TypeTag> serializationTestObjectPIDIt();
232 static AdaptiveTimeStepping<TypeTag> serializationTestObjectSimple();
233 static AdaptiveTimeStepping<TypeTag> serializationTestObject3rdOrder();
236 void maybeModifySuggestedTimeStepAtBeginningOfReportStep_(
const double original_time_step,
237 const bool is_event);
239 template<
class Controller>
240 static AdaptiveTimeStepping<TypeTag> serializationTestObject_();
242 template<
class T,
class Serializer>
243 void allocAndSerialize(Serializer& serializer);
246 bool castAndComp(
const AdaptiveTimeStepping<TypeTag>& Rhs)
const;
249 void init_(
const UnitSystem& unitSystem);
251 using TimeStepController = std::unique_ptr<TimeStepControlInterface>;
280#include <opm/simulators/timestepping/AdaptiveTimeStepping_impl.hpp>
Defines a type tags and some fundamental properties all models.
Simulation timer for adaptive time stepping.
Definition AdaptiveSimulatorTimer.hpp:41
double max_growth_
factor that limits the maximum growth of a time step
Definition AdaptiveTimeStepping.hpp:258
double max_time_step_
maximal allowed time step size in days
Definition AdaptiveTimeStepping.hpp:259
bool solver_verbose_
solver verbosity
Definition AdaptiveTimeStepping.hpp:263
int solver_restart_max_
how many restart of solver are allowed
Definition AdaptiveTimeStepping.hpp:262
double timestep_after_event_
suggested size of timestep after an event
Definition AdaptiveTimeStepping.hpp:267
bool ignore_convergence_failure_
continue instead of stop when minimum time step is reached
Definition AdaptiveTimeStepping.hpp:261
double suggested_next_timestep_
suggested size of next timestep
Definition AdaptiveTimeStepping.hpp:265
TimeStepControlType time_step_control_type_
type of time step control object
Definition AdaptiveTimeStepping.hpp:254
bool full_timestep_initially_
beginning with the size of the time step from data file
Definition AdaptiveTimeStepping.hpp:266
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:203
double growth_factor_
factor to multiply time step when solver recovered from failed convergence
Definition AdaptiveTimeStepping.hpp:257
double restart_factor_
factor to multiply time step with when solver fails to converge
Definition AdaptiveTimeStepping.hpp:256
double min_time_step_
minimal allowed time step size before throwing
Definition AdaptiveTimeStepping.hpp:260
TimeStepController time_step_control_
time step control object
Definition AdaptiveTimeStepping.hpp:255
double min_time_step_before_shutting_problematic_wells_
< shut problematic wells when time step size in days are less than this
Definition AdaptiveTimeStepping.hpp:271
bool timestep_verbose_
timestep verbosity
Definition AdaptiveTimeStepping.hpp:264
bool use_newton_iteration_
use newton iteration count for adaptive time step control
Definition AdaptiveTimeStepping.hpp:268
RelativeChangeInterface.
Definition TimeStepControlInterface.hpp:34
virtual double relativeChange() const =0
Definition ReservoirCouplingMaster.hpp:38
Definition ReservoirCouplingSlave.hpp:40
Definition SimulatorTimer.hpp:39
TimeStepControlInterface.
Definition TimeStepControlInterface.hpp:51
This file contains a set of helper functions used by VFPProd / VFPInj.
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
The Opm property system, traits with inheritance.
Definition AdaptiveTimeStepping.hpp:36
Definition AdaptiveTimeStepping.hpp:35
Definition AdaptiveTimeStepping.hpp:47
Definition AdaptiveTimeStepping.hpp:46
Definition AdaptiveTimeStepping.hpp:31
Definition AdaptiveTimeStepping.hpp:32
Definition AdaptiveTimeStepping.hpp:33
Definition AdaptiveTimeStepping.hpp:43
Definition AdaptiveTimeStepping.hpp:41
Definition AdaptiveTimeStepping.hpp:45
Definition AdaptiveTimeStepping.hpp:44
Definition AdaptiveTimeStepping.hpp:42
Definition AdaptiveTimeStepping.hpp:51
Definition AdaptiveTimeStepping.hpp:52
Definition AdaptiveTimeStepping.hpp:49
Definition AdaptiveTimeStepping.hpp:48
Definition AdaptiveTimeStepping.hpp:39
Definition AdaptiveTimeStepping.hpp:40
Definition AdaptiveTimeStepping.hpp:50
Definition AdaptiveTimeStepping.hpp:38
Definition AdaptiveTimeStepping.hpp:37
Definition AdaptiveTimeStepping.hpp:34
A struct for returning timing data from a simulator to its caller.
Definition SimulatorReport.hpp:34
Definition SimulatorReport.hpp:122
Definition ConvergenceReport.hpp:460