Skip to the content.

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:

Structure Types:

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:

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:

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:

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:

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:

Pressure Ratings:

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:

Applications:

Riser Configurations:

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:

Pump Types:

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:

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();

See Also