Skip to the content.

This folder documents NeqSim’s field-development screening and integration capabilities from concept selection through late life. The APIs combine reservoir assumptions, facility screening, process-model generation, host-capacity checks, economics, emissions, and reservoir-simulator handoffs.

The high-level helpers are screening tools. They do not by themselves provide a calibrated reservoir model, a design-grade well model, or an independently reviewed cost estimate. Preserve the engineering basis, units, fluid characterization, uncertainty, and validation evidence when moving a concept into detailed design.


Overview Documents

Document Description
DIGITAL_FIELD_TWIN.md Start here! Architecture showing how NeqSim integrates all lifecycle phases
MATHEMATICAL_REFERENCE.md Mathematical foundations for all calculations (EoS, economics, flow)
API_GUIDE.md Source-anchored concept, screening-KPI, option-ranking, unit, and engineering-boundary guide
DECISION_ENGINE_WORKFLOWS.md Decision-engine workflows for tiebacks, greenfield concepts, portfolios, process coupling, reservoir exports, and report-ready tables
HOST_TIE_IN_CAPACITY.md Host capacity, holdback, process-equipment bottlenecks, and debottleneck decisions for brownfield tiebacks
INTEGRATED_PRODUCTION_MODELLING.md Reservoir-to-market IPM — reservoir drives, well deliverability curves, network solver, gas-lift allocation, well-test matching, artificial-lift pumps, and choke optimisation (GAP/PROSPER/MBAL + Pipesim style)
FIELD_LIFECYCLE_SIMULATION.md Time-marching field and area concepts with multi-host routing, facility sizing, product specifications, NPV and break-even

Model Continuity and Integration Boundaries

NeqSim can preserve thermodynamic consistency across a workflow when the caller explicitly passes or clones the same calibrated SystemInterface. The field-development convenience classes do not automatically propagate a tuned fluid through every calculation.

PVT to process

Create and calibrate the fluid first, then pass a clone to each inlet Stream. A generated model from ConceptToProcessLinker instead creates a representative SRK screening fluid from the FieldConcept inputs. Replace that generated fluid or build the detailed ProcessSystem explicitly when tuned PVT behavior is required.

Reservoir to facilities

ReservoirCouplingExporter.generateVfpProd(String, SystemInterface, int) accepts a fluid object and produces Eclipse-style VFP keywords. The current implementation uses a screening hydrostatic/friction correlation; it is not a full wellbore or compositional-flow calculation. Configure the export format with setFormat(ExportFormat), retrieve text with getEclipseKeywords(), and write it with exportToFile(String). Validate design work against a qualified well and flowline model.

Technical screening to economics

ConceptEvaluator.evaluate(FieldConcept) auto-generates a facility configuration and combines simplified production, flow-assurance, safety, emissions, and economics screeners. Treat the resulting KPIs as comparative concept-screening evidence, not as project sanction or design certification.


Package Structure

neqsim.process.fielddevelopment/
├── concept/           # Core data structures (FieldConcept, ReservoirInput, etc.)
│   ├── GreenfieldConceptFactory
│   └── DevelopmentCaseTemplate
├── economics/         # NPV, tax, portfolio optimization
│   ├── CashFlowEngine
│   ├── NorwegianTaxModel
│   └── PortfolioOptimizer
├── evaluation/        # Decision support
│   ├── ConceptEvaluator
│   ├── DevelopmentOptionRanker
│   └── MonteCarloRunner
├── facility/          # Process generation
│   ├── ConceptToProcessLinker
│   └── FacilityBuilder
├── lifecycle/         # Executable reservoir-to-market lifetime and area concepts
│   ├── AreaDevelopmentPortfolio
│   ├── FieldLifecycleSimulator
│   ├── FieldLifecycleModel (ProcessSystem/ProcessModel + existing SURF)
│   ├── FacilityLifecycleStrategy
│   ├── FacilityCapacityAllocator
│   ├── FacilityModificationPlanner
│   ├── FieldProductSpecifications
│   └── NorwegianOilFieldCase (greenfield + multi-host area portfolio)
├── network/           # Pipeline network
│   ├── MultiphaseFlowIntegrator
│   └── NetworkSolver
├── reservoir/         # Reservoir coupling
│   ├── ReservoirCouplingExporter
│   └── TransientWellModel
├── screening/         # Technical screening
│   ├── FlowAssuranceScreener
│   ├── ArtificialLiftScreener
│   └── EmissionsTracker
├── subsea/            # Subsea systems
│   └── SubseaProductionSystem
└── tieback/           # Tieback analysis
    ├── TiebackAnalyzer
    ├── HostFacility
    └── capacity/      # Host tie-in capacity and holdback planning
        ├── TieInCapacityPlanner
        ├── ProductionProfileSeries
        └── HostTieInPoint

