Skip to content

ps.aquifers

ps.aquifers.CarterTracy(*, number: int, datum_depth: ScalarPropertyInput, permeability: ScalarPropertyInput, porosity: ScalarPropertyInput, total_compressibility: ScalarPropertyInput, radius: ScalarPropertyInput, thickness: ScalarPropertyInput, angle: ScalarPropertyInput, connections: tuple[Connection, ...], datum_pressure: Optional[ScalarPropertyInput] = None, influence_table: InfluenceTable | None = None, pvt_region: int = 1, datum_temperature: Optional[ScalarPropertyInput] = None) -> None

A Carter-Tracy aquifer and the grid boxes it connects to.

ps.aquifers.CarterTracy(number=1, datum_depth=2500.0, permeability=100.0, porosity=0.2, total_compressibility=1.0e-4, radius=500.0, thickness=30.0, angle=360.0, connections=faces) is an infinite-acting aquifer all round the reservoir, flowing in through faces.

The aquifer’s properties (AQUCT, manual 10.3.12): its datum depth and pressure, permeability, porosity, total compressibility, radius (the inner radius r0, the reservoir’s equivalent radius, which Flow reads from AQUCT item 7 whatever the manual’s wording of it), thickness and influence angle; its influence_table (None: Flow’s built-in infinite-acting table 1) and its connections (AQUANCON).

datum_depth, radius and thickness are lengths, datum_pressure a pressure, permeability a permeability and datum_temperature a temperature (each a bare number in the model’s units, or a ps.Quantity); porosity is a fraction, total_compressibility per unit pressure and angle in degrees (360 all round). Its cards are AQUCT and AQUANCON in SOLUTION (its influence table’s AQUTAB in PROPS), counted in AQUDIMS. It is one of ps.Model(aquifers=[...]), the n-th at aquifers/<n>.

ps.aquifers.Connection(*, cells: Box, face: Literal['plus_i', 'minus_i', 'plus_j', 'minus_j', 'plus_k', 'minus_k'], influx_area: Optional[ScalarPropertyInput] = None, influx_multiplier: Optional[ScalarPropertyInput] = 1.0, transmissibility_multiplier: Optional[ScalarPropertyInput] = 1.0, mode: Optional[Literal['geometric']] = None, allow_adjoin_active_cells: bool = False) -> None

A box of grid cells an aquifer connects to across one face.

ps.aquifers.Connection(cells=ps.Box(i=(1, 1), j=(1, 10), k=(1, 5)), face="minus_i"). An analytic aquifer’s connection (AQUANCON, manual 6.3.6) states influx_area, the influx coefficient (item 9; unset, the simulator takes the connecting face area), and influx_multiplier, the multiplier on it (item 10; None leaves the simulator’s default of 1, written 1*). A numerical aquifer’s (AQUCON, manual 6.3.7) states transmissibility_multiplier (item 9; None leaves the simulator’s default) and mode, the area its transmissibility uses (item 10; "geometric" is option 1, and None leaves the simulator’s default, which is not option 1). allow_adjoin_active_cells (item 11 of both) lets the box face an active cell inside the grid, which the manual advises against. An aquifer refuses a connection stating the other card’s items.

influx_area is an area (length squared) and the two multipliers are dimensionless, all positive and bare numbers in the model’s units. A connection is held in its aquifer’s connections: the m-th of the n-th aquifer at aquifers/<n>/connections/<m>.

ps.aquifers.ConstantFlux(*, number: int, connections: tuple[Connection, ...], initial_water_flux_rate: Optional[ScalarPropertyInput] = None, temperature: Optional[ScalarPropertyInput] = None, pressure: Optional[ScalarPropertyInput] = None) -> None

An aquifer whose water influx is prescribed, and the grid boxes it connects to.

ps.aquifers.ConstantFlux(number=1, connections=faces, initial_water_flux_rate=0.05) lets water in through faces at 0.05 per unit of face area.

The influx is AQUFLUX’s (manual 10.3.14) and the connections AQUANCON’s.

initial_water_flux_rate is a surface water rate per unit area of the connected faces, a bare number in the model’s units; temperature and pressure are a temperature and a pressure (each a bare number, or a ps.Quantity). Its cards are AQUFLUX and AQUANCON in SOLUTION, counted in AQUDIMS. It is one of ps.Model(aquifers=[...]), the n-th at aquifers/<n>; a later influx is a ps.aquifers.Flux.

ps.aquifers.Fetkovich(*, datum_depth: ScalarPropertyInput, initial_water_volume: ScalarPropertyInput, compressibility: ScalarPropertyInput, productivity_index: ScalarPropertyInput, connections: tuple[Connection, ...], datum_pressure: Optional[ScalarPropertyInput] = None, number: int = 1, pvt_region: int | None = None, datum_temperature: Optional[ScalarPropertyInput] = None) -> None

