environmental-engineering-ai999x — offline, verified environmental engineering solver with step-by-step answers

Desktop app & command line · Compute in your browser · Install (Python) · Guides · Evaluation · AI999X on Hugging Face · Website · Support: Buy Me a Coffee

License: Apache-2.0 · Author: Ibnul Jaif Farabi (creator and engineer) · Organization: AI999X · Version 1.0.0

Field: Engineering · Tasks: Question Answering, Sentence Similarity, Feature Extraction

environmental-engineering-ai999x is an offline, deterministic Python solver that answers environmental engineering questions with verified results from 99 certified capabilities, gives 613 documented answers identically on Windows and Linux, and refuses rather than guesses when an answer cannot be verified.

environmental-engineering-ai999x is a compact, deterministic environmental engineering engine for Python. It reads a question in plain English (or a typed call), picks a certified environmental engineering capability, computes the answer exactly, checks it, and returns the result with its steps, units, LaTeX and assumptions — or an honest refusal that says what is missing. It runs fully offline on any CPU, needs no GPU, no API key and no internet, and is built to give zero wrong answers: when it is not sure, it refuses instead of guessing.

Buy me a coffee License Python Offline Rust

Run it your way. environmental-engineering-ai999x comes as the AI999X desktop app and as the command-line program environmental-engineering for Windows and Linux, runs in your browser as WebAssembly, and installs as a Python package. The desktop app, the command line and the browser run the same compiled Rust program on your own device: offline, no Python needed.

Get it

Way to run it For Get it
AI999X Environmental Engineering desktop app 1.2.0 Windows, Linux — this model in its own app: search, ask in words, forms, live figures, explanations, offline Windows (x86-64) · Linux (x86-64)
AI999X desktop app 1.2.0 Windows, Linux — every AI999X model in one app: search, ask in words, forms, live figures, explanations, offline Windows (x86-64) · Linux (x86-64)
Command line (environmental-engineering) Windows, Linux — one program per model, offline, no Python Windows (x86-64) · Linux (x86-64)
In your browser any device — nothing to install Compute on the model page
Python Python 3.10+ pip install environmental-engineering-ai999x

Checksums: SHA256SUMS · every version: https://www.ai999x.com/downloads/desktop/latest/ · install guide: desktop & command line

Rust versions

Environmental Engineering also comes as native programs compiled from Rust, version 1.2.0 of the AI999X desktop app and command line: they run offline on your computer and need no Python. Each file is in this repository's rust/ folder, on the GitHub release v1.0.0 and on the website.

Program System File Size Download Use
Desktop app (Environmental Engineering) Windows x86-64 ai999x-environmental-engineering-1.2.0-windows-x86_64.zip 7.2 MB Hub · GitHub · website unzip, then double-click ai999x-environmental-engineering.exe (no installer)
Desktop app (Environmental Engineering) Linux x86-64 ai999x-environmental-engineering-1.2.0-linux-x86_64.tar.gz 8.2 MB Hub · GitHub · website extract, then run ./ai999x-environmental-engineering (X11 or Wayland desktop)
Command line (environmental-engineering) Windows x86-64 ai999x-environmental-engineering-cli-1.2.0-windows-x86_64.zip 3.0 MB Hub · GitHub · website (all models) unzip, then environmental-engineering.exe ask "<question>" or environmental-engineering.exe solve <capability> name=value
Command line (environmental-engineering) Linux x86-64 ai999x-environmental-engineering-cli-1.2.0-linux-x86_64.tar.gz 2.9 MB Hub · GitHub · website (all models) extract, then ./environmental-engineering ask "<question>" or ./environmental-engineering solve <capability> name=value

The command-line archive holds environmental-engineering with a README of its commands and examples, the licence and the notice. Checksums: rust/SHA256SUMS (sha256sum -c SHA256SUMS).

Quick start

Desktop app

Download AI999X Environmental Engineering for your system (above), unpack it and start it; type a question in words or pick a capability, fill in the form and press Compute. Figures and an explanation of the answer appear beside it. The AI999X desktop app has the same, with Environmental Engineering among all AI999X models.

Linux, from a terminal:

curl -LO https://www.ai999x.com/downloads/desktop/1.2.0/ai999x-environmental-engineering-1.2.0-linux-x86_64.tar.gz
curl -LO https://www.ai999x.com/downloads/desktop/1.2.0/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
tar xzf ai999x-environmental-engineering-1.2.0-linux-x86_64.tar.gz
./ai999x-environmental-engineering-1.2.0-linux-x86_64/ai999x-environmental-engineering

Command line

Linux:

curl -LO https://www.ai999x.com/downloads/desktop/1.2.0/ai999x-cli-1.2.0-linux-x86_64.tar.gz
curl -LO https://www.ai999x.com/downloads/desktop/1.2.0/SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
mkdir -p ~/.local/share && tar xzf ai999x-cli-1.2.0-linux-x86_64.tar.gz -C ~/.local/share
echo 'export PATH="$HOME/.local/share/ai999x-cli-1.2.0-linux-x86_64:$PATH"' >> ~/.bashrc && source ~/.bashrc
environmental-engineering --version

Windows (PowerShell):

$F = "ai999x-cli-1.2.0-windows-x86_64.zip"
Invoke-WebRequest "https://www.ai999x.com/downloads/desktop/1.2.0/$F" -OutFile $F
Invoke-WebRequest "https://www.ai999x.com/downloads/desktop/1.2.0/SHA256SUMS" -OutFile SHA256SUMS
(Get-FileHash $F -Algorithm SHA256).Hash.ToLower() -eq ((Select-String -SimpleMatch $F SHA256SUMS).Line -split ' ')[0]
Expand-Archive $F -DestinationPath "$env:LOCALAPPDATA\AI999X" -Force
$D = "$env:LOCALAPPDATA\AI999X\ai999x-cli-1.2.0-windows-x86_64"; $env:Path += ";$D"
[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";$D", "User")
environmental-engineering --version

Every command below was run as shown; the text under it is what the program printed.

Ask in words — Write the question as you would say it: the program reads the quantities and their units, picks the capability and answers.

$ environmental-engineering ask "Streeter-Phelps oxygen deficit: kd = 0.23 1/d, ka = 0.46 1/d, L0 = 10 mg/L, D0 = 1 mg/L, t = 2 d, DOsat = 9.1 mg/L"
Read as: Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time
D = 0.002726165085 kg/m^3
DO = 0.006373834915 kg/m^3
D_mgL = 2.726165085
DO_mgL = 6.373834915
  by: Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time  (D = kd L0/(ka - kd) (e^(-kd t) - e^(-ka t)) + D0 e^(-ka t); for ka = kd, D = (kd L0 t + D0) e^(-kd t))
  D0 = 0.001 kg/m^3
  DOsat = 0.0091 kg/m^3
  L0 = 0.01 kg/m^3
  ka = 5.324074074e-06 1/s
  kd = 2.662037037e-06 1/s
  t = 172800 s
  assumes: first-order deoxygenation and reaeration; plug flow; deficit stays below saturation

