# Helium storage and conservation
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/fJsCCqMrI" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Helium_storage_and_conservation.png" alt="Helium_storage_and_conservation 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/fJsCCqMrI">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/fJsCCqMrI
**Description (100 words):**
The sketch lays out the helium storage-and-conservation loop as a [[Block_diagram|block diagram]]. A SUPPLY node on the left fans out to three storage blocks — HP cylinders, a cryogenic liquid dewar, and the Cliffside geological reservoir — each of which feeds an END USE pool on the right. From END USE a green RECOVERY arrow returns eta*Q_use back to supply, while a red VENT arrow carries the remaining (1-eta)*Q_use up and off canvas, dramatizing the permanence of atmospheric escape. Four sliders drive feedstock rate, dewar heat-leak, recovery efficiency, and cylinder pressure; live readouts show annual venting, recycle, daily boiloff, and useful supply. Token [[Density|density]] along every arrow encodes local flow.
```js
// =====================================================================
// Helium_storage_and_conservation.js -- Wikitube microsim
// Article: Helium storage and conservation
// URL: en.wikitube.io/wiki/Helium_storage_and_conservation
// Room: Helium Pattern: G (block diagram, system flow)
// ---------------------------------------------------------------------
// Idea: an interactive block diagram of the global helium storage +
// conservation loop. Helium is the lightest noble gas; once it is
// vented its thermal velocity carries it past Earth's escape velocity
// in the upper exosphere and the loss is permanent. The microsim makes
// that loop visible: a SUPPLY stream feeds three storage regimes
// (high-pressure gas cylinders, cryogenic liquid dewars, and bulk
// geological storage at the Cliffside Bush Dome), each feeds an
// END USE pool, and the END USE pool branches into a RECOVERY loop
// that returns recompressed helium to supply OR a VENT terminal that
// loses it to space forever.
//
// Process loop (read left -> right, with the recovery branch wrapping
// back to SUPPLY):
//
// [SUPPLY]----+---->[HP CYLINDERS]----+
// | |
// +---->[LIQUID DEWAR]----+----->[END USE]----+
// | boiloff |
// +---->[CLIFFSIDE]-------+ |
// |
// [RECOVERY] <----- eta * usage <------+
// | |
// +-- back to SUPPLY +--> [VENT]
// (closes the loop) (1 - eta) * usage
// atmosphere -> space
//
// Canonical mass-balance equations (the physics behind the sketch):
//
// dN_store/dt = Q_supply - Q_use - Q_boiloff
// Q_boiloff = Q_leak / L_v (per dewar)
// Q_recover = eta_recover * Q_use
// Q_vent = (1 - eta_recover) * Q_use (permanent loss)
// Q_supply_eff = Q_supply + Q_recover
//
// Constants:
// L_v(He-4) = 20.7 kJ/kg latent heat of vaporization
// rho_L(He-4) = 124.96 kg/m^3 liquid density at 4.222 K
// M_He = 4.0026 g/mol molar mass
//
// Sliders (the four knobs the reader drives):
// Q_supply [Mcf/d] 1 - 100 primary helium feedstock
// Q_leak [W/dewar] 0.1 - 5.0 cryogenic insulation heat ingress
// eta_recover [-] 0 - 0.99 end-use recovery efficiency
// P_cylinder [bar] 150 - 300 HP-cylinder fill pressure
//
// Visual layout (720 x 520):
// * top: HUD title + en.wikitube.io/wiki/<slug> subtitle
// * upper: SUPPLY block on the left, three storage blocks in a
// vertical stack in the middle, END USE on the right
// --- inventory stocks shown as fill bars inside blocks
// * lower mid: RECOVERY block and VENT terminal, with the recovery
// loop drawn as a curved arrow back to SUPPLY
// --- the VENT arrow points up-and-off-canvas (to space)
// * bottom: four sliders + live readouts (vented/yr, recovered/yr,
// boiloff/d, end-use throughput)
// * bottom-right: canonical equation in ASCII
//
// Conventions (Wikitube Betterfire Standard v0):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true to keep the editor console clean
// * all sliders explicitly .position(x,y).size(w) -- never floating
// * non-ASCII (Greek eta, dot, arrows) lives in COMMENTS ONLY;
// every text() string literal is ASCII
// * Energy-room palette (P5_JS_EDITOR section 4)
//
// References:
// * NIST IR 8474 (helium equation-of-state, latent heat tables)
// * USGS Mineral Commodity Summaries 2025, helium chapter
// * BLM, "Sale of the Federal Helium System completed" (June 2024)
// * Helium Stewardship Act of 2013 (PL 113-40)
// =====================================================================
const ARTICLE = 'Helium_storage_and_conservation';
const TITLE = 'Helium storage and conservation';
p5.disableFriendlyErrors = true;
// ----- Energy room palette (P5_JS_EDITOR section 4) ------------------
const BG = 18;
const FG = 240;
const DIM = [240, 240, 240, 150];
const HOT = [220, 110, 60]; // supply / gas / source
const COLD = [60, 130, 220]; // cryogenic / liquid
const COLDER = [40, 80, 180]; // deeper cold accents
const STRUCT = [120, 130, 150]; // block outlines / piping
const TRAJ = [240, 220, 80]; // primary flow tokens
const GAUGE = [120, 220, 140]; // gauges / end-use accent
const ACCENT = [200, 100, 220]; // geological / Cliffside
const LOSS = [230, 90, 90]; // vent / atmospheric loss
// ----- Physical constants --------------------------------------------
// He-4 latent heat of vaporization (kJ per kg) at saturation.
const L_V = 20.7;
// Liquid He-4 density at 4.222 K, 1 atm (kg/m^3).
const RHO_L = 124.96;
// Mass of one Mcf of He gas at standard conditions (kg).
// 1 Mcf = 28.317 m^3, helium gas density at STP ~ 0.1786 kg/m^3.
const KG_PER_MCF = 28.317 * 0.1786; // ~ 5.057 kg
// ----- Slider state (read once per frame in draw) --------------------
let qSupplySlider; // Q_supply (Mcf/d)
let qLeakSlider; // Q_leak (W per dewar)
let etaSlider; // eta_recover (fraction)
let pCylSlider; // P_cylinder (bar)
// ----- Animated-token state ------------------------------------------
let tickPhase = 0;
// ----- Block geometry (set in setup) ---------------------------------
// Each block is { x, y, w, h, title, sub, accent, stock }.
// "stock" is a 0..1 inventory level used to draw a fill bar inside the
// block; it's animated by a slow integrator so the reader sees stocks
// rise and fall as parameters change.
let supply, hp, dewar, cliff, endUse, recovery, vent;
// Inventory stocks for the three storage regimes (slow filter on the
// instantaneous mass-balance value so the bars don't twitch).
let stockHP = 0.55;
let stockDewar = 0.40;
let stockCliff = 0.70;
// =====================================================================
// setup
// =====================================================================
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
// ----- Block layout --------------------------------------------
// SUPPLY block on the left.
supply = {
x: 24, y: 132, w: 96, h: 64,
title: 'SUPPLY', sub: 'wells + recycle', accent: HOT
};
// Three storage regimes stacked vertically in the middle column.
const midX = 234;
hp = {
x: midX, y: 88, w: 132, h: 50,
title: 'HP CYLINDERS', sub: '150-300 bar', accent: STRUCT
};
dewar = {
x: midX, y: 154, w: 132, h: 50,
title: 'LIQUID DEWAR', sub: '4.22 K, MLI', accent: COLD
};
cliff = {
x: midX, y: 220, w: 132, h: 50,
title: 'CLIFFSIDE', sub: 'Bush Dome res.', accent: ACCENT
};
// END USE block on the right.
endUse = {
x: 488, y: 132, w: 110, h: 64,
title: 'END USE', sub: 'MRI/fab/lift', accent: GAUGE
};
// RECOVERY block below END USE.
recovery = {
x: 380, y: 296, w: 120, h: 48,
title: 'RECOVERY', sub: 'recompression', accent: GAUGE
};
// VENT terminal -- a small "off-canvas" target above END USE that
// visually represents atmospheric escape (helium that leaves end-use
// and rises out of the diagram, eventually exceeding escape velocity).
vent = {
x: 612, y: 60, w: 84, h: 32,
title: 'VENT', sub: 'atm -> space', accent: LOSS
};
// ----- Sliders -------------------------------------------------
// Betterfire rule: every slider gets explicit .position().size().
// Two rows of two sliders along the bottom, mirroring §4 layout.
const sx1 = 24, sx2 = width / 2 + 12;
const sy1 = 410, sy2 = 458;
const SW = 230;
qSupplySlider = createSlider(1, 100, 25, 0.5).position(sx1, sy1).size(SW);
qLeakSlider = createSlider(0.1, 5.0, 1.0, 0.05).position(sx2, sy1).size(SW);
etaSlider = createSlider(0.0, 0.99, 0.85, 0.01).position(sx1, sy2).size(SW);
pCylSlider = createSlider(150, 300, 200, 1).position(sx2, sy2).size(SW);
textAlign(LEFT, TOP);
}
// =====================================================================
// draw
// =====================================================================
function draw() {
background(BG);
// Read all sliders once -- physics is then expressed in named locals.
const qSupply = qSupplySlider.value(); // Mcf/d helium feedstock
const qLeak = qLeakSlider.value(); // W per dewar of heat ingress
const eta = etaSlider.value(); // fraction recovered at end-use
const pCyl = pCylSlider.value(); // bar HP-cylinder pressure
// ----- Per-stream flow allocation ------------------------------
// SUPPLY splits 45/35/20 across HP / Liquid / Geological by default.
// These ratios are illustrative, not policy -- the world helium
// logistics network is dominated by HP cylinders + tube trailers,
// with liquid for cryogenic users and geological for strategic
// reserve.
const fHP = 0.45, fDewar = 0.35, fCliff = 0.20;
const qHP = qSupply * fHP;
const qDewar = qSupply * fDewar;
const qCliff = qSupply * fCliff;
const qToEnd = qHP + qDewar + qCliff; // total flow into END USE
// Boiloff from a single notional dewar (kg/day) = Q_leak (W) / L_v.
// Q_leak is in W (J/s); L_v is in kJ/kg -> 1000 J/kg per kJ/kg.
// Mass loss rate: m_dot (kg/s) = Q_leak / (L_v * 1000)
// Daily loss: 86400 s/day * m_dot
const boiloffKgD = (qLeak / (L_V * 1000)) * 86400;
// Convert kg/day to Mcf/day of equivalent gaseous helium.
const boiloffMcfD = boiloffKgD / KG_PER_MCF;
// ----- Recovery / vent split ------------------------------------
// End-use draws Q_use = qToEnd. A fraction eta is recovered; the
// remainder is vented (permanent atmospheric loss).
const qUse = qToEnd;
const qRecover = eta * qUse;
const qVent = (1 - eta) * qUse;
// Effective supply that ends up doing useful work after the loop:
// useful_supply = Q_supply + Q_recover - boiloff_equivalent
const usefulSupply = qSupply + qRecover - boiloffMcfD;
// Annual aggregates (365 days).
const ventAnnualMcf = qVent * 365; // Mcf/yr lost to space
const recoverAnnualMcf = qRecover * 365; // Mcf/yr recycled
const endUseAnnualMcf = qUse * 365; // Mcf/yr drawn at users
// ----- Slowly evolve the storage stocks --------------------------
// Each storage stock is a 0..1 inventory bar that drifts toward an
// equilibrium set by the inflow vs draw. This is purely a visual
// cue -- the actual mass balance is the steady-state flow above.
const eqHP = constrain(0.30 + fHP * qSupply / 100, 0.05, 0.95);
const eqDewar = constrain(0.20 + fDewar * qSupply / 100 - qLeak / 6, 0.05, 0.95);
const eqCliff = constrain(0.40 + fCliff * qSupply / 100, 0.05, 0.95);
stockHP += (eqHP - stockHP) * 0.02;
stockDewar += (eqDewar - stockDewar) * 0.02;
stockCliff += (eqCliff - stockCliff) * 0.02;
// Token density per arrow segment encodes the local flow rate.
const REF = 20; // "loud" reference flow for normalization
const dHP = constrain(qHP / REF, 0.05, 1.6);
const dDewar = constrain(qDewar / REF, 0.05, 1.6);
const dCliff = constrain(qCliff / REF, 0.05, 1.6);
const dHPout = constrain((qHP + 0.0) / REF, 0.05, 1.6);
const dDewOut = constrain((qDewar + 0.0) / REF, 0.05, 1.6);
const dCliffOut = constrain((qCliff + 0.0) / REF, 0.05, 1.6);
const dRecov = constrain(qRecover / REF, 0.05, 1.6);
const dVent = constrain(qVent / REF, 0.05, 1.6);
// Advance the global animation phase.
tickPhase = (tickPhase + 0.004) % 1;
// ----- Draw block diagram ----------------------------------------
drawSupplyFanout(dHP, dDewar, dCliff);
drawStorageToEndUse(dHPout, dDewOut, dCliffOut);
drawEndUseSplit(dRecov, dVent);
drawRecoveryLoop(dRecov);
// Draw the seven blocks (inventory bars drawn inside storage blocks).
drawBlock(supply, '1');
drawStorageBlock(hp, 'A', stockHP);
drawStorageBlock(dewar, 'B', stockDewar);
drawStorageBlock(cliff, 'C', stockCliff);
drawBlock(endUse, '2');
drawBlock(recovery, '3');
drawBlock(vent, 'X');
// ----- Slider labels + output gauges -----------------------------
drawSliderLabels(qSupply, qLeak, eta, pCyl);
drawGauges(boiloffKgD, ventAnnualMcf, recoverAnnualMcf, usefulSupply);
// ----- HUD + canonical equation ----------------------------------
drawHUD();
}
// =====================================================================
// Block drawing
// =====================================================================
// Generic block: rounded rect with top accent stripe, index badge,
// title and subtitle. Mirrors the styling of Helium_production... so
// the Helium room reads as a coherent family of Pattern G sketches.
function drawBlock(b, idx) {
push();
noStroke();
fill(28);
rect(b.x, b.y, b.w, b.h, 6);
const acc = b.accent || STRUCT;
fill(acc[0], acc[1], acc[2], 220);
rect(b.x, b.y, b.w, 6, 6, 6, 0, 0);
noFill();
stroke(...STRUCT);
strokeWeight(1);
rect(b.x, b.y, b.w, b.h, 6);
noStroke();
fill(...TRAJ);
circle(b.x + 12, b.y + 18, 16);
fill(BG);
textAlign(CENTER, CENTER);
textSize(10);
text(idx, b.x + 12, b.y + 18);
fill(FG);
noStroke();
textAlign(LEFT, TOP);
textSize(11);
text(b.title, b.x + 24, b.y + 12);
fill(...DIM);
textSize(9);
text(b.sub, b.x + 24, b.y + 28);
pop();
}
// Storage block variant: same as drawBlock but with an inventory fill
// bar across the bottom (0..1 stock level). Lets the reader see the
// three reservoirs respond to changes in Q_supply and eta_recover.
function drawStorageBlock(b, idx, stock) {
drawBlock(b, idx);
// Inventory bar -- a thin strip at the bottom interior of the block.
push();
const barX = b.x + 6;
const barY = b.y + b.h - 10;
const barW = b.w - 12;
const barH = 5;
noStroke();
fill(255, 255, 255, 30);
rect(barX, barY, barW, barH, 2);
const acc = b.accent || STRUCT;
fill(acc[0], acc[1], acc[2], 220);
rect(barX, barY, barW * constrain(stock, 0, 1), barH, 2);
// Stock readout (tiny percent label, right side).
fill(...DIM);
textAlign(RIGHT, BOTTOM);
textSize(8);
text((stock * 100).toFixed(0) + ' %', b.x + b.w - 4, b.y + b.h - 12);
pop();
}
// =====================================================================
// Arrow rendering
// =====================================================================
// SUPPLY (left block) fans out to three storage blocks. We draw three
// curved branch lines from supply's right edge to each storage block's
// left edge, with animated tokens whose density encodes local flow.
function drawSupplyFanout(dHP, dDewar, dCliff) {
push();
const x0 = supply.x + supply.w + 2;
const y0 = supply.y + supply.h / 2;
const targets = [
{ y: hp.y + hp.h / 2, x: hp.x - 2, d: dHP, color: STRUCT },
{ y: dewar.y + dewar.h / 2, x: dewar.x - 2, d: dDewar, color: COLD },
{ y: cliff.y + cliff.h / 2, x: cliff.x - 2, d: dCliff, color: ACCENT }
];
for (const t of targets) {
drawBezierArrow(x0, y0, t.x, t.y, t.color);
drawTokensOnBezier(x0, y0, t.x, t.y, t.d, TRAJ);
}
pop();
}
// Three storage blocks merge to a single END USE block on the right.
function drawStorageToEndUse(dHPout, dDewOut, dCliffOut) {
push();
const xe = endUse.x - 2;
const ye = endUse.y + endUse.h / 2;
const sources = [
{ y: hp.y + hp.h / 2, x: hp.x + hp.w + 2, d: dHPout, color: STRUCT },
{ y: dewar.y + dewar.h / 2, x: dewar.x + dewar.w + 2, d: dDewOut, color: COLD },
{ y: cliff.y + cliff.h / 2, x: cliff.x + cliff.w + 2, d: dCliffOut, color: ACCENT }
];
for (const s of sources) {
drawBezierArrow(s.x, s.y, xe, ye, s.color);
drawTokensOnBezier(s.x, s.y, xe, ye, s.d, TRAJ);
}
pop();
}
// END USE splits into RECOVERY (down to recovery block) and VENT (up to
// the vent terminal). The vent arrow is the only red flow in the
// diagram -- it represents permanent atmospheric escape.
function drawEndUseSplit(dRecov, dVent) {
push();
// Recovery arrow: from end-use bottom-center to recovery top.
const rx0 = endUse.x + endUse.w / 2;
const ry0 = endUse.y + endUse.h + 2;
const rx1 = recovery.x + recovery.w / 2;
const ry1 = recovery.y - 2;
stroke(...GAUGE);
strokeWeight(2);
noFill();
line(rx0, ry0, rx1, ry1);
drawArrowhead(rx1, ry1, 8, 90);
drawTokensOnLine(rx0, ry0, rx1, ry1, dRecov, GAUGE);
// Vent arrow: from end-use top-center up to the vent terminal.
const vx0 = endUse.x + endUse.w / 2 + 14;
const vy0 = endUse.y - 2;
const vx1 = vent.x + vent.w / 2;
const vy1 = vent.y + vent.h + 2;
stroke(...LOSS);
strokeWeight(2);
noFill();
line(vx0, vy0, vx1, vy1);
drawArrowhead(vx1, vy1, 8, -90);
drawTokensOnLine(vx0, vy0, vx1, vy1, dVent, LOSS);
pop();
}
// RECOVERY block loops back to SUPPLY via a curved arrow that wraps
// underneath the storage column. Visualizes the closed-loop recycle.
function drawRecoveryLoop(dRecov) {
push();
const sx0 = recovery.x;
const sy0 = recovery.y + recovery.h / 2;
const sx1 = supply.x + supply.w / 2;
const sy1 = supply.y + supply.h + 2;
// Cubic bezier from recovery-left out and around to supply-bottom.
noFill();
stroke(...GAUGE);
strokeWeight(2);
bezier(sx0, sy0,
sx0 - 80, sy0 + 70,
sx1 - 80, sy1 + 60,
sx1, sy1);
drawArrowhead(sx1, sy1, 8, 90);
// Tokens along the curve
const N = Math.max(2, Math.round(dRecov * 10));
noStroke();
for (let k = 0; k < N; k++) {
const f = ((k / N) + tickPhase) % 1;
const p = bezierPoint4(sx0, sx0 - 80, sx1 - 80, sx1, f);
const q = bezierPoint4(sy0, sy0 + 70, sy1 + 60, sy1, f);
const alpha = 220 - 120 * Math.abs(0.5 - f) * 2;
fill(GAUGE[0], GAUGE[1], GAUGE[2], alpha);
circle(p, q, 5);
}
pop();
}
// Helper: draw a gentle quadratic bezier from (x0,y0) to (x1,y1) with
// a control point displaced perpendicularly. Used for fanout arrows.
function drawBezierArrow(x0, y0, x1, y1, col) {
push();
noFill();
stroke(col[0], col[1], col[2], 220);
strokeWeight(2);
const cx = (x0 + x1) / 2;
const cy = (y0 + y1) / 2;
bezier(x0, y0, cx, y0, cx, y1, x1, y1);
drawArrowhead(x1, y1, 8);
pop();
}
// Tokens along a quadratic-style bezier (we approximate with a cubic
// using the duplicated mid-x control to match drawBezierArrow above).
function drawTokensOnBezier(x0, y0, x1, y1, density, col) {
push();
noStroke();
const cx = (x0 + x1) / 2;
const N = Math.max(2, Math.round(density * 10));
for (let k = 0; k < N; k++) {
const f = ((k / N) + tickPhase) % 1;
const p = bezierPoint4(x0, cx, cx, x1, f);
const q = bezierPoint4(y0, y0, y1, y1, f);
const alpha = 220 - 120 * Math.abs(0.5 - f) * 2;
fill(col[0], col[1], col[2], alpha);
circle(p, q, 5);
}
pop();
}
// Tokens along a straight line (used for recovery and vent arrows).
function drawTokensOnLine(x0, y0, x1, y1, density, col) {
push();
noStroke();
const N = Math.max(2, Math.round(density * 10));
for (let k = 0; k < N; k++) {
const f = ((k / N) + tickPhase) % 1;
const px = lerp(x0, x1, f);
const py = lerp(y0, y1, f);
const alpha = 220 - 120 * Math.abs(0.5 - f) * 2;
fill(col[0], col[1], col[2], alpha);
circle(px, py, 5);
}
pop();
}
// Closed-form cubic bezier evaluator (1D) for token placement.
function bezierPoint4(a, b, c, d, t) {
const u = 1 - t;
return u * u * u * a + 3 * u * u * t * b + 3 * u * t * t * c + t * t * t * d;
}
// Small triangle arrowhead at (x, y). theta in degrees from +x axis
// (default 0 = points right; 90 = points down; -90 = points up).
function drawArrowhead(x, y, size, thetaDeg) {
const t = (thetaDeg === undefined) ? 0 : thetaDeg;
push();
translate(x, y);
rotate(radians(t));
noStroke();
fill(...STRUCT);
triangle(0, 0, -size, -size / 2, -size, size / 2);
pop();
}
// =====================================================================
// Slider labels + output gauges
// =====================================================================
function drawSliderLabels(qSupply, qLeak, eta, pCyl) {
push();
noStroke();
// Header row
fill(...DIM);
textSize(10);
textAlign(LEFT, BOTTOM);
text('PARAMETERS', 24, 390);
// Row 1
fill(FG);
textSize(11);
text('Q_supply: ' + qSupply.toFixed(1) + ' Mcf/d', 24, 406);
text('Q_leak: ' + qLeak.toFixed(2) + ' W / dewar', width / 2 + 12, 406);
// Row 2
text('eta_recover: ' + eta.toFixed(2), 24, 454);
text('P_cylinder: ' + pCyl.toFixed(0) + ' bar', width / 2 + 12, 454);
pop();
}
function drawGauges(boiloffKgD, ventAnnual, recoverAnnual, usefulSupply) {
push();
// Two-column gauge readout on the right side of the diagram (between
// the END USE block and the bottom slider rows).
const gx = 488;
const gy = 232;
noStroke();
fill(...DIM);
textAlign(LEFT, TOP);
textSize(10);
text('LIVE OUTPUT', gx, gy);
textSize(11);
fill(...LOSS);
text('vent: ' + formatMcf(ventAnnual) + ' Mcf/yr', gx, gy + 14);
fill(...GAUGE);
text('recov: ' + formatMcf(recoverAnnual) + ' Mcf/yr', gx, gy + 28);
fill(...COLD);
text('boiloff: ' + formatKg(boiloffKgD) + ' kg/d', gx, gy + 42);
fill(...TRAJ);
text('useful: ' + formatMcf(usefulSupply * 365) + ' Mcf/yr', gx, gy + 56);
pop();
}
// =====================================================================
// HUD
// =====================================================================
function drawHUD() {
push();
// Top-left: title + Wikitube URL subtitle (Betterfire Standard v0).
noStroke();
fill(FG);
textAlign(LEFT, TOP);
textSize(20);
text(TITLE, 14, 12);
fill(...DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/' + ARTICLE, 14, 38);
// Top-right: hints
textAlign(RIGHT, TOP);
fill(...DIM);
textSize(10);
text('Q_supply feeds three storage regimes', width - 14, 14);
text('recovery loop returns eta * Q_use', width - 14, 28);
text('vent (red) is permanent atm escape', width - 14, 42);
// Bottom-right: canonical equation (ASCII, Betterfire rule 4).
textAlign(RIGHT, BOTTOM);
fill(FG);
textSize(12);
text('Q_vent = (1 - eta) * Q_use Q_boiloff = Q_leak / L_v',
width - 14, height - 6);
pop();
}
// =====================================================================
// Number formatters (mirrors Helium_production_in_the_United_States)
// =====================================================================
function formatMcf(v) {
if (v >= 1e6) return (v / 1e6).toFixed(2) + 'M';
if (v >= 1e3) return (v / 1e3).toFixed(2) + 'k';
if (v >= 100) return v.toFixed(0);
if (v >= 10) return v.toFixed(1);
return v.toFixed(2);
}
function formatKg(v) {
if (v >= 1000) return (v / 1000).toFixed(2) + ' t';
if (v >= 10) return v.toFixed(1);
if (v >= 1) return v.toFixed(2);
return v.toFixed(3);
}
// =====================================================================
// End of Helium_storage_and_conservation.js
// Wikitube microsim, Helium room, Pattern G (block diagram)
// =====================================================================
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Helium_storage_and_conservation.json (2026-07-30T02:09:12Z) -->
`Aerospace` · `Amarillo,_Texas` · `American_Chemical_Society` · `American_Physical_Society` · `Barrage_balloon` · `Bureau_of_Land_Management` · [[Helium]] · `Helium_Act_of_1925` · `Helium_Privatization_Act_of_1996` · `Hindenburg_disaster` · [[Magnetic_resonance_imaging]] · `Materials_Research_Society` · `Membrane_technology` · [[National_Helium_Reserve]] · `National_Science_Foundation` · [[Natural_gas]] · `Nazi_Germany` · `Office_of_Science` · `Saturation_diving` · `Underwater_diving` · `United_States_Bureau_of_Mines` · `United_States_Department_of_Defense` · `United_States_Department_of_Energy` · `Venture_capital`
## From the vault media library
!Helium storage and conservation thumb.png
*Helium Storage And Conservation — 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
Helium storage and conservation comprises the [[Engineering|engineering]] and policy practices that retain helium-4 between extraction and end use. Because helium is the lightest [[Noble_gas|noble gas]] and the second-lightest element, any released volume escapes the atmosphere irreversibly: its thermal [[Velocity|velocity]] exceeds [[Earth]]'s gravitational escape velocity in the upper exosphere, so vented helium is a permanent loss to the planetary inventory. Storage uses three regimes: high-pressure gaseous helium in DOT-3AA cylinders, tube trailers, and ISO containers at 150 to 250 bar; cryogenic [[Liquid_helium|liquid helium]] at 4.222 K in vacuum-jacketed dewars and transport trailers with multilayer insulation; and bulk geological storage in porous-sandstone reservoirs, historically the Bush Dome formation at Cliffside, Texas, which supplied the U.S. [[National_Helium_Reserve|National Helium Reserve]] from 1962 until the Bureau of Land Management's 2024 sale of the federal helium [[System|system]]. Boiloff in cryogenic vessels follows Q = m·L, where heat [[Leak|leak]] Q drives mass loss at the rate of vaporization L = 20.7 kJ/kg, so dewar lifetime scales inversely with insulation performance. Conservation measures include closed-loop helium recovery and reliquefaction at MRI, NMR, and accelerator facilities; pressure-swing and membrane recapture in welding, leak-testing, and fiber-draw applications; cryogen-free magnet substitution; and lifecycle stewardship under the Helium Stewardship Act of 2013 (Pub. L. 113-40). Recovery efficiency in modern superconducting-magnet installations exceeds 95 percent, transforming what was once a single-pass consumable into a renewable working fluid bounded only by recompression losses.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 85 of the Helium sheet on 2026-05-12T09:03:16Z.*
<!-- 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/Helium_storage_and_conservation) : [Wikitube](https://en.wikitube.io/wiki/Helium_storage_and_conservation)
## Previous hub tags
Tree parent: [[Helium]].
Legacy hubs: none.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*