|
opm-common
|
Control parser behaviour in failure conditions. More...
#include <ParseContext.hpp>
Public Member Functions | |
| ParseContext () | |
| Default constructor. | |
| ParseContext (InputErrorAction default_action) | |
| Constructor. | |
| ParseContext (const std::vector< std::pair< std::string, InputErrorAction > > &initial) | |
| Constructor. | |
| void | handleError (const std::string &errorKey, const std::string &msg, const std::optional< KeywordLocation > &location, ErrorGuard &errors) const |
| Handle an input error. | |
| void | handleUnknownKeyword (const std::string &keyword, const std::optional< KeywordLocation > &location, ErrorGuard &errors) const |
| Handle an unknown keyword in the input stream. | |
| bool | hasKey (const std::string &key) const |
| Existence predicate for particular context category. | |
| void | updateKey (const std::string &key, InputErrorAction action) |
| Reset action for particular context category. | |
| void | update (InputErrorAction action) |
| Reset action for all context categories. | |
| void | update (const std::string &keyString, InputErrorAction action) |
| Reset action for one or more context categories. | |
| void | ignoreKeyword (const std::string &keyword) |
| Ignore particular unknown input keyword if encountered during parsing. | |
| InputErrorAction | get (const std::string &key) const |
| Retrieve category action for particular context category. | |
| void | addKey (const std::string &key, InputErrorAction default_action) |
| Define action for user-specified category. | |
| void | setInputSkipMode (const std::string &skip_mode) |
| Define how to handle simulator specific keyword suppression. | |
| bool | isActiveSkipKeyword (const std::string &deck_name) const |
| Whether or not a particular keyword activates keyword suppression. | |
Static Public Attributes | |
| static const std::string | PARSE_EXTRA_RECORDS = "PARSE_EXTRA_RECORDS" |
| The PARSE_EXTRA_RECORDS field controls the parser's response to keywords whose size has been defined in an earlier keyword. | |
| static const std::string | PARSE_UNKNOWN_KEYWORD = "PARSE_UNKNOWN_KEYWORD" |
| The unknown keyword category controls the parser's behaviour on encountering an unknown keyword. | |
| static const std::string | PARSE_RANDOM_TEXT = "PARSE_RANDOM_TEXT" |
| Random text is an input deck string not correctly formatted as a keyword heading. | |
| static const std::string | PARSE_RANDOM_SLASH = "PARSE_RANDOM_SLASH" |
| It turns out that random '/'–i.e. | |
| static const std::string | PARSE_MISSING_DIMS_KEYWORD = "PARSE_MISSING_DIMS_KEYWORD" |
| For some keywords the number of records (i.e., size) is given as an item in another keyword. | |
| static const std::string | PARSE_EXTRA_DATA = "PARSE_EXTRA_DATA" |
| If the number of elements in the input record exceeds the number of items in the keyword configuration this error situation will be triggered. | |
| static const std::string | PARSE_MISSING_INCLUDE = "PARSE_MISSING_INCLUDE" |
| If an include file is not found we can configure the parser to continue reading. | |
| static const std::string | PARSE_INVALID_KEYWORD_COMBINATION = "PARSE_INVALID_KEYWORD_COMBINATION" |
| Certain keywords require, or prohibit, other specific keywords. | |
| static const std::string | RUNSPEC_NUMWELLS_TOO_LARGE = "RUNSPEC_NUMWELLS_TOO_LARGE" |
| Dynamic number of wells exceeds maximum declared in RUNSPEC keyword WELLDIMS (item 1). | |
| static const std::string | RUNSPEC_CONNS_PER_WELL_TOO_LARGE = "RUNSPEC_CONNS_PER_WELL_TOO_LARGE" |
| Dynamic number of connections per well exceeds maximum declared in RUNSPEC keyword WELLDIMS (item 2). | |
| static const std::string | RUNSPEC_NUMGROUPS_TOO_LARGE = "RUNSPEC_NUMGROUPS_TOO_LARGE" |
| Dynamic number of groups exceeds maximum number declared in RUNSPEC keyword WELLDIMS (item 3). | |
| static const std::string | RUNSPEC_GROUPSIZE_TOO_LARGE = "RUNSPEC_GROUPSIZE_TOO_LARGE" |
| Dynamic group size exceeds maximum number declared in RUNSPEC keyword WELLDIMS (item 4). | |
| static const std::string | RUNSPEC_NUMMSW_TOO_LARGE = "RUNSPEC_NUMMSW_TOO_LARGE" |
| Dynamic number of multi-segmented wells exceeds maximum declared in RUNSPEC keyword WSEGDIMS (item 1). | |
| static const std::string | RUNSPEC_NUMSEG_PER_WELL_TOO_LARGE = "RUNSPEC_NUMSEG_PER_WELL_TOO_LARGE" |
| Dynamic number of segments per MS well exceeds maximum declared in RUNSPEC keyword WSEGDIMS (item 2). | |
| static const std::string | RUNSPEC_NUMBRANCH_TOO_LARGE = "RUNSPEC_NUMBRANCH_TOO_LARGE" |
| Dynamic number of branches exceeds maximum number declared in RUNSPEC keyword WSEGDIMS (item 3). | |
| static const std::string | PARSE_LONG_KEYWORD = "PARSE_LONG_KEYWORD" |
| Should we allow keywords of length more than eight characters? | |
| static const std::string | UNIT_SYSTEM_MISMATCH = "UNIT_SYSTEM_MISMATCH" |
| The unit system specified via the FILEUNIT keyword is different from the unit system used by the deck. | |
| static const std::string | UNSUPPORTED_INITIAL_THPRES = "UNSUPPORTED_INITIAL_THPRES" |
| If the third item in the THPRES keyword is defaulted, the threshold pressure is inferred from the initial pressure. | |
| static const std::string | UNSUPPORTED_TERMINATE_IF_BHP = "UNSUPPORTED_TERMINATE_IF_BHP" |
| If the second item in the WHISTCTL keyword is set to YES. | |
| static const std::string | UDQ_PARSE_ERROR = "UDQ_PARSE_ERROR" |
| Parser fails to analyse the defining expression of a UDQ. | |
| static const std::string | UDQ_TYPE_ERROR = "UDQ_TYPE_ERROR" |
| Parser unable to establish a coherent UDQ set type for a user-defined quantity. | |
| static const std::string | UDQ_DEFINE_CANNOT_EVAL = "UDQ_DEFINE_CANNOT_EVAL" |
| Cannot evaluate the defining expression of a UDQ at the point of definition due to missing objects, e.g., wells or groups. | |
| static const std::string | INTERNAL_ERROR_UNINITIALIZED_THPRES = "INTERNAL_ERROR_UNINITIALIZED_THPRES" |
| If the third item in the THPRES keyword is defaulted the threshold pressure is inferred from the initial pressure–if you still ask the ThresholdPressure instance for a pressure value this error will be signalled. | |
| static const std::string | PARSE_MISSING_SECTIONS = "PARSE_MISSING_SECTIONS" |
| If the deck does not have all sections, whence complete EclipseState and Schedule objects cannot be constructed, we may still be able to construct a slim EclipseGrid. | |
| static const std::string | PARSE_WGNAME_SPACE = "PARSE_WGNAME_SPACE" |
| When defining wells and groups with the WELSPECS and GRUPTREE keywords we do not allow leading or trailing spaces. | |
| static const std::string | SUMMARY_UNKNOWN_WELL = "SUMMARY_UNKNOWN_WELL" |
| Well level summary vector references an unknown well. | |
| static const std::string | SUMMARY_UNKNOWN_GROUP = "SUMMARY_UNKNOWN_GROUP" |
| Group level summary vector references an unknown group. | |
| static const std::string | SUMMARY_UNKNOWN_NODE = "SUMMARY_UNKNOWN_NODE" |
| Summary vector references an unknown network node. | |
| static const std::string | SUMMARY_UNKNOWN_AQUIFER = "SUMMARY_UNKNOWN_AQUIFER" |
| Aquifer level summary vector references an unknown aquifer (analytic or numeric). | |
| static const std::string | SUMMARY_UNHANDLED_KEYWORD = "SUMMARY_UNHANDLED_KEYWORD" |
| Summary vector name is unknown. | |
| static const std::string | SUMMARY_UNDEFINED_UDQ = "SUMMARY_UNDEFINED_UDQ" |
| Summary vector references an undefined UDQ. | |
| static const std::string | SUMMARY_UDQ_MISSING_UNIT = "SUMMARY_UDQ_MISSING_UNIT" |
| User-defined quantity does not have an associated unit of measure and will thus be reported without any units. | |
| static const std::string | SUMMARY_INVALID_FIPNUM = "SUMMARY_INVALID_FIPNUM" |
| Summary vector references an unknown FIP region. | |
| static const std::string | SUMMARY_EMPTY_REGION = "SUMMARY_EMPTY_REGION" |
| Summary vector references an empty region. | |
| static const std::string | SUMMARY_REGION_TOO_LARGE = "SUMMARY_REGION_TOO_LARGE" |
| Summary vector references an out-of-bounds region ID. | |
| static const std::string | SCHEDULE_INVALID_NAME = "SCHEDULE_INVALID_NAME" |
| A well or group name used before it has been fully defined through WELSPECS/COMPDAT/GRUPTREE. | |
| static const std::string | ACTIONX_ILLEGAL_KEYWORD = "ACTIONX_ILLEGAL_KEYWORD" |
| ACTIONX block uses an unsupported schedule keyword. | |
| static const std::string | PYACTION_ILLEGAL_KEYWORD = "PYACTION_ILLEGAL_KEYWORD" |
| PYACTION block uses an unsupported schedule keyword. | |
| static const std::string | ACTIONX_CONDITION_ERROR = "ACTIONX_CONDITION_ERROR" |
| Error flag marking parser errors ic ACTIONX conditions. | |
| static const std::string | ACTIONX_NO_CONDITION = "ACTIONX_NO_CONDITION" |
| Error flag marking that an ACTIONX has no condition. | |
| static const std::string | RPT_MIXED_STYLE = "RPT_MIXED_STYLE" |
| The RPTRST, RPTSOL and RPTSCHED keywords have two alternative forms. | |
| static const std::string | RPT_UNKNOWN_MNEMONIC = "RPT_UNKNOWN_MNEMONIC" |
| An unknown mnemonic in one of the RPT* keywords. | |
| static const std::string | SCHEDULE_GROUP_ERROR = "SCHEDULE_GROUP_ERROR" |
| Operation applied to incorrect/unknown group. | |
| static const std::string | SCHEDULE_IGNORED_GUIDE_RATE = "SCHEDULE_IGNORED_GUIDE_RATE" |
| Explicitly supplied guide rate will be ignored. | |
| static const std::string | SCHEDULE_WELL_IN_FIELD_GROUP = "SCHEDULE_WELL_IN_FIELD_GROUP" |
| Well parented directly to the FIELD group. | |
| static const std::string | SCHEDULE_COMPSEGS_INVALID = "SCHEDULE_COMPSEG_INVALID" |
| COMPSEGS data invalid in some way. | |
| static const std::string | SCHEDULE_COMPSEGS_NOT_SUPPORTED = "SCHEDULE_COMPSEGS_NOT_SUPPORTED" |
| COMPSEGS definition not supported. | |
| static const std::string | SCHEDULE_COMPDAT_INVALID = "SCHEDULE_COMPDAT_INVALID" |
| Connection data (COMPDAT keyword) invalid in some way. | |
| static const std::string | SCHEDULE_COMPDAT_ZERO_PERM = "SCHEDULE_COMPDAT_ZERO_PERM" |
| Connection in zero-permeability cell (COMPDAT keyword). | |
| static const std::string | SCHEDULE_ICD_MISSING_SEGMENT = "SCHEDULE_ICD_MISSING_SEGMENT" |
| ICD keyword (WSEGAICD, WSEGSICD, WSEGVALV) references a missing well segment. | |
| static const std::string | SCHEDULE_ICD_INCOMPATIBLE_PDROP_MODEL = "SCHEDULE_ICD_INCOMPATIBLE_PDROP_MODEL" |
| ICD keyword (WSEGAICD, WSEGSICD, WSEGVALV) is not compatible with the pressure drop model chosen for a particular MSW. | |
| static const std::string | SIMULATOR_KEYWORD_NOT_SUPPORTED = "SIMULATOR_KEYWORD_NOT_SUPPORTED" |
| Keyword that is not supported in the simulator. | |
| static const std::string | SIMULATOR_KEYWORD_NOT_SUPPORTED_CRITICAL = "SIMULATOR_KEYWORD_NOT_SUPPORTED_CRITICAL" |
| Keyword that is not supported in the simulator, and which should be treated as a critical failure if encountered. | |
| static const std::string | SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED = "SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED" |
| Keyword item setting that is not supported in the simulator. | |
| static const std::string | SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED_CRITICAL = "SIMULATOR_KEYWORD_ITEM_NOT_SUPPORTED_CRITICAL" |
| Keyword item setting that is not supported in the simulator and which should be treated as a critical failure if encountered. | |
Control parser behaviour in failure conditions.
The ParseContext class is a way to influence the parser's behaviour and the EclipseState/Schedule construction phase in the face of errors or inconsistencies in the input stream.
For each of the possible problem categories encountered, the possible actions are goverened by the InputErrorAction enum:
InputErrorAction::THROW_EXCEPTION
-> Throws an exception at the point of call which will
typically lead to the application shutting down shortly
thereafter. Might also include a back-trace for
subsequent analysis.
InputErrorAction::WARN
-> Warns about a potential problem, but continues loading and
analysing the input deck.
InputErrorAction::IGNORE
-> Ignores the problem without issuing any diagnostic message.
InputErrorAction::EXIT1
-> Stops parsing and shuts down the application immediately,
with a status code signifying an error condition. This
action should only be used for the most severe cases, in
which the input analysis cannot proceed. One example of
this situation would be a missing INCLUDE file.
InputErrorAction::DELAYED_EXIT1
-> Schedule application shutdown, with a failure condition
status code, at the end of loading the input file. Should
typically be used only for cases that cannot be simulated,
but for which the parser is able to continue and possibly
diagnose other inconsistencies.
The internal datastructure is a map from categories (strings) to action values (of type InputErrorAction). The context categories are intended to be descriptive and human readable, like
"PARSE_RANDOMTEXT"
The constructors will furthermore inspect the environment variables OPM_ERRORS_IGNORE, OPM_ERRORS_WARN, OPM_ERRORS_EXIT1, OPM_ERRORS_DELAYED_EXIT1 and OPM_ERRORS_EXCEPTION when forming the initial set of context actions. These variables should be set as strings of update syntax, and the categories referenced by these variables will have their actions reset to that implied by the variable name. As an example, categories referenced by the OPM_ERRORS_DELAYED_EXIT1 enviroment variable will have their actions reset to InputErrorAction::DELAYED_EXIT1.
Update syntax: The main function for updating the policy of a parseContext instance is the update() method. This member function takes a string as input, and resets the actions for categories that match the string. In particular, the string can contain shell-style wildcards ('*' and '?' as though matched by the Posix function fnmatch()), and is split on ':' or '|' to allow multiple settings to be applied in one go:
Reset one context category: update("PARSE_RANDOM_SLASH", InputErrorAction::IGNORE)
Ignore all unsupported features: update("UNSUPPORTED_*", InputErrorAction::IGNORE)
Reset two categories (names separated by ':'): update("UNSUPPORTED_INITIAL_THPRES:PARSE_RANDOM_SLASH", InputErrorAction::IGNORE)
The update function will silently ignore unknown context categories. On the other hand, member function updateKey() will throw an exception for any unknown category.
| Opm::ParseContext::ParseContext | ( | ) |
Default constructor.
Creates a context object with all known categories intialised to their default action. Some/all categories may be overridden through environment variables.
|
explicit |
Constructor.
Context object with all known categories initialised to a single user-defined action. Some/all categories may be overridden through environment variables.
| [in] | default_action | Action for all context categories that are not overridden by environment variables. |
|
explicit |
Constructor.
Context object with all known categories initialised to their default action, except for those categories that are explicitly assigned a user-defined action through the constructor argument. Some/all categories may be overridden through environment variables.
| [in] | initial | User-defined action for select context categories. |
| void Opm::ParseContext::addKey | ( | const std::string & | key, |
| InputErrorAction | default_action ) |
Define action for user-specified category.
| [in] | key | User-specified context category. If key already exists in this context object, then the context object is unchanged. Use member functions update() or updateKey() to change the action of an existing context category. |
| [in] | default_action | Default action for user-specified context category key. |
| InputErrorAction Opm::ParseContext::get | ( | const std::string & | key | ) | const |
Retrieve category action for particular context category.
| [in] | key | Context category. |
key. | void Opm::ParseContext::handleError | ( | const std::string & | errorKey, |
| const std::string & | msg, | ||
| const std::optional< KeywordLocation > & | location, | ||
| ErrorGuard & | errors ) const |
Handle an input error.
This is the primary client interface that starts input failure processing. Each failure category will be handled according to its currently configured action.
| [in] | errorKey | Failure category. |
| [in] | msg | Diagnostic message. Will be transformed through if call site additionally passes a KeywordLocation for the error handling. |
| [in] | location | Input file position of the keyword that triggered this failure condition. Nullopt if no such location is available. |
| [in,out] | errors | All diagnostic messages collected thus far. If the configured action for errorKey is WARN or DELAYED_EXIT1, the errors object will include the diagnostic message derived from msg as either a warning or an error. |
| void Opm::ParseContext::handleUnknownKeyword | ( | const std::string & | keyword, |
| const std::optional< KeywordLocation > & | location, | ||
| ErrorGuard & | errors ) const |
Handle an unknown keyword in the input stream.
This function exists mostly for backwards compatibility.
| [in] | keyword | Unknown keyword in input stream. |
| [in] | location | Input file position of the unknown keyword. Nullopt if no such location is available. |
| [in,out] | errors | All diagnostic messages collected thus far. If the keyword is not explicitly ignored–see member function ignoreKeyword()–the errors object will include a diagnostic message for this unknown keyword. |
| bool Opm::ParseContext::hasKey | ( | const std::string & | key | ) | const |
Existence predicate for particular context category.
| [in] | key | Context category. |
key is known to this context object. | void Opm::ParseContext::ignoreKeyword | ( | const std::string & | keyword | ) |
Ignore particular unknown input keyword if encountered during parsing.
Bypasses the error handling in handleUnknownKeyword().
[2026-01-19] Useful in the early development of the OPM input parser, but exists now mostly for backwards compatibility and historical reasons. See Issue OPM/opm-simulators#6541 for why we might want to remove this function.
| [in] | keyword | Unknown input keyword that should be explicitly ignored if encountered in the input stream. |
| bool Opm::ParseContext::isActiveSkipKeyword | ( | const std::string & | deck_name | ) | const |
Whether or not a particular keyword activates keyword suppression.
| [in] | deck_name | Keyword name. |
deck_name is one of the keywords that activates keyword suppression. Results depend on the input skip mode defined through setInputSkipMode(). | void Opm::ParseContext::setInputSkipMode | ( | const std::string & | skip_mode | ) |
Define how to handle simulator specific keyword suppression.
In particular, this function defines how the parser will treat the SKIP100 and SKIP300 keywords. Keywords between SKIP/ENDSKIP are always suppressed/ignored/skipped.
| [in] | skip_mode | Mode of operation for the keyword suppression algorithm. Supported values are: |
| void Opm::ParseContext::update | ( | const std::string & | keyString, |
| InputErrorAction | action ) |
Reset action for one or more context categories.
This is the most general update function. The input key string is treated as a "category selection string", and all context categories matching a pattern will reset their action. The algorithm for decoding the category selection string is:
For each element in the list from 1):
a) If the element contains a wildcard ('*'), then treat the element as a shell-style pattern and update all context categories matching this pattern.
b) Otherwise, if the element is exactly equal to a known context category, then update that category.
c) Otherwise, silently ignore the element.
| [in] | keyString | Category selection string. |
| [in] | action | New action for those categories matching keyString. |
| void Opm::ParseContext::update | ( | InputErrorAction | action | ) |
Reset action for all context categories.
| [in] | action | New action for all known context categories. |
| void Opm::ParseContext::updateKey | ( | const std::string & | key, |
| InputErrorAction | action ) |
Reset action for particular context category.
Throws an exception of type
if the context category is unknown.
| [in] | key | Context category. |
| [in] | action | New action for category key. |
|
static |
If the third item in the THPRES keyword is defaulted the threshold pressure is inferred from the initial pressure–if you still ask the ThresholdPressure instance for a pressure value this error will be signalled.
This is currently not supported.
|
static |
If the number of elements in the input record exceeds the number of items in the keyword configuration this error situation will be triggered.
Many keywords end with several ECLIPSE300 only items–in some cases we have omitted those items in the Json configuration; that will typically trigger this error situation when encountering an ECLIPSE300 deck.
|
static |
The PARSE_EXTRA_RECORDS field controls the parser's response to keywords whose size has been defined in an earlier keyword.
Example:
EQLDIMS 2 100 20 1 1 / – ... EQUIL 2469 382.4 1705.0 0.0 500 0.0 1 1 20 / 2469 382.4 1705.0 0.0 500 0.0 1 1 20 / 2470 382.4 1705.0 0.0 500 0.0 1 1 20 /
Item 1 of EQLDIMS is 2 which determines the number of expected records in EQUIL. Since there are 3 records in this EQUIL keyword however, this generates an error condition that must be handled by the parser.
|
static |
Certain keywords require, or prohibit, other specific keywords.
When such keywords are found in an invalid combination (i.e., required keyword missing required or prohibited keyword present), this error situation occurs.
|
static |
Should we allow keywords of length more than eight characters?
If the keyword is too long it will be internalized using only the eight first characters.
|
static |
For some keywords the number of records (i.e., size) is given as an item in another keyword.
A typical example is the EQUIL keyword where the number of records is given by the NTEQUL item of the EQLDIMS keyword. If the size defining XXXDIMS keyword is not in the deck, we can use the default values of the XXXDIMS keyword. This is controlled by the "missing dimension keyword" field.
Observe that a fully defaulted XXXDIMS keyword does not trigger this behaviour.
|
static |
If an include file is not found we can configure the parser to continue reading.
The resulting deck will probably not be consistent in this case.
|
static |
It turns out that random '/'–i.e.
typically an extra slash which is not needed–is quite common. This is therefore a special case treatment of the "random text" behaviour.
|
static |
The unknown keyword category controls the parser's behaviour on encountering an unknown keyword.
Observe that 'keyword' in this context means
a string of at most eight upper case letters and numbers, starting with an upper case letter.
Moreover, the unknown keyword handling does not inspect any collection of keywords to determine if a particular string corresponds to a known, valid keyword which just happens to be ignored for this particular parse operation.
Finally, the "unknown keyword" and "random text" categories are not fully independent. As a result, encountering an unknown keyword without halting the parser might lead to a subsequent piece of "random text" not being correctly identified as such.
|
static |
When defining wells and groups with the WELSPECS and GRUPTREE keywords we do not allow leading or trailing spaces.
The code in Schedule.cpp will unconditionally remove the spaces, but with PARSE_WGNAME_SPACE setting you can additionally configure the normal IGNORE|WARN|ERROR behavior.
|
static |
The RPTRST, RPTSOL and RPTSCHED keywords have two alternative forms.
The traditional style uses integer controls, whence the RPTRST keyword can be configured along the lines of:
RPTRST 0 0 0 1 0 1 0 2 0 0 0 0 0 1 0 0 2 /
The recommended way uses string mnemonics which can optionally have an integer value, e.g., something along the lines of
RPTRST BASIC=2 FLOWS ALLPROPS /
It is not possible to mix the two styles within a single keyword instance, though a particlar run may use both styles within a single model description as long as the instances are separate.
A situation with mixed input style is identified if any of the items are exclusively integers while others are string mnemonics. To avoid the situation in which values in the assignments like BASIC=2 be interpreted as integers, there should be no space character on either side of the '=' character. We nevertheless support slightly relaxed parsing for situations like
RPTRST BASIC = 2 /
where the intention is clear. The RPT_MIXED_STYLE category tries to handle this situation. Observe that really mixed input style is impossible to handle and will lead to a hard exception. RPT_MIXED_STYLE nevertheless enables configuring lenient behaviour in interpreting the input as string mnemonics.
|
static |
COMPSEGS data invalid in some way.
For instance, referencing non-existent segments or not covering all connections of a single well.
|
static |
COMPSEGS definition not supported.
Might for instance use an unsupported MD specification.
|
static |
ICD keyword (WSEGAICD, WSEGSICD, WSEGVALV) references a missing well segment.
Typically generates a warning and drops the device. Note, however, that there are likely to be other issues in the input deck when this situation occurs.
|
static |
Well parented directly to the FIELD group.
Typically generates a warning.
|
static |
If the third item in the THPRES keyword is defaulted, the threshold pressure is inferred from the initial pressure.
This is currently not supported.
|
static |
If the second item in the WHISTCTL keyword is set to YES.
The simulator is supposed to terminate if the well is changed to BHP control. This feature is not yet supported.