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:
@@ -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");
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user