pofff.jobs.data module#

Generate FluidFlower benchmark data from OPM Flow results.

The job locates the current simulation, reads restart, grid, initialization, and summary files through the OPM Python bindings, calculates sparse benchmark time series, maps saturation and dissolved CO2 to the reporting grid, and writes CSV files at the requested evaluation times.

class pofff.jobs.data.SimulationContext(resolution: NDArray, dense_t: NDArray, maps: Path, where: Path = PosixPath('.'), sparse_t: float = 600.0, dims: NDArray = <factory>, sim: Path | None = None, unrst: ERst | None = None, ini: EclFile | None = None, egrid: EGrid | None = None, smspec: ESmry | None = None, times: list[float] = <factory>, times_summary: NDArray | None = None, time_initial: float = 0.0, porv: NDArray | None = None, actind: NDArray | None = None, gxyz: tuple[int, int, int] | None=None, norst: int | None = None)[source]#

Bases: object

Store simulation files, time grids, and OPM grid metadata.

The object is initialized from command-line selections. OPM handles, report times, active-cell indices, pore volumes, and grid dimensions are populated after the current simulation base name is located.

Attributes:
resolution

Numbers of benchmark reporting cells in x and z order.

dense_t

Requested dense-output times in seconds.

maps

Path to the NumPy mapping from reporting cells to simulation cells.

where

Directory containing simulation files and receiving generated CSV data.

sparse_t

Uniform sparse-output interval in seconds.

dims

FluidFlower dimensions in x, y, and z order, in metres.

sim

Simulation base path without an OPM file extension.

unrst

Open OPM restart result, or None before results are loaded.

ini

Open OPM initialization result, or None before results are loaded.

egrid

Open OPM grid result, or None before results are loaded.

smspec

Open OPM summary result, or None before results are loaded.

times

Restart times relative to the start of CO2 injection, in seconds.

times_summary

Summary times relative to the start of CO2 injection, in seconds.

time_initial

Absolute simulator time at the start of CO2 injection, in seconds.

porv

Pore volumes in global cell order.

actind

Global indices of cells with positive pore volume.

gxyz

Simulation-grid dimensions in x, y, and z order.

norst

Number of restart report steps.

actind: NDArray | None#
dense_t: NDArray#
dims: NDArray#
egrid: EGrid | None#
gxyz: tuple[int, int, int] | None#
ini: EclFile | None#
maps: Path#
norst: int | None#
porv: NDArray | None#
resolution: NDArray#
sim: Path | None#
smspec: ESmry | None#
sparse_t: float#
time_initial: float#
times: list[float]#
times_summary: NDArray | None#
unrst: ERst | None#
where: Path#
class pofff.jobs.data.SparseResults(ctx: SimulationContext, times_data: NDArray = <factory>, fipnum: NDArray = <factory>, dx: NDArray = <factory>, dz: NDArray = <factory>, pop1: NDArray = <factory>, pop2: NDArray = <factory>, moba: NDArray = <factory>, imma: NDArray = <factory>, dissa: NDArray = <factory>, seala: NDArray = <factory>, mobb: NDArray = <factory>, immb: NDArray = <factory>, dissb: NDArray = <factory>, sealb: NDArray = <factory>, sealt: NDArray = <factory>, m_c_series: list[float] = <factory>, m_c: NDArray | None = None)[source]#

Bases: object

Store sparse FluidFlower quantities before writing the time series.

The state is initialized by _initialize_sparse_results() with the uniform time grid, region identifiers, and cell dimensions. Pressure, mobile, immobile, dissolved, seal, and migration quantities are then populated from OPM summary and restart results and interpolated to times_data.

Attributes:
ctx

Shared simulation context and OPM file handles.

times_data

Uniform sparse-output times in seconds.

fipnum

FIPNUM values in global cell order.

dx, dz

Cell dimensions in x and z order, in metres.

pop1, pop2

Pressure time series at the two observation points, in pascals.

moba, imma, dissa, seala

Mobile, immobile, dissolved, and seal CO2 masses in box A, in kilograms.

mobb, immb, dissb, sealb

Mobile, immobile, dissolved, and seal CO2 masses in box B, in kilograms.

sealt

Total CO2 mass in the seal regions, in kilograms.

m_c_series

Mass-center migration values calculated at restart times.

m_c

Mass-center migration values interpolated to times_data, in metres.

ctx: SimulationContext#
dissa: NDArray#
dissb: NDArray#
dx: NDArray#
dz: NDArray#
fipnum: NDArray#
imma: NDArray#
immb: NDArray#
m_c: NDArray | None#
m_c_series: list[float]#
moba: NDArray#
mobb: NDArray#
pop1: NDArray#
pop2: NDArray#
seala: NDArray#
sealb: NDArray#
sealt: NDArray#
times_data: NDArray#
pofff.jobs.data._compute_mass_center_metric(ctx: SimulationContext, res: SparseResults) None[source]#

