MaximaLabs
Back to gallery
Cooling-water effluent treatment plant

Cooling-tower blowdown treatment — lime dosing and what it will not remove — a BRINE process flowsheet

The stream cooling-water-utility-circuit sends to effluent, treated. Concentrated blowdown (4 cycles on a hard makeup, plus zinc from a corrosion-inhibitor programme) is dosed with lime to pH 10.5, and the metals that can drop as hydroxides do.

A separate flowsheet on purpose. This runs on the brine electrolyte package with the ions as real components; the cooling loop runs on steam with water alone. Carrying hardness as flowsheet components changes the thermodynamics of every stream it touches, so the loop keeps its water model and the treatment plant gets the one it needs — which is also how the two are engineered and operated in a real plant.

The result is mostly a lesson in what hydroxide precipitation cannot do. Magnesium goes from 2100 to 10 ppm-equivalent (99.5% removed) and zinc is essentially complete, leaving a sludge that is 91% Mg(OH)2 and 9% Zn(OH)2. Calcium does not move at all — it enters at 0.0042 mole fraction and leaves at 0.0042. That is correct, not a failure to converge: Ca(OH)2 is far too soluble to precipitate at this pH, and removing calcium needs carbonate — soda-ash softening — which is a different reagent and a different chemistry from the one dosed here. A treatment report claiming lime alone softens a blowdown is describing something this model will not reproduce.

Sulfate likewise passes straight through: it leaves with the clarified water, which is why blowdown salinity is a discharge-consent question rather than something a precipitation stage fixes.

Bounded: equilibrium Ksp at a dosed pH (see ``), with no self-consistent pH from the metal hydrolysis itself, a dilute-liquor volume estimate, and B-dot activities. The lime reagent is a circuit condition rather than a tracked feed, and the gypsum a real lime circuit throws is not modelled. Sludge dewatering is absent deliberately: the precipitator's solid outlet carries no entrained water, so a thickener placed after it would be splitting a dry stream and reporting a 'recovered water' that is 100% hydroxide.

20 views 2 forks

Blowdown
feed
clarified
sludge
LIME Stage
Sludge
Clarified
What this showcases
  • Rigorous BRINE thermodynamics, solved by the same engine every simulation runs on.
  • 1 unit operations modeled: LIME Stage.
  • Focus areas: Water treatment, Effluent, Precipitation, Cooling water, Electrolytes.
Specification
Thermodynamics
BRINE
Components
water, ca, mg, zn, so4
Unit operations
LIME Stage
Open in workspace

Opens in a new tab, loaded straight into the app — no setup.

Read the step-by-step guide
Python SDK

Reproduce 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("blowdown-effluent-treatment")
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

Butte, Montana, USA

Acid-mine-drainage neutralization: staged lime precipitation

Acidic, metal-laden mine water (dissolved ferric iron, aluminium, nickel and zinc over a sulfate background) is cleaned in a two-stage lime-neutralization circuit — the classic hydrometallurgy / water-treatment precipitation train. Stage 1 doses to pH 4.5, where ferric iron (Fe(OH)3, pKsp 38.6) and aluminium (Al(OH)3, pKsp 33.0) drop out as a sludge while the base metals stay dissolved; stage 2 raises the liquor to pH 9.5, where nickel (Ni(OH)2) and zinc (Zn(OH)2) precipitate, leaving a clarified effluent. Both stages are the new precipitator unit op wrapping the codebase's CRC-cited metal-hydroxide solubility-product chemistry (thermo/electrolytes.hydroxide_precipitation) — dose to a pH setpoint, read off what drops out — the same selective-precipitation workflow a real neutralization plant runs.

Chemical plant cooling-water utility

Hybrid cooling — a closed circuit isolated from the tower by a plate exchanger

Three loops in series, and the middle one is the point. The process is cooled by a closed circuit of treated water that never contacts air; that circuit rejects its heat across a plate exchanger into an open evaporative circuit; and only that outer circuit goes to the tower and loses water. Why a plant pays for the extra exchanger: open cooling water picks up oxygen, airborne dirt and biology, and concentrates its dissolved salts every cycle. Putting that water through a reactor jacket or a condenser is what fouls and corrodes them. The closed loop stays clean, stays at pressure, and its inventory never concentrates — so the equipment the process actually touches sees water that does not scale. Solved here: the process leaves at 318 K, the closed circuit picks that up (303 → 320 K) and is knocked back to 306 K across the plate exchanger, the open circuit takes it (301 → 311 K) and the tower returns it to 301.15 K at a 4.0 K approach to a 297.15 K wet bulb. Water loss appears only in the open circuit — the closed one leaves with exactly the flow it entered with, which is the whole claim made arithmetic. The tower also reports its scaling limit from the makeup analysis: this water saturates in calcite at 2.2 cycles, so the 4 cycles configured here shows negative headroom — a real operating conflict, left visible rather than tuned away. Bounded: steady state, so there is no basin inventory and no level control (a level is only meaningful in the dynamic engine). Fouling is not modelled — the argument for the closed loop is made by the chemistry, not by a fouling rate. Feeds and returns are open rather than recycled, the same convention cooling-water-tower uses.

