agentleFS
equinorequinor/neqsim/.github/skills/neqsim-field-economics/SKILL.md

neqsim-field-economics

Skill167 starsChanged 7 months agoApache-2.0View on GitHub

Oil & gas field economics, NPV, IRR, cash flow, and fiscal regime modeling with NeqSim. USE WHEN: calculating project economics (NPV, IRR, payback), evaluating tax regimes (Norwegian NCS, UK, generic), building cost estimates (CAPEX/OPEX), or running Monte Carlo sensitivity analysis on economic outcomes.

The file

Files
SKILL.md

NeqSim Field Economics Skill

Reference for petroleum project economics — cost estimation, cash flow modeling, tax regimes, NPV/IRR calculations, breakeven analysis, and uncertainty.


Economics Workflow Overview

Reservoir Volumetrics → Production Profile → Revenue Forecast
                                                    ↓
CAPEX Estimate → Cash Flow Engine ← OPEX Estimate
                       ↓
              Tax Model (NCS/UK/Generic)
                       ↓
              NPV / IRR / Payback / Breakeven
                       ↓
              Monte Carlo Uncertainty (P10/P50/P90)

Cost Estimation

CAPEX Components (Typical Offshore NCS)

CategoryTypical RangeNeqSim Class
Wells (drilling + completion)200-800 MNOK/wellWellCostEstimator, WellMechanicalDesign
SURF (subsea, umbilicals, risers, flowlines)500-5000 MNOKSURFCostEstimator
Topsides / Processing2000-15000 MNOKFacilityBuilder + MechanicalDesign
Subsea equipment (trees, manifolds)100-500 MNOK/wellSubseaProductionSystem
Pipeline / Export50-300 MNOK/kmPipelineMechanicalDesign
FPSO hull + mooring5000-20000 MNOKParametric estimate
Decommissioning (ABEX)10-30% of CAPEXDecommissioningEstimator

NeqSim Cost Estimation Classes

// Well cost
WellCostEstimator wellCost = new WellCostEstimator();
wellCost.setRegion(SubseaCostEstimator.Region.NORWAY);
wellCost.setWaterDepth(350.0);
wellCost.setTotalDepth(3800.0);
wellCost.setDrillingDays(45);
wellCost.setCompletionDays(25);
wellCost.setRigDayRate(540000.0);  // USD/day
double wellCapex = wellCost.estimate();

// SURF cost
SURFCostEstimator surfCost = new SURFCostEstimator();
surfCost.setRegion(SubseaCostEstimator.Region.NORWAY);
surfCost.setNumberOfWells(4);
surfCost.setFlowlineLength(25.0);      // km
surfCost.setUmbilicalLength(27.0);     // km
surfCost.setWaterDepth(350.0);
surfCost.setTreeType("vertical");
surfCost.setHasManifold(true);
double surfCapex = surfCost.estimate();

// Regional cost factors
RegionalCostFactors factors = new RegionalCostFactors("Norway");
double adjustedCost = baseCost * factors.getCostMultiplier();

OPEX Components

CategoryTypical RangeEstimation Basis
Fixed OPEX3-6% of CAPEX/yearInsurance, manning, maintenance
Variable OPEX2-8 USD/boeChemicals, power, logistics
Well intervention50-200 MNOK/eventFrequency-based estimate
Pipeline inspection10-50 MNOK/yearIMR schedule

Cash Flow Engine

Direct Lifecycle Integration

FieldLifecycleSimulator aggregates live NeqSim reservoir/process results by calendar year and feeds oil and export gas volumes directly to CashFlowEngine("NO"). FieldLifecycleResult exposes after-tax NPV, IRR, payback and break-even oil/gas prices together with the technical production, injection, energy and emissions profiles. Use this route when economics must reflect process capacity and reservoir response rather than an independent decline curve. For a host tieback, only the new field's attributed oil and gas enter project revenue; existing-host production is a capacity load, not project revenue. Configure tieback tariff/OPEX and modification CAPEX explicitly. The result's holdback, capacity-deferred oil, peak operating/requested utilization and annual bottleneck fields explain the economic difference between standalone greenfield, direct tieback through existing SURF, managed allocation and debottleneck cases. A user-supplied ProcessModel keeps the economic result coupled to all SURF and host process areas. For area studies, use AreaDevelopmentEvaluator to compare multiple producing hosts and greenfield routes on the same economic basis. A REJECT_OPTION product-quality policy makes an off-spec route ineligible before NPV ranking; REPORT_ONLY preserves the route for sensitivity and debottleneck diagnosis.