Executable Screening Workflow

The following Java 8 program exercises the current public APIs for concept evaluation, option ranking, host-capacity holdback, process generation, reservoir export, and SURF cost screening. It validates key results before logging them. Replace the illustrative assumptions and screening correlations with project data and independently reviewed models before using the results for an engineering decision.

import java.nio.file.Files;
import java.nio.file.Path;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import neqsim.process.fielddevelopment.concept.DevelopmentCaseTemplate;
import neqsim.process.fielddevelopment.concept.FieldConcept;
import neqsim.process.fielddevelopment.concept.GreenfieldConceptFactory;
import neqsim.process.fielddevelopment.evaluation.ConceptEvaluator;
import neqsim.process.fielddevelopment.evaluation.ConceptKPIs;
import neqsim.process.fielddevelopment.evaluation.DevelopmentOptionRanker;
import neqsim.process.fielddevelopment.evaluation.DevelopmentOptionRanker.Criterion;
import neqsim.process.fielddevelopment.evaluation.DevelopmentOptionRanker.DevelopmentOption;
import neqsim.process.fielddevelopment.evaluation.DevelopmentOptionRanker.RankingResult;
import neqsim.process.fielddevelopment.facility.ConceptToProcessLinker;
import neqsim.process.fielddevelopment.facility.ConceptToProcessLinker.FidelityLevel;
import neqsim.process.fielddevelopment.reservoir.ReservoirCouplingExporter;
import neqsim.process.fielddevelopment.reservoir.ReservoirCouplingExporter.ExportFormat;
import neqsim.process.fielddevelopment.reservoir.ReservoirCouplingExporter.VfpTable;
import neqsim.process.fielddevelopment.tieback.HostFacility;
import neqsim.process.fielddevelopment.tieback.capacity.CapacityAllocationPolicy;
import neqsim.process.fielddevelopment.tieback.capacity.HoldbackPolicy;
import neqsim.process.fielddevelopment.tieback.capacity.ProductionProfileSeries;
import neqsim.process.fielddevelopment.tieback.capacity.TieInCapacityPlanner;
import neqsim.process.fielddevelopment.tieback.capacity.TieInCapacityResult;
import neqsim.process.mechanicaldesign.subsea.SubseaCostEstimator;
import neqsim.process.processmodel.ProcessSystem;
import neqsim.thermo.system.SystemInterface;
import neqsim.thermo.system.SystemSrkEos;

public final class FieldDevelopmentOverviewExample {
  private static final Logger logger =
      LogManager.getLogger(FieldDevelopmentOverviewExample.class);

  private FieldDevelopmentOverviewExample() {}

