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
- Negative TEC. Slant TEC cannot be negative. All four pairs return negative values spanning a 30x range.
- 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.
HFPropagationModelyields 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
predict('WWV', f, t):compute_differential_delay('WWV', a, b, t)→ implied slant TEC:Two distinct problems
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'stests/test_propagation_model.py::TestHFPropagationModel::test_differential_delay_is_frequency_pair_independentasserts exactly the invariant that fails here. It is currently skipped behind a working-IRI predicate (hf-timestd1ed8b1a) 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 iri2020succeeds even when IRI is unusable — it builds its Fortran on first call, so a host without a compiler silently returnssource='parametric'. Checkpoint.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.