Back to the tool
Reservoir Engineering · User Manual

Material Balance by Joo

A tank material balance tool that back-calculates in-place volumes from pressure and production history, resolves the drive mechanisms behind them, and forecasts forward — all on one screen. This manual documents every input, every step of the calculation, and how to read every result.

mb-joo.vercel.app Single HTML file · no install Black-oil / Dry gas Multi-tank · 5 aquifer models
Contents
  1. 01What the tool does
  2. 02The interface
  3. 03The basic workflow
  4. 04Input reference
  5. 05Entering production history
  6. 06History matching
  7. 07Reading the results
  8. 08Diagnostic plots
  9. 09Multi-tank models
  10. 10Export and reporting
  11. 11Menus and shortcuts
  12. 12Warning messages
  13. 13Method and assumptions
  14. 14Troubleshooting
01

What the tool does

The reservoir is treated as a tank at uniform pressure. The tool finds the in-place volume and drive parameters that best reproduce the observed pressure history: it marches the material balance equation forward month by month, solving for pressure at each step, and regresses the parameters to minimise the difference between modelled and measured pressure (RMSE).

What it produces

OOIP / GIIP, water influx We, drive indices (DDI·SDI·WDI·CDI·TDI), recovery factor, time to abandonment pressure, inter-tank transfer.

Outputs

What it needs

Dated reservoir pressures and cumulative production (oil, gas, water), a handful of PVT constants, and a drive mechanism. Three rows is enough to solve.

Inputs

What it ignores

Spatial distribution, relative permeability, individual well behaviour, coning, pressure gradients. A tank is always at one uniform pressure.

Out of scope
Intended use

Early screening, volume verification, drive-mechanism identification and teaching. Detailed development planning needs a 3D numerical simulator.

02

The interface

Five regions, from top to bottom.

RegionContents
Title bar File / Analysis / View / Help menus; on the right, a summary chip for the current model and the light/dark toggle.
Toolbar Run Analysis Example Data Clear, the fluid selector, and CSV Report.
Sidebar (left) Every input panel. Click a panel title to collapse or expand it. The badge beside a title says what the panel applies to: shared means all tanks, tank means the currently selected tank only.
Stage (right) Warning box → five KPIs → two charts → five tabbed panels.
Status bar Solver state, fluid type, history row count, time of last run, result summary.
Tip

The Method panel at the bottom of the sidebar always shows the governing equations for the current fluid mode. Help → Method & Assumptions jumps straight to it.

03

The basic workflow

The tool opens with example data already loaded and solved. Replacing it with your own case goes like this.

01

Choose the fluid

In the toolbar's Fluid selector, pick Oil · Black-oil (Havlena–Odeh) or Dry Gas · P/z Material Balance. Switching fluid resets the history table to that fluid's example data, so make this your first choice.

02

Set up the tank and PVT

For a single tank, only the initial pressure Pi needs attention in Tanks. Then fill in Fluid & PVT: temperature, bubble point, Boi, Rsi, co, z and Bw. Derived Bgi and Derived Bob update as you type, so a typo shows up immediately.

03

Pick the drive mechanism

Set gas cap ratio m and the rock/water compressibilities in Drive Mechanism, and choose an aquifer model in Aquifer. If you don't yet know which applies, leave the default (Pot) and let the Campbell plot in section 8 decide.

04

Enter the production history

Type it into the Production History tab, or use File → Import History from CSV…. You need at least three rows, and the pressure must actually change across the history for the in-place volume to be resolvable.

05

Solve, then match

Run Analysis (⌥R) fits the in-place volume N only. If the residual is large, tick more parameters in History Match Regression and press Run Regression (⌥G).

06

Verify and export

Check row-by-row residuals in Match Diagnostics and physical plausibility in Diagnostic Plot. Export with CSV (⌥S) or Report (print to PDF).

04

Input reference

Listed in sidebar order. The names in these tables match the labels on screen exactly.

4.1 Model Identification global

A single field: the model name. It appears in the title-bar chip, as the printed report heading, and in the exported CSV filename. When used as a filename, anything other than letters, digits, . and - becomes _.

