diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 9c2a33bbc..b739cd553 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -406,6 +406,7 @@ list (APPEND PUBLIC_HEADER_FILES ebos/eclproblem.hh ebos/eclproblem_properties.hh ebos/eclsolutioncontainers.hh + ebos/ecltimesteppingparams.hh ebos/eclthresholdpressure.hh ebos/ecltracermodel.hh ebos/ecltransmissibility.hh diff --git a/ebos/ebos.hh b/ebos/ebos.hh index b7ebae394..075f4646e 100644 --- a/ebos/ebos.hh +++ b/ebos/ebos.hh @@ -29,6 +29,7 @@ #define EBOS_HH #include +#include #include @@ -45,7 +46,7 @@ namespace Opm::Properties { namespace TTag { struct EbosTypeTag { - using InheritsFrom = std::tuple; + using InheritsFrom = std::tuple; }; } diff --git a/ebos/eclproblem.hh b/ebos/eclproblem.hh index cecae8bcc..cc6c32352 100644 --- a/ebos/eclproblem.hh +++ b/ebos/eclproblem.hh @@ -2386,10 +2386,18 @@ private: { if constexpr (enableExperiments) { const auto& simulator = this->simulator(); + const auto& schedule = simulator.vanguard().schedule(); int episodeIdx = simulator.episodeIndex(); // first thing in the morning, limit the time step size to the maximum size - dtNext = std::min(dtNext, this->maxTimeStepSize_); + Scalar maxTimeStepSize = EWOMS_GET_PARAM(TypeTag, double, SolverMaxTimeStepInDays)*24*60*60; + int reportStepIdx = std::max(episodeIdx, 0); + if (this->enableTuning_) { + const auto& tuning = schedule[reportStepIdx].tuning(); + maxTimeStepSize = tuning.TSMAXZ; + } + + dtNext = std::min(dtNext, maxTimeStepSize); Scalar remainingEpisodeTime = simulator.episodeStartTime() + simulator.episodeLength() @@ -2401,12 +2409,11 @@ private: if (remainingEpisodeTime/2.0 < dtNext && dtNext < remainingEpisodeTime*(1.0 - 1e-5)) // note: limiting to the maximum time step size here is probably not strictly // necessary, but it should not hurt and is more fool-proof - dtNext = std::min(this->maxTimeStepSize_, remainingEpisodeTime/2.0); + dtNext = std::min(maxTimeStepSize, remainingEpisodeTime/2.0); if (simulator.episodeStarts()) { // if a well event occurred, respect the limit for the maximum time step after // that, too - int reportStepIdx = std::max(episodeIdx, 0); const auto& events = simulator.vanguard().schedule()[reportStepIdx].events(); bool wellEventOccured = events.hasEvent(ScheduleEvents::NEW_WELL) diff --git a/ebos/ecltimesteppingparams.hh b/ebos/ecltimesteppingparams.hh new file mode 100644 index 000000000..e8c31427f --- /dev/null +++ b/ebos/ecltimesteppingparams.hh @@ -0,0 +1,124 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/* + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + + Consult the COPYING file in the top-level source directory of this + module for the precise wording of the license and the list of + copyright holders. +*/ +#ifndef ECL_TIMESTEPPING_PARAMS_HH +#define ECL_TIMESTEPPING_PARAMS_HH + +#include "opm/models/utils/basicproperties.hh" +#include + +namespace Opm::Properties { + +namespace TTag { +struct EclTimeSteppingParameters {}; +} + +template +struct SolverGrowthFactor { + using type = UndefinedProperty; +}; + +template +struct SolverMaxGrowth { + using type = UndefinedProperty; +}; + +template +struct SolverMaxTimeStepInDays { + using type = UndefinedProperty; +}; + +template +struct SolverMinTimeStep { + using type = UndefinedProperty; +}; + +template +struct SolverRestartFactor { + using type = UndefinedProperty; +}; + +template +struct TimeStepAfterEventInDays { + using type = UndefinedProperty; +}; + +template +struct SolverGrowthFactor { + using type = GetPropType; + static constexpr type value = 2.0; +}; + +template +struct SolverMaxGrowth { + using type = GetPropType; + static constexpr type value = 3.0; +}; + +template +struct SolverMinTimeStep { + using type = GetPropType; + static constexpr type value = 1.0e-12; +}; + +template +struct SolverMaxTimeStepInDays { + using type = GetPropType; + static constexpr type value = 365.0; +}; + +template +struct SolverRestartFactor { + using type = GetPropType; + static constexpr type value = 0.33; +}; + +template +struct TimeStepAfterEventInDays { + using type = GetPropType; + static constexpr type value = -1.0; +}; + +} // namespace Opm::Properties + +namespace Opm { + +template +void registerEclTimeSteppingParameters() +{ + EWOMS_REGISTER_PARAM(TypeTag, double, SolverGrowthFactor, + "The factor time steps are elongated after a successful substep"); + EWOMS_REGISTER_PARAM(TypeTag, double, SolverMaxGrowth, + "The maximum factor time steps are elongated after a report step"); + EWOMS_REGISTER_PARAM(TypeTag, double, SolverMaxTimeStepInDays, + "The maximum size of a time step in days"); + EWOMS_REGISTER_PARAM(TypeTag, double, SolverMinTimeStep, + "The minimum size of a time step in days for field and metric and hours for lab. If a step cannot converge without getting cut below this step size the simulator will stop"); + EWOMS_REGISTER_PARAM(TypeTag, double, SolverRestartFactor, + "The factor time steps are elongated after restarts"); + EWOMS_REGISTER_PARAM(TypeTag, double, TimeStepAfterEventInDays, + "Time step size of the first time step after an event occurs during the simulation in days"); +} + +} // namespace Opm + +#endif // ECL_TIME_STEPPING_PARAMS_HH diff --git a/opm/simulators/timestepping/AdaptiveTimeSteppingEbos.hpp b/opm/simulators/timestepping/AdaptiveTimeSteppingEbos.hpp index bed50b1fe..1e1ed6163 100644 --- a/opm/simulators/timestepping/AdaptiveTimeSteppingEbos.hpp +++ b/opm/simulators/timestepping/AdaptiveTimeSteppingEbos.hpp @@ -10,6 +10,8 @@ #include #endif +#include + #include #include #include @@ -46,29 +48,11 @@ namespace Opm::Properties { namespace TTag { -struct FlowTimeSteppingParameters {}; +struct FlowTimeSteppingParameters { + using InheritsFrom = std::tuple; +}; } -template -struct SolverRestartFactor { - using type = UndefinedProperty; -}; -template -struct SolverGrowthFactor { - using type = UndefinedProperty; -}; -template -struct SolverMaxGrowth { - using type = UndefinedProperty; -}; -template -struct SolverMaxTimeStepInDays { - using type = UndefinedProperty; -}; -template -struct SolverMinTimeStep { - using type = UndefinedProperty; -}; template struct SolverContinueOnConvergenceFailure { using type = UndefinedProperty; @@ -94,10 +78,6 @@ struct FullTimeStepInitially { using type = UndefinedProperty; }; template -struct TimeStepAfterEventInDays { - using type = UndefinedProperty; -}; -template struct TimeStepControl { using type = UndefinedProperty; }; @@ -142,31 +122,6 @@ struct MinTimeStepBasedOnNewtonIterations { using type = UndefinedProperty; }; -template -struct SolverRestartFactor { - using type = GetPropType; - static constexpr type value = 0.33; -}; -template -struct SolverGrowthFactor { - using type = GetPropType; - static constexpr type value = 2.0; -}; -template -struct SolverMaxGrowth { - using type = GetPropType; - static constexpr type value = 3.0; -}; -template -struct SolverMaxTimeStepInDays { - using type = GetPropType; - static constexpr type value = 365.0; -}; -template -struct SolverMinTimeStep { - using type = GetPropType; - static constexpr type value = 1.0e-12; -}; template struct SolverContinueOnConvergenceFailure { static constexpr bool value = false; @@ -193,11 +148,6 @@ struct FullTimeStepInitially { static constexpr bool value = false; }; template -struct TimeStepAfterEventInDays { - using type = GetPropType; - static constexpr type value = -1.0; -}; -template struct TimeStepControl { static constexpr auto value = "pid+newtoniteration"; }; @@ -350,17 +300,8 @@ std::set consistentlyFailingWells(const std::vector& sr static void registerParameters() { + registerEclTimeSteppingParameters(); // TODO: make sure the help messages are correct (and useful) - EWOMS_REGISTER_PARAM(TypeTag, double, SolverRestartFactor, - "The factor time steps are elongated after restarts"); - EWOMS_REGISTER_PARAM(TypeTag, double, SolverGrowthFactor, - "The factor time steps are elongated after a successful substep"); - EWOMS_REGISTER_PARAM(TypeTag, double, SolverMaxGrowth, - "The maximum factor time steps are elongated after a report step"); - EWOMS_REGISTER_PARAM(TypeTag, double, SolverMaxTimeStepInDays, - "The maximum size of a time step in days"); - EWOMS_REGISTER_PARAM(TypeTag, double, SolverMinTimeStep, - "The minimum size of a time step in days for field and metric and hours for lab. If a step cannot converge without getting cut below this step size the simulator will stop"); EWOMS_REGISTER_PARAM(TypeTag, bool, SolverContinueOnConvergenceFailure, "Continue instead of stop when minimum solver time step is reached"); EWOMS_REGISTER_PARAM(TypeTag, int, SolverMaxRestarts, @@ -373,8 +314,6 @@ std::set consistentlyFailingWells(const std::vector& sr "The size of the initial time step in days"); EWOMS_REGISTER_PARAM(TypeTag, bool, FullTimeStepInitially, "Always attempt to finish a report step using a single substep"); - EWOMS_REGISTER_PARAM(TypeTag, double, TimeStepAfterEventInDays, - "Time step size of the first time step after an event occurs during the simulation in days"); EWOMS_REGISTER_PARAM(TypeTag, std::string, TimeStepControl, "The algorithm used to determine time-step sizes. valid options are: 'pid' (default), 'pid+iteration', 'pid+newtoniteration', 'iterationcount', 'newtoniterationcount' and 'hardcoded'"); EWOMS_REGISTER_PARAM(TypeTag, double, TimeStepControlTolerance, diff --git a/tests/test_glift1.cpp b/tests/test_glift1.cpp index 12e8f488d..e0355c966 100644 --- a/tests/test_glift1.cpp +++ b/tests/test_glift1.cpp @@ -67,7 +67,7 @@ namespace Opm::Properties { namespace TTag { struct TestGliftTypeTag { - using InheritsFrom = std::tuple; + using InheritsFrom = std::tuple; }; } } @@ -86,7 +86,7 @@ initSimulator(const char *filename) filename_arg.c_str() }; - Opm::AdaptiveTimeSteppingEbos::registerParameters(); + Opm::registerEclTimeSteppingParameters(); Opm::setupParameters_(/*argc=*/sizeof(argv)/sizeof(argv[0]), argv, /*registerParams=*/true); Opm::EclGenericVanguard::readDeck(filename);