from __future__ import annotations from itur.models import itu676 from app.core.geo import GeoPoint, haversine def p676_gas_attenuation(freq_hz: float, distance_km: float) -> float: if freq_hz <= 0: raise ValueError("freq_hz must be positive") if distance_km < 0: raise ValueError("distance_km must be non-negative") if distance_km == 0: return 0.0 freq_ghz = freq_hz / 1_000_000_000 attenuation = itu676.gaseous_attenuation_terrestrial_path( distance_km, freq_ghz, 0, 7.5, 1013, 288, "exact", ) return float(attenuation.value) def atmospheric_loss_between(tx: GeoPoint, rx: GeoPoint, freq_hz: float) -> float: distance_km = haversine(tx, rx) / 1000.0 return p676_gas_attenuation(freq_hz, distance_km)