# Lifting gas <!-- MICROSIMGEN:BEGIN v1.7 — generated by g08_place_microsims.py; three.js first (§15); do not hand-edit inside --> ## Microsims — three.js ### Lifting gas (three.js) <div class="microsim-player"> <iframe src="https://wikitube-3d-microsims.netlify.app/Lifting_gas.html" width="100%" height="620" frameborder="0" loading="lazy" sandbox="allow-scripts allow-same-origin" title="Lifting gas — three.js microsim"></iframe> </div> **Open it full-screen:** [Lifting_gas.html](https://wikitube-3d-microsims.netlify.app/Lifting_gas.html) · library `threejs` · route `microsim/threejs/` ### Related microsims Live sims on neighbouring articles: - [[Alpha_particle]] - [[Half-life]] - [[Noble_gas]] - [[Nuclear_magnetic_resonance]] *Sim hosted off-article; the article owns the reference, not the runtime (WIKI_RULES §10.4). Placed by `g08_place_microsims.py`.* <!-- MICROSIMGEN:END --> ## Microsim ### Live player <div class="microsim-player"> <iframe src="https://editor.p5js.org/sciencenibber/full/vYxugfF1s" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe> </div> <div class="microsim-fallback"> <img src="Microsims/thumbs/Lifting_gas.png" alt="Lifting_gas microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;"> <p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/vYxugfF1s">open sketch in the p5.js editor</a></em></p> </div> **Editor URL:** https://editor.p5js.org/sciencenibber/sketches/vYxugfF1s **Description (100 words):** A balloon whose envelope rescales in real time as the reader picks a lifting gas, a payload, and an altitude. Five gases (hydrogen, helium, hot air, methane, ammonia) sit on the leftmost slider; a hot-air temperature slider activates only for that selection; altitude runs 0-30 km under a U.S. Standard Atmosphere fit. The envelope is drawn against a dashed helium-at-sea-level outline for the same payload so the geometric scaling V = payload / (rho_air - rho_gas) is visible in pixels. A side panel reports densities, required volume, envelope diameter, total lift, and a status badge; a green buoyancy arrow and orange weight arrow flank the balloon. ```js // ===================================================================== // Lifting_gas.js -- Wikitube microsim // Article: Lifting_gas en.wikitube.io/wiki/Lifting_gas // Room: Helium Pattern: Crossover with Geometry (8) // topological / spatial vis // --------------------------------------------------------------------- // Idea: a payload-floating balloon whose envelope diameter rescales // in real time as the reader picks a lifting gas, an altitude, and a // payload mass. The on-screen balloon is drawn at the correct relative // volume against a sea-level helium reference outline; force vectors // show buoyancy vs. weight; a side panel reports lift-per-cubic-meter // and the canonical buoyancy-volume scaling law. // // The canonical relation behind every readout on this sketch is // Archimedes' principle applied to a finite envelope of lift gas: // // F_buoyant = (rho_air - rho_gas) * V * g // V = payload / (rho_air - rho_gas) (neutral float) // // Air density falls with altitude under the U.S. Standard Atmosphere. // Here we use the troposphere fit (valid 0-11 km) plus a stratosphere // exponential patch out to 30 km: // // T(h) = T_0 - L * h (L = 0.0065 K/m, T_0 = 288.15 K) // P(h) = P_0 * (T(h)/T_0)^(g * M_air / (R * L)) // rho(h) = P(h) * M_air / (R * T(h)) // // For a zero-pressure (open) balloon the lift gas matches ambient // pressure, so rho_gas(h) = rho_air(h) * M_gas / M_air. Lift per // cubic meter therefore falls linearly with rho_air as the reader // climbs -- at 60,000 ft (18 km) it is roughly 14% of sea level. // // Gases on offer (5 selectable): // * Hydrogen M = 2.016 g/mol highest lift, flammable (Hindenburg) // * Helium M = 4.003 g/mol canonical civil-aerostat standard // * Hot air M_eff varies w/ T Montgolfier cycle, heater-driven // * Methane M = 16.04 g/mol coal-gas era novelty, flammable // * Ammonia M = 17.03 g/mol Charles tested, toxic, historical // // Visual layout (720 x 520 canvas): // * top-left: HUD title + en.wikitube.io/wiki/Lifting_gas subtitle // * top-right: three-line control hint // * left half: the balloon, drawn as an ellipse whose diameter // D = 2 * (3V / 4pi)^(1/3) scaled to canvas pixels // via a log map so 2 m and 200 m are both legible; // upward green buoyancy arrow + downward orange weight // arrow; dashed grey outline = helium-at-sea-level // reference for the same payload // * right side: numeric readouts (lift kg/m^3, required volume, // envelope diameter, total lift, payload, float state) // * altitude bar at the far right: 0-30 km strip with marker // * bottom: four sliders (gas, hot-air T, altitude, payload) // with ASCII labels + canonical equation // // Conventions (Wikitube Betterfire Standard v0): // * single ARTICLE constant at the top, single quotes // * p5.disableFriendlyErrors = true to keep the editor console clean // * non-ASCII (rho, pi, lambda) lives in COMMENTS ONLY; every // text() string literal is ASCII (the editor preview pipeline // sometimes mangles non-ASCII in strings) // * Energy-room palette (P5_JS_EDITOR section 4): dark BG with // HOT (warm gas / weight), COLD (lift up), STRUCT grey, TRAJ // accent, GAUGE green for buoyancy // ===================================================================== const ARTICLE = 'Lifting_gas'; const TITLE = ARTICLE.replace(/_/g, ' '); p5.disableFriendlyErrors = true; // ----- Energy room palette (P5_JS_EDITOR section 4, line 165) -------- const BG = 18; const FG = 240; const DIM = [240, 240, 240, 150]; const HOT = [220, 110, 60]; // weight arrow, warm gas tint const COLD = [60, 130, 220]; // altitude axis, hydrogen tint const STRUCT = [120, 130, 150]; // outlines, structural grey const TRAJ = [240, 220, 80]; // selected gas highlight const GAUGE = [120, 220, 140]; // buoyancy arrow, "rising" const SCRATCH = [140, 140, 140, 110]; // dashed reference outline // ----- Physical constants -------------------------------------------- const G_ACC = 9.80665; // m/s^2 const R_GAS = 8.314462; // J/(mol*K), universal gas constant const M_AIR = 28.9647; // g/mol, dry-air mean molar mass const P_0_KPA = 101.325; // kPa, sea level const T_0_K = 288.15; // K, ISA sea level const L_LAPSE = 0.0065; // K/m, troposphere lapse rate const RHO_0_AIR = 1.2250; // kg/m^3, ISA sea-level dry-air density // ----- Gas catalog --------------------------------------------------- // Hot air is a special case. We treat it as air with reduced density // via rho_hot = rho_amb * (T_amb / T_hot), equivalent to an effective // molar mass M_eff = M_AIR * T_amb / T_hot. const GASES = [ { name: 'Hydrogen', symbol: 'H2', M: 2.016, color: [200, 220, 255] }, { name: 'Helium', symbol: 'He', M: 4.003, color: [180, 220, 240] }, { name: 'Hot air', symbol: 'air', M: 28.9647, color: [240, 180, 100] }, { name: 'Methane', symbol: 'CH4', M: 16.04, color: [150, 220, 180] }, { name: 'Ammonia', symbol: 'NH3', M: 17.03, color: [220, 200, 140] } ]; // ----- Canvas / slider constants ------------------------------------- const W = 720; const H_CANV = 520; const ALT_MAX_M = 30000; // altitude slider top (30 km) const PAYLOAD_MIN = 10; // kg const PAYLOAD_MAX = 10000; // kg const HOT_T_MIN = 350; // K, just above ambient const HOT_T_MAX = 600; // K, propane-burner upper bound // ----- UI element refs (assigned in setup) --------------------------- let gasSlider, hotTSlider, altSlider, payloadSlider; // ===================================================================== // setup() // ===================================================================== function setup() { createCanvas(W, H_CANV); pixelDensity(2); textFont('system-ui'); // ----- Slider row at the bottom of the canvas ---------------------- // Each slider is positioned in pixels relative to the page; the // canvas sits at (0,0) so these land inside the canvas footprint. // Layout: y = 470 for the slider row, labels drawn at y = 448. gasSlider = createSlider(0, GASES.length - 1, 1, 1) .position(20, 470).size(110); // default: Helium hotTSlider = createSlider(HOT_T_MIN, HOT_T_MAX, 450, 5) .position(160, 470).size(110); // K altSlider = createSlider(0, ALT_MAX_M, 0, 50) .position(300, 470).size(160); // m payloadSlider = createSlider(PAYLOAD_MIN, PAYLOAD_MAX, 250, 10) .position(490, 470).size(200); // kg } // ===================================================================== // ISA atmosphere model. // * troposphere (0-11 km): linear lapse + power-law pressure // * stratosphere patch (11-30 km): isothermal exponential // ===================================================================== function airDensityKgM3(h_m) { if (h_m <= 11000) { return tropoDensity(h_m); } // Stratosphere isothermal patch at T ~ 216.65 K, scale H ~ 6340 m. const rho11 = tropoDensity(11000); return rho11 * exp(-(h_m - 11000) / 6340.0); } function tropoDensity(h_m) { const T = T_0_K - L_LAPSE * h_m; const expo = (G_ACC * (M_AIR / 1000.0)) / (R_GAS * L_LAPSE); const P_kpa = P_0_KPA * pow(T / T_0_K, expo); // P (Pa) * M (kg/mol) / (R * T) = rho in kg/m^3 return (P_kpa * 1000.0 * (M_AIR / 1000.0)) / (R_GAS * T); } // Ambient temperature at altitude (K), with the same stratosphere patch. function ambientTemperatureK(h_m) { if (h_m <= 11000) return T_0_K - L_LAPSE * h_m; return 216.65; } // Lift-gas density at altitude. Zero-pressure balloon assumption: // gas pressure equals ambient, so rho_gas = rho_air * M_gas / M_air, // except hot air whose density is rho_air(h) * T_amb(h) / T_hot. function gasDensityKgM3(gasIdx, h_m, T_hot) { const gas = GASES[gasIdx]; const rhoAir = airDensityKgM3(h_m); if (gas.symbol === 'air') { const Tamb = ambientTemperatureK(h_m); return rhoAir * (Tamb / T_hot); } return rhoAir * (gas.M / M_AIR); } // ===================================================================== // draw() // ===================================================================== function draw() { background(BG); // ----- Read controls into named locals ----------------------------- const gasIdx = constrain(int(gasSlider.value()), 0, GASES.length - 1); const T_hot = hotTSlider.value(); const alt_m = altSlider.value(); const payload = payloadSlider.value(); // ----- Physics ----------------------------------------------------- const rhoAir = airDensityKgM3(alt_m); const rhoGas = gasDensityKgM3(gasIdx, alt_m, T_hot); const liftPerM3 = rhoAir - rhoGas; // kg/m^3 const V_required = (liftPerM3 > 0) ? (payload / liftPerM3) : -1; const D_required = (V_required > 0) ? (2 * pow(3 * V_required / (4 * PI), 1 / 3)) : -1; const totalLift = (V_required > 0) ? (liftPerM3 * V_required) : 0; // Reference: helium at sea level lifting the same payload. const liftRef = RHO_0_AIR * (1 - 4.003 / M_AIR); const V_ref = payload / liftRef; const D_ref = 2 * pow(3 * V_ref / (4 * PI), 1 / 3); // ----- Compose ----------------------------------------------------- drawBalloonRegion(40, 60, 380, 360, V_required, D_required, D_ref, GASES[gasIdx], liftPerM3); drawReadouts(440, 60, 230, 250, gasIdx, rhoAir, rhoGas, liftPerM3, V_required, D_required, payload, totalLift); drawAltitudeBar(685, 60, 18, 360, alt_m); drawControlLabels(gasIdx, T_hot, alt_m, payload); drawHUD(); } // ===================================================================== // Balloon region. // // The spatial heart of the microsim: the envelope is rendered at the // correct relative size against a dashed helium-at-sea-level reference // outline so the reader sees the scaling law in pixels. // // Pixel-from-diameter mapping uses a log scale so 2 m (small weather // balloon) and 200 m (large airship) both fit legibly in the region. // ===================================================================== function drawBalloonRegion(x0, y0, w, h, V, D, D_ref, gas, liftPerM3) { push(); translate(x0, y0); noFill(); stroke(...STRUCT, 70); strokeWeight(1); rect(0, 0, w, h); const cx = w / 2; const cy = h / 2 - 10; // ---- Log-pixel scaling ------------------------------------------- const maxPx = min(w, h) * 0.40; const minPx = 6; const D_disp = (D > 0) ? D : 0; const D_for_scale = max(D_disp, D_ref, 1); const logMin = log(0.5); const logMax = log(D_for_scale * 1.2); const px = (Dm) => { if (Dm <= 0) return 0; const lg = log(max(Dm, 0.1)); return map(lg, logMin, logMax, minPx, maxPx); }; // ---- Dashed reference outline (helium at sea level, same payload) - const rRef = px(D_ref) / 2; noFill(); stroke(...SCRATCH); strokeWeight(1); drawDashedEllipse(cx, cy, rRef * 2, rRef * 2.05, 64); noStroke(); fill(...DIM); textSize(10); textAlign(CENTER, BOTTOM); text('He at sea level (same payload)', cx, cy - rRef - 6); // ---- Actual balloon ---------------------------------------------- if (liftPerM3 > 0 && D > 0) { const r = px(D) / 2; // Filled body noStroke(); fill(gas.color[0], gas.color[1], gas.color[2], 95); ellipse(cx, cy, r * 2, r * 2.05); // Edge stroke stroke(gas.color[0], gas.color[1], gas.color[2]); strokeWeight(2); noFill(); ellipse(cx, cy, r * 2, r * 2.05); // Tethered payload basket const basketY = cy + r * 1.05 + 10; noStroke(); fill(...STRUCT); rect(cx - 14, basketY, 28, 14, 2); stroke(...STRUCT, 200); strokeWeight(1); line(cx - r * 0.45, cy + r * 1.00, cx - 12, basketY); line(cx + r * 0.45, cy + r * 1.00, cx + 12, basketY); // Force arrows (anchor to the side of the envelope) const ax = cx + r + 22; const ay = cy; drawArrow(ax, ay, 0, -36, GAUGE); // buoyancy up drawArrow(ax, ay, 0, 36, HOT); // weight down noStroke(); textSize(11); textAlign(LEFT, CENTER); fill(...GAUGE); text('buoyancy', ax + 8, ay - 26); fill(...HOT); text('weight', ax + 8, ay + 26); } else { // No-lift case: gas denser than air. noStroke(); fill(...HOT, 200); textSize(13); textAlign(CENTER, CENTER); text('no lift: gas denser than air', cx, cy); } // ---- Ground line + envelope readout ------------------------------- stroke(...STRUCT, 130); strokeWeight(1); line(20, h - 30, w - 20, h - 30); for (let gx = 30; gx < w - 20; gx += 24) { line(gx, h - 30, gx - 6, h - 22); } noStroke(); fill(...DIM); textSize(10); textAlign(LEFT, TOP); text('ground', 22, h - 22); textAlign(RIGHT, TOP); const dTxt = (D > 0) ? (nf(D, 1, 2) + ' m envelope diameter') : 'envelope: undefined'; text(dTxt, w - 22, h - 22); pop(); } // ===================================================================== // Dashed-ellipse helper. Walks the unit circle in `segs` steps and // draws every other segment as a chord -- cheap and good-looking. // ===================================================================== function drawDashedEllipse(cx, cy, w, h, segs) { for (let i = 0; i < segs; i++) { if ((i % 2) === 0) { const a0 = (i / segs) * TWO_PI; const a1 = ((i + 1) / segs) * TWO_PI; const x0 = cx + (w / 2) * cos(a0); const y0 = cy + (h / 2) * sin(a0); const x1 = cx + (w / 2) * cos(a1); const y1 = cy + (h / 2) * sin(a1); line(x0, y0, x1, y1); } } } // ===================================================================== // Arrow helper (line + filled triangle head). // ===================================================================== function drawArrow(x, y, dx, dy, col) { push(); stroke(col[0], col[1], col[2]); strokeWeight(2); line(x, y, x + dx, y + dy); const ang = atan2(dy, dx); const headLen = 8; noStroke(); fill(col[0], col[1], col[2]); triangle( x + dx, y + dy, x + dx - headLen * cos(ang - 0.4), y + dy - headLen * sin(ang - 0.4), x + dx - headLen * cos(ang + 0.4), y + dy - headLen * sin(ang + 0.4) ); pop(); } // ===================================================================== // Right-panel readouts: gas identity, densities, volume, diameter, // float status badge. // ===================================================================== function drawReadouts(x0, y0, w, h, gasIdx, rhoAir, rhoGas, liftPerM3, V, D, payload, totalLift) { push(); translate(x0, y0); noFill(); stroke(...STRUCT, 70); rect(0, 0, w, h); // Heading: gas name + symbol noStroke(); fill(...TRAJ); textSize(14); textAlign(LEFT, TOP); text(GASES[gasIdx].name + ' (' + GASES[gasIdx].symbol + ')', 12, 10); // Body rows const rows = [ ['M_gas (g/mol)', nf(GASES[gasIdx].M, 1, 3)], ['rho_air (kg/m^3)', nf(rhoAir, 1, 4)], ['rho_gas (kg/m^3)', nf(rhoGas, 1, 4)], ['lift / m^3 (kg)', nf(liftPerM3, 1, 4)], ['payload (kg)', nf(payload, 1, 1)], ['required V (m^3)', (V > 0) ? nf(V, 1, 1) : 'n/a'], ['envelope D (m)', (D > 0) ? nf(D, 1, 2) : 'n/a'], ['total lift (kg)', nf(totalLift, 1, 1)] ]; textSize(11); for (let i = 0; i < rows.length; i++) { const ly = 36 + i * 18; noStroke(); fill(...DIM); textAlign(LEFT, TOP); text(rows[i][0], 12, ly); fill(FG); textAlign(RIGHT, TOP); text(rows[i][1], w - 12, ly); } // Status badge const badgeY = 36 + rows.length * 18 + 10; let status, col; if (liftPerM3 <= 0) { status = 'no net lift (sinker)'; col = HOT; } else if (liftPerM3 > 1.0) { status = 'strong lift (H2 class)'; col = GAUGE; } else if (liftPerM3 > 0.4) { status = 'good lift'; col = GAUGE; } else { status = 'sluggish lift'; col = TRAJ; } noStroke(); fill(col[0], col[1], col[2], 55); rect(12, badgeY, w - 24, 22, 4); fill(col[0], col[1], col[2]); textAlign(CENTER, CENTER); textSize(12); text(status, w / 2, badgeY + 11); pop(); } // ===================================================================== // Altitude bar on the right edge: 0-30 km gradient with tick marks // every 5 km and a yellow marker at the current altitude. // ===================================================================== function drawAltitudeBar(x0, y0, w, h, alt_m) { push(); translate(x0, y0); // Body outline noFill(); stroke(...STRUCT, 70); rect(0, 0, w, h); // Vertical gradient: cool blue on top, warm at sea level for (let i = 0; i < h; i++) { const t = i / h; const c = lerpColor(color(60, 130, 220, 90), color(240, 220, 80, 30), t); stroke(c); line(1, h - i, w - 1, h - i); } // Tick marks every 5 km noStroke(); textSize(9); textAlign(RIGHT, CENTER); for (let km = 0; km <= 30; km += 5) { const y = map(km * 1000, 0, ALT_MAX_M, h, 0); stroke(...STRUCT, 140); strokeWeight(1); line(0, y, 4, y); noStroke(); fill(...DIM); text(km + 'km', -4, y); } // Current-altitude marker const ym = map(alt_m, 0, ALT_MAX_M, h, 0); stroke(...TRAJ); strokeWeight(2); line(-4, ym, w + 4, ym); noStroke(); fill(...TRAJ); textAlign(LEFT, CENTER); textSize(10); text(nf(alt_m / 1000, 1, 1) + 'km', w + 6, ym); pop(); } // ===================================================================== // Bottom-strip labels above each slider. Each shows the slider name // and live value; the hot-air T label dims when the gas is not air. // ===================================================================== function drawControlLabels(gasIdx, T_hot, alt_m, payload) { push(); noStroke(); textSize(10); textAlign(LEFT, TOP); const labelY = 448; const valY = 498; // gas fill(...DIM); text('gas', 20, labelY); fill(...TRAJ); textSize(11); text(GASES[gasIdx].symbol, 20, valY); textSize(10); // hot-air T fill(...DIM); text('hot-air T (K)', 160, labelY); if (GASES[gasIdx].symbol === 'air') fill(...HOT); else fill(...DIM); textSize(11); text(nf(T_hot, 1, 0) + 'K', 160, valY); textSize(10); // altitude fill(...DIM); text('altitude', 300, labelY); fill(...COLD); textSize(11); text(nf(alt_m / 1000, 1, 1) + 'km', 300, valY); textSize(10); // payload fill(...DIM); text('payload', 490, labelY); fill(...GAUGE); textSize(11); text(nf(payload, 1, 0) + 'kg', 490, valY); pop(); } // ===================================================================== // HUD: title (22pt bright) + Wikitube subtitle (12pt dim) at top-left, // control hint top-right, canonical equation bottom-right. // ===================================================================== function drawHUD() { push(); noStroke(); // Background panel for the title (top-left) fill(0, 180); rect(8, 8, 470, 44); // Title (22pt) fill(FG); textSize(22); textAlign(LEFT, TOP); text(TITLE, 14, 14); // Subtitle (12pt, ASCII dot) fill(...DIM); textSize(12); text('Wikitube microsim . en.wikitube.io/wiki/' + ARTICLE, 14, 38); // Top-right control hint textAlign(RIGHT, TOP); fill(...DIM); textSize(11); text('drag the four sliders below', W - 14, 14); text('to scale the balloon envelope', W - 14, 28); // Bottom-right canonical equation textAlign(RIGHT, BOTTOM); fill(...DIM); textSize(11); text('V = payload / (rho_air - rho_gas) F = (rho_air - rho_gas) * V * g', W - 14, H_CANV - 6); pop(); } ``` ## Links (Wikipedia order) <!-- injected from _registry/childlinks/Lifting_gas.json (2026-07-30T02:09:12Z) --> `Acetylene` · `Aerobot` · `Aerogel` · `Aerostat` · `Agar` · `Airship` · [[Alpha_decay]] · `Ammonia` · [[Balloon]] · `Bathyscaphe` · `Blau_gas` · `Buoyancy` · `Buoyancy_compensator_(aviation)` · `Carbon_monoxide` · `Coal_gas` · [[Density]] · `Diatomic_molecule` · `Diborane` · `Diving_cylinder` · `Electrolysis` · `Ethylene` · `Francesco_Lana_de_Terzi` · `Gravitational_acceleration` · `Greenhouse_gas` · [[Helium]] · `Hindenburg_disaster` · `Hot_air_balloon` · [[Hydrogen]] · `Hydrogen_cyanide` · `Hydrogen_fluoride` · `Hydrogen_safety` · `Ideal_gas_law` · [[Inert_gas]] · `Lifting_bag` · `Marine_salvage` · [[Mars]] · `Methane` · `Molar_mass` · `Molecular_diffusion` · [[Moon]] · `Mylar` · [[Natural_gas]] · [[Neon]] · `Newton_(unit)` · [[Nitrogen]] · `Non-renewable_resource` · `Pyrophoricity` · `Saturn` · [[Silicon]] · `Sponge` · `Steam` · [[Stratosphere]] · [[Submarine]] · `Titan_(moon)` · `Titan_Saturn_System_Mission` · `Underwater_archaeology` · `Underwater_diving` · `Vacuum` · `Vacuum_airship` · `Vega_program` · [[Venus]] · `Water–gas_shift_reaction` ## From the vault media library !Lifting gas thumb.png *Lifting Gas — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.* <!-- LOCAL-MEDIA-PASS:END --> > **Room:** [[Helium]] · **Status:** ✅ shipped ## Overview A **lifting gas** is any gas with a [[Density|density]] lower than the surrounding air, so that a volume of it displaces a greater mass of atmosphere and experiences a net upward buoyant [[Force|force]] according to Archimedes' principle. The available lift per unit volume is `(ρ_air − ρ_gas) × g`, which at standard sea-level conditions (15 °C, 101.325 kPa, ρ_air ≈ 1.225 kg/m³) yields the canonical aerostat constants of **1.02 kg/m³ for pure helium** and **1.10 kg/m³ for pure hydrogen**, with hot air at typical operating temperatures delivering only **0.3–0.4 kg/m³**. Because envelope volume scales as `V ∝ payload / (ρ_air − ρ_gas)`, the choice of lifting gas directly governs the size, cost, and weather sensitivity of every lighter-than-air vehicle. The history begins with the Montgolfier hot-air [[Balloon|balloon]] and Jacques Charles' hydrogen balloon of 1783, runs through coal gas, ammonia, and methane in the 19th century, and pivots in May 1937 when the *Hindenburg* fire ended civil use of hydrogen and made helium the only certifiable lift gas for manned U.S. aerostats under 14 CFR Part 31. Lift falls steeply with altitude — at 60,000 ft (18 km) only about 14% of sea-level value remains — and envelope permeation drives a 0.5–2% daily make-up demand on stratospheric balloons. Modern applications span NWS radiosonde launches (~73,000 per year), NASA's Columbia Scientific Balloon Facility, DARPA HAPS persistent-surveillance airships, TARS and JLENS tethered aerostats, advertising blimps, and the festive children's balloon. ## See also - Room hub: [[Helium]] - p5.js Editor conventions: P5 JS EDITOR - Wiki root: MAIN --- *Scaffolded by `generative-microsim` from row 126 of the Helium sheet on 2026-05-14T12:25:39Z.* <!-- LOCAL-MEDIA-PASS:START --> <!-- CRAFT-LINK:START g12 --> *Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].* <!-- CRAFT-LINK:END --> ## Wikipedia : Wikitube **Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Lifting_gas) : [Wikitube](https://en.wikitube.io/wiki/Lifting_gas) ## Previous hub tags Tree parents: [[Helium]] · [[Hydrogen]]. Legacy hubs: none. --- *Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*