4.2 Tanks per tank

FieldUnitDefaultNotes
Tank nameTank 1 Used for the pressure column heading in the history table, chart legends and the regression list.
Initial pressure  Pipsia4200 The datum for the material balance. Minimum 15. If the bubble point exceeds Pi it is clamped to Pi and the tank is treated as saturated, with a warning.
Production share% of field100 This tank's share of total field production. All shares must add to 100%; the running total is shown as Allocation total at the bottom of the panel (green = balanced, amber = not).

+ Tank adds a tank by splitting the largest existing share in half and copying Pi from the current tank. The × on a chip removes a tank, returns its share to the first tank, and deletes any connections that referenced it. At least one tank must remain.

4.3 Tank Connections shown only with 2+ tanks

Flow between two tanks is proportional to their pressure difference.

q = T · (pa − pb) T in rb/(day·psi), default 200

+ Add connection adds a row; pick the two tanks and enter T. Selecting the same tank on both sides is corrected automatically. T = 0 is equivalent to no connection. If you create no connections at all, the tanks are solved as fully independent compartments and the tool warns you.

4.4 Fluid & PVT shared by all tanks

FieldUnitDefaultNotes
Reservoir temp.  T°F220 Feeds directly into Bg. Used in both fluid modes.
Bubble point  Pbpsia3200 Oil mode only. The Bo and Rs correlations branch at this pressure.
Oil FVF at Pi  Boirb/stb1.32 Oil mode only. Oil formation volume factor at initial pressure.
Solution GOR  Rsiscf/stb650 Oil mode only. Held constant above Pb.
Oil compressibility  co1/psi0.000012 Oil mode only. Sets the slope of Bo in the undersaturated region.
Gas deviation factor  z0.92 Held constant across the whole history. Range 0.2 – 1.5.
Water FVF  Bwrb/stb1.03 Converts produced water to reservoir conditions.

Derived Bgi and Derived Bob are not inputs — they are read-outs computed from the values above. If Bgi looks wrong, suspect the temperature or z.

4.5 Drive Mechanism per tank

FieldUnitDefaultNotes
Gas cap ratio  mGIIP·Bgi / N·Boi0 Ratio of gas cap volume to oil zone volume. Oil mode only — in dry-gas mode any value is ignored and a warning is shown. 0 means no gas cap.
Connate water  Swcfraction0 Connate water saturation. Range 0 – 0.95.
Formation compr.  cf1/psi0 Rock compressibility.
Water compr.  cw1/psi0 Connate water compressibility.

Swc, cf and cw together form the rock and connate-water expansion term.

Efw = [(cf + cw·Swc) / (1 − Swc)] · (Pi − p)

With all three at zero the term disappears. They default to zero so that the built-in examples reproduce exactly. In real data this term matters more the more undersaturated the reservoir is.

4.6 Aquifer per tank

Each tank can carry a different aquifer model. Changing the model shows only the inputs that model needs, and rebuilds the regression parameter list to match.

ModelBehaviourWhen to use it
None We = 0 Volumetric depletion drive. Use when you are confident there is no aquifer, or when the Campbell plot is flat.
Pot We = J·(Pi − p)
instantaneous, path independent
The simplest one-parameter model, and the default. A good first attempt. It responds to pressure drop with no time lag.
Schilthuis dWe/dt = C·(Pi − p)
steady state
An effectively infinite aquifer holding its boundary pressure. Influx accumulates with time, so support grows through the history.
Fetkovich finite aquifer, pseudo-steady state
depletes and weakens
A limited aquifer that runs out of energy over time. Useful for reproducing a late-life steepening of the pressure decline.
Carter–Tracy unsteady state
van Everdingen–Hurst approximation
The most rigorous option. Use it when you know the aquifer's rock and fluid properties (k, φ, μw, ro, h, θ). Solved recursively, without superposition.

Inputs by model

