Handle missing xxxDIMS keywords

For some keywords the number of records is given as the value of an item
in another keyword, for instance the number of records in the EQUIL
keyword is given by NTEQUL item in the EQLDIMS keyword.

If the EQLDIMS keyword is not given in the deck the Parser will consult
the default values of EQLDIMS keyword; i.e. a missing keyword is treated
as all-defaulted.
This commit is contained in:
Joakim Hove
2015-02-06 13:04:17 +01:00
parent af249cefd7
commit eda7b60f54
2 changed files with 34 additions and 6 deletions

View File

@@ -35,6 +35,24 @@ using namespace Opm;
BOOST_AUTO_TEST_CASE( parse_EQUIL_MISSING_DIMS ) {
Parser parser;
const std::string equil = "EQUIL\n"
"2469 382.4 1705.0 0.0 500 0.0 1 1 20 /";
std::shared_ptr<const Deck> deck = parser.parseString(equil);
DeckKeywordConstPtr kw1 = deck->getKeyword("EQUIL" , 0);
BOOST_CHECK_EQUAL( 1U , kw1->size() );
DeckRecordConstPtr rec1 = kw1->getRecord(0);
DeckItemPtr item1 = rec1->getItem("OWC");
DeckItemPtr item1_index = rec1->getItem(2);
BOOST_CHECK_EQUAL( item1 , item1_index );
BOOST_CHECK( fabs(item1->getSIDouble(0) - 1705) < 0.001);
}
BOOST_AUTO_TEST_CASE( parse_EQUIL_OK ) {
ParserPtr parser(new Parser());
boost::filesystem::path pvtgFile("testdata/integration_tests/EQUIL/EQUIL1");

View File

@@ -21,6 +21,7 @@
#include <opm/parser/eclipse/Log/Logger.hpp>
#include <opm/parser/eclipse/Parser/ParserIntItem.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Parser/ParserKeyword.hpp>
#include <opm/parser/eclipse/RawDeck/RawConsts.hpp>
@@ -360,13 +361,22 @@ namespace Opm {
targetSize = parserKeyword->getFixedSize();
else {
const std::pair<std::string, std::string> sizeKeyword = parserKeyword->getSizeDefinitionPair();
DeckKeywordConstPtr sizeDefinitionKeyword = parserState->deck->getKeyword(sizeKeyword.first);
DeckItemPtr sizeDefinitionItem;
{
DeckRecordConstPtr record = sizeDefinitionKeyword->getRecord(0);
sizeDefinitionItem = record->getItem(sizeKeyword.second);
DeckConstPtr deck = parserState->deck;
if (deck->hasKeyword(sizeKeyword.first)) {
DeckKeywordConstPtr sizeDefinitionKeyword = deck->getKeyword(sizeKeyword.first);
DeckItemPtr sizeDefinitionItem;
{
DeckRecordConstPtr record = sizeDefinitionKeyword->getRecord(0);
sizeDefinitionItem = record->getItem(sizeKeyword.second);
}
targetSize = sizeDefinitionItem->getInt(0);
} else {
auto keyword = getKeyword( sizeKeyword.first );
auto record = keyword->getRecord();
auto int_item = std::dynamic_pointer_cast<const ParserIntItem>( record->get( sizeKeyword.second ) );
targetSize = int_item->getDefault( );
}
targetSize = sizeDefinitionItem->getInt(0);
}
return RawKeywordPtr(new RawKeyword(keywordString, parserState->dataFile.string() , parserState->lineNR , targetSize , parserKeyword->isTableCollection()));
}