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.
306 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
Integrated phosphate complex: sulfuric acid steam drives the phosphoric acid concentrator
How a Jorf Lasfar-type phosphate complex runs on its own sulfur: the sulfur-burning acid plant raises HP steam, a back-pressure/extraction turbine turns it into power, and the turbine's 3.5 bar extraction is the steam the phosphoric acid concentrator condenses — the arrangement EFMA's BAT booklet on phosphoric acid describes ("the high pressure steam that is produced in the waste heat recovery boiler is normally used to produce electric power and the low pressure exhaust steam is used for phosphoric acid vacuum concentration"). One flowsheet, the steam stream physically connected. The acid plant is sized to the wet-process-phosphoric-acid-dihydrate line: 1,500 t/d of P₂O₅ at that example's computed 2.80 t H₂SO₄ per t P₂O₅ is 4,200 t/d of H₂SO₄, burned from liquid sulfur in dry air to 10.5% SO₂ (the bed-1 strength of the Bayer plant in EFMA's sulphuric acid booklet). The flame reaches 1269 K; the waste-heat boiler cools the gas to 693 K for bed 1, which exits at 885 K at 63% conversion; the superheater takes it back to 713 K for beds 2-4 (99.5% overall, the booklet's double-absorption range) and the economizer to 503 K before absorption. Boiler feedwater at 105 C makes 1.29 t of 40 bar steam per t H₂SO₄ — 3.62 t/t P₂O₅ — and that is 66% of the 5.4 GJ the sulphuric acid booklet says a tonne of acid from sulfur liberates, against 57-62% in 31 bar steam on Bayer's measured plant: the model has no casing loss (Bayer: 2-3%) and stops before absorption, whose heat goes to the acid coolers here as there. The concentrator takes the dihydrate line's 27.9 wt% P₂O₅ filter acid to 54.0 wt% under 0.12 bar vacuum on 1.95 t of LP steam per t P₂O₅, inside the booklet's 0.5-2.2 t/t. So the acid plant covers the phosphoric plant's steam with room to spare: the turbine makes 38.2 MW on what the concentrator does not need, and after the air blower, the feedwater pump and the phosphoric plant's own 150 kWh/t P₂O₅ (the midpoint of the booklet's 120-180) the complex exports 24.1 MW — 385 kWh per t P₂O₅. Sweep the extraction fraction to see the trade: every tonne of steam sent to the concentrator is power the condensing section does not make. Scope, stated rather than implied: (1) the four converter beds are two lumped adiabatic reactors with fixed conversions (63%, then the rest to 99.5% overall), not equilibrium beds, and the interpass absorption and gas reheat of a double-absorption plant are not drawn; (2) the absorber is SO₃ capture, so the heat of forming H₂SO₄ (about a quarter of the 5.4 GJ/t) is not in the balance — it goes to cooling water in the plant too; (3) the burner's heat_of_reaction carries a correction for this package's liquid-sulfur enthalpy (Peng-Robinson treats sulfur as one atom), so the heat released is NIST-JANAF's 296.81 kJ/mol from rhombic sulfur, less the 5.08 kJ/mol to melt and heat it to 413 K; (4) the concentrator acid is a feed at the dihydrate line's filter-acid strength, not that example's reactor block, and runs on the brine package (thermo_overrides) while the gas and steam run on Peng-Robinson with IAPWS-95 for water; (5) condensate is returned to a product, not recirculated, and the boiler has no drum, blowdown or deaerator; (6) no pressure drops are drawn on the gas train.
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, and each reactor's Keq is COMPUTED from its species' formation properties with ideal-gas Cp(T) integrated to the reactor temperature ('keq_from_gibbs') rather than typed in: 80.0% CH₄ conversion at 1123 K and an 11x CO knock-down at 620 K are what the thermodynamics give, not numbers chosen to look right. (This card previously stated Keq = 800 for the reformer where the formation properties say 500, and claimed ~85% conversion on the strength of it.).
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.