Skip to the content.

Gas-Oil Separation Plant (GOSP) Tutorial

This tutorial demonstrates how to model a complete gas-oil separation plant (GOSP) in NeqSim, from wellhead through export. A GOSP separates the well stream into stabilized crude oil, associated gas, and produced water.

Overview

Typical GOSP Configuration

Well Stream → HP Separator → MP Separator → LP Separator → Oil Export
                  ↓              ↓              ↓
              HP Gas         MP Gas         LP Gas → Compression
                  ↓              ↓              ↓
                  └──────────────┴──────────────┘
                              ↓
                        Gas Compression → Export Gas

Quick Start: 3-Stage Separation

Java Example

import neqsim.process.processmodel.ProcessSystem;
import neqsim.process.equipment.separator.Separator;
import neqsim.process.equipment.separator.ThreePhaseSeparator;
import neqsim.process.equipment.stream.Stream;
import neqsim.process.equipment.valve.ThrottlingValve;
import neqsim.process.equipment.compressor.Compressor;
import neqsim.process.equipment.heatexchanger.Cooler;
import neqsim.process.equipment.mixer.Mixer;
import neqsim.thermo.system.SystemSrkEos;

public class GOSPSimulation {
    public static void main(String[] args) {
        
        // === CREATE WELL FLUID ===
        SystemSrkEos wellFluid = new SystemSrkEos(353.15, 50.0);  // 80°C, 50 bara
        
        // Typical North Sea oil composition
        wellFluid.addComponent("nitrogen", 0.005);
        wellFluid.addComponent("CO2", 0.02);
        wellFluid.addComponent("methane", 0.35);
        wellFluid.addComponent("ethane", 0.08);
        wellFluid.addComponent("propane", 0.06);
        wellFluid.addComponent("i-butane", 0.02);
        wellFluid.addComponent("n-butane", 0.03);
        wellFluid.addComponent("i-pentane", 0.015);
        wellFluid.addComponent("n-pentane", 0.02);
        wellFluid.addComponent("n-hexane", 0.025);
        wellFluid.addComponent("n-heptane", 0.04);
        wellFluid.addComponent("n-octane", 0.05);
        wellFluid.addComponent("n-nonane", 0.04);
        wellFluid.addComponent("nC10", 0.03);
        wellFluid.addTBPfraction("C11", 0.05, 150.0, 0.78);
        wellFluid.addTBPfraction("C15", 0.04, 210.0, 0.82);
        wellFluid.addTBPfraction("C20+", 0.06, 350.0, 0.88);
        wellFluid.addComponent("water", 0.05);
        
        wellFluid.setMixingRule("classic");
        wellFluid.setMultiPhaseCheck(true);
        
        // === BUILD PROCESS ===
        ProcessSystem gosp = new ProcessSystem();
        
        // Well stream
        Stream wellStream = new Stream("Well Stream", wellFluid);
        wellStream.setFlowRate(50000.0, "kg/hr");
        wellStream.setTemperature(80.0, "C");
        wellStream.setPressure(50.0, "bara");
        gosp.add(wellStream);
        
        // === HP SEPARATOR (1st Stage) ===
        // Pressure: 40-50 bara typical
        ThreePhaseSeparator hpSeparator = new ThreePhaseSeparator("HP Separator", wellStream);
        gosp.add(hpSeparator);
        
        Stream hpGas = hpSeparator.getGasOutStream();
        hpGas.setName("HP Gas");
        gosp.add(hpGas);
        
        Stream hpOil = hpSeparator.getOilOutStream();
        hpOil.setName("HP Oil");
        gosp.add(hpOil);
        
        Stream hpWater = hpSeparator.getWaterOutStream();
        hpWater.setName("HP Water");
        gosp.add(hpWater);
        
        // === MP SEPARATOR (2nd Stage) ===
        // Pressure: 8-15 bara typical
        ThrottlingValve mpValve = new ThrottlingValve("MP Valve", hpOil);
        mpValve.setOutletPressure(10.0);
        gosp.add(mpValve);
        
        ThreePhaseSeparator mpSeparator = new ThreePhaseSeparator("MP Separator", 
            mpValve.getOutletStream());
        gosp.add(mpSeparator);
        
        Stream mpGas = mpSeparator.getGasOutStream();
        mpGas.setName("MP Gas");
        gosp.add(mpGas);
        
        Stream mpOil = mpSeparator.getOilOutStream();
        mpOil.setName("MP Oil");
        gosp.add(mpOil);
        
        // === LP SEPARATOR (3rd Stage) ===
        // Pressure: 1.5-3 bara typical
        ThrottlingValve lpValve = new ThrottlingValve("LP Valve", mpOil);
        lpValve.setOutletPressure(2.0);
        gosp.add(lpValve);
        
        ThreePhaseSeparator lpSeparator = new ThreePhaseSeparator("LP Separator", 
            lpValve.getOutletStream());
        gosp.add(lpSeparator);
        
        Stream lpGas = lpSeparator.getGasOutStream();
        lpGas.setName("LP Gas");
        gosp.add(lpGas);
        
        Stream exportOil = lpSeparator.getOilOutStream();
        exportOil.setName("Export Crude");
        gosp.add(exportOil);
        
        // === GAS COMPRESSION ===
        // LP gas compression to MP pressure
        Compressor lpCompressor = new Compressor("LP Compressor", lpGas);
        lpCompressor.setOutletPressure(10.0);
        gosp.add(lpCompressor);
        
        Cooler lpCooler = new Cooler("LP Gas Cooler", lpCompressor.getOutletStream());
        lpCooler.setOutTemperature(40.0, "C");
        gosp.add(lpCooler);
        
        // Mix LP compressed gas with MP gas
        Mixer mpGasMixer = new Mixer("MP Gas Mixer");
        mpGasMixer.addStream(lpCooler.getOutletStream());
        mpGasMixer.addStream(mpGas);
        gosp.add(mpGasMixer);
        
        // MP to HP compression
        Compressor mpCompressor = new Compressor("MP Compressor", mpGasMixer.getOutletStream());
        mpCompressor.setOutletPressure(50.0);
        gosp.add(mpCompressor);
        
        Cooler mpCooler = new Cooler("MP Gas Cooler", mpCompressor.getOutletStream());
        mpCooler.setOutTemperature(40.0, "C");
        gosp.add(mpCooler);
        
        // Mix with HP gas for export
        Mixer exportGasMixer = new Mixer("Export Gas Mixer");
        exportGasMixer.addStream(hpGas);
        exportGasMixer.addStream(mpCooler.getOutletStream());
        gosp.add(exportGasMixer);
        
        Stream exportGas = exportGasMixer.getOutletStream();
        exportGas.setName("Export Gas");
        gosp.add(exportGas);
        
        // === RUN SIMULATION ===
        gosp.run();
        
        // === RESULTS ===
        System.out.println("========== GOSP SIMULATION RESULTS ==========");
        System.out.println();
        
        // Feed summary
        System.out.println("--- FEED ---");
        System.out.printf("Well stream: %.1f kg/hr (%.1f bbl/day oil equivalent)%n",
            wellStream.getFlowRate("kg/hr"),
            wellStream.getFlowRate("kg/hr") * 24 / 159.0 / 0.85);
        System.out.printf("Feed GOR: %.0f Sm3/Sm3%n", 
            wellFluid.getGOR());
        System.out.println();
        
        // Separator performance
        System.out.println("--- SEPARATOR PERFORMANCE ---");
        System.out.printf("HP Separator: P=%.1f bara, T=%.1f C%n",
            hpSeparator.getPressure(), hpSeparator.getTemperature() - 273.15);
        System.out.printf("  Gas: %.1f kg/hr%n", hpGas.getFlowRate("kg/hr"));
        System.out.printf("  Oil: %.1f kg/hr%n", hpOil.getFlowRate("kg/hr"));
        System.out.printf("  Water: %.1f kg/hr%n", hpWater.getFlowRate("kg/hr"));
        System.out.println();
        
        System.out.printf("MP Separator: P=%.1f bara, T=%.1f C%n",
            mpSeparator.getPressure(), mpSeparator.getTemperature() - 273.15);
        System.out.printf("  Gas: %.1f kg/hr%n", mpGas.getFlowRate("kg/hr"));
        System.out.printf("  Oil: %.1f kg/hr%n", mpOil.getFlowRate("kg/hr"));
        System.out.println();
        
        System.out.printf("LP Separator: P=%.1f bara, T=%.1f C%n",
            lpSeparator.getPressure(), lpSeparator.getTemperature() - 273.15);
        System.out.printf("  Gas: %.1f kg/hr%n", lpGas.getFlowRate("kg/hr"));
        System.out.printf("  Oil: %.1f kg/hr%n", exportOil.getFlowRate("kg/hr"));
        System.out.println();
        
        // Product specifications
        System.out.println("--- PRODUCT SPECIFICATIONS ---");
        System.out.printf("Export Oil: %.1f kg/hr%n", exportOil.getFlowRate("kg/hr"));
        System.out.printf("  API Gravity: %.1f%n", 
            141.5 / (exportOil.getFluid().getDensity("kg/m3") / 1000.0) - 131.5);
        System.out.printf("  RVP (est): %.2f bara%n", 
            lpSeparator.getPressure());  // Approximation
        System.out.println();
        
        System.out.printf("Export Gas: %.1f kg/hr (%.2f MSm3/day)%n", 
            exportGas.getFlowRate("kg/hr"),
            exportGas.getFlowRate("Sm3/day") / 1e6);
        System.out.printf("  Methane: %.1f mol%%%n",
            exportGas.getFluid().getComponent("methane").getx() * 100);
        System.out.printf("  CO2: %.2f mol%%%n",
            exportGas.getFluid().getComponent("CO2").getx() * 100);
        System.out.println();
        
        // Compression power
        System.out.println("--- COMPRESSION DUTY ---");
        System.out.printf("LP Compressor: %.1f kW%n", lpCompressor.getPower("kW"));
        System.out.printf("MP Compressor: %.1f kW%n", mpCompressor.getPower("kW"));
        System.out.printf("Total compression: %.1f kW%n", 
            lpCompressor.getPower("kW") + mpCompressor.getPower("kW"));
    }
}

