opm-simulators/opm/simulators/flow/MissingFeatures.cpp

499 lines
14 KiB
C++
Raw Normal View History

/*
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/>.
*/
#include <opm/simulators/flow/MissingFeatures.hpp>
#include <opm/common/OpmLog/OpmLog.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
#include <opm/parser/eclipse/Parser/ErrorGuard.hpp>
#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>
#include <string>
#include <map>
#include <boost/lexical_cast.hpp>
namespace Opm {
namespace MissingFeatures {
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)
{
std::pair<std::string,PartiallySupported<T> > pair({Keyword::keywordName, PartiallySupported<T>{Item::itemName , itemValue}});
map.insert(pair);
}
template <typename T>
void checkOptions(const DeckKeyword& keyword, std::multimap<std::string , PartiallySupported<T> >& map, const ParseContext& parseContext, ErrorGuard& errorGuard)
{
// 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";
parseContext.handleError(ParseContext::SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED, msg, errorGuard);
}
}
}
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)
{
// 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",
"ACTIONR",
"ACTIONW",
2018-07-10 02:36:54 -05:00
"ACTIONX",
"ACTPARAM",
"ADSALNOD",
"ADDZCORN",
"AITSOFF",
"ALKADS",
"ALKALINE",
"ALKROCK",
"API",
"ALPOLADS",
"ALSURFAD",
"ALSURFST",
2017-11-06 06:41:39 -06:00
"APIGROUP",
2019-08-08 05:02:59 -05:00
"AQANCONL",
"AQANNC",
"AQANTRC",
"AQUCON",
2019-08-08 05:02:59 -05:00
"AQUCWFAC",
"AQUFET",
"AQUFLUX",
2019-08-08 08:17:29 -05:00
"AQUNNC",
2019-04-16 23:43:08 -05:00
"AQUNUM",
2019-08-08 05:02:59 -05:00
"AUTOCOAR",
"AUTOREF",
2019-08-13 06:41:50 -05:00
"BIGMODEL",
"BOUNDARY",
"BPARA",
"BPIDIMS",
"BRANPROP",
2019-08-13 06:41:50 -05:00
"BRINE",
"BTOBALFA",
"BTOBALFV",
2019-08-16 08:14:28 -05:00
"CALTRAC",
2019-04-16 23:43:08 -05:00
"CARFIN",
2019-08-16 08:14:28 -05:00
"CART",
"CBMOPTS",
"CECON",
"COAL",
"COALADS",
"COALPP",
"COARSEN",
"COLLAPSE",
"COLUMNS",
"CBMOPTS",
2019-09-05 07:55:06 -05:00
"COMPDATX",
2019-08-16 08:14:28 -05:00
"COMPIMB",
"COMPFLSH",
2019-09-05 07:55:06 -05:00
"COMPINJK",
2019-08-16 08:14:28 -05:00
"COMPLMPL",
"COMPOFF",
"COMPRIV",
2019-09-05 07:55:06 -05:00
"COMPRP",
"COMPRPL",
2019-08-16 08:14:28 -05:00
"COMPSEGL",
"COMPSEGS",
2019-09-05 07:55:06 -05:00
"COMPVE",
"COMPVEL",
"CSKIN",
"CONNECTION",
2019-08-16 08:14:28 -05:00
"CONNECTION_PROBE",
"COORDSYS",
"COPYBOX",
"COPYREG",
"CRITPERM",
"DATE",
2019-08-23 02:38:32 -05:00
"DATUMR",
"DATUMRX",
"DCQDEFN",
"DELAYACT",
2019-09-05 07:55:06 -05:00
"DEPTHTAB",
2019-08-23 02:38:32 -05:00
"DIAGDISP",
2019-09-05 07:55:06 -05:00
"DIFF",
2019-08-23 02:38:32 -05:00
"DIFFC",
2019-09-05 07:55:06 -05:00
"DIFFCOAL",
2019-08-23 02:38:32 -05:00
"DIFFDP",
"DIFFMMF",
"DIFFMR",
"DIFFMTHT",
"DIFFMX",
"DIFFMY",
"DIFFMZ",
2019-09-05 07:55:06 -05:00
"DIFFR",
"DIFFTHT",
"DIFFUSE"
"DIFFX",
"DIFFY",
"DIFFZ",
"DIMPES",
"DIMPLICT",
"DISPDIMS",
"DISPERSE",
"DOMAINS",
"DPGRID",
"DPKRMOD",
"DPNUM",
"DRILPRI",
"DSPDEINT",
"DUALPERM",
"DUALPORO",
"DUMPCUPL",
"DYNRDIMS",
"DZMATRIX",
"DZMTRX",
"DZMTRXV",
2019-09-12 01:48:56 -05:00
"DZNET",
"ECLMC",
"EDITNNCR",
"EHYSTRR",
2017-11-06 06:41:39 -06:00
"ENDACTIO",
2019-09-12 01:48:56 -05:00
"ENDDYN",
2019-08-23 02:38:32 -05:00
"ENDFIN",
"ENDNUM",
"ENDSKIP",
"ENKSRVD",
2019-09-12 01:48:56 -05:00
"ENPCVD",
"ENPTVD",
2019-09-12 01:48:56 -05:00
"ENSPCVD",
"EPSDBGS",
"EPSDEBUG",
"EQLZCORN",
"EQUALREG",
2019-09-12 01:48:56 -05:00
"ESSNODE",
"EXCAVATE",
"EXCEL",
2019-09-12 01:48:56 -05:00
"EXTFIN",
2019-09-12 05:17:58 -05:00
"EXTHOST",
"EXTRAPMS",
2019-09-12 05:17:58 -05:00
"EXTREPGL",
"FBHPDEF",
"FHERCHBL",
"FIPNUM",
"FIPSEP",
"FLUXREG",
"FLUXTYPE",
2019-09-12 05:17:58 -05:00
"FMTHMD",
"FOAMDCYO",
"FOAMDCYW",
2019-09-18 09:20:37 -05:00
"FOAMFCN",
"FOAMFRM",
"FOAMFSO"
"FOAMFST",
"FOAMFSW",
"FOAMMOBP",
"FOAMMOBS",
"FORMFEED",
"FULLIMP",
2019-09-18 09:20:37 -05:00
"GASBEGIN",
"GASCONC",
"GASEND",
"GASFCOMP",
"GASFDECR",
"GASFDELC",
"GASFIELD",
"GASFTARG",
"GASMONTH",
"GASPERIO",
"GASSATC",
"GASYEAR",
"GCALECON",
"GCONCAL",
"GCONENG",
"GCONSALE",
"GCONSUMP",
"GCONTOL",
"GCUTBACK",
"GCVD",
"GDCQ",
"GDCQECON",
"GDIMS",
"GDORIENT",
"GDRILPOT",
"GECON",
"GETGLOB",
"GI",
"GIMODEL",
"GINODE",
"GLIFTLIM",
2017-11-06 06:41:39 -06:00
"GLIFTOPT",
"GNETDP",
2018-05-25 08:03:16 -05:00
"GNETINJE",
"GNETPUMP",
"GPMAINT",
"GRADGRUP",
"GRADRESV",
"GRADRFT",
"GRADWELL",
"GRAVCONS",
"GRAVDR",
"GRAVDRB",
"GRAVDRM",
"GRDREACH",
"GRIDUNIT",
"GRUPMAST",
"GRUPNET",
"GRUPRIG",
2017-11-06 06:41:39 -06:00
"GSATPROD",
"GUIDERAT",
"IMKRVD",
"IMPES",
"IMPTVD",
2019-09-16 08:43:30 -05:00
"LCUNIT",
"LGR",
2019-09-16 08:43:30 -05:00
"LINCOM",
2017-11-06 06:41:39 -06:00
"LIFTOPT",
"MAPUNITS",
"MAXVALUE",
"MINVALUE",
"MONITOR",
"MSGFILE",
"MULT_XYZ",
"NETBALAN",
"NEXTSTEP",
2019-09-12 05:17:58 -05:00
"NNEWTF",
"NOCASC",
"NODEPROP",
"NOGGF",
"NOINSPEC",
"NOMONITO",
"NONNC",
"NORSSPEC",
2017-11-06 06:41:39 -06:00
"NOWARN",
"NSTACK",
"NUMRES",
"NUPCOL",
"OILVISCT",
"OLDTRAN",
2017-11-06 06:41:39 -06:00
"OPERATER",
"OPTIONS",
"PARALLEL",
"PBVD",
"PCG",
2017-11-06 06:41:39 -06:00
"PERMR",
"PERMTHT",
"PERMXY",
"PERMYZ",
"PERMZX",
"PIMULTAB",
"PLYADSS",
"PLYDHFLF",
2017-11-06 06:41:39 -06:00
"PPCWMAX",
"REFINE",
"RADFIN4",
2017-11-06 06:41:39 -06:00
"RHO",
"RKTRMDIR",
"ROCKCOMP",
"ROCKOPTS",
"ROCKTAB",
"RPTGRID",
"RPTONLY",
"RPTONLYO",
"RPTPROS",
"PRTRST",
"RPTRUNSP",
2017-11-06 06:41:39 -06:00
"RPTSMRY",
"RSCONST",
"RSCONSTT",
"RTEMP",
"RTEMPA",
"RTEMPVD",
"RUNSUM",
"SATOPTS",
"SAVE",
"SEPARATE",
"SKIP",
"SKIP100",
"SKIP300",
"SKIPREST",
"SUMTHIN",
"TEMP",
2019-09-26 11:57:10 -05:00
"TEMPNODE",
"TEMPTVD",
"TEMPVD",
"TIGHTEN",
"TIGHTENP",
"TIME",
"TPAMEPS",
"TPAMEPSS",
"TRACERKM",
"TRACERKP",
"TRACITVD",
"TRACTVD",
"THCONR",
"TRACER",
"TRACERS",
2019-09-26 11:57:10 -05:00
"VAPPARS",
"UDTDIMS",
"UNCODHMD",
"UNIFOUTS",
"UNIFSAVE",
"USECUPL",
"USEFLUX",
"USENOFLO",
"VDFLOW",
"VDFLOWR",
"VE",
"VEDEBUG",
"VEFIN",
"VEFRAC",
"VEFRACP",
"VEFRACPV",
"VEFRACV",
"VFPCHK",
"VFPTABL",
"VISAGE",
"VISCD",
"VISCREF",
2019-09-26 11:57:10 -05:00
"VISDATES",
"VISOPTS",
2019-08-14 15:52:03 -05:00
"WAGHYSTR",
"WAITBAL",
"WALKALIN",
"WALQCALC",
"WAPI",
2017-11-06 06:41:39 -06:00
"WARN",
"WATVISCT",
2019-08-14 15:52:03 -05:00
"WBHGLR",
"WBOREVOL",
"WCALCVAL",
"WCONINJH",
"WCUTBACK",
"WCUTBACT",
"WCYCLE",
"WDFAC",
"WDRILPRI",
"WDRILRES",
"WECONINJ",
2019-08-23 01:02:14 -05:00
"WECONT",
"WELCNTL",
"WELDEBUG",
"WELDRAW",
"WELEVNT",
"WELOPENL"
2017-11-06 06:41:39 -06:00
"WELPI",
2019-09-06 04:19:59 -05:00
"WELPRI",
"WELSOMIN",
"WELSPECL",
2019-09-06 04:19:59 -05:00
"WFRICSEG",
"WFRICSGL",
"WFRICTN",
"WFRICTNL",
2017-11-06 06:41:39 -06:00
"WGASPROD",
"WGORPEN",
"WH2NUM",
"WH3NUM",
"WHEDREFD",
"WHTEMP",
2017-11-06 06:41:39 -06:00
"WINJMULT",
"WLIMTOL",
"WLISTARG",
"WLISTNAM",
"WLISTOPT",
"WNETCTRL",
2019-09-13 10:31:50 -05:00
"WNETDP",
2017-11-06 06:41:39 -06:00
"WORKTHP",
"WPAVE",
2019-09-13 10:31:50 -05:00
"WPIMULTL",
"WPITAB",
2019-09-13 10:31:50 -05:00
"WPLUG",
"WPOLYRED",
"WPOTCALC",
2019-09-16 12:46:40 -05:00
"WREGROUP",
"WSALT",
"WSCCLEAN",
"WSCCLENL",
"WSCTAB",
"WSEGAICD",
"WSEGDFIN",
"WSEGDFMD",
"WSEGDFPA",
"WSEGEXSS",
"WSEGFLIM",
"WSEGFMOD",
"WSEGINIT",
"WSEGLABY",
"WSEGLINK",
"WSEGMULT",
"WSEGPROP",
"WSEGPULL",
"WSEGSEP",
"WSEGSOLV",
"WSEGTABL",
"WTEMP",
"WTRACER",
2019-08-14 15:52:03 -05:00
"ZIPPY2",
"ZIPP2OFF"};
std::multimap<std::string, PartiallySupported<std::string> > string_options;
std::multimap<std::string, PartiallySupported<int> > int_options;
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);
// check deck and keyword for flow and parser.
for (size_t idx = 0; idx < deck.size(); ++idx) {
const auto& keyword = deck.getKeyword(idx);
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"
+ "In file " + keyword.getFileName() + ", line " + std::to_string(keyword.getLineNumber()) + "\n";
parseContext.handleError(ParseContext::SIMULATOR_KEYWORD_NOT_SUPPORTED, msg, errorGuard);
}
checkOptions<std::string>(keyword, string_options, parseContext, errorGuard);
checkOptions<int>(keyword, int_options, parseContext, errorGuard);
}
}
} // namespace MissingFeatures
} // namespace Opm