Sand and Granular Materials
Sand is neither solid nor liquid nor gas — it is a granular medium, a state of matter that obeys its own strange rules. A pile of sand can support a brick like a solid, yet flow through an hourglass like a liquid. The angle of repose, force chains, avalanches, and self-organised criticality are all consequences of the same microscopic fact: grains interact only at contact, through friction and normal forces, with no cohesion.
1. What Makes Granular Media Special?
No cohesion
Dry sand grains repel (normal force) and resist sliding (friction) but do not attract each other. Remove support and the pile collapses.
Athermal
Grains are macroscopic (≥ 1 µm). Thermal fluctuations are negligible — kT ≪ grain potential energy. Statistical mechanics needs a new handle.
Dissipative
Every contact dissipates energy through inelastic collisions and friction. There is no granular "equilibrium" without external energy input.
Jammed
Below a critical density the system flows; above it, force chains percolate and the system becomes rigid — the jamming transition.
2. Angle of Repose
Pour sand onto a surface and a conical pile forms. The slope angle θᵣ at which the pile stabilises is the angle of repose. It is set purely by interparticle friction:
There is actually a hysteresis: a pile can stand at the maximum angle of stability θₘ > θᵣ until disturbed, then avalanches back to θᵣ. This bistability drives intermittent, size-distributed avalanches.
3. Force Chains
Stress in granular media is not distributed uniformly like in a fluid — it propagates along force chains: quasi-linear paths of grains carrying far above the average load. Photoelastic disc experiments make these chains visible as bright lines under polarised light.
Force chains are the micro-scale mechanism behind the Janssen effect: in a tall cylindrical silo, the pressure at the bottom saturates with height (unlike fluid pressure which grows linearly) because grains arch and redirect load to the walls.
4. The Cellular Sand Algorithm
The "falling sand" cellular automaton represents the world as a 2D pixel grid. Each cell holds a material type (air, sand, water, fire, …). On each tick, update rules are applied per cell:
The rule is non-deterministic at step 2/3 (random choice of left vs right) to prevent lattice artefacts. The 45° CA angle of repose is an artefact of the square grid; real sand with more diagonal options (8-directional) can approximate 30–35°.
5. Avalanches and Self-Organised Criticality
Bak, Tang and Wiesenfeld (1987) showed that a slowly driven sandpile self-organises to a critical state where avalanche sizes follow a power law — no characteristic length or time scale. This is self-organised criticality (SOC):
SOC is proposed as an explanation for 1/f noise, earthquake size distributions (Gutenberg-Richter), forest fire sizes, species extinction events, and financial market crashes — all show power-law event-size statistics.
6. Bagnold Scaling and Dense Flow
Ralph Bagnold (1941) characterised flowing granular media using a dimensionless Bagnold number comparing grain-collision stress to viscous stress:
In deep water (Ba small) sand grains behave like a viscous suspension. In air (Ba large) inter-grain collisions dominate and the shear stress scales with the square of shear rate — a key factor in aeolian dune formation.
7. JavaScript Falling Sand Simulation
// Cellular automata falling sand simulation
const W = 200, H = 150;
const EMPTY = 0, SAND = 1, WALL = 2;
const grid = new Uint8Array(W * H);
const idx = (x, y) => y * W + x;
const get = (x, y) => (x < 0 || x >= W || y < 0 || y >= H) ? WALL : grid[idx(x, y)];
const set = (x, y, v) => { if (x >= 0 && x < W && y >= 0 && y < H) grid[idx(x, y)] = v; };
function stepSand() {
// Iterate bottom-to-top, random left-right to avoid bias
const lr = Math.random() < 0.5;
for (let y = H - 2; y >= 0; y--) {
for (let x = 0; x < W; x++) {
if (grid[idx(x, y)] !== SAND) continue;
if (get(x, y + 1) === EMPTY) {
set(x, y + 1, SAND); set(x, y, EMPTY);
} else {
const dl = get(x - 1, y + 1) === EMPTY;
const dr = get(x + 1, y + 1) === EMPTY;
if (dl && dr) {
const dx = lr ? -1 : 1;
set(x + dx, y + 1, SAND); set(x, y, EMPTY);
} else if (dl) {
set(x - 1, y + 1, SAND); set(x, y, EMPTY);
} else if (dr) {
set(x + 1, y + 1, SAND); set(x, y, EMPTY);
}
}
}
}
}
// Colour palette: sand pixel by height for depth illusion
function sandColour(y) {
const t = y / H;
const r = Math.round(194 + t * 20);
const g = Math.round(160 - t * 20);
return `rgb(${r},${g},80)`;
}
// BTW sandpile SOC model for educational comparison
function btwTopple(z, W, H) {
let avalanche = 0;
let active = true;
while (active) {
active = false;
for (let y = 1; y < H - 1; y++)
for (let x = 1; x < W - 1; x++) {
if (z[y * W + x] >= 4) {
z[y * W + x] -= 4;
z[(y-1) * W + x]++; z[(y+1) * W + x]++;
z[y * W + (x-1)]++; z[y * W + (x+1)]++;
avalanche++; active = true;
}
}
}
return avalanche;
}
8. Applications
- Civil and mining engineering: Silo design, slope stability analysis, embankment construction, and underground tunnelling all require understanding granular flow and force chain dynamics.
- Pharmaceutical manufacturing: Pill presses, powder blending, and capsule filling depend on reliable powder flow — segregation by grain size is a persistent problem during mixing.
- Aeolian geomorphology: Desert dune migration, sand saltation, and ripple patterns emerge from Bagnold-regime grain-air interaction — studied for planetary surface science (Mars, Titan).
- Avalanche prediction: Snow avalanche models combine angle-of-repose physics with weather data and slope geometry to issue warnings.
- Game engines: Falling sand games (Powder Toy, Noita) implement extended cellular automata with fire, water, acid, and electrical interactions — a popular genre spawned from this simple physics.