neqsim-power-generation

star 125

Power generation patterns for NeqSim. USE WHEN: modeling gas turbines, steam turbines, HRSG, combined cycle systems, waste heat recovery, or calculating fuel gas consumption and thermal efficiency. Covers GasTurbine, SteamTurbine, HRSG, CombinedCycleSystem classes and heat integration with PinchAnalysis.

equinor By equinor schedule Updated 6/14/2026

name: neqsim-power-generation description: "Power generation patterns for NeqSim. USE WHEN: modeling gas turbines, steam turbines, HRSG, combined cycle systems, waste heat recovery, or calculating fuel gas consumption and thermal efficiency. Covers GasTurbine, SteamTurbine, HRSG, CombinedCycleSystem classes and heat integration with PinchAnalysis." last_verified: "2026-07-04"

Power Generation with NeqSim

Guide for modeling power generation equipment — gas turbines, steam turbines, heat recovery steam generators (HRSG), and combined cycle systems.

When to Use This Skill

  • Gas turbine modeling (power output, fuel consumption, exhaust conditions)
  • Steam turbine expansion and power generation
  • Heat recovery steam generator (HRSG) design
  • Combined cycle system integration (GT + HRSG + ST)
  • Waste heat recovery from process streams
  • Fuel gas consumption and CO2 emissions from drivers
  • Thermal efficiency calculations
  • Heat integration / pinch analysis for process plants

Key NeqSim Classes

Class Package Purpose
GasTurbine process.equipment.powergeneration Gas turbine with compressor, combustor, expander
SteamTurbine process.equipment.powergeneration Steam expansion turbine
HRSG process.equipment.powergeneration Heat recovery steam generator
CombinedCycleSystem process.equipment.powergeneration GT + HRSG + ST integrated system
PinchAnalysis process.equipment.heatexchanger.heatintegration Pinch analysis for heat integration
HeatStream process.equipment.heatexchanger.heatintegration Hot/cold stream for pinch analysis

1. Gas Turbine

// Fuel gas stream — the combustion air is generated internally by the GasTurbine.
SystemInterface fuelGas = new SystemSrkEos(273.15 + 25, 30.0);
fuelGas.addComponent("methane", 0.90);
fuelGas.addComponent("ethane", 0.06);
fuelGas.addComponent("propane", 0.02);
fuelGas.addComponent("nitrogen", 0.02);
fuelGas.setMixingRule("classic");

Stream fuelStream = new Stream("Fuel Gas", fuelGas);
fuelStream.setFlowRate(5000.0, "kg/hr");
fuelStream.run();

// Simplified Brayton-cycle gas turbine: internal air compressor + combustor + expander + cooler.
GasTurbine gt = new GasTurbine("GT-001", fuelStream);
gt.combustionpressure = 18.0;      // firing / combustion pressure [bara]
gt.setExcessAirFactor(2.5);        // excess air over stoichiometric (caps firing temperature)
gt.run();

double power_MW = gt.getPower("MW");           // net shaft power (expander - air compressor)
double rejectHeat_W = gt.getHeat();           // heat rejected by the exhaust cooler [W]
double idealAFR = gt.calcIdealAirFuelRatio(); // stoichiometric air/fuel mass ratio

The legacy GasTurbine is a simplified thermodynamic Brayton model. For vendor-rated power, part-load + ambient correction, degradation, emissions, and dispatch use GasTurbineUnit + GasTurbineCatalog (see section 7).

2. Steam Turbine

// Steam at high pressure and temperature
SystemInterface steam = new SystemSrkEos(273.15 + 540, 100.0);
steam.addComponent("water", 1.0);
steam.setMixingRule("classic");

Stream steamFeed = new Stream("HP Steam", steam);
steamFeed.setFlowRate(50000.0, "kg/hr");

SteamTurbine st = new SteamTurbine("ST-001", steamFeed);
st.setOutletPressure(0.1);  // Condenser pressure in bara
st.setIsentropicEfficiency(0.85);
st.run();

double stPower = st.getPower("MW");
double outletT = st.getOutletStream().getTemperature() - 273.15;

3. Heat Recovery Steam Generator (HRSG)

// Recover heat from a hot turbine-exhaust gas stream. The HRSG takes a single
// hot-gas inlet stream; steam conditions are set on the unit.
HRSG hrsg = new HRSG("HRSG-001", exhaustGasStream);
hrsg.setSteamPressure(40.0);            // bara
hrsg.setSteamTemperature(400.0, "C");
hrsg.setFeedWaterTemperature(105.0, "C");
hrsg.setApproachTemperature(15.0);
hrsg.run();

double duty_W = hrsg.getHeatTransferred();
double steamFlow = hrsg.getSteamFlowRate("kg/hr");
double stackT = hrsg.getGasOutletTemperature() - 273.15;  // °C

4. Combined Cycle System

