# Fractional distillation
<!-- MICROSIMGEN:BEGIN v1.7 — generated by g08_place_microsims.py; three.js first (§15); do not hand-edit inside -->
## Microsims — three.js
### Fractional distillation (three.js)
<div class="microsim-player">
<iframe src="https://wikitube-3d-microsims.netlify.app/Fractional_distillation.html" width="100%" height="620" frameborder="0" loading="lazy" sandbox="allow-scripts allow-same-origin" title="Fractional distillation — three.js microsim"></iframe>
</div>
**Open it full-screen:** [Fractional_distillation.html](https://wikitube-3d-microsims.netlify.app/Fractional_distillation.html) · library `threejs` · route `microsim/threejs/`
### Related microsims
Live sims on neighbouring articles — 1 of them inside this article's own Wikipedia link tree:
- [[Viscosity]] *(in tree)*
- [[Liquid_helium]]
- [[Reynolds_number]]
*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/Q235FAdkq" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Fractional_distillation.png" alt="Fractional_distillation 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/Q235FAdkq">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/Q235FAdkq
**Description (100 words):**
The microsim draws a McCabe-Thiele construction for a binary column on a 720x520 canvas. Six sliders set relative volatility alpha, distillate purity x_D, bottoms x_B, feed x_F, reflux ratio R, and feed thermal state q. The plot redraws an equilibrium curve, the 45-degree diagonal, rectifying and stripping operating lines, the q-line, and the stair-step staircase of theoretical plates between distillate and bottoms. A green circle marks the pinch point on the equilibrium curve where the q-line lands, fixing R_min. Bottom-left readout shows N stages, feed stage, R_min, and Fenske N_min; the bar turns red when R drops below R_min and the column becomes infeasible.
```js
// =====================================================================
// Fractional_distillation.js -- Wikitube microsim
// Article: Fractional_distillation
// en.wikitube.io/wiki/Fractional_distillation
// Room: Helium Pattern: D
// (Parametric curves, efficiency, performance analysis)
// ---------------------------------------------------------------------
// Idea: a live McCabe-Thiele construction for a binary distillation
// column, parametrized by:
//
// alpha -- relative volatility (driver of the equilibrium curve)
// x_D -- distillate (top) light-component mole fraction
// x_B -- bottoms (bottom) light-component mole fraction
// x_F -- feed composition
// R -- reflux ratio L/D
// q -- feed thermal state (1 = saturated liquid, 0 = sat. vapor)
//
// The reader scrubs six sliders. The sketch redraws:
//
// * equilibrium curve y = alpha*x / (1 + (alpha-1)*x)
// * 45-degree diagonal y = x
// * rectifying operating line y = R/(R+1) * x + x_D/(R+1)
// * q-line through (x_F, x_F) with slope q/(q-1)
// * stripping operating line from the q-line / rectifying
// intersection down to (x_B, x_B)
// * stair-step stage staircase from (x_D, x_D) to the first
// step at or below x_B
// * pinch point on the equilibrium curve (where q-line meets it),
// which sets R_min
//
// Canonical equations behind the parametric curves:
//
// Equilibrium (constant alpha): y = a x / (1 + (a-1) x)
// Fenske (minimum plates):
// N_min = log[(x_D/(1-x_D)) * ((1-x_B)/x_B)] / log(alpha)
// Underwood (minimum reflux, sat. liquid feed):
// R_min = (x_D - y_pinch) / (y_pinch - x_F)
// Gilliland correlation links actual N and R to (N_min, R_min):
// (N - N_min)/(N + 1) = f((R - R_min)/(R + 1))
//
// The reader watches the staircase grow or shrink as alpha is dialed
// up or R is dialed down, and watches the stripping section flip when
// the q-line is dragged across the feed plate.
//
// Visual layout (720 x 520 canvas):
// * top-left: HUD title + Wikitube URL subtitle
// * top-right: control hints
// * left half: McCabe-Thiele x-y plot, 380 x 380, square
// * right side: six sliders with live numeric value display
// * bottom-left: live (N stages, feed stage, R_min) readout
// * bottom-right: canonical Fenske equation
//
// Helium relevance: the helium nitrogen-rejection unit at the back
// end of a natural-gas helium plant is a cryogenic fractionator,
// separating He (b.p. 4.222 K) from N2 (b.p. 77.4 K) -- a binary
// with enormous relative volatility. Air-separation units that
// produce O2 / N2 / Ar at 78-90 K are also fractional distillations.
// The same construction shown here scales from a 3 m bench-top
// ethanol still to a 60 m crude tower.
//
// Conventions (Wikitube Betterfire Standard v0):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true (no FES noise)
// * non-ASCII (Greek alpha, dots, 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
// * every createSlider is followed by .position(x,y).size(w)
// =====================================================================
const ARTICLE = 'Fractional_distillation';
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, 140];
const HOT = [220, 110, 60]; // warm: hot vapor / rectifying line
const COLD = [60, 130, 220]; // cool: cold liquid / stripping line
const STRUCT = [120, 130, 150]; // structural grey: axes / diagonal
const TRAJ = [240, 220, 80]; // staircase / stage steps
const ACCENT = [200, 100, 220]; // q-line (magenta)
const PINCH = [120, 220, 140]; // pinch-point marker
const EQUIL = [240, 200, 120]; // equilibrium curve
// ----- Plot rectangle in canvas pixels (set in setup) ----------------
let plotX, plotY, plotS; // plotS = side length of square plot
// ----- Slider handles ------------------------------------------------
let sliderAlpha, sliderXD, sliderXB, sliderXF, sliderR, sliderQ;
// ----- Stage cap (safety) -------------------------------------------
const MAX_STAGES = 60;
// ----- Per-frame state shared with the HUD (set in draw, read in
// drawHUD). Kept at module scope so drawHUD() takes no args,
// which the Betterfire validator BF7 regex requires.
let frameMT = null;
let frameR = 0;
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
// Square plot in the left half of the canvas.
plotX = 60;
plotY = 60;
plotS = 380;
// Right-side sliders. All six get explicit .position().size()
// (Betterfire Standard: no floating defaults).
const SX = 470; // slider x
const SW = 170; // slider width
let sy = 80; // running y
const SDY = 46; // row pitch
sliderAlpha = createSlider(1.2, 5.0, 2.5, 0.05 ).position(SX, sy).size(SW); sy += SDY;
sliderXD = createSlider(0.80, 0.999, 0.95, 0.005).position(SX, sy).size(SW); sy += SDY;
sliderXB = createSlider(0.005, 0.20, 0.05, 0.005).position(SX, sy).size(SW); sy += SDY;
sliderXF = createSlider(0.20, 0.80, 0.50, 0.01 ).position(SX, sy).size(SW); sy += SDY;
sliderR = createSlider(0.5, 10.0, 2.0, 0.1 ).position(SX, sy).size(SW); sy += SDY;
sliderQ = createSlider(-0.2, 1.5, 1.0, 0.05 ).position(SX, sy).size(SW);
}
function draw() {
background(BG);
// Read sliders once per frame into named locals.
const a = sliderAlpha.value();
const xD = sliderXD.value();
const xB = sliderXB.value();
const xF = sliderXF.value();
const R = sliderR.value();
const q = sliderQ.value();
// Build the construction (sliders -> derived state).
const mt = buildMcCabeThiele(a, xD, xB, xF, R, q);
// Stash for the HUD (called below with no args).
frameMT = mt;
frameR = R;
// Order: axes -> equilibrium / diagonal -> operating lines ->
// q-line -> staircase -> landmarks -> HUD. Later layers paint
// on top of earlier ones.
drawAxes();
drawEquilibriumCurve(a);
drawDiagonal();
drawOperatingLines(R, xD, xB, mt);
drawQLine(xF, q, mt);
drawStaircase(mt);
drawLandmarks(xD, xB, xF, mt);
drawSliderLabels(a, xD, xB, xF, R, q);
drawHUD();
}
// =====================================================================
// Coordinate transforms: (x, y) in mole fraction <-> canvas pixels
// Both x and y axes span 0..1 in mole fraction. y axis flipped.
// =====================================================================
function xToPx(x) { return plotX + x * plotS; }
function yToPy(y) { return plotY + (1 - y) * plotS; }
// =====================================================================
// Equilibrium and operating-line algebra
// =====================================================================
// Equilibrium relation for a constant-alpha binary system:
// y = alpha * x / (1 + (alpha - 1) * x)
// Inverted: x = y / (alpha - (alpha - 1) * y).
function yEq(x, a) { return a * x / (1 + (a - 1) * x); }
function xEq(y, a) { return y / (a - (a - 1) * y); }
// Build the full McCabe-Thiele construction. Returns:
// { steps, count, feedStage, xI, yI, Rmin, Nmin, xPinch, yPinch }
function buildMcCabeThiele(a, xD, xB, xF, R, q) {
// Rectifying line: y = mR * x + bR
const mR = R / (R + 1);
const bR = xD / (R + 1);
// q-line / rectifying intersection (xI, yI).
// q = 1 (saturated liquid) -> q-line is vertical at x = x_F.
// q != 1 -> q-line slope is q / (q - 1), passing through (x_F, x_F).
let xI, yI;
if (Math.abs(q - 1) < 1e-6) {
xI = xF;
yI = mR * xI + bR;
} else {
const mQ = q / (q - 1);
const bQ = xF - mQ * xF;
// mR * x + bR = mQ * x + bQ -> x = (bQ - bR) / (mR - mQ)
if (Math.abs(mR - mQ) < 1e-6) {
xI = xF; yI = mR * xI + bR;
} else {
xI = (bQ - bR) / (mR - mQ);
yI = mR * xI + bR;
}
}
// Stripping line: passes through (xB, xB) and (xI, yI).
const mS = (yI - xB) / Math.max(xI - xB, 1e-6);
const bS = xB - mS * xB;
function yOp(x) {
return (x >= xI) ? (mR * x + bR) : (mS * x + bS);
}
// Stair-step from (xD, xD) downward until x <= xB or cap hit.
const steps = [];
let x = xD, y = xD;
steps.push({ type: 'start', x, y });
let n = 0;
let feedStage = -1;
let crossed = false;
while (x > xB && n < MAX_STAGES) {
// Horizontal step: drop y along to the equilibrium curve.
// From (x, y_op) on operating line, go LEFT to (x_eq, y_op).
const xe = xEq(y, a);
steps.push({ type: 'horiz', x: xe, y: y });
// Vertical step: from (x_eq, y_op) down to next operating line.
const yNext = yOp(xe);
steps.push({ type: 'vert', x: xe, y: yNext });
if (!crossed && xe < xI) { crossed = true; feedStage = n + 1; }
x = xe;
y = yNext;
n++;
// Defensive: equilibrium curve and stripping line can pinch and
// produce a non-decreasing x, which would loop forever.
if (steps.length >= 4) {
const prev = steps[steps.length - 3];
if (Math.abs(prev.x - x) < 1e-4) break;
}
}
// Fenske minimum stages (constant alpha, total reflux).
const Nmin =
Math.log((xD / Math.max(1 - xD, 1e-6)) *
((1 - xB) / Math.max(xB, 1e-6))) /
Math.log(Math.max(a, 1.0001));
// Pinch point: q-line meets equilibrium curve. Bisection on x.
let xPinch, yPinch;
if (Math.abs(q - 1) < 1e-6) {
xPinch = xF;
yPinch = yEq(xF, a);
} else {
const mQ = q / (q - 1);
const bQ = xF - mQ * xF;
const f = (x) => (mQ * x + bQ) - yEq(x, a);
let lo = 0.001, hi = 0.999;
// Make sure f(lo) and f(hi) bracket a sign change.
let fLo = f(lo), fHi = f(hi);
if (fLo * fHi > 0) {
xPinch = xF; yPinch = yEq(xF, a);
} else {
for (let i = 0; i < 50; i++) {
const m = 0.5 * (lo + hi);
const fm = f(m);
if (fLo * fm <= 0) { hi = m; fHi = fm; }
else { lo = m; fLo = fm; }
}
xPinch = 0.5 * (lo + hi);
yPinch = yEq(xPinch, a);
}
}
const Rmin = (xD - yPinch) / Math.max(yPinch - xPinch, 1e-6);
return { steps, count: n, feedStage, xI, yI, Rmin, Nmin, xPinch, yPinch };
}
// =====================================================================
// Drawing
// =====================================================================
function drawAxes() {
push();
noFill();
stroke(STRUCT);
strokeWeight(1);
rect(plotX, plotY, plotS, plotS);
// Grid + tick labels every 0.1 on both axes.
noStroke();
fill(...DIM);
textSize(10);
for (let v = 0; v <= 1.0001; v += 0.1) {
// x-axis ticks (bottom)
const x = xToPx(v);
stroke(STRUCT, 80); line(x, plotY + plotS, x, plotY + plotS + 4);
noStroke(); textAlign(CENTER, TOP);
text(nf(v, 1, 1), x, plotY + plotS + 6);
// y-axis ticks (left)
const y = yToPy(v);
stroke(STRUCT, 80); line(plotX - 4, y, plotX, y);
noStroke(); textAlign(RIGHT, CENTER);
text(nf(v, 1, 1), plotX - 6, y);
}
// Axis titles
textAlign(CENTER, TOP);
fill(...DIM);
textSize(12);
text('x (liquid mole fraction, light component)',
plotX + plotS / 2, plotY + plotS + 22);
push();
translate(plotX - 36, plotY + plotS / 2);
rotate(-PI / 2);
text('y (vapor mole fraction, light component)', 0, 0);
pop();
pop();
}
function drawDiagonal() {
// 45-degree y = x line: the line of equal compositions, against
// which the stage staircase reflects.
push();
stroke(STRUCT, 160);
strokeWeight(1);
line(xToPx(0), yToPy(0), xToPx(1), yToPy(1));
noStroke();
fill(...DIM);
textSize(10);
textAlign(LEFT, BOTTOM);
text('y = x', xToPx(0.86) + 4, yToPy(0.86) - 4);
pop();
}
function drawEquilibriumCurve(a) {
// y = alpha * x / (1 + (alpha-1) * x), sampled densely.
push();
noFill();
stroke(...EQUIL);
strokeWeight(2);
beginShape();
for (let i = 0; i <= 200; i++) {
const x = i / 200;
vertex(xToPx(x), yToPy(yEq(x, a)));
}
endShape();
// Label near the top of the curve.
noStroke();
fill(...EQUIL);
textSize(11);
textAlign(LEFT, TOP);
const xLab = 0.55;
text('equilibrium y = a x / (1 + (a-1) x)',
xToPx(xLab) + 4, yToPy(yEq(xLab, a)) - 14);
pop();
}
function drawOperatingLines(R, xD, xB, mt) {
push();
// Rectifying line from (xD, xD) down to the q-line intersection.
stroke(...HOT);
strokeWeight(2);
noFill();
line(xToPx(xD), yToPy(xD), xToPx(mt.xI), yToPy(mt.yI));
noStroke();
fill(...HOT);
textSize(10);
textAlign(LEFT, TOP);
text('rectifying slope = R/(R+1)',
xToPx(0.78), yToPy(0.84));
// Stripping line from (xB, xB) up to the intersection.
stroke(...COLD);
strokeWeight(2);
noFill();
line(xToPx(xB), yToPy(xB), xToPx(mt.xI), yToPy(mt.yI));
noStroke();
fill(...COLD);
textSize(10);
textAlign(LEFT, TOP);
text('stripping',
xToPx(mt.xI) + 4, yToPy(mt.yI) + 6);
pop();
}
function drawQLine(xF, q, mt) {
push();
stroke(...ACCENT);
strokeWeight(1.5);
drawingContext.setLineDash([4, 4]);
noFill();
// q-line passes through (xF, xF). Extend to plot bounds.
if (Math.abs(q - 1) < 1e-6) {
// Vertical q-line at x = xF
line(xToPx(xF), yToPy(0), xToPx(xF), yToPy(1));
} else {
const mQ = q / (q - 1);
// y = mQ * (x - xF) + xF; clip to plot rectangle.
const yAt = (x) => mQ * (x - xF) + xF;
let xA = 0, xZ = 1;
// Trim against the canvas if the slope sends the line off-screen.
if (Math.abs(mQ) > 1e-3) {
const yL = yAt(0), yR = yAt(1);
if (yL < 0) xA = (-xF * mQ + xF + 0) / mQ; // y=0 crossing
if (yL > 1) xA = (-xF * mQ + xF + 1) / mQ; // y=1 crossing
if (yR < 0) xZ = (-xF * mQ + xF + 0) / mQ;
if (yR > 1) xZ = (-xF * mQ + xF + 1) / mQ;
xA = constrain(xA, 0, 1);
xZ = constrain(xZ, 0, 1);
}
line(xToPx(xA), yToPy(yAt(xA)),
xToPx(xZ), yToPy(yAt(xZ)));
}
drawingContext.setLineDash([]);
noStroke();
fill(...ACCENT);
textSize(10);
textAlign(LEFT, BOTTOM);
text('q-line (q = ' + nf(q, 1, 2) + ')',
xToPx(xF) + 4, yToPy(xF) - 4);
pop();
}
function drawStaircase(mt) {
push();
stroke(...TRAJ);
strokeWeight(1.5);
noFill();
beginShape();
for (const s of mt.steps) {
vertex(xToPx(s.x), yToPy(s.y));
}
endShape();
// Number each plate at its corner.
noStroke();
fill(...TRAJ);
textSize(9);
textAlign(CENTER, CENTER);
let plate = 0;
for (let i = 1; i < mt.steps.length; i += 2) {
plate++;
const s = mt.steps[i];
// Small offset so the digit doesn't overlap the corner stroke.
text(plate, xToPx(s.x) - 8, yToPy(s.y) - 8);
}
pop();
}
function drawLandmarks(xD, xB, xF, mt) {
push();
// Distillate point (x_D, x_D) on the diagonal.
fill(...HOT);
noStroke();
circle(xToPx(xD), yToPy(xD), 6);
// Bottoms point (x_B, x_B) on the diagonal.
fill(...COLD);
circle(xToPx(xB), yToPy(xB), 6);
// Feed point (x_F, x_F) on the diagonal.
fill(...ACCENT);
circle(xToPx(xF), yToPy(xF), 6);
// Pinch point: where q-line meets the equilibrium curve.
// This is the (R_min) tangency that bounds the rectifying line.
noFill();
stroke(...PINCH);
strokeWeight(2);
circle(xToPx(mt.xPinch), yToPy(mt.yPinch), 10);
noStroke();
fill(...PINCH);
textSize(9);
textAlign(LEFT, TOP);
text('pinch (R_min)',
xToPx(mt.xPinch) + 8, yToPy(mt.yPinch) + 6);
pop();
}
function drawSliderLabels(a, xD, xB, xF, R, q) {
push();
noStroke();
fill(...DIM);
textSize(11);
textAlign(LEFT, BOTTOM);
const labels = [
['alpha (rel. volatility)', a, 2 ],
['x_D (distillate)', xD, 3 ],
['x_B (bottoms)', xB, 3 ],
['x_F (feed)', xF, 2 ],
['R (reflux ratio)', R, 2 ],
['q (feed thermal)', q, 2 ]
];
const SX = 470;
let sy = 80;
const SDY = 46;
for (let i = 0; i < labels.length; i++) {
const [name, val, places] = labels[i];
fill(...DIM);
text(name, SX, sy - 4);
fill(FG);
textAlign(RIGHT, BOTTOM);
text(nf(val, 1, places), SX + 230, sy - 4);
textAlign(LEFT, BOTTOM);
sy += SDY;
}
pop();
}
function drawHUD() {
const mt = frameMT;
const R = frameR;
if (!mt) return;
// Top-left: title (Betterfire Standard rule 2).
noStroke();
fill(FG);
textAlign(LEFT, TOP);
textSize(22);
text(TITLE, 14, 12);
fill(...DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/Fractional_distillation',
14, 40);
// Top-right: control hints (Betterfire Standard rule 3).
textAlign(RIGHT, TOP);
textSize(10);
fill(...DIM);
text('drag the sliders to rebuild the column', width - 14, 12);
text('alpha up -> fewer plates needed', width - 14, 24);
text('R down to R_min -> plates blow up', width - 14, 36);
// Bottom-left: live (N, R_min, feed stage) readout.
textAlign(LEFT, BOTTOM);
fill(...DIM);
textSize(12);
const fsTxt = (mt.feedStage > 0) ? mt.feedStage : '--';
const nTxt = (mt.count >= MAX_STAGES) ? (MAX_STAGES + '+') : ('' + mt.count);
text('N stages = ' + nTxt +
' feed stage = ' + fsTxt +
' R_min = ' + nf(mt.Rmin, 1, 2) +
' N_min = ' + nf(mt.Nmin, 1, 2),
14, height - 22);
// Bottom-left line 2: warn if R is below R_min (pinch / infeasible).
if (R < mt.Rmin) {
fill(220, 80, 80);
textSize(11);
text('warning: R < R_min -- column cannot reach x_D from x_F',
14, height - 6);
} else {
fill(FG);
textSize(12);
text('phase: feasible operation (R > R_min)',
14, height - 6);
}
// Bottom-right: canonical equation (Betterfire Standard rule 4).
textAlign(RIGHT, BOTTOM);
fill(FG);
textSize(12);
text('N_min = log[(x_D/(1-x_D)) (1-x_B)/x_B] / log(alpha) [Fenske]',
width - 14, height - 6);
}
// =====================================================================
// End of Fractional_distillation.js -- Helium room, Pattern D.
// =====================================================================
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Fractional_distillation.json (2026-07-30T02:09:12Z) -->
`Air_separation` · `Alembic` · `Alkane` · [[Argon]] · `Avicenna` · `Azeotrope` · `Azeotropic_distillation` · `Batch_distillation` · `Boiling_chip` · [[Boiling_point]] · `Catalytic_distillation` · `Chemical_compound` · `Chemical_plant` · `Chlorosilane` · `Combustion` · `Condenser_(heat_transfer)` · `Continuous_distillation` · `Dalton's_law` · `Destructive_distillation` · [[Distillation]] · `Distillation_Design` · `Dry_distillation` · `Ethanol` · `Extractive_distillation` · `Fenske_equation` · `Fraction_(chemistry)` · `Fractionating_column` · `Fractionation` · `Frederic_L._Holmes` · `Gas` · `Gerard_of_Cremona` · `Jabir_ibn_Hayyan` · `Kugelrohr` · `Laboratory_glassware` · `Liebig_condenser` · `Liquid_nitrogen` · `Liquid_oxygen` · `Magnetic_stirrer` · `Mass_transfer` · `McCabe–Thiele_method` · `Mixture` · `Oil_refinery` · `Partial_pressure` · `Paul_Kraus_(Arabist)` · `Perkin_triangle` · `Perry's_Chemical_Engineers'_Handbook` · `Petrochemical` · `Petroleum_refining_processes` · `Porosity` · `Raoult's_law` · `Raschig_ring` · `Reactive_distillation` · `Reflux` · `Roger_Bacon` · `Rotary_evaporator` · `Salt-effect_distillation` · `Semiconductor` · `Separation_process` · [[Silicon]] · `Silvering` · `Simulation` · `Spinning_band_distillation` · `Spinning_cone` · `Steady_state` · `Steam_distillation` · `Still` · `Structured_packing` · `Temperature` · `Theoretical_plate` · `Thermometer` · `Vacuum_distillation` · `Vaporization` · `Vapor–liquid_equilibrium` · [[Viscosity]] · `William_R._Newman`
## From the vault media library
!Fractional distillation thumb.png
*Fractional Distillation — 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
**Fractional distillation** is a separation technique that partitions a liquid mixture into its component fractions by exploiting differences in their boiling points. It is the workhorse separation of the petrochemical, beverage, cryogenic-gas, and fine-chemical industries, and the principal method by which crude helium is recovered from [[Natural_gas|natural gas]]. A fractionating column placed above the still imposes a continuous countercurrent contact between rising vapor and descending liquid reflux; each stage of contact enriches the vapor in the more volatile component, so that a tall, well-insulated column of theoretical stages can drive a binary cut arbitrarily close to its thermodynamic limit.
The governing relation is Raoult's law combined with the relative volatility α = (y_A/x_A)/(y_B/x_B), where x and y are the liquid and vapor mole fractions. The Fenske equation gives the minimum number of theoretical plates at total reflux, N_min = log[(x_D/(1−x_D)) · ((1−x_B)/x_B)] / log α; the Underwood equation gives the minimum reflux ratio; and Gilliland's correlation relates the actual stages and reflux to the operating cost of any real column. McCabe-Thiele construction visualizes the same answer graphically on an x-y equilibrium plot.
Industrial implementations span ambient-pressure ethanol stills, vacuum crude-oil towers handling millions of barrels per day, low-temperature air-separation units producing oxygen and nitrogen, and the deep-cryogenic helium nitrogen-rejection units that strip nitrogen, methane, and trace gases from raw helium at 80-100 K. [[Energy]] efficiency is bounded below by the minimum work of separation, and modern columns recover much of the reboiler duty through heat-integrated reflux and side-stream condensers.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 47 of the Helium sheet on 2026-05-12T00:34:56Z.*
<!-- 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/Fractional_distillation) : [Wikitube](https://en.wikitube.io/wiki/Fractional_distillation)
## Previous hub tags
Tree parents: [[Helium]] · [[Oxygen]].
Legacy hubs: none.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*