Article
Nature & Physics · ⏱ ≈ 12 хв читання

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:

tan θᵣ = μ_s (coefficient of static friction) Dry quartz sand: θᵣ ≈ 30–35° (μ_s ≈ 0.58–0.70) Wet sand: θᵣ ≈ 45°+ (capillary bridges add cohesion) Cornstarch: θᵣ ≈ 50°+ (irregular grain shape) Glass beads: θᵣ ≈ 22° (smooth, low μ) Beyond θᵣ: grains slip, avalanche, and re-establish θᵣ.

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.

Typical force chain: carries 3–10× mean grain force Span: 5–20 grain diameters Lifetime: short — disrupted by new grain contacts Consequence: a silo can concentrate load at a few wall points → structural engineering must account for non-uniform stress distribution, not fluid hydrostatic pressure.

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:

Sand update rule (priority order): 1. If cell below is empty → move down 2. Else if cell below-left is empty → move down-left 3. Else if cell below-right is empty → move down-right (randomise 2/3) 4. Else → stay (part of pile) This produces: - Natural pile formation (angle of repose emerges ≈ 45° in CA) - Flowing streams - Bridging / arching over small gaps

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):

P(s) ~ s^{-τ} (probability of avalanche of size s) τ ≈ 1.0–1.5 depending on dimension and model The BTW (Bak-Tang-Wiesenfeld) sandpile model: z(x,y) += 1 (drop a grain) if z(x,y) ≥ 4: z(x,y) -= 4 z(±1, 0) += 1, z(0, ±1) += 1 (topple to neighbours) repeat until stable

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:

Ba = ρ_p d² λ^{1/2} γ̇ / μ_f ρ_p = grain density, d = grain diameter λ = linear concentration = (ν_max/ν − 1)⁻¹ (packing-related) γ̇ = shear rate, μ_f = fluid viscosity Ba ≪ 1: viscous regime — fluid drag dominates Ba ≫ 1: Bagnold regime — grain collision stress ∝ γ̇² Shear stress in Bagnold regime: τ = a_B · ρ_p · d² · Ba^{1/2} · γ̇²

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

Live simulation: The Sand simulation on this site implements the falling sand cellular automaton with multi-material support.
⏳ Open Sand Simulation →