  public static void main(String[] args) throws Exception {
    FieldConcept concept =
        FieldConcept.gasTieback("Demo gas tieback", 30.0, 2, 0.8);
    ConceptKPIs kpis = new ConceptEvaluator().evaluate(concept);

    DevelopmentCaseTemplate tieback =
        GreenfieldConceptFactory.subseaTieback("Book tieback");
    DevelopmentCaseTemplate fpso =
        GreenfieldConceptFactory.standaloneFpso("Book FPSO");

    DevelopmentOptionRanker ranker = new DevelopmentOptionRanker();
    DevelopmentOption fpsoOption = ranker.addOption("FPSO");
    fpsoOption.setScore(Criterion.NPV, 1200.0);
    fpsoOption.setScore(Criterion.CO2_INTENSITY, 12.0);
    DevelopmentOption tiebackOption = ranker.addOption("Tieback");
    tiebackOption.setScore(Criterion.NPV, 650.0);
    tiebackOption.setScore(Criterion.CO2_INTENSITY, 7.0);
    RankingResult ranking = ranker.rank();

    HostFacility host =
        HostFacility.builder("Brownfield host").gasCapacity(10.0).build();
    ProductionProfileSeries base =
        new ProductionProfileSeries("base")
            .addPeriod(2028, 7.0, 0.0, 0.0, 0.0);
    ProductionProfileSeries satellite =
        new ProductionProfileSeries("satellite")
            .addPeriod(2028, 4.0, 0.0, 0.0, 0.0);
    TieInCapacityResult capacity =
        new TieInCapacityPlanner(host)
            .setHostProductionProfile(base)
            .setSatelliteProductionProfile(satellite)
            .setAllocationPolicy(CapacityAllocationPolicy.BASE_FIRST)
            .setHoldbackPolicy(HoldbackPolicy.DEFER_TO_LATER_YEARS)
            .run();

    ConceptToProcessLinker linker = new ConceptToProcessLinker();
    ProcessSystem process =
        linker.generateProcessSystem(concept, FidelityLevel.CONCEPT);
    process.run();
    double powerMW = linker.getTotalPowerMW(process);

    SystemInterface baseFluid = new SystemSrkEos(358.15, 250.0);
    baseFluid.addComponent("methane", 0.85);
    baseFluid.addComponent("ethane", 0.08);
    baseFluid.addComponent("propane", 0.04);
    baseFluid.addComponent("n-butane", 0.02);
    baseFluid.addComponent("CO2", 0.01);
    baseFluid.setMixingRule("classic");

    ReservoirCouplingExporter exporter =
        new ReservoirCouplingExporter(process);
    exporter.setFormat(ExportFormat.ECLIPSE_100);
    exporter.setPressureRange(40.0, 60.0, 2);
    exporter.setRateRange(500.0, 1000.0, 2);
    exporter.setWctRange(0.0, 0.5, 2);
    exporter.setGorRange(100.0, 300.0, 2);
    VfpTable vfp = exporter.generateVfpProd("PROD-A1", baseFluid, 1);
    String eclipseKeywords = exporter.getEclipseKeywords();

    Path output = Files.createTempFile("neqsim-vfp-", ".inc");
    try {
      exporter.exportToFile(output.toString());

      SubseaCostEstimator cost =
          new SubseaCostEstimator(SubseaCostEstimator.Region.NORWAY);
      cost.calculateTreeCost(10000.0, 7.0, 380.0, true, false);
      double treeCostUSD = cost.getTotalCost();
      cost.calculateManifoldCost(6, 80.0, 380.0, true);
      double manifoldCostUSD = cost.getTotalCost();
      cost.calculateUmbilicalCost(48.0, 4, 3, 2, 380.0, false);
      double umbilicalCostUSD = cost.getTotalCost();
      cost.calculateFlexiblePipeCost(1200.0, 8.0, 380.0, true, true);
      double riserCostUSD = cost.getTotalCost();

      if (kpis.getTotalCapexMUSD() <= 0.0
          || tieback.getFacilityConfig() == null
          || fpso.getFacilityConfig() == null
          || ranking.getRankedOptions().isEmpty()
          || !capacity.hasHoldback()
          || process.size() < 2
          || powerMW < 0.0
          || vfp.getBhpValues()[0][0][0][0][0]
              <= vfp.getThpValues()[0]
          || !eclipseKeywords.contains("VFPPROD")
          || Files.size(output) == 0L
          || treeCostUSD <= 0.0
          || manifoldCostUSD <= 0.0
          || umbilicalCostUSD <= 0.0
          || riserCostUSD <= 0.0) {
        throw new IllegalStateException(
            "Field-development screening validation failed");
      }

      logger.info(
          "Concept {}: CAPEX {} MUSD, field life {} years, "
              + "recovery {}%, CO2 intensity {} kg/boe",
          concept.getName(),
          kpis.getTotalCapexMUSD(),
          kpis.getFieldLifeYears(),
          kpis.getEstimatedRecoveryPercent(),
          kpis.getCo2IntensityKgPerBoe());
      logger.info(
          "Recommended option {}, held-back gas {} MSm3, "
              + "process power {} MW, VFP file {}",
          ranking.getBestOption().getName(),
          capacity.getTotalHeldBackGasMSm3(),
          powerMW,
          output);
      logger.info(
          "Screening costs (USD): tree {}, manifold {}, "
              + "umbilical {}, flexible riser {}",
          treeCostUSD,
          manifoldCostUSD,
          umbilicalCostUSD,
          riserCostUSD);
    } finally {
      Files.deleteIfExists(output);
    }
  }
}

