① Reservoir & IPR
▼② Fluid Properties
▼③ Wellbore & Survey
▼④ VLP Model
▼⑤ Surface & Choke
▼⑥ Sensitivity Sweep
▼⑦ Measured Data & Match
▼Configure inputs in the panel on the left.
Select IPR model · VLP correlation · choke type as needed.
Where IPR meets VLP. Complete production system analysis with PVT correlations, choke models, pressure traverse, and sensitivity sweeps. Vogel · Fetkovich · Backpressure · Beggs-Brill · Hagedorn-Brown · Standing · Dranchuk-Abou-Kassem · Gilbert · Achong — all in your browser.
Nodal analysis finds the single rate at which a well can actually produce. The reservoir sets how much fluid it can deliver at a given bottomhole pressure (the IPR); the tubing and surface system set how much pressure is required to lift that fluid (the VLP). Where the two curves intersect is the operating point. Everything in this tool exists to define those two curves correctly and then read the intersection.
Phase → ① IPR → ② Fluid → ③ Wellbore → ④ VLP → ⑤ Surface → ▶ Solve Nodal → read the operating point → (optional) ⑦ Match to calibrate → (optional) ⑥ Sweep to optimise.
Then check the well can hold that rate. For a gas well the integrity panel reports the liquid-loading margin and the pressure at which the well stops lifting water; enter a perforated interval in ① and it adds the coning threshold. An intersection the well cannot sustain is arithmetic, not production.
Inputs live in the left panel, results on the right. Everything computes in your browser — no engineering data leaves the machine.
The lock badge on the ▶ Solve Nodal button shows session state. If it reads 🔒, click the button once and sign in; the badge turns 🔓 and the solver runs. Sessions are shared across tools in the same browser, so signing in once unlocks the rest.
The Examples picker at the top loads four synthetic cases. They are benchmarks, not illustrations. Each was built by choosing a true skin, generating a four-point well test from the IPR at that skin with this engine's own correlations, then shipping the case with a deliberately wrong skin.
So loading a case gives an operating point that is wrong by a known amount. Running ◎ Run match in the Nodal Plot header, on the test points the case supplies, should recover the true skin and put the rate back where it belongs. The reference panel above the results reports all three numbers, so you can score the workflow rather than trust it.
| Case | Regime | Ships with | Should recover |
|---|---|---|---|
| A · Oil PI | Undersaturated, Pwf above Pb — linear PI is the correct form | skin 6.0 → 3,062 STB/d | skin 1.5 → 4,140 STB/d |
| B · Vogel | Saturated, Pwf below Pb — free gas curves the IPR | skin 0.0 → 1,904 STB/d | skin 3.0 → 1,425 STB/d |
| C · Gas | Dry gas on the backpressure form, deep and tight | skin 8.0 → 19,719 Mscf/d | skin 2.0 → 29,690 Mscf/d |
| D · High WC | Shallow mature well at 78% water cut — lift-limited, not reservoir-limited | skin 4.0 → 826 STB/d | skin 0.5 → 1,122 STB/d |
Case B is worth running twice: once as shipped, then switching the IPR model to Linear. The straight-line form fitted below the bubble point overstates the rate, which is the whole reason Vogel exists.
A benchmark needs a known answer. The true skin of a real well is never known independently of the analysis being tested, so real data can demonstrate a workflow but cannot score it. These cases can, because the answer was chosen before the data was made. Editing any input clears the reference panel — it only describes the pristine case.
Use the Oil / Gas toggle at the top. This switches units (STB/d vs Mscf/d), the available IPR models, the PVT correlations, and the required fluid inputs. Set it before entering anything else — switching later resets model selections that no longer apply.
Two ways to define deliverability:
| Mode | Use when | You enter |
|---|---|---|
| Darcy | No well test yet, but you have petrophysics and a completion model | k, net pay h, φ, Sw, skin s, re, rw |
| Direct | You have a multi-rate or single-rate well test | PI, qmax, or the C and n pair |
In Darcy mode the tool derives PI (oil) or C (gas) from k·h and skin on every solve, and also reports a volumetric OOIP/OGIP from φ, h, Sw and the drainage area implied by re. Also set reservoir pressure Pr, temperature Tr, and bubble point Pb.
Perforated interval hp is optional. Enter it and the water-coning check runs; leave it blank and it is skipped.
For oil: API gravity, gas specific gravity, water specific gravity, producing GOR, and water cut as a fraction. For gas: gas and water specific gravity. Surface temperature applies to both and anchors the wellbore temperature profile.
Water cut and GOR are the two inputs that move the VLP most. If either is uncertain, treat it as a sweep parameter in step 8 rather than committing to one number.
TVD drives hydrostatic head; measured depth drives friction length; the ratio implies the deviation. Enter tubing ID, absolute roughness, and average inclination from vertical. For a deviated well, an average inclination consistent with TVD/MD is sufficient at this level of modelling — the traverse is segmented, not a full survey integration.
Choose the multiphase correlation (see the table below) and the number of pressure-traverse segments. More segments give a smoother traverse and slightly better accuracy at the cost of speed; the default is adequate for most wells. Increase it when the well is deep, highly deviated, or the fluid changes phase strongly along the string.
Wellhead pressure is the outlet boundary of the VLP; separator pressure sets the downstream constraint. If a choke model is selected, enter the bean size in 64ths and the solver reports the wellhead pressure the choke would impose alongside the value you set. A large gap between the two means the assumed wellhead pressure and the choke are inconsistent — adjust one of them.
Click ▶ Solve Nodal. The right panel returns the nodal plot, the pressure traverse, a system diagnostics box, and a written findings section.
| Model | Phase | Appropriate when |
|---|---|---|
| Linear (PI) | Oil | Undersaturated throughout: Pwf stays above bubble point. Straight line, single PI. |
| Vogel | Oil | Solution-gas drive with Pwf below Pb. Curvature from free gas reducing relative permeability to oil. |
| Fetkovich | Oil / Gas | Multi-rate test available; the C and n pair absorbs both Darcy and non-Darcy behaviour. |
| Backpressure (C, n) | Gas | Standard gas deliverability form. n near 1.0 is near-laminar; n approaching 0.5 indicates strong turbulence. |
If the solved Pwf comes out below the bubble point while you are on Linear, the answer is optimistic. Switch to Vogel and re-solve.
| Correlation | Best suited to |
|---|---|
| Beggs-Brill (1973) | General-purpose default. Handles inclination explicitly, so it is the first choice for deviated wells and for anything with significant water cut. |
| Hagedorn-Brown (1965) | Vertical or near-vertical oil wells at moderate to high liquid rates. Long production history behind it. |
| Gray (1974) | Gas and gas-condensate wells carrying modest liquid loads. Developed for exactly that regime. |
Correlation choice can move the predicted rate materially. When a measured test point exists, run the history match in step 9 before trusting any single correlation, and note in the report which one was used.
An unmatched solve is a forward prediction from the inputs, not a calibrated forecast. The generated report says which it is: it carries a Calibration subsection reporting the matched parameter, its before-and-after values, RMSE, R² and point count — or, if no match has been run, states plainly that the model is uncalibrated. Quote the rate accordingly.
Drawdown reported as an unusually large share of reservoir pressure is a signal, not a result: check for sand-face or completion limits, and confirm the skin used is credible before quoting the rate.
Enter test points one per line as rate, Pwf. Two or more points give a meaningful fit; a single point calibrates but cannot be validated.
Choose what the match tunes. The dropdown in ⑦ lists every parameter that can absorb the residual for the current input mode and IPR model, and explains what each choice means:
| Mode | Available |
|---|---|
| Darcy | Skin, permeability k, net pay h, reservoir pressure Pr |
| Direct · Linear | PI, Pr |
| Direct · Vogel | qmax, Pr |
| Direct · Fetkovich | C, n, Pr |
| Direct · Backpressure | C, n, Pr |
All three scale the same Darcy productivity term, so any of them will reach the identical R² from the same data — verified to machine precision on the worked examples, where matching skin, k or h each returns R² 0.999689 and the same scaling factor. The fit cannot tell you which is wrong, only which explanation you have chosen. Pick the one you have least confidence in and treat the other two as fixed. Pr is the exception: it moves the intercept rather than the slope, so it changes the shape of the fit and is genuinely distinguishable.
The default is skin in Darcy mode, and the productivity term in Direct mode. The action itself sits in the Nodal Plot header rather than in the sidebar, because the measured points are drawn on that chart and the fit is best judged where it can be watched moving onto them. It appears as soon as at least one valid point is entered, carries the point count, and reads Re-run match once a match exists. Click it and the sidebar panel reports the parameter before and after, the RMSE, R², and the point count.
Matching adjusts the inflow side only. If the residual sits mostly in the VLP, change the correlation rather than forcing the skin.
To see what a good match looks like before trusting one of your own, load a worked example and run the match there: all four recover their declared skin to within 0.03 at R² above 0.999.
The nodal intersection tells you the rate at which inflow and outflow balance. It does not tell you whether the well can sustain that rate. Two mechanisms end wells at rates the intersection considers perfectly healthy, and both appear automatically under the results once a case is solved.
A gas well carries its water as entrained droplets. Below a critical velocity the droplets fall back, the column loads up, flow turns intermittent, and the well dies — typically with most of the gas still in the ground.
Turner's droplet-transport result gives C = 1.593; he found field data sat about 20% above it and recommended C = 1.912 for design. Coleman (1991) showed the unadjusted value fits wells below roughly 1,000 psi. Both thresholds are reported, because choosing between them is a judgement about the well rather than a constant. Evaluated at the wellhead, where pressure is lowest and the criterion most demanding.
| Status | Meaning |
|---|---|
| Unloaded | Above both thresholds. The margin shrinks as pressure falls and water cut rises, so repeat the check along the depletion path. |
| Marginal | Between the Coleman and Turner thresholds. Usually flowing intermittently. Plan the intervention before it dies, not after. |
| Loading | Below even the unadjusted threshold. Smaller tubing, velocity string, plunger lift or compression are the levers. |
The same thresholds are drawn on the nodal plot: the outflow curve turns amber below the Turner rate and red below Coleman, with the two rates marked. A curve that crosses the IPR inside a shaded band is telling you the intersection is arithmetic rather than production.
The check also reports a loading abandonment pressure: reservoir pressure is swept downward and the nodal intersection re-solved until the rate falls below the Turner critical rate. On worked example C that happens at about 2,320 psia, roughly half the current reservoir pressure.
A gas material balance normally takes Pab as an economic input. For a wet gas well that is the wrong quantity: the well stops when it can no longer lift water, which usually happens well above any economic pressure floor. Carry the loading abandonment pressure across as Pab rather than guessing, particularly on an aquifer-supported reservoir where the recovery calculation is highly sensitive to it.
Send … to material balance under the check does exactly that. It records the pressure, the reservoir pressure it was swept from, the critical rate, and the wellhead pressure and tubing it assumed. The material-balance tool then offers the value with its age and provenance shown — it never adopts it silently, because a number computed for one completion is not automatically right for the tank.
Drawdown pulls the water contact upward beneath the perforations. Below a critical rate gravity holds the cone in place; above it the cone is unstable and breakthrough follows. Enter a perforated interval hp in ① to enable the check; leave it blank to skip.
Meyer & Garder (1954), with the gas form carrying an extra factor of 5.615 because Bg converts to reservoir cubic feet where Bo converts to barrels. The correlation assumes a homogeneous formation and a fully developed steady cone: it gives a stability threshold, not a breakthrough time. The threshold falls as the contact rises, so a margin today is not a margin for the life of the well.
Coning is a completion-scale phenomenon — vertical flow toward a perforated interval. It has no place in a tank material balance, which carries no vertical resolution at all. Its effect on ultimate recovery shows up there instead through the sweep-efficiency term.
Pick one parameter — tubing ID, wellhead pressure, choke size, reservoir pressure, water cut, or GOR — and enter comma-separated values. Each value produces its own VLP or IPR curve and its own operating point, so the sweep answers a design question directly.
| Sweep | Question it answers |
|---|---|
| Tubing ID | Would a tubing change lift rate, or simply move the well into a friction-dominated regime? |
| Wellhead P | What does compression or a facility pressure change buy? |
| Choke size | What is the rate response across bean sizes? |
| Reservoir P | At what depletion level does the well stop flowing? |
| Water cut / GOR | How much does the forecast depend on an uncertain fluid input? |
Sweep one parameter at a time. Combined sweeps hide which variable is responsible for the change.
The sweep in ⑥ answers "what if this were different". The uncertainty study answers a harder question: given that several inputs are uncertain at once, how uncertain is the operating rate, and which uncertainty is doing the damage.
Two questions get asked, and they are not the same question. Which parameter moves the answer most? and which parameter is worth spending money to pin down? A parameter can be enormously influential and still not worth measuring, because it is already known well. The tool answers both and shows where they disagree.
| Method | What it does | What it is good for |
|---|---|---|
| Tornado | Swings one parameter across its range with everything else at base. Exact, two evaluations per parameter. | Ranking raw influence. Reading how asymmetric or non-linear each response is. |
| Monte Carlo | Samples every parameter at once from triangular distributions on the same ranges, then reports P90/P50/P10 and a contribution ranking. | How uncertain the answer actually is, and which uncertainty owns the spread once everything moves together. |
Both rest on the same stated ranges, so the two views can be compared directly rather than resting on two different sets of assumptions. Ranges are editable; the defaults are starting points, not claims about your data.
Computed as the squared Spearman rank correlation between each sampled input and the output, normalised across parameters. Rank rather than linear correlation, so a monotonic but curved response is still credited properly. It approximates the first-order variance share — roughly, the fraction of the spread that would disappear if that one parameter were known exactly. That is the number to read when deciding where to spend on data.
A bar marked † means one bound broke the model — at that value the IPR and VLP no longer intersect and the well does not flow. The bar shows the side that solved, doubled. A bound that breaks the calculation is not a reason to leave the parameter off the chart — it is the strongest evidence the parameter matters, and the reason the marker exists rather than the bar being silently dropped.
A rejection warning means some fraction of the sampled cases did not evaluate. Those draws are absent from the percentiles, so P90 and P10 are conditional on the region where the model works rather than on the full ranges you stated. The warning names the parameter the failures cluster in. Narrow that range until the rate falls below a few percent, or read the percentiles as bounds on a censored sample.
The default is 1,000, and it was chosen by measurement rather than habit. A single evaluation here solves a full nodal intersection and costs roughly 35 ms, so the sample count is a direct trade against waiting.
| Samples | P90 | P50 | P10 | Top contributor | Wait |
|---|---|---|---|---|---|
| 250 | 541 | 804 | 1,186 | k 44% | ~9 s |
| 500 | 541 | 795 | 1,162 | k 40% | ~18 s |
| 1,000 | 537 | 795 | 1,150 | k 41% | ~35 s |
| 2,000 | 534 | 805 | 1,150 | k 41% | ~70 s |
At 1,000 every percentile sits within about 1% of the 2,000-sample answer and the contribution shares are identical, so the second minute buys a smoother histogram and nothing else. Raise it if you want the histogram to look better; there is no accuracy argument for doing so.
What more samples cannot buy is separation between parameters sitting within a few points of each other. On this example the second and third places keep swapping between skin, GOR and reservoir pressure at every sample count, because all three genuinely sit in the same 14–17% band. That is a real tie, not sampling noise, and only narrowing the input ranges will break it.
The run is time-boxed rather than chunked by count: it draws samples until it has spent about 40 ms, then yields to the browser. That keeps the interface responsive whatever the per-sample cost happens to be, and the progress line carries an estimate of the time remaining.
The distribution reflects only the parameters listed. It says nothing about whether the model itself is right — whether the IPR form suits the flow regime, whether the lift correlation suits the fluid and the deviation, or whether the case has been matched to measured data at all. A tight P90–P10 band around the wrong model is worse than a wide band around the right one, because it looks like knowledge.