// Integrated GT + HRSG + ST. The sub-units are built internally from the fuel
// gas stream — configure conditions through the setters below.
CombinedCycleSystem ccgt = new CombinedCycleSystem("CCGT", fuelStream);
ccgt.setCombustionPressure(18.0);
ccgt.setSteamPressure(40.0);
ccgt.setSteamTemperature(400.0, "C");
ccgt.setGasTurbineEfficiency(0.38);
ccgt.setSteamTurbineEfficiency(0.85);
ccgt.run();

double totalPower = ccgt.getTotalPower("MW");
double gtPower_W = ccgt.getGasTurbinePower();
double stPower_W = ccgt.getSteamTurbinePower();
double combinedEfficiency = ccgt.getOverallEfficiency();
// Typical: 55-62% for modern CCGT

5. Heat Integration (Pinch Analysis)

// Identify minimum utility requirements for a process
PinchAnalysis pinch = new PinchAnalysis("Plant Heat Integration");

// Add hot streams (need cooling)
pinch.addHotStream(new HeatStream("Reactor effluent", 250.0, 60.0, 5000.0));
pinch.addHotStream(new HeatStream("Column overhead", 120.0, 40.0, 3000.0));
pinch.addHotStream(new HeatStream("Product cooler", 80.0, 30.0, 1500.0));

// Add cold streams (need heating)
pinch.addColdStream(new HeatStream("Feed preheater", 25.0, 180.0, 4500.0));
pinch.addColdStream(new HeatStream("Reboiler", 150.0, 160.0, 2000.0));

// Set minimum approach temperature
pinch.setMinApproachTemperature(10.0);  // degrees C
pinch.run();

double minHotUtility = pinch.getMinHotUtility();   // kW
double minColdUtility = pinch.getMinColdUtility();  // kW
double pinchTemp = pinch.getPinchTemperature();     // °C

6. Emissions from Power Generation

// Fuel gas composition determines CO2 emissions
// CH4 + 2O2 -> CO2 + 2H2O
// C2H6 + 3.5O2 -> 2CO2 + 3H2O
// C3H8 + 5O2 -> 3CO2 + 4H2O

// Approximate: 2.75 kg CO2 per kg natural gas (varies with composition)
double fuelRate_kg_hr = fuelStream.getFlowRate("kg/hr");
double co2Factor = 2.75;  // kg CO2 / kg fuel (adjust for actual composition)
double co2_tonnes_yr = fuelRate_kg_hr * co2Factor * 8760 / 1e6;

// For a rigorous full-carbon-balance CO2, NOx, and methane-slip estimate use the
// catalog-driven GasTurbineUnit (section 7): gt.getCO2EmissionKgPerHr().

7. Right-Sizing & Dispatch (gasturbine sub-package)

For late-life or turndown studies where the question is "which turbines, how many, and at what load?" — use the catalog-driven classes under neqsim.process.equipment.powergeneration.gasturbine. These integrate directly with ProcessSystem and link to Compressor.getPower() via the PowerDemandConsumer interface.

Class Purpose
GasTurbineCatalog Loads the bundled gas_turbine_catalog.csv (14 aero + industrial models: LM2500, LM2500PLUS_G4, LM6000PF/PG, RB211_6562, Trent 60, SGT-700/750, Centaur 50, Taurus 60/70, Mars 100, Titan 130/250)
GasTurbineSpec Immutable rating point (rated MW, ISO heat rate, exhaust flow/T, NOx, mass)
GasTurbinePerformanceMap Part-load + ambient correction (aero vs industrial polynomials, min-load fraction)
GasTurbineDegradation Recoverable + non-recoverable fouling vs fired hours, water-wash and overhaul reset
GasTurbineEmissions Full-carbon-balance CO2, NOx, methane slip from fuel composition
CO2TaxSchedule Loads co2_tax_norway.csv (2020–2040 NOK/tonne, CO2 tax + EU ETS), linear interpolation
GasTurbineUnit TwoPortEquipment — runs inside a ProcessSystem, accepts fuel Stream, aggregates Compressor shaft load via addPowerConsumer
TurbineDispatchOptimizer Picks the cheapest feasible on/off combination (brute-force ≤8 units, merit-order above) with N+1 reserve
LateLifeRetrofitStudy Year-by-year NPV / CO2-avoided / payback for baseline vs retrofit fleet over a declining demand profile

Catalog & site-corrected available power

GasTurbineSpec spec = GasTurbineCatalog.get("LM2500");
GasTurbineUnit gt = new GasTurbineUnit("GT-A", fuelStream, spec);
gt.setAmbientTemperatureK(273.15 + 30.0);  // hot day derate
gt.setDemandedPower(15.0e6);                // 15 MW shaft
gt.run(UUID.randomUUID());
double avail_MW = gt.getAvailablePowerW() / 1.0e6;
double load     = gt.getLoadFraction();
double co2_tph  = gt.getCO2EmissionKgPerS() * 3.6;

Linking turbine shaft to compressor demand

Each GasTurbineUnit aggregates the live shaft demand from any number of Compressor objects in the same flowsheet — the dispatcher reads it on every run():