Python Example

from neqsim import jneqsim

# Import classes
SystemSrkEos = jneqsim.thermo.system.SystemSrkEos
ProcessSystem = jneqsim.process.processmodel.ProcessSystem
Stream = jneqsim.process.equipment.stream.Stream
ThreePhaseSeparator = jneqsim.process.equipment.separator.ThreePhaseSeparator
ThrottlingValve = jneqsim.process.equipment.valve.ThrottlingValve
Compressor = jneqsim.process.equipment.compressor.Compressor
Cooler = jneqsim.process.equipment.heatexchanger.Cooler
Mixer = jneqsim.process.equipment.mixer.Mixer

# Create well fluid
fluid = SystemSrkEos(273.15 + 80.0, 50.0)
fluid.addComponent("nitrogen", 0.005)
fluid.addComponent("CO2", 0.02)
fluid.addComponent("methane", 0.35)
fluid.addComponent("ethane", 0.08)
fluid.addComponent("propane", 0.06)
fluid.addComponent("i-butane", 0.02)
fluid.addComponent("n-butane", 0.03)
fluid.addComponent("i-pentane", 0.015)
fluid.addComponent("n-pentane", 0.02)
fluid.addComponent("n-hexane", 0.025)
fluid.addComponent("n-heptane", 0.04)
fluid.addComponent("n-octane", 0.05)
fluid.addTBPfraction("C10+", 0.10, 200.0, 0.82)
fluid.addComponent("water", 0.05)
fluid.setMixingRule("classic")
fluid.setMultiPhaseCheck(True)

