20#ifndef OPM_ADAPTIVE_TIME_STEPPING_IMPL_HPP
21#define OPM_ADAPTIVE_TIME_STEPPING_IMPL_HPP
24#ifndef OPM_ADAPTIVE_TIME_STEPPING_HPP
26#include <opm/simulators/timestepping/AdaptiveTimeStepping.hpp>
27#include <opm/simulators/timestepping/AdaptiveSimulatorTimer.hpp>
30#include <opm/common/Exceptions.hpp>
31#include <opm/common/ErrorMacros.hpp>
33#include <opm/grid/utility/StopWatch.hpp>
35#include <opm/input/eclipse/Units/Units.hpp>
36#include <opm/input/eclipse/Units/UnitSystem.hpp>
40#include <opm/simulators/timestepping/EclTimeSteppingParams.hpp>
48#include <boost/date_time/posix_time/posix_time.hpp>
49#include <fmt/format.h>
50#include <fmt/ranges.h>
59template<
class TypeTag>
66 : time_step_control_{}
67 , restart_factor_{Parameters::Get<Parameters::SolverRestartFactor<Scalar>>()}
68 , growth_factor_{Parameters::Get<Parameters::SolverGrowthFactor<Scalar>>()}
69 , max_growth_{Parameters::Get<Parameters::SolverMaxGrowth<Scalar>>()}
71 Parameters::Get<Parameters::SolverMaxTimeStepInDays<Scalar>>() * 24 * 60 * 60}
74 Parameters::Get<Parameters::SolverMinTimeStep<Scalar>>())}
75 , ignore_convergence_failure_{
76 Parameters::Get<Parameters::SolverContinueOnConvergenceFailure>()}
77 , solver_restart_max_{Parameters::Get<Parameters::SolverMaxRestarts>()}
78 , solver_verbose_{Parameters::Get<Parameters::SolverVerbosity>() > 0 &&
terminal_output}
79 , timestep_verbose_{Parameters::Get<Parameters::TimeStepVerbosity>() > 0 &&
terminal_output}
80 , suggested_next_timestep_{
81 (
max_next_tstep <= 0 ? Parameters::Get<Parameters::InitialTimeStepInDays>()
83 , full_timestep_initially_{Parameters::Get<Parameters::FullTimeStepInitially>()}
84 , timestep_after_event_{
85 Parameters::Get<Parameters::TimeStepAfterEventInDays<Scalar>>() * 24 * 60 * 60}
86 , use_newton_iteration_{
false}
87 , min_time_step_before_shutting_problematic_wells_{
88 Parameters::Get<Parameters::MinTimeStepBeforeShuttingProblematicWellsInDays>() *
unit::
day}
96template<
class TypeTag>
103 : time_step_control_{}
109 , ignore_convergence_failure_{
true}
110 , solver_restart_max_{Parameters::Get<Parameters::SolverMaxRestarts>()}
111 , solver_verbose_{Parameters::Get<Parameters::SolverVerbosity>() > 0 &&
terminal_output}
112 , timestep_verbose_{Parameters::Get<Parameters::TimeStepVerbosity>() > 0 &&
terminal_output}
113 , suggested_next_timestep_{
114 max_next_tstep <= 0 ? Parameters::Get<Parameters::InitialTimeStepInDays>() * 24 * 60 * 60
116 , full_timestep_initially_{Parameters::Get<Parameters::FullTimeStepInitially>()}
118 , use_newton_iteration_{
false}
119 , min_time_step_before_shutting_problematic_wells_{
120 Parameters::Get<Parameters::MinTimeStepBeforeShuttingProblematicWellsInDays>() *
unit::
day}
126template<
class TypeTag>
138 switch (this->time_step_control_type_) {
139 case TimeStepControlType::HardCodedTimeStep:
142 case TimeStepControlType::PIDAndIterationCount:
145 case TimeStepControlType::SimpleIterationCount:
148 case TimeStepControlType::PID:
151 case TimeStepControlType::General3rdOrder:
168 this->min_time_step_before_shutting_problematic_wells_ ==
172template<
class TypeTag>
174AdaptiveTimeStepping<TypeTag>::
178 detail::registerAdaptiveParameters();
181#ifdef RESERVOIR_COUPLING_ENABLED
182template<
class TypeTag>
184AdaptiveTimeStepping<TypeTag>::
190template<
class TypeTag>
192AdaptiveTimeStepping<TypeTag>::
204template<
class TypeTag>
205template <
class Solver>
211 const std::function<
bool(
const double ,
223template<
class TypeTag>
224template<
class Serializer>
230 switch (this->time_step_control_type_) {
231 case TimeStepControlType::HardCodedTimeStep:
234 case TimeStepControlType::PIDAndIterationCount:
237 case TimeStepControlType::SimpleIterationCount:
240 case TimeStepControlType::PID:
243 case TimeStepControlType::General3rdOrder:
252 serializer(this->ignore_convergence_failure_);
260 serializer(this->min_time_step_before_shutting_problematic_wells_);
263template<
class TypeTag>
265AdaptiveTimeStepping<TypeTag>::
271template<
class TypeTag>
273AdaptiveTimeStepping<TypeTag>::
274serializationTestObjectHardcoded()
279template<
class TypeTag>
281AdaptiveTimeStepping<TypeTag>::
282serializationTestObjectPID()
287template<
class TypeTag>
289AdaptiveTimeStepping<TypeTag>::
290serializationTestObjectPIDIt()
295template<
class TypeTag>
297AdaptiveTimeStepping<TypeTag>::
298serializationTestObjectSimple()
303template<
class TypeTag>
305AdaptiveTimeStepping<TypeTag>::
306serializationTestObject3rdOrder()
312template<
class TypeTag>
314AdaptiveTimeStepping<TypeTag>::
315setSuggestedNextStep(
const double x)
317 this->suggested_next_timestep_ = x;
320template<
class TypeTag>
322AdaptiveTimeStepping<TypeTag>::
323suggestedNextStep()
const
325 return this->suggested_next_timestep_;
329template<
class TypeTag>
331AdaptiveTimeStepping<TypeTag>::
341template<
class TypeTag>
343AdaptiveTimeStepping<TypeTag>::
346 this->restart_factor_ =
tuning.TSFCNV;
347 this->growth_factor_ =
tuning.TFDIFF;
348 this->max_growth_ =
tuning.TSFMAX;
349 this->max_time_step_ =
tuning.TSMAXZ;
351 this->timestep_after_event_ =
tuning.TMAXWC;
358template<
class TypeTag>
359template<
class T,
class Serializer>
361AdaptiveTimeStepping<TypeTag>::
365 this->time_step_control_ = std::make_unique<T>();
367 serializer(*
static_cast<T*
>(this->time_step_control_.get()));
370template<
class TypeTag>
373AdaptiveTimeStepping<TypeTag>::
376 const T* lhs =
static_cast<const T*
>(this->time_step_control_.get());
377 const T* rhs =
static_cast<const T*
>(
Rhs.time_step_control_.get());
381template<
class TypeTag>
383AdaptiveTimeStepping<TypeTag>::
388 if (this->suggested_next_timestep_ < 0) {
392 if (this->full_timestep_initially_) {
397 if (
is_event && this->timestep_after_event_ > 0) {
398 this->suggested_next_timestep_ = this->timestep_after_event_;
402template<
class TypeTag>
403template<
class Controller>
405AdaptiveTimeStepping<TypeTag>::
406serializationTestObject_()
411 result.growth_factor_ = 2.0;
413 result.max_time_step_ = 4.0;
414 result.min_time_step_ = 5.0;
415 result.ignore_convergence_failure_ =
true;
416 result.solver_restart_max_ = 6;
417 result.solver_verbose_ =
true;
418 result.timestep_verbose_ =
true;
419 result.suggested_next_timestep_ = 7.0;
420 result.full_timestep_initially_ =
true;
421 result.use_newton_iteration_ =
true;
422 result.min_time_step_before_shutting_problematic_wells_ = 9.0;
423 result.time_step_control_type_ = Controller::Type;
424 result.time_step_control_ =
425 std::make_unique<Controller>(Controller::serializationTestObject());
434template<
class TypeTag>
435void AdaptiveTimeStepping<TypeTag>::
438 std::tie(time_step_control_type_,
440 use_newton_iteration_) = detail::createController(
unitSystem);
442 if (this->growth_factor_ < 1.0) {
444 "Growth factor cannot be less than 1.");
454template<
class TypeTag>
455template<
class Solver>
456AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
462 const std::function<
bool(
const double ,
476template<
class TypeTag>
477template<
class Solver>
479AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
480getAdaptiveTimerStepper()
482 return adaptive_time_stepping_;
485template<
class TypeTag>
486template<
class Solver>
488AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
491#ifdef RESERVOIR_COUPLING_ENABLED
499 return runStepOriginal_();
502 return runStepOriginal_();
511template<
class TypeTag>
512template<
class Solver>
514AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
515isReservoirCouplingMaster_()
const
517 return this->adaptive_time_stepping_.reservoir_coupling_master_ !=
nullptr;
520template<
class TypeTag>
521template<
class Solver>
523AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
524isReservoirCouplingSlave_()
const
526 return this->adaptive_time_stepping_.reservoir_coupling_slave_ !=
nullptr;
529template<
class TypeTag>
530template<
class Solver>
532AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
535 this->adaptive_time_stepping_.maybeModifySuggestedTimeStepAtBeginningOfReportStep_(
543template<
class TypeTag>
544template<
class Solver>
546AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
552template<
class TypeTag>
553template<
class Solver>
555AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
558 return this->adaptive_time_stepping_.max_time_step_;
561template <
class TypeTag>
562template <
class Solver>
564AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
567 auto elapsed = this->simulator_timer_.simulationTimeElapsed();
569 auto report_step = this->simulator_timer_.reportStepNum();
574 this->simulator_timer_.startDateTime(),
577 suggestedNextTimestep_(),
585#ifdef RESERVOIR_COUPLING_ENABLED
586template <
class TypeTag>
587template <
class Solver>
588ReservoirCouplingMaster&
589AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
590reservoirCouplingMaster_()
592 return *adaptive_time_stepping_.reservoir_coupling_master_;
596#ifdef RESERVOIR_COUPLING_ENABLED
597template <
class TypeTag>
598template <
class Solver>
599ReservoirCouplingSlave&
600AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
601reservoirCouplingSlave_()
603 return *this->adaptive_time_stepping_.reservoir_coupling_slave_;
607#ifdef RESERVOIR_COUPLING_ENABLED
638template <
class TypeTag>
639template <
class Solver>
641AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
642runStepReservoirCouplingMaster_()
647 double current_time{this->simulator_timer_.simulationTimeElapsed()};
650 SimulatorReport report;
663 this->simulator_timer_.startDateTime(),
666 suggestedNextTimestep_(),
667 this->simulator_timer_.reportStepNum(),
686#ifdef RESERVOIR_COUPLING_ENABLED
687template <
class TypeTag>
688template <
class Solver>
690AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
691runStepReservoirCouplingSlave_()
696 double current_time{this->simulator_timer_.simulationTimeElapsed()};
698 SimulatorReport report;
704 maybeModifySuggestedTimeStepAtBeginningOfReportStep_(
timestep);
707 this->simulator_timer_.startDateTime(),
710 suggestedNextTimestep_(),
711 this->simulator_timer_.reportStepNum(),
732template <
class TypeTag>
733template <
class Solver>
735AdaptiveTimeStepping<TypeTag>::SubStepper<Solver>::
736suggestedNextTimestep_()
const
738 return this->adaptive_time_stepping_.suggestedNextStep();
747template<
class TypeTag>
748template<
class Solver>
749AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
760 , adaptive_time_stepping_{
substepper.getAdaptiveTimerStepper()}
764template <
class TypeTag>
765template <
class Solver>
767AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
770 auto& simulator = solver_().model().simulator();
771 auto& problem = simulator.problem();
774 SimulatorReport report;
777 while (!this->substep_timer_.done()) {
781 maybeUpdateTuningAndTimeStep_();
783 const double dt = this->substep_timer_.currentStepLength();
784 if (timeStepVerbose_()) {
785 detail::logTimer(this->substep_timer_);
792 auto&
full_report = adaptive_time_stepping_.report();
799 ++this->substep_timer_;
802 auto dt_estimate = timeStepControlComputeEstimate_(
803 dt, iterations, this->substep_timer_);
810 if (this->final_step_ && this->substep_timer_.done()) {
815 report.success.output_write_time += writeOutput_();
821 report.success.converged = this->substep_timer_.done();
822 this->substep_timer_.setLastStepFailed(
false);
825 this->substep_timer_.setLastStepFailed(
true);
826 checkTimeStepMaxRestartLimit_(
restarts);
843 problem.setNextTimeStepSize(this->substep_timer_.currentStepLength());
845 updateSuggestedNextStep_();
855template<
class TypeTag>
856template<
class Solver>
858AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
859checkContinueOnUnconvergedSolution_(
double dt)
const
864 const auto msg = fmt::format(
865 "Solver failed to converge but timestep {} is smaller or equal to {}\n"
866 "which is the minimum threshold given by option --solver-min-time-step\n",
869 OpmLog::problem(
msg);
874template<
class TypeTag>
875template<
class Solver>
877AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
878checkTimeStepMaxRestartLimit_(
const int restarts)
const
882 if (
restarts >= solverRestartMax_()) {
883 const auto msg = fmt::format(
884 "Solver failed to converge after cutting timestep {} times.",
restarts
886 if (solverVerbose_()) {
894template<
class TypeTag>
895template<
class Solver>
897AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
903 const auto msg = fmt::format(
904 "Solver failed to converge after cutting timestep to {}\n"
905 "which is the minimum threshold given by option --solver-min-time-step\n",
908 if (solverVerbose_()) {
916template<
class TypeTag>
917template<
class Solver>
919AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
923 if (solverVerbose_()) {
924 const auto msg = fmt::format(
"{}\nTimestep chopped to {} days\n",
925 this->cause_of_failure_,
926 unit::convert::to(this->substep_timer_.currentStepLength(), unit::day));
927 OpmLog::problem(
msg);
931template<
class TypeTag>
932template<
class Solver>
934AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
954 bool was_shut = solver_().model().wellModel().forceShutWellByName(
955 well, this->substep_timer_.simulationTimeElapsed(),
true);
963 bool was_shut = solver_().model().wellModel().forceShutWellByName(
964 well, this->substep_timer_.simulationTimeElapsed(),
false);
975 if (solverVerbose_()) {
976 const std::string
msg =
977 fmt::format(
"\nProblematic well(s) were shut: {}"
978 "(retrying timestep)\n",
980 OpmLog::problem(
msg);
987template<
class TypeTag>
988template<
class Solver>
989boost::posix_time::ptime
990AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
991currentDateTime_()
const
993 return simulatorTimer_().currentDateTime();
996template<
class TypeTag>
997template<
class Solver>
999AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1000getNumIterations_(
const SimulatorReportSingle &
substep_report)
const
1002 if (useNewtonIteration_()) {
1010template<
class TypeTag>
1011template<
class Solver>
1013AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1014growthFactor_()
const
1016 return this->adaptive_time_stepping_.growth_factor_;
1019template<
class TypeTag>
1020template<
class Solver>
1022AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1023ignoreConvergenceFailure_()
const
1025 return adaptive_time_stepping_.ignore_convergence_failure_;
1028template<
class TypeTag>
1029template<
class Solver>
1031AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1034 return this->adaptive_time_stepping_.max_growth_;
1037template<
class TypeTag>
1038template<
class Solver>
1040AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1043 if (timeStepVerbose_()) {
1044 std::ostringstream
ss;
1046 OpmLog::info(
ss.str());
1050template<
class TypeTag>
1051template<
class Solver>
1053AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1070template<
class TypeTag>
1071template<
class Solver>
1073AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1074maybeUpdateTuningAndTimeStep_()
1082 auto old_value = suggestedNextTimestep_();
1083 if (this->substepper_.maybeUpdateTuning_(
this->substep_timer_.simulationTimeElapsed(),
1084 this->substep_timer_.currentStepLength(),
1085 this->substep_timer_.currentStepNum()))
1092 setTimeStep_(suggestedNextTimestep_());
1097template<
class TypeTag>
1098template<
class Solver>
1100AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1101minTimeStepBeforeClosingWells_()
const
1103 return this->adaptive_time_stepping_.min_time_step_before_shutting_problematic_wells_;
1106template<
class TypeTag>
1107template<
class Solver>
1109AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1112 return this->adaptive_time_stepping_.min_time_step_;
1115template<
class TypeTag>
1116template<
class Solver>
1118AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1119restartFactor_()
const
1121 return this->adaptive_time_stepping_.restart_factor_;
1124template<
class TypeTag>
1125template<
class Solver>
1126SimulatorReportSingle
1127AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1138 std::string message;
1139 message =
"Caught Exception: ";
1140 message +=
e.what();
1141 OpmLog::debug(message);
1147 if (solverVerbose_()) {
1149 OpmLog::debug(
"Overall linear iterations used: "
1154 handleFailure(
"Solver convergence failure - Iteration limit reached",
e);
1156 catch (
const ConvergenceMonitorFailure&
e) {
1163 handleFailure(
"Solver convergence failure - Numerical problem encountered",
e);
1165 catch (
const std::runtime_error&
e) {
1168 catch (
const Dune::ISTLError&
e) {
1171 catch (
const Dune::MatrixBlockError&
e) {
1178template<
class TypeTag>
1179template<
class Solver>
1181AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1184 this->substep_timer_.provideTimeStepEstimate(
dt_estimate);
1187template<
class TypeTag>
1188template<
class Solver>
1190AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1193 return this->substepper_.solver_;
1197template<
class TypeTag>
1198template<
class Solver>
1200AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1201solverRestartMax_()
const
1203 return this->adaptive_time_stepping_.solver_restart_max_;
1206template<
class TypeTag>
1207template<
class Solver>
1209AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1210setSuggestedNextStep_(
double step)
1212 this->adaptive_time_stepping_.setSuggestedNextStep(step);
1215template <
class TypeTag>
1216template <
class Solver>
1217const SimulatorTimer&
1218AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1219simulatorTimer_()
const
1221 return this->substepper_.simulator_timer_;
1224template <
class TypeTag>
1225template <
class Solver>
1227AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1228solverVerbose_()
const
1230 return this->adaptive_time_stepping_.solver_verbose_;
1233template<
class TypeTag>
1234template<
class Solver>
1235boost::posix_time::ptime
1236AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1237startDateTime_()
const
1239 return simulatorTimer_().startDateTime();
1242template <
class TypeTag>
1243template <
class Solver>
1245AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1246suggestedNextTimestep_()
const
1248 return this->adaptive_time_stepping_.suggestedNextStep();
1251template <
class TypeTag>
1252template <
class Solver>
1254AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1255timeStepControlComputeEstimate_(
const double dt,
const int iterations, AdaptiveSimulatorTimer&
substepTimer)
const
1259 return this->adaptive_time_stepping_.time_step_control_->computeTimeStepSize(
1263template <
class TypeTag>
1264template <
class Solver>
1266AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1267timeStepVerbose_()
const
1269 return this->adaptive_time_stepping_.timestep_verbose_;
1279template <
class TypeTag>
1280template <
class Solver>
1282AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1283updateSuggestedNextStep_()
1289 if (timeStepVerbose_()) {
1290 std::ostringstream
ss;
1291 this->substep_timer_.report(
ss);
1292 ss <<
"Suggested next step size = "
1294 OpmLog::debug(
ss.str());
1299template <
class TypeTag>
1300template <
class Solver>
1302AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1303useNewtonIteration_()
const
1305 return this->adaptive_time_stepping_.use_newton_iteration_;
1308template <
class TypeTag>
1309template <
class Solver>
1311AdaptiveTimeStepping<TypeTag>::SubStepIteration<Solver>::
1316 auto& problem = solver_().model().simulator().problem();
1317 problem.writeOutput(
true);
1325template<
class TypeTag>
1326template<
class Solver>
1327AdaptiveTimeStepping<TypeTag>::SolutionTimeErrorSolverWrapper<Solver>::SolutionTimeErrorSolverWrapper(
1328 const Solver& solver
1333template<
class TypeTag>
1334template<
class Solver>
1335double AdaptiveTimeStepping<TypeTag>::SolutionTimeErrorSolverWrapper<Solver>::relativeChange()
const
1338 return solver_.model().relativeChange();
Definition AdaptiveTimeStepping.hpp:81
double max_growth_
factor that limits the maximum growth of a time step
Definition AdaptiveTimeStepping.hpp:261
double max_time_step_
maximal allowed time step size in days
Definition AdaptiveTimeStepping.hpp:262
bool solver_verbose_
solver verbosity
Definition AdaptiveTimeStepping.hpp:266
int solver_restart_max_
how many restart of solver are allowed
Definition AdaptiveTimeStepping.hpp:265
double timestep_after_event_
suggested size of timestep after an event
Definition AdaptiveTimeStepping.hpp:270
bool ignore_convergence_failure_
continue instead of stop when minimum time step is reached
Definition AdaptiveTimeStepping.hpp:264
TimeStepControlType time_step_control_type_
type of time step control object
Definition AdaptiveTimeStepping.hpp:257
SimulatorReport step(const SimulatorTimer &simulator_timer, Solver &solver, const bool is_event, const std::function< bool(const double, const double, const int)> tuning_updater)
step method that acts like the solver::step method in a sub cycle of time steps
Definition AdaptiveTimeStepping_impl.hpp:208
bool full_timestep_initially_
beginning with the size of the time step from data file
Definition AdaptiveTimeStepping.hpp:269
double growth_factor_
factor to multiply time step when solver recovered from failed convergence
Definition AdaptiveTimeStepping.hpp:260
double restart_factor_
factor to multiply time step with when solver fails to converge
Definition AdaptiveTimeStepping.hpp:259
double min_time_step_
minimal allowed time step size before throwing
Definition AdaptiveTimeStepping.hpp:263
TimeStepController time_step_control_
time step control object
Definition AdaptiveTimeStepping.hpp:258
double min_time_step_before_shutting_problematic_wells_
< shut problematic wells when time step size in days are less than this
Definition AdaptiveTimeStepping.hpp:274
bool use_newton_iteration_
use newton iteration count for adaptive time step control
Definition AdaptiveTimeStepping.hpp:271
Definition SimulatorTimer.hpp:39
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilboundaryratevector.hh:37
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:242
This file provides the infrastructure to retrieve run-time parameters.
static bool compare_gt_or_eq(double a, double b)
Determines if a is greater than b within the specified tolerance.
Definition ReservoirCoupling.cpp:91
Definition SimulatorReport.hpp:100