Skip to the content.

Integrated Field Development Framework

Overview

This document describes how NeqSim integrates PVT, reservoir, well, and process simulations into a unified field development workflow. The framework supports progressive refinement from early feasibility studies through detailed design, with increasing fidelity at each stage.

This framework is designed to support education and industry workflows aligned with academic programs such as NTNU’s TPG4230 - Underground reservoirs fluid production and injection course, covering the complete lifecycle from discovery through operations.


TPG4230 Course Topic Mapping

The following table maps key course topics to their NeqSim implementations:

Course Topic NeqSim Implementation Key Classes
Field Lifecycle Management FieldDevelopmentWorkflow with StudyPhase enum (DISCOVERY→FEASIBILITY→CONCEPT_SELECT→FEED→OPERATIONS) FieldDevelopmentWorkflow, FidelityLevel, StudyPhase
PVT Characterization & EOS Tuning Equation of state selection, plus-fraction characterization, regression to lab data SystemSrkEos, SystemPrEos, Characterization, PVTRegression, SaturationPressure
Reservoir Material Balance Tank model with production/injection tracking, pressure depletion, voidage replacement SimpleReservoir, InjectionStrategy, InjectionStrategy.InjectionResult
Well Performance (IPR/VLP) Inflow performance relationships (Vogel, Fetkovich), vertical lift performance, nodal analysis WellFlow, WellSystem, TubingPerformance, WellSystem.IPRModel
Production Network Optimization Multi-well gathering systems, manifold pressure-rate equilibrium, rate allocation NetworkSolver, NetworkResult, SolutionMode
Economic Evaluation NPV, IRR, payback, country-specific tax models (Norway, UK, Brazil, etc.), Monte Carlo uncertainty CashFlowEngine, TaxModel, NorwegianTaxModel, SensitivityAnalyzer
Flow Assurance Screening Hydrate formation temperature, wax appearance, corrosion, scaling, erosion risk assessment FlowAssuranceScreener, FlowAssuranceReport, FlowAssuranceResult
Process Facility Design Process simulation with heat/mass balance, equipment sizing, power calculations ProcessSystem, Separator, Compressor, HeatExchanger
Mechanical Design Pressure vessel sizing, wall thickness (ASME VIII), weight estimation, module footprint SystemMechanicalDesign, SeparatorMechanicalDesign, CompressorMechanicalDesign
Power & Sustainability Power consumption, CO2 emissions, emission intensity (kg/boe), electrification scenarios EmissionsTracker, EmissionsReport, WorkflowResult.totalPowerMW
Subsea Production Systems Subsea wells, flowlines, manifolds, tieback analysis, subsea CAPEX estimation, flow assurance SubseaProductionSystem, SubseaWell, SimpleFlowLine, TiebackAnalyzer, TiebackReport

Detailed Topic Coverage

1. Field Lifecycle Management (Discovery → Operations)

NeqSim’s FieldDevelopmentWorkflow class provides a unified orchestrator that supports all phases of field development with appropriate fidelity levels:

// Create workflow and set study phase
FieldDevelopmentWorkflow workflow = new FieldDevelopmentWorkflow("My Field");
workflow.setStudyPhase(StudyPhase.FEASIBILITY);
workflow.setFidelityLevel(FidelityLevel.SCREENING);  // ±50% accuracy

// Progress to concept selection
workflow.setStudyPhase(StudyPhase.CONCEPT_SELECT);
workflow.setFidelityLevel(FidelityLevel.CONCEPTUAL);  // ±30% accuracy
workflow.setFluid(tunedEosFluid);  // Add tuned EOS model

// Progress to FEED
workflow.setStudyPhase(StudyPhase.FEED);
workflow.setFidelityLevel(FidelityLevel.DETAILED);   // ±20% accuracy
workflow.setProcessSystem(fullProcessModel);
workflow.setMonteCarloIterations(1000);
Study Phase Typical Fidelity NeqSim Features Used
Discovery SCREENING PVT lab simulation, volumetrics, analogs
Feasibility (DG1) SCREENING Flow assurance screening, cost correlations, Arps decline
Concept (DG2) CONCEPTUAL EOS tuning, IPR/VLP, process simulation
FEED (DG3/4) DETAILED Full process, reservoir coupling, Monte Carlo
Operations DETAILED History matching, optimization, debottlenecking

2. PVT Characterization with EOS Tuning

NeqSim provides comprehensive PVT modeling capabilities:

// Create fluid with plus-fraction
SystemInterface fluid = new SystemSrkEos(373.15, 250.0);
fluid.addComponent("methane", 0.60);
fluid.addComponent("ethane", 0.08);
fluid.addTBPfraction("C7+", 0.20, 220.0, 0.85);  // mole frac, MW, SG
fluid.setMixingRule("classic");

// Characterize plus-fraction using Pedersen method
fluid.getCharacterization().characterisePlusFraction();

// Run PVT experiments
SaturationPressure satP = new SaturationPressure(fluid);
satP.runCalc();  // Bubble/dew point

DifferentialLiberation dle = new DifferentialLiberation(fluid);
dle.runCalc();   // Bo, Rs, viscosity vs pressure

3. Reservoir Material Balance with Injection

The SimpleReservoir and InjectionStrategy classes support pressure maintenance:

// Create reservoir with injection wells
SimpleReservoir reservoir = new SimpleReservoir("Main Reservoir");
reservoir.setReservoirFluid(fluid, giip, thickness, area);
reservoir.addOilProducer("P1");
reservoir.addWaterInjector("I1");

// Calculate voidage replacement injection rates
InjectionStrategy strategy = InjectionStrategy.waterInjection(1.0);  // VRR = 1.0
InjectionResult injection = strategy.calculateInjection(
    reservoir, oilRate, gasRate, waterRate
);
System.out.println("Required water injection: " + injection.waterInjectionRate + " Sm3/d");
System.out.println("Achieved VRR: " + injection.achievedVRR);

4. Well Performance (IPR/VLP)

Nodal analysis with inflow and outflow curves:

// Configure well with IPR model
WellSystem well = new WellSystem("Producer-1", reservoirStream);
well.setIPRModel(WellSystem.IPRModel.VOGEL);
well.setVogelParameters(qTest, pwfTest, pRes);

// Configure VLP (tubing performance)
well.setTubingLength(2500.0, "m");
well.setTubingDiameter(4.0, "in");
well.setPressureDropCorrelation(TubingPerformance.PressureDropCorrelation.BEGGS_BRILL);
well.setWellheadPressure(50.0, "bara");

