Rigorous multi-stage separations engine
The distillation column is solved with the Boston-Sullivan inside-out method — a tridiagonal inner loop on fixed K-values and enthalpies, with an outer loop refreshing both from the thermo package — and the flowsheet's recycle loops converge with Wegstein acceleration.
A heterogeneous azeotropic distillation: the column's overhead feeds a three-phase decanter, splitting organic entrainer from the aqueous purge — draggable, live on this page.
See the math
The exact governing equations the column solver closes at every stage — material balance, phase equilibrium, mole-fraction summation, and the enthalpy balance — fetched live from the same catalog the in-app math panel renders.
- M
- Material-balance residual on a stage — in minus out; driven to zero at convergence (the 'M' of MESH)
- l
- liquid flow leaving a stage [mol/s]
- v
- vapour flow leaving a stage [mol/s]
- f
- feed flow onto a stage [mol/s]
- E
- Equilibrium residual — the K-value relation y=Kx, satisfied at convergence (the 'E')
- K
- equilibrium ratio K=y/x — how strongly a component favours the vapour; K>1 climbs toward the distillate, K<1 sinks toward the bottoms
- y
- vapour mole fraction on a stage
- x
- liquid mole fraction on a stage
- S
- Summation residual — the mole fractions on a stage must add to 1 (the 'S')
- H
- energy-balance (entHalpy) residual on a stage — closed at convergence (the 'H')
- L
- internal liquid traffic between stages [mol/s] — set by the reflux
- V
- internal vapour traffic between stages [mol/s] — set by the boilup
- h^L
- liquid molar enthalpy [J/mol]
- h^V
- vapour molar enthalpy [J/mol]
- h^F
- feed molar enthalpy [J/mol]
- Q
- reboiler/condenser duty [W] — the energy in and out that drives the whole separation
- j
- stage index (1 = top)
- i
- component index
Live from the same catalog the app's own "math" tab renders — not a screenshot.

A converged column's per-stage temperature and K-value profile — the actual MESH output, not an illustration.
Engine capabilities
What this solver actually handles, not a feature-list promise.
Azeotropic distillation
A three-phase decanter splits the overhead into organic and aqueous phases around a heterogeneous azeotrope — the entrainer loop closed on the same MESH column solver.
Dividing-wall columns
A single rigorous shell modeling the coupled prefractionator and main-column sections of a dividing-wall column, not two separate towers stitched together.
Liquid-liquid extraction
Multistage LLE with the same activity-coefficient thermo the column uses, for solvent-based separations a simple flash can't resolve.
Reactive distillation
Reaction and separation solved simultaneously stage-by-stage — conversion and split converge together instead of a reactor-then-column approximation.
Extractive distillation
A high-boiling solvent shifts relative volatility enough to break a tight or azeotropic split, solved on the same rigorous MESH stages.
Pressure-swing azeotropic distillation
Two columns at different pressures shift an azeotrope's composition enough to cross it without an entrainer — sized and converged together.
Live column solve-time benchmark
The real Boston-Sullivan MESH solver, timed on this server at increasing stage counts — not example figures.
| Stage count | Reflux ratio | Solve time | Residual | Status | Run live |
|---|---|---|---|---|---|
| 5 | 15.0 | 0.97 s | 8.24e-7 | Passed | |
| 8 | 15.0 | 12.31 s | 7.11e-4 | Passed | |
| 12 | 15.0 | 16.93 s | 6.64e-4 | Passed |
One real, timed solve per stage count (median-of-repeats isn't practical here — a rigorous MESH column solve is second-to-tens-of-seconds scale, unlike a millisecond control-law solve) — measured on this server, not fabricated.
Scripted from Python
The same engine, called from the flowsim SDK.
from flowsim.sdk import FlowSimClient
client = FlowSimClient()
sim = client.create_simulation("Ethanol-water column", flowsheet)
client.run(sim["id"])
print(client.streams(sim["id"])) # every stream table entry, straight off the converged columnSee it on your own process
Every number on this page comes from a real, converged flowsheet — open the workspace and run one yourself.