Design Manual › Biological › Trickling Filter
FREE ENGINEERING TOOL · BIOLOGICAL

Trickling Filter (Biofilter)

The lowest-energy biological process there is: wastewater trickles over a fixed film and the bugs do the rest. Size the media from the organic load, check the hydraulic load that keeps the film wet and scoured, and read the NRC removal efficiency — including what it costs you to reach 20 mg/L.

1Duty & configuration

Pick the configuration first — it sets the acceptable organic load, the media depth and the hydraulic window that the results are checked against.

2Media sizing

A trickling filter is sized on organic load (kg BOD per m³ of media per day), not on detention time. Depth is then chosen from the media type, and the area falls out of V/D.

Results — media & hydraulics

Media volume V
—m³
Plan area A
—m²
Hydraulic load HLR
—m³/m²·d
ItemValueBasis

3Removal efficiency — NRC

The NRC (National Research Council) empirical equation, converted to metric. Recirculation enters through the factor F: it dilutes the applied load and passes it through the film twice.
ItemValueBasis

4Distributor & ventilation

The distributor has to keep the film wet and thin. Too slow and the media dries and ponds; too fast and you lose the contact time — the dose per pass is the lever.
ItemValueBasis

Sludge, air & downstream

ItemValueBasis

5Instrument schedule

Part of the appeal of a biofilter is how little it needs. This is the honest minimum — and the two flowmeters are the ones people forget.
PointInstrumentWhy here

Quote the biofilter instruments at factory price

Influent and recirculation flow, effluent DO, pH and solids — all mappable to our catalogue and supplied at the manufacturer's ex-works price (our margin is the export rebate, not a markup on the device).

Request a quote for this duty ← Primary Clarifier Secondary Clarifier →
Response within 24 hours · Inputs stay in your browser — nothing is uploaded.

Sources & parameter basis