// Find operating point
well.run();
double rate = well.getOperatingFlowRate("Sm3/day");
double bhp = well.getOperatingBHP("bara");

5. Production Network Optimization

Multi-well gathering network solver:

// Create network with multiple wells
NetworkSolver network = new NetworkSolver("Gathering System");
network.addWell(well1, 3.0);   // 3 km flowline
network.addWell(well2, 5.5);   // 5.5 km flowline
network.addWell(well3, 8.0);   // 8 km flowline

// Solve for rates given manifold pressure
network.setSolutionMode(SolutionMode.FIXED_MANIFOLD_PRESSURE);
network.setManifoldPressure(60.0);
NetworkResult result = network.solve();

// Or find manifold pressure for target rate
network.setSolutionMode(SolutionMode.FIXED_TOTAL_RATE);
network.setTargetTotalRate(15.0e6);  // Sm3/day
result = network.solve();
System.out.println("Required manifold pressure: " + result.manifoldPressure);

6. Economic Evaluation with Country-Specific Tax Models

Comprehensive economics with tax regime modeling:

// Create cash flow engine with Norwegian tax model
CashFlowEngine engine = new CashFlowEngine("NO");
engine.setCapex(500.0, 2025);       // MUSD
engine.setOpexPercentOfCapex(0.04); // 4% of CAPEX/year
engine.setOilPrice(70.0);           // USD/bbl
engine.setGasPrice(0.30);           // USD/Sm3

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

// Calculate with 8% discount rate
CashFlowResult result = engine.calculate(0.08);
System.out.println("NPV: " + result.getNpv() + " MUSD");
System.out.println("IRR: " + (result.getIrr() * 100) + "%");
System.out.println("Payback: " + result.getPaybackYears() + " years");

// Monte Carlo uncertainty analysis
SensitivityAnalyzer analyzer = new SensitivityAnalyzer(engine);
MonteCarloResult mcResult = analyzer.runMonteCarlo(1000);
System.out.println("P10 NPV: " + mcResult.getPercentile(10));
System.out.println("P50 NPV: " + mcResult.getPercentile(50));
System.out.println("P90 NPV: " + mcResult.getPercentile(90));

7. Flow Assurance Screening (Hydrates, Wax, Corrosion)

Risk-based flow assurance assessment:

// Create screener and run assessment
FlowAssuranceScreener screener = new FlowAssuranceScreener();
FlowAssuranceReport report = screener.screen(concept, minTempC, operatingPressure);

// Check individual risks
System.out.println("Hydrate: " + report.getHydrateResult());    // PASS/MARGINAL/FAIL
System.out.println("Wax: " + report.getWaxResult());
System.out.println("Corrosion: " + report.getCorrosionResult());
System.out.println("Overall: " + report.getOverallResult());

// Get mitigation recommendations
Map<String, String> mitigations = report.getMitigationOptions();

Mathematical Foundations

This section provides the mathematical basis for the engineering and economic calculations used in the field development framework.

Economics Mathematics

Net Present Value (NPV)

The Net Present Value discounts future cash flows to present value:

\[NPV = \sum_{t=0}^{n} \frac{CF_t}{(1+r)^t}\]

where:

The cash flow for each year is calculated as:

\[CF_t = (R_t - OPEX_t) \times (1 - \tau) + D_t \times \tau - CAPEX_t\]

where:

Internal Rate of Return (IRR)

The IRR is the discount rate that makes NPV equal to zero:

\[NPV = \sum_{t=0}^{n} \frac{CF_t}{(1+IRR)^t} = 0\]

Solved iteratively using Newton-Raphson or bisection method.

Norwegian Petroleum Tax Model

Norway has a two-tier tax system:

\[Tax_{total} = Tax_{corporate} + Tax_{petroleum}\]

Corporate Tax (22%): \(Tax_{corporate} = \max(0, (R - OPEX - D) \times 0.22)\)

Petroleum Tax (71.8% marginal, 49.8% net after deductions): \(Tax_{petroleum} = \max(0, (R - OPEX - D - U) \times 0.498)\)

where:

Uplift Calculation: \(U_t = CAPEX \times 0.052 \quad \text{for } t = 1,2,3,4\)

Effective Government Take: \(\text{Gov Take} = \frac{Tax_{corporate} + Tax_{petroleum}}{R - OPEX} \approx 78\%\)

Production Decline Curves (Arps)

Exponential Decline: \(q(t) = q_i \times e^{-D_i \times t}\)

Hyperbolic Decline: \(q(t) = \frac{q_i}{(1 + b \times D_i \times t)^{1/b}}\)

Harmonic Decline (b=1): \(q(t) = \frac{q_i}{1 + D_i \times t}\)

where:

Cumulative Production:

For exponential decline: \(N_p(t) = \frac{q_i}{D_i}(1 - e^{-D_i \times t})\)

For hyperbolic decline: \(N_p(t) = \frac{q_i}{D_i(1-b)}\left[1 - (1 + b \times D_i \times t)^{(1-1/b)}\right]\)

Monte Carlo Uncertainty Analysis

For uncertainty quantification, input parameters are sampled from probability distributions:

The NPV distribution is built from $N$ simulations (typically 1000-10000):

\[\{NPV_1, NPV_2, ..., NPV_N\}\]

Key statistics extracted:


Engineering Mathematics

Inflow Performance Relationship (IPR)

Darcy’s Law (Linear, undersaturated oil): \(q = J \times (P_r - P_{wf})\)

where:

Vogel’s Equation (Solution gas drive, below bubble point): \(\frac{q}{q_{max}} = 1 - 0.2\left(\frac{P_{wf}}{P_r}\right) - 0.8\left(\frac{P_{wf}}{P_r}\right)^2\)

Rearranged: \(q = q_{max} \times \left[1 - 0.2\left(\frac{P_{wf}}{P_r}\right) - 0.8\left(\frac{P_{wf}}{P_r}\right)^2\right]\)

Fetkovich’s Equation (Gas wells): \(q = C \times (P_r^2 - P_{wf}^2)^n\)

where:

Vertical Lift Performance (VLP)

Single-Phase Pressure Drop: \(\frac{dP}{dL} = \frac{\rho g \sin\theta}{1000} + \frac{f \rho v^2}{2D}\)

where:

Beggs-Brill Correlation (Two-phase flow):

Pressure gradient consists of three components: \(\left(\frac{dP}{dL}\right)_{total} = \left(\frac{dP}{dL}\right)_{elevation} + \left(\frac{dP}{dL}\right)_{friction} + \left(\frac{dP}{dL}\right)_{acceleration}\)