What a capability needs — The equation or method, every input and output with its SI unit. Read this before solve: it tells you the input names.

$ environmental-engineering info enveng_streeter_phelps_deficit
Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time
  D = kd L0/(ka - kd) (e^(-kd t) - e^(-ka t)) + D0 e^(-ka t); for ka = kd, D = (kd L0 t + D0) e^(-kd t)
  in   kd       deoxygenation rate constant [1/s]
  in   ka       reaeration rate constant [1/s]
  in   L0       ultimate BOD of the mixed river water at the outfall [kg/m^3]
  in   D0       oxygen deficit at the outfall (DOsat - DO) [kg/m^3]
  in   t        travel time from the outfall [s]
  in   DOsat    saturation dissolved oxygen [kg/m^3]
  out  D        oxygen deficit at t [kg/m^3]
  out  DO       dissolved oxygen at t [kg/m^3]
  out  D_mgL    deficit in mg/L []
  out  DO_mgL   dissolved oxygen in mg/L []

Solve — Inputs as name=value, each with any unit of the right kind. The answer lists every output, the method used, each input converted to SI, and the conditions the answer assumes.

$ environmental-engineering solve enveng_streeter_phelps_deficit "kd=0.23 1/day" "ka=0.46 1/day" "L0=10 mg/L" "D0=1 mg/L" "t=2 day" "DOsat=9.1 mg/L"
D = 0.002726165085 kg/m^3
DO = 0.006373834915 kg/m^3
D_mgL = 2.726165085
DO_mgL = 6.373834915
  by: Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time  (D = kd L0/(ka - kd) (e^(-kd t) - e^(-ka t)) + D0 e^(-ka t); for ka = kd, D = (kd L0 t + D0) e^(-kd t))
  kd = 2.662037037e-06 1/s
  ka = 5.324074074e-06 1/s
  L0 = 0.01 kg/m^3
  D0 = 0.001 kg/m^3
  t = 172800 s
  DOsat = 0.0091 kg/m^3
  assumes: first-order deoxygenation and reaeration; plug flow; deficit stays below saturation

Many questions at once — One JSON request per line in, one JSON answer per line out, in order: for scripts, notebooks and agents (the program starts once). In PowerShell: Get-Content cases.jsonl | environmental-engineering batch

cases.jsonl:

{"key": "enveng_streeter_phelps_deficit", "inputs": {"kd": "0.23 1/day", "ka": "0.46 1/day", "L0": "10 mg/L", "D0": "1 mg/L", "t": "2 day", "DOsat": "9.1 mg/L"}}
{"key": "enveng_briggs_plume_rise", "inputs": {"vs": "15 m/s", "d": "3 m", "Ts": "420 K", "Ta": "288 K", "u": "5 m/s", "hs": "100 m"}}
$ environmental-engineering batch < cases.jsonl
{"outcome":"SOLVED","message":"","value":0.00637383491469,"unit":"kg/m^3","solved_for":"DO","si":[["kd",2.662037037037037e-6],["ka",5.324074074074074e-6],["L0",0.01],["D0",0.001],["t",172800.0],["DOsat",0.0091]],"values":[["D",0.00272616508531,"kg/m^3"],["DO",0.00637383491469,"kg/m^3"],["D_mgL",2.72616508531,""],["DO_mgL",6.37383491469,""]],"target":"DO","phrase":"oxygen deficit at t","assumptions":["first-order deoxygenation and reaeration","plug flow","deficit stays below saturation"],"name":"Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time","equation":"D = kd L0/(ka - kd) (e^(-kd t) - e^(-ka t)) + D0 e^(-ka t); for ka = kd, D = (kd L0 t + D0) e^(-kd t)"}
{"outcome":"SOLVED","message":"","value":125.637535501,"unit":"m","solved_for":"dh","si":[["vs",15.0],["d",3.0],["Ts",420.0],["Ta",288.0],["u",5.0],["hs",100.0]],"values":[["F",104.0205375,""],["x_f",762.771747653,"m"],["dh",125.637535501,"m"],["H",225.637535501,"m"]],"target":"dh","phrase":"buoyancy flux, m^4/s^3","assumptions":["Ts > Ta","neutral or unstable air (classes A-D)","buoyancy-dominated plume"],"name":"Briggs plume rise and effective stack height (neutral or unstable air)","equation":"F = g vs d^2 (Ts - Ta)/(4 Ts); x_f = 49 F^(5/8) (F < 55) or 119 F^(2/5); dh = 1.6 F^(1/3) x_f^(2/3)/u"}

In your browser

Open Environmental Engineering on ai999x.com, choose a capability and press Compute: the model runs on your own device as WebAssembly; nothing is sent anywhere. Change any input (any unit of the right kind) and the answer, its explanation and the figures follow.

