from __future__ import annotations
import numpy as np
from rustmatrix import Scatterer, orientation, radar, scatter
from rustmatrix.refractive import m_w_10C
from rustmatrix.tmatrix_aux import (K_w_sqr, dsr_thurai_2007,
geom_horiz_back, geom_horiz_forw,
wl_C, wl_S, wl_X)
BANDS = [("S", wl_S), ("C", wl_C), ("X", wl_X)]
D_GRID = np.linspace(0.1, 8.0, 40)
CANTING_STD_DEG = 5.0
def build_drop(D_mm: float, wl: float) -> Scatterer:
s = Scatterer(radius=D_mm / 2.0, wavelength=wl, m=m_w_10C[wl],
axis_ratio=1.0 / dsr_thurai_2007(D_mm),
Kw_sqr=K_w_sqr[wl], ddelt=1e-4, ndgs=2)
s.orient = orientation.orient_averaged_fixed
s.or_pdf = orientation.gaussian_pdf(std=CANTING_STD_DEG, mean=0.0)
s.n_alpha = 6
s.n_beta = 12
return s
def sweep_band(wl: float) -> dict:
Zh = np.empty_like(D_GRID)
Zdr = np.empty_like(D_GRID)
Kdp = np.empty_like(D_GRID)
LDR = np.empty_like(D_GRID)
for i, D in enumerate(D_GRID):
s = build_drop(D, wl)
s.set_geometry(geom_horiz_back)
Zh[i] = 10 * np.log10(max(radar.refl(s, h_pol=True), 1e-30))
Zdr[i] = 10 * np.log10(max(radar.Zdr(s), 1e-30))
LDR[i] = 10 * np.log10(max(scatter.ldr(s, h_pol=True), 1e-30))
s.set_geometry(geom_horiz_forw)
Kdp[i] = radar.Kdp(s)
return dict(Zh=Zh, Zdr=Zdr, Kdp=Kdp, LDR=LDR)
def main() -> None:
print(f"Single-drop polarimetric response (Thurai 2007 shape, "
f"10 °C water, canting σ = {CANTING_STD_DEG:.0f}°)")
print(f"N_drop = 1 m⁻³ convention: Z_h [dBZ], K_dp [°/km] both per drop/m³.")
print()
data = {name: sweep_band(wl) for name, wl in BANDS}
rows = (0.5, 1.0, 2.0, 3.0, 5.0, 7.0)
idx = [int(np.argmin(np.abs(D_GRID - D))) for D in rows]
for obs_name, fmt in (("Z_h [dBZ]", "{:+7.2f}"),
("Z_dr [dB]", "{:+7.3f}"),
("K_dp [°/km]", "{:+7.3e}"),
("LDR [dB]", "{:+7.2f}")):
print(f"{obs_name:<14} " + " ".join(f"D={D:.1f}" for D in rows))
key = obs_name.split()[0].replace("_", "").replace("LDR", "LDR")
key = {"Zh": "Zh", "Zdr": "Zdr", "Kdp": "Kdp", "LDR": "LDR"}[key]
for band_name, _ in BANDS:
row = data[band_name][key][idx]
cells = " ".join(fmt.format(v) for v in row)
print(f" {band_name}-band {cells}")
print()
if __name__ == "__main__":
main()