ISO 17776 MAH Bow-Tie and EI AVIFF Flow-Induced Vibration Screening
| Class | Purpose | Standard |
|---|---|---|
MahCatalogue |
Pre-defined threats, consequences and barriers per MAH type | ISO 17776 |
MahBowTieBuilder |
Assemble a BowTieModel for a major-accident hazard |
ISO 17776 |
PipingFivScreening |
Factored likelihood-of-failure screening for flow-induced vibration | Energy Institute AVIFF |
FivLikelihoodResult |
LOF score and likelihood band for one circuit | Energy Institute AVIFF |
FlowInducedVibrationAnalyser |
Rigorous LOF from a solved PipeBeggsAndBrills segment |
Energy Institute AVIFF |
FlowInducedPulsationScreening |
Acoustic lock-in screening for closed side branches (dead legs) | Energy Institute AVIFF T2.6 |
FlowInducedPulsationResult |
Branch modes, lock-in envelopes and resonance velocities | Energy Institute AVIFF T2.6 |
Classes live under neqsim.process.safety.hazid,
neqsim.process.safety.vibration and neqsim.process.measurementdevice.
MAH bow-tie from the ISO 17776 catalogue
MahBowTieBuilder.build(MahType) returns a fully populated
BowTieModel (threats on the left, consequences on the right, barriers in the
middle) for a standard major-accident-hazard type:
import neqsim.process.safety.hazid.MahType;
import neqsim.process.safety.hazid.MahBowTieBuilder;
import neqsim.process.safety.hazid.MahCatalogue;
import neqsim.process.safety.risk.bowtie.BowTieModel;
BowTieModel bowtie = MahBowTieBuilder.build(MahType.TOPSIDE_HYDROCARBON_RELEASE);
String hazard = bowtie.getHazardId();
bowtie.getThreats(); // ≥ 4 threats, each with getFrequency()
bowtie.getConsequences(); // ≥ 3 consequences
bowtie.getBarriers(); // ≥ 5 barriers, each with getPfd()
// Inspect the raw catalogue entries directly
MahCatalogue.threatsFor(MahType.TOPSIDE_HYDROCARBON_RELEASE);
MahCatalogue.consequencesFor(MahType.TOPSIDE_HYDROCARBON_RELEASE);
MahCatalogue.barriersFor(MahType.TOPSIDE_HYDROCARBON_RELEASE);
Default threat frequency and barrier PFD are exposed as
MahBowTieBuilder.DEFAULT_THREAT_FREQUENCY and
MahBowTieBuilder.DEFAULT_BARRIER_PFD. MahType covers
TOPSIDE_HYDROCARBON_RELEASE, RISER_LEAK, WELL_BLOWOUT,
STRUCTURAL_COLLAPSE, DROPPED_OBJECT, HELICOPTER_LOSS, SHIP_COLLISION,
FIRE_EXPLOSION, TOXIC_RELEASE, LOSS_OF_BUOYANCY, and EXTREME_WEATHER,
each carrying a human-readable description.
EI AVIFF flow-induced-vibration screening
PipingFivScreening computes an Energy Institute AVIFF likelihood-of-failure
(LOF) score for a piping circuit and maps it to a likelihood band. Use
screenGas or screenLiquid depending on the fluid:
import neqsim.process.safety.vibration.PipingFivScreening;
import neqsim.process.safety.vibration.PipingFivLikelihood;
import neqsim.process.safety.vibration.FivLikelihoodResult;
// Gas circuit: tag, rho[kg/m3], v[m/s], D[m], wall t[m], nBranches, pulsation, support
FivLikelihoodResult gas = PipingFivScreening.screenGas(
"Compressor discharge", 80.0, 30.0, 0.3, 0.006, 2, 4.0, 2.0);
double lof = gas.getLofScore();
PipingFivLikelihood band = gas.getLikelihood(); // LOW / MEDIUM / HIGH / VERY_HIGH
String json = gas.toJson(); // contains "lofScore", "likelihood"
// Liquid circuit: tag, v[m/s], D[m], wall t[m], nBranches, support
FivLikelihoodResult liquid = PipingFivScreening.screenLiquid(
"Pump discharge", 3.5, 0.15, 0.005, 1, 1.5);
// Map an arbitrary LOF score to a band
PipingFivLikelihood b = PipingFivScreening.bandFor(0.7); // HIGH
The likelihood bands are LOW (< 0.3), MEDIUM (0.3–0.5), HIGH (0.5–1.0),
and VERY_HIGH (≥ 1.0). Invalid geometry (zero diameter, negative velocity)
throws IllegalArgumentException.
Choosing the right vibration tool
NeqSim has three complementary vibration screenings. They answer different questions and a “pass” on one does not clear the others:
| Class | Mechanism | Question it answers |
|---|---|---|
PipingFivScreening |
Main-line FIV, factored | Quick desktop LOF from density, velocity and D/t |
FlowInducedVibrationAnalyser |
Main-line FIV, rigorous | LOF from a solved PipeBeggsAndBrills segment, with the real mixture density, velocity and void fraction |
FlowInducedPulsationScreening |
Tonal FIP at closed side branches | Whether a dead leg can lock into acoustic resonance |
AcousticInducedVibrationScreening |
Broadband AIV | Sound power downstream of a pressure-reducing device |
Rigorous main-line LOF from a solved pipe
FlowInducedVibrationAnalyser evaluates the AVIFF form
on a segment of a PipeBeggsAndBrills that has been run, so the mixture density,
mixture velocity and void fraction come from the flow solution rather than from
hand estimates.
The fluid-viscosity factor F_VF switches on the void fraction β:
| Void fraction β | F_VF |
|---|---|
| β < 0.2 | 0.2 + 4β |
| 0.2 ≤ β ≤ 0.88 | 1.0 (liquid and general multiphase) |
| 0.88 < β ≤ 0.99 | -27.882 β² + 45.545 β - 17.495 (wet gas) |
| β > 0.99 | sqrt(μ_gas / 1 cP) (gas dominated) |
Physical sanity check.
F_VFmust fall as β goes to 1. The wet-gas branch reaches 0.268 at β = 0.99, so a single-phase gas must come out below that — a hydrocarbon gas at 0.012–0.018 cP gives about 0.11. Removing liquid from a wet-gas line lowers the vibration driver; at equal standard rate and pressure the wet-over-dry driver ratio for a rich gas at 40–50 bara is roughly 3 to 4. If a calculation reports the opposite,F_VFis being evaluated wrongly.REFERENCE_VISCOSITY_CPis exposed as a public constant so the branch can be reproduced independently. Note thatPipeBeggsAndBrills.getSegmentMixtureViscosityreturns centipoise, not Pa·s.
import neqsim.process.equipment.pipeline.PipeBeggsAndBrills;
import neqsim.process.measurementdevice.FlowInducedVibrationAnalyser;
PipeBeggsAndBrills pipe = new PipeBeggsAndBrills("inlet pipe", feed);
pipe.setDiameter(0.3652);
pipe.setThickness(0.0206); // REQUIRED: the LOF correlation divides by D/t
pipe.setLength(12.0);
pipe.setNumberOfIncrements(4);
FlowInducedVibrationAnalyser fiv = new FlowInducedVibrationAnalyser("LOF", pipe);
fiv.setMethod("LOF");
fiv.setSupportArrangement("Medium stiff"); // Stiff / Medium stiff / Medium / Flexible
process.add(feed);
process.add(pipe);
process.run();
double lof = fiv.getMeasuredValue("");
Omitting setThickness throws IllegalStateException rather than silently
returning NaN. The support arrangement is a qualitative stiffness category,
not a support spacing.
Calibrated LOF ratios when the line size is unknown
A common situation is that a design LOF is quoted but the line list is not
available. For two operating points on the same line the pipe factor F_v
and the flow area cancel exactly, so
is independent of diameter, wall thickness and support category. Reproduce the
stated design point with an assumed geometry, then report every other case as a
ratio to it. Confirm the cancellation numerically by re-running one case with a
different setSupportArrangement(...) — the calibrated ratio must not move.
Flow-induced pulsation at closed side branches
FlowInducedPulsationScreening covers the tonal, acoustically resonant mechanism
that main-line FIV screening does not. Flow past the mouth of a dead leg sheds a
shear layer; when the shedding frequency falls within ±20 % of a standing acoustic
mode of the branch the two lock in and the branch self-excites.
The procedure is:
- Acoustic length
L— centreline distance from the tee to the first acoustic boundary (normally closed valve, blind, or a large volume such as a separator, cooler or KO drum). No end correction is applied. - Eigenfrequencies —
f_n = (2n+1)c/(4L)for aCLOSEDtermination (R = +1),f_n = (n+1)c/(2L)forOPEN(R = −1), with n starting at 0. - Excitation —
f_s = Sr·U0/W_effwhereW_eff = π·d_s/4 + r_effis the effective width of the branch mouth, not the branch diameter.Sr = 0.37is the recommended screening value for side-branch modes,0.20for the main-header mode. - Resonance check — possible when
0.8 f_n ≤ f_s ≤ 1.2 f_n.
import neqsim.process.safety.vibration.FlowInducedPulsationScreening;
import neqsim.process.safety.vibration.FlowInducedPulsationResult;
// name, acoustic length [m], branch ID [m], run ID [m], U0 [m/s], rho [kg/m3], c [m/s]
FlowInducedPulsationResult res = FlowInducedPulsationScreening.screen(
"Closed cross-over stub", 3.0, 0.2477, 0.3652, 20.1, 46.2, 374.0);
boolean resonance = res.isAnyModeLockedIn();
double fs = res.getSheddingFrequencyHz();
for (FlowInducedPulsationResult.BranchMode m : res.getModes()) {
// m.getModeIndex(), m.getFrequencyHz(), m.getEnvelopeLowHz(), m.getEnvelopeHighHz(),
// m.isLockedIn(), m.getResonanceVelocityMPerS()
}
// Helpers for building length or velocity windows without running a full screening
double weff = FlowInducedPulsationScreening.effectiveWidth(0.2477, 0.0);
double f0 = FlowInducedPulsationScreening.eigenFrequency(
0, 374.0, 3.0, FlowInducedPulsationScreening.AcousticTermination.CLOSED);
The full overload takes the edge radius, the termination, the Strouhal number and the mode count.
Why a wet-gas measurement campaign cannot clear dry-gas service
Main-line FIV relaxes when a line goes dry, but flow-induced pulsation moves the other way. Even a small amount of a second phase affects not only the vortex shedding but also the acoustic damping and the speed of sound in the branch, so drying the gas removes three protections at once: the liquid that damped the resonator, the slugging that disrupted the shear layer, and — for drains — the liquid filling that set the branch sound speed near 850–1000 m/s instead of ~375 m/s. Run-pipe accelerometers are largely blind to branch pulsation, so a clean main-line vibration record does not clear this mechanism.
Because the ±20 % envelope makes the resonant length windows narrow, per-branch verdicts are highly sensitive to the acoustic length. Where as-built lengths are not available, invert the criterion instead and report the resonant length window per branch size:
\[L \in \left[(1-0.2)\frac{(2n+1)c}{4 f_s},\; (1+0.2)\frac{(2n+1)c}{4 f_s}\right]\]which a walkdown can check directly with a tape measure.
Verification
./mvnw test -Dtest=MahBowTieBuilderTest,PipingFivScreeningTest
./mvnw test -Dtest=FlowInducedVibrationAnalyserTest,FlowInducedPulsationScreeningTest
FlowInducedPulsationScreeningTest reproduces a published worked example: a 3 m
closed branch at c = 400 m/s gives f₀ = 33.3 Hz, f₁ = 100 Hz, f₂ = 166.7 Hz.
FlowInducedVibrationAnalyserTest asserts that dry-gas LOF stays below wet-gas
LOF at equal standard rate and pressure.