Elevation term: \(\left(\frac{dP}{dL}\right)_{elevation} = \rho_m g \sin\theta\)

where mixture density: \(\rho_m = \rho_L H_L + \rho_G (1 - H_L)\)

Liquid holdup $H_L$ is calculated from flow regime correlations.

Nodal Analysis

The operating point is found where IPR and VLP curves intersect:

\[q_{IPR}(P_{wf}) = q_{VLP}(P_{wf})\]

Solved iteratively by finding $P_{wf}$ such that: \(f(P_{wf}) = q_{IPR}(P_{wf}) - q_{VLP}(P_{wf}) = 0\)

Material Balance (Tank Model)

General Material Balance Equation: \(N_p[B_o + (R_p - R_s)B_g] = N B_{oi}\left[\frac{(B_o - B_{oi}) + (R_{si} - R_s)B_g}{B_{oi}} + \frac{mB_{oi}(B_g - B_{gi})}{B_{gi}} + \frac{(1+m)B_{oi}(c_w S_{wi} + c_f)\Delta P}{1 - S_{wi}}\right] + W_e + W_{inj}B_w + G_{inj}B_g\)

For a solution gas drive reservoir (no aquifer, no injection): \(N = \frac{N_p[B_o + (R_p - R_s)B_g]}{(B_o - B_{oi}) + (R_{si} - R_s)B_g}\)

Voidage Replacement Ratio (VRR)

\[VRR = \frac{\text{Injection Volume at Reservoir Conditions}}{\text{Production Voidage at Reservoir Conditions}}\] \[VRR = \frac{W_{inj} \times B_w + G_{inj} \times B_g}{N_p \times B_o + (G_p - N_p \times R_s) \times B_g + W_p \times B_w}\]

where:

VRR = 1.0 maintains reservoir pressure.

Formation Volume Factors

Oil Formation Volume Factor: \(B_o = \frac{V_{oil,reservoir}}{V_{oil,standard}} \approx 1.0 + 0.00013 \times R_s\)

Gas Formation Volume Factor (real gas): \(B_g = \frac{P_{std}}{P} \times \frac{T}{T_{std}} \times Z = \frac{1.01325}{P} \times \frac{T}{288.15} \times Z\)

where $Z$ is the compressibility factor from EOS.

Network Solver (Multi-well Gathering)

For a network of $N$ wells connected to a common manifold:

Conservation of mass: \(q_{total} = \sum_{i=1}^{N} q_i\)

Pressure balance for each well: \(P_{wh,i} - \Delta P_{flowline,i} = P_{manifold}\)

Flowline pressure drop (simplified Beggs-Brill): \(\Delta P_{flowline} = \frac{f L \rho_m v^2}{2 D} + \rho_m g \Delta h\)

Iterative solution (successive substitution):

  1. Assume manifold pressure $P_m$
  2. For each well, calculate $P_{wh,i}$ from VLP
  3. Calculate flowline pressure drop $\Delta P_i$
  4. Check: $P_{wh,i} - \Delta P_i = P_m$ ?
  5. Update rates and iterate until convergence

Convergence criterion: \(\left|\frac{q_{total}^{k+1} - q_{total}^k}{q_{total}^k}\right| < \epsilon\)

Hydrate Formation Temperature

Simplified Hammerschmidt Correlation: \(\Delta T = \frac{K_H \times w}{M(100-w)}\)

where:

Hydrate formation condition (gas specific gravity method): \(T_{hyd} = 8.9 \times P^{0.285} \times \gamma_g^{0.5}\)

where:

Wax Appearance Temperature (WAT)

Coutinho Model (simplified): \(\ln(x_i^L \gamma_i^L) = \frac{\Delta H_{fus,i}}{R}\left(\frac{1}{T_m} - \frac{1}{T}\right)\)

For screening, empirical correlations based on n-paraffin content: \(WAT \approx 30 + 0.5 \times (C_{20+} \text{ content, wt\%})\)

Erosion Velocity

API RP 14E Erosion Velocity Limit: \(V_e = \frac{C}{\sqrt{\rho_m}}\)

where:


Mechanical Design Mathematics

Pressure Vessel Wall Thickness (ASME VIII)

Cylindrical shell under internal pressure: \(t = \frac{P \times R}{S \times E - 0.6 \times P} + CA\)

where:

Separator Sizing (API 12J)

Gas capacity (Souders-Brown): \(V_{gas,max} = K \sqrt{\frac{\rho_L - \rho_G}{\rho_G}}\)

where:

Vessel diameter from gas capacity: \(D = \sqrt{\frac{4 Q_g}{\pi V_{gas,max}}}\)

Liquid retention time: \(t_{ret} = \frac{V_{liq}}{Q_L}\)

Typical retention times: 2-5 minutes for 2-phase, 5-10 minutes for 3-phase.

Compressor Sizing (API 617)

Polytropic head: \(H_p = \frac{Z_{avg} R T_1}{M_w} \times \frac{n}{n-1} \times \left[\left(\frac{P_2}{P_1}\right)^{\frac{n-1}{n}} - 1\right]\)

where:

Polytropic power: \(W_p = \dot{m} \times H_p / \eta_p\)

where:

Number of stages: \(N_{stages} = \lceil H_p / H_{max,stage} \rceil\)

Typical maximum head per stage: 25-35 kJ/kg.

Pipeline Wall Thickness (ASME B31.8 / DNV-ST-F101)

Barlow formula (internal pressure): \(t = \frac{P \times D}{2 \times S \times F \times E \times T}\)

where:

DNV-ST-F101 collapse pressure (subsea): \(P_c = \frac{2 t}{D} \times S \times \alpha_u\)

where:


Power & CO2 Emissions Calculations

Power Consumption Estimation

Total facility power: \(P_{total} = P_{compression} + P_{pumping} + P_{heating} + P_{utilities}\)

Compression power (from EOS): \(P_{comp} = \frac{\dot{m} \times H_p}{\eta_p \times \eta_{driver}}\)

where $\eta_{driver}$ = 0.95-0.98 for electric, 0.30-0.40 for gas turbine.

CO2 Emission Factors

Power Source Emission Factor
Gas turbine (simple cycle) 500 kg CO2/MWh
Gas turbine (combined cycle) 350 kg CO2/MWh
Power from shore (Nordic grid) 50 kg CO2/MWh
Power from shore (UK grid) 200 kg CO2/MWh
Diesel generator 600 kg CO2/MWh