ModelFieldUnitDefault
PotAquifer strength  J MMrb / psi0.0015
SchilthuisInflux constant  C MMrb / (psi·day)0.000002
Fetkovich Aquifer volume  WiMMrb500
Productivity index  Jrb / (day·psi)4
Aquifer total compr.  ct1/psi0.000006
Carter–Tracy Permeability  kmd50
Porosity  φfraction0.2
Water viscosity  μwcp0.5
Reservoir radius  roft3000
Aquifer thickness  hft50
Encroachment angle  θdegrees60
Aquifer total compr.  ct1/psi0.000006

θ is the fraction of the reservoir's circumference in contact with the aquifer: 360° for a fully surrounded reservoir, 60° for contact along one flank. Carter–Tracy influx scales directly with θ, so this single value is a strong lever on aquifer strength.

4.7 History Match Regression

Tick the parameters you want fitted. The list rebuilds itself according to the number of tanks, the fluid mode and each tank's aquifer model. Section 6 covers it in full.

4.8 Forecast Assumptions

FieldUnitDefaultNotes
Forecast periodmonths60 Forecast length beyond the last history date. Range 1 – 600.
Abandonment pressurepsia800 A tank is shut in once its pressure falls to this value. Minimum 15.
Oil rateMstb/day10 Oil mode only. Constant field rate through the forecast.
Gas rateMMscf/day18 / 100 18 in oil mode; switching to dry gas changes it to 100 automatically.
Water rateMstb/day4 Water production through the forecast.
Reallocate rate…checkboxon Appears only with 2+ tanks. When on, a shut-in tank's share of production moves to the tanks still on line.
Careful

Forecast rates are field totals. Each tank carries its Production share of them. A rate of zero means the reservoir never depletes, which makes the forecast meaningless — the tool warns you when that happens.

05

Entering production history

5.1 Typing into the table

The columns of the Production History tab:

ColumnUnitNotes
DateYYYY-MM-DD Entered with a date picker. Out-of-order rows are sorted automatically at run time.
Reservoir pressurepsia With several tanks you get one column per tank name. Leave a cell blank and that tank is simply excluded from the match at that date.
Cum. oilMMstbCumulative, not incremental. Ignored in dry-gas mode.
Cum. gasBscfCumulative. This is the primary production stream in dry-gas mode.
Cum. waterMMbblCumulative water produced.
CommentFree text. Has no effect on the calculation.

What makes a row count

  • The date is filled in.
  • At least one tank pressure is a number greater than zero.

You need three or more such rows before the tool will solve. The number beside the tab title and history rows in the status bar both show how many rows are actually being recognised.

Buttons under the table: + Add row appends a blank row, Load sample reloads the example data, Clear all empties the table. The × at the end of each row deletes it.

5.2 Importing CSV

Use File → Import History from CSV…. No header row is needed — only lines that begin with a YYYY-MM-DD date are read and everything else is skipped, so you can feed it an existing report and it will pick out just the history rows.

Single tank date, pressure, Np, Gp, Wp, comment 2021-01-01,4200,0,0,0,Initial condition 2021-07-01,3101,1.83,1.19,0.10, N tanks — one pressure column per tank, in tank order date, p1, p2, …, pN, Np, Gp, Wp, comment 2021-01-01,4200,4200,0,0,0,Initial condition 2021-07-01,3625,3022,1.10,1.59,0.06,
Careful

Importing replaces the entire history table. The number of pressure columns must match the number of tanks you have already created, so create the tanks first, then import.

06

History matching

6.1 Two ways to run

Run Analysis ⌥R

Regresses the in-place volume N (one per tank) and nothing else. Every other parameter stays exactly as entered in the sidebar. Fast, and the result is stable.

Standard run

Run Regression ⌥G

Fits N plus whatever is ticked in History Match Regression. Afterwards the panel reports the RMSE before and after the run.

Extended run

N is always regressed, in both cases. Unticking it does not fix it — in a material balance, N is a quantity determined by the observed pressures, not one you specify.

6.2 What can be regressed

ParameterShown when
In-place volumeAlways — one per tank, ticked by default
Gas cap ratio  mOil mode
Aquifer strength  JPot model
Influx constant  CSchilthuis model
Aquifer volume Wi · PI J · ctFetkovich model
k · φ · μw · ro · h · θ · ctCarter–Tracy model
TransmissibilityWhen connections exist — one per connection

