From 25fbff263205eb5e5377c2ebba310996baee5652 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 20 Dec 2018 12:27:49 +0100 Subject: [PATCH] Add ParseContext argument to the RPTxxx parsing --- .../eclipse/EclipseState/EclipseConfig.hpp | 3 +- .../EclipseState/IOConfig/RestartConfig.hpp | 9 ++- .../eclipse/EclipseState/EclipseConfig.cpp | 4 +- .../eclipse/EclipseState/EclipseState.cpp | 2 +- .../EclipseState/IOConfig/RestartConfig.cpp | 29 ++++--- tests/parser/IOConfigTests.cpp | 5 +- tests/parser/RestartConfigTests.cpp | 81 +++++++++++-------- 7 files changed, 75 insertions(+), 58 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/EclipseConfig.hpp b/opm/parser/eclipse/EclipseState/EclipseConfig.hpp index f328309c4..ab11ee064 100644 --- a/opm/parser/eclipse/EclipseState/EclipseConfig.hpp +++ b/opm/parser/eclipse/EclipseState/EclipseConfig.hpp @@ -29,11 +29,12 @@ namespace Opm { class Deck; + class ParseContext; class EclipseConfig { public: - EclipseConfig(const Deck& deck); + EclipseConfig(const Deck& deck, const ParseContext& parseContext); const InitConfig& init() const; const IOConfig& io() const; diff --git a/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.hpp b/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.hpp index e708848b1..bd0f6fe27 100644 --- a/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.hpp +++ b/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.hpp @@ -200,7 +200,7 @@ namespace Opm { class SOLUTIONSection; class TimeMap; class Schedule; - + class ParseContext; /*The IOConfig class holds data about input / ouput configurations @@ -317,9 +317,10 @@ namespace Opm { public: RestartConfig(); - explicit RestartConfig( const Deck& ); + explicit RestartConfig( const Deck&, const ParseContext& parseContext ); RestartConfig( const SCHEDULESection& schedule, const SOLUTIONSection& solution, + const ParseContext& parseContext, TimeMap timemap ); @@ -329,7 +330,7 @@ namespace Opm { int getKeyword( const std::string& keyword, size_t timeStep) const; void overrideRestartWriteInterval(size_t interval); - void handleSolutionSection(const SOLUTIONSection& solutionSection); + void handleSolutionSection(const SOLUTIONSection& solutionSection, const ParseContext& parseContext); void setWriteInitialRestartFile(bool writeInitialRestartFile); RestartSchedule getNode( size_t timestep ) const; @@ -356,7 +357,7 @@ namespace Opm { int m_first_restart_step; bool m_write_initial_RST_file = false; - void handleScheduleSection( const SCHEDULESection& schedule); + void handleScheduleSection( const SCHEDULESection& schedule, const ParseContext& parseContext); void update( size_t step, const RestartSchedule& rs); static RestartSchedule rptsched( const DeckKeyword& ); diff --git a/src/opm/parser/eclipse/EclipseState/EclipseConfig.cpp b/src/opm/parser/eclipse/EclipseState/EclipseConfig.cpp index 08a4e05c7..e178d98ea 100644 --- a/src/opm/parser/eclipse/EclipseState/EclipseConfig.cpp +++ b/src/opm/parser/eclipse/EclipseState/EclipseConfig.cpp @@ -28,10 +28,10 @@ namespace Opm { - EclipseConfig::EclipseConfig(const Deck& deck) : + EclipseConfig::EclipseConfig(const Deck& deck, const ParseContext& parseContext) : m_ioConfig( deck), m_initConfig( deck), - m_restartConfig( deck ) + m_restartConfig( deck, parseContext ) { } diff --git a/src/opm/parser/eclipse/EclipseState/EclipseState.cpp b/src/opm/parser/eclipse/EclipseState/EclipseState.cpp index a101c3997..ed3eae251 100644 --- a/src/opm/parser/eclipse/EclipseState/EclipseState.cpp +++ b/src/opm/parser/eclipse/EclipseState/EclipseState.cpp @@ -53,7 +53,7 @@ namespace Opm { m_parseContext( parseContext ), m_tables( deck ), m_runspec( deck ), - m_eclipseConfig( deck ), + m_eclipseConfig( deck, parseContext ), m_deckUnitSystem( deck.getActiveUnitSystem() ), m_inputNnc( deck ), m_inputEditNnc( deck ), diff --git a/src/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.cpp b/src/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.cpp index f3e066320..dd3f408e6 100644 --- a/src/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.cpp +++ b/src/opm/parser/eclipse/EclipseState/IOConfig/RestartConfig.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -294,6 +295,7 @@ RPTSCHED_integer( const std::vector< int >& ints ) { template< typename F, typename G > inline std::map< std::string, int > RPT( const DeckKeyword& keyword, + const ParseContext& parseContext, F is_mnemonic, G integer_mnemonic ) { @@ -348,8 +350,8 @@ inline void expand_RPTRST_mnemonics(std::map< std::string, int >& mnemonics) { inline std::pair< std::map< std::string, int >, RestartSchedule > -RPTRST( const DeckKeyword& keyword, RestartSchedule prev, size_t step ) { - auto mnemonics = RPT( keyword, is_RPTRST_mnemonic, RPTRST_integer ); +RPTRST( const DeckKeyword& keyword, const ParseContext& parseContext, RestartSchedule prev, size_t step ) { + auto mnemonics = RPT( keyword, parseContext, is_RPTRST_mnemonic, RPTRST_integer ); const bool has_freq = mnemonics.find( "FREQ" ) != mnemonics.end(); const bool has_basic = mnemonics.find( "BASIC" ) != mnemonics.end(); @@ -365,8 +367,8 @@ RPTRST( const DeckKeyword& keyword, RestartSchedule prev, size_t step ) { } inline std::pair< std::map< std::string, int >, RestartSchedule > -RPTSCHED( const DeckKeyword& keyword ) { - auto mnemonics = RPT( keyword, is_RPTSCHED_mnemonic, RPTSCHED_integer ); +RPTSCHED( const DeckKeyword& keyword, const ParseContext& parseContext ) { + auto mnemonics = RPT( keyword, parseContext, is_RPTSCHED_mnemonic, RPTSCHED_integer ); if( mnemonics.count( "NOTHING" ) ) return { std::move( mnemonics ), { RestartSchedule(0) } }; @@ -379,7 +381,7 @@ RPTSCHED( const DeckKeyword& keyword ) { -void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule) { +void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule, const ParseContext& parseContext) { size_t current_step = 1; RestartSchedule unset; @@ -413,9 +415,8 @@ void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule) { const bool is_RPTRST = name == "RPTRST"; const auto& prev_sched = this->restart_schedule.back(); - auto config = is_RPTRST - ? RPTRST( keyword, prev_sched, current_step ) - : RPTSCHED( keyword ); + auto config = is_RPTRST ? RPTRST( keyword, parseContext, prev_sched, current_step ) + : RPTSCHED( keyword , parseContext); /* add the missing entries from the previous step */ { @@ -473,15 +474,17 @@ void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule) { - RestartConfig::RestartConfig( const Deck& deck ) : + RestartConfig::RestartConfig( const Deck& deck, const ParseContext& parseContext ) : RestartConfig( SCHEDULESection( deck ), SOLUTIONSection( deck ), + parseContext, TimeMap{ deck } ) {} RestartConfig::RestartConfig( const SCHEDULESection& schedule, const SOLUTIONSection& solution, + const ParseContext& parseContext, TimeMap timemap) : m_timemap( std::move( timemap ) ), m_first_restart_step( -1 ), @@ -489,8 +492,8 @@ void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule) { restart_keywords( m_timemap, {} ), save_keywords( m_timemap.size(), false ) { - handleSolutionSection( solution ); - handleScheduleSection( schedule ); + handleSolutionSection( solution, parseContext ); + handleScheduleSection( schedule, parseContext ); initFirstOutput( ); } @@ -561,11 +564,11 @@ void RestartConfig::handleScheduleSection(const SCHEDULESection& schedule) { } - void RestartConfig::handleSolutionSection(const SOLUTIONSection& solutionSection) { + void RestartConfig::handleSolutionSection(const SOLUTIONSection& solutionSection, const ParseContext& parseContext) { if (solutionSection.hasKeyword("RPTRST")) { const auto& rptrstkeyword = solutionSection.getKeyword("RPTRST"); - const auto rptrst = RPTRST( rptrstkeyword, {}, 0 ); + const auto rptrst = RPTRST( rptrstkeyword, parseContext, {}, 0 ); this->restart_keywords.updateInitial( rptrst.first ); this->restart_schedule.updateInitial( rptrst.second ); setWriteInitialRestartFile(true); // Guessing on eclipse rules for write of initial RESTART file (at time 0): diff --git a/tests/parser/IOConfigTests.cpp b/tests/parser/IOConfigTests.cpp index e6f122331..67e6620fd 100644 --- a/tests/parser/IOConfigTests.cpp +++ b/tests/parser/IOConfigTests.cpp @@ -188,9 +188,10 @@ BOOST_AUTO_TEST_CASE(DefaultProperties) { " 1 JAN 1986 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); + ParseContext ctx; + auto deck = Parser().parseString( data, ctx ); IOConfig ioConfig( deck ); - RestartConfig rstConfig( deck ); + RestartConfig rstConfig( deck, ctx ); /*If no GRIDFILE nor NOGGF keywords are specified, default output an EGRID file*/ BOOST_CHECK( ioConfig.getWriteEGRIDFile() ); diff --git a/tests/parser/RestartConfigTests.cpp b/tests/parser/RestartConfigTests.cpp index 4b4e65deb..e71c8a8b6 100644 --- a/tests/parser/RestartConfigTests.cpp +++ b/tests/parser/RestartConfigTests.cpp @@ -72,7 +72,7 @@ BOOST_AUTO_TEST_CASE(RPTSCHED_INTEGER) { ParseContext ctx; auto deck1 = parser.parseString( deckData1, ctx ); - RestartConfig rstConfig1( deck1 ); + RestartConfig rstConfig1( deck1, ctx ); BOOST_CHECK( rstConfig1.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig1.getWriteRestartFile( 1 ) ); @@ -254,8 +254,9 @@ BOOST_AUTO_TEST_CASE(RPTRST_mixed_mnemonics_int_list) { "BASIC=1\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - BOOST_CHECK_THROW( RestartConfig c( deck ), std::runtime_error ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + BOOST_CHECK_THROW( RestartConfig c( deck, parseContext ), std::runtime_error ); } BOOST_AUTO_TEST_CASE(RPTRST) { @@ -327,7 +328,7 @@ BOOST_AUTO_TEST_CASE(RPTRST) { ParseContext ctx; auto deck1 = parser.parseString( deckData1, ctx ); - RestartConfig rstConfig1( deck1 ); + RestartConfig rstConfig1( deck1, ctx ); // Observe that this is true due to some undocumented guessing that // the initial restart file should be written if a RPTRST keyword is @@ -347,7 +348,7 @@ BOOST_AUTO_TEST_CASE(RPTRST) { BOOST_CHECK_EQUAL( rstConfig1.getKeyword( "ALLPROPS" , 2 ) , 0); auto deck2 = parser.parseString( deckData2, ctx ); - RestartConfig rstConfig2( deck2 ); + RestartConfig rstConfig2( deck2, ctx ); const auto expected2 = { "BASIC", "FLOWS", "FREQ" }; const auto kw_list2 = fun::map( fst, rstConfig2.getRestartKeywords( 2 ) ); @@ -360,7 +361,7 @@ BOOST_AUTO_TEST_CASE(RPTRST) { BOOST_CHECK( !rstConfig2.getWriteRestartFile( 3 ) ); auto deck3 = parser.parseString( deckData3, ctx ); - RestartConfig rstConfig3( deck3 ); + RestartConfig rstConfig3( deck3, ctx ); BOOST_CHECK( !rstConfig3.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig3.getWriteRestartFile( 1 ) ); @@ -456,7 +457,7 @@ BOOST_AUTO_TEST_CASE(RPTSCHED) { ParseContext ctx; auto deck1 = parser.parseString( deckData1, ctx ); - RestartConfig rstConfig1( deck1 ); + RestartConfig rstConfig1( deck1, ctx ); BOOST_CHECK( !rstConfig1.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig1.getWriteRestartFile( 1 ) ); @@ -465,7 +466,7 @@ BOOST_AUTO_TEST_CASE(RPTSCHED) { auto deck2 = parser.parseString( deckData2, ctx ); - RestartConfig rstConfig2( deck2 ); + RestartConfig rstConfig2( deck2, ctx ); BOOST_CHECK( !rstConfig2.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig2.getWriteRestartFile( 1 ) ); @@ -479,7 +480,7 @@ BOOST_AUTO_TEST_CASE(RPTSCHED) { auto deck3 = parser.parseString( deckData3, ctx ); - RestartConfig rstConfig3( deck3 ); + RestartConfig rstConfig3( deck3, ctx ); //Older ECLIPSE 100 data set may use integer controls instead of mnemonics BOOST_CHECK( rstConfig3.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig3.getWriteRestartFile( 1 ) ); @@ -522,7 +523,7 @@ BOOST_AUTO_TEST_CASE(RPTSCHED_and_RPTRST) { ParseContext ctx; auto deck = parser.parseString( deckData, ctx ); - RestartConfig rstConfig( deck ); + RestartConfig rstConfig( deck, ctx ); BOOST_CHECK( !rstConfig.getWriteRestartFile( 0 ) ); BOOST_CHECK( !rstConfig.getWriteRestartFile( 1 ) ); @@ -551,8 +552,9 @@ BOOST_AUTO_TEST_CASE(NO_BASIC) { "RPTSCHED\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); for( size_t ts = 0; ts < 4; ++ts ) BOOST_CHECK( !ioConfig.getWriteRestartFile( ts ) ); @@ -582,8 +584,9 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_1) { "BASIC=1\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); for( size_t ts = 0; ts < 3; ++ts ) BOOST_CHECK( !ioConfig.getWriteRestartFile( ts ) ); @@ -617,8 +620,9 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_3) { " 6 JAN 1982 14:56:45.123 /\n" // timestep 11 "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); const size_t freq = 3; @@ -654,8 +658,9 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_4) { " 6 JAN 1983 14:56:45.123 /\n" // timestep 12 "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); /* BASIC=4, restart file is written at the first report step of each year. */ @@ -692,8 +697,9 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_4_FREQ_2) { " 1 JAN 1986 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); /* BASIC=4, restart file is written at the first report step of each year. * Optionally, if the mnemonic FREQ is set >1 the restart is written only @@ -729,13 +735,14 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_5) { " 1 JAN 1982 /\n" " 2 JAN 1982 /\n" " 1 FEB 1982 /\n" // write - " 1 MAR 1982 /\n" + " 1 MAR 1982 /\n" " 1 APR 1983 /\n" //write " 2 JUN 1983 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); /* BASIC=5, restart file is written at the first report step of each month. */ @@ -772,8 +779,9 @@ BOOST_AUTO_TEST_CASE(BASIC_EQ_0) { " 2 JUN 1983 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext) ; + RestartConfig ioConfig( deck, parseContext ); /* RESTART=0, no restart file is written */ @@ -808,8 +816,9 @@ BOOST_AUTO_TEST_CASE(RESTART_EQ_0) { " 2 JUN 1983 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext); + RestartConfig ioConfig( deck, parseContext ); /* RESTART=0, no restart file is written */ @@ -845,11 +854,12 @@ BOOST_AUTO_TEST_CASE(RESTART_BASIC_GT_2) { " 26 MAY 1984 /\n" " 26 MAY 1985 /\n" // write " 27 MAY 1985 /\n" - " 1 JAN 1986 /\n" + " 1 JAN 1986 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); for( size_t ts : { 1, 2, 3, 4, 5, 7, 8, 10, 11 } ) BOOST_CHECK( !ioConfig.getWriteRestartFile( ts ) ); @@ -889,8 +899,9 @@ BOOST_AUTO_TEST_CASE(RESTART_BASIC_LEQ_2) { " 1 JAN 1986 /\n" "/\n"; - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); BOOST_CHECK( ioConfig.getWriteRestartFile( 1 ) ); for( size_t ts = 2; ts < 11; ++ts ) @@ -924,9 +935,9 @@ BOOST_AUTO_TEST_CASE(RESTART_SAVE) { "SAVE \n" "TSTEP \n" " 1 /\n"; - - auto deck = Parser().parseString( data, ParseContext() ); - RestartConfig ioConfig( deck ); + ParseContext parseContext; + auto deck = Parser().parseString( data, parseContext ); + RestartConfig ioConfig( deck, parseContext ); for( size_t ts = 1; ts < 11; ++ts ) BOOST_CHECK( !ioConfig.getWriteRestartFile( ts ) );