Subsea SURF Equipment - NeqSim Documentation
Overview
NeqSim provides comprehensive support for modeling Subsea, Umbilicals, Risers, and Flowlines (SURF) equipment used in offshore oil and gas field development. The subsea equipment package (neqsim.process.equipment.subsea) includes classes for all major components of a subsea production system.
Equipment Classes
1. PLET (Pipeline End Termination)
Pipeline End Terminations are structures that terminate pipelines and provide connection points for tie-ins.
PLET plet = new PLET("Export PLET", pipelineStream);
plet.setConnectionType(PLET.ConnectionType.VERTICAL_HUB);
plet.setStructureType(PLET.StructureType.GRAVITY_BASE);
plet.setWaterDepth(350.0);
plet.setDesignPressure(200.0);
plet.setHubSizeInches(10.0);
plet.setMaterialGrade("X65");
plet.setHasPiggingFacility(true);
plet.run();
Connection Types:
VERTICAL_HUB- Vertical connection hubHORIZONTAL_HUB- Horizontal connection hubCLAMP_CONNECTOR- Clamp connectionCOLLET_CONNECTOR- Collet connectionDIVER_FLANGE- Diver-installable flange
Structure Types:
GRAVITY_BASE- Gravity-based foundationPILED- Piled foundationSUCTION_ANCHOR- Suction anchor foundationMUDMAT- Mudmat foundation
2. PLEM (Pipeline End Manifold)
Pipeline End Manifolds are multi-slot structures for connecting multiple pipelines.
PLEM plem = new PLEM("Gathering PLEM", mainStream);
plem.setConfigurationType(PLEM.ConfigurationType.COMMINGLING);
plem.setNumberOfSlots(4);
plem.setWaterDepth(400.0);
plem.setDesignPressure(180.0);
plem.setHeaderSizeInches(16.0);
plem.run();
Configuration Types:
THROUGH_FLOW- Straight-through flowCOMMINGLING- Multiple inputs mergedDISTRIBUTION- Single input split to multiple outputsCROSSOVER- Cross-connection capability
3. SubseaManifold
Subsea manifolds gather production from multiple wells and route to export/test headers.
SubseaManifold manifold = new SubseaManifold("Field Manifold");
manifold.setManifoldType(SubseaManifold.ManifoldType.PRODUCTION_TEST);
manifold.setNumberOfWellSlots(6);
manifold.setProductionHeaderSizeInches(12.0);
manifold.setTestHeaderSizeInches(6.0);
manifold.setWaterDepth(450.0);
manifold.setDesignPressure(250.0);
// Add well streams
manifold.addWellStream(well1Stream, 1);
manifold.addWellStream(well2Stream, 2);
manifold.addWellStream(well3Stream, 3);
// Route wells
manifold.routeWellToProduction(1);
manifold.routeWellToProduction(2);
manifold.routeWellToTest(3); // Route well 3 to test
manifold.run();
// Get outputs
Stream prodStream = manifold.getProductionOutputStream();
Stream testStream = manifold.getTestOutputStream();
Manifold Types:
PRODUCTION_ONLY- Single production headerPRODUCTION_TEST- Production and test headersFULL_SERVICE- Production, test, and injectionINJECTION- Injection manifold
4. SubseaJumper
Subsea jumpers connect subsea equipment (trees, manifolds, PLETs).
SubseaJumper jumper = new SubseaJumper("Tree-Manifold Jumper", treeOutlet);
jumper.setJumperType(SubseaJumper.JumperType.RIGID_M_SHAPE);
jumper.setLength(50.0);
jumper.setNominalBoreInches(6.0);
jumper.setOuterDiameterInches(6.625);
jumper.setWallThicknessMm(12.7);
jumper.setDesignPressure(200.0);
jumper.setMaterialGrade("X65");
jumper.setNumberOfBends(3);
jumper.setMinimumBendRadius(1.5);
jumper.setInletHubType(SubseaJumper.HubType.VERTICAL);
jumper.setOutletHubType(SubseaJumper.HubType.HORIZONTAL);
jumper.run();
Jumper Types:
RIGID_M_SHAPE- Rigid M-shaped configurationRIGID_INVERTED_U- Rigid inverted U-shapeFLEXIBLE_STATIC- Static flexible jumperFLEXIBLE_DYNAMIC- Dynamic flexible jumperHYBRID- Rigid with flexible sections
5. Umbilical
Control umbilicals provide hydraulic power, chemical injection, and electrical/signal connectivity.
Umbilical umbilical = new Umbilical("Field Umbilical");
umbilical.setUmbilicalType(Umbilical.UmbilicalType.STEEL_TUBE);
umbilical.setLength(15000.0);
umbilical.setWaterDepth(450.0);
umbilical.setHasArmorWires(true);
// Add hydraulic lines
umbilical.addHydraulicLine(12.7, 517.0, "HP Supply"); // ID mm, pressure bar
umbilical.addHydraulicLine(12.7, 517.0, "HP Return");
umbilical.addHydraulicLine(9.525, 345.0, "LP Supply");
umbilical.addHydraulicLine(9.525, 345.0, "LP Return");
// Add chemical lines
umbilical.addChemicalLine(25.4, 207.0, "MEG Injection");
umbilical.addChemicalLine(19.05, 207.0, "Scale Inhibitor");
// Add electrical cables
umbilical.addElectricalCable(35.0, 6600.0, "Power"); // Area mm², voltage V
umbilical.addElectricalCable(4.0, 500.0, "Signal");
// Add fiber optics
umbilical.addFiberOptic(12, "Communication"); // Number of fibers
umbilical.run(null);
// Get element counts
int hydraulics = umbilical.getHydraulicLineCount();
int chemicals = umbilical.getChemicalLineCount();
int electrical = umbilical.getElectricalCableCount();
Umbilical Types:
STEEL_TUBE- Steel tube umbilicalTHERMOPLASTIC- Thermoplastic hose umbilicalINTEGRATED_PRODUCTION- Integrated production umbilical (IPU)
6. SubseaTree (Christmas Tree)
Subsea trees control wellhead flow and provide safety barriers.
SubseaTree tree = new SubseaTree("Well-A Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setPressureRating(SubseaTree.PressureRating.PR10000);
tree.setBoreSizeInches(5.125);
tree.setWaterDepth(400.0);
tree.setDesignPressure(690.0);
tree.setDesignTemperature(121.0);
tree.setActuatorType("Hydraulic");
tree.setFailSafeClose(true);
// Control valves
tree.setPMVOpen(true); // Production Master Valve
tree.setPWVOpen(true); // Production Wing Valve
tree.setChokePosition(75.0); // 75% open
tree.run();
// Emergency shutdown
tree.emergencyShutdown();
Tree Types:
VERTICAL- Vertical tree (conventional)HORIZONTAL- Horizontal treeDUAL_BORE- Dual bore treeMUDLINE- Mudline suspension tree
Pressure Ratings:
PR5000- 5,000 psi (345 bar)PR10000- 10,000 psi (690 bar)PR15000- 15,000 psi (1,034 bar)PR20000- 20,000 psi (1,379 bar)
7. FlexiblePipe
Flexible pipes and risers for dynamic and static applications.
FlexiblePipe riser = new FlexiblePipe("Production Riser", inletStream);
riser.setPipeType(FlexiblePipe.PipeType.UNBONDED);
riser.setApplication(FlexiblePipe.Application.DYNAMIC_RISER);
riser.setServiceType(FlexiblePipe.ServiceType.OIL_SERVICE);
riser.setRiserConfiguration(FlexiblePipe.RiserConfiguration.LAZY_WAVE);
riser.setLength(1200.0);
riser.setInnerDiameterInches(6.0);
riser.setDesignPressure(200.0);
riser.setDesignTemperature(65.0);
riser.setWaterDepth(350.0);
riser.setSourService(false);
// Layer configuration
riser.setHasCarcass(true);
riser.setHasPressureArmor(true);
riser.setTensileArmorLayers(2);
// Accessories
riser.setHasBendStiffener(true);
riser.setHasBuoyancyModules(true);
riser.run();
Pipe Types:
UNBONDED- Unbonded flexible pipe (API 17J)BONDED- Bonded flexible pipe (API 17K)
Applications:
FLOWLINE- Subsea flowlineSTATIC_RISER- Static riserDYNAMIC_RISER- Dynamic riserJUMPER- Flexible jumperEXPANSION_LOOP- Expansion loop
Riser Configurations:
FREE_HANGING- Free hanging catenaryLAZY_WAVE- Lazy wave with buoyancySTEEP_WAVE- Steep wave configurationLAZY_S- Lazy S with mid-water archSTEEP_S- Steep S configurationPLIANT_WAVE- Pliant waveCHINESE_LANTERN- Chinese lantern
8. SubseaBooster
Subsea pumps and compressors for boosting production.
// Multiphase pump
SubseaBooster mpPump = new SubseaBooster("MP Pump", inletStream);
mpPump.setBoosterType(SubseaBooster.BoosterType.MULTIPHASE_PUMP);
mpPump.setPumpType(SubseaBooster.PumpType.HELICO_AXIAL);
mpPump.setDriveType(SubseaBooster.DriveType.ELECTRIC);
mpPump.setNumberOfStages(6);
mpPump.setDesignInletPressure(50.0);
mpPump.setDifferentialPressure(30.0);
mpPump.setDesignFlowRate(500.0);
mpPump.setEfficiency(0.65);
mpPump.setWaterDepth(400.0);
// Reliability settings
mpPump.setDesignLifeYears(25);
mpPump.setMtbfHours(40000);
mpPump.setRetrievable(true);
mpPump.run();
// Wet gas compressor
SubseaBooster compressor = new SubseaBooster("WG Compressor", gasStream);
compressor.setBoosterType(SubseaBooster.BoosterType.WET_GAS_COMPRESSOR);
compressor.setCompressorType(SubseaBooster.CompressorType.CENTRIFUGAL);
compressor.setPressureRatio(2.0);
compressor.run();
Booster Types:
MULTIPHASE_PUMP- Multiphase pumpWET_GAS_COMPRESSOR- Wet gas compressorSUBSEA_SEPARATOR_PUMP- Separation system pumpINJECTION_PUMP- Water/gas injection pump
Pump Types:
HELICO_AXIAL- Helico-axial multiphase pumpTWIN_SCREW- Twin-screw positive displacementESP- Electrical submersible pumpCENTRIFUGAL- Centrifugal pump
Mechanical Design
All subsea equipment supports mechanical design calculations:
// Example with PLET
PLET plet = new PLET("Export PLET", stream);
plet.setWaterDepth(350.0);
plet.setDesignPressure(200.0);
plet.setHubSizeInches(10.0);
plet.setMaterialGrade("X65");
plet.run();
// Initialize mechanical design
plet.initMechanicalDesign();
PLETMechanicalDesign design = (PLETMechanicalDesign) plet.getMechanicalDesign();
// Set company-specific standards
design.setCompanySpecificDesignStandards("Equinor");
// Calculate design
design.readDesignSpecifications();
design.calcDesign();
// Get results
String jsonReport = design.toJson();
Map<String, Object> results = design.toMap();
double wallThickness = design.getRequiredWallThickness();
Mechanical Design Classes
Each subsea equipment type has a corresponding mechanical design class:
| Equipment | Mechanical Design Class | Key Calculations |
|---|---|---|
| PLET | PLETMechanicalDesign |
Hub wall thickness, foundation sizing, mudmat area, pile depth |
| PLEM | PLEMMechanicalDesign |
Header wall thickness, multi-slot structure, foundation |
| SubseaTree | SubseaTreeMechanicalDesign |
Bore wall thickness, connector capacity, gate valve sizing |
| SubseaManifold | SubseaManifoldMechanicalDesign |
Header sizing, valve skid, foundation requirements |
| SubseaJumper | SubseaJumperMechanicalDesign |
Wall thickness, bend radius, spool piece length |
| Umbilical | UmbilicalMechanicalDesign |
Cross-section design, armor wire sizing, tensile capacity |
| FlexiblePipe | FlexiblePipeMechanicalDesign |
Layer design, collapse resistance, fatigue life |
| SubseaBooster | SubseaBoosterMechanicalDesign |
Motor sizing, seal design, foundation requirements |
Design Standards Supported
| Standard | Description | Equipment |
|---|---|---|
| DNV-ST-F101 | Submarine Pipeline Systems | Pipelines, Jumpers, PLETs |
| DNV-ST-F201 | Dynamic Risers | Flexible Risers |
| DNV-RP-F109 | Typed, review-gated vertical and lateral on-bottom stability screening | Pipelines, cables, umbilicals |
| API Spec 17D | Subsea Wellhead and Tree Equipment | Trees |
| API RP 17A | Design of Subsea Production Systems | General |
| API RP 17B | Flexible Pipe | Flexible Pipes |
| API Spec 17J | Unbonded Flexible Pipe | Unbonded Flexible |
| API Spec 17K | Bonded Flexible Pipe | Bonded Flexible |
| API RP 17E | Umbilicals | Umbilicals |
| API RP 17G | Subsea Production Systems | Manifolds |
| API RP 17Q | Subsea Equipment Qualification | All |
| API RP 17V | Subsea Boosting | Boosters |
| ISO 13628 | Subsea Production Systems | All |
| NORSOK U-001 | Subsea Production Systems | All |
The DNV-RP-F109 entry is an implemented screening kernel rather than a conformity claim. It calculates a transparent absolute-static Morison/Coulomb/passive-resistance screen and can check displacements supplied by an externally validated generalized or dynamic response model. It does not reproduce licensed generalized-design tables or qualify environmental, hydrodynamic, or pipe-soil inputs. See DNV-RP-F109 on-bottom stability screening.
Detailed Mechanical Design Example
// PLET Mechanical Design
PLET plet = new PLET("Production PLET");
plet.setHubSizeInches(12.0);
plet.setWaterDepth(350.0);
plet.setDesignPressure(250.0);
plet.setDryWeight(25.0);
plet.setConnectionType(PLET.ConnectionType.VERTICAL_HUB);
plet.setStructureType(PLET.StructureType.GRAVITY_BASE);
plet.setHasIsolationValve(true);
plet.setHasPiggingFacilities(true);
plet.initMechanicalDesign();
PLETMechanicalDesign design = (PLETMechanicalDesign) plet.getMechanicalDesign();
design.setMaxOperationPressure(250.0);
design.setMaxOperationTemperature(80.0 + 273.15);
design.setMaterialGrade("X65");
design.setDesignStandardCode("DNV-ST-F101");
design.setCompanySpecificDesignStandards("Equinor");
// Calculate design
design.readDesignSpecifications();
design.calcDesign();
// Get design results
double hubWallThickness = design.getHubWallThickness();
double requiredMudmatArea = design.getRequiredMudmatArea();
double maxBearingPressure = design.getMaxBearingPressure();
double connectorCapacity = design.getConnectorLoadCapacity();
System.out.println("Hub Wall Thickness: " + hubWallThickness + " mm");
System.out.println("Required Mudmat Area: " + requiredMudmatArea + " m²");
System.out.println("Connector Capacity: " + connectorCapacity + " kN");
// Full JSON report
String jsonReport = design.toJson();
Foundation Design
The mechanical design classes calculate foundation requirements based on soil conditions and loading:
// Gravity base foundation
PLETMechanicalDesign design = (PLETMechanicalDesign) plet.getMechanicalDesign();
design.calcDesign();
double mudmatArea = design.getRequiredMudmatArea(); // m²
double foundationWeight = design.getRequiredFoundationWeight(); // tonnes
double bearingPressure = design.getMaxBearingPressure(); // kPa
// For piled structures
if (plet.getStructureType() == PLET.StructureType.PILED) {
double pileDepth = design.getPileDepth(); // m
int numberOfPiles = design.getNumberOfPiles();
}
// For suction anchor structures
if (plet.getStructureType() == PLET.StructureType.SUCTION_ANCHOR) {
double anchorDiameter = design.getSuctionAnchorDiameter(); // m
double anchorLength = design.getSuctionAnchorLength(); // m
}
Cost Estimation
NeqSim provides comprehensive cost estimation for all subsea SURF equipment through the SubseaCostEstimator class and integrated cost methods in each mechanical design class.
Cost Estimator Overview
The SubseaCostEstimator calculates:
- Equipment/Procurement Costs - Base equipment and material costs
- Fabrication Costs - Shop fabrication and assembly
- Installation Costs - Vessel, ROV, and labor costs
- Engineering Costs - Design engineering and project management
- Contingency - Risk-based contingency allowances
The tree body, PLET hub, and rigid-jumper screening calculations read yield strength
from MaterialProperties_Subsea.csv, rather than keeping separate copies in Java.
The legacy F22 and F22-Inconel625 hub names assume F22 Class 3 (310 MPa yield,
515 MPa tensile); F22-Class1 explicitly selects 205/415 MPa. Cladding receives no
structural strength credit. 316L uses 170/485 MPa and 316 uses 205/515 MPa;
Duplex-2205 and SuperDuplex-2507 remain distinct table grades. Unknown grades raise
an exception instead of silently using X65. These are room-temperature screening
properties; the material specification, product form, heat treatment and design-code
allowables still require project-specific verification.
PLEM headers use the bundled TechnicalRequirements_Subsea.csv PLEM floor of
19.05 mm, distinct from the 12.7 mm PLET hub floor. This is the bundled
Equinor screening requirement, not a universal minimum prescribed by DNV.
calculatePLEMCost reads the PLEM procurement, material, fabrication, engineering,
project-management and contingency columns of SubseaCostEstimation.csv. Base
procurement is USD 800,000 for up to two slots, USD 1,500,000 for three to four,
and USD 2,500,000 for five or more. Each installed branch isolation valve adds
branchSizeInches * 25000 USD; slot count no longer implies a pigging facility.
Installation still uses the common weight/depth vessel-duration model rather than
the CSV installation allowance. Header sizing, foundation screening, and structural
weight remain simplified calculations; the weight model does not yet include a
detailed wall-dependent header material takeoff. The field-level SURFCostEstimator
also uses the PLEM method. Its common per-PLEM assumptions default to four slots and
8 in branch valves, configurable with setPlemSlots and setPlemBranchSizeInches;
header diameter no longer selects the procurement band. SubseaProductionSystem
includes PLEMs in its manifold cost category so the component breakdown reconciles
exactly to the SURF total.
Regional Cost Factors
All reported monetary costs and rates use one uniform regional factor relative to
the Gulf of Mexico baseline. This includes equipment, fabrication, installation,
engineering, project management, contingency, and BOM unit costs. Vessel days,
ROV hours, quantities and estimated manhours are unchanged. A region change revalues
an existing estimate immediately, and repeated setters do not compound the factor.
The default constructor is identical to explicit NORWAY selection.
This is a coarse screening assumption; the factors are implemented in Java and are
not derived from the category-specific SubseaLaborRates.csv table:
| Region | Factor | Description |
|---|---|---|
| NORWAY | 1.35 | Norwegian Continental Shelf |
| UK | 1.25 | UK North Sea |
| GOM | 1.00 | Gulf of Mexico (baseline) |
| BRAZIL | 0.85 | Brazilian pre-salt basins |
| WEST_AFRICA | 1.10 | West African margin |
Currency Support
Cost estimates can be output in multiple currencies:
| Currency | Code | Conversion (from USD) |
|---|---|---|
| US Dollar | USD | 1.00 |
| Euro | EUR | 0.92 |
| British Pound | GBP | 0.79 |
| Norwegian Krone | NOK | 10.50 |
Basic Cost Estimation
import neqsim.process.mechanicaldesign.subsea.SubseaCostEstimator;
// Create estimator with region
SubseaCostEstimator estimator = new SubseaCostEstimator(
SubseaCostEstimator.Region.NORWAY);
// PLET cost estimation
// Parameters: dryWeightTonnes, hubSizeInches, waterDepthM, hasIsolationValve, hasPiggingFacility
estimator.calculatePLETCost(25.0, 12.0, 350.0, true, false);
// Get results
double totalCost = estimator.getTotalCost();
double equipmentCost = estimator.getEquipmentCost();
double installationCost = estimator.getInstallationCost();
double vesselDays = estimator.getVesselDays();
double totalManhours = estimator.getTotalManhours();
System.out.println("Total Cost: $" + String.format("%,.0f", totalCost));
System.out.println("Equipment: $" + String.format("%,.0f", equipmentCost));
System.out.println("Installation: $" + String.format("%,.0f", installationCost));
System.out.println("Vessel Days: " + vesselDays);
System.out.println("Total Manhours: " + totalManhours);
Cost Estimation Methods
The SubseaCostEstimator provides methods for each equipment type:
// PLET cost
estimator.calculatePLETCost(dryWeightTonnes, hubSizeInches, waterDepthM,
hasIsolationValve, hasPiggingFacility);
// PLEM cost: procurement band is selected by branch-slot count
estimator.calculatePLEMCost(dryWeightTonnes, numberOfSlots, branchSizeInches,
waterDepthM, hasBranchIsolationValves);
// Subsea Tree cost
estimator.calculateTreeCost(pressureRatingPsi, boreSizeInches, waterDepthM,
isHorizontal, isDualBore);
// Manifold cost
estimator.calculateManifoldCost(numberOfSlots, dryWeightTonnes, waterDepthM,
hasTestHeader);
// Jumper cost
estimator.calculateJumperCost(lengthM, diameterInches, isRigid, waterDepthM);
// Umbilical cost
estimator.calculateUmbilicalCost(lengthKm, numberOfHydraulicLines,
numberOfChemicalLines, numberOfElectricalCables, waterDepthM, isDynamic);
// Flexible pipe cost
estimator.calculateFlexiblePipeCost(lengthM, innerDiameterInches, waterDepthM,
isDynamic, hasBuoyancy);
// Subsea booster cost
estimator.calculateBoosterCost(powerMW, isCompressor, waterDepthM, hasRedundancy);
Integrated Cost Estimation
Each mechanical design class integrates cost estimation:
// PLET with cost estimation
PLET plet = new PLET("Production PLET");
plet.setHubSizeInches(12.0);
plet.setWaterDepth(350.0);
plet.setDryWeight(25.0);
plet.setHasIsolationValve(true);
plet.initMechanicalDesign();
PLETMechanicalDesign design = (PLETMechanicalDesign) plet.getMechanicalDesign();
design.setMaxOperationPressure(250.0);
design.setRegion(SubseaCostEstimator.Region.NORWAY);
// Calculate design and costs
design.calcDesign();
// Get costs directly from design
double totalCost = design.getTotalCostUSD();
double equipmentCost = design.getEquipmentCostUSD();
double installationCost = design.getInstallationCostUSD();
double vesselDays = design.getVesselDays();
// Get full cost breakdown
Map<String, Object> costBreakdown = design.getCostBreakdown();
// Generate bill of materials
List<Map<String, Object>> bom = design.generateBillOfMaterials();
Cost Breakdown Structure
The getCostBreakdown() method returns a comprehensive Map with:
Map<String, Object> costs = design.getCostBreakdown();
// Direct Costs
Map<String, Object> direct = (Map<String, Object>) costs.get("directCosts");
double equipmentCost = (Double) direct.get("equipmentCostUSD");
double fabricationCost = (Double) direct.get("fabricationCostUSD");
double installationCost = (Double) direct.get("installationCostUSD");
// Indirect Costs
Map<String, Object> indirect = (Map<String, Object>) costs.get("indirectCosts");
double engineeringCost = (Double) indirect.get("engineeringCostUSD");
double pmCost = (Double) indirect.get("projectManagementCostUSD");
// Installation Breakdown
Map<String, Object> install = (Map<String, Object>) costs.get("installationBreakdown");
double vesselCost = (Double) install.get("vesselCostUSD");
double vesselDays = (Double) install.get("vesselDays");
double vesselDayRate = (Double) install.get("vesselDayRateUSD");
double rovHours = (Double) install.get("rovHours");
// Labor Estimate
Map<String, Object> labor = (Map<String, Object>) costs.get("laborEstimate");
double engManhours = (Double) labor.get("engineeringManhours");
double fabManhours = (Double) labor.get("fabricationManhours");
double installManhours = (Double) labor.get("installationManhours");
double totalManhours = (Double) labor.get("totalManhours");
// Summary
double contingency = (Double) costs.get("contingencyUSD");
double totalCost = (Double) costs.get("totalCostUSD");
Bill of Materials Generation
Generate detailed BOM for procurement:
List<Map<String, Object>> bom = design.generateBillOfMaterials();
for (Map<String, Object> item : bom) {
System.out.println(item.get("item") + ": " +
item.get("quantity") + " " + item.get("unit") +
" @ $" + item.get("unitCost") + " = $" + item.get("totalCost"));
}
Example BOM output:
| Item | Material | Quantity | Unit | Unit Cost | Total Cost |
|---|---|---|---|---|---|
| Steel Structure | S355/X65 | 15.0 | tonnes | $5,000 | $75,000 |
| Piping Components | Duplex SS/CRA | 3.75 | tonnes | $15,000 | $56,250 |
| Valves and Actuators | Various | 2 | ea | $150,000 | $300,000 |
| Subsea Connectors | Forged Steel | 2 | ea | $200,000 | $400,000 |
| Foundation/Mudmat | S355 Steel Plate | 6.25 | tonnes | $4,000 | $25,000 |
| Marine Coating System | Epoxy/Polyurethane | 150 | m² | $150 | $22,500 |
| Sacrificial Anodes | Aluminum Alloy | 12 | ea | $500 | $6,000 |
Complete Cost Example - Subsea Tree
// Create and configure tree
SubseaTree tree = new SubseaTree("Well-A Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setPressureRating(SubseaTree.PressureRating.PR15000);
tree.setBoreSizeInches(7.0);
tree.setWaterDepth(500.0);
tree.setDesignPressure(1034.0);
tree.initMechanicalDesign();
SubseaTreeMechanicalDesign design =
(SubseaTreeMechanicalDesign) tree.getMechanicalDesign();
design.setMaxOperationPressure(1034.0);
design.setRegion(SubseaCostEstimator.Region.NORWAY);
design.calcDesign();
// Display costs
System.out.println("=== Subsea Tree Cost Estimate ===");
System.out.println("Total Cost: $" + String.format("%,.0f", design.getTotalCostUSD()));
System.out.println("Equipment: $" + String.format("%,.0f", design.getEquipmentCostUSD()));
System.out.println("Installation: $" + String.format("%,.0f", design.getInstallationCostUSD()));
System.out.println("Vessel Days: " + design.getVesselDays());
// Full JSON report includes design AND costs
String json = design.toJson();
Regional Cost Comparison
// Compare costs across regions
double[] regionCosts = new double[5];
SubseaCostEstimator.Region[] regions = SubseaCostEstimator.Region.values();
for (int i = 0; i < regions.length; i++) {
SubseaCostEstimator estimator = new SubseaCostEstimator(regions[i]);
estimator.calculatePLETCost(25.0, 12.0, 350.0, true, false);
regionCosts[i] = estimator.getTotalCost();
System.out.println(regions[i].name() + ": $" +
String.format("%,.0f", regionCosts[i]));
}
Example output:
NORWAY: $4,568,231
UK: $4,229,844
GOM: $3,383,875
BRAZIL: $2,876,294
WEST_AFRICA: $3,722,263
Cost Data Sources
SubseaCostEstimator currently combines hardcoded screening correlations with the
following bundled reference data in src/main/resources/designdata/. These are
engineering cost estimates, not current vendor quotations. Table availability does
not imply every estimator reads it:
| File | Description |
|---|---|
SubseaCostEstimation.csv |
PLEM method reads procurement/material/fabrication and percentage columns; other methods retain Java correlations; CSV installation allowances are not consumed |
SubseaLaborRates.csv |
Reference only; not consumed by this estimator. Uniform regional factors and baseline hourly rates are implemented in Java |
SubseaVesselRates.csv |
Reference only; not consumed by this estimator. Vessel selection, rates and durations are Java screening correlations |
JSON Cost Output
The toJson() method includes comprehensive cost data:
{
"equipmentName": "Production PLET",
"designStandard": "DNV-ST-F101",
"materialGrade": "X65",
"hubWallThickness_mm": 15.2,
"requiredMudmatArea_m2": 25.0,
"maxBearingPressure_kPa": 50.0,
"costEstimation": {
"region": "NORWAY",
"currency": "USD",
"directCosts": {
"equipmentCostUSD": 1250000,
"fabricationCostUSD": 375000,
"installationCostUSD": 980000
},
"indirectCosts": {
"engineeringCostUSD": 125000,
"projectManagementCostUSD": 62500
},
"installationBreakdown": {
"vesselCostUSD": 750000,
"vesselDays": 2.5,
"vesselDayRateUSD": 300000,
"rovHours": 30
},
"contingencyUSD": 419625,
"totalCostUSD": 3212125
},
"laborEstimate": {
"engineeringManhours": 1200,
"fabricationManhours": 2500,
"installationManhours": 800,
"totalManhours": 4500
}
}
Complete SURF System Example
// Create fluid system
SystemInterface fluid = new SystemSrkEos(323.15, 150.0);
fluid.addComponent("methane", 0.80);
fluid.addComponent("ethane", 0.10);
fluid.addComponent("propane", 0.05);
fluid.addComponent("n-heptane", 0.05);
fluid.setMixingRule("classic");
// Well stream
Stream wellStream = new Stream("Well-1", fluid);
wellStream.setFlowRate(100000, "kg/hr");
wellStream.run();
// Subsea tree
SubseaTree tree = new SubseaTree("Well-1 Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setPressureRating(SubseaTree.PressureRating.PR10000);
tree.setChokePosition(80.0);
tree.run();
// Jumper to manifold
SubseaJumper jumper = new SubseaJumper("Tree-Manifold Jumper", tree.getOutletStream());
jumper.setJumperType(SubseaJumper.JumperType.RIGID_M_SHAPE);
jumper.setLength(50.0);
jumper.run();
// Manifold
SubseaManifold manifold = new SubseaManifold("Field Manifold");
manifold.setManifoldType(SubseaManifold.ManifoldType.PRODUCTION_TEST);
manifold.setNumberOfWellSlots(4);
manifold.addWellStream(jumper.getOutletStream(), 1);
manifold.routeWellToProduction(1);
manifold.run();
// Export PLET
PLET exportPLET = new PLET("Export PLET", manifold.getProductionOutputStream());
exportPLET.setConnectionType(PLET.ConnectionType.VERTICAL_HUB);
exportPLET.run();
// Flexible riser
FlexiblePipe riser = new FlexiblePipe("Production Riser", exportPLET.getOutletStream());
riser.setPipeType(FlexiblePipe.PipeType.UNBONDED);
riser.setApplication(FlexiblePipe.Application.DYNAMIC_RISER);
riser.setRiserConfiguration(FlexiblePipe.RiserConfiguration.LAZY_WAVE);
riser.setLength(1200.0);
riser.run();
// Control umbilical
Umbilical umbilical = new Umbilical("Field Umbilical");
umbilical.setLength(15000.0);
umbilical.addHydraulicLine(12.7, 517.0, "HP Supply");
umbilical.addHydraulicLine(12.7, 517.0, "HP Return");
umbilical.addChemicalLine(25.4, 207.0, "MEG");
umbilical.run(null);
// Add all to process system
ProcessSystem process = new ProcessSystem();
process.add(wellStream);
process.add(tree);
process.add(jumper);
process.add(manifold);
process.add(exportPLET);
process.add(riser);
process.run();
JSON Output
All equipment provides JSON output for integration with other systems:
SubseaTree tree = new SubseaTree("Well-1 Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setPressureRating(SubseaTree.PressureRating.PR10000);
tree.run();
// Equipment JSON
String equipmentJson = tree.toJson();
// Mechanical design JSON
tree.initMechanicalDesign();
tree.getMechanicalDesign().calcDesign();
String designJson = tree.getMechanicalDesign().toJson();