With several tanks the list is grouped per tank, each group headed by that tank's colour dot. When the regression finishes, the fitted values are written back into the sidebar, so what is on screen always describes the model that is plotted.

6.3 Judging the match

The KPI History match RMSE is the sole objective function: the root-mean-square residual over every (date × tank) pair that has an observed pressure, in psi.

RMSEReading
< 10 psiEssentially exact — synthetic self-consistent data, or an unusually good match.
10 – 50 psiGood for measured data; comparable to gauge error.
50 – 150 psiUsable, but worth revisiting the drive mechanism.
> 150 psiThe tool raises a warning. Try a different aquifer model or free more parameters.
Non-uniqueness

This is the classic material balance trap. Fitting in-place volume and aquifer strength together does not have a unique solution. A small reservoir with a strong aquifer and a large reservoir with a weak one produce almost the same pressure history.

It happens in this tool's own example: N = 20.5 MMstb with a strong aquifer can give a lower RMSE than the true N = 35 MMstb. Do not judge on RMSE alone.

What to do: untick anything you know independently (aquifer size, encroachment angle) so it stays fixed, keep the number of free parameters to a minimum, and always cross-check physical plausibility with the diagnostic plots in section 8.

6.4 How the solver works

  • Nelder–Mead simplex. Every parameter is handled in log space, which keeps it positive.
  • Iteration cap is min(600, 150 + 120 × number of parameters); convergence tolerance 1e-6.
  • During regression only the history interval is simulated — the forecast adds run time without contributing to the objective.
  • Elapsed time and the number of fitted parameters are reported in the panel afterwards.
07

Reading the results

7.1 The five KPIs

KPIMeaning
Estimated OOIP / GIIP The fitted total in-place volume — the sum over all tanks in a multi-tank model. MMstb for oil, Bscf for gas.
Last observed pressure Observed pressure at the final history date, averaged over the tanks that have a value there.
History match RMSE Pressure residual. Shown to one decimal below 10 psi.
Forecast recovery factor Cumulative production at the end of the forecast ÷ in-place volume.
Cumulative water influx Total We across all tanks at the end of the forecast, in MMrb.

7.2 The two charts

Pressure History Match overlays observed pressure (dashed with markers), modelled pressure, and the forecast. Wherever the two visibly separate is where the model fails to explain the data.

Cumulative Production joins history and forecast into one curve — cumulative oil in oil mode, cumulative gas in dry-gas mode.

Both charts show a crosshair and a value tooltip on hover.

7.3 The five tabs

TabContents
Production History The input table itself. The badge is the count of valid rows.
Match Diagnostics Per row: observed pressure, model pressure, residual, cumulative We, dominant drive and status. A tank column is added in multi-tank models.
Forecast Per forecast date: cumulative production, field pressure, water influx, recovery factor and status.
Tanks Per tank: in-place volume, share, final pressure, cumulative We, net transfer, recovery, aquifer model and shut-in state.
Diagnostic Plot See section 8.

The View menu jumps to Production History, Match Diagnostics, Forecast and Diagnostic Plot. Open the Tanks tab by clicking it in the tab bar.

7.4 Forecast status values

StatusMeaning
On forecastProducing normally.
Abandonment pA single tank has reached abandonment pressure. The forecast stops here.
〈tank〉 at abandonmentWith reallocation off, one named tank has reached abandonment pressure.
N of M shut inWith reallocation on, N of M tanks are shut in and the rest have taken over their production.
All tanks shut inEvery tank is shut in. The forecast ends.
In-place limitCumulative production has reached the in-place volume — a sign the forecast rate is unrealistically high.
No solutionNo physical solution at that step. Check the inputs.

7.5 Drive indices

The fraction of voidage supplied by each energy source at a given time. The five values sum to 1.

IndexLabel on screenEnergy source
DDIDepletionOil and solution-gas expansion (depletion drive)
SDIGas capGas cap expansion
WDIWater influxAquifer water influx
CDIRock + waterRock and connate-water compression
TDITank transferInflow from a connected neighbouring tank

