Skip to content

Jupiter Radio Bursts

Jupiter is the strongest radio source in the solar system after the Sun. Its decametric emissions (roughly 15-40 MHz) occur when Io passes through specific orbital positions relative to Jupiter’s rotating magnetic field. pg_orbit computes the two geometry parameters that govern these bursts — Io phase angle and Jupiter Central Meridian Longitude — and maps them to an empirical burst probability using the Carr et al. (1983) source regions.

This is the feature built for the Radio JOVE community. There are 500-1000 active Radio JOVE operators worldwide, and until pg_orbit, the standard prediction tool was Radio Jupiter Pro — a Windows-only desktop application. Batch prediction, calendar generation, and integration with observation scheduling are now possible in SQL.

Jupiter radio observation planning has relied on a small set of tools:

  • Radio Jupiter Pro (Windows): The standard tool. Shows a real-time display of Io phase, CML, and burst probability. Single-observer, single-time, no batch output. Windows-only.
  • Manual CML/Io-phase charts: Published charts (Carr, Desch, Alexander 1983) show which CML-Io phase combinations produce bursts. Observers print the chart and overlay their observing window by hand.
  • Radio-SkyPipe and SkyPipe II: Recording software that can trigger on signal, but prediction is separate.
  • Spreadsheets: Some operators maintain Excel sheets that compute CML from Jupiter’s rotation rate. Error-prone, per-session.

The problem: planning an observation campaign over weeks or months means running Radio Jupiter Pro repeatedly for each night, eyeballing the probability, and writing down the good windows. There is no way to generate a calendar of optimal observation windows in one operation.

Three functions cover the complete Jupiter radio prediction pipeline:

FunctionReturnsWhat it computes
io_phase_angle(time)degrees [0, 360)Io’s orbital position. 0 = superior conjunction (behind Jupiter).
jupiter_cml(observer, time)degrees [0, 360)Central Meridian Longitude, System III (1965.0). Light-time corrected.
jupiter_burst_probability(io_phase, cml)0.0 to 1.0Empirical probability based on Carr source regions.

The probability function encodes four source regions from the Carr et al. (1983) model:

SourceCML RangeIo Phase RangeProbabilityDescription
A200-260195-2650.8Strongest. Io-related, occurs when Io is at superior conjunction.
B100-20060-1500.5Io-related, occurs when Io is ~90 degrees ahead of Jupiter.
C300-20220-3100.3Weaker. Non-Io component, occurs at specific CML ranges.
D350-6080-1400.2Weakest of the four. Non-Io related.

Outside these regions, the probability is 0.0. Overlapping regions combine to the higher probability.

  • No signal detection. pg_orbit predicts when bursts are likely, not whether one is occurring. Use Radio-SkyPipe or SDR software for actual signal capture.
  • No frequency prediction. The model predicts occurrence probability, not the specific frequency structure (L-bursts vs. S-bursts) or intensity.
  • No RFI assessment. Local radio interference is often the biggest obstacle to Jupiter observation. pg_orbit does not model your local RF environment.
  • No receiver pointing. At 20 MHz, most receivers use fixed dipole antennas. Pointing is not an issue, but Jupiter must be above the horizon. Combine with planet_observe(5, ...) to check elevation.

What are the Io phase and CML right now?

SELECT round(io_phase_angle(now())::numeric, 1) AS io_phase,
round(jupiter_cml('40.0N 105.3W 1655m'::observer, now())::numeric, 1) AS cml,
round(jupiter_burst_probability(
io_phase_angle(now()),
jupiter_cml('40.0N 105.3W 1655m'::observer, now())
)::numeric, 3) AS burst_prob;

Scan the next 12 hours in 10-minute steps and find windows where burst probability exceeds 30%:

SELECT t,
round(io_phase_angle(t)::numeric, 1) AS io_phase,
round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml,
round(jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml('40.0N 105.3W 1655m'::observer, t)
)::numeric, 3) AS prob
FROM generate_series(
now(),
now() + interval '12 hours',
interval '10 minutes'
) AS t
WHERE jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml('40.0N 105.3W 1655m'::observer, t)
) > 0.3
ORDER BY t;

The complete query: burst probability above threshold AND Jupiter above the horizon:

SELECT t,
round(io_phase_angle(t)::numeric, 1) AS io_phase,
round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml,
round(jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml('40.0N 105.3W 1655m'::observer, t)
)::numeric, 3) AS prob,
round(topo_elevation(planet_observe(5,
'40.0N 105.3W 1655m'::observer, t))::numeric, 1) AS jupiter_el
FROM generate_series(
'2024-03-15 00:00:00+00'::timestamptz,
'2024-03-15 12:00:00+00'::timestamptz,
interval '10 minutes'
) AS t
WHERE jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml('40.0N 105.3W 1655m'::observer, t)
) > 0.0
AND topo_elevation(planet_observe(5,
'40.0N 105.3W 1655m'::observer, t)) > 10
ORDER BY prob DESC, t;

