❄️ Nucleation & Growth — Birth of a New Phase
A new phase appears only when fluctuations exceed a critical nucleus radius: below it clusters dissolve, above it they grow. Watch undercooling drive nucleation.
About this simulation
This simulation is a Monte Carlo model of classical nucleation theory (the physics of how a new phase, like a crystal or droplet, first appears). Every frame it spawns random "embryo" clusters whose radius is drawn from a thermal-noise distribution centred near the critical radius r* = 2γ/ΔGv, where γ is surface energy and ΔGv is the volume free-energy driving force set by undercooling. Clusters smaller than r* shrink and dissolve each step; clusters at or above r* grow, following ΔG(r) = −(4/3)πr³·ΔGv + 4πr²·γ. The dashed ring on screen marks the live r*.
🔬 What it shows
Hundreds of randomly seeded clusters, some fading away (sub-critical, shown faint) and some expanding into stable crystals (super-critical, shown with a bright radial gradient), driven purely by the balance between surface energy and volume free energy predicted by classical nucleation theory.
🎮 How to use it
Drag the Undercooling ΔT slider to raise the driving force and shrink r*; the Surface energy γ slider enlarges r* and the nucleation barrier. Nucleation rate sets how many embryos appear per frame, and Growth speed sets how fast super-critical nuclei expand. Click or tap the canvas to seed a guaranteed super-critical nucleus at that spot. Pause/Play and Reset control the run, and the live stats panel reports r*, the barrier ΔG*, surviving nuclei, and the dissolved count.
💡 Did you know?
Pure water can be supercooled well below 0°C and stay liquid because no stable nucleus has formed yet — a single speck of dust or a sharp tap can trigger near-instant ice crystallisation, the same critical-radius physics modelled here.
Frequently asked questions
What is the critical radius r* in this simulation?
r* is the cluster radius at which the free energy ΔG(r) is at its maximum. The simulation computes it live as r* = 2γ/ΔGv from the Surface energy and Undercooling sliders. Clusters smaller than r* are shown shrinking and fading (unstable); clusters at or above it are shown growing with a bright gradient (stable). The dashed circle drawn near the top-right of the canvas is this exact r* value, updated every frame.
How does the Undercooling slider change the outcome?
Undercooling ΔT feeds directly into the driving force ΔGv used by the code (dGv = 0.25 + 3.0 × undercool). Since r* = 2γ/ΔGv, turning ΔT up shrinks r*, so far more randomly-sized embryos land above the critical size and survive — you will see nucleation become much more frequent and the "Surviving nuclei" counter climb faster.
What does the Surface energy γ slider do?
γ is the energy cost of creating new surface area between the old and new phase. Raising γ increases both r* (= 2γ/ΔGv) and the nucleation barrier ΔG* (= 16πγ³/(3ΔGv²)) computed by the simulation, meaning clusters need to reach a larger size before they stop shrinking — fewer random embryos will be large enough to survive.
Why do some clusters shrink and disappear while others grow?
Each spawned embryo gets a random starting radius drawn from a rough thermal distribution around r*. In the step() function, any cluster with radius below the current r* has its radius reduced every frame until it is dissolved (added to the Dissolved counter); any cluster at or above r* has its radius increased at a rate based on Growth speed and Undercooling, with growth slowing as it approaches roughly half the canvas size.
What happens when I click or tap on the canvas?
Clicking or tapping calls the seedAt() function, which places a new cluster at that exact point with radius set to 1.4 × the current r* — guaranteed to be super-critical — so it immediately starts growing regardless of the random thermal distribution used for automatic embryos.
Watch undercooling push cluster fluctuations past the critical nucleus radius, tipping them from dissolving to runaway crystal growth.
3D · Three.js / WebGL renderer · 60 FPS target · runs fully client-side, no install