Your water
Enter it once — every answer below uses it.What are you treating?
Picks the chemistry that matters and highlights the right tools.Will this water scale?
How far it can concentrate before something drops out.
Enter or pick a water to see the limit.
What should I do?
The lever that lets it run — and what to check.
Segment chemistry
Sour, acid-drainage or oxygenated water carries scales the standard read doesn't cover.
Go deeper
The tools, in the order you'd use them. Highlighted for your segment.Every number carries its assumption. Simple hides the working; Expert shows it. Need the full console? Open the advanced console →
ca,mg,alk,... with a value row), a two-column field,value export, or an OLI Cloud/Process API JSON export (params.inflows, built to OLI’s public spec). Aliases like “Calcium”, “Alkalinity”, and ionic tags like “Ca+2” are recognised; anything else you map yourself. Imported data is tagged caller-supplied and validated — an impossible value is rejected, never guessed, and OLI inflows not in mg/L are refused rather than mis-converted.adsorption proxy · uncalibrated
Ca-binding proxy · uncalibrated
Segment species — sour / acid-drainage / boiler (optional; leave blank for cooling & RO)
Cycle limitiThe limiting salt sets the ceiling. Bisects to the highest cycles of concentration at which every phase stays under its practical limit. Run it with and without an antiscalant — the gap between the two is what the chemical actually buys you. Kinetically inhibited phases (dolomite, talc) are excluded: they are supersaturated almost everywhere and never form, so left in they would limit every answer.
How high can this water cycle before something drops out?
SensitivityiWhere to spend lab budget. Each input is perturbed and we watch the limiting phase move. Most analyses have one number doing all the work and several that could be badly wrong without changing the decision. This tells you which is which.
Which measurement is deciding that answer — and is it the one you trust least?
Thermal performance · approach-efficiency & fouling factoriWhat fouling has cost you in cooling capacity — from the temperatures you already log. Two textbook, deterministic reads. Tower effectiveness: range = hot-in − cold-out, approach = cold-out − wet-bulb, effectiveness = range/(range+approach) — a tower cannot cool below the wet bulb. Heat-exchanger fouling resistance: Rf = 1/Uservice − 1/Uclean, the added thermal resistance from deposits (Uservice entered, or derived from duty÷(area×LMTD)). The honesty seam: every quantity is closed-form heat-transfer arithmetic — no fitted model, no fabricated coefficient. The commissioning design approach and the clean-design U are ENTERED from your datasheet, never from memory; without a baseline the current metric still computes but the degradation / fouling-resistance piece is INCOMPLETE, never a fabricated default. Impossible readings (cold water below the wet bulb, a service U above the clean U) are flagged with a reason, never computed into a plausible-wrong number. Cooling only.
Turn your operating temperatures into a thermal-condition read — the tower's approach-efficiency and the exchanger's fouling resistance. Baselines are yours; nothing is assumed.
Silica carryover · limit & riskiHow much silica the boiler water may hold at your drum pressure to keep steam clean. Cited & deterministic: the ASME/ABMA boiler-water silica LIMIT falls with rising pressure (150 ppm at low pressure → 0.5 ppm above 2000 psig) to hold steam silica at the target (≤20 ppb; many turbines ≤10 ppb); and the pH DIRECTION on vaporous carryover (Babcock & Wilcox: 0.88 at pH 10, 0.74 at pH 11 vs pH 8.8; negligible below ~pH 9). Directional only: a coarse order-of-magnitude vaporous band by pressure (back-calculated anchors — not a calibrated ppm). Honest gaps: the EXACT vaporous ppm is not computed (no open closed-form coefficients — never fabricated) and MECHANICAL carryover is plant-specific (drum design/level/load/foaming) — confirm total carryover by steam-purity sampling (IAPWS TGD1-08). Boiler.
Check the cited ASME/ABMA silica limit for your pressure and the pH lever — with the exact vaporous ppm and mechanical carryover left as honest measurement gaps.
Disinfection CT · SWTRiRequired CT for log-inactivation of Giardia/viruses, and whether your contactor achieves it. Cited & deterministic: the EPA SWTR CT tables (free chlorine 3-log Giardia + 4-log virus anchors; the full ozone Giardia 3-log + virus 4-log CT tables, verified to USEPA 1991; relative strengths for chloramine/ClO₂). Honest gaps: off-anchor pH/temp/residual combinations route to the full EPA table (never fabricated); achieved CT needs the tracer-study baffling factor T10/T (never assumed); chlorine decay is site kinetics. Drinking water.
Look up the required CT and check the achieved CT against it — with off-anchor combinations and the baffling factor handled honestly.
UV disinfection dose · LT2iRequired UV dose for a log-inactivation credit, and the credit a delivered dose earns. Cited & deterministic: the EPA LT2 UV dose table (40 CFR 141.720(d)(1)) — Cryptosporidium / Giardia / virus, 254 nm low-pressure lamp. Honest gaps: credit requires a VALIDATED reactor (40 CFR 141.720(d)(2)/(3)) — this is the table dose, not a delivery claim; the table is in 0.5-log steps; other lamp types need equivalent-dose validation. Drinking water & wastewater effluent.
Look up the required UV dose for a target log-credit, or the credit a validated delivered dose earns.
Cryptosporidium CT · LT2 (ozone / ClO₂)iRequired Cryptosporidium CT for a log-credit, and the credit a delivered CT earns. Cited & continuous: the EPA LT2 CT tables + the CFR log-credit equations (40 CFR 141.720(b)) for ozone and chlorine dioxide, temperature-dependent. Honest gaps: defined for 0.5-30°C; achieved CT needs the tracer baffling factor (T10/T), never assumed; Giardia/virus SWTR CT is the separate CT tool. Drinking water.
Look up the required Cryptosporidium CT for ozone or chlorine dioxide at your temperature, or the credit a delivered CT earns.
Struvite saturation · P recovery / scaleiWhether magnesium-ammonium-phosphate (struvite) will precipitate — for phosphorus recovery or as nuisance scale. Cited & validated: PHREEQC minteq.v4 aqueous model + the Ohlinger 1998 struvite solubility product (pKso 13.26); validated so SI=0 at saturation and the SI tracks the cited constant. Honest gaps: SI is the thermodynamic driving force only — precipitation kinetics / induction time are not predicted; needs Mg + ammoniacal N + phosphate present. Wastewater.
Enter Mg, ammoniacal N and phosphate to see the struvite saturation index — supersaturated means struvite will tend to precipitate.
ASM2d simulator · bio-P / nitrificationiThe IWA ASM2d activated-sludge model (Henze 1999): biological P removal (PAOs, poly-P, PHA), nitrification, denitrification, chemical P precipitation. Faithful & validated: the 50 parameters, 130-entry stoichiometric matrix and 21 rate laws were extracted programmatically from the WaterTAP open-source implementation (no hand-transcription); EVERY reaction conserves N and P exactly, integrated with a stiff BDF solver, and the anaerobic bio-P release signature is correct. Honest gaps: single completely-mixed reactor; DEMONSTRATION on a typical influent by default — a live-plant result needs the plant’s influent characterisation + calibrated parameters. Wastewater.
Run the ASM2d biological-treatment dynamics on a demonstration influent (override the key influent values to explore).
ASM3 simulator · internal storage / nitrificationiThe IWA ASM3 activated-sludge model (Gujer 1999): the ASM1 successor built around internal storage (X_STO) — hydrolysis, aerobic/anoxic substrate storage, growth on stored material, endogenous respiration, autotrophic nitrification. Faithful & validated: the 20 C parameters, stoichiometric matrix and 12 rate laws were extracted programmatically from the WaterTAP open-source implementation + its property package (no hand-transcription); EVERY reaction conserves N exactly, integrated with a stiff BDF solver. Honest gaps: single completely-mixed reactor; DEMONSTRATION on a typical influent by default — a live-plant result needs the plant’s influent + calibrated parameters. Wastewater.
Run the ASM3 storage-based treatment dynamics on a demonstration influent (override the key influent values to explore).
ADM1 simulator · anaerobic digestion (biogas / VFA / pH)iThe IWA ADM1 model (Batstone 2002): disintegration, hydrolysis, inhibited uptake (sugars/amino-acids/LCFA/VFAs/hydrogen) and decay, with the acid-base pH solver and the full inhibition system (pH, H2, free ammonia, inorganic-N). Faithful & validated: the 84 parameters, Ci composition vector, stoichiometric matrix and 19 rate laws were extracted programmatically from the WaterTAP implementation + property package; EVERY reaction conserves COD, carbon AND nitrogen exactly, pH is solved from the ADM1 charge balance, and the gas-liquid transfer layer (Henry's-law H2/CH4/CO2 transfer to a biogas phase + pressure-driven gas outflow, ported from the WaterTAP AD unit) produces biogas with a COD budget that closes across liquid + gas — integrated as a continuous CSTR with a stiff BDF solver. Honest gaps: single completely-mixed reactor; DEMONSTRATION feed by default — the biogas composition + yield depend on the digester's characterised feed and HRT/SRT, so a live-digester result needs the plant's own feed + calibration. Wastewater.
Run the ADM1 anaerobic digester (VFA / methane / pH / biogas) on a demonstration feed (override the key values to explore).
Two-step nitrification · shortcut-N (AOB / NOB)iThe AOB/NOB split of the single-step nitrifier — the structural basis for partial nitritation / shortcut nitrogen removal. Two Monod populations: AOB (NH₄⁺→NO₂⁻, nitritation) and NOB (NO₂⁻→NO₃⁻, nitratation), each O₂- and substrate-limited. What is fixed & validated: the STOICHIOMETRY — the oxygen demands come from the redox electron balance, not a fit (nitritation 3.43, nitratation 1.14 g O₂/g N; total 4.57); every process conserves nitrogen exactly and the O₂+COD balance closes exactly. What is calibration-gated (stated, not hidden): the KINETIC parameters. Unlike ASM1/ADM1, two-step nitrification has no IWA-canonical parameter set — reported AOB/NOB growth rates, affinities and yields vary 2–10× across studies because they are estimated per-site by respirometry. The defaults here are LABELLED representative literature values (cited), overridable, NOT a validated canonical set; a live result needs your plant's calibrated kinetics. Lowering the DO setpoint raises the peak nitrite fraction (the shortcut-N signal), because NOB are more DO-limited than AOB. Wastewater.
Run the two-step nitrification dynamics (nitritation + nitratation) on a demonstration influent — validated stoichiometry, representative kinetics you calibrate; drop the DO setpoint to see the shortcut-N (nitrite-accumulation) signal.
Pyrite oxidation · acid generationiRate of pyrite oxidation and AMD acid generation. Cited & validated: the Williamson & Rimstidt (1994) dissolved-oxygen rate law r = 10⁻⁸·¹⁹·[DO]⁰·⁵·[H⁺]⁻⁰·¹¹ (valid pH 2-10), reproducing the published worked example; FeS₂ → 4 H⁺ stoichiometry. Honest gaps: ABIOTIC — acidophile (Acidithiobacillus) catalysis can raise the rate ~1-2 orders of magnitude (gated); a volumetric acid rate needs the reactive pyrite surface area (m²/L); below ~pH 3-4 the faster Fe(III) path dominates (not modelled). AMD.
Enter dissolved oxygen and pH for the abiotic pyrite oxidation rate; add reactive surface area for the acid-generation rate.
PbO₂ scale stability · lead releaseiWhether the protective lead(IV)-oxide (PbO₂) pipe scale is thermodynamically stable. Cited & validated: the PbO₂/Pb²⁺ redox boundary E0 = 1.46 V vs SHE (Schock & Lytle potential-pH), reproducing the free-chlorine-stable / chloramine-release mechanism (Washington DC 2001-2004). Honest gaps: THERMODYNAMIC boundary only (not the dissolution rate); Eh must be vs SHE (convert an ORP probe reading first); uses a reference Pb activity; relevant only where a PbO₂ scale already exists. Drinking water.
Enter pH and the water Eh (mV vs SHE) to see whether the protective PbO₂ scale is stable or at risk of reductive dissolution (lead release).
Pourbaix E-pH domain · lead / copperiClassifies a (pH, potential) point as IMMUNE (bare metal stable), CORRODING (soluble ion), or PASSIVATED (protective oxide) — the full E-pH stability map that OCCT turns on. Cited & validated: Nernst boundaries with verified standard potentials (Pb²⁺/Pb −0.126 V, Cu²⁺/Cu +0.342 V, PbO₂/Pb²⁺ 1.46 V) plus the water-stability lines; composes the PbO₂ boundary and the lead/copper solubility direction. Reproduces the OCCT mechanism — high ORP (free chlorine) → PbO₂ passivation; lower ORP (chloramine) → soluble Pb²⁺ (Washington DC). Honest gaps: key-species map (metal / divalent ion / protective oxide) at 25°C — not every minor hydroxo-complex; a THERMODYNAMIC map, not a rate (kinetics & exact carbonate/phosphate phase out of scope); Eh must be vs SHE. Drinking water.
Enter the metal, pH and water Eh (mV vs SHE) to place the point on the E-pH map — immune, corroding, or passivated — with the boundaries and the OCCT implication.
Corrosion rate from LPR · Stern-GearyiGeneral corrosion rate from a linear-polarization-resistance probe. Cited to the digit: Stern-Geary i_corr = B/Rp (Stern & Geary 1957) and ASTM G102 penetration rate CR = 3.27×10⁻³·(i_corr/ρ)·EW. Honest gaps: Rp is your MEASURED probe reading; B needs the Tafel slopes (else the labelled 26 mV active-corrosion assumption); this is the GENERAL/uniform rate — localized/pitting corrosion can be far higher and is not captured. Industrial metal systems.
Enter a measured polarization resistance to get the corrosion rate in mm/yr — with the Tafel/B assumption stated honestly.
Legionella risk · temperature + count + QMRAiTemperature-driven Legionella risk, an optional measured-count screen, AND a quantitative infection-risk (QMRA). Cited: CDC / ASHRAE 188 temperature bands (dormant <20°C; growth 20-45°C, highest 35-42°C; die-off 50-60°C; killed ≥60°C). Optional concentration screen vs a health-based bulk-water threshold. QMRA: the exponential dose-response P=1−exp(−k·dose) with k verified to the digit against the QMRA Wiki / CAMRA (infection k=5.99e-2, ID50 11.6 CFU; Armstrong & Haas 2007; Hamilton et al. 2018 framework) — give a deposited dose, or a measured concentration + the scenario exposure factor, for a per-exposure + annual infection risk with a parameter-uncertainty band and the EPA 10⁻⁴ benchmark. Honest gaps: temperature is ONE control; the exposure factor (aerosolisation×inhalation×deposition×duration) is scenario-specific and never defaulted; the dose-response is animal-derived and screening-level, not clinical. Cooling towers & drinking-water premise plumbing.
Enter the water temperature for the risk band, a measured count for a screening check, and (for the QMRA) a deposited dose or concentration + exposure factor for a quantitative infection risk.
Corrosion by mechanism · O₂ / under-deposit / MICiBounds general-water corrosion by mechanism — never a fabricated rate. O₂: the oxygen mass-transfer limiting current i_lim = n·F·k_m·C_O₂ converted by ASTM G102 (0.457 mpy per µA/cm², iron) gives an UPPER BOUND that scales ~linearly with dissolved O₂ and rises with flow; low chloride carries a passivation caveat (never under-predicts). UDC: no predictive rate model — a Larson-Skold + differential-aeration susceptibility and an acceleration-factor framing, with a measure-this gap. MIC: monitored not predicted — a likelihood + a labelled published band + a hard measurement gap (NACE/AMPP TM0212/TM0194). Complements the measured coupon and the CO₂ envelope. All segments.
Bound O₂ corrosion from an oxygen ceiling, and read UDC / MIC as susceptibility + an honest measure-this gap — never a fabricated point rate.
SDI / pretreatment screeningiIs this water fit to feed the membranes? The Silt Density Index — the standard RO feedwater fouling-potential screen, computed exactly from ASTM D4189: %P = (1 − ti/tf)×100, SDIT = %P/T. The honesty seam: the SDI is exact ASTM arithmetic — no fitted model, no fabricated coefficient. The ASTM validity is enforced: above 75% plugging the result is unreliable and flagged (repeat with a shorter T), never reported as a plausible-wrong SDI. The acceptability band uses the spiral-wound guideline (SDI15 warranty ≈5, preferred ≈3) as a LABELLED default, overridable by your membrane's own warranty limit — never dressed up as calibrated to a plant. The pretreatment recommendation is a class from published selection practice; the SDI a pretreatment will ACHIEVE is never predicted — that needs a pilot. RO-only (the test is defined for pressure-driven membrane feedwater).
Run the bench test into a fouling-potential band — and, where the water isn't fit, the class of pretreatment to consider. Limits are the guideline default or yours; nothing is assumed.
NORSOK M-506 · CO₂ corrosion rateiA second published CO₂-corrosion band, beside the de Waard–Milliams estimate. NORSOK M-506's semi-empirical rate for carbon steel: CR (mm/yr) = Kt·fCO₂0.62·(S/19)0.146+0.0324·log fCO₂·f(pH). The honesty seam is the point of this tool: the method is assembled deterministically here — CO₂ partial pressure by Dalton (x·P), fugacity, the shear term, the product — but the two most error-prone, strongly-tabulated NORSOK constants are NEVER supplied from memory: Kt (the 9-point temperature table) and f(pH) (the pH polynomials) are ENTERED from your copy of the standard. They are standardized values in the same class as ASME limits — reproducing a safety-relevant published polynomial from memory, subtly wrong, would be worse than requiring it. Without Kt the rate is INCOMPLETE. The stable method exponents (0.62, 0.146/0.0324) are LABELLED NORSOK defaults, overridable — verify against the standard. The fugacity coefficient and f(pH) default to a conservative 1.0 (LABELLED); enter the real values. This is a published-model ESTIMATE, not calibrated to your field, and it can diverge from de Waard–Milliams; localized/pitting attack, H₂S/sour cracking and inhibitor availability are not covered. Sour (O&G) only.
Assemble the NORSOK M-506 rate deterministically — you supply the standard's Kt and pH factor; nothing is invented. A second band beside de Waard–Milliams.
de Waard–Milliams · CO₂ corrosion rateiThe classic empirical CO₂-corrosion model, beside NORSOK M-506. Carbon-steel corrosion in wet CO₂: log₁₀(Vnomo) = 5.8 − 1710/T + 0.67·log₁₀(fCO₂), with the CO₂ fugacity coefficient log₁₀(a) = (0.0031 − 1.4/T)·P and an optional pH factor FpH = 10^(0.31·(pHsat−pH)). Fully closed-form & validated: unlike NORSOK (whose Kt is a table you enter), every term is computed from the published de Waard–Lotz–Milliams (1975/1991/1993) equations — the coefficients are transcribed from the papers, nothing is entered from a table and nothing is supplied from memory. Honest gaps (stated, not hidden): the nomogram is a WORST-CASE estimate — above the ~60–80°C scaling temperature a protective FeCO₃ film forms and this model has no scale factor, so it OVER-predicts there (NORSOK's Kt captures that roll-off — that is why the two run together); the flow-dependent 1995 mass-transfer term, and inhibitor/glycol/oil-wetting factors, are not included (they need flow/site data); localized/pitting attack and H₂S/sour cracking are out of scope. Sour (O&G) only.
Compute the de Waard–Milliams CO₂-corrosion rate closed-form — a conservative worst-case band beside NORSOK M-506; nothing is entered from a table or invented.
Stiff-Davis S&DSI (ASTM D4582)iThe high-salinity CaCO₃ scaling screen. S&DSI = pH − pCa − pAlk − K, for brines / RO concentrate where the LSI is invalid.
pCa, pAlk and the ionic strength are computed here; you supply K from the ASTM D4582 chart — nothing is invented.
Produced-water sulfate scaling (barite / celestite / gypsum)iThe scale type the carbonate reads miss. Ba/Sr/Ca meeting SO₄ — the incompatible-water problem (sulfate-rich seawater injection + Ba/Sr formation water).
Saturation direction per mineral from Ksp (the engine's wateq4f.dat) — the direction is robust; at brine strength the magnitude defers to PHREEQC.
Breakpoint / chloramination doseiThe Cl₂:NH₃-N dosing chemistry behind microbial control. Monochloramine, the breakpoint, and free vs combined residual.
Stoichiometric doses to monochloramine and to breakpoint — the ratios are derived from the reactions, and the water’s chlorine demand is a declared gap you add on top.
Larson-Skold corrosivity indexiAggressive vs buffering anions. (Cl + SO₄) against (HCO₃ + CO₃) for mild steel — a corrosivity tendency, not a rate.
Exact ratio of the aggressive anions to the buffering alkalinity — empirical (Great Lakes), so a directional screen, never a corrosion rate.
Ryznar & Puckorius indices (RSI / PSI)iScale-vs-corrosion screens. RSI = 2·pHs − pH; PSI uses an equilibrium pH so it captures buffering.
Two classic indices off the Langelier saturation pH — PSI reflects how well (or poorly) the water is buffered, which the measured-pH read alone misses.
SWRO boron · speciation & pH leveriThe hard analyte in desalination. Uncharged boric acid passes membranes; charged borate is rejected. Rejection is an acid-base lever.
Boric-acid vs borate speciation from the cited pKa — the two-pass high-pH lever — with the permeate honestly needing the membrane’s element rejections.
CCPP · calcite precipitation potentialiThe MASS, not just the direction. How much CaCO₃ (mg/L) will precipitate or dissolve to reach calcite equilibrium — solved by PHREEQC.
Where the LSI/S&DSI indices give a direction, CCPP gives the precipitable mass — equilibrated in the engine, not a hand-rolled solver.
DBP trade-off (THM / HAA)iThe other side of chlorination. Free chlorine + organic matter forms trihalomethanes and haloacetic acids. The design read — not a fabricated formation number.
Precursor character (SUVA), the formation drivers, the chloramine/coagulation levers and Stage-2 compliance — the magnitude is honestly a bench test, never invented.
Silica ceiling & pH leveriThe wall that caps your cycles. Amorphous-silica solubility limits how far you can concentrate; raising pH lifts the wall.
How close the water is to the amorphous-silica solubility limit — and how much raising pH lifts it — derived from the engine’s own SI(SiO₂(a)).
Enhanced coagulation (TOC removal)iThe DOC-side lever on DBPs. Removing the organic precursor by coagulation, against the EPA Step 1 requirement.
The regulatory required TOC removal (EPA Step 1 matrix) and coagulability — the dose itself is a jar test, never invented.
Desalination energy (SEC) · the flooriThe energy the physics demands. The reversible minimum specific energy for RO, and how recovery drives it.
The thermodynamic-minimum SEC vs recovery — the reversible floor real plants run 2.5-4× above — the energy companion to the boron read.
Activated sludge · SRT & nitrificationiThe wastewater design point. Minimum SRT for nitrification, effluent quality, sludge and oxygen — steady-state, on cited adjustable kinetics.
The steady-state activated-sludge design — the master BNR variable (SRT for nitrification) plus effluent, sludge and O₂ — the foundation of the wastewater platform.
ASM1 dynamic simulatoriThe dynamic layer. The full 13-state IWA Activated Sludge Model No. 1 integrated to steady state (or over a horizon) for a single DO-controlled CSTR with biomass retention. On the BSM1 benchmark default parameters — cited and adjustable, not fixed truth. Soluble effluent quality is the output; the full BSM1 plant + secondary clarifier are the next layer.
Simulate the activated-sludge biology dynamically — nitrification, denitrification and biomass over SRT, DO and temperature, on the ASM1 state model.
Cycles balanceiThe only thing here that measures a RATE. Chloride and conductivity concentrate but never precipitate; calcium does. So cycles measured on calcium reads LOW when calcium is leaving the water, and the gap is the deposition rate. If calcium and alkalinity fall by the same fraction, that is CaCO₃ stoichiometry — the pattern names the scale, not just its presence.
Steps 01 and 02 are theory. This is what your tower is actually doing.
Program costiThe operator’s question is economic. Acid, antiscalant, or fewer cycles — priced per day. Water and acid are arithmetic. The antiscalant line assumes a 5 ppm dose, which this product cannot justify — thermodynamics does not set a dose. Its ranking is indicative until dose-response data exists.
So what do you do — and what does each option cost per day?
Correlation · identify the depositiThree instruments, one tower, and they share no inputs. Thermodynamics ranks the phases by driving force — it says what could form. The ion ledger from step 03 says which ions are leaving, from your logbook. The phosphorus ledger says whether phosphorus is involved and whether your oxidiser is the reason. Joined, they identify the deposit stoichiometrically: calcium and alkalinity leaving 1:1 is a carbonate; calcium and phosphate at 5:3 is apatite; magnesium and silica at 4:6 is sepiolite. The ratios are the mineral formulae — nothing is fitted. Today you identify a deposit by sending a scraping to a lab and waiting weeks for XRD.
What is the scale actually made of — and do two independent methods agree?
Binding constraint · what actually limits cyclesiThe cycle ceiling is rarely the scale you watch. Step 01 finds the chemistry ceiling. But as the tower concentrates, three kinds of limit tighten at once: scale saturation, biocide holding time (residence time — a microbiological risk factor for your assessment, not a Legionella prediction), and your discharge consent (blowdown concentration against your permit). The first to bind sets the real ceiling — and it is often the discharge consent, or apatite created by your own corrosion inhibitor, not carbonate. This couples treatment to environmental compliance in one envelope; scale-prediction tools model these separately, so the true ceiling stays hidden. Discharge consents are entered by you from your permit — never supplied from memory.
Five constraints tighten as you concentrate. Which one stops you first?
Segment chemistryiFor sour, acid-drainage and oxygenated waters. When the water carries dissolved sulfide (O&G sour), low-pH metals (mining acid drainage), or dissolved oxygen (boilers), the engine runs the WATEQ4F thermodynamic database to evaluate the phases those segments care about — barite and iron-sulfide scaling, aluminium-hydroxide and jarosite, and oxygen redox. Phases that are thermodynamically favoured but kinetically too slow to form now are flagged as watch-indicators, never as present risk. The saturation thermodynamics are validated against the database; per-site dose calibration is not yet earned.
Sour, acid-drainage, or oxygenated water? The segment-specific scales appear here.
Net acidity · does this water self-neutralise?iThe entry point for acid mine drainage. Net acidity — not pH — decides whether a water self-neutralises or needs added alkalinity, because a circumneutral water can carry high dissolved metal (latent acidity) that appears as the metals hydrolyse. This is the deterministic Kirby-Cravotta / Hedin calculated acidity: proton acidity from pH plus the metal load (Fe, Mn, Al by charge), minus your measured alkalinity. Net acidic → will not self-neutralise, treat; net alkaline → self-neutralises. If you give total iron it is treated as ferrous — a labelled default; split it into Fe(II)/Fe(III) for the exact value (ferric carries more acidity). The lime figure is the stoichiometric CaO demand; real plant demand is higher by a plant-specific factor that is not fabricated here. Recovery, sludge and purity are not computed — this sizes the chemistry, not the plant.
For acid-drainage water. Enter the metal analysis; net acidity decides treat-or-not.
Operating setpoints · from this water, not a tableiFixed universal setpoint tables are wrong. The safe pH ceiling is not a constant — it is set by this water's scaling limit at your operating cycles. A generic “pH up to 8.8” will scale a hard, alkaline water and needlessly restrict a soft one. Here the pH ceiling is bisected against the real engine, the conductivity ceiling is the cycle limit naming the limiting salt, and the ORP target is residual-driven (it moves with pH). Where a value genuinely is a metallurgy default — the corrosion-side pH floor — it is labelled a default, not dressed up as computed. Every setpoint says how it was derived.
The setpoints this water can actually hold — each with its basis.
OCCT lead/copper directioniWhich way the corrosion-control levers move dissolved lead & copper, and the controlling solid. Cited direction: orthophosphate + higher pH LOWER dissolved Pb (hydroxypyromorphite); higher pH LOWERS cuprosolvency; DIC is non-monotonic (Schock; EPA 816-B-16-003). Honest gaps: NO ppb — a precise equilibrium concentration needs PHREEQC + a lead/copper database on the host; and actual TAP RELEASE (pipe scale/hydraulics/galvanic) is a separate measured quantity. Drinking water.
Point the OCCT levers the right way for lead and copper — a cited direction, with the ppb and tap release left as honest gaps.
Phosphate-pH control · coordinated / congruentiThe daily control decision for a drum boiler on phosphate treatment. The Na:PO₄ molar ratio sets the pH the phosphate produces and the corrosion risk: above 3.0 there is free caustic (gouging risk); 2.2–2.8 is the congruent in-control band; below 2.2 is acid-phosphate (corrosion / maricite). This is the coordinated-phosphate diagram computed, not read off a chart — the deterministic phosphate acid-base equilibria (pK₁/pK₂/pK₃ at 25 °C, labelled). It backs out your effective ratio from measured phosphate and pH, and gives the target pH to sit at the congruent centre. The pressure-specific phosphate band is NOT supplied from memory — those limits come from your plant's chemistry program / current EPRI guidance; only the ratio, regime, target pH and the hideout principle are computed. Give a second load reading and it flags the hideout signature (phosphate down + pH up at load).
For boiler water. Enter phosphate, pH and drum pressure; the Na:PO₄ ratio names the regime.
Boiler cycle twin · blowdown & limitsiThe boiler analogue of the cooling dynamic twin. A drum boiler concentrates dissolved solids just like a tower — feedwater in, steam out nearly pure, blowdown the only path out — so this reuses the cooling twin's validated implicit-Euler integrator, but watches boiler chemistry: silica, TDS/conductivity and alkalinity against the unit's boiler-water limits. Deterministic (ships): maximum cycles of concentration = min(limit÷feedwater) over those species (a ratio), and the boiler-water transient — cut blowdown to save energy and see how fast each species climbs to its limit and when it crosses. COC is an OUTPUT (feedwater÷blowdown), never assumed. Gated (honest gap): the phosphate-hideout, deposition and embrittlement RATES are not predicted — the hideout signature is routed to the validated boiler phosphate read, and silica carryover into steam is emitted only against an entered distribution ratio. Limits are entered (your ASME/EPRI/OEM spec for the pressure); the defaults are illustrative and loudly labelled.
For boilers. Enter the feedwater and flows to see the cycle limit and blowdown transient; the hideout and deposition rates stay gated.
Boiler control regime · mode, deadband & failsafeiThe boiler analogue of the cooling control-regime tool. A boiler HAS real closed-loop control — so this recommends the control mode, deadband floor and failsafe for each chemical-feed loop: blowdown (conductivity/cycles), oxygen scavenger (residual O₂), and phosphate/pH. It reuses the same mode-selection kernel as the cooling tool (dead-time÷lag rule + actuator binding + deadband floor). The blowdown gain d(cycles)÷d(blowdown) is computed from the same mass balance as the cycle twin; the phosphate target is routed through the validated phosphate read. Failsafes are reasoned per loop: blowdown fails open (protect the turbine from carryover), scavenger and phosphate fail last-good (protect the metal / don't chase hideout). The scavenger dose target stays uncalibrated (mode only, never a dose number), and every limit is entered. Hard boundary: the SIL-rated life-safety interlocks (drum level, over-pressure) are NOT modelled — this is chemistry control, not the safety system. Boiler-only.
For boilers. Recommends the control mode, deadband and failsafe for the blowdown, scavenger and phosphate loops; the SIL interlocks are out of scope.
Oxygen-scavenger dose · feedwater deaeration chemistryiThe chemical dose that removes residual dissolved oxygen from boiler feedwater. Dissolved O₂ pits and corrodes; a scavenger reacts it away. The dose is set by reaction stoichiometry with O₂ — exact published chemistry: sulfite 7.88 ppm/ppm O₂ (2 Na₂SO₃+O₂), hydrazine 1.00 (N₂H₄+O₂), carbohydrazide 1.41; DEHA is a labelled published ~1.24 (its oxidation is not a clean 1:1). Any target residual and excess are yours and are added to the stoichiometric demand — the specific residual band by pressure comes from your plant's program, not from memory. It does not pick a scavenger — that is a program call; it doses the one you choose and states the trade-offs. Hydrazine is flagged as a suspected carcinogen / controlled substance every time.
For boiler feedwater. Enter the dissolved O₂ and pick a scavenger; the dose follows the stoichiometry.
Condensate polishing · deep-bed / powdered-resiniSizes the condensate polisher RUN LENGTH. Returned steam condensate carries trace ionic contaminants (Na/Cl from a condenser in-leak, silica) and corrosion products (Fe/Cu crud); a high-pressure boiler needs it polished near-zero. Deep-bed mixed-bed: throughput = resin volume × rated capacity ÷ influent ionic load; service = throughput ÷ flow. Powdered-resin precoat: run = min(ionic exhaustion, crud/ΔP), with the limiter named. The honesty seam: the resin’s rated capacity (and the precoat capacities) are datasheet inputs, never invented — absent, an explicit gap, not a guessed size; the achieved effluent quality (ppb Na/silica) is a column-trial gap, never a predicted ppb. Sizes the run only. Boiler.
Size a condensate polisher run deterministically — the resin capacity is yours from the datasheet, and the achieved effluent purity is honestly not predicted.
Condensate amine / AVTiThe carbonic-acid corrosion of the condensate return, and the neutralizing-amine demand. CO₂ carried over with the steam dissolves in the condensate as carbonic acid, drops its pH and corrodes the carbon-steel return. Deterministic (ships): the acidified condensate pH from the carbonic-acid equilibrium ([H⁺] = (−Ka₁+√(Ka₁²+4·Ka₁·C))/2), and the neutralizing base demand to a target condensate pH = [HCO₃⁻]+2[CO₃=]+[OH⁻]−[H⁺] — closed-form carbonate arithmetic, ~1 eq of base per mol free CO₂ to the bicarbonate endpoint. The honesty seam: the carbonate constants are the standard 25 °C reference values, LABELLED; the CO₂ carryover from feedwater alkalinity uses the published 0.79 factor as a LABELLED theoretical upper bound (actual carryover entered); the amine equivalent weight is a labelled library value; and the amine distribution ratio is ENTERED, never from memory — without it the condensate amine still computes but the feedwater dose is INCOMPLETE, never fabricated. The tool does not choose the amine, model the condensation profile, or claim a corrosion rate. Boiler-only.
Compute the condensate acid load and the neutralizing base demand deterministically — the amine and its distribution ratio are yours, and the feedwater dose is honestly gated without them.
Ion-exchange sizing · softener / dealkaliseriSize the ion-exchange pretreatment. A softener (Na cycle, SAC), a chloride-cycle dealkaliser (SBA-II) or a weak-acid cation dealkaliser (H cycle). Deterministic (ships): throughput, service time and regenerant per cycle are exact stoichiometry — 1 grain/gal = 17.12 ppm as CaCO₃, throughput = rated capacity × resin volume ÷ feed load. The honesty seam: the resin operating capacity is a datasheet input, never invented — absent, the tool returns an explicit gap, not a guessed size; hardness/alkalinity leakage and achieved effluent are NOT predicted (they need the resin’s leakage curves or a column trial), returned as a class + gap, never a fabricated ppm. Impossible inputs (non-positive volume/capacity/dose, negative feed, unsupported mode) are rejected. Sizes the ion-exchange step only. Pretreatment — cooling, boiler and RO.
Size a softener or dealkaliser deterministically — the resin capacity is yours from the datasheet, and leakage / achieved effluent are honestly not predicted.
Dechlorination pretreatment · GAC / SMBSiSizes dechlorination ahead of the membranes — free chlorine destroys polyamide. GAC: bed volume = flow × empty-bed contact time (EBCT); a labelled design EBCT, overridable. SMBS (sodium metabisulfite): dose from stoichiometry — Na₂S₂O₅ → 2 NaHSO₃, so 1 mol SMBS neutralises 2 mol Cl₂ = 1.341 mg SMBS per mg free Cl₂; a practice excess factor (~1.8–3×) is applied only if you set it, and it’s labelled, not baked in. The honesty seam: carbon EXHAUSTION / breakthrough needs the carbon’s capacity (iodine number / a column trial) — a gap, not fabricated; and the dose is a design figure to confirm with a downstream ORP interlock, not a guarantee of zero residual. RO.
Size GAC by contact time or SMBS by exact stoichiometry — with the carbon’s exhaustion an honest gap and the dose confirmed by an ORP interlock, not assumed.
RO cleaning-chemical selection · foulant → cleaner classiMaps the foulant to the cleaner CHEMISTRY CLASS and the clean SEQUENCE — selection only, never a dose. Deterministic (published CIP practice): carbonate scale / metal oxide → acidic (low-pH); silica / organics / colloids / biofouling → alkaline (high-pH), biofouling with a NON-oxidising biocide (never an oxidiser on polyamide — it destroys the membrane); sulfate scale → alkaline + chelant. When foulants are mixed, the alkaline clean runs first (lift organics/bio/colloids), then the acid (scale/metals). The honesty seam: the specific product, concentration, pH setpoint, temperature and soak time — and the membrane’s own pH (~1–12) / temperature (~35°C) LIMITS — are the vendor cleaning-guide gap, never emitted here (exceeding a limit destroys the membrane). Selects and sequences; it does not dose. RO.
Turn the fouling fingerprint into a cleaner class and clean order — the specific product, dose, pH and temperature stay the membrane vendor’s, not fabricated.
RO permeate polishing · mixed-bed / EDIiSize the polishing step after RO. Mixed-bed: throughput to exhaustion = rated capacity × resin volume ÷ feed ionic load — exact stoichiometry (1 grain/gal = 17.12 ppm CaCO₃). EDI: a feed-suitability gate against a labelled-default envelope + product flow. The resin capacity is a datasheet input, never invented; achieved product purity is NOT predicted.
Polish RO permeate to high purity — size a mixed bed, or check a feed against the EDI envelope. Capacity is yours from the datasheet; product purity is honestly not predicted.
RO array balance · recovery, concentrate & fluxiThe system-level design read for a reverse-osmosis array. From the feed, the target recovery and the membrane area, the system mass balance is exact: concentration factor CF = (1−R(1−r))/(1−R), concentrate and permeate TDS, permeate/concentrate flow, and average flux. At 75% recovery CF ≈ 4 — the rule of thumb, computed. The per-stage split is a labelled uniform-flux approximation. The element-by-element profile (lead-element over-flux, per-element dP) is NOT computed — that needs the full element-hydraulic model (the Wave-3 build) and is returned as an honest gap. Salt rejection, element area and β are labelled defaults. It reports the concentrate concentration, not whether it scales — run the concentrate through Scale & Corrosion for that. A CIP regime follows deterministically from the foulant; the specific doses/temps are membrane-specific and deferred.
For reverse osmosis. Enter feed, recovery and array size; the concentrate and flux follow the mass balance.
RO element-by-element profile · lead over-flux, tail under-fluxiResolves a pressure vessel SPATIALLY — per-element flux, recovery, TDS and pressure, so the lead-element over-flux and tail-element under-flux become visible instead of averaged away (the lead element is where fouling/scaling start; the tail is where brine peaks). A first-principles solution-diffusion marcher (FilmTec form): Jw = A·NDP, Js = B·ΔC, pf = exp(0.7·Y), ΔP = 0.01·q1.7. A and B are back-calculated from the element's public datasheet (permeate flow, rejection, test conditions) — a clean, new-membrane value, labelled, NOT fitted to a plant and NOT the aged state; the fouling factor is your assumption. Accuracy: ~5–10% vs a manufacturer projection, ~10–20% vs a real aged plant. Validated against the Johnson & Busch (2010) published seven-element case.
For reverse osmosis. One pressure vessel: enter the feed, element count and target recovery, and either A/B or a datasheet spec.
HX fouling twin · cleaning forecastiThe cooling analogue of the RO fouling twin. thermal_performance gives the heat-exchanger fouling factor R_f at ONE point; this projects when R_f crosses the cleaning threshold. Deterministic (ships): a least-squares trend on the OBSERVED R_f series, with an R² noise guard (noise is never called a decline), projected to the entered cleaning threshold → a cleaning-due lead time. Reuses the RO twin's fit. Gated (honest gap): the mechanistic fouling rate from the water chemistry / deposit type is NOT predicted — it needs a deposit analysis and is never fabricated. It projects the decline it can SEE. Cooling.
Project the exchanger cleaning-due date from a time series of the fouling factor R_f — the mechanistic fouling rate stays an honest gap.
RO fouling twin · CIP-cycle forecastiThe RO analogue of the cooling dynamic twin. It answers when to clean, not how fast the membrane will keep fouling from the feed chemistry — that mechanistic rate is a gap the platform is honest about. Deterministic (ships): each operating point is normalised against the reference by ASTM D4516 (routed through the platform's own normaliser), giving normalised permeate flow (NPF), salt passage (NSP) and pressure drop (NPD); a least-squares trend on each — with an R² noise guard, so noise is never called a decline — is projected to its entered cleaning threshold to give the CIP-due day. The soonest indicator sets the schedule; the moving indicator names the foulant class (the D4516 verdict). Gated (honest gap): the mechanistic fouling rate, remaining membrane life, and whether a clean will recover performance are NOT predicted — they need a membrane autopsy or fleet data, and are never fabricated. A MEMBRANE_DEGRADATION signature is flagged as cleaning will not restore it.
For RO trains. Enter a reference reading and a time series of operating points to project the cleaning schedule; the fouling rate and membrane life stay gated.
RO control regime · mode, deadband & failsafeiThe RO analogue of the cooling / boiler control-regime tool. An RO train HAS real closed-loop control — so this recommends the control mode, deadband floor and failsafe for each loop: antiscalant (flow-paced), acid/pH (LSI), dechlorination (residual oxidant/ORP), and CIP trigger. It reuses the same mode-selection kernel as the cooling tool (dead-time÷lag rule + actuator binding + deadband floor). Dechlorination is the inverted oxidiser: free chlorine destroys the membrane fast and irreversibly, so — unlike the cooling oxidiser (no safe default) — this loop HAS a safe default: keep removing oxidant, protect the membrane. Antiscalant is flow-paced feed-forward with the dose target uncalibrated (mode only). The CIP trigger routes through the RO fouling twin (crosses the entered cleaning threshold); if the signal is lost it falls back to the time-based schedule. Every limit is entered. Hard boundary: the high-pressure safety interlocks are NOT modelled — chemistry control, not the safety system. RO-only.
For RO trains. Recommends the control mode, deadband and failsafe for the antiscalant, acid, dechlor and CIP loops; the high-pressure safety interlocks are out of scope.
Passive AMD treatment sizing · train selection & areasiRecommends a passive treatment TRAIN and SIZES each unit from published design criteria. Selection uses the Hedin/Nairn/Kleinmann (1994) decision tree: net-alkaline → aeration + settling + aerobic wetland; net-acidic with DO/Fe(III)/Al all < 1 mg/L → anoxic limestone drain (ALD); otherwise → RAPS / vertical-flow pond. Sizing from published loading rates: aerobic wetland Fe 10/20, Mn 1/2 g/m²/d; RAPS acidity 25–35 g/m²/d; ALD limestone = the larger of a 15 h retention hold and life-neutralisation; settling 24–48 h. Rates are empirical medians with wide variance — the compliance basis is ~2× conservative. COST is not computed: unit prices are region-specific and uncalibrated by design — it names the cost-driver structure, not prices. It sizes; it does not predict effluent quality.
For acid mine drainage. Enter the flow and net acidity (from Diagnose) plus DO, Fe, Al, Mn; it selects and sizes the train.
Limestone depletion clock · remaining bed lifeiThe dynamic companion to passive sizing. A passive AMD bed has no control loop — it just slowly depletes as the limestone neutralises the acidity load. This tells you when it needs replacement. Deterministic (ships): remaining life = installed limestone ÷ consumption, where consumption = acidity load ÷ (purity × efficiency) via the same neutralisation stoichiometry as the sizing tool (1 g CaCO₃ per 1 g acidity-as-CaCO₃). This is the stoichiometric upper bound — the real life is at or below it. Gated (honest gap): the armoring rate (Fe/Al hydroxide coating shortens the real life) and end-of-life effluent quality are not predicted — supply an entered armoring de-rating factor from field data to shorten the estimate; the tool never fabricates one. Net-alkaline water reports no depletion. AMD-only.
For AMD. Enter the flow, net acidity and the installed limestone mass to see remaining bed life; the armoring rate stays gated.
Sludge generation · dry mass & disposal volumeiHow much sludge the treatment makes — the disposal cost driver. Sludge handling is a major, often-overlooked annual cost, and disposal is billed by volume. Deterministic (ships): the dry-solids mass — each dissolved metal precipitates as its hydroxide by a fixed molar-mass ratio (Fe(OH)₃, Mn(OH)₂, Al(OH)₃), 100% at the design pH endpoint (the AMDTreat convention). Iron is taken as ferric hydroxide Fe(OH)₃ (aerated active-treatment basis, labelled) — a passive/anoxic flag warns this over-states iron. Not fabricated: the wet volume needs the site-specific percent-solids of the thickened sludge (and, optionally, its density) — supply it and the volume is computed; leave it blank and only the dry mass is returned, the volume an honest gap. Gypsum / calcite / excess-lime solids are not estimated (they need the reagent dose and are saturation-dependent) — enter them if you have them. AMD-only.
For AMD. Enter the flow and the dissolved Fe/Mn/Al to see the deterministic dry-solids mass; add the sludge percent-solids to get the disposal volume.
Scale-inhibitor squeeze design · envelope & lifetimeiDesigns a scale-inhibitor squeeze in three layers, each with its own honesty status. (1) Scaling driver — which scale the squeeze protects against, ROUTED through the platform's own saturation + incompatible-mixing engine (supply formation water + seawater). (2) Reservoir geometry — deterministic: radial penetration r = √(rw² + V/(π·h·φ·S)), treated pore volume, inhibitor mass placed. (3) Squeeze lifetime — the frontal-advance model Vlife = 1 + ρ(1−φ)/φ·(k/n)·MIC(1/n−1). This is deterministic ONLY given a lab-measured isotherm (Freundlich k, n) and MIC from a static-adsorption bottle test + coreflood. Those are rock-and-brine-specific and cannot be predicted from water chemistry — without them the tool returns an explicit lab-data-required gap, never a fabricated isotherm or lifetime.
For oilfield produced water. Enter the reservoir geometry and treatment; add a lab isotherm + MIC to get lifetime.
Sour progression twin · scaling onset on breakthroughiThe sour analogue of the dynamic twin — built around the one sour progression that is deterministic: scaling onset as injection water breaks through. As sulfate-rich injection water (seawater) mixes into Ba/Sr-bearing formation water, the blend becomes supersaturated in barite/celestite that neither water forms alone — the classic produced-water problem. Deterministic (ships): the scaling onset is routed through the validated mixing scan (the platform's own saturation engine) — the smallest seawater fraction at which each emergent scale crosses SI > 0, the binding scale named, and (against an entered breakthrough curve) the field-life time it is reached. Gated (honest gap): the souring rate (biogenic H₂S), scale deposition rate and corrosion rate are not predicted (reservoir-/lab-specific) — an entered souring trajectory is walked as-is, never generated. Sour-only.
For sour (produced-water) systems. Enter the formation and injection waters to see when scaling begins as injection water breaks through; the souring and corrosion rates stay gated.
Control regime recommendation · mode, deadband & failsafeiPer cooling-tower loop, recommends a control MODE + deadband + alarm/failsafe. The process gain is engine-computed (the oxidiser gain dHOCl%/dpH from HOCl speciation); the actuator class (relay vs analog) gates which modes are physically possible; the dead-time/lag ratio selects within it (<0.1 on/off, 0.1–0.3 PID, 0.3–1 pseudo-PID/band, >1 band/timer — tight PID oscillates when dead-time-dominated). Dead time, actuator min-on-time and noise are entered; alarm/failsafe limits are the entered, edition-stamped surface — it computes WHERE a variable crosses them, never the limit itself. Failsafe is reasoned per loop: acid & non-ox FAIL-CLOSED, inhibitor FAIL-LAST-GOOD, and the oxidiser has NO safe default (failing off risks Legionella, failing on risks over-oxidation + consent) so it is never auto-set — the human sets it. Recommends; the human commits.
For cooling towers. Pick a loop and actuator, enter dead time / lag / noise; it recommends the mode and failsafe.
Sensor drift & service scheduling · confound breaker & time-to-limitiTells sensor DRIFT from real SERVICE NEED — and never confuses them. A pH probe that ages and reads low looks exactly like rising acid demand; dose acid to “correct” it and you have driven the water acidic on a lying probe. The confound breaker: a real process change moves MULTIPLE correlated streams together (pH and ORP and calcite SI); instrument drift moves ONE. A stream that departs from what its partners predict is a sensor fault — recalibrate, do not act; a stream that moves with them is real — act. Scheduling by time-to-limit, not calendar: time_to_L = (L − now)/rate, where the limit L is entered with its edition, never from memory. The water clock (soonest limit) and instrument clock (soonest recal) merge into one visit. Full multi-point drift series (with the R² noise guard) ingest via the service-visit API; low-confidence readings SHORTEN, never lengthen, the interval.
For cooling towers. Enter the recent per-stream trends to break the confound, and a variable + entered limit to schedule.
Dynamic twin · driving-force forecastiThe honest cooling-tower digital twin. Sim A (ships now) forward-integrates the transport mass balance — implicit backward Euler, unconditionally stable, tested to hit the analytic steady state exactly — with the reaction terms at zero, and recomputes SI / HOCl% / HTI exactly from the engine at each state. It answers when the water crosses into supersaturation if you push cycles, without claiming a deposit mass. COC is an OUTPUT, integrated and reported (it lands below makeup÷blowdown because windage carries concentrate out) — never assumed. Sim B (rate: kg/day) is gated: the scenario emits a reaction rate ONLY where replay has calibrated that coefficient by closing the mass balance on the plant's own history (rate = residual, not a curve fit). Until then the rate slot is UNCALIBRATED, never fabricated — the twin does not hide a guessed rate inside a differential equation. Corrosion is learned from the probe; Legionella is never predicted; a beneficial forecast does not authorise the setpoint that reaches it.
For cooling towers. Enter the water and tower flows to forecast the driving force; the kg/day rate stays gated until replay calibrates it.
Independent audit · the vendor-neutral second opinioniA second opinion that doesn't sell you chemicals. Given your current operating point — the pH and cycles you actually run — this checks where you sit versus the water-specific setpoints and the binding constraint, names any material finding, and (if you supply economics) the lowest-cost route to it. Every finding shows its basis. It never recommends a point-value dose — dose-response is uncalibrated, so it bounds, it doesn't prescribe — and it states plainly what it cannot say without your field data. Carries no chemical supply interest.
Is your current program right? An independent read of your operating point.
Unified twin · one pass, advisory or simulator-autonomousiThe whole pass in one place. Identify → recommend → control → observe, with every output a single Recommendation carrying what, the proposal, why, its provenance, its confidence, and its safety class. Two rules you can see here: an output with no provenance does not render, and a human-only safety item (oxidant / biocide) is never automatable. Autonomous mode is for validating the control logic against a simulator or test rig — on a plant target it is refused and downgraded to advisory. Human-in-the-loop is the default and the only mode that reaches real hardware.
Run the control logic as one traced pass. Autonomous is simulator/test only.
Control decision · what would actuate, and what may notiThe safety gate, made visible. Ask for a mode and a target, and this shows what the platform would actually do — loop by loop, with the safety class on each action. Two rules are structural, not preferences: autonomous is refused on a plant and silently downgraded to advisory, and an action classed human-only-safety (the oxidiser, the biocide) is never actuated no matter what mode you ask for. If you requested autonomous and got advisory, that is the gate working.
Ask for a mode; see what the gate grants and what it refuses.
Closed-loop sandbox · prove the loop before it touches anythingiLoop validation on a simulator, never a plant. Runs the control loop against simplified tower dynamics to show whether it converges toward the setpoints or oscillates. These dynamics are deliberately simplified and are NOT a calibrated plant model — the sandbox proves the loop's logic and stability, not what your tower will do. The oxidiser is structurally absent from the loop: it cannot be actuated here even in simulation.
Does the loop converge, or hunt? Run it on the simulator and watch.
Calibration · how close is this coefficient to trustworthyiThis is where the moat is built, and where it is honestly gated. Feed service-visit points and the learner classifies each interval (steady / drift / step), excludes dose-change steps from the fit and flags them for human confirmation, then fits the coefficient with a confidence interval. The status is the honest part: a coefficient reaches CALIBRATED only on FIELD or LAB provenance with a tight interval. Synthetic data can never calibrate anything — paste synthetic points and the status stays SYNTHETIC no matter how tight the interval gets.
Feed visit data; watch the confidence interval close — and see what still blocks CALIBRATED.
Field-data capture · distance to CALIBRATEDiThe moat motion. The step above fits a coefficient from whatever you paste; this one persists captured service visits and accumulates the posterior across every visit, then shows, per coefficient, how far it is from CALIBRATED. The honesty is in the distance: a coefficient with only synthetic points is not “almost there” — it is BLOCKED on field data, because no quantity of synthetic reaches CALIBRATED. One with field points but a wide interval shows ~N more field points at the current scatter. This capture is untrusted: any point claiming FIELD is clamped to SYNTHETIC — only a trusted field integration fills the moat, never a pasted payload. That is exactly why the demo below stays BLOCKED however many points you add.
Capture visits, then watch each coefficient's distance to CALIBRATED — honest about the kind of data still missing, not just the amount.
Operational loop — live readings & driftiBring any vendor's data into one neutral view. Ingest readings from ANY controller / LIMS / sensor (3D TRASAR, Hubgrade, a bare probe, a lab export), then watch a parameter trend over time. The honesty seam: readings are stored exactly as entered with their source attached; the drift signal is a disclosed statistic (an OLS slope + baseline-vs-recent change), labelled HEURISTIC — it describes the data you have, never a forecast or a limit. Neutral — all segments.
The thing no chemical major can be: a vendor-neutral home for your live water data, with an honest read on which way a parameter is moving.
Drinking-water limitsiThe cited US federal drinking-water limits, each with its correct legal type. LCRI action levels (Pb 0.010, Cu 1.3 mg/L), SDWA MCLs (nitrate 10 as N, arsenic 0.010, fluoride 4.0), Stage 2 DBP (TTHM 0.080, HAA5 0.060), MRDLs (Cl/chloramine 4.0, ClO₂ 0.8), turbidity TT — CFR-cited, edition-stamped. An action level is a 90th-percentile TRIGGER (not an MCL); a single value over it is a FLAG, not a violation. Federal minimum; states may be stricter. Drinking water.
Get the exact cited limit for an analyte with its legal type, and screen a value honestly.
Provider report · white-label, formulation-blindiAssemble a client-facing OUTCOMES report under your own name. Composes the compliance, ROI/eROI and ESG engines — it adds no number of its own; each section keeps its own confidence and gaps. Formulation-blind by construction: any product / brand / formulation identifier is stripped, and outcomes are attributed to "the programme", never a named chemistry. A missing section is a declared gap (compliance is NEVER assumed compliant). Two ways in: pull from the ROI / compliance / ESG tools you have already run this session, or direct entry of the headline figures. All segments.
Package compliance, value and ESG into a white-label client report — from prior tool runs or by direct entry — with no chemical product or formulation exposed.
ROI / eROI value ledgeriThe business case, without fabricating a number. Turns a physical operating improvement into water / energy / carbon / labour / dollar terms for a plant manager. The physical quantities it derives are textbook, deterministic water balances — the cooling water balance from a cycles change (blowdown = evaporation÷(cycles−1)), RO intake water from a recovery change (feed = permeate÷recovery) and boiler makeup water from a cycles change; every other quantity is entered and flagged. The honesty seam: every price and carbon/energy factor is ENTERED and source-stamped, never supplied from memory (treated like a regulated limit) — a missing price makes its line INCOMPLETE, never a fabricated default. Each line is quantity × price, shown. Physical and monetary confidence are reported apart: a deterministic water quantity does not make its dollar value validated — the money is HEURISTIC, riding on your entered prices. Prices may be entered as bands. Payback / ROI% appear only if a capital cost is entered. All segments.
Translate a physical improvement into the numbers a plant manager buys on. Enter a cooling cycles change (derived water saving) and/or your own physical deltas, plus your source-stamped prices.
Cost-coefficient calibration consoleiWhere the economics coefficients actually stand — honestly. Lists each cost coefficient and its calibration status. The honesty seam: the console path is UNTRUSTED, so any points entered here are SYNTHETIC — they exercise the calibration pipeline and show an estimate + confidence interval, but can never calibrate a production coefficient. Real calibration requires trusted field/lab data. Neutral — all segments.
See which economics coefficients are calibrated (none are yet) and explore the calibration pipeline with synthetic points — clearly fenced, never a production coefficient.
What applies to meiSegment- and jurisdiction-aware compliance map. Shows which frameworks apply to this water in your country, split mandatory vs good-to-have, each with a citation. This map names REGIMES only. In the report below, the limit you are ASSESSED against is always the one you enter (edition-stamped); with a jurisdiction set, the report also shows the cited regulatory reference for context. Decision-support, not legal advice.
Pick your jurisdiction and see what you are legally on the hook for versus what is best practice — for the segment you are working in. Then build the audit record below.
Compliance cockpit — all my water, one viewiYour full obligation surface across every segment you run. Tick the segments your plant operates and a jurisdiction; it rolls up every regime that applies — de-duplicated, tagged per segment, split mandatory / conditional / good-to-have. The honesty seam: it shows what APPLIES, not whether you PASS — per-regime records are not stored, so it never fakes a compliance verdict. Build a record for each obligation in the report to assess. Decision-support, not legal advice.
A refinery runs cooling, boiler, sour and a discharge outfall at once. See everything you are on the hook for, across all of it, in one place — then export an audit-prep pack.
Compliance reportiThe audit artifact, honest by construction. Builds an audit-ready value-vs-limit record — ASHRAE 188 register, NPDES discharge, ASME/EPRI cycle-chemistry, or mine-discharge. The honesty seam: every limit is ENTERED and edition-stamped, never supplied from memory (the platform's standing position on discharge consents and ASME limits). A parameter with an entered limit is assessed transparently (value vs limit) → PASS/FAIL; a parameter without a limit is reported but NOT assessed — never a fabricated pass, and excluded from the overall verdict. Every value carries its provenance (engine / measured / entered). The report must name its standard and edition or it is incomplete. For ASHRAE 188 no Legionella CFU is predicted — the register documents the water-management program. It is a factual record, not a legal certification. All segments.
Assemble an audit-ready compliance record from your parameter values and your entered, edition-stamped limits. Nothing is assessed against a limit the tool invented.
AMD lifecycle cost / NPViThe one segment with only free government tools. An AMDTreat-style whole-of-life cost for an acid-drainage treatment system — capital + annual O&M + recapitalization (media replacement), discounted to NPV. The honesty seam: physical quantities are routed from the validated AMD reads (net-acidity → reagent demand, passive sizing → limestone mass, sludge → disposal tonnes/volume, depletion clock → replacement interval) or entered, each tagged with its provenance — never fabricated. Unit costs are ENTERED and UNCALIBRATED (the platform has never calibrated an AMD cost coefficient and never supplies one from memory); a line with no unit cost is INCOMPLETE — listed, excluded from the total, never a fabricated default. The NPV is deterministic arithmetic given your entered discount rate and horizon. Physical vs monetary confidence are kept apart: the dollar total is a HEURISTIC planning estimate, not a bid. Give two scenarios for a passive-vs-active comparison. AMD only.
Build a whole-of-life cost for an AMD system from routed physical quantities and your entered, uncalibrated unit costs. Nothing is costed against a coefficient the tool invented.
ESG / water-stewardship disclosureiPhysics-grounded disclosure, not a typed-in guess. Assembles a framework-structured water disclosure for CDP Water, GRI 303, or ESRS E3. The honesty seam: the record names its framework + edition or it is INCOMPLETE; a datapoint the framework asks for that has no value is NOT reported — listed as a gap, excluded, never a fabricated value or zero; the withdrawal / discharge / consumption volumes (GRI 303-3/4/5) are DERIVED deterministically from the platform's own water balance (blowdown = evaporation/(cycles-1); withdrawal = consumption + discharge) and tagged engine — RO consumption is left an honest gap (it depends on downstream use); the water-stress classification is ENTERED and sourced, never derived from memory (it needs external basin data like WRI Aqueduct); any monetary valuation uses an entered, uncalibrated internal water price and is planning-only. It is a disclosure-PREPARATION record, not an assured disclosure (CSRD requires third-party assurance). Neutral — all segments.
Prepare a CDP / GRI 303 / ESRS E3 water disclosure whose water balance comes from the engine, whose gaps are shown as gaps, and whose water-stress and water price are yours and sourced — never invented.
RO cost of foulingiThe running cost fouling actually adds. Free membrane-design tools (WAVE, IMSDesign) stop at design; this is the operational OPEX cost of RO fouling, across four categories: accelerated element replacement, the energy penalty from the fouling pressure rise, extra CIP (cleaning), and downtime. The honesty seam: every category is the INCREMENTAL cost vs clean operation (the difference from a baseline), not a gross cost. The physical drivers (flux/flow decline, pressure-drop rise, CIP interval, membrane life) are routed from the D4516 fouling twin or entered, tagged with provenance — never fabricated. Unit costs are ENTERED and UNCALIBRATED (never from memory); a category with no unit cost, or no clean baseline, is INCOMPLETE — listed, excluded, never a fabricated default. Physical drivers and dollars are kept apart: the total is a planning estimate, not a bid. RO only.
Cost the OPEX that fouling adds — from the twin's drivers and your entered, uncalibrated costs. Each line is the increment over clean operation; nothing is costed against an invented baseline.
Boiler fuel savingsiThe classic boiler energy case, done honestly. Boiler blowdown carries hot treated water out of the drum, so cycling up (reducing blowdown) saves fuel. The physics that is routed: blowdown = steam/(cycles-1), so the reduction from cycling up is deterministic — the same balance the boiler cycle twin uses — and is routed from the twin or entered, never fabricated. The one value that is entered, not fabricated: the blowdown heat content above makeup (kJ/kg) is ENTERED from steam tables for your drum pressure — there is no steam-table read here, and it is never supplied from memory. Boiler efficiency and fuel heating value are entered physical values; the fuel price is ENTERED and UNCALIBRATED, so the dollar figure is planning-only. The saving is INCREMENTAL (baseline → improved cycles); a line short a required value is INCOMPLETE — excluded, never fabricated (the physical fuel saving stands without a price). Physical and monetary confidence are kept apart: the total is a planning estimate, not a bid. Boiler only.
Turn the twin's blowdown reduction into fuel and dollars — deterministic where the physics allows, entered where it must be, and never a fabricated steam-table number.
Production at riskiA dollar figure on a deferral — without pretending to predict it. In sour (O&G) service a souring or corrosion condition can force a choke-back or shut-in to stay inside a facility H2S-handling, metallurgy or HSE limit; the consequence is the production value at risk. The honesty seam — and it matters most here: this tool does NOT forecast the risk. The souring/corrosion rates that would predict whether or when a constraint binds are UNCALIBRATED in this platform, so the affected rate, at-risk fraction (choke-back or shut-in) and duration are ENTERED, never a fabricated trajectory. Any constraint check is a deterministic comparison of your entered indicator against your ENTERED limit (source-stamped, never from memory) — it flags whether the premise holds, not a souring prediction. Price is ENTERED and UNCALIBRATED (planning only); a missing quantity or price is INCOMPLETE — excluded, never fabricated (the physical volume at risk stands without a price). Physical and monetary confidence are kept apart: the value is a planning estimate, not a bid or a forecast. Sour only.
Quantify the production a sour condition puts at risk — from your entered scenario, not a souring forecast. No unit conversion is done; enter a rate and a price in matching units.
Halogen speciationiOnly the undissociated acid is a strong biocide — HOCl is roughly 80× more active than the hypochlorite ion. So the active fraction is an acid-base equilibrium, and at tower pH it decides the whole programme. HOCl pKa is temperature-corrected from Morris (1966); HOBr uses 8.70 at 25 °C with no temperature correction, because its T-dependence is not as well established and inventing one would be worse than saying so.
How much of your halogen is actually the active acid?
Breakpoint / chloramination doseiThe Cl₂:NH₃-N dosing chemistry behind microbial control. Monochloramine (~5:1), the breakpoint (~7.6:1), and free vs combined residual.
Stoichiometric doses to monochloramine and breakpoint — add the water’s chlorine demand for the applied dose; the residual is directional.
CT disinfection · SWTRiRequired vs achieved CT for pathogen inactivation. Required CT from the cited EPA SWTR / LT2 tables (temperature- and pH-dependent for free chlorine; temperature-only for ozone; the exact LT2 log-credit equation for Cryptosporidium). Achieved CT = residual × T10 (baffling factor). The same validated module as the Diagnose CT tool, surfaced here as the drinking-water microbial-control read. Drinking water.
Pick the disinfectant and target pathogen, then enter your residual and contact time to compare required vs achieved CT.
Two-step nitrification · AOB/NOBiAmmonia → nitrite (AOB) → nitrate (NOB), and the shortcut-N signal. Validated stoichiometry (electron-balance O₂ demands 3.43 / 1.14 g O₂/g N, exact N conservation) with representative literature kinetics (calibration-gated). Lowering DO raises the peak nitrite fraction — the DO niche that drives partial nitritation. The same validated module as the Diagnose two-step-N tool, surfaced here as the wastewater microbial-process read. Wastewater.
Set the influent ammonia and DO setpoint to see the nitrification progression and the shortcut-N signal (demonstration influent unless overridden).
Holding time indexiHow long a slug survives, by dilution alone. Standard cooling-water practice and pure arithmetic from numbers Engine 1 already carries: blowdown = evaporation/(cycles−1) − windage. This is a CEILING on contact time, never the contact time — an oxidiser is also consumed by demand, sunlight and your own inhibitors, and dies faster. A non-oxidiser is not consumed by demand, so dilution is close to its whole loss path and HTI is close to real for it.
Your cycles decide how long a slug lasts — and nothing in the biocide programme changed.
Halogen demand & decayiHolding time is dilution only, and on a fouled tower dilution is the slowest loss path by far. With measured constants the half-life can be under two hours against a holding time of a hundred — so a dilution-only curve overstates the residual by orders of magnitude, in the direction that says the biocide is still there when it is gone. Demand and bulk decay come from Standard Methods 2350 (Oxidant Demand/Requirement) — a jar series on this water, an afternoon’s bench work. We refuse to predict without them rather than substitute a plausible default.
What is actually left — once demand, your own inhibitors, and dilution have all taken their share.
Dose for residualiThe inverse of step 03: C₀ = D + C_target · exp(k·t). This is a dose recommendation, and it is defensible for a precise reason — the target is yours, from your water management programme or HSG274, never from us; and demand and decay are measured, not guessed. The forward and inverse models are pinned to round-trip against each other in the test suite. Dose-for-RESIDUAL only. Never dose-for-kill: that needs an efficacy constant, and none exists for biofilm organisms.
What dose holds your documented control limit — and how much of it is wasted on demand?
Bio-dispersant slug windowiA bio-dispersant has no kill claim — it is a penetrant that exposes biofilm so the biocide can reach it, with no concentration-versus-kill relationship. But the dosing is exact arithmetic, and it is the operational instruction nobody computes: blowdown dilutes the slug, so holding a concentration for a contact time means suspending blowdown, and for how long is a number. Evaporation is ignored deliberately — it removes water and would concentrate the slug, so ignoring it errs conservative.
Stop blowdown, dose, wait how long, resume — using the volumes from step 02.
Membrane biofoulingiBiofouling is the #1 RO microbial failure. This read covers AOC biostability, the DBNPA norm and the hard zero-chlorine polyamide alarm. SDI (particulate fouling) and SBS (dechlorination) are their own tools. AOC/SDI are measured — this classifies them, it does not predict biofilm growth.
AOC biostability, the DBNPA biocide norm, and the zero-chlorine polyamide alarm.
Souring control (nitrate)iSRB reduce sulfate to H₂S. This read bounds the H₂S ceiling stoichiometrically, checks the nitrate dose against the cited field band (0.25–0.33 mM, Bødtker 2008), and gives the THPS norm. It does NOT forecast the souring rate (reservoir-specific, data-gated).
H₂S ceiling from sulfate, nitrate dose vs the field band, THPS norm.
Acidophile accelerationiIn AMD the microbes CAUSE the pollution: acidophiles catalyse the rate-determining Fe(II)→Fe(III) step and accelerate pyrite oxidation ~10⁵× at low pH (Singer & Stumm 1970). The graph is the RELATIVE rate-law shape + the cited factor (log axis), not a fabricated absolute rate. SRB bioreactors treat the drainage.
How much acidophiles speed Fe(II) oxidation, and the SRB-bioreactor treatment loadings.
Lay-up advisoriHonest framing: boiler microbial risk is minimal in operation (hot, deaerated). The real lay-up hazard is oxygen pitting, not microbes. This advises wet/dry lay-up chemistry; it is included for completeness of the segment, not because boilers have a microbial process.
Wet vs dry lay-up and the oxygen-pitting chemistry targets.
Real-time monitoringiCouples the microbial reads to LIVE monitoring. The differentiator is the leading indicator: dissolved oxygen falls BEFORE ORP in a microbial upset, so a DO drop while ORP is still nominal is an EARLY warning. Deterministic logic; the baselines and action levels are yours (data-gated) — no invented thresholds.
Feed live ATP / ORP / DO; get the microbial state and the DO-before-ORP early warning.
Biofilm & ORP monitoringiA reference read, not a calculator. Its action levels are site-specific (data-gated). It exists because the most common microbial-monitoring mistake is trusting a planktonic dip-slide, which measures only the free-floating bacteria in the water sample — not the biofilm, where most of the activity and the MIC risk actually live.
Why a dip-slide can read clean while the tower fouls — and the ORP control band.
| Method | Sees | Misses |
|---|---|---|
| Dip slide / plate count | planktonic (free-floating) CFU | the biofilm |
| ATP (RLU / cellular ATP) | total living activity, incl. sessile | species ID |
| qPCR | specific organisms (SRB, Legionella) | live/dead |
Phosphorus ledgeriThe cycles balance, applied to phosphorus. Phosphorus enters as orthophosphate you dose and as phosphonate you dose; it leaves in blowdown, deposits as apatite, or converts — the oxidiser degrades phosphonate into orthophosphate. Against a chloride tracer: total P short of the tracer means it is depositing; ortho P above what you dosed means your phosphonate is being destroyed; both at once means your oxidiser is manufacturing your scale. Every input is a routine test. Assumes steady dosing and a conservative tracer — heavy bleach reduces to chloride and will inflate it.
Two independent failures, one balance, three routine tests.
Programme couplingsiAn oxidiser does not stay in its lane. It consumes tolyltriazole, so yellow-metal protection falls while the halogen residual still looks fine. It degrades phosphonates into orthophosphate — losing the scale inhibitor AND raising calcium-phosphate supersaturation, which the dispersant then has to absorb. These are directional and disclosed. No rate is put on them: that would need kinetic constants we do not have.
What your biocide does to the rest of the programme.
Biocide classes
Not a taxonomy — the three classes behave differently in ways the model has to respect.
Sensor inputs
Enter this segment’s readings — live first — then run one diagnosis. Nothing runs until you enter a live reading.Probe health (optional)
Electrode diagnostics — fill what your instruments report; the diagnosis flags a degrading probe before it corrupts the reading. Leave blank to skip.Measurement context (optional)
Declares how ORP and chlorine are measured, so the diagnosis can gate couplings that depend on it. Leave blank if unknown — nothing is suppressed on a guess.Reference & cross-check tools
Sensor model, water↔sensor consistency, RO normalisation and corrosion-rate calculators for this segment.Sensor model · this segmentiEverything the platform models around each sensor in the selected segment. For each sensor: its read-type (quantitative / directional / calibrated / range-only / gap), the cross-sensor couplings its current reading feeds, its condition-based service path, and its parity diagnosability (isolable / aliased). Switch the segment to see its sensor model. This is what the current data is checked against — the functionality modelled for the segment.
The read-type, couplings, service and diagnosability modelled for each sensor in the active segment.
My water ↔ current sensorsiCross-checks your water analysis against the current sensor readings. pH, temperature and any directly-sensed ion are compared directly (a gap beyond tolerance is a stale analysis or a drifting probe); the analysis charge balance is a deterministic electroneutrality check. Conductivity is a directional sanity BAND only — the TDS↔conductivity factor is site-specific, declared, never a fabricated EC. Uses your My-water values above and the live-stream readings below.
Do the lab analysis and the live sensors agree? Direct for pH/temperature/ions + charge balance; conductivity is a site-gated band.
Live-stream diagnosisiClosures, not alarms. A lab analysis is a snapshot; sensors add time, closure and cross-instrument agreement. Each closure is the SAME physical quantity measured two independent ways — when they agree the balance is sound, when they diverge exactly one thing is wrong and which pair diverges names it. A fault fires only when instruments that share no inputs disagree, so it names a cause, not just an alarm. What the numbers mean for asset life is the one fleet-calibrated layer, shown separately and never faked.
Feed the sensor values. The closures, the fault tree and drift detection are all deterministic.
RO performance normalisation · ASTM D4516iThe most-used RO operational calculation — and it separates the three failure modes a single number cannot. It normalises a current reading back to your start-up conditions for temperature and net driving pressure, then reads three trends: NPF (normalised permeate flow) down means fouling or scaling; NSP (normalised salt passage) up means membrane damage or a seal leak; NPD (normalised pressure drop) up means the feed channels are plugging. Read together they name the cause: flow-down with pressure-drop-up is fouling; flow-down with salt-up is degradation; salt-up alone is a leak. The temperature-correction constants and the pressure-drop exponent are polyamide defaults, labelled as defaults — override with your membrane’s value. Osmotic pressure uses the standard brackish TDS approximation, labelled; a rigorous value comes from Scale & Corrosion with a full analysis. This is a deterministic published method, not a fitted or fleet model.
Enter your commissioning (reference) reading and a current reading. Flows in your own consistent units; pressures in psi; TDS in mg/L; temperature in °C.
Corrosion rate · coupon or LPR → mpyiTurns a raw corrosion measurement into a banded rate. A coupon (weight loss over a known exposure, ASTM G1) gives the average rate; an LPR probe (polarisation resistance, Stern-Geary + ASTM G102) gives the instantaneous rate. Both are deterministic published arithmetic. The verdict is metal-aware: the same mpy means different things for carbon steel and a yellow metal, so the band uses the metal's own acceptable range (NACE RP0775 for steel; the tighter cooling target for copper alloys), labelled. The Stern-Geary B is a labelled default (0.026 V, actively-corroding steel) and overridable. Neither method sees a pitting or localised rate — only the uniform average. Corrosion consequence (a rate → remaining asset life) is not computed here.
For cooling, boiler and sour systems. Convert a coupon weight-loss or an LPR reading to a banded rate.
A shareable, Waalgo-branded PDF, and your one working report — it's saved to your account and comes back when you sign in again. Build it by using Pin to report at the top-right of any tool's result, across Diagnose, Prescribe, Operate, Learn and Value. Each pinned result carries its water, segment and input parameters alongside the result, as a snapshot from when you pinned it. If you pin nothing, the report falls back to the default sections for your segment. Reorder or remove pins below, or Start fresh to begin a new report. Every number carries its units and the assumption it rests on.
Choose the water systems you work with. The platform shows only the segments you turn on here — the Home picker, the Scale & Corrosion mode buttons, the “My water” tabs, and every tool follow this list. This is your own view and changes nothing in the engine; a tool that is off is simply hidden, not disabled in the chemistry. At least one stays on.
Choose your preferred unit for each quantity used on the platform — SI or Imperial, per dimension. The default is SI everywhere and USD. Switching converts the values on screen, not just the labels; the engine always computes in SI, so a unit or currency choice never changes a calculated result. Ion concentrations stay mg/L in both systems — the industry convention, so there is no choice to make there.
Two headline counts and the peak-load metric. Live users are distinct people active in the last few minutes — from the pseudonymous activity signal, no PII; registered users is the total number of accounts. The metric below answers the surge question: what binds first, and whether every resource holds 30% headroom above its observed peak. Deeper service liveness, RED metrics, database health and logs live on the System Health tab.
Every figure here is observed — a real sample against a real host or configured ceiling — over the trailing 7 days of capacity samples. Load drivers (active users, API calls, DB lock contention) show a peak but never a made-up ceiling. The binding constraint is whichever resource sat highest against its ceiling at the busiest observed moment. Max concurrent is the one projected figure: a linear extrapolation from that busiest point to the binding ceiling, stamped ESTIMATE with its assumption shown — it is not a load-tested limit, and it reads INSUFFICIENT SIGNAL rather than guess when the peak is too thin. Peaks are only as sharp as the sampling cadence — schedule the sample to catch real surges.
Turn a whole segment on or off for the entire deployment. A segment turned off here is unavailable to every user — it disappears from onboarding, from each person's Settings focus, and from every picker, regardless of their per-user grant. At least one must stay on. Every change is written to the audit log and takes effect on each user's next sign-in.
Create an account and choose how the person receives it. Invite sends a one-time activation token — they set their own password, and no secret is ever transmitted. Temporary password issues a password they must change on first sign-in. Either way, the account is created here; nothing is self-signup.
Loading…
An append-only record of account actions — logins, denials, provisioning, activation, password changes, and role/status changes. This is the accountability trail; it is never edited or deleted from here.
Loading…
How the intelligence tools are reporting, by outcome class. This rides the signals the engines already emit — a normal result (ok), a case the tool does not apply to, an unsolvable input, a safety refusal, or an uncalibrated (banded) answer. A rising edge-rate on one tool is a signal to investigate — a bug, or a shift in what users are feeding it. The counts are aggregate; no water chemistry or user input is stored here.
Loading…
Product-usage metrics keyed on a pseudonymous user id — never name or email, and the event stream stores only the action, never water chemistry. First-party and internal only; never sold, shared, or used for advertising.
Loading…
Live health of the seven services, the data stores, and growth trends. Green is healthy, amber needs a look, red needs action. Capacity forecasts are shown only where the data actually supports one — a flat or noisy series says “insufficient signal” rather than guessing. Latency and error spikes and lock errors are shown as current values and thresholds, not forecast. The peak-load & capacity metric and the live/registered user counts are on the Admin console.
Every tab, offer and tool is enabled by default. Disable one here and it is hidden from everyone who is not an admin — the tab button, the offer, or the tool tile simply does not render for them. Admins always see everything (a disabled node is marked off below). Only an admin can change this, and the change is enforced server-side. Scope: this controls UI visibility — a disabled node is hidden from non-admins; hard API-level access control on the underlying endpoints is a separate, disclosed follow-up.
Turns the e-service report workflow on or off for everyone — field capture, validation, the sign-off state machine, e-sign and delivery. Disabling blocks new work but deletes nothing: already-published reports stay accessible, and re-enabling restores the workflow. The change is audited and takes effect within ~30s across the mesh.
Waalgo answers five questions about one water — Diagnose (what will it do), Prescribe (what to hold and what it costs), Operate (act, safely gated), Learn (feed field data back) and Value (the business case) — across five kinds of system (cooling, reverse osmosis, sour, acid-drainage, boiler), plus a cross-cutting Microbial control suite. Every screen reads the same shared water. Tools that don't fit a given water are greyed out, and a segment never shows another segment's answer.
The one discipline behind every tool. Waalgo computes what physics, chemistry, geometry and balance determine — and where an answer needs a measurement (a halogen demand, a NORSOK Kt constant, a lab isotherm, a limestone armoring rate, a steam-table heat content, a price) or lies outside what the model can certify (Legionella, a ‘kill dose’), it asks for it or says so, rather than inventing a number. When you see “INCOMPLETE”, “not computed” or “enter the source-stamped price”, that is the product working as designed — it is what makes the numbers it does give you defensible.
Browse the hierarchy or search to find a tool, then select it to see a plain-language explanation, a worked example, and everything it’s good for — with an Open button that jumps you straight to it.
— · released —. This is 0.x on purpose. The version number is a claim, and 1.0 would claim the core is validated. It is not: the inhibitor ranking has never been checked against wet-lab dose-response. The thermodynamics being right — PHREEQC, published constants, and the checks below — is not the same thing, and the version must not blur it. 1.0.0 ships the day that calibration exists, not before, however many checks pass. Every release carries a changelog entry recording what changed and what was found to be wrong; a test asserts the entry exists.
Waalgo computes scale, corrosion and microbiological-control conditions across seven kinds of water system — cooling towers, reverse osmosis, oil & gas (sour), mining acid drainage, boilers, drinking water and wastewater — and pre-screens candidate treatment chemistry against a compliance envelope. It is built so that every number tells you how much it is worth — and so that where a number would be dishonest, you get a stated gap instead. Five screens, one water: Scale & Corrosion computes the saturation state, Microbial control and Intelligence both read from that analysis, Sensors diagnoses the live operating data, and Inhibitor Screening ranks chemistry against it. The segment-specific reads (sour, acid-drainage, boiler) surface only on the water that needs them.
The reason to run them together is that they share knobs and disagree about them. Raising pH from 7.0 to 8.6 improves mild-steel corrosion, drives calcite from +0.41 to +1.86, drives hydroxyapatite from +4.75 to +10.76, and collapses active chlorine from 77.6% to 8.0%. Four outcomes, three vendors, one knob. Each vendor optimises their own and the plant lives with the sum — this console exists to show the sum.
/intel/ro_polish). Mixed-bed: throughput to exhaustion = rated capacity × resin volume ÷ feed ionic load — exact stoichiometry (1 grain/gal = 17.12 ppm as CaCO₃), hand-checkable. EDI: a feed-suitability gate that checks the RO permeate (hardness / CO₂ / conductivity / free chlorine) against a labelled typical-default design envelope and flags a feed that will scale/foul EDI. The honesty seam: the mixed-bed operating capacity is a datasheet input, never invented (absent → explicit gap); the conductivity→load conversion is a labelled approximation; the EDI limits are a labelled default, not a manufacturer spec; and the achieved product purity / resistivity is NOT predicted — returned as a target class + gap, never a fabricated MΩ-cm. Impossible inputs (non-positive volume/capacity/flow, negative feed, recovery outside (0,1], unsupported mode) are rejected. Covered by its own validity suite (unit + HTTP, negatives with positive controls). Offered on RO and boiler, marked not-applicable on cooling, sour and acid-drainage. Registered in the program enable/disable hierarchy. Not yet: the RO cleaning-chemical selection tool.report_type resolves the matching parameter set (a metallurgy or mechanical-pressure regime resolves to no template, honestly, rather than a fabricated one). The report now emits action items and an insight per record: for each exceedance a factual finding + a transparent severity tier (computed only from your entered value vs your entered limit) + a pointer to where to act — never a fabricated dose, cause or limit; a no-limit parameter yields “enter the permit limit”, not a guess. Status: wired end to end. The compliance report panel has dynamic parameter rows (no longer capped at three) with Load template (pre-fills the exact parameters — names, units, operator shape — limits blank) and Load example (a fenced demo). Every example row is badged “example” and the record is marked ILLUSTRATIVE until you replace the example limits with your own (editing a limit clears its flag). The result renders the insight + ordered action items. Engine, endpoints (/intel/compliance_template, /intel/compliance_example) and UI are built and tested.| Output | Basis | Status |
|---|---|---|
| Saturation index | PHREEQC / Davies on published constants. Reproduces published solubilities it was never fitted to — gypsum, barite, celestite and amorphous silica all land inside 0.07 SI (worst case celestite, 0.069). This is the number to trust. | VALIDATED |
| LSI · RSI · PSI | Standard empirical formulae, calibrated for low-TDS water. We have not benchmarked these values against published worked examples — what we test is the guard that suppresses them above ~4000 mg/L TDS, outside which they mislead. Read them as the industry conventions they are, not as our result. The saturation index is the number to trust. | UNBENCHMARKED |
| Stiff & Davis · S&DSI | The high-salinity analogue of LSI (ASTM D4582), reported where LSI is suppressed above 4000 mg/L TDS — brine, seawater, RO concentrate. K is computed from PHREEQC’s activity coefficients, not read off the published chart: the chart was an approximation of exactly that, and digitising a 1952 nomograph would be guessing at a regulated number with no way to test it. The identity pH − pHs ≡ SI(calcite) closes to 0.000, because they are the same quantity — Stiff & Davis is LSI with a better K. So this adds no accuracy over the calcite SI already shown; it adds the form the industry reports in, valid where LSI is not. | VALIDATED |
| Fast engine | Davies reads high versus ion association — conservative, increasingly so as ionic strength rises. The Rigorous engine hands off to Pitzer the moment its Davies-computed I crosses 0.5 (Pitzer then reports a higher I on the same water, typically ~0.75); Davies is never carried above its own 0.5 convention ceiling, so it does not degrade silently into brine. Use Rigorous for brine and seawater. | BENCHMARKED |
| RO wall SI | Concentration polarisation applied (β, default 1.15). Scale forms at the membrane wall, not in the bulk. | MODELLED |
| Corrosion axis | Adsorption-centre proxy (N/S/aromatic). Real, but not fitted to any inhibition data. | UNCALIBRATED |
| Scale axis | Ca-binding density proxy. Also unfitted. It ranks threshold inhibitors only — molecules that poison crystal growth sub-stoichiometrically at 2–10 ppm. Neither axis sets dose. No wet-lab dose-response data exists behind it. | UNCALIBRATED |
| Calcium phosphate · hydroxyapatite | Reported whenever you enter a PO₄ residual. On a real phosphate programme (Ca 300, PO₄ 6 mg/L, pH 7.8) apatite reaches SI +8.2 against calcite’s +1.1 — the mild-steel inhibitor creates the most supersaturated phase in the tower, and the AA/AMPS dispersant is what holds it in suspension. Flagged kinetically slow: it forms through amorphous precursors over days, so a high SI means your dispersant is doing its job, not that scale is forming now. The thermodynamics is PHREEQC; the rate, and therefore the dispersant dose, is not modelled. | THERMO ONLY |
| Passivating inhibitors | Ortho- and pyrophosphate work by forming an iron-phosphate film, not by adsorbing a lone pair — which is all the corrosion axis measures. They therefore carry no score at all. A 0.0 would call the primary mild-steel inhibitor useless: the chelant error inverted. Pyrophosphate additionally hydrolyses back to orthophosphate in service, faster hot, so a pyro programme becomes an ortho programme and the phosphate risk rises with it — that reversion is disclosed, not modelled. | DISCLOSED |
| Halogen speciation | Acid-base equilibrium, exact. HOCl pKa temperature-corrected from Morris (1966) — reproduces 7.54 at 25 °C. HOBr uses 8.70 at 25 °C with no temperature correction: its T-dependence is not as well established, and inventing one would be worse than disclosing the basis. Only the undissociated acid is a strong biocide, which is why at pH 8.3 bromine is ~5.6× more active than chlorine. | VALIDATED |
| Halogen residual · demand | Predicted from measured demand and bulk decay (Standard Methods 2350) plus exact dilution. Without those constants we refuse and name the test — a default would reproduce the very failure this fixes and look authoritative doing it. The finding: on a fouled tower dilution is ~1% of the halogen loss, so holding time alone overstated the residual by roughly 80×, in the direction that says the biocide is still there when it is gone. This is what separates halogen control from scale dose-response: the constants are an afternoon’s bench work, not a year of field trials. | VALIDATED (CALIBRATED) |
| Dose for residual | Prescriptive, and defensible for a precise reason: the target comes from your own water management programme or HSG274 — never from us — and demand and decay come from a bench test, not a guess. The forward and inverse models are pinned to round-trip against each other. Dose-for-RESIDUAL only. Never dose-for-kill: that needs an efficacy constant which does not exist for biofilm organisms. | VALIDATED |
| Bio-dispersant slug window | How long blowdown must be suspended to hold a slug above its threshold for the contact time — exact dilution arithmetic, and the operational instruction nobody computes. Evaporation is ignored deliberately: it removes water and would concentrate the slug, so ignoring it errs conservative. This is the dosing, not the effect — a bio-dispersant is a penetrant with no concentration-versus-kill relationship, and whether the biofilm lifts is not modelled. | EXACT |
| Phosphorus ledger | The same conservative-tracer balance as the cycles balance, applied to phosphorus. Total P short of the tracer means it is depositing; ortho P above what you dosed means the oxidiser is destroying your phosphonate. Both at once means your oxidiser is manufacturing your scale. Every input is a routine test (Cl, total P, ortho P). Assumes steady dosing and a conservative tracer — heavy bleach dosing reduces to chloride and inflates the tracer, which is disclosed. A 5% band is treated as noise because no noise floor has been established against field data. | UNBENCHMARKED |
| Holding time index | Standard cooling-water arithmetic from the same mass balance the rest of Engine 1 uses: blowdown = evaporation/(cycles−1) − windage. It is a CEILING on contact time, never the contact time — an oxidiser is also lost to demand, sunlight and your own inhibitors, all faster than dilution. A non-oxidiser is not consumed by demand, so dilution is close to its whole loss path and HTI is close to real for it. | EXACT (a ceiling) |
| ASHRAE 188 register | Verification only. ASHRAE 188 separates verification (are we doing what we said?) from validation (is it working?). This register does the first. The bridge that makes it defensible: HSG274 names scale and deposit control AS a Legionella control measure, and that is precisely what Engine 1 computes — so we evaluate a measure the standard names against chemistry we compute exactly. The CFU action levels are deliberately NOT keyed in: guessing at a regulated figure is fabricating it, the same rule that stopped us digitising the Stiff & Davis nomograph. | VERIFICATION ONLY |
| Legionella prediction | Not attempted, and it will not be. Legionella lives in biofilm and inside amoebae, not in the bulk water this product models. Bulk free halogen → CFU has no validated mechanistic model; the literature is epidemiological association. ASHRAE 188, HSG274 and WHO are risk-management frameworks by deliberate choice. The failure is also asymmetric: a wrong saturation index costs money, while a false negative here gives someone a defensible-looking reason not to sample. | REFUSED |
| Mechanism separation | A chelant (citric acid, gluconate) sequesters calcium stoichiometrically — mol‑for‑mol, hundreds of ppm — and is not an antiscalant at antiscalant doses. It binds calcium well and so scores well on binding density, which is why it is ranked on its own axis and never against a threshold inhibitor. Ranked together, citric acid (59.5) outranked polyacrylic acid (47.6), which would be a two-order-of-magnitude dosing error. | ENFORCED |
| Cycle limit · limiting salt | Bisection on the same PHREEQC saturation the rest of Engine 1 uses. The thermodynamics is validated; the practical SI ceilings it bisects against (calcite +2.5 on antiscalant, gypsum 0.0) are industry convention, not measurements — vendor-dependent and unfitted. Kinetically inhibited phases are excluded, or dolomite would limit every water. | MIXED |
| Sensitivity | Each input perturbed, the limiting phase re-solved. Deterministic arithmetic on a validated engine — it inherits the SI's accuracy exactly and adds no assumption of its own. | VALIDATED |
| Cycles balance · deposition rate | Mass balance against a conservative tracer (Cl, EC). The arithmetic is exact and the method is standard practice, but it assumes stable makeup, that nothing else removes the ion, and honest sampling — real towers break all three. No noise floor has been established against field data, so a small shortfall is not yet distinguishable from analytical scatter. The one output here that is a rate, not a tendency. | UNBENCHMARKED |
| Program cost | Water and blowdown are arithmetic; acid is stoichiometric and ignores corrosion risk. The antiscalant line assumes a 5 ppm dose that nothing in this product justifies — thermodynamics does not set a dose. Its ranking is indicative only, and it is labelled LOW in the panel. | PART ILLUSTRATIVE |
- Polymers are scored per repeat unit, using attachment points rather than an arbitrary chain length, so the score no longer moves with how many units you happen to draw. They are now rankable against each other — but the axis is still uncalibrated, and a real antiscalant's performance also depends on molecular weight and distribution, which a repeat unit cannot express. Draw your own polymer with end caps and the old dilution effect returns; use
[*]attachment points. - The practical SI limits are borrowed, not measured. The Intelligence tab’s cycle limit bisects against ceilings that are industry rules of thumb (calcite +2.5 on antiscalant). They are uncalibrated and vendor-dependent. Today this shows: sepiolite currently limits ordinary municipal water at about 3 cycles, while real plants run 5–6 — so either that ceiling is wrong or sepiolite is kinetically slow like dolomite. We do not have the data to say which. Field dose-response data is exactly what replaces these numbers.
- Kinetics are not modelled anywhere. Every index is a tendency. Talc and chrysotile are deliberately not reported even though they are supersaturated in ordinary cooling water — they cannot form at these temperatures, and a permanent alarm on a phase that never appears teaches you to ignore the panel. Dolomite is reported but is famously slow to nucleate; treat it as a long-term indicator, not a today problem.
- A treatment programme is not modelled — only its molecules are. A real cooling programme couples a mild-steel passivator, a yellow-metal azole, a scale inhibitor, a dispersant polymer and two biocides, and the interactions dominate: chlorine degrades tolyltriazole; an oxidiser degrades phosphonates to orthophosphate, which raises the calcium-phosphate risk the dispersant then has to absorb. The couplings are now named on the Microbial control tab, but none of them are given a rate — that would need kinetic constants that do not exist. Biocides are absent entirely and deliberately — nothing in a saturation model speaks to microbiology, and scoring them would invent a third meaningless axis.
- Copolymer composition is inexpressible. An AA/AMPS dispersant is defined by its molecular weight and its sulfonation level, which set its calcium tolerance. We score the AMPS comonomer alone, so neither is expressible — the same limit as the repeat-unit scoring above.
- No dose recommendation. Nothing here tells you how much inhibitor to feed.
- A visible gap is a feature, not a failure. Where PHREEQC will not converge — at absurd concentration, or a charge balance too broken to speciate — the point appears as a gap in the chart, never as a plausible wrong number. The engine refusing to answer is the most important thing it does; a model that always returns a number is the one to distrust.
Questions about Waalgo, the models, or a pilot? Leave a note and it goes straight to the team's inbox.
My Tickets
| Type | Title | State | ETA | Due |
|---|