neqsim-field-development
Skill167 starsChanged 7 months agoApache-2.0View on GitHub
Field development workflows, concept selection, and integrated project evaluation using NeqSim. USE WHEN: performing field development studies, concept screening, tieback analysis, production forecasting, or integrated field planning. Covers the full lifecycle from discovery through operations with NeqSim's field development classes.
In this repository140 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- analyze-convergenceSkill
- analyze-gibbs-convergenceSkill
- book-creationSkill
- design-flash-benchmarkSkill
- design-reactor-benchmarkSkill
- figure-discussionSkill
- generate-publication-figuresSkill
- journal-formattingSkill
- neqsim-acid-gas-treatingSkill
- neqsim-advanced-control-mpc-and-virtual-sensingSkill
- neqsim-agent-handoffSkill
- neqsim-agentic-process-optimizationSkill
- neqsim-api-patternsSkill
- neqsim-autonomous-investigationSkill
- neqsim-capability-mapSkill
- neqsim-capacity-and-utilization-analysisSkill
- neqsim-capacity-increase-screeningSkill
- neqsim-ccs-hydrogenSkill
- neqsim-code-healthSkill
- neqsim-code-hygieneSkill
- neqsim-code-reviewSkill
- neqsim-column-internals-and-rate-basedSkill
- neqsim-compressor-antisurge-recycleSkill
- neqsim-consequence-analysisSkill
- neqsim-continuous-task-improvementSkill
- neqsim-controllability-operabilitySkill
- neqsim-cooling-waterSkill
- neqsim-cpa-water-boundariesSkill
- neqsim-depressurization-mdmtSkill
- neqsim-distillation-designSkill
- neqsim-document-intelligence-extractionSkill
- neqsim-dynamic-equipment-implementationSkill
- neqsim-dynamic-simulationSkill
- neqsim-electrolyte-systemsSkill
- neqsim-emulsion-separationSkill
- neqsim-energy-systems-and-electrificationSkill
- neqsim-engineering-design-packageSkill
- neqsim-eos-regressionSkill
- neqsim-equipment-cost-estimationSkill
- neqsim-exploration-strategy-selectionSkill
- neqsim-field-economicsSkill
- neqsim-firewater-deluge-designSkill
- neqsim-flow-accelerated-corrosionSkill
- neqsim-flow-assuranceSkill
- neqsim-flow-assurance-study-reportSkill
- neqsim-forward-separator-trainSkill
- neqsim-future-operation-studySkill
- neqsim-hazid-fmea-eta-ftaSkill
- neqsim-heat-integrationSkill
- neqsim-hydrogen-productionSkill
- neqsim-input-validationSkill
- neqsim-integrated-production-and-lifecycleSkill
- neqsim-in-writingSkill
- neqsim-java8-rulesSkill
- neqsim-jurisdiction-regulatory-basisSkill
- neqsim-literature-searchSkill
- neqsim-lng-liquefactionSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. About 0 are common, 8 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 143
Use process.fielddevelopment.lifecycle after rapid screening when reservoir pressure, well/SURF hydraulics, processing capacity, gas …
- Very specific: line 158
Use FacilityLifecycleStrategy.greenfield(...) to auto-size a new detailed processing facility from design cases.
- Very specific: line 166
Use AreaDevelopmentPortfolio when one discovery can be routed to several independently modeled producing assets or to a new facility.
- Very specific: line 181
Use FacilityModificationPlanner.analyse(result, targetUtilization) to create traceable screening candidates from annual requested …
- Very specific: line 422
When the host already has a benchmarked NeqSim ProcessModel, assess the tie-in on a reproducible copy of that model:
- Distinctive: line 428
Use the tie-in fluid's own composition and PVT evidence with compatible EOS, mixing rules and component definitions.
- Distinctive: line 437
Run plateau, mid-life and late-life points over the relevant benchmark windows.
- Distinctive: line 444
Use the coupled reservoir inflow and tubing/flowline outflow response to determine feasible rates as reservoir pressure, water cut, GOR, …
- Distinctive: line 452
If a VFP table causes convergence trouble, inspect interpolation, operating branches and control switching.
- Distinctive: line 509
Always confirm with source which convention each class uses
- Distinctive: line 514
Always specify units explicitly
- Very specific: line 530
Always use CashFlowEngine with the correct country code
- Distinctive: line 543
Keep required regression inputs, compact independent references and reproduction scripts in Git.
- Distinctive: line 547
Do not re-add its archived run outputs during campaign continuation.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
NeqSim Field Development Skill
Comprehensive reference for oil & gas field development using NeqSim's field development framework. Covers the full lifecycle from discovery through decommissioning, with emphasis on concept selection, production forecasting, economics, and risk assessment.
Field Development Lifecycle (Decision Gates)
| Phase | Decision Gate | Fidelity | Accuracy | NeqSim Focus |
| Discovery | — | SCREENING | ±50% | Volumetrics, PVT lab, analogs |
| Feasibility | DG1 | SCREENING | ±50% | Flow assurance screening, cost correlations, Arps decline |
| Concept Select | DG2 | CONCEPTUAL | ±30% | EOS tuning, IPR/VLP, process simulation, concept ranking |
| FEED | DG3/DG4 | DETAILED | ±20% | Full process model, reservoir coupling, Monte Carlo NPV |
| Operations | — | DETAILED | ±10% | History matching, debottlenecking, optimization |
| Late Life | — | DETAILED | ±20% | IOR/EOR, recompletion, decommissioning cost |
Gate Packages: Verdict Versus Full Deliverable Set
- A gate verdict is not a gate package. A readiness verdict (ready/review/not_ready) answers "can we go to the gate". A full package answers "here is every product the gate requires, with an owner and a status". When the user asks to "deliver according to DG1" (or any gate), build a product register: one row per required product, a status from a fixed taxonomy (Evidenced / Partly evidenced / Draft for review / Owner action / Not applicable - confirm), the evidence path and the owning role. Never label the result as gate approval; the readiness label stays at most "ready for owner review".
- Build a concept long list before capacity sizing. Development concepts (FPSO, tie-back, subsea-to-shore, phased, joint development) are different from capacity variants of one concept (e.g. 100/150/180 kbbl/d). Screen the long list first, record why concepts are dropped, then size the kept concepts. Capacity variants alone do not satisfy a concept-screening product.
- StudyClass is not an AACE class or gate status. A screening study class (A/B/C) says how deep the work went; the cost estimate carries its own AACE class (5 to 1); the gate carries its own readiness. Report all three separately.
- Placeholder sources stay placeholders. Fiscal, tariff or price inputs marked as examples must be labelled as such in the package and listed as owner actions.
- Company gate product lists and governance live in enterprise skills (for Equinor:
enterprise-field-development-decision-gate,gate_package.py); keep them out of this repo.
Workflow Orchestration
FieldDevelopmentWorkflow workflow = new FieldDevelopmentWorkflow("Field Name");
workflow.setStudyPhase(StudyPhase.FEASIBILITY);
workflow.setFidelityLevel(FidelityLevel.SCREENING);
// Set reservoir
ReservoirInput reservoir = new ReservoirInput();
reservoir.setFluidType("gas_condensate");
reservoir.setGIIP(1.5e9); // Sm3
reservoir.setReservoirPressure(350.0); // bara
reservoir.setReservoirTemperature(95.0); // °C
reservoir.setRecoveryFactor(0.65);
workflow.setReservoirInput(reservoir);
// Set wells
WellsInput wells = new WellsInput();
wells.setNumberOfProducers(4);
wells.setWaterDepth(350.0);
wells.setTotalDepth(3800.0);
workflow.setWellsInput(wells);
// Set infrastructure
InfrastructureInput infra = new InfrastructureInput();
infra.setDevelopmentType("subsea_tieback");
infra.setTiebackDistance(25.0); // km
workflow.setInfrastructureInput(infra);
// Run
WorkflowResult result = workflow.run();Key Result Classes
| Class | Key Fields |
WorkflowResult | npvMUSD, irrPercent, paybackYears, totalCapexMUSD, totalOpexMUSD, totalPowerMW, co2IntensityKgPerBoe |
ConceptKPIs | Same as WorkflowResult + concept-level metrics |
CashFlowResult | Year-by-year revenue, opex, capex, tax, net_cash_flow, cumulative_dcf |
Concept Selection (Multi-Concept Comparison)
Define Concepts
// Concept 1: Subsea tieback to existing platform
FieldConcept tieback = new FieldConcept("Subsea Tieback");
tieback.setReservoirInput(reservoir);
tieback.setWellsInput(wells);
InfrastructureInput tiebackInfra = new InfrastructureInput();
tiebackInfra.setDevelopmentType("subsea_tieback");
tiebackInfra.setTiebackDistance(25.0);
tiebackInfra.setHostCapacity(50000.0); // boe/d
tieback.setInfrastructureInput(tiebackInfra);
// Concept 2: Standalone FPSO
FieldConcept fpso = new FieldConcept("Standalone FPSO");
fpso.setReservoirInput(reservoir);
fpso.setWellsInput(wells);
InfrastructureInput fpsoInfra = new InfrastructureInput();
fpsoInfra.setDevelopmentType("fpso");
fpso.setInfrastructureInput(fpsoInfra);
// Concept 3: Fixed platform
FieldConcept platform = new FieldConcept("Fixed Platform");
// ... configure ...Batch Evaluation
BatchConceptRunner runner = new BatchConceptRunner();
runner.addConcept(tieback);
runner.addConcept(fpso);
runner.addConcept(platform);
runner.setFluid(tunedEosFluid);
runner.setOilPrice(70.0); // USD/bbl
runner.setGasPrice(0.30); // USD/Sm3
runner.setDiscountRate(0.08);
List<ConceptKPIs> results = runner.runAll();
// Rank by NPV
DevelopmentOptionRanker ranker = new DevelopmentOptionRanker();
for (ConceptKPIs kpi : results) {
ranker.addOption(kpi);
}
List<ConceptKPIs> ranked = ranker.rankByNPV();Physically Coupled Lifetime Comparison
Use process.fielddevelopment.lifecycle after rapid screening when reservoir pressure, well/SURF hydraulics,
processing capacity, gas injection and economics must share one time-dependent state:
FieldLifecycleEvaluator evaluator = new FieldLifecycleEvaluator();
List<FieldLifecycleResult> ranked = evaluator.evaluateAll(
NorwegianOilFieldCase.createDevelopmentPortfolio());FieldLifecycleModel accepts a user-built ProcessSystem or a complete multi-area ProcessModel, so screening
concepts can be refined without replacing the lifecycle/economic interface. Use
existingSurfAndFacility(...) when the new field enters a shared existing SURF area before a host facility; wire the
areas with shared streams and map host feeds at their actual subsea or topsides entry points. Whole-model execution,
power, sizing and area::equipment bottlenecks then include both SURF and processing. Each concept must own an
independent mutable reservoir/process model.
Use FacilityLifecycleStrategy.greenfield(...) to auto-size a new detailed processing facility from design cases. Use
FacilityLifecycleStrategy.tieback(...) with the existing HostFacility, ProductionProfileSeries,
CapacityAllocationPolicy, and HoldbackPolicy types for a producing-host tieback. Connect the model's optional host
oil/gas/water feeds to the real shared process so annual FieldLifecycleResult records host load, admitted satellite
rate, deliberate holdback, capacity-deferred oil, operating and requested utilization, and their primary bottlenecks.
Set FieldLifecycleModel.setProductionPotentialProvider(...) when a detailed NeqSim well/network model or imported
reservoir schedule should replace the reference aggregate PI/water-cut potential calculation.
Use AreaDevelopmentPortfolio when one discovery can be routed to several independently modeled producing assets or
to a new facility. Add one AreaDevelopmentOption per host/tieback route or greenfield alternative, then use
AreaDevelopmentEvaluator to compare route identity, NPV, break-even, recovery, deferment, utilization, bottlenecks
and specification compliance. Each option must own its reservoir, SURF and mutable process state.
Attach FieldProductSpecifications to each configuration to check live export-gas CO2/H2S/O2, ISO 6976 GCV/Wobbe,
dew points, stabilized-oil RVP/BS&W and treated-water oil-in-water. The built-in evaluator uses NeqSim stream
analysers and standards; connect
FieldProductQualityProvider where a real facility has a dedicated water-treatment or online-analyser model. Choose
REPORT_ONLY for diagnostics or REJECT_OPTION to exclude non-compliant options from the area recommendation.
For brownfield studies, preserve actual equipment limits (autoSizeDetailedProcess(false)). For greenfield studies,
run the process at the simultaneous design case, auto-size equipment with the selected design margin, and use explicit
oil/gas/water/liquid nameplates for non-coincident component peak cases. Put any debottleneck capacity change in
capacityFromYear(...) and its CAPEX in FieldLifecycleConfiguration.
Use FacilityModificationPlanner.analyse(result, targetUtilization) to create traceable screening candidates from
annual requested utilization and deferred oil. Implement, size and cost each candidate in a cloned detailed process
before comparing its rerun lifecycle; the planner's multiplier is not a substitute for that engineering model.
See docs/fielddevelopment/FIELD_LIFECYCLE_SIMULATION.md for the connection points and fidelity boundaries.
Reservoir & Well Modeling
Material Balance (SimpleReservoir)
SimpleReservoir reservoir = new SimpleReservoir("Main Reservoir");
reservoir.setReservoirFluid(fluid.clone(), giipSm3, reservoirThickness, reservoirArea);
reservoir.addOilProducer("P1");
reservoir.addWaterInjector("I1");
// Depletion with time steps
for (int year = 0; year < 20; year++) {
reservoir.setProductionRate(annualRate[year]);
reservoir.run();
pressureProfile[year] = reservoir.getReservoirPressure();
}Inverse Material Balance / Reserves Surveillance
Regress OGIP/OOIP, drive mechanism and aquifer support directly from a measured
pressure-vs-cumulative-production history (the "inverse" of the forward
SimpleReservoir model). Package
neqsim.pvtsimulation.reservoirproperties.materialbalance:
import neqsim.pvtsimulation.reservoirproperties.materialbalance.GasMaterialBalance;
import neqsim.pvtsimulation.reservoirproperties.materialbalance.OilMaterialBalance;
import neqsim.pvtsimulation.reservoirproperties.materialbalance.VanEverdingenHurstAquifer;
// Gas: P/Z straight line → OGIP (+ Cole plot aquifer diagnostic)
GasMaterialBalance.Result g = GasMaterialBalance.fitVolumetric(pressure, z, gp);
double ogip = g.getOgip();
// Oil: Havlena-Odeh depletion / gas-cap / water drive + Pirson drive indices
OilMaterialBalance.Result o = OilMaterialBalance.fitGasCapDrive(f, eo, eg);
// Aquifer: Van Everdingen-Hurst / Carter-Tracy cumulative influx + ECLIPSE AQUTAB
double u = VanEverdingenHurstAquifer.aquiferConstant(phi, ct, h, re, angleDeg);
double[] we = VanEverdingenHurstAquifer.cumulativeInfluxCarterTracy(tD, deltaP, u, reD);See the neqsim-production-optimization skill for the full surveillance workflow.
For radial input conversion, use inner reservoir radius in metres. Compressibility
is 1/Pa for dimensionlessTime and 1/bar for aquiferConstant: ctBar=1e5*ctPa.
Physical zeros are distinct from invalid inputs or an unrepresentable positive
conversion; do not turn a conversion exception into a zero-support scenario.
For radial support, the infinite-acting pressure/analytic derivative use a
qualified mathematical spectral kernel. The finite-radius maximum-policy option
remains an unqualified transient approximation, despite sharing the improved
infinite branch. Preserve its explicit zero-time/finite-radius limitations in
docs/pvtsimulation/reservoir_material_balance.md#aquifer-influx; do not use it
as independently validated bounded radial support or equate it with segregated
Fetkovich coupling. Carter–Tracy timestep convergence does not remove its intrinsic
approximation error. Mathematical references are not measured field acceptance. The current
infinite-radial/initialization65/ fixture records initialization-only identity,
concurrent first fallback and cold/warm/deferred runtime tradeoffs. Its parent
optimization64/ retains the positive-tail correction and complete numerical
boundary controls. The current scaling66/ receipt qualifies normalized CT
arithmetic across scales, analytic step/ramp limits, signed cumulative projection
and explicit invalid/unrepresentable histories. Its bounded numerical controls
do not admit finite-annulus physics. Preserve all historical receipts at their
exact revisions; current CT values are checked against original independent
criteria rather than claimed bit-identical to the earlier recurrence evaluation.
Injection Strategy (Voidage Replacement)
InjectionStrategy strategy = InjectionStrategy.waterInjection(1.0); // VRR = 1.0
InjectionResult injection = strategy.calculateInjection(
reservoir, oilRate, gasRate, waterRate
);
double requiredInjection = injection.waterInjectionRate; // Sm3/dWell Performance (IPR/VLP Nodal Analysis)
WellSystem well = new WellSystem("Producer-1", reservoirStream);
well.setIPRModel(WellSystem.IPRModel.VOGEL);
well.setVogelParameters(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");Production Network
NetworkSolver network = new NetworkSolver("Gathering System");
network.addWell(well1, 3.0); // 3 km flowline
network.addWell(well2, 5.5); // 5.5 km flowline
network.setSolutionMode(SolutionMode.FIXED_MANIFOLD_PRESSURE);
network.setManifoldPressure(60.0);
NetworkResult result = network.solve();Production Forecasting
Decline Curves (Arps)
ProductionProfile profile = new ProductionProfile();
profile.setDeclineModel(ProductionProfile.DeclineModel.EXPONENTIAL);
profile.setPeakRate(25000.0); // boe/d
profile.setDeclineRate(0.15); // 15% per year
profile.setPlateauDuration(3); // years
profile.setProjectLife(25); // years
double[] annualRates = profile.generateProfile();Decline-Curve History Matching (Arps + Duong)
Fit decline parameters to a measured rate-time history and estimate EUR with
neqsim.pvtsimulation.util.DeclineCurveAnalysis (static, unit-agnostic):
import neqsim.pvtsimulation.util.DeclineCurveAnalysis;
Map<String, Double> arps = DeclineCurveAnalysis.fitArps(t, q); // qi, di, b, rSquared
double eur = DeclineCurveAnalysis.eurFromFit(arps, qEconLimit);
Map<String, Double> duong = DeclineCurveAnalysis.fitDuong(t, q); // q1, a, m for tight/shale wellsProduction Scheduling
FieldProductionScheduler scheduler = new FieldProductionScheduler();
scheduler.setNumberOfWells(6);
scheduler.setDrillingInterval(6); // months between wells
scheduler.setFirstOil(2027);
scheduler.setWellProductivity(5000.0); // boe/d/well
scheduler.setDeclineRate(0.12);
scheduler.setFacilityCapacity(28000.0); // boe/d plateau constraint
double[][] schedule = scheduler.generateSchedule(25);Well Scheduling
WellScheduler wellScheduler = new WellScheduler();
wellScheduler.setDrillingDaysPerWell(45);
wellScheduler.setCompletionDaysPerWell(25);
wellScheduler.setMobDemobDays(30);
wellScheduler.setRigs(1);
wellScheduler.setWells(6);
wellScheduler.setStartDate(2026, 1);
List<WellSchedule> schedule = wellScheduler.generate();Facility Design Integration
Building a Process System from Concept
FacilityBuilder builder = new FacilityBuilder();
FacilityConfig config = new FacilityConfig();
config.setInletPressure(85.0); // bara
config.setExportPressure(150.0); // bara
config.setDesignRate(50000.0); // boe/d
// Add processing blocks
config.addBlock(BlockType.INLET_SEPARATION, new BlockConfig()
.set("stages", 2)
.set("hp_pressure", 70.0)
.set("lp_pressure", 5.0));
config.addBlock(BlockType.GAS_COMPRESSION, new BlockConfig()
.set("stages", 3)
.set("export_pressure", 150.0));
config.addBlock(BlockType.DEHYDRATION, new BlockConfig()
.set("type", "TEG"));
ProcessSystem process = builder.build(config, fluid);
process.run();Bottleneck Analysis
BottleneckAnalyzer analyzer = new BottleneckAnalyzer(process);
analyzer.setReservoirDecline(reservoir);
analyzer.setRateRange(10000, 60000, 5000); // min, max, step (boe/d)
Map<String, Double> bottlenecks = analyzer.findBottlenecks();Subsea Production Systems
Tieback Analysis
TiebackAnalyzer analyzer = new TiebackAnalyzer();
// Define host
HostFacility host = new HostFacility("Platform A");
host.setAvailableCapacity(30000.0); // boe/d
host.setProcessingPressure(70.0); // bara
// Define tieback options
TiebackOption opt1 = new TiebackOption("Direct Tieback");
opt1.setFlowlineLength(15.0); // km
opt1.setFlowlineDiameter(10.0); // inches
opt1.setWaterDepth(350.0); // m
TiebackOption opt2 = new TiebackOption("Via Manifold");
opt2.setFlowlineLength(25.0);
opt2.setFlowlineDiameter(12.0);
opt2.setWaterDepth(450.0);
opt2.setHasManifold(true);
opt2.setHasBooster(true);
analyzer.setHost(host);
analyzer.addOption(opt1);
analyzer.addOption(opt2);
analyzer.setFluid(reservoirFluid);
TiebackReport report = analyzer.analyze();Host impact of a tie-in on a benchmarked host model
When the host already has a benchmarked NeqSim ProcessModel, assess the tie-in on a
reproducible copy of that model:
- Record the baseline model version, operating window and constraint basis. If the host package and workspace require incompatible NeqSim JARs, use separate Python processes with explicit classpaths and exchange inputs/results; do not mix those JARs in one JVM.
- Use the tie-in fluid's own composition and PVT evidence with compatible EOS, mixing rules and component definitions. If only host-fluid data are available, label that fluid as a surrogate and quantify the sensitivity. Recombine oil, gas, water and lift gas on a molar basis; document standard-volume reference conditions, GOR and water-cut definitions, and verify them by flashing the reconstructed fluid. Initialize compositions before reading mole fractions.
- Connect the additional
Streamto the intended inletMixerusing the host model's supported extension point. Include each external feed exactly once in total and component balances and check the energy balance. An unaccounted feed requires a boundary-accounting correction, not a change that hides a residual. Preserve the baseline for comparison. - Run plateau, mid-life and late-life points over the relevant benchmark windows. Report both absolute and incremental compressor power, separator utilisation, export oil and produced water against documented limits. Identify constraints already exceeded in the baseline separately from those introduced by the tie-in; do not assume a universal utilisation threshold.
Evaluate tubing and line back-pressure during depletion
Use the coupled reservoir inflow and tubing/flowline outflow response to determine feasible rates as reservoir pressure, water cut, GOR, gas lift and host pressure change. Bubble point alone does not define a minimum flowing bottom-hole pressure or a recovery ceiling. Establish flow/no-flow conditions from the available reservoir pressure and the required pressure at the same datum.
Reuse the current VFP generation and import/export APIs (see MultiScenarioVFPGenerator and
neqsim-subsea-and-wells), checking units, datum depth, axis definitions, feasible points and the
reservoir simulator's table format. Compare gas-lift and injection scenarios on the same basis.
If a VFP table causes convergence trouble, inspect interpolation, operating branches and control
switching. Do not force BHP versus rate to be monotonic just to obtain convergence. The
OPM VFP consistency guidance
discusses crossing curves at adjacent tubing-head pressures, a different check from monotonicity
with rate. Preserve the original table and validate any justified conditioning against the
hydraulic model before using it for recovery or economic conclusions.
Subsea System Configuration
SubseaProductionSystem subsea = new SubseaProductionSystem("Subsea System");
subsea.setNumberOfWells(4);
subsea.setWaterDepth(350.0);
subsea.setFlowlineLength(25.0);
subsea.setUmbilicalLength(27.0);
subsea.setRiserType("flexible");
subsea.setTreeType("vertical");
subsea.setHasManifold(true);
subsea.setManifoldWells(4);Key NeqSim Classes for Field Development
| Package | Class | Purpose |
process.fielddevelopment.workflow | FieldDevelopmentWorkflow | Master orchestrator |
process.fielddevelopment.concept | FieldConcept, ReservoirInput, WellsInput, InfrastructureInput | Concept definition |
process.fielddevelopment.evaluation | ConceptEvaluator, BatchConceptRunner, DevelopmentOptionRanker | Concept comparison |
process.fielddevelopment.evaluation | BottleneckAnalyzer, MonteCarloRunner, ScenarioAnalyzer | Analysis tools |
process.fielddevelopment.screening | FlowAssuranceScreener, SafetyScreener, EconomicsEstimator, EmissionsTracker | Screening |
process.fielddevelopment.economics | CashFlowEngine, NorwegianTaxModel, SensitivityAnalyzer | Economics |
process.fielddevelopment.facility | FacilityBuilder, FacilityConfig, ConceptToProcessLinker | Process facility |
process.fielddevelopment.tieback | TiebackAnalyzer, TiebackOption, HostFacility | Tieback screening |
process.fielddevelopment.subsea | SubseaProductionSystem | Subsea systems |
process.fielddevelopment.network | NetworkSolver, NetworkResult | Production network |
process.fielddevelopment.reservoir | InjectionStrategy, TransientWellModel | Reservoir support |
process.equipment.reservoir | SimpleReservoir, WellFlow, WellSystem, TubingPerformance | Reservoir/well equipment |
process.equipment.subsea | SubseaWell, SubseaManifold, SimpleFlowLine, etc. | Subsea equipment |
process.util.fielddevelopment | ProductionProfile, WellScheduler, FacilityCapacity, DCFCalculator | Utilities |
process.mechanicaldesign.subsea | WellMechanicalDesign, SURFCostEstimator | Well & SURF cost |
Common Patterns & Pitfalls
Always Verify API Before Use
NeqSim's field development classes are under active development. Before using any class, search the source to confirm:
- The class exists and compiles
- Constructor signatures match expected parameters
- Methods have the expected return types
Temperature Units
ReservoirInput.setReservoirTemperature()— Celsius (field development classes)SystemSrkEos(T, P)constructor — Kelvin- Always confirm with source which convention each class uses
Production Rate Units
- NeqSim process equipment:
setFlowRate(value, "kg/hr")or"Sm3/hr" - Field development classes: typically boe/d or Sm3/d
- Always specify units explicitly
EOS Selection for Field Development
| Fluid Type | EOS | Mixing Rule | Notes |
| Dry gas | SystemSrkEos | "classic" | Simplest, fastest |
| Gas condensate | SystemSrkEos or SystemPrEos | "classic" | PR better for liquid densities |
| Black oil | SystemPrEos | "classic" | Need C7+ characterization |
| Oil + water + MEG | SystemSrkCPAstatoil | 10 | CPA for polar systems |
| CO2-rich (CCS) | SystemSrkCPAstatoil | 10 | CPA for CO2-water |
| HP/HT reservoir | SystemPrEos or SystemSrkEos | "classic" | Validate against PVT data |
Fiscal Regime
- Norwegian NCS: 22% corporate + 56% special petroleum tax = 78% marginal rate
- UK UKCS: 30% ring-fence CT + 10% supplementary charge = 40% marginal rate
- Generic: Configurable via
GenericTaxModel - Always use
CashFlowEnginewith the correct country code
Staged-option VPbo / DG1 screening for an unappraised HPHT discovery (lessons from Afrodite PL293)
- Value the decision as a staged option (stop / commit now / mature to DG2 then develop only if positive); an at-break-even project (NPV about 0 at P50) still has positive EMV when maturation is cheap, so state EMV of maturing, not just P50 NPV.
- Host life is a cost, not a constraint: price the years the profile outlives the host plan (host-alive cost, PV) and report a COP-shift curve; ullage rarely discriminates, host life and cost do.
- Reservoir-model need is a value-of-information question: EVPI on volume vs EVSI of a sidetrack vs its net cost, with the well-count rule (about 45 % of volume over a 4-year plateau).
- Cluster upside: report the share of nearby discovered gas that must be tied in for NPV > 0, not a single NPV.
- Report break-even gas price from the model by bisection, never a rounded literal; keep literals out of narrative strings (derive them from the results dict).
- HPHT dew point: do not trust
dewPointPressureFlash(wrong root at 168 C); use a TP-flash bisection and CCE dropout.TiebackAnalyzerrejects shallow hosts through its water-depth gate; screen those hosts with the explicit pipe model.
Qualification output retention
Keep required regression inputs, compact independent references and reproduction scripts in Git. Store bulky generated qualification histories and repeated before/after matrices outside the checkout, preserving full outputs, hashes and public provenance. The radial fixture README documents restoration for PR #4924. Do not re-add its archived run outputs during campaign continuation.
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
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.

