/*
Copyright 2012 SINTEF ICT, Applied Mathematics.
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 3 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 .
*/
#ifndef OPM_SIMULATORTIMER_HEADER_INCLUDED
#define OPM_SIMULATORTIMER_HEADER_INCLUDED
#include
#include
#include
#include
#include
namespace Opm
{
class ParameterGroup;
class Schedule;
class SimulatorTimer : public SimulatorTimerInterface
{
public:
// use default implementation of these methods
using SimulatorTimerInterface::currentDateTime;
using SimulatorTimerInterface::currentPosixTime;
/// Default constructor.
SimulatorTimer();
static SimulatorTimer serializationTestObject();
/// Initialize from parameters. Accepts the following:
/// num_psteps (default 1)
/// stepsize_days (default 1)
void init(const ParameterGroup& param);
/// Use the SimulatorTimer as a shim around opm-commons Schedule class
void init(const Schedule& schedule, size_t report_step = 0);
/// Whether the current step is the first step.
bool initialStep() const override;
/// Total number of steps.
int numSteps() const;
/// Current step number. This is the number of timesteps that
/// has been completed from the start of the run. The time
/// after initialization but before the simulation has started
/// is timestep number zero.
int currentStepNum() const override;
/// Set current step number.
void setCurrentStepNum(int step);
/// Current step length. This is the length of the step
/// the simulator will take in the next iteration.
///
/// @note if done(), it is an error to call currentStepLength().
double currentStepLength() const override;
/// Previous step length. This is the length of the step that
/// was taken to arrive at this time.
///
/// @note if no increments have been done (i.e. the timer is
/// still in its constructed state and currentStepNum() == 0),
/// it is an error to call stepLengthTaken().
double stepLengthTaken () const override;
/// Time elapsed since the start of the simulation until the
/// beginning of the current time step [s].
double simulationTimeElapsed() const override;
/// Total time.
double totalTime() const;
/// Return start date of simulation
boost::posix_time::ptime startDateTime() const override;
/// Set total time.
/// This is primarily intended for multi-epoch schedules,
/// where a timer for a given epoch does not have
/// access to later timesteps.
void setTotalTime(double time);
/// Print a report with current and total time etc.
/// Note: if done(), it is an error to call report().
void report(std::ostream& os) const;
/// advance time by currentStepLength
SimulatorTimer& operator++();
/// advance time by currentStepLength
void advance() override { this->operator++(); }
/// Return true if op++() has been called numSteps() times.
bool done() const override;
/// Always return false. Timestep failures is handled in the
/// substepTimer
bool lastStepFailed() const override { return false; }
/// return copy of object
std::unique_ptr clone() const override;
template
void serializeOp(Serializer& serializer)
{
serializer(timesteps_);
serializer(current_step_);
serializer(current_time_);
serializer(total_time_);
serializer(start_date_);
}
bool operator==(const SimulatorTimer& rhs) const;
private:
std::vector timesteps_;
int current_step_;
double current_time_;
double total_time_;
boost::gregorian::date start_date_;
};
} // namespace Opm
#endif // OPM_SIMULATORTIMER_HEADER_INCLUDED