The Dominant drive column in Match Diagnostics names the largest contributor at that date, or when nothing exceeds 2%.

08

Diagnostic plots

Chosen from the Plot selector in the Diagnostic Plot tab. With several tanks a tank selector appears beside it. Every plot carries a paragraph underneath explaining how to read it.

8.1 Havlena–Odeh straight line oil mode

Total expansion Eₜ (rb/stb) on the x-axis; withdrawal with water influx and tank transfer removed, F − Wₑ − X (MMrb), on the y-axis.

With the right in-place volume, gas cap and aquifer → the points fall on a straight line through the origin with slope N

Points curving upward mean there is energy the model has not accounted for; curving downward means the aquifer has been overestimated.

8.2 p/z plot dry-gas mode

In dry-gas mode the first option becomes this plot: cumulative gas Gp (Bscf) against p/z (psia).

A purely volumetric gas tank plots as a straight line whose x-intercept is GIIP. Points above that line indicate aquifer support.

8.3 Campbell / Cole — aquifer diagnostic

The most practical test for whether an aquifer exists at all. Cumulative production on the x-axis; F/Eₜ, evaluated at observed pressures assuming no aquifer, on the y-axis.

Naming

It is one plot, but convention names it after Campbell for oil and after Cole for gas. The menu entry follows the Fluid setting; in gas mode the x-axis is Gp and the reference line is G.

  • Horizontal → purely volumetric. Set the aquifer model to None.
  • Rising → energy entering that depletion alone cannot explain: there is aquifer support.
  • Falling → re-check the in-place volume and the PVT inputs.

The dashed horizontal line marks the fitted N (G for gas), giving you a reference to compare against.

8.4 Drive index history

The five drive indices from 7.5, stacked as cumulative areas over time. The thickness of each band is its contribution at that moment. Bands that contribute essentially nothing are omitted entirely.

Depletion dominating early and water influx taking over later is the classic signature of an aquifer-supported reservoir.

8.5 Water influx vs. time

Cumulative water influx Wₑ (solid) against cumulative produced water converted to reservoir conditions, Wp·Bw (dashed).

The crossing point matters: once water production catches up with influx, the aquifer stops adding net support and the pressure decline steepens.

8.6 Inter-tank transfer multi-tank only

Cumulative net volume received per tank (MMrb). Positive means the tank is being supported by its neighbours, negative that it is feeding them. The curves always sum to zero — transfer moves volume around, it never creates it.

8.7 Production share history multi-tank only

Each tank's share of field production, stacked as areas. Fixed through the history at the values you entered, then stepping up during the forecast as tanks reach abandonment and come off line. With reallocation switched off, the bands stay flat throughout.

09

Multi-tank models

Use separate tanks for compartmentalised reservoirs, fault-separated blocks, or regions whose pressure behaviour is clearly different. All tank pressures are solved as one coupled system by Newton iteration at every time step.

9.1 Building one

  1. Add tanks with + Tank (⌥K) in the Tanks panel.
  2. Click a tank chip to select it, then set its name, Pi and production share. Make sure Allocation total reads 100%.
  3. Set Drive Mechanism and Aquifer separately for each tank — the badge beside the panel title shows which tank you are editing.
  4. Add connections in Tank Connections and enter T for each.
  5. The history table now has one pressure column per tank; enter the observed pressures for each.
Tip

File → Load Two-Tank Example loads a finished two-tank case: North (22 MMstb with a Pot aquifer) feeding South (13 MMstb, depletion drive) through T = 8 rb/(day·psi). The two compartments deplete at visibly different rates.

9.2 Things to watch

  • A tank with no pressure data has no resolvable in-place volume. Every tank needs at least a few observed pressures.
  • With no connections the tanks are independent compartments. That still solves, but if that is really the case, separate models would be clearer.
  • More tanks means more free parameters, and non-uniqueness gets much worse very quickly. Go beyond two or three compartments only with good reason.
  • PVT is shared across all tanks. If fluid properties differ substantially between compartments, the case is outside this tool's scope.
