Skip to content

HFPropagationModel: negative slant TEC, and non-monotonic delay within a single mode (confirmed with real IRI) #2

Description

@mijahauan

HFPropagationModel yields negative slant TEC, and non-monotonic delay within a single propagation mode. Reproduced on AC0G-B4 with a real IRI-2020 ionosphere (source: iri), so this is not the parametric-fallback tier.

Reproduction

from datetime import datetime, timezone
from hamsci_dsp.propagation.model import HFPropagationModel
m = HFPropagationModel(receiver_lat=38.92, receiver_lon=-92.13)
t = datetime(2026, 3, 15, 18, 0, 0, tzinfo=timezone.utc)

predict('WWV', f, t):

f (MHz) mode primary_delay_ms
5 1E 4.410
10 1F 4.715
15 1F 6.933
20 1F 4.871

compute_differential_delay('WWV', a, b, t) → implied slant TEC:

pair Δdelay (ms) TEC (TECU)
5/10 −0.369 −9.15
10/20 −0.156 −15.45
5/15 −2.488 −52.06
10/15 −2.218 −296.93

Two distinct problems

  1. Negative TEC. Slant TEC cannot be negative. All four pairs return negative values spanning a 30x range.
  2. Non-monotonic delay within one mode. 5→10 MHz is explainable — those are different modes (1E vs 1F) and the F path is geometrically longer, so more delay at the higher frequency is fine. But 10/15/20 MHz are all 1F, same geometry, and the delays run 4.72 → 6.93 → 4.87. Ionospheric group delay goes as 1/f², so on a fixed path it must fall monotonically. 15 MHz is the outlier.

The implied TEC is meant to be a property of the ray path, not of the frequency pair used to probe it, so the pair-to-pair spread is the symptom that surfaced this.

Where it shows

hf-timestd's tests/test_propagation_model.py::TestHFPropagationModel::test_differential_delay_is_frequency_pair_independent asserts exactly the invariant that fails here. It is currently skipped behind a working-IRI predicate (hf-timestd 1ed8b1a) because the failure could not be attributed on a host where IRI would not build — that attribution is now done, and the skip should come off once this is fixed.

Note the environment trap while investigating: import iri2020 succeeds even when IRI is unusable — it builds its Fortran on first call, so a host without a compiler silently returns source='parametric'. Check point.source == 'iri', not the import.

Impact

Differential science that differences the bias away is unaffected. Absolute delay / slant-TEC consumers should not trust this model until resolved.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions