(function(){ function init(){ var CATS = { 'pressure': { units:{ 'psig':{f:6894.76,name:'psig (gauge)',use:'EPC, USA'}, 'psia':{f:6894.76,name:'psia (abs)',use:'PSV sizing, API 520'}, 'bar':{f:100000,name:'bar (gauge)',use:'Europe, India'}, 'bara':{f:100000,name:'bara (abs)',use:'Process simulation'}, 'kPa':{f:1000,name:'kPa (gauge)',use:'SI / ISO'}, 'kPaa':{f:1000,name:'kPa-a (abs)',use:'Compressor specs'}, 'MPa':{f:1000000,name:'MPa (gauge)',use:'High-pressure ASME VIII'}, 'kgcm2':{f:98066.5,name:'kg/cm² (g)',use:'India, legacy'}, 'atm':{f:101325,name:'atm (abs)',use:'Vapor pressure, lab'}, 'mmHg':{f:133.322,name:'mmHg / Torr',use:'Vacuum service'}, 'inH2O':{f:248.84,name:'inH₂O',use:'Flare / vent draft'}, 'mmH2O':{f:9.80665,name:'mmH₂O',use:'Tank gauging'}, 'inHg':{f:3386.39,name:'inHg',use:'US vacuum'} }, defaults:['psig','bar'], chips:[['psig','bar','1000'],['bar','kPa','100'],['psia','bara','100'],['psig','kgcm2','1000'],['MPa','psig','7'],['mmHg','kPa','760']] }, 'flow-gas':{ units:{ 'MMSCFD':{f:1177.17,name:'MMSCFD',use:'Wellhead, US/EPC'}, 'MMSCFh':{f:28252.13,name:'MMSCFH',use:'Hourly metering'}, 'MSCFD':{f:1.17717,name:'MSCFD',use:'Small wells'}, 'SCFM':{f:1.6975,name:'SCFM',use:'Compressed air'}, 'Nm3h':{f:1,name:'Nm³/h',use:'European EPC, ISO'}, 'Nm3d':{f:0.04167,name:'Nm³/d',use:'Pipeline contracts'}, 'Sm3h':{f:1.0549,name:'Sm³/h (15°C)',use:'ISO 13443 standard'}, 'Sm3d':{f:0.04395,name:'Sm³/d',use:'Daily gas accounting'}, 'kgh':{f:1.36,name:'kg/h (CH₄)',use:'Mass flow approx'}, 'kgs':{f:4896,name:'kg/s (CH₄)',use:'Process simulation'}, 'MMscm':{f:42141,name:'MMscm/d',use:'LNG, large pipelines'} }, defaults:['MMSCFD','Nm3h'], chips:[['MMSCFD','Nm3h','50'],['MMSCFD','Sm3d','100'],['SCFM','Nm3h','500'],['MSCFD','Nm3d','1000'],['Nm3h','MMSCFD','60000']] }, 'flow-liquid':{ units:{ 'bpd':{f:0.006624,name:'BPD',use:'Crude oil production'}, 'bph':{f:0.158987,name:'BPH',use:'Tankage transfer'}, 'm3h':{f:1,name:'m³/h',use:'Europe, India EPC'}, 'm3d':{f:0.04167,name:'m³/d',use:'Production accounting'}, 'm3s':{f:3600,name:'m³/s',use:'Fire water'}, 'lph':{f:0.001,name:'L/h',use:'Chemical injection'}, 'lpm':{f:0.06,name:'L/min',use:'Pump curves'}, 'gpm':{f:0.227125,name:'GPM (US)',use:'Pump specs, USA'}, 'gpmUK':{f:0.272765,name:'GPM (UK)',use:'UK-spec equipment'}, 'gph':{f:0.003785,name:'GPH (US)',use:'Metering pumps'}, 'cfs':{f:101.94,name:'cfs (ft³/s)',use:'Hydraulics'} }, defaults:['bpd','m3h'], chips:[['bpd','m3h','10000'],['bpd','m3d','5000'],['gpm','m3h','100'],['m3h','bph','50']] }, 'temp':{ units:{'C':{name:'°C Celsius',use:'SI, Europe, India'},'F':{name:'°F Fahrenheit',use:'US oil & gas'},'K':{name:'K Kelvin',use:'Process simulation'},'R':{name:'°R Rankine',use:'US thermo'}}, defaults:['C','F'], chips:[['C','F','25'],['F','C','100'],['C','K','100'],['F','R','300']], special:'temp' }, 'viscosity':{ units:{ 'cP':{f:1,name:'cP (centipoise)',use:'API datasheets'}, 'mPas':{f:1,name:'mPa·s',use:'SI dynamic = cP'}, 'Pas':{f:1000,name:'Pa·s',use:'SI dynamic'}, 'P':{f:100,name:'P (poise)',use:'CGS, legacy'}, 'lbftsec':{f:1488.16,name:'lb/(ft·s)',use:'US thermal'}, 'lbfthr':{f:0.4134,name:'lb/(ft·hr)',use:'US datasheets'} }, defaults:['cP','mPas'], chips:[['cP','mPas','100'],['cP','Pas','1'],['cP','P','100']] }, 'density':{ units:{ 'kgm3':{f:1,name:'kg/m³',use:'SI density'}, 'gcm3':{f:1000,name:'g/cm³',use:'Lab samples'}, 'lbft3':{f:16.0185,name:'lb/ft³',use:'US engineering'}, 'lbgal':{f:119.826,name:'lb/US gal',use:'Drilling muds'}, 'SG':{f:1000,name:'SG (water=1)',use:'Crude oil char.'}, 'API':{f:0,name:'°API gravity',use:'Crude oil sales'} }, defaults:['SG','API'], chips:[['SG','API','0.85'],['API','SG','35'],['lbft3','kgm3','50'],['kgm3','SG','850']] }, 'power':{ units:{ 'W':{f:1,name:'W',use:'SI base'}, 'kW':{f:1000,name:'kW',use:'Pumps, compressors'}, 'MW':{f:1000000,name:'MW',use:'Power generation'}, 'hp':{f:745.7,name:'hp (mech)',use:'US pumps/motors'}, 'hpMet':{f:735.499,name:'hp (metric)',use:'European motors'}, 'BTUh':{f:0.293071,name:'BTU/h',use:'US heat duty'}, 'MMBTUh':{f:293071,name:'MMBTU/h',use:'Fired heater duty'}, 'kcalh':{f:1.16222,name:'kcal/h',use:'Legacy heat duty'}, 'MJh':{f:277.78,name:'MJ/h',use:'SI heat duty'}, 'GJd':{f:11574,name:'GJ/d',use:'LNG energy'} }, defaults:['kW','hp'], chips:[['kW','hp','100'],['MMBTUh','kW','5'],['kW','BTUh','1000'],['hp','kW','500']] }, 'length':{ units:{ 'mm':{f:0.001,name:'mm',use:'Pipe wall thickness'}, 'cm':{f:0.01,name:'cm',use:'Drawings'}, 'm':{f:1,name:'m',use:'SI base'}, 'km':{f:1000,name:'km',use:'Pipeline length'}, 'in':{f:0.0254,name:'inch',use:'Pipe NPS, USA'}, 'ft':{f:0.3048,name:'ft',use:'Vessel dimensions'}, 'mile':{f:1609.34,name:'mile',use:'US pipeline'}, 'mil':{f:0.0000254,name:'mil (0.001 in)',use:'Coating thickness'} }, defaults:['in','mm'], chips:[['in','mm','6'],['ft','m','100'],['mil','mm','30'],['mile','km','100']] }, 'gor':{ units:{ 'scfbbl':{f:0.1781,name:'SCF/bbl',use:'GOR US oil'}, 'scfstb':{f:0.1781,name:'SCF/STB',use:'Reservoir eng.'}, 'm3m3':{f:1,name:'m³/m³',use:'SI GOR'}, 'Sm3Sm3':{f:1,name:'Sm³/Sm³',use:'European reservoir'}, 'm3bbl':{f:6.2898,name:'m³/bbl',use:'Cross-unit'}, 'BscfMM':{f:178.107,name:'Bscf/MMbbl',use:'Field production'} }, defaults:['scfbbl','m3m3'], chips:[['scfbbl','m3m3','500'],['scfbbl','m3m3','1000'],['m3m3','scfbbl','100']] } }; var elFrom=document.getElementById('ucFrom'),elFromU=document.getElementById('ucFromUnit'), elTo=document.getElementById('ucTo'),elToU=document.getElementById('ucToUnit'), elSwap=document.getElementById('ucSwap'),elChips=document.getElementById('ucChips'), elForm=document.getElementById('ucFormula'), tableEl=document.getElementById('ucTable'), elTBody=tableEl?tableEl.querySelector('tbody'):null, tabs=document.querySelectorAll('.dh-uc-tab'),current='pressure'; if(!elFrom||!elFromU||!elToU){console.log('DH-UC: required elements missing');return;} function toCan(v,k,c){ if(c.special==='temp'){ if(k==='C')return v;if(k==='F')return (v-32)*5/9; if(k==='K')return v-273.15;if(k==='R')return (v-491.67)*5/9; } if(k==='API')return (141.5/(v+131.5))*1000; return v*c.units[k].f; } function fromCan(cv,k,c){ if(c.special==='temp'){ if(k==='C')return cv;if(k==='F')return cv*9/5+32; if(k==='K')return cv+273.15;if(k==='R')return (cv+273.15)*9/5; } if(k==='API')return (141.5/(cv/1000))-131.5; return cv/c.units[k].f; } function fmt(n){ if(!isFinite(n))return '—'; if(n===0)return '0'; var a=Math.abs(n); if(a>=1e6||a<0.001)return n.toExponential(4); if(a>=1000)return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g,','); if(a>=10)return n.toFixed(3); if(a>=1)return n.toFixed(4); return n.toFixed(6).replace(/0+$/,'').replace(/\.$/,''); } function build(catKey){ var c=CATS[catKey]; elFromU.innerHTML='';elToU.innerHTML=''; Object.keys(c.units).forEach(function(k){ elFromU.add(new Option(c.units[k].name,k)); elToU.add(new Option(c.units[k].name,k)); }); elFromU.value=c.defaults[0];elToU.value=c.defaults[1]; if(elChips){ elChips.innerHTML=''; (c.chips||[]).forEach(function(p){ var b=document.createElement('button'); b.className='dh-uc-chip'; var fu=c.units[p[0]],tu=c.units[p[1]]; if(!fu||!tu)return; b.textContent=p[2]+' '+fu.name.split(' ')[0]+' to '+tu.name.split(' ')[0]; b.onclick=function(){elFromU.value=p[0];elToU.value=p[1];elFrom.value=p[2];conv();}; elChips.appendChild(b); }); } } function conv(){ var c=CATS[current],v=parseFloat(elFrom.value); if(isNaN(v)){if(elTo)elTo.value='';return;} var can=toCan(v,elFromU.value,c),res=fromCan(can,elToU.value,c); if(elTo)elTo.value=fmt(res); var fu=c.units[elFromU.value],tu=c.units[elToU.value]; if(elForm){ var f='METHOD to '; if(c.special==='temp'){ f+=''+v+' '+fu.name.split(' ')[0]+' = '+fmt(res)+' '+tu.name.split(' ')[0]+''; }else if(elFromU.value==='API'||elToU.value==='API'){ f+='SG = 141.5 / (API + 131.5) - API formula ASTM D1298'; }else{ var factor=(tu.f&&fu.f)?(fu.f/tu.f):1; f+=''+v+' x '+fmt(factor)+' = '+fmt(res)+''; } f+=' Ref: NIST SP 811, API 14E'; elForm.innerHTML=f; } if(elTBody){ elTBody.innerHTML=''; Object.keys(c.units).forEach(function(k){ if(k===elFromU.value)return; var u=c.units[k],val=fromCan(can,k,c); var tr=document.createElement('tr'); tr.innerHTML='