Basic Usage

CashFlowEngine engine = new CashFlowEngine("NO");  // Norwegian tax regime
engine.setCapex(5000.0, 2025);       // MUSD, year
engine.setOpexPercentOfCapex(0.04);  // 4% of CAPEX/year
engine.setOilPrice(70.0);           // USD/bbl
engine.setGasPrice(0.30);           // USD/Sm3

// Add production year by year
for (int year = 2027; year <= 2045; year++) {
    engine.addAnnualProduction(year, oilSm3[year], gasSm3[year], waterSm3[year]);
}

CashFlowResult result = engine.calculate(0.08);  // 8% discount rate

double npv = result.getNpv();           // MUSD
double irr = result.getIrr();           // fraction (e.g., 0.15 = 15%)
double payback = result.getPaybackYears();
double pi = result.getProfitabilityIndex();

DCF Calculator (Low-Level)

DCFCalculator dcf = new DCFCalculator();
dcf.setDiscountRate(0.08);
double[] cashFlows = {-500, -300, 100, 200, 300, 250, 200, 150, 100};
double npv = dcf.calculateNPV(cashFlows);
double irr = dcf.calculateIRR(cashFlows);

Tax Models

Norwegian Continental Shelf (NCS)

The Norwegian petroleum tax regime has three key components:

ComponentRateBase
Corporate tax22%Revenue - OPEX - Depreciation
Special petroleum tax56%Revenue - OPEX - Depreciation - Uplift
Total marginal rate78%—

Additional features:

  • Uplift: 5.5% of investment per year for 4 years (deductible only against special tax)
  • Depreciation: 6-year straight-line for offshore investments
  • Loss carry-forward: Losses can be carried forward indefinitely (with interest)
  • Exploration refund: 78% of exploration costs refunded
NorwegianTaxModel taxModel = new NorwegianTaxModel();
// Automatically applied when CashFlowEngine("NO") is used

// Direct tax calculation
TaxResult tax = taxModel.calculateTax(
    grossRevenue,    // NOK
    opex,            // NOK
    depreciation,    // NOK
    uplift           // NOK
);
double corporateTax = tax.getCorporateTax();
double specialTax = tax.getSpecialTax();
double totalTax = tax.getTotalTax();
double effectiveRate = tax.getEffectiveRate();

Regime gotcha (verified in task 2026-10-09 Havis screening): the registry "NO" model is the pre-2022 uplift regime (6-year depreciation, uplift, loss carry-forward). Projects approved under the current 2022 cash-flow tax (78 % on net cash flow, immediate expensing, immediate loss refund, so after-tax cash flow = 22 % of pre-tax) must use new GenericTaxModel(FiscalParameters.norwegianCashFlowTax2022()) (lossRefund(true), IMMEDIATE depreciation). CashFlowEngine discounts at year end; state the convention (mid-year raises NPV by about half a year of discounting) or discount outside the engine.

UK Continental Shelf (UKCS)

ComponentRateNotes
Ring Fence Corporation Tax (RFCT)30%Ring-fenced profits
Supplementary Charge (SC)10%On ring-fenced profits
Total marginal rate40%Investment allowance applies

Generic Tax Model

GenericTaxModel generic = new GenericTaxModel();
generic.setCorporateTaxRate(0.25);
generic.setRoyaltyRate(0.10);
generic.setDepreciationYears(10);

Tax Model Registry

// List available models
TaxModelRegistry.getAvailableModels();  // ["NO", "UK", "BR", "GENERIC"]

