# Density ## Microsim ### Live player <div class="microsim-player"> <iframe src="https://editor.p5js.org/sciencenibber/full/voyPu863e" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe> </div> <div class="microsim-fallback"> <img src="Microsims/thumbs/Density.png" alt="Density 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/voyPu863e">open sketch in the p5.js editor</a></em></p> </div> **Editor URL:** https://editor.p5js.org/sciencenibber/sketches/voyPu863e **Description (100 words):** A horizontal log-scale rho axis (10^-2 to 10^5 kg/m^3) anchors twelve reference materials, from hydrogen and helium through water and seawater to gold and osmium. Drag the yellow marker (or use arrow keys, or click a tick to snap) and watch two spatial panels respond live. The left panel renders a fixed 1 m^3 box, scattering particles whose count tracks log(rho) -- the box goes from nearly empty for gases to densely packed for solids. The right panel anchors a 2 m ruler and draws the 1 kg cube at true scale, side a = (1 / rho)^(1/3). Helium's 1.78 m cube next to osmium's 3.6 cm cube makes the seven-order-of-magnitude span of everyday density unmistakably visible. ```js // ===================================================================== // Density.js -- Wikitube microsim // Article: Density en.wikitube.io/wiki/Density // Room: Helium Pattern: 8 (Crossover with Geometry, // topological / spatial viz) // --------------------------------------------------------------------- // Idea: density (rho = m / V) is a scalar field over space, and the // most direct way to *see* it is as a packing of mass into a volume. // This microsim renders that intuition in two coupled spatial panels // driven by a single horizontal log-rho selector: // // LEFT panel -- "one cubic metre" // The box is fixed at 1 m^3. Particles are scattered // inside with a count proportional to log10(rho). // Hydrogen reads as a near-empty box (~5 dots); // osmium reads as a packed grain field (~1500 dots). // The user *sees* density as occupancy. // // RIGHT panel -- "one kilogram" // A grey-ruled scale rect, 2 m wide. Inside it, the // cube of side (1 / rho)^(1/3) m is drawn at scale. // Helium's 1 kg cube is ~1.78 m on a side; osmium's // 1 kg cube is ~3.6 cm. The same kilogram, the same // ruler, vastly different cubes. // // The horizontal axis at the top is the controller -- a log-scale // rho slider from 10^-2 to 10^5 kg/m^3 with named materials anchored // at their real-world densities. Click on a marker to snap. Drag the // yellow indicator. The two cubes update live. // // Canonical equation (bottom-right HUD, per Betterfire Standard): // // rho = m / V [SI: kg/m^3] // // For ideal gases this expands to rho = P M / (R T); the helium room's // central observation is that the smallest molar mass (M = 4.003 g/mol // for He) plus a high T = 293 K gives rho ~= 0.179 kg/m^3, the second // lightest gas after hydrogen -- but unlike H2 it is non-flammable. // That single fact is why lifting-gas / cryogenic-pressurant / leak- // tracer applications all sit in the Helium room. // // Visual layout (720 x 520 canvas): // * top-left: HUD title + en.wikitube.io/wiki/Density subtitle // * top-right: control hints (drag, click marker, arrow keys) // * y ~= 110: horizontal log-rho axis with material tick labels // * y ~= 200-450 LEFT panel "1 m^3 at rho" (40..350 px) // * y ~= 200-450 RIGHT panel "1 kg occupies V" (370..700 px) // * bottom: live readout (material, rho, m=1 kg cube side) // * bottom-right canonical equation rho = m / V // // Conventions (Wikitube Betterfire Standard v0): // * single ARTICLE constant at the top, single quotes // * p5.disableFriendlyErrors = true to keep the editor console clean // * non-ASCII (Greek rho, dots, arrows, superscripts) 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 yellow accent for the marker // * helium highlighted (TRAJ) because this is the Helium room // All sliders elided -- the rho axis itself is the slider. // ===================================================================== const ARTICLE = 'Density'; 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]; // gases (warm) const COLD = [60, 130, 220]; // liquids (cool) const STRUCT = [120, 130, 150]; // solids (structural grey) const TRAJ = [240, 220, 80]; // helium accent + marker const SCRATCH = [120, 120, 120, 90]; // grid / axis scratch lines const ACCENT = [200, 100, 220]; // emphasis tint (compact-object regime) // ----- log-rho axis range (kg/m^3) ----------------------------------- const RHO_LOG_MIN = -2; // 10^-2 kg/m^3 (very rarefied gas) const RHO_LOG_MAX = 5; // 10^5 kg/m^3 (osmium-class solid) // ----- Reference materials at canonical densities (kg/m^3) ----------- // Each row: { rho, label, group: 'gas' | 'liquid' | 'solid' | 'extreme', highlight } // 'highlight' is true for helium (the room's central material). const MATERIALS = [ { rho: 0.0899, label: 'H2', group: 'gas', highlight: false }, { rho: 0.1786, label: 'He', group: 'gas', highlight: true }, { rho: 1.225, label: 'air', group: 'gas', highlight: false }, { rho: 1.977, label: 'CO2', group: 'gas', highlight: false }, { rho: 124.9, label: 'l-He', group: 'liquid', highlight: false }, { rho: 808, label: 'l-N2', group: 'liquid', highlight: false }, { rho: 999.97, label: 'water', group: 'liquid', highlight: false }, { rho: 2700, label: 'Al', group: 'solid', highlight: false }, { rho: 7874, label: 'Fe', group: 'solid', highlight: false }, { rho: 11343, label: 'Pb', group: 'solid', highlight: false }, { rho: 19320, label: 'Au', group: 'solid', highlight: false }, { rho: 22590, label: 'Os', group: 'solid', highlight: false } ]; // ----- Reader's draggable marker state ------------------------------- // Start at helium (the room's pin). let markRho = 0.1786; let dragging = false; // ----- Axis layout (pixels; set in setup) ---------------------------- let axisX, axisY, axisW; // horizontal axis line geometry let leftBoxX, leftBoxY, leftBoxW, leftBoxH; let rightBoxX, rightBoxY, rightBoxW, rightBoxH; // ----- Precomputed particle field for the LEFT panel ---------------- // We allocate the maximum count once at setup() and render only the // first N each frame, where N scales with log10(rho). This keeps the // dots in a stable spatial pattern as the user drags the marker -- // the box visually fills/empties rather than re-shuffling. const MAX_PARTICLES = 1500; const particles = []; // [{ x, y, r }, ...] in box-relative coords (0..1) function setup() { createCanvas(720, 520); pixelDensity(2); textFont('system-ui'); // Horizontal rho axis axisX = 60; axisY = 110; axisW = width - 80; // Left panel: 1 m^3 box leftBoxX = 40; leftBoxY = 200; leftBoxW = 310; leftBoxH = 250; // Right panel: 1 kg cube + 2 m ruler rightBoxX = 380; rightBoxY = 200; rightBoxW = 320; rightBoxH = 250; // Seed the particle field once -- deterministic positions so the // visual is a stable cloud the reader can study, not a sparkle storm. randomSeed(42); for (let i = 0; i < MAX_PARTICLES; i++) { particles.push({ x: random(0.02, 0.98), y: random(0.02, 0.98), r: random(1.0, 2.2) }); } } function draw() { background(BG); // Order: axis (controller) -> two panels -> HUD on top. drawRhoAxis(); drawLeftPanel(); drawRightPanel(); drawHUD(); } // ===================================================================== // Coordinate transforms: rho [kg/m^3] <-> axis px // ===================================================================== function rhoToPx(rho) { const logRho = Math.log10(Math.max(rho, 1e-9)); return map(logRho, RHO_LOG_MIN, RHO_LOG_MAX, axisX, axisX + axisW); } function pxToRho(px) { const logRho = map(px, axisX, axisX + axisW, RHO_LOG_MIN, RHO_LOG_MAX); return Math.pow(10, logRho); } // ===================================================================== // Material classification (which palette colour applies) // ===================================================================== // Group by density crossovers, not by the discrete materials table: // rho < 100 kg/m^3 -> gas (HOT) // 100 <= rho < 2000 -> liquid (COLD) // rho >= 2000 -> solid (STRUCT) // This makes the marker change colour as the user drags across regimes. function groupOf(rho) { if (rho < 100) return 'gas'; if (rho < 2000) return 'liquid'; return 'solid'; } function colorOfGroup(g) { if (g === 'gas') return HOT; if (g === 'liquid') return COLD; return STRUCT; } // Nearest named material -- used to label the marker in the HUD. function nearestMaterial(rho) { let best = MATERIALS[0]; let bestD = Math.abs(Math.log10(rho) - Math.log10(best.rho)); for (const m of MATERIALS) { const d = Math.abs(Math.log10(rho) - Math.log10(m.rho)); if (d < bestD) { best = m; bestD = d; } } return best; } // ===================================================================== // Top axis: log-rho slider with material ticks // ===================================================================== function drawRhoAxis() { push(); // Axis bar stroke(SCRATCH); strokeWeight(1); line(axisX, axisY, axisX + axisW, axisY); // Decade ticks + labels (10^-2 ... 10^5) noStroke(); fill(...DIM); textSize(10); textAlign(CENTER, TOP); for (let logR = RHO_LOG_MIN; logR <= RHO_LOG_MAX; logR++) { const x = rhoToPx(Math.pow(10, logR)); stroke(SCRATCH); line(x, axisY - 3, x, axisY + 3); noStroke(); fill(...DIM); text('10^' + logR, x, axisY + 6); } // Material tick markers above the axis textSize(10); for (const m of MATERIALS) { const x = rhoToPx(m.rho); const col = colorOfGroup(m.group); // Tiny vertical bracket stroke(...col, 200); strokeWeight(1.5); line(x, axisY - 12, x, axisY - 2); // Label above noStroke(); fill(...col, m.highlight ? 255 : 180); if (m.highlight) { // Helium gets a bigger, yellow-trimmed label textSize(11); fill(...TRAJ); textAlign(CENTER, BOTTOM); text(m.label, x, axisY - 16); textSize(10); } else { textAlign(CENTER, BOTTOM); text(m.label, x, axisY - 16); } } // Axis title noStroke(); fill(...DIM); textSize(11); textAlign(CENTER, TOP); text('rho [kg/m^3, log scale]', axisX + axisW / 2, axisY + 20); // Reader's marker -- yellow indicator with halo, big enough to grab drawMarker(); pop(); } function drawMarker() { const mx = constrain(rhoToPx(markRho), axisX, axisX + axisW); const my = axisY; // Vertical guide down through both panels push(); stroke(...TRAJ, 80); strokeWeight(1); drawingContext.setLineDash([4, 4]); line(mx, my + 3, mx, height - 60); drawingContext.setLineDash([]); pop(); // Outer halo push(); noFill(); stroke(...TRAJ); strokeWeight(1); circle(mx, my, 16); // Filled centre fill(...TRAJ); noStroke(); circle(mx, my, 8); pop(); } // ===================================================================== // LEFT panel -- "1 m^3 at this rho" (particle occupancy) // ===================================================================== function drawLeftPanel() { push(); // Panel frame + caption noFill(); stroke(SCRATCH); strokeWeight(1); rect(leftBoxX, leftBoxY, leftBoxW, leftBoxH); noStroke(); fill(...DIM); textSize(11); textAlign(LEFT, BOTTOM); text('one cubic metre @ rho', leftBoxX, leftBoxY - 6); // Count = round(map(log10(rho), -2, 5, 5, MAX_PARTICLES)) // The mapping is intentionally generous on the low end so hydrogen // and helium are visibly *almost* empty without going to literal 0. const logRho = Math.log10(Math.max(markRho, 1e-6)); const n = Math.round(map(logRho, RHO_LOG_MIN, RHO_LOG_MAX, 5, MAX_PARTICLES)); const nClamped = constrain(n, 1, MAX_PARTICLES); // Particle dots, in panel-local coords scaled by leftBoxW/H const col = colorOfGroup(groupOf(markRho)); noStroke(); fill(...col, 180); for (let i = 0; i < nClamped; i++) { const p = particles[i]; const px = leftBoxX + p.x * leftBoxW; const py = leftBoxY + p.y * leftBoxH; circle(px, py, p.r); } // Panel readout: particle count and the rho it implies noStroke(); fill(...DIM); textSize(10); textAlign(LEFT, TOP); text('N = ' + nClamped + ' / ' + MAX_PARTICLES + ' (log-scaled)', leftBoxX + 6, leftBoxY + 6); text('1 m x 1 m x 1 m box', leftBoxX + 6, leftBoxY + leftBoxH - 16); pop(); } // ===================================================================== // RIGHT panel -- "1 kg occupies V = 1 / rho" (size of a 1 kg cube) // ===================================================================== function drawRightPanel() { push(); // Panel frame + caption noFill(); stroke(SCRATCH); strokeWeight(1); rect(rightBoxX, rightBoxY, rightBoxW, rightBoxH); noStroke(); fill(...DIM); textSize(11); textAlign(LEFT, BOTTOM); text('one kilogram, cube side = (1 / rho)^(1/3)', rightBoxX, rightBoxY - 6); // Layout: a horizontal 2 m ruler runs across the bottom of the // panel. The 1 kg cube sits on the ruler, anchored at the left edge // of the ruler. Side length is rendered in metres at 1 m = 120 px. const rulerY = rightBoxY + rightBoxH - 36; const rulerX0 = rightBoxX + 20; const rulerLen = 2.0; // metres rendered const pxPerM = 120; const rulerXend = rulerX0 + rulerLen * pxPerM; // Ruler bar with tick marks every 0.1 m, labels every 0.5 m stroke(SCRATCH); strokeWeight(1); line(rulerX0, rulerY, rulerXend, rulerY); noStroke(); fill(...DIM); textSize(9); textAlign(CENTER, TOP); for (let m = 0; m <= rulerLen + 0.001; m += 0.1) { const x = rulerX0 + m * pxPerM; const major = (Math.round(m * 10) % 5 === 0); stroke(SCRATCH); line(x, rulerY, x, rulerY + (major ? 6 : 3)); if (major) { noStroke(); fill(...DIM); text(nf(m, 1, 1) + ' m', x, rulerY + 8); } } // Cube of side a = (1 / rho)^(1/3) metres, clamped to ruler length const a = Math.cbrt(1 / Math.max(markRho, 1e-6)); // m const aClamped = Math.min(a, rulerLen); const aPx = aClamped * pxPerM; // Draw the cube as a square sitting on the ruler at rulerX0 const cubeX = rulerX0; const cubeY = rulerY - aPx; const col = colorOfGroup(groupOf(markRho)); push(); noStroke(); fill(...col, 90); rect(cubeX, cubeY, aPx, aPx); noFill(); stroke(...col); strokeWeight(1.5); rect(cubeX, cubeY, aPx, aPx); // Side-length annotation noStroke(); fill(...col); textSize(11); textAlign(LEFT, CENTER); if (aPx > 18) { text('a = ' + formatLength(a), cubeX + aPx + 8, cubeY + aPx / 2); } else { // Very tiny cube -- annotate above instead textAlign(LEFT, BOTTOM); text('a = ' + formatLength(a), cubeX + aPx + 8, cubeY + aPx); } pop(); // Off-scale warning -- triggers for rho < ~0.125 (gives a > 2 m) if (a > rulerLen) { noStroke(); fill(...HOT); textSize(10); textAlign(RIGHT, BOTTOM); text('cube extends off ruler (a = ' + formatLength(a) + ')', rightBoxX + rightBoxW - 8, rulerY - 4); } pop(); } function formatLength(a) { // a is in metres. Render in m if >= 0.1 m, otherwise in cm. if (a >= 0.1) return nf(a, 1, 2) + ' m'; if (a >= 0.001) return nf(a * 100, 1, 1) + ' cm'; return nf(a * 1000, 1, 1) + ' mm'; } // ===================================================================== // Input handling -- axis is the slider // ===================================================================== function mousePressed() { // Inside the axis hit-strip: snap and start dragging. const hitY0 = axisY - 24; const hitY1 = axisY + 24; if (mouseY >= hitY0 && mouseY <= hitY1 && mouseX >= axisX && mouseX <= axisX + axisW) { markRho = pxToRho(mouseX); dragging = true; return; } // Inside the marker's vertical guide: also start dragging. const mx = rhoToPx(markRho); if (Math.abs(mouseX - mx) <= 8 && mouseY < height - 50) { dragging = true; } } function mouseDragged() { if (dragging) { markRho = pxToRho(constrain(mouseX, axisX, axisX + axisW)); } } function mouseReleased() { dragging = false; } function keyPressed() { // Arrow keys nudge the marker in log-rho space; up/down jump between // the named materials in order of density. const dLog = 0.05; if (keyCode === LEFT_ARROW) { markRho = Math.pow(10, Math.max(RHO_LOG_MIN, Math.log10(markRho) - dLog)); } if (keyCode === RIGHT_ARROW) { markRho = Math.pow(10, Math.min(RHO_LOG_MAX, Math.log10(markRho) + dLog)); } if (keyCode === UP_ARROW) markRho = nextMaterial(markRho, +1); if (keyCode === DOWN_ARROW) markRho = nextMaterial(markRho, -1); } function nextMaterial(rho, dir) { // Find the named material strictly above (dir = +1) or below // (dir = -1) the current rho. If none exists in that direction, // return the current value unchanged. const sorted = MATERIALS.slice().sort((a, b) => a.rho - b.rho); if (dir > 0) { for (const m of sorted) if (m.rho > rho * 1.001) return m.rho; } else { for (let i = sorted.length - 1; i >= 0; i--) { if (sorted[i].rho < rho * 0.999) return sorted[i].rho; } } return rho; } // ===================================================================== // HUD -- title, subtitle, hints, live readout, canonical equation // ===================================================================== function drawHUD() { // Top-left: title + Wikitube URL (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/Density', 14, 42); // Top-right: control hints (Betterfire Standard rule 3) textAlign(RIGHT, TOP); textSize(10); fill(...DIM); text('drag along the rho axis', width - 14, 12); text('left / right: nudge log-rho', width - 14, 24); text('up / down: jump to next material', width - 14, 36); text('click a tick to snap', width - 14, 48); // Bottom-left: live readout const grp = groupOf(markRho); const near = nearestMaterial(markRho); const a = Math.cbrt(1 / Math.max(markRho, 1e-6)); fill(...DIM); textAlign(LEFT, BOTTOM); textSize(11); text('group: ' + grp + ' nearest reference: ' + near.label + ' (' + formatRho(near.rho) + ')', 14, height - 26); fill(FG); textSize(13); text('rho = ' + formatRho(markRho) + ' kg/m^3 ' + '1 kg cube side a = ' + formatLength(a), 14, height - 8); // Bottom-right: canonical equation (Betterfire Standard rule 4) textAlign(RIGHT, BOTTOM); fill(FG); textSize(12); text('rho = m / V (ideal gas: rho = P M / (R T))', width - 14, height - 8); } function formatRho(rho) { if (rho >= 1000) return nf(rho, 1, 0); if (rho >= 1) return nf(rho, 1, 2); if (rho >= 0.01) return nf(rho, 1, 3); return rho.toExponential(2); } // ===================================================================== // End of Density.js -- Wikitube microsim, Helium room, Pattern 8. // ===================================================================== ``` ## MicroSim spec - **Recommended sim type:** particle [[System|system]] - **Microsimmability score:** 70/100 - **Layout:** drawing region (canvas) on top; control region (sliders/buttons) below. ### Parameters (tunable controls) - `Particle density rho_p - 500 to 5000 kg/m^3` - `Fluid density rho_f - 800 to 1200 kg/m^3` - `Particle size` ### What animates Particles rise, suspend, or settle in a fluid column as the density difference and size change, sorting visibly by their buoyancy and terminal [[Velocity|velocity]]. ### Learning objective Relate settling and buoyant separation to density difference and particle size. ## Links (Wikipedia order) <!-- injected from _registry/childlinks/Density.json (2026-07-30T02:09:12Z) --> `Aerogel` · `Aerographite` · [[Alloy]] · [[Aluminium]] · `Amount_of_substance` · [[Antimony]] · `Apocrypha` · `Archimedes` · `Area_density` · `Aristotle` · [[Atomic_mass]] · `Avogadro's_law` · `Avogadro_constant` · `Bar_(unit)` · `Basalt` · [[Beryllium]] · [[Bismuth]] · `Boltzmann_constant` · `Boyle's_law` · `Brass` · `Bulk_density` · `Buoyancy` · `Bushel` · [[Cadmium]] · `Celsius` · `Charge_density` · `Charles's_law` · [[Chromium]] · `Close-packing_of_equal_spheres` · [[Cobalt]] · `Committee_on_Data_of_the_International_Science_Council` · `Compressibility` · `Concrete` · `Conserved_quantity` · `Convection` · `Cooking_oil` · [[Copper]] · `Cork_(material)` · `Cubic_centimetre` · `Cubic_foot` · `Cubic_inch` · `Cubic_metre` · `Cubic_yard` · `Dalton_(unit)` · `Dasymeter` · `De_architectura` · `Densities_of_the_elements_(data_page)` · `Density_(disambiguation)` · `Density_gradient` · `Density_of_air` · `Diamond` · `Diiodomethane` · `Dimensional_analysis` · `Displacement_(fluid)` · `Dord` · [[Earth]] · `Earth's_inner_core` · `Electric_charge` · `Energy_density` · `Eureka_(word)` · `Faraday_constant` · `Fluid_ounce` · `Force_density` · `Galileo_Galilei` · `Gas_constant` · `Gay-Lussac's_law` · [[Germanium]] · `Girolami_method` · `Glass` · `Glenn_Research_Center` · `Glycerol` · `Gneiss` · [[Gold]] · `Goldsmith` · `Grain_(unit)` · `Gram` · `Gram_per_cubic_centimetre` · `Granite` · `Greek_language` · [[Helium]] · `Hiero_II_of_Syracuse` · [[Hydrogen]] · `Hydrometer` · `Hydrostatic_weighing` · `Ice` · `Ideal_gas` · `Ideal_gas_law` · `Imperial_units` · `Intensive_and_extensive_properties` · `International_Organization_for_Standardization` · `International_System_of_Quantities` · `International_System_of_Units` · `Interstellar_medium` · [[Iridium]] · [[Iron]] · `Kelvin` · `Kilogram` · `Kilogram_per_cubic_metre` · [[Lead]] · `Limestone` · `Linear_density` · `Liquid` · `Liquid_hydrogen` · `Liquid_oxygen` · `List_of_chemical_elements` · `Literal_translation` · [[Lithium]] · `Litre` · `Local_Interstellar_Cloud` · [[Magnesium]] · [[Manganese]] · `Mass` · `Mass_concentration_(chemistry)` · `Mass_fraction_(chemistry)` · [[Mercury_(element)]] · `Metallic_microlattice` · `Miscibility` · `Molality` · `Molar_concentration` · `Molar_mass` · `Molar_mass_constant` · `Molar_volume` · `Mole_(unit)` · `Mole_fraction` · [[Molybdenum]] · `Multiplicative_inverse` · `Neutron_star` · [[Nickel]] · [[Niobium]] · `Number_density` · `Nylon` · `Oak` · `Ohio_State_University` · `Orthobaric_density` · `Oscillating_U-tube` · [[Osmium]] · `Packaging` · `Paper_density` · `Particle_mass_density` · `Particle_number` · `Physical_quantity` · `Pine` · [[Platinum]] · [[Plutonium]] · `Polypropylene` · [[Potassium]] · `Pound_(mass)` · `Power_density` · `Precious_metal` · `Pressure` · `Quartzite` · `Relative_density` · [[Rhenium]] · `Rho` · [[Rhodium]] · `Salinity` · `Sand` · [[Selenium]] · [[Silicon]] · [[Silver]] · `Slug_(unit)` · [[Sodium]] · `Solid` · `Solution_(chemistry)` · `Specific_volume` · `Specific_weight` · `Spice_(oceanography)` · `Standard_temperature_and_pressure` · `Styrofoam` · [[Sun]] · `Supercooling` · [[Tantalum]] · `Temperature` · `Test_tube` · `Thermodynamic_temperature` · [[Thermodynamics]] · [[Thorium]] · [[Tin]] · [[Titanium]] · `Tonne` · `Troy_weight` · [[Tungsten]] · `Tungsten_hexafluoride` · `Unit_cell` · [[Uranium]] · [[Vanadium]] · `Vitruvius` · `Volume` · `Volume_(thermodynamics)` · `Water` · [[Wayback_Machine]] · `Weighing_scale` · `Weight` · `White_dwarf` · `Wood` · `Wreath` · [[Zinc]] ## From the Real GENERATIVE library (beauty pass) ![Density image](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Air_density_vs_temperature.svg/400px-Air_density_vs_temperature.svg.png) *Density — image hotlinked from Wikimedia Commons (via the Real G.E.N.E.R.A.T.I.V.E. course library, Audio room). [Details & license](https://commons.wikimedia.org/wiki/File:Air_density_vs_temperature.svg).* > Density (volumetric mass density or specific mass) is a substance's mass per unit of volume. The symbol most often used for density is ρ (the lower case Greek letter rho), although the Latin letter D can also be used. ([Wikipedia](https://en.wikipedia.org/wiki/Density)) <!-- BEAUTY-PASS-MEDIA:END --> > **Room:** [[Helium]] · **Status:** ✅ shipped ## Overview Density (rho) is the mass per unit volume of a substance, expressed by the relation rho = m/V. Its SI unit is the kilogram per cubic metre (kg/m^3), though g/cm^3 remains common in [[Materials_science|materials science]] and [[Chemistry|chemistry]]. The concept underpins Archimedes' principle from antiquity, which links buoyant [[Force|force]] to the weight of displaced fluid, and from there to centuries of pycnometry, hydrometry, and gas-displacement metrology. For ideal gases, rho = PM/(RT), so density rises with pressure and molar mass and falls with temperature. This is why hot air ascends, and why helium — molar mass 4.003 g/mol, rho = 0.1786 kg/m^3 at STP — is roughly seven times less dense than air at 1.225 kg/m^3, giving it lifting capacity of about 1.05 kg/m^3 in atmosphere. Liquids cluster near 1,000 kg/m^3 (water 999.97 kg/m^3 at 4 C is the reference for specific gravity), while solids span four orders of magnitude, from cork near 240 to osmium at 22,590, the densest stable element. Density organizes macroscopic phenomena across disciplines: [[Earth]]'s mantle-core layering, ocean thermohaline circulation, astrophysical compact objects ([[Neutron|neutron]]-star matter near 10^17 kg/m^3), and aerospace lift calculations. [[Engineering]] codes such as ASME BPVC and the ASTM consensus standards propagate density through every stress, flow, and heat-transfer computation. As a scalar field over three-dimensional space, density is intrinsically a spatial-visualization problem: contour maps, isosurfaces, and packing diagrams render its variation across materials and conditions. ## See also - Room hub: [[Helium]] - p5.js Editor conventions: P5 JS EDITOR - Wiki root: MAIN --- *Scaffolded by `generative-microsim` from row 130 of the Helium sheet on 2026-05-14T12:30:28Z.* <!-- BEAUTY-PASS-MEDIA: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/Density) : [Wikitube](https://en.wikitube.io/wiki/Density) ## Previous hub tags Tree parents: [[Helium]] · [[Hydrogen]] · [[Oxygen]]. Legacy hubs: none. --- *Sources: 2 legacy notes. Minted wave 1, 2026-07-30 (v1.6 order).*