10

Export and reporting

10.1 CSV ⌥S

Available once the analysis has been run at least once. One file, several blocks in order:

BlockContents
HeaderModel name, generation time (ISO), fluid type, tank count, total in-place volume, RMSE, and the list of regressed parameters.
TANKSPer tank: name, in-place volume, share, Pi, gas cap m, aquifer model and every aquifer input.
CONNECTIONSOnly when connections exist: both tank names and T.
HISTORY MATCHPer (date × tank): observed and model pressure, residual, cumulative production, We, transfer X, and DDI·SDI·WDI·CDI·TDI.
FORECASTPer date: cumulative production, field pressure, water influx, recovery factor, status, and one pressure column per tank.

The file is named 〈model name〉-report.csv.

10.2 PDF report ⌘P

The Report button, or File → Print Report / PDF. If the model has not been solved yet it runs once first, then opens the print dialog. The print layout hides the sidebar and menus and adds a heading carrying the model name. Choose “Save as PDF” as the destination in your browser's print dialog.

Tip

The printed output contains whichever tab is currently open, so bring up the table you want before printing.

11

Menus and shortcuts

11.1 Shortcuts

⌥RRun analysis
⌥GRun regression
⌥ELoad example data
⌥KAdd tank
⌥SExport CSV
⌥NNew model
⌥TToggle light / dark
⌘PPrint report
EscClose the open menu

On Windows and Linux, use Alt in place of and Ctrl+P in place of ⌘P.

11.2 Every menu item

MenuItemWhat it does
File New ModelResets to one tank and three blank rows.
Load Example DataLoads the single-tank example for the current fluid mode.
Load Two-Tank ExampleLoads the two-tank example, solves it, and opens the Tanks tab.
Import History from CSV…See 5.2.
Export Results as CSVSee 10.1.
Print Report / PDFSee 10.2.
Analysis Run & History MatchSolves, then switches to the Match Diagnostics tab.
Clear OutputsClears results, charts and warnings. Inputs are kept.
Fluid: Oil (Black-oil)Switches fluid. The history table is reset to that fluid's example data.
Fluid: Dry Gas (P/z)
View Four tabsJumps to Production History, Match Diagnostics, Forecast or Diagnostic Plot.
Toggle Light / DarkSwitches theme. The choice is remembered in the browser.
Help Method & AssumptionsOpens the sidebar Method panel and scrolls to it.
12

Warning messages

These appear in the Data quality checks box at the top of the stage. The calculation still runs when a warning is shown — except for the row-count check — but every one of them bears on how much you should trust the answer.

MessageCause and fix
At least 3 valid history rows are required Fewer than three valid rows. The run stops. Add rows with both a date and a pressure.
Production shares total …% Tank shares do not add to 100%. Adjust them in the Tanks panel.
Bubble point exceeds Pi … Pb is above the initial pressure. It is clamped to Pi and the tank treated as saturated. Lower Pb if that was not intended.
Observed pressure exceeds Pi … A measured pressure is higher than the initial pressure. Raise Pi or check that reading.
… has no observed pressures That tank has no pressure data at all, so its in-place volume cannot be resolved.
Gas cap ratio is ignored in dry-gas mode m plays no role in dry-gas mode. Set it back to 0 or ignore the message.
Cumulative oil / gas decreases at … Cumulative production goes down. Most often incremental volumes were entered in a cumulative column.
Cumulative water decreases at … Same cause. Check the cumulative water column.
Pressure is constant across the history Without a pressure change the material balance cannot resolve an in-place volume. Check the pressure data.
Tanks have no connections Several tanks exist but none are connected, so they solve as independent compartments. Confirm that is intended.
Forecast rate is zero The reservoir will never deplete. Check Forecast Assumptions.
History match RMSE is … psi RMSE exceeded 150 psi. Free more regression parameters or try a different aquifer model.
13

Method and assumptions

13.1 Governing equations

Both fluid modes use the same generalised material balance.