In your own page: environmental_engineering_ai999x.wasm and the loader ax-wasm.js (https://www.ai999x.com/compute/rust/ax-wasm.js).

Python

pip install environmental-engineering-ai999x

Worked examples in every form

The same worked example from the command line, from Python and in the browser. Each command-line output is what the program printed.

Box model of an air basin (well-mixed, time-dependent)

The concentration over a city treated as a well-mixed box: emission flux per area, wind through a box of length L under a mixing height, background air; the concentration after time t and at steady state.

Command line:

$ environmental-engineering solve enveng_box_model "q=4 ug/(m^2*s)" "L=15000 m" "u=3 m/s" "Hm=600 m" "Cb=20 ug/m^3" "C0=20 ug/m^3" "t=2 h"
C = 4.543574138e-08 kg/m^3
C_ss = 5.333333333e-08 kg/m^3
C_ugm3 = 45.43574138
  by: Box model of an air basin (well-mixed, time-dependent)  (dC/dt = q/Hm - u (C - Cb)/L, so C = Css + (C0 - Css) e^(-u t/L) with Css = Cb + q L/(u Hm))
  q = 4e-09 kg/(m^2*s)
  L = 15000 m
  u = 3 m/s
  Hm = 600 m
  Cb = 2e-08 kg/m^3
  C0 = 2e-08 kg/m^3
  t = 7200 s
  assumes: well-mixed box; constant wind, mixing height and emissions

Python:

import environmental_engineering_ai999x as m

a = m.solve("enveng_box_model", q="4 ug/(m^2*s)", L="15000 m", u="3 m/s", Hm="600 m", Cb="20 ug/m^3", C0="20 ug/m^3", t="2 h")
print(a.values or (a.value, a.unit))

Browser: open this capability on the model page and press Compute in your browser.

Briggs dispersion coefficients sigma_y and sigma_z

The horizontal and vertical plume spreads (Pasquill-Gifford curves in Briggs' formulas) at a downwind distance for a stability class, open-country or urban.

Command line:

$ environmental-engineering solve enveng_briggs_dispersion_coefficients "x=1000 m" cls=d terrain=rural
sigma_y = 76.27700714 m
sigma_z = 37.94733192 m
  by: Briggs dispersion coefficients sigma_y and sigma_z  (Briggs (1973) interpolation formulas sigma = a x (1 + b x)^p for each class and terrain)
  x = 1000 m
  cls = d
  terrain = rural
  assumes: 100 m <= x <= 10 km

Python:

import environmental_engineering_ai999x as m

a = m.solve("enveng_briggs_dispersion_coefficients", x="1000 m", cls="d", terrain="rural")
print(a.values or (a.value, a.unit))

Browser: open this capability on the model page and press Compute in your browser.

Briggs plume rise and effective stack height (neutral or unstable air)

The buoyancy flux, the final plume rise by Briggs' 2/3 law (neutral or unstable air) and the effective stack height.

Command line:

$ environmental-engineering solve enveng_briggs_plume_rise "vs=15 m/s" "d=3 m" "Ts=420 K" "Ta=288 K" "u=5 m/s" "hs=100 m"
F = 104.0205375
x_f = 762.7717477 m
dh = 125.6375355 m
H = 225.6375355 m
  by: Briggs plume rise and effective stack height (neutral or unstable air)  (F = g vs d^2 (Ts - Ta)/(4 Ts); x_f = 49 F^(5/8) (F < 55) or 119 F^(2/5); dh = 1.6 F^(1/3) x_f^(2/3)/u)
  vs = 15 m/s
  d = 3 m
  Ts = 420 K
  Ta = 288 K
  u = 5 m/s
  hs = 100 m
  assumes: Ts > Ta; neutral or unstable air (classes A-D); buoyancy-dominated plume

Python:

import environmental_engineering_ai999x as m

a = m.solve("enveng_briggs_plume_rise", vs="15 m/s", d="3 m", Ts="420 K", Ta="288 K", u="5 m/s", hs="100 m")
print(a.values or (a.value, a.unit))

Browser: open this capability on the model page and press Compute in your browser.

Briggs plume rise in stable air

The final rise of a buoyant plume in stable air (classes E, F) from the buoyancy flux, wind speed and potential-temperature gradient, and the effective stack height.

Command line:

$ environmental-engineering solve enveng_briggs_stable_plume_rise "vs=15 m/s" "d=3 m" "Ts=420 K" "Ta=288 K" "u=4 m/s" "dtheta=0.02 K/m" "hs=100 m"
F = 104.0205375
s = 0.0006810173611
dh = 87.55352869 m
H = 187.5535287 m
  by: Briggs plume rise in stable air  (s = (g/Ta) dtheta/dz; dh = 2.6 (F/(u s))^(1/3))
  vs = 15 m/s
  d = 3 m
  Ts = 420 K
  Ta = 288 K
  u = 4 m/s
  dtheta = 0.02 K/m
  hs = 100 m
  assumes: Ts > Ta; stable air: dtheta/dz > 0

Python:

import environmental_engineering_ai999x as m

a = m.solve("enveng_briggs_stable_plume_rise", vs="15 m/s", d="3 m", Ts="420 K", Ta="288 K", u="4 m/s", dtheta="0.02 K/m", hs="100 m")
print(a.values or (a.value, a.unit))

Browser: open this capability on the model page and press Compute in your browser.

Documentation

Highlights

  • Verified, not generated. Every answer is computed by a certified environmental engineering capability and checked (substituted back, dimension-checked or compared with an independent computation) before it is returned.
  • Zero wrong answers by design. Seven explicit outcomes — SOLVED, NEEDS_INPUT, AMBIGUOUS, INVALID_INPUT, OUT_OF_SCOPE, UNRECOGNIZED_FORMAT, INTERNAL_ERROR — never a silent guess. Every one of its 613 documented answers is reproduced exactly on every tested platform.
  • Plain-English questions and a guaranteed typed interface. ask() reads documented question forms; solve(capability_id, **inputs) always solves a supported task with valid inputs.
  • Explains itself. Steps, formulas in LaTeX, units, assumptions and the model used, ready for notebooks, tutoring apps and homework checkers.
  • Native and in the browser. Every capability also computes natively in Rust: the desktop app and the environmental-engineering command line for Windows and Linux, and WebAssembly on the model page — no Python, no network.
  • Small and portable. Pure Python (sympy, mpmath); identical answers on Windows and Linux (Python 3.10, 3.11, 3.12, 3.13, 3.14).
  • Coverage: air pollution dispersion, water quality, water and wastewater treatment, gas transfer, noise and solid waste.

Model overview

Property Value
Package environmental-engineering-ai999x 1.0.0 (import environmental_engineering_ai999x)
Type Deterministic neuro-symbolic environmental engineering engine (rule-based reading + certified symbolic capabilities)
Capabilities 99 certified procedures
Knowledge pack version 1.0.0
Golden answers 613 documented answers, identical on every tested platform
Platforms tested Windows (Python 3.13), Linux x86-64 (Python 3.10, 3.11, 3.12, 3.13, 3.14)
Runtime CPU only, offline; no GPU, no network, no API key
License Apache-2.0
Creator / engineer Ibnul Jaif Farabi
Organization AI999X

Python quick start

pip install environmental-engineering-ai999x
# or straight from this repository:
pip install https://huggingface.co/AI999X/environmental-engineering-ai999x/resolve/main/dist/environmental_engineering_ai999x-1.0.0-py3-none-any.whl
import environmental_engineering_ai999x as environmental_engineering

environmental_engineering.ask("Streeter-Phelps oxygen deficit: kd = 0.23 1/d, ka = 0.46 1/d, L0 = 10 mg/L, D0 = 1 mg/L, t = 2 d, DOsat = 9.1 mg/L").show()
# -> SOLVED — D = 0.00272617, DO = 0.00637383, D_mgL = 2.72617, DO_mgL = 6.37383  (enveng_streeter_phelps_deficit)
environmental_engineering.ask("Briggs plume rise: vs = 15 m/s, d = 3 m, Ts = 420 K, Ta = 288 K, u = 5 m/s, hs = 100 m").show()
# -> SOLVED — F = 104.021, x_f = 762.772, dh = 125.638, H = 225.638  (enveng_briggs_plume_rise)
environmental_engineering.solve("enveng_gaussian_plume_concentration", Q=0.1, u=4.0, sigma_y=60.0, sigma_z=30.0, H=50.0, y=20.0, z=0.0).show()
# -> SOLVED — C = 1.04281e-06, C_ugm3 = 1042.81  (enveng_gaussian_plume_concentration)
environmental_engineering.ask("Activated sludge complete-mix design: Y = 0.5, k = 5 1/d, Ks = 60 mg/L, kd = 0.06 1/d, SRT = 10 d, HRT = 6 h, S0 = 250 mg/L").show()
# -> SOLVED — S = 0.00410256, S_mgL = 4.10256, X = 3.07372, X_mgL = 3073.72  (enveng_activated_sludge_cstr_design)
environmental_engineering.solve("enveng_decibel_addition", L=[85.0, 85.0, 90.0]).show()
# -> SOLVED — L_total = 92.1284  (enveng_decibel_addition)
environmental_engineering.ask("Who created you?").message
# -> environmental-engineering-ai999x was created and engineered by Ibnul Jaif Farabi at AI999X.

The Python package also installs a Python command, environmental-engineering-ai999x "<question>"; for the native program use environmental-engineering (above). The outputs above were produced by running this exact code on environmental-engineering-ai999x 1.0.0.

How every answer is verified

  1. Reading — the question is turned into typed quantities (value, unit, kind, role) and one asked quantity; every stated number must be used or the question is refused.
  2. Planning — only certified capabilities may answer; a capability applies only under the conditions the wording states (for example a pendulum, a liquid at rest, boiling).
  3. Computing — exact symbolic or high-precision numeric evaluation.
  4. Checking — dimensions, substitution back into the defining equation, and agreement between independent readings; any disagreement becomes a refusal, never a number.

Capabilities are certified before they ship: each must reproduce hand-worked reference cases, reject a deliberately wrong variant (a control), and leave every benchmark answer unchanged.

Python worked examples, with their steps

Each question was put to environmental-engineering-ai999x; the answer is the one it returned, with the steps it took.

Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time · Water quality

Streeter-Phelps oxygen deficit: kd = 0.23 1/d, ka = 0.46 1/d, L0 = 10 mg/L, D0 = 1 mg/L, t = 2 d, DOsat = 9.1 mg/L

→ D = 0.002726165085 kg/m^3, DO = 0.006373834915 kg/m^3, D_mgL = 2.726165085, DO_mgL = 6.373834915

Steps
  • Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time: kd = 0.23 1/day, ka = 0.46 1/day, L0 = 10 mg/L, D0 = 1 mg/L, t = 2 day, DOsat = 9.1 mg/L → D = 0.002726165085 kg/m^3, DO = 0.006373834915 kg/m^3, D_mgL = 2.726165085 kg/m^3, DO_mgL = 6.373834915 kg/m^3

Briggs plume rise and effective stack height (neutral or unstable air) · Air pollution

Briggs plume rise: vs = 15 m/s, d = 3 m, Ts = 420 K, Ta = 288 K, u = 5 m/s, hs = 100 m

→ F = 104.0205375, x_f = 762.7717477 m, dh = 125.6375355 m, H = 225.6375355 m

Steps
  • Briggs plume rise and effective stack height (neutral or unstable air): vs = 15 m/s, d = 3 m, Ts = 420 K, Ta = 288 K, u = 5 m/s, hs = 100 m → F = 104.0205375 m, x_f = 762.7717477 m, dh = 125.6375355 m, H = 225.6375355 m

Gaussian plume concentration at a receptor (ground reflection) · Air pollution

m.solve("enveng_gaussian_plume_concentration", Q=0.1, u=4.0, sigma_y=60.0, sigma_z=30.0, H=50.0, y=20.0, z=0.0)

→ C = 1.042805659e-06 kg/m^3, C_ugm3 = 1042.805659

Steps
  • Gaussian plume concentration at a receptor (ground reflection): Q = 0.1 kg/s, u = 4 m/s, sigma_y = 60 m, sigma_z = 30 m, H = 50 m, y = 20 m, z = 0 m → C = 1.042805659e-06 kg/m^3, C_ugm3 = 1042.805659 kg/m^3

Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty) · Wastewater

Activated sludge complete-mix design: Y = 0.5, k = 5 1/d, Ks = 60 mg/L, kd = 0.06 1/d, SRT = 10 d, HRT = 6 h, S0 = 250 mg/L

→ S = 0.004102564103 kg/m^3, S_mgL = 4.102564103, X = 3.073717949 kg/m^3, X_mgL = 3073.717949, Y_obs = 0.3125

Steps
  • Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty): Y = 0.5, k = 5 1/day, Ks = 60 mg/L, kd = 0.06 1/day, SRT = 10 day, HRT = 6 h, S0 = 250 mg/L → S = 0.004102564103 kg/m^3, S_mgL = 4.102564103 kg/m^3, X = 3.073717949 kg/m^3, X_mgL = 3073.717949 kg/m^3, Y_obs = 0.3125 kg/m^3

