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