Generate a calendar of the best observation windows over an entire month:

WITH windows AS (
SELECT t,
io_phase_angle(t) AS io_phase,
jupiter_cml('40.0N 105.3W 1655m'::observer, t) AS cml,
jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml('40.0N 105.3W 1655m'::observer, t)
) AS prob,
topo_elevation(planet_observe(5,
'40.0N 105.3W 1655m'::observer, t)) AS jupiter_el
FROM generate_series(
'2024-03-01 00:00:00+00'::timestamptz,
'2024-03-31 00:00:00+00'::timestamptz,
interval '10 minutes'
) AS t
)
SELECT t::date AS date,
t::time AS utc_time,
round(io_phase::numeric, 1) AS io_phase,
round(cml::numeric, 1) AS cml,
round(prob::numeric, 2) AS prob,
round(jupiter_el::numeric, 1) AS jup_el
FROM windows
WHERE prob >= 0.5
AND jupiter_el > 15
ORDER BY date, utc_time;

This finds every 10-minute window in March 2024 where burst probability is at least 50% and Jupiter is more than 15 degrees above the horizon. The result is a printable observation calendar.

Determine which source region is responsible for a given prediction:

WITH sources AS (
SELECT 'Source A' AS region, 200.0 AS cml_lo, 260.0 AS cml_hi,
195.0 AS io_lo, 265.0 AS io_hi, 0.8 AS prob
UNION ALL SELECT 'Source B', 100.0, 200.0, 60.0, 150.0, 0.5
UNION ALL SELECT 'Source C', 300.0, 380.0, 220.0, 310.0, 0.3
UNION ALL SELECT 'Source D', 350.0, 420.0, 80.0, 140.0, 0.2
)
SELECT t,
round(io_phase_angle(t)::numeric, 1) AS io,
round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml,
s.region,
s.prob
FROM generate_series(
'2024-03-15 00:00:00+00'::timestamptz,
'2024-03-15 12:00:00+00'::timestamptz,
interval '15 minutes'
) AS t
CROSS JOIN sources s
WHERE io_phase_angle(t) BETWEEN s.io_lo AND s.io_hi
AND (jupiter_cml('40.0N 105.3W 1655m'::observer, t)
BETWEEN s.cml_lo AND LEAST(s.cml_hi, 360.0)
OR jupiter_cml('40.0N 105.3W 1655m'::observer, t) + 360.0
BETWEEN s.cml_lo AND s.cml_hi)
ORDER BY t, s.prob DESC;

Io completes an orbit in about 1.77 days. Watch the phase angle advance over a full orbit:

SELECT t,
round(io_phase_angle(t)::numeric, 1) AS io_phase
FROM generate_series(
'2024-03-15 00:00:00+00'::timestamptz,
'2024-03-16 18:00:00+00'::timestamptz,
interval '2 hours'
) AS t;

The phase should advance roughly 203 degrees per day (360 / 1.77).

Jupiter’s System III rotation period is 9h 55m 29.7s. Watch the CML cycle through 360 degrees:

SELECT t,
round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml
FROM generate_series(
'2024-03-15 00:00:00+00'::timestamptz,
'2024-03-15 10:00:00+00'::timestamptz,
interval '30 minutes'
) AS t;

The CML completes one full rotation in just under 10 hours, meaning the same magnetic field geometry repeats roughly 2.4 times per day. This is why Jupiter radio observation windows can occur multiple times per night.

Generate the data for a CML vs. Io-phase probability plot (the classic Carr diagram):

SELECT io_phase,
cml,
jupiter_burst_probability(io_phase, cml) AS prob
FROM generate_series(0, 355, 5) AS io_phase,
generate_series(0, 355, 5) AS cml
WHERE jupiter_burst_probability(io_phase, cml) > 0;

This produces a 72x72 grid (5-degree resolution) of probability values, showing exactly the four Carr source regions. The output can be fed to any heatmap visualization tool.

Compare burst windows for operators at different longitudes. The CML depends on observer position because of light-time correction:

WITH observers(name, obs) AS (VALUES
('Boulder, CO', '40.0N 105.3W 1655m'::observer),
('Gainesville, FL', '29.6N 82.3W 30m'::observer),
('Paris, FR', '48.9N 2.3E 75m'::observer)
)
SELECT o.name,
t,
round(jupiter_cml(o.obs, t)::numeric, 1) AS cml,
round(jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml(o.obs, t)
)::numeric, 3) AS prob
FROM observers o,
generate_series(
'2024-03-15 02:00:00+00'::timestamptz,
'2024-03-15 06:00:00+00'::timestamptz,
interval '30 minutes'
) AS t
WHERE jupiter_burst_probability(
io_phase_angle(t),
jupiter_cml(o.obs, t)
) > 0.3
ORDER BY t, o.name;

The Io phase is the same for all observers (it depends only on time), but the CML varies slightly due to light-time differences. For observers on the same continent, the difference is negligible. Comparing North America to Europe shows a measurable shift.