1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[18495],{18495:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var s=a(95155),r=a(12115),o=a(33789),n=a(97003),l=a(33534),i=a(16110),h=a(69869),d=a(49480),c=a(12513),m=a(27784);let u=[{liftF:5,wattsPerGalLow:1.5,wattsPerGalHigh:2},{liftF:10,wattsPerGalLow:2.5,wattsPerGalHigh:3},{liftF:15,wattsPerGalLow:4,wattsPerGalHigh:5},{liftF:20,wattsPerGalLow:6,wattsPerGalHigh:8}],p=(.6+.7)/2,g=[25,50,75,100,150,200,250,300],w=["tropical","coldwater","marine","unanswered"],f={tropical:{label:"Tropical freshwater",lowF:75,highF:80,idealF:78,published:"The source gives 75 to 80 degrees Fahrenheit, or 24 to 27 Celsius, for tropical freshwater, and names 78 as the ideal target."},coldwater:{label:"Coldwater, goldfish or axolotls",lowF:60,highF:72,idealF:null,published:"The source gives 60 to 72 degrees Fahrenheit, or 15.5 to 22 Celsius, for coldwater tanks, and states that tropical temperatures actively shorten a coldwater fish lifespan. It names no single ideal, so none is shown."},marine:{label:"Marine or reef",lowF:76,highF:78,idealF:null,published:"The source gives 76 to 78 degrees Fahrenheit, or 24.4 to 25.6 Celsius, for marine and reef setups, and adds that stability matters more than the exact figure, with a change above 1 degree Celsius in a day enough to stress coral. It names no single ideal, so none is shown."}};function b(e){return w.includes(e)?e:"unanswered"}let x=["covered","open","unanswered"];function v(e){return x.includes(e)?e:"unanswered"}function k(e,t,a){return e*t*(5*a/9)}function j(e){for(let t of g)if(t>=e)return t;return null}let N={problem:null,wattsPerGalLow:0,wattsPerGalHigh:0,betweenRowsF:[],interpolated:!1,belowLowestRow:!1,atOpenEndedTopRow:!1},F={problem:null,watts:0,holdsDownToRoomFAtLowLoss:0,holdsDownToRoomFAtHighLoss:0,holdsTargetHere:!1,holdsTargetHereOnlyAtLowLoss:!1,stuckOnTempF:0,stuckOnAboveTargetF:0,stuckOnVerdict:"within-range"};function H(e,t){var a,s,r,o;if(!Number.isFinite(e)||e<=0)return{...F,problem:"A heater wattage has to be a number larger than zero."};if(!Number.isFinite(t.areaSqM)||t.areaSqM<=0)return{...F,watts:e,problem:"The tank area has to be larger than zero."};if(t.hLow<=0||t.hHigh<=0)return{...F,watts:e,problem:"The loss coefficients have to be larger than zero."};if(t.targetTempF<=t.roomTempF)return{...F,watts:e,problem:"The target has to be above the room temperature. A tank sitting at or above its target needs cooling rather than a heater, and no wattage answers that."};let n=(a=e,s=t.hLow,a/(s*t.areaSqM)*9/5),l=(r=e,o=t.hHigh,r/(o*t.areaSqM)*9/5),i=t.roomTempF+n,h=i-t.targetTempF,d=i>95?"lethal":h>15?"above-published-lift":i>t.range.highF?"above-range":"within-range",c=t.targetTempF-n,m=t.targetTempF-l;return{problem:null,watts:e,holdsDownToRoomFAtLowLoss:c,holdsDownToRoomFAtHighLoss:m,holdsTargetHere:t.roomTempF>=m,holdsTargetHereOnlyAtLowLoss:t.roomTempF<m&&t.roomTempF>=c,stuckOnTempF:i,stuckOnAboveTargetF:h,stuckOnVerdict:d}}let y={problem:null,recommended:!1,perHeaterTargetLowW:0,perHeaterTargetHighW:0,perHeaterPickW:null,pairTotalW:null,oneStuckOn:null,bothStuckOn:null,oneAloneHoldsTarget:!1,pairWithinCeiling:!1},T={problem:null,volumeGal:0,areaSqM:0,liftF:0,liftC:0,roomTempF:0,targetTempF:0,hLow:0,hHigh:0,tankType:"unanswered",lid:"unanswered",range:null,targetVerdict:"inside",wattsLow:0,wattsHigh:0,paddedLowW:0,paddedHighW:0,ceilingW:0,wpg:N,wpgWattsLow:0,wpgWattsHigh:0,physicsWattsPerGalLow:0,physicsWattsPerGalHigh:0,pickChartMatchW:null,pickChartMatch:null,pickHoldsWorstCaseW:null,pickHoldsWorstCase:null,twoHeaters:null};function W(e,t,a,s,r){return null!=e&&"number"==typeof e&&Number.isFinite(e)?e<t||e>a?{ok:!1,problem:r}:{ok:!0,value:e}:{ok:!1,problem:s}}let L=["It will not size a heater from gallons alone. Heat leaves through surface area rather than out of a volume, so the three dimensions are the input and the gallons are worked out from them.","It will not guess your room temperature. That number is most of the answer, and the figure that matters is the coldest the room gets at four in the morning rather than the reading now.","It will not tell you a heater is safe. It reports where the tank would settle if the thermostat welded
1shut, which is a different claim and the one the arithmetic can actually support.","It will not recommend a brand, a model or a mounting position, and nothing here knows whether a particular heater has a thermal cutout built into it.","It will not size a chiller, a fan or any cooling strategy for a tank sitting above its target.","It will not account for a light fixture warming the water from above, a pump adding its own waste heat, or a canister filter running through a cold cabinet."],C="toolbreezy:aquarium-heater-size-calculator",P=["l","w","d","r","t","k","c"],G="flex h-9 w-full rounded-md border border-input bg-background px-2 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",S=e=>""===e.trim()?null:(0,d.jO)(e),$=e=>Math.round(e).toLocaleString(void 0,{maximumFractionDigits:0}),M=e=>e.toLocaleString(void 0,{maximumFractionDigits:1,minimumFractionDigits:1}),O=e=>e.toLocaleString(void 0,{maximumFractionDigits:2}),q=["unanswered","tropical","coldwater","marine"],z={unanswered:"Pick one before anything else",tropical:"Tropical freshwater, community fish",coldwater:"Coldwater, goldfish or axolotls",marine:"Marine or reef"},A=["unanswered","covered","open"],I={unanswered:"Pick one before anything else",covered:"Covered, a glass lid or a full canopy",open:"Open on top, nothing over the water"},R=[{id:"t10",label:"10 gallon, 20 x 10",l:"20",w:"10",d:"11"},{id:"t20",label:"20 high, 24 x 12",l:"24",w:"12",d:"15"},{id:"t29",label:"29 gallon, 30 x 12",l:"30",w:"12",d:"17"},{id:"t40",label:"40 breeder, 36 x 18",l:"36",w:"18",d:"15"},{id:"t55",label:"55 gallon, 48 x 13",l:"48.25",w:"12.75",d:"20"},{id:"t75",label:"75 gallon, 48 x 18",l:"48.5",w:"18.5",d:"20"},{id:"t125",label:"125 gallon, 72 x 18",l:"72.5",w:"18.5",d:"22"}],D={"within-range":"stays inside the safe range for this tank","above-range":"climbs above the safe range for this tank","above-published-lift":"climbs more than 15 degrees past your target, which the published rule treats as too much heater",lethal:"climbs past 95 degrees, which the published guidance names as the point livestock is cooked"};function E(){let[e,t]=(0,r.useState)("unanswered"),[a,d]=(0,r.useState)("unanswered"),[g,w]=(0,r.useState)("48.25"),[x,F]=(0,r.useState)("12.75"),[E,V]=(0,r.useState)("20"),[Y,_]=(0,r.useState)("68"),[B,U]=(0,r.useState)("78");(0,r.useEffect)(()=>{let e=new URLSearchParams(window.location.search),a=(t,a)=>{let s=e.get(t);return null===s?a:s.slice(0,10)};if((0,h.Yc)(e,P)){w(a("l","")),F(a("w","")),V(a("d","")),_(a("r","")),U(a("t","")),t(b(e.get("k"))),d(v(e.get("c")));return}let s=(0,c.y5)(C);s.found&&(w(s.str("l","48.25",10)),F(s.str("w","12.75",10)),V(s.str("d","20",10)),_(s.str("r","68",10)),U(s.str("t","78",10)),t(b(s.str("k",""))),d(v(s.str("c",""))))},[]),(0,m.Vd)(C,()=>JSON.stringify({l:g,w:x,d:E,r:Y,t:B,k:e,c:a}),[g,x,E,Y,B,e,a],{debounceMs:250});let J=(0,r.useMemo)(()=>(function(e){var t,a,s,r;let o=b(e.tankType),n=v(e.lid),l={...T,tankType:o,lid:n};if("unanswered"===o)return{...l,problem:"Say whether this is a tropical, a coldwater or a marine tank before anything is sized. The three have different published safe ranges, and the check on where a failed heater would leave the tank is measured against the range for the type you keep. An unanswered question stays unanswered here rather than being read as tropical, because tropical is the answer that accepts the widest set of targets."};if("unanswered"===n)return{...l,problem:"Say whether the tank is covered or open on top. Evaporation off an open surface carries away enough heat to more than double the load, so this is not a detail worth defaulting. There is no safe default available either, because guessing covered leaves an open tank cold and guessing open sizes a covered tank too large, which is the failure this page exists to prevent."};let i=f[o],h=W(e.lengthIn,6,144,"Enter the inside length of the tank in inches.","The length has to be between 6 and 144 inches.");if(!h.ok)return{...l,range:i,problem:h.problem};let d=W(e.widthIn,4,72,"Enter the inside width of the tank, front to back, in inches.","The width has to be between 4 and 72 inches.");if(!d.ok)return{...l,range:i,problem:d.problem};let c=W(e.waterDepthIn,3,48,"Enter the WATER depth in inches, measured from the base glass up to the water line rather than the full height of the tank.","The water depth has to be between 3 and 48 inches.");if(!c.ok)return{...l,range:i,problem:c.problem};let m=W(e.roomTempF,32,110,"Enter the room temperature in degrees Fahrenheit. It is the input that decides the answer, and the coldest the room gets overnight matters more than the reading right now.","The room temperature has to be between 32 and 110 degrees Fahrenheit.");if(!m.ok)return{...l,range:i,problem:m.problem};let g=W(e.targetTempF,50,95,"Enter the temperature you want to hold the tank at, in degrees Fahrenheit.","The target has to be between 50 and 95of that is 95, which the published guidance names as the point livestock
1is cooked, so nothing here will size a heater to hold a tank there on purpose.");if(!g.ok)return{...l,range:i,problem:g.problem};let w=(t=h.value,t*d.value*c.value/231);if(w<1||w>500)return{...l,range:i,problem:`Those dimensions hold ${w.toFixed(1)} gallons, and this page works between 1 and 500 gallons. Check that the water depth is in inches rather than centimeters, and that the length and the width are inside measurements.`};let x=g.value-m.value;if(x<=0)return{...l,range:i,volumeGal:w,problem:`The room is already at or above ${g.value} degrees, so there is nothing here for a heater to do. A tank sitting above its target needs a chiller, more surface agitation or a fan blowing across the water, and none of those three is sized on this page.`};let F="covered"===n?{low:10,high:15}:"open"===n?{low:15,high:25}:null;if(null===F)return{...l,range:i,volumeGal:w,problem:"The lid question has no coefficient band."};let L=(a=h.value,2*(a*(s=d.value)+a*(r=c.value)+s*r)*64516e-8),C=k(F.low,L,x),P=k(F.high,L,x),G=k(F.low,L,x+15),S=function(e){if(!Number.isFinite(e)||e<=0)return{...N,problem:"The lift has to be a positive number of degrees Fahrenheit."};let t=u[0],a=u[u.length-1];if(e<t.liftF)return{...N,wattsPerGalLow:t.wattsPerGalLow,wattsPerGalHigh:t.wattsPerGalHigh,betweenRowsF:[t.liftF],belowLowestRow:!0};if(e>=a.liftF)return{...N,wattsPerGalLow:a.wattsPerGalLow,wattsPerGalHigh:a.wattsPerGalHigh,betweenRowsF:[a.liftF],atOpenEndedTopRow:!0};for(let t=0;t<u.length-1;t+=1){let a=u[t],s=u[t+1];if(e>=a.liftF&&e<s.liftF){if(e===a.liftF)return{...N,wattsPerGalLow:a.wattsPerGalLow,wattsPerGalHigh:a.wattsPerGalHigh,betweenRowsF:[a.liftF]};let t=(e-a.liftF)/(s.liftF-a.liftF);return{...N,wattsPerGalLow:a.wattsPerGalLow+t*(s.wattsPerGalLow-a.wattsPerGalLow),wattsPerGalHigh:a.wattsPerGalHigh+t*(s.wattsPerGalHigh-a.wattsPerGalHigh),betweenRowsF:[a.liftF,s.liftF],interpolated:!0}}}return{...N,problem:"The lift did not fall on the published table."}}(x),$={areaSqM:L,hLow:F.low,hHigh:F.high,roomTempF:m.value,targetTempF:g.value,range:i},M=j(C),O=j(P),q=g.value<i.lowF?"below-range":g.value>i.highF?"above-range":"inside";return{problem:null,volumeGal:w,areaSqM:L,liftF:x,liftC:5*x/9,roomTempF:m.value,targetTempF:g.value,hLow:F.low,hHigh:F.high,tankType:o,lid:n,range:i,targetVerdict:q,wattsLow:C,wattsHigh:P,paddedLowW:1.1*C,paddedHighW:1.2*P,ceilingW:G,wpg:S,wpgWattsLow:S.wattsPerGalLow*w,wpgWattsHigh:S.wattsPerGalHigh*w,physicsWattsPerGalLow:C/w,physicsWattsPerGalHigh:P/w,pickChartMatchW:M,pickChartMatch:null===M?null:H(M,$),pickHoldsWorstCaseW:O,pickHoldsWorstCase:null===O?null:H(O,$),twoHeaters:function(e,t){var a;if(!Number.isFinite(t.areaSqM)||t.areaSqM<=0)return{...y,problem:"The tank area has to be larger than zero."};if(t.hLow<=0||t.hHigh<=0)return{...y,problem:"The loss coefficients have to be larger than zero."};let s=t.targetTempF-t.roomTempF;if(!Number.isFinite(s)||s<=0)return{...y,problem:"The room is already at or above the target, so there is no load here to split across two heaters."};let r=k(t.hLow,t.areaSqM,s),o=(a=t.hLow,k(a,t.areaSqM,s+15)),n=.6*r,l=.7*r,i=j(r*p),h=Number.isFinite(e)&&e>=40;if(null===i)return{...y,recommended:h,perHeaterTargetLowW:n,perHeaterTargetHighW:l,problem:"Two thirds of the load is larger than the biggest heater in the list this page knows about, so a pair will not cover this tank. Three or four heaters, or a system with an external heat exchanger, is the shape of the answer at that size."};let d=2*i,c=H(i,t),m=H(d,t);return{problem:null,recommended:h,perHeaterTargetLowW:n,perHeaterTargetHighW:l,perHeaterPickW:i,pairTotalW:d,oneStuckOn:c,bothStuckOn:m,oneAloneHoldsTarget:c.holdsTargetHere,pairWithinCeiling:d<=o}}(w,$)}})({lengthIn:S(g),widthIn:S(x),waterDepthIn:S(E),roomTempF:S(Y),targetTempF:S(B),tankType:e,lid:a}),[g,x,E,Y,B,e,a]),Z=(e,t,a)=>`${e}: ${$(t)} W 2 holds the target down to a ${M(a.holdsDownToRoomFAtHighLoss)} F room at the high loss end, ${M(a.holdsDownToRoomFAtLowLoss)} F at the low end 3 welded on it settles at ${M(a.stuckOnTempF)} F, which ${D[a.stuckOnVerdict]}`,K=J.problem?J.problem:["Aquarium heater sizing","",`Tank ${O(J.volumeGal)} US gallons, ${O(J.areaSqM)} sq m of wetted area`,`Room to tank ${M(J.liftF)} F lift (${M(J.liftC)} C)`,`Loss band ${J.hLow} to ${J.hHigh} W per sq m per C, ${J.lid} tank`,"",`Required ${$(J.wattsLow)} to ${$(J.wattsHigh)} W`,`With padding ${$(J.paddedLowW)} to ${$(J.paddedHighW)} W`,`Hard ceiling ${$(J.ceilingW)} W, above which a welded heater passes target plus 15 F`,"",J.pickChartMatch&&null!==J.pickChartMatchW?Z("Smallest that matches published charts",J.pickChartMatchW,J.pickChartMatch):"No catalog size reaches the required wattage.",J.pickHoldsWorstCase&&null!==J.pickHoldsWorstCaseW?Z("Smallest that holds at the high loss end",J.pickHoldsWorstCaseW,J.pickHoldsWorstCase):"No catalog size covers the high end of the band.","",J.twoHeaters&&null===J.twoHeaters.problem&&null!==J.twoHeaters.perHeaterP
3ickW?[`Two heater plan ${J.twoHeaters.recommended?"recommended at this volume":"optional at this volume"}`,` Each ${$(J.twoHeaters.perHeaterPickW)} W, target band ${$(J.twoHeaters.perHeaterTargetLowW)} to ${$(J.twoHeaters.perHeaterTargetHighW)} W`,` Pair total ${$(J.twoHeaters.pairTotalW??0)} W, ${J.twoHeaters.pairWithinCeiling?"inside":"past"} the hard ceiling`,J.twoHeaters.oneStuckOn?` One welded on it settles at ${M(J.twoHeaters.oneStuckOn.stuckOnTempF)} F`:"",J.twoHeaters.bothStuckOn?` Both welded on it settles at ${M(J.twoHeaters.bothStuckOn.stuckOnTempF)} F`:"",` One alone ${J.twoHeaters.oneAloneHoldsTarget?"still holds":"does not hold"} the target in this room`].filter(Boolean).join("\n"):J.twoHeaters?.problem??"","","Watts per gallon check",` Published ${O(J.wpg.wattsPerGalLow)} to ${O(J.wpg.wattsPerGalHigh)} W per gallon at a ${M(J.liftF)} F lift, so ${$(J.wpgWattsLow)} to ${$(J.wpgWattsHigh)} W`,` This tank ${O(J.physicsWattsPerGalLow)} to ${O(J.physicsWattsPerGalHigh)} W per gallon by surface area`,"",J.range?`Safe range ${J.range.label}, ${J.range.lowF} to ${J.range.highF} F`:"","","What it refuses to do",...L.map(e=>` - ${e}`)].filter(e=>""!==e).join("\n");return(0,s.jsxs)("div",{className:"space-y-5",children:[(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:"Fill the dimensions from a common tank"}),(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:R.map(e=>(0,s.jsx)(n.$,{size:"sm",variant:"outline",onClick:()=>{w(e.l),F(e.w),V(e.d)},children:e.label},e.id))}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"These are common nominal footprints, and the gallons below are worked out from whatever is in the boxes rather than from the label on the button. Measure your own tank if you can."})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"tanktype",children:"What do you keep in it"}),(0,s.jsx)("select",{id:"tanktype",className:G,value:e,onChange:e=>t(b(e.target.value)),children:q.map(e=>(0,s.jsx)("option",{value:e,children:z[e]},e))})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"lid",children:"Is there a lid on it"}),(0,s.jsx)("select",{id:"lid",className:G,value:a,onChange:e=>d(v(e.target.value)),children:A.map(e=>(0,s.jsx)("option",{value:e,children:I[e]},e))})]})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-3",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"len",children:"Inside length"}),(0,s.jsx)(o.p,{id:"len",inputMode:"decimal",value:g,onChange:e=>w(e.target.value),className:"font-mono"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"inches"})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"wid",children:"Inside width, front to back"}),(0,s.jsx)(o.p,{id:"wid",inputMode:"decimal",value:x,onChange:e=>F(e.target.value),className:"font-mono"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"inches"})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"dep",children:"Water depth"}),(0,s.jsx)(o.p,{id:"dep",inputMode:"decimal",value:E,onChange:e=>V(e.target.value),className:"font-mono"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"inches, base glass up to the water line rather than the full height"})]})]}),(0,s.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"room",children:"Room temperature"}),(0,s.jsx)(o.p,{id:"room",inputMode:"decimal",value:Y,onChange:e=>_(e.target.value),className:"font-mono"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"degrees Fahrenheit, and the coldest it gets overnight beats the reading right now"})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"target",children:"Target tank temperature"}),(0,s.jsx)(o.p,{id:"target",inputMode:"decimal",value:B,onChange:e=>U(e.target.value),className:"font-mono"}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"degrees Fahrenheit"})]})]}),J.problem?(0,s.jsx)("p",{className:"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm",children:J.problem}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The tank, worked out from your three measurements"}),(0,s.jsxs)("div",{className:"mt-3 space-y-1 font-mono text-sm",children:[(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Water volume"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[O(J.volumeGal)," US gallons"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Wetted surface area"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[O(J.areaSqM)," sq m"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Lift from the room to the tank"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[M(J.liftF)," F (",M(J.liftC)," C)"]}
3)]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Published loss coefficient band"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[J.hLow," to ",J.hHigh," W per sq m per C"]})]})]})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The wattage window"}),(0,s.jsxs)("div",{className:"mt-3 space-y-1 font-mono text-sm",children:[(0,s.jsxs)("div",{className:"flex justify-between font-medium",children:[(0,s.jsx)("span",{children:"Required to hold the target"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.wattsLow)," to ",$(J.wattsHigh)," W"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"With the published padding on it"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.paddedLowW)," to ",$(J.paddedHighW)," W"]})]}),(0,s.jsxs)("div",{className:"flex justify-between border-t pt-1 font-medium",children:[(0,s.jsx)("span",{children:"Hard ceiling, from the published lift rule"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.ceilingW)," W"]})]})]}),(0,s.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["The required figure is a band because the loss coefficient is published as a band. The ceiling is a different kind of number. A thermostat that welds shut takes itself out of the loop, and the tank then climbs until its heat loss matches whatever the heater is putting in, so a heater above ",$(J.ceilingW)," watts on this tank would settle it more than ",15," degrees past your target."]})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The sizes worth looking at"}),(0,s.jsxs)("div",{className:"mt-3 space-y-3 text-sm",children:[null!==J.pickChartMatchW&&J.pickChartMatch?(0,s.jsxs)("div",{children:[(0,s.jsxs)("p",{className:"font-medium",children:[$(J.pickChartMatchW)," W, the size published charts land on"]}),(0,s.jsxs)("p",{className:"text-muted-foreground",children:["It holds ",M(J.pickChartMatch.holdsDownToRoomFAtLowLoss)," degrees in the room if this tank sits at the low end of the loss band, and only"," ",M(J.pickChartMatch.holdsDownToRoomFAtHighLoss)," degrees if it sits at the high end."," ",J.pickChartMatch.holdsTargetHere?"Your room is warmer than both of those, so it holds the target either way.":J.pickChartMatch.holdsTargetHereOnlyAtLowLoss?"Your room falls between the two, so this size is marginal rather than comfortable.":"Your room is colder than both of those, so this size will not hold the target."," ","Welded on, the tank settles at ",M(J.pickChartMatch.stuckOnTempF)," degrees, which"," ",D[J.pickChartMatch.stuckOnVerdict],"."]})]}):(0,s.jsx)("p",{className:"text-muted-foreground",children:"Nothing on the shelf this page knows about reaches the required wattage for this tank in this room."}),null!==J.pickHoldsWorstCaseW&&J.pickHoldsWorstCase?(0,s.jsxs)("div",{children:[(0,s.jsxs)("p",{className:"font-medium",children:[$(J.pickHoldsWorstCaseW)," W, the size that holds even at the high loss end"]}),(0,s.jsxs)("p",{className:"text-muted-foreground",children:["It carries the target down to"," ",M(J.pickHoldsWorstCase.holdsDownToRoomFAtHighLoss)," degrees in the room whatever this tank turns out to be losing. Welded on, it settles at"," ",M(J.pickHoldsWorstCase.stuckOnTempF)," degrees, which"," ",D[J.pickHoldsWorstCase.stuckOnVerdict],". That trade is the whole decision on this page, and there is no size that wins both halves of it."]})]}):(0,s.jsx)("p",{className:"text-muted-foreground",children:"No single heater in the list this page knows about covers the high end of the band for this tank in this room. Splitting the load across two heaters is the route out of that, and it is worked out below."})]})]}),J.twoHeaters&&null===J.twoHeaters.problem&&null!==J.twoHeaters.perHeaterPickW?(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsxs)("h3",{className:"text-sm font-medium",children:["Splitting it across two heaters"," ",J.twoHeaters.recommended?"(recommended at this volume)":"(optional at this volume)"]}),(0,s.jsxs)("div",{className:"mt-3 space-y-1 font-mono text-sm",children:[(0,s.jsxs)("div",{className:"flex justify-between font-medium",children:[(0,s.jsx)("span",{children:"Each heater"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.twoHeaters.perHeaterP
3ickW)," W"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsxs)("span",{className:"text-muted-foreground",children:["Published share, ",Math.round(60)," to"," ",Math.round(70)," percent each"]}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.twoHeaters.perHeaterTargetLowW)," to ",$(J.twoHeaters.perHeaterTargetHighW)," W"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Pair total against the hard ceiling"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.twoHeaters.pairTotalW??0)," W of ",$(J.ceilingW)," W"]})]}),J.twoHeaters.oneStuckOn?(0,s.jsxs)("div",{className:"flex justify-between border-t pt-1",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"One of them welded on"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[M(J.twoHeaters.oneStuckOn.stuckOnTempF)," F"]})]}):null,J.twoHeaters.bothStuckOn?(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Both welded on at once"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[M(J.twoHeaters.bothStuckOn.stuckOnTempF)," F"]})]}):null]}),(0,s.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["The published guidance moves to a pair somewhere between ",40," and"," ",50," gallons, and this page uses the lower figure. The reason is in the two rows above. One heater welded on lands the tank at"," ",J.twoHeaters.oneStuckOn?M(J.twoHeaters.oneStuckOn.stuckOnTempF):""," degrees rather than anywhere near the single-heater figure, and"," ",J.twoHeaters.oneAloneHoldsTarget?"one of them alone still holds your target, so a heater that quietly dies will not show up as a cold tank.":"one of them alone will not hold your target here, so a heater that quietly dies shows up as a slow drift down rather than a crash."]}),J.twoHeaters.pairWithinCeiling?null:(0,s.jsx)("p",{className:"mt-3 text-sm font-medium",children:"The pair adds up to more than the hard ceiling for this tank, so two heaters this size can between them drive it past the published limit. Step both down a size, or keep the single heater and watch it."})]}):J.twoHeaters&&null!==J.twoHeaters.problem?(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"Splitting it across two heaters"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:J.twoHeaters.problem})]}):null,(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The watts per gallon rule, checked against this tank"}),(0,s.jsxs)("div",{className:"mt-3 space-y-1 font-mono text-sm",children:[(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsxs)("span",{className:"text-muted-foreground",children:["Published, at a ",M(J.liftF)," F lift",J.wpg.interpolated?", read between two rows":""]}),(0,s.jsxs)("span",{className:"tabular-nums",children:[O(J.wpg.wattsPerGalLow)," to ",O(J.wpg.wattsPerGalHigh)," W per gallon"]})]}),(0,s.jsxs)("div",{className:"flex justify-between",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Which over your volume is"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[$(J.wpgWattsLow)," to ",$(J.wpgWattsHigh)," W"]})]}),(0,s.jsxs)("div",{className:"flex justify-between border-t pt-1 font-medium",children:[(0,s.jsx)("span",{children:"This tank by surface area"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[O(J.physicsWattsPerGalLow)," to ",O(J.physicsWattsPerGalHigh)," W per gallon"]})]})]}),(0,s.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["The familiar ",3," to ",5," watts per gallon is the top of the"," ",10," degree row and the top of the ",15," degree row of the same published table, so it quietly assumes a room"," ",10," to ",15," degrees below the tank. Yours is"," ",M(J.liftF)," degrees below."]}),"open"===J.lid?(0,s.jsx)("p",{className:"mt-3 text-sm font-medium",children:"Run backwards through the physics form on a standard tank, the published table lands on a loss coefficient near the bottom of the covered band, so it is a covered tank table whether or not it says so. Your tank is open on top, which is why the surface area figure above asks for so much more than the table does."}):null,(0,s.jsx)("pre",{className:"mt-3 overflow-x-auto rounded bg-muted p-3 font-mono text-xs",children:`lift F watts per gallon 4${u.map(e=>`${String(e.liftF).padStart(5)}${20===e.liftF?"+":" "} ${e.wattsPerGalLow} to ${e.wattsPerGalHigh}${20===e.liftF?" or more":""}`).join("\n")}`})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The arithmetic"}),(0,s.jsx)("pre",{className:"mt-3 overflow-x-auto rounded bg-muted p-3 font-mono text-sm",children:`area A = 2 x (L x W + L x D + W x D) the box, all six faces 5watts = h x A x lift h in W per sq m per C, lift in C 6ceiling = h_low x A x (lift + 15) a welded heater settles here 7settles = room + watts / (h_low x A) the inverse of the same line`}),(0,s.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"The area formula
7is symmetric in all three dimensions, so a tall tank and a long tank that are the same box turned on its side need exactly the same heater. What changes the area at a fixed volume is how close the box is to a cube, and a cube has the least surface area of any box holding that much water."})]}),J.range?(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsxs)("h3",{className:"text-sm font-medium",children:[J.range.label,", ",J.range.lowF," to ",J.range.highF," F"]}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:J.range.published}),"inside"===J.targetVerdict?null:(0,s.jsxs)("p",{className:"mt-3 text-sm font-medium",children:["Your target of ",M(J.targetTempF)," degrees sits"," ","above-range"===J.targetVerdict?"above":"below"," that published range. The wattage above is still worked out for the temperature you asked for, and the range is what the source publishes for the kind of tank you picked."]})]}):null,(0,s.jsx)(i.i,{value:K,label:"Copy the sizing, both picks and the refusals"})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"What this page will not do"}),(0,s.jsx)("ul",{className:"mt-3 space-y-2 text-sm text-muted-foreground",children:L.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"Every wattage here comes from one published relationship, heater power equals a heat transfer coefficient times the wetted area of the tank times the temperature difference, and that coefficient is a published band of 10 to 15 watts per square meter per degree Celsius for a covered tank rather than a measurement of yours. The band lumps glass conduction, room air movement and evaporation off the water surface into a single figure, so an open top gets charged across the whole envelope instead of against the water surface alone, which overstates what a lid is worth on a deep tank and understates it on a shallow one. The low end of the open top band is this page assuming rather than the source publishing, because the research gives an upper figure of 25 and no lower one, so an open tank reports a wider band than a covered tank does. It knows nothing about a draft from a window, a light fixture warming the water from above, a pump adding a few watts of its own, or a room that swings 15 degrees between the afternoon and four in the morning, and that last one decides more heater choices than anything printed on this page. The list of heater wattages it snaps to is a market catalog rather than a physical constant, so a brand you own may sell a size it has never heard of, and the temperature a welded thermostat settles at assumes the room stays where you said it was. None of this replaces a second thermometer you read by eye, which is the only thing that catches a stuck heater before the fish do."}),(0,s.jsx)(l.ToolActions,{share:()=>(0,h.CZ)([{key:"l",value:g},{key:"w",value:x},{key:"d",value:E},{key:"r",value:Y},{key:"t",value:B},{key:"k",value:"unanswered"===e?null:e},{key:"c",value:"unanswered"===a?null:a}]),title:"Aquarium Heater Size Calculator",queryIsImpersonal:"the tank dimensions, room temperature and target temperature you entered"})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.