Merge pull request #546 from GitPaean/test_data_for_new_SimulatorTimer
A new SimulatorTimer and the test code and test data
This commit is contained in:
@@ -173,6 +173,7 @@ list (APPEND TEST_SOURCE_FILES
|
||||
tests/test_wellcontrols.cpp
|
||||
tests/test_wellsgroup.cpp
|
||||
tests/test_wellcollection.cpp
|
||||
tests/test_timer.cpp
|
||||
)
|
||||
|
||||
# originally generated with the command:
|
||||
@@ -188,6 +189,7 @@ list (APPEND TEST_DATA_FILES
|
||||
tests/wells_manager_data_expanded.data
|
||||
tests/wells_manager_data_wellSTOP.data
|
||||
tests/wells_group.data
|
||||
tests/TESTTIMER.DATA
|
||||
)
|
||||
|
||||
# originally generated with the command:
|
||||
|
||||
@@ -58,64 +58,35 @@ namespace Opm
|
||||
}
|
||||
|
||||
/// Use the SimulatorTimer as a shim around opm-parser's Opm::TimeMap
|
||||
void SimulatorTimer::init(Opm::TimeMapConstPtr timeMap,
|
||||
size_t beginReportStepIdx,
|
||||
size_t endReportStepIdx)
|
||||
void SimulatorTimer::init(Opm::TimeMapConstPtr timeMap)
|
||||
{
|
||||
timeMap_ = timeMap;
|
||||
current_step_ = 0;
|
||||
beginReportStepIdx_ = beginReportStepIdx;
|
||||
endReportStepIdx_ = std::min(timeMap_->numTimesteps() + 1, endReportStepIdx);
|
||||
total_time_ = timeMap->getTotalTime();
|
||||
timesteps_.resize(timeMap->numTimesteps());
|
||||
for ( size_t i = 0; i < timeMap->numTimesteps(); ++i ) {
|
||||
timesteps_[i] = timeMap->getTimeStepLength(i);
|
||||
}
|
||||
boost::posix_time::ptime start_time = timeMap->getStartTime(0);
|
||||
start_date_ = start_time.date();
|
||||
}
|
||||
|
||||
/// Total number of steps.
|
||||
int SimulatorTimer::numSteps() const
|
||||
{
|
||||
if (timeMap_)
|
||||
return endReportStepIdx_ - beginReportStepIdx_;
|
||||
else
|
||||
return timesteps_.size();
|
||||
}
|
||||
|
||||
/// Index of the first considered simulation episode
|
||||
size_t SimulatorTimer::beginReportStepIndex() const
|
||||
{
|
||||
if (!timeMap_) {
|
||||
OPM_THROW(std::runtime_error, "indexFirstEpisode() is only implemented "
|
||||
"for simulation timers which are based on Opm::TimeMap");
|
||||
}
|
||||
|
||||
return beginReportStepIdx_;
|
||||
}
|
||||
|
||||
/// Index of the last considered simulation episode
|
||||
size_t SimulatorTimer::endReportStepIndex() const
|
||||
{
|
||||
if (!timeMap_) {
|
||||
OPM_THROW(std::runtime_error, "indexLastEpisode() is only implemented "
|
||||
"for simulation timers which are based on Opm::TimeMap");
|
||||
}
|
||||
|
||||
return endReportStepIdx_;
|
||||
return timesteps_.size();
|
||||
}
|
||||
|
||||
/// Current step number.
|
||||
int SimulatorTimer::currentStepNum() const
|
||||
{
|
||||
return current_step_ + beginReportStepIdx_;
|
||||
return current_step_;
|
||||
}
|
||||
|
||||
/// Set current step number.
|
||||
void SimulatorTimer::setCurrentStepNum(int step)
|
||||
{
|
||||
if (current_step_ < 0 || current_step_ > int(numSteps())) {
|
||||
// Note that we do allow current_step_ == timesteps_.size(),
|
||||
// that is the done() state.
|
||||
OPM_THROW(std::runtime_error, "Trying to set invalid step number: " << step);
|
||||
}
|
||||
current_step_ = step;
|
||||
if (timeMap_)
|
||||
current_time_ = std::accumulate(timesteps_.begin(), timesteps_.begin() + step, 0.0);
|
||||
current_time_ = std::accumulate(timesteps_.begin(), timesteps_.begin() + step, 0.0);
|
||||
}
|
||||
|
||||
|
||||
@@ -123,29 +94,19 @@ namespace Opm
|
||||
double SimulatorTimer::currentStepLength() const
|
||||
{
|
||||
assert(!done());
|
||||
if (timeMap_)
|
||||
return timeMap_->getTimeStepLength(beginReportStepIdx_ + current_step_);
|
||||
else
|
||||
return timesteps_[current_step_];
|
||||
return timesteps_[current_step_];
|
||||
}
|
||||
|
||||
double SimulatorTimer::stepLengthTaken() const
|
||||
{
|
||||
assert(current_step_ > 0);
|
||||
if (timeMap_)
|
||||
return timeMap_->getTimeStepLength(beginReportStepIdx_ + current_step_ - 1);
|
||||
else
|
||||
return timesteps_[current_step_ - 1];
|
||||
return timesteps_[current_step_ - 1];
|
||||
}
|
||||
|
||||
/// time elapsed since the start of the simulation [s].
|
||||
double SimulatorTimer::simulationTimeElapsed() const
|
||||
{
|
||||
if (timeMap_)
|
||||
return
|
||||
timeMap_->getTimePassedUntil(beginReportStepIdx_ + current_step_);
|
||||
else
|
||||
return current_time_;
|
||||
return current_time_;
|
||||
}
|
||||
|
||||
/// time elapsed since the start of the POSIX epoch (Jan 1st, 1970) [s].
|
||||
@@ -157,10 +118,7 @@ namespace Opm
|
||||
|
||||
boost::posix_time::ptime SimulatorTimer::currentDateTime() const
|
||||
{
|
||||
if (timeMap_)
|
||||
return timeMap_->getStartTime(beginReportStepIdx_ + current_step_);
|
||||
else
|
||||
return boost::posix_time::ptime(start_date_) + boost::posix_time::seconds( (int) current_time_ );
|
||||
return boost::posix_time::ptime(start_date_) + boost::posix_time::seconds( (int) current_time_ );
|
||||
}
|
||||
|
||||
|
||||
@@ -168,11 +126,7 @@ namespace Opm
|
||||
/// Total time.
|
||||
double SimulatorTimer::totalTime() const
|
||||
{
|
||||
if (timeMap_)
|
||||
return
|
||||
timeMap_->getTotalTime();
|
||||
else
|
||||
return total_time_;
|
||||
return total_time_;
|
||||
}
|
||||
|
||||
/// Set total time.
|
||||
@@ -181,13 +135,7 @@ namespace Opm
|
||||
/// access to later timesteps.
|
||||
void SimulatorTimer::setTotalTime(double 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;
|
||||
total_time_ = time;
|
||||
}
|
||||
|
||||
/// Print a report with current and total time etc.
|
||||
@@ -204,8 +152,7 @@ namespace Opm
|
||||
SimulatorTimer& SimulatorTimer::operator++()
|
||||
{
|
||||
assert(!done());
|
||||
if (!timeMap_)
|
||||
current_time_ += timesteps_[current_step_];
|
||||
current_time_ += timesteps_[current_step_];
|
||||
++current_step_;
|
||||
return *this;
|
||||
}
|
||||
@@ -213,10 +160,7 @@ namespace Opm
|
||||
/// Return true if op++() has been called numSteps() times.
|
||||
bool SimulatorTimer::done() const
|
||||
{
|
||||
if (timeMap_)
|
||||
return current_step_ > int(endReportStepIdx_ - beginReportStepIdx_ - 1);
|
||||
else
|
||||
return int(timesteps_.size()) == current_step_;
|
||||
return int(timesteps_.size()) == current_step_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,19 +50,11 @@ namespace Opm
|
||||
void init(const EclipseGridParser& deck);
|
||||
|
||||
/// Use the SimulatorTimer as a shim around opm-parser's Opm::TimeMap
|
||||
void init(TimeMapConstPtr timeMap,
|
||||
size_t beginReportStepIdx = 0,
|
||||
size_t endReportStepIdx = std::numeric_limits<size_t>::max());
|
||||
void init(TimeMapConstPtr timeMap);
|
||||
|
||||
/// Total number of steps.
|
||||
int numSteps() const;
|
||||
|
||||
/// Index of the first report step considered
|
||||
size_t beginReportStepIndex() const;
|
||||
|
||||
/// Index of the next-after-last report step to be considered
|
||||
size_t endReportStepIndex() 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
|
||||
@@ -117,10 +109,7 @@ namespace Opm
|
||||
bool done() const;
|
||||
|
||||
private:
|
||||
Opm::TimeMapConstPtr timeMap_;
|
||||
std::vector<double> timesteps_;
|
||||
size_t beginReportStepIdx_;
|
||||
size_t endReportStepIdx_;
|
||||
int current_step_;
|
||||
double current_time_;
|
||||
double total_time_;
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
RUNSPEC
|
||||
|
||||
START
|
||||
26 'MAR' 2014 /
|
||||
|
||||
TSTEP
|
||||
1.0 2*5.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
7*10.0 14*25.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
19.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
18*13.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
17*10.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
13.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
18.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
11.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
17*5.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
19*6.0
|
||||
/
|
||||
|
||||
TSTEP
|
||||
21*5.0 /
|
||||
|
||||
END ==
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if HAVE_DYNAMIC_BOOST_TEST
|
||||
#define BOOST_TEST_DYN_LINK
|
||||
#endif
|
||||
|
||||
#define NVERBOSE // Suppress own messages when throw()ing
|
||||
|
||||
#define BOOST_TEST_MODULE OPM-TimerTest
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
||||
#include <opm/core/simulator/SimulatorTimer.hpp>
|
||||
#include <opm/core/utility/Units.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
BOOST_AUTO_TEST_CASE(CreateTimer)
|
||||
{
|
||||
const std::string filename1 = "TESTTIMER.DATA";
|
||||
Opm::ParserPtr parser(new Opm::Parser() );
|
||||
Opm::DeckConstPtr parserDeck = parser->parseFile( filename1 );
|
||||
|
||||
Opm::TimeMapPtr timeMap(new Opm::TimeMap(parserDeck));
|
||||
Opm::SimulatorTimer simtimer;
|
||||
|
||||
boost::gregorian::date defaultStartDate( 2012, 1, 1);
|
||||
BOOST_CHECK_EQUAL( boost::posix_time::ptime(defaultStartDate), simtimer.currentDateTime() );
|
||||
|
||||
simtimer.init(timeMap);
|
||||
boost::gregorian::date startDate( 2014, 3, 26);
|
||||
BOOST_CHECK_EQUAL( boost::posix_time::ptime(startDate), simtimer.currentDateTime() );
|
||||
|
||||
BOOST_CHECK_EQUAL( 0, simtimer.currentStepNum() );
|
||||
BOOST_CHECK_EQUAL( 0., simtimer.simulationTimeElapsed() );
|
||||
BOOST_CHECK_EQUAL( 120, simtimer.numSteps() );
|
||||
BOOST_CHECK_EQUAL( 1200., Opm::unit::convert::to(simtimer.totalTime(), Opm::unit::day) );
|
||||
BOOST_CHECK_EQUAL( 0., Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::day) );
|
||||
|
||||
double testCurrentTime = 0.;
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime, Opm::unit::day),
|
||||
Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::day) );
|
||||
|
||||
for ( int i = 0; i < simtimer.numSteps(); ++i ) {
|
||||
BOOST_CHECK_EQUAL( i, simtimer.currentStepNum() );
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime, Opm::unit::minute),
|
||||
Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::minute) );
|
||||
testCurrentTime += simtimer.currentStepLength();
|
||||
++simtimer;
|
||||
}
|
||||
|
||||
for ( int i = 0; i <= simtimer.numSteps(); ++i ) {
|
||||
simtimer.setCurrentStepNum(i);
|
||||
BOOST_CHECK_EQUAL( i, simtimer.currentStepNum() );
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL( true, simtimer.done() );
|
||||
simtimer.setCurrentStepNum(0);
|
||||
BOOST_CHECK_EQUAL( false, simtimer.done() );
|
||||
BOOST_CHECK_EQUAL( 0., Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::day) );
|
||||
|
||||
simtimer.setCurrentStepNum(120);
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::day),
|
||||
Opm::unit::convert::to(simtimer.totalTime(), Opm::unit::day) );
|
||||
|
||||
int i = 0;
|
||||
double testCurrentTime1 = 0.;
|
||||
double testCurrentTime2 = 0.;
|
||||
simtimer.setCurrentStepNum(0);
|
||||
|
||||
while (!simtimer.done()) {
|
||||
testCurrentTime1 += simtimer.currentStepLength();
|
||||
BOOST_CHECK_EQUAL( i, simtimer.currentStepNum() );
|
||||
++i;
|
||||
++simtimer;
|
||||
testCurrentTime2 += simtimer.stepLengthTaken();
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime1, Opm::unit::minute),
|
||||
Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::minute) );
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime2, Opm::unit::minute),
|
||||
Opm::unit::convert::to(simtimer.simulationTimeElapsed(), Opm::unit::minute) );
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL( true, simtimer.done() );
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime1, Opm::unit::minute),
|
||||
Opm::unit::convert::to(simtimer.totalTime(), Opm::unit::minute) );
|
||||
BOOST_CHECK_EQUAL( Opm::unit::convert::to(testCurrentTime2, Opm::unit::minute),
|
||||
Opm::unit::convert::to(simtimer.totalTime(), Opm::unit::minute) );
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user