2016-07-06 21:38:29 -05:00
|
|
|
/*
|
|
|
|
Copyright 2016 Statoil ASA.
|
|
|
|
|
|
|
|
This file is part of the Open Porous Media project (OPM).
|
|
|
|
|
|
|
|
OPM is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
OPM is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2019-06-20 02:09:19 -05:00
|
|
|
|
|
|
|
#include <opm/simulators/flow/MissingFeatures.hpp>
|
|
|
|
|
2016-07-06 21:38:29 -05:00
|
|
|
#include <opm/common/OpmLog/OpmLog.hpp>
|
2016-07-19 21:27:30 -05:00
|
|
|
|
2016-07-06 21:38:29 -05:00
|
|
|
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
2019-01-25 11:03:32 -06:00
|
|
|
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/ErrorGuard.hpp>
|
2016-07-19 21:27:30 -05:00
|
|
|
#include <opm/parser/eclipse/Parser/ParserKeywords/C.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/ParserKeywords/E.hpp>
|
|
|
|
#include <opm/parser/eclipse/Parser/ParserKeywords/P.hpp>
|
|
|
|
|
2016-07-07 00:50:32 -05:00
|
|
|
#include <unordered_set>
|
2016-07-06 21:38:29 -05:00
|
|
|
#include <string>
|
2016-07-17 23:32:28 -05:00
|
|
|
#include <map>
|
2016-07-19 21:27:30 -05:00
|
|
|
#include <boost/lexical_cast.hpp>
|
2016-07-06 21:38:29 -05:00
|
|
|
|
|
|
|
namespace Opm {
|
|
|
|
|
2016-07-07 02:38:03 -05:00
|
|
|
namespace MissingFeatures {
|
|
|
|
|
2016-07-17 23:32:28 -05:00
|
|
|
|
2016-07-19 21:27:30 -05:00
|
|
|
template <typename Keyword, typename Item, typename T>
|
2016-08-22 03:14:37 -05:00
|
|
|
void addSupported(std::multimap<std::string, PartiallySupported<T> >& map, T itemValue)
|
2016-07-19 21:27:30 -05:00
|
|
|
{
|
|
|
|
std::pair<std::string,PartiallySupported<T> > pair({Keyword::keywordName, PartiallySupported<T>{Item::itemName , itemValue}});
|
|
|
|
map.insert(pair);
|
|
|
|
}
|
2016-07-17 23:32:28 -05:00
|
|
|
|
2016-07-19 21:27:30 -05:00
|
|
|
|
|
|
|
template <typename T>
|
2019-01-25 11:03:32 -06:00
|
|
|
void checkOptions(const DeckKeyword& keyword, std::multimap<std::string , PartiallySupported<T> >& map, const ParseContext& parseContext, ErrorGuard& errorGuard)
|
2016-07-19 21:27:30 -05:00
|
|
|
{
|
|
|
|
// check for partially supported keywords.
|
|
|
|
typename std::multimap<std::string, PartiallySupported<T> >::iterator it, itlow, itup;
|
|
|
|
itlow = map.lower_bound(keyword.name());
|
|
|
|
itup = map.upper_bound(keyword.name());
|
|
|
|
for (it = itlow; it != itup; ++it) {
|
|
|
|
const auto& record = keyword.getRecord(0);
|
|
|
|
if (record.getItem(it->second.item).template get<T>(0) != it->second.item_value) {
|
|
|
|
std::string msg = "For keyword '" + it->first + "' only value " + boost::lexical_cast<std::string>(it->second.item_value)
|
|
|
|
+ " in item " + it->second.item + " is supported by flow.\n"
|
|
|
|
+ "In file " + keyword.getFileName() + ", line " + std::to_string(keyword.getLineNumber()) + "\n";
|
2019-01-25 11:03:32 -06:00
|
|
|
parseContext.handleError(ParseContext::SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED, msg, errorGuard);
|
2016-07-19 21:27:30 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-07-17 23:32:28 -05:00
|
|
|
|
2019-01-25 11:03:32 -06:00
|
|
|
template <typename T>
|
|
|
|
void checkKeywords(const Deck& deck, const ParseContext& parseContext, T&& errorGuard) {
|
|
|
|
checkKeywords(deck, parseContext, errorGuard);
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkKeywords(const Deck& deck) {
|
|
|
|
checkKeywords(deck, ParseContext(), ErrorGuard());
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkKeywords(const Deck& deck, const ParseContext& parseContext, ErrorGuard& errorGuard)
|
2016-07-06 21:38:29 -05:00
|
|
|
{
|
|
|
|
// These keywords are supported by opm-parser, but are not supported
|
|
|
|
// by flow. For some of them, only part of the options are supported.
|
|
|
|
// The list is used to output messages only.
|
2016-07-07 00:50:32 -05:00
|
|
|
std::unordered_set<std::string> unsupported_keywords = {
|
2017-11-06 06:41:39 -06:00
|
|
|
"ACTION",
|
2019-07-26 05:41:35 -05:00
|
|
|
"ACTIONG",
|
2019-07-26 10:26:29 -05:00
|
|
|
"ACTIONR",
|
|
|
|
"ACTIONW",
|
2018-07-10 02:36:54 -05:00
|
|
|
"ACTIONX",
|
2019-07-26 10:26:29 -05:00
|
|
|
"ACTPARAM",
|
2017-11-06 06:26:53 -06:00
|
|
|
"ADSALNOD",
|
2019-07-26 10:26:29 -05:00
|
|
|
"ADDZCORN",
|
|
|
|
"AITSOFF",
|
|
|
|
"ALKADS",
|
|
|
|
"ALKALINE",
|
|
|
|
"ALKROCK",
|
2017-11-06 06:26:53 -06:00
|
|
|
"API",
|
2019-07-26 11:07:52 -05:00
|
|
|
"ALPOLADS",
|
|
|
|
"ALSURFAD",
|
|
|
|
"ALSURFST",
|
2017-11-06 06:41:39 -06:00
|
|
|
"APIGROUP",
|
2017-11-06 06:26:53 -06:00
|
|
|
"AQUCON",
|
2019-04-16 23:43:08 -05:00
|
|
|
"AQUNUM",
|
2019-05-21 23:54:05 -05:00
|
|
|
"BRANPROP",
|
2019-04-16 23:43:08 -05:00
|
|
|
"CARFIN",
|
2018-04-03 02:40:36 -05:00
|
|
|
"COMPDATL",
|
2017-11-06 06:26:53 -06:00
|
|
|
"CONNECTION",
|
|
|
|
"CPR",
|
|
|
|
"DATE",
|
2017-11-06 06:41:39 -06:00
|
|
|
"ENDACTIO",
|
2018-04-03 02:40:36 -05:00
|
|
|
"ENDFIN"
|
2017-11-06 06:26:53 -06:00
|
|
|
"ENDNUM",
|
|
|
|
"ENDSKIP",
|
|
|
|
"ENKSRVD",
|
|
|
|
"ENPTVD",
|
|
|
|
"EQLNUM",
|
|
|
|
"EQUALREG",
|
|
|
|
"EXCEL",
|
|
|
|
"EXTRAPMS",
|
2019-04-19 03:54:08 -05:00
|
|
|
"FLUXTYPE",
|
2017-11-06 06:26:53 -06:00
|
|
|
"FULLIMP",
|
2019-05-21 23:54:05 -05:00
|
|
|
"GCONSALE",
|
|
|
|
"GCONSUMP",
|
2017-11-06 06:26:53 -06:00
|
|
|
"GDORIENT",
|
|
|
|
"GECON",
|
2017-11-06 06:41:39 -06:00
|
|
|
"GLIFTOPT",
|
2018-05-25 08:03:16 -05:00
|
|
|
"GNETINJE",
|
2019-05-21 23:54:05 -05:00
|
|
|
"GPMAINT",
|
2017-11-06 06:26:53 -06:00
|
|
|
"GRIDUNIT",
|
|
|
|
"GRUPNET",
|
2017-11-06 06:41:39 -06:00
|
|
|
"GSATPROD",
|
2019-05-21 23:54:05 -05:00
|
|
|
"GUIDERAT",
|
2017-11-06 06:26:53 -06:00
|
|
|
"IMKRVD",
|
|
|
|
"IMPES",
|
|
|
|
"IMPTVD",
|
2018-04-03 02:40:36 -05:00
|
|
|
"LGR",
|
2017-11-06 06:41:39 -06:00
|
|
|
"LIFTOPT",
|
2017-11-06 06:26:53 -06:00
|
|
|
"MAPUNITS",
|
|
|
|
"MAXVALUE",
|
|
|
|
"MESSAGES",
|
|
|
|
"MINVALUE",
|
|
|
|
"MONITOR",
|
|
|
|
"MSGFILE",
|
|
|
|
"MULT_XYZ",
|
|
|
|
"NETBALAN",
|
|
|
|
"NEXTSTEP",
|
|
|
|
"NOCASC",
|
2019-05-21 23:54:05 -05:00
|
|
|
"NODEPROP",
|
2017-11-06 06:26:53 -06:00
|
|
|
"NOGGF",
|
|
|
|
"NOINSPEC",
|
|
|
|
"NOMONITO",
|
|
|
|
"NONNC",
|
|
|
|
"NORSSPEC",
|
2017-11-06 06:41:39 -06:00
|
|
|
"NOWARN",
|
2017-11-06 06:26:53 -06:00
|
|
|
"NSTACK",
|
|
|
|
"NUMRES",
|
|
|
|
"NUPCOL",
|
|
|
|
"OILVISCT",
|
|
|
|
"OLDTRAN",
|
2017-11-06 06:41:39 -06:00
|
|
|
"OPERATER",
|
2017-11-06 06:26:53 -06:00
|
|
|
"OPTIONS",
|
|
|
|
"PARALLEL",
|
|
|
|
"PBVD",
|
|
|
|
"PCG",
|
2017-11-06 06:41:39 -06:00
|
|
|
"PERMR",
|
|
|
|
"PERMTHT",
|
2017-11-06 06:26:53 -06:00
|
|
|
"PERMXY",
|
|
|
|
"PERMYZ",
|
|
|
|
"PERMZX",
|
|
|
|
"PIMULTAB",
|
|
|
|
"PLYADSS",
|
|
|
|
"PLYDHFLF",
|
2017-11-06 06:41:39 -06:00
|
|
|
"PPCWMAX",
|
2018-04-03 02:40:36 -05:00
|
|
|
"REFINE",
|
2017-11-06 06:26:53 -06:00
|
|
|
"RADFIN4",
|
2017-11-06 06:41:39 -06:00
|
|
|
"RHO",
|
2017-11-06 06:26:53 -06:00
|
|
|
"RKTRMDIR",
|
|
|
|
"ROCKCOMP",
|
|
|
|
"ROCKOPTS",
|
|
|
|
"ROCKTAB",
|
|
|
|
"RPTGRID",
|
|
|
|
"RPTONLY",
|
|
|
|
"RPTONLYO",
|
|
|
|
"RPTPROS",
|
|
|
|
"PRTRST",
|
|
|
|
"RPTRUNSP",
|
2017-11-06 06:41:39 -06:00
|
|
|
"RPTSMRY",
|
2017-11-06 06:26:53 -06:00
|
|
|
"RPTSOL",
|
2017-11-06 06:41:39 -06:00
|
|
|
"RSCONST",
|
|
|
|
"RSCONSTT",
|
|
|
|
"RTEMP",
|
|
|
|
"RTEMPA",
|
2017-11-06 06:26:53 -06:00
|
|
|
"RTEMPVD",
|
|
|
|
"RUNSUM",
|
|
|
|
"SATOPTS",
|
|
|
|
"SAVE",
|
|
|
|
"SEPARATE",
|
|
|
|
"SKIP",
|
|
|
|
"SKIP100",
|
|
|
|
"SKIP300",
|
|
|
|
"SKIPREST",
|
|
|
|
"SPECGRID",
|
|
|
|
"SUMTHIN",
|
|
|
|
"TEMP",
|
|
|
|
"THCONR",
|
|
|
|
"TRACER",
|
|
|
|
"TRACERS",
|
|
|
|
"VAPPARS",
|
|
|
|
"VISCREF",
|
2017-11-06 06:41:39 -06:00
|
|
|
"WARN",
|
2017-11-06 06:26:53 -06:00
|
|
|
"WATVISCT",
|
2017-11-06 06:41:39 -06:00
|
|
|
"WELPI",
|
2018-04-03 02:40:36 -05:00
|
|
|
"WELSPECL",
|
2017-11-06 06:41:39 -06:00
|
|
|
"WGASPROD",
|
|
|
|
"WINJMULT",
|
|
|
|
"WLIMTOL",
|
|
|
|
"WORKTHP",
|
2017-11-06 06:26:53 -06:00
|
|
|
"WPAVE",
|
|
|
|
"WPITAB",
|
|
|
|
"WTEMP",
|
|
|
|
"WTRACER",
|
|
|
|
"ZIPPY2" };
|
2016-07-19 21:27:30 -05:00
|
|
|
std::multimap<std::string, PartiallySupported<std::string> > string_options;
|
|
|
|
std::multimap<std::string, PartiallySupported<int> > int_options;
|
2019-07-01 23:10:50 -05:00
|
|
|
addSupported<ParserKeywords::COMPORD, ParserKeywords::COMPORD::ORDER_TYPE, std::string>(string_options , "INPUT");
|
2016-08-22 03:14:37 -05:00
|
|
|
addSupported<ParserKeywords::ENDSCALE, ParserKeywords::ENDSCALE::DIRECT, std::string>(string_options, "NODIR");
|
|
|
|
addSupported<ParserKeywords::ENDSCALE, ParserKeywords::ENDSCALE::IRREVERS, std::string>(string_options, "REVER");
|
|
|
|
addSupported<ParserKeywords::PINCH, ParserKeywords::PINCH::CONTROL_OPTION, std::string>(string_options, "GAP");
|
|
|
|
addSupported<ParserKeywords::PINCH, ParserKeywords::PINCH::PINCHOUT_OPTION, std::string>(string_options, "TOPBOT");
|
|
|
|
addSupported<ParserKeywords::EHYSTR, ParserKeywords::EHYSTR::relative_perm_hyst, int>(int_options , 0);
|
2016-07-12 10:00:15 -05:00
|
|
|
|
2016-07-06 21:38:29 -05:00
|
|
|
// check deck and keyword for flow and parser.
|
2016-07-08 01:52:37 -05:00
|
|
|
for (size_t idx = 0; idx < deck.size(); ++idx) {
|
|
|
|
const auto& keyword = deck.getKeyword(idx);
|
2016-07-07 02:38:03 -05:00
|
|
|
std::unordered_set<std::string>::const_iterator it;
|
|
|
|
it = unsupported_keywords.find(keyword.name());
|
|
|
|
if (it != unsupported_keywords.end()) {
|
|
|
|
std::string msg = "Keyword '" + keyword.name() + "' is not supported by flow.\n"
|
2016-07-12 10:00:15 -05:00
|
|
|
+ "In file " + keyword.getFileName() + ", line " + std::to_string(keyword.getLineNumber()) + "\n";
|
2019-01-25 11:03:32 -06:00
|
|
|
parseContext.handleError(ParseContext::SIMULATOR_KEYWORD_NOT_SUPPORTED, msg, errorGuard);
|
2016-07-06 21:38:29 -05:00
|
|
|
}
|
2019-01-25 11:03:32 -06:00
|
|
|
checkOptions<std::string>(keyword, string_options, parseContext, errorGuard);
|
|
|
|
checkOptions<int>(keyword, int_options, parseContext, errorGuard);
|
2016-07-06 21:38:29 -05:00
|
|
|
}
|
|
|
|
}
|
2016-07-07 02:38:03 -05:00
|
|
|
} // namespace MissingFeatures
|
2016-07-06 21:38:29 -05:00
|
|
|
} // namespace Opm
|