Annual CO2 emissions: \(CO2_{annual} = P_{total} \times t_{op} \times EF\)

where:

CO2 intensity: \(I_{CO2} = \frac{CO2_{annual}}{Q_{annual,boe}}\)

where:

Industry targets: < 10 kg CO2/boe for low-emission facilities.


Process Modeling & Mechanical Design Integration

The FieldDevelopmentWorkflow class integrates process simulation, mechanical design, and sustainability calculations into a unified workflow:

// Configure workflow with mechanical design and emissions
FieldDevelopmentWorkflow workflow = new FieldDevelopmentWorkflow("Barents Sea Discovery");
workflow.setConcept(concept)
    .setFluid(tunedFluid)
    .setProcessSystem(processModel)           // Full process simulation
    .setFidelityLevel(FidelityLevel.DETAILED)
    .setRunMechanicalDesign(true)             // Enable mechanical design
    .setCalculateEmissions(true)              // Enable CO2 calculations
    .setPowerSupplyType("POWER_FROM_SHORE")   // Electrification
    .setGridEmissionFactor(0.05)              // Nordic grid
    .setDesignStandard("Equinor");            // Company standards

// Run workflow
WorkflowResult result = workflow.run();

// Access mechanical design results
System.out.println("Equipment weight: " + result.totalEquipmentWeightTonnes + " tonnes");
System.out.println("Module footprint: " + result.totalFootprintM2 + " m²");

// Access power and emissions
System.out.println("Total power: " + result.totalPowerMW + " MW");
System.out.println("Annual CO2: " + result.annualCO2eKtonnes + " ktonnes/yr");
System.out.println("CO2 intensity: " + result.co2IntensityKgPerBoe + " kg/boe");

// Power breakdown
for (Map.Entry<String, Double> entry : result.powerBreakdownMW.entrySet()) {
    System.out.println("  " + entry.getKey() + ": " + entry.getValue() + " MW");
}

Equipment-Level Mechanical Design

Each process equipment class has an associated mechanical design class:

Equipment Mechanical Design Class Design Standard
Separator SeparatorMechanicalDesign ASME VIII, API 12J
Compressor CompressorMechanicalDesign API 617
Pump PumpMechanicalDesign API 610
Valve ValveMechanicalDesign IEC 60534
Heat Exchanger HeatExchangerMechanicalDesign TEMA
Pipeline PipelineMechanicalDesign ASME B31.3/B31.8
Tank TankMechanicalDesign API 650/620
// Individual equipment mechanical design
Separator separator = new Separator("V-100", inletStream);
separator.run();

MechanicalDesign mecDesign = separator.getMechanicalDesign();
mecDesign.setCompanySpecificDesignStandards("Equinor");
mecDesign.calcDesign();

// Access results
double weight = mecDesign.getWeightTotal();           // kg
double wallThickness = mecDesign.getWallThickness();  // mm
double innerDiameter = mecDesign.getInnerDiameter();  // m

// Export to JSON
String json = mecDesign.toJson();

System-Wide Design Aggregation

// Create process system
ProcessSystem process = new ProcessSystem();
process.add(feed);
process.add(separator);
process.add(compressor);
process.add(cooler);
process.run();

// Create system mechanical design
SystemMechanicalDesign sysMecDesign = new SystemMechanicalDesign(process);
sysMecDesign.setCompanySpecificDesignStandards("Equinor");
sysMecDesign.runDesignCalculation();

// Aggregated results
double totalWeight = sysMecDesign.getTotalWeight();       // kg
double totalVolume = sysMecDesign.getTotalVolume();       // m³
double plotSpace = sysMecDesign.getTotalPlotSpace();      // m²
double powerRequired = sysMecDesign.getTotalPowerRequired();  // kW

// Get breakdown by type
Map<String, Double> weightByType = sysMecDesign.getWeightByEquipmentType();
System.out.println("Separators: " + weightByType.get("Separator") + " kg");
System.out.println("Compressors: " + weightByType.get("Compressor") + " kg");

Emissions Tracking Integration

// Process-level emissions tracking
import neqsim.process.sustainability.EmissionsTracker;

EmissionsTracker tracker = new EmissionsTracker(process);
tracker.setGridEmissionFactor(0.05);  // Nordic grid: 50 g CO2/kWh
tracker.setIncludeIndirectEmissions(true);

EmissionsReport report = tracker.calculateEmissions();

// Results by category
System.out.println("Total CO2e: " + report.getTotalCO2e("ton/yr") + " ton/yr");
System.out.println("Compression: " + report.getEmissionsByCategory().get("COMPRESSION"));
System.out.println("Pumping: " + report.getEmissionsByCategory().get("PUMPING"));

// Export for regulatory reporting
report.exportToCSV("emissions_report.csv");

Subsea Production System Integration

The SubseaProductionSystem class provides a unified abstraction for modeling subsea developments, integrating wells, flowlines, manifolds, and tieback analysis into the field development workflow.

Subsea Architecture Types

Architecture Description Use Case
DIRECT_TIEBACK Wells tied directly to host Short distances (<10km), few wells
MANIFOLD_CLUSTER Wells grouped at subsea manifold Standard development, 4-8 wells
DAISY_CHAIN Wells connected in series Long, narrow reservoir
TEMPLATE Multiple wells from single structure Compact field development

Subsea System Configuration

import neqsim.process.fielddevelopment.subsea.SubseaProductionSystem;
import neqsim.process.fielddevelopment.tieback.HostFacility;
import neqsim.process.fielddevelopment.tieback.TiebackAnalyzer;

// Create subsea production system
SubseaProductionSystem subsea = new SubseaProductionSystem("Marginal Gas Satellite");
subsea.setArchitecture(SubseaProductionSystem.SubseaArchitecture.MANIFOLD_CLUSTER)
    .setWaterDepthM(350.0)
    .setTiebackDistanceKm(25.0)
    .setWellCount(4)
    .setRatePerWell(1.5e6)                    // Sm3/day per well
    .setWellheadConditions(180.0, 80.0)       // bara, °C
    .setFlowlineDiameterInches(12.0)
    .setSeabedTemperatureC(4.0)
    .setFlowlineMaterial("Carbon Steel")
    .setReservoirFluid(gasCondensateFluid);   // NeqSim fluid

// Build and run
subsea.build();
subsea.run();

// Get results
SubseaProductionSystem.SubseaSystemResult result = subsea.getResult();
System.out.println("Arrival pressure: " + result.getArrivalPressureBara() + " bara");
System.out.println("Arrival temperature: " + result.getArrivalTemperatureC() + " °C");
System.out.println("Subsea CAPEX: " + result.getTotalSubseaCapexMusd() + " MUSD");

