Skip to the content.

Subsea Trees

Documentation for subsea Christmas tree equipment in NeqSim for subsea production modeling.

Table of Contents


Overview

Location: neqsim.process.equipment.subsea

A subsea tree (Christmas tree) is a system of valves and connectors installed on top of a subsea wellhead to control production from the well. The SubseaTree class models:

Class Description
SubseaTree Subsea Christmas tree with valve controls
SubseaTreeMechanicalDesign Mechanical design calculations

SubseaTree Class

Class Hierarchy

TwoPortEquipment
└── SubseaTree
    ├── enum: TreeType
    ├── enum: PressureRating
    └── contains: ThrottlingValve (choke)

Key Features

Constructor

import neqsim.process.equipment.subsea.SubseaTree;
import neqsim.process.equipment.stream.StreamInterface;

// Create subsea tree with well stream
SubseaTree tree = new SubseaTree("Well-1 Tree", wellStream);

// Configure tree type and design
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setWaterDepth(450.0);
tree.setDesignPressure(690.0);  // 10000 psi
tree.setDesignTemperature(150.0);

Tree Types

TreeType Enumeration

Type Description Application
VERTICAL Conventional tree, tubing hanger in wellhead Standard wells
HORIZONTAL Tubing hanger inside tree body Most new developments
DUAL_BORE Two production bores High-rate producers
MUDLINE Simplified design Shallow water
SPOOL Compact design Tight spacing

Selecting Tree Type

// Vertical tree - conventional design
tree.setTreeType(SubseaTree.TreeType.VERTICAL);

// Horizontal tree - modern standard
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);

// Dual bore - high rate wells
tree.setTreeType(SubseaTree.TreeType.DUAL_BORE);

Tree Type Comparison

Feature Vertical Horizontal
Tubing Hanger Location In wellhead In tree
Wellhead Complexity Higher Lower
Tree Height Taller More compact
Workover Access Full bore Through-bore
Industry Trend Legacy Preferred

Valve Configuration

Production Valves

// Configure production valves
tree.setProductionMasterValveOpen(true);   // PMV
tree.setProductionWingValveOpen(true);     // PWV
tree.setChokeOpening(75.0);                // Choke position (%)

// Get valve states
boolean pmvOpen = tree.isProductionMasterValveOpen();
boolean pwvOpen = tree.isProductionWingValveOpen();
double chokePos = tree.getChokeOpening();

Annulus Valves

// Configure annulus valves
tree.setAnnulusMasterValveOpen(false);     // AMV
tree.setAnnulusWingValveOpen(false);       // AWV

// Annulus monitoring
tree.setAnnulusPressure(50.0);  // bara

Choke Valve

// Set choke opening (0-100%)
tree.setChokeOpening(50.0);

// Or set target outlet pressure
tree.setOutletPressure(80.0);  // bara

// Get pressure drop
double dp = tree.getPressureDrop();

Valve Position Matrix

Valve Normal Production Well Test Shut-in
PMV Open Open Closed
PWV Open Closed Closed
Choke Modulating Modulating Closed
AMV Closed Closed Closed
AWV Closed Closed Closed

Pressure Ratings

PressureRating Enumeration

Rating PSI Bar Application
PR5000 5,000 345 Low pressure wells
PR10000 10,000 690 Standard HPHT
PR15000 15,000 1,034 Ultra HPHT
PR20000 20,000 1,379 Extreme HPHT

Setting Pressure Rating

// Set pressure rating
tree.setPressureRating(SubseaTree.PressureRating.PR10000);

// Or set design pressure directly (bara)
tree.setDesignPressure(690.0);

// Get rating
SubseaTree.PressureRating rating = tree.getPressureRating();
int pressurePsi = rating.getPsi();
int pressureBar = rating.getBar();

Usage Examples

Example 1: Basic Subsea Tree Operation

import neqsim.thermo.system.SystemSrkEos;
import neqsim.process.equipment.stream.Stream;
import neqsim.process.equipment.subsea.SubseaTree;

// Create well fluid
SystemSrkEos fluid = new SystemSrkEos(373.15, 250.0);
fluid.addComponent("methane", 70.0);
fluid.addComponent("ethane", 8.0);
fluid.addComponent("propane", 5.0);
fluid.addComponent("n-heptane", 15.0);
fluid.addComponent("water", 2.0);
fluid.setMixingRule("classic");

// Create wellhead stream
Stream wellStream = new Stream("Wellhead", fluid);
wellStream.setFlowRate(50000.0, "kg/hr");
wellStream.setTemperature(90.0, "C");
wellStream.setPressure(200.0, "bara");
wellStream.run();

