The 3D version of this sim places excitons on a hexagonal grid of trap sites and reads off the Coulomb binding, Stark shift and lifetime from closed-form textbook formulas. This 2D companion computes a genuinely different, deeper layer: it builds the real corrugated moiré potential landscape from its Fourier expansion and then integrates real stochastic (Langevin) dynamics of trapped excitons hopping between wells in that landscape.
λ = a / (2 sin(θ/2)), G = 4π / (√3 λ) (moiré reciprocal-lattice vector)
V(x,y) = −V₀(d) · Σ_{k=0,1,2} cos(b_k·r), b_k at 0°, 120°, 240°, |b_k| = G
V₀(d) = V₀_ref · exp[−(d − d_ref)/d₀] (interlayer coupling decays with separation)
γ dr/dt = −∇V(r) + √(2 D) · ξ(t), D = k_BT/γ (overdamped Langevin / Euler–Maruyama)
rate_Kramers ≈ [κ_min / (2πγ)] · exp(−ΔV / k_BT) (activated-hopping estimate)
The three-cosine sum is the standard interlayer-exciton moiré potential form used to interpret twisted TMDC heterobilayers, and it produces exactly the same triangular lattice of trap minima, spaced by the same λ, as the geometric hexagonal grid drawn in the 3D sim — verified numerically by a grid search that locates every local minimum of V(x,y) and checks its nearest-neighbour spacing against the λ formula above. Excitons here are not placed on that grid by construction: each one is a stochastic particle that diffuses in the real computed potential and only ends up sitting near a well because the Langevin dynamics pulls it there, occasionally hopping to a neighbouring well when a thermal kick clears the barrier ΔV = Vmax − Vmin. The live "measured" hop rate — how often that happens per exciton, counted directly from the running simulation — is compared against the Kramers estimate built from the well's curvature and ΔV, the same activated-rate law that governs real phonon-assisted interlayer-exciton diffusion between moiré traps.
- Twist angle — sets the moiré period and hence the spacing and density of wells drawn from the grid search.
- Interlayer separation — a thicker gap weakens both the Coulomb binding and the moiré coupling V₀, shrinking ΔV and speeding up hopping.
- Electric field — tunes the emission energy via the Stark effect and lengthens the radiative lifetime, exactly as in the 3D companion's formulas.
- Simulation time runs on an internal reduced clock (γ = 1 in simulation units), so hop counts are only meaningful relative to each other, not as literal real-world nanosecond rates.
Standalone verification (Node, same functions): the grid-search minima spacing matched the λ formula to within ~1.4% (a small, constant discretization error from the finite grid, unchanged across a 13× range of λ). A longer offline Monte Carlo run at several separations — after fixing an early bug where thermal jitter across a Voronoi boundary was miscounted as repeated hops (a settle-then-confirm capture radius fixes it, see comment in the source) — showed the measured hop rate falling off exponentially with ΔV in the correct direction and by the correct order of magnitude relative to the Kramers estimate (ratio between roughly 0.8× and 20× across the tested range); the fitted Arrhenius slope came out about 3× shallower than the ideal −1/k_BT, which is expected — the live nu₀ here uses only the well-bottom curvature, not the full saddle-point curvature a rigorous multidimensional Kramers rate needs, so treat the live comparison as order-of-magnitude, not an exact quantitative match.