# 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).*