This commit adds a new helper class,
Opm::data::TypeSpecificData
which holds type-specific sub-structures for Carter-Tracy,
Fetkovich, and Numerical aquifers. We implement this facility in
terms of a std::variant<> of simple structures. In turn, use the
type-specific data for numerical aquifers to fill in the initial
aquifer cell pressures where not available in the input data.
This commit switches to using the simulator's notion of initial
aquifer pressure, aquifer mass density of water, aquifer water
viscosity, and aquifer time constants. These values will,
ultimately, come from the *_data structures for the analytic
aquifers but the simulator is the only system that is able to
compute equilibrated initial pressure values if that is defaulted in
the input.
This commit renames various data members of the *_data structures to
aid the reader who may not be intimately familiar with the details
of the analytic models. We switch the 'initial_pressure' into an
optional<double> instead of a pair<bool,double> with 'std::nullopt'
representing defaulted initial aquifer pressure values in the input
file.
We also add logic and private data members to compute/store aquifer
time constants, mass density of water, water viscosity and, in the
case of Carter-Tracy aquifers, also the influx constant 'beta'.
This centralises the requisite logic which reduces the risk of
subtle errors.
In the case of defaulted initial pressures, we support deferred
calculation of aquifer properties until the equilibrium pressure is
known. Users are then expected to assign a value to the initial
pressure members and call 'finishInitialisation()' to derive those
properties.
While here, also switch to using raw string literals instead of
concatenated and escaped literals for the embedded deck strings in
the ParserTests.
This commit generates the IAQN and RAQN restart vectors pertaining
to numeric aquifers. The arrays are sized according to the number
of records in the input AQUNUM keyword. RAQN is a mix of static and
dynamic information, including the cumulative total inflow volume of
water from the aquifer into the model. IAQN is exclusively static
information.
We add new members to 'AggregateAquiferData' and ensure that the
numeric aquifer arrays remain empty when no numeric aquifers exist
in the model. Add unit tests for these new arrays and update
existing unit tests to account for new dimension items.
We support both Fetkovich and Carter-Tracy aquifers. We presently
output trivial values only in the 'ACAQ' (per-connection, double
precision elements), but otherwise assemble reasonable values for
many items.
We leverage the fact that the aquifer connections do not change
throughout the simulation run. The "Aggregate" API is therefore
constructed in such a way that most of the expensive operations
(e.g., mapping active cell IDs to their columnar counterparts)
happens once (in the constructor) and the per-aquifer operations are
performed for each restart output step. We intend that one aquifer
output object be constructed at the start of the simulation run, if
needed, and that this object will live until simulation shutdown.