Pipelines and Pipes
Documentation for pipeline equipment in NeqSim.
📘 Comprehensive Documentation Available
For detailed documentation on all pipeline types, the
PipeLineInterface, flow regime detection, heat transfer, profile methods, and complete examples, see:
- Pipeline Simulation Guide - Complete simulation documentation
- Pipeline Mechanical Design - Wall thickness, stress analysis, cost estimation
- Topside Piping Design - Platform piping with velocity, support spacing, vibration (AIV/FIV)
- Riser Mechanical Design - Riser design with catenary, VIV, fatigue
- Pipeline Mechanical Design Math - Mathematical formulas reference
Table of Contents
Overview
Location: neqsim.process.equipment.pipeline
Classes:
| Class | Description |
|——-|————-|
| PipeBeggsAndBrills | Beggs-Brill correlation |
| AdiabaticPipe | Adiabatic pipe segment |
| OnePhasePipe | Single-phase pipe |
| TwoPhasePipeLine | Two-phase pipeline |
| TopsidePiping | Topside/platform piping with service types and mechanical design |
| Riser | Subsea risers (SCR, TTR, Flexible, Lazy-Wave) |
For detailed pipe flow modeling, see also Fluid Mechanics.
Pipe Segment
Basic Usage
import neqsim.process.equipment.pipeline.PipeBeggsAndBrills;
PipeBeggsAndBrills pipe = new PipeBeggsAndBrills("Pipe", inletStream);
pipe.setLength(1000.0, "m");
pipe.setDiameter(0.3, "m");
pipe.setAngle(0.0); // Horizontal
pipe.run();
double pressureDrop = pipe.getPressureDrop("bara");
Stream outlet = pipe.getOutletStream();
Geometry
// Length
pipe.setLength(5000.0, "m");
// Inner diameter
pipe.setDiameter(0.254, "m"); // 10 inch
pipe.setInnerDiameter(0.254, "m");
// Wall roughness
pipe.setRoughness(0.0001, "m");
// Elevation change
pipe.setElevationChange(100.0, "m"); // 100m rise
pipe.setAngle(5.7); // degrees from horizontal
Pipeline
For longer pipelines with multiple segments.
Basic Usage
import neqsim.process.equipment.pipeline.TwoPhasePipeLine;
TwoPhasePipeLine pipeline = new TwoPhasePipeLine("Export Pipeline", inletStream);
pipeline.setLength(50000.0, "m");
pipeline.setDiameter(0.4, "m");
pipeline.setNumberOfNodes(100);
pipeline.run();
// Get profile
double[] pressure = pipeline.getPressureProfile();
double[] temperature = pipeline.getTemperatureProfile();
double[] holdup = pipeline.getLiquidHoldupProfile();
Topside Piping
The TopsidePiping class provides specialized modeling for offshore platform and onshore facility piping with service type configuration and comprehensive mechanical design.
📘 Complete Documentation: Topside Piping Design
Service Types
| Type | Description | Velocity Factor |
|---|---|---|
PROCESS_GAS |
Hydrocarbon gas | 1.0 |
PROCESS_LIQUID |
Hydrocarbon liquid | 1.0 |
MULTIPHASE |
Two-phase flow | 0.8 |
STEAM |
Steam service | 1.2 |
FLARE |
Flare headers | 1.5 |
FUEL_GAS |
Fuel gas system | 0.9 |
COOLING_WATER |
Cooling water | 1.0 |
CHEMICAL_INJECTION |
Chemical injection | 0.8 |
Factory Methods
import neqsim.process.equipment.pipeline.TopsidePiping;
// Gas process header
TopsidePiping gasHeader = TopsidePiping.createProcessGas("Gas Header", feed);
gasHeader.setLength(50.0);
gasHeader.setDiameter(0.2032); // 8 inch
// Flare header
TopsidePiping flareHeader = TopsidePiping.createFlareHeader("HP Flare", feed);
// Steam line
TopsidePiping steamLine = TopsidePiping.createSteamLine("HP Steam", feed);
// Cooling water
TopsidePiping cwLine = TopsidePiping.createCoolingWater("CW Supply", feed);
Configuration
TopsidePiping pipe = new TopsidePiping("Process Gas Header", feed);
pipe.setServiceType(TopsidePiping.ServiceType.PROCESS_GAS);
pipe.setPipeSchedule(TopsidePiping.PipeSchedule.SCH_40);
pipe.setLength(50.0);
pipe.setDiameter(0.2032); // 8 inch ID
pipe.setElevation(0.0);
// Set operating envelope
pipe.setOperatingEnvelope(5.0, 80.0, // Min/max pressure (bara)
-10.0, 60.0); // Min/max temperature (°C)
// Set fittings
pipe.setFittings(4, 2, 1, 2); // 4 elbows, 2 tees, 1 reducer, 2 valves
// Set insulation
pipe.setInsulation(TopsidePiping.InsulationType.MINERAL_WOOL, 0.05); // 50mm
// Set flange rating
pipe.setFlangeRating(300); // ASME B16.5 Class 300
pipe.run();
Mechanical Design
// Get mechanical design
TopsidePipingMechanicalDesign design = pipe.getTopsideMechanicalDesign();
design.setMaxOperationPressure(80.0);
design.setMaterialGrade("A106-B");
design.setDesignStandardCode("ASME-B31.3");
design.setCompanySpecificDesignStandards("Equinor");
// Run design calculations
design.readDesignSpecifications();
design.calcDesign();
// Get results
TopsidePipingMechanicalDesignCalculator calc = design.getTopsideCalculator();
System.out.println("Support spacing: " + calc.getSupportSpacing() + " m");
System.out.println("Velocity OK: " + calc.isVelocityCheckPassed());
System.out.println("Vibration OK: " + calc.isVibrationCheckPassed());
System.out.println("Stress OK: " + calc.isStressCheckPassed());
// Export JSON report
String json = design.toJson();
Risers
The Riser class provides specialized modeling for subsea risers with support for various riser configurations and dedicated mechanical design calculations.
Riser Types
| Type | Description | Key Features |
|---|---|---|
STEEL_CATENARY_RISER (SCR) |
Free-hanging catenary from FPSO | Touchdown point stress, catenary mechanics |
TOP_TENSIONED_RISER (TTR) |
Tensioned from platform | Stroke requirements, tension variation |
FLEXIBLE_RISER |
Unbonded flexible pipe | Bend radius limits, fatigue |
LAZY_WAVE |
SCR with buoyancy modules | Reduces touchdown stress |
STEEP_WAVE |
Steep wave configuration | Compact footprint |
HYBRID_RISER |
Jumper + tower riser | Deep water applications |
FREE_STANDING |
Tower riser | Ultra-deep water |
VERTICAL |
Vertical tensioned | TLP applications |
Factory Methods
import neqsim.process.equipment.pipeline.Riser;
// Steel Catenary Riser
Riser scr = Riser.createSCR("Production SCR", inletStream, 800.0); // 800m water depth
// Top Tensioned Riser
Riser ttr = Riser.createTTR("Export TTR", inletStream, 500.0);
// Lazy-Wave Riser
Riser lazyWave = Riser.createLazyWave("Gas Export", inletStream, 1200.0, 400.0); // buoyancy at 400m
// Flexible Riser
Riser flexible = Riser.createFlexible("Water Injection", inletStream, 300.0);
// Hybrid Riser
Riser hybrid = Riser.createHybrid("Deepwater Export", inletStream, 2000.0);
Riser Configuration
Riser riser = new Riser("Production Riser", inletStream);
riser.setRiserType(Riser.RiserType.STEEL_CATENARY_RISER);
riser.setWaterDepth(800.0); // Water depth in meters
riser.setTopAngle(12.0); // Angle from vertical at top (degrees)
riser.setDepartureAngle(18.0); // Angle from horizontal at seabed
riser.setDiameter(0.254); // Inner diameter in meters (10 inch)
// Environmental conditions
riser.setCurrentVelocity(0.8); // Mid-depth current (m/s)
riser.setSeabedCurrentVelocity(0.3); // Seabed current (m/s)
riser.setSignificantWaveHeight(4.0); // Hs in meters
riser.setPeakWavePeriod(12.0); // Tp in seconds
riser.setPlatformHeaveAmplitude(3.0); // Heave motion (m)
// TTR specific
riser.setAppliedTopTension(2000.0); // Top tension in kN
// Lazy-wave specific
riser.setBuoyancyModuleDepth(400.0); // Depth of buoyancy section
riser.setBuoyancyModuleLength(150.0); // Length of buoyancy section
riser.run();
Riser Mechanical Design
The RiserMechanicalDesign class provides riser-specific mechanical design calculations per DNV-OS-F201, DNV-RP-F204, and API RP 2RD.
Riser riser = Riser.createSCR("Export Riser", inletStream, 1000.0);
riser.setDiameter(0.3048); // 12 inch
riser.setCurrentVelocity(0.6);
riser.setSignificantWaveHeight(3.5);
riser.run();
// Get mechanical design
RiserMechanicalDesign design = riser.getRiserMechanicalDesign();
design.setMaxOperationPressure(150.0);
design.setMaterialGrade("X65");
design.setDesignStandardCode("DNV-OS-F201");
design.setCompanySpecificDesignStandards("Equinor");
design.readDesignSpecifications();
design.calcDesign();
// Get riser-specific results
RiserMechanicalDesignCalculator calc = design.getRiserCalculator();
// Top tension (catenary/TTR)
double topTension = calc.getTopTension(); // kN
double minTension = calc.getMinTopTension(); // kN
double maxTension = calc.getMaxTopTension(); // kN
// Touchdown point analysis
double tdpStress = calc.getTouchdownPointStress(); // MPa
double tdpRadius = calc.getTouchdownCurvatureRadius(); // m
double tdpLength = calc.getTouchdownZoneLength(); // m
// VIV response
double vivFreq = calc.getVortexSheddingFrequency(); // Hz
double natFreq = calc.getNaturalFrequency(); // Hz
double vivAmp = calc.getVIVAmplitude(); // A/D ratio
boolean lockIn = calc.isVIVLockIn();
// Dynamic response
double waveStress = calc.getWaveInducedStress(); // MPa
double heaveStress = calc.getHeaveInducedStress(); // MPa
double strokeReq = calc.getStrokeRequirement(); // m (TTR)
// Fatigue analysis
double fatigueLife = calc.getRiserFatigueLife(); // years
double vivDamage = calc.getVIVFatigueDamage(); // per year
// Check design
boolean acceptable = design.isDesignAcceptable();
Riser Design Standards
Parameters are loaded from the NeqSim design database:
| Standard | Parameters |
|---|---|
| DNV-OS-F201 | Usage factor, safety class factors, DAF, max utilization |
| DNV-RP-F204 | Fatigue design factor, S-N curve parameters, SCF |
| DNV-RP-C203 | S-N curve parameters (seawater, air) |
| DNV-RP-C205 | Strouhal number, drag/lift/added mass coefficients |
| API RP 2RD | Design factor, dynamic load factor |
| API RP 17B | Min bend radius, max axial strain (flexible) |
JSON Export
// Full design report
String json = design.toJson();
// Calculator results
String calcJson = calc.toJson();
Pressure Drop
Friction Factor Correlations
| Method | Application |
|---|---|
| Beggs-Brill | Two-phase flow |
| Moody | Single-phase turbulent |
| Colebrook | Single-phase implicit |
Beggs-Brill Correlation
PipeBeggsAndBrills pipe = new PipeBeggsAndBrills("Pipe", stream);
pipe.setLength(1000.0, "m");
pipe.setDiameter(0.3, "m");
pipe.run();
// Flow regime
String regime = pipe.getFlowRegime(); // Segregated, Intermittent, Distributed
// Liquid holdup
double holdup = pipe.getLiquidHoldup();
Pressure Drop Components
\[\Delta P_{total} = \Delta P_{friction} + \Delta P_{elevation} + \Delta P_{acceleration}\]Heat Transfer
Adiabatic Pipe
import neqsim.process.equipment.pipeline.AdiabaticPipe;
AdiabaticPipe pipe = new AdiabaticPipe("Adiabatic Pipe", stream);
pipe.setLength(500.0, "m");
pipe.setDiameter(0.2, "m");
pipe.run();
// Temperature remains constant (no heat loss)
double Tin = pipe.getInletStream().getTemperature("C");
double Tout = pipe.getOutletStream().getTemperature("C");
Pipe with Heat Transfer
PipeBeggsAndBrills pipe = new PipeBeggsAndBrills("Pipe", stream);
pipe.setLength(1000.0, "m");
pipe.setDiameter(0.3, "m");
// Heat transfer coefficient
pipe.setOverallHeatTransferCoefficient(25.0, "W/m2K");
// Ambient temperature
pipe.setAmbientTemperature(5.0, "C");
pipe.run();
double heatLoss = pipe.getHeatLoss("kW");
Examples
Example 1: Simple Pipe Segment
import neqsim.thermo.system.SystemSrkEos;
import neqsim.process.equipment.stream.Stream;
import neqsim.process.equipment.pipeline.PipeBeggsAndBrills;
// Natural gas
SystemSrkEos gas = new SystemSrkEos(303.15, 80.0);
gas.addComponent("methane", 0.90);
gas.addComponent("ethane", 0.07);
gas.addComponent("propane", 0.03);
gas.setMixingRule("classic");
Stream inlet = new Stream("Inlet", gas);
inlet.setFlowRate(1000000.0, "Sm3/day");
inlet.run();
// Pipe
PipeBeggsAndBrills pipe = new PipeBeggsAndBrills("Pipe", inlet);
pipe.setLength(5000.0, "m");
pipe.setDiameter(0.254, "m"); // 10 inch
pipe.setRoughness(0.00005, "m");
pipe.run();
System.out.println("Inlet P: " + inlet.getPressure("bara") + " bara");
System.out.println("Outlet P: " + pipe.getOutletStream().getPressure("bara") + " bara");
System.out.println("ΔP: " + pipe.getPressureDrop("bara") + " bara");
System.out.println("Velocity: " + pipe.getVelocity("m/s") + " m/s");
Example 2: Two-Phase Pipeline
// Wellstream (gas + condensate)
SystemSrkEos wellstream = new SystemSrkEos(350.0, 100.0);
wellstream.addComponent("methane", 0.70);
wellstream.addComponent("ethane", 0.10);
wellstream.addComponent("propane", 0.08);
wellstream.addComponent("n-pentane", 0.05);
wellstream.addComponent("n-heptane", 0.05);
wellstream.addComponent("n-decane", 0.02);
wellstream.setMixingRule("classic");
Stream inlet = new Stream("Wellstream", wellstream);
inlet.setFlowRate(50000.0, "kg/hr");
inlet.run();
// Two-phase pipeline
TwoPhasePipeLine pipeline = new TwoPhasePipeLine("Flowline", inlet);
pipeline.setLength(10000.0, "m");
pipeline.setDiameter(0.2, "m");
pipeline.setNumberOfNodes(50);
pipeline.run();
System.out.println("Inlet: " + inlet.getPressure("bara") + " bara, " +
inlet.getTemperature("C") + " °C");
System.out.println("Outlet: " + pipeline.getOutletStream().getPressure("bara") + " bara, " +
pipeline.getOutletStream().getTemperature("C") + " °C");
Example 3: Subsea Pipeline with Heat Loss
// Subsea conditions
SystemSrkEos gas = new SystemSrkEos(350.0, 150.0);
gas.addComponent("methane", 0.92);
gas.addComponent("ethane", 0.05);
gas.addComponent("CO2", 0.02);
gas.addComponent("water", 0.01);
gas.setMixingRule("classic");
Stream inlet = new Stream("Wellhead", gas);
inlet.setFlowRate(5000000.0, "Sm3/day");
inlet.run();
// Subsea pipeline
PipeBeggsAndBrills pipeline = new PipeBeggsAndBrills("Subsea", inlet);
pipeline.setLength(50000.0, "m");
pipeline.setDiameter(0.4, "m");
pipeline.setOverallHeatTransferCoefficient(15.0, "W/m2K");
pipeline.setAmbientTemperature(4.0, "C"); // Seabed temperature
pipeline.run();
System.out.println("Outlet temperature: " + pipeline.getOutletStream().getTemperature("C") + " °C");
System.out.println("Heat loss: " + pipeline.getHeatLoss("MW") + " MW");
// Check hydrate temperature
double hdtTemp = pipeline.getOutletStream().getFluid().getHydrateTemperature();
System.out.println("Hydrate temperature: " + (hdtTemp - 273.15) + " °C");
Example 4: Steel Catenary Riser
import neqsim.process.equipment.pipeline.Riser;
import neqsim.process.mechanicaldesign.pipeline.RiserMechanicalDesign;
// Production stream
Stream production = new Stream("Production", wellFluid);
production.setFlowRate(10000.0, "kg/hr");
production.run();
// Steel Catenary Riser (800m water depth)
Riser riser = Riser.createSCR("Production Riser", production, 800.0);
riser.setDiameter(0.254); // 10 inch
riser.setTopAngle(12.0); // 12 degrees from vertical
riser.setCurrentVelocity(0.6); // 0.6 m/s current
riser.setSignificantWaveHeight(3.5); // Hs = 3.5m
riser.run();
System.out.println("Bottom P: " + production.getPressure("bara") + " bara");
System.out.println("Top P: " + riser.getOutletStream().getPressure("bara") + " bara");
System.out.println("Flow regime: " + riser.getFlowRegime());
System.out.println("Riser length: " + riser.getLength() + " m");
// Mechanical design
RiserMechanicalDesign design = riser.getRiserMechanicalDesign();
design.setMaxOperationPressure(100.0);
design.setMaterialGrade("X65");
design.readDesignSpecifications();
design.calcDesign();
System.out.println("Top tension: " + design.getRiserCalculator().getTopTension() + " kN");
System.out.println("Fatigue life: " + design.getRiserCalculator().getRiserFatigueLife() + " years");
System.out.println("VIV lock-in: " + design.getRiserCalculator().isVIVLockIn());
Example 5: Top Tensioned Riser
// TTR for TLP
Riser ttr = Riser.createTTR("Export TTR", production, 500.0);
ttr.setDiameter(0.3048); // 12 inch
ttr.setAppliedTopTension(2500.0); // 2500 kN applied tension
ttr.setTensionVariationFactor(0.15); // 15% variation from heave
ttr.setPlatformHeaveAmplitude(2.5);
ttr.run();
RiserMechanicalDesign ttrDesign = ttr.getRiserMechanicalDesign();
ttrDesign.setMaxOperationPressure(200.0);
ttrDesign.setMaterialGrade("X65");
ttrDesign.calcDesign();
System.out.println("TTR tension: " + ttrDesign.getRiserCalculator().getTopTension() + " kN");
System.out.println("Stroke requirement: " + ttrDesign.getRiserCalculator().getStrokeRequirement() + " m");
Related Documentation
- Equipment Index - All equipment
- Fluid Mechanics - Detailed pipe flow
- Pipeline Mechanical Design - Wall thickness, stress, costs
- Riser Mechanical Design - Riser-specific design
- Valves - Flow control