Expected checks are qualitative rather than fixed output snapshots: positive screening CAPEX and costs, populated templates and ranking, detected host holdback, a runnable generated process, a VFP bottom-hole pressure above tubing-head pressure, and a non-empty Eclipse keyword file. Results depend on the assumptions and should be reported with their units and screening limitations.


SURF Equipment Classes

NeqSim provides screening and mechanical-design helpers for SURF (Subsea, Umbilical, Riser, Flowline) equipment in neqsim.process.equipment.subsea:

Class Description
SubseaTree Christmas tree for well control (horizontal/vertical)
SubseaManifold Production/test/injection routing with well slots
PLET Pipeline End Termination structures
PLEM Pipeline End Manifold with multiple connections
SubseaJumper Rigid or flexible inter-equipment connections
Umbilical Control, power, and chemical injection lines
FlexiblePipe Dynamic risers and static flowlines
SubseaBooster Multiphase pumps and wet gas compressors

Depending on the equipment type, the mechanical-design helper can provide:

See SURF Subsea Equipment Guide for detailed documentation.


Topic Document
Integrated Field Lifecycle Simulation FIELD_LIFECYCLE_SIMULATION.md — detailed wells/SURF/process lifetime, multi-host area routing, product specifications, bottlenecks, NPV and break-even
SURF Subsea Equipment SURF_SUBSEA_EQUIPMENT.md
Late-Life Operations LATE_LIFE_OPERATIONS.md
Field Development Strategy FIELD_DEVELOPMENT_STRATEGY.md
Integrated Framework INTEGRATED_FIELD_DEVELOPMENT_FRAMEWORK.md
Decision Engine Workflows DECISION_ENGINE_WORKFLOWS.md
Multi-Scenario Production Optimization MULTI_SCENARIO_PRODUCTION_OPTIMIZATION.md

Executable Notebook Examples

The following developer notebooks import NeqSim Java classes from the workspace through devtools/neqsim_dev_setup.py, making them suitable for unreleased field-development APIs:

Notebook Description
field_development_decision_engine.ipynb Standardized concept templates, lifecycle emissions, MCDA ranking, portfolio optimization, and report-ready tables
field_development_process_reservoir_coupling.ipynb Tieback route networks, multi-well gathering allocation, concept-to-process linking, and VFP/schedule export

See Also


AI Agent & Skills

Use @field.development in VS Code Copilot Chat for AI-assisted field development workflows. This agent automatically loads the following skills:

Skill Scope
neqsim-field-development Lifecycle workflows, concept selection, reservoir/well/facility APIs
neqsim-field-economics NPV, IRR, cash flow, tax regimes (Norwegian NCS, UK), cost estimation
neqsim-subsea-and-wells Subsea systems, casing design (API 5C3), SURF costs, tieback analysis
neqsim-production-optimization Decline curves, bottleneck analysis, gas lift, IOR/EOR screening

See AI Agents Reference for the full catalog.