We need a global view of face-area fractions if aquifer connections
happen to be shared between processes. Add a new helper function,
BlackoilAquiferModel::computeConnectionAreaFraction()
that performs a collective operation to compute the total face areas
and then defers to the local aquifer objects to compute their face
area fractions.
While here, also split the initialisation of analytic aquifers into
two parts, one for the face area and connection mappings, and one
for the connection depths. Run the former as part of the object
constructor and the latter as part of 'initQuantities()'. This
ensures that we can computeConnectionAreaFraction() for all analytic
aquifers before assigning solution quantities from the restart file.
If, in a restarted run, a single analytical aquifer object happens
to connect to the reservoir model from multiple separate MPI
processes we must not attribute the full historic cumulative water
production from the aquifer to each process.
This commit makes a rough estimate based on the connection areas of
how much of the total cumulative production is attributable to each
process and reduces the restart value using that fraction. This is,
at best, a hack but it is currently the best we can do with the
information available in the restart files. Complete fidelity will
entail tracking cumulative production at the connection level.
This commit switches to using the analytic aquifer's intrinsic water
properties (i.e., the mass density and the viscosity), and to get
the time constant from the *_data structure instead of calculating
this value with separate logic. Note that this switches to using a
single density value for the aquifer instead of separate density
values for each aquifer connection.
If the aquifer's initial pressure is defaulted we still compute an
equilibrated initial pressure value. We then use the *_data
structure's 'finishInitialisation()' member function to derive the
aforementioned PVT properties.
Finally, report these values in the aquifer type-specific sub
structures of data::AquiferData for restart output purposes.
This commit adds logic to communicate more dynamic aquifer values
between the simulation and I/O layers. In particular, we ensure
that we allocate the 'aquFet' and 'aquCT' substructures of the
dynamic aquifer data as appropriate and that we collect this
information on the I/O rank as part of the restart output process.
We furthermore make the 'ParallelRestart' facility aware of dynamic
aquifer data in preparation of loading these values from the restart
file.
This commit switches to using 'map<>::insert_or_assign()' as the
primary interface for collecting dynamic aquifer data. In turn,
this activates move semantics for the substructures and reduces the
number of times the data is copied.
Insert_or_assign requires the key, so provide this value--i.e., the
aquifer ID--as part of the AquiferInterface.
This commit adds a new member function,
AquiferInterface::initFromRestart()
that consumes a vector<data::AquiferData> constructed from
information in the restart file's SAAQ and XAAQ vectors. At the
moment, we use the initial aquifer pressure, the total produced
liquid volume and the current aquifer pressure at restart.
We implement the interface's member function in terms of the virtual
function
AquiferInterface::assignRestartData()
that must be overridden in derived classes.
Implement a trivial such function for Carter-Tracy aquifers, and a
function that only stores the current aquifer pressure for the
Fetkovich aquifer model.
Additionally, record whether or not the aquifer object was
initialised from a previous solution. If so, don't reset total
produce liquid volumes or aquifer pressures to their base values
from the model input file.