HomeArticlesGranular Gas

Granular Gas: Haff's Law, Clustering and Inelastic Collapse

Why a box of colliding discs cools instead of equilibrating, and how that cooling drives a runaway clustering instability.

mysimulator teamUpdated June 2026≈ 7 min read▶ Open the simulation

A gas that loses energy every time it collides

An ordinary gas of hard spheres conserves kinetic energy in every collision — that's what makes it possible for the Maxwell-Boltzmann equilibrium to exist and last forever once reached. A granular gas — sand, gravel, powder, a box of dice — is different in one crucial respect: every collision between grains is inelastic, dissipating a fraction of the relative kinetic energy as heat, sound and deformation. That single change breaks energy conservation and, with it, most of the machinery of equilibrium statistical mechanics. Without a continuous energy input (shaking, pouring, gravity), a granular gas is not a gas that reaches equilibrium — it is a gas that inexorably cools.

live demo · inelastically colliding discs cooling and clustering● LIVE

The coefficient of restitution and Haff's law

Each collision is characterised by a coefficient of restitution e (0 ≤ e ≤ 1): the ratio of the relative speed after a collision to before it. Perfectly elastic collisions have e = 1 and conserve energy exactly, like the standard gas simulations elsewhere on this site; granular grains typically have e in the range 0.6–0.9, losing a fixed fraction of kinetic energy on every impact. For a homogeneously cooling granular gas — one that hasn't yet clustered — this leads to a remarkably simple prediction from kinetic theory, Haff's law (1983): the granular temperature (mean kinetic energy per particle) decays as a power law in time.

T(t) = T₀ / (1 + t/τ)²          // Haff's law: granular temperature decay
τ = characteristic cooling time, ∝ 1/[(1-e²)·n·σ·v₀]
// n: number density   σ: collision cross-section   v₀: initial speed
// contrast with elastic gas: T(t) = T₀ forever (no dissipation)

Why the gas doesn't cool uniformly: clustering instability

Haff's law describes the homogeneous cooling state, but that state is unstable. Here's the mechanism: a random density fluctuation creates a region with slightly more grains than average; grains there collide more often, so they lose energy (and therefore speed) faster than grains in sparser regions; slower, cooler grains offer less outward pressure to resist further inward drift, so the dense region attracts even more grains, collides even more, cools even faster — a runaway positive feedback loop called the clustering instability. Left to run, an initially uniform granular gas spontaneously segregates into dense, nearly stationary clusters separated by comparatively empty, hotter regions — a pattern-forming instability with no equivalent in an ordinary elastic gas, where no such feedback loop exists because nothing ever cools.

Inelastic collapse: when the simulation must intervene

Push the inelasticity or density high enough and clustering can run away completely: an infinite number of collisions can occur in a finite amount of time as grains in a tight cluster bounce against each other with ever-shrinking relative velocities and ever-shrinking time gaps — a phenomenon called inelastic collapse. Real event-driven granular simulations have to detect this (a diverging collision rate in a shrinking neighbourhood) and apply a regularization, commonly a TC model that switches to elastic collisions (e = 1) once the relative velocity in a cluster drops below a small cutoff, which is a reasonable physical proxy for the fact that real grains have finite stiffness and don't actually collide infinitely often in zero time.

Why shaking keeps a granular gas gas-like

Every real application of granular materials — a sand table, a rock tumbler, a fluidized bed reactor, an hourglass — continuously re-injects energy, usually through vibration or gravity acting on a driven boundary. That energy input balances the collisional dissipation and lets the system reach a non-equilibrium steady state instead of collapsing into clusters: a driven granular gas has a well-defined but generally non-Maxwellian velocity distribution (its tails are typically overpopulated relative to a true Maxwell-Boltzmann distribution, a signature that shows up in real experiments with vibrated grains) with a temperature set by the balance between driving power and collisional loss rather than by an initial condition. This is exactly why granular materials in industry — pharmaceutical powders, grain silos, mining conveyor systems — are engineered around continuous agitation: stop shaking, and the material stops behaving like a fluid at all.

Frequently asked questions

What makes a granular gas fundamentally different from an ordinary gas?

Collisions between grains are inelastic — each one dissipates kinetic energy rather than conserving it. Without continuous energy input the system doesn't reach a stable Maxwell-Boltzmann equilibrium the way an ordinary gas does; instead its temperature decays over time following Haff's law.

Why do the discs clump together instead of staying spread out?

A random denser patch collides and cools faster than its surroundings, which lowers its pressure and lets more grains drift in — a runaway positive-feedback loop called the clustering instability. It has no counterpart in an elastic gas, where no region ever preferentially loses energy.

What is inelastic collapse and why does the simulation cap collisions?

In a tight, cooling cluster, collisions can in principle occur infinitely often in a finite time as relative velocities shrink toward zero. Simulations detect this runaway and switch to elastic collisions below a velocity cutoff, approximating the fact that real grains have finite stiffness and can't truly collide with zero time between impacts.

Try it live

Everything above runs in your browser — open Granular Gas and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.

▶ Open Granular Gas simulation

What did you find?

Add reproduction steps (optional)