TimeStepControl.hpp
Go to the documentation of this file.
1/*
2 Copyright 2014 IRIS AS
3 Copyright 2015 Dr. Blatt - HPC-Simulation-Software & Services
4 Copyright 2015 Statoil AS
5
6 This file is part of the Open Porous Media project (OPM).
7
8 OPM is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 OPM is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with OPM. If not, see <http://www.gnu.org/licenses/>.
20*/
21#ifndef OPM_TIMESTEPCONTROL_HEADER_INCLUDED
22#define OPM_TIMESTEPCONTROL_HEADER_INCLUDED
23
26
27#include <string>
28#include <vector>
29
30namespace Opm
31{
34 PID,
38 };
39
43 };
44
48 };
49
53 //
56 {
57 public:
60
63 // \param decayrate decayrate of time step when target iterations are not met (should be <= 1)
64 // \param growthrate growthrate of time step when target iterations are not met (should be >= 1)
66 SimpleIterationCountTimeStepControl( const int target_iterations,
67 const double decayrate,
68 const double growthrate,
69 const bool verbose = false);
70
72
74 double computeTimeStepSize(const double dt,
75 const int iterations,
76 const RelativeChangeInterface& /* relativeChange */,
77 const AdaptiveSimulatorTimer& /* substepTimer */ ) const override;
78
79 bool timeStepAccepted(const double /* error */, const double /* timeStepJustCompleted */) const override { return true; }
80
81 template<class Serializer>
82 void serializeOp(Serializer& serializer)
83 {
84 serializer(target_iterations_);
85 serializer(decayrate_);
86 serializer(growthrate_);
87 serializer(verbose_);
88 }
89
91
92 protected:
93 const int target_iterations_ = 0;
94 const double decayrate_ = 0.0;
95 const double growthrate_ = 0.0;
96 const bool verbose_ = false;
97 };
98
114 {
115 public:
121 explicit PIDTimeStepControl(const double tol = 1e-3,
122 const bool verbose = false);
123
125
127 double computeTimeStepSize(const double dt,
128 const int /* iterations */,
129 const RelativeChangeInterface& relativeChange,
130 const AdaptiveSimulatorTimer& /* substepTimer */ ) const override;
131
132 bool timeStepAccepted(const double /* error */, const double /* timeStepJustCompleted */) const override { return true; }
133
134 template<class Serializer>
135 void serializeOp(Serializer& serializer)
136 {
137 serializer(tol_);
138 serializer(errors_);
139 serializer(verbose_);
140 }
141
142 bool operator==(const PIDTimeStepControl&) const;
143
144 protected:
145 const double tol_ = 1e-3;
146 mutable std::vector< double > errors_{};
147
148 const bool verbose_ = false;
149 };
150
155 //
158 {
160 public:
162
168 explicit PIDAndIterationCountTimeStepControl(const int target_iterations = 20,
169 const double decayDampingFactor = 1.0,
170 const double growthDampingFactor = 1.0/1.2,
171 const double tol = 1e-3,
172 const double minTimeStepBasedOnIterations = 0.,
173 const bool verbose = false);
174
176
178 double computeTimeStepSize(const double dt,
179 const int iterations,
180 const RelativeChangeInterface& relativeChange,
181 const AdaptiveSimulatorTimer& /* substepTimer */ ) const override;
182
183 bool timeStepAccepted(const double /* error */, const double /* timeStepJustCompleted */) const override { return true; }
184
185 template<class Serializer>
186 void serializeOp(Serializer& serializer)
187 {
188 serializer(static_cast<PIDTimeStepControl&>(*this));
189 serializer(target_iterations_);
190 serializer(decayDampingFactor_);
191 serializer(growthDampingFactor_);
193 }
194
196
197 protected:
202 };
203
210 {
211 public:
213
215
216 General3rdOrderController( const double tolerance,
217 const double safetyFactor,
218 const bool rejectCompletedStep,
219 const std::string& toleranceTestVersion,
220 const double maxReductionTimeStep,
221 const std::string& parameters,
222 const bool verbose);
223
225
226 double computeTimeStepSize(const double dt,
227 const int /* iterations */,
228 const RelativeChangeInterface& /* relativeChange */,
229 const AdaptiveSimulatorTimer& substepTimer) const override;
230
231 double timeStepFactor(const std::array<double, 3>& errors, const std::array<double, 3>& timeSteps) const;
232
233 bool timeStepAccepted(const double error, const double timeStepJustCompleted) const override;
234
235 template<class Serializer>
236 void serializeOp(Serializer& serializer)
237 {
238 serializer(tolerance_);
239 serializer(safetyFactor_);
240 serializer(rejectCompletedStep_);
241 serializer(errors_);
242 serializer(timeSteps_);
243 serializer(beta_);
244 serializer(alpha_);
245 serializer(controllerVersion_);
246 serializer(toleranceTestVersion_);
247 serializer(maxReductionTimeStep_);
248 serializer(verbose_);
249 }
250
252
253
254 protected:
255 const double tolerance_ = 0.1;
256 const double safetyFactor_ = 0.8;
257 const bool rejectCompletedStep_ = false;
258 mutable std::array<double, 3> errors_{};
259 mutable std::array<double, 3> timeSteps_{};
260 mutable std::array<double, 3> beta_{0.125, 0.25, 0.125};
261 mutable std::array<double, 2> alpha_{0.75, 0.25};
264 const double maxReductionTimeStep_ = 0.1;
265 const bool verbose_ = false;
266 };
267
278 {
279 public:
282
285 explicit HardcodedTimeStepControl(const std::string& filename);
286
288
290 double computeTimeStepSize(const double dt,
291 const int /* iterations */,
292 const RelativeChangeInterface& /*relativeChange */,
293 const AdaptiveSimulatorTimer& substepTimer) const override;
294
295 bool timeStepAccepted(const double /* error */, const double /* timeStepJustCompleted */) const override { return true; }
296
297 template<class Serializer>
298 void serializeOp(Serializer& serializer)
299 {
300 serializer(subStepTime_);
301 }
302
304
305 protected:
306 // store the time (in days) of the substeps the simulator should use
307 std::vector<double> subStepTime_;
308 };
309
310
311} // end namespace Opm
312#endif
313
Simulation timer for adaptive time stepping.
Definition: AdaptiveSimulatorTimer.hpp:41
Definition: TimeStepControl.hpp:210
double computeTimeStepSize(const double dt, const int, const RelativeChangeInterface &, const AdaptiveSimulatorTimer &substepTimer) const override
InternalControlVersions controllerVersion_
Definition: TimeStepControl.hpp:262
bool timeStepAccepted(const double error, const double timeStepJustCompleted) const override
const bool verbose_
Definition: TimeStepControl.hpp:265
const double tolerance_
Definition: TimeStepControl.hpp:255
std::array< double, 3 > beta_
Definition: TimeStepControl.hpp:260
const bool rejectCompletedStep_
Definition: TimeStepControl.hpp:257
std::array< double, 3 > timeSteps_
Definition: TimeStepControl.hpp:259
static constexpr TimeStepControlType Type
Definition: TimeStepControl.hpp:212
const double safetyFactor_
Definition: TimeStepControl.hpp:256
static General3rdOrderController serializationTestObject()
std::array< double, 2 > alpha_
Definition: TimeStepControl.hpp:261
ToleranceTestVersions toleranceTestVersion_
Definition: TimeStepControl.hpp:263
const double maxReductionTimeStep_
Definition: TimeStepControl.hpp:264
General3rdOrderController(const double tolerance, const double safetyFactor, const bool rejectCompletedStep, const std::string &toleranceTestVersion, const double maxReductionTimeStep, const std::string &parameters, const bool verbose)
bool operator==(const General3rdOrderController &) const
void serializeOp(Serializer &serializer)
Definition: TimeStepControl.hpp:236
double timeStepFactor(const std::array< double, 3 > &errors, const std::array< double, 3 > &timeSteps) const
std::array< double, 3 > errors_
Definition: TimeStepControl.hpp:258
Definition: TimeStepControl.hpp:278
static constexpr TimeStepControlType Type
Definition: TimeStepControl.hpp:280
void serializeOp(Serializer &serializer)
Definition: TimeStepControl.hpp:298
double computeTimeStepSize(const double dt, const int, const RelativeChangeInterface &, const AdaptiveSimulatorTimer &substepTimer) const override
static HardcodedTimeStepControl serializationTestObject()
bool operator==(const HardcodedTimeStepControl &) const
bool timeStepAccepted(const double, const double) const override
Definition: TimeStepControl.hpp:295
std::vector< double > subStepTime_
Definition: TimeStepControl.hpp:307
HardcodedTimeStepControl(const std::string &filename)
constructor
Definition: TimeStepControl.hpp:158
bool timeStepAccepted(const double, const double) const override
Definition: TimeStepControl.hpp:183
const double growthDampingFactor_
Definition: TimeStepControl.hpp:200
void serializeOp(Serializer &serializer)
Definition: TimeStepControl.hpp:186
const int target_iterations_
Definition: TimeStepControl.hpp:198
double computeTimeStepSize(const double dt, const int iterations, const RelativeChangeInterface &relativeChange, const AdaptiveSimulatorTimer &) const override
const double decayDampingFactor_
Definition: TimeStepControl.hpp:199
PIDAndIterationCountTimeStepControl(const int target_iterations=20, const double decayDampingFactor=1.0, const double growthDampingFactor=1.0/1.2, const double tol=1e-3, const double minTimeStepBasedOnIterations=0., const bool verbose=false)
constructor
static PIDAndIterationCountTimeStepControl serializationTestObject()
const double minTimeStepBasedOnIterations_
Definition: TimeStepControl.hpp:201
bool operator==(const PIDAndIterationCountTimeStepControl &) const
static constexpr TimeStepControlType Type
Definition: TimeStepControl.hpp:161
Definition: TimeStepControl.hpp:114
const bool verbose_
Definition: TimeStepControl.hpp:148
static constexpr TimeStepControlType Type
Definition: TimeStepControl.hpp:116
void serializeOp(Serializer &serializer)
Definition: TimeStepControl.hpp:135
bool operator==(const PIDTimeStepControl &) const
bool timeStepAccepted(const double, const double) const override
Definition: TimeStepControl.hpp:132
PIDTimeStepControl(const double tol=1e-3, const bool verbose=false)
constructor
double computeTimeStepSize(const double dt, const int, const RelativeChangeInterface &relativeChange, const AdaptiveSimulatorTimer &) const override
static PIDTimeStepControl serializationTestObject()
std::vector< double > errors_
Definition: TimeStepControl.hpp:146
const double tol_
Definition: TimeStepControl.hpp:145
Definition: TimeStepControlInterface.hpp:34
Definition: TimeStepControl.hpp:56
const bool verbose_
Definition: TimeStepControl.hpp:96
SimpleIterationCountTimeStepControl(const int target_iterations, const double decayrate, const double growthrate, const bool verbose=false)
constructor
const double decayrate_
Definition: TimeStepControl.hpp:94
bool operator==(const SimpleIterationCountTimeStepControl &) const
bool timeStepAccepted(const double, const double) const override
Definition: TimeStepControl.hpp:79
static constexpr TimeStepControlType Type
Definition: TimeStepControl.hpp:58
const int target_iterations_
Definition: TimeStepControl.hpp:93
double computeTimeStepSize(const double dt, const int iterations, const RelativeChangeInterface &, const AdaptiveSimulatorTimer &) const override
const double growthrate_
Definition: TimeStepControl.hpp:95
static SimpleIterationCountTimeStepControl serializationTestObject()
void serializeOp(Serializer &serializer)
Definition: TimeStepControl.hpp:82
Definition: TimeStepControlInterface.hpp:51
Definition: blackoilboundaryratevector.hh:39
InternalControlVersions
Definition: TimeStepControl.hpp:45
ToleranceTestVersions
Definition: TimeStepControl.hpp:40
TimeStepControlType
Definition: TimeStepControl.hpp:32