# Build process
gosp = ProcessSystem()

# Feed
well = Stream("Well", fluid)
well.setFlowRate(50000.0, "kg/hr")
well.setTemperature(80.0, "C")
well.setPressure(50.0, "bara")
gosp.add(well)

# HP Separator
hp_sep = ThreePhaseSeparator("HP Sep", well)
gosp.add(hp_sep)

# MP Separator
mp_valve = ThrottlingValve("MP Valve", hp_sep.getOilOutStream())
mp_valve.setOutletPressure(10.0)
gosp.add(mp_valve)

mp_sep = ThreePhaseSeparator("MP Sep", mp_valve.getOutletStream())
gosp.add(mp_sep)

# LP Separator
lp_valve = ThrottlingValve("LP Valve", mp_sep.getOilOutStream())
lp_valve.setOutletPressure(2.0)
gosp.add(lp_valve)

lp_sep = ThreePhaseSeparator("LP Sep", lp_valve.getOutletStream())
gosp.add(lp_sep)

# Run
gosp.run()

# Results
print("=== GOSP Results ===")
print(f"Export Oil: {lp_sep.getOilOutStream().getFlowRate('kg/hr'):.0f} kg/hr")
print(f"HP Gas: {hp_sep.getGasOutStream().getFlowRate('kg/hr'):.0f} kg/hr")
print(f"MP Gas: {mp_sep.getGasOutStream().getFlowRate('kg/hr'):.0f} kg/hr")
print(f"LP Gas: {lp_sep.getGasOutStream().getFlowRate('kg/hr'):.0f} kg/hr")

