Skip to the content.

Safety Systems Package

Documentation for safety systems modeling in NeqSim.

Table of Contents


Overview

Location: neqsim.process.equipment.safety, neqsim.process.safety

NeqSim provides equipment and logic for modeling process safety systems:

The release, dispersion, and CFD handoff workflow is intended for screening, case generation, and auditable source-term transfer. Final facility layout, regulatory QRA, and CFD conclusions still require project-specific validation, site geometry, leak-frequency data, and approved consequence-analysis methods.


Safety Equipment

Pressure Safety Valve (PSV)

import neqsim.process.equipment.valve.SafetyValve;

SafetyValve psv = new SafetyValve("PSV-100", vessel);
psv.setOpeningPressure(95.0, "barg");  // Set pressure
psv.setFullOpenPressure(100.0, "barg"); // Overpressure
psv.setBlowdownPressure(85.0, "barg");  // Reseating pressure

Rupture Disk

import neqsim.process.equipment.valve.RuptureDisk;

RuptureDisk disk = new RuptureDisk("RD-100", vessel);
disk.setBurstPressure(110.0, "barg");
disk.setDiameter(150.0, "mm");

Emergency Shutdown (ESD)

ESD Logic and Dynamic Evidence

ESDValve inletValve = new ESDValve("ESD Inlet Isolation", feed);
inletValve.setStrokeTime(4.0);
inletValve.setCv(500.0);

ESDLogic esdLogic = new ESDLogic("ESD Level 1");
esdLogic.addAction(new TripValveAction(inletValve), 0.0);

Use neqsim.process.safety.esd.EmergencyShutdownTestRunner when the ESD sequence needs a structured dynamic evidence report with monitored time series, tagreader comparisons, standards references, and acceptance criteria.

Use ClosedLoopSafetyFunction with DynamicSafetyScenarioRunner when the test must include live process detection, channel response and fault modes, MooN voting, logic-solver delay, and physical final-element response in one isolated transient.

ESD Levels

Level Description Actions
ESD-0 Total shutdown Full plant shutdown
ESD-1 Process shutdown Process area isolation
ESD-2 Unit shutdown Single unit isolation
ESD-3 Equipment shutdown Single equipment stop

Blowdown Systems

Depressuring Calculation

import neqsim.process.equipment.valve.BlowdownValve;

BlowdownValve blowdown = new BlowdownValve("BDV-100", vessel);
blowdown.setDownstreamPressure(1.0, "barg");  // Flare pressure
blowdown.setOrificeSize(100.0, "mm");

// Run depressuring transient
for (double t = 0; t < 900; t += 1.0) {
    blowdown.runTransient();

    double P = vessel.getPressure("barg");
    double T = vessel.getTemperature("C");

    if (P < 7.0) {  // 15 minute rule target
        System.out.println("Reached target at " + t + " seconds");
        break;
    }
}

Fire Case Calculation

// Calculate heat input from fire
double wettedArea = 50.0;  // m²
double Q = 43200 * Math.pow(wettedArea, 0.82);  // API 521 formula

vessel.setHeatInput(Q, "W");

Pressure Safety Valves

PSV Sizing

// Calculate required relief rate
double reliefRate = psv.getReliefRate("kg/hr");

// API 520 sizing
double area = psv.getRequiredOrificeArea("mm2");
String orifice = psv.getAPIOrificeLetter();

System.out.println("Required area: " + area + " mm²");
System.out.println("API orifice: " + orifice);

Multiple Relief Scenarios

Scenario Description
Blocked outlet Outlet valve closed
Fire case External fire exposure
Tube rupture Heat exchanger tube failure
Power failure Loss of cooling/control
Thermal relief Liquid expansion

HIPPS

High Integrity Pressure Protection System.

import neqsim.process.safety.HIPPS;

HIPPS hipps = new HIPPS("HIPPS-1");

// Add sensors (2oo3 voting)
hipps.addPressureSensor(pt1);
hipps.addPressureSensor(pt2);
hipps.addPressureSensor(pt3);

// Set trip point
hipps.setTripPressure(95.0, "barg");

// Add final elements
hipps.addIsolationValve(sdv1);
hipps.addIsolationValve(sdv2);

// Set voting logic
hipps.setVotingLogic("2oo3");  // 2 out of 3

Example: ESD Dynamic Test Evidence

OperationalTagMap tagMap = new OperationalTagMap()
    .addBinding(OperationalTagBinding.builder("xv_opening")
        .automationAddress("ESD Inlet Isolation.percentValveOpening")
        .unit("%")
        .role(InstrumentTagRole.BENCHMARK)
        .build());

EmergencyShutdownTestPlan plan = EmergencyShutdownTestPlan.builder("ESD1 isolation closure")
    .duration(8.0)
    .timeStep(1.0)
    .tagMap(tagMap)
    .enableLogic("ESD Level 1")
    .triggerLogic("ESD Level 1")
    .criterion(EmergencyShutdownTestCriterion.finalAtMost(
        "ESD-XV-CLOSED", "xv_opening", 5.0, "%"))
    .criterion(EmergencyShutdownTestCriterion.logicCompleted(
        "ESD-LOGIC-COMPLETE", "ESD Level 1"))
    .build();

EmergencyShutdownTestResult report = EmergencyShutdownTestRunner.run(process, plan, esdLogic);