Merge pull request #498 from andlaus/use_timemap_in_simulatortimer

SimulatorTimer: make it possible to base it on opm-parser's TimeMap
This commit is contained in:
Joakim Hove 2014-02-27 14:35:16 +01:00
commit 167767e5aa
2 changed files with 55 additions and 11 deletions

View File

@ -57,10 +57,21 @@ namespace Opm
start_date_ = deck.getStartDate(); start_date_ = deck.getStartDate();
} }
/// Use the SimulatorTimer as a shim around opm-parser's Opm::TimeMap
void SimulatorTimer::init(Opm::TimeMapConstPtr timeMap,
int timeStepIdx)
{
timeMap_ = timeMap;
current_step_ = timeStepIdx;
}
/// Total number of steps. /// Total number of steps.
int SimulatorTimer::numSteps() const int SimulatorTimer::numSteps() const
{ {
return timesteps_.size(); if (timeMap_)
return timeMap_->numTimesteps();
else
return timesteps_.size();
} }
/// Current step number. /// Current step number.
@ -72,13 +83,14 @@ namespace Opm
/// Set current step number. /// Set current step number.
void SimulatorTimer::setCurrentStepNum(int step) void SimulatorTimer::setCurrentStepNum(int step)
{ {
if (current_step_ < 0 || current_step_ > int(timesteps_.size())) { if (current_step_ < 0 || current_step_ > int(numSteps())) {
// Note that we do allow current_step_ == timesteps_.size(), // Note that we do allow current_step_ == timesteps_.size(),
// that is the done() state. // that is the done() state.
OPM_THROW(std::runtime_error, "Trying to set invalid step number: " << step); OPM_THROW(std::runtime_error, "Trying to set invalid step number: " << step);
} }
current_step_ = step; current_step_ = step;
current_time_ = std::accumulate(timesteps_.begin(), timesteps_.begin() + step, 0.0); if (timeMap_)
current_time_ = std::accumulate(timesteps_.begin(), timesteps_.begin() + step, 0.0);
} }
@ -86,25 +98,37 @@ namespace Opm
double SimulatorTimer::currentStepLength() const double SimulatorTimer::currentStepLength() const
{ {
assert(!done()); assert(!done());
return timesteps_[current_step_]; if (timeMap_)
return timeMap_->getTimeStepLength(current_step_);
else
return timesteps_[current_step_];
} }
double SimulatorTimer::stepLengthTaken() const double SimulatorTimer::stepLengthTaken() const
{ {
assert(current_step_ > 0); assert(current_step_ > 0);
return timesteps_[current_step_ - 1]; if (timeMap_)
return timeMap_->getTimeStepLength(current_step_ - 1);
else
return timesteps_[current_step_ - 1];
} }
/// Current time. /// Current time.
double SimulatorTimer::currentTime() const double SimulatorTimer::currentTime() const
{ {
return current_time_; if (timeMap_)
return timeMap_->getTimePassedUntil(current_step_);
else
return current_time_;
} }
boost::posix_time::ptime SimulatorTimer::currentDateTime() const boost::posix_time::ptime SimulatorTimer::currentDateTime() const
{ {
return boost::posix_time::ptime(start_date_) + boost::posix_time::seconds( (int) current_time_ ); if (timeMap_)
return timeMap_->getStartTime(current_step_);
else
return boost::posix_time::ptime(start_date_) + boost::posix_time::seconds( (int) current_time_ );
} }
@ -112,7 +136,10 @@ namespace Opm
/// Total time. /// Total time.
double SimulatorTimer::totalTime() const double SimulatorTimer::totalTime() const
{ {
return total_time_; if (timeMap_)
return timeMap_->getTotalTime();
else
return total_time_;
} }
/// Set total time. /// Set total time.
@ -121,7 +148,13 @@ namespace Opm
/// access to later timesteps. /// access to later timesteps.
void SimulatorTimer::setTotalTime(double time) void SimulatorTimer::setTotalTime(double time)
{ {
total_time_ = time; if (timeMap_) {
// well, what can we do if we use opm-parser's TimeMap?
OPM_THROW(std::logic_error,
"Not implemented: SimulatorTimer::setTotalTime() if using a TimeMap.");
}
else
total_time_ = time;
} }
/// Print a report with current and total time etc. /// Print a report with current and total time etc.
@ -138,7 +171,8 @@ namespace Opm
SimulatorTimer& SimulatorTimer::operator++() SimulatorTimer& SimulatorTimer::operator++()
{ {
assert(!done()); assert(!done());
current_time_ += timesteps_[current_step_]; if (!timeMap_)
current_time_ += timesteps_[current_step_];
++current_step_; ++current_step_;
return *this; return *this;
} }
@ -146,7 +180,10 @@ namespace Opm
/// Return true if op++() has been called numSteps() times. /// Return true if op++() has been called numSteps() times.
bool SimulatorTimer::done() const bool SimulatorTimer::done() const
{ {
return int(timesteps_.size()) == current_step_; if (timeMap_)
return int(timeMap_->numTimesteps()) <= current_step_;
else
return int(timesteps_.size()) == current_step_;
} }

View File

@ -20,6 +20,8 @@
#ifndef OPM_SIMULATORTIMER_HEADER_INCLUDED #ifndef OPM_SIMULATORTIMER_HEADER_INCLUDED
#define OPM_SIMULATORTIMER_HEADER_INCLUDED #define OPM_SIMULATORTIMER_HEADER_INCLUDED
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
#include <iosfwd> #include <iosfwd>
#include <vector> #include <vector>
#include <boost/date_time/gregorian/gregorian.hpp> #include <boost/date_time/gregorian/gregorian.hpp>
@ -47,6 +49,10 @@ namespace Opm
/// Note that DATES are folded into TSTEP by the parser. /// Note that DATES are folded into TSTEP by the parser.
void init(const EclipseGridParser& deck); void init(const EclipseGridParser& deck);
/// Use the SimulatorTimer as a shim around opm-parser's Opm::TimeMap
void init(TimeMapConstPtr timeMap,
int timeStepIdx = 0);
/// Total number of steps. /// Total number of steps.
int numSteps() const; int numSteps() const;
@ -99,6 +105,7 @@ namespace Opm
bool done() const; bool done() const;
private: private:
Opm::TimeMapConstPtr timeMap_;
std::vector<double> timesteps_; std::vector<double> timesteps_;
int current_step_; int current_step_;
double current_time_; double current_time_;