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