// CAPEX breakdown
System.out.println("  Subsea trees: " + result.getSubseaTreeCostMusd() + " MUSD");
System.out.println("  Manifold: " + result.getManifoldCostMusd() + " MUSD");
System.out.println("  Pipeline: " + result.getPipelineCostMusd() + " MUSD");
System.out.println("  Umbilical: " + result.getUmbilicalCostMusd() + " MUSD");

Tieback Analysis to Multiple Hosts

// Define potential host facilities
HostFacility host1 = HostFacility.builder("Platform A")
    .location(60.5, 2.3)
    .waterDepth(120)
    .gasCapacity(15.0, "MSm3/d")
    .gasUtilization(0.75)
    .minTieInPressure(80)
    .build();

HostFacility host2 = HostFacility.builder("FPSO B")
    .location(60.8, 2.1)
    .waterDepth(350)
    .gasCapacity(25.0, "MSm3/d")
    .gasUtilization(0.60)
    .build();

// Analyze tieback options
TiebackAnalyzer analyzer = new TiebackAnalyzer();
TiebackReport report = analyzer.analyze(concept, Arrays.asList(host1, host2), 60.6, 2.5);

// Review results
System.out.println("Best option: " + report.getBestFeasibleOption().getHostName());
System.out.println("NPV: " + report.getBestFeasibleOption().getNpvMusd() + " MUSD");

// Print comparison
for (TiebackOption opt : report.getFeasibleOptions()) {
    System.out.println(opt.getHostName() + ": " + opt.getDistanceKm() + " km, " 
        + opt.getTotalCapexMusd() + " MUSD CAPEX");
}

Integrated Subsea Workflow

The subsea system integrates seamlessly with the FieldDevelopmentWorkflow:

// Configure workflow with subsea tieback
FieldDevelopmentWorkflow workflow = new FieldDevelopmentWorkflow("Satellite Field");
workflow.setConcept(FieldConcept.gasTieback("Satellite", 25.0, 4, 1.5))
    .setFluid(gasFluid)
    .setFidelityLevel(FidelityLevel.CONCEPTUAL)
    .setRunSubseaAnalysis(true)               // Enable subsea analysis
    .setWaterDepthM(350.0)
    .setTiebackDistanceKm(25.0)
    .setSubseaArchitecture(SubseaProductionSystem.SubseaArchitecture.MANIFOLD_CLUSTER)
    .addHostFacility(host1)
    .addHostFacility(host2)
    .setCountryCode("NO");

// Or provide a pre-configured subsea system
workflow.setSubseaSystem(subsea);

// Run workflow
WorkflowResult result = workflow.run();

// Access subsea results
System.out.println("Subsea CAPEX: " + result.subseaCapexMusd + " MUSD");
System.out.println("Arrival pressure: " + result.arrivalPressureBara + " bara");
System.out.println("Selected host: " + result.selectedTiebackOption.getHostName());

// Full subsea system result
if (result.subseaSystemResult != null) {
    System.out.println(result.subseaSystemResult.getSummary());
}

Subsea Cost Estimation Model

The subsea CAPEX model uses parametric cost estimation:

Component Base Cost Scaling
Subsea tree 25 MUSD/well Fixed per well
Manifold/template 35 MUSD Per manifold
Pipeline 2.5 MUSD/km Diameter^1.3 × depth factor
Umbilical 1.0 MUSD/km Length × 1.05 for routing
Control system 3 MUSD/well + 5 MUSD Includes SCM, HPU

Water Depth Factors:

Material Factors:

Subsea Flow Assurance Integration

The subsea system integrates with NeqSim’s flow assurance capabilities:

// The subsea system uses actual thermodynamic calculations
subsea.setReservoirFluid(gasCondensateFluid);
subsea.build();
subsea.run();

// Arrival conditions reflect actual pressure/temperature drop
double arrivalT = subsea.getArrivalTemperatureC();
double seabedT = 4.0;

// Check hydrate margin
ThermodynamicOperations ops = new ThermodynamicOperations(gasCondensateFluid.clone());
double hydrateT = ops.hydrateFormationTemperature(arrivalP);
double margin = arrivalT - hydrateT;

if (margin < 5.0) {
    System.out.println("WARNING: Hydrate margin is only " + margin + " °C");
    System.out.println("Consider MEG injection or insulation");
}

Field Development Lifecycle

┌────────────────────────────────────────────────────────────────────────────────┐
│                          FIELD DEVELOPMENT LIFECYCLE                            │
├──────────────┬──────────────┬──────────────┬──────────────┬──────────────────────┤
│  Discovery   │  Feasibility │   Concept    │   FEED/DG2   │  Operations          │
│              │   (DG1)      │   (DG2)      │   (DG3/4)    │                      │
├──────────────┼──────────────┼──────────────┼──────────────┼──────────────────────┤
│ • PVT Lab    │ • Volumetrics│ • EOS Tuning │ • Detailed   │ • History matching   │
│ • GIIP/STOIIP│ • Screening  │ • IPR/VLP    │   reservoir  │ • Production optim.  │
│ • Analogs    │ • Economics  │ • Process    │ • Full CAPEX │ • Debottlenecking    │
│              │   ±50%       │   simulation │   ±20%       │                      │
└──────────────┴──────────────┴──────────────┴──────────────┴──────────────────────┘

NeqSim Classes by Development Phase

Phase 1: Discovery & Appraisal

Objective: Characterize the fluid and estimate volumes

Task NeqSim Class Package
Create fluid from composition SystemSrkEos, SystemPrEos, SystemSrkCPAstatoil thermo.system
Plus-fraction characterization Characterization.Pedersen() thermo.characterization
Saturation pressure SaturationPressure pvtsimulation.simulation
CCE/DLE/CVD simulation ConstantMassExpansion, DifferentialLiberation, ConstantVolumeDepletion pvtsimulation.simulation
GOR estimation GOR, SeparatorTest pvtsimulation.simulation
Fluid type classification FluidInput.fluidType() fielddevelopment.concept

Example Workflow:

// Create reservoir fluid from lab composition
SystemInterface fluid = new SystemSrkEos(373.15, 250.0);
fluid.addComponent("nitrogen", 0.005);
fluid.addComponent("CO2", 0.015);
fluid.addComponent("methane", 0.60);
fluid.addComponent("ethane", 0.08);
fluid.addComponent("propane", 0.05);
fluid.addTBPfraction("C7+", 0.20, 0.220, 0.85);
fluid.setMixingRule("classic");