// Get model by country code
TaxModel model = TaxModelRegistry.getModel("NO");

Brazil Special Participation (Participação Especial, Decreto 2.705/1998 Art. 22)

The registry's BR-DW model approximates SP as a flat 25 % resource tax. That is a screening proxy only: the statutory SP is progressive in the quarterly fiscalised volume (VPF, thousand m3 oil equivalent), with rates 10/20/30/35/40 %, exemption volumes and deductions that depend on location (onshore / shallow / deep water, >400 m) and production year (1, 2, 3, 4+). Use BrazilSpecialParticipation for the statutory charge:

BrazilSpecialParticipation.Location loc =
    BrazilSpecialParticipation.Location.fromWaterDepth(2420.0);   // DEEP_WATER
double vpf = BrazilSpecialParticipation.toThousandM3OilEquivalent(oilSm3, gasSm3, 1000.0);
double eff = BrazilSpecialParticipation.getEffectiveRate(loc, 4, vpf); // share of RLP
double[] spPerYear = BrazilSpecialParticipation.calculateAnnualFromEqualQuarters(
    loc, annualNetRevenueRlp, annualVolumeThousandM3oe);          // year index 0 = first oil
double[] spPerQuarter = BrazilSpecialParticipation.calculateQuarters(
    loc, productionYearOfEachQuarter, quarterlyRlp, quarterlyVpf); // with Art. 22 §6 loss carry-forward
  • RLP = gross revenue − royalties − OPEX − depreciation − exploration costs (Art. 25). Reinjected gas is not fiscalised; leave it out of VPF.
  • Effective rate = marginal rate × (1 − deduction/VPF). A 150 kbopd deep-water plateau (~2 100 thousand m3 oe/quarter) is in the 35 % band but pays ~18 % of RLP — a flat 20–25 % proxy overstates SP for mid-size fields and understates it for giants.
  • The published decree gives 775 for the shallow-water year-3 20 % deduction where continuity of the table requires 725; the class keeps the published value (documented in JavaDoc) — confirm with ANP for shallow-water cases.
  • Pre-salt Production Sharing (BR-PSA) contracts pay no SP; use it only for concession contracts.

Production Profile Generator

ProductionProfileGenerator gen = new ProductionProfileGenerator();
gen.setResourceVolume(100.0);    // MMboe
gen.setRecoveryFactor(0.55);
gen.setPeakRate(25000.0);        // boe/d
gen.setBuildUpYears(2);
gen.setPlateauYears(5);
gen.setDeclineType("exponential");
gen.setDeclineRate(0.12);        // 12%/year
gen.setProjectLife(25);          // years

double[] profile = gen.generate();  // Annual production (boe)

Sensitivity & Uncertainty Analysis

Tornado Diagram (One-at-a-Time)

SensitivityAnalyzer sensitivity = new SensitivityAnalyzer(engine);
sensitivity.addParameter("oilPrice", 50.0, 70.0, 90.0);     // low, base, high
sensitivity.addParameter("capex", 4000.0, 5000.0, 7000.0);
sensitivity.addParameter("recoveryFactor", 0.45, 0.55, 0.65);
sensitivity.addParameter("opexRate", 0.03, 0.04, 0.06);

Map<String, double[]> tornado = sensitivity.runTornado();
// Returns: {"oilPrice": [npv_low, npv_base, npv_high], ...}

Monte Carlo

MonteCarloRunner mc = new MonteCarloRunner(engine);
mc.addTriangularInput("oilPrice", 50.0, 70.0, 90.0);
mc.addTriangularInput("capex", 4000.0, 5000.0, 7000.0);
mc.addTriangularInput("recoveryFactor", 0.45, 0.55, 0.65);

MonteCarloResult result = mc.run(1000);
double p10 = result.getPercentile(10);
double p50 = result.getPercentile(50);
double p90 = result.getPercentile(90);
double probNegative = result.getProbabilityBelow(0.0);

Breakeven Analysis