A finite aquifer (Fetkovich) and the grid boxes it connects to.

ps.aquifers.Fetkovich(datum_depth=2500.0, initial_water_volume=5.0e8, compressibility=1.0e-4, productivity_index=50.0, connections=faces) is a finite aquifer of that volume, flowing in through faces.

The aquifer’s datum depth and pressure, its initial water volume, total compressibility and productivity index (AQUFETP, manual 10.3.15), and its connections (AQUANCON).

datum_depth is a length and datum_pressure a pressure (each a bare number in the model’s units, or a ps.Quantity); initial_water_volume is a surface volume of water, compressibility per unit pressure and productivity_index a surface water rate per unit pressure, bare numbers in the model’s units. Its cards are AQUFETP and AQUANCON in SOLUTION, counted in AQUDIMS. It is one of ps.Model(aquifers=[...]), the n-th at aquifers/<n>.

ps.aquifers.Flux(*, aquifer: int, water_flux_rate: ScalarPropertyInput) -> None

A constant-flux aquifer’s water influx from a date on (AQUFLUX in the schedule).

ps.Event("2019-01-01", ps.aquifers.Flux(aquifer=1, water_flux_rate=0.12)): from that date the ps.aquifers.ConstantFlux numbered aquifer flows at water_flux_rate in place of its initial_water_flux_rate. Statements for several aquifers standing together at one date are written as one card.

water_flux_rate is a surface water rate per unit area of the aquifer’s connected faces, a bare number in the model’s units. It writes AQUFLUX in SCHEDULE at its date. It is a dated change, at schedule/<date>/flux.

ps.aquifers.InfluenceTable(*, dimensionless_time: NDArray[numpy.float64], dimensionless_pressure: NDArray[numpy.float64], number: int = 2) -> None

A Carter-Tracy influence table: the dimensionless pressure at each dimensionless time.

ps.aquifers.InfluenceTable(dimensionless_time=[0.01, 0.1, 1.0, 10.0], dimensionless_pressure=[0.112, 0.315, 0.802, 1.651]) is table 2, which a Carter-Tracy aquifer names with influence_table=.

AQUTAB (manual 8.3.11); the times are positive and rising, and both columns are dimensionless. OPM Flow reserves table 1 for its built-in infinite-acting table, so the tables a model states are numbered from 2 (number).

It writes AQUTAB in PROPS, each number once and in its place. It is the influence_table of a ps.aquifers.CarterTracy, at aquifers/<n>/influence_table; a table no aquifer names, which Flow reads all the same, is one of ps.Model(aquifers=[...]) on its own, at aquifers/<n>, so the tables numbered after it keep their numbers.

Rows: (dimensionless_time, dimensionless_pressure). Each column is a field taking a list, a tuple or a 1-D array, one value per row; InfluenceTable.from_frame(frame) reads them from a frame by name.

ps.aquifers.Numerical(*, number: int, cells, connections: tuple[Connection, ...]) -> None

A numerical aquifer: its cells and the grid boxes it connects to.

ps.aquifers.Numerical(number=1, cells=[dict(i=1, j=1, k=1, area=1.0e6, length=5000.0, porosity=0.25, permeability=500.0, depth=2600.0)], connections=faces) replaces cell (1, 1, 1) by an aquifer cell 5000 long, connected through faces.

Its cells are AQUNUM’s records (manual 6.3.10) and its connections AQUCON’s. A cell is a mapping by column name, or a sequence in column order: i, j, k (the grid cell the aquifer cell replaces), area, length, porosity, permeability, depth, initial_pressure, pvt_region, saturation_region (the last three may be left out of a mapping; see the cell’s defaults below). A connection’s transmissibility_multiplier and mode left unset ask the simulator for AQUCON items 9 and 10 as it defaults them. Item 10 left to the simulator is not option 1, mode="geometric": on opm-tests/model3/4_NUMAQ_MODEL3.DATA the two give connection transmissibilities 61 times apart. The authored default states the unit multiplier (item 9, read by value, so the same run) and leaves the option to the simulator.

initial_pressure left unset starts the aquifer in equilibrium with the cells it connects to (manual 6.3.10 item 10); pvt_region and saturation_region left unset in a loaded deck ask for the region of the cell the aquifer replaces, and default to region 1 when authored. A cell’s area is an area (length squared) and its porosity a fraction, bare numbers in the model’s units; length and depth are lengths, permeability a permeability and initial_pressure a pressure (each a bare number, or a ps.Quantity).

Its cards are AQUNUM and AQUCON in GRID, counted in AQUDIMS. It is one of ps.Model(aquifers=[...]), the n-th at aquifers/<n>, its m-th cell at aquifers/<n>/cells/<m>.

PetroScript is licensed under the Apache License 2.0. © 2026 Blauweiss EDV LLC. PetroScript by Blauweiss AI.For AI agents: llms.txt