Desiccant rotor HVAC — three-stage low-grade heat recovery — a PENG-ROBINSON process flowsheet
A desiccant dehumidification rotor whose regeneration air is preheated by three low-grade heat sources in ascending temperature order: a PVT (photovoltaic-thermal) collector loop at 40 °C, condenser heat rejected by the chiller at 50 °C, and a district-heating return at 55 °C. Cascading them warmest-last is the whole point — each coil lifts the air as far as its own source can reach, so the 55 °C district return is spent only on the final lift instead of being wasted on air that is still at ambient.
Every coil leaves a 5 K approach at its hot end, which is what makes this solvable: a cold stream can never leave an exchanger hotter than the hot stream entering it, and in a series train each coil's outlet is the next one's inlet, so a target that looks reasonable in isolation becomes impossible two units downstream. The hot-side flows are sized so the water gives up its duty over a modest ΔT and stays above the air at the cold end as well — specifying the approach alone is not enough if the heat-capacity flow rates don't support it.
The rotor's two halves are custom_block equation blocks (the regen side and the process side), and the process air is finished to a 16 °C supply condition by the evaporator coil.
242 views 1 forks
- Rigorous PENG-ROBINSON thermodynamics, solved by the same engine every simulation runs on.
- 3 unit operations modeled: 3× District Coil, 2× Dehum Section, Evap Coil.
- Focus areas: HVAC, Heat recovery, Desiccant, Pinch.
- Thermodynamics
- PENG-ROBINSON
- Components
- air, water
- Unit operations
- 3× District Coil2× Dehum SectionEvap Coil
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("desiccant-rotor-hvac-heat-recovery")
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
Solid-sorbent fluidized-bed DAC with compression heat recovery
A second, lower-temperature DAC pathway alongside the liquid-KOH + rotary-kiln example: the captured CO₂ loads onto a solid sorbent, which regenerates in an indirectly-heated fluidized bed (real Wen-Yu minimum-fluidization sizing + Arrhenius desorption kinetics, the FluidizedBed) at 120 degC — the real low-temperature regime solid amine/physisorbent DAC sorbents actually use, versus the other example's ~977 degC calcination. The bed is fluidized by a recycled CO₂ sweep (self-sweep with product gas, a real design choice that sidesteps needing a steam-condensate knockout step). The desorbed CO₂ is compressed toward liquefaction pressure in one adiabatic stage — hot enough (~780 K discharge) that routing it through a heat exchanger against process utility water genuinely converts that water from subcooled liquid to a boiling mixed-phase stream before the CO₂ continues on to the same real liquefaction physics as the other DAC example.
Multistream exchanger: one core, three streams, one free outlet
A cryogenic cold box is not a network of two-stream exchangers — it is one brazed-aluminium core with several streams exchanging heat simultaneously, and the multistream exchanger models it as such. Three streams share this core: 300 mol/s of 300 K feed gas being chilled, 250 mol/s of 190 K residue gas being rewarmed, and 60 mol/s of 200 K cold liquid. You specify outlet temperatures for all but one — 225 K for the feed gas, 280 K for the residue — and the remaining stream is the free one: its outlet, 230.1 K, is not specified but SOLVED, because it is what closes the adiabatic energy balance across the core. That is the correct number of degrees of freedom for an adiabatic exchanger, and specifying all three would over-specify it. The 1.08 MW duty and a composite-curve pinch check against a 3 K minimum approach come with it, so a specification that would need heat to flow the wrong way is rejected rather than reported. Bounded: this is a thermal feasibility and duty model, not a mechanical design. There is no core geometry, no layer stacking, no fin type, no per-stream pressure drop from passage dimensions — a real cold box datasheet needs all of those, and a vendor computes them from proprietary correlations.
Industrial steam boiler with capacity control
A natural-gas-fired water-tube boiler raising 50 t/h of steam at 42 bar and 400 C, with its three circuits and its capacity control on one flowsheet. Fuel: methane at 3 bar to the windbox. Combustion air / flue gas: an FD fan and a regenerative air preheater feed the burner at 15% excess air; the flame (adiabatic, 2252 K) then gives up its heat to the radiant evaporator, the superheater, the economizer and the air preheater in turn, and leaves the stack at 377 K with 3.0% O₂ dry. Steam: deaerated feedwater is pumped to 48 bar, warmed in the economizer, boiled in the evaporator and separated in the drum; saturated steam is superheated to 672.2 K and 2% is blown down. Capacity control: a steam-flow controller (FIC, integral action) sets the firing rate to hold the steam demand, a ratio station keeps combustion air at 15% excess, and the drum-level balance makes feedwater equal steam plus blowdown. At design it fires 49.92 mol/s of fuel (40.0 MW LHV); the evaporator takes 25.3 MW, the economizer 7.7 MW and the superheater 5.7 MW, for a direct efficiency of 96.7% LHV / 87.1% HHV. The heat-transfer banks are rated by UA, so a change of load redistributes the heat instead of reproducing it: run the sensitivity (70-100% load) and the superheat falls from 673 K to 605 K at 70%. Property method: pr-steam, Peng-Robinson for the gas with IAPWS-95 steam tables for pure water; plain Peng-Robinson puts 18% too little heat in the superheater. Bounds: no radiation or casing loss (a real boiler loses 1-2%, so efficiency reads high, and more so at part load); no dissociation in the flame; the radiant section is a fixed-UA exchanger, which overstates its absorption at deep turndown; no attemperator; and level and ratio control are the steady-state balances, not dynamic loops.
Geothermal flash-steam power plant (~90 MW)
A single-flash geothermal power plant on the IAPWS steam tables. A liquid-dominated geothermal well arrives at 240 °C / 35 bar and flashes across a separator down to 8 bar: about 15% of the brine becomes saturated steam and the rest is reinjected. The steam drives a condensing turbine to a 10 kPa vacuum (82% isentropic, exhaust quality ~0.9 — a real wet-steam expansion), a water-cooled condenser drops it to ~46 °C condensate, and a hotwell pump lifts it for reinjection alongside the brine. It converges to 89.9 MW of turbine shaft power. The separator (flash) pressure is the plant's key design knob: the defaultSensitivity sweeps it, trading a larger steam fraction at low pressure against higher steam enthalpy at high pressure — the flash-pressure optimization every single-flash geothermal plant makes. It runs on the rigorous IAPWS-95 water properties (steam package), and the turbine tracks steam quality into the two-phase dome rather than assuming a dry expansion.
District-heating stratified thermal store (charge and discharge)
A stratified hot-water thermal energy store on a district-heating loop, shown at one operating point in both directions. The charge leg sends 90 °C supply water through the store, which is standing at four layers of 350 / 335 / 320 / 305 K (hottest on top): the water exhausts in contact with the coldest layer and leaves at 305 K, so the whole 85 K drop goes into the store. The discharge leg draws 30 °C network return through the same store and takes it from the hottest layer, leaving at 350 K. That asymmetry is the entire reason to stratify — a fully mixed store holding the same energy would deliver its 328 K average. The blocks report the stored energy above the 300 K floor, the state of charge over the 300-360 K window, the standing loss through an 80 W/K vessel, and the time to full or empty at the current net rate. Honest scope: this is a steady-state picture — the store's layers do not move within a solve, and the two legs are drawn as separate blocks on one store. The transient (how far the thermocline travels over a six-hour charge, and what outlet temperature the morning discharge actually delivers as the hot layers are consumed) is the Thermal energy storage analysis tool.
Data center cooling: 1 MW IT load on warm-water free cooling
A 1 MW data hall cooled the way modern halls are: a warm-water loop — chilled-water supply at 27 °C rather than the legacy 7 °C — picks up the IT heat (10 K rise at 24 kg/s), hands it across a plate exchanger to a condenser-water loop, and an evaporative cooling tower rejects all of it to an 18 °C wet bulb with a 6 K approach. No chiller runs: that is free cooling, and it is only possible because the supply is warm — a 7 °C loop cannot be served by a tower whose water cannot get below the wet bulb plus its approach, which is the whole reason the industry moved to warm-water and ASHRAE's wider allowable envelopes. The tower reports the numbers a data-center operator is judged on: 24.6 mol/s (0.44 kg/s) of evaporation and 32.8 mol/s of makeup water at four cycles of concentration — the water-usage effectiveness (WUE) story. Sweep the IT load and watch the makeup water scale with it. Honest scope: the IT load is a specified duty (no per-rack or airflow model); both loops are drawn open, supply to return, where a plant recirculates with makeup; the tower is a heat and water balance with a Merkel characteristic, not a fill-vendor rating; and a thermal_storage block on the chilled loop would give the ride-through buffer a real hall carries for a chiller or tower trip.