Skip to the content.

Documentation for flare equipment in NeqSim process simulation.

Table of Contents


Overview

Location: neqsim.process.equipment.flare

Classes: | Class | Description | |——-|————-| | Flare | Main flare combustion unit | | FlareStack | Flare stack with dispersion | | FlareCapacityDTO | Capacity check results | | FlarePerformanceDTO | Performance metrics |

Flares are safety devices that combust hydrocarbon gases that cannot be recovered. They are used for:


Flare Class

Basic Usage

import neqsim.process.equipment.flare.Flare;

// Create flare with inlet stream
Flare flare = new Flare("HP Flare", inletStream);
flare.run();

// Get results
double heatRelease = flare.getHeatDuty();  // W
double co2Emission = flare.getCO2Emission();  // kg/s

System.out.println("Heat release: " + heatRelease/1e6 + " MW");
System.out.println("CO2 emission: " + co2Emission * 3600 + " kg/hr");

Constructor Options

// With name only
Flare flare = new Flare("Flare");
flare.setInletStream(flareGas);

// With name and inlet stream
Flare flare = new Flare("Flare", flareGas);

Combustion Calculations

Heat Release

The flare calculates heat release from the ISO 6976:1995 molar lower calorific value, with the existing 15.55 °C combustion reference:

\[Q = LCV_{molar} \times \dot{n}\]

Here $LCV_{molar}$ is in J/mol and $\dot{n}$ is in mol/s, giving heat release in watts. This avoids mixing the 0 °C real-volume basis of the legacy Stream.LCV() with NeqSim’s 15 °C standard-volume flow. It also avoids mixing real-gas calorific volumes with ideal standard-volume flow conversions. The legacy Flare.getLCV() getter retains its J/m³ at 0 °C value; its former J/kg documentation was incorrect. Corrected heat release propagates to radiation estimates, capacity checks and cumulative heat.

The 1995 and 2016 ISO constant tables remain separate. These flare results use the 1995 table, not Standard_ISO6976_2016.

// Get heat release rate
double heatDuty = flare.getHeatDuty();  // W

// Convert to MW
double heatMW = heatDuty / 1e6;
System.out.println("Heat release: " + heatMW + " MW");

CO₂ Emissions

CO₂ emissions are calculated from the carbon content of the flared gas:

\[\dot{m}_{CO_2} = \sum_i (x_i \times \dot{n}_{total} \times n_{C,i} \times M_{CO_2})\]

Where:

// Get CO2 emission rate
double co2Rate = flare.getCO2Emission();  // kg/s

// Convert to tonnes per hour
double co2TonHr = co2Rate * 3.6;
System.out.println("CO2 emissions: " + co2TonHr + " t/hr");

Flare Design Parameters

Radiation

// Set radiant fraction (fraction of heat released as radiation)
flare.setRadiantFraction(0.20);  // 20%

// Set flame height for radiation calculations
flare.setFlameHeight(40.0);  // m

// Get radiation at ground level
double radiation = flare.getRadiationAtDistance(100.0);  // W/m² at 100m

Tip Diameter

// Set tip diameter for velocity calculations
flare.setTipDiameter(0.5);  // m

// Get tip velocity
double tipVelocity = flare.getTipVelocity();  // m/s

Capacity Monitoring

Design Capacity

// Set design capacity limits
flare.setDesignHeatDutyCapacity(100e6);  // 100 MW
flare.setDesignMassFlowCapacity(50.0);   // 50 kg/s
flare.setDesignMolarFlowCapacity(2000.0); // 2000 mol/s

Capacity Check

// Check if within capacity
flare.run();
CapacityCheckResult result = flare.getCapacityCheckResult();

if (result.isOverCapacity()) {
    System.out.println("WARNING: Flare over capacity!");
    System.out.println("Heat duty: " + result.getHeatDutyPercent() + "% of design");
    System.out.println("Mass flow: " + result.getMassFlowPercent() + "% of design");
}

Dynamic Operation

Transient Simulation

// Track cumulative values during transient
double timeStep = 1.0;  // seconds
double totalTime = 900.0;  // 15 minutes

for (double t = 0; t < totalTime; t += timeStep) {
    // Update inlet conditions (e.g., from blowdown)
    updateFlareInlet(t);
    
    flare.run();
    flare.updateCumulative(timeStep);
}

// Get cumulative values
double totalHeatGJ = flare.getCumulativeHeatReleased();  // GJ
double totalGasBurned = flare.getCumulativeGasBurned();  // kg
double totalCO2 = flare.getCumulativeCO2Emission();  // kg

System.out.println("Total heat released: " + totalHeatGJ + " GJ");
System.out.println("Total gas burned: " + totalGasBurned + " kg");
System.out.println("Total CO2 emitted: " + totalCO2 + " kg");