// Breakeven oil price (NPV = 0)
double breakevenPrice = engine.calculateBreakevenPrice(0.0);

// Breakeven at different discount rates
for (double rate : new double[]{0.05, 0.08, 0.10, 0.12}) {
    double be = engine.calculateBreakevenPrice(rate);
    System.out.println("Breakeven at " + (rate*100) + "%: " + be + " USD/bbl");
}

Exploration commitment and relinquishment (EMV, break-even Pg)

A licence decision (keep and drill, or relinquish) is an option valuation, not a project NPV. With the NCS cash-flow tax (tau = 0.78, dry well refunded when a tax position exists):

EMV = Pg * V_dev - (1 - tau) * C_expl          (V_dev = expected post-tax development value if discovered, > 0 only)
Pg* = (1 - tau) C_expl / (V_dev + (1 - tau) C_expl)   (break-even chance of success)
  • Compute V_dev as max(best concept NPV, 0) per Monte Carlo sample so a sub-commercial discovery is not counted; report P(commercial | discovery) separately.
  • A rig-of-opportunity well completed as a producer gets a development credit (30-80 % of the well cost) in the success branch and has no mobilisation cost.
  • Chance of success: Beta posterior from the area wildcat record (discoveries + 1, dry + 1) times a prospect-quality factor; it is an area statistic, not a prospect Pg, and the report must say so.
  • Typical result: break-even Pg of 5-6 % because the dry-well cost after tax is about 22 % of the gross cost. State the refund assumption (partner tax positions) and the break-even discovery size at the used Pg.
  • Report the Equinor-share EMV (equity from the licence record) next to the 100 % value.
  • Compare several routes on the same Monte Carlo draws (standalone well then tie-back, well from a host-template slot, pre-investment in a host slot, direct route to the main host) and put the retention cost in every non-zero strategy; when the best routes are within about 5 % of one another the retention decision does not depend on the route, and the weak route (usually the direct one) is the only one with a negative tail.
  • Cross-check the lognormal Monte Carlo EMV with the Swanson 30/40/30 weights on P90/P50/P10 (enterprise_prospect_risking.risked_metrics): a 10-15 % gap (Swanson higher for a right-skewed prize) is normal and should be stated, not tuned away.
  • Value of information of a G&G study with voi_imperfect (states: good/poor prospect, Pg +/- 0.15) is zero when the go decision survives the poor signal; say so and justify the study by sizing and phasing, not by the retention decision.
  • Also read the fixed-cost side of the gate: licence work obligations and area fees can dominate a 15-60 MNOK retention assumption; they are a data gap, not a model input to invent.
  • Host life is a scenario parameter, not a constant. When a host has a hull or licence limit inside the tie-back window (e.g. first oil 2032-33 against a 2030 limit), sample the host end year (or run 2030/2038/2045 cases on shared draws) and report EMV per case; it flipped the sign of the exploration case in the Trestakk screening and out-ranked every cost item in the tornado.
  • Choose the concept after the discovery. Per Monte Carlo sample take V_dev = max(0, NPV of each concept) (satellite / template / hub), so the EMV is the option value of design-to-cost; report how often each concept wins and the share of discoveries that support none. A shared hub wins only in the both-succeed branch; evaluate it there.
  • Value of information = EMV(explore first) - EMV(commit blind) on the same draws, with the blind case valued as a loss of the committed capex when the prospect fails.
  • Sanity-check unit costs in NOK/km before running. A tie-back flowline plus service line/umbilical at 220 MNOK/km (about 21 MUSD/km) made every prospect uneconomic; 70/110/180 MNOK/km all-in is a defensible Class 5 range. Print capex per concept next to oil volume and compare with area analogues first.
  • Reconcile the brief's own KPIs before recomputing them. Pc/Pg is P(commercial | discovery); invert the lognormal fitted to P90/P10 for the implied minimum commercial volume (v_min = median * exp(sigma * z(1 - Pc/Pg))) and compare the truncated mean with the quoted "mean commercial volume" (MG: 14.4 MMboe and 41.9 against 42.6, so that figure is a conditional, not an unconditional, mean). A quoted EV far below your EMV is usually the exploration cost carried gross (no 78 % refund) or an equity share: compute both variants and the implied share, and tabulate the EBE definitions (EMV = 0 with/without refund, success-case with/without refund) rather than asserting which one the brief used.
  • Related skills: neqsim-psc-bid-economics-screening (community, bid-round and PSC fiscal screening), enterprise-host-ullage-allocation (host ullage by constraint for tie-in value) and neqsim-capacity-increase-screening (plan-consistent capacity and displaced barrels).

