{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 03 \u2014 Gamma-PSD rain at C-band\n", "\n", "Radar volumes sample thousands of drops. The observed Z_h, Z_dr,\n", "K_dp, and specific attenuation A_i are PSD-weighted integrals of\n", "the single-drop quantities. This notebook tabulates S(D) and Z(D)\n", "once, then sweeps the integrated observables across a range of\n", "normalised gamma PSDs parameterised by the median volume diameter\n", "D0.\n" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from rustmatrix import Scatterer, radar, psd as rs_psd\n", "from rustmatrix.tmatrix_aux import (dsr_thurai_2007, geom_horiz_back,\n", " geom_horiz_forw, K_w_sqr, wl_C)\n", "from rustmatrix.refractive import m_w_10C\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tabulate once, evaluate many\n" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "s = Scatterer(wavelength=wl_C, m=m_w_10C[wl_C],\n", " Kw_sqr=K_w_sqr[wl_C], ddelt=1e-4, ndgs=2)\n", "integ = rs_psd.PSDIntegrator()\n", "integ.D_max = 8.0\n", "integ.num_points = 64\n", "integ.axis_ratio_func = lambda D: 1.0 / dsr_thurai_2007(D)\n", "integ.geometries = (geom_horiz_back, geom_horiz_forw)\n", "s.psd_integrator = integ\n", "s.psd_integrator.init_scatter_table(s)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sweep median diameter D0\n" ] }, { "cell_type": "code", "metadata": {}, "execution_count": null, "outputs": [], "source": [ "D0s = np.linspace(0.5, 3.0, 12)\n", "Zh = np.empty_like(D0s)\n", "Zdr = np.empty_like(D0s)\n", "Kdp = np.empty_like(D0s)\n", "Ai = np.empty_like(D0s)\n", "\n", "for i, D0 in enumerate(D0s):\n", " s.psd = rs_psd.GammaPSD(D0=D0, Nw=8e3, mu=4)\n", " s.set_geometry(geom_horiz_back)\n", " Zh[i] = 10 * np.log10(radar.refl(s))\n", " Zdr[i] = 10 * np.log10(radar.Zdr(s))\n", " s.set_geometry(geom_horiz_forw)\n", " Kdp[i] = radar.Kdp(s)\n", " Ai[i] = radar.Ai(s)\n", "\n", "fig, axes = plt.subplots(2, 2, figsize=(9, 6), sharex=True)\n", "axes[0, 0].plot(D0s, Zh, 'C0-o'); axes[0, 0].set_ylabel('Z_h [dBZ]')\n", "axes[0, 1].plot(D0s, Zdr, 'C1-o'); axes[0, 1].set_ylabel('Z_dr [dB]')\n", "axes[1, 0].plot(D0s, Kdp, 'C2-o'); axes[1, 0].set_ylabel('K_dp [\u00b0/km]')\n", "axes[1, 1].plot(D0s, Ai, 'C3-o'); axes[1, 1].set_ylabel('A_i [dB/km]')\n", "for ax in axes.flat:\n", " ax.set_xlabel('D0 [mm]')\n", " ax.grid(True, alpha=0.3)\n", "fig.suptitle('C-band gamma-PSD rain observables (Nw=8e3, mu=4)')\n", "fig.tight_layout();\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.11" } }, "nbformat": 4, "nbformat_minor": 5 }