prop/test/microwaveprop/propagation
Graham McIntire bd107ee747
feat(eme): add /eme Earth-Moon-Earth calculator
New /eme page — antenna aiming + link budget for moonbounce.

Given a station (callsign / grid / lat,lon), TX power, antenna gain,
detection bandwidth, and system Tsys, the page shows in real time:

- Moon azimuth / elevation from the observer (ticks every 10 s)
- Slant range to the Moon
- EIRP breakdown: TX(dBm) + gain(dBi) = EIRP(dBm)
- Path-loss decomposition (Earth → Moon → Earth):
    free-space spreading (×2)
    − moon reflection gain 10·log(4π σ / λ²) where σ = ρ·π·R²
    = round-trip path loss
- Band-dependent lunar albedo ρ (VHF ≈ 0.065, microwave ≈ 0.08,
  mm-wave ≈ 0.02) surfaced as a named line item with the current
  ρ shown to three decimals
- Received power, thermal noise floor, and SNR with a badge that
  classifies the margin (strong / marginal / below noise)
- Self-echo Doppler shift with its radial-velocity driver

New modules:

- `Microwaveprop.Moon` — low-precision lunar ephemeris
  (Astronomical Almanac Sec. D.4 truncated series). Provides
  `julian_day/1`, `geocentric/1`, `observer_position/3`, and
  `radial_velocity_km_s/3`. Accurate to ~0.3° position / ~200 km
  distance — well inside any amateur EME-dish beamwidth.
- `Microwaveprop.Propagation.Eme` — path-loss helpers:
  `moon_albedo/1` (band lookup), `moon_rcs_m2/1`,
  `fspl_round_trip_db/2`, `moon_reflection_gain_db/2`,
  `path_loss_db/3`, `received_power_dbm/1`, `noise_floor_dbm/2`,
  `snr_db/1`, `doppler_shift_hz/2`.

Wired into the main nav ("EME" button) and the router between
/path and /rover.

Tests: 3 properties + 41 unit tests cover JD conversion, moon
position envelope, band-dependent albedo lookup, decomposition
identity, linearity/monotonicity of path loss and Doppler, and a
LiveView integration test against the rendered DOM.

Full suite: 2,460 tests + 170 properties; credo strict clean.
2026-04-23 16:18:20 -05:00
..
band_config_property_test.exs test(property): add property tests for propagation scoring + CIDR matcher 2026-04-21 13:57:12 -05:00
band_config_test.exs feat(propagation): per-band weight calibration from full-corpus correlation 2026-04-18 10:19:26 -05:00
common_volume_test.exs feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
duct_test.exs Phase 4: Ray-traced duct geometry 2026-04-10 08:31:16 -05:00
eme_test.exs feat(eme): add /eme Earth-Moon-Earth calculator 2026-04-23 16:18:20 -05:00
freshness_monitor_test.exs fix(propagation): dedup PropagationGridWorker enqueues 2026-04-16 14:58:55 -05:00
grid_task_enqueuer_test.exs fix(grid-tasks): reclaim orphan running rows on hourly seed 2026-04-23 12:57:39 -05:00
grid_test.exs fix(enrichment): mark OCONUS contacts hrrr_status :unavailable 2026-04-23 14:19:23 -05:00
hf_muf_test.exs HfMuf physics: distance-adjusted MUF from GIRO MUFD(3000) 2026-04-15 14:59:39 -05:00
inversion_test.exs Phase 2 tasks 2.1-2.4: BL turbulence feature computations 2026-04-10 08:21:23 -05:00
mechanism_classifier_test.exs feat(propagation): per-contact mechanism classification 2026-04-18 10:42:08 -05:00
model_test.exs Integrate ML model into grid worker, QSO search, and UI improvements 2026-04-01 10:14:22 -05:00
notify_listener_test.exs test: expand coverage and refactor to idiomatic style 2026-04-23 13:28:42 -05:00
pipeline_status_test.exs feat(map): shareable URL params for view/band/time 2026-04-19 08:53:07 -05:00
profiles_file_test.exs test: expand coverage and refactor to idiomatic style 2026-04-23 13:28:42 -05:00
rain_scatter_classifier_test.exs feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
rain_scatter_test.exs test: cover propagation/rain_scatter 2026-04-16 14:09:44 -05:00
recalibrator_test.exs feat(propagation): per-band weight calibration from full-corpus correlation 2026-04-18 10:19:26 -05:00
region_test.exs Phase 7: Regionalized seasonal scoring 2026-04-10 08:39:01 -05:00
score_cache_reconciler_test.exs test: expand coverage and refactor to idiomatic style 2026-04-23 13:28:42 -05:00
score_cache_test.exs fix(propagation): bound ScoreCache to 18-hour forecast window 2026-04-22 08:34:45 -05:00
scorer_property_test.exs test: add /qsos→/contacts redirect + scorer conversion properties 2026-04-23 14:03:02 -05:00
scorer_test.exs test: cover METAR field extractors and Scorer.path_integrated_conditions 2026-04-23 14:13:42 -05:00
scores_file_property_test.exs test(property): add property tests for propagation scoring + CIDR matcher 2026-04-21 13:57:12 -05:00
scores_file_test.exs fix(map): dedupe duplicated forecast-timeline chips + extract Mechanism helpers 2026-04-21 17:21:11 -05:00
sporadic_e_test.exs Add 50/144/222 MHz bands, rename 440→432 2026-04-16 12:36:10 -05:00