Precipitating a metal selenite, M²⁺ + SeO₃²⁻ → MSeO₃(s), from solution follows the same three-stage picture used for most solution-grown nanocrystals: burst nucleation, diffusion-limited growth, then Ostwald ripening. The dashboard on the right shows the same bath from four angles at once: a top-down slice of the vessel, the live particle-size histogram, the Brus bandgap curve, and a scrolling strip chart of population/supersaturation history.
Nucleation (classical nucleation theory):
ΔG*/kT = B / (T_r³ · (ln S)²) S = C / C_eq
J(S,T) = A · exp(−ΔG*/kT) (only for S > 1)
r* (critical nucleus radius) = R_c0 / ln S — a surviving nucleus is
born AT r*, not at an arbitrary fixed size (see note below)
Growth / ripening (Gibbs–Thomson, LSW form):
r_crit = R_c0 / ln(S)
dr/dt = k_g·D(T) · (1/r_crit − 1/r) / r
Quantum-confined bandgap (Brus, effective-mass approx.):
E(r) = E_g,bulk + 0.376·(1/mₑ*+1/m_h*)/r² − 2.59/(ε·r) [eV, r in nm]
- Temperature — raises equilibrium solubility Ceq and the ionic diffusivity D(T), so the bath both nucleates and grows/ripens faster.
- Supersaturation S₀ — sets how far above equilibrium the initial Se(IV)/M²⁺ mixture is pushed; a short, sharp burst above the nucleation threshold (LaMer's model) yields a narrow, monodisperse population, while sustained high S keeps re-nucleating and broadens it.
- Growth-rate constant kg — a stand-in for stirring/mass-transfer efficiency in the diffusion-limited growth term.
- Simulation speed — scales how many bath-seconds pass per real second, so slow-forming populations (low S₀, low temperature) can be fast-forwarded without changing the underlying rate constants.
- Inject precursor pulse — dumps fresh monomer back into the bath. If it pushes S back above the nucleation threshold you get a second, smaller generation of particles (secondary nucleation) — the reason real syntheses meter precursor in slowly.
- Once the pool empties (S → 1), the Gibbs–Thomson term makes small particles less stable than large ones: r_crit rises, particles below it dissolve and feed particles above it — classic Ostwald ripening, visible in the vessel view as small circles shrinking away while a few grow, and in the histogram as the distribution's peak marching to the right.
- Particle color encodes the Brus-equation bandgap shift: a sub-2 nm selenite nanocrystal is confined enough to blue-shift its absorption edge well above the bulk gap (violet), converging toward the bulk value (teal) as r grows past ~6 nm — the tunable-optics effect the article's "optics / optoelectronics" applications rely on. The bandgap-curve panel plots E(r) directly and marks the population's current mean radius on it.
- Fix applied vs. the 3D original (documented, verified numerically — see code comments in this page): the 3D engine's nucleation-barrier prefactor was 5.4×10⁷, which makes exp(−ΔG*/kT) underflow to exactly zero at every reachable slider setting — nucleation never fires at all, under any control combination. It was rescaled here (a Node.js sweep across the full slider grid confirmed the corrected value reproduces a genuine LaMer burst-then-ripen curve instead of a permanently empty vessel). Separately, the original spawns every new nucleus at a fixed 0.35 nm regardless of the *current* critical radius r_crit — since r_crit is often well above 0.35 nm right after a nucleation burst (nucleation itself consumes monomer and raises r_crit), those nuclei were born already sub-critical and dissolved again within the very same physics step. Classical nucleation theory defines a critical nucleus as one born at r* itself, so this 2D engine spawns nuclei at r_crit (with a small floor/ceiling) instead of a fixed size — the same equations, applied consistently.