// Characterize plus-fraction
fluid.getCharacterization().characterisePlusFraction();

// Calculate bubble point
SaturationPressure satP = new SaturationPressure(fluid);
satP.setTemperature(100.0, "C");
satP.runCalc();
double bubblePoint = satP.getSaturationPressure();

// Run DLE for Bo, Rs, μo
DifferentialLiberation dle = new DifferentialLiberation(fluid);
dle.setTemperature(100.0, "C");
dle.setPressures(new double[]{250, 200, 150, 100, 50, 1.01325}, "bara");
dle.runCalc();

Phase 2: Feasibility Study (DG1)

Objective: Screen development options and estimate economics (±50%)

Task NeqSim Class Package
Define concept FieldConcept, FluidInput, WellsInput, InfrastructureInput fielddevelopment.concept
Flow assurance screening FlowAssuranceScreener fielddevelopment.screening
Hydrate risk CPA thermodynamics in screener fielddevelopment.screening
Wax risk WAT estimation fielddevelopment.screening
Cost estimation (±50%) EconomicsEstimator, RegionalCostFactors fielddevelopment.screening
Production forecast ProductionProfileGenerator (Arps) fielddevelopment.economics
NPV calculation CashFlowEngine, TaxModel fielddevelopment.economics
Tieback options TiebackAnalyzer fielddevelopment.tieback
Batch comparison BatchConceptRunner fielddevelopment.evaluation

Example Workflow:

// Quick concept definition for gas tieback
FieldConcept concept = FieldConcept.quickGasTieback(
    "Satellite Discovery",
    200.0,    // GIIP (GSm3)
    0.02,     // CO2 fraction
    25.0      // Tieback length (km)
);

// Add well details
concept.getWells()
    .setWellCount(4)
    .setInitialRate(2.5e6, "Sm3/day")  // Per well
    .setTHP(80.0, "bara");

// Flow assurance screening
FlowAssuranceScreener faScreener = new FlowAssuranceScreener();
FlowAssuranceResult faResult = faScreener.screen(concept);
System.out.println("Hydrate risk: " + faResult.getHydrateRisk());
System.out.println("Wax risk: " + faResult.getWaxRisk());

// Economics screening
EconomicsEstimator estimator = new EconomicsEstimator("NO");
EconomicsReport costs = estimator.quickEstimate(concept);
System.out.println("CAPEX: " + costs.getTotalCapexMUSD() + " MUSD");

// Production profile (Arps decline)
ProductionProfileGenerator gen = new ProductionProfileGenerator();
Map<Integer, Double> gasProfile = gen.generateFullProfile(
    10.0e6,                       // Peak rate (Sm3/d)
    1,                            // Ramp-up years
    5,                            // Plateau years
    0.12,                         // Decline rate
    ProductionProfileGenerator.DeclineType.EXPONENTIAL,
    2027,                         // First production
    25                            // Field life
);

// Cash flow analysis
CashFlowEngine engine = new CashFlowEngine("NO");
engine.setCapex(costs.getTotalCapexMUSD(), 2025);
engine.setOpexPercentOfCapex(0.04);
engine.setGasPrice(0.30);  // USD/Sm3
engine.setProductionProfile(null, gasProfile, null);

CashFlowResult result = engine.calculate(0.08);
System.out.println("NPV@8%: " + result.getNpv() + " MUSD");
System.out.println("IRR: " + result.getIrr() * 100 + "%");

Phase 3: Concept Selection (DG2)

Objective: Select preferred concept with EOS-tuned fluid and well models

Task NeqSim Class Package
EOS tuning to lab data PVTRegression pvtsimulation.regression
PVT report generation PVTReportGenerator pvtsimulation.util
IPR modeling WellFlow process.equipment.reservoir
VLP modeling TubingPerformance process.equipment.reservoir
Integrated well model WellSystem process.equipment.reservoir
Nodal analysis WellSystem.findOperatingPoint() process.equipment.reservoir
Material balance SimpleReservoir process.equipment.reservoir
Process simulation ProcessSystem process.processmodel
Facility builder FacilityBuilder fielddevelopment.facility
Concept evaluation ConceptEvaluator fielddevelopment.evaluation
Sensitivity analysis SensitivityAnalyzer fielddevelopment.economics

Example Workflow:

// === EOS TUNING ===
// Start with base fluid
SystemInterface baseFluid = createBaseFluid();

// Add lab data and run regression
PVTRegression regression = new PVTRegression(baseFluid);
regression.addCCEData(ccePressures, cceRelativeVolumes, 100.0);
regression.addDLEData(dlePressures, dleRs, dleBo, dleViscosity, 100.0);
regression.addRegressionParameter(RegressionParameter.BIP_METHANE_C7PLUS, 0.0, 0.10);
regression.addRegressionParameter(RegressionParameter.C7PLUS_MW_MULTIPLIER, 0.9, 1.1);

RegressionResult regResult = regression.runRegression();
SystemInterface tunedFluid = regResult.getTunedFluid();

// === WELL MODELING ===
// Create reservoir stream
Stream reservoirStream = new Stream("Reservoir", tunedFluid);
reservoirStream.setFlowRate(5000.0, "Sm3/day");
reservoirStream.setTemperature(100.0, "C");
reservoirStream.setPressure(250.0, "bara");
reservoirStream.run();

// Integrated IPR + VLP model
WellSystem well = new WellSystem("Producer-1", reservoirStream);
well.setIPRModel(WellSystem.IPRModel.VOGEL);
well.setVogelParameters(8000.0, 180.0, 250.0);  // qTest, pwfTest, pRes
well.setTubingLength(2500.0, "m");
well.setTubingDiameter(4.0, "in");
well.setPressureDropCorrelation(TubingPerformance.PressureDropCorrelation.BEGGS_BRILL);
well.setWellheadPressure(50.0, "bara");
well.run();

double operatingRate = well.getOperatingFlowRate("Sm3/day");
double operatingBHP = well.getOperatingBHP("bara");

// === MATERIAL BALANCE RESERVOIR ===
SimpleReservoir reservoir = new SimpleReservoir("Main Field");
reservoir.setReservoirFluid(tunedFluid, 200e6, 10.0, 10.0);  // GIIP, thickness, area
Stream wellStream = reservoir.addOilProducer("Well-1");
wellStream.setFlowRate(operatingRate, "Sm3/day");

