Free-electron parabolic bands give a density of states g(E) ∝ √(E−E_c) above the conduction edge and g(E) ∝ √(E_v−E) below the valence edge. The prefactor is fixed once from each material's effective density of states N_c, N_v (calibrated at 300 K via the closed-form integral below), then reused at every temperature — only the Fermi–Dirac occupation changes with T:
g_c(E) = A_c·√(E−E_c), E ≥ E_c
f(E) = 1 / (1 + exp((E−E_F)/kT))
n = ∫ g_c(E)·f(E) dE (trapezoidal, live)
N_c = A_c·(kT)^1.5·√π/2 ⇒ A_c = N_c / [(kT_ref)^1.5·√π/2]
The sidebar's "n — Boltzmann" is the mass-action-law analytic estimate (n·p = n_i², same as a band-diagram sim would show). "n — DOS integral" is computed independently here by numerically integrating the density of states against the real Fermi–Dirac function. In the non-degenerate regime (light doping, E_F well inside the gap) the two agree to within a percent — a genuine numerical cross-check that the model is self-consistent. Push the doping slider high enough to pull E_F into a band and the two intentionally diverge: that gap is the Boltzmann approximation breaking down, visible directly on the readout.
Filled particles drifting in the plot are sampled from the actual occupied-density profile g(E)·f(E) (electrons, blue) and g(E)·(1−f(E)) (holes, red) — their vertical spread tracks the real thermal tail, not a decorative animation.