Appraisal-first versus go-now strategies and design-to-cost (Ragnfrid Sor VPbo pattern).

  • Compare strategies on the same Monte Carlo draws: S0 hold, S1 go now plus a separate exploration well, S2 appraise the discovery only (delay 1-3 years, information quality 0.5-0.9, pressure class revealed), S3 dual-target well (exploration plus appraisal leg), then decide. Payoff of S1 is go_now + exploration EMV; take care that every strategy carries its well cost and delay.
  • VOI of an appraisal well is usually negative when the base case is already positive and the avoided mistake is cheap (a HIPPS of 0.6 bn NOK); the dual-target well can still win because the exploration well is worth drilling by itself. Report VOI against the pressure-class prior (0.2-0.7) to show it does not flip.
  • Design-to-cost: scale all capex items (0.9/0.8/0.7) inside the Monte Carlo and report P(NPV<0), break-even volume and the capex that gives P(NPV<0) < 10 %; list levers (pressure class, one-well-first, line unit cost, well days, rig synergy, add-on volume) with their post-tax value, not just capex.
  • Post-tax with immediate expensing and loss refund is 0.22 x the pre-tax cash flow; state that this is an assumption (partner tax positions) and show pre-tax next to it, because a delay or cost effect shrinks to 22 % post-tax and can look unimportant (one year of delay was 100 MNOK pre-tax and 21 MNOK post-tax).

Decommissioning Cost Estimation

DecommissioningEstimator decom = new DecommissioningEstimator();
decom.setNumberOfWells(6);
decom.setWellAbandonment(true);
decom.setSubseaRemoval(true);
decom.setPlatformRemoval(false);    // tieback — no platform
decom.setPipelineDecommissioning(true);
decom.setWaterDepth(350.0);
decom.setRegion("Norway");

double decomCost = decom.estimate();  // MUSD

Common Economic Pitfalls

PitfallImpactPrevention
Double-counting depreciation in tax basesOverstates tax, understates NPVNorwegian model: depreciation deducted from BOTH bases independently
Wrong CAPEX timingWrong NPV (time value)CAPEX in year 0, first production year 2-3, match reality
Ignoring loss carry-forwardUnderstates early-year cash flowNorwegian model carries losses with interest adjustment
Using nominal discount rate with real cash flowsWrong NPVBe consistent: real-real or nominal-nominal
Ignoring decommissioningMissing 10-30% lifecycle costAlways include ABEX in project economics
Oil price in wrong currencyWrong revenueNOK on NCS, USD internationally; use consistent FX
runFieldEconomics/FiscalRegime NO is the pre-2022 uplift modelA post-2022 NCS project (22 % ordinary, 56 % special tax on cash flow, immediate expensing, refunded losses) gave NPV 0.09 vs 6.3 MUSD in a cross-check (NIP-1, BRP South Breidablikk)For post-2022 NCS incremental projects build the annual cash flow yourself (7 % real, 6-year straight-line ordinary depreciation, special tax on cash flow) and use NeqSim only as a cross-check; state the regime used

Key Conversion Factors

FromToFactor
1 Sm3 oilboe1.0 (by definition)
1 Sm3 gasboe~0.001 (varies, typically 1000 Sm3 gas = 1 boe)
1 bbl oilSm3 oil0.159
1 Sm3 oilbbl6.29
1 tonne oilbbl~7.33 (depends on API gravity)
1 BCF gasSm328.3 × 10⁶

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.