[1]METCALF & EDDY / EPA — trickling filter loading: low-rate rock OLR 0.08–0.32 kg BOD/m³·d, HLR 1–4 m³/m²·d, depth 1.8–2.4 m; high-rate rock OLR 0.3–0.6, HLR 4–10; high-rate plastic OLR 0.5–1.5, HLR 10–40, depth 3–8 m; tower plastic OLR 1–3, HLR 40–150, depth 6–12 m.
[2]NRC equation, metric form: E = 1/(1 + 0.4433·√(OLR/F)) — the published coefficient 0.0561 is tied to lb BOD/d per 1000 ft³ of media; 0.0561·√62.43 = 0.4433 converts it to kg/m³·d. Recirculation factor F = (1+R)/(1+0.1R)². Second stage: E₂ = 1/(1 + (0.4433/(1−E₁))·√(OLR₂/F)).
[3]Rotary distributor: revolutions per day = HLR(mm/d) / (arms × dose per pass); typical dose 50–150 mm/pass and 0.05–0.5 rev/min.
[4]Humus (secondary) tank after a biofilter: SOR 20–33 m³/m²·d — more conservative than an activated-sludge clarifier because biofilm sloughings are light and fluffy.
[5]Sludge yield 0.4–0.8 kg TSS/kg BOD removed (biofilm processes produce less than activated sludge); oxygen ≈1.2–1.5 kg O₂/kg BOD removed; air carries ≈0.28 kg O₂/m³.
Full derivation and worked example: Trickling-Filter-Calculation-Sheet.md. The NRC equation was developed on rock media — on plastic it is generally conservative, and real plants often beat the prediction. Treat the result as a floor, not a forecast.
© 2026 Nanjing JiuYuHui Environmental Technology Co., Ltd. · jiuyuhub.com · Municipal WWTP design manual — Biological (variant).
⚠ Screening values only. Outputs from this tool are engineering screening estimates. Final equipment sizing, and any construction or permit submission, must be confirmed against the manufacturer’s verified performance curves and the applicable local regulation (e.g., Vietnam QCVN 14 / Indonesia PERMENLHK 68).
'; return html; } /* ================= PDF (jsPDF via CDN, loaded on demand) ================= */ var _pdfShown=false; function lineHeight(){ return 5; } var _atLoaded=false; function buildPdf(d, lead, jsPDF){ var doc = new jsPDF({unit:'mm', format:'a4'}); var M = 12, W = 186; var GREEN=[15,107,82], DARK=[22,32,43], BLUE=[26,95,143], GREY=[123,139,154]; function text(txt, x, y, size, style, color){ doc.setFontSize(size||9); doc.setFont('helvetica', style||'normal'); doc.setTextColor.apply(doc, color||DARK); doc.text(sanitizeForPdf(txt), x, y); } text('JIYUHUH - FREE ENGINEERING TOOL', M, 14, 9, 'bold', GREEN); text(d.title, M, 22, 16, 'bold', DARK); text('Calculation record - ' + d.date + (lead&&lead.email?' - prepared for '+lead.email:'') + (lead&&lead.company?' ('+lead.company+')':''), M, 28, 8, 'italic', GREY); var y = 34; function spacer(){ y += 2; if (y > 280){ doc.addPage(); y = 14; } } function blockTitle(t){ spacer(); text(t, M, y, 11, 'bold', GREEN); y += 3; } function note(txt, size, color){ doc.setFontSize(size||7.5); doc.setFont('helvetica','italic'); doc.setTextColor.apply(doc, color||[120,120,120]); var lines = doc.splitTextToSize(sanitizeForPdf(txt), W); lines.forEach(function(ln){ if (y > 285){ doc.addPage(); y = 14; } doc.text(ln, M, y); y += 4; }); } blockTitle('Inputs & assumptions'); doc.autoTable({ startY: y, margin:{left:M, right:M}, head: [['Parameter','Value']], body: d.inputs.map(function(r){ return [sanitizeForPdf(r.name), sanitizeForPdf(r.value)]; }), styles:{fontSize:8, cellPadding:1.6, lineColor:[226,232,238], lineWidth:0.1}, headStyles:{fillColor:GREEN, textColor:[255,255,255], fontSize:8}, columnStyles:{1:{halign:'right', fontStyle:'bold'}}, theme:'grid', tableWidth:W }); y = doc.lastAutoTable.finalY + 4; d.results.forEach(function(b){ if (b.kpis.length){ if (y > 278){ doc.addPage(); y = 14; } text(b.kpis.join(' | '), M, y, 8.5, 'italic', BLUE); y += 4; } if (!b.rows.length) return; var maxc = Math.max.apply(null, b.rows.map(function(r){ return r.cells.length; })); if (!maxc) return; var headCells = (b.head && b.head.length === maxc) ? b.head : Array.apply(null, Array(maxc)).map(function(_,i){ return 'Item '+(i+1); }); blockTitle(b.title); var colStyles = {}; for (var i=1;iDownload your calculation record as a printable sheet / PDF. ' +'We will also email a copy to this address, and our engineering team follows up within 24 hours. Your address is used only for this and never shared.
' +'' +'' +'
' +'' +'' +'
' +'' +'
' +'' +'' +'' +'
' +'' +'
Company emails get priority review. Your data stays in your browser — nothing is uploaded.
'; ov.appendChild(box); document.body.appendChild(ov); var email=box.querySelector('#jxEmail'), go=box.querySelector('#jxGo'), htm=box.querySelector('#jxHtml'), err=box.querySelector('#jxErr'), comp=box.querySelector('#jxCompany'), cty=box.querySelector('#jxCountry'); function close(){ css(ov,{display:'none'}); state.open=false; } ov.addEventListener('click',function(e){ if(e.target===ov) close(); }); box.querySelector('#jxClose').addEventListener('click',close); function lead(){ var e=email.value.trim(), c=comp.value.trim(), cy=cty.value.trim(); if(!validEmail(e)){ err.textContent='Please enter a valid work email.'; err.style.display='block'; return null; } if(isTempMail(e)){ err.textContent='Disposable addresses are not accepted — use a company or real domain email.'; err.style.display='block'; return null; } err.style.display='none'; var l={email:e,company:c,country:cy,page:location.pathname,time:new Date().toISOString()}; try{ var arr=JSON.parse(localStorage.getItem('jiuyu_leads')||'[]'); arr.push(l); localStorage.setItem('jiuyu_leads',JSON.stringify(arr)); }catch(_){} return l; } function dlHtml(){ var l=lead(); if(!l) return; var d=scanTool(); var blob=new Blob([buildCalcHtml(d,l)],{type:'text/html;charset=utf-8'}); var a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download=(d.title.replace(/[^a-z0-9]+/gi,'-').toLowerCase()||'calculation')+'-record.html'; document.body.appendChild(a); a.click(); setTimeout(function(){URL.revokeObjectURL(a.href);a.remove();},400); sendRecordEmail(d,l); state.done&&state.done(l); close(); } function dlPdf(){ var l=lead(); if(!l) return; var d=scanTool(); if (window.jspdf && window.jspdf.jsPDF && _atLoaded){ sendRecordEmail(d,l); downloadPdfNow(d,l); close(); return; } go.disabled=true; go.textContent='loading PDF engine...'; var s=document.createElement('script'); s.src='/tools/vendor/jspdf.umd.min.js'; s.onload=function(){ var a=document.createElement('script'); a.src='/tools/vendor/jspdf.plugin.autotable.min.js'; a.onload=function(){ _atLoaded=true; go.disabled=false; go.textContent='Download PDF'; downloadPdfNow(d,l); sendRecordEmail(d,l); close(); }; a.onerror=function(){ sendRecordEmail(d,l); go.disabled=false; go.textContent='PDF engine unavailable'; err.textContent='PDF table plugin could not load (offline?) - use HTML sheet instead.'; err.style.display='block'; }; document.head.appendChild(a); }; s.onerror=function(){ sendRecordEmail(d,l); go.disabled=false; go.textContent='PDF engine unavailable'; err.textContent='PDF engine could not load (offline?) - use HTML sheet instead.'; err.style.display='block'; }; document.head.appendChild(s); } function sendRecordEmail(d,l){ try{ var html = buildCalcHtml(d,l); fetch('/api/send-calc', {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({email:l.email, company:l.company||'', country:l.country||'', title:d.title, html:html, source:location.pathname})}); }catch(_){} } function downloadPdfNow(d,l){ var J = window.jspdf.jsPDF; var doc = buildPdf(d,l,J); doc.save((d.title.replace(/[^a-z0-9]+/gi,'-').toLowerCase()||'calculation')+'-record.pdf'); } go.addEventListener('click',dlPdf); htm.addEventListener('click',dlHtml); var mail=box.querySelector('#jxMail'); function mailEngineers(){ var e=email.value.trim(), c=comp.value.trim(), cy=cty.value.trim(); if(!validEmail(e)){ err.textContent='Enter a valid work email first — we reply to it with the review.'; err.style.display='block'; return; } if(isTempMail(e)){ err.textContent='Disposable addresses are not accepted — use a company or real domain email.'; err.style.display='block'; return; } err.style.display='none'; var d=scanTool(); var subj='Calculation review request — '+d.title; var body='Hi Jiuyuhub team,\n\n' +'Please review the calculation I generated with your tool and advise on matching instruments at factory ex-works pricing (no markup; margin = export tax rebate).\n\n' +'My details:\n' +' Email: '+e+'\n' +' Company: '+(c||'-')+'\n' +' Country: '+(cy||'-')+'\n' +' Tool: '+d.title+' ('+location.href+')\n\n' +'I have downloaded the PDF/HTML sheet as my local record.\n\n' +'Thanks,\n'+e+'\n'; var href='mailto:sales@jiuyuhub.com?subject='+encodeURIComponent(subj)+'&body='+encodeURIComponent(body); try{ var arr=JSON.parse(localStorage.getItem('jiuyu_leads')||'[]'); arr.push({email:e,company:c,country:cy,page:location.pathname,time:new Date().toISOString(),channel:'mailto'}); localStorage.setItem('jiuyu_leads',JSON.stringify(arr)); }catch(_){} window.location.href=href; state.done&&state.done({email:e,company:c,country:cy,page:location.pathname,time:new Date().toISOString()}); close(); } if(mail) mail.addEventListener('click',mailEngineers); email.addEventListener('keydown',function(e){ if(e.key==='Enter') dlPdf(); }); state._close=close; return ov; } function openExport(){ var m=mkModal(); css(m,{display:'flex'}); var e=m.querySelector('#jxEmail'); state.open=true; if(e){ e.focus(); } } function install(){ // 1) header button var header=document.querySelector('header'); if (header){ var b=document.createElement('button'); b.id='jxOpen'; b.type='button'; b.textContent='Get this calculation (PDF)'; css(b,{display:'inline-block',marginTop:'10px',background:'#fff',border:'1.5px solid #0f6b52',color:'#0f6b52', fontWeight:'700',fontSize:'13px',padding:'9px 16px',borderRadius:'8px',cursor:'pointer'}); b.addEventListener('click',openExport); header.appendChild(b); } // 2) wire any placeholder CTA (href="#", return false) document.querySelectorAll('.cta a[href="#"]').forEach(function(a){ a.addEventListener('click',function(ev){ ev.preventDefault(); openExport(); }); a.removeAttribute('onclick'); }); // 3) design-chain bridging bridgeApply(); bridgeRefresh(); // keep chain links live as inputs change (bubble phase: the page's own calc() // runs first, so derived bridge values such as hidden WAS outputs are fresh) ['input','change'].forEach(function(evt){ document.addEventListener(evt,function(){ bridgeRefresh(); }); }); // 4) robustness & shareability injectGuardStyle(); addShareButton(); initInvalidGuard(); ['input','change'].forEach(function(evt){ document.addEventListener(evt,function(){ invalidGuardScan(); }); }); } /* ============ invalid-input guard (NaN / empty-field sentinel) ============ * Engine-independent safety net: if any result cell ever shows NaN / Infinity, * or a primary numeric field is left empty, we surface a red banner and flag the * offending cells — instead of quietly showing garbage numbers. */ var _gStyleInjected=false; function injectGuardStyle(){ if (_gStyleInjected || typeof document==='undefined') return; _gStyleInjected=true; var st=document.createElement('style'); st.textContent='.jx-bad{outline:2px solid #c0453b !important;outline-offset:1px;border-radius:3px}'+ '#jxGuardBar{display:none;background:#c0453b;color:#fff;font-size:13px;font-weight:700;'+ 'padding:9px 16px;border-radius:8px;margin:0 0 14px;line-height:1.5}'+ '#jxShareBtn{background:#fff;color:#1a5f8f;border:1.5px solid #1a5f8f;font-weight:700;font-size:13px;'+ 'padding:9px 16px;border-radius:8px;cursor:pointer;margin-top:10px;margin-left:8px}'+ '#jxShareBtn.ok{color:#0f6b52;border-color:#0f6b52}'; (document.head||document.documentElement).appendChild(st); } var _barEl=null; function guardBar(){ if (_barEl) return _barEl; _barEl=document.createElement('div'); _barEl.id='jxGuardBar'; _barEl.setAttribute('role','alert'); _barEl.textContent='Some results are invalid — a flow, ratio or strength above is zero, negative or empty. '+ 'Results stay hidden (flagged red) until every field has a valid number.'; var header=document.querySelector('header, .crumb'); if (header && header.parentNode) header.parentNode.insertBefore(_barEl, header.nextSibling); else document.body.insertBefore(_barEl, document.body.firstChild); return _barEl; } function invalidGuardScan(){ if (typeof document==='undefined') return; var BAD=/NaN|Infinity|−∞|∞/; var bad=[]; // 1) result cells showing NaN / Infinity document.querySelectorAll('.res *,.kpis *').forEach(function(el){ if (el.children.length===0 && BAD.test(el.textContent||'')) bad.push(el); }); // 2) primary numeric inputs left empty (avoid flagging fields in
that are off-path) document.querySelectorAll('.f input[type="number"],.card > .row input[type="number"]').forEach(function(inp){ var inDetails=!!inp.closest('details'); if (!inDetails && (inp.value==='' || inp.value===null)) bad.push(inp); }); var bar=guardBar(); if (bad.length>0){ bad.forEach(function(el){ el.classList.add('jx-bad'); }); bar.style.display='block'; } else { document.querySelectorAll('.jx-bad').forEach(function(el){ el.classList.remove('jx-bad'); }); bar.style.display='none'; } } function initInvalidGuard(){ invalidGuardScan(); if (typeof MutationObserver!=='undefined'){ var mo=new MutationObserver(function(){ invalidGuardScan(); }); mo.observe(document.body,{subtree:true,childList:true,characterData:true}); } } /* ============ copy a shareable link carrying the current duty ============ */ function makeShareUrl(){ var cfg=window.BRIDGE; var base=location.href.split('?')[0]; if (!cfg || !cfg.in) return base; var qs=[]; for (var k in cfg.in){ if(!Object.prototype.hasOwnProperty.call(cfg.in,k)) continue; var el=document.getElementById(cfg.in[k]); if(!el) continue; var v; try{ v=(el.type==='checkbox')?(el.checked?'1':'0'):String(el.value); }catch(e){ continue; } if (v!=='') qs.push(encodeURIComponent(k)+'='+encodeURIComponent(v)); } return base+(qs.length?'?'+qs.join('&'):''); } function addShareButton(){ if (typeof document==='undefined') return; var host=document.querySelector('header'); var ref=(host&&host.querySelector('#jxOpen'))||null; var b=document.createElement('button'); b.id='jxShareBtn'; b.type='button'; b.textContent='Copy share link'; b.addEventListener('click',function(){ var url=makeShareUrl(); function done(){ b.textContent='Copied ✓'; b.classList.add('ok'); setTimeout(function(){ b.textContent='Copy share link'; b.classList.remove('ok'); },1800); } function fallback(){ var ta=document.createElement('textarea'); ta.value=url; ta.style.position='fixed'; ta.style.opacity='0'; document.body.appendChild(ta); ta.select(); try{ document.execCommand('copy'); done(); }catch(e){ prompt('Copy this link:', url); } document.body.removeChild(ta); } if (navigator.clipboard && navigator.clipboard.writeText){ navigator.clipboard.writeText(url).then(done,fallback); } else fallback(); }); if (host){ host.appendChild(b); } } /* ================= design-chain parameter bridging ================= * A page opts in with window.BRIDGE = { * in: { urlKey: 'elementId', ... } — params it accepts from ?urlKey=value * chain: { key: { page:'target.html', map:{ srcElId:'dstUrlKey', ... } } } — live "continue" links * Mark a link with class="jx-chain" data-chain="key" and it gets re-pointed as the user edits. * URL keys equal the target page's own input ids, so dstUrlKey is usually the id there. */ function bridgeApply(){ if (typeof window==='undefined' || !window.location || !window.location.search) return 0; var s=window.location.search.replace(/^\?/,''); if (!s) return 0; var qs={}; s.split('&').forEach(function(p){ if(!p) return; var kv=p.split('='); try{ if(kv[0]) qs[decodeURIComponent(kv[0])]=decodeURIComponent((kv[1]||'').replace(/\+/g,' ')); } catch(e){} }); var cfg=window.BRIDGE; if(!cfg || !cfg.in) return 0; var touched=[]; for (var k in cfg.in){ if(!Object.prototype.hasOwnProperty.call(cfg.in,k) || qs[k]===undefined) continue; var el=document.getElementById(cfg.in[k]); if(!el) continue; try{ if (el.type==='checkbox') el.checked=(qs[k]==='1'||qs[k]==='true'||qs[k]==='on'); else el.value=qs[k]; }catch(e){ continue; } touched.push(el); } touched.forEach(function(el){ try{ el.dispatchEvent(new Event('input',{bubbles:true})); el.dispatchEvent(new Event('change',{bubbles:true})); }catch(e){} }); return touched.length; } function bridgeRefresh(){ if (typeof document==='undefined') return; var cfg=window.BRIDGE; if(!cfg || !cfg.chain) return; document.querySelectorAll('a.jx-chain').forEach(function(a){ var key=a.getAttribute('data-chain'); if(!key) return; var c=cfg.chain[key]; if(!c || !c.page) return; var q=[]; for (var src in c.map){ if(!Object.prototype.hasOwnProperty.call(c.map,src)) continue; var el=document.getElementById(src); if(!el) continue; var spec=c.map[src]; var dst=spec, scale=1; if (spec && typeof spec==='object' && spec.to){ dst=spec.to; scale=(spec.scale!=null)?spec.scale:1; } var v; try{ if (el.type==='checkbox') v=(el.checked?'1':'0'); else if (scale!==1){ var n=parseFloat(el.value); v=(isFinite(n)?String(Math.round(n*scale*1000)/1000):''); } else v=encodeURIComponent(String(el.value)); }catch(e){ continue; } if (v!=='') q.push(dst+'='+v); } a.href=c.page+(q.length?'?'+q.join('&'):''); }); } if (document.readyState==='loading') document.addEventListener('DOMContentLoaded',install); else install(); window.CalcExport={open:openExport, validEmail:validEmail, isTempMail:isTempMail, sanitizeForPdf:sanitizeForPdf, buildCalcHtml:buildCalcHtml, scanTool:scanTool, buildPdf:buildPdf, bridgeApply:bridgeApply, bridgeRefresh:bridgeRefresh, makeShareUrl:makeShareUrl, invalidGuardScan:invalidGuardScan, _modal:mkModal}; })();
Questions about a duty, a specification, or transparent sourcing? Contact our application engineers →