Skip to content

Jets and Medium

Forward Shock Synchrotron

The forward shock drives a relativistic blast wave into the circumburst medium, accelerating electrons that emit synchrotron radiation. This is the dominant emission component for most GRB afterglows.

The sync_ssa_smooth model produces smooth broken power-law spectra with self-absorption, suitable for broadband modeling. For best accuracy, enable the radiative correction by passing eps_e, eps_b, and p_fwd to the Jet constructor — this accounts for the energy radiated away by electrons when computing the blast wave dynamics.

import numpy as np
from blastwave import Jet, TopHat, ForwardJetRes

P = dict(
    Eiso=1e52, lf=300, theta_c=0.1,
    n0=1.0, A=0.0, eps_e=0.1, eps_b=0.01, p=2.2,
    theta_v=0.0, d=474.33, z=0.1,
)

t = np.geomspace(10, 1e8, 200)  # seconds

jet = Jet(
    TopHat(0.1, 1e52, lf0=300),
    0.0, 1.0,  # nwind, nism
    tmin=10.0, tmax=1e10,
    grid=ForwardJetRes(0.1, 129),
    spread=True,
    eps_e=0.1, eps_b=0.01, p_fwd=2.2,  # radiative correction
)

flux_radio   = jet.FluxDensity(t, 1e9,  P, model="sync_ssa_smooth")  # 1 GHz
flux_optical = jet.FluxDensity(t, 4.56e14, P, model="sync_ssa_smooth")
flux_xray    = jet.FluxDensity(t, 2.4e17, P, model="sync_ssa_smooth")  # 1 keV

Characteristic features of the afterglow light curve:

  • X-ray: Decays as a power law from early times, since \(\nu_X > \nu_c > \nu_m\)
  • Optical: Peaks at \(\sim 10^{-3}\) days as \(\nu_m\) passes through the band
  • Radio: Rises over days to weeks as the self-absorption frequency \(\nu_a\) drops below the observing band
  • Jet break: Visible as a steepening at \(\sim 10\) days when the jet edge becomes visible
2026-03-05T23:03:34.244034 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

Script: examples/showcase_jets.py


Jet Structure

blastwave supports three angular energy profiles, set through the first argument to Jet():

Profile Constructor Energy profile \(E(\theta)\)
TopHat TopHat(theta_c, E_iso, lf0) Uniform inside \(\theta_c\), zero outside
Gaussian Gaussian(theta_c, E_iso, lf0) \(\propto \exp(-\theta^2 / 2\theta_c^2)\)
PowerLaw PowerLaw(theta_c, E_iso, lf0, s) \(\propto (1 + (\theta/\theta_c)^2)^{-s/2}\)

The jet structure primarily matters for off-axis observers (\(\theta_v > \theta_c\)), where the wing emission from structured jets produces smoother, brighter light curves than the sharp-edged tophat. On-axis, all three profiles produce nearly identical light curves since the core dominates the emission.

from blastwave import FluxDensity_tophat, FluxDensity_gaussian, FluxDensity_powerlaw

P_off = {**P, 'theta_v': np.radians(15)}

flux_th = FluxDensity_tophat(t, 2.4e17, P_off, spread=True, model="sync_ssa_smooth")
flux_ga = FluxDensity_gaussian(t, 2.4e17, P_off, spread=True, model="sync_ssa_smooth")

P_pl = {**P_off, 's': 4}
flux_pl = FluxDensity_powerlaw(t, 2.4e17, P_pl, spread=True, model="sync_ssa_smooth")

Off-axis, the structured jets (Gaussian, PowerLaw) show earlier and brighter peaks than the TopHat, because their gradual energy wings provide partial illumination at all viewing angles. The TopHat shows a sharp rise only when the jet decelerates enough for the beaming cone to reach the observer.

2026-03-05T23:03:35.436200 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

Script: examples/showcase_jets.py


Circumburst Medium

The ambient density profile is controlled by nism (constant ISM), nwind (wind-like \(\propto r^{-k}\)), and the power-law index k:

Medium Parameters Density profile
ISM nism=1.0, nwind=0.0, k=0 \(n = n_0\) = const
Wind nism=0.0, nwind=A, k=2 \(n = A \cdot (r / 10^{17}\,\mathrm{cm})^{-2}\)
Hybrid nism=n_0, nwind=A, k=2 \(n = A \cdot (r/10^{17})^{-2} + n_0\)

The wind parameter A relates to the standard mass-loss parameter \(A_*\) through the density normalization at \(r = 10^{17}\) cm. For \(A_* = 0.1\), use A=2.99.

# ISM environment
jet_ism = Jet(TopHat(0.1, 1e52, lf0=300), 0.0, 1.0,
              grid=ForwardJetRes(0.1, 129), spread=False, k=0.0,
              eps_e=0.1, eps_b=0.01, p_fwd=2.2)

# Wind environment (A*=0.1)
jet_wind = Jet(TopHat(0.1, 1e52, lf0=300), 2.99, 0.0,
               grid=ForwardJetRes(0.1, 129), spread=False, k=2.0,
               eps_e=0.1, eps_b=0.01, p_fwd=2.2)

Wind environments produce earlier and brighter radio emission — the higher circumburst density at small radii boosts early-time synchrotron. X-ray light curves decay faster in wind media due to the falling density profile, which reduces the energy injection from swept-up mass.

2026-03-05T23:03:36.361704 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

Script: examples/showcase_jets.py