Calculate the box-C mass-center migration series.

Parameters:
ctxSimulationContext

Loaded simulation context and restart metadata.

resSparseResults

Sparse result state receiving migration values.

Raises:
SystemExit

If restart results or grid metadata are unavailable.

pofff.jobs.data._extract_summary_quantities(ctx: SimulationContext, res: SparseResults) None[source]#

Extract pressures and regional CO2 masses from OPM summary vectors.

Parameters:
ctxSimulationContext

Loaded simulation context and OPM summary data.

resSparseResults

Sparse result arrays populated in place.

Raises:
SystemExit

If summary or restart results are unavailable.

pofff.jobs.data._find_simulation_base(path: Path) Path[source]#

Locate the simulation base name from an OPM restart file.

Parameters:
pathPath

Directory to search for a .UNRST file.

Returns:
Path

Restart-file path without its extension.

Raises:
SystemExit

If the directory contains no .UNRST result.

pofff.jobs.data._get_initial_water_pressure(unrst: ERst, fipnum: NDArray, region: int) float[source]#

Return the initial water pressure for one FIP region.

Parameters:
unrstOpmRestart

Open OPM restart result containing pressure and capillary pressure.

fipnumNDArray

FIPNUM values in global cell order.

regionint

FIPNUM identifying the observation-point region.

Returns:
float

Water pressure corrected for capillary pressure, in pascals.

pofff.jobs.data._initialize_sparse_results(ctx: SimulationContext) SparseResults[source]#

Initialize sparse time coordinates and OPM cell-property arrays.

Parameters:
ctxSimulationContext

Loaded simulation context with initialization data and restart times.

Returns:
SparseResults

Sparse state initialized with times, FIPNUM, DX, and DZ arrays.

Raises:
SystemExit

If initialization data or restart times are unavailable.

pofff.jobs.data._interpolate_sparse_quantities(ctx: SimulationContext, res: SparseResults) None[source]#

Interpolate sparse quantities to a uniform time grid.

Parameters:
ctxSimulationContext

Simulation and summary time coordinates.

resSparseResults

Sparse quantities replaced by their interpolated arrays.

pofff.jobs.data._read_opm_results(ctx: SimulationContext) None[source]#

Load OPM restart, initialization, grid, and summary results.

Populate OPM handles, injection-relative times, pore volumes, active-cell indices, and grid dimensions on ctx.

Parameters:
ctxSimulationContext

Mutable simulation context with an initialized simulation base path.

pofff.jobs.data._sum_summary_vectors(smry: ESmry, expressions: Iterable[str]) NDArray[source]#

Sum selected OPM summary vectors and convert CO2 to kilograms.

Parameters:
smryOpmSummary

Open OPM summary result containing the requested vectors.

expressionsIterable[str]

OPM summary-vector names to add.

Returns:
NDArray

Total mass time series in kilograms.

pofff.jobs.data._write_dense_outputs(ctx: SimulationContext) None[source]#

Write spatial maps at the requested dense-output times.

Map active-cell saturation and dissolved-CO2 concentration to the reporting grid and write one CSV file for every requested restart time that is available.

Parameters:
ctxSimulationContext

Loaded restart data, reporting-grid resolution, and cell mapping.

Raises:
SystemExit

If restart or initialization data are unavailable.

pofff.jobs.data._write_sparse_outputs(ctx: SimulationContext) None[source]#

Calculate and write the sparse benchmark time series.

Parameters:
ctxSimulationContext

Loaded simulation context and OPM results.

pofff.jobs.data._write_spatial_map_csv(ctx: SimulationContext, refxz: list[NDArray], sgas: NDArray, cco2: NDArray, hours: float) None[source]#

Write one saturation and concentration reporting-grid map.

Parameters:
ctxSimulationContext

Output location and reporting-grid resolution.

refxzlist[NDArray]

Reporting-cell centre coordinates in x and z order, in metres.

sgasNDArray

Gas saturation in reporting-cell order.

cco2NDArray

Dissolved-CO2 concentration in reporting-cell order.

hoursint | float

Evaluation time in hours used in the output filename.

pofff.jobs.data._write_time_series_csv(res: SparseResults) None[source]#

Write sparse benchmark quantities to time_series.csv.

Parameters:
resSparseResults

Interpolated pressure, mass, and migration series.

pofff.jobs.data.main(argv: list[str] | None = None) None[source]#

Generate sparse time-series and dense spatial benchmark data.

Parse reporting-grid settings, locate the OPM simulation, load its results, and write the benchmark time-series and spatial-map CSV files.

Parameters:
argvlist[str] | None, optional

Arguments to parse instead of sys.argv[1:].