draft-pressure-calc/draft-pressure.html

357 lines
12 KiB
HTML
Raw Normal View History

2026-07-18 06:50:28 +02:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Draft Pressure Calculator | Alan Destin</title>
<style>
:root {
--bg: #1a1a1a;
--fg: #e0e0e0;
--accent: #d4af37; /* Brass */
--secondary: #2d2d2d;
--success: #4caf50;
--error: #f44336;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: var(--bg);
color: var(--fg);
line-height: 1.6;
max-width: 900px;
margin: 0 auto;
padding: 2rem;
}
header {
border-bottom: 2px solid var(--accent);
padding-bottom: 1rem;
margin-bottom: 2rem;
}
h1 {
font-size: 2.2rem;
color: var(--accent);
letter-spacing: -0.02em;
}
h2 {
font-size: 1.5rem;
margin-top: 2rem;
margin-bottom: 1rem;
color: var(--accent);
}
.formula {
background: var(--secondary);
padding: 1.5rem;
border-left: 4px solid var(--accent);
font-family: 'Courier New', monospace;
font-size: 1.1rem;
margin: 1.5rem 0;
overflow-x: auto;
}
.calculator-wrapper {
background: var(--secondary);
padding: 2rem;
border-radius: 8px;
margin: 2rem 0;
}
.input-group {
display: grid;
grid-template-columns: 200px 1fr;
align-items: center;
margin-bottom: 1.5rem;
gap: 1rem;
}
label {
font-weight: 600;
color: var(--accent);
}
input[type="number"] {
width: 100%;
padding: 0.75rem;
background: #1a1a1a;
border: 1px solid #444;
color: var(--fg);
font-size: 1rem;
border-radius: 4px;
}
input[type="number"]:focus {
outline: none;
border-color: var(--accent);
}
button {
background: var(--accent);
color: #000;
padding: 1rem 2rem;
border: none;
font-weight: bold;
font-size: 1.1rem;
cursor: pointer;
border-radius: 4px;
transition: transform 0.1s;
}
button:hover {
transform: translateY(-2px);
filter: brightness(1.1);
}
button:active {
transform: translateY(0);
}
.result-box {
margin-top: 2rem;
padding: 1.5rem;
background: rgba(76, 175, 80, 0.1);
border: 1px solid var(--success);
border-radius: 4px;
display: none;
}
.result-value {
font-size: 2.5rem;
font-weight: bold;
color: var(--success);
}
.warning-box {
margin-top: 1rem;
padding: 1rem;
background: rgba(244, 67, 54, 0.1);
border: 1px solid var(--error);
border-radius: 4px;
display: none;
}
.note {
font-size: 0.9rem;
color: #aaa;
margin-top: 0.5rem;
}
nav {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid #333;
}
nav a {
color: var(--accent);
text-decoration: none;
margin-right: 2rem;
}
nav a:hover {
text-decoration: underline;
}
.hero-image {
max-width: 100%;
height: auto;
margin: 2rem 0;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0,0,0,0.5);
}
.image-caption {
font-size: 0.9rem;
color: #888;
text-align: center;
margin-top: 0.5rem;
font-style: italic;
}
.spec-table {
width: 100%;
border-collapse: collapse;
margin: 1.5rem 0;
}
.spec-table th, .spec-table td {
padding: 0.75rem;
text-align: left;
border-bottom: 1px solid #444;
}
.spec-table th {
color: var(--accent);
font-weight: 600;
}
@media (max-width: 600px) {
.input-group {
grid-template-columns: 1fr;
}
body {
padding: 1rem;
}
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Draft Pressure Calculator</h1>
<p>Stack effect calculations for chimneys, flues, and ventilation systems.</p>
</header>
<section>
<h2>The Physics of Draft</h2>
<p>A chimney doesn't pull smoke up—it pushes it. Cold, dense air outside creates higher pressure at the base than warm, light air inside. That pressure differential is your draft. Get it wrong, and the flue backs up. Get it right, and combustion flows clean.</p>
<img src="https://images.pexels.com/photos/20477904/pexels-photo-20477904.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Factory chimney emitting smoke into clear blue sky demonstrating stack effect principle" class="hero-image">
<p class="image-caption">Cold ambient air density drives upward flow through hot flue gases. The greater the temperature differential, the stronger the draft.</p>
<div class="formula">
ΔP = H × (ρ_out ρ_in) × g<br><br>
Where:<br>
• ΔP = Draft pressure (Pa)<br>
• H = Chimney height (m)<br>
ρ_out = Outside air density (kg/m³)<br>
ρ_in = Inside air density (kg/m³)<br>
• g = Gravitational acceleration (9.81 m/s²)
</div>
<p class="note">Air density derives from the ideal gas law: ρ = P/(R×T). At standard pressure (101,325 Pa), dry air density varies inversely with absolute temperature (Kelvin). Source: Standard Atmosphere model, R_dry_air = 287.058 J/(kg·K).</p>
</section>
<section class="calculator-wrapper">
<h2>Calculator</h2>
<div class="input-group">
<label for="height">Chimney Height</label>
<div>
<input type="number" id="height" placeholder="e.g., 12" step="0.1" min="0">
<span class="note">meters (typical residential: 1015m)</span>
</div>
</div>
<div class="input-group">
<label for="temp-outside">Outside Temperature</label>
<div>
<input type="number" id="temp-outside" placeholder="e.g., -10" step="0.1" min="-50" max="50">
<span class="note">°C (winter conditions create stronger draft)</span>
</div>
</div>
<div class="input-group">
<label for="temp-inside">Flue Gas Temperature</label>
<div>
<input type="number" id="temp-inside" placeholder="e.g., 250" step="0.1" min="100" max="600">
<span class="note">°C (wood stove exhaust: 200400°C typical)</span>
</div>
</div>
<button onclick="calculateDraft()">Calculate Draft Pressure</button>
<div id="result" class="result-box">
<div>Draft Pressure:</div>
<div class="result-value" id="draft-result">0 Pa</div>
<p class="note" id="draft-note"></p>
</div>
<div id="warning" class="warning-box">
<strong>⚠️ WARNING: Insufficient Draft!</strong><br>
This configuration risks backflow. Increase height, raise flue temperature, or reduce cold air infiltration.
</div>
</section>
<section>
<h2>Why This Matters</h2>
<table class="spec-table">
<thead>
<tr>
<th>Condition</th>
<th>Minimum Draft</th>
<th>Risk Below Threshold</th>
</tr>
</thead>
<tbody>
<tr>
<td>Wood Stove</td>
<td>≥ 10 Pa</td>
<td>Smoke spillage into room</td>
</tr>
<tr>
<td>Natural Gas Fireplace</td>
<td>≥ 5 Pa</td>
<td>CO buildup, flame rollback</td>
</tr>
<tr>
<td>Industrial Flue</td>
<td>≥ 25 Pa</td>
<td>Combustion instability</td>
</tr>
</tbody>
</table>
<p>My own stovepipe runs 14 meters. In January, with -15°C outside and 300°C flue temps, I measure 22 Pa at the throat. Drop that below 10 Pa, and you'll see smoke creeping through the door seal. That's not theory—that's Tuesday morning.</p>
</section>
<nav>
<a href="/">Home</a>
<a href="/perfect-joint.html">Perfect Joint</a>
<a href="/square-frame.html">Square Frame</a>
<a href="/draft-pressure.html">Draft Calculator ←</a>
<a href="/fixing-small-engines.html">Small Engines</a>
</nav>
<script>
const R_DRY_AIR = 287.058; // J/(kg·K) - Specific gas constant for dry air
const STANDARD_PRESSURE = 101325; // Pa - Standard atmospheric pressure
function calculateDraft() {
const height = parseFloat(document.getElementById('height').value);
const tempOut = parseFloat(document.getElementById('temp-outside').value);
const tempIn = parseFloat(document.getElementById('temp-inside').value);
if (isNaN(height) || isNaN(tempOut) || isNaN(tempIn)) {
alert("Fill all fields with valid numbers.");
return;
}
// Convert Celsius to Kelvin
const kelvinOut = tempOut + 273.15;
const kelvinIn = tempIn + 273.15;
// Calculate densities using ideal gas law: ρ = P/(R×T)
const rhoOut = STANDARD_PRESSURE / (R_DRY_AIR * kelvinOut);
const rhoIn = STANDARD_PRESSURE / (R_DRY_AIR * kelvinIn);
// Calculate draft pressure: ΔP = H × (ρ_out ρ_in) × g
const g = 9.81;
const deltaP = height * (rhoOut - rhoIn) * g;
// Display results
const resultBox = document.getElementById('result');
const resultValue = document.getElementById('draft-result');
const warningBox = document.getElementById('warning');
resultValue.textContent = deltaP.toFixed(2) + ' Pa';
resultBox.style.display = 'block';
// Check thresholds
if (deltaP < 10) {
warningBox.innerHTML = `<strong>⚠️ WARNING: Insufficient Draft!</strong><br>This configuration risks backflow. Minimum recommended: 10 Pa for wood stoves.<br>Current: ${deltaP.toFixed(2)} Pa`;
warningBox.style.display = 'block';
} else {
warningBox.style.display = 'none';
}
}
</script>
</body>
</html>