Register errors concerning section topology in ErrorGuard.

That will make those (e.g. EDITNNC in the GRiD section) fatal.
This commit is contained in:
Markus Blatt
2023-07-19 17:44:59 +02:00
parent d7f1b6bd27
commit e56e2f4d26
4 changed files with 27 additions and 23 deletions

View File

@@ -27,6 +27,7 @@
namespace Opm {
class Deck;
class ErrorGuard;
enum class Section {
RUNSPEC,
@@ -63,6 +64,7 @@ class DeckSection : public DeckView {
// the right order
static bool checkSectionTopology(const Deck& deck,
const Parser&,
ErrorGuard& errorGuard,
bool ensureKeywordSectionAffiliation = false);

View File

@@ -50,7 +50,7 @@ bool checkDeck( const Deck& deck, const Parser& parser, const ParseContext& pars
// make sure all mandatory sections are present and that their order is correct
if (enabledChecks & SectionTopology) {
bool ensureKeywordSection = enabledChecks & KeywordSection;
deckValid = deckValid && DeckSection::checkSectionTopology(deck, parser, ensureKeywordSection);
deckValid = deckValid && DeckSection::checkSectionTopology(deck, parser, errorGuard, ensureKeywordSection);
}
const std::string& deckUnitSystem = uppercase(deck.getActiveUnitSystem().getName());

View File

@@ -1554,6 +1554,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
bool DeckSection::checkSectionTopology(const Deck& deck,
const Parser& parser,
Opm::ErrorGuard& errorGuard,
bool ensureKeywordSectionAffiliation)
{
if( deck.size() == 0 ) {
@@ -1563,11 +1564,12 @@ std::vector<std::string> Parser::getAllDeckNames () const {
}
bool deckValid = true;
const std::string errorKey = "SECTION_TOPOLOGY_ERROR";
if( deck[0].name() != "RUNSPEC" ) {
std::string msg = "The first keyword of a valid deck must be RUNSPEC\n";
auto curKeyword = deck[0];
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1587,7 +1589,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
std::string msg =
"The keyword '"+curKeywordName+"' is located in the '"+curSectionName
+"' section where it is invalid";
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1598,7 +1600,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "GRID") {
std::string msg =
"The RUNSPEC section must be followed by GRID instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1608,7 +1610,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "EDIT" && curKeywordName != "PROPS") {
std::string msg =
"The GRID section must be followed by EDIT or PROPS instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1618,7 +1620,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "PROPS") {
std::string msg =
"The EDIT section must be followed by PROPS instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1628,7 +1630,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "REGIONS" && curKeywordName != "SOLUTION") {
std::string msg =
"The PROPS section must be followed by REGIONS or SOLUTION instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1638,7 +1640,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "SOLUTION") {
std::string msg =
"The REGIONS section must be followed by SOLUTION instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1648,7 +1650,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "SUMMARY" && curKeywordName != "SCHEDULE") {
std::string msg =
"The SOLUTION section must be followed by SUMMARY or SCHEDULE instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1658,7 +1660,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
if (curKeywordName != "SCHEDULE") {
std::string msg =
"The SUMMARY section must be followed by SCHEDULE instead of "+curKeywordName;
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
@@ -1669,7 +1671,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
std::string msg =
"The SCHEDULE section must be the last one ("
+curKeywordName+" specified after SCHEDULE)";
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}
}
@@ -1679,7 +1681,7 @@ std::vector<std::string> Parser::getAllDeckNames () const {
const auto& curKeyword = deck[deck.size() - 1];
std::string msg =
"The last section of a valid deck must be SCHEDULE (is "+curSectionName+")";
OpmLog::warning(Log::fileMessage(curKeyword.location(), msg) );
errorGuard.addError(errorKey, Log::fileMessage(curKeyword.location(), msg) );
deckValid = false;
}

View File

@@ -233,7 +233,7 @@ BOOST_AUTO_TEST_CASE(Section_ValidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK( Opm::DeckSection::checkSectionTopology( parser.parseString( minimal, mode, errors ), parser) );
BOOST_CHECK( Opm::DeckSection::checkSectionTopology( parser.parseString( minimal, mode, errors ), parser, errors) );
const std::string with_opt = "RUNSPEC\n"
"TEST1\n"
@@ -252,7 +252,7 @@ BOOST_AUTO_TEST_CASE(Section_ValidDecks) {
"SCHEDULE\n"
"TEST8\n";
BOOST_CHECK(Opm::DeckSection::checkSectionTopology( parser.parseString( with_opt, mode, errors ), parser));
BOOST_CHECK(Opm::DeckSection::checkSectionTopology( parser.parseString( with_opt, mode, errors ), parser, errors));
}
BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
@@ -274,7 +274,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( keyword_before_RUNSPEC, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( keyword_before_RUNSPEC, mode, errors ), parser, errors));
const std::string wrong_order = "RUNSPEC\n"
"TEST1\n"
@@ -293,7 +293,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST8\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( wrong_order, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( wrong_order, mode, errors ), parser, errors));
const std::string duplicate = "RUNSPEC\n"
"TEST1\n"
@@ -314,7 +314,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST8\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( duplicate, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( duplicate, mode, errors ), parser, errors));
const std::string section_after_SCHEDULE = "RUNSPEC\n"
"TEST1\n"
@@ -333,7 +333,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"EDIT\n"
"TEST3\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( section_after_SCHEDULE, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( section_after_SCHEDULE, mode, errors ), parser, errors));
const std::string missing_runspec = "GRID\n"
"TEST2\n"
@@ -344,7 +344,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_runspec, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_runspec, mode, errors ), parser, errors));
const std::string missing_GRID = "RUNSPEC\n"
@@ -356,7 +356,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_GRID, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_GRID, mode, errors ), parser, errors));
const std::string missing_PROPS = "RUNSPEC\n"
"TEST1\n"
@@ -367,7 +367,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_PROPS, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_PROPS, mode, errors ), parser, errors));
const std::string missing_SOLUTION = "RUNSPEC\n"
"TEST1\n"
@@ -378,7 +378,7 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SCHEDULE\n"
"TEST5\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_SOLUTION, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_SOLUTION, mode, errors ), parser, errors));
const std::string missing_SCHEDULE = "RUNSPEC\n"
"TEST1\n"
@@ -389,5 +389,5 @@ BOOST_AUTO_TEST_CASE(Section_InvalidDecks) {
"SOLUTION\n"
"TEST4\n";
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_SCHEDULE, mode, errors ), parser));
BOOST_CHECK(!Opm::DeckSection::checkSectionTopology( parser.parseString( missing_SCHEDULE, mode, errors ), parser, errors));
}