F = N · Eₜ + Wₑ + X Oil Eₜ = Eo + m·(Boi/Bgi)·(Bg − Bgi) + (1+m)·Boi·Efw [rb/stb] Eo = (Bo + (Rsi − Rs)·Bg) − Boi F = Np·(Bo + (Rp − Rs)·Bg) + Wp·Bw [MMrb] Dry gas Eₜ = 1000·(Bg − Bgi) + 1000·Bgi·Efw [MMrb/Bscf] F = 1000·Gp·Bg + Wp·Bw [MMrb] Efw = [(cf + cw·Swc)/(1 − Swc)]·(Pi − p) X = cumulative net inflow from connected tanks [MMrb]

13.2 PVT correlations

Bg = 0.00504 · z · (T + 460) / p T in °F, p in psia Bob = Boi / (1 + co·(Pb − Pi)) p ≥ Pb (undersaturated) Rs = Rsi Bo = Bob · (1 + co·(Pb − p)) p < Pb (saturated) Rs = Rsi · (p / Pb) Bo = 1 + (Bob − 1) · (p / Pb)

z is constant across the whole history. In high-pressure gas reservoirs, where z varies significantly with pressure, this approximation introduces error.

13.3 Time marching

For every aquifer model except Pot, water influx is path dependent: how the pressure got here determines the influx now. That rules out inverting each row in closed form, so the solution is marched forward in time instead.

  • The grid is monthly (one month = 30.4375 days). History dates off the grid are inserted as extra steps.
  • Cumulative production between grid points is linearly interpolated from the history data.
  • A single tank is solved by bisection on the pressure residual; multiple tanks are solved simultaneously by Newton iteration.
  • Pressure is floored at 20 psia for physical reasons.

13.4 Aquifer equations

Pot We = J·(Pi − p) Schilthuis dWe/dt = C·(Pi − p) Fetkovich Wei = ct·Wi·Pi p_aq = Pi·(1 − We/Wei) ΔWe = (Wei/Pi)·(p_aq − p̄)·(1 − exp(−J·Pi·Δt/Wei)) Carter–Tracy B = 1.119·φ·ct·ro²·h·(θ/360) t_D = 6.328e-3·k·t / (φ·μw·ct·ro²) We(n) = We(n−1) + (t_Dn − t_D,n−1) · [B·Δp − We(n−1)·P_D′] / [P_D − t_D,n−1·P_D′]

The dimensionless pressure P_D and its derivative use the Edwardson polynomial approximations. For screening purposes Fetkovich does not allow counter-flow — water never flows back into the aquifer.

13.5 Assumptions worth knowing

  • Pressure inside a tank is always uniform. No gradients, no flow lag.
  • PVT is shared by all tanks and z is constant.
  • The producing gas–oil ratio Rp is derived from the cumulative oil and gas you enter.
  • Forecast rates are constant. There is no decline curve and no well-level control.
  • Relative permeability, coning and gravity segregation are not modelled at all.
14

Troubleshooting

SymptomCause and fix
Nothing happens when I run Fewer than three valid rows. Count the rows that have both a date and a pressure above zero — history rows in the status bar shows how many are actually recognised.
“In-place volume could not be resolved” The regression found no physical in-place volume. Check that pressure genuinely declines, that cumulative production increases monotonically, and that Pi is above the observed pressures.
The in-place volume looks implausible Most likely non-uniqueness against aquifer strength (6.3). Fix the aquifer parameters and regress again.
RMSE will not come down The drive mechanism itself may be wrong. Use the Campbell plot to settle whether an aquifer exists, then switch to a model that matches.
The forecast ends after a few steps The forecast rate is too high or the abandonment pressure too high. The status on the last Forecast row (In-place limit vs Abandonment p) tells you which.
I changed an input but the charts did not move Editing inputs does not re-solve. Press Run Analysis (⌥R) again.
Switching fluid wiped my history By design, changing fluid resets the table to that fluid's example data. Choose the fluid first, or re-import your CSV.
CSV import puts data in the wrong columns The number of pressure columns does not match the current tank count. Create the tanks first, then import.
Derived Bgi looks wrong Check the reservoir temperature and z — Bg is directly proportional to both.