Crude unit: why a CDU needs pumparounds
A pumparound draws liquid off a tray, cools it, and returns it a few trays higher. It removes no material — its entire job is heat. This example solves the same atmospheric crude unit twice, with its two pumparounds and without, and the difference is not a matter of degree. With them the rigorous column converges and cuts correctly: every product is dominated by the pseudocomponent it is named for (naphtha cut_1, kerosene cut_2, diesel cut_3 at 0.857, residue cut_4 at 0.677), the cut ladder spans 134 K, the pumparound duty reads back as exactly the -7.00 MW specified, and the reboiler sits at +2.25 MW against a 1.25 MW condenser. It solves in about 5 seconds. Without them the rigorous energy-balance MESH does not converge at all at this operating point — it stalls at a residual of 7.9e-3 with a component balance off by 0.45. That is the honest result, and it is the whole point: the feed arrives at 660 K from the fired heater carrying far more enthalpy than the overhead condenser's 1.26 MW can remove, and with no pumparound to take the rest there is no operating point for the solver to find. What comes back instead is FlowSim's screening carve, the fallback model, which has no rigorous stage energy balance — and it says so, in a warning on the result. Its answer is worth looking at precisely because it is the degraded one: the naphtha cut comes back dominated by the second-lightest pseudocomponent rather than the lightest, the residue by cut_3 rather than cut_4, the ladder collapses from 134 K to 85 K, and the reboiler duty goes negative at -5.23 MW — the column asking to be cooled rather than heated. Those numbers are the carve's, not a rigorous solution's, and this example is built so you can see the difference between the two rather than be handed one as the other. A pumparound is only meaningful against a rigorous stage energy balance, so this example runs ns_energy and rigorous_draws: under constant molal overflow the vapour rates are PINNED, and removing heat provably cannot move an internal flow. Specifying a pumparound therefore switches the energy balance on for you. Bounded — read the size before you scale it up. This is 12 stages on 4 pseudocomponents because that is what the rigorous-energy path can currently afford: the same column at Brent's full 20 stages and 8 cuts did not converge in 48 minutes, against 115 s on the constant-molal-overflow path. The cost is the flash inner loop, which profiling puts at 82% of the solve, evaluated once per unknown per Jacobian (332 unknowns at that size) by finite differences — and on petroleum pseudocomponents that loop is pure Python, because CoolProp has no entries for them. Analytic K-value derivatives are the fix at this size; the dense Jacobian's O(n^3) factorization is what binds at full commercial scale. Both are known, and this example is deliberately small rather than quietly slow.
The flowsheet
The solved topology — every unit op's real duty, conversion, or split, read straight off a genuine converged solve.
The stream table
Every stream's flow, temperature, pressure, and composition — real converged numbers, not placeholders.