Files
RadioPropagationApi/api/app/core/atmosphere.py
T
2026-06-24 07:50:00 +03:00

32 lines
825 B
Python

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)