// Create subsea tree
SubseaTree tree = new SubseaTree("A-1H Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setWaterDepth(450.0);
tree.setDesignPressure(690.0);
tree.setDesignTemperature(150.0);

// Configure valves for normal production
tree.setProductionMasterValveOpen(true);
tree.setProductionWingValveOpen(true);
tree.setChokeOpening(80.0);

// Run tree
tree.run();

// Get outlet conditions
StreamInterface outlet = tree.getOutletStream();
System.out.println("Outlet P: " + outlet.getPressure() + " bara");
System.out.println("Outlet T: " + (outlet.getTemperature() - 273.15) + " C");

Example 2: Well Test Configuration

// Configure for well test (route to test separator)
tree.setProductionWingValveOpen(false);  // Close to production header
tree.setTestValveOpen(true);             // Open to test header
tree.setChokeOpening(50.0);              // Reduced rate for test

tree.run();

// Get test rate
double testRate = tree.getOutletStream().getFlowRate("kg/hr");
System.out.println("Test rate: " + testRate + " kg/hr");

Example 3: Well Shut-in Procedure

// Emergency shutdown sequence
System.out.println("Initiating ESD...");

// Close choke first
tree.setChokeOpening(0.0);
tree.run();

// Close wing valves
tree.setProductionWingValveOpen(false);
tree.setAnnulusWingValveOpen(false);

// Close master valves
tree.setProductionMasterValveOpen(false);
tree.setAnnulusMasterValveOpen(false);

System.out.println("Well shut-in complete");
System.out.println("SITP: " + tree.getShutInTubingPressure() + " bara");

Example 4: Tree with Mechanical Design

import neqsim.process.mechanicaldesign.subsea.SubseaTreeMechanicalDesign;

// Create tree
SubseaTree tree = new SubseaTree("C-2H Tree", wellStream);
tree.setTreeType(SubseaTree.TreeType.HORIZONTAL);
tree.setWaterDepth(800.0);
tree.setDesignPressure(690.0);
tree.setDesignTemperature(175.0);

// Get mechanical design
SubseaTreeMechanicalDesign design = tree.getMechanicalDesign();

// Configure design parameters
design.setMaterialGrade("F22");
design.setDesignLife(25);  // years
design.setServiceType("Sour");

// Calculate design
design.calcDesign();

// Get JSON report
String report = design.toJson();
System.out.println(report);

Design Standards

Applicable Standards

Standard Title
API Spec 17D Design and Operation of Subsea Production Systems
API RP 17A Recommended Practice for Design and Operation of Subsea Production Systems
ISO 13628-4 Subsea Wellhead and Tree Equipment
NORSOK U-001 Subsea Production Systems

Material Selection

Component Typical Material Service
Body F22, Inconel 625 HPHT, Sour
Trim Inconel 718 Erosion resistant
Seals Inconel 625, HNBR High pressure
Bolting B7M, L7M Sour service

Design Considerations


Flow Assurance Integration

Hydrate Monitoring

// Check hydrate formation temperature
double fluidTemp = tree.getOutletStream().getTemperature() - 273.15;
double hydrateTemp = tree.calculateHydrateTemperature();  // °C

if (fluidTemp < hydrateTemp + 5.0) {
    System.out.println("WARNING: Approaching hydrate region");
    System.out.println("Fluid: " + fluidTemp + "°C, Hydrate: " + hydrateTemp + "°C");
}

Cooldown Analysis

// Calculate cooldown time to hydrate temperature
double ambientTemp = 4.0;  // Seabed temperature °C
double cooldownTime = tree.calculateCooldownTime(ambientTemp, hydrateTemp);

System.out.println("Cooldown time to hydrate: " + cooldownTime + " hours");


API Reference

SubseaTree

// Constructors
SubseaTree(String name)
SubseaTree(String name, StreamInterface wellStream)

// Tree configuration
void setTreeType(TreeType type)
TreeType getTreeType()
void setPressureRating(PressureRating rating)
PressureRating getPressureRating()

// Design parameters
void setWaterDepth(double depth)
void setDesignPressure(double pressure)
void setDesignTemperature(double temperature)

// Production valves
void setProductionMasterValveOpen(boolean open)
void setProductionWingValveOpen(boolean open)
void setChokeOpening(double percent)
void setOutletPressure(double pressure)

// Annulus valves
void setAnnulusMasterValveOpen(boolean open)
void setAnnulusWingValveOpen(boolean open)
void setAnnulusPressure(double pressure)

// Mechanical design
SubseaTreeMechanicalDesign getMechanicalDesign()

// Run simulation
void run()
void run(UUID id)

// Results
StreamInterface getOutletStream()
double getPressureDrop()
double getShutInTubingPressure()

TreeType Enum

enum TreeType {
    VERTICAL,
    HORIZONTAL,
    DUAL_BORE,
    MUDLINE,
    SPOOL
}

PressureRating Enum

enum PressureRating {
    PR5000(5000, 345),
    PR10000(10000, 690),
    PR15000(15000, 1034),
    PR20000(20000, 1379);
    
    int getPsi()
    int getBar()
}