Sending the smoke down 1 m cost 7 Pa of draft — Franklin's stove and the buoyancy budget
Buoyancy is bought per metre at the local gas density, so a descent taken while the gas is hot is never paid back by a metre added at the cold end.
1741: a stove that deliberately sends smoke downward#
Benjamin Franklin redesigned the fireplace in 1741. His goal was simple: catch the heat that otherwise walks straight up the chimney. Europe's population was growing fast, firewood was scarce, and heating efficiency was close to a survival problem.
His method was to fold the flue path. Smoke from the fire climbs over a baffle (a plate set across the passage to turn the flow), then travels downward along a cast-iron wall, and only then enters the chimney. The iron heats up during the descent and radiates into the room. Contemporary accounts called the trick a "siphon".
The chimney top does not move. The net elevation the smoke gains is unchanged. And yet this stove became notorious for pushing smoke back into the room. This post writes out exactly where that loss happens and how large it is. The answer fits in one line — buoyancy can only be earned at the height where the gas is still hot.
Draft is a density difference multiplied by height#
The force that pulls smoke up a chimney is called draft. It is not a pump; it is a hydrostatic imbalance. The outside air column and the inside flue-gas column simply do not weigh the same.
For a flue of height , draft reads
where is the ambient density, the flue-gas density at height , and gravity. Absolute pressure is essentially the same inside and out, so the ideal gas gives , and for a uniform gas temperature the integral closes immediately.
Outside air at 10 °C ( kg/m³), gas at 500 K, chimney height 7 m gives 37 Pa. Real fireplace draft runs 10–30 Pa, so the magnitude is right.
The part that matters is that sits inside the integral. Buoyancy is not a number multiplied once by the total height; it is bought metre by metre at whatever density holds there. That is where Franklin paid.
Try the simulation below.
Push the down-leg slider all the way and the chimney top stays pinned at 7 m. Yet the red bar
in the ledger grows and the net draft drops. Then pull fire temp down: the mouth gauge crosses
the amber spill limit, and it does so much sooner when the down-leg is deep.
Buoyancy is only earned at the height where the gas is hot#
Cut the path into three legs: the rise to the baffle ( m), the descent (), and the chimney ( m). Their elevation changes always sum to 7 m, whatever is. But each leg's buoyancy contribution is computed with the gas density it happens to carry.
The gas cools as it loses heat to the walls. Along the path coordinate that is one first-order ODE.
is the overall heat transfer coefficient, the flue perimeter, the mass flow rate, and the specific heat. The solution is an exponential decay whose length scale is — a fact that matters shortly.
Now the loss is visible. The descending leg is the second hottest segment of the path. Its density is nearly the lowest, so is nearly the largest, and it gets multiplied by a negative . The chimney segment that buys the metre back runs on gas that has already surrendered its heat to the iron. Instead of selling high and buying low, the stove buys high and sells low.
Worse, in Franklin's design the descending leg sits inside the room — it is by construction the segment that loses heat fastest. The very feature meant to raise heating efficiency spends the budget the chimney was counting on.
Closing the momentum balance around the loop#
The flow rate settles where buoyancy equals loss. That is a momentum balance taken once around the flue.
The left side is the buoyancy head; the right side is friction plus minor losses (bends and exit). is the Darcy friction factor, the flue diameter, the cross-section, the minor loss coefficient, and the exit density. The pipe friction term has the same form used in entrance length and Hagen–Poiseuille.
The equation is less innocent than it looks. Raising grows the right side like , but it grows the left side too: more flow means less residence time, so the gas reaches the chimney hotter. Because of that feedback the residual is concave in and has two roots. The lower root is unstable; the physical operating point is the upper one.
The buoyancy ledger, written out in Python#
March the temperature along a finely divided path, collect the buoyancy head of each leg separately, then bisect for the upper root. Sweep the descent height from 0 to 1.2 m.
import math
G, R_AIR, CP = 9.81, 287.0, 1100.0
T_AMB, P_ATM = 283.0, 101325.0
D_FLUE = 0.15
A_FLUE = math.pi * D_FLUE ** 2 / 4.0
PERIM = math.pi * D_FLUE
F_DARCY, K_MINOR = 0.030, 3.0
U_ROOM, U_STACK = 40.0, 5.0 # in-room cast iron / masonry stack [W/m2K]
Z_TOP, Z_BAFFLE = 7.0, 0.80 # chimney exit / baffle top [m]
A_MOUTH, V_SPILL = 0.12, 0.25 # fire opening area [m2] / spillage face velocity [m/s]
def gas_density(T):
return P_ATM / (R_AIR * T)
def march_flue(mdot, h_down, T_fire, n=120):
# walk the rise / descent / chimney legs, collecting per-leg head and total loss
legs = [(Z_BAFFLE, +1.0, U_ROOM),
(h_down, -1.0, U_ROOM),
(Z_TOP - Z_BAFFLE + h_down, +1.0, U_STACK)]
T, loss, heads = T_fire, 0.0, []
rho_a = gas_density(T_AMB)
for L, sgn, U in legs:
head = 0.0
if L > 0.0:
ds = L / n
for _ in range(n):
T_new = T_AMB + (T - T_AMB) * math.exp(-U * PERIM * ds / (mdot * CP))
rho = gas_density(0.5 * (T + T_new))
head += (rho_a - rho) * G * sgn * ds
loss += F_DARCY / D_FLUE * 0.5 * mdot ** 2 / (rho * A_FLUE ** 2) * ds
T = T_new
heads.append(head)
loss += K_MINOR * 0.5 * mdot ** 2 / (gas_density(T) * A_FLUE ** 2)
return heads, loss, T
def solve_mdot(h_down, T_fire, lo=1e-3, hi=0.4, n=100):
# upper (stable) root of head = loss; 0.0 when no root exists
grid = [lo * (hi / lo) ** (i / (n - 1.0)) for i in range(n)]
res = []
for m in grid:
heads, loss, _ = march_flue(m, h_down, T_fire)
res.append(sum(heads) - loss)
k = max(range(n), key=lambda i: res[i])
if res[k] <= 0.0:
return 0.0
a, b = grid[k], grid[-1]
for _ in range(40):
m = 0.5 * (a + b)
heads, loss, _ = march_flue(m, h_down, T_fire)
a, b = (m, b) if sum(heads) - loss > 0.0 else (a, m)
return 0.5 * (a + b)
print("h_down[m] mdot[kg/s] V_exit[m/s] draft[Pa] T_exit[K]")
for i in range(0, 7):
h = 0.2 * i
m = solve_mdot(h, 700.0)
heads, loss, T_e = march_flue(m, h, 700.0)
print(f" {h:4.2f} {m:8.4f} {m / (gas_density(T_e) * A_FLUE):6.2f}"
f" {sum(heads):7.2f} {T_e:7.1f}")
for h in (0.0, 1.0):
m = solve_mdot(h, 700.0)
heads, loss, T_e = march_flue(m, h, 700.0)
print(f"\nbuoyancy ledger h_down = {h:.1f} m, mdot = {m:.4f} kg/s")
for name, val in zip(["rise to baffle", "descent ", "chimney "], heads):
print(f" {name} {val:+7.2f} Pa")
print(f" net {sum(heads):+7.2f} Pa (loss {loss:.2f} Pa)")
mdot_spill = gas_density(T_AMB) * A_MOUTH * V_SPILL
print(f"\nspillage threshold: mdot < {mdot_spill:.4f} kg/s")
for h in (0.0, 1.0):
lo, hi = 290.0, 700.0
for _ in range(30):
mid = 0.5 * (lo + hi)
lo, hi = (mid, hi) if solve_mdot(h, mid) < mdot_spill else (lo, mid)
print(f" h_down = {h:.1f} m -> spills below T_fire = {0.5 * (lo + hi):6.1f} K")h_down[m] mdot[kg/s] V_exit[m/s] draft[Pa] T_exit[K]
0.00 0.0629 5.59 44.72 554.5
0.20 0.0623 5.37 43.48 537.2
0.40 0.0617 5.15 42.16 520.6
0.60 0.0610 4.93 40.76 504.6
0.80 0.0602 4.72 39.29 489.2
1.00 0.0593 4.51 37.72 474.2
1.20 0.0583 4.30 36.05 459.6
buoyancy ledger h_down = 0.0 m, mdot = 0.0629 kg/s
rise to baffle +5.57 Pa
descent +0.00 Pa
chimney +39.15 Pa
net +44.72 Pa (loss 44.72 Pa)
buoyancy ledger h_down = 1.0 m, mdot = 0.0593 kg/s
rise to baffle +5.56 Pa
descent -6.16 Pa
chimney +38.32 Pa
net +37.72 Pa (loss 37.72 Pa)
spillage threshold: mdot < 0.0374 kg/s
h_down = 0.0 m -> spills below T_fire = 335.2 K
h_down = 1.0 m -> spills below T_fire = 377.0 KTwo lines of the ledger tell the whole story. One metre of descent takes Pa directly. And the chimney, now a metre longer, contributes less than before: Pa instead of Pa, because the gas entering it has already cooled further. The two losses sum to 6.99 Pa, matching the 7.00 Pa drop in net draft.
The mouth gives out first — 42 K of margin gone#
Draft falling from 44.7 to 37.7 Pa does not by itself put smoke in the room. The real limit lives at the fire opening. Once the face velocity through that opening drops below roughly 0.25 m/s, hot gas starts leaking out over its top edge. Converted to mass flow, that threshold is 0.0374 kg/s.
The last two output lines translate the threshold into a temperature. With no descent, the stove holds until the fire gas falls to 335 K. With one metre of descent it gives up already at 377 K. Forty-two kelvin of margin has disappeared.
While the fire is roaring, both versions draw fine. The trouble is lighting the fire and letting it die down. That is why the Franklin stove is remembered as the one that smoked. In the 1780s David Rittenhouse removed the descending leg and ran the flue straight up in an L-shaped stovepipe, and that arrangement became the standard.
The neutral plane: the same arithmetic inside one room#
The same hydrostatic argument works in a room with no chimney at all. Different densities inside and out mean different slopes for the two hydrostatic lines, and two straight lines with different slopes meet at exactly one height. That height is the neutral plane .
With two openings of areas at heights , requiring equal mass flow through both gives in closed form.
Below the neutral plane outside air comes in; above it room air leaves. Change the opening heights, the area ratio, and the indoor temperature below.
Enlarge the upper opening and the neutral plane is dragged toward it, because a big hole passes the same flow at a smaller pressure difference. Then drop the indoor temperature below 283 K: the blue line tips the other way and both arrows reverse.
Where this budget gets recorded in a natural-convection solve#
Three things trip people up when this calculation moves into CFD.
First, the reference height of the pressure boundary condition. Slapping totalPressure = 0
on an opening is the same as pinning the neutral plane to that boundary. The outside column's
hydrostatic slope only survives if the condition is posed in dynamic pressure, with
removed. Miss this and the solution converges happily to a flow rate off by a
factor of several.
Second, the validity range of the Boussinesq approximation. The temperature difference above exceeds 200 K, so density varies by more than 50 %. Linearizing as then misprices buoyancy badly. Where that boundary sits is worked out in the point where Boussinesq starts lying at 30 K. A chimney problem belongs in a low-Mach compressible or variable-density formulation.
Third, the steady solution is not unique. The two roots of the loop balance show up directly in the iteration. Start the flow rate near zero and the solver slides down to the lower root and converges to "no draft". This multiplicity is the same structure discussed in natural convection and the Rayleigh number. Initialize near the upper root, or ramp the flow down from an imposed value.
Franklin did succeed at keeping heat in the room. The heat he kept was the budget the chimney intended to spend. When placing a heat exchanger inside a buoyancy-driven loop, it pays to check which column of the ledger the money is coming out of first.
Related
Share if you found it helpful.