From a13376c2d1bea9b3950f2a999584e0cbdfd23de5 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Sun, 17 Oct 2021 19:59:29 +0200 Subject: [PATCH] Better error messages when the RESTART keyword is invalid --- CMakeLists_files.cmake | 1 + .../eclipse/EclipseState/EclipseState.cpp | 17 ++++ tests/BASE.UNRST | Bin 0 -> 39912 bytes tests/parser/InitConfigTest.cpp | 87 +++++++++++++++++- 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tests/BASE.UNRST diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index b5af3d043..1f8ef5a57 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -564,6 +564,7 @@ if(ENABLE_ECL_INPUT) tests/UDQ_WCONPROD_GRID.grdecl tests/UDQ_WCONPROD_RESTART.DATA tests/UDQ_WCONPROD.X0006 + tests/BASE.UNRST ) list (APPEND EXAMPLE_SOURCE_FILES examples/opmi.cpp diff --git a/src/opm/parser/eclipse/EclipseState/EclipseState.cpp b/src/opm/parser/eclipse/EclipseState/EclipseState.cpp index e94ec1160..5735eec3b 100644 --- a/src/opm/parser/eclipse/EclipseState/EclipseState.cpp +++ b/src/opm/parser/eclipse/EclipseState/EclipseState.cpp @@ -25,8 +25,10 @@ #include #include #include +#include #include +#include #include #include @@ -151,6 +153,21 @@ AquiferConfig load_aquifers(const Deck& deck, const TableManager& tables, NNC& i if (deck.hasKeyword( "MICPPARA" )) { this->initPara(deck); } + + const auto& init_config = this->getInitConfig(); + if (init_config.restartRequested()) { + const auto& io_config = this->getIOConfig(); + const int report_step = init_config.getRestartStep(); + const auto& restart_file = io_config.getRestartFileName( init_config.getRestartRootName(), report_step, false); + if (!filesystem::exists(restart_file)) + throw std::logic_error(fmt::format("The restart file: {} does not exist", restart_file)); + + if (io_config.getUNIFIN()) { + EclIO::ERst rst{restart_file}; + if (!rst.hasReportStepNumber(report_step)) + throw std::logic_error(fmt::format("Report step: {} not found in restart file: {}", report_step, restart_file)); + } + } } catch (const OpmInputError& opm_error) { OpmLog::error(opm_error.what()); diff --git a/tests/BASE.UNRST b/tests/BASE.UNRST new file mode 100644 index 0000000000000000000000000000000000000000..7bdf08bdf9def09e4a7e70cda9015c82272d94cc GIT binary patch literal 39912 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 literal 0 HcmV?d00001 diff --git a/tests/parser/InitConfigTest.cpp b/tests/parser/InitConfigTest.cpp index c1aa65792..3b512e944 100644 --- a/tests/parser/InitConfigTest.cpp +++ b/tests/parser/InitConfigTest.cpp @@ -34,6 +34,76 @@ using namespace Opm; + +const std::string full_deck1 = R"( +START +7 OCT 2020 / + +RUNSPEC + +DIMENS + 10 10 3 / + +UNIFIN + +GRID +DXV + 10*100.0 / +DYV + 10*100.0 / +DZV + 3*10.0 / + +DEPTHZ + 121*2000.0 / + +PORO + 300*0.3 / + +SOLUTION + +RESTART + NOBASE 6 / + +SCHEDULE +)"; + +const std::string full_deck2 = R"( +START +7 OCT 2020 / + +RUNSPEC + +DIMENS + 10 10 3 / + +UNIFIN + +GRID +DXV + 10*100.0 / +DYV + 10*100.0 / +DZV + 3*10.0 / + +DEPTHZ + 121*2000.0 / + +PORO + 300*0.3 / + +SOLUTION + +RESTART + BASE 6 / + +SCHEDULE +)"; + + + + const std::string& deckStr = "RUNSPEC\n" "DIMENS\n" @@ -117,7 +187,22 @@ const std::string& deckWithEquil = static Deck createDeck(const std::string& input) { Opm::Parser parser; - return parser.parseString(input); + auto deck = parser.parseString(input); + // The call to setDataFile is completely bogus, it is just to ensure that a + // meaningfull path for the input file has been specified - so that we can + // locate restart files. + deck.setDataFile("SPE1CASE1.DATA"); + return deck; +} + +BOOST_AUTO_TEST_CASE(EclipseStateTest) { + Deck deck1 = createDeck(full_deck1); + // This throws because the restart file does not exist + BOOST_CHECK_THROW(EclipseState{deck1}, std::exception); + + Deck deck2 = createDeck(full_deck2); + // This throws because the restart file does not contain the requested report step + BOOST_CHECK_THROW(EclipseState{deck2}, std::exception); } BOOST_AUTO_TEST_CASE(InitConfigTest) {