Design Considerations

Optimal Separator Pressures

The goal is to maximize liquid recovery while meeting product specifications.

Stage Typical Pressure Purpose
HP 30-70 bara Bulk gas removal, maximum gas at high pressure
MP 8-15 bara Intermediate separation, gas compression stages
LP 1.5-3 bara Final stabilization, meet RVP spec

Pressure Optimization

Use NeqSim to find optimal pressures for maximum oil recovery:

// Iterate to find optimal MP pressure
double maxOilRecovery = 0;
double optimalPressure = 0;

for (double mpPressure = 5.0; mpPressure <= 20.0; mpPressure += 1.0) {
    mpValve.setOutletPressure(mpPressure);
    gosp.run();
    
    double oilRate = exportOil.getFlowRate("kg/hr");
    if (oilRate > maxOilRecovery) {
        maxOilRecovery = oilRate;
        optimalPressure = mpPressure;
    }
}
System.out.printf("Optimal MP pressure: %.1f bara%n", optimalPressure);
System.out.printf("Maximum oil recovery: %.1f kg/hr%n", maxOilRecovery);

Product Specifications

Export Crude Specifications

Parameter Typical Spec Notes
RVP < 1 bara (14.7 psia) Reid Vapor Pressure
BS&W < 0.5% Basic Sediment & Water
Salt content < 10 PTB Pounds per thousand barrels
API gravity Report Typically 25-45° API
H₂S < 10 ppm Safety requirement

Export Gas Specifications

Parameter Typical Spec Notes
Hydrocarbon dew point < 0°C at delivery pressure Prevent condensation
Water dew point < -10°C Prevent hydrates/corrosion
H₂S < 4 ppm Pipeline spec
CO₂ < 2-3 mol% Customer spec
Gross heating value 35-43 MJ/Sm³ Quality spec

Adding Heat Integration

For improved efficiency, add heat exchangers between hot and cold streams:

// Example: Use hot export oil to preheat incoming well stream
HeatExchanger feedOilExchanger = new HeatExchanger("Feed/Oil Exchanger");
feedOilExchanger.setFeedStream(0, wellStream);      // Cold side (well stream in)
feedOilExchanger.setFeedStream(1, exportOil);       // Hot side (export oil)
feedOilExchanger.setUAvalue(5000.0);                // Heat transfer coefficient × area
gosp.add(feedOilExchanger);

Water Treatment Integration

For platforms with produced water treatment:

// Hydrocyclone for oil-in-water removal
Separator hydrocyclone = new Separator("Hydrocyclone", hpWater);
gosp.add(hydrocyclone);

// Produced water meets discharge spec (<30 mg/L oil)
Stream treatedWater = hydrocyclone.getLiquidOutStream();
treatedWater.setName("Treated Water");
gosp.add(treatedWater);

Common Variations

Stabilization Column

For deeper stabilization (lower RVP), replace LP separator with a stabilizer column:

import neqsim.process.equipment.distillation.DistillationColumn;

// Stabilizer column instead of LP separator
DistillationColumn stabilizer = new DistillationColumn("Stabilizer", 10, true, false);
stabilizer.addFeedStream(mpOil, 5);  // Feed at middle tray
stabilizer.setCondenserTemperature(40.0, "C");
stabilizer.setReboilerTemperature(150.0, "C");
gosp.add(stabilizer);

Stream stabilizerOverhead = stabilizer.getGasOutStream();
Stream stabilizedCrude = stabilizer.getLiquidOutStream();

FPSO Configuration

For floating production, add motion considerations:

// Use larger separator sizes for FPSO (handle motion effects)
hpSeparator.setInternalDiameter(3.5);  // meters
hpSeparator.setLiquidLevel(0.5);       // fraction
hpSeparator.setSeparatorLength(15.0);  // meters

Performance Metrics

Key performance indicators for GOSP operations:

KPI Formula Target
Oil recovery (Export oil / Feed oil) × 100 > 98%
Gas compression ratio Export P / LP P Minimize
Specific power kW / MSm³/d gas Minimize
Uptime Operating hours / Available hours > 95%

See Also