Replication build

Thunder v1.0 — charge-conserving gap ionization

A particle model of thundercloud charging, and of the discharge that follows from it.
Harkiolakis, N.: A charge-conserving gap-ionization discharge scheme for particle models of thundercloud electrification: a case study with Thunder v1.0. Submitted to Geoscientific Model Development.
Opens in its own window, so this guide stays available beside it.

What the simulation does

The discharge is simple to state. When the axial field in the gap between two oppositely signed charge layers reaches the ionization level, the gap is filled with neutral air at the simulation's own initial density. Molecules where the local field exceeds threshold separate into a positive ion and an electron. Everything after that follows from the same force law that moves every other particle in the domain.

There is no channel, no propagation rule and no grid. Charge is conserved at every reaction: one neutral becomes one positive and one negative, and nothing is ever deleted except in pairs.

How to run the replication

  1. Let the column settle. The layered charge structure takes a few hundred iterations to form. Watch the alternating stripes appear along the column before doing anything else.
  2. Check when the discharge arms. The layered structure takes a few hundred iterations to form, and firing before it exists would test the mechanism on a column that does not yet have the geometry it needs. The panel therefore holds the discharge until a chosen iteration, 400 by default, adjustable with the slider or the box beside it. The readout counts down to it. Raise it if the stripes in your run are slow to appear.
  3. Wait. Nothing else is required. Gap ionization and the two-species discharge are always on and cannot be switched off. Once armed, the model checks every gap in the column each 20 iterations and fires by itself the moment one reaches 250 kV m−1. The discharge status line reports what is happening while it runs.
The discharge cannot be triggered by hand. Earlier builds had an Ionize now button that fired the strongest tenth of the sampled points on a column that had not yet reached the compiled threshold. That was a demonstration rather than a replication, so it has been removed along with the rest of the manual controls. The column fires when its own field allows it, and at no other time.

What is fixed, and why

Every parameter reported in the paper is compiled into the simulation page and has been removed from its interface. What remains adjustable — the vortex, the carrier count, the view, and the iteration at which the discharge is allowed to arm — does not enter the discharge scheme. Anything observed there is therefore a replication rather than a new tuning.

Discharge parameters. Compiled in; not reachable from the interface.
ionization threshold250 kV m−1
charge anchor1 nC m−3
force softening6 u = 240 m
air fill×20 initial density
atom mass0.05 hydrometeor
electron / atom mass1.897 × 10−5
ionization speed6 u s−1
drift ceiling400 u s−1 ≡ 4 × 104 m s−1
sub-step0.4 u ≡ 400 µs
collision radius1.6 u = 64 m
product flow coupling0.10
impact coefficient α1.5 per unit
Controls removed from the interface, held at these values.
gap ionizationalways on, gaps checked every 20 iterations
iteration at which the discharge arms400 (adjustable in the panel)
two-species discharge (air fill)always on
manual firing (Measure gaps, Ionize now)removed
fast-forward (Run), Save state, Restore, Recordremoved
scale anchor40 m per unit
velocity anchor1.667 m s−1 per u s−1
regional disturbance — radius8 u
regional disturbance — shift strength12
regional disturbance — directioninward to centre, all particles
dielectric breakdown — grid cell12 u
dielectric breakdown — SOR sweeps260, auto-scaled with grid
dielectric breakdown — Ecrit3 × RMS
dielectric breakdown — propagation threshold0.8 of initiation
dielectric breakdown — branching exponent η2.0
dielectric breakdown — max cells4000
dielectric breakdown — sheath radius1 cell
dielectric breakdown — charge smoothing6 passes, auto-scaled with grid
dielectric breakdown — neutralise fraction0.85
dielectric breakdown — automatic strikingon
dielectric breakdown — lock at fraction of peak0.9

The dielectric-breakdown scheme in the second table is the old discharge treatment, the one this paper replaces. It is retained in the code so the two can be compared, but it takes no part in the results reported here and its controls have been removed to prevent it being switched on by accident.

What this build does not reproduce

The headless Python model applies a recombination probability of 0.02 per encounter and an oxygen attachment length of 30 u = 1.2 km. This browser build uses contact recombination and no attachment, so its discharge persists longer than the published median of 190 ms and will not self-terminate the way the reported runs do. Use this page to see the mechanism; use plasma.py in the archive for quantitative replication.

The archive

The model, every analysis script, the figures, the manuscript and the full running results log are deposited together at 10.5281/zenodo.21965148. The README there gives an exact command for each result reported in the paper. The random number generator is seeded deterministically, so a given seed reproduces a bit-identical column and a bit-identical discharge.