// === PROCESS SIMULATION ===
ProcessSystem process = new ProcessSystem("FPSO");
process.add(reservoir);

// HP Separator
ThreePhaseSeparator hpSep = new ThreePhaseSeparator("HP Separator", wellStream);
hpSep.setInletPressure(50.0, "bara");
process.add(hpSep);

// Compressor
Compressor compressor = new Compressor("Export Comp", hpSep.getGasOutStream());
compressor.setOutletPressure(150.0, "bara");
process.add(compressor);

process.run();

// === CONCEPT EVALUATION ===
ConceptEvaluator evaluator = new ConceptEvaluator();
ConceptKPIs kpis = evaluator.evaluate(concept, tunedFluid);
System.out.println(kpis.getSummaryReport());

Phase 4: FEED / Detailed Design (DG3/DG4)

Objective: Finalize design with detailed reservoir coupling and process simulation

Task NeqSim Class Package
Black oil tables BlackOilConverter blackoil
Eclipse PVT export EclipseEOSExporter blackoil.io
VFP table generation WellSystem.generateLiftCurves() process.equipment.reservoir
Reservoir depletion study SimpleReservoir.runDepletion() process.equipment.reservoir
Production scheduling FieldProductionScheduler process.util.fielddevelopment
Well scheduling WellScheduler process.util.fielddevelopment
Capacity analysis FacilityCapacity process.util.fielddevelopment
Monte Carlo SensitivityAnalyzer.monteCarloAnalysis() fielddevelopment.economics
MMP calculation MMPCalculator pvtsimulation.simulation

Example Workflow:

// === EXPORT TO RESERVOIR SIMULATOR ===
// Generate black oil tables
BlackOilConverter converter = new BlackOilConverter(tunedFluid);
converter.setReservoirTemperature(373.15);
converter.setPressureRange(1.01325, 300.0, 20);
BlackOilPVTTable pvtTable = converter.convert();

// Export to Eclipse format
EclipseEOSExporter.ExportConfig config = new EclipseEOSExporter.ExportConfig()
    .setUnits(EclipseEOSExporter.Units.METRIC)
    .setIncludePVTO(true)
    .setIncludePVTG(true)
    .setIncludePVTW(true)
    .setIncludeDensity(true);
    
EclipseEOSExporter.toFile(tunedFluid, Path.of("PVT_TABLES.INC"), config);

// === VFP TABLE GENERATION ===
double[] whPressures = {30, 40, 50, 60, 70, 80};  // bara
double[] waterCuts = {0, 0.2, 0.4, 0.6, 0.8};
WellSystem.VFPTable vfp = well.generateLiftCurves(whPressures, waterCuts);
vfp.exportToEclipse("VFP_WELL1.INC");

// === PRODUCTION SCHEDULING ===
FieldProductionScheduler scheduler = new FieldProductionScheduler();
scheduler.addReservoir(reservoir);
scheduler.setFacilityModel(process);
scheduler.setPlateauTarget(10.0e6, "Sm3/day");
scheduler.setEconomicLimit(0.5e6, "Sm3/day");
scheduler.setGasPrice(0.30);
scheduler.setDiscountRate(0.08);

ScheduleResult schedule = scheduler.runScheduling(2027, 2052);
System.out.println(schedule.getProductionForecast());
System.out.println(schedule.getEconomicSummary());

// === MONTE CARLO ANALYSIS ===
SensitivityAnalyzer analyzer = new SensitivityAnalyzer(engine, 0.08);
analyzer.setOilPriceDistribution(50.0, 100.0);
analyzer.setCapexDistribution(800, 1200);
analyzer.setProductionFactorDistribution(0.8, 1.2);

MonteCarloResult mc = analyzer.monteCarloAnalysis(10000);
System.out.println("P10: " + mc.getNpvP10() + " MUSD");
System.out.println("P50: " + mc.getNpvP50() + " MUSD");
System.out.println("P90: " + mc.getNpvP90() + " MUSD");

Key Integration Points

1. PVT → Reservoir Coupling

┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  Lab PVT Data    │────▶│  PVTRegression   │────▶│  Tuned EOS       │
│  (CCE/DLE/CVD)   │     │  (Parameter fit) │     │  SystemInterface │
└──────────────────┘     └──────────────────┘     └────────┬─────────┘
                                                           │
                         ┌─────────────────────────────────┼─────────────────────┐
                         │                                 │                     │
                         ▼                                 ▼                     ▼
               ┌──────────────────┐           ┌──────────────────┐    ┌──────────────────┐
               │ BlackOilConverter│           │  SimpleReservoir │    │  Process Streams │
               │ PVTO/PVTG tables │           │  Material Balance│    │  Compositional   │
               └────────┬─────────┘           └────────┬─────────┘    └────────┬─────────┘
                        │                              │                       │
                        ▼                              ▼                       ▼
               ┌──────────────────┐           ┌──────────────────┐    ┌──────────────────┐
               │ Eclipse/OPM      │           │  WellSystem      │    │  ProcessSystem   │
               │ Reservoir Sim    │           │  IPR/VLP Nodal   │    │  Facility Model  │
               └──────────────────┘           └──────────────────┘    └──────────────────┘

2. Well → Reservoir → Facility Loop

// Nodal analysis loop with reservoir depletion
for (int year = 2027; year <= 2050; year++) {
    // Update reservoir pressure
    reservoir.runDepletion(365.0);  // 1 year
    double pRes = reservoir.getAveragePressure("bara");
    
    // Update IPR with new reservoir pressure
    well.setReservoirPressure(pRes, "bara");
    well.run();
    
    double newRate = well.getOperatingFlowRate("Sm3/day");
    
    // Check facility constraints
    if (newRate > facilityCapacity.getMaxGasRate()) {
        newRate = facilityCapacity.getMaxGasRate();
        // Back-calculate required choke setting
        well.setTargetRate(newRate, "Sm3/day");
        well.run();
    }
    
    schedule.addYear(year, newRate, pRes);
}

3. Economics → Decision Support

// Compare multiple development options
BatchConceptRunner batch = new BatchConceptRunner();

// Option A: Direct tieback to platform
batch.addConcept(FieldConcept.quickGasTieback("Tieback-A", 200, 0.02, 15));

// Option B: Standalone FPSO
batch.addConcept(FieldConcept.quickOilDevelopment("FPSO-B", 50, 0.03));

// Option C: Subsea to shore
batch.addConcept(FieldConcept.quickGasTieback("S2S-C", 200, 0.02, 80));

// Run parallel evaluation
batch.evaluateAll();

