This commit switches the custom diagnostic message formatting based
on std::ostringstream to using a formatter implemented in terms of
the fmt::format function. This removes the custom indentation from
earlier. Note that we output at most four records to the console,
including a message limit notification if applicable, and that this
limit is currently not adjustable by the user. We do on the other
hand output all flipped records to the .PRT file.
New Example Diagnostic Output:
* To the Console
Warning: Non-Monotonic Oil Formation Volume Factor Detected in Keyword PVTO, PVTNUM=1
In /path/to/PVTO.INCL line 6
Record 9: FVF 1.234 at RS 123.456 is not greater than FVF 2.345 at RS 121.212
Record 10: FVF 1.233 at RS 123.457 is not greater than FVF 1.234 at RS 123.456
Record 11: FVF 1.233 at RS 123.460 is not greater than FVF 1.233 at RS 123.457
Report limit reached, see PRT-file for additional records.
* In the PRT File (Unlimited Records)
Warning: Non-Monotonic Oil Formation Volume Factor Detected in Keyword PVTO, PVTNUM=1
In /path/to/PVTO.INCL line 6
Record 9: FVF 1.234 at RS 123.456 is not greater than FVF 2.345 at RS 121.212
Record 10: FVF 1.233 at RS 123.457 is not greater than FVF 1.234 at RS 123.456
Record 11: FVF 1.233 at RS 123.460 is not greater than FVF 1.233 at RS 123.457
Record 12: FVF 1.233 at RS 123.461 is not greater than FVF 1.233 at RS 123.460
Record 13: FVF 1.233 at RS 123.470 is not greater than FVF 1.233 at RS 123.461
The length of each 'Record' line is 78 characters as of this change
(assuming METRIC conventions, FIELD conventions not tested). The
length of the 'In ...' line depends on the number of characters in
the full filepath.
Such cases do happen in real field models and we should diagnose the
existence of non-increasing BO as a function of RS, but we should
not terminate the simulation run.
This commit introduces a way of diagnosing an uncommon but possible
issue in the PVTO table. If the formation volume factor (BO) in the
saturated table (record 1 of each subtable) does not increase
monotonically as a function of the dissolved gas/oil ratio (RS),
then there is a risk that the simulation run will have convergence
problems.
We add a special purpose member function
PvtoTable::nonMonotonicSaturatedFVF
which checks for this condition and returns a vector records for
which the condition is true. The new member function
TableManager::checkPVTOMonotonicity
then collates these records into a formatted string which is printed
to the console and the .PRT file.
Example Diagnostic Output:
Warning: Non-Monotonic Oil Formation Volume Factor Detected
* PVTO [PVTNUM = 1]
Record 9: FVF 1.23 at RS 123 is not greater than FVF 2.34 at RS 120
Record 10: FVF 1.22 at RS 125 is not greater than FVF 1.23 at RS 123
Record 11: FVF 1.21 at RS 125 is not greater than FVF 1.22 at RS 125
Pass along the set of category-specific "extra" vectors to
'makeEntities' to avoid repeating the "extra" calls at each of the
well, group, and field levels.
This commit ensures that we also always output guiderate values to
the restart file. Always calculating these summary quantities we
leverage the restart output support added in commit 317d1ba14 (i.e.,
in PR #1792).
This commit adds an evaluation function for the GPR summary vector.
We assume that the actual value is calculated elsewhere and passed
in unchanged from the caller of Summary::eval(). We therefore need
only convert the value to output units and hook this procedure up to
the table of known output functions.
Add a simple unit test for demonstration.
This commit adds support for recognizing a small subset of the
summary quantities that are reported at the node level of an
extended network--especially the 'GPR' keyword.
Briefly, we add a new 'Node' config category and a processor for
this category which knows about the distinction between nodes and
groups. It uses member function ExtNetwork::node_names() to produce
configuration nodes whose named entity is the node rather than a
group. Deriving this list of node names across all timesteps is
potentially expensive, so perform this operation at most once and
pass the result into the processor from the SummaryConfig
constructor.
Add a simple unit test for demonstration purposes.