diff --git a/opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp b/opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp index 891e367a6..affee806f 100644 --- a/opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp +++ b/opm/parser/eclipse/EclipseState/Tables/PlyrockTable.hpp @@ -30,36 +30,21 @@ namespace Opm { friend class TableManager; PlyrockTable() = default; - /*! - * \brief Read the PLYROCK keyword and provide some convenience - * methods for it. - */ - void init(Opm::DeckItemConstPtr item) - { - SimpleTable::init(item, - std::vector{ - "DeadPoreVolume", - "ResidualResistanceFactor", - "RockDensityFactor", - "AdsorbtionIndex", - "MaxAdsorbtion" - }); - // the entries of this keyword cannot be defaulted except for the - // forth. ensure this. - int nRows = numRows(); - int nCols = numColumns(); - for (int rowIdx = 0; rowIdx < nRows; ++rowIdx) { - for (int colIdx = 0; colIdx < nCols; ++colIdx) { - if (m_valueDefaulted[colIdx][rowIdx]) { - if (colIdx == 3) { - m_valueDefaulted[colIdx][rowIdx] = false; - m_columns[colIdx][rowIdx] = 1.0; - } - else - throw std::invalid_argument("The values of the PLYROCK table cannot be defaulted"); - } - } + void init(Opm::DeckRecordConstPtr record) + { + createColumns(std::vector{ + "DeadPoreVolume", + "ResidualResistanceFactor", + "RockDensityFactor", + "AdsorbtionIndex", + "MaxAdsorbtion" + }); + + for (size_t colIdx = 0; colIdx < record->size(); colIdx++) { + auto item = record->getItem( colIdx ); + m_columns[colIdx].push_back( item->getSIDouble(0) ); + m_valueDefaulted[colIdx].push_back( item->defaultApplied(0) ); } } diff --git a/opm/parser/eclipse/EclipseState/Tables/TableManager.cpp b/opm/parser/eclipse/EclipseState/Tables/TableManager.cpp index ad90e4a87..236257907 100644 --- a/opm/parser/eclipse/EclipseState/Tables/TableManager.cpp +++ b/opm/parser/eclipse/EclipseState/Tables/TableManager.cpp @@ -39,7 +39,6 @@ namespace Opm { initSimpleTables(deck, "PVDS", m_pvdsTables); initSimpleTables(deck, "PLYADS", m_plyadsTables); initSimpleTables(deck, "PLYMAX", m_plymaxTables); - initSimpleTables(deck, "PLYROCK", m_plyrockTables); initSimpleTables(deck, "PLYVISC", m_plyviscTables); initSimpleTables(deck, "PLYDHFLF", m_plydhflfTables); initSimpleTables(deck, "OILVISCT", m_oilvisctTables); @@ -51,6 +50,7 @@ namespace Opm { initSimpleTables(deck, "RSVD", m_rsvdTables); initSimpleTables(deck, "RVVD", m_rvvdTables); + initPlyrockTables(deck, "PLYROCK", m_plyrockTables); initPlyshlogTables(deck, "PLYSHLOG", m_plyshlogTables); initRocktabTables(deck); initRTempTables(deck); @@ -160,6 +160,27 @@ namespace Opm { } + void TableManager::initPlyrockTables(const Deck& deck, + const std::string& keywordName, + std::vector& tableVector){ + + if (!deck.hasKeyword(keywordName)) { + return; + } + + if (!deck.numKeywords(keywordName)) { + complainAboutAmbiguousKeyword(deck, keywordName); + return; + } + + const auto& keyword = deck.getKeyword(keywordName); + for( auto iter = keyword->begin(); iter != keyword->end(); ++iter) { + auto record = *iter; + tableVector.push_back( PlyrockTable() ); + tableVector.back().init( record ); + } + } + void TableManager::initRocktabTables(const Deck& deck) { diff --git a/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp b/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp index 7a305395e..ce1d4dd3a 100644 --- a/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp +++ b/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp @@ -111,10 +111,6 @@ namespace Opm { const std::string& keywordName, std::vector& tableVector); - void initPlyshlogTables(const Deck& deck, - const std::string& keywordName, - std::vector& tableVector); - void initVFPProdTables(const Deck& deck, std::map& tableMap); @@ -123,6 +119,15 @@ namespace Opm { std::map& tableMap); + void initPlyrockTables(const Deck& deck, + const std::string& keywordName, + std::vector& tableVector); + + + void initPlyshlogTables(const Deck& deck, + const std::string& keywordName, + std::vector& tableVector); + template void initSimpleTables(const Deck& deck, const std::string& keywordName, diff --git a/opm/parser/eclipse/EclipseState/Tables/tests/TableManagerTests.cpp b/opm/parser/eclipse/EclipseState/Tables/tests/TableManagerTests.cpp index 51c9e50ca..d2634190f 100644 --- a/opm/parser/eclipse/EclipseState/Tables/tests/TableManagerTests.cpp +++ b/opm/parser/eclipse/EclipseState/Tables/tests/TableManagerTests.cpp @@ -35,6 +35,7 @@ // keyword specific table classes #include +#include #include #include #include @@ -1066,8 +1067,32 @@ VFPINJ \n\ } - - +BOOST_AUTO_TEST_CASE( TestPLYROCK ) { + const char *data = + "TABDIMS\n" + " 2 /\n" + "\n" + "PLYROCK\n" + " 1 2 3 4 5 /\n" + " 10 20 30 40 50 /\n"; + + Opm::ParserPtr parser(new Opm::Parser); + Opm::DeckConstPtr deck(parser->parseString(data, Opm::ParseMode())); + Opm::TableManager tables( *deck ); + const std::vector& plyrock = tables.getPlyrockTables(); + + BOOST_CHECK_EQUAL( plyrock.size() , 2 ) ; + const Opm::PlyrockTable& table0 = plyrock[0]; + const Opm::PlyrockTable& table1 = plyrock[1]; + + BOOST_CHECK_EQUAL( table0.numColumns() , 5 ); + BOOST_CHECK_EQUAL( table0.getDeadPoreVolumeColumn()[0] , 1.0 ); + BOOST_CHECK_EQUAL( table0.getMaxAdsorbtionColumn()[0] , 5.0 ); + + BOOST_CHECK_EQUAL( table1.numColumns() , 5 ); + BOOST_CHECK_EQUAL( table1.getDeadPoreVolumeColumn()[0] , 10.0 ); + BOOST_CHECK_EQUAL( table1.getMaxAdsorbtionColumn()[0] , 50.0 ); +}