Adding sound levels in decibels · Noise

m.solve("enveng_decibel_addition", L=[85.0, 85.0, 90.0])

→ L_total = 92.1284136

Steps
  • Adding sound levels in decibels: L = [85, 85, 90] → L_total = 92.1284136

Packed-tower air stripping: stripping factor, transfer units and height · Gas transfer

Air stripping tower: Qw = 0.05 m^3/s, Qa = 1.5 m^3/s, H = 0.2, Cin = 200 ug/L, Cout = 5 ug/L, HTU = 1 m

→ R = 6, NTU = 4.213854527, Z = 4.213854527 m, air_to_water_min = 4.875

Steps
  • Packed-tower air stripping: stripping factor, transfer units and height: Qw = 0.05 m^3/s, Qa = 1.5 m^3/s, H = 0.2, Cin = 200 ug/L, Cout = 5 ug/L, HTU = 1 m → R = 6 m, NTU = 4.213854527 m, Z = 4.213854527 m, air_to_water_min = 4.875 m

Figures

Every point was computed by environmental-engineering-ai999x.

Briggs plume rise and effective stack height (neutral or unstable air)

Briggs plume rise and effective stack height (neutral or unstable air) — computed by environmental-engineering-ai999x

dh (plume rise) against vs (stack gas exit velocity), with Ta = 288 K, Ts = 420 K, d = 3 m, hs = 100 m, u = 5 m/s. 31 points computed by environmental-engineering-ai999x; marked: vs = 15, dh = 125.638 m.

Packed-tower air stripping: stripping factor, transfer units and height

Packed-tower air stripping: stripping factor, transfer units and height — computed by environmental-engineering-ai999x

Z (packed height HTU NTU) against Qw (water flow), with Cin = 2.00e-4 kg/m^3, Cout = 5.00e-6 kg/m^3, H = 0.2, HTU = 1 m, Qa = 1.5 m^3/s. 31 points computed by environmental-engineering-ai999x; marked: Qw = 0.05, Z = 4.21385 m.

Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty)

Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty) — computed by environmental-engineering-ai999x

