In particular, add support for outputting the following vectors
- WOGR -- Well level oil/gas ratio
- WWGRH -- Well level water/gas ratio (observed rates)
- FPRH -- Field level average pressure (hydrocarbon volume)
- FHPV -- Field level total hydrocarbon pore-volume
This commit switches the existing, somewhat spotty, support for
matching region set tags on region level summary vector keywords.
We leverage the recent support for 'deck_name_regex_suffix' keys in
the JSON keyword model to extend the keyword matching algorithm to
also account for these region set tags.
There is a potential for false positives here, but we'll use this
as an initial proof-of-concept implementation.
If multiple records, from different region sets and region
IDs--e.g., both regions 1/2 in 'M' (MULTNUM) and regions 2/3 in 'F'
(FLUXNUM) applies to the same connection as might be the case in
MULTREGT
1 2 0.5 1* 'NNC' 'F' /
2 3 0.1 1* 'NNC' 'M' /
/
then the total multiplier value is the product of the values from
each record.
This commit revises the region set loop to accumulate the total
multiplier value instead of "just" returning the first match.
The simulator already calculates the requisite values, but due to
the requisite summary keyword RPRH not being listed among the known
region level vectors the output layer did not write the values to
the summary file. This commit adds the requisite table entry.
This is intended as a possibly temporary measure for processing
explicitly assigned NNCs (keywords NNC/EDITNNC/EDITNNCR) along with
those NNCs arising from numerical aquifers, and for which there is
no associate face direction.
Add a set of unit tests to probe the implementation of all MULTREGT
connection behaviours as exhibited by MULTREGTScanner member
functions getRegionMultiplier() and getRegionMultiplierNNC().
- Enables use with THERMAL. Note that enthalpy of H2 dissolution process is not included due to lack of published data on this (as far as I have seen).
- Enables use with DIFFCGAS and DIFFCWAT.
- Enables use with dynamic brine module.
- New H2 table made with Coolprop which includes enthalpy data.
Region level summary keywords may have suffixes which refer to user
defined region sets ('FIP*' keyword). This commit prunes those
suffixes when performing function lookup, so that we do not get
false negatives.
To this end, introduce a new helper function
EclIO::SummaryNode::normalise_region_keyword()
and use this both when determining the summary keyword type (rate,
cumulative, pressure &c) and when looking up evaluation functions
for region level summary vectors. The new helper could arguably
have been integrated into the existing 'normalise_keyword()' helper
function, but that would have necessitated a different change
elsewhere in the code base. For now, we keep this helper as a
separate function.
This commit implements the 'NOAQUNNC' behaviour in member function
MULTREGTScanner::getRegionMultiplier()
We use the new 'aquifer_cells' data member to identify connections
to and within numerical aquifers and ignore those if the record
stipulates 'NOAQUNNC' behaviour.
This commit adds a new data member
MULTREGTScanner::aquifer_cells
which holds a sorted sequence of Cartesian/global cell indices
corresponding to the cells which comprise the model's numerical
aquifers. These are needed to properly identify whether or not a
connection--i.e., a cell pair--would constitute a "numerical aquifer
connection" and be subject to 'NOAQUNNC' treatment.
We assign the numerical aquifer cells as part of member function
EclipseState::conveyNumericalAquiferEffects
which runs at EclipseState construction time. We know all numerical
aquifers at that point.
This is mostly to have a general solution for matching region level
summary keywords which may reference a user-defined region set (FIP
keyword, e.g., FIPXYZ) through tags like
RPR__XYZ -- Average pressure in region, FIPXYZ region set
ROPR_XYZ -- Oil production rate in region, FIPXYZ region set
RODENXYZ -- Average oil density in region, FIPXYZ region set
The initial approach introduced in commit cfbafc236 was limited to
selected keywords.
To this end, add a new data member
std::string ParserKeyword::m_matchRegexSuffix
and introduce a new member function
bool ParserKeyword::matchesDeckNames()
which matches a candidate keyword string against the m_deckNames,
and, if applicable, as a regular expression against m_deckNames when
appended m_matchRegexSuffix.