Granular Mechanics Lab

3D DEM — elastic spheres · box & cylinder containers · SI units · z up
balls 0   t = 0.00 s  
KE 0 J   vmax 0 m/s
packing   void
✓ STEADY STATE
computing…

Balls

0.030
0.050
0.0050
1500
0.30
0.30
0.60
rigid
Balls rain from random (x, y) starting drop height above the container rim. Mass comes from density: m = ρ·(4/3)π(d/2)³, so bigger spheres are proportionally heavier. With a size increment > 0, diameters take the discrete values dmin, dmin+Δd, … dmax (0 = continuous). Friction: μslide=√(r₁r₂), μroll=0.05√(r₁r₂). Elasticity: each ball carries a contact stiffness k; a contacting pair uses the softer member's k (walls are rigid). Rigid balls are the special case at the top of the slider (k = 2·10⁴); softer balls visibly flatten (overlap) at contacts and pack denser. The timestep adapts automatically.

Container

0.40
0.40
1.00
0.0
0
0.60
0.30
10^3.5
max wall deflection (m)
inner width at mid-height (m)
Red walls are slidable pistons (1 degree of freedom along their outward normal; they exist only while piston mass > 0). Cylinders are true 3D cylinders: a curved shell plus two end caps. Bendable walls turn the box side walls (amber) or the cylinder shell into elastic membranes: node grids pinned at their edges, deflecting along the wall normal under load (stiffness in N/m per node, log slider). Rigid is the special case of a very stiff membrane — at the top of the slider the deflection is negligible. Pistons and the bottom/top stay rigid. The container rests on a fixed ground plane. Cutaway hides the front half of the packing so you can see inside.

Piston force — experiment 2

0 (off)
0
chamber size (m)
piston reaction (N)
Pick which walls are slidable in the Container section, then give the piston a mass > 0 — the piston (red) only exists and appears while its mass is positive.

Void distribution — experiment 1

packing fraction
void fraction
Void fraction per height slab (exact sphere–slab volumes; slab cross-section follows the container shape). Auto-measured at steady state.
0.50
8
v(r): pick a random particle center, measure the void fraction inside probe spheres of diameter r = Δ, 2Δ, … where the increment Δ is set in units of the mean ball diameter d̄ (exact sphere–sphere intersection volumes; probes must lie fully inside the bed region), averaged over all samples. Chart plots v against r/d̄. Set center particle size to restrict picked centers to one size class ("for a given size").

Tapping — ensemble statistics

4.0
mean specific volume ῡ
variance σ²
DOS shape k / scale θ
υmin
compactivity X
partition function Z(X)
entropy S−SRCP
bed height / Δh (m)
Volume distribution P(υ) per Chang, Chang & Chao, PRE 114, 015410 (2026), now with true 3D cells: specific volumes υi = (Voronoi cell volume)/(ball volume), computed by exact half-space clipping (wall & surface layers excluded); free volume v = υ − υmin, Gamma DOS Ω(v), Z(X) = (X/(X+θ))k, X = θv̄/(kθ−v̄). k and υmin come from the structural relation ῡ = υmin + √k·σ fitted across recorded states (tap at several Γ values for a good fit); θ from the loosest state. Chart & CSV: P(v) over the FREE volume v = υ − υmin (Eq. 1), not the total specific volume, with the factorized-Gamma prediction. Keep the bed ≥8 ball diameters deep so enough interior cells survive the exclusion margins.

Physics

extra damping when nearly still — helps hard-to-reach steady states
9.81
1.0×
300
Time step is set automatically from contact stiffness and the lightest ball. Sim speed asks for a multiple of real time; steps/frame caps how much physics each display frame may run. Raise both to fast-forward long protocols — the display fps will drop while the simulation races ahead (the HUD shows the achieved ×real-time). Drag to orbit, wheel to zoom, shift-drag (or right-drag) to pan, double-click to re-fit. Best kept to ~1–2,000 balls in the browser; for larger 3D runs use the Python engine (same physics, OpenMP C core).