Chemical plant central cooling-water system

Cooling-water utility circuit — treatment, dosing, consumers, blowdown

A whole cooling-water utility rather than a single tower: raw water is filtered, dosed, and joins a circulating header that a pump pushes through three consumers with different duties — a reactor jacket, a condenser and a compressor intercooler — before the warmed return goes to the tower and a blowdown draw-off leaves for effluent treatment. The number worth checking is the consistency between the two halves. The tower computes the blowdown it needs to hold 4 cycles of concentration (32.1 mol/s) and the makeup that implies (128.3 mol/s); the drawn blowdown split and the sized raw-water intake match those to under 1.5%. A circuit whose blowdown valve and cycles disagree is the commonest way a real plant silently runs at a different concentration than its water chemistry was designed for, and the flowsheet is arranged so you can see them agree. Solved: 300 m3/h circulating at 301.15 K, split 45/35/20 across the three exchangers, returning mixed at 312 K for an 11.0 K tower range at a 4.0 K approach. What is drawn but not modelled, stated plainly. The biocide, scale-inhibitor and corrosion-inhibitor streams are real streams carrying real flow, and their chemistry is not simulated — no inhibitor efficacy, no biological control, no corrosion rate exists in this tool. They are here because a utility flowsheet without them misrepresents the plant, not because dosing more of them will change a number. The scale risk that IS quantified comes from the tower's saturation indices against the makeup analysis, and on this water it says calcite saturates at 2.2 cycles — below the 4 being held. Blowdown leaves to a product labelled for effluent treatment; the treatment train itself is not modelled, because carrying dissolved hardness as flowsheet components requires an electrolyte package and would change the thermodynamics of the entire water loop. And there is no basin: steady state has no inventory, so a sump level and its controller belong to the dynamic engine.

Permian Basin, Texas, USA

Produced-water scale removal: precipitation + thickener dewatering

Oilfield produced water carries the classic mineral-scale ions — barium and strontium against sulfate (barite BaSO₄ / celestine SrSO₄, the notorious hard sulfate scales that plug tubing and need milling to remove) plus calcium against carbonate and sulfate (calcite / gypsum). A precipitation stage throws every over-saturated scale mineral at once — the precipitator unit op keyed on its CRC-cited solubility-product table, with each mineral removing BOTH its metal cation and its anion from the water — and a gravity thickener then dewaters the slurry into a dense underflow sludge and a clarified overflow. The barium (the worst offender) comes out essentially completely as barite.

Antofagasta, Chile

Copper recovery from a leach residue: CCD washing + hydroxide precipitation

A leach residue leaves a heap/tank-leach circuit as a slurry — insoluble gangue solids carrying entrained copper-sulfate pregnant liquor that would be lost to tailings if simply thickened. A counter-current-decantation (CCD) wash train recovers it: the residue is washed with clean water flowing counter-current to the solids across a chain of thickeners, so the dissolved copper is displaced into a pregnant-liquor overflow while the washed solids go to tailings. The new ccd_washer unit op models the whole train in one block via the classic counter-current washing equation f = (R-1)/(R^(N+1)-1) (Perry's §18; Coulson & Richardson Vol. 2): five stages at a wash ratio near 4 recover ~99.9% of the dissolved copper, leaving only ~0.08% with the tailings. The pregnant liquor is then dosed to pH 8, where the copper drops as Cu(OH)2 sludge (the precipitator op on the CRC-cited solubility-product chemistry), leaving a barren raffinate for recycle.

Cooling-water distribution header

Pressure-controlled cooling-water header

A distribution header held at pressure by a control valve, rather than a valve with a pressure typed into it. A pressure transmitter reads the header downstream of the distribution line, a controller compares it with the 4.5 bar setpoint, and its output is written back into the valve — the flowsheet is re-converged until the manipulated variable and the measurement agree. What makes it a real loop rather than a tautology is the line between them. The transmitter sits 180 m downstream, so the valve cannot simply be set to the setpoint: it has to sit above it by exactly whatever the line is losing, and the controller has to find that. Solved here, it lands at 462.1 kPa at the valve for 450.0 kPa at the header — a 12.1 kPa line loss it was never told about — in 5 control passes. The controller runs in integral mode, so the steady-state offset a proportional-only controller would leave is driven to zero: the header sits at the setpoint to the last significant figure, not near it. One detail worth copying if you build your own: the pipeline carries an explicit molar_mass. Darcy-Weisbach needs mass density and ThermoPkg.density returns mol/m³, so a line without it inflates its pressure drop by roughly 1/M — about 55x for water. It warns, but the warning is easy to miss, and 12 kPa became 587 kPa while this example was being built. Bounded: steady state, so this finds the operating point a controller settles at, not the transient getting there — no overshoot, no settling time, no derivative action. Those live in the dynamic engine. The consumer splits are fixed fractions, so this demonstrates pressure control, not flow redistribution when a user throttles.

Stop fighting legacy software. Build your first flowsheet in 60 seconds.