# National Helium Reserve
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/eP33YAPM0" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/National_Helium_Reserve.png" alt="National_Helium_Reserve 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/eP33YAPM0">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/eP33YAPM0
**Description (100 words):**
A live [[Block_diagram|block diagram]] of the Federal Helium System rendered as a six-stage process chain: Hugoton-Panhandle source, field separation, the 425-mile Federal Helium Pipeline, the Cliffside Bush Dome storage reservoir, the Amarillo enrichment plant, and downstream refiners. Animated green tokens slide along the upstream arrows as crude helium; yellow tokens drain the storage tank as refined Grade-A product. A tall Bush Dome gauge fills and drains under the stock-and-flow equation dS/dt = Q_in - Q_out, driven by two sliders for extraction and demand. A third slider toggles privatization, recoloring the four federal stations from BLM blue to Messer amber.
```js
// =====================================================================
// National_Helium_Reserve.js -- Wikitube microsim
// Article: National_Helium_Reserve
// en.wikitube.io/wiki/National_Helium_Reserve
// Room: Helium Pattern: G (block diagram /
// system flow /
// process chain)
// ---------------------------------------------------------------------
// Idea: render the Federal Helium System as the physical process chain
// that it actually is. Six labeled stations, arrows between them, a
// central inventory tank for the Cliffside (Bush Dome) reservoir, and
// three sliders so the reader can drive the system.
//
// Source Separation Pipeline Cliffside Amarillo Distribution
// Hugoton --> plants --> 425 mi --> storage --> enrich. --> refiners
// Panhandle strip CO2/ pipeline Bush Dome crude --> Grade-A MRI / semi /
// natural gas H2O / HC reservoir 99.997% He rockets / weld
// (0.3 - 1.9 % ~ 32 BCF
// He by vol.) peak
//
// The animated "tokens" sliding along the arrows are crude-helium flow.
// A green token = crude He moving in; a yellow token = refined He
// moving out to private refiners; a red token = vented / lost.
//
// Cliffside is the only stage with state -- a stock tank that responds
// to the difference between inflow and outflow. The stock equation is
// literally
//
// dS/dt = Q_in - Q_out (stock-and-flow first principle)
//
// shown at the bottom-right of the canvas in ASCII.
//
// The "privatization completed" toggle (PL 104-273 / PL 113-40 / GSA
// June 10, 2024 sale to Messer LLC for $423.35M) recolors the
// ownership boxes from federal blue (BLM / GSA / Treasury) to private
// amber (Messer LLC / Federal Helium System assets transferred to
// private operator). Same physical chain, different operator.
//
// Visual layout (720 x 520 canvas):
// * top-left: HUD title (TITLE 22pt) + URL subtitle (12pt dim)
// * top-right: control hints
// * center: block-diagram process chain, six stations laid out
// in two rows of three, arrows in between, animated
// tokens sliding along each arrow at flow-rate speed
// * left-center: Cliffside inventory bar (tank) -- big visual gauge
// that fills/drains in response to inflow vs outflow
// * bottom: three sliders (Hugoton extraction, refiner demand,
// privatization toggle as 0/1 slider) and the
// canonical stock equation at the bottom-right
//
// Conventions (Wikitube Betterfire Standard v0):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true to keep editor console clean
// * non-ASCII (Greek mu, dot-bullet, en-dash, arrows) lives in
// COMMENTS ONLY; every text() string literal is ASCII
// * Energy-room palette (P5_JS_EDITOR section 4): dark BG, HOT/COLD
// tones, STRUCT grey, TRAJ accent; federal blue for govt stations,
// Messer amber for private stations after the toggle
// * every createSlider call has .position(x, y).size(w)
// =====================================================================
const ARTICLE = 'National_Helium_Reserve';
const TITLE = ARTICLE.replace(/_/g, ' ');
p5.disableFriendlyErrors = true;
// ----- Energy room palette (P5_JS_EDITOR section 4) ------------------
const BG = 18;
const FG = 240;
const DIM = [240, 240, 240, 140];
const HOT = [220, 110, 60]; // warm orange (extraction)
const COLD = [60, 130, 220]; // cool blue (refined helium)
const STRUCT = [120, 130, 150]; // structural grey (boxes)
const TRAJ = [240, 220, 80]; // yellow tokens (refined flow)
const SCRATCH = [120, 120, 120, 90]; // dim grid / scratch
// Govt-vs-private station colors (privatization toggle drives this)
const GOVT_FILL = [30, 60, 110]; // federal blue (BLM / GSA / Treasury)
const GOVT_STROKE = [90, 150, 230];
const PRIV_FILL = [110, 60, 20]; // Messer amber (post-2024)
const PRIV_STROKE = [230, 160, 90];
// Token colors
const TOK_CRUDE = [120, 220, 140]; // green: crude He moving in
const TOK_REFINED = TRAJ; // yellow: refined He moving out
const TOK_VENT = [220, 100, 100]; // red: vented / lost
// Cliffside inventory (BCF, billion cubic feet)
const STOCK_MIN = 0;
const STOCK_MAX = 32; // peak stockpile ~ 32 BCF
const STOCK_INIT = 14; // mid-1990s representative level
// ----- Sliders (created in setup) ------------------------------------
let extractSlider; // Hugoton-Panhandle field extraction rate (0..1)
let demandSlider; // Private refiner offtake rate (0..1)
let privSlider; // Privatization toggle 0 = pre-2024, 1 = post
// ----- Live state ----------------------------------------------------
let stock = STOCK_INIT; // Cliffside inventory (BCF)
let tokens = []; // animated flow tokens
let tSinceSpawn = 0; // accumulator for token spawning
// ----- Stations (block coords) ---------------------------------------
// Two rows of three boxes. Top row = upstream (source to pipeline).
// Bottom row = downstream (storage to distribution).
// Each station: {x, y, w, h, label, sub, gov} where gov flips with
// the privatization toggle (true = could be federal, false = always
// private). Distribution is always private; the source field is always
// private (private operators -- Cabot, ExxonMobil, etc.). The middle
// four (separation, pipeline, storage, enrichment) were federal
// pre-2024 and are private post-2024.
const STATIONS = [
// Top row (upstream)
{ id: 'src', x: 30, y: 120, w: 150, h: 80,
label: 'Hugoton-Panhandle',
sub: 'natural gas field',
gov: false },
{ id: 'sep', x: 220, y: 120, w: 150, h: 80,
label: 'Field separation',
sub: 'CO2 / H2O / HC strip',
gov: true },
{ id: 'pipe', x: 410, y: 120, w: 150, h: 80,
label: 'Federal Helium Pipeline',
sub: '425 mi crude line',
gov: true },
// Bottom row (downstream): drawn right-to-left to make the snaking
// process-chain flow obvious.
{ id: 'cliff', x: 410, y: 280, w: 150, h: 80,
label: 'Cliffside / Bush Dome',
sub: 'storage reservoir',
gov: true },
{ id: 'amar', x: 220, y: 280, w: 150, h: 80,
label: 'Amarillo plant',
sub: 'crude -> Grade-A',
gov: true },
{ id: 'dist', x: 30, y: 280, w: 150, h: 80,
label: 'Refiners / end use',
sub: 'MRI / semi / aerospace',
gov: false }
];
// ----- Arrow connectivity (process chain) ---------------------------
// Each arrow: from station id -> station id, with a 'kind' that picks
// token color and visual weight.
// crude = upstream crude-He flow (green tokens)
// store = crude-He into the storage tank (green tokens, fills stock)
// draw = crude-He drawn back out of storage (yellow tokens, drains)
// refined = refined Grade-A He out to refiners (yellow tokens)
const ARROWS = [
{ from: 'src', to: 'sep', kind: 'crude' },
{ from: 'sep', to: 'pipe', kind: 'crude' },
{ from: 'pipe', to: 'cliff', kind: 'store' },
{ from: 'cliff', to: 'amar', kind: 'draw' },
{ from: 'amar', to: 'dist', kind: 'refined' }
];
// =====================================================================
// setup()
// =====================================================================
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
textAlign(LEFT, TOP);
// Sliders -- dock to bottom-left in a vertical-ish column, each one
// explicitly placed and sized so they survive the editor layout.
extractSlider = createSlider(0, 100, 60, 1);
extractSlider.position(40, 440);
extractSlider.size(160);
demandSlider = createSlider(0, 100, 55, 1);
demandSlider.position(40, 472);
demandSlider.size(160);
privSlider = createSlider(0, 1, 0, 1);
privSlider.position(280, 472);
privSlider.size(80);
}
// =====================================================================
// draw()
// =====================================================================
function draw() {
background(BG);
// Read sliders once per frame into named locals.
const extractRate = extractSlider.value() / 100; // 0..1 fraction
const demandRate = demandSlider.value() / 100; // 0..1 fraction
const privatized = privSlider.value() === 1;
// ---- Update simulated stock (Cliffside inventory) ----------------
// dS/dt = Q_in - Q_out. Q_in is gated by upstream extraction;
// Q_out by downstream demand. Coefficients chosen so the stock
// sweeps the visual range over ~15 seconds at full asymmetry, which
// reads as live but not frenetic.
const dt = Math.min(deltaTime / 1000, 0.05);
const qIn = extractRate * 1.6; // BCF per second equivalent
const qOut = demandRate * 1.6;
stock += (qIn - qOut) * dt;
stock = constrain(stock, STOCK_MIN, STOCK_MAX);
// ---- Spawn tokens at flow-rate-proportional cadence -------------
tSinceSpawn += deltaTime;
// One token every ~250ms scaled by max(extract, demand) so heavier
// flow looks denser.
const cadence = 240 + (1 - Math.max(extractRate, demandRate)) * 600;
if (tSinceSpawn > cadence) {
tSinceSpawn = 0;
spawnTokens(extractRate, demandRate);
}
// ---- Draw the diagram -------------------------------------------
drawStations(privatized);
drawArrows();
drawTokens(dt);
drawCliffsideGauge();
drawTimelineBand(privatized);
drawSliderLabels(extractRate, demandRate, privatized);
drawHUD();
}
// =====================================================================
// Stations (block diagram boxes)
// =====================================================================
function drawStations(privatized) {
for (const s of STATIONS) {
// Government boxes turn amber when privatization is on; private
// boxes (src + dist) stay neutral grey.
let fillC, strokeC;
if (!s.gov) {
fillC = STRUCT.concat([60]);
strokeC = STRUCT;
} else if (privatized) {
fillC = PRIV_FILL.concat([200]);
strokeC = PRIV_STROKE;
} else {
fillC = GOVT_FILL.concat([200]);
strokeC = GOVT_STROKE;
}
push();
stroke(...strokeC);
strokeWeight(1.5);
fill(...fillC);
rect(s.x, s.y, s.w, s.h, 6);
// Label + sublabel
noStroke();
fill(FG);
textAlign(CENTER, CENTER);
textSize(13);
text(s.label, s.x + s.w / 2, s.y + 26);
fill(...DIM);
textSize(11);
text(s.sub, s.x + s.w / 2, s.y + 48);
pop();
}
}
// =====================================================================
// Arrows
// =====================================================================
function drawArrows() {
push();
noFill();
stroke(...STRUCT);
strokeWeight(1.2);
for (const a of ARROWS) {
const [x1, y1, x2, y2] = arrowAnchors(a);
drawArrowLine(x1, y1, x2, y2);
}
pop();
}
// Returns the start/end pixel for an arrow between two stations.
// Top-row arrows are horizontal. The pipe->cliff arrow drops vertically.
// Bottom-row arrows go right-to-left.
function arrowAnchors(a) {
const A = stationById(a.from);
const B = stationById(a.to);
if (a.from === 'pipe' && a.to === 'cliff') {
// vertical drop from pipeline to storage
return [A.x + A.w / 2, A.y + A.h, B.x + B.w / 2, B.y];
}
// horizontal arrow between two boxes on the same row
if (A.y === B.y) {
if (A.x < B.x) {
return [A.x + A.w, A.y + A.h / 2, B.x, B.y + B.h / 2];
} else {
return [A.x, A.y + A.h / 2, B.x + B.w, B.y + B.h / 2];
}
}
// default fallback: center-to-center
return [A.x + A.w / 2, A.y + A.h / 2, B.x + B.w / 2, B.y + B.h / 2];
}
function drawArrowLine(x1, y1, x2, y2) {
line(x1, y1, x2, y2);
// arrowhead
const ang = Math.atan2(y2 - y1, x2 - x1);
const ah = 8;
push();
translate(x2, y2);
rotate(ang);
noStroke();
fill(...STRUCT);
triangle(0, 0, -ah, -ah / 2, -ah, ah / 2);
pop();
}
// =====================================================================
// Animated tokens along arrows
// =====================================================================
function spawnTokens(extractRate, demandRate) {
// Spawn one token per arrow whose corresponding stage is active.
for (const a of ARROWS) {
let active = false;
let kind = a.kind;
if (a.kind === 'crude') {
active = extractRate > 0.02;
} else if (a.kind === 'store') {
// store flow is the in-flow into the tank
active = extractRate > 0.02;
} else if (a.kind === 'draw') {
// draw flow only when there's stock and demand
active = demandRate > 0.02 && stock > 0.05;
} else if (a.kind === 'refined') {
active = demandRate > 0.02 && stock > 0.05;
}
if (active) {
tokens.push({ arrow: a, t: 0, kind: kind });
}
}
}
function drawTokens(dt) {
// Each token advances along its arrow at a base speed; dies when t >= 1.
push();
noStroke();
const speed = 0.35; // fraction of arrow length per second
for (const tok of tokens) {
tok.t += speed * dt;
if (tok.t >= 1) continue;
const [x1, y1, x2, y2] = arrowAnchors(tok.arrow);
const px = lerp(x1, x2, tok.t);
const py = lerp(y1, y2, tok.t);
let c;
if (tok.kind === 'crude') c = TOK_CRUDE;
else if (tok.kind === 'store') c = TOK_CRUDE;
else if (tok.kind === 'draw') c = TOK_REFINED;
else if (tok.kind === 'refined') c = TOK_REFINED;
else c = FG;
fill(...c);
circle(px, py, 6);
}
pop();
// Garbage-collect finished tokens.
tokens = tokens.filter(t => t.t < 1);
}
// =====================================================================
// Cliffside inventory gauge
// =====================================================================
function drawCliffsideGauge() {
// Tall narrow tank to the right of the Cliffside box.
const gx = 580;
const gy = 200;
const gw = 30;
const gh = 220;
// Frame
push();
noFill();
stroke(...STRUCT);
strokeWeight(1.2);
rect(gx, gy, gw, gh, 4);
// Fill level
const frac = (stock - STOCK_MIN) / (STOCK_MAX - STOCK_MIN);
const fillH = gh * frac;
noStroke();
fill(...COLD, 200);
rect(gx + 1, gy + gh - fillH + 1, gw - 2, fillH - 2, 3);
// Numeric readout
fill(FG);
textAlign(CENTER, TOP);
textSize(11);
text(nf(stock, 1, 1) + ' BCF', gx + gw / 2, gy + gh + 6);
fill(...DIM);
textSize(10);
text('peak ~ 32', gx + gw / 2, gy + gh + 22);
// Tick at peak
stroke(...DIM);
strokeWeight(0.8);
line(gx, gy, gx + gw, gy);
noStroke();
fill(...DIM);
textAlign(LEFT, CENTER);
textSize(10);
text('32', gx + gw + 4, gy);
text('0', gx + gw + 4, gy + gh);
// Label
textAlign(CENTER, BOTTOM);
fill(FG);
textSize(11);
text('Bush Dome stock', gx + gw / 2, gy - 6);
pop();
}
// =====================================================================
// Timeline band (across the bottom of the diagram region)
// =====================================================================
// Shows the four statutory milestones as ASCII text in a thin strip
// between the diagram and the slider row, so the reader can tie the
// block diagram to the actual legal history.
function drawTimelineBand(privatized) {
const y = 388;
push();
fill(...DIM);
textAlign(LEFT, CENTER);
textSize(10);
text('1925 Helium Act | 1960 expansion | 1996 Privatization Act | 2013 Stewardship Act | 2024 Messer sale ($423.35M)',
30, y);
// active flag
fill(privatized ? PRIV_STROKE : GOVT_STROKE);
textAlign(RIGHT, CENTER);
textSize(11);
text(privatized ? 'post-2024: private (Messer LLC)' : 'pre-2024: federal (BLM / GSA)',
width - 14, y);
pop();
}
// =====================================================================
// Slider labels (drawn on the canvas, not via createDiv)
// =====================================================================
function drawSliderLabels(extractRate, demandRate, privatized) {
push();
noStroke();
// Hugoton extraction
fill(FG);
textAlign(LEFT, BOTTOM);
textSize(11);
text('Hugoton extraction rate', 40, 438);
fill(...DIM);
textAlign(LEFT, TOP);
textSize(10);
text(nf(extractRate * 100, 0, 0) + ' %', 210, 442);
// Refiner demand
fill(FG);
textAlign(LEFT, BOTTOM);
textSize(11);
text('Refiner offtake demand', 40, 470);
fill(...DIM);
textAlign(LEFT, TOP);
textSize(10);
text(nf(demandRate * 100, 0, 0) + ' %', 210, 474);
// Privatization toggle
fill(FG);
textAlign(LEFT, BOTTOM);
textSize(11);
text('Privatization completed', 280, 470);
fill(privatized ? PRIV_STROKE : GOVT_STROKE);
textAlign(LEFT, TOP);
textSize(10);
text(privatized ? 'on' : 'off', 365, 474);
pop();
}
// =====================================================================
// HUD (title + URL + controls + canonical equation)
// =====================================================================
function drawHUD() {
// Top-left: title (22pt bright) + subtitle (12pt dim)
push();
noStroke();
fill(FG);
textAlign(LEFT, TOP);
textSize(22);
text(TITLE, 14, 12);
fill(...DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/National_Helium_Reserve', 14, 42);
// Top-right: control hints
textAlign(RIGHT, TOP);
textSize(10);
text('drag sliders below to change flows', width - 14, 14);
text('toggle privatization to recolor stations', width - 14, 26);
// Bottom-right: canonical equation
textAlign(RIGHT, BOTTOM);
fill(FG);
textSize(13);
text('dS/dt = Q_in - Q_out [stock-and-flow]', width - 14, height - 6);
pop();
}
// =====================================================================
// Helpers
// =====================================================================
function stationById(id) {
for (const s of STATIONS) if (s.id === id) return s;
return null;
}
// =====================================================================
// End of National_Helium_Reserve.js -- Wikitube microsim, Helium room,
// Pattern G (block diagram / system flow / process chain).
// =====================================================================
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/National_Helium_Reserve.json (2026-07-30T02:09:12Z) -->
`Airship` · `Amarillo,_Texas` · `Bureau_of_Land_Management` · `Bushton,_Kansas` · [[Cold_War]] · [[Density]] · `General_Services_Administration` · `Geographic_coordinate_system` · [[Helium]] · `Helium_Act_of_1925` · `Helium_Privatization_Act_of_1996` · [[Helium_production_in_the_United_States]] · [[Helium_storage_and_conservation]] · `Messer_Group` · [[Natural_gas]] · [[Noble_gas]] · `Privatization` · `Sea_level` · `Space_Race` · `United_States` · `United_States_Bureau_of_Mines` · `United_States_Department_of_the_Interior` · `Wikisource`
## From the vault media library
!National Helium Reserve thumb.png
*National Helium Reserve — 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
The National Helium Reserve, also known as the Federal Helium Reserve, was a United States government-owned stockpile of crude helium gas stored in the Bush Dome reservoir of the Cliffside natural-gas field, fifteen miles northwest of Amarillo, Texas. Authorized by the Helium Act of 1925 and dramatically expanded under the Helium Act of 1960, the reserve consolidated helium recovered from helium-rich [[Natural_gas|natural gas]] drawn primarily from the Hugoton-Panhandle field, the largest known helium concentration on [[Earth]] at roughly 0.3 to 1.9 percent by volume. The Bureau of Land Management (BLM) administered the reserve, and at its peak the [[System|system]] held more than 32 billion cubic feet of crude helium, supplying roughly forty percent of US domestic demand for applications ranging from MRI [[Cryogenics|cryogenics]] and semiconductor manufacture to rocket-tank purging and welding shield gas.
The Helium Privatization Act of 1996 (PL 104-273) mandated divestment, and the Helium Stewardship Act of 2013 (PL 113-40) restructured the auction mechanism that drained the stockpile through Fiscal Year 2018. Privatization culminated on 10 June 2024 when BLM and the General Services Administration completed the sale of the Federal Helium System to Messer LLC for $423.35 million, returning approximately $460 million to the US Treasury. The transaction transferred the Cliffside storage facility, the 425-mile Federal Helium Pipeline, and the Amarillo crude-helium enrichment plant - the singular incumbent infrastructure asset for North American helium [[Logistics|logistics]] - to private ownership, fundamentally restructuring global helium markets.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 86 of the Helium sheet on 2026-05-12T09:25:09Z.*
<!-- 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/National_Helium_Reserve) : [Wikitube](https://en.wikitube.io/wiki/National_Helium_Reserve)
## Previous hub tags
Tree parent: [[Helium]].
Legacy hubs: none.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*