diff --git a/opm/parser/eclipse/Applications/opm-eclkw.cpp b/opm/parser/eclipse/Applications/opm-eclkw.cpp index cff037265..6e139226f 100644 --- a/opm/parser/eclipse/Applications/opm-eclkw.cpp +++ b/opm/parser/eclipse/Applications/opm-eclkw.cpp @@ -71,7 +71,7 @@ static void printItems(Opm::ParserKeywordConstPtr keyword) std::string indent = " "; std::cout << std::endl; std::cout << indent << "List of items:" << std::endl; - Opm::ParserRecordPtr parserRecord = keyword->getRecord(); + Opm::ParserRecordPtr parserRecord = keyword->getRecord(0); for (auto iterator = parserRecord->begin(); iterator != parserRecord->end(); ++iterator) { Opm::ParserItemConstPtr item = *iterator; printItem(item, indent); diff --git a/opm/parser/eclipse/IntegrationTests/IntegrationTests.cpp b/opm/parser/eclipse/IntegrationTests/IntegrationTests.cpp index 46b2cedd1..c58e093fe 100644 --- a/opm/parser/eclipse/IntegrationTests/IntegrationTests.cpp +++ b/opm/parser/eclipse/IntegrationTests/IntegrationTests.cpp @@ -35,7 +35,7 @@ using namespace Opm; static ParserPtr createWWCTParser() { ParserKeywordPtr parserKeyword = ParserKeyword::createDynamicSized("WWCT"); { - ParserRecordPtr wwctRecord = parserKeyword->getRecord(); + ParserRecordPtr wwctRecord = parserKeyword->getRecord(0); wwctRecord->addItem(ParserStringItemConstPtr(new ParserStringItem("WELL", ALL))); } ParserKeywordPtr summaryKeyword = ParserKeyword::createFixedSized("SUMMARY" , (size_t) 0); @@ -126,7 +126,7 @@ BOOST_AUTO_TEST_CASE(parser_internal_name_vs_deck_name) { static ParserPtr createBPRParser() { ParserKeywordPtr parserKeyword = ParserKeyword::createDynamicSized("BPR"); { - ParserRecordPtr bprRecord = parserKeyword->getRecord(); + ParserRecordPtr bprRecord = parserKeyword->getRecord(0); bprRecord->addItem(ParserIntItemConstPtr(new ParserIntItem("I", SINGLE))); bprRecord->addItem(ParserIntItemConstPtr(new ParserIntItem("J", SINGLE))); bprRecord->addItem(ParserIntItemConstPtr(new ParserIntItem("K", SINGLE))); @@ -239,7 +239,7 @@ BOOST_AUTO_TEST_CASE(parse_truncatedrecords_deckFilledWithDefaults) { BOOST_CHECK_EQUAL(lastItem_1->getInt(0), 1); ParserKeywordConstPtr parserKeyword = parser->getParserKeywordFromDeckName("RADFIN4"); - ParserRecordConstPtr parserRecord = parserKeyword->getRecord(); + ParserRecordConstPtr parserRecord = parserKeyword->getRecord(0); ParserItemConstPtr nwmaxItem = parserRecord->get("NWMAX"); ParserIntItemConstPtr intItem = std::static_pointer_cast(nwmaxItem); diff --git a/opm/parser/eclipse/Parser/Parser.cpp b/opm/parser/eclipse/Parser/Parser.cpp index 543217c5a..8d2ff1d42 100644 --- a/opm/parser/eclipse/Parser/Parser.cpp +++ b/opm/parser/eclipse/Parser/Parser.cpp @@ -372,7 +372,7 @@ namespace Opm { targetSize = sizeDefinitionItem->getInt(0); } else { auto keyword = getKeyword( sizeKeyword.first ); - auto record = keyword->getRecord(); + auto record = keyword->getRecord(0); auto int_item = std::dynamic_pointer_cast( record->get( sizeKeyword.second ) ); targetSize = int_item->getDefault( ); diff --git a/opm/parser/eclipse/Parser/ParserKeyword.cpp b/opm/parser/eclipse/Parser/ParserKeyword.cpp index d8c265e2f..8e4f70f55 100644 --- a/opm/parser/eclipse/Parser/ParserKeyword.cpp +++ b/opm/parser/eclipse/Parser/ParserKeyword.cpp @@ -37,10 +37,13 @@ namespace Opm { m_isDataKeyword = false; m_isTableCollection = false; m_name = name; - m_record = ParserRecordPtr(new ParserRecord); m_keywordSizeType = sizeType; m_Description = ""; + { + std::shared_ptr record = std::make_shared(); + m_records.push_back( record ); + } m_deckNames.insert(m_name); } @@ -71,9 +74,11 @@ namespace Opm { } bool ParserKeyword::hasDimension() const { - return m_record->hasDimension(); + std::shared_ptr record = getRecord(0); + return record->hasDimension(); } + bool ParserKeyword::isTableCollection() const { return m_isTableCollection; } @@ -262,12 +267,15 @@ namespace Opm { void ParserKeyword::addItem(ParserItemConstPtr item) { if (m_isDataKeyword) throw std::invalid_argument("Keyword " + getName() + " is already configured as a data keyword; cannot add items."); - - m_record->addItem(item); + { + std::shared_ptr record = getRecord(0); + record->addItem(item); + } } void ParserKeyword::addDataItem(ParserItemConstPtr item) { - if (m_record->size()) + std::shared_ptr record = getRecord(0); + if (record->size()) throw std::invalid_argument("Keyword " + getName() + " already contains all specified items; cannot add a data item."); if ((m_keywordSizeType == FIXED) && (m_fixedSize == 1U)) { @@ -469,8 +477,8 @@ namespace Opm { throw std::invalid_argument("The 'value_type' JSON item of keyword "+getName()+" is missing"); } - ParserRecordPtr ParserKeyword::getRecord() const { - return m_record; + ParserRecordPtr ParserKeyword::getRecord(size_t recordIndex) const { + return m_records.get( recordIndex ); } @@ -479,7 +487,8 @@ namespace Opm { } size_t ParserKeyword::numItems() const { - return m_record->size(); + auto record = getRecord(0); + return record->size(); } void ParserKeyword::clearValidSectionNames() { @@ -511,12 +520,13 @@ namespace Opm { } DeckKeywordPtr ParserKeyword::parse(RawKeywordConstPtr rawKeyword) const { + std::shared_ptr record = getRecord(0); if (rawKeyword->isFinished()) { DeckKeywordPtr keyword(new DeckKeyword(rawKeyword->getKeywordName())); keyword->setLocation(rawKeyword->getFilename(), rawKeyword->getLineNR()); keyword->setDataKeyword( isDataKeyword() ); for (size_t i = 0; i < rawKeyword->size(); i++) { - DeckRecordConstPtr deckRecord = m_record->parse(rawKeyword->getRecord(i)); + DeckRecordConstPtr deckRecord = record->parse(rawKeyword->getRecord(i)); keyword->addRecord(deckRecord); } return keyword; @@ -588,32 +598,36 @@ namespace Opm { // compare the deck names. we don't care about the ordering of the strings. if (m_deckNames != other.m_deckNames) return false; + { + std::shared_ptr record = getRecord(0); + std::shared_ptr other_record = other.getRecord(0); - if ((m_name == other.m_name) && - (m_matchRegexString == other.m_matchRegexString) && - (m_record->equal(*(other.m_record))) && - (m_keywordSizeType == other.m_keywordSizeType) && - (m_isDataKeyword == other.m_isDataKeyword) && - (m_isTableCollection == other.m_isTableCollection)) { - bool equal_ = false; - switch (m_keywordSizeType) { + if ((m_name == other.m_name) && + (m_matchRegexString == other.m_matchRegexString) && + (record->equal(*(other_record))) && + (m_keywordSizeType == other.m_keywordSizeType) && + (m_isDataKeyword == other.m_isDataKeyword) && + (m_isTableCollection == other.m_isTableCollection)) { + + bool equal_ = false; + switch (m_keywordSizeType) { case FIXED: if (m_fixedSize == other.m_fixedSize) equal_ = true; break; case OTHER_KEYWORD_IN_DECK: if ((m_sizeDefinitionPair.first == other.m_sizeDefinitionPair.first) && - (m_sizeDefinitionPair.second == other.m_sizeDefinitionPair.second)) + (m_sizeDefinitionPair.second == other.m_sizeDefinitionPair.second)) equal_ = true; break; default: equal_ = true; break; - - } - return equal_; - } else - return false; + } + return equal_; + } else + return false; + } } void ParserKeyword::inlineNew(std::ostream& os, const std::string& lhs, const std::string& indent) const { @@ -661,28 +675,31 @@ namespace Opm { if (hasMatchRegex()) os << indent << lhs << "->setMatchRegex(\"" << m_matchRegexString << "\");" << std::endl; - for (size_t i = 0; i < m_record->size(); i++) { - const std::string local_indent = indent + " "; - ParserItemConstPtr item = m_record->get(i); - os << local_indent << "ParserItemPtr "<name()<<"item("; - item->inlineNew(os); - os << ");" << std::endl; - os << local_indent << item->name()<<"item->setDescription(\"" << item->getDescription() << "\");" << std::endl; - for (size_t idim=0; idim < item->numDimensions(); idim++) - os << local_indent <name()<<"item->push_backDimension(\"" << item->getDimension( idim ) << "\");" << std::endl; - { - std::string addItemMethod = "addItem"; - if (m_isDataKeyword) - addItemMethod = "addDataItem"; + { + std::shared_ptr record = getRecord(0); + for (size_t i = 0; i < record->size(); i++) { + const std::string local_indent = indent + " "; + ParserItemConstPtr item = record->get(i); + os << local_indent << "ParserItemPtr "<name()<<"item("; + item->inlineNew(os); + os << ");" << std::endl; + os << local_indent << item->name()<<"item->setDescription(\"" << item->getDescription() << "\");" << std::endl; + for (size_t idim=0; idim < item->numDimensions(); idim++) + os << local_indent <name()<<"item->push_backDimension(\"" << item->getDimension( idim ) << "\");" << std::endl; + { + std::string addItemMethod = "addItem"; + if (m_isDataKeyword) + addItemMethod = "addDataItem"; - os << local_indent << lhs << "->" << addItemMethod << "("<name()<<"item);" << std::endl; + os << local_indent << lhs << "->" << addItemMethod << "("<name()<<"item);" << std::endl; + } } } } void ParserKeyword::applyUnitsToDeck(std::shared_ptr deck , std::shared_ptr deckKeyword) const { - std::shared_ptr parserRecord = getRecord(); + std::shared_ptr parserRecord = getRecord(0); for (size_t index = 0; index < deckKeyword->size(); index++) { std::shared_ptr deckRecord = deckKeyword->getRecord(index); parserRecord->applyUnitsToDeck( deck , deckRecord); diff --git a/opm/parser/eclipse/Parser/ParserKeyword.hpp b/opm/parser/eclipse/Parser/ParserKeyword.hpp index c769f5fc6..8746d73df 100644 --- a/opm/parser/eclipse/Parser/ParserKeyword.hpp +++ b/opm/parser/eclipse/Parser/ParserKeyword.hpp @@ -40,6 +40,7 @@ #include #include +#include namespace Opm { @@ -105,7 +106,7 @@ namespace Opm { void setMatchRegex(const std::string& deckNameRegexp); bool matches(const std::string& deckKeywordName) const; bool hasDimension() const; - ParserRecordPtr getRecord() const; + ParserRecordPtr getRecord(size_t recordIndex) const; const std::string& getName() const; size_t getFixedSize() const; bool hasFixedSize() const; @@ -147,7 +148,7 @@ namespace Opm { #else boost::regex m_matchRegex; #endif - ParserRecordPtr m_record; + ElasticVector m_records; enum ParserKeywordSizeEnum m_keywordSizeType; size_t m_fixedSize; bool m_isDataKeyword; diff --git a/opm/parser/eclipse/Parser/createDefaultKeywordList.cpp b/opm/parser/eclipse/Parser/createDefaultKeywordList.cpp index d01b117d4..d960b831d 100644 --- a/opm/parser/eclipse/Parser/createDefaultKeywordList.cpp +++ b/opm/parser/eclipse/Parser/createDefaultKeywordList.cpp @@ -121,7 +121,7 @@ static void testKeyword(ParserKeywordConstPtr parserKeyword , const std::string& of << "BOOST_CHECK( parserKeyword->equal( *inlineKeyword));" << std::endl; if (parserKeyword->hasDimension()) { of << "{" << std::endl; - of << " ParserRecordConstPtr parserRecord = parserKeyword->getRecord();" << std::endl; + of << " ParserRecordConstPtr parserRecord = parserKeyword->getRecord(0);" << std::endl; of << " for (size_t i=0; i < parserRecord->size(); i++) { " << std::endl; of << " ParserItemConstPtr item = parserRecord->get( i );" << std::endl; of << " for (size_t j=0; j < item->numDimensions(); j++) {" << std::endl; diff --git a/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp b/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp index 0ca2a7186..2b051f03a 100644 --- a/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp +++ b/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp @@ -253,7 +253,7 @@ BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_ItemInvalidEnum_throws) { BOOST_AUTO_TEST_CASE(ConstructFromJsonObjectItemsOK) { Json::JsonObject jsonObject("{\"name\": \"BPR\", \"sections\":[\"SUMMARY\"], \"size\" : 100 , \"items\" : [{\"name\" : \"I\", \"value_type\" : \"INT\"}]}"); ParserKeywordConstPtr parserKeyword = ParserKeyword::createFromJson(jsonObject); - ParserRecordConstPtr record = parserKeyword->getRecord(); + ParserRecordConstPtr record = parserKeyword->getRecord(0); ParserItemConstPtr item = record->get( 0 ); BOOST_CHECK_EQUAL( 1U , record->size( ) ); BOOST_CHECK_EQUAL( "I" , item->name( ) ); @@ -279,7 +279,7 @@ BOOST_AUTO_TEST_CASE(AddDataKeywordFromJson_defaultThrows) { BOOST_AUTO_TEST_CASE(AddDataKeywordFromJson_correctlyConfigured) { Json::JsonObject jsonConfig("{\"name\": \"ACTNUM\", \"sections\":[\"GRID\"], \"data\" : {\"value_type\": \"INT\"}}"); ParserKeywordConstPtr parserKeyword = ParserKeyword::createFromJson(jsonConfig); - ParserRecordConstPtr parserRecord = parserKeyword->getRecord(); + ParserRecordConstPtr parserRecord = parserKeyword->getRecord(0); ParserItemConstPtr item = parserRecord->get(0); @@ -300,7 +300,7 @@ BOOST_AUTO_TEST_CASE(AddkeywordFromJson_numTables_incoorect_throw) { BOOST_AUTO_TEST_CASE(AddkeywordFromJson_isTableCollection) { Json::JsonObject jsonConfig("{\"name\": \"PVTG\", \"sections\":[\"PROPS\"], \"num_tables\" : {\"keyword\": \"TABDIMS\" , \"item\" : \"NTPVT\"} , \"items\" : [{\"name\" : \"data\", \"value_type\" : \"DOUBLE\"}]}"); ParserKeywordConstPtr parserKeyword = ParserKeyword::createFromJson(jsonConfig); - ParserRecordConstPtr parserRecord = parserKeyword->getRecord(); + ParserRecordConstPtr parserRecord = parserKeyword->getRecord(0); BOOST_CHECK_EQUAL( true , parserKeyword->isTableCollection() ); @@ -422,7 +422,7 @@ BOOST_AUTO_TEST_CASE(ParseKeywordHasDimensionCorrect) { BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimension) { Json::JsonObject jsonObject("{\"name\": \"BPR\", \"sections\":[\"SUMMARY\"], \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\" , \"dimension\" : \"Length*Length/Time\"}]}"); ParserKeywordPtr parserKeyword = ParserKeyword::createFromJson(jsonObject); - ParserRecordConstPtr record = parserKeyword->getRecord(); + ParserRecordConstPtr record = parserKeyword->getRecord(0); ParserItemConstPtr item = record->get("ItemX"); BOOST_CHECK_EQUAL("BPR" , parserKeyword->getName()); @@ -438,7 +438,7 @@ BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimension) { BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimensionList) { Json::JsonObject jsonObject("{\"name\": \"BPR\", \"sections\":[\"SUMMARY\"], \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"ALL\" , \"value_type\" : \"DOUBLE\" , \"dimension\" : [\"Length*Length/Time\" , \"Time\", \"1\"]}]}"); ParserKeywordPtr parserKeyword = ParserKeyword::createFromJson(jsonObject); - ParserRecordConstPtr record = parserKeyword->getRecord(); + ParserRecordConstPtr record = parserKeyword->getRecord(0); ParserItemConstPtr item = record->get("ItemX"); BOOST_CHECK_EQUAL("BPR" , parserKeyword->getName()); diff --git a/opm/parser/eclipse/Parser/tests/ParserTests.cpp b/opm/parser/eclipse/Parser/tests/ParserTests.cpp index 6a2ebcaa5..abe9f1ad2 100644 --- a/opm/parser/eclipse/Parser/tests/ParserTests.cpp +++ b/opm/parser/eclipse/Parser/tests/ParserTests.cpp @@ -293,7 +293,7 @@ BOOST_AUTO_TEST_CASE(WildCardTest) { static ParserKeywordPtr __attribute__((unused)) setupParserKeywordInt(std::string name, int numberOfItems) { ParserKeywordPtr parserKeyword = ParserKeyword::createDynamicSized(name); - ParserRecordPtr parserRecord = parserKeyword->getRecord(); + ParserRecordPtr parserRecord = parserKeyword->getRecord(0); for (int i = 0; i < numberOfItems; i++) { std::string another_name = "ITEM_" + boost::lexical_cast(i);