Sulfuric acid: catalytic SO2 oxidation (contact process) — a PENG-ROBINSON process flowsheet
The heart of a sulfuric-acid plant: roaster/burner gas (SO₂ in excess air) is oxidized to SO₃ over a vanadium-pentoxide catalyst bed, then the SO₃ is absorbed to make acid. The converter is a Gibbs-minimization reactor (Aspen RGibbs equivalent) that finds the SO₂ ⇌ SO₃ equilibrium from first-principles formation energies — no assumed conversion — so it captures the real design tension of the contact process: the reaction SO₂ + ½O2 → SO₃ is exothermic, so a lower bed temperature drives the equilibrium toward SO₃ (higher conversion) while a higher temperature is needed for catalyst activity. At 700 K this converts ~99% of the SO₂; raise the sensitivity temperature and watch the equilibrium conversion fall — the reason real plants use multiple catalyst beds with interstage cooling. The SO₃-rich gas then goes to an absorption tower (modeled as SO₃ capture into the acid product, leaving a spent tail gas of N₂ + excess O₂). Formation-energy source: CRC Handbook / NIST-JANAF (ΔHf°/ΔGf° for SO₂ and SO₃).
Modeling assumptions & limitations
- 1The converter is isothermal at the specified bed temperature (a real adiabatic bed heats up along its length, recovered between beds — not modeled here); the final H₂O + SO₃ → H₂SO₄ absorption is a highly non-ideal exothermic step represented here as SO₃ capture (the acid-forming reaction and oleum thermodynamics are not modeled), the same capture simplification the carbon-capture examples use.
117 views 0 forks
- Rigorous PENG-ROBINSON thermodynamics, solved by the same engine every simulation runs on.
- 2 unit operations modeled: Converter, Absorber.
- Focus areas: Sulfuric acid, Contact process, Gibbs reactor, Equilibrium, SO3.
- Verified fast convergence — a real, measured solve time, not an estimate.
- Thermodynamics
- PENG-ROBINSON
- Components
- sulfur_dioxide, oxygen, nitrogen, sulfur_trioxide
- Unit operations
- ConverterAbsorber
Opens in a new tab, loaded straight into the app — no setup.
Read the step-by-step guideReproduce this exact result from Python — the real client.get_example() → run_and_wait() path, not a mockup.
from flowsim.sdk import FlowSimClient
client = FlowSimClient()
example = client.get_example("sulfuric-acid-contact-process")
sim = client.create_simulation(example["title"], example["flowsheet"])
result = client.run_and_wait(sim["id"])
print(result["status"]) # "converged"
streams = client.streams(sim["id"])Related models
Blue hydrogen: SMR + water-gas-shift + CO2 capture
A low-carbon (blue) hydrogen train: steam-methane reforming converts natural gas + steam to syngas (CH₄ + H₂O <=> CO + 3H2) at 1123 K, a water-gas-shift reactor converts the CO with more steam to extra H₂ + CO₂ (CO + H₂O <=> CO₂ + H₂), the gas is cooled, the process water knocked out, and 96% of the CO₂ is captured as a pure stream for sequestration/EOR (the CCS that makes the hydrogen 'blue'). Both reactors are solved to real chemical equilibrium (partial-pressure basis) rather than a fixed conversion.
C5/C6 isomerization: why the colder catalyst wins
The light end of a gasoline pool. Straight-chain C₅/C₆ paraffins have poor octane, their branched isomers have good octane, and the reaction between them is a simple reversible exothermic rearrangement. Which means the equilibrium gets worse as the reactor gets hotter — and that single fact, not activity, is the technology choice in this unit. Run the built-in temperature sweep: this light straight-run naphtha reaches 74.9% iso-C₅ and 67.2% iso-C₆ at 400 K (the chlorided-alumina window) and only 65.3% and 57.6% at 530 K (the zeolitic window). A chlorided-alumina catalyst does not beat a zeolite by being more active; it beats it by approaching a better equilibrium. That is also why the two are not interchangeable in a revamp — a zeolitic unit cannot be pushed to alumina octane by running harder, only by running colder than its catalyst allows. Two things the flowsheet shows directly: moles are conserved exactly (one molecule in, one molecule out — 100.00000 mol/s out for 100 in, the module's own gate), and the benzene and cyclohexane in the feed pass through untouched at 4.00% and 6.00%, because a component named in no pair is not something this block pretends to convert. Only two pairs are written (n-pentane/isopentane and n-hexane/2-methylpentane) and that is deliberate: pairs are applied in sequence over a shared mole pool, so two pairs sharing one normal would let the second redistribute what the first already converted. A real C₆ network (n-hexane / 2-MP / 3-MP / 2,2-DMB / 2,3-DMB, each with its own equilibrium) is a coupled problem this block does not solve — see the.
Batch campaign: a batch step inside a continuous flowsheet
Fine chemicals and pharma run batches, but a flowsheet is written in mol/s. These two unit ops reconcile that: they integrate the real batch physics over the batch, then report the products as the RATE that campaign delivers, so a batch step sits inside a continuous flowsheet the way a plant actually runs one. The batch reactor esterifies ethanol with acetic acid to ethyl acetate and water. It reaches 63.2% conversion and stops, and that number is not a specification — it is the equilibrium. The reaction is reversible with an equilibrium constant of 4 (the forward and reverse pre-exponentials are given as 5.0e4 and 1.25e4), and solving K = x(0.10+x)/(0.45-x)^2 = 4 for an equimolar charge carrying 10% water gives an extent of 0.285, which is 63.3% of the acid. Fischer esterification really does plateau there; a model that ran to completion would be describing a different reaction. Turnaround time costs throughput exactly as reaction time does. Two hours of reaction plus one hour of turnaround is a 3-hour cycle and 2922 batches a year, and the reactor is only reacting for 67% of the time it is occupied. That fraction is the number that decides whether you need a second reactor, and it is invisible to a steady-state model. The batch still then takes the crude and recovers the ethyl acetate — the distillate comes off essentially pure, from a pot that started at 28.5 mol% ester — on its own longer 4-hour cycle, so the two units run at genuinely different campaign rates. Bounded: the flowsheet sees each unit's CYCLE AVERAGE, not the transient. A real plant has a surge tank between these two smoothing the pulses, and neither the concentration profile during the batch nor the still's changing overhead composition is visible downstream.
Ethylene glycol plant: closed water loop + multi-effect evaporator dehydration
The water-integrated evolution of the fiber-grade MEG plant. Two changes turn the once-through EO/glycol chain into a real, water-economical process: (1) the recovered process water is RECYCLED back to the hydration reactors through a purge splitter. A pure recycle is inventory-singular (reactors are keyed on the shrinking EO pool, so water consumption is fixed regardless of how much water circulates), so an 8% purge pins the loop and makes it well-posed, cutting fresh water makeup from 10 to ~1.75 mol/s (a >80% reduction). (2) The bulk dehydration is done by a genuine TWO-EFFECT EVAPORATOR TRAIN (forward-feed, real steam economy: effect 1's low-temperature vapor is the heating steam for effect 2) doing rigorous (P,H)-flash water removal, rather than a single spec-based split. The recycle converges through the solver's Wegstein tearing (~15 outer passes) and MEG still comes out fiber-grade (>=99.9%). HONEST SCOPE: the reaction chemistry is rigorous stoichiometry (real atom balances, ~90/9/1 selectivity) and the evaporators are real energy-balanced flash effects — but flash evaporation CANNOT reach glycol dryness without slipping glycol into the overhead vapor (MEG has a real vapor pressure at 90 C), so the evaporators run cool and only pre-concentrate. An overhead knockout returns the ~1-2% slipped glycol to the product (no yield loss), and a final vacuum-refining polish (still a spec-based split, representing the refluxed dehydration column a flash cannot replicate) removes the last water. This mirrors a real MEG plant's multi-effect-evaporator + vacuum-refining dehydration section. The product columns remain spec-based (a converged 99.9% fiber-grade MEG column is not tractable under Peng-Robinson here — the MEG/DEG relative volatility is too narrow for the wide-boiling MESH path).
Pressure-swing ethanol dehydration (Gᴱ mixing rule)
Ethanol–water is the classic azeotrope, and pressure-swing distillation breaks it without an entrainer: the azeotrope moves with pressure, so a low-pressure column and a high-pressure column pass each other's azeotropic distillate and each recovers a pure product. The whole process only works if the property package tracks that shift — which is exactly where a conventional package choice falls between two chairs. This flowsheet runs the high-pressure column at 15 bar on pr-mhv1: Peng-Robinson with an MHV1 excess-Gibbs mixing rule, so the cubic equation of state gets its attraction parameter from NRTL's excess Gibbs energy instead of from a single binary interaction constant. Switch the thermo package (Solver menu) and compare the predicted azeotrope: | package | 1 atm | 15 bar | valid at 15 bar? | |---|---|---|---| | NRTL | 0.891 | 0.802 | no — γ-φ is a low-pressure formulation (~10 bar) | | Peng-Robinson (kij) | 0.586 | 0.613 | yes, but a kij cannot represent this azeotrope | | pr-mhv1 | 0.949 | 0.798 | yes | (mole fraction ethanol; the repo's DECHEMA-validated 1 atm anchor is 0.894.) At 15 bar pr-mhv1 lands within 0.005 of NRTL while remaining a genuine equation of state, whereas plain Peng-Robinson is off by ~0.19 and puts the azeotrope in the wrong place entirely. Selecting nrtl here also trips the applicability guard, which warns that the activity model is past its pressure ceiling and names the fix. The flowsheet demonstrates the mechanism on itself. Drop the column pressure to 1 atm and re-run, changing nothing else: the solve fails with SPEC_THERMODYNAMICALLY_IMPOSSIBLE, because at atmospheric pressure the requested bottoms purity sits beyond the azeotrope and no column can reach it. At 15 bar the same specification converges and the bottoms leaves at x_EtOH ≈ 0.924 — past the atmospheric azeotrope of 0.894, which is precisely the composition an atmospheric column cannot cross.
Industrial water reuse: RO + membrane distillation to near-ZLD
A chemical-site water-reuse train of the kind large industrial water users build when the intake is salinising and freshwater is getting scarce: reverse osmosis makes reuse-grade water, the RO concentrate is warmed by low-grade waste heat and pushed further by membrane distillation, and the MD concentrate is crystallised to salt. Overall water recovery comes out at 94.9%. The point of the flowsheet is why MD is there at all. RO is pressure-driven, so its ceiling is osmotic pressure — and this feed hits that wall hard: at 25 bar the same 75% recovery is infeasible, and the model says so with a number rather than a shrug (osmotic pressure 27.2 bar against a 25 bar feed, a structured SPEC_THERMODYNAMICALLY_IMPOSSIBLE error, which is why the feed here runs at 45 bar). Membrane distillation is driven by a vapour-pressure difference instead, so only vapour crosses and there is no osmotic ceiling at all: it takes the RO concentrate from 2.0 mol% to 9.7 mol% salt, recovering 81% of the water RO had to leave behind, and its distillate is solvent-only. The waste-heat coupling is not decoration. At the RO concentrate's own 25 C the MD flux is about 1 kg/m2/h and the module is pointless; warmed to 60 C it runs at 21.5 kg/m2/h, inside the 10-50 kg/m2/h band real DCMD modules achieve. That is the entire commercial case for MD — it is a heat-driven process, so it is only cheap where low-grade heat is already being vented.