{"id":27955,"date":"2026-11-09T15:08:45","date_gmt":"2026-11-09T15:08:45","guid":{"rendered":"https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/"},"modified":"2026-11-09T15:56:39","modified_gmt":"2026-11-09T15:56:39","slug":"gas-plumbing","status":"publish","type":"page","link":"https:\/\/tradefoxapp.com\/fr\/calculators\/gas-plumbing\/","title":{"rendered":"Gas and plumbing calculators"},"content":{"rendered":"\n<style>\n\/* Tradefox calculators \u2014 Apple-style, scoped to .tfc so it can sit inside any WordPress page *\/\n.tfc{--fg:#1d1d1f;--fg2:#6e6e73;--line:#d2d2d7;--soft:#f5f5f7;--brand:#F15927;--brand-ink:#C2410C;--radius:18px;\n font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"SF Pro Display\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;\n color:var(--fg);-webkit-font-smoothing:antialiased;font-size:17px;line-height:1.47;letter-spacing:-.022em;text-align:left}\n.tfc *,.tfc *::before,.tfc *::after{box-sizing:border-box}\n.tfc a{color:var(--brand-ink);text-decoration:none}\n.tfc a:hover{text-decoration:underline}\n.tfc button,.tfc input,.tfc select{font:inherit;letter-spacing:inherit;color:inherit}\n.tfc-wrap{max-width:1024px;margin:0 auto;padding:0 22px}\n.tfc-brand{display:flex;align-items:center;gap:8px;padding:18px 0 0;font-size:14px;font-weight:600;color:var(--fg)}\n.tfc-brand img{width:98px;height:20px;display:block}\n.tfc-hero{padding:44px 0 28px}\n.tfc-h1{margin:0;font-size:56px;line-height:1.07;font-weight:700;letter-spacing:-.005em}\n.tfc-h1 span{display:block;color:var(--fg2)}\n.tfc-search{position:relative;margin-top:28px;max-width:560px}\n.tfc-search input{width:100%;height:48px;border-radius:999px;border:1px solid transparent;background:var(--soft);padding:0 20px 0 46px;font-size:17px;outline:none;transition:border-color .2s,background .2s}\n.tfc-search input:focus{background:#fff;border-color:var(--brand);box-shadow:0 0 0 4px rgba(241,89,39,.15)}\n.tfc-search svg{position:absolute;left:17px;top:50%;width:17px;height:17px;transform:translateY(-50%);color:var(--fg2)}\n.tfc-chips{display:flex;flex-wrap:wrap;gap:8px;padding:22px 0 4px}\n.tfc-chips::-webkit-scrollbar{display:none}\n.tfc .tfc-chip{flex:0 0 auto;border:0;background:var(--soft);color:var(--fg);border-radius:999px;padding:8px 16px;font-size:14px;cursor:pointer;transition:background .2s,color .2s}\n.tfc .tfc-chip:hover{background:#e8e8ed}\n.tfc .tfc-chip[aria-pressed=\"true\"]{background:var(--fg);color:#fff}\n.tfc-band{background:var(--soft);padding:36px 0 64px}\n.tfc-group{margin:0 0 40px}\n.tfc-h2{margin:0 0 16px;font-size:28px;line-height:1.14;font-weight:700;letter-spacing:.004em}\n.tfc-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}\n.tfc-card{display:flex;flex-direction:column;gap:6px;min-height:150px;background:#fff;border-radius:var(--radius);padding:22px 22px 20px;color:var(--fg)!important;text-decoration:none!important;\n box-shadow:2px 4px 12px rgba(0,0,0,.08);transition:box-shadow .3s cubic-bezier(0,0,.5,1),transform .3s cubic-bezier(0,0,.5,1)}\n@media (hover:hover) and (pointer:fine){.tfc-card:hover{box-shadow:2px 4px 16px rgba(0,0,0,.16);transform:scale3d(1.01,1.01,1.01)}}\n.tfc-card .k{font-size:12px;font-weight:600;color:var(--fg2)}\n.tfc-card .t{font-size:19px;line-height:1.21;font-weight:600}\n.tfc-card .f{margin-top:auto;font-size:14px;color:var(--fg2);overflow-wrap:anywhere}\n.tfc-empty{color:var(--fg2);padding:20px 0}\n\/* detail *\/\n.tfc-back{display:inline-flex;align-items:center;gap:4px;margin-top:22px;font-size:14px}\n.tfc-detail{padding:20px 0 64px}\n.tfc-eyebrow{font-size:14px;font-weight:600;color:var(--brand-ink);margin:0 0 6px}\n.tfc-title{margin:0;font-size:48px;line-height:1.08;font-weight:700;letter-spacing:-.003em}\n.tfc-formula{display:inline-block;margin:18px 0 0;padding:10px 16px;border-radius:12px;background:var(--soft);font:500 16px\/1.4 \"SF Mono\",ui-monospace,Menlo,Consolas,monospace;letter-spacing:0;overflow-wrap:anywhere}\n.tfc-intro{max-width:692px;margin:20px 0 0;color:var(--fg)}\n.tfc-intro p{margin:0 0 .8em}\n.tfc-layout>*,.tfc-info>*,.tfc-grid>*{min-width:0}\n.tfc-row input,.tfc-row select{width:100%}\n.tfc-row select,.tfc-unit{width:auto}\n.tfc-layout{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:24px;margin-top:32px;align-items:start}\n.tfc-panel{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:24px}\n.tfc-field{margin:0 0 18px}\n.tfc-field label{display:block;font-size:14px;font-weight:600;margin:0 0 6px}\n.tfc-row{display:flex;gap:8px}\n.tfc-row input{flex:1 1 auto;min-width:0;height:48px;border:1px solid var(--line);border-radius:12px;padding:0 14px;font-size:17px;background:#fff;outline:none;transition:border-color .2s,box-shadow .2s}\n.tfc-row input:focus,.tfc-row select:focus{border-color:var(--brand);box-shadow:0 0 0 4px rgba(241,89,39,.15)}\n.tfc-row input[aria-invalid=\"true\"]{border-color:#e30000}\n.tfc-row select,.tfc-unit{flex:0 0 auto;height:48px;border:1px solid var(--line);border-radius:12px;padding:0 12px;font-size:15px;background:var(--soft);outline:none;min-width:72px}\n.tfc-unit{display:flex;align-items:center;color:var(--fg2);border-color:transparent}\n.tfc-actions{display:flex;flex-wrap:wrap;align-items:center;gap:16px;margin-top:6px}\n.tfc .tfc-btn{border:0;border-radius:999px;background:var(--brand);color:#fff;font-weight:600;font-size:17px;padding:12px 26px;cursor:pointer;transition:background .2s}\n.tfc .tfc-btn:hover{background:#d94d1f}\n.tfc .tfc-link{border:0;background:none;padding:0;color:var(--brand-ink);font-size:15px;cursor:pointer}\n.tfc .tfc-link:hover{text-decoration:underline}\n.tfc-error{color:#d70015;font-size:14px;margin:12px 0 0;min-height:1em}\n.tfc-results{background:var(--soft);border-radius:var(--radius);padding:24px;min-height:100%}\n.tfc-results .lbl{font-size:14px;color:var(--fg2);margin:0}\n.tfc-out{margin:0 0 20px}\n.tfc-out:last-of-type{margin-bottom:0}\n.tfc-num{font-size:40px;line-height:1.1;font-weight:700;letter-spacing:-.01em;overflow-wrap:anywhere}\n.tfc-num small{font-size:21px;font-weight:600;color:var(--fg2);margin-left:6px}\n.tfc-pct{display:block;font-size:14px;color:var(--fg2)}\n.tfc-wait{color:var(--fg2);margin:0}\n.tfc-tag{display:inline-block;font-size:12px;font-weight:600;color:var(--fg2);background:#fff;border-radius:999px;padding:3px 10px;margin:0 0 14px}\n.tfc-notice{font-size:14px;color:var(--fg2);margin:16px 0 0}\n.tfc-work{margin-top:18px;font-size:14px}\n.tfc-work summary{cursor:pointer;color:var(--brand-ink);font-weight:600}\n.tfc-work pre{white-space:pre-wrap;font:13px\/1.5 \"SF Mono\",ui-monospace,Menlo,Consolas,monospace;letter-spacing:0;background:#fff;border-radius:12px;padding:12px;margin:10px 0 0;overflow-wrap:anywhere}\n.tfc-info{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:24px}\n.tfc-info section{background:var(--soft);border-radius:var(--radius);padding:22px}\n.tfc-info h3{margin:0 0 8px;font-size:17px;font-weight:600}\n.tfc-info p,.tfc-info ul{margin:0;font-size:15px;color:var(--fg)}\n.tfc-info ul{padding-left:18px}\n.tfc-info li{margin:0 0 6px}\n.tfc-foot{max-width:692px;font-size:12px;line-height:1.5;color:var(--fg2);margin:28px 0 0}\n@media (max-width:833px){\n .tfc-h1{font-size:40px}.tfc-title{font-size:34px}\n .tfc-grid{grid-template-columns:repeat(2,minmax(0,1fr))}\n .tfc-layout,.tfc-info{grid-template-columns:minmax(0,1fr)}\n}\n@media (max-width:560px){\n .tfc-wrap{padding:0 16px}.tfc-h1{font-size:32px}.tfc-title{font-size:28px}.tfc-h2{font-size:24px}\n .tfc-grid{grid-template-columns:1fr}.tfc-card{min-height:0}\n .tfc-num{font-size:32px}\n}\n@media (prefers-reduced-motion:reduce){.tfc *{transition:none!important}.tfc-card:hover{transform:none!important}}\n\n\/* local nav (Apple-style sticky product bar) + pager *\/\n.tfc-local{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.8);-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);border-bottom:1px solid rgba(0,0,0,.16)}\n.tfc-local-in{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:52px}\n.tfc .tfc-local-title{font-size:21px;font-weight:600;letter-spacing:.011em;color:var(--fg);white-space:nowrap}\n.tfc .tfc-local-title:hover{text-decoration:none;color:var(--brand-ink)}\n.tfc-local-links{display:flex;gap:20px;overflow-x:auto;scrollbar-width:none;font-size:12px}\n.tfc-local-links::-webkit-scrollbar{display:none}\n.tfc .tfc-local-links a{color:var(--fg);opacity:.8;white-space:nowrap}\n.tfc .tfc-local-links a:hover{opacity:1;color:var(--brand-ink);text-decoration:none}\n.tfc-pager{display:grid;grid-template-columns:1fr auto 1fr;gap:16px;align-items:center;margin-top:40px;padding-top:24px;border-top:1px solid var(--line)}\n.tfc .tfc-pager a{font-size:17px;font-weight:600;color:var(--fg)}\n.tfc .tfc-pager a span{display:block;font-size:12px;font-weight:400;color:var(--fg2)}\n.tfc .tfc-pager a:hover{color:var(--brand-ink);text-decoration:none}\n.tfc .tfc-pager .tfc-all{font-size:15px;color:var(--brand-ink)}\n.tfc-pager .tfc-next{text-align:right}\n@media (max-width:560px){.tfc-local-in{flex-direction:column;align-items:flex-start;gap:4px;padding:8px 16px}.tfc .tfc-local-title{font-size:17px}.tfc-local-links{width:100%;gap:16px}\n .tfc-pager{grid-template-columns:1fr 1fr}.tfc-pager .tfc-all{grid-column:1\/-1;grid-row:1;text-align:center}}\n\n.tfc .tfc-math{display:inline-block;max-width:100%;box-sizing:border-box;margin:18px 0 0;padding:16px 22px;border-radius:16px;background:var(--soft);overflow-x:auto;color:var(--fg)}\n.tfc .tfc-math math,.tfc .tfc-math math *,.tfc .tfc-where math,.tfc .tfc-where math *{font-family:\"STIX Two Math\",\"Cambria Math\",\"Latin Modern Math\",\"Times New Roman\",math,serif!important}\n.tfc .tfc-math math{font-size:22px;margin:4px 0;text-align:left;math-style:normal}\n.tfc .tfc-math math[display=block]{display:block math}\n.tfc .tfc-where{margin:12px 0 0;padding:10px 0 0;border-top:1px solid rgba(0,0,0,.08);display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font:400 14px\/1.45 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Helvetica Neue\",sans-serif;color:#6e6e73}\n.tfc .tfc-where>div{display:contents}\n.tfc .tfc-where dt,.tfc .tfc-where dd{margin:0}\n.tfc .tfc-where dt math{font-size:17px;color:#1d1d1f}\n.tfc .tfc-where .tfc-where-h{grid-column:1\/-1;font-style:italic}\n@media(max-width:600px){.tfc .tfc-math{display:block;padding:14px 16px}.tfc .tfc-math math{font-size:18px}}\n\n.tfc .tfc-card .tfc-cm{display:block;overflow:hidden;max-width:100%;font-family:inherit;color:var(--fg)}\n.tfc .tfc-card .tfc-cm math{font-size:17px;text-align:left;margin:0}\n.tfc .tfc-card .tfc-cm math[display=block]{display:inline math;math-style:normal}\n.tfc .tfc-card .tfc-cm math,.tfc .tfc-card .tfc-cm math *{font-family:\"STIX Two Math\",\"Cambria Math\",\"Latin Modern Math\",\"Times New Roman\",math,serif!important}\n\n\n.tfc-brand{display:none}\n.tfc-hero{padding-top:56px}\n<\/style>\n<div class=\"tfc\" id=\"tfc\"><\/div>\n<script>\n\/* Tradefox Gas and Plumbing calculators: adapter for the shared shell.\n   The original engine.js follows verbatim, wrapped in this IIFE. *\/\n(function(){\n\/* ---- original engine.js (verbatim) ---- *\/\n\/* Original Tradefox calculations. Internally SI unless a dimensionless ratio. *\/\nconst UNITS={\n length:{m:1,mm:.001,cm:.01,ft:.3048,in:.0254}, area:{'m\u00b2':1,'cm\u00b2':.0001,'ft\u00b2':.09290304},\n volume:{'m\u00b3':1,L:.001,mL:.000001,'ft\u00b3':.028316846592,'100 ft\u00b3':2.8316846592,'UK gal':.00454609,'US gal':.003785411784},\n time:{s:1,min:60,h:3600},power:{W:1,kW:1000,'Btu\/h (IT)':1055.05585262\/3600},energy:{J:1,kJ:1000,MJ:1e6,kWh:3.6e6,'Btu (IT)':1055.05585262},\n pressure:{Pa:1,kPa:1000,bar:1e5,mbar:100,psi:6894.757293168},flow:{'m\u00b3\/s':1,'m\u00b3\/h':1\/3600,'L\/s':.001,'L\/min':.001\/60,'L\/h':.001\/3600,'UK gal\/min':.00454609\/60},\n mass:{kg:1,g:.001},massflow:{'kg\/s':1,'kg\/h':1\/3600},density:{'kg\/m\u00b3':1},cp:{'J\/(kg\u00b7K)':1,'kJ\/(kg\u00b7K)':1000},\n cv:{'MJ\/m\u00b3':1e6,'kWh\/m\u00b3':3.6e6},cvMass:{'MJ\/kg':1e6,'kWh\/kg':3.6e6},temp:{'\u00b0C':1,'\u00b0F':1,K:1},delta:{'K difference':1,'\u00b0C difference':1,'\u00b0F difference':5\/9},\n velocity:{'m\/s':1},ratio:{ratio:1,'%':.01,ppm:.000001},angle:{'\u00b0':Math.PI\/180},viscosity:{'Pa\u00b7s':1,'mPa\u00b7s':.001},\n u:{'W\/(m\u00b2\u00b7K)':1},rate:{'air changes\/h':1\/3600},kv:{'Kv (m\u00b3\/h)':1},linExp:{'1\/K':1},cost:{'\u00a3\/kWh':1\/3.6e6,'p\/kWh':.01\/3.6e6},money:{'\u00a3':1},\n ploss:{'Pa\/m':1,'mbar\/m':100},wobbe:{'MJ\/m\u00b3 Wobbe':1e6},force:{N:1},rpm:{rpm:1},irr:{'W\/m\u00b2':1},waterhard:{'mg\/L as CaCO\u2083':1},\n };\nUNITS.cv={'J\/m\u00b3':1,...UNITS.cv};UNITS.cvMass={'J\/kg':1,...UNITS.cvMass};UNITS.rate={'1\/s':1,...UNITS.rate};UNITS.cost={'\u00a3\/J':1,...UNITS.cost};UNITS.angle={rad:1,...UNITS.angle};\nfunction unitGroup(u){return Object.keys(UNITS).find(g=>Object.hasOwn(UNITS[g],u));}\nfunction toSI(value,u){if(unitGroup(u)==='temp')return u==='\u00b0F'?(value-32)*5\/9:u==='K'?value-273.15:value;return value*UNITS[unitGroup(u)][u];}\nfunction fromSI(value,u){if(unitGroup(u)==='temp')return u==='\u00b0F'?value*9\/5+32:u==='K'?value+273.15:value;return value\/UNITS[unitGroup(u)][u];}\nconst F=(key,label,unit,example,options={})=>({key,label,unit,example,...options});\nconst O=(name,value,unit)=>({name,value,unit});\nconst positive=x=>{if(!(x>0))throw Error('The calculated difference must be greater than zero.');return x;};\nconst g=9.80665;\nconst SOURCES={\n si:['NIST \u2014 SI conversion factors','https:\/\/www.nist.gov\/pml\/special-publication-811\/nist-guide-si-appendix-b-conversion-factors\/nist-guide-si-appendix-b8'],\n gas:['GOV.UK \u2014 gas meter readings and billing calculation','https:\/\/www.gov.uk\/guidance\/gas-meter-readings-and-bill-calculation'],\n igem:['IGEM\/UP\/1B Edition 4 \u2014 effective 1 October 2026','https:\/\/www.igem.org.uk\/resource\/igem-up-1b-edition-4-tightness-testing-and-direct-purging-of-small-liquefied-petroleum-gas-air-ng-and-lpg-installations.html'],\n hse:['HSE \u2014 gas installation and use, L56','https:\/\/www.hse.gov.uk\/PUBNS\/books\/l56.htm'],\n maker:['Vaillant \u2014 manufacturer literature finder','https:\/\/professional.vaillant.co.uk\/for-installers\/literature-finder\/'],\n heat:['Caleffi \u2014 hydronic heat transfer fundamentals','https:\/\/www.caleffi.com\/en-us\/blog\/5-physical-operating-conditions-hydronic-systems'],\n mix:['Caleffi \u2014 mixing and hydronic control concepts','https:\/\/www.caleffi.com\/en-us\/blog\/10-control-concepts-and-hardware'],\n radiator:['Stelrad \u2014 radiator correction factors','https:\/\/www.stelrad.com\/trade\/stelrad-correction-factor\/'],\n darcy:['Grundfos \u2014 Darcy\u2013Weisbach equation','https:\/\/www.grundfos.com\/us\/learn\/ecademy\/all-courses\/infographics---the-quick-overview\/darcy-weisbach-equation'],\n pump:['Grundfos \u2014 pump curves and head','https:\/\/www.grundfos.com\/ie\/learn\/research-and-insights\/pump-curves'],\n kv:['Spirax Sarco \u2014 control-valve sizing for water','https:\/\/www.spiraxsarco.com\/learn-about-steam\/control-hardware-electric-pneumatic-actuation\/control-valve-sizing-for-water-systems'],\n vessel:['Caleffi \u2014 expansion-vessel technical guidance','https:\/\/www.caleffi.com\/sites\/default\/files\/media\/external-file\/01079_EN.pdf'],\n drainage:['Approved Document H \u2014 England drainage guidance','https:\/\/www.gov.uk\/government\/publications\/drainage-and-waste-disposal-approved-document-h'],\n hotwater:['Approved Document G \u2014 England hot-water safety','https:\/\/www.gov.uk\/government\/publications\/sanitation-hot-water-safety-and-water-efficiency-approved-document-g']\n};\nconst CALCS=[];\nfunction add(id,group,title,formula,fields,compute,note,sources=['si'],extra={}){CALCS.push({id,group,title,formula,fields,compute,note,sources,...extra});}\nconst rho=()=>F('rho','Fluid density','kg\/m\u00b3',1000),cp=()=>F('cp','Specific heat capacity','kJ\/(kg\u00b7K)',4.18),dt=()=>F('dt','Temperature difference','K difference',20),q=()=>F('q','Volume flow','L\/min',12),power=()=>F('P','Heat \/ power rate','kW',24),diam=()=>F('d','Internal pipe diameter','mm',20),len=()=>F('L','Developed pipe length','m',10),eff=()=>F('eta','Efficiency on stated energy basis','%',90,{max:1});\nadd('gas-rate','Gas','Timed gas volume rate','q = V \/ t',[F('V','Measured gas volume (not meter index units)','m\u00b3',.05),F('t','Elapsed time','s',120)],x=>[O('Measured volume rate',x.V\/x.t,'m\u00b3\/h')],'Use the correct meter scale; a traditional imperial index unit can be 100 ft\u00b3. This is arithmetic, not a gas test or appliance acceptance result.',['gas','maker']);\nadd('gas-input','Gas','Heat input from timed gas volume','P = V \u00d7 C \u00d7 cv \/ t',[F('V','Measured gas volume','m\u00b3',.05),F('t','Elapsed time','s',120),F('cv','Calorific value at matching reference conditions','MJ\/m\u00b3',39.5),F('C','Applicable volume correction factor','ratio',1)],x=>[O('Heat input on the entered CV basis',x.V*x.C*x.cv\/x.t,'kW')],'Gross\/net CV basis and volume conditions must match the manufacturer method. Example correction 1 is uncorrected; do not automatically use the billing correction for appliance tests.',['gas','maker']);\nadd('gas-demand','Gas','Gas volume demand from heat input','q = P \/ cv',[power(),F('cv','Calorific value at volume reference conditions','MJ\/m\u00b3',39.5)],x=>[O('Gas volume demand',x.P\/x.cv,'m\u00b3\/h')],'Use appliance heat INPUT, not useful output. Sum downstream appliance demands per the applicable sizing method; this does not select a pipe size.',['maker']);\nadd('fuel-mass','Gas','LPG \/ fuel mass consumption','mRate = P \/ cv',[power(),F('cv','Fuel calorific value on stated basis','MJ\/kg',46)],x=>[O('Fuel mass rate',x.P\/x.cv,'kg\/h')],'Enter the supplied fuel data. This does not size cylinders, regulators, vaporisation capacity or gas pipework.',['si','maker']);\nadd('gas-bill','Gas','Gas volume to billed energy','E = V \u00d7 C \u00d7 cv',[F('V','Consumed volume','m\u00b3',100),F('C','Billing volume correction','ratio',1.02264),F('cv','Billing calorific value','MJ\/m\u00b3',39.5)],x=>[O('Energy',x.V*x.C*x.cv,'kWh')],'Use the calorific value on the bill. Imperial units are explicit. Exact SI imperial conversion is used; a bill using rounded 2.83 m\u00b3 per 100 ft\u00b3 may differ slightly. This is separate from appliance gas-rating procedures.',['gas']);\nadd('gas-reference','Gas','Gas volume reference conversion','Vref = V \u00d7 (p \/ pref) \u00d7 ((Tref + 273.15) \/ (T + 273.15)) \u00d7 (Zref \/ Z)',[F('V','Measured volume','m\u00b3',1),F('p','Measured ABSOLUTE pressure','bar',1.03325),F('pref','Reference ABSOLUTE pressure','bar',1.01325),F('T','Measured gas temperature','\u00b0C',20,{temperature:true}),F('Tref','Reference temperature','\u00b0C',15,{temperature:true}),F('Z','Measured compressibility factor','ratio',1),F('Zref','Reference compressibility factor','ratio',1)],x=>[O('Reference volume',x.V*x.p\/x.pref*(x.Tref+273.15)\/(x.T+273.15)*x.Zref\/x.Z,'m\u00b3')],'Absolute pressures and Kelvin temperatures are essential. Dry\/wet gas conditions must be consistent; no water-vapour correction is included.',['si']);\nadd('gas-loss','Gas','Gas pressure loss from supplied table data','dp = r \u00d7 (L + Leq)',[F('r','Loss per metre from applicable sizing table','mbar\/m',.03),len(),F('Leq','Total fitting equivalent length from same method','m',5,{zero:true})],x=>[O('Calculated section pressure loss',x.r*(x.L+x.Leq),'mbar')],'Provide the correct rate for pipe, gas, size and downstream flow from the current approved method. No built-in allowable-drop limit or compliance verdict. Add all sections on the appliance path; this is not a complete gas-network sizing tool.',['maker','hse']);\nadd('installation-volume','Gas','Pipe and installation volume','Vtotal = \u03c0 \u00d7 d\u00b2 \u00d7 L \/ 4 + Vother',[diam(),len(),F('Vother','Meter, fittings, appliances and other pipe sections','L',3,{zero:true})],x=>[O('This pipe section',Math.PI*x.d*x.d*x.L\/4,'L'),O('Total entered installation volume',Math.PI*x.d*x.d*x.L\/4+x.Vother,'m\u00b3')],'Use internal bores and verified additional volumes. IGEM\/UP\/1B Edition 4 applies from 1 October 2026; this tool does not calculate permitted pressure drop, purge quantity, test duration or a tightness-test pass.',['igem']);\nadd('wobbe','Gas','Wobbe index','W = cv \/ \u221aSG',[F('cv','Calorific value on stated basis','MJ\/m\u00b3',39.5),F('SG','Gas relative density to air','ratio',.6)],x=>[O('Wobbe index on entered basis',x.cv\/Math.sqrt(x.SG),'MJ\/m\u00b3 Wobbe')],'A gas property calculation, not permission to interchange fuel or adjust an appliance. CV and relative density must use consistent reference conditions.',['si','maker']);\nadd('combustion-ratio','Gas','CO \/ CO\u2082 ratio','ratio = CO \/ CO2',[F('CO','Measured CO','ppm',50,{zero:true,max:1}),F('CO2','Measured CO\u2082','%',9,{max:1})],x=>{if(x.CO+x.CO2>1+1e-12)throw Error('CO and CO\u2082 concentrations cannot total more than 100%.');return[O('CO \/ CO\u2082 ratio',x.CO\/x.CO2,'ratio')];},'CO and CO\u2082 are converted to equal concentration units before division. Use matching sample basis and analyser instructions. No combustion acceptance limit is supplied.',['maker','hse']);\nadd('heat-power','Heating & hot water','Heat carried by flowing water','P = rho \u00d7 cp \u00d7 q \u00d7 dt',[rho(),cp(),q(),dt()],x=>[O('Heat transfer rate',x.rho*x.cp*x.q*x.dt,'kW')],'Steady sensible heat transfer. Use actual fluid properties for temperature and glycol concentration.',['heat']);\nadd('heat-flow','Heating & hot water','Required heating-water flow','q = P \/ (rho \u00d7 cp \u00d7 dt)',[power(),rho(),cp(),dt()],x=>[O('Required volume flow',x.P\/(x.rho*x.cp*x.dt),'L\/min'),O('Mass flow',x.P\/(x.cp*x.dt),'kg\/s')],'This is a heat-balance flow requirement, not pipe or pump selection.',['heat']);\nadd('heat-delta','Heating & hot water','Flow\u2013return temperature difference','dt = P \/ (rho \u00d7 cp \u00d7 q)',[power(),rho(),cp(),q()],x=>[O('Temperature difference',x.P\/(x.rho*x.cp*x.q),'K difference')],'Steady heat balance with consistent fluid properties.',['heat']);\nadd('water-energy','Heating & hot water','Energy to heat stored water','E = rho \u00d7 V \u00d7 cp \u00d7 (Th - Tc)',[rho(),F('V','Stored water volume','L',150),cp(),F('Tc','Starting water temperature','\u00b0C',10,{temperature:true}),F('Th','Final water temperature','\u00b0C',60,{temperature:true})],x=>[O('Useful heating energy',x.rho*x.V*x.cp*positive(x.Th-x.Tc),'kWh')],'Ideal sensible heating of water only. Cylinder metal, heat losses and draw-off are excluded; water must remain liquid.',['heat']);\nadd('recovery-time','Heating & hot water','Cylinder recovery time','t = rho \u00d7 V \u00d7 cp \u00d7 dt \/ P',[rho(),F('V','Heated volume','L',150),cp(),F('dt','Water temperature rise','K difference',50),F('P','Average useful heat transferred to water','kW',15)],x=>[O('Ideal recovery time',x.rho*x.V*x.cp*x.dt\/x.P,'min')],'Use average delivered coil or immersion output; actual recovery depends on coil conditions and losses.',['heat','hotwater']);\nadd('recovery-power','Heating & hot water','Power for target recovery time','P = rho \u00d7 V \u00d7 cp \u00d7 dt \/ t',[rho(),F('V','Heated volume','L',150),cp(),F('dt','Water temperature rise','K difference',50),F('t','Target time','min',30)],x=>[O('Required useful heating power',x.rho*x.V*x.cp*x.dt\/x.t,'kW')],'Ideal water heating. Boiler input, coil capacity and safety design need separate checks.',['heat']);\nadd('mix-temperature','Heating & hot water','Mixed-water temperature','Tm = (qh \u00d7 Th + qc \u00d7 Tc) \/ (qh + qc)',[F('qh','Hot flow','L\/min',6,{zero:true}),F('qc','Cold flow','L\/min',4,{zero:true}),F('Th','Hot temperature','\u00b0C',60,{temperature:true}),F('Tc','Cold temperature','\u00b0C',10,{temperature:true})],x=>{if(x.Th<x.Tc)throw Error('Hot supply temperature must not be below cold supply temperature.');return[O('Ideal mixed temperature',(x.qh*x.Th+x.qc*x.Tc)\/positive(x.qh+x.qc),'\u00b0C')];},'Assumes equal density and heat capacity, no losses. Does not verify a thermostatic mixing valve or scald protection.',['mix']);\nadd('mix-fraction','Heating &#038; hot water','Hot and cold flow for a target mix','qh = q \u00d7 (Tm - Tc) \/ (Th - Tc); qc = q - qh',[q(),F('Th','Hot supply temperature','\u00b0C',60,{temperature:true}),F('Tc','Cold supply temperature','\u00b0C',10,{temperature:true}),F('Tm','Target mixed temperature','\u00b0C',40,{temperature:true})],x=>{if(x.Th<=x.Tc||x.Tm<x.Tc||x.Tm>x.Th)throw Error('Target must lie between the cold and hotter supply temperatures.');const h=x.q*(x.Tm-x.Tc)\/(x.Th-x.Tc);return[O('Hot flow',h,'L\/min'),O('Cold flow',x.q-h,'L\/min')];},'Ideal same-fluid heat balance; not a TMV commissioning result.',['mix']);\nadd('mixed-volume','Heating & hot water','Usable mixed-water volume','Vm = Vh \u00d7 (Th - Tc) \/ (Tm - Tc)',[F('Vh','Stored hot volume','L',150),F('Th','Stored temperature','\u00b0C',60,{temperature:true}),F('Tc','Cold temperature','\u00b0C',10,{temperature:true}),F('Tm','Delivery temperature','\u00b0C',40,{temperature:true})],x=>{if(x.Th<x.Tm||x.Tm<=x.Tc)throw Error('Stored temperature must be at least delivery temperature, and delivery must exceed cold.');return[O('Ideal mixed volume',x.Vh*(x.Th-x.Tc)\/(x.Tm-x.Tc),'L')];},'Ideal mixing; stratification, unusable storage, recovery and distribution losses are excluded.',['mix']);\nadd('dhw-rise','Heating &#038; hot water','Instantaneous hot-water temperature rise','dt = P \/ (rho \u00d7 cp \u00d7 q)',[F('P','Useful DHW output','kW',30),rho(),cp(),F('q','Hot-water flow','L\/min',12)],x=>[O('Ideal water temperature rise',x.P\/(x.rho*x.cp*x.q),'K difference')],'Uses useful output, not gas input; actual boiler modulation and temperature limits apply.',['heat']);\nadd('efficiency','Energy & electrical','Thermal efficiency','eta = Pout \/ Pin',[F('Pout','Useful output on stated basis','kW',21.6),F('Pin','Fuel input on matching basis','kW',24)],x=>[O('Efficiency on entered basis',x.Pout\/x.Pin,'%')],'Gross and net CV efficiencies differ. A value over 100% requires checking the energy basis; it is not automatically valid or invalid without that context.',['si','maker']);\nadd('input-from-output','Energy & electrical','Fuel input from useful output','Pin = P \/ eta',[power(),eff()],x=>[O('Required fuel input',x.P\/x.eta,'kW')],'Enter a compatible efficiency basis. Use a factor above 100% only in a separately justified net-CV method; this calculator limits the entered efficiency to 100%.',['si']);\nadd('cop','Energy & electrical','Heat-pump COP','COP = Pheat \/ Pelec',[F('Pheat','Useful heat output','kW',12),F('Pelec','Electrical input including chosen auxiliaries','kW',3)],x=>[O('Coefficient of performance',x.Pheat\/x.Pelec,'ratio')],'Instantaneous ratio at stated conditions. It is not seasonal performance (SCOP\/SPF).',['si']);\nadd('energy-cost','Energy & electrical','Running energy and cost','E = P \u00d7 t; cost = E \u00d7 tariff',[power(),F('t','Operating time','h',2),F('tariff','Unit energy price','p\/kWh',7,{zero:true})],x=>[O('Energy',x.P*x.t,'kWh'),O('Usage cost',x.P*x.t*x.tariff,'\u00a3')],'Use actual input power or metered energy. Standing charges and other fees are excluded.',['si']);\nadd('fabric-loss','Heat loss & emitters','Fabric heat loss: one element','P = U \u00d7 A \u00d7 dt',[F('U','Element U-value','W\/(m\u00b2\u00b7K)',.3),F('A','Net element area','m\u00b2',20),F('dt','Indoor\u2013outdoor design difference','K difference',23)],x=>[O('Steady element heat loss',x.U*x.A*x.dt,'W')],'One element only. Exclude openings from wall area and add their own losses; thermal bridges, ventilation and room-by-room design are separate.',['si']);\nadd('ventilation-loss','Heat loss & emitters','Ventilation sensible heat loss','P = rho \u00d7 cp \u00d7 n \u00d7 V \u00d7 dt',[F('rho','Air density','kg\/m\u00b3',1.2),F('cp','Air specific heat','J\/(kg\u00b7K)',1005),F('n','Air change rate','air changes\/h',.5),F('V','Room volume','m\u00b3',50),F('dt','Indoor\u2013outdoor difference','K difference',23)],x=>[O('Ventilation sensible heat loss',x.rho*x.cp*x.n*x.V*x.dt,'W')],'Air-change estimate, not a ventilation design. Heat recovery, infiltration interactions and latent loads are excluded.',['si']);\nadd('radiator-output','Heat loss & emitters','Radiator output at operating temperatures','DT = (Tf + Tr) \/ 2 - Ta; P = Prated \u00d7 (DT \/ DTrated)^n',[F('Prated','Published rated output','W',2000),F('DTrated','Published rated mean-water \/ air difference','K difference',50),F('Tf','Flow temperature','\u00b0C',55,{temperature:true}),F('Tr','Return temperature','\u00b0C',45,{temperature:true}),F('Ta','Room temperature','\u00b0C',20,{temperature:true}),F('n','Manufacturer exponent (example only)','ratio',1.3)],x=>{if(x.Tf<x.Tr||x.Tr<=x.Ta)throw Error('This passive radiator model requires flow \u2265 return > room temperature.');const d=positive((x.Tf+x.Tr)\/2-x.Ta);return[O('Mean-water \/ room difference',d,'K difference'),O('Estimated radiator output',x.Prated*(d\/x.DTrated)**x.n,'W')];},'Use the specific radiator exponent or manufacturer correction data. Arithmetic mean-temperature power law is an estimate; unusual flow conditions can require a different method.',['radiator']);\nadd('radiator-rated','Heat loss & emitters','Required catalogue radiator output','Prated = P \/ (DT \/ DTrated)^n',[F('P','Required room output','W',1500),F('DT','Operating mean-water \/ room difference','K difference',30),F('DTrated','Catalogue rating difference','K difference',50),F('n','Manufacturer exponent','ratio',1.3)],x=>[O('Required catalogue-rated output',x.P\/(x.DT\/x.DTrated)**x.n,'W')],'Choose a real product using its published performance. This does not calculate room heat loss.',['radiator']);\nadd('buffer-volume','Heat loss & emitters','Buffer energy-storage estimate','V = P \u00d7 t \/ (rho \u00d7 cp \u00d7 dt)',[F('P','Excess heat above current load','kW',5),F('t','Desired storage duration','min',10),rho(),cp(),F('dt','Usable buffer temperature swing','K difference',5)],x=>[O('Ideal active storage volume',x.P*x.t\/(x.rho*x.cp*x.dt),'L')],'Subtract only genuinely usable existing system volume in a justified design. This does not establish heat-pump minimum volume, defrost needs or anti-cycling compliance.',['heat']);\nadd('ufh-length','Heat loss & emitters','UFH pipe-length estimate','L = A \/ spacing + tails',[F('A','Active heated area','m\u00b2',20),F('spacing','Pipe centre spacing','mm',150),F('tails','Total connection tails','m',6,{zero:true})],x=>[O('Approximate pipe length',x.A\/x.spacing+x.tails,'m')],'Area\/spacing estimate only. Edge geometry, bends, loop limits, pressure loss and floor output need manufacturer design.',['si']);\nadd('solar-power','Heat loss & emitters','Solar thermal useful-power estimate','P = A \u00d7 G \u00d7 eta',[F('A','Collector area on stated rating basis','m\u00b2',4),F('G','Incident irradiance','W\/m\u00b2',800),F('eta','Efficiency at operating conditions','%',50,{max:1})],x=>[O('Estimated useful thermal power',x.A*x.G*x.eta,'kW')],'A snapshot using supplied operating efficiency. Not an annual-yield, stagnation or safety calculation.',['si']);\nadd('velocity','Water hydraulics','Pipe velocity','v = 4 \u00d7 q \/ (\u03c0 \u00d7 d\u00b2)',[q(),diam()],x=>[O('Mean fluid velocity',4*x.q\/(Math.PI*x.d*x.d),'m\/s')],'Use actual internal bore. This does not establish an allowable noise, erosion or pressure-loss limit.',['darcy']);\nadd('diameter','Water hydraulics','Bore from target velocity','d = \u221a(4 \u00d7 q \/ (\u03c0 \u00d7 v))',[q(),F('v','Chosen target velocity','m\/s',1)],x=>[O('Calculated internal bore',Math.sqrt(4*x.q\/(Math.PI*x.v)),'mm')],'Select an available pipe and check pressure loss and application limits. Not a gas-pipe sizing method.',['darcy']);\nadd('pipe-flow','Water hydraulics','Flow from bore and velocity','q = \u03c0 \u00d7 d\u00b2 \u00d7 v \/ 4',[diam(),F('v','Mean velocity','m\/s',1)],x=>[O('Volume flow',Math.PI*x.d*x.d*x.v\/4,'L\/min')],'Incompressible mean-flow relationship.',['darcy']);\nadd('reynolds','Water hydraulics','Reynolds number','Re = rho \u00d7 v \u00d7 d \/ mu',[rho(),F('v','Mean velocity','m\/s',1),diam(),F('mu','Dynamic viscosity','mPa\u00b7s',1)],x=>[O('Reynolds number',x.rho*x.v*x.d\/x.mu,'ratio')],'Fluid properties change with temperature and glycol concentration. Circular-pipe laminar\/transition\/turbulent behaviour requires appropriate interpretation.',['darcy']);\nadd('darcy','Water hydraulics','Straight-pipe friction loss','dp = f \u00d7 (L \/ d) \u00d7 rho \u00d7 v\u00b2 \/ 2',[F('f','DARCY friction factor (not Fanning)','ratio',.025),len(),diam(),rho(),F('v','Mean velocity','m\/s',1)],x=>[O('Friction pressure loss',x.f*x.L\/x.d*x.rho*x.v*x.v\/2,'kPa'),O('Friction head',x.f*x.L\/x.d*x.v*x.v\/(2*g),'m')],'Use a justified Darcy factor for Reynolds number and roughness. Fittings and static lift are excluded. This liquid model must not be used to approve gas pipe sizes.',['darcy']);\nadd('minor-loss','Water hydraulics','Fitting \/ local resistance loss','dp = K \u00d7 rho \u00d7 v\u00b2 \/ 2',[F('K','Sum of appropriate resistance coefficients','ratio',3,{zero:true}),rho(),F('v','Reference velocity for those coefficients','m\/s',1)],x=>[O('Local pressure loss',x.K*x.rho*x.v*x.v\/2,'kPa')],'K values must correspond to the component geometry and stated reference velocity.',['darcy']);\nadd('head-pressure','Water hydraulics','Static head to pressure','p = rho \u00d7 g \u00d7 h',[rho(),F('h','Vertical head','m',10,{zero:true})],x=>[O('Hydrostatic pressure difference',x.rho*g*x.h,'bar')],'Vertical elevation only, not developed pipe length. A closed filled circuit does not require a circulating pump to overcome the building height continuously.',['pump']);\nadd('pressure-head','Water hydraulics','Pressure to head','h = dp \/ (rho \u00d7 g)',[F('dp','Pressure difference','bar',1,{zero:true}),rho()],x=>[O('Equivalent fluid head',x.dp\/(x.rho*g),'m')],'Use the density of the actual fluid.',['pump']);\nadd('valve-kv','Water hydraulics','Required liquid valve Kv','Kv = q_m3h \u00d7 \u221a(SG \/ dp_bar)',[q(),F('SG','Liquid specific gravity to water','ratio',1),F('dp','Valve pressure difference','bar',.1)],x=>[O('Required Kv',x.q*3600*Math.sqrt(x.SG\/(x.dp\/1e5)),'Kv (m\u00b3\/h)')],'Single-phase liquid, non-cavitating conditions. Valve authority, noise, control range and product limits need separate selection.',['kv']);\nadd('valve-drop','Water hydraulics','Liquid pressure drop from Kv','dp_bar = SG \u00d7 (q_m3h \/ Kv)\u00b2',[q(),F('SG','Liquid specific gravity','ratio',1),F('Kv','Published valve Kv','Kv (m\u00b3\/h)',2)],x=>[O('Valve pressure drop',x.SG*(x.q*3600\/x.Kv)**2*1e5,'kPa')],'Use the Kv for the actual valve position and flow path. Not for gas, steam or two-phase flow.',['kv']);\nadd('valve-flow','Water hydraulics','Liquid flow through a Kv valve','q_m3h = Kv \u00d7 \u221a(dp_bar \/ SG)',[F('Kv','Published valve Kv','Kv (m\u00b3\/h)',2),F('dp','Valve pressure difference','bar',.1),F('SG','Liquid specific gravity','ratio',1)],x=>[O('Volume flow',x.Kv*Math.sqrt(x.dp\/1e5\/x.SG)\/3600,'L\/min')],'Single-phase liquid model.',['kv']);\nadd('pump-power','Water hydraulics','Pump hydraulic and input power','Phyd = rho \u00d7 g \u00d7 q \u00d7 h; Pin = Phyd \/ eta',[rho(),q(),F('h','Pump differential head','m',5),F('eta','Overall pump and motor efficiency','%',40,{max:1})],x=>[O('Hydraulic power',x.rho*g*x.q*x.h,'W'),O('Estimated electrical input',x.rho*g*x.q*x.h\/x.eta,'W')],'Efficiency varies with duty point. Verify pump curve and minimum flow.',['pump']);\nadd('affinity','Water hydraulics','Pump-speed affinity estimate','q2 = q1 \u00d7 r; h2 = h1 \u00d7 r\u00b2; P2 = P1 \u00d7 r\u00b3; r = n2 \/ n1',[F('q1','Original flow','L\/min',30),F('h1','Original head','m',5),F('P1','Original shaft power','W',100),F('n1','Original rotational speed','rpm',2000),F('n2','New rotational speed','rpm',1600)],x=>{const r=x.n2\/x.n1;return[O('Scaled flow',x.q1*r,'L\/min'),O('Scaled head',x.h1*r*r,'m'),O('Scaled shaft power',x.P1*r*r*r,'W')];},'Same impeller and similar operation, approximately constant efficiency. Actual system operating point must be found from system and pump curves.',['pump']);\nadd('expansion-water','Expansion & materials','Fluid expansion from density change','Ve = Vcold \u00d7 (rhoCold \/ rhoHot - 1)',[F('Vcold','Cold system volume','L',150),F('rhoCold','Cold density','kg\/m\u00b3',998.2),F('rhoHot','Hot density','kg\/m\u00b3',971.8)],x=>{if(x.rhoHot>x.rhoCold)throw Error('This expansion estimate requires hot density no greater than cold density.');return[O('Thermal expansion volume',x.Vcold*(x.rhoCold\/x.rhoHot-1),'L')];},'Use verified properties for actual fluid and temperatures. Glycol changes the expansion behaviour.',['vessel']);\nadd('vessel','Expansion & materials','Expansion-vessel acceptance estimate','fraction = p0abs \u00d7 (1 \/ pfillabs - 1 \/ pmaxabs); Vnom = Ve \/ fraction',[F('Ve','Expansion volume to accept','L',5),F('p0','Pre-charge GAUGE pressure','bar',1,{zero:true}),F('pf','Cold fill GAUGE pressure','bar',1.2,{zero:true}),F('pm','Chosen maximum working GAUGE pressure','bar',2.5),F('pa','Local atmospheric pressure','bar',1.01325)],x=>{if(x.pf<x.p0||x.pm<=x.pf)throw Error('Require cold fill \u2265 pre-charge and maximum pressure > cold fill.');const a=(x.p0+x.pa)*(1\/(x.pf+x.pa)-1\/(x.pm+x.pa));return[O('Ideal acceptance fraction',a,'%'),O('Ideal nominal gas-space volume',x.Ve\/a,'L')];},'Isothermal ideal-gas acceptance model only. No reserve allowance, diaphragm limits, glycol, product tolerances or relief-setting margin is selected automatically. This is not a final vessel selection.',['vessel']);\nadd('linear-expansion','Expansion & materials','Pipe thermal expansion','change = alpha \u00d7 L \u00d7 dt',[F('alpha','Material expansion coefficient','1\/K',.000017),len(),F('dt','Temperature rise','K difference',60,{zero:true})],x=>[O('Length increase',x.alpha*x.L*x.dt,'mm')],'Example coefficient is illustrative. Use the actual pipe material\/product and operating range; supports and expansion accommodation need design.',['si']);\nadd('pipe-volume','Geometry & drainage','Round pipe water content','V = \u03c0 \u00d7 d\u00b2 \u00d7 L \/ 4',[diam(),len()],x=>[O('Internal pipe volume',Math.PI*x.d*x.d*x.L\/4,'L')],'Use internal diameter, not nominal or outside size.',['si']);\nadd('tank-cylinder','Geometry & drainage','Cylindrical tank volume','V = \u03c0 \u00d7 d\u00b2 \u00d7 h \/ 4',[F('d','Internal diameter','m',.5),F('h','Water depth','m',1)],x=>[O('Contained volume',Math.PI*x.d*x.d*x.h\/4,'L')],'Vertical cylinder with flat ends; excludes dished ends, coils and unusable volume.',['si']);\nadd('tank-box','Geometry & drainage','Rectangular tank volume','V = L \u00d7 w \u00d7 h',[F('L','Internal length','m',1),F('w','Internal width','m',.5),F('h','Water depth','m',.4)],x=>[O('Contained volume',x.L*x.w*x.h,'L')],'Internal dimensions and water depth, not external case dimensions.',['si']);\nadd('bucket-flow','Geometry & drainage','Measured bucket flow','q = V \/ t',[F('V','Collected volume','L',10),F('t','Collection time','s',30)],x=>[O('Measured volume flow',x.V\/x.t,'L\/min')],'Flow at the measured conditions; does not establish supply pressure or simultaneous-use performance.',['si']);\nadd('fill-time','Geometry & drainage','Fill \/ drain time at constant flow','t = V \/ q',[F('V','Volume to transfer','L',150),q()],x=>[O('Time',x.V\/x.q,'min')],'Assumes constant flow and no simultaneous inflow\/outflow. Gravity drainage is rarely constant.',['si']);\nadd('drain-fall','Geometry & drainage','Drainage fall for a chosen gradient','fall = L \/ N',[F('L','Horizontal run','m',6),F('N','Gradient denominator: 1 in N','ratio',80)],x=>[O('Required geometric fall',x.L\/x.N,'mm')],'Enter an independently selected gradient. This tool does not determine the permitted gradient, pipe diameter, discharge units or self-cleansing performance. England guidance differs from other UK nations.',['drainage']);\nadd('drain-gradient','Geometry & drainage','Gradient from rise \/ fall and run','N = L \/ fall; slope = fall \/ L',[F('L','Horizontal run','m',6),F('fall','Vertical fall','mm',75)],x=>[O('Gradient: 1 in this number',x.L\/x.fall,'ratio'),O('Slope',x.fall\/x.L,'%')],'Geometric result, not drainage compliance approval.',['drainage']);\nadd('offset','Geometry & drainage','Two-bend pipe offset','travel = offset \/ sin(angle); advance = offset \/ tan(angle)',[F('offset','Perpendicular centreline offset','mm',300),F('angle','Bend angle','\u00b0',45,{max:Math.PI\/2})],x=>[O('Centreline diagonal travel',x.offset\/Math.sin(x.angle),'mm'),O('Centreline advance',x.offset\/Math.tan(x.angle),'mm')],'Centreline geometry only. Deduct fitting take-outs from manufacturer dimensions; these are not finished cutting lengths.',['si']);\nadd('rolling-offset','Geometry & drainage','Rolling offset using two 45\u00b0 bends','offset = \u221a(rise\u00b2 + sideways\u00b2); travel = offset \u00d7 \u221a2',[F('rise','Vertical offset','mm',300,{zero:true}),F('sideways','Horizontal offset','mm',400,{zero:true})],x=>{const o=Math.hypot(x.rise,x.sideways);return[O('True perpendicular offset',o,'mm'),O('45\u00b0 centreline travel',o*Math.SQRT2,'mm')];},'Centreline geometry only; include actual fitting take-outs and installation clearances.',['si']);\nadd('force','Expansion & materials','Pressure force on an end cap','force = p \u00d7 \u03c0 \u00d7 d\u00b2 \/ 4',[F('p','Pressure difference across cap','bar',3),diam()],x=>[O('Axial pressure force',x.p*Math.PI*x.d*x.d\/4,'N')],'Static end force only; does not design anchors or account for water hammer and thermal movement.',['si']);\nadd('immersion-current','Energy & electrical','Resistive heater current','I = P \/ U',[F('P','Resistive heater input','kW',3),F('U','Supply voltage','V',230)],x=>[O('Current',x.P\/x.U,'A')],'Single-phase resistive load only, power factor approximately 1. Cable, protective device and installation selection are separate.',['si']);\nadd('element-resistance','Energy & electrical','Heating-element resistance','R = U\u00b2 \/ P',[F('U','Rated supply voltage','V',230),F('P','Rated heater power','kW',3)],x=>[O('Operating resistance estimate',x.U*x.U\/x.P,'\u03a9')],'Resistance can vary with element temperature; not an insulation or electrical-safety test.',['si']);\nadd('friction-factor','Water hydraulics','Darcy friction factor','Laminar: f = 64 \/ Re; turbulent: 1\/\u221af = -2 log10(eps \/ (3.7 \u00d7 d) + 2.51 \/ (Re \u00d7 \u221af))',[F('Re','Reynolds number','ratio',20000),F('eps','Absolute internal roughness','mm',.0015,{zero:true}),diam()],x=>{if(x.Re>=2300&&x.Re<4000)throw Error('Transitional flow: no reliable single friction factor is provided for Re 2300\u20133999.');if(x.eps\/x.d>.05||x.Re>1e8)throw Error('Outside supported roughness ratio or Reynolds range.');if(x.Re<2300)return[O('Laminar Darcy factor',64\/x.Re,'ratio')];let lo=.002,hi=.2;const residual=f=>1\/Math.sqrt(f)+2*Math.log10(x.eps\/(3.7*x.d)+2.51\/(x.Re*Math.sqrt(f)));for(let i=0;i<100;i++){const m=(lo+hi)\/2;if(residual(m)>0)lo=m;else hi=m;}return[O('Colebrook Darcy factor',(lo+hi)\/2,'ratio')];},'Fully developed circular-pipe flow. Use actual roughness and fluid properties. No transitional-flow estimate; this factor is not a gas installation sizing approval.',['darcy']);\nUNITS.voltage={V:1};UNITS.current={A:1};UNITS.resistance={'\u03a9':1};\nfor(const [id,group,title,u] of [['length','length','Length','m'],['volume','volume','Volume','L'],['pressure','pressure','Pressure','bar'],['power','power','Power','kW'],['energy','energy','Energy','kWh'],['flow','flow','Volume flow','L\/min'],['temperature','temp','Temperature','\u00b0C'],['mass','mass','Mass','kg']])add('convert-'+id,'Unit conversions',title+' converter','result = value',[F('value','Value to convert',u,1,{signed:group!=='temp',temperature:group==='temp',absoluteZero:group==='temp',zero:true})],x=>[O('Converted value',x.value,u)],'Choose another compatible output unit beside the answer. UK and US gallons are separate; Btu uses the International Table definition.',['si']);\nconst categoryOrder=['Gas','Heating & hot water','Heat loss & emitters','Water hydraulics','Expansion & materials','Geometry & drainage','Energy & electrical','Unit conversions'];CALCS.sort((a,b)=>categoryOrder.indexOf(a.group)-categoryOrder.indexOf(b.group));\nfunction calculate(c,raw){\n const x={};\n for(const f of c.fields){\n  const entry=raw?.[f.key];\n  if(!entry||!['number','string'].includes(typeof entry.value)||String(entry.value).trim()==='')throw Error('Enter a numeric value for '+f.label.toLowerCase()+'.');\n  if(typeof entry.value==='string'&&!\/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?$\/i.test(entry.value.trim()))throw Error('Invalid number for '+f.label+'.');\n  const n=Number(entry.value);\n  if(!Number.isFinite(n)||unitGroup(entry.unit)!==unitGroup(f.unit))throw Error('Invalid value or unit for '+f.label+'.');\n  let si=toSI(n,entry.unit);\n  if(!Number.isFinite(si))throw Error('Value is too large after unit conversion for '+f.label+'.');\n  if(f.temperature){\n   if(Math.abs(si+273.15)<1e-10)si=-273.15;\n   if(f.absoluteZero?si < -273.15:si <= -273.15)throw Error('Temperature must be '+(f.absoluteZero?'at or above':'above')+' absolute zero.');\n  }else if(!f.signed&#038;&#038;(f.zero?si<0:si<=0))throw Error(f.label+' must be '+(f.zero?'zero or positive.':'greater than zero.'));\n  if(f.max!==undefined&#038;&#038;si>f.max+Math.abs(f.max)*1e-12)throw Error(f.label+' is above the supported range.');\n  x[f.key]=si;\n }\n const outputs=c.compute(x);\n if(outputs.some(o=>!Number.isFinite(o.value)||!Number.isFinite(fromSI(o.value,o.unit))))throw Error('Calculation is outside the supported numerical range.');\n return {x,outputs};\n}\nfunction exampleInputs(c){return Object.fromEntries(c.fields.map(f=>[f.key,{value:f.example,unit:f.unit}]));}\n\/* ---- end of original engine.js ---- *\/\n\n\/* Display helpers ported from the original app.js (format, canonical, substitutions). *\/\nconst format=n=>n===0?'0':Math.abs(n)<.0001||Math.abs(n)>=1e8?n.toExponential(6):Number(n.toPrecision(8)).toLocaleString('en-GB',{maximumFractionDigits:10});\nfunction canonical(unit){return Object.keys(UNITS[unitGroup(unit)])[0];}\nfunction substitutions(c,x){const values={...x};if(x.q!==undefined)values.q_m3h=x.q*3600;if(x.dp!==undefined)values.dp_bar=x.dp\/1e5;if(x.p0!==undefined){values.p0abs=x.p0+x.pa;values.pfillabs=x.pf+x.pa;values.pmaxabs=x.pm+x.pa;}if(x.Tf!==undefined)values.DT=(x.Tf+x.Tr)\/2-x.Ta;if(x.n1!==undefined)values.r=x.n2\/x.n1;return c.formula.replace(\/\\b[A-Za-z][A-Za-z0-9_]*\\b\/g,t=>Object.hasOwn(values,t)?'('+format(values[t])+')':t);}\n\nconst isConverter=c=>c.id.indexOf('convert-')===0;\nconst byId={};CALCS.forEach(c=>{byId[c.id]=c;});\n\nconst calcs=CALCS.map(c=>({\n id:c.id,group:c.group,title:c.title,formula:c.formula,\n notes:c.note,\n sources:(c.sources||[]).filter(k=>SOURCES[k]).map(k=>({title:SOURCES[k][0],url:SOURCES[k][1]})),\n fields:c.fields.map(f=>({key:f.key,label:f.label,unit:f.unit,units:Object.keys(UNITS[unitGroup(f.unit)]),example:f.example}))\n}));\n\nfunction run(calc,inputs){\n const c=byId[calc.id];\n if(!c)throw Error('Unknown calculator.');\n const r=calculate(c,inputs);\n let outputs=r.outputs.map(o=>({label:o.name,value:fromSI(o.value,o.unit),unit:o.unit}));\n if(isConverter(c)){\n  \/* The original lets the answer unit be changed beside the result; here every compatible unit is listed. *\/\n  const u=r.outputs[0].unit, v=r.outputs[0].value;\n  Object.keys(UNITS[unitGroup(u)]).forEach(k=>{if(k!==u)outputs.push({label:'In '+k,value:fromSI(v,k),unit:k});});\n }\n const lines=['1 \u00b7 Convert the inputs (SI working values; temperatures in Celsius, absolute-temperature formulas add 273.15)'];\n c.fields.forEach(f=>{const e=inputs[f.key],base=canonical(f.unit);lines.push('   '+f.key+' = '+e.value+' '+e.unit+'  \u2192  '+format(fromSI(r.x[f.key],base))+' '+base);});\n lines.push('','2 \u00b7 Apply the equation','   '+c.formula,'','3 \u00b7 Substitute the values','   '+substitutions(c,r.x));\n lines.push('','4 \u00b7 Convert the answer to the shown unit');\n outputs.forEach((o,i)=>{const src=r.outputs[Math.min(i,r.outputs.length-1)],base=canonical(src.unit);lines.push('   '+o.label+': '+format(fromSI(src.value,base))+' '+base+'  \u2192  '+format(o.value)+' '+o.unit);});\n if(\/Colebrook\/.test(c.formula))lines.push('','Colebrook is solved numerically; the displayed equation defines the iteration.');\n return {outputs,working:lines.join('\\n')};\n}\n\nwindow.TF_CALC={\n name:'Gas and plumbing',\n h1:'Gas and plumbing calculators.',\n sub:'68 tools for gas, heating and water maths.',\n disclaimer:'Results are arithmetic only. Worked examples are not recommended design settings. This library does not provide automatic gas pipe selection, live gas tightness tests, purging procedures, combustion acceptance limits, installation approval or commissioning certification. Manufacturer data and the applicable current method remain essential.',\n calcs:calcs,\n run:run\n};\n})();\n\n<\/script>\n<script>\n(function(){window.TF_MATH={\"gas-rate\":{\"m\":[\"<math display=\\\"block\\\"><mi>q<\\\/mi><mo>=<\\\/mo><mfrac><mi>V<\\\/mi><mi>t<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>q<\\\/mi>\",\"gas volume rate (m\u00b3\/s; the calculator shows m\u00b3\/h)\"],[\"<mi>V<\\\/mi>\",\"measured gas volume (m\u00b3)\"],[\"<mi>t<\\\/mi>\",\"elapsed time (s)\"]]},\"gas-input\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>V<\\\/mi><mi>C<\\\/mi><msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub><\\\/mrow><mi>t<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"heat input (W; the calculator shows kW)\"],[\"<mi>V<\\\/mi>\",\"measured gas volume (m\u00b3)\"],[\"<mi>C<\\\/mi>\",\"volume correction factor\"],[\"<msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"calorific value at matching reference conditions (J\/m\u00b3; any unit you pick is converted)\"],[\"<mi>t<\\\/mi>\",\"elapsed time (s)\"]]},\"gas-demand\":{\"m\":[\"<math display=\\\"block\\\"><mi>q<\\\/mi><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>q<\\\/mi>\",\"gas volume demand (m\u00b3\/s; the calculator shows m\u00b3\/h)\"],[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; any unit you pick is converted)\"],[\"<msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"calorific value at volume reference conditions (J\/m\u00b3; any unit you pick is converted)\"]]},\"fuel-mass\":{\"m\":[\"<math display=\\\"block\\\"><mover><mi>m<\\\/mi><mo>\u02d9<\\\/mo><\\\/mover><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>\u1e41<\\\/mtext>\",\"fuel mass rate (kg\/s; the calculator shows kg\/h)\"],[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; any unit you pick is converted)\"],[\"<msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"fuel calorific value on stated basis (J\/kg; any unit you pick is converted)\"]]},\"gas-bill\":{\"m\":[\"<math display=\\\"block\\\"><mi>E<\\\/mi><mo>=<\\\/mo><mi>V<\\\/mi><mi>C<\\\/mi><msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub><\\\/math>\"],\"w\":[[\"<mi>E<\\\/mi>\",\"billed energy (J; the calculator shows kWh)\"],[\"<mi>V<\\\/mi>\",\"consumed volume (m\u00b3)\"],[\"<mi>C<\\\/mi>\",\"billing volume correction factor\"],[\"<msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"billing calorific value (J\/m\u00b3; any unit you pick is converted)\"]]},\"gas-reference\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>V<\\\/mi><mtext>ref<\\\/mtext><\\\/msub><mo>=<\\\/mo><mi>V<\\\/mi><mfrac><mi>p<\\\/mi><msub><mi>p<\\\/mi><mtext>ref<\\\/mtext><\\\/msub><\\\/mfrac><mfrac><mrow><msub><mi>T<\\\/mi><mtext>ref<\\\/mtext><\\\/msub><mo>+<\\\/mo><mn>273.15<\\\/mn><\\\/mrow><mrow><mi>T<\\\/mi><mo>+<\\\/mo><mn>273.15<\\\/mn><\\\/mrow><\\\/mfrac><mfrac><msub><mi>Z<\\\/mi><mtext>ref<\\\/mtext><\\\/msub><mi>Z<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>V<\\\/mi><mtext>ref<\\\/mtext><\\\/msub>\",\"volume at reference conditions (m\u00b3)\"],[\"<mi>V<\\\/mi>\",\"measured volume (m\u00b3)\"],[\"<mi>p<\\\/mi>\",\"measured absolute pressure (bar)\"],[\"<msub><mi>p<\\\/mi><mtext>ref<\\\/mtext><\\\/msub>\",\"reference absolute pressure (bar, same unit as p)\"],[\"<msub><mi>T<\\\/mi><mtext>ref<\\\/mtext><\\\/msub>\",\"reference temperature (\u00b0C)\"],[\"<mi>T<\\\/mi>\",\"measured gas temperature (\u00b0C)\"],[\"<msub><mi>Z<\\\/mi><mtext>ref<\\\/mtext><\\\/msub>\",\"reference compressibility factor\"],[\"<mi>Z<\\\/mi>\",\"measured compressibility factor\"]]},\"gas-loss\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mo>=<\\\/mo><mi>r<\\\/mi><mrow><mo>(<\\\/mo><mi>L<\\\/mi><mo>+<\\\/mo><msub><mi>L<\\\/mi><mtext>eq<\\\/mtext><\\\/msub><mo>)<\\\/mo><\\\/mrow><\\\/math>\"],\"w\":[[\"<mtext>\u0394p<\\\/mtext>\",\"gas pressure loss (mbar)\"],[\"<mi>r<\\\/mi>\",\"loss per metre from sizing table (mbar\/m)\"],[\"<mi>L<\\\/mi>\",\"developed pipe length (m)\"],[\"<msub><mi>L<\\\/mi><mtext>eq<\\\/mtext><\\\/msub>\",\"total fitting equivalent length (m)\"]]},\"installation-volume\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>V<\\\/mi><mtext>total<\\\/mtext><\\\/msub><mo>=<\\\/mo><mfrac><mrow><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><mi>L<\\\/mi><\\\/mrow><mn>4<\\\/mn><\\\/mfrac><mo>+<\\\/mo><msub><mi>V<\\\/mi><mtext>other<\\\/mtext><\\\/msub><\\\/math>\"],\"w\":[[\"<msub><mi>V<\\\/mi><mtext>total<\\\/mtext><\\\/msub>\",\"total installation volume (m\u00b3)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"],[\"<mi>L<\\\/mi>\",\"developed pipe length (m)\"],[\"<msub><mi>V<\\\/mi><mtext>other<\\\/mtext><\\\/msub>\",\"meter, fittings, appliances and other sections (m\u00b3; any unit you pick is converted)\"]]},\"wobbe\":{\"m\":[\"<math display=\\\"block\\\"><mi>W<\\\/mi><mo>=<\\\/mo><mfrac><msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub><msqrt><mtext>SG<\\\/mtext><\\\/msqrt><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>W<\\\/mi>\",\"Wobbe index (J\/m\u00b3; the calculator shows MJ\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"calorific value on stated basis (J\/m\u00b3; any unit you pick is converted)\"],[\"<mtext>SG<\\\/mtext>\",\"gas relative density to air\"]]},\"combustion-ratio\":{\"m\":[\"<math display=\\\"block\\\"><mtext>ratio<\\\/mtext><mo>=<\\\/mo><mfrac><mtext>CO<\\\/mtext><mrow><msup><mn>10<\\\/mn><mn>4<\\\/mn><\\\/msup><mo>\u00d7<\\\/mo><msub><mtext>CO<\\\/mtext><mn>2<\\\/mn><\\\/msub><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>CO<\\\/mtext>\",\"measured CO (ppm)\"],[\"<mtext>CO\u2082<\\\/mtext>\",\"measured CO\u2082 (%)\"]]},\"heat-power\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mi>q<\\\/mi><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; the calculator shows kW)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; any unit you pick is converted)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"temperature difference (K)\"]]},\"heat-flow\":{\"m\":[\"<math display=\\\"block\\\"><mi>q<\\\/mi><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><mrow><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; the calculator shows L\/min)\"],[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"temperature difference (K)\"]]},\"heat-delta\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><mrow><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mi>q<\\\/mi><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>\u0394T<\\\/mtext>\",\"flow\u2013return temperature difference (K)\"],[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; any unit you pick is converted)\"]]},\"water-energy\":{\"m\":[\"<math display=\\\"block\\\"><mi>E<\\\/mi><mo>=<\\\/mo><mi>\u03c1<\\\/mi><mi>V<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mrow><mo>(<\\\/mo><msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><mo>)<\\\/mo><\\\/mrow><\\\/math>\"],\"w\":[[\"<mi>E<\\\/mi>\",\"energy (J; the calculator shows kWh)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>V<\\\/mi>\",\"stored water volume (m\u00b3; any unit you pick is converted)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"final water temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"starting water temperature (\u00b0C)\"]]},\"recovery-time\":{\"m\":[\"<math display=\\\"block\\\"><mi>t<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c1<\\\/mi><mi>V<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/mrow><mi>P<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>t<\\\/mi>\",\"recovery time (s; the calculator shows min)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>V<\\\/mi>\",\"heated volume (m\u00b3; any unit you pick is converted)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"water temperature rise (K)\"],[\"<mi>P<\\\/mi>\",\"average useful heat transferred to water (W; any unit you pick is converted)\"]]},\"recovery-power\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c1<\\\/mi><mi>V<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/mrow><mi>t<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"required power (W; the calculator shows kW)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>V<\\\/mi>\",\"heated volume (m\u00b3; any unit you pick is converted)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"water temperature rise (K)\"],[\"<mi>t<\\\/mi>\",\"target time (s; any unit you pick is converted)\"]]},\"mix-temperature\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub><mo>=<\\\/mo><mfrac><mrow><msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub><msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>+<\\\/mo><msub><mi>q<\\\/mi><mi>c<\\\/mi><\\\/msub><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><mrow><msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>+<\\\/mo><msub><mi>q<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub>\",\"mixed temperature (\u00b0C)\"],[\"<msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"hot flow (L\/min)\"],[\"<msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"hot temperature (\u00b0C)\"],[\"<msub><mi>q<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"cold flow (L\/min)\"],[\"<msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"cold temperature (\u00b0C)\"]]},\"mix-fraction\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>=<\\\/mo><mi>q<\\\/mi><mfrac><mrow><msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><mrow><msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><\\\/mfrac><\\\/math>\",\"<math display=\\\"block\\\"><msub><mi>q<\\\/mi><mi>c<\\\/mi><\\\/msub><mo>=<\\\/mo><mi>q<\\\/mi><mo>\u2212<\\\/mo><msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub><\\\/math>\"],\"w\":[[\"<msub><mi>q<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"hot flow (L\/min)\"],[\"<mi>q<\\\/mi>\",\"total mixed flow (L\/min)\"],[\"<msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub>\",\"target mixed temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"cold supply temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"hot supply temperature (\u00b0C)\"],[\"<msub><mi>q<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"cold flow (L\/min)\"]]},\"mixed-volume\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>V<\\\/mi><mi>m<\\\/mi><\\\/msub><mo>=<\\\/mo><msub><mi>V<\\\/mi><mi>h<\\\/mi><\\\/msub><mfrac><mrow><msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><mrow><msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>V<\\\/mi><mi>m<\\\/mi><\\\/msub>\",\"usable mixed-water volume (L)\"],[\"<msub><mi>V<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"stored hot volume (L)\"],[\"<msub><mi>T<\\\/mi><mi>h<\\\/mi><\\\/msub>\",\"stored temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>c<\\\/mi><\\\/msub>\",\"cold temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>m<\\\/mi><\\\/msub>\",\"delivery temperature (\u00b0C)\"]]},\"dhw-rise\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><mrow><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mi>q<\\\/mi><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>\u0394T<\\\/mtext>\",\"temperature rise (K)\"],[\"<mi>P<\\\/mi>\",\"useful DHW output (W; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mi>q<\\\/mi>\",\"hot-water flow (m\u00b3\/s; any unit you pick is converted)\"]]},\"fabric-loss\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mi>U<\\\/mi><mi>A<\\\/mi><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"element heat loss (W)\"],[\"<mi>U<\\\/mi>\",\"element U-value (W\/(m\u00b2\u00b7K))\"],[\"<mi>A<\\\/mi>\",\"net element area (m\u00b2)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"indoor\u2013outdoor design difference (K)\"]]},\"ventilation-loss\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mi>n<\\\/mi><mi>V<\\\/mi><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"ventilation heat loss (W)\"],[\"<mi>\u03c1<\\\/mi>\",\"air density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"air specific heat (J\/(kg\u00b7K))\"],[\"<mi>n<\\\/mi>\",\"air change rate (1\/s; any unit you pick is converted)\"],[\"<mi>V<\\\/mi>\",\"room volume (m\u00b3)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"indoor\u2013outdoor difference (K)\"]]},\"radiator-output\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><mo>=<\\\/mo><mfrac><mrow><msub><mi>T<\\\/mi><mi>f<\\\/mi><\\\/msub><mo>+<\\\/mo><msub><mi>T<\\\/mi><mi>r<\\\/mi><\\\/msub><\\\/mrow><mn>2<\\\/mn><\\\/mfrac><mo>\u2212<\\\/mo><msub><mi>T<\\\/mi><mi>a<\\\/mi><\\\/msub><\\\/math>\",\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><msub><mi>P<\\\/mi><mtext>rated<\\\/mtext><\\\/msub><msup><mrow><mo>(<\\\/mo><mfrac><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><mtext>rated<\\\/mtext><\\\/msub><\\\/mfrac><mo>)<\\\/mo><\\\/mrow><mi>n<\\\/mi><\\\/msup><\\\/math>\"],\"w\":[[\"<mtext>\u0394T<\\\/mtext>\",\"operating mean-water \/ air difference (K)\"],[\"<msub><mi>T<\\\/mi><mi>f<\\\/mi><\\\/msub>\",\"flow temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>r<\\\/mi><\\\/msub>\",\"return temperature (\u00b0C)\"],[\"<msub><mi>T<\\\/mi><mi>a<\\\/mi><\\\/msub>\",\"room temperature (\u00b0C)\"],[\"<mi>P<\\\/mi>\",\"radiator output (W)\"],[\"<msub><mi>P<\\\/mi><mtext>rated<\\\/mtext><\\\/msub>\",\"published rated output (W)\"],[\"<msub><mtext>\u0394T<\\\/mtext><mtext>rated<\\\/mtext><\\\/msub>\",\"published rated mean-water \/ air difference (K)\"],[\"<mi>n<\\\/mi>\",\"manufacturer exponent\"]]},\"radiator-rated\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>P<\\\/mi><mtext>rated<\\\/mtext><\\\/msub><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><msup><mrow><mo>(<\\\/mo><mfrac><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><mtext>rated<\\\/mtext><\\\/msub><\\\/mfrac><mo>)<\\\/mo><\\\/mrow><mi>n<\\\/mi><\\\/msup><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>P<\\\/mi><mtext>rated<\\\/mtext><\\\/msub>\",\"required catalogue output (W)\"],[\"<mi>P<\\\/mi>\",\"required room output (W)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"operating mean-water \/ room difference (K)\"],[\"<msub><mtext>\u0394T<\\\/mtext><mtext>rated<\\\/mtext><\\\/msub>\",\"catalogue rating difference (K)\"],[\"<mi>n<\\\/mi>\",\"manufacturer exponent\"]]},\"buffer-volume\":{\"m\":[\"<math display=\\\"block\\\"><mi>V<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>P<\\\/mi><mi>t<\\\/mi><\\\/mrow><mrow><mi>\u03c1<\\\/mi><msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>V<\\\/mi>\",\"buffer volume (m\u00b3; the calculator shows L)\"],[\"<mi>P<\\\/mi>\",\"excess heat above current load (W; any unit you pick is converted)\"],[\"<mi>t<\\\/mi>\",\"desired storage duration (s; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<msub><mi>c<\\\/mi><mi>p<\\\/mi><\\\/msub>\",\"specific heat capacity (J\/(kg\u00b7K); any unit you pick is converted)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"usable buffer temperature swing (K)\"]]},\"ufh-length\":{\"m\":[\"<math display=\\\"block\\\"><mi>L<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mn>1000<\\\/mn><mi>A<\\\/mi><\\\/mrow><mi>s<\\\/mi><\\\/mfrac><mo>+<\\\/mo><msub><mi>L<\\\/mi><mtext>tails<\\\/mtext><\\\/msub><\\\/math>\"],\"w\":[[\"<mi>L<\\\/mi>\",\"pipe length (m)\"],[\"<mi>A<\\\/mi>\",\"active heated area (m\u00b2)\"],[\"<mi>s<\\\/mi>\",\"pipe centre spacing (mm)\"],[\"<msub><mi>L<\\\/mi><mtext>tails<\\\/mtext><\\\/msub>\",\"total connection tails (m)\"]]},\"solar-power\":{\"m\":[\"<math display=\\\"block\\\"><mi>P<\\\/mi><mo>=<\\\/mo><mi>A<\\\/mi><mi>G<\\\/mi><mi>\u03b7<\\\/mi><\\\/math>\"],\"w\":[[\"<mi>P<\\\/mi>\",\"useful power (W; the calculator shows kW)\"],[\"<mi>A<\\\/mi>\",\"collector area (m\u00b2)\"],[\"<mi>G<\\\/mi>\",\"incident irradiance (W\/m\u00b2)\"],[\"<mi>\u03b7<\\\/mi>\",\"collector efficiency (fraction; any unit you pick is converted)\"]]},\"velocity\":{\"m\":[\"<math display=\\\"block\\\"><mi>v<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mn>4<\\\/mn><mi>q<\\\/mi><\\\/mrow><mrow><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>v<\\\/mi>\",\"mean velocity (m\/s)\"],[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; any unit you pick is converted)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"]]},\"diameter\":{\"m\":[\"<math display=\\\"block\\\"><mi>d<\\\/mi><mo>=<\\\/mo><msqrt><mfrac><mrow><mn>4<\\\/mn><mi>q<\\\/mi><\\\/mrow><mrow><mi>\u03c0<\\\/mi><mi>v<\\\/mi><\\\/mrow><\\\/mfrac><\\\/msqrt><\\\/math>\"],\"w\":[[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; the calculator shows mm)\"],[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; any unit you pick is converted)\"],[\"<mi>v<\\\/mi>\",\"target velocity (m\/s)\"]]},\"pipe-flow\":{\"m\":[\"<math display=\\\"block\\\"><mi>q<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><mi>v<\\\/mi><\\\/mrow><mn>4<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; the calculator shows L\/min)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"],[\"<mi>v<\\\/mi>\",\"mean velocity (m\/s)\"]]},\"reynolds\":{\"m\":[\"<math display=\\\"block\\\"><mi>Re<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c1<\\\/mi><mi>v<\\\/mi><mi>d<\\\/mi><\\\/mrow><mi>\u03bc<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>Re<\\\/mtext>\",\"Reynolds number\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>v<\\\/mi>\",\"mean velocity (m\/s)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"],[\"<mi>\u03bc<\\\/mi>\",\"dynamic viscosity (Pa\u00b7s; any unit you pick is converted)\"]]},\"darcy\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mo>=<\\\/mo><mi>f<\\\/mi><mfrac><mi>L<\\\/mi><mi>d<\\\/mi><\\\/mfrac><mfrac><mrow><mi>\u03c1<\\\/mi><msup><mi>v<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/mrow><mn>2<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>\u0394p<\\\/mtext>\",\"friction pressure loss (Pa; the calculator shows kPa)\"],[\"<mi>f<\\\/mi>\",\"Darcy friction factor\"],[\"<mi>L<\\\/mi>\",\"developed pipe length (m)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>v<\\\/mi>\",\"mean velocity (m\/s)\"]]},\"minor-loss\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mo>=<\\\/mo><mi>K<\\\/mi><mfrac><mrow><mi>\u03c1<\\\/mi><msup><mi>v<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/mrow><mn>2<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>\u0394p<\\\/mtext>\",\"local pressure loss (Pa; the calculator shows kPa)\"],[\"<mi>K<\\\/mi>\",\"sum of resistance coefficients\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>v<\\\/mi>\",\"reference velocity (m\/s)\"]]},\"head-pressure\":{\"m\":[\"<math display=\\\"block\\\"><mi>p<\\\/mi><mo>=<\\\/mo><mi>\u03c1<\\\/mi><mi>g<\\\/mi><mi>h<\\\/mi><\\\/math>\"],\"w\":[[\"<mi>p<\\\/mi>\",\"static pressure (Pa; the calculator shows bar)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>g<\\\/mi>\",\"gravitational acceleration (m\/s\u00b2)\"],[\"<mi>h<\\\/mi>\",\"vertical head (m)\"]]},\"pressure-head\":{\"m\":[\"<math display=\\\"block\\\"><mi>h<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mrow><mi>\u03c1<\\\/mi><mi>g<\\\/mi><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>h<\\\/mi>\",\"head (m)\"],[\"<mtext>\u0394p<\\\/mtext>\",\"pressure difference (Pa; any unit you pick is converted)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>g<\\\/mi>\",\"gravitational acceleration (m\/s\u00b2)\"]]},\"valve-kv\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub><mo>=<\\\/mo><msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub><msqrt><mfrac><mtext>SG<\\\/mtext><msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mtext>bar<\\\/mtext><\\\/msub><\\\/mfrac><\\\/msqrt><\\\/math>\"],\"w\":[[\"<msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"valve flow coefficient (m\u00b3\/h at 1 bar)\"],[\"<msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub>\",\"volume flow (m\u00b3\/h; any unit you pick is converted)\"],[\"<mtext>SG<\\\/mtext>\",\"liquid specific gravity to water\"],[\"<msub><mtext>\u0394p<\\\/mtext><mtext>bar<\\\/mtext><\\\/msub>\",\"valve pressure difference (bar)\"]]},\"valve-drop\":{\"m\":[\"<math display=\\\"block\\\"><msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mtext>bar<\\\/mtext><\\\/msub><mo>=<\\\/mo><mtext>SG<\\\/mtext><msup><mrow><mo>(<\\\/mo><mfrac><msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub><msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub><\\\/mfrac><mo>)<\\\/mo><\\\/mrow><mn>2<\\\/mn><\\\/msup><\\\/math>\"],\"w\":[[\"<msub><mtext>\u0394p<\\\/mtext><mtext>bar<\\\/mtext><\\\/msub>\",\"valve pressure difference (bar; the calculator shows kPa)\"],[\"<mtext>SG<\\\/mtext>\",\"liquid specific gravity to water\"],[\"<msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub>\",\"volume flow (m\u00b3\/h; any unit you pick is converted)\"],[\"<msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"valve flow coefficient (m\u00b3\/h at 1 bar)\"]]},\"valve-flow\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub><mo>=<\\\/mo><msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub><msqrt><mfrac><msub><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>p<\\\/mi><\\\/mrow><mtext>bar<\\\/mtext><\\\/msub><mtext>SG<\\\/mtext><\\\/mfrac><\\\/msqrt><\\\/math>\"],\"w\":[[\"<msub><mi>q<\\\/mi><mtext>m\u00b3\/h<\\\/mtext><\\\/msub>\",\"volume flow (m\u00b3\/h; the calculator shows L\/min)\"],[\"<msub><mi>K<\\\/mi><mi>v<\\\/mi><\\\/msub>\",\"valve flow coefficient (m\u00b3\/h at 1 bar)\"],[\"<msub><mtext>\u0394p<\\\/mtext><mtext>bar<\\\/mtext><\\\/msub>\",\"valve pressure difference (bar)\"],[\"<mtext>SG<\\\/mtext>\",\"liquid specific gravity to water\"]]},\"pump-power\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>P<\\\/mi><mtext>hyd<\\\/mtext><\\\/msub><mo>=<\\\/mo><mi>\u03c1<\\\/mi><mi>g<\\\/mi><mi>q<\\\/mi><mi>h<\\\/mi><\\\/math>\",\"<math display=\\\"block\\\"><msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub><mo>=<\\\/mo><mfrac><msub><mi>P<\\\/mi><mtext>hyd<\\\/mtext><\\\/msub><mi>\u03b7<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>P<\\\/mi><mtext>hyd<\\\/mtext><\\\/msub>\",\"hydraulic power (W)\"],[\"<mi>\u03c1<\\\/mi>\",\"fluid density (kg\/m\u00b3)\"],[\"<mi>g<\\\/mi>\",\"gravitational acceleration (m\/s\u00b2)\"],[\"<mi>q<\\\/mi>\",\"volume flow (m\u00b3\/s; any unit you pick is converted)\"],[\"<mi>h<\\\/mi>\",\"pump differential head (m)\"],[\"<msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub>\",\"input power (W)\"],[\"<mi>\u03b7<\\\/mi>\",\"overall pump and motor efficiency (fraction; any unit you pick is converted)\"]]},\"affinity\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>q<\\\/mi><mn>2<\\\/mn><\\\/msub><mo>=<\\\/mo><msub><mi>q<\\\/mi><mn>1<\\\/mn><\\\/msub><mi>r<\\\/mi><\\\/math>\",\"<math display=\\\"block\\\"><msub><mi>h<\\\/mi><mn>2<\\\/mn><\\\/msub><mo>=<\\\/mo><msub><mi>h<\\\/mi><mn>1<\\\/mn><\\\/msub><msup><mi>r<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/math>\",\"<math display=\\\"block\\\"><msub><mi>P<\\\/mi><mn>2<\\\/mn><\\\/msub><mo>=<\\\/mo><msub><mi>P<\\\/mi><mn>1<\\\/mn><\\\/msub><msup><mi>r<\\\/mi><mn>3<\\\/mn><\\\/msup><\\\/math>\",\"<math display=\\\"block\\\"><mi>r<\\\/mi><mo>=<\\\/mo><mfrac><msub><mi>n<\\\/mi><mn>2<\\\/mn><\\\/msub><msub><mi>n<\\\/mi><mn>1<\\\/mn><\\\/msub><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>q\u2082<\\\/mtext>\",\"scaled flow (L\/min)\"],[\"<mtext>q\u2081<\\\/mtext>\",\"original flow (L\/min)\"],[\"<mi>r<\\\/mi>\",\"speed ratio\"],[\"<mtext>h\u2082<\\\/mtext>\",\"scaled head (m)\"],[\"<mtext>h\u2081<\\\/mtext>\",\"original head (m)\"],[\"<mtext>P\u2082<\\\/mtext>\",\"scaled shaft power (W)\"],[\"<mtext>P\u2081<\\\/mtext>\",\"original shaft power (W)\"],[\"<mtext>n\u2082<\\\/mtext>\",\"new rotational speed (rpm)\"],[\"<mtext>n\u2081<\\\/mtext>\",\"original rotational speed (rpm)\"]]},\"friction-factor\":{\"m\":[\"<math display=\\\"block\\\"><mi>f<\\\/mi><mo>=<\\\/mo><mfrac><mn>64<\\\/mn><mi>Re<\\\/mi><\\\/mfrac><mspace width=\\\"0.6em\\\"><\\\/mspace><mtext>(laminar)<\\\/mtext><\\\/math>\",\"<math display=\\\"block\\\"><mfrac><mn>1<\\\/mn><msqrt><mi>f<\\\/mi><\\\/msqrt><\\\/mfrac><mo>=<\\\/mo><mo>\u2212<\\\/mo><mn>2<\\\/mn><mspace width=\\\"0.17em\\\"><\\\/mspace><msub><mi>log<\\\/mi><mn>10<\\\/mn><\\\/msub><mspace width=\\\"0.17em\\\"><\\\/mspace><mo>\u2061<\\\/mo><mrow><mo>(<\\\/mo><mfrac><mi>\u03b5<\\\/mi><mrow><mn>3.7<\\\/mn><mi>d<\\\/mi><\\\/mrow><\\\/mfrac><mo>+<\\\/mo><mfrac><mn>2.51<\\\/mn><mrow><mi>Re<\\\/mi><msqrt><mi>f<\\\/mi><\\\/msqrt><\\\/mrow><\\\/mfrac><mo>)<\\\/mo><\\\/mrow><mspace width=\\\"0.6em\\\"><\\\/mspace><mtext>(turbulent)<\\\/mtext><\\\/math>\"],\"w\":[[\"<mi>f<\\\/mi>\",\"Darcy friction factor\"],[\"<mtext>Re<\\\/mtext>\",\"Reynolds number\"],[\"<mi>\u03b5<\\\/mi>\",\"absolute internal roughness (mm)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (mm)\"]]},\"expansion-water\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>V<\\\/mi><mi>e<\\\/mi><\\\/msub><mo>=<\\\/mo><msub><mi>V<\\\/mi><mtext>cold<\\\/mtext><\\\/msub><mrow><mo>(<\\\/mo><mfrac><msub><mi>\u03c1<\\\/mi><mtext>cold<\\\/mtext><\\\/msub><msub><mi>\u03c1<\\\/mi><mtext>hot<\\\/mtext><\\\/msub><\\\/mfrac><mo>\u2212<\\\/mo><mn>1<\\\/mn><mo>)<\\\/mo><\\\/mrow><\\\/math>\"],\"w\":[[\"<msub><mi>V<\\\/mi><mi>e<\\\/mi><\\\/msub>\",\"expansion volume (L)\"],[\"<msub><mi>V<\\\/mi><mtext>cold<\\\/mtext><\\\/msub>\",\"cold system volume (L)\"],[\"<msub><mi>\u03c1<\\\/mi><mtext>cold<\\\/mtext><\\\/msub>\",\"cold density (kg\/m\u00b3)\"],[\"<msub><mi>\u03c1<\\\/mi><mtext>hot<\\\/mtext><\\\/msub>\",\"hot density (kg\/m\u00b3)\"]]},\"vessel\":{\"m\":[\"<math display=\\\"block\\\"><mi>a<\\\/mi><mo>=<\\\/mo><msub><mi>p<\\\/mi><mtext>0,abs<\\\/mtext><\\\/msub><mrow><mo>(<\\\/mo><mfrac><mn>1<\\\/mn><msub><mi>p<\\\/mi><mtext>fill,abs<\\\/mtext><\\\/msub><\\\/mfrac><mo>\u2212<\\\/mo><mfrac><mn>1<\\\/mn><msub><mi>p<\\\/mi><mtext>max,abs<\\\/mtext><\\\/msub><\\\/mfrac><mo>)<\\\/mo><\\\/mrow><\\\/math>\",\"<math display=\\\"block\\\"><msub><mi>V<\\\/mi><mtext>nom<\\\/mtext><\\\/msub><mo>=<\\\/mo><mfrac><msub><mi>V<\\\/mi><mi>e<\\\/mi><\\\/msub><mi>a<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>a<\\\/mi>\",\"acceptance fraction (the calculator shows %)\"],[\"<msub><mi>p<\\\/mi><mtext>0,abs<\\\/mtext><\\\/msub>\",\"pre-charge pressure, gauge + atmospheric (bar)\"],[\"<msub><mi>p<\\\/mi><mtext>fill,abs<\\\/mtext><\\\/msub>\",\"cold fill pressure, gauge + atmospheric (bar)\"],[\"<msub><mi>p<\\\/mi><mtext>max,abs<\\\/mtext><\\\/msub>\",\"maximum working pressure, gauge + atmospheric (bar)\"],[\"<msub><mi>V<\\\/mi><mtext>nom<\\\/mtext><\\\/msub>\",\"nominal vessel gas-space volume (L)\"],[\"<msub><mi>V<\\\/mi><mi>e<\\\/mi><\\\/msub>\",\"expansion volume to accept (L)\"]]},\"linear-expansion\":{\"m\":[\"<math display=\\\"block\\\"><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>L<\\\/mi><\\\/mrow><mo>=<\\\/mo><mi>\u03b1<\\\/mi><mi>L<\\\/mi><mrow><mi mathvariant=\\\"normal\\\">\u0394<\\\/mi><mi>T<\\\/mi><\\\/mrow><\\\/math>\"],\"w\":[[\"<mtext>\u0394L<\\\/mtext>\",\"length change (m; the calculator shows mm)\"],[\"<mi>\u03b1<\\\/mi>\",\"linear expansion coefficient (1\/K)\"],[\"<mi>L<\\\/mi>\",\"developed pipe length (m)\"],[\"<mtext>\u0394T<\\\/mtext>\",\"temperature rise (K)\"]]},\"force\":{\"m\":[\"<math display=\\\"block\\\"><mi>F<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>p<\\\/mi><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/mrow><mn>4<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>F<\\\/mi>\",\"force on end cap (N)\"],[\"<mi>p<\\\/mi>\",\"pressure difference across cap (Pa; any unit you pick is converted)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"]]},\"pipe-volume\":{\"m\":[\"<math display=\\\"block\\\"><mi>V<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><mi>L<\\\/mi><\\\/mrow><mn>4<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>V<\\\/mi>\",\"water content (m\u00b3; the calculator shows L)\"],[\"<mi>d<\\\/mi>\",\"internal pipe diameter (m; any unit you pick is converted)\"],[\"<mi>L<\\\/mi>\",\"developed pipe length (m)\"]]},\"tank-cylinder\":{\"m\":[\"<math display=\\\"block\\\"><mi>V<\\\/mi><mo>=<\\\/mo><mfrac><mrow><mi>\u03c0<\\\/mi><msup><mi>d<\\\/mi><mn>2<\\\/mn><\\\/msup><mi>h<\\\/mi><\\\/mrow><mn>4<\\\/mn><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>V<\\\/mi>\",\"tank volume (m\u00b3; the calculator shows L)\"],[\"<mi>d<\\\/mi>\",\"internal diameter (m)\"],[\"<mi>h<\\\/mi>\",\"water depth (m)\"]]},\"tank-box\":{\"m\":[\"<math display=\\\"block\\\"><mi>V<\\\/mi><mo>=<\\\/mo><mi>L<\\\/mi><mi>w<\\\/mi><mi>h<\\\/mi><\\\/math>\"],\"w\":[[\"<mi>V<\\\/mi>\",\"tank volume (m\u00b3; the calculator shows L)\"],[\"<mi>L<\\\/mi>\",\"internal length (m)\"],[\"<mi>w<\\\/mi>\",\"internal width (m)\"],[\"<mi>h<\\\/mi>\",\"water depth (m)\"]]},\"bucket-flow\":{\"m\":[\"<math display=\\\"block\\\"><mi>q<\\\/mi><mo>=<\\\/mo><mfrac><mi>V<\\\/mi><mi>t<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>q<\\\/mi>\",\"flow (m\u00b3\/s; the calculator shows L\/min)\"],[\"<mi>V<\\\/mi>\",\"collected volume (m\u00b3; any unit you pick is converted)\"],[\"<mi>t<\\\/mi>\",\"collection time (s)\"]]},\"fill-time\":{\"m\":[\"<math display=\\\"block\\\"><mi>t<\\\/mi><mo>=<\\\/mo><mfrac><mi>V<\\\/mi><mi>q<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>t<\\\/mi>\",\"fill \/ drain time (min)\"],[\"<mi>V<\\\/mi>\",\"volume to transfer (L)\"],[\"<mi>q<\\\/mi>\",\"volume flow (L\/min)\"]]},\"drain-fall\":{\"m\":[\"<math display=\\\"block\\\"><mi>h<\\\/mi><mo>=<\\\/mo><mfrac><mi>L<\\\/mi><mi>N<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>h<\\\/mi>\",\"fall (m; the calculator shows mm)\"],[\"<mi>L<\\\/mi>\",\"horizontal run (m)\"],[\"<mi>N<\\\/mi>\",\"gradient denominator (1 in N)\"]]},\"drain-gradient\":{\"m\":[\"<math display=\\\"block\\\"><mi>N<\\\/mi><mo>=<\\\/mo><mfrac><mi>L<\\\/mi><mi>h<\\\/mi><\\\/mfrac><\\\/math>\",\"<math display=\\\"block\\\"><mi>s<\\\/mi><mo>=<\\\/mo><mfrac><mi>h<\\\/mi><mi>L<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>N<\\\/mi>\",\"gradient denominator (1 in N)\"],[\"<mi>L<\\\/mi>\",\"horizontal run (m)\"],[\"<mi>h<\\\/mi>\",\"vertical fall (m; any unit you pick is converted)\"],[\"<mi>s<\\\/mi>\",\"slope (fraction; the calculator shows %)\"]]},\"offset\":{\"m\":[\"<math display=\\\"block\\\"><mi>T<\\\/mi><mo>=<\\\/mo><mfrac><mi>O<\\\/mi><mrow><mspace width=\\\"0.17em\\\"><\\\/mspace><mi>sin<\\\/mi><mspace width=\\\"0.17em\\\"><\\\/mspace><mi>\u03b8<\\\/mi><\\\/mrow><\\\/mfrac><\\\/math>\",\"<math display=\\\"block\\\"><mi>A<\\\/mi><mo>=<\\\/mo><mfrac><mi>O<\\\/mi><mrow><mspace width=\\\"0.17em\\\"><\\\/mspace><mi>tan<\\\/mi><mspace width=\\\"0.17em\\\"><\\\/mspace><mi>\u03b8<\\\/mi><\\\/mrow><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>T<\\\/mi>\",\"travel (mm)\"],[\"<mi>O<\\\/mi>\",\"perpendicular centreline offset (mm)\"],[\"<mi>\u03b8<\\\/mi>\",\"bend angle (\u00b0)\"],[\"<mi>A<\\\/mi>\",\"advance (mm)\"]]},\"rolling-offset\":{\"m\":[\"<math display=\\\"block\\\"><mi>O<\\\/mi><mo>=<\\\/mo><msqrt><mrow><msup><mi>R<\\\/mi><mn>2<\\\/mn><\\\/msup><mo>+<\\\/mo><msup><mi>S<\\\/mi><mn>2<\\\/mn><\\\/msup><\\\/mrow><\\\/msqrt><\\\/math>\",\"<math display=\\\"block\\\"><mi>T<\\\/mi><mo>=<\\\/mo><mi>O<\\\/mi><mo>\u00d7<\\\/mo><msqrt><mn>2<\\\/mn><\\\/msqrt><\\\/math>\"],\"w\":[[\"<mi>O<\\\/mi>\",\"true offset (mm)\"],[\"<mi>R<\\\/mi>\",\"vertical offset, rise (mm)\"],[\"<mi>S<\\\/mi>\",\"horizontal offset, sideways (mm)\"],[\"<mi>T<\\\/mi>\",\"travel (mm)\"]]},\"efficiency\":{\"m\":[\"<math display=\\\"block\\\"><mi>\u03b7<\\\/mi><mo>=<\\\/mo><mfrac><msub><mi>P<\\\/mi><mtext>out<\\\/mtext><\\\/msub><msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>\u03b7<\\\/mi>\",\"thermal efficiency (fraction; the calculator shows %)\"],[\"<msub><mi>P<\\\/mi><mtext>out<\\\/mtext><\\\/msub>\",\"useful output (kW)\"],[\"<msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub>\",\"fuel input on matching basis (kW)\"]]},\"input-from-output\":{\"m\":[\"<math display=\\\"block\\\"><msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><mi>\u03b7<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<msub><mi>P<\\\/mi><mtext>in<\\\/mtext><\\\/msub>\",\"fuel input (kW)\"],[\"<mi>P<\\\/mi>\",\"useful heat \/ power rate (kW)\"],[\"<mi>\u03b7<\\\/mi>\",\"efficiency on stated energy basis (fraction; any unit you pick is converted)\"]]},\"cop\":{\"m\":[\"<math display=\\\"block\\\"><mtext>COP<\\\/mtext><mo>=<\\\/mo><mfrac><msub><mi>P<\\\/mi><mtext>heat<\\\/mtext><\\\/msub><msub><mi>P<\\\/mi><mtext>elec<\\\/mtext><\\\/msub><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mtext>COP<\\\/mtext>\",\"coefficient of performance\"],[\"<msub><mi>P<\\\/mi><mtext>heat<\\\/mtext><\\\/msub>\",\"useful heat output (kW)\"],[\"<msub><mi>P<\\\/mi><mtext>elec<\\\/mtext><\\\/msub>\",\"electrical input (kW)\"]]},\"energy-cost\":{\"m\":[\"<math display=\\\"block\\\"><mi>E<\\\/mi><mo>=<\\\/mo><mi>P<\\\/mi><mi>t<\\\/mi><\\\/math>\",\"<math display=\\\"block\\\"><mi>C<\\\/mi><mo>=<\\\/mo><mi>E<\\\/mi><mi>c<\\\/mi><\\\/math>\"],\"w\":[[\"<mi>E<\\\/mi>\",\"energy (J; the calculator shows kWh)\"],[\"<mi>P<\\\/mi>\",\"heat \/ power rate (W; any unit you pick is converted)\"],[\"<mi>t<\\\/mi>\",\"operating time (s; any unit you pick is converted)\"],[\"<mi>C<\\\/mi>\",\"running cost (\u00a3)\"],[\"<mi>c<\\\/mi>\",\"unit energy price (tariff) (\u00a3\/J; any unit you pick is converted)\"]]},\"immersion-current\":{\"m\":[\"<math display=\\\"block\\\"><mi>I<\\\/mi><mo>=<\\\/mo><mfrac><mi>P<\\\/mi><mi>U<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>I<\\\/mi>\",\"current (A)\"],[\"<mi>P<\\\/mi>\",\"heater input (W; any unit you pick is converted)\"],[\"<mi>U<\\\/mi>\",\"supply voltage (V)\"]]},\"element-resistance\":{\"m\":[\"<math display=\\\"block\\\"><mi>R<\\\/mi><mo>=<\\\/mo><mfrac><msup><mi>U<\\\/mi><mn>2<\\\/mn><\\\/msup><mi>P<\\\/mi><\\\/mfrac><\\\/math>\"],\"w\":[[\"<mi>R<\\\/mi>\",\"element resistance (\u03a9)\"],[\"<mi>U<\\\/mi>\",\"rated supply voltage (V)\"],[\"<mi>P<\\\/mi>\",\"rated heater power (W; any unit you pick is converted)\"]]},\"convert-length\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-volume\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-pressure\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-power\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-energy\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-flow\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-temperature\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]},\"convert-mass\":{\"m\":[\"<math display=\\\"block\\\"><mtext>result<\\\/mtext><mo>=<\\\/mo><mtext>value<\\\/mtext><\\\/math>\"],\"w\":[]}};})();\n\n<\/script>\n<script>\n\/* Tradefox calculators \u2014 shared interface. Expects window.TF_CALC = {name, h1, sub, calcs, run}. *\/\n(function(){\n'use strict';\nconst D=window.TF_CALC, root=document.getElementById('tfc');\nif(!D||!root)return;\nconst esc=s=>String(s==null?'':s).replace(\/[&<>\"']\/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\nconst byId=Object.fromEntries(D.calcs.map(c=>[c.id,c]));\nconst groups=[];D.calcs.forEach(c=>{if(!groups.includes(c.group))groups.push(c.group)});\nconst LOGO='data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAAAoCAYAAAChIFWSAAAaUUlEQVR42u1dfZRcRZX\/3Vv1uns+kpmQDyQhG0MgSoCQMIkYBIaIQVARRTtKgoCEg66oq+JZ9ahMRnGVVXdX9+giCqJAgDR+ggqixlEBgUyEgAEkEAgkIV8zmcl8dL\/3qu7+0fXGN53+nmDCMXVOZTLd79Wrd+t+\/urWHeBQO9QOtUPtUPunaARAAeBDpDjUXpFNOsBr2tu1tLdrSadVR0fdzEwFv6sin+2fm2po1vX9MXZ8rFq0Q6VmAEiFa3gMWkbcM4q1\/UHvUfNf096uzxjLaFOmCGUyRecrAsLSNGPHjurmPKVLkIGlyvSFOManzuJrLOm0wpyMlPq+yNoLACilviYia621t8V4ouSa0ytMgXCNQnEwmW5UIXgHr+ZOQ1GmpGBXZPZyjBwfu++SeceETG1hyAkInvWT\/nPTv\/fYizXSmgB4RHQrEb0TwG4AH7fW3gFgOKaMTKmFIgCitf6wiBwLILDWjsXvsszsAbjLGPMrANBa\/6uIHA8gjJ5rbWneZuaYZpJt1tp7AKyrQigi7TBNKfWpEs+R\/CM4MMZcDaAnrlUKBVApdSYzn2+tDay1zMxVzV1EdjBzVxiGfyyYGzsarSCi+dbasA4LZJlZM\/N1QRCsB0B\/+8jZiQm7N70rYZECw1oBASo\/cMxWWpERRchEYp2d8ZRwnzT0TLul+6cASSFDb\/zgkilTsttPNX4wAUKW1eixovHykwOg6bl79875w9JMxpQSitVpqKUZmCcvOnXuVBn4osXw2eM5maBEfpV35azVbP8asvr9Tk7deuwND\/\/ZEbKUctEAQqXUahFJi0gOQJKIAOApANdaa68HsDcmPLZQIBiAJaIHReR17ub90f5TRD4FAER0P4BFdatYIiGiLxljPl9BKDSAkJmXicgtFcYEEb3ZGPPrEhojGuvzAL4gIvXMG0R0mzHmMgBDMXobIroHwFljMj1E7xVrbxcAG65YOPHw3oGdhyWIarVFIgBpYIevth0+a\/2R6CQLgKSjg6iz0z6\/vO0DE1X26kYyk2iEj8qMRxZiBUOS6t4bJD449baH1wrAFFs3SacVZTJmywXzLmvVwTcaWRr7\/EASTMEQ9E\/gNa7utYneFELohDTttHhp7g0Pry3zWAXAMPNVADpFJAsg5b4LnNUAgGcAdFhrbynGPHFNvMdpcFOl\/12qhQA0EQ3GmGhMY4sIE9HnmHmztfa7pUxe7PqT3PPCwveM5igiGsDJAH5dYYUHRaTcWOXmDQDvZeYma+15Ma0EAH0V5lgpdlBElIsobLNKAOoZ8sOWUCDxd5LK\/rFNWTCBemPxiKLOznD7hW0XTUkMXzuY87HHKqMgAkjZMQVMliwmeEEbtH\/P8+8\/dSG+\/6dNkaVY29bmUSYTbFk296NTU+E3BodD2SMSNCilB4R3TVq14b010iPih1MBrAQQElFKRF4C8CKABU4YQgCzANzMzB8XkbtF5HMjVruIu8ElunKLVti5TKeCCRfeq2LPpFjnWAAUXSs276d8HkCDsxBUIvgGEbW5+7yC5+mCzxdV4d9zHe8+cp2I+ADOZea0m5+qgyZUgkaFrKgA0gLScF1ABBBJ3g9ynVx3vwvytswNSQDO6Ooymy5ub\/Xs4Nf8rBVjtVEEJRAtzmaPGiMaU8BEVilh1ZcL\/WatDmsw\/V8hQLAhTdLRrhd0dwd\/evsp45rYXzmc80MD6xNI5ay147U6YvOFC64AgE0Xz0hJRwevTqeVlEacIle0kZmvl7wbRwB+LiIni8hCInoPgHsBKBGBW5M2Zj4qtsb7aKWGOhCVYtcmnHZM7CckKGIeEZHpAOYCeLCIlYj8wfFEdJzTzlwCRIj+P9e993CJOKIc+MA1ggEXAVhdQfiqpUl0jVduskxAk2Yl4Biryz4mwwqUUgwbhC1YCdgN+UB3i+xd3JxUkwezgSGCIskPOk6xAhjkxiMhGBYwLIwlDIVh\/hsib8gPxAOfs\/HCRVPo5swOANh22Wkzk9m9\/5cU2yqkaHxK6WxgkDWhCUyAiWy\/uuWCuRun\/WD9PWvaf6+XdnWFFehrlFJfATBb8gv\/pLPIAKCttasBrNZan2yM+SKANwLwjTFfiivSQoH4G4CJzqyoAiZrAXBk3PoSkRGRpx1TUoHL5BHR1hJ+dzTGLgDPRsxesKYGwKsBTIldH10zoRxhtNazRWRygacgLnieGLtWAEz1PO+1QRD8pYxAFGu+80WlyLt5AI6Jx2giwgBmxtydUjTZ7WjCFeZi3TU7iw0kABQIPuAHofcHy9awZQKJSBQkutFJIFYgDYASlXghTreENbM9bYWE8mqXgBAU9oben1hJVgQc6QUKiIwn0KJelYSc4MOCALIigKLmXMKbJpe39W4fCr8wPtd3BVMwjimJPmvu6w\/0vQlLl7R69Oo9QWCSkIZWLb98\/sL575hxc9eda9rb9eLiQqEAWK316621H4nx4mxmvpuZrwrD8KERxgzDB5VS14nIEhH5LoC\/xhWrjksHgBUAqICJtQtI0kS0OrYQBKBHRBa5+GCfBXSSWiwANkSkiehOY8ylZRZ9PjM\/6Hx9KcSYS2lya+189w5RvEJEtFUpda4xpktExsX2B7QxZgGAv1QJ69o8mEIvWmvnOdrE56QAiFLqGyJyhYs9uECrF40JHE3uMsZcUnUgYQwkz6ejaEIC0UooEPQeturRs+KoUcX2QwLa2wnoQoPkkhBFBAMBwnFa656Qbpi0av0HSt2+evVqteSnHRsamWYPh2IFoAQzZVOpvb19vecc3iyf7uvP+Y2ekgHRv1xz3ufPW7p0qXlmxRuvRbjrzvEJs3CPHwaNYD2Jh2\/buuyk06eu6uqOgvASyiQUkSDamXYx55tFZAkz3wlgted5D+RyuaSIfJ2ItllrP1PIt7rE4Pv45MWY0DGdFFxXdbDptCZFaE4Rn\/BFhxSMqwXDJ6LXxYQ68tk3BUHwF2beRERzJXYBES0C8N06gmUbU8ij+FREnqgVlapAk3IbfyWQHoAsaNfyk8dNPBoD2ADCnMp0jMOjVshCHGglADEBgucF4KfPPto75uSNwaibN4Bo6VLTs+zYHZp4NsgIIGQFSEKahzh1H4ayGyc0JI7e6\/NQL0380NKlS82mi2ekZl7\/u+3dyxanj1EvrWv2EodlA99PUbKxWdmfPrf8tNfRLZltBfBtZIETIvK1KNaM0TNSiOeJyHm+7w8wswUw3hhzllPko9xuXYW\/zGUCWBQEf1LtYrkJxxmqlOtBNSIvsNbOL9zIE5H1zvr9xcUNNqa5F8TctFoEotS7UxRHjWF3W8aykScAWACCkpf8BjupE7aYJakq\/Ck0LqQ8AqwMTzPUudEWPJcEoF5hLbHXsCCwL6kjb3p497pL3vqWhN5yzW7fXjfrpt9sXp1Oq5k\/yGQlnVa0KvP84xe8\/pyj1NBdTdpO7guM35Lyj2wxu+9Yne5YDHSGHQB3\/l3RhUT0PRFpL4JgKqf4Ik+lmYggIitdgL2P0qnGQlRamPj3UiOGnq2gRaXGHUoBMIWIZrtxKfastZJ3nx8QkYtHPIu8Vj4mlUpNz2azm2vcDS\/17mNi5v22u0z5QHfn5P07rq28ENJDzn0ggQiDYZCkPUYAoht\/8TSA8yMBitwgymSMpNOKbs089MyyE86czN4vWhN2+uCwn21tTJ1ymvrZDdSJCyWdVndlMl43EDDzlQAuca6pLrY+RBQCeALAC0R0vzHmy1G8WS9K8vIsWJ5rK0GLNaFdSqk5zsWK1k0TkVhrH3HfPzwSc\/7dqqSCIJi3P9NZyu1k15B+UKmXT1ATAdkxvg8J1SXaNn47QYnF+GAYBMh3LocnaSjpAO8T+2QyZk17u5616rHHHrWHnzFok0+OS+lU37CffZUOl\/csn\/dflMmYRwhBo1JvAfC1AhBo1F4TETER\/cxaO89ae24Yhl+OzVAOKoGIadKwwE2IJjtUa76QiLTF\/Ptop3g7gKcBIAiCJwFsjVkUcQz8+oMkv6sUTYp1lIPwxP07Z+fOUTk6NUnXfnolEQc\/AJjQC0sZmFL5TYu7usI17e36tFW\/fXZjouHMAZNY3+JRqi8bZCckwo8PX7xopREcGxLfmt9jl2J7MiEReUqpXzQ0NHwoFpfpWvcQioPeSu1XEhERlFIJAM0AWp1Wj3orgGal1ClE1Fil+yFu3IWx1JMoftgAYMARYwjA+sINXCI6uYxH8A9xf4gILgesGE0K+\/hSqBUVLPEzR77ZCAiU339DqV5RLOqUmnpuW9zVFUo6rdpuuH\/rDjQt6UfysXEepXqG\/TBFAx3\/e\/KMh\/wQ4xkKkFF8LC59Q3ued\/OMGTPeNTAwsCu2HVAWqNC1hKt1RGQln+u0+HIiOrcEzUREJjvURQo0OpVKZRCRuUUC6nXx3CQi+jOAc5zLFjHVCY7J+mvcj9hfLaLJO4locQU+sg5aTAP44xkuuBwl4gQKLcAID3vN9nse2L3sWCOgfdLUJA\/R2kYN7pXUU1NvWncBQdD9mgFClwsCCrVofU4UPKbaYswoprg5s6P70lPOPjo3cH9zYnhGTzZrPnxcS7MvIlc+9AIpNaLGRISFFZTW+ppcLvfpjRs31pQlrYEDGkM0AmisgOQU22EeLIGETQcwKxZQR9q\/Ow4RuyTGOEokACYDOA7AA6UCrn8QTVIAXlXl5akKjgoYpJvYnjiizGRf7W0AJJjAQdBQ+YRB\/S2ox7q4mKLthq6tcsWZZ\/X37+5uUNnG3QPD9uPHt\/CgCXBV93Z4SiQUkFZMiWTik4ODg1+P7THYsaRdHAh\/uRo\/2Thm3g7gkYK0XXJu3QkuXcTEYDertV4fH8MY86gTKo4f4GHmhQdBHFENTUzJhaZ94a7BUOxAKGYwEDtkxMT7YP5nGARiBTRY1uc5QFRZ3NUFRQB967cLzv\/Nc8kcayS15t7BIXz2xCn4xPFTJTBCjToRjGtqWeGEQdWD9h0MZ01NrKNErBdldjKAzyCfy84Fu9ew1rYVgT23+L6\/KTYOAdguIk\/F4wMHvy46SA7ymCq7VErBBhhEEqVdSDFcmAFhQnk46cBRJL\/XoPQbElr98Lfb9ugVf9hJ5Cl4itA3nJVrFrTi6vnTs4M+zu7t33VDW37\/ytQzaz4ITpLFMz1L6SBFRLsAfNha+\/0iLk2EKC0oYuCfAJCNjR9t9q0ryAkCEZ3krjMH0EpQiczaeE\/EfpYMYVkIChZNHqlmj1Szx66TGud6s0eqwSNPeVBCNO7lem0B4AV1nZA0AKaLSCY0UAlm+fHz2+myP24H65T1hOxgNiufnd+ihy+Z8xYRobXp\/CZkXYHcAVp067T9gwBuimn7TwGYFu1PuJYTkQ9aa38FYHuRAClynZIuMB75zKE294VhKDF0wXcW4TdEdFkBFx2VSCRm+r7\/9AEQCOsw84dE5AdR0lqxk3huj4NF5HEAOAOwXUUCCKWYhkX2+CFfwiTDsEzg4lqzyQCGEnsBCwHQ9lSzHGArEdE\/ycw\/stYeQYAJwSqpGLc9u9O2eszfesMk9A0Z2zMUqsMa5MqdF8ybQLdihaTTSjIZWysOdMAEwqFHj4rIt2IL3gjgmijpzuWiJKy1fU4YEhFDFwn3ZiGfjTsqhdpau5yI3lQkLBxXQAMDQIdheBLyexZ8IGgiIo+JyLdr2exbCUhnEa5lEqiQchNuf\/JnB8Nx7qAeV4noBgALAYQC0iwWgVCY0Epf+7fdd31qwdSeV6f4ot5cLuzLikxqxKU7lx8vdEvmMklDSZVFDuoQiP3vRYhIMnZYJ7DW3sjMn0E+1Tzy7YmIvigid5agaXQ++UQi4lhCV4RSzXa92n2MRQBuP4B8k4y5RmEtFTfG53NR\/h5YCyAs9Ez6pJajcNQAduwgTJlSkjkyAJYWZJPasmlsL9tuRHR097MAlrksVg8QsYAlhlasV19+Yu7Co1c9Gmxbfvz0ycnE4r6sCfqG\/XBSMrnipWXzhmjVIx+V9nYtXV2mWqHQOPAoU3zRd7hz0FfEjlVaIjqOmd9kjLm71NFREVlYkH2Lclv0RVJDorymhYWxxQGkSVjLjf0Amop8PoxmQ5mMqSe57wAQICoS8G5r7dUxPhAAwsxKa\/3N4Wz2Y98B4QiynJ3c+O7+HXvXNDeYuf1ZDvuzQXh4yn5k27ITe2lVV8fatjYP3d3BKwVlijMuORcqnptiHaNeWSE9va2IKjIFKdqF6SFhEVocD2BSQYbvK6JcTz\/GQ4hjkyUQJL\/DgjFU\/pFa0\/vqdpqiDcZ5InJjLHVfnEvNSqnP5nK5f8sfeAVWdnTgX\/77zz1bYM7uN\/rJFo90CMJANginJOxVW5a3fWRBd3ewtq3N268CYV7+mCpiwCeI6G73\/xErISJv9DxvfsGZ5PiR0TlF3klVgdjsc\/xUKXVClfRRRToDUByvo1O7b8E1dCrlmgiAkAkbMNZSWE7IKJ8wyGJJOsAYGCARjDqXjQ7kv2OMpI1byh\/MgFcVojRZKfUTImqKZ7IrpYSZP+D7\/n\/E1l+os9NKOq3m3PLktmdlwpv3Gr2p1RMdCmPYD81EPfzNze+bs2xBd3ew9vLKQqFxEBb0IqL\/AfA2F3hHwqLDMPwYgIuLHBl9jbV2UkGKBwG4B8CWMvusGkAa+TPV8ZSI1wFYU0X6RLbUmQwAOZd7jzoqltgi4EHNDjrBgiSByZgytgSrOOkIgHAun5jXbYucUhcA2HXBSL4rlAhIGAE1VMruVcycEZFXu1gQ7rO9zPx+3\/d\/FIPFZZ8Uj5symx97z+Il03jbveOTMnOPjyAVGJqo6IdPXrSg97XXrf2VtLdrKnM++2ATCAOAjDFriGgdgPmxQx9CRGkRuQrA5rh2jB0Iih8ZDa21lyKf2VpuvY9BvvJGHDWouEFHRA1KqUVF\/HwCoIwx76jRCkfKYKIrFufFi7qVAEDJ0WIgCqo5Vh5GQFDWjMljspz3usS9dWgNQqIzd7\/nuFuS2oSDmqUxx3lAImlJcixZeNM98l+TMxaRnQiZ0a9S7l3SLoQf7Soppb4jIu3ubEMkIFs9z0tns9n7ywENI0Jxe+aZx9\/3hjNI9tzbkghn9+ckSIH0kTR0x9PvmbeEbu+6v8xR1INOIOJw2zeJ6EYHNUbuUwMRfVBEPhPP9CSihTFNLC6FbTPyRQV0CQsRIRkPA1hkrZUY8853aE8pVAtENM1ae38VFoBjccxwGY0evc+5RPS2AktXtF6sO4N9PhvzEwAY398PjtW6ppHcvB11L8YgTH8LQVxSoBoMgCZl3pSz9m++hUn4gjAyin5eJ2kOGzWBgnzpQAZZWKPEJFNDAJCek5Ei6\/AJAJc7RInymTjqKWY+P5vNbqgGdYtbisff94Yl02X3b8elcPRAzvqNbBqnJPhnT73v9NPppswTpYTiH5n+TbVYCWvtHSLyYoyh2G3YrUA+NTqe7jG\/oJIGkE\/xzrrfg1jq76guIvfFkgEjekz3PO+YctGjC\/TL5RvZgrKTBKC7UrGBgpN+VC7OKBTG\/vHjEfL+SdXNOHg2tE3dvs3HCNGDAyPiMaU0U5MmNGmmfKf8TxahIKpxKbBJUjYgu62VT8+n0HSOKsgQKqXOgcjXXUlPEJFm5ge11kt8399Qw\/nyEaE4\/qb7Nm80E940KLRxXJISe43ym2AmHSm9dz5x6SlTyZXXPJhRprj2Uy757nuxYDcq\/ziZmS+MMd6U2D5DnBcersBUFgA8z1vnBEbFIE9ylTgwxsB4RMBFBFrrb1e551tNgt8+cHJ\/\/sn5snruJxHXJRtL8zAtP+jPuH9PiLUtHisR8SPvyVhYMbDGwhoro7oInDCItSxBMpnkrFXfmXZd55Ck04pi9W0BzAOwCkQWgDCR53nez1taWs7KZrMvIJ7aXmPaeNuqB55\/Dskle433TEuCEv2B8VMqN+sIv+8Xmy86cRo680dY60OZjJFYSfp4r4XRC++VcoiTtfa7zDzg0jxM7LsPRQW6lFJzrLXNzu8cSdQjou4KzCcAKJfLbUK+vpKNYFoRsSJycoW52wrMGn2vmFkB+PcgCNYV7KPUOm7Fk3MkUB4JKYjySAgS1u8Wd+QFY6Bhwoo9SPS0pHRCMZFHQh4L64IefZZgIWaQ0ppbG73k9sD+bnrv1GukA4xMxhYor6MBtIqIZWbPSySuf\/vb335+T09P\/1jS8COhmP+DR5\/bnJ2wJBfSC80eJfqzGGxJyTxt5GoCLNrbVb0WIird6EXwooPGqEqwIhW7P+HydpIVinBtBXBbvJSmQ56OdVYCInJ6LCEuKiFpjTGPVyEQypWMeSR2b8L9\/4xI6Jg54YQyUS0c6t6PADwlIhdba79aZIGTtY4b615szgCA5sSQhMDgMGjIJwwMixoKwAM76zVznbDSAZ51\/Z\/Wv+i1ntpv+ccAdmZBQ1HPxXr0+zBoKAQPEIfP9QT6y0\/wxLfS3Xfn0AmJQVbGzf8OEblSsSKt9Zey2exlmbzQjPlPH0RnKeZl\/rjpaTSfHRi9s7WZm\/b6qtdQw7UCEM7osrX69SPVLJRSc40xIxtWWms\/DMMHKpg0AiCe582z1k4yxlgXj7AxZiuADSWC3mhuE5VS8xyTx92n7QAeB3CsUmqamxcAkNZ62M1Lqnm3ZDI5M5fLzSo4XxEgf1goSKVSM4IgOCb+7tXEXMzcEwTBX124yQXjC4ATlFKHlxq3QtwmjoaPRtX7Ojo6+B2b7jmiKTFI4rNkTZI8TDDH3nzPS0RjKGkTq4X0+IrXH5Y0YdNQwNJQ+jgRDvNZ9s5M7p7Z2ZUdqa5RZj0aGxtPGhoaWrf\/jiPF5u+g1s3LTjt9UnLok88JVs65sXtdrJzNoXYAkDO80v\/UldTx560knVZVpGLzy50RUDj3Uu9SywRKlYUxNWx5Uom4op7nSkFZzXrnhSrGoDoBiEoVMng\/MIEdXa0OtHLl38dcuRIyFutQ5IVoZUd1c1452kU64H8dSjrAUfXCKv8016F2qP1zt\/8H3pWYzFCjWXUAAAAASUVORK5CYII=';\nconst MX=window.TF_MATH||{};\nfunction cardMath(c){const m=MX[c.id];return m&&m.m&&m.m.length?`<span class=\"f tfc-cm\" role=\"math\" aria-label=\"${esc(c.formula)}\">${m.m[0]}<\/span>`:`<span class=\"f\">${esc(c.formula)}<\/span>`}\nfunction mathHTML(c){const m=MX[c.id];if(!m||!m.m||!m.m.length)return `<div class=\"tfc-formula\">${esc(c.formula)}<\/div>`;\n const w=(m.w||[]).length?`<dl class=\"tfc-where\"><dt class=\"tfc-where-h\">where<\/dt>${m.w.map(x=>`<div><dt><math>${x[0].startsWith('<')?x[0]:`<mi>${esc(x[0])}<\/mi>`}<\/math><\/dt><dd>${esc(x[1])}<\/dd><\/div>`).join('')}<\/dl>`:'';\n return `<div class=\"tfc-math\" role=\"math\" aria-label=\"${esc(c.formula)}\">${m.m.join('')}${w}<\/div>`}\nlet filterGroup='All', query='';\nconst TRADES=[['Electrical','https:\/\/tradefoxapp.com\/calculators\/electrical\/'],['Gas and plumbing','https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/'],['Bricklaying','https:\/\/tradefoxapp.com\/calculators\/bricklaying\/'],['Carpentry','https:\/\/tradefoxapp.com\/calculators\/carpentry\/']];\nfunction localNav(){\n const others=TRADES.filter(t=>t[0].toLowerCase()!==D.name.toLowerCase());\n return `<nav class=\"tfc-local\" aria-label=\"Calculators\"><div class=\"tfc-wrap tfc-local-in\"><a class=\"tfc-local-title\" href=\"#\/\">${esc(D.name)} calculators<\/a><div class=\"tfc-local-links\"><a href=\"https:\/\/tradefoxapp.com\/calculators\/\">All trades<\/a>${others.map(t=>`<a href=\"${t[1]}\">${esc(t[0])}<\/a>`).join('')}<\/div><\/div><\/nav>`;\n}\n\nfunction fmt(v){\n if(!Number.isFinite(v))return '\u2014';\n if(v===0)return '0';\n const a=Math.abs(v);\n if(a>=1e9||a<1e-4){const [m,e]=v.toExponential(4).split('e');return Number(m)+' \u00d7 10'+String(Number(e)).replace(\/-\/,'\u207b').replace(\/\\d\/g,d=>'\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079'[d]);}\n return Number(v.toPrecision(6)).toLocaleString('en-GB',{maximumFractionDigits:6});\n}\nfunction title(t){try{document.title=t}catch(e){}}\n\nfunction listView(){\n const q=query.trim().toLowerCase();\n const hits=D.calcs.filter(c=>(filterGroup==='All'||c.group===filterGroup)&&(!q||(c.title+' '+c.group+' '+c.formula+' '+(c.intro||[]).join(' ')).toLowerCase().includes(q)));\n const sections=groups.map(g=>{const cs=hits.filter(c=>c.group===g);if(!cs.length)return '';return `<section class=\"tfc-group\"><h2 class=\"tfc-h2\">${esc(g)}<\/h2><div class=\"tfc-grid\">${cs.map(c=>`<a class=\"tfc-card\" href=\"#\/${encodeURIComponent(c.id)}\"><span class=\"k\">${esc(c.group)}<\/span><span class=\"t\">${esc(c.title)}<\/span>${cardMath(c)}<\/a>`).join('')}<\/div><\/section>`}).join('');\n return sections||`<p class=\"tfc-empty\">No calculators match \u201c${esc(query)}\u201d. Try a different word.<\/p>`;\n}\nfunction fitCards(){root.querySelectorAll('.tfc-cm').forEach(el=>{const m=el.querySelector('math');if(!m)return;m.style.fontSize='';const w=el.clientWidth,sw=m.getBoundingClientRect().width;if(w&&sw>w)m.style.fontSize=Math.max(11,Math.floor(17*w\/sw*0.97))+'px'})}\nwindow.addEventListener('resize',()=>fitCards());\nfunction renderList(){\n title(D.h1+' | Tradefox');\n root.innerHTML=localNav()+`<div class=\"tfc-wrap\"><a class=\"tfc-brand\" href=\"https:\/\/tradefoxapp.com\/\" aria-label=\"Tradefox home\"><img decoding=\"async\" src=\"${LOGO}\" alt=\"Tradefox\" width=\"98\" height=\"20\"><\/a>\n <header class=\"tfc-hero\"><h1 class=\"tfc-h1\">${esc(D.h1)}<span>${esc(D.sub)}<\/span><\/h1>\n <div class=\"tfc-search\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M20 20l-3.5-3.5\"\/><\/svg>\n <input type=\"search\" id=\"tfc-q\" placeholder=\"Search ${D.calcs.length} ${esc(D.name.toLowerCase())} calculators\" aria-label=\"Search calculators\" value=\"${esc(query)}\"><\/div>\n <div class=\"tfc-chips\" role=\"toolbar\" aria-label=\"Filter by topic\">${['All',...groups].map(g=>`<button type=\"button\" class=\"tfc-chip\" data-g=\"${esc(g)}\" aria-pressed=\"${g===filterGroup}\">${esc(g)}<\/button>`).join('')}<\/div><\/header><\/div>\n <div class=\"tfc-band\"><div class=\"tfc-wrap\" id=\"tfc-list\">${listView()}<\/div><\/div>`;\n const input=root.querySelector('#tfc-q');\n input.addEventListener('input',()=>{query=input.value;(root.querySelector('#tfc-list').innerHTML=listView(),fitCards())});\n root.querySelectorAll('.tfc-chip').forEach(b=>b.addEventListener('click',()=>{filterGroup=b.dataset.g;root.querySelectorAll('.tfc-chip').forEach(x=>x.setAttribute('aria-pressed',String(x===b)));(root.querySelector('#tfc-list').innerHTML=listView(),fitCards())}));\n fitCards();\n}\n\nfunction fieldHTML(f){\n const id='tfc-f-'+f.key, unit=f.units&&f.units.length>1\n  ?`<select id=\"${id}-u\" aria-label=\"${esc(f.label)} unit\">${f.units.map(u=>`<option${u===f.unit?' selected':''}>${esc(u)}<\/option>`).join('')}<\/select>`\n  :(f.unit?`<span class=\"tfc-unit\">${esc(f.unit)}<\/span>`:'');\n return `<div class=\"tfc-field\"><label for=\"${id}\">${esc(f.label)}<\/label><div class=\"tfc-row\"><input id=\"${id}\" inputmode=\"decimal\" autocomplete=\"off\" placeholder=\"e.g. ${esc(f.example)}\">${unit}<\/div><\/div>`;\n}\nfunction renderDetail(c){\n title(c.title+' calculator | Tradefox');\n const info=[];\n if(c.notes)info.push(`<section><h3>Good to know<\/h3><p>${esc(c.notes)}<\/p><\/section>`);\n if(c.mistake)info.push(`<section><h3>Common mistake<\/h3><p>${esc(c.mistake)}<\/p><\/section>`);\n if(c.limits)info.push(`<section><h3>Limits<\/h3><p>${esc(c.limits)}<\/p><\/section>`);\n if(c.sources&&c.sources.length)info.push(`<section><h3>Sources<\/h3><ul>${c.sources.map(s=>s.url?`<li><a href=\"${esc(s.url)}\" target=\"_blank\" rel=\"noopener\">${esc(s.title)}<\/a><\/li>`:`<li>${esc(s.title)}<\/li>`).join('')}<\/ul><\/section>`);\n const ix=D.calcs.indexOf(c),prev=D.calcs[ix-1],next=D.calcs[ix+1];\n root.innerHTML=localNav()+`<div class=\"tfc-wrap tfc-detail\"><a class=\"tfc-back\" href=\"#\/\">\u2039 All ${esc(D.name.toLowerCase())} calculators<\/a>\n <div style=\"margin-top:22px\"><p class=\"tfc-eyebrow\">${esc(c.group)}<\/p><h1 class=\"tfc-title\">${esc(c.title)}<\/h1>${mathHTML(c)}\n ${(c.intro||[]).length?`<div class=\"tfc-intro\">${c.intro.map(p=>`<p>${esc(p)}<\/p>`).join('')}<\/div>`:''}<\/div>\n <div class=\"tfc-layout\"><form class=\"tfc-panel\" id=\"tfc-form\" novalidate>${c.fields.map(fieldHTML).join('')}\n  <div class=\"tfc-actions\"><button class=\"tfc-btn\" type=\"submit\">Calculate<\/button><button class=\"tfc-link\" type=\"button\" id=\"tfc-ex\">Use example values<\/button><button class=\"tfc-link\" type=\"button\" id=\"tfc-clear\">Clear<\/button><\/div>\n  <p class=\"tfc-error\" id=\"tfc-err\" role=\"alert\"><\/p><\/form>\n  <div class=\"tfc-results\" id=\"tfc-res\" aria-live=\"polite\"><p class=\"tfc-wait\">Enter your values to see the result.<\/p><\/div><\/div>\n ${info.length?`<div class=\"tfc-info\">${info.join('')}<\/div>`:''}\n <nav class=\"tfc-pager\" aria-label=\"More calculators\">${prev?`<a class=\"tfc-prev\" href=\"#\/${encodeURIComponent(prev.id)}\"><span>Previous<\/span>\u2039 ${esc(prev.title)}<\/a>`:'<span><\/span>'}<a class=\"tfc-all\" href=\"#\/\">All ${esc(D.name.toLowerCase())} calculators<\/a>${next?`<a class=\"tfc-next\" href=\"#\/${encodeURIComponent(next.id)}\"><span>Next<\/span>${esc(next.title)} \u203a<\/a>`:'<span><\/span>'}<\/nav>\n <p class=\"tfc-foot\">${esc(D.disclaimer||'Results are arithmetic from the formula shown. They do not replace manufacturer instructions, regulations, design calculations or inspection and testing by a competent person.')}<\/p><\/div>`;\n const form=root.querySelector('#tfc-form'), err=root.querySelector('#tfc-err'), res=root.querySelector('#tfc-res');\n let example=false, touched=false;\n function read(strict){\n  const vals={};\n  for(const f of c.fields){\n   const el=root.querySelector('#tfc-f-'+f.key), u=root.querySelector('#tfc-f-'+f.key+'-u');\n   const raw=el.value.trim().replace(\/,\/g,'');\n   el.removeAttribute('aria-invalid');\n   if(raw===''){if(strict){el.setAttribute('aria-invalid','true');throw Error('Enter a value for '+f.label.toLowerCase()+'.')}return null}\n   if(!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(raw)){el.setAttribute('aria-invalid','true');throw Error(f.label+': enter a number, using a decimal point.')}\n   vals[f.key]={value:Number(raw),unit:u?u.value:f.unit};\n  }\n  return vals;\n }\n function show(strict){\n  err.textContent='';\n  let vals;\n  try{vals=read(strict)}catch(e){if(strict||touched)err.textContent=e.message;return}\n  if(!vals){res.innerHTML='<p class=\"tfc-wait\">Enter your values to see the result.<\/p>';return}\n  try{\n   const r=D.run(c,vals);\n   res.innerHTML=(example?'<span class=\"tfc-tag\">Example values<\/span>':'')+r.outputs.map(o=>`<div class=\"tfc-out\"><p class=\"lbl\">${esc(o.label)}<\/p><div class=\"tfc-num\">${esc(fmt(o.value))}${o.unit?`<small>${esc(o.unit)}<\/small>`:''}<\/div>${o.pct?`<span class=\"tfc-pct\">${esc(fmt(o.value*100))}%<\/span>`:''}<\/div>`).join('')\n    +(r.notice?`<p class=\"tfc-notice\">${esc(r.notice)}<\/p>`:'')\n    +(r.working?`<details class=\"tfc-work\"><summary>Show the working<\/summary><pre>${esc(r.working)}<\/pre><\/details>`:'');\n  }catch(e){err.textContent=e.message;res.innerHTML='<p class=\"tfc-wait\">Check the values above.<\/p>'}\n }\n form.addEventListener('submit',e=>{e.preventDefault();touched=true;show(true)});\n form.addEventListener('input',()=>{example=false;show(false)});\n form.addEventListener('change',()=>show(false));\n root.querySelector('#tfc-ex').addEventListener('click',()=>{c.fields.forEach(f=>{root.querySelector('#tfc-f-'+f.key).value=f.example;const u=root.querySelector('#tfc-f-'+f.key+'-u');if(u)u.value=f.unit});example=true;show(true)});\n root.querySelector('#tfc-clear').addEventListener('click',()=>{form.reset();example=false;touched=false;err.textContent='';show(false)});\n}\nfunction route(){\n const id=decodeURIComponent((location.hash.match(\/^#\\\/(.+)$\/)||[])[1]||'');\n if(id&&byId[id]){renderDetail(byId[id]);root.scrollIntoView({block:'start'})}else renderList();\n}\nwindow.addEventListener('hashchange',route);route();\n})();\n\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":27953,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"class_list":["post-27955","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gas and plumbing calculators - Tradefox | Construction Training Online<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tradefoxapp.com\/fr\/calculators\/gas-plumbing\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gas and plumbing calculators - Tradefox | Construction Training Online\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tradefoxapp.com\/fr\/calculators\/gas-plumbing\/\" \/>\n<meta property=\"og:site_name\" content=\"Tradefox | Construction Training Online\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61561067514381\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-09T15:56:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@Tradefox_app\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/gas-plumbing\\\/\",\"url\":\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/gas-plumbing\\\/\",\"name\":\"Gas and plumbing calculators - Tradefox | Construction Training Online\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#website\"},\"datePublished\":\"2026-11-09T15:08:45+00:00\",\"dateModified\":\"2026-11-09T15:56:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/gas-plumbing\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/gas-plumbing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/gas-plumbing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/tradefoxapp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculators\",\"item\":\"https:\\\/\\\/tradefoxapp.com\\\/calculators\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gas and plumbing calculators\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#website\",\"url\":\"https:\\\/\\\/tradefoxapp.com\\\/\",\"name\":\"Tradefox | Construction Training Online\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tradefoxapp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#organization\",\"name\":\"Tradefox | Construction Training Online\",\"url\":\"https:\\\/\\\/tradefoxapp.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/tradefoxapp.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/logo-transperent.png\",\"contentUrl\":\"https:\\\/\\\/tradefoxapp.com\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/logo-transperent.png\",\"width\":1024,\"height\":208,\"caption\":\"Tradefox | Construction Training Online\"},\"image\":{\"@id\":\"https:\\\/\\\/tradefoxapp.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61561067514381\",\"https:\\\/\\\/x.com\\\/Tradefox_app\",\"https:\\\/\\\/www.instagram.com\\\/tradefoxapp\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/tradefox-ltd\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gas and plumbing calculators - Tradefox | Construction Training Online","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tradefoxapp.com\/fr\/calculators\/gas-plumbing\/","og_locale":"fr_FR","og_type":"article","og_title":"Gas and plumbing calculators - Tradefox | Construction Training Online","og_url":"https:\/\/tradefoxapp.com\/fr\/calculators\/gas-plumbing\/","og_site_name":"Tradefox | Construction Training Online","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61561067514381","article_modified_time":"2026-11-09T15:56:39+00:00","twitter_card":"summary_large_image","twitter_site":"@Tradefox_app","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/","url":"https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/","name":"Gas and plumbing calculators - Tradefox | Construction Training Online","isPartOf":{"@id":"https:\/\/tradefoxapp.com\/#website"},"datePublished":"2026-11-09T15:08:45+00:00","dateModified":"2026-11-09T15:56:39+00:00","breadcrumb":{"@id":"https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/tradefoxapp.com\/calculators\/gas-plumbing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/tradefoxapp.com\/"},{"@type":"ListItem","position":2,"name":"Calculators","item":"https:\/\/tradefoxapp.com\/calculators\/"},{"@type":"ListItem","position":3,"name":"Gas and plumbing calculators"}]},{"@type":"WebSite","@id":"https:\/\/tradefoxapp.com\/#website","url":"https:\/\/tradefoxapp.com\/","name":"Tradefox | Formation en construction en ligne","description":"","publisher":{"@id":"https:\/\/tradefoxapp.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tradefoxapp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/tradefoxapp.com\/#organization","name":"Tradefox | Formation en construction en ligne","url":"https:\/\/tradefoxapp.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/tradefoxapp.com\/#\/schema\/logo\/image\/","url":"https:\/\/tradefoxapp.com\/wp-content\/uploads\/2026\/03\/logo-transperent.png","contentUrl":"https:\/\/tradefoxapp.com\/wp-content\/uploads\/2026\/03\/logo-transperent.png","width":1024,"height":208,"caption":"Tradefox | Construction Training Online"},"image":{"@id":"https:\/\/tradefoxapp.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61561067514381","https:\/\/x.com\/Tradefox_app","https:\/\/www.instagram.com\/tradefoxapp\/","https:\/\/www.linkedin.com\/company\/tradefox-ltd\/"]}]}},"_links":{"self":[{"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/pages\/27955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/comments?post=27955"}],"version-history":[{"count":4,"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/pages\/27955\/revisions"}],"predecessor-version":[{"id":27972,"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/pages\/27955\/revisions\/27972"}],"up":[{"embeddable":true,"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/pages\/27953"}],"wp:attachment":[{"href":"https:\/\/tradefoxapp.com\/fr\/wp-json\/wp\/v2\/media?parent=27955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}