ProcessSystem plant = new ProcessSystem();
plant.add(exportCompressor);     // existing Compressor
plant.add(injectionCompressor);
GasTurbineUnit gt = new GasTurbineUnit("GT-A", fuelStream,
        GasTurbineCatalog.get("LM2500"));
gt.addPowerConsumer(exportCompressor);
gt.addPowerConsumer(injectionCompressor);
plant.add(gt);
plant.run();   // gt sums Compressor.getPower() automatically

Fleet dispatch with N+1 redundancy

List<GasTurbineUnit> fleet = Arrays.asList(gt1, gt2, gt3);  // each is a GasTurbineUnit
TurbineDispatchOptimizer disp = new TurbineDispatchOptimizer(
        /*fuelPriceNOKPerKg*/ 4.5,
        /*co2CostNOKPerTonne*/ 1500.0);
disp.setRequireNplusOne(true);
TurbineDispatchOptimizer.DispatchResult r = disp.dispatch(fleet, 18.0e6);
if (r.feasible) {
    System.out.println(r.summary());   // running units, load, NOK/hr
}

Retrofit NPV vs baseline

double[] demandMW = new double[15];
for (int i = 0; i < 15; i++) demandMW[i] = Math.max(8.0, 20.0 - i * 0.8);

LateLifeRetrofitStudy study = new LateLifeRetrofitStudy(
        baselineFleet,    // e.g. 2x LM6000PF
        retrofitFleet,    // e.g. 2x SGT-700
        demandMW,
        /*startYear*/ 2026,
        CO2TaxSchedule.loadDefault(),
        /*fuelPriceNOKPerKg*/ 4.5);
study.setRetrofitCapexMNOK(800.0);
study.setDiscountRate(0.08);
study.setAnnualOperatingHours(8000);
LateLifeRetrofitStudy.RetrofitResult res = study.run();
System.out.println("NPV (MNOK):       " + res.npvMNOK);
System.out.println("CO2 avoided (t):  " + res.totalCO2AvoidedTonne);
System.out.println("Payback (yr):     " + res.simplePaybackYear);

When to choose this sub-package vs the legacy GasTurbine

Use legacy GasTurbine Use GasTurbineUnit + catalog
You model the GT thermodynamically (compressor + combustor + expander) and care about exhaust composition into an HRSG You are doing right-sizing, dispatch, retrofit, or fleet-level CO2/NPV studies and want vendor rating points, part-load + ambient correction, degradation, and N+1
Combined-cycle integration where exhaust gas feeds an HRSG Late-life turndown, replacing oversized turbines, CO2-tax sensitivity

Combined-cycle retrofit (HRSG + SteamTurbine on top of the fleet)

To evaluate a bottoming cycle on top of a GasTurbineUnit retrofit fleet, feed the synthesised exhaust into the legacy HRSG + SteamTurbine. Use the per-unit exhaust mass flow and temperature from GasTurbineSpec (corrected by GasTurbinePerformanceMap if needed) to build an exhaust Stream, then size the bottoming cycle and add its power output to the retrofit LateLifeRetrofitStudy result as an annual energy credit (extra MWh × fuel-equivalent × CO2 factor). The 20-year rightsizing notebook (see below) demonstrates this pattern in section 10.

Reservoir + pipeline-driven shaft demand

Instead of a synthetic linear decline, drive the compressor shaft load from a physics-based reservoir + flow line model. A simple gas-law material balance on the reservoir gives (P_res, T_res) each year; a PipeBeggsAndBrills riser plus flow line gives arrival pressure at the platform; the export compressor suction pressure then sets shaft demand which the GasTurbineUnit / TurbineDispatchOptimizer resolves. This couples the late-life study to real field decline (recovery factor, reservoir size uncertainty) and is the right pattern when CO2 tax and turbine count must be evaluated against an uncertain production profile rather than a stipulated demand curve. Section 11 of the 20-year rightsizing notebook implements this end-to-end.

Worked example

See examples/notebooks/gas_turbine_rightsizing_20yr.ipynb for a complete 20-year late-life right-sizing study: catalog + site correction, degradation, dispatch with N+1, LateLifeRetrofitStudy with CO2TaxSchedule, HRSG + steam-turbine combined-cycle extension, and reservoir-driven demand.

Applicable Standards

Standard Scope
ISO 2314 Gas turbine acceptance tests
IEC 60034 Rotating electrical machines
API 616 Gas turbines for petroleum industry
API 611/612 Steam turbines
ASME PTC 22 Gas turbine power performance
ASME PTC 6 Steam turbine performance

Common Pitfalls

Pitfall Solution
Unrealistic efficiency (>45% simple cycle) Typical: 30-40% simple cycle, 55-62% combined cycle
Missing air stream for gas turbine GT requires both fuel and combustion air
Steam below saturation in turbine outlet Check for wet steam — may need superheat or extraction
Pinch analysis with wrong units HeatStream uses °C for temperature, kW for duty
Install via CLI
npx skills add https://github.com/equinor/neqsim --skill neqsim-power-generation
Repository Details
star Stars 125
call_split Forks 52
navigation Branch main
article Path SKILL.md
More from Creator