// Get ranked results
List<ConceptKPIs> ranked = batch.getRankedResults();
for (ConceptKPIs kpi : ranked) {
    System.out.printf("%s: NPV=%.0f MUSD, Score=%.2f%n",
        kpi.getConceptName(), kpi.getNpv(), kpi.getOverallScore());
}

Study Fidelity Levels

Level 1: Screening (±50% accuracy)

// Minimal input - analog-based
FieldConcept concept = FieldConcept.quickGasTieback(name, giip, co2, distance);
ConceptKPIs kpis = new ConceptEvaluator().quickScreen(concept);

Inputs: Fluid type, volumes (GIIP/STOIIP), distance, water depth
Models: Correlations, analog-based costs, Arps decline
Outputs: Order-of-magnitude CAPEX/OPEX, screening-level NPV

Level 2: Conceptual (±30% accuracy)

// EOS fluid, IPR/VLP, process blocks
SystemInterface fluid = createFluidFromComposition(labData);
WellSystem well = new WellSystem("Well-1", reservoirStream);
FacilityConfig facility = FacilityBuilder.forConcept(concept).autoGenerate().build();
ConceptKPIs kpis = new ConceptEvaluator().evaluate(concept, fluid, facility);

Inputs: Composition, lab PVT, well test data, facility configuration
Models: EOS thermodynamics, Vogel/Fetkovich IPR, Beggs-Brill VLP
Outputs: Detailed CAPEX breakdown, production forecast, flow assurance risk

Level 3: Detailed (±20% accuracy)

// Tuned EOS, full process simulation, Monte Carlo
PVTRegression regression = new PVTRegression(baseFluid);
regression.addCCEData(ccePressures, cceRelativeVolumes, temp);
regression.addDLEData(dlePressures, dleRs, dleBo, dleViscosity, temp);
SystemInterface tunedFluid = regression.runRegression().getTunedFluid();

ProcessSystem process = new ProcessSystem();
// ... detailed equipment configuration
process.run();

SensitivityAnalyzer analyzer = new SensitivityAnalyzer(engine, discountRate);
MonteCarloResult mc = analyzer.monteCarloAnalysis(10000);

Inputs: Full PVT report, well test interpretation, vendor quotes
Models: Tuned EOS, mechanistic correlations, rigorous process simulation
Outputs: P10/P50/P90 economics, FEED-level design


Topics from TPG4230 Course Mapped to NeqSim

Based on the NTNU course “Field Development and Operations” (TPG4230), here is how each topic maps to NeqSim capabilities:

Course Topic NeqSim Implementation Status
Life cycle of hydrocarbon field FieldProductionScheduler, CashFlowEngine ✅ Complete
Field development workflow ConceptEvaluator, BatchConceptRunner ✅ Complete
Probabilistic reserve estimation SensitivityAnalyzer.monteCarloAnalysis() ✅ Complete
Project economic evaluation CashFlowEngine, TaxModel, NPV/IRR ✅ 15+ countries
Offshore field architectures FieldConcept, InfrastructureInput ✅ Complete
Production systems WellSystem (IPR+VLP), TubingPerformance ✅ Complete
Injection systems InjectionWellModel, injectivity index, Hall plot ✅ Complete
Reservoir depletion SimpleReservoir, material balance ✅ Tank model
Field performance ProductionProfile, decline curves ✅ Complete
Production scheduling FieldProductionScheduler, WellScheduler ✅ Complete
Flow assurance FlowAssuranceScreener, hydrate/wax/corrosion ✅ Complete
Boosting (ESP, gas lift) GasLiftCalculator, ArtificialLiftScreener (6 methods) ✅ Complete
Field processing ProcessSystem, separators, compressors ✅ Complete
Export product control ProcessSystem export streams ✅ Complete
Integrated asset modeling SimpleReservoir + ProcessSystem ✅ Complete
Energy efficiency EnergyEfficiencyCalculator, SEC/EEI benchmarking ✅ Complete
Emissions to air/sea DetailedEmissionsCalculator, Scope 1/2/3 ✅ Complete

Feasibility (Week 1-4)

  1. Define fluid type and volumes
    FluidInput fluid = new FluidInput().fluidType(FluidType.GAS_CONDENSATE).gor(3000);
    
  2. Screen concepts with BatchConceptRunner
    batch.addConcept(concept1);
    batch.addConcept(concept2);
    batch.evaluateAll();
    
  3. Generate economics comparison
    batch.generateComparisonReport("concepts_comparison.md");
    

Concept Select (Week 5-12)

  1. Tune EOS to lab data
    PVTRegression regression = new PVTRegression(fluid);
    regression.addCCEData(...);
    SystemInterface tuned = regression.runRegression().getTunedFluid();
    
  2. Build well model (IPR + VLP)
    WellSystem well = new WellSystem("Producer", stream);
    well.setVogelParameters(qTest, pwfTest, pRes);
    well.setTubingLength(2500, "m");
    
  3. Run process simulation
    ProcessSystem process = new ProcessSystem();
    process.add(separator);
    process.add(compressor);
    process.run();
    
  4. Sensitivity analysis
    SensitivityAnalyzer analyzer = new SensitivityAnalyzer(engine, 0.08);
    TornadoResult tornado = analyzer.tornadoAnalysis(0.20);
    

FEED (Week 13-26)

  1. Export to reservoir simulator
    EclipseEOSExporter.toFile(tunedFluid, Path.of("PVT.INC"));
    well.exportVFPToEclipse("VFP.INC");
    
  2. Full production scheduling
    FieldProductionScheduler scheduler = new FieldProductionScheduler();
    scheduler.runScheduling(2027, 2052);
    
  3. Monte Carlo economics
    MonteCarloResult mc = analyzer.monteCarloAnalysis(10000);
    double probPositiveNPV = mc.getProbabilityPositiveNpv();
    

Future Enhancements

Near-term (Priority)

  1. Network solver - Multi-well gathering network pressure balance
  2. Transient well model - Time-dependent IPR with pressure buildup/drawdown
  3. Water injection support - Full injection well modeling
  4. Gas lift optimization - Optimal gas allocation across wells

Medium-term

  1. Eclipse/OPM coupling - Direct reservoir simulator integration
  2. Real-time data integration - OSDU/WITSML connection
  3. Machine learning - Decline curve prediction from analogs
  4. Optimization - Portfolio optimization across multiple fields

Long-term

  1. Digital twin - Live field model with data assimilation
  2. Carbon storage - CO2 injection field development
  3. Hydrogen/ammonia - Energy transition applications

See Also