Heat Load Calculator
ANA›Life Services Authority›National Calculator Authority›Heat Load Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Heat Load Calculator
Estimates the heating and cooling load for a room or building zone based on area, insulation, climate, and occupancy factors.
Floor Area (ft²)
Ceiling Height (ft)
Outdoor Design Temperature (°F)
Indoor Design Temperature (°F)
Insulation Level
-- Select -- Poor (older construction, minimal insulation) Average (standard construction) Good (well-insulated, modern construction) Excellent (high-performance / passive house)
Window Area (ft²)
Window Type
-- Select -- Single-pane Double-pane Triple-pane
Number of Occupants
Climate Zone
-- Select -- Hot & Humid Hot & Dry Mixed / Temperate Cold Very Cold / Subarctic
Calculation Mode
-- Select -- Cooling Load (Summer) Heating Load (Winter)
Calculate Heat Load
function heaCalc() { const errEl = document.getElementById('hea-error'); const resEl = document.getElementById('hea-result'); errEl.style.display = 'none'; resEl.style.display = 'none';
// --- Collect inputs --- const area = parseFloat(document.getElementById('hea-area').value); const ceiling = parseFloat(document.getElementById('hea-ceiling').value); const outdoorTemp = parseFloat(document.getElementById('hea-outdoor-temp').value); const indoorTemp = parseFloat(document.getElementById('hea-indoor-temp').value); const insulation = document.getElementById('hea-insulation').value; const windowArea = parseFloat(document.getElementById('hea-windows').value); const windowType = document.getElementById('hea-window-type').value; const occupants = parseFloat(document.getElementById('hea-occupants').value); const climate = document.getElementById('hea-climate').value; const mode = document.getElementById('hea-mode').value;
// --- Validation --- const errors = []; if (isNaN(area) || area 30) errors.push("Ceiling height must be between 6 and 30 ft."); if (isNaN(outdoorTemp)) errors.push("Outdoor design temperature is required."); if (isNaN(indoorTemp)) errors.push("Indoor design temperature is required."); if (!insulation) errors.push("Please select an insulation level."); if (isNaN(windowArea) || windowArea 0 && !windowType) errors.push("Please select a window type."); if (isNaN(occupants) || occupants = indoorTemp) { errors.push("For heating load, outdoor temperature should be less than indoor temperature."); }
if (errors.length > 0) { errEl.innerHTML = errors.map(e => '⚠ ' + e).join(''); errEl.style.display = 'block'; return; }
// --------------------------------------------------------------- // WALL U-VALUES (BTU / hr·ft²·°F) by insulation level // Based on ASHRAE Fundamentals typical envelope assemblies // --------------------------------------------------------------- const wallU = { poor: 0.20, average: 0.10, good: 0.065, excellent: 0.030 }; const roofU = { poor: 0.15, average: 0.07, good: 0.040, excellent: 0.020 };
// WINDOW U-VALUES (BTU / hr·ft²·°F) const windowU = { single: 1.10, double: 0.48, triple: 0.25 };
// WINDOW SHGC (Solar Heat Gain Coefficient) — used for cooling only const windowSHGC = { single: 0.86, double: 0.40, triple: 0.25 };
// INFILTRATION ACH (air changes per hour) by insulation level const ach = { poor: 0.8, average: 0.5, good: 0.3, excellent: 0.15 };
// CLIMATE solar irradiance factor (BTU/hr·ft² of window) for cooling const solarFactor = { hot_humid: 150, hot_dry: 200, mixed: 130, cold: 100, very_cold: 80 };
// --------------------------------------------------------------- // GEOMETRY // --------------------------------------------------------------- const volume = area * ceiling; // ft³ const perimeterEst = 4 * Math.sqrt(area); // ft (square room approx) const wallArea = perimeterEst * ceiling - windowArea; // ft² (gross wall minus windows) const roofArea = area; // ft²
// --------------------------------------------------------------- // TEMPERATURE DIFFERENCE // --------------------------------------------------------------- const deltaT = Math.abs(outdoorTemp - indoorTemp); // °F
// --------------------------------------------------------------- // 1. ENVELOPE CONDUCTION LOAD Q = U × A × ΔT (BTU/hr) // --------------------------------------------------------------- const Q_wall = wallU[insulation] * Math.max(wallArea, 0) * deltaT; const Q_roof = roofU[insulation] * roofArea * deltaT; const Q_window = (windowArea > 0 ? windowU[windowType] : 0) * windowArea * deltaT; const Q_cond = Q_wall + Q_roof + Q_window;
// --------------------------------------------------------------- // 2. INFILTRATION LOAD Q = 0.018 × CFM × ΔT (BTU/hr) // CFM = (ACH × Volume) / 60 // --------------------------------------------------------------- const cfm = (ach[insulation] * volume) / 60; const Q_infil = 0.018 * cfm * deltaT * 60; // sensible only (BTU/hr) // Latent infiltration (humidity) — simplified 30% adder for hot-humid const latentMult = (climate === 'hot_humid' && mode === 'cooling') ? 1.30 : 1.0;
// --------------------------------------------------------------- // 3. INTERNAL GAINS (cooling only) // Occupants: ~250 BTU/hr sensible + 200 BTU/hr latent each // Lighting: ~3 W/ft² × 3.41 BTU/W (typical commercial estimate) // Equipment: ~2 W/ft² × 3.41 BTU/W // --------------------------------------------------------------- let Q_internal = 0; if (mode === 'cooling') { const Q_people = occupants * 250; const Q_lighting = area * 3 * 3.41; const Q_equipment = area * 2 * 3.41; Q_internal = Q_people + Q_lighting + Q_equipment; } else { // Heating: internal gains reduce load (credit) Q_internal = -(occupants * 250 + area * 1 * 3.41); }
// --------------------------------------------------------------- // 4. SOLAR GAIN (cooling only) Q = SHGC × A_window × I_solar // --------------------------------------------------------------- let Q_solar = 0; if (mode === 'cooling' && windowArea > 0) { Q_solar = windowSHGC[windowType] * windowArea * solarFactor[climate]; }
// --------------------------------------------------------------- // 5. TOTAL LOAD // --------------------------------------------------------------- let Q_total = (Q_cond + Q_infil * latentMult + Q_internal + Q_solar); Q_total = Math.max(Q_total, 0); // load cannot be negative
// Convert to common units const Q_tons = Q_total / 12000; // 1 ton = 12,000 BTU/hr const Q_kW = Q_total * 0.000293071; // BTU/hr → kW const Q_MBH = Q_total / 1000; // BTU/hr → MBH (thousands of BTU/hr)
// Rule-of-thumb check (BTU/hr per ft²) const loadPerSqFt = Q_total / area;
// --------------------------------------------------------------- // Sizing recommendation // --------------------------------------------------------------- let sizingNote = ''; if (mode === 'cooling') { if (loadPerSqFt
Component BTU/hr % of Total
Wall Conduction ${Q_wall.toFixed(0)} ${(Q_wall/Q_total*100).toFixed(1)}%
Roof/Ceiling Conduction ${Q_roof.toFixed(0)} ${(Q_roof/Q_total*100).toFixed(1)}%
Window Conduction ${Q_window.toFixed(0)} ${(Q_window/Q_total*100).toFixed(1)}%
Infiltration ${(Q_infillatentMult).toFixed(0)} ${(Q_infillatentMult/Q_total*100).toFixed(1)}%
${mode === 'cooling' ? `
Solar Gain (Windows) ${Q_solar.toFixed(0)} ${(Q_solar/Q_total*100).toFixed(1)}%
Internal Gains (People + Lights + Equipment)
${Q_internal.toFixed(0)}
${(Q_internal/Q_total*100).toFixed(1)}%
:
Internal Gains Credit (People + Lights) ${Q_internal.toFixed(0)} ${(Math.abs(Q_internal)/Q_total*100).toFixed(1)}% credit `}
TOTAL ${modeLabel.toUpperCase()} LOAD ${Q_total.toFixed(0)} 100%
${Q_tons.toFixed(2)} Tons of Refrigeration
${Q_MBH.toFixed(2)} MBH (1,000 BTU/hr)
${Q_kW.toFixed(2)} kW Equivalent
${loadPerSqFt.toFixed(1)} BTU/hr per ft²
💡 Sizing Note: ${sizingNote}
🔧 Equipment Sizing: Recommended equipment capacity = ${(Q_tons * 1.15).toFixed(2)} tons (${(Q_MBH * 1.15).toFixed(1)} MBH) — includes 15% safety factor per ACCA Manual S guidelines.
`; resEl.style.display = 'block'; }
#### Formulas Used
1. Envelope Conduction Load (ASHRAE Fundamentals): Q_cond = U × A × ΔT Where U = overall heat transfer coefficient (BTU/hr·ft²·°F), A = surface area (ft²), ΔT = indoor–outdoor temperature difference (°F).
2. Infiltration Sensible Load: Q_infil = 1.08 × CFM × ΔT (simplified as 0.018 × ACH × Volume × ΔT) Where CFM = (ACH × Volume) / 60, and 1.08 = 0.018 × 60 (air density × specific heat constant for standard air).
3. Solar Heat Gain (Cooling only): Q_solar = SHGC × A_window × I_solar Where SHGC = Solar Heat Gain Coefficient, I_solar = peak solar irradiance by climate zone (BTU/hr·ft²).
4. Internal Gains (Cooling) / Credit (Heating): Q_internal = Q_people + Q_lighting + Q_equipment People: 250 BTU/hr sensible per occupant; Lighting: 3 W/ft² × 3.41; Equipment: 2 W/ft² × 3.41.
5. Total Load: Q_total = Q_cond + Q_infil + Q_solar + Q_internal Converted: 1 ton = 12,000 BTU/hr; 1 kW = 3,412 BTU/hr.
#### Assumptions & References
- U-values for walls and roofs are representative of typical construction assemblies per ASHRAE Handbook of Fundamentals (2021).
- Equipment sizing includes a 15% safety factor per ACCA Manual S recommendations.
- This calculator provides a simplified estimate. For final equipment selection, a full ACCA Manual J load calculation performed by a licensed HVAC engineer is recommended.
More Calculators
- South Dakota Contractor License Fee Estimator
- South Dakota Construction Sales Tax Calculator
- South Dakota Prevailing Wage Project Cost Calculator
- Subcontractor vs Employee Cost Calculator
- Contractor License Verification Checklist Scorer
- Multiple Bid Fair Price Range Calculator
Read Next
Contractor License Verification Checklist Scorer ANA › Life Services Authority › National Calculator Authority › Contractor License Verification Checklist Scorer...
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...