This way there is no constructor with an output parameter and we
prevent introducing an additional member in ActionX that is only used
in one constructor.
When encountering these (e.g. a number instead of an expression on
the left hand side) the simulator would immediately abort with an
error message like:
```
Error: An error occurred while creating the reservoir schedule
Internal error: Extra unhandled data starting with token[0] = 135
Error: Unrecoverable errors while loading input: Extra unhandled data starting with token[0] = 135
```
(The message above is for the number 135 on the left hand side)
With this change we now use the usual way of handling errors and
warnings in the parser and continue parsing.
The error message for the problem above is now
```
Error: condition of action EX1 has the following error: Left side of comparsion (135) has to be an expression!
Error: Problem with keyword ACTIONX
In model.schedule line 562
condition of action EX1 has the following error: Left side of comparsion (135) has to be an expression!
Error: Unrecoverable errors while loading input: Problem with keyword ACTIONX
In model.schedule line 562
condition of action EX1 has the following error: Left side of comparsion (135) has to be an expression!
Running simulations on those does not make sense as it seriously
limits the time span that can be simulated. In addition the OPM code
neglects 32bit issues at various places as it was written at a time
where 64bit was already ubiquitous.
Currently, we would fail in some regression tests on 32bit
systems. With this change CMake will already check whether it is run
on a 64bit system and already fail if this is not the case.
The rest of the code allows an ACTIONX keyword without any
condition (Such an action will never be evaluated). Yet
AggregateActionXData assumed that there is always at least one
condition. This lead to a segmentation fault if that was not the case.
It seemed like iAC[offset + Ix::FirstGreater] is used nowhere and
therefore we now always use 0 there. I was not brave enouogh to remove
the storage for it, because I fear this might break backwards
compatibility of the output layer.
Member function SummaryState::update_udq() did not take into account
the possibility that wells or groups might not yet have come online.
In particular, UDQSet::operator[](const string&) will throw an
exception if the argument string does not name an existing member of
the UDQ set.
This commit makes the call to operator[]() conditional on the named
entity existing and thereby enables updating well and group level
UDQs before these names have been entered in, e.g., WELSPECS or
GRUPTREE. Missing entities get the 'undefined_value'.
Fixes
```
/opm/input/eclipse/Schedule/Schedule.hpp:241:14: error: ‘function’ in namespace ‘std’ does not name a template type
241 | std::function<std::unique_ptr<SegmentMatcher>()> segmentMatcherFactory(std::size_t report_step) const;
| ^~~~~~~~
```
The existing implementation used the UDQ State object to track
pending ASSIGN operations, mainly in terms of the report step index,
but this implies that the logic implicitly assumes an ASSIGN
operation can run at most once per report step. That assumption
usually holds, but fails if the ASSIGN operation is triggered from
an ACTIONX block that happens to run multiple times within a report
step.
This commit instead introduces a new data member,
UDQConfig::pending_assignments_
that keeps track of all ASSIGN operations that have been added for
the current report step. We clear those pending assignments when
forming a new Schedule block (ScheduleState object), under the
assumption that all pending ASSIGN operations have been affected at
the previous time level (report step).
In effect, this new data member assumes the role of
UDQState::assignments
and we therefore remove that data member and update the signature of
UDQState::add_assign()
to account for the fact that the 'report_step' parameter is no
longer needed.
We don't need to reimplement logic that's already present and it is
always an error to pass a 'report_step' argument that exceeds
Schedule::size().
Pointed out by: [at]blattms.
If there are errors at the top level (e.g. RUNSPEC comes after
NOECHO), we might get very many errors and the user might miss
the relevant ones on top.
To fix this we will now print those errors last just before exiting
the simulator because of these errors.
This commit adds parser and evaluation logic necessary to handle
ASSIGN statements for segment level UDQs. This requires a segment
matching facility in UDQConfig::add_assign() which, in turn, must be
passed from the calling context in Schedule::handleUDQ(). Update
APIs accordingly.
We also split handling segment level UDQ assignments to a new helper
function, UDQConfig::add_enumerated_assign(), which might be
generalised to handle block level UDQs in the future.
In particular, use a single loop over the 'input_index' instead of
one separate loop for each supported variable type. This is in
preparation of adding suport for segment level UDQ ASSIGN statements.
This commit adds logic that enables recognizing segment level UDQs
in the summary output writer. We calculate all segment level UDQs
and add the values to the summary state for possible use in ACTIONX
too. The latter is not yet tested.
This commit adds support for calculating UDQs at the segment level,
i.e., UDQs named 'SU*'. This necessitates an API change for the UDQ
context constructor and, transitively, every function that forms UDQ
context objects. We pass a factory function that will create
segment matcher objects on demand, and provide a default
implementation of this factory function in the Schedule class.
The existing algorithm was a little too fragile and dependent on
branch numbers. This new version starts at segment 1/branch 1 and
follows Segment::inletSegments() in depth-first order, taking care
to enqueue new branches as they're encountered instead of in
numerical order. We search to the end of each branch before
switching to the next branch. This ensures determinism regardless
of branch numbering and input ordering.
While here, switch iLBR_ to a WindowedMatrix<int> to simplify branch
references in the output table.
The value in ISEG[0] does not necessarily correspond to the search
order of that segment. Rather, ISEG[0] is the depth-first ordering
of the segment search tree when traversing kick-off branches before
the main stem from which those branches kick off.
This is in preparation of revising the algorithm for ILBR/ILBS.
Mostly splitting long lines, adding missing headers, passing scalars
by value, and making three helper structures private to the
implementation file. There are no external users of these types.
If one WELSEGS keyword does not redefine every existing segment,
then we risk adding the same inlet segment multiple times. If that
happens, we get a segment structure for which there might appear to
be multiple inlet segments on the same branch which is not possible
in a tree structure. This commit prevents that situation by only
adding the new segment number if it is not already listed in
'm_inlet_segments'.
The simulator reports data::Connection objects tied to global
Cartesian cell indices whence using the 'active_index' leads to
match failures and incorrect rate attribution at the region level.
In one field case we got region level rates and cumulatives, e.g.,
ROPR and ROPT, of zero reported to the summary file when the
expected values should be non-zero.
This commit switches the region set tag matching algorithm to using
unique prefixes. This enables the parser to recognise that the
summary vector
ROPR_UNI
should match up with the user defined region set 'FIPUNIT'. In the
current master sources, the above summary vector would produce a
diagnostic message saying that the region set 'FIPUNI' (without the
final 'T') does not exist.
We add a prefix-to-canonical region set name translation table to
the FieldProps class and funnel all FIP-like requests through this
translation table. In the case of non-unique prefixes-e.g., FIPUNIT
and FIPUNIX, we currently elect to have the last keyword entered in
the simulation model "win". This behaviour may be altered in the
future if deemed appropriate/necessary.
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.
The MULTREGT keyword has an independent way of defining the default
region--the default value of item 6--and does not need the default
GRIDOPTS-base region protocol of the other *REG keywords.
Mostly to group related functions and have the same order in the
declaration and the implementation files. While here, replace an
'enum' with a strong enum since the type does not need to support
arithmetic operations.
This commit adds a new, focused, member function
NumericalAquifers::allAquiferCellIds()
which returns a vector of those Cartesian/global cells that have
been marked as defining the model's numerical aquifers through the
AQUNUM keyword. We intend to use this to identify those NNCs that
go to numerical aquifers--or between numerical aquifer cells--as
those may need special treatment when processing the MULTREGT
keyword.
This commit adds targeted support for identifying keywords whose
names exceed the maximum compatibility keyword length limit. This,
in turn, enables seamless recognition of extension keywords such as
STRESSEQUILNUM
without compromising the parser's ability to identify long keyword
names that match existing keywords in the first eight characters.
For example, the input string 'GUIDERATE' will still match the
keyword 'GUIDERAT' (without the trailing 'E') and will not be
accidentally treated as a SUMMARY section request to output a group
level UDQ vector.
The 'base' checks that the input string looks like a valid keyword
and, if so, matches the string against the builtin set of known
keywords. The full keyword recognition process additionally
includes those keywords that match against keyword collections,
typically the SUMMARY section "meta" keywords in the *_PROBE files.
We will use the 'base' recognition separately to introduce support
for extension keywords with long--more than eight character--names.
since we forcefully make numerical aquifer cells active. If a connection
cells is neighboring a numerical aquifer cell, we should be able to create
NNC to connection the cell and the nuermical aquifer cell.
This commit replaces the data members 'nx', 'ny', and 'nz' with a
copy of the GridDims object passed as an argument to the
constructor. In turn, this enables using GridDims::getIJK() to
compute the cell's IJK tuple from its global Cartesian index instead
of implementing the same calculation locally (and incorrectly).
While here, also include the layer index (K) in determining whether
or not a connection is an NNC, and do this just once instead of once
for each MULTREGT record. Cells (I,J,K) and (I,J,K+3) might be
connected across pinched-out layers and for the purposes of MULTREGT
that connection should be treated as an NNC.
In particular, ensure that we include all requisite headers, hide
type aliases that are not needed outside the class, consistently use
std::size_t, split a few long lines, and switch to range-for in one
location.
A numeric index serves the same purpose as a pointer in this very
specific instance and also has the benefit of being easily
transferable between processes. This, in turn, means we can remove
the 'getSearchMap()' and 'constructSearchMap()' member functions.
We use log10 of the value to compute the scale factor. This only makes
sense for positive values. For zero it returns -HUGE_VAL and for
negative values it returns nan where supported.
Unfortunately on some platforms (e.g. mips64el) further operations in
nan resulted in values so large that the scale factors were to large
for the columns. This resulted in invalid_argument exceptions in
strtod which were hard to debug. Out of pure luck on many platforms
the scale factors still were zero in this case.
To fix this we now always use a scale factor 0 for values less or
equal to zero. This fixes e.g. Debian packages on mips64el.
In addition we now make sure that printed scale factors have less
characters than the column width. Otherwise parsing the *.RSM file
might fail because of throwing strtod function.
These are not directionally dependent, and they have a unit string
of 'Pressure'. This didn't use to matter, but upcoming changes
will depend on the unit string being correct.
In particular:
- Order include statements
- Simplify logic
- Adjust whitespace
This is in preparation of making FIP* array names unique only up to
the first six characters (i.e., "FIP" + at most three others).
If ErrorGuard's lists have not been cleared, then it's destructor
will call std::exit(1). As that is quite unfortunate in a test, we
clear it's message stack at the end of the tests.
Without the include compilation fails with
```
/opm/io/eclipse/EclFile.hpp:92:17: error: ‘uint64_t’ was not declared in this scope
92 | std::vector<uint64_t> ifStreamPos;
| ^~~~~~~~
In file included from src/opm/io/eclipse/EclOutput.cpp:20:
opm/io/eclipse/EclUtil.hpp:56:5: error: 'uint64_t' does not name a type
56 | uint64_t sizeOnDiskBinary(int64_t num, Opm::EclIO::eclArrType arrType, int elementSize);
| ^~~~~~~~
```
This commit adds a new member, well_structure_change, to the
SimulatorUpdate structure. The member defaults to 'false', but
will be set to 'true' if an ACTIONX block contains at least one of
a select group of keywords that affect the model's well topology.
In particular, set this member to 'true' if the ACTIONX block has
at least one of the keywords
- COMPDAT
- WELOPEN
- WELSPECS
This will enable adding simulator logic to open or create wells in
the middle of a report step.
In particular, recognize the summary vectors
- SDENx -- Phase density of phase 'x' (segment conditions)
- SDENM -- Fluid mixture density without flowing fraction exponents
- SMDEN -- Fluid mixture density with flowing fraction exponents
If the user did not set MULTNUM but has e.g.
```
MULTIREG
PORV 0.8 2 /
PORV 0.8 7 /
PORV 0.8 3 /
PORV 0.8 8 /
PORV 1 4 /
PORV 1 9 /
/
```
he at least gets a warning like
```
Warning: MULTNUM region 2 has no active cells when processing operation MULTIREG on keyword PORV.
Please check whether this is on purpose or you missed defining the region properly.
In file /path/to/model/porvmultsny.inc, line 1
```
This should aid him with detecting possible errors.
This commit adds the requisite backing storage and parser support
for capturing and transporting simulator-level calculation of phase
and mixture density value for purpose of summary file output. To
this end, make 'SegmentQuantity' into a template on a set of defined
items and make SegmentPhaseQuantity into a specialisation of this
template. Add a new specialisation, SegmentPhaseDensity, which
holds phase densities (oil, gas, water), and fluid mixture densities
with and without flowing fraction exponents.
These will be used to transport the values needed to output segment
level summary vectors
SDENx -- Phase density of phase 'x' (O, G, W)
SDENM -- Fluid mixture density without flowing fraction exponents
SMDEN -- Fluid mixture density with flowing fraction exponents
Mostly to aid future maintenance. While here, also re-indent the
other unit tables and add a type alias (UnitTable) to avoid spelling
out the 'unordered_map<>' type repeatedly.
In particular, add support for
SxFT - Cumulative flow of phase 'x'
SxFV - Free flow velocity of phase 'x'
SxHF - Free flow holdup fraction of phase 'x'
SxVIS - Phase viscosity of phase 'x'
The last three of these were added to the RFT file in 802a401a8,
but are also useful in the summary output file. In the interest of
avoiding duplicate logic, refactor the existing segment-related
quantity calculation/extraction in terms of callbacks.
Have to correct for different reference state between test data and co2tables.inc. Took out some enthalpy data due to one data point giving unreasonably large error (probably related to reference state difference).
```
Error: Unknown keyword: KEY6
Error: Unrecoverable errors while loading input: Problem with keyword
In <memory string> line 0
Unknown keyword: KEY6
```
does not tell the user where his/her error is.
This is now changed to
```
Error: Unknown keyword: KEY6
Error: Unrecoverable errors while loading input: Problem with keyword NE6
In /path/to/include/grid/file.inc line 7
Unknown keyword: KEY6
```
which gives the user a greater chance of finding out what is wrong.
Reference data is located in JSON files.
Some code is commented out due to insufficient reference data, or in the case of CO2, interpolation around saturation curve does not capture the liquid/vapor jump to a reasonable tolerance.
For an include directive with a path with trailing whitespace, e.g.
```
INCLUDE
'/home/model/../include/file_trailing_ws.ext ' /
```
the current error message
```
Error: No such file: /home/model/../include/file_trailing_ws.ext
```
is changed to
```
File '/home/model/../include/file_trailing_ws.ext ' included via
INCLUDE directive does not exist. Note that the file name contains trailing whitespace.
```
This should at least make it easier to spot this error.
An alternative would be to trim the string, but people using quotes
should actually know what they are doing.
This commit implements the WPAVE keyword and its associate WBPn
well level report quantities. We support all valid settings of
WPAVE and WWPAVE. The various weighted averages are accumulated
through compensated summation of both the numerator and denominator
terms for the inner block, the direct/immediate level 1 neighbours,
and the diagonal level 2 neighbours. We combine those contributions
to the WBP, WBP4, WBP5, and WBP9 terms when we "commit" the
contributions (Accumulator::commitContributions()), per connection
for values weighted by the connection transmissibility factor, and
per well for values weighted by pore volumes.
We distinguish OPEN from ALL connections through callback functions
in the implementation of accumulateLocalContributions() and the per
connection weighting terms are provided as another set of callback
functions depending on the value of the inner block weighting factor
F1.
Depth correction (NONE, WELL, or RES) is affected through a separate
set of callback functions used in the implementation of
'connectionPressureOffset'.
We discover source locations in a two-step process. At WBPn
calculation construction time, we exclude only those cells that are
outside the model's dimensions. The user is then expected to call
member function pruneInactiveWBPCells(), typically at the
CalculatorCollection level, at a later time in order to prune
inactive cells. This two-step split is necessary because we do not
have a complete global view of the model's active cells in a
parallel run. It is very possible that the WBPn calculation on one
rank will require source values from another rank and that begets
this extra caution.
The user must call inferBlockAveragePressures() to compute the WBPn
values. Once completed, the result values may be extracted by
calling member function averagePressures(). We expect that the user
will provide a complete set of up-to-date source values when calling
this member function, both at the reservoir and the well connection
levels.
In particular, the inner block weighting factor F1 must not exceed
the value 1.0 and the CTF-vs-PV contribution weighting factor F2
must not be less than 0.0 or greater than 1.0.
Stop input parsing if either of these two conditions are violated.
The *_history() helper functions assumed that all wells would be
flowing. This is an incorrect assumption and would lead to, e.g.,
field-level observed rates being non-zero even if all wells were
stopped/shut.
This commit adds a check for non-flowing wells, and omits flow rate
contributions in that case.
Mostly for readability. While here, also switch to using compiled
item names instead of raw strings to access the DeckItems which
constitute the WPAVE and WWPAVE keywords.
with more testing, it looks like when multiple records are entered. The
records with WREV mode and records with CIRR and CREV modes work
differently in term of overwriting the previous records. So it is
necessary to store them separately.
In particular
* Tag a single argument constructor as 'explicit',
* Remove an unused private function
* Fix mismatched tags (struct vs. class) in forward declaration
* Return 'false' in an impossible updateHyst() case
While here, also use a real UnitSystem object instead of creating
a METRIC system just to infer unit strings.
Commit 5a060910a distinguished ASSIGN from DEFINE at the field
level, but did not make the same distinction at the well or group
levels. Passing 'report_step' instead of assign.report_step() as an
argument to UDQState::assign() means we'd be running every ASSIGN
operation on every report step which would reset the state. That's
a bug if the model defines some sort of cumulative UDQ at the well
or group levels.
An assignment of the form
ASSIGN WUPPERTAL 354.572 /
should create a UDQ set of size equal to the number of wells in
the model, not just the wells already flowing-especially if the
assignment happens on the very first report step before any wells
are flowing.
This commit adds a new container class,
PAvgDynamicSourceData
which wraps a single vector<double> which in turn backs source data
items for
- pressure values
- fluid mixture densities
- dynamic pore-volumes
at a collection of source locations-active cells or well reservoir
connections. We provide read-only and read-write accessors to the
underlying data items for a single source location through subscript
operator (read only) and named assignment (set(), read-write) member
functions. The latter is available only when the underlying range
of data values is mutable (e.g., SourceDataSpan<double>) as opposed
to immutable (e.g., SourceDataSpan<const double>).
This initial commit changes the Summary class's API for consuming
block-averaged well level pressure values (summary keywords WBPn).
The former approach was intended to consume a collection of source
values--pressures, densities, and pore-volumes--and then to defer
calculation of the WBPn summary vectors to the Summary class.
This commit introduces a 'WellBlockAvgPress' container class which
holds precomputed WBPn results and the intention is to move the
calculation to the simulator side for greater parallelism.
There's no longer any reason to return 'const string', since that
inhibits move semantics. While here, also reorder the include
statements and split a few long lines.
The NumPy module might not be available on the host system. In that
situation the PYINPUT_BASIC unit test would fail with a segmentation
violation. Guard against this problem by catching ImportError and
checking if the result deck has 'DX' instead of blindly asserting
that 'DX' exists.
In particular Python::exec() now returns 'false' instead of throwing
an exception if we don't have 'EMBEDDED_PYTHON'. Similarly for the
Python::Python constructor when called with an 'Enable::ON' argument.
In particular, check that
1. Number of MS wells <= WSEGDIMS(1)
2. Number of segments per well <= WSEGDIMS(2)
3. Number of branches per well <= WSEGDIMS(3)
for all report steps in the simulation run.
Example diagnostic message of a case that violates limits 2 and 3:
Error: Problem with keyword WSEGDIMS
In CASE.DATA line 60
The case has a multi-segmented well with 246 well segments, but at most 200 are allowed in WSEGDIMS.
Please increase item 2 of WSEGDIMS to at least 246
Error: Problem with keyword WSEGDIMS
In CASE.DATA line 60
The case has a multi-segmented well with 105 lateral branches, but at most 5 are allowed in WSEGDIMS.
Please increase item 3 of WSEGDIMS to at least 105
This was missing proper quoting for the case that dune-common_CXX_FLAGS
is empty.
Error I got was:
```
-- Version 2.10.0 of dune-common from /home/mblatt/src/dune/opm-master/dune-common/opm-parallel
CMake Error at CMakeLists.txt:369 (string):
string sub-command REPLACE requires at least four arguments.
-- Configuring incomplete, errors occurred!
```
these constants are known at compile time.
as a bonus, this also quells warnings
emitted by infer due to it not seeing through
the implicit lambda captures
This commit adds sanity checking to the cell references of block
level summary vectors (e.g., BPR or BGSAT). If the summary vector
references a cell that's outside the models declared dimensions we
issue a warning and ignore that particular summary vector request.
If for example pybind11 or python changes the type of exception thrown
and we expect a different (the old one) in our boost test, then the python
of pybind11 is left in an unusable condition and the next attempt of
running might produce hard to debug exception, This happened on Debian
bookworm (pybind 2.10.3, python 3.11) for syntax errors.
That way, they could become reusable for other keywords and we can
exploit the commonality between MAXWELLS and MAXGROUPS. Moreover,
we can reduce the visual clutter of the body of each checking
function and fix some singular/plural mismatches in the diagnostic
messages.
The [IR]SEG and ILB[RS] arrays must be able to accommodate the
maximum number of segments and branches used in the run. This
commit incorporates the dynamic maximum sizes. If those sizes
exceed the maximum values entered in WSEGDIMS, then the resulting
restart file will not be fully compatible with other simulation
software.
the vanilla setup-tools doesn't get the triplet correctly for some
reason. also use cmake from pip as cmake 3.16 in the image has a bug
in the python find rule
the embedding headers are not available on the manylinux2014 containers
used to build the pypi packages. since this is anyways more correct
fix it this way
Classes which inherit from FlatTableWithCopy and just call the base
class implementation of 'serializeOp()' don't really need a separate
implementation of that member function.
Noticed by: [at]blattms.
This commit adds the expected behaviour for all-defaulted records in
ROCK, provided the all-defaulted records are not the first of the
keyword. Similarly to, e.g. PVTW, all-defaulted records are treated as
copies of the immediately preceding record.
In other words, given
ROCK
-- REF. PRES COMPRESSIBILITY
280.000 5.6E-5 /
/
the second record is supposed to be a copy of the first.
this went unnoticed since there are no UDQDefines in the pre-simulation
Schedule broadcast for parallel. however it causes issues for serialized
restarts
This is done by:
- splitting the catch(std::exception) in KeywordHandlers.cpp
in two and catching std::logic_error separately,
- not adding "Internal error" in the OpmInputError constructor
taking std::exception.
In addition, two possible user errors related to mixing groups
and wells as children of a single group have been changed to
std::runtime_error.
This commit adds a special case for handling the dynamic nature of
the number of records in the ROCK keyword. In particular, if the
ROCKOPTS keyword is NOT entered before ROCK, then the number of
records is NTPVT--item 2 from TABDIMS. Conversely, when ROCKOPTS is
entered before ROCK, the number of records in the latter depends on
the setting in item 3 of ROCKOPTS.
This interaction cannot be easily captured in our JSON-based models,
so we introduce a special size class, SPECIAL_CASE_ROCK, that only
applies to the ROCK keyword and implement the logic in a dedicated
function in 'Parser.cpp'. Once we have determined the correct
number of records, we form a RawKeyword of type FIXED and defer
further processing to the existing handling of fixed-sized keywords.
Add a selection of unit tests to exercise the new behaviour.
Switch if/else chain out in favour of a map-based approach. This
simplifies adding new enumerators. While here, also return string
objects instead of constant string objects.
It is needed as we will call pybind11_add_module which calls
python3_add_library (in recent pybind11 versions). That
function is only there if the development component is searched for
and found.
Most H2 properties are calculated using Helmholtz free energy EOS.
Moved Helmholtz equations from Brine_H2 to H2 class.
New file with simple H2 property calculations based on ideal gas.
convertECL \- Converter for Eclipse files (binary <-> formatted format)
convertECL \- Converter for Eclipse files (binary <-> formatted
format)
.SHSYNOPSIS
.BconvertECL
[\fI\,OPTIONS\/\fR] \fI\,ECL_DECK_FILENAME\/\fR
.SHDESCRIPTION
convertECL needs one argument which is the input file to be converted. If this is a binary file the output file will be formatted. If the input file is formatted the output will be binary.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.