| name | neqsim-relief-flare-network |
| version | 1.0.0 |
| description | Relief and flare system design — PSV sizing per API 520 (gas/liquid/two-phase, fire case), API 521 fire heat input, flare load summation, flare-tip sizing, radiation contour (API 521 §6), header back-pressure & Mach, and the integrated TR3001 overpressure-protection study engine (multi-cause governing-case selection, fire-case relief, compliance check, disposal-load roll-up). USE WHEN: a task involves PSV sizing, relief contingency analysis, thermal relief for trapped liquid, flare network hydraulics, flare radiation/dispersion, PSV→flare integration, or a TR3001/API 521 overpressure study. Anchors on neqsim.process.util.fire.ReliefValveSizing, neqsim.process.safety.overpressure, neqsim.process.equipment.flare.{Flare, FlareStack}, neqsim.process.equipment.valve.SafetyValve. |
| last_verified | 2026-06-27 |
| requires | {"java_packages":["neqsim.process.util.fire","neqsim.process.safety.overpressure","neqsim.process.equipment.flare","neqsim.process.equipment.valve"]} |
NeqSim Relief & Flare Network Skill
End-to-end relief design — from individual PSV sizing through plant-wide load
summation, flare-tip selection, and radiation/dispersion checks per API 520,
API 521, API 537.
When to Use
- Sizing a single PSV (gas / liquid / two-phase / fire case)
- Checking whether a blocked-in liquid segment needs thermal relief or source-term
handoff after rupture screening
- API 521 fire heat input on wetted area
- Aggregating simultaneous relief loads to a flare header
- Flare tip diameter and stack height (radiation)
- Header hydraulics: back-pressure on PSVs, Mach < 0.7
- Sour-gas dispersion check (toxic clouds)
Standards: API 520 Part I/II, API 521 (relief contingencies + radiation),
API 537 (flare equipment), NFPA 30, EN ISO 23251.
Pattern 1 — Gas-phase PSV (API 520)
import neqsim.process.util.fire.ReliefValveSizing;
import neqsim.process.util.fire.ReliefValveSizing.PSVSizingResult;
PSVSizingResult psv = ReliefValveSizing.calculateRequiredArea(
massFlowRate_kgs,
setPressure_barg,
backPressure_barg,
T_K,
MW,
k_cpcv,
Z_compressibility,
overpressure_frac,
Kd
);
double area_m2 = psv.getRequiredArea();
String orifice = psv.getRecommendedOrifice();
String issues = ReliefValveSizing.validateSizing(psv, false);
Pattern 2 — Fire Case (API 521)
double Q_fire_W = ReliefValveSizing.calculateAPI521FireHeatInput(
wettedAreaM2,
true,
false
);
double mdot = Q_fire_W / latentHeat_J_per_kg;
PSVSizingResult psv = ReliefValveSizing.calculateRequiredArea(
mdot, setP, backP, T_relief, MW, k, Z,
0.21,
Kd
);
API 521 fire equation: Q = C × F × A_wet^0.82 with credit factors for drainage / insulation.
Pattern 3 — Liquid PSV (API 520 Part I §5.8)
import neqsim.process.util.fire.ReliefValveSizing.LiquidPSVSizingResult;
LiquidPSVSizingResult lpsv = ReliefValveSizing.calculateLiquidReliefArea(
volumeFlowRate_m3s,
setPressure_barg,
backPressure_barg,
rho_kg_m3,
viscosity_cP,
Kd
);
Pattern 4 — Two-Phase (Omega Method)
double area = ReliefValveSizing.calculateTwoPhaseReliefArea(
massFlow_kgs, setP_barg, backP_barg, omega, rho_relief, Kd
);
Pattern 4b — Integrated Overpressure Study (TR3001 / API 521)
For a full overpressure-protection study on one protected item — enumerate
credible relief contingencies, pick the governing case, size the PSV, and check
acceptance — use neqsim.process.safety.overpressure. Each cause calculator is
fluent and returns an immutable ReliefScenario; the engine selects the
maximum-rate credible scenario and sizes accordingly (vapour via ReliefValveSizing
API 520; liquid via the API 520 liquid method; two-phase via the omega method).
import neqsim.process.safety.overpressure.*;
ReliefScenario blocked = new BlockedOutletRelief().setName("Blocked gas outlet")
.setInflowRateKgPerHr(36000.0).setReliefPressureBara(50.0)
.setReliefTemperatureC(20.0).setFluid(gas).calculate();
ReliefScenario fire = new FireCaseRelief().setName("Pool fire")
.setVesselDiameterM(2.0).setWettedHeightM(3.0)
.setHasDrainage(true).setHasFireFighting(true)
.setLatentHeatJPerKg(350000.0).setReliefPressureBara(60.0)
.setReliefTemperatureC(120.0).setFluid(gas).calculate();
ProtectedItem item = new ProtectedItem("V-100", 100.0)
.setReliefSetPressureBara(100.0).setBackPressureBara(1.5);
OverpressureStudyResult result = new OverpressureProtectionStudy(item)
.addScenario(blocked).addScenario(fire).evaluate();
result.getGoverningScenario().getName();
result.getRequiredAreaIn2();
result.getRecommendedOrifice();
result.isCapacityAdequate();
result.getAcceptance().getAccumulationFraction();
List<ComplianceFinding> findings = new TR3001ComplianceChecker().check(result);
boolean compliant = new TR3001ComplianceChecker().isCompliant(findings);
ReliefDisposalResult disposal = new ReliefDisposalNetwork("Fire zone 1")
.addRelief(resultA, true).addRelief(resultB, true).calculate();
disposal.getTotalSimultaneousKgPerS();
disposal.getPeakSingleKgPerS();
disposal.getGoverningContributor();
- Cause calculators:
BlockedOutletRelief, CheckValveLeakRelief,
ControlValveFailureRelief, TubeRuptureRelief, FireCaseRelief.
- Set
ReliefScenario phase to LIQUID (with densityKgPerM3/viscosityPaS)
or TWO_PHASE (with gasMassFraction, gasDensityKgPerM3,
liquidDensityKgPerM3, latentHeatJPerKg, liquidHeatCapacityJPerKgK) to
trigger the matching sizing path; missing two-phase inputs are reported as warnings.
- Accumulation limits: 1.10 single non-fire, 1.16 multiple, 1.21 fire (ASME VIII Div 1).
- Verified by
OverpressureProtectionStudyTest + OverpressureExtensionsTest.
Adequacy is judged by AREA, not by re-plugging the selected area into the
nozzle equation: calculateRequiredArea (API 520 empirical) and the nozzle
capacity formula use different coefficient bases and are not inverses.
Pattern 5 — Flare Tip & Stack (API 537 + 521 §6)
import neqsim.process.equipment.flare.Flare;
Flare flare = new Flare("MainFlare");
flare.setInletStream(reliefStream);
flare.setRadiantFraction(0.30);
flare.setTipDiameter(0.5);
flare.setDesignHeatDutyCapacity(150.0, "MW");
flare.run(UUID.randomUUID());
double q_Wm2 = flare.estimateRadiationHeatFlux(75.0);
double dSafe = flare.radiationDistanceForFlux(4730.0);
API 521 §6.4 radiation criteria:
| Receiver | Allowable flux (kW/m²) |
|---|
| Personnel — emergency only | 9.46 |
| Personnel — escape (≤1 min) | 6.31 |
| Property line / 2-min escape | 4.73 |
| Solar background | ~1.0 (subtract from above) |
Pattern 5b — Detailed Flare Flame & Sterile-Zone (API 537)
For sterile-zone radii, wind-tilted flame geometry, and flare noise, use
Api537FlareFlameModel (Kent 1968 flame length + tilt + iso-flux solver):
import neqsim.process.safety.fire.Api537FlareFlameModel;
Api537FlareFlameModel flame = new Api537FlareFlameModel(
50.0,
50.0e6,
0.20,
200.0)
.setStackHeightM(40.0)
.setWindSpeedMPerS(10.0);
double lFlame = flame.flameLengthM();
double tilt = flame.flameTiltRad();
double r158 = flame.sterileZoneRadiusM(Api537FlareFlameModel.FLUX_1_58_KW);
double r473 = flame.sterileZoneRadiusM(Api537FlareFlameModel.FLUX_4_73_KW);
double r946 = flame.sterileZoneRadiusM(Api537FlareFlameModel.FLUX_9_46_KW);
double q75 = flame.heatFluxAtGroundDistance(75.0);
double pwl = flame.soundPowerLevelDb();
double spl = flame.soundPressureLevelDb(100.0);
Verified by Api537FlareFlameModelTest. Radii are nested (lower flux reaches
further); flame tilts downwind and the tip moves horizontally with wind speed.
Pattern 6 — Plant Load Summation
For each contingency (general power failure, total reflux failure, fire zone):
- List PSVs that lift simultaneously
- Sum mass flows at each PSV at its relieving conditions
- Pick the governing contingency (highest header load)
- Size the flare for that load
double totalReliefLoad = psvs.stream()
.filter(p -> isActiveDuring(p, contingency))
.mapToDouble(p -> p.getMassFlowCapacity())
.sum();
For simultaneous blowdown contingencies (multiple BDVs into one header), use
MultiVesselBlowdownStudy (see neqsim-depressurization-mdmt) — it superimposes
the transient blowdown curves on a common time grid and reports the peak
combined header mass flow and the header Mach at that instant, which is the load
that actually sizes the header.
Pattern 7 — Header Back-Pressure & Mach
For balanced-bellows / pilot-operated PSVs, verify:
- Built-up back-pressure ≤ 50% set (conventional 10%)
- Header Mach < 0.7 at any location (avoid critical flow choking design)
import neqsim.process.equipment.valve.SafetyValve;
SafetyValve sv = new SafetyValve("PSV-101", inletStream);
sv.setSetPressure(120.0, "barg");
sv.setBackPressure(15.0, "barg");
sv.run();
double KbCorrection = sv.getBackPressureCorrectionFactor();
Pattern 8 — Dispersion of Unignited Release
FlareDispersionSurrogateDTO disp = flare.getDispersionSurrogate();
Common Mistakes
| Mistake | Fix |
|---|
| Sizing fire PSV at 10% overpressure | Fire case uses 21%; non-fire is 10% (API 520) |
| Wetted area = total surface | API 521 wetted area is liquid-touching surface up to 7.6 m elevation |
| Ignoring drainage credit | F factor reduces Q_fire by 0.5 with adequate drainage (slope ≥ 1°) |
| Adding all PSV capacities for header | Use the governing contingency, not sum of nameplate capacities |
| K_d = 1.0 | Typical: gas/vapor 0.975, liquid 0.65, certified two-phase ≤ 0.85 |
| Ignoring Mach in header | Mach > 0.7 → choking, can dramatically raise back-pressure on PSVs |
| Using inlet line ΔP > 3% set | API 520 §7.3: > 3% inlet ΔP causes valve chatter, fix the piping |
| Picking smallest API 526 letter that meets area | Always pick the next letter for spare margin & spare-parts pool |
Validation Checklist
Related Skills