# The growth rate The growth rate is the one parameter that decides what kind of packing the Lubachevsky-Stillinger algorithm produces. This page defines it, explains why it is defined this way, and gives guidance for choosing it. ## Definition $$ \Gamma = \frac{1}{v_\mathrm{th}}\,\frac{\mathrm{d}\langle d\rangle}{\mathrm{d}t}, \qquad v_\mathrm{th} = \sqrt{k_BT/m}, $$ where $\langle d\rangle$ is the arithmetic mean diameter of the spheres and $v_\mathrm{th}$ the thermal speed: the standard deviation of one Cartesian velocity component. $\Gamma$ is a ratio of two speeds, so it is dimensionless and independent of the units of length. **Physical meaning.** While a sphere moving at the thermal speed travels one mean diameter, the mean diameter grows by the fraction $\Gamma$. Equivalently, during a compression that starts from points, a sphere moving at $v_\mathrm{th}$ travels $1/\Gamma$ final mean diameters. At $\Gamma = 0.02$ that is 50 diameters: enough collisions for the spheres to rearrange locally, too few for them to find a crystal. The mean speed is $\langle|\mathbf v|\rangle = \sqrt{8/\pi}\,v_\mathrm{th} \approx 1.60\,v_\mathrm{th}$ in 3D and $\sqrt{\pi/2}\,v_\mathrm{th} \approx 1.25\,v_\mathrm{th}$ in 2D. To express the growth rate relative to the mean speed, divide $\Gamma$ by these factors. ## Why this definition - **It contains both the size and the speed.** The behaviour of the algorithm depends on how far spheres travel, in diameters, while they grow. A growth rate in units of 1/time (as in the legacy code) only means something together with the particle size and the velocity scale; $\Gamma$ combines them. - **It enters the collision rule directly.** For equal spheres every contact distance grows at speed $\Gamma v_\mathrm{th}$, which is the minimum separation speed after a collision (see {doc}`algorithm`). - **It is the same in 2D and 3D.** The normal approach speed of colliding spheres has the same distribution in both dimensions when measured in $v_\mathrm{th}$; measured in the mean speed it would not. - **The arithmetic mean diameter is the natural reference.** All spheres have the same mass, so their speeds do not depend on their size, and the contact distance of a random pair, $a_i + a_j$, grows on average at $\mathrm{d}\langle d\rangle/\mathrm{d}t$. Every diameter grows in proportion: sphere $i$ grows at $\Gamma\,v_\mathrm{th}\,d_i/\langle d\rangle$. ## Choosing the growth rate Measured with spheropack: 1000 spheres in a periodic box, packed until jammed (`density="max"`, default `Jammed()` stop, default collision rule), mean of 5 seeds. The crystalline fraction uses {func}`spheropack.analysis.crystalline`; "contacts" is the number of contacts between force-bearing spheres relative to the isostatic number ({func}`spheropack.analysis.isostaticity`). The data are in `docs/data/growth_rate_sweep.json` and are regenerated by `benchmarks/sweep_growth_rate.py`. | $\Gamma$ | equal spheres: $\phi_J$ | crystalline | contacts | 10% polydisperse: $\phi_J$ | collisions per sphere | |---|---|---|---|---|---| | 0.3 | 0.637 | 0.2% | 0.956 | 0.639 | 3000 | | 0.1 | 0.634 | 0.4% | 0.953 | 0.636 | 3300 | | 0.03 | 0.640 | 0.7% | 0.960 | 0.642 | 3700 | | 0.01 | 0.644 | 1.2% | 0.975 | 0.647 | 5800 | | 0.003 | 0.648 | 2.7% | 0.985 | 0.651 | 13600 | | 0.001 | 0.650 | 4.1% (up to 14%) | 0.990 | 0.652 | 35500 | The standard deviation of $\phi_J$ between seeds is about 0.001. The run time is proportional to the number of collisions: about 12 s for the fastest and 2 minutes for the slowest equal-sphere runs on one core. What this shows: - **Jammed packings are dense for every growth rate.** With the default collision rule the jamming density of equal spheres only varies between 0.634 and 0.650. Slower growth gives denser packings, closer to isostatic: the spheres have more time to rearrange before they jam. This agrees with the known dependence of the jamming density on the compression rate of frictionless spheres. - **Crystallisation needs very slow growth.** At $\Gamma = 10^{-3}$ only a few percent of 1000 equal spheres are crystalline; nucleation becomes likely only for slower growth or larger systems, and the density then rises towards the close packing limit $\pi/\sqrt{18} \approx 0.7405$. Polydispersity of 10% suppresses crystallisation completely in this range. - **Loose random packings are not jammed packings.** Packings with a density well below 0.64 are obtained with a target density (`density=0.58`), which stops the growth before jamming. The legacy collision rule (`collision_rule="legacy"`) jams at lower densities when growth is fast (about 0.60 at $\Gamma = 0.16$ with `stop=Pressure(1e6)`), because it lets clusters of spheres lock prematurely; use it only to reproduce results of the legacy code. Practical advice: - The default $\Gamma = 0.02$ gives random close packing at a moderate cost. Use 0.003 to 0.01 for denser, more nearly isostatic packings, and check the crystalline fraction for large systems of equal spheres. - Equal disks in 2D crystallise easily. For random 2D packings use a mixture, for example 50:50 with size ratio 1.4. - For a target density below jamming a larger growth rate is faster, but the structure then deviates more from an equilibrium hard-sphere fluid at that density. Grow slowly (0.01 or less) when an equilibrium structure matters. ## Relation to the legacy code The legacy command-line tools took a growth rate $g$ in units of 1/time, with radii $r_i(t) = r_i\,g t/2$ and velocity components of unit variance. This corresponds to $\Gamma = g\,d/2$, with $d$ the final diameter. The settings of the legacy notebooks ($g = 0.32/d$) correspond to $\Gamma = 0.16$.