S (effluent soluble substrate) against Y (true yield coefficient, kg VSS per kg BOD), with HRT = 21600 s, Ks = 0.06 kg/m^3, S0 = 0.25 kg/m^3, SRT = 8.64e5 s, k = 5.79e-5 1/s, kd = 6.94e-7 1/s. 31 points computed by environmental-engineering-ai999x; marked: Y = 0.5, S = 0.00410256 kg/m^3.

Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time

Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time — computed by environmental-engineering-ai999x

DO (dissolved oxygen at t) against kd (deoxygenation rate constant), with D0 = 0.001 kg/m^3, DOsat = 0.0091 kg/m^3, L0 = 0.01 kg/m^3, ka = 5.32e-6 1/s, t = 1.73e5 s. 31 points computed by environmental-engineering-ai999x; marked: kd = 2.66204e-06, DO = 0.00637383 kg/m^3.

Capabilities

99 certified procedures. A few of them:

  • Procedures: Activated carbon dose from the Freundlich isotherm; Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty); Adding sound levels in decibels; Adsorbent dose from the Langmuir isotherm; BOD exerted after a time (first-order); BOD from a dilution test (with optional seed correction); BOD rate constant and ultimate BOD fitted to BOD data; Box model of an air basin (well-mixed, time-dependent); Briggs dispersion coefficients sigma_y and sigma_z; Briggs plume rise and effective stack height (neutral or unstable air); Briggs plume rise in stable air; Chlorine dose and feed rate; Clean-bed head loss through a granular filter (Ergun / Carman-Kozeny); Concentration after mixing a discharge with a river; Concentration in a well-mixed lake over time; Critical (minimum) dissolved oxygen of the oxygen sag; Cyclone cut diameter and fractional efficiency (Lapple); Day-night (Ldn) and day-evening-night (Lden) sound levels; Disinfection CT value of a contact basin; Disinfection by the Chick-Watson law; Dissolved concentration in equilibrium with a gas (Henry's law); Dissolved oxygen at a distance downstream (Streeter-Phelps); Dissolved oxygen during aeration and the transfer rate; Dissolved oxygen saturation concentration (Benson-Krause) …

environmental_engineering_ai999x.templates() lists every question form ask() reads; the capability guide (PDF, every example executed) is included in this repository.

All 99 formulas

Show every formula, by topic

Air pollution / Gaussian plume

Gaussian plume concentration at a receptor (ground reflection)

C=Q2πuσyσze−y22σy2[e−(z−H)22σz2+e−(z+H)22σz2] C = \frac{Q}{2\pi u\sigma_y\sigma_z} e^{-\frac{y^2}{2\sigma_y^2}}\left[e^{-\frac{(z-H)^2}{2\sigma_z^2}} + e^{-\frac{(z+H)^2}{2\sigma_z^2}}\right]

Gaussian plume concentration from the stability class

C=Q2πuσy(x)σz(x)e−y22σy2[e−(z−H)22σz2+e−(z+H)22σz2] C = \frac{Q}{2\pi u\sigma_y(x)\sigma_z(x)} e^{-\frac{y^2}{2\sigma_y^2}}\left[e^{-\frac{(z-H)^2}{2\sigma_z^2}} + e^{-\frac{(z+H)^2}{2\sigma_z^2}}\right]

Gaussian plume trapped below an inversion lid (multiple reflections)

C=Qe−y2/2σy22πuσyσz∑n=−∞∞[e−(z−H+2nL)22σz2+e−(z+H+2nL)22σz2] C = \frac{Q e^{-y^2/2\sigma_y^2}}{2\pi u\sigma_y\sigma_z}\sum_{n=-\infty}^{\infty}\left[e^{-\frac{(z-H+2nL)^2}{2\sigma_z^2}} + e^{-\frac{(z+H+2nL)^2}{2\sigma_z^2}}\right]

Ground-level centreline concentration of a plume

C(x,0,0)=Qπuσyσzexp⁡ ⁣(−H22σz2) C(x,0,0) = \frac{Q}{\pi u\sigma_y\sigma_z}\exp\!\left(-\frac{H^2}{2\sigma_z^2}\right)

Stack plume: effective height, dispersion and ground-level concentration

C=Qπuσyσzexp⁡ ⁣(−(hs+Δh)22σz2) C = \frac{Q}{\pi u\sigma_y\sigma_z}\exp\!\left(-\frac{(h_s + \Delta h)^2}{2\sigma_z^2}\right)

Air pollution / atmospheric stability

Pasquill-Turner atmospheric stability class

class=T(u, insolation or cloud cover) \text{class} = T(u,\ \text{insolation or cloud cover})

Air pollution / box model

Box model of an air basin (well-mixed, time-dependent)

C(t)=Css+(C0−Css)e−ut/L,Css=Cb+qLuHm C(t) = C_{ss} + (C_0 - C_{ss})e^{-ut/L},\quad C_{ss} = C_b + \frac{qL}{uH_m}

Air pollution / concentration units

Gas concentration: mass concentration to ppm (by volume)

ppm=CRTPM×106 \text{ppm} = \frac{C R T}{P M}\times10^{6}

Gas concentration: ppm (by volume) to mass concentration

C=ppm×10−6 PMRT C = \text{ppm}\times10^{-6}\,\frac{P M}{R T}

Air pollution / dispersion coefficients

Briggs dispersion coefficients sigma_y and sigma_z

σy=ayx1+byx,σz=azx (1+bzx)pz \sigma_y = \frac{a_y x}{\sqrt{1 + b_y x}},\quad \sigma_z = a_z x\,(1 + b_z x)^{p_z}

Air pollution / emissions

Sulfur dioxide emission from fuel sulfur

E=m˙fuel S MSO2MS(1−η) E = \dot m_{fuel}\,S\,\frac{M_{SO_2}}{M_S}(1-\eta)

Air pollution / maximum concentration

Maximum ground-level concentration (constant sigma_y/sigma_z)

Cmax=2Qπe uH2σzσy,σz=H2 C_{max} = \frac{2Q}{\pi e\,u H^2}\frac{\sigma_z}{\sigma_y},\quad \sigma_z = \frac{H}{\sqrt 2}

Maximum ground-level concentration and its distance (Briggs coefficients)

dln⁡Cdx=−σy′σy+σz′σz(H2σz2−1)=0 \frac{d\ln C}{dx} = -\frac{\sigma_y'}{\sigma_y} + \frac{\sigma_z'}{\sigma_z}\left(\frac{H^2}{\sigma_z^2} - 1\right) = 0

Air pollution / particulate control

Cyclone cut diameter and fractional efficiency (Lapple)

d50=9μW2πNeVi(ρp−ρg),η=11+(d50/dp)2 d_{50} = \sqrt{\frac{9\mu W}{2\pi N_e V_i(\rho_p - \rho_g)}},\quad \eta = \frac{1}{1 + (d_{50}/d_p)^2}

Electrostatic precipitator efficiency (Deutsch-Anderson)

η=1−e−wA/Q \eta = 1 - e^{-wA/Q}

Electrostatic precipitator plate area for a target efficiency

A=−Qwln⁡(1−η) A = -\frac{Q}{w}\ln(1-\eta)

Gravity settling chamber collection efficiency

η=vtLWNQ,vt=g(ρp−ρg)dp218μ \eta = \frac{v_t L W N}{Q},\quad v_t = \frac{g(\rho_p - \rho_g)d_p^2}{18\mu}

Air pollution / plume rise

Briggs plume rise and effective stack height (neutral or unstable air)

F=gvsd2(Ts−Ta)4Ts,Δh=1.6F1/3xf2/3u F = \frac{g v_s d^2 (T_s - T_a)}{4T_s},\quad \Delta h = \frac{1.6F^{1/3}x_f^{2/3}}{u}

Briggs plume rise in stable air

Δh=2.6(Fus)1/3,s=gTa∂θ∂z \Delta h = 2.6\left(\frac{F}{u s}\right)^{1/3},\quad s = \frac{g}{T_a}\frac{\partial\theta}{\partial z}

Holland plume rise

Δh=vsdu(1.5+2.68×10−3 p d Ts−TaTs) \Delta h = \frac{v_s d}{u}\left(1.5 + 2.68\times10^{-3}\,p\,d\,\frac{T_s - T_a}{T_s}\right)

Air pollution / wind profile

Wind speed at height (power law)

u2=u1(z2z1)p u_2 = u_1\left(\frac{z_2}{z_1}\right)^p

Gas transfer / Henry's law

Dissolved concentration in equilibrium with a gas (Henry's law)

C=pH C = \frac{p}{H}

Henry's law constant conversion between forms

Hcc=HpcRT,Hpx=Hpc cw,Hcp=1Hpc H_{cc} = \frac{H_{pc}}{RT},\quad H_{px} = H_{pc}\,c_w,\quad H_{cp} = \frac{1}{H_{pc}}

Temperature dependence of Henry's constant (van 't Hoff)

Hcp(T)=Hcp(Tref)exp⁡ ⁣[B(1T−1Tref)] H^{cp}(T) = H^{cp}(T_{ref})\exp\!\left[B\left(\frac1T - \frac{1}{T_{ref}}\right)\right]

Gas transfer / air stripping

Packed-tower air stripping: stripping factor, transfer units and height

NTU=RR−1ln⁡ ⁣[(Cin/Cout)(R−1)+1R],Z=HTU⋅NTU NTU = \frac{R}{R-1}\ln\!\left[\frac{(C_{in}/C_{out})(R-1) + 1}{R}\right],\quad Z = HTU\cdot NTU

Gas transfer / two-film theory

Overall liquid-phase transfer coefficient and flux (two-film theory)

1KL=1kl+1Hkg,N=KL(C−CgH) \frac{1}{K_L} = \frac{1}{k_l} + \frac{1}{Hk_g},\quad N = K_L\left(C - \frac{C_g}{H}\right)

Noise / community noise

Day-night (Ldn) and day-evening-night (Lden) sound levels

Ldn=10log⁡10124(∑day10Lh/10+∑night10(Lh+10)/10) L_{dn} = 10\log_{10}\frac{1}{24}\left(\sum_{day}10^{L_h/10} + \sum_{night}10^{(L_h+10)/10}\right)

Noise / decibel arithmetic

Adding sound levels in decibels

L=10log⁡10∑i10Li/10 L = 10\log_{10}\sum_i 10^{L_i/10}

Source level after removing background noise

Ls=10log⁡10(10Lt/10−10Lb/10) L_s = 10\log_{10}\left(10^{L_t/10} - 10^{L_b/10}\right)

Noise / exposure

Equivalent continuous sound level Leq

Leq=10log⁡10∑iti10Li/10∑iti L_{eq} = 10\log_{10}\frac{\sum_i t_i10^{L_i/10}}{\sum_i t_i}

Noise / occupational exposure

Occupational noise dose and 8-hour TWA (OSHA, 5 dB exchange)

D=100∑iCiTi, Ti=82(Li−90)/5, TWA=16.61log⁡10D100+90 D = 100\sum_i\frac{C_i}{T_i},\ T_i = \frac{8}{2^{(L_i-90)/5}},\ TWA = 16.61\log_{10}\frac{D}{100} + 90

Noise / propagation

Sound level at another distance (point or line source)

L2=L1−20log⁡10r2r1 (point) L_2 = L_1 - 20\log_{10}\frac{r_2}{r_1}\ \text{(point)}

Sound pressure level from sound power level

Lp=LW+10log⁡10Q4πr2 L_p = L_W + 10\log_{10}\frac{Q}{4\pi r^2}

Solid waste / energy recovery

Heating value of waste from its elemental composition (modified Dulong)

HHV=337C+1419(H−O8)+93S+23N  [kJ/kg, %] HHV = 337C + 1419\left(H - \frac O8\right) + 93S + 23N\ \ [\mathrm{kJ/kg},\ \%]

Solid waste / generation

Municipal solid waste generation and collection trucks

m˙=P r,n=⌈m˙ρVt⌉ \dot m = P\,r,\quad n = \left\lceil\frac{\dot m}{\rho V_t}\right\rceil

Solid waste / landfill gas

Landfill methane generation (first-order decay, constant acceptance)

Q(t)=∫0min⁡(t,tc)kL0M e−k(t−τ)dτ=ML0(e−k(t−min⁡(t,tc))−e−kt) Q(t) = \int_0^{\min(t,t_c)} kL_0M\,e^{-k(t-\tau)}d\tau = ML_0\left(e^{-k(t-\min(t,t_c))} - e^{-kt}\right)

Solid waste / landfills

Landfill life with daily cover and waste growth

n=ln⁡(1+CgV0)ln⁡(1+g),V0=M(1+c)ρ n = \frac{\ln\left(1 + \frac{C g}{V_0}\right)}{\ln(1+g)},\quad V_0 = \frac{M(1 + c)}{\rho}

Solid waste / properties

Moisture content of mixed solid waste

Mwet=∑miwi∑mi M_{wet} = \frac{\sum m_iw_i}{\sum m_i}

Wastewater / activated sludge

Activated sludge (complete mix) effluent substrate and biomass (Lawrence-McCarty)

S=Ks(1+kdθc)θc(Yk−kd)−1,X=θcY(S0−S)θ(1+kdθc) S = \frac{K_s(1 + k_d\theta_c)}{\theta_c(Yk - k_d) - 1},\quad X = \frac{\theta_c Y(S_0 - S)}{\theta(1 + k_d\theta_c)}

Food-to-microorganism ratio (F/M)

FM=QS0VX \frac FM = \frac{QS_0}{VX}

Hydraulic retention time and volumetric organic loading

θ=VQ,Lv=QS0V \theta = \frac VQ,\quad L_v = \frac{QS_0}{V}

Minimum (washout) solids retention time

1θc,min=YkS0Ks+S0−kd \frac{1}{\theta_{c,min}} = \frac{YkS_0}{K_s + S_0} - k_d

Oxygen requirement of an activated-sludge process

m˙O2=Q(S0−S)f−1.42Px \dot m_{O_2} = \frac{Q(S_0 - S)}{f} - 1.42P_x

Return activated sludge ratio

R=QrQ=XXr−X R = \frac{Q_r}{Q} = \frac{X}{X_r - X}

Sludge volume index (SVI)

SVI=V30MLSS SVI = \frac{V_{30}}{MLSS}

Solids retention time (mean cell residence time)

θc=VXQwXw+QeXe \theta_c = \frac{VX}{Q_wX_w + Q_eX_e}

Waste biomass production (observed yield)

Px=Y1+kdθcQ(S0−S) P_x = \frac{Y}{1 + k_d\theta_c}Q(S_0 - S)

Wastewater / aeration

Dissolved oxygen during aeration and the transfer rate

C=Cs−(Cs−C0)e−KLa t C = C_s - (C_s - C_0)e^{-K_La\,t}

Field (actual) oxygen transfer rate of an aeration system

AOTR=SOTR α θT−20 βCs,TF−CLCs,20 AOTR = SOTR\,\alpha\,\theta^{T-20}\,\frac{\beta C_{s,T}F - C_L}{C_{s,20}}

KLa fitted to a reaeration test

ln⁡(Cs−C)=ln⁡(Cs−C0)−KLa t \ln(C_s - C) = \ln(C_s - C_0) - K_La\,t

Overall oxygen transfer coefficient KLa from two DO readings

KLa=ln⁡Cs−C1Cs−C2t2−t1 K_La = \frac{\ln\frac{C_s - C_1}{C_s - C_2}}{t_2 - t_1}

Wastewater / anaerobic treatment

Methane production from COD removed (anaerobic digestion)

QCH4=COD−1.42Px64 g/mol RTP Q_{CH_4} = \frac{\mathrm{COD} - 1.42P_x}{64\ \mathrm{g/mol}}\,\frac{RT}{P}

Wastewater / attached growth

Trickling filter BOD removal efficiency (NRC equation)

E=1001+0.4432W/(VF),F=1+R(1+R/10)2 E = \frac{100}{1 + 0.4432\sqrt{W/(VF)}},\quad F = \frac{1+R}{(1 + R/10)^2}

Wastewater / microbial kinetics

Monod specific growth rate

μ=μmaxSKs+S \mu = \frac{\mu_{max}S}{K_s + S}

Wastewater / sludge handling

Sludge volume after thickening or dewatering

V2=V1P1P2 V_2 = V_1\frac{P_1}{P_2}

Volume of wet sludge from dry solids

V=MsρwSslPs V = \frac{M_s}{\rho_w S_{sl} P_s}

Water quality / BOD kinetics

BOD exerted after a time (first-order)

BODt=L0(1−e−kt) BOD_t = L_0\left(1 - e^{-kt}\right)

BOD rate constant and ultimate BOD fitted to BOD data

min⁡k,L0∑i[yi−L0(1−e−kti)]2 \min_{k,L_0}\sum_i\left[y_i - L_0\left(1 - e^{-kt_i}\right)\right]^2

Temperature correction of a rate constant (theta model)

kT=k20 θ T−20 k_T = k_{20}\,\theta^{\,T - 20}

Ultimate BOD from a BOD test

L0=BODt1−e−kt L_0 = \frac{BOD_t}{1 - e^{-kt}}

Water quality / BOD measurement

BOD from a dilution test (with optional seed correction)

BOD=(D1−D2)−(B1−B2)fP BOD = \frac{(D_1 - D_2) - (B_1 - B_2)f}{P}

Water quality / dissolved oxygen

Dissolved oxygen saturation concentration (Benson-Krause)

ln⁡Cs=−139.34411+1.575701×105T−6.642308×107T2+1.2438×1010T3−8.621949×1011T4−S(… ) \ln C_s = -139.34411 + \frac{1.575701\times10^5}{T} - \frac{6.642308\times10^7}{T^2} + \frac{1.2438\times10^{10}}{T^3} - \frac{8.621949\times10^{11}}{T^4} - S(\dots)

Water quality / lakes

Concentration in a well-mixed lake over time

C(t)=Css+(C0−Css)e−(Q/V+k)t C(t) = C_{ss} + (C_0 - C_{ss})e^{-(Q/V + k)t}

Steady-state concentration in a well-mixed lake (first-order decay)

C=WQ+kV C = \frac{W}{Q + kV}

Water quality / loads

Pollutant mass load of a flow

W=Q C W = Q\,C

Water quality / mass balance

Concentration after mixing a discharge with a river

C=QwCw+QrCrQw+Qr C = \frac{Q_w C_w + Q_r C_r}{Q_w + Q_r}

Flow-weighted mixing of several streams

C=∑iQiCi∑iQi C = \frac{\sum_i Q_i C_i}{\sum_i Q_i}

Water quality / oxygen demand

Theoretical oxygen demand of an organic compound

ThOD=(a+b4−c2−3d4)MO2M \text{ThOD} = \frac{\left(a + \frac b4 - \frac c2 - \frac{3d}{4}\right)M_{O_2}}{M}

Water quality / oxygen sag

Critical (minimum) dissolved oxygen of the oxygen sag

tc=1ka−kdln⁡ ⁣[kakd(1−D0(ka−kd)kdL0)],Dc=kdkaL0e−kdtc t_c = \frac{1}{k_a - k_d}\ln\!\left[\frac{k_a}{k_d}\left(1 - \frac{D_0(k_a - k_d)}{k_d L_0}\right)\right],\quad D_c = \frac{k_d}{k_a}L_0e^{-k_d t_c}

Dissolved oxygen at a distance downstream (Streeter-Phelps)

D(x)=kdL0ka−kd(e−kdx/v−e−kax/v)+D0e−kax/v D(x) = \frac{k_d L_0}{k_a - k_d}\left(e^{-k_d x/v} - e^{-k_a x/v}\right) + D_0 e^{-k_a x/v}

Streeter-Phelps oxygen deficit and dissolved oxygen at a travel time

D=kdL0ka−kd(e−kdt−e−kat)+D0e−kat D = \frac{k_d L_0}{k_a - k_d}\left(e^{-k_d t} - e^{-k_a t}\right) + D_0 e^{-k_a t}

Water quality / reaeration

Stream reaeration coefficient (O'Connor-Dobbins, Churchill, Owens-Gibbs)

ka=3.93 u0.5H1.5 (O’Connor-Dobbins) k_a = \frac{3.93\,u^{0.5}}{H^{1.5}}\ \text{(O'Connor-Dobbins)}

Water quality / rivers

First-order decay of a pollutant downstream (plug flow)

C=C0 e−kx/u C = C_0\,e^{-kx/u}

Water treatment / adsorption

Activated carbon dose from the Freundlich isotherm

qe=KCe1/n,mV=C0−Ceqe q_e = K C_e^{1/n},\quad \frac{m}{V} = \frac{C_0 - C_e}{q_e}

Adsorbent dose from the Langmuir isotherm

qe=qmaxbCe1+bCe,mV=C0−Ceqe q_e = \frac{q_{max}bC_e}{1 + bC_e},\quad \frac{m}{V} = \frac{C_0 - C_e}{q_e}

Freundlich isotherm constants fitted to adsorption data

log⁡qe=log⁡K+1nlog⁡Ce \log q_e = \log K + \frac1n\log C_e

Langmuir isotherm constants fitted to adsorption data

Ceqe=1qmaxb+Ceqmax \frac{C_e}{q_e} = \frac{1}{q_{max}b} + \frac{C_e}{q_{max}}

Water treatment / basin hydraulics

Hydraulic detention time

θ=VQ \theta = \frac{V}{Q}

Water treatment / disinfection

Chlorine dose and feed rate

m˙=Q (demand+residual),m˙product=m˙p \dot m = Q\,(\text{demand} + \text{residual}),\quad \dot m_{product} = \frac{\dot m}{p}

Disinfection CT value of a contact basin

CT=C t10=C BF VQ CT = C\,t_{10} = C\,BF\,\frac{V}{Q}

Disinfection by the Chick-Watson law

ln⁡NN0=−k Cnt \ln\frac{N}{N_0} = -k\,C^n t

Fraction of free chlorine as hypochlorous acid (pH)

αHOCl=11+10 pH−pKa \alpha_{HOCl} = \frac{1}{1 + 10^{\,pH - pK_a}}

Log inactivation from the CT ratio

log inactivation=3 Ct10CT99.9 \text{log inactivation} = 3\,\frac{C t_{10}}{CT_{99.9}}

Log removal and percentage removal

LR=log⁡10N0N LR = \log_{10}\frac{N_0}{N}

Microbial inactivation by Chick's law (first order)

NN0=e−kt \frac{N}{N_0} = e^{-kt}

Water treatment / filtration

Clean-bed head loss through a granular filter (Ergun / Carman-Kozeny)

hL=150μ(1−ε)2vρgε3(ψd)2+1.75(1−ε)v2gε3ψd \frac{h}{L} = \frac{150\mu(1-\varepsilon)^2 v}{\rho g\varepsilon^3(\psi d)^2} + \frac{1.75(1-\varepsilon)v^2}{g\varepsilon^3\psi d}

Filter bed expansion during backwash

εe=(vbvs)0.22,Le=L(1−ε)1−εe \varepsilon_e = \left(\frac{v_b}{v_s}\right)^{0.22},\quad L_e = \frac{L(1-\varepsilon)}{1-\varepsilon_e}

Filtration (hydraulic loading) rate with one filter out of service

v=QNA,v′=Q(N−1)A v = \frac{Q}{NA},\quad v' = \frac{Q}{(N-1)A}

Water treatment / membranes

Membrane recovery, rejection, flux and concentrate

r=QpQf, R=1−CpCf, Cc=QfCf−QpCpQf−Qp r = \frac{Q_p}{Q_f},\ R = 1 - \frac{C_p}{C_f},\ C_c = \frac{Q_fC_f - Q_pC_p}{Q_f - Q_p}

Osmotic pressure of a dilute solution (van 't Hoff)

π=i CM RT \pi = i\,\frac{C}{M}\,RT

Water treatment / mixing and flocculation

Mean velocity gradient G (rapid mixing and flocculation)

G=PμV G = \sqrt{\frac{P}{\mu V}}

Power needed for a target velocity gradient

P=G2μV P = G^2\mu V

Water treatment / sedimentation

Fraction of discrete particles removed in an ideal settling basin

R=min⁡(1,vsv0) R = \min\left(1, \frac{v_s}{v_0}\right)

Sedimentation basin sizing from overflow rate and detention time

A=Qv0, V=Qθ, h=v0θ A = \frac{Q}{v_0},\ V = Q\theta,\ h = v_0\theta

Stokes settling velocity of a discrete particle

vs=g(ρp−ρw)d218μ v_s = \frac{g(\rho_p - \rho_w)d^2}{18\mu}

Surface overflow rate of a circular clarifier

v0=QπD2/4 v_0 = \frac{Q}{\pi D^2/4}

Terminal settling velocity in any flow regime (drag coefficient iteration)

vt=4gd(ρp−ρf)3CDρf,CD=24Re+3Re+0.34 v_t = \sqrt{\frac{4g d(\rho_p - \rho_f)}{3C_D\rho_f}},\quad C_D = \frac{24}{Re} + \frac{3}{\sqrt{Re}} + 0.34

Weir loading rate of a circular clarifier

WL=QπD WL = \frac{Q}{\pi D}

Water treatment / water chemistry

Water hardness as CaCO3

TH=Ca 50.0420.04+Mg 50.0412.15 TH = Ca\,\frac{50.04}{20.04} + Mg\,\frac{50.04}{12.15}

Out of scope

  • Open-ended explanation, essay writing or tutoring dialogue: it is a solver, not a chatbot.
  • Questions outside its certified environmental engineering capabilities, and any question whose stated numbers it cannot all use — it refuses with the reason instead.
  • High-stakes engineering, medical or legal decisions without independent review.

Limitations

  • It answers what its certified capabilities cover (air pollution dispersion, water quality, water and wastewater treatment, gas transfer, noise and solid waste); anything else is refused with a reason.
  • ask() reads documented question forms and common phrasings; unusual wording may be refused — use solve() for guaranteed results.
  • Results are as correct as the certified relations and their stated conditions; a certified relation is a checked model, not a claim about every physical situation.

Citation

@software{environmental_engineering_ai999x_1_0_0,
  title  = {environmental-engineering-ai999x: an offline, verified environmental engineering solver},
  author = {Farabi, Ibnul Jaif}, organization = {AI999X},
  year   = {2026}, version = {1.0.0},
  url    = {https://huggingface.co/AI999X/environmental-engineering-ai999x}
}

Contact

Questions, bug reports and requests: open a discussion on https://huggingface.co/AI999X/environmental-engineering-ai999x/discussions or visit https://ai999x.com.

Support the project

environmental-engineering-ai999x is free and open source. If it helps you, you can support further development on Buy Me a Coffee.

Created and engineered by Ibnul Jaif Farabi · AI999X · ai999x.com

Downloads last month
33
Safetensors
Model size
4.72M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Evaluation results

  • identical on every platform on Golden answers (613 documented questions, Windows + Linux Python 3.10-3.14)
    self-reported
    1.000