Reset Cumulative Counters

// Reset for new transient event
flare.resetCumulative();

FlareStack Class

The FlareStack class includes additional features for dispersion modeling:

import neqsim.process.equipment.flare.FlareStack;

FlareStack flareStack = new FlareStack("Main Flare Stack", inletStream);
flareStack.setStackHeight(100.0);  // m
flareStack.setTipDiameter(0.6);    // m
flareStack.run();

// Get dispersion parameters
FlareDispersionSurrogateDTO dispersion = flareStack.getDispersionSurrogate();
double effectiveHeight = dispersion.getEffectiveStackHeight();
double plumeMomentum = dispersion.getPlumeMomentum();

Usage Examples

Emergency Blowdown Flare Load

ProcessSystem process = new ProcessSystem();

// Vessel being depressured
Tank vessel = new Tank("HP Vessel", vesselFluid);
vessel.setVolume(100.0, "m3");
vessel.setPressure(100.0, "bara");
process.add(vessel);

// Blowdown valve
BlowdownValve bdv = new BlowdownValve("BDV-100", vessel);
bdv.setOrificeSize(100.0, "mm");
bdv.setDownstreamPressure(1.5, "barg");
process.add(bdv);

// Flare receiving blowdown
Flare flare = new Flare("HP Flare", bdv.getOutletStream());
flare.setDesignHeatDutyCapacity(200e6);  // 200 MW design
process.add(flare);

// Run transient blowdown
double dt = 1.0;
for (double t = 0; t < 900; t += dt) {
    vessel.runTransient(dt);
    bdv.run();
    flare.run();
    flare.updateCumulative(dt);
    
    System.out.println("t=" + t + "s, P=" + vessel.getPressure("barg") + 
        " barg, Q=" + flare.getHeatDuty()/1e6 + " MW");
}

Flare Header System

// Multiple sources to common flare header
Mixer flareHeader = new Mixer("Flare Header");
flareHeader.addStream(lpFlareSource1);
flareHeader.addStream(lpFlareSource2);
flareHeader.addStream(lpFlareSource3);
process.add(flareHeader);

// Flare KO drum
Separator flareKODrum = new Separator("Flare KO Drum", flareHeader.getOutletStream());
process.add(flareKODrum);

// Flare tip
Flare flareTip = new Flare("LP Flare", flareKODrum.getGasOutStream());
flareTip.setDesignHeatDutyCapacity(50e6);
process.add(flareTip);

process.run();

// Check overall flare load
double totalLoad = flareTip.getHeatDuty();
double percentCapacity = totalLoad / flareTip.getDesignHeatDutyCapacity() * 100;
System.out.println("Flare load: " + percentCapacity + "% of design");

Relief Scenario Calculation

// Calculate flare load for blocked outlet scenario
double reliefRate = calculateBlockedOutletRelief();  // kg/hr

// Create relief stream
SystemInterface reliefFluid = vesselFluid.clone();
Stream reliefStream = new Stream("Relief Flow", reliefFluid);
reliefStream.setFlowRate(reliefRate, "kg/hr");
reliefStream.run();

// Calculate flare load
Flare flare = new Flare("Scenario Flare", reliefStream);
flare.run();

System.out.println("Relief scenario:");
System.out.println("  Flow rate: " + reliefRate + " kg/hr");
System.out.println("  Heat release: " + flare.getHeatDuty()/1e6 + " MW");
System.out.println("  CO2 emission: " + flare.getCO2Emission()*3600 + " kg/hr");

Performance Reporting

Get Performance Summary

FlarePerformanceDTO performance = flare.getPerformance();

System.out.println("=== Flare Performance ===");
System.out.println("Heat release: " + performance.getHeatDutyMW() + " MW");
System.out.println("Mass flow: " + performance.getMassFlowKgS() + " kg/s");
System.out.println("Tip velocity: " + performance.getTipVelocity() + " m/s");
System.out.println("CO2 emission: " + performance.getCO2EmissionKgS() + " kg/s");
System.out.println("Radiant heat: " + performance.getRadiantHeatMW() + " MW");

Environmental Calculations

Carbon Footprint

// Calculate annual CO2 emissions from continuous flaring
double avgFlowRate = 1000.0;  // Sm3/hr average
double hoursPerYear = 8760.0;

flare.getInletStream().setFlowRate(avgFlowRate, "Sm3/hr");
flare.run();

double annualCO2 = flare.getCO2Emission() * 3600 * hoursPerYear / 1000;  // tonnes/year
System.out.println("Annual CO2 emissions: " + annualCO2 + " tonnes/year");