Using OrderedMap to hold wells in Schedule object - thereby preserving

well insert order.
This commit is contained in:
Joakim Hove 2014-04-30 14:45:37 +02:00
parent 4c477b6f70
commit 142255268d
3 changed files with 34 additions and 8 deletions

View File

@ -506,7 +506,7 @@ namespace Opm {
double refDepth = record->getItem("REF_DEPTH")->getSIDouble(0);
Phase::PhaseEnum preferredPhase = Phase::PhaseEnumFromString(record->getItem("PHASE")->getTrimmedString(0));
WellPtr well(new Well(wellName, headI, headJ, refDepth, preferredPhase, m_timeMap , timeStep));
m_wells[ wellName ] = well;
m_wells.insert( wellName , well);
}
size_t Schedule::numWells() const {
@ -514,14 +514,11 @@ namespace Opm {
}
bool Schedule::hasWell(const std::string& wellName) const {
return m_wells.find(wellName) != m_wells.end();
return m_wells.hasKey( wellName );
}
WellPtr Schedule::getWell(const std::string& wellName) const {
if (hasWell(wellName)) {
return m_wells.at(wellName);
} else
throw std::invalid_argument("Well: " + wellName + " does not exist");
return m_wells.get( wellName );
}
std::vector<WellConstPtr> Schedule::getWells() const {
@ -535,7 +532,7 @@ namespace Opm {
std::vector<WellConstPtr> wells;
for (auto iter = m_wells.begin(); iter != m_wells.end(); ++iter) {
WellConstPtr well = (*iter).second;
WellConstPtr well = *iter;
if (well->hasBeenDefined(timeStep)) {
wells.push_back(well);
}

View File

@ -24,6 +24,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/DynamicState.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Group.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/OrderedMap.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <memory>
@ -56,7 +57,7 @@ namespace Opm
private:
TimeMapPtr m_timeMap;
std::map<std::string , WellPtr> m_wells;
OrderedMap<WellPtr> m_wells;
std::map<std::string , GroupPtr> m_groups;
std::shared_ptr<DynamicState<GroupTreePtr> > m_rootGroupTree;

View File

@ -70,6 +70,22 @@ DeckPtr createDeckWithWells() {
}
DeckPtr createDeckWithWellsOrdered() {
Opm::Parser parser;
std::string input =
"START -- 0 \n"
"10 MAI 2007 / \n"
"SCHEDULE\n"
"WELSPECS\n"
" \'CW_1\' \'OP\' 30 37 3.33 \'OIL\' 7* / \n"
" \'BW_2\' \'OP\' 30 37 3.33 \'OIL\' 7* / \n"
" \'AW_3\' \'OP\' 20 51 3.92 \'OIL\' 7* / \n"
"/\n";
return parser.parseString(input);
}
BOOST_AUTO_TEST_CASE(CreateScheduleDeckMissingSCHEDULE_Throws) {
DeckPtr deck(new Deck());
@ -86,6 +102,18 @@ BOOST_AUTO_TEST_CASE(CreateScheduleDeckMissingReturnsDefaults) {
}
BOOST_AUTO_TEST_CASE(CreateScheduleDeckWellsOrdered) {
DeckPtr deck = createDeckWithWellsOrdered();
Schedule schedule(deck);
std::vector<WellConstPtr> wells = schedule.getWells();
BOOST_CHECK_EQUAL( "CW_1" , wells[0]->name());
BOOST_CHECK_EQUAL( "BW_2" , wells[1]->name());
BOOST_CHECK_EQUAL( "AW_3" , wells[2]->name());
}
BOOST_AUTO_TEST_CASE(CreateScheduleDeckWithStart) {
DeckPtr deck = createDeck();
Schedule schedule(deck);