Examples
Each example lives in its own directory under examples/ with a YAML input
file, a run.py driver, and a README.md. Every one follows the same
pattern — construct a WarpX from the YAML, run(), and
plot from the openPMD diagnostics:
cd examples/<name>
python run.py
See Configuration (YAML input) for the YAML reference and Plotting & analysis for the plotting helpers.
150 keV thermionic electron gun
A planar-diode electron gun, in examples/thermionic_gun/. Electrons are
emitted thermionically from a hot cathode and accelerated across a 2 cm vacuum
gap by a 150 kV bias, with self-consistent space-charge and self-magnetic
fields solved by the labframe electromagnetostatic Multigrid solver
(ES_MLMG_EMS). Emission is pulsed for 20 ps.
Geometry (2-D Cartesian — WarpX names the in-plane axes x and z):
z = 0— cathode,phi = 0Vz = 0.02 m— anode,phi = 150 kV→ electrons gain 150 keVx— transverse; PEC side walls enclose the diode
Note
The transverse walls are PEC (dirichlet), not periodic, on purpose:
the magnetostatic vector-potential solve diverges with a periodic transverse
boundary, but a fully PEC-enclosed diode is well-posed for the MLMG solver.
Running
cd examples/thermionic_gun
python run.py
This steps the simulation to 300 ps and writes diagnostics under
output/diags/ plus three plots:
phase_space_z_KE.png— longitudinal phase space (zvs. kinetic energy); the beam streams toward the anode and approaches 150 keV.centroid_z_vs_t.png— beam centroid position vs. time.potential_xz.png— the electrostatic potentialphiover the diode.
The driver script
from warpx import WarpX
w = WarpX(input_file="gun.yaml", path="output", verbose=True)
w.run()
w.plot2D("z", "kinetic_energy").savefig("phase_space_z_KE.png")
w.plot1D("t", "mean_z").savefig("centroid_z_vs_t.png")
w.plot_fields("phi", "x", "z").savefig("potential_xz.png")
The full input file (gun.yaml) and a longer write-up live in
examples/thermionic_gun/. See Configuration (YAML input) for the YAML reference.
1-D Pierce diode (Child-Langmuir limit)
A classic 1-D Pierce diode, in examples/pierce_diode/, validating WarpX
against the Child-Langmuir space-charge law. Two parallel conducting plates 8 cm
apart hold a -93 kV difference. A potassium-ion (K+) beam is flux-injected from
the cathode at the space-charge-limited current density predicted by the
Child-Langmuir law and accelerated across the gap, arriving with ~93 keV.
Cold flux injection — ions enter with a
UniformFluxdistribution and zero momentum spread, continuously refilling the gap.Electrostatic MLMG solver — the self-consistent space-charge potential uses the labframe electrostatic Multigrid solver (
ES_MLMG_LF).Non-standard species —
ions(K+) sets an explicitmass(39 m_u) andcharge(+q_e); the wrapper reads these from the openPMD output so the kinetic-energy plots are computed correctly.
Running
cd examples/pierce_diode
python run.py
This steps the simulation for 5000 steps and writes:
phase_space_z_KE.png— longitudinal phase space (zvs. kinetic energy); the ions accelerate across the gap and approach ~93 keV at the anode.pz_profile_z.png— longitudinal momentum vs. position, the acceleration profile as the ions fall through the potential.n_particle_vs_t.png— beam population vs. time, building up to the steady-state space-charge-limited current.
The driver script
from warpx import WarpX
w = WarpX(input_file="pierce_diode.yaml", path="output", verbose=True)
w.run()
w.plot2D("z", "kinetic_energy", species="ions").savefig("phase_space_z_KE.png")
w.plot2D("z", "pz", species="ions").savefig("pz_profile_z.png")
w.plot1D("t", "n_particle", species="ions").savefig("n_particle_vs_t.png")
Note
The canonical 1-D Pierce-diode result, the potential profile
phi(z) ~ z^(4/3), is not plotted: plot_fields produces 2-D heatmaps
and needs two distinct spatial plane axes, which a 1-D grid does not have. A
particle diagnostic (added beyond the upstream example, which dumps no
particles) is used to visualize the ion beam instead.
Beam-driven plasma wakefield acceleration (3-D)
A beam-driven plasma wakefield accelerator (PWFA), in
examples/plasma_acceleration/, ported from the WarpX
inputs_test_3d_plasma_acceleration_picmi.py reference input. A dense,
relativistic electron drive beam streams along +z through a uniform cold
background plasma, expelling plasma electrons and driving a trailing
longitudinal accelerating field Ez — the heart of plasma-based acceleration.
Relativistic drive beam — a transversely narrow electron bunch (
density = 1e23) with a proper velocity of1e9m/s (PICMI proper velocitygamma*beta*c, which legitimately exceeds c).Moving window — the box follows the beam at the speed of light (
moving_window_velocity = [0, 0, c]), tracking the wake.EM (Yee) solver — finite-difference time-domain Maxwell solve (
EM_Yee,cfl = 1.0) with charge-conserving Esirkepov current deposition, matching the reference input.
The 3-D PICMI variant is used so the 2-D field heatmap has two in-plane spatial
axes to slice (x-z through y = 0).
Running
cd examples/plasma_acceleration
python run.py
This steps the simulation for 10 steps and writes:
wakefield_Ez_xz.png— the longitudinal accelerating fieldEzover thex-zplane (slice throughy = 0), showing the wake behind the beam.phase_space_beam_z_pz.png— drive-beam longitudinal phase space (zvs.pz); the bunch sits nearpz ≈ 1.7MeV/c.current_Jz_xz.png— longitudinal current densityJzover thex-zplane, the drive beam’s compact current channel that drives the wake. (After only 10 steps the cold background plasma is barely perturbed, so its own phase space is uninformative; the beam current is the clearer companion toEz.)
The driver script
from warpx import WarpX
w = WarpX(input_file="plasma_acceleration.yaml", path="output", verbose=True)
w.run()
w.plot_fields("Ez", "x", "z").savefig("wakefield_Ez_xz.png")
w.plot2D("z", "pz", species="beam").savefig("phase_space_beam_z_pz.png")
w.plot_fields("Jz", "x", "z").savefig("current_Jz_xz.png")
Uniform thermal plasma
A spatially uniform, hot, collisionless electron plasma, in
examples/uniform_plasma/, ported from the WarpX
inputs_test_2d_uniform_plasma reference input — a basic PIC benchmark with
no walls or drives.
Uniform hot plasma — electrons fill the domain at a constant density (
1e25m⁻³) with an isotropic Gaussian thermal spread of 0.01c per component (rms_velocity), with an implied neutralizing background.Electromagnetic Yee solver — second-order Yee FDTD scheme (
EM_Yee) at the Courant limit (cfl = 1.0).Doubly-periodic box — both axes use periodic field and particle boundaries, so the plasma should stay statistically uniform.
Running
cd examples/uniform_plasma
python run.py
This steps the simulation for 10 steps and writes:
rho_xz.png— the charge densityrhoover the box; a neutral uniform plasma is dominated by small thermal/numerical fluctuations rather than any large-scale structure.phase_space_z_pz.png— longitudinal phase space (zvs.pz); the thermal electrons fill the box with a Gaussianpzspread and no net drift.sigma_x_vs_z.png— per-slice transverse extent vs.z; since the electrons fill the box uniformly,sigma_xshould be essentially flat.
The driver script
from warpx import WarpX
w = WarpX(input_file="uniform_plasma.yaml", path="output", verbose=True)
w.run()
w.plot_fields("rho", "x", "z").savefig("rho_xz.png")
w.plot2D("z", "pz").savefig("phase_space_z_pz.png")
w.plot1D("z", "sigma_x").savefig("sigma_x_vs_z.png")