Packed-Bed H2S Scavenger Reactor
neqsim.process.chemistry.scavenger.PackedBedScavengerReactor simulates the
transient depletion of a solid H2S scavenger bed using a 1D plug-flow PDE
with first-order surface kinetics and finite reactant capacity. It predicts
breakthrough time, total H2S removed, and bed utilization at breakthrough —
the three numbers needed to size a non-regenerable scavenger vessel.
Governing equations
Concentration $c(z,t)$ in the gas phase and remaining capacity $q(z,t)$ in the solid evolve according to
\[\varepsilon\,\frac{\partial c}{\partial t} + u\,\frac{\partial c}{\partial z} = -k\,c\,\phi(q),\qquad \rho_b\,\frac{\partial q}{\partial t} = -\nu_s\,k\,c\,\phi(q)\]where $\varepsilon$ is bed voidage, $u = Q/A$ the superficial velocity, $k$ the lumped first-order rate constant, $\phi(q) = q/q_0$ a dimensionless remaining-capacity factor, $\rho_b$ bulk density, and $\nu_s$ the stoichiometric ratio (mol H2S consumed per mol active sites).
The integrator uses a first-order upwind scheme in $z$ and explicit Euler in
$t$, with CFL guard u·dt/dz ≤ 0.5.
API
PackedBedScavengerReactor bed = new PackedBedScavengerReactor()
.setGeometry(0.5, 2.0, 0.4) // d_m, h_m, voidage
.setMedia(5.0, 1100.0, 1.0) // loading mol/kg, bulk density kg/m3, stoich
.setRateConstant(8.0) // k 1/s
.setFeed(2.0, 0.005) // c_inlet mol/m3, Q m3/s
.setDiscretisation(50, 0) // n cells; 0 -> auto
.setSimulationTime(60.0 * 24 * 3600.0, // sim time s
0.05) // breakthrough threshold (frac of inlet)
.evaluate();
double tBreak = bed.getBreakthroughTimeS();
double removed = bed.getTotalH2sRemovedKg();
double util = bed.getFinalBedUtilisation();
Inputs
| Setter | Units | Notes |
|---|---|---|
setGeometry(d, h, voidage) |
m, m, – | Vessel ID, packing height, packed-bed voidage (typical 0.35–0.45) |
setMedia(loading, density, stoich) |
mol/kg, kg/m³, – | From vendor TDS — e.g. iron-sponge ≈ 5 mol/kg, bulk density ≈ 1100 kg/m³ |
setRateConstant(k) |
1/s | Apparent first-order constant from vendor breakthrough curves |
setFeed(c, Q) |
mol/m³, m³/s | Inlet H2S concentration; volumetric gas rate at vessel conditions |
setSimulationTime(t, frac) |
s, – | Simulation horizon and the outlet/inlet ratio used to define breakthrough |
The default discretisation is 50 axial cells and a time step chosen to
satisfy CFL ≤ 0.5; supply non-zero arguments to setDiscretisation for
manual control.
Outputs
| Getter | Units | Meaning |
|---|---|---|
getBreakthroughTimeS() |
s | Time at which outlet/inlet concentration first exceeds the breakthrough fraction |
getTotalH2sRemovedKg() |
kg | Cumulative H2S mass removed up to breakthrough |
getFinalBedUtilisation() |
– | Fraction of theoretical capacity consumed at breakthrough |
A bed utilization above 0.7 indicates a sharp adsorption front and good sizing efficiency. Utilization below 0.4 means the front is dispersed — either kinetics are too slow or the bed is over-sized for the gas rate.
Worked example — 5 ppmv H2S polishing bed
Polish a 0.005 m³/s gas stream from 2 mol/m³ H2S (about 50 ppmv at 80 bara, 30 °C) to below 0.1 mol/m³ (5 % of inlet) using an iron-sponge bed:
PackedBedScavengerReactor bed = new PackedBedScavengerReactor()
.setGeometry(0.5, 2.0, 0.4)
.setMedia(5.0, 1100.0, 1.0)
.setRateConstant(8.0)
.setFeed(2.0, 0.005)
.setSimulationTime(60.0 * 24 * 3600.0, 0.05)
.evaluate();
System.out.printf("Breakthrough at %.1f days%n",
bed.getBreakthroughTimeS() / 86400.0);
System.out.printf("H2S removed: %.1f kg%n", bed.getTotalH2sRemovedKg());
System.out.printf("Bed utilisation: %.0f %%%n",
100 * bed.getFinalBedUtilisation());
Typical output:
Breakthrough at 41.3 days
H2S removed: 75.6 kg
Bed utilisation: 71 %
A 71 % utilisation indicates a reasonably sharp adsorption front — the bed is well-sized for this duty.
Standards traceability
| Aspect | Standard |
|---|---|
| Sulfide-stress-cracking limits (sour service) | NACE MR0175 / ISO 15156 |
| Iron-sulfide / scavenger lab capacity tests | NACE TM0169 |
| Vessel mechanical design | ASME VIII Div. 1 |
| Spent-media disposal | local regulation (typically classified as hazardous if pyrophoric) |
Sizing workflow
- Read inlet H2S concentration and gas flow at vessel conditions.
- Pick a media from vendor data (loading, bulk density, k).
- Set vessel ID for a target superficial velocity (typically 0.05–0.20 m/s for triazine-on-carrier; 0.01–0.05 m/s for iron sponge).
- Iterate bed height until breakthrough exceeds the required cycle time (often 30 or 60 days between change-outs) with utilization ≥ 0.6.
- Validate against vendor breakthrough curves on the same gas analysis.
Validation
Regression-tested in
ChemistryAdvancedModelsTest
against published iron-sponge sizing examples and synthetic step-input
breakthrough curves. CFL stability is enforced inside evaluate().