From a12a2f634dd95555f436e613164fb440b08f0602 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 13:57:34 +0200 Subject: [PATCH 001/113] Use exact SI constants and add proton mass, Planck constant, and Jupiter nominals --- src/zephyrus/constants.py | 11 +++++-- src/zephyrus/planets_parameters.py | 8 +++-- tests/test_constants.py | 53 ++++++++++++++++++++++++++---- tests/test_planets_parameters.py | 19 +++++++++++ 4 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/zephyrus/constants.py b/src/zephyrus/constants.py index 0de004cb..6b048708 100644 --- a/src/zephyrus/constants.py +++ b/src/zephyrus/constants.py @@ -1,18 +1,23 @@ ''' !!! info "`constants.py`" Often used physical constants and unit conversions.
- Author: Emma Postolec + Authors: Emma Postolec, Mara Attia ''' ######################################### Physical constants ######################################### -kb = 1.38e-23 # Boltzmann constant [m2 kg s-2 K-1] = [J K-1] +kb = 1.380649e-23 # Boltzmann constant (exact SI value) [m2 kg s-2 K-1] = [J K-1] +kb_cgs = 1.380649e-16 # Boltzmann constant in cgs units [erg K-1] G = 6.6743e-11 # Gravitational constant [m3 kg-1 s-2] G_cgs = 6.6743e-8 # Gravitational constant in cgs units [cm3 g-1 s-2] -c = 2.99792458e8 # Speed of light [m s-1] +c = 2.99792458e8 # Speed of light (exact SI value) [m s-1] +h_planck = 6.62607015e-34 # Planck constant (exact SI value) [J s] +m_p = 1.67262192369e-27 # Proton mass (CODATA 2018) [kg] +amu = 1.66053906660e-27 # Atomic mass constant (CODATA 2018) [kg] ######################################### Units conversions ######################################### s2yr = 1/(3600*24*365) # convert [seconds] to [years] erg2joule = 1e-7 # convert [ergs] to [Joules] +ev2joule = 1.602176634e-19 # convert [eV] to [Joules] (exact SI value) au2m = 1.496e11 # convert [au] to [m] au2cm = 1.496e13 # convert [au] to [cm] ergpersecondtowatt = 1e-7 # convert [erg s-1] to [W] diff --git a/src/zephyrus/planets_parameters.py b/src/zephyrus/planets_parameters.py index 853d189f..f968d56a 100644 --- a/src/zephyrus/planets_parameters.py +++ b/src/zephyrus/planets_parameters.py @@ -6,15 +6,19 @@ ######################################### Sun-Earth system ######################################### -# Sun parameters +# Sun parameters Rs = 6.957e8 # Solar radius [m] Ms = 1.98847e30 # Solar mass [kg] Ls = 3.828e26 # Solar luminosity [W] age_sun = 4.603e9 # Age of the Sun [yr] -# Earth parameters +# Earth parameters Re = 6.378e6 # Earth radius [m] Me = 5.9722e24 # Earth mass [kg] + +# Jupiter parameters (IAU 2015 nominal values, Resolution B3) +Rjup = 7.1492e7 # Jupiter equatorial radius [m] +Mjup = 1.8982e27 # Jupiter mass [kg] Me_atm = 5.15e18 # Mass of the Earth atmopshere [kg] Fxuv_earth_10Myr = 14.67 # Fxuv received on Earth at t = 10 Myr -> see Fig 9. Wordsworth+18 [W m-2] Fxuv_earth_today = 4.64e-3 # Stellar flux received on Earth today [W m-2] diff --git a/tests/test_constants.py b/tests/test_constants.py index a2134617..53fa9afd 100644 --- a/tests/test_constants.py +++ b/tests/test_constants.py @@ -18,13 +18,18 @@ from zephyrus.constants import ( G, G_cgs, + amu, au2cm, au2m, c, erg2joule, ergcm2stoWm2, ergpersecondtowatt, + ev2joule, + h_planck, kb, + kb_cgs, + m_p, s2yr, ) @@ -93,13 +98,49 @@ def test_seconds_to_year_uses_the_365_day_convention(): assert s2yr > julian # a shorter year makes each second a larger fraction -def test_boltzmann_constant_magnitude_and_value(): - """The Boltzmann constant is the shipped three-significant-figure value. +def test_boltzmann_constant_is_the_exact_si_value(): + """The Boltzmann constant is the exact SI-defined value in both unit systems. - ``kb`` is stored as ``1.38e-23 J K-1``. The guard brackets its order of - magnitude so a decimal-place slip (``1.38e-22`` or ``1.38e-24``) fails, - and pins the value so a mantissa typo is caught. + Since the 2019 SI redefinition ``kb = 1.380649e-23 J K-1`` exactly, so the + shipped constant carries the full mantissa rather than a ``1.38e-23`` + rounding. The cgs companion must be exactly ``1e7`` times the SI value + (``J -> erg``); a cgs value leaking into an SI expression would shift every + thermal energy by seven decades, so the ratio is the discrimination guard. """ - assert kb == pytest.approx(1.38e-23, rel=1e-12) + assert kb == pytest.approx(1.380649e-23, rel=1e-12) + # cgs/SI consistency: J -> erg is exactly 1e7. + assert kb_cgs / kb == pytest.approx(1e7, rel=1e-12) # Order-of-magnitude bracket: a single decimal-place slip lands outside. assert 1e-23 < kb < 2e-23 + + +def test_planck_constant_and_electronvolt_are_exact_si_values(): + """The Planck constant and the eV-to-joule factor are the exact SI values. + + Both are defining constants of the 2019 SI (``h = 6.62607015e-34 J s``, + ``e = 1.602176634e-19 C``, so ``1 eV = 1.602176634e-19 J`` exactly). The + cross-consistency guard is the photon-energy scale they set together: a + 20 eV photon has ``h nu`` with frequency ``nu = 20 * ev2joule / h_planck`` + of about ``4.8e15 Hz``, in the extreme ultraviolet, which brackets both + constants at once and fails on any single decimal-place slip. + """ + assert h_planck == pytest.approx(6.62607015e-34, rel=1e-12) + assert ev2joule == pytest.approx(1.602176634e-19, rel=1e-12) + # Cross-consistency: a 20 eV photon sits in the extreme ultraviolet. + nu_20ev = 20.0 * ev2joule / h_planck + assert 4e15 < nu_20ev < 6e15 + + +def test_proton_and_atomic_mass_constants_are_consistent(): + """The proton mass and atomic mass constant obey their known ratio. + + ``m_p / amu = 1.0072765`` (the proton's mass in unified atomic mass + units), a dimensionless ratio that catches a swap or a decimal-place slip + in either constant. Both are pinned to their CODATA 2018 values. + """ + assert m_p == pytest.approx(1.67262192369e-27, rel=1e-12) + assert amu == pytest.approx(1.66053906660e-27, rel=1e-12) + # The proton is 0.73% heavier than one atomic mass unit. + assert m_p / amu == pytest.approx(1.007276467, rel=1e-6) + # Discrimination: the two constants must not be interchangeable. + assert m_p > amu diff --git a/tests/test_planets_parameters.py b/tests/test_planets_parameters.py index b34e9724..8c718aa2 100644 --- a/tests/test_planets_parameters.py +++ b/tests/test_planets_parameters.py @@ -22,9 +22,11 @@ Ls, M_TOI561b, Me, + Mjup, Ms, R_TOI561b, Re, + Rjup, Rs, a_earth, e_earth, @@ -113,3 +115,20 @@ def test_toi561b_planet_scaled_from_earth_values(): assert 3.0e3 < rho < 6.0e3 # Circular orbit boundary case. assert e_TOI561b == pytest.approx(0.0, abs=1e-12) + + +def test_jupiter_nominal_values_recover_gas_giant_density(): + """Jupiter mass and radius are the IAU nominal values with a giant density. + + ``Mjup`` and ``Rjup`` are the IAU 2015 Resolution B3 nominal values. The + mean density they imply, about ``1.24 g cm-3``, is the discrimination + guard: a cm-vs-m slip in the radius moves it by six decades, and swapping + in the Earth values moves it above ``5 g cm-3``. The mass ratio to Earth + (about 318) brackets both pins at once. + """ + assert Mjup == pytest.approx(1.8982e27, rel=1e-9) + assert Rjup == pytest.approx(7.1492e7, rel=1e-9) + rho = Mjup / (4.0 / 3.0 * np.pi * Rjup**3) + # Gas-giant mean density in SI: about 1240 kg m-3. + assert rho == pytest.approx(1240.0, rel=0.02) + assert 300.0 < Mjup / Me < 330.0 From cf146b8e2109492e6d65bc65b5f99b71909d6eec Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:00:57 +0200 Subject: [PATCH 002/113] Measure the tidal factor from the radius the scaling selects and name the XUV levels --- docs/Explanations/model.md | 4 +- src/zephyrus/escape.py | 92 +++++++++++++++++++++++++------------- tests/test_escape.py | 61 +++++++++++++++---------- 3 files changed, 100 insertions(+), 57 deletions(-) diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index a749fe2b..fc2d65de 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -27,13 +27,13 @@ Both forms reduce to $R_p^3$ when $R_\mathrm{XUV} = R_p$, which is the conservat When the `tidal_contribution` flag is `True`, the effective gravitational potential is reduced by the host star's tidal field following the tidal reduction factor of Erkaev et al. (2007), eq. 17 [^erkaev]: -$$K_\mathrm{tide} = 1 - \frac{3}{2\xi} + \frac{1}{2\xi^3}, \qquad \xi = \frac{R_\mathrm{Hill}}{R_\mathrm{XUV}} \tag{2}$$ +$$K_\mathrm{tide} = 1 - \frac{3}{2\xi} + \frac{1}{2\xi^3}, \qquad \xi = \frac{R_\mathrm{Hill}}{R} \tag{2}$$ with the Hill radius $$R_\mathrm{Hill} = a\,(1-e)\,\left(\frac{M_p}{3\,M_\star}\right)^{1/3} \tag{3}$$ -where $a$ is the planetary semi-major axis, $e$ is the orbital eccentricity, and $M_\star$ is the stellar mass. Factoring the numerator gives $K_\mathrm{tide} = (\xi - 1)^2\,(2\xi + 1) / (2\xi^3)$, which is non-negative for every $\xi > 0$ with a double root at $\xi = 1$. In the physical regime $\xi > 1$ it lies in $(0, 1)$, rising toward 1 for $\xi \gg 1$ (the XUV radius well inside the Hill sphere) and falling toward 0 as the atmosphere expands toward the Roche lobe at $\xi = 1$; because the escape rate divides by $K_\mathrm{tide}$, the rate is enhanced by the tidal correction and diverges as $\xi \to 1$. The tidally corrected rate is therefore defined only for $\xi > 1$: ZEPHYRUS raises a `ValueError` for $\xi \le 1$, where the atmosphere reaches the Roche lobe and the energy-limited approximation no longer applies. When `tidal_contribution` is `False`, $K_\mathrm{tide} = 1$ is enforced. +where $a$ is the planetary semi-major axis, $e$ is the orbital eccentricity, and $M_\star$ is the stellar mass. The radius $R$ in $\xi$ is the one that appears linearly in the $R^3$ term of Eq. (1): $R_p$ for `scaling=2` (the convention of Erkaev et al. 2007, whose own $\xi$ is the Roche-lobe distance over the planetary radius) and $R_\mathrm{XUV}$ for `scaling=3`, where the XUV radius is the only radius in the problem. Factoring the numerator gives $K_\mathrm{tide} = (\xi - 1)^2\,(2\xi + 1) / (2\xi^3)$, which is non-negative for every $\xi > 0$ with a double root at $\xi = 1$. In the physical regime $\xi > 1$ it lies in $(0, 1)$, rising toward 1 for $\xi \gg 1$ (the escape level well inside the Hill sphere) and falling toward 0 as the atmosphere expands toward the Roche lobe at $\xi = 1$; because the escape rate divides by $K_\mathrm{tide}$, the rate is enhanced by the tidal correction and diverges as $\xi \to 1$. The tidally corrected rate is therefore defined only for $\xi > 1$: ZEPHYRUS raises a `ValueError` for $\xi \le 1$, where the atmosphere reaches the Roche lobe and the energy-limited approximation no longer applies. When `tidal_contribution` is `False`, $K_\mathrm{tide} = 1$ is enforced. --- diff --git a/src/zephyrus/escape.py b/src/zephyrus/escape.py index 204d296e..fbf1ce36 100644 --- a/src/zephyrus/escape.py +++ b/src/zephyrus/escape.py @@ -43,14 +43,19 @@ def EL_escape( ---------- tidal_contribution : bool If True, include the tidal correction factor $K_\mathrm{tide}$ - (Erkaev et al. 2007). It is valid for - $\xi \equiv R_\mathrm{Hill}/R_\mathrm{XUV} > 1$, where - $0 < K_\mathrm{tide} < 1$ and the correction enhances escape; the - factor rises monotonically toward 1 as $\xi \to \infty$. A - ``ValueError`` is raised for $\xi \le 1$, where the atmosphere - reaches the Roche lobe and the energy-limited approximation no - longer applies. If False, $K_\mathrm{tide} = 1$ (no tidal - effects). + (Erkaev et al. 2007). Its argument is + $\xi \equiv R_\mathrm{Hill}/R$, where $R$ is the radius that + appears linearly in the $R^3$ term selected by ``scaling``: $R_p$ + for ``scaling=2`` (the convention of Erkaev et al. 2007, whose + own $\xi$ is the Roche-lobe distance over the planetary radius) + and $R_\mathrm{XUV}$ for ``scaling=3`` (the single-radius form, + where $R_\mathrm{XUV}$ is the only radius in the problem). The + factor is valid for $\xi > 1$, where $0 < K_\mathrm{tide} < 1$ + and the correction enhances escape; it rises monotonically + toward 1 as $\xi \to \infty$. A ``ValueError`` is raised for + $\xi \le 1$, where the atmosphere reaches the Roche lobe and the + energy-limited approximation no longer applies. If False, + $K_\mathrm{tide} = 1$ (no tidal effects). a : float Planetary semi-major axis [m]. Only used when ``tidal_contribution`` is True. @@ -64,14 +69,23 @@ def EL_escape( ``tidal_contribution`` is True. epsilon : float Escape efficiency factor (dimensionless). Typical literature - range is $0.1 < \epsilon < 0.6$. + range is $0.1 < \epsilon < 0.6$, but hydrodynamic simulations + find the effective efficiency falls far below that band for + strongly bound planets: above a threshold gravitational + potential, $\log_{10}(G M_p K_\mathrm{tide}/R_p) \approx 12.9$ + to $13.2$ in cgs units (erg g$^{-1}$), it drops to of order + $10^{-2}$ for compact hot Jupiters (Caldiroli et al. 2022). Rp : float Planetary radius [m]. Used as a linear factor when ``scaling=2``. Rxuv : float Planetary radius at which the atmosphere becomes optically - thick to XUV radiation [m]. Defined at 20 mbar in - Baumeister et al. (2023). + thick to XUV radiation [m]. In PROTEUS this level is placed at + a fixed pressure, by default 20 mbar following Baumeister et + al. (2023); that is an optical-photosphere-type level, distinct + from the roughly nanobar level where the XUV heating is + actually deposited and the wind is launched (Lopez 2017, + $P_\mathrm{base} = \mu m_\mathrm{H} g / \sigma_{\nu_0}$). Fxuv : float XUV flux received by the planet from the host star, in W m$^{-2}$. @@ -89,9 +103,9 @@ def EL_escape( ------ ValueError If ``scaling`` is not ``2`` or ``3``, or if - ``tidal_contribution`` is True and - $\xi \equiv R_\mathrm{Hill}/R_\mathrm{XUV} \le 1$ (the atmosphere - reaches the Roche lobe, outside the energy-limited regime). + ``tidal_contribution`` is True and $\xi \le 1$ (the atmosphere + reaches the Roche lobe, outside the energy-limited regime), + with $\xi$ built on the radius selected by ``scaling``. References ---------- @@ -122,21 +136,46 @@ def EL_escape( 6. Lehmer, O. R., & Catling, D. C. (2017). Rocky worlds limited to ~1.8 Earth radii by atmospheric escape during a star's extreme UV saturation. *ApJ*, 845(2), 130. + 7. Lopez, E. D. (2017). Born dry in the photoevaporation desert: + Kepler's ultra-short-period planets formed water-poor. + *MNRAS*, 472(1), 245-253. + 8. Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & + Noack, L. (2023). Redox state and interior structure control on + the long-term habitability of stagnant-lid planets. + *A&A*, 675, A122. + 9. Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., + & Rauscher, E. (2022). Irradiation-driven escape of primordial + planetary atmospheres II. Evaporation efficiency of sub-Neptunes + through hot Jupiters. *A&A*, 663, A122. """ + # Radius term, and the radius the tidal factor is measured from: the + # one that appears linearly in R^3, since that is the radius the + # potential barrier in the denominator refers to. + match scaling: + case 2: + R_cubed = Rp * Rxuv**2 + R_tide = Rp + case 3: + R_cubed = Rxuv**3 + R_tide = Rxuv + case _: + raise ValueError(f'Invalid radius exponent: {scaling}') + # Tidal contribution if tidal_contribution: - # ksi = Rhill/Rxuv is the ratio of the periapsis Hill radius to the - # XUV radius. K_tide = (ksi-1)^2 (2 ksi + 1) / (2 ksi^3) is non-negative - # for all ksi > 0 with a double root at ksi = 1, so the energy-limited - # rate (which divides by K_tide) diverges as ksi -> 1 and is only valid - # for ksi > 1, where the atmosphere sits inside the Roche lobe. + # ksi is the ratio of the periapsis Hill radius to the radius the + # scaling selects. K_tide = (ksi-1)^2 (2 ksi + 1) / (2 ksi^3) is + # non-negative for all ksi > 0 with a double root at ksi = 1, so the + # energy-limited rate (which divides by K_tide) diverges as ksi -> 1 + # and is only valid for ksi > 1, where the atmosphere sits inside the + # Roche lobe. Rhill = a * (1 - e) * (Mp / (3 * Ms)) ** (1 / 3) - ksi = Rhill / Rxuv + ksi = Rhill / R_tide if ksi <= 1: raise ValueError( 'Tidal energy-limited escape requires the periapsis Hill ' - 'radius to exceed the XUV radius ' - f'(ksi = Rhill/Rxuv > 1); got ksi = {ksi:.4g}. At ksi <= 1 the ' + 'radius to exceed the escape-level radius ' + f'(ksi = Rhill/R > 1); got ksi = {ksi:.4g}. At ksi <= 1 the ' 'atmosphere reaches the Roche lobe and the energy-limited ' 'approximation no longer applies.' ) @@ -144,15 +183,6 @@ def EL_escape( else: K_tide = 1 - # Radius - match scaling: - case 2: - R_cubed = Rp * Rxuv**2 - case 3: - R_cubed = Rxuv**3 - case _: - raise ValueError(f'Invalid radius exponent: {scaling}') - # Mass-loss rate for EL escape escape_EL = (epsilon * np.pi * R_cubed * Fxuv) / (G * Mp * K_tide) diff --git a/tests/test_escape.py b/tests/test_escape.py index 4f5e0032..98434b19 100644 --- a/tests/test_escape.py +++ b/tests/test_escape.py @@ -9,14 +9,17 @@ (``scaling=2``) and the Lehmer & Catling (2017) variant (``scaling=3``). - Positivity / boundedness: the rate is non-negative for valid inputs and the tidal factor ``K_tide`` lies in ``(0, 1)`` when the Hill radius exceeds - the XUV radius (``ksi = Rhill / Rxuv > 1``), rising toward 1 as the orbit - widens; the close-in geometries under test keep it well below 1. + the radius the ``scaling`` argument selects (``ksi = Rhill / Rp`` for + ``scaling=2``, ``ksi = Rhill / Rxuv`` for ``scaling=3``), rising toward 1 + as the orbit widens; the close-in geometries under test keep it well + below 1. - Monotonicity / symmetry: the rate is linear in ``Fxuv``, scales as ``1 / Mp``, is larger with the tidal correction than without, and is zero when ``Fxuv = 0``. - Error contract: an unsupported ``scaling`` raises ``ValueError``, and the tidal branch raises ``ValueError`` for ``ksi <= 1``, where the atmosphere - reaches the Roche lobe and the energy-limited approximation no longer holds. + reaches the Roche lobe and the energy-limited approximation no longer + holds; the two radius conventions are discriminated against each other. See ``docs/How-to/run_tests.md`` for the tier and marker conventions. """ @@ -110,29 +113,37 @@ def test_el_escape_tidal_raises_below_roche_lobe(): The Erkaev et al. (2007) factor ``K_tide = (ksi - 1)**2 (2 ksi + 1) / (2 ksi**3)`` has a double root at ``ksi = 1``, so the energy-limited rate - divides by ``K_tide`` and is defined only for ``ksi > 1``. A close-in, - highly eccentric orbit (``a = 0.02 au``, ``e = 0.90``) shrinks the - periapsis Hill radius until ``ksi`` is about 0.39, inside the Roche lobe, - and the call must raise rather than return a suppressed or divergent rate. + divides by ``K_tide`` and is defined only for ``ksi > 1``. The radius in + ``ksi = Rhill / R`` follows the ``scaling`` selection: ``Rp`` for + ``scaling=2``, ``Rxuv`` for ``scaling=3``. A close-in, highly eccentric + orbit (``a = 0.02 au``, ``e = 0.90``) shrinks the periapsis Hill radius + until ``ksi`` is about 0.47 against ``Rp``, inside the Roche lobe, and + the call must raise rather than return a suppressed or divergent rate. """ a = 0.02 * au2m - e = 0.90 # high eccentricity pulls the periapsis Hill radius inside Rxuv + e = 0.90 # high eccentricity pulls the periapsis Hill radius inside Rp rhill = a * (1 - e) * (Me / (3 * Ms)) ** (1 / 3) - ksi = rhill / RXUV + ksi = rhill / RP # Confirm the constructed geometry is genuinely sub-Roche-lobe. - assert ksi == pytest.approx(0.3910754106364523, rel=1e-9) + assert ksi == pytest.approx(0.4692904927637428, rel=1e-9) assert ksi < 1.0 with pytest.raises(ValueError, match='Roche lobe'): EL_escape(True, a, e, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) - # Boundary case: setting Rxuv equal to the periapsis Hill radius puts - # ``ksi`` exactly at the singular point 1, which must raise rather than - # divide by zero. + # Boundary case, scaling=3: setting Rxuv equal to the periapsis Hill + # radius puts ``ksi = Rhill / Rxuv`` exactly at the singular point 1, + # which must raise rather than divide by zero. rxuv_at_hill = a * (Me / (3 * Ms)) ** (1 / 3) with pytest.raises(ValueError, match='Roche lobe'): - EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, rxuv_at_hill, FXUV, scaling=2) - # Contrast: the same close-in orbit with ``ksi > 1`` (circular, Rxuv well - # inside the Hill radius) returns a finite positive rate, so the raise is - # specific to ``ksi <= 1``, not to the tidal branch as a whole. + EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, rxuv_at_hill, FXUV, scaling=3) + # Convention discrimination: the same geometry under scaling=2 measures + # ``ksi`` from ``Rp`` (about 4.7 here), so it must NOT raise; a regression + # that reverts ``ksi`` to the XUV radius for scaling=2 fails this call. + ok2 = EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, rxuv_at_hill, FXUV, scaling=2) + assert np.isfinite(ok2) + assert ok2 > 0.0 + # Contrast: the same close-in orbit with ``ksi > 1`` (circular) returns a + # finite positive rate, so the raise is specific to ``ksi <= 1``, not to + # the tidal branch as a whole. ok = EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) assert np.isfinite(ok) assert ok > 0.0 @@ -177,21 +188,23 @@ def test_el_escape_decreases_with_planet_mass(): def test_el_escape_tidal_correction_increases_escape(): """The tidal correction raises the escape rate for a close-in orbit. - At ``a = 0.02 au`` the Hill radius is only a few XUV radii, so + At ``a = 0.02 au`` the Hill radius is only a few planetary radii, so ``K_tide`` departs from 1 by tens of percent. Because ``K_tide`` sits in the denominator, the tidal rate exceeds the no-tidal rate. The enhancement ``1 / K_tide`` is pinned, and the no-tidal value is the discrimination - guard: a dropped ``K_tide`` would collapse the ratio to 1. + guard: a dropped ``K_tide`` would collapse the ratio to 1, and the + superseded ``Rhill / Rxuv`` convention for ``scaling=2`` would give 1.60 + instead of the pinned 1.46, so a convention regression also fails. """ a = 0.02 * au2m # close-in so K_tide is well below 1 no_tidal = EL_escape(False, a, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) tidal = EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) assert tidal > no_tidal - # Pin the enhancement factor 1 / K_tide against the hand-evaluated K_tide. - assert tidal / no_tidal == pytest.approx(1.6005072480546971, rel=1e-9) + # Pin the enhancement factor 1 / K_tide with ksi = Rhill / Rp. + assert tidal / no_tidal == pytest.approx(1.4594144515815166, rel=1e-9) # Dropped-K_tide discrimination: the ratio is well above 1, not ~1. assert tidal / no_tidal - 1.0 > 0.1 - # Boundedness: for this close-in geometry the Hill radius stays above Rxuv + # Boundedness: for this close-in geometry the Hill radius stays above Rp # (ksi > 1), so the backed-out K_tide lies strictly in (0, 1); it reaches 1 # only in the ksi -> infinity limit of an infinitely wide orbit. k_tide = no_tidal / tidal @@ -215,7 +228,7 @@ def test_el_escape_tidal_eccentricity_increases_escape(): # Higher eccentricity gives a smaller periapsis Hill radius, so more escape. assert eccentric > circular # Pin the enhancement against the hand-evaluated K_tide(e=0) / K_tide(e=0.3). - assert eccentric / circular == pytest.approx(1.3114173571726595, rel=1e-9) + assert eccentric / circular == pytest.approx(1.2290962685206341, rel=1e-9) # Sign-convention discrimination: the (1 + e) periapsis slip would push the # ratio below 1, reversing the inequality asserted above. assert eccentric / circular > 1.0 @@ -226,7 +239,7 @@ def test_el_escape_tidal_factor_approaches_unity_for_wide_orbit(): """The tidal correction vanishes as the orbit widens (``K_tide -> 1``). This is the analytical limit: at large ``a`` the Hill radius dwarfs the - XUV radius, so ``K_tide -> 1`` and the tidal rate converges to the + planetary radius, so ``K_tide -> 1`` and the tidal rate converges to the no-tidal rate. A close-in orbit keeps ``K_tide`` well below 1, so the backed-out ``K_tide`` is strictly larger (closer to 1) for the wide orbit. """ From 2caecb125cf2140c6375927bd040adc1578c7978 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:02:17 +0200 Subject: [PATCH 003/113] Add element masses, formula parsing, and composition atomization --- src/zephyrus/composition.py | 136 +++++++++++++++++++++++++++++++++++ tests/test_composition.py | 137 ++++++++++++++++++++++++++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 src/zephyrus/composition.py create mode 100644 tests/test_composition.py diff --git a/src/zephyrus/composition.py b/src/zephyrus/composition.py new file mode 100644 index 00000000..b0a7f19f --- /dev/null +++ b/src/zephyrus/composition.py @@ -0,0 +1,136 @@ +""" +!!! info "`composition.py`" + Element masses, chemical-formula parsing, and composition handling.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import re + +from zephyrus.constants import amu + +# Element masses in atomic mass units. Reactive elements carry the standard +# atomic weights (IUPAC/CIAAW). Neon and argon carry the escape-relevant +# isotope masses (20Ne and 36Ar) rather than the terrestrial elemental +# averages: a primordial or solar-composition inventory is dominated by those +# isotopes, and the binary diffusion coefficients printed by Zahnle & Kasting +# (1986, Icarus 68, 462; 2023, GeCoA 361, 228) are for them. Terrestrial Ar is +# 40Ar-dominated (radiogenic), an 11 percent mass difference. Kr and Xe carry +# the standard atomic weights, which sit within 0.1 and 1.1 percent of the +# 84Kr and 130Xe isotopes those compilations tabulate. +ELEMENT_AMU = { + 'H': 1.008, + 'He': 4.0026, + 'C': 12.011, + 'N': 14.007, + 'O': 15.999, + 'Ne': 19.992, + 'Na': 22.990, + 'Mg': 24.305, + 'Si': 28.085, + 'P': 30.974, + 'S': 32.06, + 'Cl': 35.45, + 'Ar': 35.968, + 'K': 39.098, + 'Ca': 40.078, + 'Ti': 47.867, + 'Fe': 55.845, + 'Kr': 83.798, + 'Xe': 131.293, +} + +_FORMULA_TOKEN = re.compile(r'([A-Z][a-z]?)(\d*)') + + +def parse_formula(name: str) -> dict[str, int]: + """Element counts of a simple molecular formula string. + + Parses formulas of the kind atmospheric chemistry codes emit, for + example ``'CO2' -> {'C': 1, 'O': 2}``. Trailing annotations after an + underscore are stripped, because species names such as ``'O_1'``, + ``'N_2D'``, or ``'S8_l_s'`` denote excited states or condensates of the + same stoichiometry. + + Parameters + ---------- + name : str + Molecular formula, e.g. ``'H2O'``, ``'CO2'``, ``'He'``. + + Returns + ------- + dict + Element symbol to integer count. + + Raises + ------ + ValueError + If the string cannot be parsed as a formula or contains an element + outside ``ELEMENT_AMU``. + """ + base = name.split('_')[0] + out: dict[str, int] = {} + pos = 0 + for m in _FORMULA_TOKEN.finditer(base): + if m.start() != pos: + raise ValueError(f'cannot parse formula {name!r}') + pos = m.end() + el, cnt = m.group(1), int(m.group(2) or 1) + if el not in ELEMENT_AMU: + raise ValueError(f'unknown element {el!r} in formula {name!r}') + out[el] = out.get(el, 0) + cnt + if pos != len(base) or not out: + raise ValueError(f'cannot parse formula {name!r}') + return out + + +def species_mass_amu(name: str) -> float: + """Molecular mass of a formula string, in atomic mass units.""" + return sum(ELEMENT_AMU[el] * n for el, n in parse_formula(name).items()) + + +def atomize(vmr: dict[str, float]) -> dict[str, float]: + """Element mole fractions of an atomized composition. + + Reduces molecular volume mixing ratios to the mole fractions of their + constituent atoms, which is the composition a fully dissociated gas + would have. Used where escape physics operates on atoms: at the XUV + wind base, where molecules are photodissociated well below the level + where the wind is launched (Murray-Clay et al. 2009, ApJ 693, 23). + + Parameters + ---------- + vmr : dict + Species name to mole fraction. Need not sum to 1; the result is + renormalized. + + Returns + ------- + dict + Element symbol to mole fraction, summing to 1. + + Raises + ------ + ValueError + If no species carries a positive mole fraction. + """ + counts: dict[str, float] = {} + for sp, x in vmr.items(): + if x <= 0.0: + continue + for el, n in parse_formula(sp).items(): + counts[el] = counts.get(el, 0.0) + x * n + tot = sum(counts.values()) + if tot <= 0.0: + raise ValueError('empty composition: no species has a positive mole fraction') + return {el: c / tot for el, c in counts.items()} + + +def mean_particle_mass(element_fractions: dict[str, float]) -> float: + """Mean particle mass of an atomized composition, in kg. + + ``element_fractions`` maps element symbols to mole fractions summing + to 1, as returned by :func:`atomize`. + """ + return sum(x * ELEMENT_AMU[el] for el, x in element_fractions.items()) * amu diff --git a/tests/test_composition.py b/tests/test_composition.py new file mode 100644 index 00000000..ea21c9a2 --- /dev/null +++ b/tests/test_composition.py @@ -0,0 +1,137 @@ +"""Tests for ``src/zephyrus/composition.py``. + +``composition.py`` is a utility source (element masses, formula parsing, and +composition handling), so it is exempt from the physics-invariant +requirement, but a wrong mass or a mis-parsed formula silently corrupts every +downstream escape rate. These tests pin the shipped element masses, exercise +the formula parser on well-formed and malformed input, and assert the +conservation properties of the atomization step (mole fractions renormalize +to 1, element counts follow stoichiometry) with discrimination guards. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import pytest + +from zephyrus.composition import ( + ELEMENT_AMU, + atomize, + mean_particle_mass, + parse_formula, + species_mass_amu, +) +from zephyrus.constants import amu + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +def test_element_masses_pin_isotope_conventions(): + """Ne and Ar carry the escape-relevant isotope masses, not the averages. + + The table stores 20Ne (19.992 amu) and 36Ar (35.968 amu) because the + binary-diffusion compilations of Zahnle & Kasting (1986, 2023) tabulate + those isotopes. The discrimination guards are the terrestrial elemental + averages (Ne 20.180, Ar 39.948 amu), which must resolvably differ; the + reactive elements carry the standard atomic weights. + """ + assert ELEMENT_AMU['Ne'] == pytest.approx(19.992, rel=1e-9) + assert ELEMENT_AMU['Ar'] == pytest.approx(35.968, rel=1e-9) + # Discrimination: the elemental-average masses differ by 1 to 11 percent. + assert ELEMENT_AMU['Ne'] != pytest.approx(20.180, rel=1e-3) + assert ELEMENT_AMU['Ar'] != pytest.approx(39.948, rel=1e-2) + # Standard atomic weights for the reactive elements. + assert ELEMENT_AMU['H'] == pytest.approx(1.008, rel=1e-9) + assert ELEMENT_AMU['O'] == pytest.approx(15.999, rel=1e-9) + + +def test_parse_formula_counts_and_strips_annotations(): + """The parser returns stoichiometric counts and strips state suffixes. + + ``CO2`` splits into one carbon and two oxygens; the excited-state name + ``N_2D`` reduces to plain atomic nitrogen; the condensate ``S8_l_s`` + keeps its eight sulfur atoms. A two-letter element must not be read as + two one-letter elements (He is helium, not H plus e). + """ + assert parse_formula('CO2') == {'C': 1, 'O': 2} + assert parse_formula('N_2D') == {'N': 1} + assert parse_formula('S8_l_s') == {'S': 8} + assert parse_formula('He') == {'He': 1} + # Case boundary: 'CO' is carbon monoxide, not cobalt. + assert parse_formula('CO') == {'C': 1, 'O': 1} + + +def test_parse_formula_rejects_malformed_input(): + """Unparseable strings and unknown elements raise ``ValueError``. + + The error contract: lowercase-first tokens, empty strings, and symbols + outside the mass table must raise rather than silently return a partial + parse. A valid formula on the same call path returns normally, so the + raise is specific to the malformed input. + """ + with pytest.raises(ValueError, match='cannot parse'): + parse_formula('h2o') + with pytest.raises(ValueError, match='cannot parse'): + parse_formula('') + with pytest.raises(ValueError, match='unknown element'): + parse_formula('U') + # Contrast: the same path parses a valid formula. + assert parse_formula('H2O') == {'H': 2, 'O': 1} + + +def test_species_mass_amu_matches_stoichiometric_sum(): + """Molecular masses equal the stoichiometric sums of the element masses. + + Water must weigh two hydrogens plus one oxygen (18.015 amu); the guard + is the reversed formula weight of OH (17.007 amu), which differs by one + hydrogen and would expose a dropped count. + """ + m_h2o = species_mass_amu('H2O') + assert m_h2o == pytest.approx(2 * 1.008 + 15.999, rel=1e-12) + # Scale guard: water is 18 amu, not 17 (OH) or 19. + assert 17.5 < m_h2o < 18.5 + assert species_mass_amu('CO2') == pytest.approx(12.011 + 2 * 15.999, rel=1e-12) + + +def test_atomize_conserves_stoichiometry_and_normalizes(): + """Atomization follows stoichiometry and returns fractions summing to 1. + + Pure CO2 atomizes to 1/3 carbon and 2/3 oxygen. A 50/50 H2-H2O mix has + hydrogen and oxygen in a 4:1 mole ratio (two hydrogens from each + molecule against one oxygen from every second molecule). Zero and + negative entries are ignored, and the result always renormalizes to 1. + """ + a = atomize({'CO2': 1.0}) + assert a['C'] == pytest.approx(1.0 / 3.0, rel=1e-12) + assert a['O'] == pytest.approx(2.0 / 3.0, rel=1e-12) + b = atomize({'H2': 0.5, 'H2O': 0.5, 'CO2': 0.0}) + assert sum(b.values()) == pytest.approx(1.0, rel=1e-12) + # 2*0.5 + 2*0.5 = 2 hydrogens against 0.5 oxygens: a 4:1 ratio. + assert b['H'] / b['O'] == pytest.approx(4.0, rel=1e-12) + assert 'C' not in b # zero-fraction species contribute nothing + + +def test_atomize_rejects_empty_composition(): + """An all-zero composition raises rather than dividing by zero. + + The error contract: atomize must not return NaN fractions. A one-species + composition on the same path returns the trivial answer. + """ + with pytest.raises(ValueError, match='empty composition'): + atomize({'H2': 0.0, 'He': -1.0}) + assert atomize({'He': 0.2}) == {'He': 1.0} + + +def test_mean_particle_mass_reproduces_known_mixtures(): + """The mean particle mass interpolates linearly between the constituents. + + A 90/10 H/He atomic mix has ``0.9 * 1.008 + 0.1 * 4.0026 = 1.307 amu``, + the textbook mean particle mass of a fully dissociated (but not ionized) + solar-like gas. The guards bracket against pure hydrogen (1.008) and the + molecular value (2.3 amu for H2/He), either of which would signal a + convention slip. + """ + m = mean_particle_mass({'H': 0.9, 'He': 0.1}) + assert m / amu == pytest.approx(0.9 * 1.008 + 0.1 * 4.0026, rel=1e-12) + # Convention guards: atomic mean, not pure H and not the molecular mean. + assert m / amu > 1.2 + assert m / amu < 2.0 From cb4709ae9319c765e23094d3e51c4a93a9aabe76 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:05:32 +0200 Subject: [PATCH 004/113] Add the atmosphere profile container and the escape working levels --- src/zephyrus/profiles.py | 327 +++++++++++++++++++++++++++++++++++++++ tests/test_profiles.py | 326 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 653 insertions(+) create mode 100644 src/zephyrus/profiles.py create mode 100644 tests/test_profiles.py diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py new file mode 100644 index 00000000..28259b84 --- /dev/null +++ b/src/zephyrus/profiles.py @@ -0,0 +1,327 @@ +""" +!!! info "`profiles.py`" + Atmosphere-profile container, interpolation, and escape working levels.
+ Author: Mara Attia +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np + +from zephyrus.composition import atomize, species_mass_amu +from zephyrus.constants import G, amu, kb + +# Murray-Clay et al. (2009, ApJ 693, 23) photoionization cross section at +# their representative 20 eV photon energy: sigma_nu0 = 6e-18 (h nu / 13.6 +# eV)^-3 cm^2. Converted to m^2. Used by the Lopez (2017) wind-base pressure. +SIGMA_NU0 = 6.0e-18 * (20.0 / 13.6) ** -3 * 1e-4 # [m^2] + + +@dataclass +class Profile: + """One-dimensional atmosphere profile, ordered base to top. + + Attributes + ---------- + p : ndarray + Pressure per level [Pa], strictly decreasing with index. + r : ndarray + Radius per level [m], strictly increasing with index. + T : ndarray + Temperature per level [K]; realistic profiles are non-monotone. + vmr : dict + Species name to an array of volume mixing ratios per level. + mmw : ndarray + Mean molecular mass per level [kg per particle]. + kzz : ndarray or None + Eddy diffusion coefficient per level [m^2 s^-1], optional. + """ + + p: np.ndarray + r: np.ndarray + T: np.ndarray + vmr: dict + mmw: np.ndarray + kzz: np.ndarray | None = None + + def validate(self) -> None: + """Raise ``ValueError`` on a malformed profile. + + Pressure must decrease and radius increase strictly with index; + temperature is unconstrained beyond positivity. Every mixing-ratio + array must share the level count. + """ + p, r, T = map(np.asarray, (self.p, self.r, self.T)) + if not (len(p) == len(r) == len(T) == len(self.mmw)): + raise ValueError('profile arrays must share one length') + if len(p) < 3: + raise ValueError('profile needs at least 3 levels') + if not (np.all(np.diff(p) < 0) and np.all(np.diff(r) > 0)): + raise ValueError('p must decrease and r increase strictly with index') + if np.any(p <= 0) or np.any(T <= 0) or np.any(np.asarray(self.mmw) <= 0): + raise ValueError('p, T, mmw must be positive') + for sp, x in self.vmr.items(): + if len(np.asarray(x)) != len(p): + raise ValueError(f'vmr[{sp}] length mismatch') + + +def isothermal_profile( + M_p: float, + R_p: float, + T: float, + composition: dict[str, float], + p_surf: float, + p_top: float, + n_levels: int = 120, +) -> Profile: + """Isothermal hydrostatic profile for a fixed molecular composition. + + Integrates ``dr = -(k T r^2 / (G M mu)) d ln p`` outward from ``R_p`` at + constant temperature and composition. The integration truncates, before + reaching ``p_top``, at the level where the local Jeans parameter + ``G M mu / (k T r)`` drops below 2.2, because an isothermal structure is + unbound beyond that point and a hydrostatic profile there would be + meaningless. + + Parameters + ---------- + M_p, R_p : float + Planet mass [kg] and base radius [m]. + T : float + Temperature [K]. + composition : dict + Species name to mole fraction (renormalized internally). + p_surf, p_top : float + Base and requested top pressure [Pa]. + n_levels : int + Number of levels in log pressure. + + Returns + ------- + Profile + + Raises + ------ + ValueError + If the structure is unbound at the surface (fewer than three bound + levels), which is not a physically posed hydrostatic input. + """ + tot = sum(composition.values()) + mu = sum(x * species_mass_amu(sp) for sp, x in composition.items()) / tot * amu + lnp = np.linspace(np.log(p_surf), np.log(p_top), n_levels) + r = np.empty(n_levels) + r[0] = R_p + last = n_levels - 1 + for i in range(n_levels - 1): + H = kb * T * r[i] ** 2 / (G * M_p * mu) + r[i + 1] = r[i] - H * (lnp[i + 1] - lnp[i]) + if G * M_p * mu / (kb * T * r[i + 1]) < 2.2: + last = i + 1 + break + if last < 2: + raise ValueError('isothermal profile unbound at the surface; check inputs') + lnp, r = lnp[: last + 1], r[: last + 1] + n = last + 1 + vmr = {sp: np.full(n, x / tot) for sp, x in composition.items()} + return Profile( + p=np.exp(lnp), r=r, T=np.full(n, float(T)), vmr=vmr, mmw=np.full(n, mu), kzz=None + ) + + +def interp_at_pressure(profile: Profile, p_target: float) -> dict: + """Level state interpolated at a target pressure, linear in log pressure. + + Returns a dict with the interpolated radius ``r`` [m], temperature ``T`` + [K], mean molecular mass ``mmw`` [kg], number density ``n`` [m^-3], mass + density ``rho`` [kg m^-3], per-species ``vmr``, ``kzz`` (or None), and + the pressure ``p`` [Pa] itself. + """ + lp = np.log(profile.p) + lt = np.log(p_target) + # p decreases with index; np.interp needs increasing x. + x = lp[::-1] + r = np.interp(lt, x, profile.r[::-1]) + T = np.interp(lt, x, profile.T[::-1]) + mmw = np.interp(lt, x, profile.mmw[::-1]) + vmr = {sp: float(np.interp(lt, x, np.asarray(v)[::-1])) for sp, v in profile.vmr.items()} + kzz = float(np.interp(lt, x, profile.kzz[::-1])) if profile.kzz is not None else None + n = p_target / (kb * T) + return dict( + p=float(p_target), + r=float(r), + T=float(T), + mmw=float(mmw), + n=float(n), + rho=float(n * mmw), + vmr=vmr, + kzz=kzz, + ) + + +def pressure_at_radius(profile: Profile, r_target: float) -> float: + """Pressure interpolated at a target radius, log-linear in pressure. + + Clamps to the endpoint pressures outside the covered radius range. + """ + lp = np.log(profile.p) + return float(np.exp(np.interp(r_target, profile.r, lp))) + + +def photospheric_level(profile: Profile, p_photo: float = 2000.0) -> tuple[dict, dict]: + """The photospheric working level for the energy-limited geometric factor. + + The level is placed at ``p_photo`` (default 20 mbar, the + optical-photosphere-type level of Baumeister et al. 2023, A&A 675, + A122). When the profile does not span that pressure, the nearest end + level is used and the ``photo_clamped`` flag raised. + + Returns + ------- + (level, flags) + The interpolated level dict and a flags dict. + """ + if profile.p[0] < p_photo: + return interp_at_pressure(profile, float(profile.p[0])), {'photo_clamped': True} + if profile.p[-1] > p_photo: + return interp_at_pressure(profile, float(profile.p[-1])), {'photo_clamped': True} + return interp_at_pressure(profile, p_photo), {} + + +def lopez_base_pressure(mu_kg: float, g: float) -> float: + """Lopez (2017) XUV wind-base pressure, in Pa. + + ``P_base = mu g / sigma_nu0`` with the Murray-Clay et al. (2009) + photoionization cross section at 20 eV, about a nanobar for a hot + Jupiter: the pressure of the tau = 1 level for XUV photons, where the + heating is deposited and the wind is launched (Lopez 2017, MNRAS 472, + 245, their Section 2). ``mu_kg`` is the local mean particle mass [kg] + and ``g`` the local gravity [m s^-2]. + """ + return mu_kg * g / SIGMA_NU0 + + +def wind_base_level( + profile: Profile, + M_p: float, + method: str = 'lopez', + fixed_pressure: float = 5.0, + boreas_scalars: dict | None = None, +) -> tuple[dict, dict]: + """Locate the XUV wind base on the profile. + + Three methods: + + - ``'lopez'`` (default): fixed-point iteration of the Lopez (2017) + base pressure ``P_base = mu(P) g(r(P)) / sigma_nu0`` on the profile + (two to four passes converge). When the physical base pressure lies + above the profile top (``P_base < p_top``), the level clamps to the + topmost level, the ``base_clamped`` flag is raised, and the clamp + distance in pressure decades is recorded; callers wanting the base on + an extended upper structure evaluate it there instead. + - ``'fixed_pressure'``: the level at ``fixed_pressure`` [Pa]. + - ``'boreas'``: the base radius from the BOREAS mass-loss solver + (optional dependency), translated to a profile pressure; falls back + to ``'lopez'`` with the ``base_method_fallback`` flag when BOREAS is + absent or does not converge. Requires ``boreas_scalars`` with keys + ``R_p`` [m], ``T_eq`` [K], and ``F_xuv`` [W m^-2]. + + Returns + ------- + (level, flags) + The interpolated level dict and a flags dict. On the Lopez path the + flags carry ``base_pressure_pa``, the physical (unclamped) base + pressure. + """ + flags: dict = {} + if method == 'fixed_pressure': + p_target = min(max(fixed_pressure, float(profile.p[-1])), float(profile.p[0])) + if p_target != fixed_pressure: + flags['base_clamped'] = True + flags['base_clamp_decades'] = abs(float(np.log10(fixed_pressure / p_target))) + return interp_at_pressure(profile, p_target), flags + + if method == 'boreas': + p_boreas = _boreas_base_pressure(profile, M_p, boreas_scalars) + if p_boreas is not None: + p_target = min(max(p_boreas, float(profile.p[-1])), float(profile.p[0])) + if p_target != p_boreas: + flags['base_clamped'] = True + flags['base_clamp_decades'] = abs(float(np.log10(p_boreas / p_target))) + flags['base_pressure_pa'] = p_boreas + return interp_at_pressure(profile, p_target), flags + flags['base_method_fallback'] = 'lopez' + + # Lopez (2017) fixed point: P depends on mu and g, which depend on the + # level P selects; iterate from the profile top downward. + lev = interp_at_pressure(profile, float(profile.p[-1])) + p_target = None + for _ in range(6): + g = G * M_p / lev['r'] ** 2 + p_new = lopez_base_pressure(lev['mmw'], g) + p_new = min(max(p_new, float(profile.p[-1])), float(profile.p[0])) + if p_target is not None and abs(np.log(p_new / p_target)) < 1e-6: + p_target = p_new + break + p_target = p_new + lev = interp_at_pressure(profile, p_target) + g = G * M_p / lev['r'] ** 2 + p_phys = lopez_base_pressure(lev['mmw'], g) + flags['base_pressure_pa'] = p_phys + if p_phys < profile.p[-1] * (1.0 - 1e-9): + # The profile top is deeper than the physical base level. + flags['base_clamped'] = True + flags['base_clamp_decades'] = float(np.log10(profile.p[-1] / p_phys)) + p_target = float(profile.p[-1]) + return interp_at_pressure(profile, p_target), flags + + +def _boreas_base_pressure(profile: Profile, M_p: float, scalars: dict | None) -> float | None: + """XUV base pressure from the BOREAS solver, or None on any failure. + + Feeds BOREAS the same scalars its PROTEUS wrapper uses (equilibrium + temperature, XUV flux, planet mass and radius, and the mass mixing + ratios of the gases it models, taken here at the profile top), runs its + bulk mass-loss solve, and converts the returned XUV radius to a profile + pressure. Every failure mode (missing dependency, missing scalars, + unsupported composition, non-convergence) returns None so the caller + can fall back. + """ + if not scalars: + return None + try: + import boreas # type: ignore + + params = boreas.ModelParams() + params.albedo = 0.0 + params.Teq = float(scalars['T_eq']) + params.FXUV = float(scalars['F_xuv']) * 1e3 # W m^-2 -> erg cm^-2 s^-1 + params.rplanet = float(scalars['R_p']) * 1e2 # m -> cm + params.mplanet = float(M_p) * 1e3 # kg -> g + # Mass mixing ratios of the BOREAS-supported gases at the profile top. + supported = set(params.kappa.keys()) + top = {sp: float(np.asarray(v)[-1]) for sp, v in profile.vmr.items()} + masses = {sp: species_mass_amu(sp) for sp in top} + norm = sum(top[sp] * masses[sp] for sp in top if sp in supported) + if norm <= 0.0: + return None + for sp in top: + if sp in supported: + setattr(params, f'X_{sp}', top[sp] * masses[sp] / norm) + params._recompute_composites() + params._init_opacities() + result = boreas.MassLoss(params).compute_mass_loss_parameters( + [params.mplanet], [params.rplanet], [params.Teq] + )[0] + if result.get('regime') == 'SKIPPED' or 'RXUV' not in result: + return None + r_xuv = float(result['RXUV']) * 1e-2 # cm -> m + return pressure_at_radius(profile, r_xuv) + except Exception: + return None + + +def atomized_element_fractions(level: dict) -> dict[str, float]: + """Element mole fractions of the atomized composition at a level dict.""" + return atomize(level['vmr']) diff --git a/tests/test_profiles.py b/tests/test_profiles.py new file mode 100644 index 00000000..66bd37e4 --- /dev/null +++ b/tests/test_profiles.py @@ -0,0 +1,326 @@ +"""Tests for ``src/zephyrus/profiles.py``. + +Exercises the atmosphere-profile container and the escape working levels. +The physical invariants under test: + +- Conservation / closed form: the isothermal profile obeys the hydrostatic + relation ``dr = -(k T r^2 / (G M mu)) d ln p`` level by level, and the + interpolated number density obeys the ideal-gas law ``n = p / (k T)``. +- Positivity / boundedness: profile validation rejects non-monotone + pressure or radius and non-positive state variables; working levels clamp + to the covered pressure range with flags rather than extrapolating. +- Reference pin: the Lopez (2017) wind-base pressure lands at the nanobar + tau = 1 level Murray-Clay et al. (2009) print for a hot Jupiter. +- Error contract: an unbound isothermal structure raises; the BOREAS base + method falls back to Lopez with a flag when the dependency is absent. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import sys +import types + +import numpy as np +import pytest + +from zephyrus.constants import G, amu, kb, m_p +from zephyrus.planets_parameters import Me, Mjup, Re, Rjup +from zephyrus.profiles import ( + Profile, + interp_at_pressure, + isothermal_profile, + lopez_base_pressure, + photospheric_level, + pressure_at_radius, + wind_base_level, +) + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +def _n2_profile(p_top=1e-6): + """Bound isothermal N2 test atmosphere on a warm super-Earth.""" + return isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e7, p_top) + + +def test_profile_validation_rejects_malformed_input(): + """Validation raises on non-monotone arrays and accepts a sound profile. + + The error contract: increasing pressure, decreasing radius, negative + temperature, mismatched mixing-ratio length, and a two-level profile + all raise ``ValueError``; the well-formed profile on the same path + validates silently. + """ + good = _n2_profile() + good.validate() # must not raise + bad_p = Profile(p=good.p[::-1], r=good.r, T=good.T, vmr=good.vmr, mmw=good.mmw) + with pytest.raises(ValueError, match='must decrease'): + bad_p.validate() + bad_T = Profile(p=good.p, r=good.r, T=-good.T, vmr=good.vmr, mmw=good.mmw) + with pytest.raises(ValueError, match='positive'): + bad_T.validate() + bad_vmr = Profile(p=good.p, r=good.r, T=good.T, vmr={'N2': good.p[:2]}, mmw=good.mmw) + with pytest.raises(ValueError, match='length mismatch'): + bad_vmr.validate() + tiny = Profile( + p=good.p[:2], + r=good.r[:2], + T=good.T[:2], + vmr={'N2': good.p[:2] * 0 + 1}, + mmw=good.mmw[:2], + ) + with pytest.raises(ValueError, match='at least 3'): + tiny.validate() + + +@pytest.mark.physics_invariant +def test_isothermal_profile_obeys_hydrostatic_relation(): + """Each integration step matches the local hydrostatic scale height. + + The construction integrates ``dr = -H d ln p`` with + ``H = k T r^2 / (G M mu)``, so the recovered per-step ratio + ``dr / d ln p`` must equal ``-H`` evaluated at the lower level. This is + the conservation-style closed form; the guard is that a plane-parallel + slip (H frozen at the surface value) accumulates a visible radius error + over the profile, so the top radius must exceed the plane-parallel + estimate. + """ + M, R, T = 5 * Me, 1.5 * Re, 800.0 + prof = _n2_profile() + mu = float(prof.mmw[0]) + lnp = np.log(prof.p) + for i in (0, len(prof.p) // 2): + H = kb * T * prof.r[i] ** 2 / (G * M * mu) + step = (prof.r[i + 1] - prof.r[i]) / (lnp[i + 1] - lnp[i]) + assert step == pytest.approx(-H, rel=1e-12) + # Curvature guard: the r^2 growth of H makes the true extent exceed the + # plane-parallel (surface-H) estimate. + H0 = kb * T * R**2 / (G * M * mu) + plane_parallel_top = R + H0 * np.log(prof.p[0] / prof.p[-1]) + assert prof.r[-1] > plane_parallel_top + # The structure stays bound: the local Jeans parameter never drops + # below the documented truncation threshold. + lam = G * M * mu / (kb * T * prof.r) + assert np.all(lam >= 2.2 - 1e-9) + + +def test_isothermal_profile_truncates_or_raises_when_unbound(): + """An unbound structure truncates with fewer levels, or raises outright. + + A hot, light hydrogen atmosphere on a small planet becomes unbound + within the requested pressure span: the returned profile must stop at + the Jeans-parameter floor instead of extending to ``p_top``. When even + the surface is unbound, the constructor raises (the error contract). + """ + prof = isothermal_profile(1 * Me, 1.0 * Re, 2000.0, {'H2': 1.0}, 1e7, 1e-6) + # Truncated: the top pressure never reaches the requested 1e-6 Pa. + assert prof.p[-1] > 1e-6 + assert len(prof.p) < 120 + with pytest.raises(ValueError, match='unbound'): + # A Jeans parameter below 2.2 at the surface itself. + isothermal_profile(0.05 * Me, 2.0 * Re, 3000.0, {'H2': 1.0}, 1e7, 1e-6) + + +@pytest.mark.physics_invariant +def test_interp_at_pressure_ideal_gas_and_node_exactness(): + """Interpolation returns exact node values and ideal-gas densities. + + At a grid node the interpolated radius and temperature reproduce the + stored level exactly; between nodes the number density obeys + ``n = p / (k T)`` by construction (the ideal-gas closed form), and the + mass density is ``n`` times the mean molecular mass. + """ + prof = _n2_profile() + k = len(prof.p) // 2 + lev = interp_at_pressure(prof, float(prof.p[k])) + assert lev['r'] == pytest.approx(float(prof.r[k]), rel=1e-12) + assert lev['T'] == pytest.approx(float(prof.T[k]), rel=1e-12) + # Ideal gas at an off-node pressure. + p_mid = np.sqrt(prof.p[k] * prof.p[k + 1]) + lev2 = interp_at_pressure(prof, float(p_mid)) + assert lev2['n'] == pytest.approx(float(p_mid) / (kb * lev2['T']), rel=1e-12) + assert lev2['rho'] == pytest.approx(lev2['n'] * lev2['mmw'], rel=1e-12) + # Radius must lie strictly between the bracketing nodes. + assert prof.r[k] < lev2['r'] < prof.r[k + 1] + + +def test_pressure_at_radius_inverts_the_profile(): + """Radius-to-pressure interpolation inverts pressure-to-radius lookup. + + Round trip: interpolating the level at a node pressure and asking for + the pressure at the returned radius must recover the node pressure. The + guard is an off-grid radius, whose pressure must fall between the + bracketing node pressures. + """ + prof = _n2_profile() + k = len(prof.p) // 3 + lev = interp_at_pressure(prof, float(prof.p[k])) + assert pressure_at_radius(prof, lev['r']) == pytest.approx(float(prof.p[k]), rel=1e-9) + r_mid = 0.5 * (prof.r[k] + prof.r[k + 1]) + p_mid = pressure_at_radius(prof, r_mid) + assert prof.p[k + 1] < p_mid < prof.p[k] + + +def test_photospheric_level_clamps_with_flags(): + """The photospheric level sits at 20 mbar, clamping to the ends flagged. + + Inside the covered range the level lands at 2000 Pa exactly. A profile + whose top never reaches 20 mbar clamps to its top level; one whose + surface is already above 20 mbar clamps to its deepest level. Both + clamps raise ``photo_clamped``. + """ + prof = _n2_profile() + lev, flags = photospheric_level(prof) + assert lev['p'] == pytest.approx(2000.0, rel=1e-12) + assert flags == {} + deep = isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e7, 1e4) + lev_d, flags_d = photospheric_level(deep) + assert flags_d.get('photo_clamped') is True + assert lev_d['p'] == pytest.approx(1e4, rel=1e-12) + shallow = isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e3, 1e-4) + lev_s, flags_s = photospheric_level(shallow) + assert flags_s.get('photo_clamped') is True + assert lev_s['p'] == pytest.approx(1e3, rel=1e-12) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_lopez_base_pressure_is_the_nanobar_level(): + """The Lopez (2017) base pressure reproduces the published nanobar level. + + Murray-Clay et al. (2009, ApJ 693, 23, Section 2.1) place the tau = 1 + level for 20 eV photons near a nanobar for their fiducial hot Jupiter + (0.7 Jupiter masses, 1.4 Jupiter radii, atomic-hydrogen thermosphere), + and Lopez (2017, MNRAS 472, 245) builds the wind-base prescription + ``P_base = mu g / sigma_nu0`` on the same level. Both papers quote the + scale, not a precise value, so the pin is the order of magnitude: the + computed pressure must land within a factor of a few of 1e-4 Pa (one + nanobar). Sign and scale guards: strictly positive and far below the + 20 mbar photospheric level. + """ + g = G * (0.7 * Mjup) / (1.4 * Rjup) ** 2 + p_base = lopez_base_pressure(1.008 * amu, g) + # One nanobar is 1e-4 Pa; allow a factor of a few for the mu convention. + assert 3e-5 < p_base < 3e-4 + assert p_base > 0.0 + # Scale guard: eighty decades of headroom is a unit slip, five is right. + assert p_base < 2000.0 * 1e-4 + # Linearity in gravity: doubling g doubles the base pressure. + assert lopez_base_pressure(1.008 * amu, 2 * g) == pytest.approx(2 * p_base, rel=1e-12) + # The proton-mass convention differs from the atomic-weight convention + # by under a percent; both stay inside the pinned band. + assert lopez_base_pressure(m_p, g) == pytest.approx(p_base, rel=0.01) + + +def test_wind_base_level_lopez_converges_and_clamps(): + """The Lopez fixed point converges on-profile and clamps off-profile. + + On a profile reaching 1e-6 Pa the nanobar-scale base lies inside the + covered range, so the returned level pressure equals the physical base + pressure and no clamp flag is raised. On a profile truncated at 1e-2 Pa + the physical base lies above the top, so the level clamps to the top + with the clamp distance recorded in pressure decades. + """ + prof = _n2_profile(p_top=1e-6) + lev, flags = wind_base_level(prof, 5 * Me, method='lopez') + assert 'base_clamped' not in flags + assert lev['p'] == pytest.approx(flags['base_pressure_pa'], rel=1e-3) + # The N2 base sits at the nanobar scale (between 0.01 and 100 nanobar). + assert 1e-6 < lev['p'] < 1e-2 + deep = _n2_profile(p_top=1e-2) + lev_d, flags_d = wind_base_level(deep, 5 * Me, method='lopez') + assert flags_d.get('base_clamped') is True + assert lev_d['p'] == pytest.approx(float(deep.p[-1]), rel=1e-12) + expected_decades = np.log10(deep.p[-1] / flags_d['base_pressure_pa']) + assert flags_d['base_clamp_decades'] == pytest.approx(expected_decades, rel=1e-9) + assert flags_d['base_clamp_decades'] > 0.0 + + +def test_wind_base_level_fixed_pressure_method(): + """The fixed-pressure method hits its target and clamps out of range. + + The returned level must sit exactly at the requested pressure when the + profile covers it, and clamp with a flag when it does not (matching the + nearest-level behavior of the energy-limited path). + """ + prof = _n2_profile() + lev, flags = wind_base_level(prof, 5 * Me, method='fixed_pressure', fixed_pressure=5.0) + assert lev['p'] == pytest.approx(5.0, rel=1e-12) + assert flags == {} + lev_c, flags_c = wind_base_level(prof, 5 * Me, method='fixed_pressure', fixed_pressure=1e-9) + assert flags_c.get('base_clamped') is True + assert lev_c['p'] == pytest.approx(float(prof.p[-1]), rel=1e-12) + + +def test_wind_base_level_boreas_falls_back_without_dependency(monkeypatch): + """The BOREAS method falls back to Lopez, flagged, when BOREAS is absent. + + Blocking the ``boreas`` import must not raise: the method returns the + Lopez level with ``base_method_fallback`` recorded, and the fallback + level matches a direct Lopez call. Missing scalars trigger the same + fallback path. + """ + monkeypatch.setitem(sys.modules, 'boreas', None) # forces ImportError + prof = _n2_profile() + scalars = {'R_p': 1.5 * Re, 'T_eq': 800.0, 'F_xuv': 10.0} + lev, flags = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) + assert flags.get('base_method_fallback') == 'lopez' + lev_ref, _ = wind_base_level(prof, 5 * Me, method='lopez') + assert lev['p'] == pytest.approx(lev_ref['p'], rel=1e-12) + # Missing scalars: same fallback, no exception. + lev2, flags2 = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=None) + assert flags2.get('base_method_fallback') == 'lopez' + assert lev2['p'] == pytest.approx(lev_ref['p'], rel=1e-12) + + +def test_wind_base_level_boreas_uses_solver_radius(monkeypatch): + """A converged BOREAS solve places the base at the solver's XUV radius. + + The mocked solver returns a physically plausible XUV radius mid-profile + (mock discipline: a real radius in cm, not a unit constant), and the + returned level pressure must equal the profile pressure at that radius. + A solver that reports a skipped regime triggers the Lopez fallback. + """ + prof = _n2_profile() + r_target = float(0.5 * (prof.r[0] + prof.r[-1])) # mid-profile radius [m] + + class FakeParams: + def __init__(self): + self.kappa = {'N2': 1.0} + self.albedo = None + self.Teq = None + self.FXUV = None + self.rplanet = None + self.mplanet = None + + def _recompute_composites(self): + pass + + def _init_opacities(self): + pass + + class FakeMassLoss: + def __init__(self, params): + self.params = params + + def compute_mass_loss_parameters(self, m, r, t): + return [{'regime': 'EL', 'RXUV': r_target * 1e2}] # cm + + fake = types.ModuleType('boreas') + fake.ModelParams = FakeParams + fake.MassLoss = FakeMassLoss + monkeypatch.setitem(sys.modules, 'boreas', fake) + scalars = {'R_p': 1.5 * Re, 'T_eq': 800.0, 'F_xuv': 10.0} + lev, flags = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) + assert 'base_method_fallback' not in flags + assert lev['p'] == pytest.approx(pressure_at_radius(prof, r_target), rel=1e-9) + # Interior radius: the level pressure must be between the endpoints. + assert prof.p[-1] < lev['p'] < prof.p[0] + + class SkippedMassLoss(FakeMassLoss): + def compute_mass_loss_parameters(self, m, r, t): + return [{'regime': 'SKIPPED'}] + + fake.MassLoss = SkippedMassLoss + lev_f, flags_f = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) + assert flags_f.get('base_method_fallback') == 'lopez' From b1a3d27d234229aa68c699a21d0cd311bfffc1a9 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:09:04 +0200 Subject: [PATCH 005/113] Add the collision cross-section ladder and the sonic-point Knudsen switch --- src/zephyrus/composition.py | 27 ++++ src/zephyrus/knudsen.py | 274 ++++++++++++++++++++++++++++++++++++ tests/test_knudsen.py | 212 ++++++++++++++++++++++++++++ 3 files changed, 513 insertions(+) create mode 100644 src/zephyrus/knudsen.py create mode 100644 tests/test_knudsen.py diff --git a/src/zephyrus/composition.py b/src/zephyrus/composition.py index b0a7f19f..597c146d 100644 --- a/src/zephyrus/composition.py +++ b/src/zephyrus/composition.py @@ -41,6 +41,33 @@ 'Xe': 131.293, } +# Van der Waals radii in Angstrom, from Bondi (1964, J. Phys. Chem. 68, 441), +# Tables I and XIV as printed, except Fe: Bondi prints no transition metals, +# so the iron radius is Alvarez (2013, Dalton Trans. 42, 8617), with published +# values spanning roughly 2.0 to 2.44 Angstrom across compilations. The Mg +# value is a flagged outlier of Bondi's own table (derived from the critical +# volume and marked tentative there); Batsanov (2001) gives 2.10 to 2.27 and +# Alvarez (2013) 2.51, so quantities scaled from the Mg radius carry a 36 to +# 55 percent softness beyond their provenance class. Used as the last-resort +# geometric rung of the collision cross-section ladder and by the +# kinetic-diameter scaling rule of the binary-diffusion library. +BONDI_VDW_RADIUS_A = { + 'H': 1.20, + 'He': 1.40, + 'C': 1.70, + 'N': 1.55, + 'O': 1.52, + 'Ne': 1.54, + 'Na': 2.27, + 'Mg': 1.73, + 'Si': 2.10, + 'S': 1.80, + 'Ar': 1.88, + 'Fe': 2.44, + 'Kr': 2.02, + 'Xe': 2.16, +} + _FORMULA_TOKEN = re.compile(r'([A-Z][a-z]?)(\d*)') diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py new file mode 100644 index 00000000..e2169303 --- /dev/null +++ b/src/zephyrus/knudsen.py @@ -0,0 +1,274 @@ +""" +!!! info "`knudsen.py`" + Neutral collision cross sections and the sonic-point Knudsen switch.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +from zephyrus.composition import BONDI_VDW_RADIUS_A, parse_formula +from zephyrus.constants import kb, kb_cgs + +SQRT2 = math.sqrt(2.0) + +# Diagnostic band on the switch threshold: the transition Knudsen number is +# heating-geometry physics, not a free parameter. Direct simulation Monte +# Carlo runs place it near 0.1 for a sharp heating layer and near 1 for +# distributed heating (Johnson et al. 2013, ApJL 768, L4); the upper edge +# extends the band to 3. Printed alongside every switch verdict, never +# configurable. +KN_BAND = (0.1, 3.0) + +# --------------------------------------------------------------------------- +# Rung 1: Laricchiuta et al. (2009, Eur. Phys. J. D 54, 607) phenomenological +# collision integrals. Their Eq. (2) is a double-sigmoid fit to the reduced +# collision integral in x = ln(kT/eps0), Eq. (3) gives the fit coefficients +# a_i as polynomials in the pair parameter beta (coefficients below from +# their electronic-appendix Table 3, neutral-neutral case, m = 6), and +# Eq. (4) sets the dimensional scale sigma^2 = (x0 r_e)^2 with +# x0 = xi1 beta^xi2 (their Table 4). The pair parameters (beta, eps0 in meV, +# r_e in Angstrom) are their Table 5. The momentum-transfer cross section is +# sigma_diff = pi sigma^2 Omega^(1,1)*, with the factor pi converting the +# reduced integral to a cross section. The implementation reproduces the +# measured room-temperature viscosities of N2, O2, CO, and CO2 to within +# 7 percent (see the companion tests). +# --------------------------------------------------------------------------- + +# Table 3 (neutral-neutral, m = 6): rows are (c0, c1, c2) of +# a_i(beta) = c0 + c1 beta + c2 beta^2, for i = 1..7. +_TABLE3_M6 = { + 'omega11': [ + (7.884756e-1, -2.438494e-2, 0.0), + (-2.952759e-1, -1.744149e-3, 0.0), + (5.020892e-1, 4.316985e-2, 0.0), + (-9.042460e-1, -4.017103e-2, 0.0), + (-3.373058e0, 2.458538e-1, -4.850047e-3), + (4.161981e0, 2.202737e-1, -1.718010e-2), + (2.462523e0, 3.231308e-1, -2.281072e-2), + ], + 'omega22': [ + (7.898524e-1, -2.114115e-2, 0.0), + (-2.998325e-1, -1.243977e-3, 0.0), + (7.077103e-1, 3.583907e-2, 0.0), + (-8.946857e-1, -2.473947e-2, 0.0), + (-2.958969e0, 2.303358e-1, -5.226562e-3), + (4.348412e0, 1.920321e-1, -1.496557e-2), + (2.205440e0, 2.567027e-1, -1.861359e-2), + ], +} +_XI1_M6, _XI2_M6 = 0.8002, 0.049256 # Table 4, m = 6 + +# Table 5 pair parameters (beta, eps0 [meV], r_e [Angstrom]) for the pairs +# relevant to secondary and CO2/N2/O2-bearing atmospheres. +LARICCHIUTA_PAIRS = { + ('N', 'N'): (6.61, 6.432, 3.583), + ('O', 'O'): (6.90, 5.763, 3.423), + ('C', 'C'): (6.69, 7.861, 3.832), + ('C', 'N'): (6.65, 6.884, 3.717), + ('C', 'O'): (6.78, 6.125, 3.653), + ('N', 'O'): (6.72, 5.989, 3.507), + ('N2', 'N2'): (8.07, 11.443, 3.829), + ('O2', 'O2'): (8.14, 11.972, 3.780), + ('CO', 'CO'): (8.00, 12.264, 3.889), + ('CO2', 'CO2'): (7.75, 19.911, 4.119), + ('N', 'CO2'): (6.90, 10.461, 3.892), + ('O', 'CO2'): (7.19, 9.270, 3.842), + ('N2', 'CO2'): (7.90, 14.772, 3.986), +} + +# --------------------------------------------------------------------------- +# Rung 2: hydrogen, which Laricchiuta et al. do not tabulate. Zahnle et al. +# (1990, Icarus 84, 502) Eq. (30) inverts the binary diffusion parameter +# into a collision cross section, sigma_c = (3 sqrt(pi) / (16 b11)) +# sqrt(2 k T / mu11) in cgs, with mu11 = m/2 the like-pair reduced mass. +# The H2-H2 self-diffusion parameter b11 = 4.96e17 T^0.75 cm^-1 s^-1 is +# recovered from the in-H2 column of Zahnle & Kasting (1986, Icarus 68, 462) +# Table I, and the H-H value scales it by 1.91, the mean of that table's +# printed in-H over in-H2 column ratios. The route gives sigma(H-H) = +# 6.4e-20 m^2 at 1e4 K with a T^-0.25 dependence by construction. +# --------------------------------------------------------------------------- +_B11_H2H2 = 4.96e17 # cm^-1 s^-1 prefactor of b11 = 4.96e17 T^0.75 +_H_COLUMN_SCALE = 1.91 # ZK86 Table I in-H2 -> in-H column scaling +_M_H2_G = 2.016 * 1.66053907e-24 # g +_M_H_G = 1.008 * 1.66053907e-24 # g + + +def _lar_ai(beta: float, which: str) -> list[float]: + return [c0 + c1 * beta + c2 * beta * beta for (c0, c1, c2) in _TABLE3_M6[which]] + + +def lar_omega_star(pair: tuple, T: float, which: str = 'omega11') -> float: + """Reduced collision integral Omega^(l,s)* (Laricchiuta et al. 2009, Eqs. 2-3).""" + beta, eps0_mev, _re = LARICCHIUTA_PAIRS[pair] + a1, a2, a3, a4, a5, a6, a7 = _lar_ai(beta, which) + x = math.log(kb * T / (eps0_mev * 1e-3 * 1.602176634e-19)) + s1 = 1.0 / (1.0 + math.exp(-2.0 * (x - a3) / a4)) + s2 = 1.0 / (1.0 + math.exp(-2.0 * (x - a6) / a7)) + return math.exp((a1 + a2 * x) * s1 + a5 * s2) + + +def lar_sigma2_omega(pair: tuple, T: float, which: str = 'omega11') -> float: + """Dimensional sigma^2 Omega^(l,s)* in Angstrom^2 (Laricchiuta et al. 2009, Eq. 4).""" + beta, _eps0, re_a = LARICCHIUTA_PAIRS[pair] + x0 = _XI1_M6 * beta**_XI2_M6 + return (x0 * re_a) ** 2 * lar_omega_star(pair, T, which) + + +def lar_sigma_diff(pair: tuple, T: float) -> float: + """Momentum-transfer cross section pi sigma^2 Omega^(1,1)*, in m^2.""" + return math.pi * lar_sigma2_omega(pair, T, 'omega11') * 1e-20 + + +def viscosity_pure(pair: tuple, mass_gmol: float, T: float) -> float: + """First-approximation Chapman-Enskog viscosity of a pure gas, in Pa s. + + ``eta = 2.6693e-5 sqrt(M T) / (sigma^2 Omega^(2,2)*)`` poise, with the + molar mass in g/mol and the collision integral in Angstrom^2 (the + standard first Chapman-Enskog approximation; see e.g. Hirschfelder, + Curtiss & Bird 1954). Exposed as the validation route: it anchors the + Laricchiuta transcription on measured viscosities. + """ + s2o22 = lar_sigma2_omega(pair, T, 'omega22') + eta_poise = 2.6693e-5 * math.sqrt(mass_gmol * T) / s2o22 + return eta_poise * 0.1 + + +def sigma_zk90_hydrogen(species: str, T: float) -> float: + """H-H or H2-H2 momentum-transfer cross section in m^2 (Zahnle et al. 1990, Eq. 30). + + ``sigma_c = (3 sqrt(pi) / (16 b11)) sqrt(2 k T / mu11)`` in cgs, with + ``mu11 = m / 2`` and ``b11 = 4.96e17 T^0.75 cm^-1 s^-1`` for H2-H2, + scaled by 1.91 for H-H. Temperature dependence T^-0.25 by construction. + """ + if species == 'H2': + b11 = _B11_H2H2 * T**0.75 + mu11 = _M_H2_G / 2.0 + elif species == 'H': + b11 = _H_COLUMN_SCALE * _B11_H2H2 * T**0.75 + mu11 = _M_H_G / 2.0 + else: + raise ValueError(f'hydrogen route only covers H and H2, got {species!r}') + sigma_cm2 = (3.0 * math.sqrt(math.pi) / (16.0 * b11)) * math.sqrt(2.0 * kb_cgs * T / mu11) + return sigma_cm2 * 1e-4 + + +def sigma_geometric(species: str) -> float: + """Last-resort geometric hard-sphere cross section pi (2 r_vdW)^2, in m^2. + + Uses the Bondi (1964) van der Waals radius; for a composite molecule + without a tabulated radius, the largest constituent-element radius sets + the scale. A hard sphere has no temperature dependence, so against the + shrinking collision integrals this rung is roughly right at room + temperature but overshoots by a factor of a few at 1e4 K (2.6 for + atomic N), which biases the Knudsen number low and the switch toward + hydrodynamic verdicts. The provenance class records which species sit + on this rung so the bias stays visible. + """ + base = species.split('_')[0] + if base in BONDI_VDW_RADIUS_A: + r = BONDI_VDW_RADIUS_A[base] + else: + r = max(BONDI_VDW_RADIUS_A.get(el, 1.5) for el in parse_formula(base)) + return math.pi * (2.0 * r * 1e-10) ** 2 + + +def sigma_species(species: str, T: float) -> tuple[float, str]: + """Cross section for one species with its provenance class. + + The ladder, most trusted rung first: the Laricchiuta et al. (2009) + like-pair collision integral where tabulated; the Zahnle et al. (1990) + diffusion-inversion route for H and H2; the geometric Bondi-radius + hard sphere as last resort. Returns ``(sigma [m^2], provenance)`` with + provenance one of ``'laricchiuta'``, ``'zk90-scaled'``, + ``'geometric-vdw'``. + """ + base = species.split('_')[0] + if (base, base) in LARICCHIUTA_PAIRS: + return lar_sigma_diff((base, base), T), 'laricchiuta' + if base in ('H', 'H2'): + return sigma_zk90_hydrogen(base, T), 'zk90-scaled' + return sigma_geometric(base), 'geometric-vdw' + + +def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: + """Density-weighted effective cross section of a mixture. + + ``sigma_C = sum_k n_k sigma_k / n``, the mixture weighting of + Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 25). + ``vmr`` maps species to mole fractions (renormalized internally). + Returns ``(sigma_C [m^2], provenance dict per species)``. + """ + tot = sum(vmr.values()) + sig = 0.0 + prov: dict[str, str] = {} + for sp, x in vmr.items(): + if x <= 0.0: + continue + s, p = sigma_species(sp, T) + sig += (x / tot) * s + prov[sp] = p + return sig, prov + + +# --------------------------------------------------------------------------- +# The sonic-point Knudsen switch. Chatterjee & Pierrehumbert (2026, +# arXiv:2412.05188) build the sonic-point Knudsen number from the Maxwell +# mean free path 1/(sqrt(2) sigma n) against the analytic sonic-point +# density scale height of their Eq. (17), +# H_sc = (1 + gamma) r_sc / (4 + sqrt(2) sqrt(5 - 3 gamma)), +# giving their Eq. (18) +# Kn_sc = (4 + sqrt(2) sqrt(5 - 3 gamma)) +# / (sqrt(2) (1 + gamma) sigma_C n_sc r_sc). +# A flow with Kn_sc at or below the threshold is collisional at its sonic +# point and sustains a hydrodynamic wind; above it, the gas decouples before +# reaching sonic conditions and escape is hydrostatic (Jeans-like). The +# threshold's physical band is KN_BAND above. +# --------------------------------------------------------------------------- + + +def mean_free_path(sigma: float, n: float) -> float: + """Maxwell mean free path 1/(sqrt(2) sigma n), in m.""" + return 1.0 / (SQRT2 * sigma * n) + + +def sonic_scale_height(r_sc: float, gamma: float = 1.0) -> float: + """Analytic sonic-point density scale height, in m (CP26 Eq. 17).""" + return (1.0 + gamma) * r_sc / (4.0 + SQRT2 * math.sqrt(5.0 - 3.0 * gamma)) + + +def kn_sonic( + n_sc: float, r_sc: float, vmr: dict[str, float], T_sc: float, gamma: float = 1.0 +) -> tuple[float, float, dict]: + """Sonic-point Knudsen number (CP26 Eq. 18) for a mixture. + + ``n_sc`` is the heavy-particle number density at the sonic point + [m^-3], ``r_sc`` the sonic radius [m], ``vmr`` the (atomized) mixture + composition, ``T_sc`` the temperature the cross sections are evaluated + at [K], and ``gamma`` the polytropic index (1 for an isothermal wind). + Returns ``(Kn_sc, sigma_C [m^2], provenance dict)``. + """ + sigma, prov = sigma_mixture(vmr, T_sc) + kn = (4.0 + SQRT2 * math.sqrt(5.0 - 3.0 * gamma)) / ( + SQRT2 * (1.0 + gamma) * sigma * n_sc * r_sc + ) + return kn, sigma, prov + + +def effective_threshold(kn_crit: float, kn_hysteresis: float, prev_regime: str | None) -> float: + """The switch threshold, with a hysteresis window for evolutionary use. + + With no previous regime label the threshold is ``kn_crit`` (sharp + switch). When a previous label is supplied, the threshold moves to + ``kn_crit * kn_hysteresis`` while leaving a hydrodynamic state and to + ``kn_crit / kn_hysteresis`` while leaving a hydrostatic state, so a + time-stepping track cannot chatter between branches on numerical noise. + """ + if prev_regime is None: + return kn_crit + if prev_regime.startswith('hydrodynamic'): + return kn_crit * kn_hysteresis + if prev_regime == 'hydrostatic': + return kn_crit / kn_hysteresis + return kn_crit diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py new file mode 100644 index 00000000..f10fe09c --- /dev/null +++ b/tests/test_knudsen.py @@ -0,0 +1,212 @@ +"""Tests for ``src/zephyrus/knudsen.py``. + +Exercises the neutral collision cross-section ladder and the sonic-point +Knudsen switch. The physical invariants under test: + +- Reference pin: the Laricchiuta et al. (2009) collision integrals reproduce + the measured room-temperature viscosities of N2, O2, CO, and CO2 within + 7 percent through the first Chapman-Enskog approximation. +- Closed form: the sonic-point Knudsen number equals the Maxwell mean free + path over the analytic sonic-point scale height; the mixture cross section + is exactly density weighted. +- Monotonicity / boundedness: cross sections shrink with temperature; the + geometric hard-sphere rung sits below the collision-integral rung at high + temperature (its documented bias); the hysteresis window widens or + tightens the switch threshold on the correct side. +- Error contract: the hydrogen route rejects non-hydrogen species. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.knudsen import ( + KN_BAND, + effective_threshold, + kn_sonic, + lar_sigma_diff, + mean_free_path, + sigma_geometric, + sigma_mixture, + sigma_species, + sigma_zk90_hydrogen, + sonic_scale_height, + viscosity_pure, +) + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + +# Momentum-transfer cross sections [m^2] evaluated from the transcribed +# Laricchiuta et al. (2009) fit at transcription time and validated then +# against the measured viscosities below. They serve as transcription +# regression pins: a typo in any Table 3/4/5 coefficient moves them. +PINNED_SIGMA = { + ('N', 'N'): { + 300: 2.56e-19, + 1000: 2.00e-19, + 3000: 1.58e-19, + 10000: 1.16e-19, + 20000: 9.61e-20, + }, + ('O', 'O'): {300: 2.29e-19, 10000: 1.06e-19}, + ('C', 'C'): {300: 3.11e-19, 10000: 1.41e-19}, + ('C', 'N'): {300: 2.81e-19, 10000: 1.27e-19}, + ('C', 'O'): {300: 2.64e-19, 10000: 1.21e-19}, + ('N', 'O'): {300: 2.41e-19, 10000: 1.10e-19}, + ('N2', 'N2'): {300: 3.66e-19, 10000: 1.73e-19}, + ('O2', 'O2'): {300: 3.63e-19, 10000: 1.72e-19}, + ('CO', 'CO'): {300: 3.87e-19, 10000: 1.81e-19}, + ('CO2', 'CO2'): {300: 5.34e-19, 10000: 2.22e-19}, + ('N', 'CO2'): {300: 3.56e-19, 10000: 1.60e-19}, + ('O', 'CO2'): {300: 3.34e-19, 10000: 1.55e-19}, + ('N2', 'CO2'): {300: 4.38e-19, 10000: 1.97e-19}, +} + +# Measured dynamic viscosities at 300 K [Pa s] with the molar masses [g/mol]: +# standard handbook values (e.g. the CRC Handbook of Chemistry and Physics). +MEASURED_VISCOSITY = { + ('N2', 'N2'): (28.014, 17.9e-6), + ('O2', 'O2'): (31.998, 20.7e-6), + ('CO', 'CO'): (28.010, 17.8e-6), + ('CO2', 'CO2'): (44.009, 15.0e-6), +} + + +def test_laricchiuta_cross_sections_match_transcription_pins(): + """Every tabulated pair reproduces its pinned cross section at every T. + + The pins were evaluated from the published fit when the coefficient + tables were transcribed, so any later coefficient corruption fails + here. The temperature trend is the physical guard: collision integrals + of these attractive-well pairs shrink monotonically with temperature. + """ + for pair, vals in PINNED_SIGMA.items(): + for T, ref in vals.items(): + assert lar_sigma_diff(pair, T) == pytest.approx(ref, rel=0.01), (pair, T) + # Monotone decrease with temperature for a representative pair. + ts = [300.0, 1000.0, 3000.0, 10000.0, 20000.0] + sigmas = [lar_sigma_diff(('N', 'N'), t) for t in ts] + assert all(a > b for a, b in zip(sigmas, sigmas[1:])) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_viscosities_reproduce_measurements_within_7_percent(): + """The collision integrals reproduce four measured viscosities to 7 percent. + + The first Chapman-Enskog approximation converts the Omega^(2,2)* + integral into the pure-gas dynamic viscosity; the measured 300 K values + of N2, O2, CO, and CO2 (CRC Handbook) anchor the whole transcription on + laboratory data. The 7 percent bound is the observed worst case. The + scale guard: all four are tens of micropascal seconds, so a unit slip + in the conversion fails by orders of magnitude. + """ + for pair, (mass, eta_meas) in MEASURED_VISCOSITY.items(): + eta = viscosity_pure(pair, mass, 300.0) + assert abs(eta / eta_meas - 1.0) < 0.07, pair + # Scale guard: micropascal-second range. + assert 1e-5 < eta < 3e-5 + + +def test_hydrogen_route_pins_and_temperature_dependence(): + """The hydrogen cross sections match their published-route values. + + The Zahnle et al. (1990) Eq. (30) inversion of the Zahnle & Kasting + (1986) Table I diffusion parameter gives sigma(H-H) = 6.4e-20 m^2 at + 1e4 K and sigma(H2-H2) = 2.07e-19 m^2 at 300 K, with a T^-0.25 + dependence by construction. The error contract: any species other than + H or H2 is rejected. + """ + assert sigma_zk90_hydrogen('H', 1e4) == pytest.approx(6.4e-20, rel=0.02) + assert sigma_zk90_hydrogen('H2', 300.0) == pytest.approx(2.07e-19, rel=0.02) + r = sigma_zk90_hydrogen('H', 1e4) / sigma_zk90_hydrogen('H', 1e2) + assert r == pytest.approx((1e4 / 1e2) ** -0.25, rel=1e-9) + with pytest.raises(ValueError, match='hydrogen route'): + sigma_zk90_hydrogen('He', 1e4) + + +def test_ladder_provenance_and_geometric_bias(): + """The ladder assigns the right rung and the hard-sphere bias shows. + + N sits on the collision-integral rung, H on the hydrogen route, He (no + Laricchiuta entry, not hydrogen) on the geometric rung. A hard sphere + has no temperature dependence, so at 300 K the geometric N cross + section is comparable to the collision integral, while at 1e4 K it + overshoots by a factor of a few, the documented bias that pushes the + Knudsen number low, toward hydrodynamic verdicts. + """ + _, prov_n = sigma_species('N', 1e4) + _, prov_h = sigma_species('H', 1e4) + _, prov_he = sigma_species('He', 1e4) + assert prov_n == 'laricchiuta' + assert prov_h == 'zk90-scaled' + assert prov_he == 'geometric-vdw' + geo = sigma_geometric('N') + assert geo / lar_sigma_diff(('N', 'N'), 300.0) == pytest.approx(1.0, abs=0.25) + assert 2.0 < geo / lar_sigma_diff(('N', 'N'), 1e4) < 4.0 # high-T overshoot + # A composite molecule with no tabulated radius falls back to its + # largest constituent element without raising. + geo_h2o = sigma_geometric('H2O') + assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12) + + +@pytest.mark.physics_invariant +def test_kn_sonic_equals_mfp_over_scale_height(): + """The switch value is exactly the mean free path over the scale height. + + Closed-form identity of the construction: Kn_sc from the packaged + formula must equal ``mean_free_path(sigma, n) / sonic_scale_height(r)`` + with the same mixture cross section. The edge case is a rarefied state + (tiny n) where Kn grows without bound but stays finite and positive. + """ + vmr = {'N': 1.0} + n, r, T = 1e14, 1e7, 8000.0 + kn, sigma, prov = kn_sonic(n, r, vmr, T, gamma=1.0) + assert kn == pytest.approx(mean_free_path(sigma, n) / sonic_scale_height(r, 1.0), rel=1e-12) + assert prov == {'N': 'laricchiuta'} + # Rarefied edge: eight decades less dense means eight decades larger Kn. + kn_thin, _, _ = kn_sonic(n * 1e-8, r, vmr, T) + assert kn_thin == pytest.approx(kn * 1e8, rel=1e-9) + assert math.isfinite(kn_thin) + + +@pytest.mark.physics_invariant +def test_mixture_cross_section_is_density_weighted(): + """The mixture rule interpolates linearly between the pure endpoints. + + Density weighting means a 25/75 N-CO2 atom mix must give exactly + ``0.25 sigma_N + 0.75 sigma_CO2``, and any mixture must land strictly + between the pure endpoints. Renormalization: scaling all mole fractions + by a constant leaves the result unchanged. + """ + T = 1e4 + s_n, _ = sigma_species('N', T) + s_co2, _ = sigma_species('CO2', T) + mix, _ = sigma_mixture({'N': 0.25, 'CO2': 0.75}, T) + assert mix == pytest.approx(0.25 * s_n + 0.75 * s_co2, rel=1e-12) + assert min(s_n, s_co2) < mix < max(s_n, s_co2) + mix_scaled, _ = sigma_mixture({'N': 2.5, 'CO2': 7.5}, T) + assert mix_scaled == pytest.approx(mix, rel=1e-12) + + +def test_hysteresis_window_moves_the_threshold_the_right_way(): + """The hysteresis threshold resists leaving the previous regime. + + Sharp threshold with no memory; leaving a hydrodynamic state the + threshold rises (harder to switch to hydrostatic); leaving a + hydrostatic state it falls (harder to switch back). An unrecognized + previous label falls through to the sharp value. The window must + bracket the sharp threshold from both sides, and the diagnostic band + edges stay ordered. + """ + assert effective_threshold(1.0, 1.5, None) == pytest.approx(1.0) + up = effective_threshold(1.0, 1.5, 'hydrodynamic:EL') + dn = effective_threshold(1.0, 1.5, 'hydrostatic') + assert up == pytest.approx(1.5) + assert dn == pytest.approx(1.0 / 1.5) + assert dn < 1.0 < up + assert effective_threshold(1.0, 1.5, 'boiloff') == pytest.approx(1.0) + # The printed diagnostic band brackets the default threshold of 1. + assert KN_BAND[0] < 1.0 <= KN_BAND[1] From c6e6b01366324ff817af3980252547ee650187d9 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:13:59 +0200 Subject: [PATCH 006/113] Add the binary diffusion coefficient library with provenance classes --- src/zephyrus/diffusion.py | 508 ++++++++++++++++++++++++++++++++++++++ tests/test_diffusion.py | 250 +++++++++++++++++++ tests/test_knudsen.py | 6 +- 3 files changed, 761 insertions(+), 3 deletions(-) create mode 100644 src/zephyrus/diffusion.py create mode 100644 tests/test_diffusion.py diff --git a/src/zephyrus/diffusion.py b/src/zephyrus/diffusion.py new file mode 100644 index 00000000..437f1da5 --- /dev/null +++ b/src/zephyrus/diffusion.py @@ -0,0 +1,508 @@ +""" +!!! info "`diffusion.py`" + Binary diffusion parameters b = n D with provenance, and mixture rules.
+ Authors: Mara Attia, Viesturs Strelcs +""" + +from __future__ import annotations + +import math + +import numpy as np + +from zephyrus.composition import BONDI_VDW_RADIUS_A, ELEMENT_AMU, species_mass_amu +from zephyrus.constants import amu, kb + +# The library convention is b = n D in cm^-1 s^-1 (the form of Zahnle & +# Kasting 1986, Icarus 68, 462), fitted as b = b1000 (T/1000 K)^s. Public +# helpers that feed SI code convert at the boundary (1 cm^-1 s^-1 = +# 100 m^-1 s^-1). + +KB_SI = kb # J/K +AMU_G = amu * 1e3 # g + +# Molecular masses in amu, needed as scaling anchors, plus atomic deuterium. +MOLECULE_AMU = { + 'H2': 2.01588, + 'D': 2.0141, + 'O2': 31.998, + 'N2': 28.014, + 'CO2': 44.0095, + 'H2O': 18.0153, + 'CH4': 16.043, +} +ALL_MASS = dict(ELEMENT_AMU, **MOLECULE_AMU) + +# --------------------------------------------------------------------------- +# Kinetic diameters, pm. +# --------------------------------------------------------------------------- +# Printed by Zahnle & Kasting (2023, GeCoA 361, 228) in the last row of their +# Table 2; the standard published kinetic diameters for the molecules, with +# the atoms H and O assigned the value of the neighboring noble gas. +D_ZK23 = { + 'H2': 289.0, + 'He': 260.0, + 'Ne': 275.0, + 'Ar': 340.0, + 'CO2': 330.0, + 'O2': 346.0, + 'H2O': 265.0, + 'CH4': 380.0, + 'N2': 364.0, + 'H': 260.0, + 'D': 265.0, + 'O': 275.0, +} +# Kr and Xe from the same standard compilation. Consistency check: the van +# der Waals scaling rule below independently gives 365 and 391 pm against +# these 360 and 396, agreeing to 1.4 percent. +D_STANDARD_EXTRA = {'Kr': 360.0, 'Xe': 396.0} + +# Elements with no printed kinetic diameter anywhere (C, N, S, and the rock +# formers) get one by scaling the printed atomic-O entry with the ratio of +# Bondi (1964) van der Waals radii. Taking the atomic diameter to be the van +# der Waals size has published precedent in exactly this application (Ito & +# Ikoma 2021, MNRAS 502, 750, their Eq. 36). The rule is checkable: applied +# to He, Ne, and Ar it reproduces the printed diameters to 3 percent. +_VDW_SCALED = ('C', 'N', 'S', 'Na', 'Mg', 'Si', 'Fe') + + +def diameters() -> dict[str, float]: + """Kinetic diameters in pm: printed values plus the van der Waals rule.""" + d = dict(D_ZK23) + d.update(D_STANDARD_EXTRA) + for s in _VDW_SCALED: + d[s] = D_ZK23['O'] * BONDI_VDW_RADIUS_A[s] / BONDI_VDW_RADIUS_A['O'] + return d + + +# Rock-forming species carry two standing warnings that no coefficient +# improves away: every pair involving Na, Mg, Si, or Fe is a scaling on an +# estimated diameter (no measured coefficient exists in any compilation for +# these pairs), and at the temperatures where rock vapor exists Na and Mg +# ionize readily while these are neutral-gas coefficients. The Fe radius +# spans about 20 percent across published compilations and the Mg radius is +# a flagged outlier of Bondi's own table, so those two rungs are soft beyond +# their provenance class (see the notes in composition.BONDI_VDW_RADIUS_A). +ROCK_FORMERS = ('Na', 'Mg', 'Si', 'Fe') + +# --------------------------------------------------------------------------- +# Source 1: Zahnle & Kasting (2023, GeCoA 361, 228) Table 2. +# (i, j): (b at 1000 K in cm^-1 s^-1, class, source column as printed). +# Classes: 'M' traces to Marrero & Mason (1972) measurements; 'E' is the +# authors' own scaling estimate from the named analog pairs. All rows carry +# the fitted exponent 0.75. +# --------------------------------------------------------------------------- +ZK23_EXPONENT = 0.75 +ZK23_TABLE2 = { + ('H', 'H'): (1.3e20, 'E', 'H-H2, H2-D2, H2-Ne'), + ('H', 'O'): (9.0e19, 'E', 'H2-O2, H2-Ne, O-He, H-Ar'), + ('H', 'O2'): (6.5e19, 'E', 'H2-O2, H2-Ar, H-Ar'), + ('H', 'CO2'): (6.0e19, 'E', 'H2-CO2, He-CO2, H-Ar'), + ('O', 'O'): (3.0e19, 'E', 'O-Ar, O-O2, Ne-N2'), + ('CO2', 'O'): (1.6e19, 'E', 'H2O-CO2, Ne-CO2, O-Ar'), + ('H2O', 'CO2'): (1.56e19, 'M', 'Marrero and Mason (1972)'), + ('H2O', 'O2'): (1.59e19, 'M', 'Marrero and Mason (1972)'), + ('CO2', 'O2'): (1.0e19, 'M', 'Marrero and Mason (1972)'), + ('H', 'D'): (1.1e20, 'E', 'b11, H2-D2'), + ('H', 'He'): (1.6e20, 'M', 'Marrero and Mason (1972)'), + ('H', 'Ne'): (9.3e19, 'E', 'Ne-H2, H-Ar, He-Ne'), + ('H', 'N2'): (6.5e19, 'E', 'H2-N2'), + ('H', 'Ar'): (6.5e19, 'M', 'Marrero and Mason (1972)'), + ('O', 'D'): (6.5e19, 'E', 'b11, H2-D2'), + ('O', 'He'): (6.0e19, 'M', 'Marrero and Mason (1972)'), + ('O', 'Ne'): (3.0e19, 'E', 'O-He, O-Ar, H2-Ne'), + ('O', 'Ar'): (1.8e19, 'M', 'Marrero and Mason (1972)'), + ('O', 'N2'): (2.0e19, 'E', 'CH4-N2, air-H2O, O-O2'), + # Printed as 4.3e20; entered as 4.3e19. The printed value sits a full + # decade above the H2-D2 anchor its own source column names, while + # 4.3e19 is consistent with it and with the neighboring D rows, so the + # printed exponent is treated as a typographical error. + ('CO2', 'D'): (4.3e19, 'E', 'b11, H2-D2 [printed 4.3e20, misprint]'), + ('CO2', 'He'): (3.56e19, 'M', 'Marrero and Mason (1972)'), + ('CO2', 'Ne'): (1.62e19, 'M', 'Marrero and Mason (1972)'), + ('CO2', 'Ar'): (1.0e19, 'M', 'Marrero and Mason (1972)'), + ('CO2', 'N2'): (1.04e19, 'M', 'Marrero and Mason (1972)'), +} + +# --------------------------------------------------------------------------- +# Source 2: Sasaki & Nakazawa (1988, EPSL 89, 323) Table 1, which tabulates +# f_ij = P D_ij for the noble gases against H2 and He at 100, 1000, and +# 10000 K, based on Marrero & Mason (1972). Their Eq. (6) is D_ij = f_ij/P = +# f_ij/(n kB T), so b = n D = f/(kB T), and reading f in SI units +# (Pa m^2 s^-1) gives b [cm^-1 s^-1] = f/(kB T)/100. That unit reading is +# verified, not assumed: it reproduces five in-H2 entries of Zahnle & Kasting +# (1986) Table I (He, Ne, Ar, Kr, Xe) to between 0.02 and 3 percent, two +# independent compilations both citing Marrero & Mason; no other unit choice +# comes within two orders of magnitude (see the companion tests). +# --------------------------------------------------------------------------- +SN88_TABLE1 = { + ('He', 'H2'): {100: 2.4, 1000: 1.3e2, 10000: 7.6e3}, + ('Ne', 'H2'): {100: 1.7, 1000: 9.4e1, 10000: 5.1e3}, + ('Ne', 'He'): {100: 1.8, 1000: 8.7e1, 10000: 4.8e3}, + ('Ar', 'H2'): {100: 1.0, 1000: 7.1e1, 10000: 3.9e3}, + ('Ar', 'He'): {100: 1.2, 1000: 6.2e1, 10000: 3.6e3}, + ('Kr', 'H2'): {100: 9.2e-1, 1000: 6.1e1, 10000: 3.5e3}, + ('Kr', 'He'): {100: 1.0, 1000: 5.3e1, 10000: 3.2e3}, + ('Xe', 'H2'): {100: 8.3e-1, 1000: 5.0e1, 10000: 2.6e3}, + ('Xe', 'He'): {100: 7.9e-1, 1000: 4.4e1, 10000: 2.7e3}, +} + + +def b_from_sn88(f_value: float, T_of_table: float) -> float: + """Convert a Sasaki & Nakazawa (1988) Table 1 entry to b = n D in cm^-1 s^-1.""" + return f_value / (KB_SI * T_of_table) / 100.0 + + +def sn88_fit(species: str, partner: str, t_lo: float = 1000, t_hi: float = 10000): + """Fit b = A T^s to two Sasaki & Nakazawa temperature points. + + Defaults to the 1000 and 10000 K points, both above the 242 K validity + floor their footnote attaches to the coldest column. Returns ``(A, s)``. + """ + row = SN88_TABLE1[(species, partner)] + b_lo = b_from_sn88(row[t_lo], t_lo) + b_hi = b_from_sn88(row[t_hi], t_hi) + s = math.log(b_hi / b_lo) / math.log(t_hi / t_lo) + return b_lo / t_lo**s, s + + +# --------------------------------------------------------------------------- +# Cross-check set: Zahnle & Kasting (1986, Icarus 68, 462) Table I, b = A T^s +# in cm^-1 s^-1. Not a source of library rows; six pairs appear both here and +# in the 2023 compilation, and their agreement bounds the transcriptions. +# --------------------------------------------------------------------------- +ZK86_TABLE1 = { + ('He', 'H2'): (5.23e17, 0.75), + ('He', 'H'): (1.04e18, 0.732), + ('He', 'O'): (3.44e17, 0.75), + ('O', 'H2'): (3.0e17, 0.75), + ('O', 'H'): (4.8e17, 0.75), + ('Ne', 'H2'): (4.37e17, 0.731), + ('Ne', 'H'): (7.9e17, 0.731), + ('Ne', 'O'): (1.5e17, 0.75), + ('Ar', 'H2'): (2.81e17, 0.75), + ('Ar', 'H'): (1.06e18, 0.597), + ('Ar', 'O'): (5.61e16, 0.841), + ('Kr', 'H2'): (2.3e17, 0.76), + ('Kr', 'H'): (4.1e17, 0.76), + ('Kr', 'O'): (4.3e16, 0.841), + ('Xe', 'H2'): (2.7e17, 0.712), + ('Xe', 'H'): (4.9e17, 0.712), + ('Xe', 'O'): (3.5e16, 0.841), + ('N2', 'H2'): (2.65e17, 0.75), + ('N2', 'H'): (6.5e17, 0.70), + ('N2', 'O'): (9.7e16, 0.774), + ('CO2', 'H2'): (2.3e17, 0.75), + ('CO2', 'H'): (8.4e17, 0.60), + ('CO2', 'O'): (7.86e16, 0.776), + ('H2O', 'H2'): (2.7e17, 0.75), + ('H2O', 'H'): (6.6e17, 0.70), + ('H2O', 'O'): (1.06e17, 0.774), +} + + +def b_zk86(species: str, partner: str, T: float) -> float: + """Zahnle & Kasting (1986) Table I fit b = A T^s, in cm^-1 s^-1.""" + a, s = ZK86_TABLE1[(species, partner)] + return a * T**s + + +# --------------------------------------------------------------------------- +# Minor species in molecular backgrounds: fits b = A T^s in cm^-1 s^-1 +# carried as tabulated by the diffusion-limited escape branch (compiled by +# Viesturs Strelcs); individual rows trace to the standard compilations of +# measured binary diffusion coefficients (Marrero & Mason 1972; Zahnle & +# Kasting 1986). Keys are unordered pairs. +# --------------------------------------------------------------------------- +MOLECULAR_BACKGROUND = { + ('H', 'O2'): (4.75e17, 0.711), + ('H', 'O'): (5.7e17, 0.708), + ('H', 'He'): (8.84e17, 0.706), + ('CO2', 'H'): (8.4e17, 0.6), + ('H', 'N2'): (4.87e17, 0.698), + ('H2', 'N2'): (2.8e17, 0.740), + ('CH4', 'N2'): (7.34e16, 0.75), + ('H2', 'O2'): (3.06e17, 0.732), + ('CH4', 'O2'): (7.51e16, 0.759), + ('CO2', 'H2'): (2.23e17, 0.75), + ('CH4', 'H2'): (2.3e17, 0.765), + ('He', 'O'): (3.44e17, 0.749), + ('Ar', 'O'): (5.51e16, 0.841), + ('CO', 'O2'): (8.3e16, 0.724), + ('Ar', 'O2'): (7.17e16, 0.736), + ('CO2', 'O2'): (5.77e16, 0.749), + ('O', 'O2'): (9.69e16, 0.774), + ('He', 'O2'): (3.21e17, 0.71), + ('CO', 'N2'): (9.28e16, 0.71), + ('Ar', 'N2'): (6.64e16, 0.752), + ('CO2', 'N2'): (6.58e16, 0.752), + ('N2', 'O'): (9.69e16, 0.774), + ('He', 'N2'): (2.94e17, 0.718), +} + +# --------------------------------------------------------------------------- +# The scaling rule and the library assembly. +# --------------------------------------------------------------------------- + +# One fractional 1-sigma width per provenance class. 'measured': the 2023 and +# 1986 compilations agree to 0.2 to 4 percent on their shared measured rows; +# 10 percent is deliberately wider and is not a published figure. +# 'estimated': Zahnle & Kasting (1986) demonstrate a 30 percent perturbation +# for their estimated class and state most of their coefficients are +# estimates. 'scaled': the same operation the 2023 authors perform, whose +# in-sample error is of that size. 'scaled*': as 'scaled' plus an estimated +# kinetic diameter on at least one species. +SIGMA_CLASS = {'measured': 0.10, 'estimated': 0.30, 'scaled': 0.30, 'scaled*': 0.30} +CLASS_OF_ZK23 = {'M': 'measured', 'E': 'estimated'} + +N_CLOSEST = 3 + + +def eq10(b_anchor: float, target: tuple, anchor: tuple, mass: dict, diam: dict) -> float: + """Zahnle & Kasting (2023) Eq. (10): scale b between pairs. + + ``b_ij = b_kl sqrt((1/m_i + 1/m_j) / (1/m_k + 1/m_l)) + ((d_k + d_l) / (d_i + d_j))^2``, the reduced-mass and hard-sphere + diameter scaling their own estimated rows are built with. Masses in amu + and diameters in pm (the units cancel). + """ + i, j = target + k, l = anchor # noqa: E741 + rm_t = 1.0 / mass[i] + 1.0 / mass[j] + rm_a = 1.0 / mass[k] + 1.0 / mass[l] + return b_anchor * math.sqrt(rm_t / rm_a) * ((diam[k] + diam[l]) / (diam[i] + diam[j])) ** 2 + + +def _zk23_lookup(pair: tuple): + if pair in ZK23_TABLE2: + return ZK23_TABLE2[pair] + return ZK23_TABLE2.get(pair[::-1]) + + +def _anchors_for(target: tuple, mass: dict, diam: dict): + """Measured Table 2 rows to scale a missing pair from. + + Prefer rows sharing exactly one species with the target (the 2023 + authors' own practice); if none exists, fall back to the three rows + closest in summed kinetic diameter, which minimizes the stretch of the + hard-sphere factor. The central value downstream is the geometric mean + over the retained anchors. + """ + i, j = target + eligible = [ + (pair, b1000) + for pair, (b1000, cls, _src) in ZK23_TABLE2.items() + if cls == 'M' and pair[0] != pair[1] + ] + out = [ + (pair, eq10(b1000, target, pair, mass, diam)) + for pair, b1000 in eligible + if len({i, j} & set(pair)) == 1 and all(s in mass and s in diam for s in pair) + ] + if out: + return out, 'shared' + dsum_t = diam[i] + diam[j] + ranked = sorted( + (p for p, _b in eligible if all(s in mass and s in diam for s in p)), + key=lambda p: abs((diam[p[0]] + diam[p[1]]) - dsum_t), + ) + out = [(p, eq10(_zk23_lookup(p)[0], target, p, mass, diam)) for p in ranked[:N_CLOSEST]] + return out, 'closest' + + +class Row: + """One unordered species pair of the library, b(T) = b1000 (T/1000 K)^s.""" + + __slots__ = ('i', 'j', 'b1000', 'exponent', 'provenance', 'uncertainty', 'source') + + def __init__(self, i, j, b1000, exponent, provenance, uncertainty, source): + self.i, self.j = i, j + self.b1000 = b1000 + self.exponent = exponent + self.provenance = provenance + self.uncertainty = uncertainty + self.source = source + + @property + def key(self): + return tuple(sorted((self.i, self.j))) + + def b(self, T: float) -> float: + """The pair's b = n D at temperature T, in cm^-1 s^-1.""" + return self.b1000 * (T / 1000.0) ** self.exponent + + +def build_rows(species: list) -> list[Row]: + """Assemble one Row per unordered pair of ``species``. + + Source order: the Zahnle & Kasting (2023) Table 2 row where one is + printed (measured or estimated, at its printed value); the Sasaki & + Nakazawa (1988) noble-gas rows; otherwise the Eq. (10) scaling from the + measured Table 2 anchors, with the provenance class recording that the + row is scaled and whether it rests on an estimated diameter. + """ + mass, diam = ALL_MASS, diameters() + rows = [] + for a in range(len(species)): + for c in range(a + 1, len(species)): + i, j = species[a], species[c] + hit = _zk23_lookup((i, j)) + if hit is not None: + b1000, cls, src = hit + rows.append( + Row(i, j, b1000, ZK23_EXPONENT, f'ZK23 T2 [{cls}]', CLASS_OF_ZK23[cls], src) + ) + continue + sn = None + for a_, b_ in ((i, j), (j, i)): + if (a_, b_) in SN88_TABLE1 and b_ in ('H2', 'He'): + sn = (a_, b_) + if sn is not None: + a_fit, s_fit = sn88_fit(*sn) + rows.append( + Row( + i, + j, + a_fit * 1000.0**s_fit, + ZK23_EXPONENT, + 'SN88 T1 [M]', + 'measured', + f'Sasaki & Nakazawa (1988) Table 1; fitted exponent ' + f'{s_fit:.3f}, entered at 0.75', + ) + ) + continue + scaled, submode = _anchors_for((i, j), mass, diam) + vals = np.array([v for _p, v in scaled]) + b1000 = float(np.exp(np.mean(np.log(vals)))) + est = tuple(s for s in (i, j) if s in _VDW_SCALED) + rows.append( + Row( + i, + j, + b1000, + ZK23_EXPONENT, + f'ZK23 Eq.(10) [{submode}]', + 'scaled*' if est else 'scaled', + 'anchors ' + ', '.join(f'{p[0]}-{p[1]}' for p, _ in scaled), + ) + ) + return rows + + +def bmatrix(species: list, T: float, rows: list[Row] | None = None) -> np.ndarray: + """Symmetric b matrix in cm^-1 s^-1, with np.inf on the diagonal. + + The infinite diagonal is the convention the fractionation closure + expects (a species does not diffuse against itself). + """ + if rows is None: + rows = build_rows(species) + idx = {s: k for k, s in enumerate(species)} + n = len(species) + b = np.full((n, n), np.inf) + for r in rows: + if r.i in idx and r.j in idx: + b[idx[r.i], idx[r.j]] = b[idx[r.j], idx[r.i]] = r.b(T) + off = ~np.eye(n, dtype=bool) + if not np.all(np.isfinite(b[off])): + missing = [ + (species[a], species[c]) + for a in range(n) + for c in range(n) + if a != c and not np.isfinite(b[a, c]) + ] + raise ValueError(f'diffusion library incomplete for pairs {missing}') + return b + + +def masses_g(species: list) -> np.ndarray: + """Particle masses in g for the closure, from the shared mass table.""" + missing = [s for s in species if s not in ALL_MASS] + if missing: + raise KeyError(f'no mass tabulated for {missing}') + return np.array([ALL_MASS[s] for s in species]) * AMU_G + + +# --------------------------------------------------------------------------- +# The pair ladder for arbitrary (possibly molecular) species, used by the +# hydrostatic branch, and Blanc's law for mixtures. +# --------------------------------------------------------------------------- + +_PAIR_CACHE: dict = {} + + +def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: + """Binary diffusion parameter b = n D for one pair, in SI [m^-1 s^-1]. + + The ladder, most trusted rung first: the atomic library above (printed + rows, then the Eq. 10 scaling); the molecular-background table; as a + last resort, the library value of the nearest-mass covered species, + with the substitution recorded in the provenance string. Trailing + state annotations in species names are stripped. + + Returns ``(b [m^-1 s^-1], provenance string)``. + """ + key = tuple(sorted((sp_i.split('_')[0], sp_j.split('_')[0]))) + if key in _PAIR_CACHE: + b1000, s, prov = _PAIR_CACHE[key] + return b1000 * (T / 1000.0) ** s * 100.0, prov + a, b = key + if a == b: + hit = _zk23_lookup(key) + if hit is not None: + b1000, cls, _src = hit + prov = f'ZK23 T2 [{cls}]' + _PAIR_CACHE[key] = (b1000, ZK23_EXPONENT, prov) + return b1000 * (T / 1000.0) ** ZK23_EXPONENT * 100.0, prov + elif a in ALL_MASS and b in ALL_MASS: + try: + r = build_rows([a, b])[0] + _PAIR_CACHE[key] = (r.b1000, r.exponent, r.provenance) + return r.b(T) * 100.0, r.provenance + except (ValueError, KeyError): + pass + fit = MOLECULAR_BACKGROUND.get(key) or MOLECULAR_BACKGROUND.get(key[::-1]) + if fit is not None: + a_fit, s_fit = fit + b1000 = a_fit * 1000.0**s_fit + prov = 'molecular-background table' + _PAIR_CACHE[key] = (b1000, s_fit, prov) + return b1000 * (T / 1000.0) ** s_fit * 100.0, prov + + def _proxy(sp): + if sp in ALL_MASS: + return sp + m = species_mass_amu(sp) + return min(ALL_MASS, key=lambda s2: abs(ALL_MASS[s2] - m)) + + pa, pb = _proxy(a), _proxy(b) + if pa == pb: + pb = 'O' if pa != 'O' else 'N' + r = build_rows([pa, pb])[0] + prov = f'proxy {a}->{pa}, {b}->{pb} [{r.provenance}]' + _PAIR_CACHE[key] = (r.b1000, r.exponent, prov) + return r.b(T) * 100.0, prov + + +def b_mixture(sp: str, comp: dict[str, float], T: float) -> tuple[float, dict]: + """Blanc's-law mixture diffusion parameter for one species, SI [m^-1 s^-1]. + + ``b_mix = (1 - X_sp) / sum_j (X_j / b_sp,j)`` over the other species of + the mixture ``comp`` (mole fractions). Returns ``(b_mix, provenance + dict per pair)``; a species alone in its mixture has nothing to diffuse + against and returns infinity. + """ + x_sp = comp.get(sp, 0.0) + s = 0.0 + prov: dict[str, str] = {} + for oj, xj in comp.items(): + if oj == sp or xj <= 0.0: + continue + b, p = b_pair(sp, oj, T) + s += xj / b + prov[f'{sp}-{oj}'] = p + if s == 0.0: + return math.inf, prov + return (1.0 - x_sp) / s, prov diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py new file mode 100644 index 00000000..5f6668fe --- /dev/null +++ b/tests/test_diffusion.py @@ -0,0 +1,250 @@ +"""Tests for ``src/zephyrus/diffusion.py``. + +Exercises the binary-diffusion library: its printed sources, the unit +reading of the Sasaki & Nakazawa (1988) table, the Zahnle & Kasting (2023) +Eq. (10) scaling rule, the pair ladder, and Blanc's law. The physical +invariants under test: + +- Reference pins: the Sasaki & Nakazawa unit reading reproduces the + independent Zahnle & Kasting (1986) Table I entries to 3 percent; the two + compilations agree on their shared measured rows; the scaling rule + reproduces printed and out-of-sample entries within its stated class. +- Closed form / conservation: Blanc's law reduces to the single pair for a + two-component mixture; the b matrix is symmetric with an infinite + diagonal. +- Provenance: every assembled row carries a class the error model knows, + and proxy substitutions are recorded, never silent. +- Error contract: an incomplete matrix and an untabulated mass raise. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import numpy as np +import pytest + +from zephyrus.diffusion import ( + ALL_MASS, + D_STANDARD_EXTRA, + D_ZK23, + SIGMA_CLASS, + SN88_TABLE1, + ZK23_TABLE2, + Row, + b_from_sn88, + b_mixture, + b_pair, + b_zk86, + bmatrix, + build_rows, + diameters, + eq10, + masses_g, +) + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +def test_vdw_diameter_rule_reproduces_printed_entries(): + """The van der Waals scaling rule recovers printed kinetic diameters. + + Applied to He, Ne, and Ar, whose diameters Zahnle & Kasting (2023) + print, the rule reproduces them to 3 percent; applied to Kr and Xe it + lands within 1.5 percent of the standard compilation values carried + separately. This calibrates the rule before it is trusted for C, N, S, + and the rock formers, which have no printed diameter anywhere. + """ + d = diameters() + for sp, printed in (('He', 260.0), ('Ne', 275.0), ('Ar', 340.0)): + est = D_ZK23['O'] * _bondi(sp) / _bondi('O') + assert abs(est / printed - 1.0) < 0.03, sp + for sp, ref in D_STANDARD_EXTRA.items(): + est = D_ZK23['O'] * _bondi(sp) / _bondi('O') + assert abs(est / ref - 1.0) < 0.02, sp + # The scaled diameters preserve the C > N > O size ordering. + assert d['C'] > d['N'] > d['O'] + + +def _bondi(sp): + from zephyrus.composition import BONDI_VDW_RADIUS_A + + return BONDI_VDW_RADIUS_A[sp] + + +@pytest.mark.reference_pinned +def test_sn88_unit_reading_matches_zk86_table(): + """The Sasaki & Nakazawa unit conversion reproduces an independent table. + + Their Table 1 prints no units; reading ``f`` in SI and converting with + ``b = f / (kB T)`` reproduces the five in-H2 entries of Zahnle & Kasting + (1986) Table I (He, Ne, Ar, Kr, Xe) to 3 percent, two compilations 35 + years apart both citing Marrero & Mason (1972). No other unit choice + comes within two orders of magnitude, so the agreement itself is the + discrimination guard; the cgs-misreading value is checked explicitly. + """ + for sp in ('He', 'Ne', 'Ar', 'Kr', 'Xe'): + b_sn = b_from_sn88(SN88_TABLE1[(sp, 'H2')][1000], 1000) + b_86 = b_zk86(sp, 'H2', 1000.0) + assert abs(b_86 / b_sn - 1.0) < 0.03, sp + # Unit-slip guard: a wrong unit reading misses by decades. + assert b_sn == pytest.approx(b_86, rel=0.05) + assert not math.isclose(b_sn * 100.0, b_86, rel_tol=0.5) + + +@pytest.mark.reference_pinned +def test_zk23_zk86_cross_compilation_agreement(): + """The 2023 and 1986 compilations agree where both print a pair. + + Neither table is derived from the other for these rows. The measured + (Marrero & Mason) rows agree to 4 percent; the 2023 estimated rows sit + within 35 percent, the width of their own estimated class. The + class-dependent tolerance is the point: a transcription error in either + table breaks the tight measured-row agreement. + """ + shared = [ + (('H', 'He'), ('He', 'H')), + (('H', 'O'), ('O', 'H')), + (('H', 'Ne'), ('Ne', 'H')), + (('H', 'Ar'), ('Ar', 'H')), + (('O', 'He'), ('He', 'O')), + (('O', 'Ne'), ('Ne', 'O')), + (('O', 'Ar'), ('Ar', 'O')), + ] + for zk23_key, zk86_key in shared: + b23, cls, _src = ZK23_TABLE2[zk23_key] + b86 = b_zk86(*zk86_key, 1000.0) + tol = 0.04 if cls == 'M' else 0.35 + assert abs(b86 / b23 - 1.0) < tol, (zk23_key, cls) + + +@pytest.mark.physics_invariant +def test_eq10_scaling_validates_in_and_out_of_sample(): + """The scaling rule reproduces printed and independent scaled entries. + + In sample: the three atomic rows the 2023 authors themselves obtained + by scaling (H-O, H-Ne, O-Ne) are re-predicted from the measured anchors + to better than 15 percent. Out of sample: the Kr and Xe in-H and in-O + rows of the 1986 table, which are not sources of this library, are + reproduced to within 0.3 in natural log, inside the 30 percent scaled + class. The mass-scaling limb of Eq. (10) is checked exactly: equal + diameters reduce it to the reduced-mass square root. + """ + for pair, ref_key in ((('Kr', 'H'), ('Kr', 'H')), (('Xe', 'O'), ('Xe', 'O'))): + row = build_rows(list(pair))[0] + ref = b_zk86(*ref_key, 1000.0) + assert abs(math.log(row.b1000 / ref)) < 0.3, pair + assert row.uncertainty == 'scaled' + # In-sample: H-Ne repredicted from measured anchors only. + row_hne = _reprediction(('H', 'Ne')) + assert abs(row_hne / ZK23_TABLE2[('H', 'Ne')][0] - 1.0) < 0.15 + # Exact mass limb: with equal diameters, b scales as sqrt of the summed + # inverse masses. + mass = {'A1': 1.0, 'A2': 4.0, 'B1': 1.0, 'B2': 16.0} + diam = {k: 300.0 for k in mass} + scaled = eq10(1.0, ('B1', 'B2'), ('A1', 'A2'), mass, diam) + assert scaled == pytest.approx(math.sqrt((1 + 1 / 16) / (1 + 1 / 4)), rel=1e-12) + + +def _reprediction(target): + """Geometric-mean Eq. (10) prediction of a printed pair from the others.""" + from zephyrus.diffusion import _anchors_for + + scaled, _mode = _anchors_for(target, ALL_MASS, diameters()) + vals = [v for p, v in scaled if tuple(sorted(p)) != tuple(sorted(target))] + return float(np.exp(np.mean(np.log(vals)))) + + +def test_build_rows_source_order_and_classes(): + """Row assembly prefers printed rows, then noble-gas fits, then scaling. + + H-He is a printed measured row; Kr-H2 has no 2023 entry and comes from + the Sasaki & Nakazawa fit (measured class); C-O has no printed source + anywhere and is scaled on an estimated carbon diameter (class + ``scaled*``). Every class must be known to the error model, and a rock + former lands in the widest class. + """ + r_hhe = build_rows(['H', 'He'])[0] + assert r_hhe.uncertainty == 'measured' + assert r_hhe.b1000 == pytest.approx(1.6e20, rel=1e-12) + r_krh2 = build_rows(['Kr', 'H2'])[0] + assert r_krh2.provenance.startswith('SN88') + assert r_krh2.uncertainty == 'measured' + r_co = build_rows(['C', 'O'])[0] + assert r_co.uncertainty == 'scaled*' + r_si = build_rows(['H', 'Si'])[0] + assert r_si.uncertainty == 'scaled*' + for r in (r_hhe, r_krh2, r_co, r_si): + assert r.uncertainty in SIGMA_CLASS + # The temperature law is the fitted power law. + assert r_hhe.b(2000.0) / r_hhe.b(1000.0) == pytest.approx(2.0**0.75, rel=1e-12) + + +def test_bmatrix_symmetry_and_error_contract(): + """The b matrix is symmetric with an infinite diagonal, or raises. + + The closure convention puts np.inf on the diagonal (no self-diffusion). + Passing an empty row list for a multi-species set must raise the + incompleteness error rather than return a matrix with silent gaps; an + untabulated species mass raises ``KeyError``. + """ + species = ['H', 'He', 'O'] + b = bmatrix(species, 8000.0) + assert np.array_equal(b, b.T) + assert np.all(np.isinf(np.diag(b))) + off = ~np.eye(3, dtype=bool) + assert np.all(np.isfinite(b[off])) + assert np.all(b[off] > 0) + with pytest.raises(ValueError, match='incomplete'): + bmatrix(species, 8000.0, rows=[Row('H', 'He', 1e20, 0.75, 'x', 'measured', 'x')]) + with pytest.raises(KeyError, match='no mass'): + masses_g(['H', 'Zz']) + # Masses convert to grams: hydrogen is 1.008 amu. + assert masses_g(['H'])[0] == pytest.approx(1.008 * 1.66053907e-24, rel=1e-6) + + +def test_b_pair_ladder_and_proxy_provenance(): + """The pair ladder resolves each rung and records substitutions. + + A printed pair (H-CO2) resolves through the library and converts to SI + (a factor 100 on cm^-1 s^-1); a molecular pair outside the library + (CO-N2) resolves through the molecular-background table; an untabulated + molecule (SO2) substitutes the nearest-mass covered species with the + substitution named in the provenance. Cached lookups return identical + values. + """ + b_si, prov = b_pair('H', 'CO2', 1000.0) + assert b_si == pytest.approx(6.0e19 * 100.0, rel=1e-9) + assert prov.startswith('ZK23') + b_co, prov_co = b_pair('CO', 'N2', 1000.0) + assert prov_co == 'molecular-background table' + assert b_co == pytest.approx(9.28e16 * 1000.0**0.71 * 100.0, rel=1e-9) + b_so2, prov_so2 = b_pair('SO2', 'N2', 1000.0) + assert prov_so2.startswith('proxy') + assert 'SO2->' in prov_so2 + assert b_so2 > 0.0 + # Cache round trip: the second call reproduces the first exactly. + b_si2, prov2 = b_pair('CO2', 'H', 1000.0) + assert b_si2 == pytest.approx(b_si, rel=1e-12) + assert prov2 == prov + + +@pytest.mark.physics_invariant +def test_b_mixture_blancs_law_limits(): + """Blanc's law reduces correctly in its limits. + + For a trace species in a single background the mixture value equals the + pair value; a species alone in its mixture has nothing to diffuse + against and returns infinity; adding a second background with a smaller + b must pull the mixture value down (harmonic-mean monotonicity). + """ + b_pair_val, _ = b_pair('H', 'O2', 1000.0) + b_mix, prov = b_mixture('H', {'H': 0.01, 'O2': 0.99}, 1000.0) + assert b_mix == pytest.approx(b_pair_val, rel=1e-12) + assert 'H-O2' in prov + alone, _ = b_mixture('H', {'H': 1.0}, 1000.0) + assert math.isinf(alone) + b_slow, _ = b_pair('H', 'CO2', 1000.0) + b_fast, _ = b_pair('H', 'He', 1000.0) + mixed, _ = b_mixture('H', {'H': 0.01, 'He': 0.495, 'CO2': 0.495}, 1000.0) + assert min(b_slow, b_fast) < mixed < max(b_slow, b_fast) diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index f10fe09c..71d29312 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -10,9 +10,9 @@ path over the analytic sonic-point scale height; the mixture cross section is exactly density weighted. - Monotonicity / boundedness: cross sections shrink with temperature; the - geometric hard-sphere rung sits below the collision-integral rung at high - temperature (its documented bias); the hysteresis window widens or - tightens the switch threshold on the correct side. + temperature-independent geometric rung overshoots the collision-integral + rung at high temperature (its documented bias); the hysteresis window + widens or tightens the switch threshold on the correct side. - Error contract: the hydrogen route rejects non-hydrogen species. See ``docs/How-to/run_tests.md`` for the tier and marker conventions. From 01092cd063e4c903e9d6bb1d69e3655e77117c03 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:16:17 +0200 Subject: [PATCH 007/113] Add bolometrically driven boil-off escape with Bondi and luminosity caps --- pyproject.toml | 3 +- src/zephyrus/boiloff.py | 200 ++++++++++++++++++++++++++++++++++++++++ tests/test_boiloff.py | 190 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 src/zephyrus/boiloff.py create mode 100644 tests/test_boiloff.py diff --git a/pyproject.toml b/pyproject.toml index 38773f04..96372c2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,8 @@ requires-python = '>=3.10' dependencies = [ 'fwl-mors>=24.11.18', 'matplotlib', - 'numpy' + 'numpy', + 'scipy' ] [project.urls] diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py new file mode 100644 index 00000000..3a4757c2 --- /dev/null +++ b/src/zephyrus/boiloff.py @@ -0,0 +1,200 @@ +""" +!!! info "`boiloff.py`" + Bolometrically driven escape: boil-off and its capped residual.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +from scipy.special import lambertw + +from zephyrus.constants import G, kb + +# Provenance of the branch, all closed form: +# +# - Rate: Owen & Wu (2016, ApJ 817, 107) isothermal transonic Parker wind +# with the photospheric Mach number in exact Lambert-W form, +# Mdot = 4 pi G M_p Mach / (kappa c_s), Mach = sqrt(-W0(-f(x))), +# f(x) = x^-4 exp(3 - 4/x), x = R_launch/R_B, R_B = G M_p / (2 c_s^2). +# The exact form is used rather than their large-1/x asymptote, whose +# order-unity prefactor is absorbed. The 1/kappa dependence enters +# through the photospheric opacity input. +# - Wind temperature: T_eq / 2^(1/4), the explicit recommendation of +# Misener et al. (2025, ApJ 980, 152) for the isothermal formulas. +# - Activation: the restricted Jeans parameter +# Lambda = G M_p mu / (kB T_eq R_p) (Fossati et al. 2017, A&A 598, A90), +# built with the composition mean molecular mass. For isothermal gas +# Lambda = 2 R_B / R_p identically, so the Owen & Wu shutoff at +# R_p/R_B = 0.1 is Lambda = 20 for every composition; the transfer of +# that hydrogen-calibrated shutoff to other envelopes is an assumption +# the activation band (15 to 35 across the literature) makes visible. +# - Bondi cap: Gupta & Schlichting (2020, MNRAS 493, 792, their Eq. 10), +# Mdot_B = 4 pi R_B^2 c_s rho_launch exp(-G M_p / (c_s^2 R_launch)), +# sonic-point area with the launch-level density; the launch level is +# identified with the radiative-convective boundary, a documented +# approximation on a static profile. +# - Luminosity cap, applied only past the activation gate: +# Mdot_E = L / (g R_p) with L = 4 pi R_p^2 F_int (Gupta & Schlichting +# 2019, MNRAS 487, 24, their Eq. 9). Capping the residual bolometric +# channel by the interior luminosity sidesteps the open dispute over how +# long core-powered mass loss survives after boil-off (Tang et al. 2024, +# ApJ 976, 221, argue it is brief; Gupta & Schlichting argue it lasts). +# - Termination diagnostic: the Tang et al. (2024) Eq. (8) timescale +# comparison, run as a diagnostic beside the rate's own exponential +# shutoff, never as a gate. + +LAMBDA_BAND = (15.0, 35.0) # literature spread of the activation threshold + + +def lambda_restricted(M_p: float, R_p: float, T_eq: float, mu_kg: float) -> float: + """Restricted Jeans parameter Lambda = G M_p mu / (kB T_eq R_p). + + Dimensionless; built with the composition mean molecular mass ``mu_kg`` + [kg] at the launch level (Fossati et al. 2017). For isothermal gas this + equals ``2 R_B / R_p`` with the Bondi radius at ``T_eq``. + """ + return G * M_p * mu_kg / (kb * T_eq * R_p) + + +def parker_mach(x: float) -> float: + """Photospheric Mach number of the transonic isothermal Parker wind. + + Exact Lambert-W form of Owen & Wu (2016): ``Mach = sqrt(-W0(-f))`` with + ``f = x^-4 exp(3 - 4/x)`` and ``x = R_launch / R_B <= 1``. At ``x = 1`` + the launch level sits at the sonic (Bondi) radius and the Mach number + is 1; for small ``x`` it shuts off exponentially. + + Raises + ------ + ValueError + If ``x`` is outside ``(0, 1]``; the caller clamps inflated + configurations to 1 with a flag before calling. + """ + if not 0.0 < x <= 1.0: + raise ValueError('parker_mach needs 0 < x <= 1') + f = x**-4 * math.exp(3.0 - 4.0 / x) + # f -> 1/e as x -> 1 (sonic point at the Bondi radius, Mach 1); clamp at + # the W0 branch point against floating-point overshoot. + if f >= math.exp(-1.0) * (1.0 - 1e-12): + return 1.0 + w = lambertw(-f, 0) + return math.sqrt(max(-w.real, 0.0)) + + +def bolometric_candidate( + M_p: float, + R_p: float, + T_eq: float, + kappa_photo: float, + launch: dict, + F_int: float, + lambda_gate: float, + lambda_crit: float, +) -> tuple[float, dict]: + """The bolometrically driven candidate mass-loss rate, in kg/s. + + Computed at every call: while ``lambda_gate < lambda_crit`` the + atmosphere is inflated enough to boil off and the candidate is + ``min(Parker rate, Bondi cap)``; past the gate the same machinery stays + alive as a residual, additionally capped by the interior luminosity + (see the module provenance notes). + + Parameters + ---------- + M_p, R_p : float + Planet mass [kg] and radius [m]. + T_eq : float + Equilibrium temperature [K]; the wind runs at ``T_eq / 2^(1/4)``. + kappa_photo : float + Photospheric opacity [m^2 kg^-1]; the Parker rate scales as its + inverse. + launch : dict + The photospheric working level (from + :func:`zephyrus.profiles.photospheric_level`): uses ``r``, ``mmw`` + (molecular, not atomized), and ``rho``. + F_int : float + Interior heat flux [W m^-2], for the luminosity cap. + lambda_gate : float + The restricted Jeans parameter of the configuration. + lambda_crit : float + The activation threshold (20 by default upstream; band 15 to 35). + + Returns + ------- + (rate, detail) + The candidate rate [kg/s] and a detail dict carrying the wind + temperature, sound speed, Bondi radius, Mach number, each cap, the + activation state, and flags (``bondi_inflated`` when the launch + level sits above the Bondi radius). + """ + T_w = T_eq / 2.0**0.25 + mu = launch['mmw'] + c_s = math.sqrt(kb * T_w / mu) + R_B = G * M_p / (2.0 * c_s**2) + R_launch = launch['r'] + x = R_launch / R_B + flags = {} + if x > 1.0: + flags['bondi_inflated'] = True # photosphere above the sonic radius + x = 1.0 + mach = parker_mach(x) + mdot_parker = 4.0 * math.pi * G * M_p * mach / (kappa_photo * c_s) + + rho_launch = launch['rho'] + mdot_bondi = ( + 4.0 * math.pi * R_B**2 * c_s * rho_launch * math.exp(-G * M_p / (c_s**2 * R_launch)) + ) + + active = lambda_gate < lambda_crit + caps = [mdot_parker, mdot_bondi] + mdot_lum = None + if not active: + L = 4.0 * math.pi * R_p**2 * F_int + g = G * M_p / R_p**2 + mdot_lum = L / (g * R_p) + caps.append(mdot_lum) + rate = min(caps) + return rate, dict( + T_wind=T_w, + c_s=c_s, + R_B=R_B, + x=min(R_launch / R_B, 1.0), + mach=mach, + mdot_parker=mdot_parker, + mdot_bondi=mdot_bondi, + mdot_luminosity=mdot_lum, + active=active, + R_sonic=R_B, + flags=flags, + ) + + +def tang_timescale_check( + M_p: float, R_p: float, F_int: float, mdot: float, reservoirs: dict | None +) -> dict: + """Boil-off termination diagnostic after Tang et al. (2024, Eq. 8). + + Boil-off has ended once the mass-loss timescale ``t_Mdot = M_env/Mdot`` + reaches the cooling timescale ``t_cool = G M_p M_env / (R_p L)`` with + ``L = 4 pi R_p^2 F_int`` (their Eq. 9 with the envelope concentration + factor at 1 and the radiative-convective boundary at ``R_p``, both + stated approximations). Returns ``{'evaluated': False}`` when no + reservoir masses are supplied; otherwise the two timescales and the + verdict. Diagnostic only: it never gates the rate. + """ + if not reservoirs: + return {'evaluated': False} + M_env = sum(reservoirs.values()) + if M_env <= 0.0 or mdot <= 0.0: + return {'evaluated': False} + L = 4.0 * math.pi * R_p**2 * F_int + t_mdot = M_env / mdot + t_cool = G * M_p * M_env / (R_p * L) + return { + 'evaluated': True, + 't_mdot_s': t_mdot, + 't_cool_s': t_cool, + 'terminated': t_mdot >= t_cool, + } diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py new file mode 100644 index 00000000..85b30911 --- /dev/null +++ b/tests/test_boiloff.py @@ -0,0 +1,190 @@ +"""Tests for ``src/zephyrus/boiloff.py``. + +Exercises the bolometrically driven escape branch. The physical invariants +under test: + +- Reference pins: the Lambert-W Mach number is exactly 1 when the launch + level sits at the Bondi radius (the analytical sonic-point limit of Owen + & Wu 2016), and collapses by more than six decades by ``x = 0.1``, their + published shutoff; the restricted Jeans parameter obeys the identity + ``Lambda = 2 R_B / R_p`` for every composition. +- Monotonicity / boundedness: the Mach number falls monotonically as the + launch level retreats inside the Bondi radius; the candidate rate never + exceeds any of its caps. +- Error contract: ``parker_mach`` rejects arguments outside ``(0, 1]``; the + timescale diagnostic reports "not evaluated" without reservoirs. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.boiloff import ( + LAMBDA_BAND, + bolometric_candidate, + lambda_restricted, + parker_mach, + tang_timescale_check, +) +from zephyrus.constants import G, amu, kb +from zephyrus.planets_parameters import Me, Re +from zephyrus.profiles import interp_at_pressure, isothermal_profile + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +def _launch(M_p, R_p, T_eq, comp, p=2000.0): + """Photospheric-type launch level on an isothermal test atmosphere.""" + prof = isothermal_profile(M_p, R_p, T_eq, comp, 1e7, 1e-3) + return interp_at_pressure(prof, min(p, float(prof.p[0]))) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_parker_mach_sonic_limit_and_shutoff(): + """The Mach number is 1 at the Bondi radius and shuts off by x = 0.1. + + Analytical limit: ``f(1) = e^-1`` and ``W0(-1/e) = -1``, so the launch + level at the Bondi radius is exactly sonic. Published shutoff: Owen & + Wu (2016) place the end of boil-off at ``R_p / R_B = 0.1``, where the + exponential factor has collapsed the rate; the Mach ratio between + ``x = 1`` and ``x = 0.1`` must exceed six decades. Monotonicity: the + Mach number falls strictly as ``x`` decreases. + """ + assert parker_mach(1.0) == pytest.approx(1.0, abs=1e-6) + xs = [1.0, 0.5, 0.3, 0.2, 0.1] + ms = [parker_mach(x) for x in xs] + assert all(a > b for a, b in zip(ms, ms[1:])) + assert ms[-1] / ms[0] < 1e-6 + # Sign and scale: Mach numbers are subsonic below the Bondi radius. + assert all(0.0 < m <= 1.0 for m in ms) + + +def test_parker_mach_rejects_out_of_domain(): + """Arguments outside (0, 1] raise; the caller owns the inflated clamp. + + Zero, negative, and superunity launch ratios are not meaningful inputs + to the transonic solution and must raise rather than return a complex + or extrapolated Mach number. A valid argument on the same path returns + a finite subsonic value. + """ + for bad in (0.0, -0.5, 1.5): + with pytest.raises(ValueError, match='parker_mach'): + parker_mach(bad) + ok = parker_mach(0.4) + assert math.isfinite(ok) + assert 0.0 < ok < 1.0 + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_lambda_equals_two_bondi_radii_over_rp(): + """The restricted Jeans parameter obeys Lambda = 2 R_B / R_p exactly. + + For isothermal gas at the same temperature the identity holds for + every mean molecular mass, which is what makes the Owen & Wu (2016) + shutoff at ``R_p / R_B = 0.1`` equal to ``Lambda = 20`` for every + composition. Checked for H2-, steam-, and CO2-like mean masses; the + literature band around the threshold brackets 20. + """ + M_p, R_p, T_eq = 5 * Me, 2 * Re, 800.0 + for mu_amu in (2.3, 18.0, 44.0): + mu = mu_amu * amu + lam = lambda_restricted(M_p, R_p, T_eq, mu) + c2 = kb * T_eq / mu + R_B = G * M_p / (2.0 * c2) + assert lam == pytest.approx(2.0 * R_B / R_p, rel=1e-12) + assert LAMBDA_BAND[0] < 20.0 < LAMBDA_BAND[1] + # Monotone in mu: heavier gas is more tightly bound. + lam_light = lambda_restricted(M_p, R_p, T_eq, 2.3 * amu) + lam_heavy = lambda_restricted(M_p, R_p, T_eq, 44.0 * amu) + assert lam_heavy > lam_light + + +@pytest.mark.physics_invariant +def test_luminosity_cap_applies_only_past_the_gate(): + """The interior-luminosity cap joins the candidate only after boil-off. + + While the configuration is inflated (``lambda_gate`` below threshold) + the candidate is min(Parker, Bondi) and no luminosity cap is computed; + past the gate the cap joins and bounds the returned rate. The rate must + never exceed any active cap (boundedness). + """ + M_p, R_p, T_eq = 3 * Me, 3 * Re, 1000.0 + launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) + rate_a, det_a = bolometric_candidate( + M_p, R_p, T_eq, 0.01, launch, 1.0, lambda_gate=10.0, lambda_crit=20.0 + ) + assert det_a['active'] is True + assert det_a['mdot_luminosity'] is None + assert rate_a <= min(det_a['mdot_parker'], det_a['mdot_bondi']) * (1 + 1e-12) + rate_b, det_b = bolometric_candidate( + M_p, R_p, T_eq, 0.01, launch, 1.0, lambda_gate=30.0, lambda_crit=20.0 + ) + assert det_b['active'] is False + assert det_b['mdot_luminosity'] is not None + assert rate_b <= det_b['mdot_luminosity'] * (1 + 1e-12) + # The luminosity cap can only reduce the candidate, never raise it. + assert rate_b <= rate_a * (1 + 1e-12) + + +def test_wind_temperature_and_opacity_scaling(): + """The wind runs at T_eq / 2^(1/4) and the rate scales as 1 / kappa. + + The wind temperature is the Misener et al. (2025) recommendation for + the isothermal formulas; the Parker rate carries the photospheric + opacity inversely, so doubling kappa halves the uncapped Parker rate. + """ + M_p, R_p, T_eq = 4 * Me, 2.5 * Re, 1000.0 + launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) + _, det = bolometric_candidate(M_p, R_p, T_eq, 0.01, launch, 1.0, 5.0, 20.0) + assert det['T_wind'] == pytest.approx(1000.0 / 2**0.25, rel=1e-12) + _, det2 = bolometric_candidate(M_p, R_p, T_eq, 0.02, launch, 1.0, 5.0, 20.0) + assert det2['mdot_parker'] == pytest.approx(det['mdot_parker'] / 2.0, rel=1e-12) + # The Bondi cap does not depend on the opacity. + assert det2['mdot_bondi'] == pytest.approx(det['mdot_bondi'], rel=1e-12) + + +def test_inflated_launch_level_clamps_with_flag(): + """A launch level beyond the Bondi radius clamps to sonic, flagged. + + A very hot, loosely bound configuration puts the photosphere outside + the Bondi radius; the branch must clamp ``x`` to 1 (Mach 1) and raise + ``bondi_inflated`` rather than raise an exception, because such states + are physically posed inputs on the boil-off side of the gate. The + launch level is built by hand: a hydrostatic profile bound at every + level cannot reach past the Bondi radius, which is the very reason the + clamp exists for externally supplied levels. + """ + M_p, R_p, T_eq = 0.6 * Me, 1.8 * Re, 1800.0 + mu = 2.3 * amu + c2 = kb * (T_eq / 2**0.25) / mu + r_bondi = G * M_p / (2.0 * c2) + launch = {'r': 1.2 * r_bondi, 'mmw': mu, 'rho': 1e-6} # plausible photosphere + assert launch['r'] > r_bondi # genuinely beyond R_B + rate, det = bolometric_candidate(M_p, R_p, T_eq, 0.01, launch, 1.0, 3.0, 20.0) + assert det['flags'].get('bondi_inflated') is True + assert det['mach'] == pytest.approx(1.0, abs=1e-9) + assert math.isfinite(rate) + assert rate > 0.0 + + +def test_tang_timescale_diagnostic_contract(): + """The termination diagnostic evaluates only with reservoirs supplied. + + Without reservoir masses (or with a zero rate) it reports + ``evaluated: False``; with them it returns both timescales positive and + a boolean verdict, and a heavier envelope at a fixed rate cannot + terminate earlier (both timescales scale with the envelope mass, so the + verdict is envelope-mass invariant). + """ + assert tang_timescale_check(Me, Re, 1.0, 1e5, None) == {'evaluated': False} + assert tang_timescale_check(Me, Re, 1.0, 0.0, {'H': 1e18}) == {'evaluated': False} + out = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 1e18}) + assert out['evaluated'] is True + assert out['t_mdot_s'] > 0.0 + assert out['t_cool_s'] > 0.0 + out2 = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 2e18}) + assert out2['terminated'] == out['terminated'] From 493104c986f2abe5f3ce72bfbd0af4a3a86ded49 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:20:49 +0200 Subject: [PATCH 008/113] Add radiative cooling data and the wind temperature thermostat --- src/zephyrus/atomic_data.py | 227 ++++++++++++++++++++++++++++ src/zephyrus/thermostat.py | 285 ++++++++++++++++++++++++++++++++++++ tests/test_atomic_data.py | 157 ++++++++++++++++++++ tests/test_thermostat.py | 224 ++++++++++++++++++++++++++++ 4 files changed, 893 insertions(+) create mode 100644 src/zephyrus/atomic_data.py create mode 100644 src/zephyrus/thermostat.py create mode 100644 tests/test_atomic_data.py create mode 100644 tests/test_thermostat.py diff --git a/src/zephyrus/atomic_data.py b/src/zephyrus/atomic_data.py new file mode 100644 index 00000000..0299da51 --- /dev/null +++ b/src/zephyrus/atomic_data.py @@ -0,0 +1,227 @@ +""" +!!! info "`atomic_data.py`" + Atomic and molecular cooling data and closed-form rate coefficients.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +from zephyrus.constants import c as C_LIGHT +from zephyrus.constants import h_planck + +# hc in J cm: converts a wavenumber in cm^-1 to an energy in J. +HC_CM = h_planck * C_LIGHT * 100.0 + +# --------------------------------------------------------------------------- +# Three-level systems for atomic line cooling: levels 1 to 3 of each species +# from Nakayama, Ikoma & Terada (2022, ApJ 937, 72), Appendix C Tables 2 to +# 5. levels: (term, statistical weight g, excitation energy [cm^-1]); +# transitions keyed (lower, upper) with 1-based indices: +# (Einstein A [s^-1], effective collision strength at 1e4 K). +# Two transcription notes against the printed tables: the O+ row prints the +# neutral-O configuration and term labels next to statistical weights 4, 10, +# and 6, which belong to the O+ ground system, so the level set is entered +# as 4S-2D-2P with the printed weights; and the printed N 2->9 collision +# strength is malformed in the original, but level 9 lies outside the +# three-level subset carried here. +# --------------------------------------------------------------------------- +THREE_LEVEL = { + 'H': { + 'levels': [('1s2S', 2, 0.0), ('2s2S', 2, 82258.96), ('2p2P', 6, 82259.17)], + 'transitions': { + (1, 2): (2.50e-6, 2.42e-1), + (1, 3): (6.26e8, 5.00e-1), + (2, 3): (0.0, 0.0), + }, + }, + 'C': { + 'levels': [('3P', 9, 29.59122), ('1D', 5, 10192.67), ('1S', 1, 21648.04)], + 'transitions': { + (1, 2): (2.43e-4, 1.21), + (1, 3): (2.13e-3, 7.39e-2), + (2, 3): (6.38e-1, 3.90e-1), + }, + }, + 'C+': { + 'levels': [('2P', 6, 42.26666), ('4P', 12, 43035.75), ('2D', 10, 74931.60)], + 'transitions': {(1, 2): (4.57e1, 6.57), (1, 3): (2.90e7, 2.92), (2, 3): (0.0, 1.94)}, + }, + 'N': { + 'levels': [('4S', 4, 0.0), ('2D', 10, 19227.95), ('2P', 6, 28838.51)], + 'transitions': { + (1, 2): (1.30e-5, 5.61e-1), + (1, 3): (5.22e-3, 1.64e-1), + (2, 3): (8.47e-2, 4.37e-1), + }, + }, + 'N+': { + 'levels': [('3P', 9, 85.22956), ('1D', 5, 16455.11), ('1S', 1, 33218.58)], + 'transitions': { + (1, 2): (3.90e-3, 1.38), + (1, 3): (3.20e-2, 8.00e-1), + (2, 3): (1.14e0, 5.12), + }, + }, + 'O': { + 'levels': [('3P', 9, 76.83111), ('1D', 5, 15868.34), ('1S', 1, 33792.22)], + 'transitions': { + (1, 2): (8.57e-3, 2.93e-1), + (1, 3): (7.87e-2, 3.23e-2), + (2, 3): (1.26e0, 8.83e-3), + }, + }, + 'O+': { + 'levels': [('4S', 4, 0.0), ('2D', 10, 27826.09), ('2P', 6, 42125.60)], + 'transitions': { + (1, 2): (7.68e-5, 1.33), + (1, 3): (4.51e-2, 4.06e-1), + (2, 3): (9.68e-2, 1.70), + }, + }, +} + +# --------------------------------------------------------------------------- +# Radiative recombination: the Badnell (2006, ApJS 167, 334) fit, +# alpha_RR = A / [ sqrt(T/T0) (1 + sqrt(T/T0))^(1-B') (1 + sqrt(T/T1))^(1+B') ], +# B' = B + C exp(-T2/T), +# implemented from the original Eqs. (1)-(2). The nitrogen coefficients +# below are the ones quoted by Chatterjee & Pierrehumbert (2026, +# arXiv:2412.05188, their Eq. 35); note that their printed equation garbles +# the Badnell form (it renders the product as a sum, repeats one exponent on +# both factors, and inverts the exponential to exp(-T/T2)), so the original +# is implemented and the printed variant disagrees by more than a factor 2 +# at 1e4 K (asserted in the companion tests so the discrepancy stays +# visible). +# --------------------------------------------------------------------------- +# (T0, T1, T2 [K], A [cm^3/s], B, C) for nitrogen. +BADNELL_N = (9.467e-2, 2.954e6, 6.379e4, 6.387e-10, 0.7308, 0.2440) + + +def badnell_alpha_rr(T: float, coeffs: tuple = BADNELL_N) -> float: + """Radiative recombination coefficient, cm^3 s^-1 (Badnell 2006, Eqs. 1-2).""" + T0, T1, T2, A, B, C = coeffs + bp = B + C * math.exp(-T2 / T) + s0 = math.sqrt(T / T0) + s1 = math.sqrt(T / T1) + return A / (s0 * (1.0 + s0) ** (1.0 - bp) * (1.0 + s1) ** (1.0 + bp)) + + +# Case B recombination coefficients at 1e4 K, cm^3 s^-1: hydrogen from +# Murray-Clay et al. (2009, ApJ 693, 23, their Eq. 7); the heavies as case A +# totals minus the ground-state partial from the AMDPP radiative +# recombination archive, as compiled for the radiation-recombination module +# of Malina Ovesen. +CASE_B_1E4K = { + 'H': 2.7e-13, + 'He': 4.37e-13 - 1.56e-13, + 'C': 4.72e-13 - 2.32e-13, + 'N': 3.76e-13 - 1.15e-13, + 'O': 2.72e-13 - 1.31e-13, +} + + +def alpha_case_b(element: str, T: float) -> float: + """Case B recombination coefficient, cm^3 s^-1, with temperature scaling. + + Applies the Murray-Clay et al. (2009) hydrogen temperature dependence + ``(T / 1e4 K)^-0.9`` to every element: the heavies' archival values + exist only at 1e4 K, so extending hydrogen's exponent to them is a + documented approximation that matters once the thermostat moves the + wind temperature away from 1e4 K. Elements without a tabulated value + take the atomic-O coefficient (the nearest heavy; callers record the + coefficient provenance upstream). + """ + a0 = CASE_B_1E4K.get(element) + if a0 is None: + a0 = CASE_B_1E4K['O'] + return a0 * (T / 1.0e4) ** -0.9 + + +# --------------------------------------------------------------------------- +# CO2 15 micron band cooling: Johnstone et al. (2018, A&A 617, A107), +# Eqs. (34)-(38) with their Table 1 collider coefficients, cgs. The +# deexcitation rates k_d = A T^B are measured only over roughly 150 to +# 500 K, and the band's real applicability ceiling is CO2 dissociation, so +# it acts as a base-region coolant; both limitations travel with any use. +# --------------------------------------------------------------------------- +HNU_15UM = 1.325e-13 # erg, the 15 micron quantum +A10_CO2 = 0.46 # s^-1, Einstein coefficient of the bending mode +SIGMA_CO2_15UM = 6.43e-15 # cm^2, band column parameter for the escape probability +CO2_KD = { + 'O': (5.10e-11, -0.59), + 'O2': (4.97e-22, 2.83), + 'N2': (6.43e-21, 2.30), + 'CO2': (4.21e-17, 0.85), + 'He': (4.73e-19, 2.19), + 'Ar': (8.13e-24, 3.19), +} + + +def co2_band_cooling(n_co2: float, colliders: dict, T: float, col_co2: float = 0.0) -> float: + """CO2 15 micron band volumetric cooling, erg s^-1 cm^-3. + + Johnstone et al. (2018) Eqs. (34)-(38) with no stellar infrared pumping + (their S_IR term is zero in the escaping-region application). + ``n_co2`` [cm^-3]; ``colliders`` maps species to number densities + [cm^-3]; ``col_co2`` is the overlying CO2 column [cm^-2] for the escape + probability, whose zero-column limit is the non-LTE ceiling 0.5. + Excitation rates follow from detailed balance, + ``k_e = 2 k_d exp(-667 K / T)``. + """ + sn = SIGMA_CO2_15UM * col_co2 + if sn > 2.0: + eps = 0.7202 * sn**-0.613 + elif sn > 0.0: + eps = 0.4732 * sn**-0.0069 + else: + eps = 0.5 + ke_sum = kd_sum = 0.0 + for sp, n in colliders.items(): + if sp not in CO2_KD or n <= 0.0: + continue + a, b = CO2_KD[sp] + kd = a * T**b + ke = 2.0 * kd * math.exp(-667.0 / T) + kd_sum += kd * n + ke_sum += ke * n + if ke_sum == 0.0: + return 0.0 + n_star = ke_sum * n_co2 / (ke_sum + kd_sum + A10_CO2 * eps) + return HNU_15UM * A10_CO2 * eps * n_star + + +def o_finestructure_cooling(n_o: float, T: float) -> float: + """Atomic O fine-structure cooling at 63 and 147 micron, erg s^-1 cm^-3. + + The closed LTE form of Johnstone et al. (2018) Eqs. (41)-(43), tracing + to Bates (1951); ``n_o`` is the atomic oxygen density [cm^-3]. + """ + den = 1.0 + 0.6 * math.exp(-228.0 / T) + 0.2 * math.exp(-326.0 / T) + q63 = 1.67e-18 * math.exp(-228.0 / T) * n_o / den + q147 = 4.59e-20 * math.exp(-326.0 / T) * n_o / den + return q63 + q147 + + +# --------------------------------------------------------------------------- +# Monochromatic photoionization front constants. Hydrogen front: +# Murray-Clay et al. (2009), sigma_nu0 = 6e-18 (h nu0 / 13.6 eV)^-3 cm^2 at +# a representative photon energy of 20 eV. Nitrogen-like front for +# hydrogen-poor winds: mean photon energy 33.6 eV and cross section +# 1e-17 cm^2 (Chatterjee & Pierrehumbert 2026), with the N I ionization +# potential from NIST. +# --------------------------------------------------------------------------- +EV_ERG = 1.602176634e-12 +HNU0_H_EV = 20.0 +E_ION_H_EV = 13.6 +SIGMA_NU0_H = 6.0e-18 * (HNU0_H_EV / 13.6) ** -3 # cm^2 +HNU_I_N_EV = 33.6 +E_ION_N_EV = 14.53 +SIGMA_NU_N = 1.0e-17 # cm^2 + +# Black (1981) Lyman-alpha cooling constants as printed by Murray-Clay et +# al. (2009, their Eq. 6): Lambda = 7.5e-19 n_e n_H exp(-118348 K / T) +# erg cm^3 s^-1. A cross-check constant, not a separate channel: the H +# three-level system above carries Lyman-alpha itself. +LYA_BLACK = (7.5e-19, 118348.0) diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py new file mode 100644 index 00000000..6362b895 --- /dev/null +++ b/src/zephyrus/thermostat.py @@ -0,0 +1,285 @@ +""" +!!! info "`thermostat.py`" + Wind-temperature thermostat: local heating against radiative cooling.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +import numpy as np + +from zephyrus.atomic_data import ( + E_ION_H_EV, + E_ION_N_EV, + EV_ERG, + HC_CM, + HNU0_H_EV, + HNU_I_N_EV, + SIGMA_NU0_H, + SIGMA_NU_N, + THREE_LEVEL, + alpha_case_b, + badnell_alpha_rr, + co2_band_cooling, + o_finestructure_cooling, +) +from zephyrus.constants import kb_cgs + +# The thermostat sets the hydrodynamic wind temperature by a local balance +# of photoionization heating against radiative cooling, evaluated at the +# wind-base level (all rates cgs internally): +# +# - Atomic lines: three-level statistical equilibrium for H, C, C+, N, N+, +# O, and O+ under electron impact with cool-to-space losses, the +# machinery of Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, +# their Eqs. 26-30) on the Nakayama et al. (2022) level data; the H +# system carries Lyman-alpha. +# - The CO2 15 micron band and the atomic O fine structure (Johnstone et +# al. 2018; see atomic_data for their stated validity limits). +# - Recombination cooling: the continuum part only, Q_RR = n_e n_+ +# alpha_RR(T) (3/2) kB T (Chatterjee & Pierrehumbert 2026, Section 5.2); +# the exact free-bound emission integral of Tucker & Gould (1966) is not +# implemented and this form is the stated stand-in. +# - Heating: monochromatic-front photoionization, Q = n_0 sigma +# (F_XUV / h nu) (h nu - E_ion), with the small thermal correction of +# order kB T_e against the excess energy dropped. The local ionization +# fraction comes from photoionization-recombination balance. +# +# The blind spot of a local balance is the temperature structure through +# the sonic region, which no single-level evaluation captures; rates +# computed with this wind temperature inherit that limitation. + +T_BRACKET_HIGH = 5.0e4 # K; the lower bracket edge is the equilibrium temperature + +_ION_OF = {'C': 'C+', 'N': 'N+', 'O': 'O+'} + + +def three_level_populations(species: str, n_tot: float, n_e: float, T: float): + """Steady-state level populations (n1, n2, n3) of a three-level system. + + Electron-impact excitation and de-excitation plus radiative decay, with + no radiative excitation (every emitted photon escapes: cool-to-space). + Rate coefficients follow the effective-collision-strength form + ``k_lu = gamma (8.629e-6 / (g_l sqrt(T))) exp(-E_lu / kB T)`` with + de-excitation by detailed balance (Nakayama et al. 2022, Eqs. 13-14). + Densities in cm^-3. + """ + data = THREE_LEVEL[species] + (_t1, g1, e1), (_t2, g2, e2), (_t3, g3, e3) = data['levels'] + energy = { + (1, 2): HC_CM * (e2 - e1) * 1e7, # J -> erg + (1, 3): HC_CM * (e3 - e1) * 1e7, + (2, 3): HC_CM * (e3 - e2) * 1e7, + } + g = {1: g1, 2: g2, 3: g3} + c_up, c_dn, a_rad = {}, {}, {} + for (lo, up), (a_ul, gam) in data['transitions'].items(): + e = energy[(lo, up)] + k_lu = gam * 8.629e-6 / (g[lo] * math.sqrt(T)) * math.exp(-e / (kb_cgs * T)) + k_ul = gam * 8.629e-6 / (g[up] * math.sqrt(T)) + c_up[(lo, up)] = n_e * k_lu + c_dn[(up, lo)] = n_e * k_ul + a_rad[(up, lo)] = a_ul + # Balance equations for levels 2 and 3 with the closure n1+n2+n3 = n_tot. + a22 = -(c_dn[(2, 1)] + a_rad[(2, 1)] + c_up[(2, 3)]) + a23 = c_dn[(3, 2)] + a_rad[(3, 2)] + a32 = c_up[(2, 3)] + a33 = -(c_dn[(3, 1)] + c_dn[(3, 2)] + a_rad[(3, 1)] + a_rad[(3, 2)]) + b2, b3 = c_up[(1, 2)], c_up[(1, 3)] + det = a22 * a33 - a23 * a32 + if det == 0.0: + return n_tot, 0.0, 0.0 + r2 = (-b2 * a33 + b3 * a23) / det + r3 = (-a22 * b3 + a32 * b2) / det + n1 = n_tot / (1.0 + r2 + r3) + return n1, r2 * n1, r3 * n1 + + +def three_level_cooling(species: str, n_tot: float, n_e: float, T: float) -> float: + """Line cooling of one species, erg s^-1 cm^-3, cool-to-space.""" + if n_tot <= 0.0 or n_e <= 0.0: + return 0.0 + data = THREE_LEVEL[species] + levels = data['levels'] + n = dict(zip((1, 2, 3), three_level_populations(species, n_tot, n_e, T))) + q = 0.0 + for (lo, up), (a_ul, _gam) in data['transitions'].items(): + if a_ul <= 0.0: + continue + e = HC_CM * (levels[up - 1][2] - levels[lo - 1][2]) * 1e7 + q += n[up] * a_ul * e + return q + + +def ionization_fraction( + n_cgs: float, T: float, F_cgs: float, hnu_erg: float, sigma_cm2: float, alpha_cm3s: float +) -> float: + """Local photoionization-recombination balance ionization fraction. + + Solves ``f^2 / (1 - f) = R`` with ``R = sigma F / (h nu alpha n)``, the + quadratic root in [0, 1], written as ``f = 2 / (1 + sqrt(1 + 4/R))``: + the textbook form ``(-R + sqrt(R^2 + 4R)) / 2`` cancels catastrophically + at large R and can return fractions above 1. Zero flux or zero density + gives zero. + """ + if F_cgs <= 0.0 or n_cgs <= 0.0: + return 0.0 + R = sigma_cm2 * F_cgs / (hnu_erg * alpha_cm3s * n_cgs) + return 2.0 / (1.0 + math.sqrt(1.0 + 4.0 / R)) + + +def front_constants(element_fractions: dict) -> tuple[float, float, float]: + """Monochromatic-front constants (h nu [erg], E_ion [erg], sigma [cm^2]). + + Hydrogen front for winds with an atomized hydrogen fraction of one half + or more, the nitrogen-like front otherwise. Treating the base gas as + atomized in front of the ionizing continuum is an approximation the + front constants inherit. + """ + if element_fractions.get('H', 0.0) >= 0.5: + return HNU0_H_EV * EV_ERG, E_ION_H_EV * EV_ERG, SIGMA_NU0_H + return HNU_I_N_EV * EV_ERG, E_ION_N_EV * EV_ERG, SIGMA_NU_N + + +def recombination_alpha(element_fractions: dict, T: float) -> float: + """Composition recombination coefficient, cm^3 s^-1. + + Nitrogen-dominated winds use the Badnell fit for N; other compositions + take the mole-fraction-weighted case B coefficients. + """ + if element_fractions.get('N', 0.0) >= 0.5: + return badnell_alpha_rr(T) + return sum(x * alpha_case_b(el, T) for el, x in element_fractions.items()) + + +def balance_at( + T: float, + base: dict, + element_fractions: dict, + F_xuv: float, + cool_atomic: bool = True, + cool_co2_band: bool = True, + cool_o_finestructure: bool = True, + cool_recombination: bool = True, +) -> tuple[float, dict]: + """Heating minus cooling [erg s^-1 cm^-3] at temperature T. + + Evaluated on the wind-base level ``base`` (a level dict with ``n`` + [m^-3] and ``vmr``; densities converted to cgs internally), for the + atomized composition ``element_fractions`` under the XUV flux ``F_xuv`` + [W m^-2]. Returns ``(residual, detail)`` with the detail carrying the + ionization fraction, both totals, and the per-channel parts. + """ + n_cgs = base['n'] * 1e-6 + F_cgs = F_xuv * 1e3 + hnu, e_ion, sigma = front_constants(element_fractions) + alpha = recombination_alpha(element_fractions, T) + f_plus = ionization_fraction(n_cgs, T, F_cgs, hnu, sigma, alpha) + n_e = f_plus * n_cgs + + q_heat = (1.0 - f_plus) * n_cgs * sigma * (F_cgs / hnu) * max(hnu - e_ion, 0.0) + + q_cool = 0.0 + parts = {} + if cool_atomic: + q_lines = 0.0 + for el, x in element_fractions.items(): + if el not in THREE_LEVEL: + continue + n_el = x * n_cgs + q_lines += three_level_cooling(el, (1.0 - f_plus) * n_el, n_e, T) + ion = _ION_OF.get(el) + if ion: + q_lines += three_level_cooling(ion, f_plus * n_el, n_e, T) + parts['atomic_lines'] = q_lines + q_cool += q_lines + if cool_co2_band: + vmr = base['vmr'] + n_co2 = vmr.get('CO2', 0.0) * n_cgs + colliders = { + sp: vmr.get(sp, 0.0) * n_cgs for sp in ('O', 'O2', 'N2', 'CO2', 'He', 'Ar') + } + q_co2 = co2_band_cooling(n_co2, colliders, T) if n_co2 > 0.0 else 0.0 + parts['co2_band'] = q_co2 + q_cool += q_co2 + if cool_o_finestructure: + n_o = element_fractions.get('O', 0.0) * (1.0 - f_plus) * n_cgs + q_o = o_finestructure_cooling(n_o, T) if n_o > 0.0 else 0.0 + parts['o_finestructure'] = q_o + q_cool += q_o + if cool_recombination: + q_rr = n_e * (f_plus * n_cgs) * alpha * 1.5 * kb_cgs * T + parts['recombination'] = q_rr + q_cool += q_rr + + return q_heat - q_cool, dict( + f_plus=f_plus, q_heat=q_heat, q_cool=q_cool, parts=parts, alpha_rec_cgs=alpha + ) + + +def solve_wind_temperature( + T_eq: float, + base: dict, + element_fractions: dict, + F_xuv: float, + cool_atomic: bool = True, + cool_co2_band: bool = True, + cool_o_finestructure: bool = True, + cool_recombination: bool = True, + n_scan: int = 120, +) -> tuple[float, dict]: + """Thermostat root-find on the bracket [T_eq, 5e4 K]. + + Scans the balance upward in temperature and bisects the first downward + crossing of heating through cooling, which selects the lowest stable + root when several exist. When no root lies inside the bracket the + temperature clamps to the nearer edge with the ``clamped`` field set + ('low' when cooling already wins at T_eq, 'high' when heating still + wins at 5e4 K, where the missing physics is the ionization and line + inventory beyond the modeled channels). Returns ``(T_wind, detail)``. + + Raises + ------ + ValueError + If every cooling channel is disabled: a pure-heating balance has no + root by construction and would silently clamp high. + """ + if not (cool_atomic or cool_co2_band or cool_o_finestructure or cool_recombination): + raise ValueError('all cooling channels disabled; at least one must stay on') + channels = dict( + cool_atomic=cool_atomic, + cool_co2_band=cool_co2_band, + cool_o_finestructure=cool_o_finestructure, + cool_recombination=cool_recombination, + ) + lo, hi = T_eq, T_BRACKET_HIGH + if lo >= hi: + _, d = balance_at(hi, base, element_fractions, F_xuv, **channels) + return hi, dict(clamped='high', **d) + ts = np.geomspace(lo, hi, n_scan) + res = [balance_at(float(t), base, element_fractions, F_xuv, **channels)[0] for t in ts] + idx = None + for i in range(len(ts) - 1): + if res[i] > 0.0 >= res[i + 1]: + idx = i + break + if idx is None: + if res[0] <= 0.0: + t_w, clamp = lo, 'low' # cooling already wins at the equilibrium temperature + else: + t_w, clamp = hi, 'high' # heating still wins at the top of the bracket + _, d = balance_at(t_w, base, element_fractions, F_xuv, **channels) + return t_w, dict(clamped=clamp, **d) + a, b = float(ts[idx]), float(ts[idx + 1]) + for _ in range(60): + m = 0.5 * (a + b) + r, _ = balance_at(m, base, element_fractions, F_xuv, **channels) + if r > 0.0: + a = m + else: + b = m + t_w = 0.5 * (a + b) + _, d = balance_at(t_w, base, element_fractions, F_xuv, **channels) + return t_w, dict(clamped=None, **d) diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py new file mode 100644 index 00000000..e8fde39d --- /dev/null +++ b/tests/test_atomic_data.py @@ -0,0 +1,157 @@ +"""Tests for ``src/zephyrus/atomic_data.py``. + +Exercises the transcribed cooling data and the closed-form rate +coefficients. The physical invariants under test: + +- Reference pins: spot values of the Nakayama et al. (2022) Appendix C + transcription, including the corrected O+ level set; the Badnell (2006) + recombination fit against its printed coefficients, with an explicit + discrimination against the garbled variant printed by a later source; the + Murray-Clay et al. (2009) hydrogen case B value. +- Monotonicity / boundedness: recombination coefficients fall with + temperature; both cooling channels are positive and rise with temperature + where their level spacings dictate. +- Closed form: the CO2 band reduces to the coronal (collision-limited) form + far below the critical density, independent of the radiative constants. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.atomic_data import ( + BADNELL_N, + CO2_KD, + HNU_15UM, + THREE_LEVEL, + alpha_case_b, + badnell_alpha_rr, + co2_band_cooling, + o_finestructure_cooling, +) + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +@pytest.mark.reference_pinned +def test_three_level_transcription_spot_values(): + """Spot entries reproduce the printed Nakayama et al. (2022) tables. + + The N transauroral and auroral Einstein coefficients, the hydrogen + Lyman-alpha coefficient, and the O+ level set (the 4S-2D-2P system with + weights 4, 10, 6, correcting the printed row whose labels carry the + neutral-O configuration) pin the transcription. The zero-A entries on + radiatively forbidden couplings are structural, not missing data. + """ + n = THREE_LEVEL['N'] + assert n['transitions'][(1, 3)][0] == pytest.approx(5.22e-3, rel=1e-12) + assert n['transitions'][(2, 3)][0] == pytest.approx(8.47e-2, rel=1e-12) + h = THREE_LEVEL['H'] + assert h['transitions'][(1, 3)][0] == pytest.approx(6.26e8, rel=1e-12) + op = THREE_LEVEL['O+'] + assert [lv[1] for lv in op['levels']] == [4, 10, 6] + assert [lv[0] for lv in op['levels']] == ['4S', '2D', '2P'] + # Structural zeros: the H 2s-2p and C+ 4P-2D couplings carry no A value. + assert THREE_LEVEL['H']['transitions'][(2, 3)][0] == pytest.approx(0.0, abs=0.0) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_badnell_fit_magnitude_slope_and_misprint_guard(): + """The Badnell recombination fit has the right magnitude and slope. + + At 1e4 K the nitrogen coefficient lands in the low 1e-13 cm^3 s^-1 + decade, beside the hydrogen case B 2.7e-13 (the order anchor), and the + coefficient falls monotonically with temperature. The discrimination + guard is the garbled rendering of the fit printed by Chatterjee & + Pierrehumbert (2026, their Eq. 35: product turned into a sum, one + exponent repeated, exponential argument inverted), which disagrees with + the implemented original by more than a factor 2 at 1e4 K. + """ + a4 = badnell_alpha_rr(1.0e4) + assert 1e-13 < a4 < 1e-12 + assert badnell_alpha_rr(3.0e4) < a4 < badnell_alpha_rr(3.0e3) + t0, t1, t2, a_fit, b_fit, c_fit = BADNELL_N + T = 1.0e4 + expo = 1.0 - b_fit - c_fit * math.exp(-T / t2) + garbled = a_fit / ( + math.sqrt(T / t0) * (1.0 + math.sqrt(T / t0)) ** expo + + (1.0 + math.sqrt(T / t1)) ** expo + ) + assert garbled / a4 > 2.0 + + +def test_case_b_coefficients_and_temperature_scaling(): + """Case B values are pinned and share the hydrogen temperature exponent. + + Hydrogen carries the Murray-Clay et al. (2009) 2.7e-13 cm^3 s^-1 at + 1e4 K; every element scales as (T/1e4 K)^-0.9 exactly (the documented + extension of hydrogen's exponent to the heavies); an element without a + tabulated value falls back to the atomic-O coefficient rather than + raising, because coefficient provenance is flagged upstream. + """ + assert alpha_case_b('H', 1.0e4) == pytest.approx(2.7e-13, rel=1e-12) + for el in ('H', 'He', 'C', 'N', 'O'): + ratio = alpha_case_b(el, 2.0e4) / alpha_case_b(el, 1.0e4) + assert ratio == pytest.approx(2.0**-0.9, rel=1e-12) + assert alpha_case_b('Xe', 8000.0) == pytest.approx(alpha_case_b('O', 8000.0), rel=1e-12) + # Scale guard: all case B values live in the 1e-13 decade at 1e4 K. + for el in ('He', 'C', 'N', 'O'): + assert 5e-14 < alpha_case_b(el, 1.0e4) < 5e-13 + + +@pytest.mark.physics_invariant +def test_co2_band_coronal_limit_and_detailed_balance(): + """Far below the critical density the band cooling is collision limited. + + In the coronal limit every collisional excitation radiates, so the full + expression must reduce to ``h nu k_e n_M n_CO2`` with the excitation + rate fixed by detailed balance, ``k_e = 2 k_d exp(-667 K / T)``, + independent of the Einstein coefficient and the escape probability. + Zero colliders give exactly zero cooling (the error-contract limit). + """ + T = 300.0 + n_co2, colliders = 1e6, {'O': 1e6} + q = co2_band_cooling(n_co2, colliders, T) + a, b = CO2_KD['O'] + kd = a * T**b + ke = 2.0 * kd * math.exp(-667.0 / T) + assert q == pytest.approx(HNU_15UM * ke * colliders['O'] * n_co2, rel=1e-3) + assert co2_band_cooling(n_co2, {}, T) == pytest.approx(0.0, abs=0.0) + assert co2_band_cooling(n_co2, {'O': 0.0}, T) == pytest.approx(0.0, abs=0.0) + + +def test_co2_band_escape_probability_branches(): + """An overlying CO2 column reduces the cooling through photon trapping. + + The zero-column non-LTE ceiling has escape probability 0.5; a small + column enters the shallow branch and a large column the steep branch, + each strictly reducing the cooling relative to the ceiling, and the + large-column case more strongly (monotone in column). + """ + T, n_co2, colliders = 300.0, 1e10, {'CO2': 1e10, 'O': 1e8} + q0 = co2_band_cooling(n_co2, colliders, T, col_co2=0.0) + q_small = co2_band_cooling(n_co2, colliders, T, col_co2=1e14) # sigma N ~ 0.64 + q_large = co2_band_cooling(n_co2, colliders, T, col_co2=1e16) # sigma N ~ 64 + assert q0 > 0.0 + assert q_large < q_small + # Trapping can only reduce the loss relative to the free-escape ceiling. + assert q_large < q0 + + +@pytest.mark.physics_invariant +def test_o_finestructure_positive_and_activating(): + """The O fine-structure channel is positive and thermally activating. + + The 228 K and 326 K level spacings make the cooling rise steeply from + 150 K to 300 K; it is linear in the atomic-O density (a two-point ratio + check), and zero density gives zero cooling. + """ + q150 = o_finestructure_cooling(1e8, 150.0) + q300 = o_finestructure_cooling(1e8, 300.0) + assert q150 > 0.0 + assert q300 > q150 + assert o_finestructure_cooling(2e8, 300.0) / q300 == pytest.approx(2.0, rel=1e-12) + assert o_finestructure_cooling(0.0, 300.0) == pytest.approx(0.0, abs=0.0) diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py new file mode 100644 index 00000000..3bbd0a3a --- /dev/null +++ b/tests/test_thermostat.py @@ -0,0 +1,224 @@ +"""Tests for ``src/zephyrus/thermostat.py``. + +Exercises the statistical-equilibrium line cooling, the ionization balance, +and the wind-temperature root-find. The physical invariants under test: + +- Detailed balance: as the electron density grows the three-level + populations reach Boltzmann ratios (the LTE limit). +- Coronal limit: at low electron density the line cooling is exactly linear + in the electron density. +- Reference pin: the hydrogen three-level system agrees with the Black + (1981) Lyman-alpha rate as printed by Murray-Clay et al. (2009) at order + unity (the sources differ in collision-strength treatment, so identity is + not expected and the bracket documents the offset). +- Boundedness / error contract: the ionization fraction lies in [0, 1] with + exact zero at zero flux; the root-find clamps to its bracket edges with + the clamp recorded; disabling every cooling channel raises. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.atomic_data import HC_CM, LYA_BLACK, THREE_LEVEL +from zephyrus.constants import kb_cgs +from zephyrus.thermostat import ( + balance_at, + front_constants, + ionization_fraction, + recombination_alpha, + solve_wind_temperature, + three_level_cooling, + three_level_populations, +) + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +def _base(n_si=1e18, vmr=None): + """Minimal wind-base level dict: number density [m^-3] and composition.""" + return {'n': n_si, 'vmr': vmr or {'N2': 1.0}} + + +@pytest.mark.physics_invariant +def test_populations_reach_boltzmann_in_the_lte_limit(): + """At very high electron density the populations are Boltzmann ratios. + + Detailed balance is built into the rate coefficients, so collisions + alone must thermalize the levels: ``n_u / n_l = (g_u / g_l) + exp(-E_ul / kB T)``. Species with a zero collision strength on one + coupling cannot thermalize through it and are skipped. The edge case is + the ground-state-dominated low-T limit checked through the exponential. + """ + T = 8000.0 + checked = 0 + for sp, data in THREE_LEVEL.items(): + if any(g == 0.0 for _a, g in data['transitions'].values()): + continue + n1, n2, n3 = three_level_populations(sp, 1.0, 1e20, T) + (_l1, g1, e1), (_l2, g2, e2), (_l3, g3, e3) = data['levels'] + for (na, ga, ea), (nb, gb, eb) in ( + ((n2, g2, e2), (n1, g1, e1)), + ((n3, g3, e3), (n1, g1, e1)), + ): + boltz = (ga / gb) * math.exp(-HC_CM * (ea - eb) * 1e7 / (kb_cgs * T)) + assert na / nb == pytest.approx(boltz, rel=1e-3), sp + checked += 1 + assert checked >= 4 # most of the seven systems thermalize fully + + +@pytest.mark.physics_invariant +def test_cooling_linear_in_electron_density_in_the_coronal_limit(): + """Far below every critical density the cooling is linear in n_e. + + The N 2D metastable level has a critical density of only about + 2.5e3 cm^-3 (A21 = 1.3e-5 s^-1), so electron densities of order unity + sit deep in the coronal regime, where doubling n_e doubles the loss. + The saturation guard: at LTE-scale electron density the ratio collapses + far below 2, which discriminates a missing collisional de-excitation. + """ + q1 = three_level_cooling('N', 1e8, 1.0, 9000.0) + q2 = three_level_cooling('N', 1e8, 2.0, 9000.0) + assert q2 / q1 == pytest.approx(2.0, rel=1e-3) + q_lte1 = three_level_cooling('N', 1e8, 1e19, 9000.0) + q_lte2 = three_level_cooling('N', 1e8, 2e19, 9000.0) + assert q_lte2 / q_lte1 < 1.1 + # Zero density in either species gives zero cooling (error contract). + assert three_level_cooling('N', 0.0, 1e6, 9000.0) == pytest.approx(0.0, abs=0.0) + + +@pytest.mark.reference_pinned +def test_hydrogen_system_brackets_the_black_lyalpha_rate(): + """The H three-level cooling agrees with Black (1981) at order unity. + + Murray-Clay et al. (2009, Eq. 6) print the Black rate ``7.5e-19 n_e n_H + exp(-118348 K / T)`` erg cm^-3 s^-1. The three-level system uses + effective collision strengths frozen at 1e4 K and carries no cascades, + while the Black fit carries both, so the two agree only at order unity + (the measured ratio runs from about 0.5 at 1e4 K to 0.3 at 3e4 K). The + bracket catches transcription errors, in the constant and in the + exponential activation, and nothing finer. + """ + pref, tscale = LYA_BLACK + for T in (1.0e4, 2.0e4): + n_h, n_e = 1e8, 1e6 + q_mine = three_level_cooling('H', n_h, n_e, T) + q_black = pref * n_e * n_h * math.exp(-tscale / T) + assert 0.15 < q_mine / q_black < 1.5, T + + +@pytest.mark.physics_invariant +def test_ionization_fraction_limits_and_monotonicity(): + """The ionization fraction is bounded, zero at zero flux, and monotone. + + Exact zero without flux or density; strictly inside (0, 1] otherwise; + monotone increasing with flux and decreasing with density (stronger + recombination sinks). The strong-flux limit approaches full ionization. + """ + assert ionization_fraction(1e10, 1e4, 0.0, 1e-11, 1e-17, 2.7e-13) == pytest.approx( + 0.0, abs=0.0 + ) + f = ionization_fraction(1e6, 1e4, 1e6, 1e-11, 1e-17, 2.7e-13) + assert 0.0 < f <= 1.0 + f_hi = ionization_fraction(1e6, 1e4, 1e8, 1e-11, 1e-17, 2.7e-13) + assert f_hi > f + f_dense = ionization_fraction(1e12, 1e4, 1e6, 1e-11, 1e-17, 2.7e-13) + assert f_dense < f + f_sat = ionization_fraction(1e2, 1e4, 1e12, 1e-11, 1e-17, 2.7e-13) + assert f_sat == pytest.approx(1.0, abs=1e-3) + + +def test_front_and_recombination_selection_follow_composition(): + """Front constants and the recombination route follow the composition. + + A hydrogen-dominated wind takes the 20 eV hydrogen front; a nitrogen + wind takes the harder 33.6 eV front with the smaller cross section, and + its recombination coefficient comes from the Badnell fit rather than + the case B average (the two differ resolvably at 1e4 K). + """ + hnu_h, eion_h, sig_h = front_constants({'H': 0.9, 'O': 0.1}) + hnu_n, eion_n, sig_n = front_constants({'N': 0.8, 'O': 0.2}) + assert hnu_n > hnu_h + assert sig_n > sig_h + assert eion_n > eion_h + from zephyrus.atomic_data import alpha_case_b, badnell_alpha_rr + + a_n = recombination_alpha({'N': 0.8, 'O': 0.2}, 1e4) + assert a_n == pytest.approx(badnell_alpha_rr(1e4), rel=1e-12) + a_mix = recombination_alpha({'H': 0.6, 'O': 0.4}, 1e4) + expected = 0.6 * alpha_case_b('H', 1e4) + 0.4 * alpha_case_b('O', 1e4) + assert a_mix == pytest.approx(expected, rel=1e-12) + # Ratio comparison: at 1e-13 scale an absolute tolerance would swamp the + # difference, so the resolvability check is multiplicative. + assert a_n / a_mix > 1.5 + + +def test_rootfind_contract_edges_and_root(): + """The root-find honors its bracket, clamps flagged, and balances at a root. + + Zero flux means no heating, so cooling wins at the lower edge and the + temperature clamps low. A strong flux on a nitrogen wind finds a root + inside the bracket, where heating balances cooling to the bisection + tolerance. An equilibrium temperature at or above the upper bracket + edge clamps high immediately. + """ + T, d = solve_wind_temperature(700.0, _base(), {'N': 1.0}, 0.0) + assert T == pytest.approx(700.0, rel=1e-12) + assert d['clamped'] == 'low' + T, d = solve_wind_temperature(700.0, _base(), {'N': 1.0}, 5.0) + assert 700.0 <= T <= 5.0e4 + if d['clamped'] is None: + assert abs(d['q_heat'] - d['q_cool']) / d['q_heat'] < 1e-3 + T, d = solve_wind_temperature(6.0e4, _base(), {'N': 1.0}, 5.0) + assert T == pytest.approx(5.0e4, rel=1e-12) + assert d['clamped'] == 'high' + + +def test_all_cooling_channels_off_is_rejected(): + """Disabling every cooling channel raises instead of clamping silently. + + A pure-heating balance has no root by construction; the contract is a + ``ValueError``, and a single enabled channel on the same path returns + normally. + """ + with pytest.raises(ValueError, match='cooling channels'): + solve_wind_temperature( + 700.0, + _base(), + {'N': 1.0}, + 5.0, + cool_atomic=False, + cool_co2_band=False, + cool_o_finestructure=False, + cool_recombination=False, + ) + T, _ = solve_wind_temperature( + 700.0, + _base(), + {'N': 1.0}, + 5.0, + cool_atomic=True, + cool_co2_band=False, + cool_o_finestructure=False, + cool_recombination=False, + ) + assert 700.0 <= T <= 5.0e4 + + +@pytest.mark.physics_invariant +def test_balance_parts_sum_and_channel_toggles(): + """The cooling parts sum to the total and toggles remove their channel. + + Energy bookkeeping: the per-channel parts must sum to ``q_cool`` + exactly. Turning the atomic channel off removes its part and can only + reduce the total cooling at fixed temperature. + """ + comp = {'N': 0.8, 'O': 0.2} + r_all, d_all = balance_at(9000.0, _base(), comp, 5.0) + assert sum(d_all['parts'].values()) == pytest.approx(d_all['q_cool'], rel=1e-12) + r_no_atomic, d_no = balance_at(9000.0, _base(), comp, 5.0, cool_atomic=False) + assert 'atomic_lines' not in d_no['parts'] + assert d_no['q_cool'] <= d_all['q_cool'] + assert r_no_atomic >= r_all From 5d51e5dba397bdb3dc5577c3fb291e0eb030b814 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:23:17 +0200 Subject: [PATCH 009/113] Add the energy limited and radiation recombination limited hydrodynamic rates --- src/zephyrus/hydrodynamic.py | 205 +++++++++++++++++++++++++++++++ tests/test_hydrodynamic.py | 232 +++++++++++++++++++++++++++++++++++ 2 files changed, 437 insertions(+) create mode 100644 src/zephyrus/hydrodynamic.py create mode 100644 tests/test_hydrodynamic.py diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py new file mode 100644 index 00000000..9ca61efd --- /dev/null +++ b/src/zephyrus/hydrodynamic.py @@ -0,0 +1,205 @@ +""" +!!! info "`hydrodynamic.py`" + Hydrodynamic escape: energy-limited and radiation-recombination-limited + rates, and the selection between them.
+ Authors: Malina Ovesen, Mara Attia +""" + +from __future__ import annotations + +import math + +from zephyrus.atomic_data import HNU0_H_EV, HNU_I_N_EV, alpha_case_b +from zephyrus.composition import ELEMENT_AMU +from zephyrus.constants import G, ev2joule, kb, m_p +from zephyrus.profiles import SIGMA_NU0 + +# The branch computes both hydrodynamic limits and takes their minimum: +# +# - Energy limited (EL): Erkaev et al. (2007, A&A 472, 329, their Eq. 21), +# Mdot = eps pi F_XUV R_p R_XUV^2 / (G M_p K(xi)), with the tidal factor +# K(xi) of their Eq. (17) at xi = R_Hill/R_p and the periapsis Hill +# radius. The factor pi encodes full-surface redistribution of the +# intercepted power. +# - Radiation-recombination limited (RR): the analytic chain of Murray-Clay +# et al. (2009, ApJ 693, 23, Section 3.2) in the form derived by Malina +# Ovesen from Lopez (2017, MNRAS 472, 245, Eqs. 4-6): ionization +# equilibrium at the wind base sets the base ion density proportional to +# sqrt(F_XUV), and an isothermal Parker wind carries it to the sonic +# point with the barometric factor exp(3/2 - lambda_b), the exact +# isothermal value. min(EL, RR) selects RR two physically distinct ways: +# genuine recombination saturation (the sqrt(F) regime at modest +# lambda_b) and barometric suppression at large lambda_b, where the label +# "recombination limited" would be a category error; the selection +# mechanism is reported so the two are never conflated. +# - Efficiency: fixed, or the Caldiroli et al. (2022, A&A 663, A122, +# Appendix A.1) fit, defined against their R_p^3 geometry and therefore +# converted by (R_p/R_XUV)^2 before use in the Erkaev form. + +RHO_UNIT_CGS = 1e-3 # kg m^-3 -> g cm^-3 +FLUX_UNIT_CGS = 1e3 # W m^-2 -> erg s^-1 cm^-2 + + +def hill_radius_periapsis(M_p: float, M_star: float, a: float, e: float) -> float: + """Periapsis Hill radius a (1 - e) (M_p / 3 M_star)^(1/3), in m.""" + return a * (1.0 - e) * (M_p / (3.0 * M_star)) ** (1.0 / 3.0) + + +def k_tide(xi: float) -> float: + """Erkaev et al. (2007) Eq. (17) tidal factor; valid for xi > 1 (K(1) = 0).""" + return 1.0 - 3.0 / (2.0 * xi) + 1.0 / (2.0 * xi**3) + + +def el_rate(eps: float, F_xuv: float, R_p: float, R_xuv: float, M_p: float, K: float) -> float: + """Energy-limited rate eps pi F R_p R_xuv^2 / (G M_p K), in kg/s.""" + return eps * math.pi * F_xuv * R_p * R_xuv**2 / (G * M_p * K) + + +def caldiroli_efficiency(F_xuv: float, M_p: float, R_p: float, K: float) -> tuple: + """Evaporation-efficiency fit of Caldiroli et al. (2022, Appendix A.1). + + Their fit is a function of the tidally corrected gravitational + potential ``phi = K G M_p / R_p`` and the flux-to-density ratio + ``F_XUV / rho_p``, both in cgs internally. It returns the efficiency + defined against their ``R_p^3`` rate geometry; the caller converts by + ``(R_p / R_XUV)^2`` before using it in the Erkaev form. Below their + validity bound ``F_XUV / rho_p = 1e2`` (cgs) the fitting formulas turn + complex, so that region is rejected here: the return is ``(None, + flags)`` with ``caldiroli_below_flux_bound`` set and the caller falls + back to the fixed efficiency. Outside their fitted box the value is + still returned, flagged ``caldiroli_out_of_box``. + """ + flags = {} + rho_p = M_p / (4.0 / 3.0 * math.pi * R_p**3) + f_cgs = F_xuv * FLUX_UNIT_CGS + rho_cgs = rho_p * RHO_UNIT_CGS + f2 = (f_cgs / rho_cgs) / 1e2 + if f2 < 1.0: + flags['caldiroli_below_flux_bound'] = True + return None, flags + phi_red = K * (G * M_p / R_p) * 1e4 # erg/g + if not (10**12.17 <= phi_red <= 10**13.29) or f2 > 1e4: + flags['caldiroli_out_of_box'] = True + lf2 = math.log10(f2) + a_coef = 1.682 * lf2**0.2802 - 5.488 if lf2 > 0 else -5.488 + alpha = 0.02489 * f2**-0.0860 - 0.01007 * f2**-0.9543 + eta0 = -0.03973 * lf2**2.173 - 0.01359 if lf2 > 0 else -0.01359 + beta = -0.01799 * f2**0.1723 - 3.3875 * f2**0.0140 + sigma = 1.0 / (1.0 + (phi_red / 10**13.22) ** beta) + log_eta = a_coef * phi_red**alpha * sigma + eta0 * (1.0 - sigma) + return 10**log_eta, flags + + +def wind_mean_masses(element_fractions: dict) -> tuple[float, float]: + """(mu_wind, mu_plus) of an ionized wind, in proton masses. + + Generalizes the printed mean-mass pairs of Lopez (2017): with hydrogen + fully ionized, heavier atoms singly ionized, and the electrons counted + among the particles, the mean mass per particle is half the mean atomic + mass and the mean mass per ion is the mean atomic mass itself. The rule + reproduces Lopez's printed H/He pair (0.62, 1.3) and steam pair (3, 6). + """ + mbar = sum(x * ELEMENT_AMU[el] for el, x in element_fractions.items()) + return mbar / 2.0, mbar + + +def rr_chain( + M_p: float, F_xuv: float, R_base: float, T_wind: float, element_fractions: dict +) -> dict: + """The radiation-recombination-limited chain at the wind base. + + Evaluates the Murray-Clay et al. (2009) analytic chain at wind + temperature ``T_wind`` for the atomized base composition: sound speed + and sonic radius ``R_s = G M_p / (2 c_s^2)``, the base Jeans parameter + ``lambda_b``, the base ion density from photoionization-recombination + balance (proportional to ``sqrt(F_xuv)``), the barometric factor + ``exp(3/2 - lambda_b)`` to the sonic point, and the rate + ``4 pi rho_s c_s R_s^2``. + + When the computed sonic radius falls below the base (a subcritical + configuration), the sonic radius is floored at the base and the density + there is the base density (the barometric factor is not applied below + the base); the ``subcritical`` flag reports it and the caller carries + it on the result. + + The ionizing front follows the composition: the 20 eV hydrogen front + for winds with an atomized hydrogen fraction of one half or more, the + 33.6 eV nitrogen-like front otherwise. The composition recombination + coefficient is the mole-fraction-weighted case B set with its + documented temperature scaling. + + Returns a dict with ``c_s``, ``R_s``, ``R_s_calc``, ``lambda_b``, + ``rho_base``, ``rho_s``, ``n_plus_base``, ``n_0_base``, + ``f_plus_base``, ``mdot_rr`` [kg/s], ``subcritical``, + ``barometric_factor``, ``mu_wind``, ``mu_plus_wind``, ``hnu0_eV``. + """ + mu_wind, mu_plus = wind_mean_masses(element_fractions) + c_s = math.sqrt(kb * T_wind / (mu_wind * m_p)) + r_s_calc = G * M_p / (2.0 * c_s**2) + subcritical = r_s_calc < R_base + r_s = max(r_s_calc, R_base) + lambda_b = G * M_p / (R_base * c_s**2) + + x_h = element_fractions.get('H', 0.0) + hnu0 = (HNU0_H_EV if x_h >= 0.5 else HNU_I_N_EV) * ev2joule + + # Composition-weighted case B coefficient, cm^3/s -> m^3/s. + alpha_b = sum(x * alpha_case_b(el, T_wind) for el, x in element_fractions.items()) * 1e-6 + + # Base ion density from photoionization-recombination balance with the + # neutral density at unit optical depth over a scale height substituted, + # so the photoionization cross section cancels: + # n_+^2 = F G M / (h nu0 alpha_B c_s^2 R_base^2). + n_plus_base = ( + math.sqrt(F_xuv * G * M_p / (hnu0 * alpha_b * c_s**2 * R_base**2)) if F_xuv > 0 else 0.0 + ) + rho_base = n_plus_base * mu_plus * m_p + # Neutral base density from unit optical depth over a scale height: + # n_0 = G M / (sigma_nu0 c_s^2 R_base^2). + n_0_base = G * M_p / (SIGMA_NU0 * c_s**2 * R_base**2) + f_plus = n_plus_base / (n_plus_base + n_0_base) if (n_plus_base + n_0_base) > 0 else 0.0 + + if subcritical: + baro = 1.0 + rho_s = rho_base + else: + baro = math.exp(1.5 - lambda_b) + rho_s = rho_base * baro + mdot_rr = 4.0 * math.pi * rho_s * c_s * r_s**2 + return dict( + c_s=c_s, + R_s=r_s, + R_s_calc=r_s_calc, + lambda_b=lambda_b, + rho_base=rho_base, + rho_s=rho_s, + n_plus_base=n_plus_base, + n_0_base=n_0_base, + f_plus_base=f_plus, + mdot_rr=mdot_rr, + subcritical=subcritical, + barometric_factor=baro, + mu_wind=mu_wind, + mu_plus_wind=mu_plus, + hnu0_eV=hnu0 / ev2joule, + ) + + +def selection_mechanism(rr: dict, el_won: bool) -> str: + """Which mechanism min(EL, RR) actually selected; diagnostic only. + + An RR win means one of two physically different things: genuine + recombination saturation (the sqrt(F) limitation at modest base Jeans + parameter) or barometric suppression (large ``lambda_b``: the + isothermal wind exponentially throttled between base and sonic point, + which has nothing to do with recombination). The split at + ``lambda_b = 4`` is a reporting convention, stated as such. This string + never gates anything. + """ + if el_won: + return 'EL-selected' + if rr['subcritical']: + return 'RR-selected:subcritical-floor' + if rr['lambda_b'] >= 4.0: + return 'RR-selected:barometric-suppression' + return 'RR-selected:recombination-saturation' diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py new file mode 100644 index 00000000..c731aa5c --- /dev/null +++ b/tests/test_hydrodynamic.py @@ -0,0 +1,232 @@ +"""Tests for ``src/zephyrus/hydrodynamic.py``. + +Exercises the energy-limited and radiation-recombination-limited rates and +the machinery that selects between them. The physical invariants under test: + +- Reference pins: the Erkaev et al. (2007) Table 1 tidal enhancement + factors within 1 percent; the Caldiroli et al. (2022) efficiency fit at + spot points of its validity box; the Lopez (2017) printed wind mean-mass + pairs; the Murray-Clay et al. (2009) fiducial hot Jupiter (base Jeans + parameter, sonic radius, and sonic-point Knudsen numbers with their + Coulomb cross section). +- Monotonicity / symmetry: the RR rate scales as the square root of the + XUV flux and the EL rate linearly in it. +- Boundedness / error contract: the subcritical floor holds the density at + the base value, and the efficiency fit rejects its complex-valued region + by falling back with a flag. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.constants import G, m_p +from zephyrus.hydrodynamic import ( + caldiroli_efficiency, + el_rate, + hill_radius_periapsis, + k_tide, + rr_chain, + selection_mechanism, + wind_mean_masses, +) +from zephyrus.knudsen import mean_free_path, sonic_scale_height +from zephyrus.planets_parameters import Me, Mjup, Ms, Re, Rjup + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + +# Erkaev et al. (2007) Table 1: (xi, printed enhancement factor 1/K). +ERKAEV_TABLE1 = [ + (2.9, 1.97), + (3.0, 1.92), + (3.5, 1.70), + (3.7, 1.65), + (3.8, 1.63), + (4.3, 1.53), + (5.9, 1.34), +] + +# Spot evaluations of the Caldiroli et al. (2022) Appendix A.1 fit across +# its validity box at K = 1: (log10 phi [cgs], F_XUV/rho_p [cgs], eta). +CALDIROLI_SPOTS = [ + (12.20, 1e3, 8.8e-1), + (12.20, 1e6, 1.5e-1), + (12.80, 1e4, 4.5e-1), + (13.00, 1e4, 1.2e-1), + (13.10, 1e5, 2.6e-2), + (13.29, 1e6, 8.7e-4), +] + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_erkaev_table1_enhancement_factors(): + """The tidal factor reproduces the published Table 1 within 1 percent. + + Erkaev et al. (2007) print the enhancement ``1/K`` for seven observed + hot Jupiters; each must match, and the factor must fall monotonically + toward 1 as ``xi`` grows (boundedness: ``K`` in (0, 1) throughout). + """ + for xi, inv_k in ERKAEV_TABLE1: + assert 1.0 / k_tide(xi) == pytest.approx(inv_k, rel=0.011), xi + assert 0.0 < k_tide(xi) < 1.0 + factors = [1.0 / k_tide(xi) for xi, _ in ERKAEV_TABLE1] + assert all(a >= b for a, b in zip(factors, factors[1:])) + + +def _planet_for(log_phi, f_over_rho_cgs): + """Invert (log10 phi, F/rho in cgs) into (M_p, R_p, F_xuv) at 2 Earth radii.""" + r_p = 2.0 * Re + phi_si = 10**log_phi * 1e-4 + m_planet = phi_si * r_p / G + rho_p = m_planet / (4.0 / 3.0 * math.pi * r_p**3) + f_cgs = f_over_rho_cgs * (rho_p * 1e-3) + return m_planet, r_p, f_cgs * 1e-3 + + +@pytest.mark.reference_pinned +def test_caldiroli_fit_spot_values_and_flux_guard(): + """The efficiency fit reproduces spot evaluations and rejects its floor. + + Six points across the fit's validity box reproduce the published + formulas to 5 percent, spanning three decades of efficiency (the + collapse toward 1e-3 at high potential is the physical content). Below + ``F_XUV / rho_p = 1e2`` cgs the formulas turn complex; the fit must + return None with the flag instead of a complex or extrapolated number. + """ + for log_phi, f_over_rho, eta_ref in CALDIROLI_SPOTS: + m_planet, r_p, f_xuv = _planet_for(log_phi, f_over_rho) + eta, _flags = caldiroli_efficiency(f_xuv, m_planet, r_p, K=1.0) + assert eta == pytest.approx(eta_ref, rel=0.05), (log_phi, f_over_rho) + m_planet, r_p, f_xuv = _planet_for(12.5, 0.5) # F/rho below the 1e2 bound + eta, flags = caldiroli_efficiency(f_xuv, m_planet, r_p, K=1.0) + assert eta is None + assert flags.get('caldiroli_below_flux_bound') is True + + +@pytest.mark.reference_pinned +def test_wind_mean_masses_reproduce_lopez_pairs(): + """The ionized-wind mean-mass rule reproduces the published pairs. + + Lopez (2017) prints (mu_wind, mu_plus) = (0.62, 1.3) proton masses for + a 90/10 H/He wind and (3, 6) for steam (fully dissociated 2:1 H:O). + The generalized rule (electrons counted, heavies singly ionized) must + recover both, and the per-ion mass must always be twice the per-particle + mass by construction. + """ + mu_w, mu_i = wind_mean_masses({'H': 0.9, 'He': 0.1}) + assert mu_w == pytest.approx(0.62, rel=0.06) + assert mu_i == pytest.approx(1.3, rel=0.02) + mu_w, mu_i = wind_mean_masses({'H': 2.0 / 3.0, 'O': 1.0 / 3.0}) + assert mu_w == pytest.approx(3.0, rel=0.01) + assert mu_i == pytest.approx(6.0, rel=0.01) + assert mu_i == pytest.approx(2.0 * mu_w, rel=1e-12) + + +@pytest.mark.physics_invariant +def test_rr_subcritical_floor_semantics(): + """A subcritical sonic point floors at the base with the base density. + + A cool 1e4 K hydrogen wind on an Earth-mass planet has its formal sonic + radius inside the base radius; the chain must flag it, floor the sonic + radius at the base, hold the density at the base value, and apply no + barometric suppression (factor exactly 1). + """ + rr = rr_chain(1.0 * Me, 10.0, 1.0 * Re, 1.0e4, {'H': 1.0}) + assert rr['subcritical'] is True + assert rr['R_s'] == pytest.approx(1.0 * Re, rel=1e-12) + assert rr['R_s_calc'] < 1.0 * Re + assert rr['rho_s'] == pytest.approx(rr['rho_base'], rel=1e-12) + assert rr['barometric_factor'] == pytest.approx(1.0, rel=1e-12) + assert selection_mechanism(rr, el_won=False) == 'RR-selected:subcritical-floor' + + +@pytest.mark.physics_invariant +def test_rr_barometric_factor_and_mechanism_labels(): + """Supercritical winds carry exp(3/2 - lambda_b), labeled by mechanism. + + A heavy C-O wind on a massive planet is strongly bound: the barometric + factor is exactly ``exp(3/2 - lambda_b)``, and with ``lambda_b`` above + the reporting split an RR win is labeled barometric suppression, never + recombination saturation (the category-error guard). The EL-win label + is independent of the chain state. + """ + rr = rr_chain(10.0 * Me, 10.0, 2.0 * Re, 1.0e4, {'C': 1.0 / 3.0, 'O': 2.0 / 3.0}) + assert rr['subcritical'] is False + assert rr['barometric_factor'] == pytest.approx(math.exp(1.5 - rr['lambda_b']), rel=1e-12) + assert rr['lambda_b'] > 4.0 + assert selection_mechanism(rr, el_won=False) == 'RR-selected:barometric-suppression' + assert selection_mechanism(rr, el_won=True) == 'EL-selected' + # A loosely bound hydrogen wind (base Jeans parameter between the + # supercritical floor at 2 and the reporting split at 4) lands in + # genuine recombination saturation. + rr_h = rr_chain(0.7 * Mjup, 5.0, 2.0 * Rjup, 1.0e4, {'H': 1.0}) + assert not rr_h['subcritical'] + assert 2.0 < rr_h['lambda_b'] < 4.0 + assert selection_mechanism(rr_h, el_won=False) == 'RR-selected:recombination-saturation' + + +@pytest.mark.physics_invariant +def test_flux_scalings_of_both_limits(): + """The RR rate scales as sqrt(F_XUV) and the EL rate linearly in it. + + The square root comes from ionization equilibrium at the base (ion + density proportional to sqrt of the ionizing flux); linearity is the + energy-limited budget. A spurious offset or a wrong power fails the + exact two-point ratios. + """ + a = rr_chain(5 * Me, 1.0, 1.5 * Re, 1e4, {'H': 1.0}) + b = rr_chain(5 * Me, 100.0, 1.5 * Re, 1e4, {'H': 1.0}) + assert b['mdot_rr'] / a['mdot_rr'] == pytest.approx(10.0, rel=1e-6) + lo = el_rate(0.1, 1.0, Re, 1.1 * Re, Me, 1.0) + hi = el_rate(0.1, 100.0, Re, 1.1 * Re, Me, 1.0) + assert hi / lo == pytest.approx(100.0, rel=1e-12) + # Zero-flux limits: no driver, no escape, for both chains. + assert el_rate(0.1, 0.0, Re, 1.1 * Re, Me, 1.0) == pytest.approx(0.0, abs=1e-30) + assert rr_chain(5 * Me, 0.0, 1.5 * Re, 1e4, {'H': 1.0})['mdot_rr'] == pytest.approx( + 0.0, abs=1e-30 + ) + + +@pytest.mark.reference_pinned +def test_murray_clay_fiducial_hot_jupiter_anchors(): + """The chain reproduces the Murray-Clay et al. (2009) fiducial planet. + + Their planet (0.7 Jupiter masses, 1.4 Jupiter radii, ionized hydrogen + wind at 1e4 K) has a base Jeans parameter of 5.49 (5 percent tolerance: + their radius convention rounds R_Jup), a sonic point at + ``lambda_b / 2`` planetary radii inside their stated 2 to 4, and + sonic-point Knudsen numbers, evaluated with their proton-proton Coulomb + cross section ``1e-13 (T / 1e4 K)^-2 cm^2``, near the printed 1e-4 at + 450 erg cm^-2 s^-1 and 1e-5 at 5e5 erg cm^-2 s^-1 (factor-3 tolerance: + their scale-height convention differs at order unity). + """ + m_planet, r_p = 0.7 * Mjup, 1.4 * Rjup + rr = rr_chain(m_planet, 0.45, r_p, 1.0e4, {'H': 1.0}) + assert rr['lambda_b'] == pytest.approx(5.49, rel=0.05) + assert 2.0 < rr['R_s'] / r_p < 4.0 + assert rr['R_s'] / r_p == pytest.approx(rr['lambda_b'] / 2.0, rel=1e-9) + sigma_pp = 1e-13 * 1e-4 # cm^2 -> m^2 at 1e4 K + for f_si, kn_ref in ((0.45, 1e-4), (500.0, 1e-5)): + rr = rr_chain(m_planet, f_si, r_p, 1.0e4, {'H': 1.0}) + n_sc = rr['rho_s'] / (rr['mu_plus_wind'] * m_p) + kn = mean_free_path(sigma_pp, n_sc) / sonic_scale_height(rr['R_s'], 1.0) + assert kn_ref / 3.0 < kn < kn_ref * 3.0, f_si + + +def test_hill_radius_periapsis_geometry(): + """The periapsis Hill radius scales with a (1 - e) and the mass ratio. + + Eccentricity shrinks the periapsis linearly; the mass dependence is the + cube root. The circular Earth-Sun value lands near 0.01 au (the + well-known Hill-sphere scale), the sanity anchor. + """ + r0 = hill_radius_periapsis(Me, Ms, 1.496e11, 0.0) + r3 = hill_radius_periapsis(Me, Ms, 1.496e11, 0.3) + assert r3 == pytest.approx(0.7 * r0, rel=1e-12) + r8m = hill_radius_periapsis(8 * Me, Ms, 1.496e11, 0.0) + assert r8m == pytest.approx(2.0 * r0, rel=1e-12) + # Earth's Hill radius is about 1.5e9 m (0.01 au). + assert 1.3e9 < r0 < 1.6e9 From 3c081359f63aa3fa15e5192a75919930f7d84669 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:26:07 +0200 Subject: [PATCH 010/113] Add hydrostatic escape with the extended upper structure and supply cap --- src/zephyrus/hydrostatic.py | 339 ++++++++++++++++++++++++++++++++++++ tests/test_hydrostatic.py | 302 ++++++++++++++++++++++++++++++++ 2 files changed, 641 insertions(+) create mode 100644 src/zephyrus/hydrostatic.py create mode 100644 tests/test_hydrostatic.py diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py new file mode 100644 index 00000000..e3474d89 --- /dev/null +++ b/src/zephyrus/hydrostatic.py @@ -0,0 +1,339 @@ +""" +!!! info "`hydrostatic.py`" + Hydrostatic escape: extended upper structure, per-species Jeans escape, + and the diffusion-limited supply cap.
+ Authors: Ioana Balint, Viesturs Strelcs, Mara Attia +""" + +from __future__ import annotations + +import math + +import numpy as np + +from zephyrus.composition import ELEMENT_AMU, parse_formula, species_mass_amu +from zephyrus.constants import G, amu, kb +from zephyrus.diffusion import b_mixture +from zephyrus.knudsen import sigma_mixture + +# The branch evaluates escape where the gas is too rarefied to sustain a +# hydrodynamic wind, per species: +# +# - Upper structure: the Bates temperature profile +# T(zeta) = T_exo - (T_exo - T_top) exp(-gamma zeta), in the form Yelle +# (2024, Icarus 416, 116099, their Eq. 19) uses, anchored at the topmost +# supplied profile level and integrated hydrostatically in +# zeta = ln(p_top/p). Composition and mean mass are frozen at the anchor +# on the extension. Evaluating the exobase quantities on this extended, +# inflated structure rather than on photospheric values is essential: +# the exobase Jeans parameter can differ from the photospheric one by an +# order of magnitude, and using the latter biases rates toward false +# retention by up to three decades (Johnson et al. 2013, ApJL 768, L4). +# - Exobase: the first level where the Maxwell mean free path +# 1/(sqrt(2) sigma n) reaches the local scale height (the convention of +# Volkov et al. 2011), with the mixture cross section of the Knudsen +# switch. +# - Jeans escape per species: the effusion flux +# w_J = sqrt(kT / (2 pi m)) (1 + lambda) exp(-lambda) (Yelle 2024, +# Eq. 20), multiplied by the flat kinetic enhancement C(lambda) measured +# in direct simulation Monte Carlo runs: about 1.7 at lambda = 6 falling +# to about 1.4 at lambda = 15 (Volkov et al. 2011, ApJL 729, L24). Their +# companion bulk-velocity correction is deliberately not applied on top: +# the two express the same departure from equilibrium and applying both +# double-counts. Beyond lambda = 15 the factor is held at 1.4, a flagged +# extrapolation. +# - Diffusion-limited supply: Yelle (2024) Eqs. (9)-(11) discretized on the +# extension: the modified mixing ratio X-tilde grows by the exponential +# of the integrated (1 - m-tilde/m_bar) D/(D + K) factor, with the +# thermal diffusion factor alpha = -0.25 for light species (Yelle 2024, +# after Banks & Kockarts), and the limiting flux is the inverse of the +# resistance integral g. Binary coefficients come from the diffusion +# library ladder; Blanc's law combines pairs into the mixture value. +# - Combination: the harmonic mean of the Jeans and diffusion-limited +# fluxes, Phi = Phi_J Phi_l / (Phi_J + Phi_l) (Yelle 2024, Eq. 14), both +# referred to the anchor area (their Eq. 15). The dominant species has no +# supply limit (it supplies itself) and takes the Jeans flux alone. +# - Escape temperatures: T_esc,neutral = G M m / (2 kB r), the +# lambda = 2 criterion, and the plasma escape temperature at half that +# value because the ambipolar field shares the ion's binding with the +# electron (Chatterjee & Pierrehumbert 2026, arXiv:2412.05188, their +# Eq. 34); a hydrostatic exobase hotter than half the gating escape +# temperature is unstable (their Figure 10 criterion) and callers +# re-route such points to the hydrodynamic branch. +# +# Hydrostatic heavy-element rates are lower limits: the non-thermal +# channels (ion outflow, photochemical ejection, sputtering) that dominate +# heavy-species loss in this regime are not modeled; the +# ``hydrostatic_lower_limit`` flag travels with every result. + +ALPHA_THERMAL = -0.25 # thermal diffusion factor (Yelle 2024, after Banks & Kockarts) + +# Rates below one proton mass per Julian year are numerical artifacts on +# any planetary reservoir; species whose supply-free Jeans rate already +# sits below this floor skip the diffusion integrals (their harmonic-mean +# rate could only be smaller). +RATE_FLOOR_KG_S = 1.67262192369e-27 / 3.15576e7 + + +def volkov_flat_factor(lam: float) -> float: + """Kinetic enhancement C(lambda) on the Jeans flux, dimensionless. + + Direct simulation Monte Carlo runs exceed the Jeans flux by a factor + 1.7 near lambda = 6, falling to 1.4 by lambda = 15 (Volkov et al. + 2011); linear between, held at the endpoint values outside, where the + caller flags the extrapolation. + """ + if lam <= 6.0: + return 1.7 + if lam >= 15.0: + return 1.4 + return 1.7 + (1.4 - 1.7) * (lam - 6.0) / (15.0 - 6.0) + + +def jeans_effusion_velocity(T: float, m: float, lam: float) -> float: + """Jeans effusion velocity sqrt(kT/(2 pi m)) (1 + lambda) exp(-lambda), m/s.""" + return math.sqrt(kb * T / (2.0 * math.pi * m)) * (1.0 + lam) * math.exp(-lam) + + +def bates_extension( + profile, + M_p: float, + T_exo: float, + gamma: float = 0.75, + zeta_max: float = 40.0, + n_levels: int = 400, +) -> dict: + """Bates upper structure above the topmost profile level. + + Integrates the hydrostatic relation on the Bates temperature profile in + ``zeta = ln(p_top / p)`` with composition and mean mass frozen at the + anchor. The integration stops, flagged ``unbound``, where the local + Jeans parameter drops below 2: an isothermal-tail structure is unbound + beyond that point and the geometry belongs to the overflow and boil-off + machinery, not to a hydrostatic exosphere. + + Returns a dict of arrays over the extension (``zeta``, ``p``, ``r``, + ``T``, ``n``) plus the frozen ``mu`` [kg], the normalized species + ``vmr``, the anchor values ``p0`` and ``r0``, and ``unbound``. + """ + p0 = float(profile.p[-1]) + r0 = float(profile.r[-1]) + t_top = float(profile.T[-1]) + mu = float(profile.mmw[-1]) + vmr = { + sp: float(np.asarray(v)[-1]) + for sp, v in profile.vmr.items() + if float(np.asarray(v)[-1]) > 1e-8 + } + tot = sum(vmr.values()) + vmr = {sp: x / tot for sp, x in vmr.items()} + zeta = np.linspace(0.0, zeta_max, n_levels) + T = T_exo - (T_exo - t_top) * np.exp(-gamma * zeta) + r = np.empty(n_levels) + r[0] = r0 + unbound = False + last = n_levels - 1 + for i in range(n_levels - 1): + H = kb * T[i] * r[i] ** 2 / (G * M_p * mu) + r[i + 1] = r[i] + H * (zeta[i + 1] - zeta[i]) + lam_next = G * M_p * mu / (kb * T[i + 1] * r[i + 1]) + if lam_next < 2.0: + unbound = True + last = i + 1 + break + zeta, T, r = zeta[: last + 1], T[: last + 1], r[: last + 1] + p = p0 * np.exp(-zeta) + n = p / (kb * T) + return dict(zeta=zeta, p=p, r=r, T=T, n=n, mu=mu, vmr=vmr, p0=p0, r0=r0, unbound=unbound) + + +def find_exobase(ext: dict, M_p: float) -> tuple[int, dict]: + """Exobase index on the extension: mean free path equals scale height. + + Maxwell mean free path with the mixture cross section, against the + local scale height ``kB T r^2 / (G M mu)``. When the extension never + reaches that point the top level is used, flagged + ``exobase_not_reached``; an exobase at the anchor itself keeps one + integration interval so the supply integrals exist, flagged + ``exobase_at_anchor``. + """ + flags: dict = {} + idx = None + for i in range(len(ext['zeta'])): + sigma, _prov = sigma_mixture(ext['vmr'], float(ext['T'][i])) + mfp = 1.0 / (math.sqrt(2.0) * sigma * ext['n'][i]) + H = kb * ext['T'][i] * ext['r'][i] ** 2 / (G * M_p * ext['mu']) + if mfp >= H: + idx = i + break + if idx is None: + idx = len(ext['zeta']) - 1 + flags['exobase_not_reached'] = True + if idx == 0: + flags['exobase_at_anchor'] = True + idx = 1 + return idx, flags + + +def hydrostatic_rates( + profile, + M_p: float, + T_exo: float, + gamma_bates: float = 0.75, + kzz_default: float = 3.0e2, +) -> tuple[dict, dict]: + """Per-species hydrostatic escape mapped onto per-element rates [kg/s]. + + Builds the Bates extension at the prescribed exobase temperature, + locates the exobase, and combines the kinetic-corrected Jeans flux with + the diffusion-limited supply by the harmonic mean, species by species + (the module notes give the construction and its provenance). The + species are the ones the supplied profile carries at its top level (the + profile chemistry decides how atomized the exobase gas is); their rates + map onto elements stoichiometrically at output. + + The eddy diffusion coefficient comes from the profile's top level when + a ``kzz`` column is present, else ``kzz_default`` [m^2/s]. Species + whose supply-free Jeans rate already falls below one proton mass per + year skip the supply integrals (``pruned`` in the per-species detail): + the harmonic mean could only be smaller, and the cost of the integrals + dominates the branch on many-species profiles. + + Returns ``(per_element, detail)``; the detail dict carries the exobase + state, both escape temperatures, the per-species terms, coefficient + provenance, and flags (including ``hydrostatic_lower_limit``, which is + always on: non-thermal loss channels are absent). + """ + ext = bates_extension(profile, M_p, T_exo, gamma=gamma_bates) + i_x, flags = find_exobase(ext, M_p) + if ext.get('unbound'): + flags['extension_unbound'] = True + r_x, t_x, n_x = float(ext['r'][i_x]), float(ext['T'][i_x]), float(ext['n'][i_x]) + r_0 = float(ext['r0']) + comp = ext['vmr'] + m_bar = ext['mu'] + dominant = max(comp, key=comp.get) + + if profile.kzz is not None: + k_eddy = float(profile.kzz[-1]) + else: + k_eddy = kzz_default + + zeta = ext['zeta'][: i_x + 1] + T = ext['T'][: i_x + 1] + n = ext['n'][: i_x + 1] + + per_species_rate: dict = {} + detail_species: dict = {} + b_prov: dict = {} + for sp, x0 in comp.items(): + m_i = species_mass_amu(sp) * amu + lam_x = G * M_p * m_i / (kb * t_x * r_x) + w_j = jeans_effusion_velocity(t_x, m_i, lam_x) + c_enh = volkov_flat_factor(lam_x) + if lam_x > 15.0: + flags['volkov_extrapolated'] = True + + area = 4.0 * math.pi * r_0**2 + phi_jeans_unlimited = (r_x / r_0) ** 2 * c_enh * w_j * x0 * n_x + pruned = False + if sp == dominant: + x_tilde_x = x0 + phi_l = math.inf + elif area * m_i * phi_jeans_unlimited < RATE_FLOOR_KG_S: + # The supply-free rate is already numerically negligible; the + # harmonic mean with any supply limit is smaller still. + x_tilde_x = x0 + phi_l = math.inf + pruned = True + else: + int1 = 0.0 + g_int = 0.0 + x_tilde = x0 + for k in range(len(zeta) - 1): + dz = float(zeta[k + 1] - zeta[k]) + t_k = float(T[k]) + n_k = float(n[k]) + bmk, prov = b_mixture(sp, comp, t_k) + b_prov.update(prov) + d_mol = bmk / n_k + dtdz = (float(T[k + 1]) - t_k) / dz + m_tilde = m_i + ALPHA_THERMAL * dtdz * (m_bar / t_k) + int1 += (1.0 - m_tilde / m_bar) * (d_mol / (d_mol + k_eddy)) * dz + x_tilde = x0 * math.exp(min(int1, 700.0)) + g_int += ( + kb * t_k * r_0**2 / (x_tilde * n_k * G * M_p * m_bar * (d_mol + k_eddy)) + ) * dz + x_tilde_x = x_tilde + phi_l = 1.0 / g_int if g_int > 0.0 else math.inf + + phi_jeans = (r_x / r_0) ** 2 * c_enh * w_j * x_tilde_x * n_x + if math.isinf(phi_l): + phi = phi_jeans + else: + phi = phi_jeans * phi_l / (phi_jeans + phi_l) + per_species_rate[sp] = area * m_i * phi + detail_species[sp] = dict( + lambda_exo=lam_x, + w_jeans=w_j, + volkov_C=c_enh, + X_tilde_exo=x_tilde_x, + phi_per_area_r0=phi, + phi_jeans=phi_jeans, + phi_diffusion=phi_l, + dl_bypass=(sp == dominant), + pruned=pruned, + ) + + per_element: dict = {} + for sp, rate in per_species_rate.items(): + counts = parse_formula(sp) + m_sp = species_mass_amu(sp) + for el, cnt in counts.items(): + per_element[el] = per_element.get(el, 0.0) + rate * (cnt * ELEMENT_AMU[el] / m_sp) + + flags['dl_bypass'] = dominant + flags['hydrostatic_lower_limit'] = True + + t_esc_neutral = G * M_p * m_bar / (2.0 * kb * r_x) + t_esc_plasma = 0.5 * t_esc_neutral + lam_exo_bulk = G * M_p * m_bar / (kb * t_x * r_x) + + detail = dict( + r_exo=r_x, + T_exo=t_x, + n_exo=n_x, + r_anchor=r_0, + composition=comp, + dominant=dominant, + m_bar=m_bar, + species=detail_species, + per_species_rate=per_species_rate, + b_provenance=b_prov, + T_esc_neutral=t_esc_neutral, + T_esc_plasma=t_esc_plasma, + lambda_exo_bulk=lam_exo_bulk, + K_eddy=k_eddy, + flags=flags, + ) + return per_element, detail + + +def gate_unstable( + T_exo: float, detail: dict, gate: str, f_plus_exo: float +) -> tuple[bool, bool]: + """Escape-temperature gate on the hydrostatic branch. + + The hydrostatic equilibrium is unstable when the exobase temperature + exceeds half the gating escape temperature (the stability criterion of + Chatterjee & Pierrehumbert 2026, their Figure 10). ``gate`` selects the + neutral or the plasma escape temperature; both are always computed, and + the returned ``contested`` marks points where the two conventions + disagree, which is where the (unmodeled) ion physics decides the branch + assignment and both branch rates belong in the diagnostics. + ``f_plus_exo`` is carried for the caller's record and does not gate. + """ + un_neutral = T_exo > 0.5 * detail['T_esc_neutral'] + un_plasma = T_exo > 0.5 * detail['T_esc_plasma'] + unstable = un_plasma if gate == 'plasma' else un_neutral + return unstable, (un_neutral != un_plasma) diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py new file mode 100644 index 00000000..6d82abef --- /dev/null +++ b/tests/test_hydrostatic.py @@ -0,0 +1,302 @@ +"""Tests for ``src/zephyrus/hydrostatic.py``. + +Exercises the Bates upper structure, the kinetic-corrected Jeans escape, +the diffusion-limited supply, and the escape-temperature gate. The physical +invariants under test: + +- Reference pins: the Volkov et al. (2011) bulk-velocity correction reduces + to unity at rest with its printed linear coefficient across lambda 1 to + 106 (verifying that the flat factor and that correction are distinct + quantities that must not both be applied); the Yelle (2024) Figure 1 Mars + model, whose hydrogen flux the branch reproduces through the + Jeans-to-diffusion transition. +- Conservation: element rates sum to the species rates exactly. +- Closed forms: the escape-temperature identities and the gate semantics. +- Boundedness / error contract: the extension truncates flagged where it + becomes unbound; sub-floor trace species are pruned, never dropped. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import numpy as np +import pytest +from scipy.special import erfcx + +from zephyrus.constants import G, amu, kb +from zephyrus.hydrostatic import ( + bates_extension, + find_exobase, + gate_unstable, + hydrostatic_rates, + jeans_effusion_velocity, + volkov_flat_factor, +) +from zephyrus.profiles import Profile + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + +M_MARS = 6.4171e23 # kg (IAU nominal) +R_MARS = 3.3895e6 # m + + +def volkov_eq9_ratio(S, lam): + """Volkov et al. (2011, Phys. Fluids 23, 066601) Eq. (9) flux ratio. + + The modified-over-Jeans flux ratio for a drifting Maxwellian with speed + ratio S, in the exp(lambda)-factored form that stays stable at large + lambda (erfcx is the scaled complementary error function). + """ + se = math.sqrt(lam) + t1 = 0.5 * math.exp(-S * S) + t2 = (S * se + S * S - 0.5) * math.exp(2.0 * S * se - S * S) + t3 = math.sqrt(math.pi) * S**3 * erfcx(se - S) * math.exp(2.0 * S * se - S * S) + return (t1 + t2 + t3) / (S * S * (1.0 + lam)) + + +def c_lambda(lam): + """Closed-form linear coefficient of Eq. (9) about S = 0.""" + return (4.0 * lam**1.5 / 3.0 + 2.0 * math.sqrt(lam)) / (1.0 + lam) + math.sqrt( + math.pi + ) * erfcx(math.sqrt(lam)) / (1.0 + lam) + + +# Printed c(lambda) values of Volkov et al. (2011), Phys. Fluids table. +VOLKOV_C_TABLE = { + 1: 2.0456, + 3: 2.7254, + 6: 3.5536, + 10: 4.4355, + 15: 5.3410, + 60: 10.4126, + 106: 13.7917, +} + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_volkov_eq9_unity_limit_and_printed_coefficient(): + """Eq. (9) reduces to unity at rest with the printed linear coefficient. + + At zero bulk velocity the drifting-Maxwellian flux is the Jeans flux + exactly; the leading correction is linear in the speed ratio with the + printed c(lambda). Tolerance 6e-4: the published table itself carries + float wobble of that size at large lambda when evaluated naively, and + the stable erfcx form sits within it. + """ + for lam, c_ref in VOLKOV_C_TABLE.items(): + assert c_lambda(lam) == pytest.approx(c_ref, rel=6e-4), lam + r = volkov_eq9_ratio(1e-4, lam) + assert (r - 1.0) / 1e-4 == pytest.approx(c_lambda(lam), rel=2e-3) + assert volkov_eq9_ratio(1e-6, lam) == pytest.approx(1.0, abs=1e-4) + + +def test_volkov_flat_factor_shape_and_distinctness(): + """The flat kinetic factor has its measured shape, distinct from Eq. (9). + + C(lambda) runs from 1.7 at lambda = 6 to 1.4 at lambda = 15, is held at + the endpoints outside (the flagged extrapolation), and falls with + lambda, whereas the Eq. (9) bulk-velocity correction at fixed speed + ratio rises with lambda: opposite slopes, so the two corrections are + different quantities and applying both would double-count. + """ + assert volkov_flat_factor(6.0) == pytest.approx(1.7, rel=1e-12) + assert volkov_flat_factor(15.0) == pytest.approx(1.4, rel=1e-12) + assert volkov_flat_factor(50.0) == pytest.approx(1.4, rel=1e-12) # held + assert volkov_flat_factor(10.5) == pytest.approx(1.55, rel=0.01) + assert volkov_flat_factor(15.0) < volkov_flat_factor(6.0) + assert volkov_eq9_ratio(0.1, 15.0) > volkov_eq9_ratio(0.1, 6.0) + + +def _mars_profile(): + """Minimal profile ending at the Yelle (2024) Mars anchor level. + + Their fully specified model: p = 0.1 Pa at 80 km altitude, T = 100 K, + CO2 background carrying 10 ppm total hydrogen. + """ + r0 = R_MARS + 8.0e4 + p = np.array([10.0, 1.0, 0.1]) + T = np.full(3, 100.0) + mu = 44.0095 * amu + r = np.empty(3) + r[2] = r0 + for i in (1, 0): + H = kb * 100.0 * r[i + 1] ** 2 / (G * M_MARS * mu) + r[i] = r[i + 1] - H * math.log(p[i] / p[i + 1]) + vmr = {'CO2': np.full(3, 1.0 - 1e-5), 'H': np.full(3, 1e-5)} + return Profile(p=p, r=r, T=T, vmr=vmr, mmw=np.full(3, mu), kzz=None) + + +def _mars_h_flux(t_inf): + """Hydrogen number flux per anchor area, cm^-2 s^-1, at exobase T.""" + prof = _mars_profile() + per_el, det = hydrostatic_rates(prof, M_MARS, t_inf, gamma_bates=0.75, kzz_default=3.0e2) + rate = det['per_species_rate'].get('H', 0.0) + m_h = 1.008 * amu + return rate / m_h / (4.0 * math.pi * det['r_anchor'] ** 2) * 1e-4, det + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_yelle_figure1_mars_hydrogen_flux(): + """The branch reproduces the Yelle (2024) Figure 1 Mars hydrogen flux. + + On their fully specified Mars model the hydrogen escape flux is + diffusion limited above about 200 K exobase temperature, with a plateau + at 2.4e8 cm^-2 s^-1 (40 percent tolerance: the binary H-CO2 coefficient + source their calculation used is not pinned in the paper, and the + tabulated value here differs at that level). The transition to + Jeans-limited escape below about 150 K shows as a collapse; the 100 K + point sits on the exponential edge, so it is checked as a regime (an + order below the plateau), not as a value. + """ + f100, _ = _mars_h_flux(100.0) + f200, _ = _mars_h_flux(200.0) + f300, _ = _mars_h_flux(300.0) + f400, _ = _mars_h_flux(400.0) + assert f300 == pytest.approx(2.4e8, rel=0.4) + assert f400 / f300 == pytest.approx(1.0, abs=0.2) # saturated plateau + assert f200 / f400 > 0.5 + assert f100 / f400 < 0.07 # Jeans-limited collapse + + +@pytest.mark.physics_invariant +def test_escape_temperature_identities_and_gate(): + """Escape temperatures obey their defining identities; the gate splits. + + The neutral escape temperature is ``G M m / (2 kB r)`` at the exobase + and the plasma value is half of it exactly. Gate semantics: unstable + when the exobase temperature exceeds half the gating escape + temperature; points where only the plasma convention is exceeded are + contested (the ion physics decides them), reported through the second + return. + """ + prof = _mars_profile() + _per, det = hydrostatic_rates(prof, M_MARS, 300.0) + m = det['m_bar'] + r = det['r_exo'] + assert det['T_esc_neutral'] == pytest.approx(G * M_MARS * m / (2 * kb * r), rel=1e-12) + assert det['T_esc_plasma'] == pytest.approx(det['T_esc_neutral'] / 2.0, rel=1e-12) + det2 = dict(det, T_esc_neutral=500.0, T_esc_plasma=250.0) + # Gate thresholds: neutral at 250 K, plasma at 125 K exobase temperature. + assert gate_unstable(260.0, det2, 'neutral', 0.0) == (True, False) + assert gate_unstable(120.0, det2, 'neutral', 0.0) == (False, False) + assert gate_unstable(200.0, det2, 'neutral', 0.0) == (False, True) + assert gate_unstable(200.0, det2, 'plasma', 0.0) == (True, True) + + +@pytest.mark.physics_invariant +def test_element_mapping_conserves_mass_and_dominant_bypass(): + """Element rates sum to species rates; the dominant species self-supplies. + + Stoichiometric mapping conserves the total mass rate exactly. The + dominant species (CO2 here) has no diffusion-limited supply cap: it + supplies itself, so its diffusion flux is infinite and the bypass is + recorded. + """ + prof = _mars_profile() + per_el, det = hydrostatic_rates(prof, M_MARS, 300.0) + assert sum(per_el.values()) == pytest.approx( + sum(det['per_species_rate'].values()), rel=1e-9 + ) + assert det['flags']['dl_bypass'] == 'CO2' + assert math.isinf(det['species']['CO2']['phi_diffusion']) + assert det['species']['H']['dl_bypass'] is False + # The CO2 mass rate splits onto C and O in stoichiometric proportion. + rate_co2 = det['per_species_rate']['CO2'] + assert per_el['C'] + per_el['O'] + per_el['H'] == pytest.approx( + rate_co2 + det['per_species_rate']['H'], rel=1e-9 + ) + + +def test_extension_truncates_when_unbound_and_flags(): + """The Bates extension stops, flagged, where the structure unbinds. + + A very hot exobase temperature on a small planet drives the local Jeans + parameter below 2 within the extension; the arrays must stop there with + ``unbound`` set rather than integrating an unbound structure. A cool + case runs the full requested span. Radii grow strictly monotonically in + both cases. + """ + prof = _mars_profile() + hot = bates_extension(prof, M_MARS, 4000.0) + assert hot['unbound'] is True + assert len(hot['zeta']) < 400 + cool = bates_extension(prof, M_MARS, 200.0) + assert cool['unbound'] is False + assert len(cool['zeta']) == 400 + for ext in (hot, cool): + assert np.all(np.diff(ext['r']) > 0) + # The Bates profile approaches its asymptotic temperature from below. + assert cool['T'][-1] == pytest.approx(200.0, rel=1e-6) + assert cool['T'][0] == pytest.approx(100.0, rel=1e-9) + + +def test_exobase_locator_contract(): + """The exobase locator returns an interior index with sane flags. + + On the Mars model the exobase lies inside the extension (no flags); on + an artificially truncated extension the top level is used with + ``exobase_not_reached``; an exobase at the anchor keeps one interval + with ``exobase_at_anchor``. + """ + prof = _mars_profile() + ext = bates_extension(prof, M_MARS, 300.0) + i_x, flags = find_exobase(ext, M_MARS) + assert 0 < i_x < len(ext['zeta']) + assert flags == {} + truncated = {k: (v[:5] if isinstance(v, np.ndarray) else v) for k, v in ext.items()} + i_t, flags_t = find_exobase(truncated, M_MARS) + assert flags_t.get('exobase_not_reached') is True + assert i_t == 4 + # A very rarefied anchor puts the exobase at the anchor itself. + thin = dict(ext) + thin['n'] = ext['n'] * 1e-12 + i_a, flags_a = find_exobase(thin, M_MARS) + assert flags_a.get('exobase_at_anchor') is True + assert i_a == 1 + + +def test_trace_species_below_floor_are_pruned_not_dropped(): + """Sub-floor trace species skip the supply integrals but keep a rate. + + A species whose supply-free Jeans rate is already below one proton mass + per year is numerically negligible; the branch must skip its expensive + supply integrals (``pruned`` set) while still returning its (tiny, + non-negative) Jeans rate, so totality is preserved. A heavy trace + species on the cold Mars model is such a case. + """ + prof = _mars_profile() + vmr = { + 'CO2': prof.vmr['CO2'] - 1e-7, + 'H': prof.vmr['H'], + 'Kr': np.full(3, 1e-7), # heavy trace: Jeans rate far below the floor + } + prof2 = Profile(p=prof.p, r=prof.r, T=prof.T, vmr=vmr, mmw=prof.mmw, kzz=None) + per_el, det = hydrostatic_rates(prof2, M_MARS, 250.0) + assert det['species']['Kr']['pruned'] is True + assert det['species']['H']['pruned'] is False + assert det['per_species_rate']['Kr'] >= 0.0 + assert det['per_species_rate']['Kr'] < det['per_species_rate']['H'] + # Conservation still holds with the pruned species included. + assert sum(per_el.values()) == pytest.approx( + sum(det['per_species_rate'].values()), rel=1e-9 + ) + + +@pytest.mark.physics_invariant +def test_jeans_effusion_velocity_shape(): + """The effusion velocity carries the (1 + lambda) exp(-lambda) shape. + + Exact two-point ratio in lambda at fixed temperature and mass, and the + thermal-speed prefactor scales as sqrt(T/m): heavier species at the + same temperature effuse more slowly on both counts. + """ + T, m = 300.0, 1.008 * amu + v5 = jeans_effusion_velocity(T, m, 5.0) + v10 = jeans_effusion_velocity(T, m, 10.0) + assert v10 / v5 == pytest.approx((11.0 / 6.0) * math.exp(-5.0), rel=1e-12) + v_heavy = jeans_effusion_velocity(T, 16 * m, 5.0) + assert v5 / v_heavy == pytest.approx(4.0, rel=0.01) # sqrt(16) prefactor + assert v_heavy > 0.0 From c3f7abcb942ae0159646f9f56103efa0039540ed Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:31:31 +0200 Subject: [PATCH 011/113] Add the simultaneous N-species fractionation closure with its verification suite --- src/zephyrus/fractionation.py | 280 +++++++++++++++ tests/test_fractionation.py | 496 ++++++++++++++++++++++++++ tests/test_fractionation_ensembles.py | 370 +++++++++++++++++++ 3 files changed, 1146 insertions(+) create mode 100644 src/zephyrus/fractionation.py create mode 100644 tests/test_fractionation.py create mode 100644 tests/test_fractionation_ensembles.py diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py new file mode 100644 index 00000000..6e10db1d --- /dev/null +++ b/src/zephyrus/fractionation.py @@ -0,0 +1,280 @@ +""" +!!! info "`fractionation.py`" + Simultaneous N-species fractionation closure for a hydrodynamic wind.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +import numpy as np + +from zephyrus.composition import ELEMENT_AMU +from zephyrus.constants import G, kb_cgs +from zephyrus.diffusion import ROCK_FORMERS, bmatrix, build_rows, masses_g + +# The closure generalizes the two-species fractionation of Hunten, Pepin & +# Wallace (1987, Icarus 69, 532) to N species escaping simultaneously +# through mutual binary diffusion, the constant-composition closure of the +# subsonic multispecies wind system of Zahnle et al. (1990, Icarus 84, +# 502), with active-set dropout: at a given total mass flux the heavy +# species partition into an escaping (active) set and a retained set, and +# the retained species exert drag without escaping. The solved system, per +# active species j (w_j = Phi_j / X_j the species velocity scale): +# +# sum_{i active} X_i (w_i - w_j) / b_ij +# - w_j sum_{k retained} X_k / b_jk = m_j g0 / kT - C, +# +# plus the mass constraint sum_j m_j X_j Phi_j... i.e. +# sum_{j active} m_j X_j w_j = phi, with C the common inverse scale height +# of the escaping gas (the Lagrange multiplier of the constraint). The +# Karush-Kuhn-Tucker conditions select the active set: active species have +# strictly positive w, and retained species satisfy the retention +# inequality (the drift the escaping gas would impose on them does not +# exceed their gravitational settling). +# +# Exact reductions verified in the companion test suite: the two-species +# limit of Hunten et al. (1987) in the form of Cherubim & Wordsworth +# (2024, ApJ 967, 139, Eqs. 7-9); the three-species deuterium system of Gu +# & Chen (2023, Eqs. 4, 8, 9, 12); the trace-minor relations of Odert et +# al. (2018, Icarus 307, 327, Eq. 5) and Zahnle et al. (1990, Eqs. 35, 36, +# 42); the non-trace three-species relations of Zahnle & Kasting (2023, +# GeCoA 361, 228, Eqs. 19-20); the prescribed-flux partition of +# Chassefiere (1996, Icarus 124, 537, Eqs. 1, 6, 7); the universal-b +# closed form; and the Hunten et al. (1987) Earth, Mars, and Venus +# numerical anchors. +# +# Solver units are cgs (the convention of the source literature and the +# diffusion library): phi in g cm^-2 s^-1, m in g, g0 in cm s^-2, b in +# cm^-1 s^-1, fluxes in cm^-2 s^-1. The public per-species interface +# converts from and to SI at the boundary. + + +def _validate_inputs(phi, X, m, T, g0, b): + X, m, b = np.asarray(X, float), np.asarray(m, float), np.asarray(b, float) + n = len(X) + if phi < 0: + raise ValueError('phi must be >= 0') + if np.any(X < 0) or abs(X.sum() - 1.0) > 1e-6: + raise ValueError('X must be non-negative and sum to 1') + if np.any(m <= 0) or T <= 0 or g0 <= 0: + raise ValueError('m, T, g0 must be positive') + off = ~np.eye(n, dtype=bool) + if not np.all(np.isfinite(b[off])) or np.any(b[off] <= 0): + raise ValueError('off-diagonal b entries must be finite and positive') + if not np.array_equal(b[off], b.T[off]): + raise ValueError('b must be symmetric') + return X, m, b + + +def solve_fixed_active(phi, X, m, T, g0, b, active): + """Solve the linear closure on a fixed active set. + + Unknowns: ``w_j`` for j in ``active`` and the common inverse scale + height ``C``. Returns ``(w_full, C)`` with ``w = 0`` for retained + species. The single-active case is solved analytically; the general + case with two-sided diagonal equilibration, which controls the spread + of roughly 25 decades the matrix entries can span between light-species + drag terms and heavy-species mass terms. + """ + kT = kb_cgs * T + act = sorted(active) + ret = [k for k in range(len(X)) if k not in active] + na = len(act) + if na == 1: + j = act[0] + w = np.zeros(len(X)) + w[j] = phi / (m[j] * X[j]) + C = m[j] * g0 / kT + w[j] * sum(X[k] / b[j, k] for k in ret) + return w, C + mat = np.zeros((na + 1, na + 1)) + rhs = np.zeros(na + 1) + for row, j in enumerate(act): + diag = 0.0 + for col, i in enumerate(act): + if i == j: + continue + mat[row, col] += X[i] / b[i, j] + diag += X[i] / b[i, j] + for k in ret: + diag += X[k] / b[j, k] + mat[row, row] -= diag + mat[row, na] = 1.0 # the +C column + rhs[row] = m[j] * g0 / kT + for col, j in enumerate(act): + mat[na, col] = m[j] * X[j] + rhs[na] = phi + # Two-sided equilibration: D_r M D_c y = D_r rhs, solution = D_c y. + dr = 1.0 / np.max(np.abs(mat), axis=1) + ms = mat * dr[:, None] + dc = 1.0 / np.max(np.abs(ms), axis=0) + ms = ms * dc[None, :] + sol = dc * np.linalg.solve(ms, rhs * dr) + w = np.zeros(len(X)) + for col, j in enumerate(act): + w[j] = sol[col] + return w, sol[na] + + +def solve_closure(phi, X, m, T, g0, b, return_diag=False): + """Active-set solution of the N-species fractionation closure. + + Parameters + ---------- + phi : float + Total mass flux at the base [g cm^-2 s^-1], non-negative. + X : array + Mole fractions, non-negative, summing to 1. + m : array + Particle masses [g]. + T : float + Temperature [K]. + g0 : float + Gravity at the base [cm s^-2]. + b : array + Symmetric matrix of binary diffusion parameters [cm^-1 s^-1], + diagonal ignored (conventionally np.inf). + return_diag : bool + When True, also return the multiplier ``C`` and the active set. + + Returns + ------- + Phi : array + Number fluxes [cm^-2 s^-1], guaranteed non-negative and satisfying + ``sum m_i Phi_i = phi``. For ``phi = 0`` the fluxes are zero, the + active set empty, and ``C`` the continuous limit + ``min_j m_j g0 / kT``. + """ + X, m, b = _validate_inputs(phi, X, m, T, g0, b) + kT = kb_cgs * T + n = len(X) + if phi == 0.0: + flux = np.zeros(n) + if return_diag: + return flux, np.min(m) * g0 / kT, frozenset() + return flux + active = set(range(n)) + wscale = phi / np.min(m) # crude magnitude scale for the tolerances + for _ in range(4 * n + 8): + w, C = solve_fixed_active(phi, X, m, T, g0, b, active) + neg = {j for j in active if w[j] < -1e-12 * wscale} + if neg: + active -= neg + if not active: + raise RuntimeError('empty active set') + continue + # Retention check for the inactive species. + viol, worst = None, 0.0 + for k in range(n): + if k in active: + continue + r_k = sum(X[i] * w[i] / b[i, k] for i in active) - (m[k] * g0 / kT - C) + if r_k > 1e-12 * abs(m[k] * g0 / kT) and r_k > worst: + viol, worst = k, r_k + if viol is None: + # Clamp within-tolerance negative drifts (magnitudes below the + # solver's own tolerance) so the returned fluxes honor w >= 0. + np.maximum(w, 0.0, out=w) + flux = X * w + flux[list(set(range(n)) - active)] = 0.0 + if return_diag: + return flux, C, frozenset(active) + return flux + active.add(viol) + raise RuntimeError('active-set iteration did not converge') + + +def first_threshold(X, m, T, g0, b): + """Mass flux at which the first heavy species entrains, in g cm^-2 s^-1. + + Below this flux only the lightest species escapes; the value is the + smallest crossover over the heavier species of the multi-background + drag balance. + """ + kT = kb_cgs * T + light = int(np.argmin(m)) + best = np.inf + for k in range(len(X)): + if k == light: + continue + denom = X[light] / b[light, k] + sum( + X[kk] / b[light, kk] for kk in range(len(X)) if kk != light + ) + w_star = (m[k] - m[light]) * g0 / kT / denom + best = min(best, m[light] * X[light] * w_star) + return best + + +def closure_per_species( + mdot: float, element_fractions: dict, T_wind: float, M_p: float, r_base: float +) -> tuple[dict, dict, dict]: + """Per-element escape rates [kg/s] from the closure at the wind base. + + SI boundary around the cgs solver: the bulk rate ``mdot`` [kg/s] + converts to the base mass flux, the closure partitions it over the + atomized composition with the binary-diffusion library coefficients, + and the number fluxes convert back to per-element mass rates that sum + to the bulk rate. Rock-forming species (Na, Mg, Si, Fe) raise the + ``rock_former_bij`` flag: their coefficients sit in the widest + provenance class, and Na and Mg ionize where rock vapor exists while + these are neutral-gas coefficients. + + Returns ``(per_element, diagnostics, flags)`` with the diagnostics + carrying the active set, the retained species, the multiplier, the + relative mass-conservation residual, and the per-pair coefficient + provenance. + """ + flags: dict = {} + species = sorted(element_fractions, key=lambda el: ELEMENT_AMU[el]) + X = np.array([element_fractions[el] for el in species], float) + X = X / X.sum() + m_g = masses_g(species) + rows = build_rows(species) + b = bmatrix(species, T_wind, rows=rows) + prov = {f'{r.i}-{r.j}': (r.provenance, r.uncertainty) for r in rows} + if any(el in ROCK_FORMERS for el in species): + flags['rock_former_bij'] = [el for el in species if el in ROCK_FORMERS] + + g0_cgs = (G * M_p / r_base**2) * 1e2 # m/s^2 -> cm/s^2 + phi_cgs = (mdot / (4.0 * math.pi * r_base**2)) * 0.1 # kg/m^2/s -> g/cm^2/s + + flux, C, active = solve_closure(phi_cgs, X, m_g, T_wind, g0_cgs, b, return_diag=True) + area_cm2 = 4.0 * math.pi * (r_base * 1e2) ** 2 + per_element = { + el: float(flux[k]) * area_cm2 * float(m_g[k]) * 1e-3 for k, el in enumerate(species) + } + + total = sum(per_element.values()) + conservation = abs(total - mdot) / mdot if mdot > 0 else 0.0 + diag = dict( + active_set=sorted(species[k] for k in active), + retained=[el for el in species if el not in {species[k] for k in active}], + C_inv_scale_height_cgs=float(C), + mass_conservation_rel=float(conservation), + b_provenance=prov, + ) + return per_element, diag, flags + + +def unfractionated_split( + mdot: float, reservoirs: dict | None, element_fractions: dict +) -> tuple[dict, dict]: + """Split a bulk rate over elements without fractionation. + + The protocol of the energy-limited path: reservoir mass fractions when + reservoir masses are supplied; otherwise the mass fractions of the + atomized wind-base composition, with the ``split_from_base_composition`` + flag recording the substitution. The split conserves the bulk rate + exactly. + """ + flags: dict = {} + if reservoirs: + tot = sum(reservoirs.values()) + fracs = {el: mass / tot for el, mass in reservoirs.items()} + else: + flags['split_from_base_composition'] = True + mass = {el: x * ELEMENT_AMU[el] for el, x in element_fractions.items()} + tot = sum(mass.values()) + fracs = {el: mm / tot for el, mm in mass.items()} + return {el: mdot * f for el, f in fracs.items()}, flags diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py new file mode 100644 index 00000000..5eb213cd --- /dev/null +++ b/tests/test_fractionation.py @@ -0,0 +1,496 @@ +"""Tests for ``src/zephyrus/fractionation.py``: exact reductions and anchors. + +The closure must reproduce, exactly or at the published values, every +special case of the escape-fractionation lineage it generalizes: + +- The three-species deuterium system of Gu & Chen (2023): the escaping and + retained-helium branches, both critical rates, and the helium admixture + factor on the deuterium threshold (also the ternary limit of Cherubim & + Wordsworth 2024, their Eq. 11). +- The trace-minor relations of Odert et al. (2018, Eq. 5) and Zahnle et + al. (1990, Eqs. 35, 36, 42), including the adjudication that the earlier + Zahnle & Kasting (1986) Eq. (36) drag-deficit weighting is NOT + reproduced. +- The non-trace three-species relations of Zahnle & Kasting (2023, + Eqs. 19-20). +- The prescribed-flux partition of Chassefiere (1996, Eqs. 1, 6, 7). +- The universal-b closed form and the Hunten et al. (1987) Earth, Mars, + and Venus numerical anchors. +- Low-flux collapse onto the lightest species and the zero-flux limit. +- The SI shim: per-element rates conserve the bulk rate at machine + precision, and rock-forming species raise their provenance flag. + +The randomized ensemble sweeps (global properties across thresholds, +brute-force active-set uniqueness, fixed-point stability) live in the +smoke-tier companion ``tests/test_fractionation_ensembles.py``. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import numpy as np +import pytest + +from zephyrus.constants import kb_cgs +from zephyrus.fractionation import ( + closure_per_species, + first_threshold, + solve_closure, + unfractionated_split, +) +from zephyrus.planets_parameters import Me, Re + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + +AMU_G = 1.66053907e-24 # g + + +def test_input_validation_error_contract(): + """Malformed solver inputs raise; a valid call on the same path returns. + + Negative flux, mole fractions off unit sum, non-positive masses, and an + asymmetric coefficient matrix are not physically posed inputs and must + raise ``ValueError`` rather than return a partial solution. + """ + m = np.array([1.0, 16.0]) * AMU_G + X = np.array([0.8, 0.2]) + b = np.array([[np.inf, 1e19], [1e19, np.inf]]) + with pytest.raises(ValueError, match='phi'): + solve_closure(-1.0, X, m, 400.0, 980.0, b) + with pytest.raises(ValueError, match='sum to 1'): + solve_closure(1e-10, np.array([0.8, 0.4]), m, 400.0, 980.0, b) + with pytest.raises(ValueError, match='positive'): + solve_closure(1e-10, X, -m, 400.0, 980.0, b) + b_asym = np.array([[np.inf, 1e19], [2e19, np.inf]]) + with pytest.raises(ValueError, match='symmetric'): + solve_closure(1e-10, X, m, 400.0, 980.0, b_asym) + flux = solve_closure(1e-10, X, m, 400.0, 980.0, b) + assert np.all(flux >= 0.0) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_ternary_deuterium_reductions(): + """The H-He-D system reproduces the Gu & Chen (2023) relations exactly. + + With helium escaping, the trace-deuterium flux matches their Eq. (4) + (equivalently Cherubim & Wordsworth 2024, Eq. 11); with helium + retained, their Eq. (8); the activation thresholds match their two + critical rates including the (1 + alpha_2 X_He/X_H)^-1 helium factor + on the deuterium threshold, which must lower it relative to the + helium-free case (the discrimination guard on the factor's sign). + """ + m = np.array([1.0, 4.0, 2.0]) * AMU_G # H, He, D (trace) + T, g0 = 1000.0, 1000.0 + kT = kb_cgs * T + b12 = 1.04e18 * T**0.732 # H-He (Zahnle & Kasting 1986 lineage) + b13 = 7.183e17 * T**0.728 # H-D (Genda & Ikoma 2008) + b23 = 5.087e17 * T**0.728 # He-D (scaled) + b = np.array([[np.inf, b12, b13], [b12, np.inf, b23], [b13, b23, np.inf]]) + x3 = 1e-13 # the printed formulas are O(X_trace) truncations + x2 = 0.15 + x1 = 1 - x2 - x3 + X = np.array([x1, x2, x3]) + a2, a3 = b13 / b12, b13 / b23 + phi_dl_he = b12 * (m[1] - m[0]) * g0 / kT + phi_dl_d = b13 * (m[2] - m[0]) * g0 / kT + phi_crit_he = m[0] * x1 * phi_dl_he + phi_crit_d = m[0] * phi_dl_d / (1 + a2 * x2 / x1) + + # (a) Supercritical: He escaping, trace D follows their Eq. (4). + for frac in (1.5, 5.0, 50.0): + flux = solve_closure(frac * phi_crit_he, X, m, T, g0, b) + f2, f3 = x2 / x1, x3 / x1 + ref = f3 * (flux[0] + a3 * flux[1] + a2 * phi_dl_he * x2 - phi_dl_d) / (1 + a3 * f2) + assert flux[2] == pytest.approx(ref, rel=1e-11), frac + + # (b) Subcritical He (retained), D escaping: their Eq. (8). + for frac in (1.5, 3.0): + phi = frac * phi_crit_d + if phi >= phi_crit_he: + continue + flux = solve_closure(phi, X, m, T, g0, b) + assert flux[1] == pytest.approx(0.0, abs=0.0) + ref = x3 * (flux[0] * (1 + a2 * x2 / x1) - phi_dl_d) / (x1 + a3 * x2) + assert flux[2] == pytest.approx(ref, rel=1e-11), frac + + # (c) Both activation thresholds are sharp at the printed critical rates. + eps = 1e-6 + assert solve_closure(phi_crit_he * (1 - eps), X, m, T, g0, b)[1] == 0.0 + assert solve_closure(phi_crit_he * (1 + eps), X, m, T, g0, b)[1] > 0.0 + assert solve_closure(phi_crit_d * (1 - eps), X, m, T, g0, b)[2] == 0.0 + assert solve_closure(phi_crit_d * (1 + eps), X, m, T, g0, b)[2] > 0.0 + + # (d) The He admixture lowers the D threshold by (1 + a2 X_He/X_H)^-1. + tiny = 1e-14 + x_b = np.array([1 - x3 - tiny, tiny, x3]) + phi_crit_d_no_he = m[0] * phi_dl_d / (1 + a2 * tiny / x_b[0]) + assert solve_closure(phi_crit_d_no_he * (1 + eps), x_b, m, T, g0, b)[2] > 0.0 + assert solve_closure(phi_crit_d_no_he * (1 - eps), x_b, m, T, g0, b)[2] == 0.0 + assert phi_crit_d < phi_crit_d_no_he + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_two_majors_trace_minor_relations(): + """Two escaping majors with trace minors reproduce the printed relations. + + With H and O both escaping, each entrained trace minor obeys Odert et + al. (2018, Eq. 5), which equals Zahnle et al. (1990, Eq. 35); where the + printed formula goes negative the closure returns exactly zero (the + clamp those authors themselves prescribe); at the O limiting flux the + light minor follows Zahnle et al. (1990, Eq. 36). The adjudication + guard: the earlier Zahnle & Kasting (1986, Eq. 36) drag-deficit + weighting must NOT be reproduced (it deviates by more than 5 percent + somewhere in the sweep), which discriminates the two printed variants. + """ + m = np.array([1.0, 16.0, 12.0, 36.0]) * AMU_G # H, O majors; C, Ar traces + T, g0 = 400.0, 980.0 + kT = kb_cgs * T + b12 = 4.8e17 * T**0.75 + b_hc, b_har = 8.0e17 * T**0.70, 1.06e18 * T**0.597 + b_oc, b_oar = 9.0e16 * T**0.80, 5.61e16 * T**0.841 + b_car = 8.0e16 * T**0.78 + b = np.array( + [ + [np.inf, b12, b_hc, b_har], + [b12, np.inf, b_oc, b_oar], + [b_hc, b_oc, np.inf, b_car], + [b_har, b_oar, b_car, np.inf], + ] + ) + x_tr = 1e-13 + n_cmp = 0 + zk_dev = 0.0 + for f2 in (0.1, 0.5, 1.0, 2.0): + x2 = f2 / (1 + f2) * (1 - 2 * x_tr) + x1 = 1 - x2 - 2 * x_tr + X = np.array([x1, x2, x_tr, x_tr]) + philim = m[0] * x1 * b12 * (m[1] - m[0]) * g0 / kT / (x1 + x2) + for frac in (1.3, 3.0, 10.0, 100.0): + flux = solve_closure(frac * philim, X, m, T, g0, b) + w1, w2 = flux[0] / x1, flux[1] / x2 + x2_rel = w2 / w1 + f1_flux = flux[0] + for k, b1k, b2k in ((2, b_hc, b_oc), (3, b_har, b_oar)): + xk = (flux[k] / x_tr) / w1 + xk_ref = ( + 1 + - g0 * (m[k] - m[0]) * b1k / (f1_flux * kT) + + (b1k / b12) * f2 * (1 - x2_rel) + + (b1k / b2k) * f2 * x2_rel + ) / (1 + (b1k / b2k) * f2) + if xk_ref > 1e-6: + n_cmp += 1 + assert xk == pytest.approx(xk_ref, rel=1e-11), (f2, frac, k) + mu2 = m[1] / m[0] + xk_zk = ( + 1 + - g0 * (m[k] - m[0]) * b1k / (f1_flux * kT) + + (b1k / b12) * f2 * (1 + f2) * (1 - x2_rel) / (mu2 + f2) + + (b1k / b2k) * f2 * x2_rel + ) / (1 + (b1k / b2k) * f2) + if x2_rel < 0.99: + zk_dev = max(zk_dev, abs(xk_zk - xk) / xk) + elif xk_ref < -1e-6: + assert flux[k] == pytest.approx(0.0, abs=0.0), (f2, frac, k) + # At the limiting flux (O marginally retained) the light minor + # follows Zahnle et al. (1990, Eq. 36). + flux = solve_closure(philim * (1 - 1e-9), X, m, T, g0, b) + x3 = (flux[2] / x_tr) / (flux[0] / x1) + x3_z90 = ( + 1 + - (m[2] - m[0]) / (m[1] - m[0]) * (b_hc / b12) + + (m[1] - m[2]) / (m[1] - m[0]) * (b_hc / b12) * f2 + ) / (1 + (b_hc / b_oc) * f2) + assert x3 == pytest.approx(x3_z90, rel=2e-8), f2 + assert n_cmp >= 8 # enough entrained comparisons to be meaningful + assert zk_dev > 0.05 # the 1986 variant is resolvably not reproduced + + +@pytest.mark.reference_pinned +def test_first_entrainment_with_two_retained_heavies(): + """The first-entrainment threshold matches Zahnle et al. (1990, Eq. 42). + + H2 escaping through retained CO2 and N2: their Eq. (42) gives the + per-background thresholds; whichever is smaller names the species that + entrains first, sharply, while the other stays retained on both sides. + """ + m = np.array([2.0, 44.0, 28.0]) * AMU_G + T, g0 = 400.0, 373.0 + kT = kb_cgs * T + b12 = 2.3e17 * T**0.75 + b13 = 2.65e17 * T**0.75 + b23 = 1e17 * T**0.75 + b = np.array([[np.inf, b12, b13], [b12, np.inf, b23], [b13, b23, np.inf]]) + f2, f3 = 1.0, 0.5 + x1 = 1 / (1 + f2 + f3) + X = np.array([x1, f2 * x1, f3 * x1]) + phi12 = b12 * (m[1] - m[0]) * g0 / kT / (1 + f2 + (b12 / b13) * f3) + phi13 = b13 * (m[2] - m[0]) * g0 / kT / (1 + f3 + (b13 / b12) * f2) + phi_thresh = m[0] * min(phi12, phi13) + eps = 1e-6 + flux_lo = solve_closure(phi_thresh * (1 - eps), X, m, T, g0, b) + flux_hi = solve_closure(phi_thresh * (1 + eps), X, m, T, g0, b) + idx = 1 if phi12 < phi13 else 2 + assert flux_lo[idx] == pytest.approx(0.0, abs=0.0) + assert flux_hi[idx] > 0.0 + assert flux_lo[3 - idx] == pytest.approx(0.0, abs=0.0) + # The library's own first_threshold agrees with the printed expression. + assert first_threshold(X, m, T, g0, b) == pytest.approx(phi_thresh, rel=1e-9) + + +@pytest.mark.reference_pinned +def test_zk23_nontrace_ternary_relations(): + """Non-trace H, O, CO2 reproduce Zahnle & Kasting (2023, Eqs. 19-20). + + Their Eq. (19): the oxygen-crossover flux of hydrogen escaping alone + over a retained CO2 background, checked in closed form to machine + precision and through the solver's own bisected activation threshold + (whose residual floor is the solver's active-set tolerance, bounded at + 1e-9). Their Eq. (20): with H and O both escaping and CO2 static, the + printed difference relation holds at every flux inside the two-species + band, not only at an endpoint. + """ + m = np.array([1.0, 16.0, 44.0]) * AMU_G + T, g0 = 1000.0, 870.0 + kT = kb_cgs * T + b12 = 4.8e17 * T**0.75 + b14 = 6.0e19 * (T / 1000.0) ** 0.75 # their Table 2 H-CO2 row + b24 = 5.0e16 * T**0.75 # plausible heavy-heavy value; Eqs. 19-20 are identities in it + b = np.array([[np.inf, b12, b14], [b12, np.inf, b24], [b14, b24, np.inf]]) + + for f4 in (0.1, 0.5): + for r21 in (0.5, 2.0): + f2 = (1 - f4) * r21 / (1 + r21) + f1 = 1 - f4 - f2 + X = np.array([f1, f2, f4]) + zk19 = (m[1] - m[0]) * g0 * b12 / kT / (1 + f4 * (b12 / b14 - 1)) + phi_star = f1 * (m[1] - m[0]) * g0 / kT / ((f1 + f2) / b12 + f4 / b14) + assert phi_star / f1 == pytest.approx(zk19, rel=1e-13), (f4, r21) + ph1 = first_threshold(X, m, T, g0, b) + th = _activation_threshold(1, X, m, T, g0, b, ph1 * 1e-4, ph1 * 1e3) + assert (th / m[0]) / f1 == pytest.approx(zk19, rel=1e-9), (f4, r21) + eps = 1e-6 + _, _, lo_act = solve_closure(th * (1 - eps), X, m, T, g0, b, return_diag=True) + _, _, hi_act = solve_closure(th * (1 + eps), X, m, T, g0, b, return_diag=True) + assert lo_act == frozenset({0}) + assert hi_act == frozenset({0, 1}) # O entrains here, not CO2 + + for f4 in (0.2, 0.6): + f2 = (1 - f4) / 2 + f1 = 1 - f4 - f2 + X = np.array([f1, f2, f4]) + ph1 = first_threshold(X, m, T, g0, b) + th_o = _activation_threshold(1, X, m, T, g0, b, ph1 * 1e-4, ph1 * 1e3) + th_c = _activation_threshold(2, X, m, T, g0, b, ph1 * 1e-4, ph1 * 1e6) + for frac in (0.2, 0.5, 0.9): + phi = th_o * (th_c / th_o) ** frac + flux, _c, act = solve_closure(phi, X, m, T, g0, b, return_diag=True) + assert act == frozenset({0, 1}), (f4, frac) + lhs = flux[0] * (1 + f2 / f1 + (f4 / f1) * (b12 / b14)) - flux[1] * ( + 1 + f1 / f2 + (f4 / f2) * (b12 / b24) + ) + rhs = g0 * (m[1] - m[0]) * b12 / kT + assert lhs == pytest.approx(rhs, rel=1e-12), (f4, frac) + + +def _activation_threshold(k, X, m, T, g0, b, lo, hi, niter=100): + """Mass flux at which the solver first admits species k, by bisection.""" + for _ in range(niter): + mid = np.sqrt(lo * hi) + if k in solve_closure(mid, X, m, T, g0, b, return_diag=True)[2]: + hi = mid + else: + lo = mid + return np.sqrt(lo * hi) + + +@pytest.mark.reference_pinned +def test_chassefiere_prescribed_flux_partition(): + """The binary partition reproduces Chassefiere (1996, Eqs. 1, 6, 7). + + His crossover mass ``m_c = m_1 + kT F_1 / (b g X_1)`` evaluated at the + threshold flux equals the heavy mass exactly (his dropout test and the + closure's threshold are the same statement), and above threshold the + solved split satisfies his Eqs. (1) and (6) to machine precision at + every draw. His small-mass approximation Eq. (12) is deliberately not + asserted: it deviates by up to a factor of a few, as its own stated + approximation requires. + """ + rng = np.random.default_rng(112) + for _ in range(60): + m1 = AMU_G * 1.0 + m2 = m1 * rng.uniform(2, 40) + r21 = rng.choice([0.2, 0.5, 1.0, 2.0]) + x2 = r21 / (1 + r21) + x1 = 1 - x2 + T = rng.uniform(300, 2000) + g0 = rng.uniform(300, 1500) + b12 = 4.8e17 * T**0.75 + b = np.array([[np.inf, b12], [b12, np.inf]]) + kT = kb_cgs * T + X, mm = np.array([x1, x2]), np.array([m1, m2]) + phi_c = b12 * x1 * (m2 - m1) * m1 * g0 / kT + f1_c = solve_closure(phi_c, X, mm, T, g0, b)[0] + assert m1 + kT * f1_c / (b12 * g0 * x1) == pytest.approx(m2, rel=1e-12) + for frac in (1.2, 2.0, 10.0, 100.0): + f1, f2 = solve_closure(frac * phi_c, X, mm, T, g0, b) + f1_ref = frac * phi_c / m1 # his Eq. (5) + mc = m1 + kT * f1 / (b12 * g0 * x1) # his Eq. (7) + pred6 = 1.0 / (1 + (x2 / x1) * (m2 / m1) * (mc - m2) / (mc - m1)) + assert f1 / f1_ref == pytest.approx(pred6, rel=1e-12) + pred1 = (x2 / x1) * f1 * (mc - m2) / (mc - m1) # his Eq. (1) + assert f2 == pytest.approx(pred1, rel=1e-12) + + +@pytest.mark.physics_invariant +def test_universal_b_closed_form(): + """With one common coefficient the fluxes take the analytic closed form. + + When every pair shares one b the fully entrained solution is + ``Phi_j = X_j [Phi_tot - (b g0 / kT)(m_j - m_bar)]``: the flux excess + over the mean follows the mass deviation linearly. Exact to 1e-10, + which any indexing or drag-bookkeeping error breaks. + """ + rng = np.random.default_rng(105) + n = 6 + m = np.sort(rng.uniform(1, 50, n)) * AMU_G + X = rng.dirichlet(np.ones(n)) + T, g0 = 800.0, 1500.0 + kT = kb_cgs * T + bval = 2e17 * T**0.75 + b = np.full((n, n), bval) + np.fill_diagonal(b, np.inf) + mbar = np.sum(m * X) + var = np.sum(X * (m - mbar) ** 2) + beta = bval * g0 / kT + w_needed = beta * (np.max(m) - mbar) * 2 + phi = mbar * w_needed * 4 + flux = solve_closure(phi, X, m, T, g0, b) + phi_tot = (phi + beta * var) / mbar + ref = X * (phi_tot - beta * (m - mbar)) + np.testing.assert_allclose(flux, ref, rtol=0, atol=1e-10 * np.max(ref)) + # Conservation on top of the closed form. + assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12) + + +@pytest.mark.reference_pinned +def test_hunten_anchors_earth_mars_venus(): + """The printed Hunten et al. (1987) worked anchors are reproduced. + + Their Earth (crossover mass 140 amu at reference flux 8.1e13 + cm^-2 s^-1), Mars (130 amu, 2.9e13), and Venus (2e11 giving crossover + mass 1.35 amu) numbers follow from the threshold relation with their + stated b, g, and T = 400 K; the solver's own activation threshold on a + trace heavy over pure light gas reproduces each within 1 percent. + """ + kt400 = kb_cgs * 400.0 + f1_earth = (140 - 1) * AMU_G * 2e19 * 980 / kt400 + assert f1_earth == pytest.approx(8.1e13, rel=0.02) + f1_mars = (130 - 1) * AMU_G * 2e19 * 373 / kt400 + assert f1_mars == pytest.approx(2.9e13, rel=0.02) + mc_venus = 1 + kt400 * 2e11 / (2.2e19 * 850 * AMU_G) + assert mc_venus == pytest.approx(1.35, abs=0.02) + for m2_amu, g0, b12, f1_ref in ( + (140.0, 980.0, 2e19, 8.19e13), + (130.0, 373.0, 2e19, 2.894e13), + (mc_venus, 850.0, 2.2e19, 2e11), + ): + m = np.array([1.0, m2_amu]) * AMU_G + X = np.array([1 - 1e-10, 1e-10]) + b = np.array([[np.inf, b12], [b12, np.inf]]) + phi_star = m[0] * X[0] * b12 * (m[1] - m[0]) * g0 / kt400 * 400.0 / 400.0 + eps = 1e-6 + assert solve_closure(phi_star * (1 - eps), X, m, 400.0, g0, b)[1] == 0.0 + assert solve_closure(phi_star * (1 + eps), X, m, 400.0, g0, b)[1] > 0.0 + assert phi_star / m[0] == pytest.approx(f1_ref, rel=0.01) + + +@pytest.mark.physics_invariant +def test_low_flux_collapse_and_zero_limit(): + """Low flux collapses onto the lightest species; zero flux returns zero. + + Down to 1e-12 of the first threshold only the lightest species is + active and carries the whole mass flux exactly; at ``phi = 0`` the + fluxes are zero with an empty active set and no exception (the + continuity limit of the multiplier is defined there). + """ + rng = np.random.default_rng(109) + for _ in range(4): + n = int(rng.integers(2, 8)) + m = np.sort(rng.uniform(1, 60, n)) * AMU_G + X = rng.dirichlet(np.ones(n)) + T = rng.uniform(300, 2000) + g0 = rng.uniform(200, 3000) + logb = rng.uniform(17.0, 20.0, (n, n)) + b = 10.0 ** (0.5 * (logb + logb.T)) * T**0.75 + np.fill_diagonal(b, np.inf) + phi1 = first_threshold(X, m, T, g0, b) + light = int(np.argmin(m)) + for frac in (1e-3, 1e-6, 1e-12): + phi = frac * phi1 + flux, _c, act = solve_closure(phi, X, m, T, g0, b, return_diag=True) + assert act == frozenset({light}) + assert flux[light] == pytest.approx(phi / m[light], rel=1e-12) + assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12) + flux0, _c0, act0 = solve_closure(0.0, X, m, T, g0, b, return_diag=True) + assert np.all(flux0 == 0.0) + assert act0 == frozenset() + + +@pytest.mark.physics_invariant +def test_per_species_shim_conserves_mass(): + """The SI shim returns non-negative per-element rates summing to the bulk. + + A mixed H-He-O wind at a super-Earth base: the per-element rates must + sum to the bulk rate at machine precision, all be non-negative, and + keep hydrogen in the active set (the lightest species always escapes + when anything does). + """ + per, diag, _flags = closure_per_species( + 1.0e6, {'H': 0.85, 'He': 0.10, 'O': 0.05}, 8000.0, 5 * Me, 2 * Re + ) + assert sum(per.values()) == pytest.approx(1.0e6, rel=1e-9) + assert diag['mass_conservation_rel'] < 1e-9 + assert all(v >= 0.0 for v in per.values()) + assert 'H' in diag['active_set'] + # Fractionation direction: hydrogen escapes preferentially relative to + # its base mass fraction when heavies are near their thresholds. + m_frac_h = 0.85 * 1.008 / (0.85 * 1.008 + 0.10 * 4.0026 + 0.05 * 15.999) + assert per['H'] / 1.0e6 >= m_frac_h - 1e-9 + + +def test_shim_low_flux_and_rock_former_flag(): + """The shim collapses onto hydrogen at low flux and flags rock formers. + + A tiny bulk rate leaves every heavy retained: oxygen carries exactly + zero and hydrogen exactly the bulk rate. A silicon-bearing wind raises + the rock-former provenance flag naming the species. + """ + per, diag, _ = closure_per_species(1.0e-3, {'H': 0.5, 'O': 0.5}, 8000.0, 5 * Me, 2 * Re) + assert per['O'] == pytest.approx(0.0, abs=0.0) + assert per['H'] == pytest.approx(1.0e-3, rel=1e-9) + assert diag['retained'] == ['O'] + _per, _diag, flags = closure_per_species( + 1.0e6, {'H': 0.9, 'Si': 0.1}, 8000.0, 5 * Me, 2 * Re + ) + assert flags.get('rock_former_bij') == ['Si'] + + +def test_unfractionated_split_protocol(): + """The unfractionated split follows reservoirs, else base composition. + + With reservoir masses the split is by reservoir mass fraction exactly; + without them it falls back to the atomized base composition's mass + fractions with the substitution flagged, and either way the split sums + to the bulk rate. + """ + per, flags = unfractionated_split(4.0, {'H': 3.0e18, 'O': 1.0e18}, {'H': 1.0}) + assert per['H'] == pytest.approx(3.0, rel=1e-12) + assert per['O'] == pytest.approx(1.0, rel=1e-12) + assert flags == {} + per2, flags2 = unfractionated_split(4.0, None, {'H': 0.5, 'O': 0.5}) + assert flags2.get('split_from_base_composition') is True + assert sum(per2.values()) == pytest.approx(4.0, rel=1e-12) + # Mass weighting: oxygen outweighs hydrogen at equal mole fractions. + assert per2['O'] > per2['H'] diff --git a/tests/test_fractionation_ensembles.py b/tests/test_fractionation_ensembles.py new file mode 100644 index 00000000..62100213 --- /dev/null +++ b/tests/test_fractionation_ensembles.py @@ -0,0 +1,370 @@ +"""Ensemble sweeps for ``src/zephyrus/fractionation.py``. + +Companion to ``tests/test_fractionation.py`` holding the randomized +ensemble verifications, which run for seconds rather than milliseconds and +so carry the smoke tier: they exercise the real solver across hundreds of +configurations per test. The properties under test: + +- The two-species limit against the closed-form binary partition of + Cherubim & Wordsworth (2024, Eqs. 7-9), including flux continuity at the + crossover and exact mass conservation, over 200 random draws. +- Global properties across activation thresholds on random systems: mass + conservation, non-negativity (including exactly at bisected thresholds), + componentwise monotonicity, monotone active-set growth, two-sided + continuity at every detected threshold, and piecewise linearity of the + velocity scales within active-set segments. +- Active-set correctness and uniqueness by brute force: every candidate + active set is enumerated, exactly one satisfies both Karush-Kuhn-Tucker + conditions, and it matches the solver. +- Stability of the composition fixed point under well-mixed-layer + relaxation, with the analytic universal-b Jacobian cross-checked against + finite differences and general-b fixed points linearized numerically. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +from itertools import combinations + +import numpy as np +import pytest + +from zephyrus.constants import kb_cgs +from zephyrus.fractionation import first_threshold, solve_closure, solve_fixed_active + +pytestmark = [pytest.mark.smoke, pytest.mark.timeout(60)] + +AMU_G = 1.66053907e-24 # g + + +def isofate_binary(phi, x1, x2, m1, m2, T, g0, b12): + """Closed-form two-species partition (Cherubim & Wordsworth 2024, Eqs. 7-9).""" + kT = kb_cgs * T + h1 = kT / (m1 * g0) + h2 = kT / (m2 * g0) + phi_c = b12 * x1 * (m2 - m1) / h1 + if phi < phi_c: + return phi / m1, 0.0, phi_c + mbar = m1 * x1 + m2 * x2 + f1 = (x1 * phi + x1 * x2 * (m2 - m1) * b12 / h2) / mbar + f2 = (x2 * phi + x1 * x2 * (m1 - m2) * b12 / h1) / mbar + return f1, f2, phi_c + + +def solve_bruteforce(phi, X, m, T, g0, b, tol=1e-9): + """Independent active-set selection by exhaustive enumeration (test oracle). + + Tries every nonempty candidate active set, keeps those satisfying both + Karush-Kuhn-Tucker conditions (strictly positive drifts on the set, the + retention condition non-positive off it), and returns the accepted + ``(active_set, w, C)`` triples. + """ + kT = kb_cgs * T + n = len(X) + accepted = [] + for r in range(1, n + 1): + for cand in combinations(range(n), r): + try: + w, c_mult = solve_fixed_active(phi, X, m, T, g0, b, set(cand)) + except np.linalg.LinAlgError: + continue + wref = max(abs(w[j]) for j in cand) + if any(w[j] <= tol * wref for j in cand): + continue + ok = True + for k in range(n): + if k in cand: + continue + r_k = sum(X[i] * w[i] / b[i, k] for i in cand) - (m[k] * g0 / kT - c_mult) + if r_k > tol * abs(m[k] * g0 / kT): + ok = False + break + if ok: + accepted.append((frozenset(cand), w, c_mult)) + return accepted + + +def _random_system(rng, nmin=3, nmax=12, iso_pair=False): + """Random physical system: masses, composition, T, g, coefficient matrix.""" + n = int(rng.integers(nmin, nmax + 1)) + m = np.sort(rng.uniform(1, 60, n)) * AMU_G + if iso_pair and n >= 3: + m[1] = m[0] * (1 + rng.uniform(0.001, 0.05)) # isotope-close pair + m = np.sort(m) + X = rng.dirichlet(np.ones(n)) + T = rng.uniform(300, 2000) + g0 = rng.uniform(200, 3000) + logb = rng.uniform(17.0, 20.0, (n, n)) # three-decade coefficient spread + b = 10.0 ** (0.5 * (logb + logb.T)) * T**0.75 + np.fill_diagonal(b, np.inf) + return n, m, X, T, g0, b + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_binary_limit_matches_closed_form_over_random_draws(): + """200 random binaries match the closed-form partition on both branches. + + Below the crossover the light species carries everything; above it both + escape with the printed split; the two branches join continuously at + the crossover; fluxes are non-negative exactly at and beside the + threshold; and mass is conserved on both branches. Any drag-term or + threshold error breaks one of the five properties somewhere in the + draw. + """ + rng = np.random.default_rng(101) + worst = 0.0 + for _ in range(200): + m1 = AMU_G * rng.uniform(1, 4) + m2 = m1 * rng.uniform(1.5, 40) + x2 = rng.uniform(0.01, 0.9) + x1 = 1 - x2 + T = rng.uniform(200, 2000) + g0 = rng.uniform(100, 3000) + b12 = rng.uniform(0.5, 5) * 1e17 * T**0.75 + b = np.array([[np.inf, b12], [b12, np.inf]]) + kT = kb_cgs * T + phi_c = b12 * x1 * (m2 - m1) * m1 * g0 / kT + X, mm = np.array([x1, x2]), np.array([m1, m2]) + for frac in (0.2, 0.999999, 1.000001, 1.7, 30.0): + phi = frac * phi_c + flux = solve_closure(phi, X, mm, T, g0, b) + f1, f2, _ = isofate_binary(phi, x1, x2, m1, m2, T, g0, b12) + err = max(abs(flux[0] - f1), abs(flux[1] - f2)) / max(f1, 1e-300) + worst = max(worst, err) + assert worst <= 1e-12 + flux_lo = solve_closure(phi_c * (1 - 1e-9), X, mm, T, g0, b) + flux_hi = solve_closure(phi_c * (1 + 1e-9), X, mm, T, g0, b) + jump = np.max(np.abs(flux_hi - flux_lo)) / (phi_c / m1) + assert jump <= 1e-6 + for frac in (1.0, 1 - 1e-13, 1 + 1e-13): + assert np.all(solve_closure(phi_c * frac, X, mm, T, g0, b) >= 0.0) + for frac in (0.3, 3.0): + phi = frac * phi_c + flux = solve_closure(phi, X, mm, T, g0, b) + assert m1 * flux[0] + m2 * flux[1] == pytest.approx(phi, rel=1e-12) + + +@pytest.mark.physics_invariant +def test_global_properties_across_thresholds(): + """Conservation, positivity, monotonicity, and continuity over random scans. + + Twenty random systems (up to twelve species, isotope-close pairs every + third draw), each scanned over 400 fluxes spanning the full activation + ladder: mass conservation and non-negativity at every point; + componentwise monotonicity of the velocity scales in the flux; monotone + growth of the active set; two-sided continuity at every bisected + threshold (including non-negativity and conservation exactly there); + and piecewise linearity of the velocity scales within each active-set + segment (the solution is piecewise linear in the flux by construction). + """ + rng = np.random.default_rng(107) + n_trans = 0 + for trial in range(20): + _n, m, X, T, g0, b = _random_system(rng, iso_pair=(trial % 3 == 0)) + kT = kb_cgs * T + bmax = np.max(b[np.isfinite(b)]) + phimax = 3 * np.sum(m * X) * (bmax * g0 / kT) * (m[-1] - m[0]) + phis = np.geomspace(phimax * 1e-5, phimax, 400) + prev = None + seg = [] + for phi in phis: + flux, _c, act = solve_closure(phi, X, m, T, g0, b, return_diag=True) + w = np.where(X > 0, flux / np.where(X > 0, X, 1.0), 0.0) + assert abs(np.sum(m * flux) - phi) / phi <= 1e-10 + assert np.all(flux >= 0.0) + if prev is not None: + pphi, pw, pact, pflux = prev + assert not np.any(w - pw < -1e-9 * max(np.max(w), 1e-300)) + assert pact <= act # the active set only grows with phi + dref = max(np.max(np.abs(flux)), 1e-300) + assert np.max(np.abs(flux - pflux)) / dref <= 0.15 + if act != pact: + n_trans += 1 + lo, hi = pphi, phi + for _ in range(60): + mid = np.sqrt(lo * hi) + _, _, amid = solve_closure(mid, X, m, T, g0, b, return_diag=True) + if amid == pact: + lo = mid + else: + hi = mid + th = np.sqrt(lo * hi) + p_lo = solve_closure(th * (1 - 1e-9), X, m, T, g0, b) + p_hi = solve_closure(th * (1 + 1e-9), X, m, T, g0, b) + sref = max(np.max(np.abs(p_hi)), 1e-300) + assert np.max(np.abs(p_hi - p_lo)) / sref <= 1e-5 + p_at = solve_closure(th, X, m, T, g0, b) + assert np.all(p_at >= 0.0) + assert abs(np.sum(m * p_at) - th) / th <= 1e-10 + seg = [] + seg.append((phi, w.copy())) + if len(seg) >= 3: + (p1, w1), (p2, w2), (p3, w3) = seg[-3], seg[-2], seg[-1] + w2_lin = w1 + (w3 - w1) * (p2 - p1) / (p3 - p1) + assert np.max(np.abs(w2 - w2_lin)) <= 1e-8 * max(np.max(np.abs(w2)), 1e-300) + else: + seg = [(phi, w.copy())] + prev = (phi, w, act, flux) + assert n_trans >= 20 # the scans genuinely cross activation thresholds + + +@pytest.mark.physics_invariant +def test_active_set_unique_and_matches_bruteforce(): + """Exactly one candidate active set is KKT-consistent, and it is the solver's. + + For random near-threshold systems every nonempty candidate active set + is enumerated; exactly one must satisfy both Karush-Kuhn-Tucker + conditions, and the solver must return that set with the same fluxes + and multiplier. Partial active sets (the retention branch) must occur + in the ensemble, or the check would not exercise dropout at all. + """ + rng = np.random.default_rng(108) + n_partial, n_total = 0, 0 + for _trial in range(25): + n, m, X, T, g0, b = _random_system(rng, nmin=3, nmax=5) + phi1 = first_threshold(X, m, T, g0, b) + for frac in (0.3, 1.5, 4.0, 12.0, 40.0): + phi = frac * phi1 + flux, c_mult, act = solve_closure(phi, X, m, T, g0, b, return_diag=True) + accepted = solve_bruteforce(phi, X, m, T, g0, b) + n_total += 1 + assert len(accepted) == 1, (n_total, act) + a_set, w, c_bf = accepted[0] + assert a_set == act + wref = max(np.max(np.abs(w)), 1e-300) + assert np.max(np.abs(X * w - flux)) <= 1e-8 * wref * np.max(X) + assert c_bf == pytest.approx(c_mult, rel=1e-9) + if len(a_set) < n: + n_partial += 1 + assert n_partial > 0 # the retention branch is genuinely exercised + + +@pytest.mark.physics_invariant +def test_composition_fixed_point_stability_universal_b(): + """Well-mixed-layer fixed points are stable for the universal-b closure. + + Relaxing a layer's composition toward the supply composition at fixed + total flux, the analytic tangent-space Jacobian at a fully entrained + universal-b fixed point must have strictly negative real eigenvalues in + every draw (a runaway fractionation instability would show as a + positive one), and the analytic Jacobian must match finite differences + on the first draws (the transcription guard). + """ + rng = np.random.default_rng(110) + n_ok = n_run = 0 + for trial in range(600): + n = int(rng.integers(2, 9)) + m = np.sort(rng.uniform(1, 50, n)) * AMU_G + X = rng.dirichlet(np.ones(n) * rng.uniform(0.5, 3)) + beta = 10.0 ** rng.uniform(-9, -6) + mbar = np.sum(X * m) + margin = rng.uniform(1.02, 20.0) + a_scale = beta * max(np.max(m) - mbar, 1e-30) * margin + beta * mbar + w = a_scale - beta * (m - mbar) + if np.any(w <= 0): + continue + a_vec = (beta * (m - mbar) ** 2 - a_scale * m) / mbar + jac = ( + -np.diag(w) + - (beta / a_scale) * np.outer(X * (m - mbar), a_vec) + - beta * np.outer(X, m) + ) + basis = np.zeros((n, n - 1)) + for j in range(n - 1): + basis[j, j] = 1.0 + basis[n - 1, j] = -1.0 + jr = np.linalg.lstsq(basis, jac @ basis, rcond=None)[0] + lam = np.max(np.linalg.eigvals(jr).real) + n_run += 1 + if lam < 0: + n_ok += 1 + if trial < 5: + phi_here = mbar * a_scale - beta * np.sum(X * (m - mbar) ** 2) + xi = X * w / a_scale + xi = xi / np.sum(xi) + + def relax(q): + xq = q / np.sum(q) + mb = np.sum(xq * m) + s2 = np.sum(xq * (m - mb) ** 2) + aq = (phi_here + beta * s2) / mb + flux_q = xq * (aq - beta * (m - mb)) + return xi * np.sum(flux_q) - flux_q + + jfd = np.zeros((n, n)) + h = 1e-8 + f0 = relax(X) + for j in range(n): + qp = X.copy() + qp[j] += h + jfd[:, j] = (relax(qp) - f0) / h + assert np.max(np.abs((jfd - jac) @ basis)) <= 1e-4 * np.max(np.abs(jac @ basis)) + assert n_run > 500 + assert n_ok == n_run # every admissible fixed point is stable + + +@pytest.mark.physics_invariant +def test_composition_fixed_point_stability_general_b(): + """General-b composition fixed points are locally stable when entrained. + + Layer relaxation at fixed total mass flux and fixed supply composition, + general coefficient matrices: numerically constructed fixed points must + have negative-real-part linearizations in nearly every converged case + (a small number of draws may fail to converge and are skipped, but + enough must converge for the check to mean something). + """ + rng = np.random.default_rng(111) + n_ok = n_conv = 0 + for _trial in range(12): + n = int(rng.integers(2, 6)) + m = np.sort(rng.uniform(1, 40, n)) * AMU_G + T = rng.uniform(300, 2000) + g0 = rng.uniform(200, 3000) + b = rng.uniform(0.3, 5, (n, n)) * 1e17 * T**0.75 + b = 0.5 * (b + b.T) + np.fill_diagonal(b, np.inf) + kT = kb_cgs * T + xi = rng.dirichlet(np.ones(n) * 2) + X = xi.copy() + phi = None + converged = False + for _it in range(600): + mbar = np.sum(m * X) + beta_max = np.max(b[np.isfinite(b)]) * g0 / kT + phi = mbar * beta_max * (np.max(m) - np.min(m)) * 8 + flux = solve_closure(phi, X, m, T, g0, b) + if np.any(flux <= 0): + break + frac = flux / np.sum(flux) + xn = X * (xi / frac) ** 0.5 + xn /= np.sum(xn) + if np.max(np.abs(xn - X)) < 1e-13: + X = xn + converged = True + break + X = xn + if not converged: + continue + n_conv += 1 + + def relax(q): + xq = q / np.sum(q) + flux_q = solve_closure(phi, xq, m, T, g0, b) + return xi * np.sum(flux_q) - flux_q + + jac = np.zeros((n, n)) + h = 1e-7 + f0 = relax(X) + for j in range(n): + qp = X.copy() + qp[j] += h + jac[:, j] = (relax(qp) - f0) / h + basis = np.zeros((n, n - 1)) + for j in range(n - 1): + basis[j, j] = 1.0 + basis[n - 1, j] = -1.0 + jr = np.linalg.lstsq(basis, jac @ basis, rcond=None)[0] + if np.max(np.linalg.eigvals(jr).real) < 0: + n_ok += 1 + assert n_conv >= 10 + assert n_ok >= n_conv - 1 # at most one marginal linearization tolerated From 6abee82804104a2b42ab89a5bc79a6cb8ed7e8a2 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:34:28 +0200 Subject: [PATCH 012/113] Add the regime diagnostics reported beside every dispatch verdict --- src/zephyrus/diagnostics.py | 208 ++++++++++++++++++++++++++++++++++++ tests/test_diagnostics.py | 186 ++++++++++++++++++++++++++++++++ 2 files changed, 394 insertions(+) create mode 100644 src/zephyrus/diagnostics.py create mode 100644 tests/test_diagnostics.py diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py new file mode 100644 index 00000000..dd41d43d --- /dev/null +++ b/src/zephyrus/diagnostics.py @@ -0,0 +1,208 @@ +""" +!!! info "`diagnostics.py`" + Regime diagnostics reported beside every dispatch verdict.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math + +import numpy as np + +from zephyrus.constants import G, kb +from zephyrus.hydrodynamic import k_tide +from zephyrus.knudsen import mean_free_path, sigma_mixture +from zephyrus.planets_parameters import Mjup, Rjup + +# Everything in this module is reporting: the quantities let a reader +# translate a regime verdict into the criteria other escape taxonomies use, +# and quantify how close each call sat to its boundaries. Nothing here is +# read back by the dispatch control flow, and the container has no off +# switch: the regime boundaries carry genuine physical uncertainty, and +# printing the translation quantities beside every verdict is the +# mitigation. + +# Murray-Clay et al. (2009) fit their numerical models with flux exponents +# 0.6 (radiation-recombination limited) and 0.9 (energy limited); the +# analytic chains implemented here carry the idealized 0.5 and 1.0. +# Rate-level comparisons against their models must budget the difference. +MURRAY_CLAY_EXPONENTS = { + 'RR_numerical': 0.6, + 'RR_analytic_inherited': 0.5, + 'EL_numerical': 0.9, + 'EL_analytic_inherited': 1.0, +} +# Their regime-dependent dayside-heating reduction factors relative to +# full-surface redistribution, for sensitivity analyses. +DAYSIDE_FACTORS = {'energy_limited': 0.26, 'recombination_limited': 0.31} + +# Threshold gravitational potentials, log10(-phi) in cgs (erg/g). The +# Caldiroli et al. (2022) band marks where the evaporation efficiency +# collapses; the second screen separates wind-forming from hydrostatic +# thermospheres and is commonly attributed to Salz et al. (2016). The +# screen values are quoted here from secondary literature and should be +# verified against that original before quantitative use. +CALDIROLI_THRESHOLD_LOG_PHI = (12.9, 13.2) +SALZ_SCREEN_LOG_PHI = (13.11, 13.6) + + +def q_net_over_qc( + eps: float, + F_xuv: float, + R_xuv: float, + r_sonic: float, + r_base: float, + M_p: float, + m_mean: float, + sigma_c: float, + gamma: float = 1.0, + kn_m: float = 1.0, +) -> tuple[float, float, float]: + """Transonic energy criterion of Johnson et al. (2013, ApJL 768, L4). + + Their Eq. (10) critical power for sustaining a transonic outflow, + ``Q_c = 4 pi r_* (gamma / (c_c sigma_c Kn_m)) sqrt(2 U(r_*) / m) + U(r_0)`` with ``c_c = sqrt(2)`` and ``U(r) = G M m / r``, against the + intercepted, efficiency-degraded XUV power + ``Q_net = eps pi R_XUV^2 F_XUV``. A ratio well below 1 says the heating + cannot drive the flow transonic regardless of what a rate formula + returns. All SI. + """ + q_net = eps * math.pi * R_xuv**2 * F_xuv + u_star = G * M_p * m_mean / r_sonic + u_0 = G * M_p * m_mean / r_base + q_c = ( + 4.0 + * math.pi + * r_sonic + * gamma + / (math.sqrt(2.0) * sigma_c * kn_m) + * math.sqrt(2.0 * u_star / m_mean) + * u_0 + ) + return q_net / q_c, q_net, q_c + + +def guo_triple( + M_p: float, + R_p: float, + T_eq: float, + mu_kg: float, + M_star: float, + a: float, + e: float, + lambda_exo: float, +) -> dict: + """The (lambda_exo, lambda, lambda*) regime triple of Guo (2024). + + Guo (2024, arXiv:2405.13283) classifies escape regimes with the Jeans + parameter at the planetary radius and its Roche-corrected companion + ``lambda* = lambda K(xi)``; reporting the triple beside the exobase + value lets a reader translate the dispatch verdict into that taxonomy. + The orbital distance is taken at periapsis for consistency with the + tidal factor elsewhere in the package (a distinction that vanishes on + circular orbits). + """ + lam = G * M_p * mu_kg / (kb * T_eq * R_p) + d = a * (1.0 - e) + f = (M_p / (3.0 * M_star)) ** (1.0 / 3.0) * d / R_p + lam_star = lam * k_tide(f) if f > 1.0 else 0.0 + return dict( + lambda_exo=lambda_exo, + lambda_rp=lam, + lambda_star=lam_star, + thresholds='thermally driven lambda < ~3; tidal lambda* < 3; XUV lambda* > 6', + ) + + +def erkaev_tc(M_p: float, R_p: float, r_exo: float, R_hill: float) -> float: + """Tidally corrected critical exobase temperature, in K. + + Erkaev et al. (2007, Eq. 23): the exobase temperature above which the + thermosphere blows off, ``T_c = T_Jup (M_p / M_Jup)(R_Jup / R_p) + K(x_Rl / x) / x`` with ``x = r_exo / R_p``, ``x_Rl = R_Hill / R_p``, + and their Jupiter normalization 1.45e5 K. Returns 0 when the exobase + reaches the Roche lobe (the barrier is gone). + """ + x = r_exo / R_p + x_rl = R_hill / R_p + if x_rl / x <= 1.0: + return 0.0 + return 1.45e5 * (M_p / Mjup) * (Rjup / R_p) * k_tide(x_rl / x) / x + + +def along_profile_fluid_check( + profile, M_p: float, r_sonic: float, kn_threshold: float = 1.0 +) -> dict: + """Fluid condition along the profile up to the sonic surface. + + Owen & Jackson (2012, MNRAS 425, 2931) require the fluid condition to + hold everywhere below the sonic surface, not only at it. The check + walks the supplied profile levels below the sonic radius and records + the worst local Knudsen number (Maxwell mean free path over the local + scale height); the truncation at the profile top is declared, because + the sonic point normally lies above the modeled atmosphere. + """ + worst = 0.0 + checked = 0 + for i in range(len(profile.p)): + r = float(profile.r[i]) + if r > r_sonic: + break + T = float(profile.T[i]) + n = float(profile.p[i]) / (kb * T) + vmr = {sp: float(np.asarray(v)[i]) for sp, v in profile.vmr.items()} + sigma, _ = sigma_mixture(vmr, T) + H = kb * T * r**2 / (G * M_p * float(profile.mmw[i])) + kn = mean_free_path(sigma, n) / H + worst = max(worst, kn) + checked += 1 + truncated = bool(len(profile.p) and float(profile.r[-1]) < r_sonic) + return dict( + levels_checked=checked, + worst_kn=worst, + fluid=(worst < kn_threshold), + truncated_at_profile_top=truncated, + ) + + +def self_consistency_screen(reservoirs: dict | None, mdot: float, age: float | None) -> dict: + """Static-snapshot screen: depletion timescale against the snapshot age. + + A dispatched rate that would empty the supplied reservoirs in less than + the system age flags the snapshot as inconsistent with its own history + (the atmosphere could not have survived to be observed in this state). + Reports ``evaluated: False`` when age or reservoirs are absent. + """ + if not reservoirs or age is None or mdot <= 0.0: + return {'evaluated': False} + t_dep = sum(reservoirs.values()) / mdot + return {'evaluated': True, 't_deplete_s': t_dep, 'age_s': age, 'inconsistent': t_dep < age} + + +def potential_screens(M_p: float, R_p: float) -> dict: + """Threshold-potential screens, log10(-phi) in cgs (erg/g). + + Reports where the configuration sits against the Caldiroli et al. + (2022) efficiency-collapse band and the wind-versus-hydrostatic screen + (see the module constants for the attribution caveat on the latter). + """ + log_phi = math.log10(G * M_p / R_p * 1e4) + return dict( + log_minus_phi_cgs=log_phi, + caldiroli_threshold=CALDIROLI_THRESHOLD_LOG_PHI, + above_caldiroli=log_phi > CALDIROLI_THRESHOLD_LOG_PHI[0], + salz_screen=SALZ_SCREEN_LOG_PHI, + salz_verdict=( + 'wind' + if log_phi < SALZ_SCREEN_LOG_PHI[0] + else 'no-wind' + if log_phi > SALZ_SCREEN_LOG_PHI[1] + else 'intermediate' + ), + salz_attribution=( + 'commonly attributed to Salz et al. (2016); quoted from secondary ' + 'literature, verify against the original before quantitative use' + ), + ) diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py new file mode 100644 index 00000000..5703f83d --- /dev/null +++ b/tests/test_diagnostics.py @@ -0,0 +1,186 @@ +"""Tests for ``src/zephyrus/diagnostics.py``. + +Exercises the reporting quantities that accompany every dispatch verdict. +The physical invariants under test: + +- Closed forms: the Johnson et al. (2013) transonic energy criterion obeys + its published scalings; the Guo (2024) triple reduces correctly in the + wide-orbit and Roche limits; the Erkaev et al. (2007) critical exobase + temperature recovers its Jupiter normalization and vanishes at the Roche + lobe. +- Monotonicity / boundedness: the along-profile fluid check reports the + worst local Knudsen number with its truncation declared; the potential + screens classify the three regimes in the right order. +- Error contract: the self-consistency screen reports "not evaluated" + without its optional inputs rather than guessing. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import pytest + +from zephyrus.constants import G, amu +from zephyrus.diagnostics import ( + CALDIROLI_THRESHOLD_LOG_PHI, + DAYSIDE_FACTORS, + MURRAY_CLAY_EXPONENTS, + SALZ_SCREEN_LOG_PHI, + along_profile_fluid_check, + erkaev_tc, + guo_triple, + potential_screens, + q_net_over_qc, + self_consistency_screen, +) +from zephyrus.planets_parameters import Me, Mjup, Ms, Re, Rjup +from zephyrus.profiles import isothermal_profile + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + + +@pytest.mark.physics_invariant +def test_johnson_criterion_scalings(): + """The transonic energy criterion carries its published dependences. + + The net power is linear in the XUV flux and quadratic in the XUV + radius; the critical power is independent of both, so the ratio + inherits the linearity (a two-point check). A larger cross section + lowers the critical power (a more collisional gas is easier to drive + transonic), raising the ratio. + """ + args = dict( + eps=0.1, + R_xuv=1.2 * Re, + r_sonic=3.0 * Re, + r_base=1.1 * Re, + M_p=5 * Me, + m_mean=1.008 * amu, + sigma_c=1e-19, + ) + r1, q_net1, q_c1 = q_net_over_qc(F_xuv=10.0, **args) + r2, q_net2, q_c2 = q_net_over_qc(F_xuv=20.0, **args) + assert q_net2 == pytest.approx(2.0 * q_net1, rel=1e-12) + assert q_c2 == pytest.approx(q_c1, rel=1e-12) + assert r2 == pytest.approx(2.0 * r1, rel=1e-12) + args2 = dict(args, sigma_c=2e-19) + r3, _, q_c3 = q_net_over_qc(F_xuv=10.0, **args2) + assert q_c3 == pytest.approx(q_c1 / 2.0, rel=1e-12) + assert r3 > r1 + + +@pytest.mark.physics_invariant +def test_guo_triple_limits(): + """The regime triple reduces correctly in its limits. + + On a wide orbit the Roche correction vanishes, so lambda* approaches + lambda from below; inside the Roche limit (correction factor at or + below its root) lambda* reports 0. The exobase value passes through + untouched. + """ + mu = 2.3 * amu + wide = guo_triple(5 * Me, 1.5 * Re, 800.0, mu, Ms, 1.496e11, 0.0, lambda_exo=12.3) + assert wide['lambda_exo'] == pytest.approx(12.3, rel=1e-12) + assert wide['lambda_star'] < wide['lambda_rp'] + assert wide['lambda_star'] == pytest.approx(wide['lambda_rp'], rel=1e-2) + lam_ref = G * (5 * Me) * mu / (1.380649e-23 * 800.0 * 1.5 * Re) + assert wide['lambda_rp'] == pytest.approx(lam_ref, rel=1e-9) + # Deep inside the Roche limit the corrected parameter reports zero. + close = guo_triple(5 * Me, 1.5 * Re, 800.0, mu, Ms, 5e8, 0.0, lambda_exo=12.3) + assert close['lambda_star'] == pytest.approx(0.0, abs=0.0) + + +@pytest.mark.reference_pinned +def test_erkaev_critical_temperature_normalization(): + """The critical exobase temperature recovers its Jupiter normalization. + + Erkaev et al. (2007) normalize to 1.45e5 K for Jupiter values; with the + exobase at the planetary radius and the Hill radius far away the + correction factor approaches 1, so the critical temperature approaches + the normalization itself. At the Roche lobe it must vanish (no barrier + left), and a farther exobase always lowers it. + """ + t_far = erkaev_tc(Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) + assert t_far == pytest.approx(1.45e5, rel=1e-2) + assert erkaev_tc(Mjup, Rjup, 2.0 * Rjup, 1e3 * Rjup) < t_far + assert erkaev_tc(Mjup, Rjup, 3.0 * Rjup, 2.5 * Rjup) == pytest.approx(0.0, abs=0.0) + # Mass scaling is linear: twice the mass doubles the barrier. + assert erkaev_tc(2 * Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) == pytest.approx( + 2 * t_far, rel=1e-2 + ) + + +def test_along_profile_fluid_check_reports_truncation(): + """The fluid check walks the covered levels and declares its truncation. + + On a bound isothermal profile with the sonic radius above the top, all + levels are checked, the worst Knudsen number is deep in the fluid + regime (dense gas), and the truncation flag is set. A sonic radius + inside the profile checks only the levels below it. + """ + prof = isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e7, 1e-4) + out = along_profile_fluid_check(prof, 5 * Me, r_sonic=10 * Re) + assert out['levels_checked'] == len(prof.p) + assert out['truncated_at_profile_top'] is True + assert out['fluid'] is True + # The worst level is the rarefied top, still an order below threshold. + assert out['worst_kn'] < 0.1 + r_mid = float(prof.r[len(prof.p) // 2]) + out2 = along_profile_fluid_check(prof, 5 * Me, r_sonic=r_mid) + assert out2['levels_checked'] < len(prof.p) + assert out2['truncated_at_profile_top'] is False + + +def test_self_consistency_screen_contract(): + """The snapshot screen evaluates only with reservoirs and age supplied. + + Missing inputs report "not evaluated"; with them, a rate that would + empty the reservoirs faster than the age flags the snapshot, and a + slow rate does not. + """ + assert self_consistency_screen(None, 1e5, 1e16) == {'evaluated': False} + assert self_consistency_screen({'H': 1e18}, 1e5, None) == {'evaluated': False} + assert self_consistency_screen({'H': 1e18}, 0.0, 1e16) == {'evaluated': False} + fast = self_consistency_screen({'H': 1e18}, 1e5, 1e16) + assert fast['evaluated'] is True + assert fast['inconsistent'] is True # 1e13 s depletion against 1e16 s age + slow = self_consistency_screen({'H': 1e18}, 1e-5, 1e16) + assert slow['inconsistent'] is False + + +def test_potential_screens_classify_in_order(): + """The threshold-potential screens order the three verdicts correctly. + + An Earth-like potential sits far below both screens (wind side); a + compact massive planet lands above the upper screen (no-wind side); an + intermediate case falls between. The two screen bands themselves must + be ordered and overlapping in the documented way. + """ + low = potential_screens(Me, Re) + assert low['salz_verdict'] == 'wind' + assert low['above_caldiroli'] is False + high = potential_screens(10 * Mjup, 1.0 * Rjup) + assert high['salz_verdict'] == 'no-wind' + assert high['above_caldiroli'] is True + mid = potential_screens(2.2 * Mjup, 1.05 * Rjup) + assert mid['salz_verdict'] == 'intermediate' + # Screen geometry: the efficiency band starts below the wind screen. + assert CALDIROLI_THRESHOLD_LOG_PHI[0] < SALZ_SCREEN_LOG_PHI[0] + assert SALZ_SCREEN_LOG_PHI[0] < SALZ_SCREEN_LOG_PHI[1] + + +def test_documentation_constants_are_complete(): + """The documented comparison constants carry the published values. + + The Murray-Clay et al. (2009) numerical flux exponents (0.6 and 0.9) + against the analytic ones carried by the implementation (0.5 and 1.0), + and their dayside reduction factors, are reporting constants consumers + rely on; pin them so a silent edit fails. + """ + assert MURRAY_CLAY_EXPONENTS['RR_numerical'] == pytest.approx(0.6, rel=1e-12) + assert MURRAY_CLAY_EXPONENTS['EL_numerical'] == pytest.approx(0.9, rel=1e-12) + assert MURRAY_CLAY_EXPONENTS['RR_analytic_inherited'] == pytest.approx(0.5, rel=1e-12) + assert MURRAY_CLAY_EXPONENTS['EL_analytic_inherited'] == pytest.approx(1.0, rel=1e-12) + assert DAYSIDE_FACTORS['energy_limited'] == pytest.approx(0.26, rel=1e-12) + assert DAYSIDE_FACTORS['recombination_limited'] == pytest.approx(0.31, rel=1e-12) + # The reduction factors are genuine reductions. + assert all(0.0 < v < 1.0 for v in DAYSIDE_FACTORS.values()) From a2ee93c76c2066e6b86efc999851e7ff023418e8 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 14:38:13 +0200 Subject: [PATCH 013/113] Assemble the escape regime dispatcher and export it from the package --- src/zephyrus/__init__.py | 16 ++ src/zephyrus/dispatcher.py | 523 +++++++++++++++++++++++++++++++++++++ tests/test_dispatcher.py | 336 ++++++++++++++++++++++++ 3 files changed, 875 insertions(+) create mode 100644 src/zephyrus/dispatcher.py create mode 100644 tests/test_dispatcher.py diff --git a/src/zephyrus/__init__.py b/src/zephyrus/__init__.py index 9dbfb533..6b714b06 100644 --- a/src/zephyrus/__init__.py +++ b/src/zephyrus/__init__.py @@ -10,3 +10,19 @@ # Submodules re-exported so `import zephyrus` exposes the package API. from zephyrus import collision as collision # noqa: E402 +from zephyrus import dispatcher as dispatcher # noqa: E402 +from zephyrus import escape as escape # noqa: E402 + +# The regime-dispatcher entry points, re-exported at the package top level. +from zephyrus.dispatcher import ( # noqa: E402 + DispatchSettings as DispatchSettings, +) +from zephyrus.dispatcher import ( # noqa: E402 + EscapeInputs as EscapeInputs, +) +from zephyrus.dispatcher import ( # noqa: E402 + EscapeResult as EscapeResult, +) +from zephyrus.dispatcher import ( # noqa: E402 + dispatch as dispatch, +) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py new file mode 100644 index 00000000..2775dac2 --- /dev/null +++ b/src/zephyrus/dispatcher.py @@ -0,0 +1,523 @@ +""" +!!! info "`dispatcher.py`" + The escape-regime dispatcher: one call, one regime, one rate.
+ Author: Mara Attia +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass, field + +import numpy as np + +from zephyrus import boiloff as bl +from zephyrus import diagnostics as dg +from zephyrus import hydrodynamic as hy +from zephyrus import hydrostatic as hs +from zephyrus import knudsen as kn +from zephyrus import thermostat as th +from zephyrus.composition import atomize, mean_particle_mass +from zephyrus.constants import kb, m_p +from zephyrus.fractionation import closure_per_species, unfractionated_split +from zephyrus.profiles import Profile, photospheric_level, wind_base_level + +# The dispatcher assembles the escape branches of this package into one +# total prescription: every physically posed input state returns exactly +# one regime label, one bulk mass-loss rate, per-species rates summing to +# it, flags, and a diagnostics container. Exceptions are reserved for +# malformed input. The fixed evaluation order: +# +# 1. The bolometrically driven candidate is computed at every call. When +# the restricted Jeans parameter sits below its threshold the atmosphere +# is inflated enough to boil off and that candidate is the rate +# (Owen & Wu 2016); past the threshold the same machinery survives as a +# luminosity-capped residual (Gupta & Schlichting 2019) that can still +# win the final comparison. XUV-driven escape needs a base to launch +# from, and a bolometrically boiling atmosphere has not built one yet, +# which is why this test precedes everything (Owen & Schlichting 2024). +# 2. The hydrodynamic candidate: the wind base is located by the +# configured method, the thermostat sets the wind temperature by local +# heating-cooling balance, and the candidate is min(EL, RR) with the +# winner naming the sub-label. +# 3. The sonic-point Knudsen switch decides whether that wind is +# collisional enough to exist. It lives on the hydrodynamic branch +# only, never above the boil-off test. A confirmed hydrodynamic label +# applies the fractionation closure; otherwise the point re-routes to +# the hydrostatic branch. +# 4. The hydrostatic branch evaluates per-species Jeans escape with the +# diffusion-limited supply on the extended upper structure. Its +# escape-temperature gate re-routes thermally unstable exospheres back +# to the hydrodynamic rate; points where the neutral and plasma gate +# conventions disagree are flagged contested with both rates recorded. +# 5. The Roche screen, per branch, tests the active flow radius (sonic +# radius, max(R_XUV, R_s), or exobase radius) against the periapsis +# Hill radius before the label is finalized; an overflowing point is +# labeled ``roche_overflow`` with the Bondi-capped bolometric rate at +# the overflow geometry, and near misses raise ``near_roche``. +# 6. The final rate is the larger of the surviving branch rate and the +# bolometric residual, labeled by the winner. +# +# Diagnostics are boxed: nothing in this module branches on anything the +# diagnostics container carries, and the container has no off switch. + +REGIME_LABELS = ( + 'boiloff', + 'hydrodynamic:EL', + 'hydrodynamic:RR', + 'hydrostatic', + 'roche_overflow', +) +# The label 'impact' is reserved for impact-driven escape (see collision.py +# for the erosion scaling law; the dispatcher does not yet route to it). + +_TINY = 1e-300 + + +@dataclass +class DispatchSettings: + """Dispatch options; every default is the documented reference choice.""" + + base_method: str = 'lopez' # 'lopez' | 'fixed_pressure' | 'boreas' + base_out_of_range: str = 'clamp' # 'clamp' | 'extend' + P_photo: float = 2000.0 # Pa; photospheric level for the EL geometry + P_base_fixed: float = 5.0 # Pa; only for base_method = 'fixed_pressure' + kn_crit: float = 1.0 # sonic-point Knudsen threshold + kn_hysteresis: float = 1.5 # window factor, consumed only with prev_regime + gate: str = 'neutral' # 'neutral' | 'plasma' hydrostatic gate convention + efficiency: float = 0.1 + efficiency_mode: str = 'fixed' # 'fixed' | 'caldiroli' + T_exo_mode: str = 'prescribed' # 'prescribed' | 'thermostat' + T_exo_value: float = 1000.0 # K; the prescribed exobase temperature + cool_atomic: bool = True + cool_co2_band: bool = True + cool_o_finestructure: bool = True + cool_recombination: bool = True + fractionate: bool = True + tidal: bool = True + lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) + gamma_bates: float = 0.75 # Bates profile shape parameter + kzz: float = 3.0e2 # m^2/s eddy diffusion when the profile carries none + gamma_wind: float = 1.0 # polytropic index at the sonic point (isothermal) + + def validate(self) -> None: + """Raise ``ValueError`` on an unsupported option combination.""" + if self.base_method not in ('lopez', 'fixed_pressure', 'boreas'): + raise ValueError("base_method must be 'lopez', 'fixed_pressure', or 'boreas'") + if self.base_out_of_range not in ('clamp', 'extend'): + raise ValueError("base_out_of_range must be 'clamp' or 'extend'") + if self.gate not in ('neutral', 'plasma'): + raise ValueError("gate must be 'neutral' or 'plasma'") + if self.efficiency_mode not in ('fixed', 'caldiroli'): + raise ValueError("efficiency_mode must be 'fixed' or 'caldiroli'") + if self.T_exo_mode not in ('prescribed', 'thermostat'): + raise ValueError("T_exo_mode must be 'prescribed' or 'thermostat'") + if not ( + self.cool_atomic + or self.cool_co2_band + or self.cool_o_finestructure + or self.cool_recombination + ): + raise ValueError('all cooling channels disabled; at least one must stay on') + + +@dataclass +class EscapeInputs: + """One dispatch call's physical state. SI at every boundary.""" + + M_p: float # kg, planet (interior) mass + R_p: float # m, planet (interior) radius + M_star: float # kg + a: float # m, semi-major axis + e: float # eccentricity + T_eq: float # K, equilibrium temperature + F_xuv: float # W m^-2 + F_bol: float # W m^-2, bolometric instellation (carried with the state; + # not consumed by any branch in this version) + F_int: float # W m^-2, interior heat flux (luminosity cap) + kappa_photo: float # m^2 kg^-1, photospheric opacity + profile: Profile + settings: DispatchSettings = field(default_factory=DispatchSettings) + prev_regime: str | None = None # hysteresis memory for evolutionary use + atm_converged: bool | None = None # data-quality passthrough + age: float | None = None # s; consumed only by the snapshot screen + reservoirs: dict | None = None # element -> kg; screens and the split + dt: float | None = None # s; carried for the caller's supply cap only + + def validate(self) -> None: + """Raise ``ValueError`` on a malformed physical state.""" + for name in ('M_p', 'R_p', 'M_star', 'a', 'T_eq', 'F_bol', 'F_int', 'kappa_photo'): + if getattr(self, name) <= 0: + raise ValueError(f'{name} must be positive') + if self.F_xuv < 0: + raise ValueError('F_xuv must be >= 0') + if not (0.0 <= self.e < 1.0): + raise ValueError('e must be in [0, 1)') + self.settings.validate() + self.profile.validate() + + +@dataclass +class EscapeResult: + """One dispatch call's outcome.""" + + regime: str # one of REGIME_LABELS + mdot: float # kg/s bulk rate, >= 0 + per_species: dict # element -> kg/s, non-negative, summing to mdot + flags: dict # dispatch flags (clamps, screens, fallbacks) + diagnostics: dict # boxed reporting container; never gates anything + + +def dispatch(inputs: EscapeInputs) -> EscapeResult: + """Dispatch one atmospheric state to its escape regime and rate. + + Runs the fixed evaluation order documented in the module notes and + returns an :class:`EscapeResult`. Raises only on malformed input; + every physically posed state returns a labeled, finite, non-negative + result whose per-species rates sum to the bulk rate. + """ + inputs.validate() + st = inputs.settings + flags: dict = {} + diag: dict = { + 'documentation': { + 'murray_clay_exponents': dg.MURRAY_CLAY_EXPONENTS, + 'dayside_factors': dg.DAYSIDE_FACTORS, + 'kn_band': kn.KN_BAND, + 'lambda_crit_band': bl.LAMBDA_BAND, + } + } + if inputs.atm_converged is False: + flags['stale_input'] = True + + r_hill = hy.hill_radius_periapsis(inputs.M_p, inputs.M_star, inputs.a, inputs.e) + photo, f = photospheric_level(inputs.profile, st.P_photo) + flags.update(f) + r_xuv = photo['r'] + + # Step 1: bolometric candidate, computed at every point. + lam_gate = bl.lambda_restricted(inputs.M_p, inputs.R_p, inputs.T_eq, photo['mmw']) + bolo_rate, bolo = bl.bolometric_candidate( + inputs.M_p, + inputs.R_p, + inputs.T_eq, + inputs.kappa_photo, + photo, + inputs.F_int, + lam_gate, + st.lambda_crit, + ) + flags.update(bolo['flags']) + diag['lambda_gate'] = lam_gate + diag['bolometric'] = {k: v for k, v in bolo.items() if k != 'flags'} + diag['bolometric']['rate_kg_s'] = bolo_rate + + # Step 2: hydrodynamic candidate (always computed; it is cheap). + base, f = _resolve_wind_base(inputs) + flags.update(f) + elements = atomize(base['vmr']) + channels = dict( + cool_atomic=st.cool_atomic, + cool_co2_band=st.cool_co2_band, + cool_o_finestructure=st.cool_o_finestructure, + cool_recombination=st.cool_recombination, + ) + t_wind, thermo = th.solve_wind_temperature( + inputs.T_eq, base, elements, inputs.F_xuv, **channels + ) + if thermo.get('clamped'): + flags['thermostat_clamped'] = thermo['clamped'] + rr = hy.rr_chain(inputs.M_p, inputs.F_xuv, base['r'], t_wind, elements) + if rr['subcritical']: + flags['subcritical_sonic'] = True + + xi_ktide = r_hill / inputs.R_p + k_factor = hy.k_tide(xi_ktide) if (st.tidal and xi_ktide > 1.0) else 1.0 + eps = st.efficiency + if st.efficiency_mode == 'caldiroli': + eta_eff, cf = hy.caldiroli_efficiency(inputs.F_xuv, inputs.M_p, inputs.R_p, k_factor) + flags.update(cf) + if eta_eff is not None: + # Their efficiency is defined against an R_p^3 rate geometry. + eps = eta_eff * (inputs.R_p / r_xuv) ** 2 + else: + flags['efficiency_fallback_fixed'] = True + mdot_el = hy.el_rate(eps, inputs.F_xuv, inputs.R_p, r_xuv, inputs.M_p, k_factor) + mdot_rr = rr['mdot_rr'] + el_won = mdot_el <= mdot_rr + mdot_hydro = min(mdot_el, mdot_rr) + hydro_label = 'hydrodynamic:EL' if el_won else 'hydrodynamic:RR' + diag['hydrodynamic'] = dict( + mdot_el=mdot_el, + mdot_rr=mdot_rr, + efficiency=eps, + K_tide=k_factor, + T_wind=t_wind, + selection_mechanism=hy.selection_mechanism(rr, el_won), + rr_chain={ + k: rr[k] + for k in ( + 'c_s', + 'R_s', + 'R_s_calc', + 'lambda_b', + 'rho_s', + 'f_plus_base', + 'barometric_factor', + 'mu_wind', + 'mu_plus_wind', + 'hnu0_eV', + ) + }, + ) + diag['thermostat'] = thermo + + # Step 3: the sonic-point Knudsen switch. + n_sc = rr['rho_s'] / (rr['mu_plus_wind'] * m_p) # heavy-particle density + if n_sc > _TINY: + kn_sc, sigma_c, sigma_prov = kn.kn_sonic( + n_sc, rr['R_s'], elements, t_wind, gamma=st.gamma_wind + ) + else: + kn_sc, sigma_c, sigma_prov = math.inf, math.nan, {} + threshold = kn.effective_threshold(st.kn_crit, st.kn_hysteresis, inputs.prev_regime) + diag['knudsen'] = dict( + kn_sc=kn_sc, + threshold_applied=threshold, + sigma_c=sigma_c, + provenance=sigma_prov, + counterfactual_labels={ + edge: ('hydrodynamic' if kn_sc <= edge else 'hydrostatic') for edge in kn.KN_BAND + }, + ) + if inputs.prev_regime is not None: + flags['hysteresis_active'] = True + + # Step 4: hydrostatic branch (always evaluated: its exobase quantities + # feed the diagnostics at every dispatch). + t_exo = _resolve_t_exo(inputs, channels) + if st.T_exo_mode == 'thermostat': + flags['T_exo_thermostat'] = True + hs_per_element, hsd = hs.hydrostatic_rates( + inputs.profile, inputs.M_p, t_exo, gamma_bates=st.gamma_bates, kzz_default=st.kzz + ) + hs_flags = hsd.pop('flags') + mdot_hs = sum(hs_per_element.values()) + hnu, _e_ion, sigma_front = th.front_constants(elements) + f_plus_exo = th.ionization_fraction( + hsd['n_exo'] * 1e-6, + hsd['T_exo'], + inputs.F_xuv * 1e3, + hnu, + sigma_front, + th.recombination_alpha(elements, hsd['T_exo']), + ) + unstable, contested = hs.gate_unstable(hsd['T_exo'], hsd, st.gate, f_plus_exo) + diag['hydrostatic'] = dict( + rate_kg_s=mdot_hs, + T_exo=hsd['T_exo'], + r_exo=hsd['r_exo'], + f_plus_exo=f_plus_exo, + T_esc_neutral=hsd['T_esc_neutral'], + T_esc_plasma=hsd['T_esc_plasma'], + gate=st.gate, + gate_unstable=unstable, + detail=hsd, + ) + if contested: + flags['contested_ion'] = True + diag['contested_ion'] = dict( + hydrostatic_rate=mdot_hs, + hydrodynamic_rate=mdot_hydro, + note=( + 'the neutral and plasma escape-temperature conventions disagree ' + 'here, so the branch assignment depends on ion physics this ' + 'version does not model; both rates are recorded' + ), + ) + + # Route. + per_species = None + if lam_gate < st.lambda_crit: + label = 'boiloff' + rate = bolo_rate + flow_radius = bolo['R_sonic'] + else: + if kn_sc <= threshold: + label = hydro_label + rate = mdot_hydro + flow_radius = max(r_xuv, rr['R_s']) + elif unstable: + label = hydro_label + rate = mdot_hydro + flow_radius = max(r_xuv, rr['R_s']) + flags['gate_rerouted'] = True + else: + label = 'hydrostatic' + rate = mdot_hs + per_species = dict(hs_per_element) + flags.update(hs_flags) + flow_radius = hsd['r_exo'] + # Step 6: the bolometric residual stays a candidate past the gate. + if bolo_rate > rate: + label = 'boiloff' + rate = bolo_rate + per_species = None + flags['bolometric_residual'] = True + flow_radius = bolo['R_sonic'] + + # Step 5: the Roche screen on the active flow radius. + xi_flow = r_hill / flow_radius if flow_radius > 0 else math.inf + diag['roche'] = dict( + R_hill_periapsis=r_hill, flow_radius=flow_radius, xi_flow=xi_flow, xi_ktide=xi_ktide + ) + if xi_flow <= 1.0 or xi_ktide <= 1.0: + label = 'roche_overflow' + flags['roche_overflow'] = True + flags['roche_subflag'] = ( + 'dynamical' if (xi_ktide <= 1.0 or r_hill <= photo['r']) else 'no_transonic' + ) + # The overflow rate is the Bondi-capped bolometric machinery at the + # overflow geometry. + rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) + per_species = None + elif xi_flow < 1.5: + flags['near_roche'] = True + + # Per-species split, by label. + if per_species is None: + if label.startswith('hydrodynamic') and st.fractionate and rate > 0.0: + per_species, cdiag, cflags = closure_per_species( + rate, elements, t_wind, inputs.M_p, base['r'] + ) + flags.update(cflags) + diag['closure'] = cdiag + else: + per_species, sflags = unfractionated_split(rate, inputs.reservoirs, elements) + flags.update(sflags) + + # Boxed diagnostics (nothing above this line reads them back). + m_bar = mean_particle_mass(elements) + ratio, q_net, q_c = dg.q_net_over_qc( + eps, + inputs.F_xuv, + r_xuv, + rr['R_s'], + base['r'], + inputs.M_p, + m_bar, + sigma_c if sigma_c == sigma_c else 1e-19, + ) + diag['johnson_q'] = dict(q_net_over_qc=ratio, q_net_W=q_net, q_c_W=q_c) + diag['guo_triple'] = dg.guo_triple( + inputs.M_p, + inputs.R_p, + inputs.T_eq, + photo['mmw'], + inputs.M_star, + inputs.a, + inputs.e, + hsd['lambda_exo_bulk'], + ) + diag['potential_screens'] = dg.potential_screens(inputs.M_p, inputs.R_p) + diag['erkaev_tc_K'] = dg.erkaev_tc(inputs.M_p, inputs.R_p, hsd['r_exo'], r_hill) + diag['fluid_check'] = dg.along_profile_fluid_check( + inputs.profile, inputs.M_p, rr['R_s'], st.kn_crit + ) + diag['tang_timescale'] = bl.tang_timescale_check( + inputs.M_p, inputs.R_p, inputs.F_int, rate, inputs.reservoirs + ) + diag['self_consistency'] = dg.self_consistency_screen(inputs.reservoirs, rate, inputs.age) + diag['base_level'] = dict( + p_Pa=base['p'], + r_m=base['r'], + T_K=base['T'], + clamp_decades=flags.get('base_clamp_decades'), + ) + + # Output contract: non-negative bulk rate, per-species rates summing to + # it exactly. + rate = max(rate, 0.0) + per_species = {el: max(v, 0.0) for el, v in per_species.items()} + tot = sum(per_species.values()) + if tot > 0.0 and rate > 0.0 and abs(tot - rate) / rate > 1e-9: + per_species = {el: v * rate / tot for el, v in per_species.items()} + return EscapeResult( + regime=label, mdot=rate, per_species=per_species, flags=flags, diagnostics=diag + ) + + +def _resolve_wind_base(inputs: EscapeInputs) -> tuple[dict, dict]: + """The wind-base level with the out-of-range policy applied. + + Locates the base by the configured method; when the physical base + pressure lies above the profile top and the policy is ``'extend'``, + the level is re-evaluated on the Bates extension (the same upper + structure the hydrostatic branch uses), flagged ``base_extended``; + under ``'clamp'`` (default) the clamped top level and its recorded + clamp distance stand. + """ + st = inputs.settings + boreas_scalars = None + if st.base_method == 'boreas': + boreas_scalars = {'R_p': inputs.R_p, 'T_eq': inputs.T_eq, 'F_xuv': inputs.F_xuv} + base, flags = wind_base_level( + inputs.profile, + inputs.M_p, + method=st.base_method, + fixed_pressure=st.P_base_fixed, + boreas_scalars=boreas_scalars, + ) + if flags.get('base_clamped') and st.base_out_of_range == 'extend': + p_target = flags.get('base_pressure_pa') + if p_target is not None: + t_exo = st.T_exo_value if st.T_exo_mode == 'prescribed' else inputs.T_eq + ext = hs.bates_extension(inputs.profile, inputs.M_p, t_exo, gamma=st.gamma_bates) + p_ext = np.asarray(ext['p']) + if p_target >= p_ext[-1]: + lz = np.log(p_ext[::-1]) + lt = math.log(p_target) + r = float(np.interp(lt, lz, ext['r'][::-1])) + T = float(np.interp(lt, lz, ext['T'][::-1])) + n = p_target / (kb * T) + base = dict( + p=float(p_target), + r=r, + T=T, + mmw=float(ext['mu']), + n=float(n), + rho=float(n * ext['mu']), + vmr=dict(ext['vmr']), + kzz=None, + ) + flags.pop('base_clamped', None) + flags.pop('base_clamp_decades', None) + flags['base_extended'] = True + else: + # The extension itself truncates (unbound) above the target + # level; the clamp to the profile top stands, flagged. + flags['base_extension_truncated'] = True + return base, flags + + +def _resolve_t_exo(inputs: EscapeInputs, channels: dict) -> float: + """The hydrostatic exobase temperature per the configured mode. + + The default is the prescribed value: the exobase temperature is the + branch's dominant sensitivity and is owned by the caller. The optional + thermostat mode evaluates the local heating-cooling balance at the + profile top; a conduction-free local balance biases the estimate high + (heating scales with density, the cooling channels with its square), + so the mode is an estimator, not a default. + """ + st = inputs.settings + if st.T_exo_mode != 'thermostat': + return st.T_exo_value + top = { + 'n': float(inputs.profile.p[-1]) / (kb * float(inputs.profile.T[-1])), + 'vmr': {sp: float(np.asarray(v)[-1]) for sp, v in inputs.profile.vmr.items()}, + } + t_exo, _detail = th.solve_wind_temperature( + inputs.T_eq, top, atomize(top['vmr']), inputs.F_xuv, **channels + ) + return t_exo diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py new file mode 100644 index 00000000..34c1f4d7 --- /dev/null +++ b/tests/test_dispatcher.py @@ -0,0 +1,336 @@ +"""Tests for ``src/zephyrus/dispatcher.py``. + +Exercises the assembled regime dispatcher end to end on synthetic +atmospheres, so the whole file carries the smoke tier (real code path, no +mocks). The properties under test: + +- Totality: 200 random physically posed inputs return exactly one label, a + finite non-negative bulk rate, per-species rates summing to it, and a + populated diagnostics container, with no exception. +- Routing: an inflated light envelope dispatches to boil-off; a bound heavy + atmosphere under weak XUV to hydrostatic; a light envelope under strong + XUV to a hydrodynamic sub-label; a Roche-filling geometry to overflow. +- Cross-implementation pin: the dispatcher's energy-limited candidate + equals the released ``EL_escape`` at the same inputs. +- Boxedness: clearing the diagnostics container and re-dispatching returns + the same verdict, so nothing reads it back. +- Error contract: malformed settings and physical states raise. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import numpy as np +import pytest + +from zephyrus.dispatcher import ( + REGIME_LABELS, + DispatchSettings, + EscapeInputs, + dispatch, +) +from zephyrus.escape import EL_escape +from zephyrus.planets_parameters import Me, Ms, Re +from zephyrus.profiles import isothermal_profile + +pytestmark = [pytest.mark.smoke, pytest.mark.timeout(120)] + +AU = 1.496e11 # m + +COMPOSITIONS = [ + {'H2': 1.0}, + {'H2': 0.9, 'He': 0.1}, + {'H2O': 1.0}, + {'N2': 1.0}, + {'CO2': 1.0}, + {'CO2': 0.7, 'N2': 0.3}, + {'H2': 0.5, 'H2O': 0.5}, + {'N2': 0.8, 'O2': 0.2}, +] + + +def _inputs(M_p, R_p, T_eq, comp, F_xuv, a=0.1 * AU, e=0.0, p_surf=1e7, p_top=1e-5, **kw): + """Physically posed dispatch inputs on an isothermal test atmosphere.""" + prof = isothermal_profile(M_p, R_p, T_eq, comp, p_surf, p_top) + defaults = dict( + M_p=M_p, + R_p=R_p, + M_star=Ms, + a=a, + e=e, + T_eq=T_eq, + F_xuv=F_xuv, + F_bol=1e4, + F_int=0.5, + kappa_photo=0.01, + profile=prof, + ) + defaults.update(kw) + return EscapeInputs(**defaults) + + +def _random_inputs(rng): + """One random draw over masses, radii, temperatures, and compositions.""" + M_p = rng.uniform(0.5, 20.0) * Me + R_p = rng.uniform(0.7, 4.0) * Re + T_eq = rng.uniform(200.0, 2500.0) + comp = COMPOSITIONS[rng.integers(len(COMPOSITIONS))] + p_surf = 10 ** rng.uniform(4.0, 9.0) + p_top = 10 ** rng.uniform(-6.0, -2.0) + try: + prof = isothermal_profile(M_p, R_p, T_eq, comp, p_surf, p_top) + except ValueError: + return None # unbound at the surface: not a physically posed input + return EscapeInputs( + M_p=M_p, + R_p=R_p, + M_star=Ms * rng.uniform(0.3, 1.5), + a=10 ** rng.uniform(math.log10(0.01), 0.0) * AU, + e=rng.uniform(0.0, 0.5), + T_eq=T_eq, + F_xuv=0.0 if rng.random() < 0.05 else 10 ** rng.uniform(-3.0, 4.0), + F_bol=10 ** rng.uniform(2.0, 6.0), + F_int=10 ** rng.uniform(-2.0, 2.0), + kappa_photo=10 ** rng.uniform(-3.0, -1.0), + profile=prof, + prev_regime=None + if rng.random() < 0.7 + else ['boiloff', 'hydrodynamic:EL', 'hydrostatic'][rng.integers(3)], + reservoirs=None + if rng.random() < 0.5 + else {'H': 10 ** rng.uniform(15.0, 20.0), 'O': 10 ** rng.uniform(15.0, 20.0)}, + age=None if rng.random() < 0.5 else 10 ** rng.uniform(14.0, 17.5), + ) + + +@pytest.mark.physics_invariant +def test_totality_over_random_physical_inputs(): + """Every physically posed input returns one consistent, finite result. + + 200 random draws across compositions, masses, radii, fluxes (including + exactly zero), eccentricities, and profile depths: exactly one known + label, a finite non-negative bulk rate, finite non-negative per-species + rates summing to the bulk rate, and a populated diagnostics container, + with no exception anywhere. This is the conservation and boundedness + contract of the whole dispatcher. + """ + rng = np.random.default_rng(42) + n_ok = 0 + seen = set() + while n_ok < 200: + inp = _random_inputs(rng) + if inp is None: + continue + res = dispatch(inp) + assert res.regime in REGIME_LABELS, res.regime + assert math.isfinite(res.mdot) + assert res.mdot >= 0.0 + assert all(math.isfinite(v) and v >= 0.0 for v in res.per_species.values()) + tot = sum(res.per_species.values()) + if res.mdot > 0.0: + assert tot == pytest.approx(res.mdot, rel=1e-6) + assert isinstance(res.diagnostics, dict) + assert 'knudsen' in res.diagnostics + seen.add(res.regime) + n_ok += 1 + # The sweep must genuinely exercise more than one branch. + assert len(seen) >= 3, seen + + +def test_routing_boiloff_for_inflated_light_envelope(): + """A hot, loosely bound H2 envelope dispatches to boil-off. + + The restricted Jeans parameter sits below the activation threshold, so + the bolometric branch owns the point: label ``boiloff``, a positive + rate even at zero XUV flux (the driver is bolometric, not XUV), and an + unfractionated split (fractionation stays off on this branch). + """ + inp = _inputs(2 * Me, 2.2 * Re, 1800.0, {'H2': 1.0}, F_xuv=0.0, a=0.05 * AU) + res = dispatch(inp) + assert res.diagnostics['lambda_gate'] < 20.0 + assert res.regime == 'boiloff' + assert res.mdot > 0.0 + assert 'closure' not in res.diagnostics # no fractionation on this branch + + +def test_routing_hydrostatic_for_bound_heavy_atmosphere(): + """A massive CO2 atmosphere under weak XUV dispatches to hydrostatic. + + The wind's sonic point is rarefied (Knudsen number far above the + switch), the exobase is cool against both escape temperatures, and the + rates are per-species with the lower-limit flag: non-thermal channels + are absent from the hydrostatic branch. + """ + inp = _inputs(10 * Me, 1.8 * Re, 800.0, {'CO2': 1.0}, F_xuv=1.0, a=0.5 * AU) + res = dispatch(inp) + assert res.regime == 'hydrostatic' + assert res.diagnostics['knudsen']['kn_sc'] > res.diagnostics['knudsen']['threshold_applied'] + assert res.flags.get('hydrostatic_lower_limit') is True + assert res.diagnostics['hydrostatic']['gate_unstable'] is False + + +@pytest.mark.reference_pinned +def test_routing_hydrodynamic_and_el_candidate_matches_el_escape(): + """A strongly irradiated light envelope goes hydrodynamic, EL-consistent. + + The dispatcher's energy-limited candidate must equal the released + ``EL_escape`` evaluated with the same efficiency, radii, flux, and + tidal factor (the cross-implementation pin tying the dispatcher to the + package's public energy-limited contract). The label carries the + min(EL, RR) winner as its sub-label. + """ + inp = _inputs(5 * Me, 1.8 * Re, 1100.0, {'H2': 0.9, 'He': 0.1}, F_xuv=200.0, a=0.05 * AU) + res = dispatch(inp) + assert res.regime.startswith('hydrodynamic') + hydro = res.diagnostics['hydrodynamic'] + # Reconstruct the EL candidate through the public entry point. + eps = hydro['efficiency'] + r_xuv = _photo_radius(inp) + ref = EL_escape(True, inp.a, inp.e, inp.M_p, inp.M_star, eps, inp.R_p, r_xuv, inp.F_xuv, 2) + assert hydro['mdot_el'] == pytest.approx(ref, rel=1e-9) + assert res.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9) + winner = 'EL' if hydro['mdot_el'] <= hydro['mdot_rr'] else 'RR' + assert res.regime == f'hydrodynamic:{winner}' + + +def _photo_radius(inp): + """The 20 mbar photospheric radius of an input's profile.""" + from zephyrus.profiles import photospheric_level + + lev, _ = photospheric_level(inp.profile, inp.settings.P_photo) + return lev['r'] + + +def test_routing_roche_overflow_inside_the_hill_sphere(): + """A planet whose Hill sphere sits inside its radius overflows, flagged. + + At 0.003 au the periapsis Hill radius of a 5 Earth-mass planet drops + below its own radius: the label is ``roche_overflow`` with the + dynamical subflag, and the rate comes from the Bondi-capped bolometric + machinery at the overflow geometry (finite and non-negative). + """ + inp = _inputs(5 * Me, 1.5 * Re, 1500.0, {'H2': 1.0}, F_xuv=100.0, a=0.003 * AU) + res = dispatch(inp) + assert res.diagnostics['roche']['xi_ktide'] < 1.0 + assert res.regime == 'roche_overflow' + assert res.flags.get('roche_subflag') == 'dynamical' + assert math.isfinite(res.mdot) + assert res.mdot >= 0.0 + + +def test_diagnostics_are_boxed(): + """Clearing the diagnostics and re-dispatching changes nothing. + + The container is reporting only: no control flow reads it back, so + mutating (here: emptying) the first result's diagnostics must leave a + fresh dispatch of the same inputs with the same label and rate. + """ + inp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) + r1 = dispatch(inp) + r1.diagnostics.clear() + r2 = dispatch(inp) + assert r2.regime == r1.regime + assert r2.mdot == pytest.approx(r1.mdot, rel=1e-12) + + +def test_hysteresis_memory_moves_the_threshold(): + """A previous regime label activates the hysteresis window, flagged. + + With no memory the sharp threshold applies; with a hydrodynamic + previous label the applied threshold rises by the window factor, and + the flag records that the memory was consumed. + """ + inp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) + sharp = dispatch(inp) + assert 'hysteresis_active' not in sharp.flags + assert sharp.diagnostics['knudsen']['threshold_applied'] == pytest.approx(1.0) + inp2 = _inputs( + 5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, prev_regime='hydrodynamic:EL' + ) + remembered = dispatch(inp2) + assert remembered.flags.get('hysteresis_active') is True + assert remembered.diagnostics['knudsen']['threshold_applied'] == pytest.approx(1.5) + + +def test_base_out_of_range_extend_mode(): + """A profile too shallow for the wind base extends instead of clamping. + + On a profile truncated at 0.01 Pa the physical Lopez base lies above + the top: the default policy clamps (flagged, with the distance in + decades); the extend policy evaluates the base on the extended upper + structure instead, replacing the clamp flag with ``base_extended`` and + placing the base at a lower pressure than the profile top. + """ + inp_clamp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2) + res_clamp = dispatch(inp_clamp) + assert res_clamp.flags.get('base_clamped') is True + assert res_clamp.flags['base_clamp_decades'] > 0.0 + settings = DispatchSettings(base_out_of_range='extend') + inp_ext = _inputs( + 5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2, settings=settings + ) + res_ext = dispatch(inp_ext) + assert res_ext.flags.get('base_extended') is True + assert 'base_clamped' not in res_ext.flags + assert res_ext.diagnostics['base_level']['p_Pa'] < 1e-2 + + +def test_fractionation_toggle_and_split_protocol(): + """The hydrodynamic split follows the fractionation toggle. + + With fractionation on, a hydrodynamic verdict carries the closure + diagnostics and per-element rates that need not follow the base mass + fractions; with it off, the split is unfractionated (flagged when it + falls back to the base composition), and both sum to the bulk rate. + """ + on = dispatch( + _inputs(5 * Me, 1.8 * Re, 1100.0, {'H2': 0.9, 'He': 0.1}, F_xuv=200.0, a=0.05 * AU) + ) + assert on.regime.startswith('hydrodynamic') + assert 'closure' in on.diagnostics + assert sum(on.per_species.values()) == pytest.approx(on.mdot, rel=1e-6) + settings = DispatchSettings(fractionate=False) + off = dispatch( + _inputs( + 5 * Me, + 1.8 * Re, + 1100.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=200.0, + a=0.05 * AU, + settings=settings, + ) + ) + assert off.regime.startswith('hydrodynamic') + assert 'closure' not in off.diagnostics + assert off.flags.get('split_from_base_composition') is True + assert sum(off.per_species.values()) == pytest.approx(off.mdot, rel=1e-6) + + +def test_settings_and_inputs_error_contract(): + """Malformed settings and physical states raise before any physics runs. + + Unknown option strings, all cooling channels off, non-positive masses, + and an eccentricity outside [0, 1) all raise ``ValueError``; the same + state with the defect repaired dispatches normally. + """ + with pytest.raises(ValueError, match='base_method'): + DispatchSettings(base_method='nonsense').validate() + with pytest.raises(ValueError, match='cooling'): + DispatchSettings( + cool_atomic=False, + cool_co2_band=False, + cool_o_finestructure=False, + cool_recombination=False, + ).validate() + good = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) + bad_e = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, e=1.0) + with pytest.raises(ValueError, match='e must be'): + dispatch(bad_e) + bad_m = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) + bad_m.M_p = -1.0 + with pytest.raises(ValueError, match='M_p'): + dispatch(bad_m) + res = dispatch(good) + assert res.regime in REGIME_LABELS From ed92abcb90b20da85f7ba5c117cfb71d02c21cf5 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 16:03:21 +0200 Subject: [PATCH 014/113] Track the new escape sources in the test quality gates and agent guide --- .github/.claude/rules/zephyrus-tests.md | 19 +++- .github/copilot-instructions.md | 21 +++- tests/test_diffusion.py | 5 + tests/test_dispatcher.py | 130 ++++++++++++++++++++++++ tests/test_thermostat.py | 7 +- tools/check_test_quality.py | 12 +++ 6 files changed, 186 insertions(+), 8 deletions(-) diff --git a/.github/.claude/rules/zephyrus-tests.md b/.github/.claude/rules/zephyrus-tests.md index 794f94da..6b3a2304 100644 --- a/.github/.claude/rules/zephyrus-tests.md +++ b/.github/.claude/rules/zephyrus-tests.md @@ -94,18 +94,31 @@ The guard lines are mandatory whenever the test's primary assertion is a `pytest ### When required -Every unit test on a **physics source** must assert at least one of the four invariants below. The physics source is: +Every unit test on a **physics source** must assert at least one of the four invariants below. The physics sources are: ``` +src/zephyrus/atomic_data.py +src/zephyrus/boiloff.py +src/zephyrus/collision.py +src/zephyrus/diagnostics.py +src/zephyrus/diffusion.py +src/zephyrus/dispatcher.py src/zephyrus/escape.py +src/zephyrus/fractionation.py +src/zephyrus/hydrodynamic.py +src/zephyrus/hydrostatic.py +src/zephyrus/knudsen.py +src/zephyrus/profiles.py +src/zephyrus/thermostat.py ``` -Per-source-file granularity: `escape.py` needs at least one `@pytest.mark.physics_invariant` test and at least one `@pytest.mark.reference_pinned` test in `tests/test_escape.py`. Granularity is per source file, not per directory. +Per-source-file granularity: every physics source needs at least one `@pytest.mark.physics_invariant` test and at least one `@pytest.mark.reference_pinned` test in its companion `tests/test_.py`. Granularity is per source file, not per directory. Utility sources are exempt from the physics-invariant requirement but still subject to all anti-happy-path rules: ``` -src/zephyrus/__init__.py (version string) +src/zephyrus/__init__.py (version string, package exports) +src/zephyrus/composition.py (element masses, formula parsing) src/zephyrus/constants.py (pure physical constants, no derivation) src/zephyrus/planets_parameters.py (tabulated star-planet parameters) ``` diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 012943b5..dc6b0313 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -30,7 +30,7 @@ Sister modules in the ecosystem: AGNI (atmospheric radiative transfer), SOCRATES **Languages**: Python 3.10+. -**Size**: 3 source files in `src/zephyrus/`. +**Size**: 17 source files in `src/zephyrus/`. **Target Runtime**: Python 3.10+ on Linux / macOS. @@ -134,11 +134,24 @@ pre-commit install -f ### Key Directories -- `src/zephyrus/` - Main Python source code (flat layout, 3 files) - - `__init__.py` - Package version (utility) +- `src/zephyrus/` - Main Python source code (flat layout) + - `__init__.py` - Package version and top-level exports (utility) - `constants.py` - Physical constants and unit conversions (utility) - `planets_parameters.py` - Star-planet system parameters (utility) + - `composition.py` - Element masses, formula parsing, atomization (utility) - `escape.py` - Energy-limited (EL) atmospheric escape, tidal correction (physics) + - `collision.py` - Giant-impact atmospheric erosion scaling law (physics) + - `profiles.py` - Atmosphere-profile container and escape working levels (physics) + - `knudsen.py` - Collision cross sections and the sonic-point Knudsen switch (physics) + - `diffusion.py` - Binary diffusion coefficient library with provenance (physics) + - `atomic_data.py` - Cooling data tables and closed-form rate coefficients (physics) + - `thermostat.py` - Wind-temperature thermostat (heating against cooling) (physics) + - `boiloff.py` - Bolometrically driven boil-off escape (physics) + - `hydrodynamic.py` - EL and radiation-recombination-limited rates (physics) + - `hydrostatic.py` - Jeans escape with the diffusion-limited supply cap (physics) + - `fractionation.py` - Simultaneous N-species fractionation closure (physics) + - `diagnostics.py` - Regime diagnostics reported beside every verdict (physics) + - `dispatcher.py` - The escape-regime dispatcher assembling the branches (physics) - `tests/` - Test suite. Each physics source has a 1:1 test file at `tests/test_.py`. Cross-cutting or coupling regression tests (e.g. `test_earth.py`) are the exception. @@ -168,7 +181,7 @@ pre-commit install -f ### Entry Points -- **Python API**: `from zephyrus.escape import EL_escape`. +- **Python API**: `from zephyrus.escape import EL_escape` (energy-limited rate); `from zephyrus import dispatch, EscapeInputs, DispatchSettings` (the regime dispatcher); `from zephyrus.collision import mass_loss` (giant-impact erosion). - **No CLI**: ZEPHYRUS is library-only; PROTEUS provides the simulator CLI that calls ZEPHYRUS. ## Testing Standards diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 5f6668fe..6be30b54 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -111,11 +111,16 @@ def test_zk23_zk86_cross_compilation_agreement(): (('O', 'Ne'), ('Ne', 'O')), (('O', 'Ar'), ('Ar', 'O')), ] + dev = {'M': 0.0, 'E': 0.0} for zk23_key, zk86_key in shared: b23, cls, _src = ZK23_TABLE2[zk23_key] b86 = b_zk86(*zk86_key, 1000.0) tol = 0.04 if cls == 'M' else 0.35 assert abs(b86 / b23 - 1.0) < tol, (zk23_key, cls) + dev[cls] = max(dev[cls], abs(b86 / b23 - 1.0)) + # The class structure is real: the measured rows agree more tightly + # than the estimated rows across the shared set. + assert dev['M'] < dev['E'] @pytest.mark.physics_invariant diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 34c1f4d7..94041927 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -334,3 +334,133 @@ def test_settings_and_inputs_error_contract(): dispatch(bad_m) res = dispatch(good) assert res.regime in REGIME_LABELS + + +def test_caldiroli_efficiency_mode_applies_and_falls_back(): + """The fitted-efficiency mode applies inside its box and falls back below. + + Above the fit's flux-to-density validity bound the dispatched + energy-limited candidate carries the converted fitted efficiency, which + must differ resolvably from the fixed default; below the bound the fit + is rejected and the dispatcher falls back to the fixed efficiency with + both flags recorded. + """ + settings = DispatchSettings(efficiency_mode='caldiroli') + strong = dispatch( + _inputs( + 5 * Me, + 1.8 * Re, + 1100.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=200.0, + a=0.05 * AU, + settings=settings, + ) + ) + eff = strong.diagnostics['hydrodynamic']['efficiency'] + assert 'efficiency_fallback_fixed' not in strong.flags + assert eff != pytest.approx(0.1, rel=0.05) + assert 0.0 < eff < 1.0 + weak = dispatch( + _inputs( + 5 * Me, + 1.8 * Re, + 1100.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.05 * AU, + settings=DispatchSettings(efficiency_mode='caldiroli'), + ) + ) + assert weak.flags.get('caldiroli_below_flux_bound') is True + assert weak.flags.get('efficiency_fallback_fixed') is True + assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx(0.1, rel=1e-12) + + +def test_t_exo_thermostat_mode_estimates_and_flags(): + """The thermostat exobase mode estimates a temperature and flags itself. + + On the bound CO2 case the estimator returns a temperature inside the + thermostat bracket (above the equilibrium temperature, below the upper + bracket edge), the flag records the mode, and the dispatch completes + with a consistent per-species sum. + """ + settings = DispatchSettings(T_exo_mode='thermostat') + res = dispatch( + _inputs( + 10 * Me, 1.8 * Re, 800.0, {'CO2': 1.0}, F_xuv=1.0, a=0.5 * AU, settings=settings + ) + ) + assert res.flags.get('T_exo_thermostat') is True + assert 800.0 <= res.diagnostics['hydrostatic']['T_exo'] <= 5.0e4 + if res.mdot > 0.0: + assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-6) + + +def test_extend_mode_truncated_extension_keeps_the_clamp(): + """When the extension itself unbinds, the clamp stands, flagged. + + A loosely bound hot H2 envelope truncates its own upper structure + before reaching the physical base pressure: the extend policy cannot + place the base there, so the clamped level stands and the truncation + is recorded alongside the clamp flags. The dispatch still returns a + consistent result (totality). + """ + settings = DispatchSettings(base_out_of_range='extend') + inp = _inputs( + 1 * Me, + 1.0 * Re, + 2000.0, + {'H2': 1.0}, + F_xuv=10.0, + p_top=1e-6, # requested; the bound structure truncates far deeper + settings=settings, + ) + res = dispatch(inp) + assert res.flags.get('base_extension_truncated') is True + assert res.flags.get('base_clamped') is True + assert res.regime in REGIME_LABELS + assert math.isfinite(res.mdot) + + +def test_stale_input_and_boreas_fallback_flags(monkeypatch): + """Data-quality and base-method fallbacks surface as flags, not errors. + + An unconverged upstream atmosphere marks the result ``stale_input`` + without changing the contract; requesting the BOREAS base method with + the dependency absent falls back to the Lopez base, flagged, and the + negative-flux error contract still raises. + """ + import sys + + monkeypatch.setitem(sys.modules, 'boreas', None) # forces ImportError + settings = DispatchSettings(base_method='boreas') + inp = _inputs( + 5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, settings=settings, atm_converged=False + ) + res = dispatch(inp) + assert res.flags.get('stale_input') is True + assert res.flags.get('base_method_fallback') == 'lopez' + assert res.regime in REGIME_LABELS + bad = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) + bad.F_xuv = -1.0 + with pytest.raises(ValueError, match='F_xuv'): + dispatch(bad) + + +def test_settings_option_raises_cover_every_knob(): + """Every enumerated settings knob rejects an unknown value. + + The four option strings each raise with a message naming the knob, so + a typo in a configuration surfaces at validation rather than as a + silent default. The default settings validate silently. + """ + with pytest.raises(ValueError, match='base_out_of_range'): + DispatchSettings(base_out_of_range='nonsense').validate() + with pytest.raises(ValueError, match='gate'): + DispatchSettings(gate='nonsense').validate() + with pytest.raises(ValueError, match='efficiency_mode'): + DispatchSettings(efficiency_mode='nonsense').validate() + with pytest.raises(ValueError, match='T_exo_mode'): + DispatchSettings(T_exo_mode='nonsense').validate() + DispatchSettings().validate() # the defaults are a valid configuration diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py index 3bbd0a3a..e39ea057 100644 --- a/tests/test_thermostat.py +++ b/tests/test_thermostat.py @@ -102,11 +102,16 @@ def test_hydrogen_system_brackets_the_black_lyalpha_rate(): exponential activation, and nothing finer. """ pref, tscale = LYA_BLACK + n_h, n_e = 1e8, 1e6 + ratios = [] for T in (1.0e4, 2.0e4): - n_h, n_e = 1e8, 1e6 q_mine = three_level_cooling('H', n_h, n_e, T) q_black = pref * n_e * n_h * math.exp(-tscale / T) + ratios.append(q_mine / q_black) assert 0.15 < q_mine / q_black < 1.5, T + # The frozen collision strengths fall behind the Black fit as the + # temperature rises, so the ratio declines with T. + assert ratios[1] < ratios[0] @pytest.mark.physics_invariant diff --git a/tools/check_test_quality.py b/tools/check_test_quality.py index 93e7e006..93dc8d6b 100644 --- a/tools/check_test_quality.py +++ b/tools/check_test_quality.py @@ -78,14 +78,26 @@ # and at least one @pytest.mark.reference_pinned test in its companion # test file. PHYSICS_SOURCES = { + 'atomic_data.py', + 'boiloff.py', 'collision.py', + 'diagnostics.py', + 'diffusion.py', + 'dispatcher.py', 'escape.py', + 'fractionation.py', + 'hydrodynamic.py', + 'hydrostatic.py', + 'knudsen.py', + 'profiles.py', + 'thermostat.py', } # Utility sources are exempt from the physics-invariant / reference-pinned # requirement but still subject to the anti-happy-path rules. UTILITY_SOURCES = { '__init__.py', + 'composition.py', 'constants.py', 'planets_parameters.py', } From 5255cab9a952dff33643ecb0ec06e054c501357f Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 16:11:25 +0200 Subject: [PATCH 015/113] Document the escape regime dispatcher across the docs site --- docs/Explanations/dispatcher.md | 48 ++++++++++++++++++++++ docs/Explanations/limitations.md | 19 +++++---- docs/Explanations/model.md | 8 ++-- docs/Reference/api/atomic_data.md | 10 +++++ docs/Reference/api/boiloff.md | 10 +++++ docs/Reference/api/composition.md | 10 +++++ docs/Reference/api/diagnostics.md | 12 ++++++ docs/Reference/api/diffusion.md | 17 ++++++++ docs/Reference/api/dispatcher.md | 10 +++++ docs/Reference/api/fractionation.md | 11 +++++ docs/Reference/api/hydrodynamic.md | 13 ++++++ docs/Reference/api/hydrostatic.md | 12 ++++++ docs/Reference/api/index.md | 39 ++++++++++++++---- docs/Reference/api/knudsen.md | 18 +++++++++ docs/Reference/api/profiles.md | 14 +++++++ docs/Reference/api/thermostat.md | 13 ++++++ docs/Reference/parameters.md | 63 ++++++++++++++++++++++++++++- docs/Validation/atomic_data.md | 18 +++++++++ docs/Validation/boiloff.md | 18 +++++++++ docs/Validation/diagnostics.md | 17 ++++++++ docs/Validation/diffusion.md | 18 +++++++++ docs/Validation/dispatcher.md | 17 ++++++++ docs/Validation/fractionation.md | 23 +++++++++++ docs/Validation/hydrodynamic.md | 20 +++++++++ docs/Validation/hydrostatic.md | 18 +++++++++ docs/Validation/knudsen.md | 17 ++++++++ docs/Validation/profiles.md | 17 ++++++++ docs/Validation/thermostat.md | 17 ++++++++ mkdocs.yml | 24 +++++++++++ 29 files changed, 528 insertions(+), 23 deletions(-) create mode 100644 docs/Explanations/dispatcher.md create mode 100644 docs/Reference/api/atomic_data.md create mode 100644 docs/Reference/api/boiloff.md create mode 100644 docs/Reference/api/composition.md create mode 100644 docs/Reference/api/diagnostics.md create mode 100644 docs/Reference/api/diffusion.md create mode 100644 docs/Reference/api/dispatcher.md create mode 100644 docs/Reference/api/fractionation.md create mode 100644 docs/Reference/api/hydrodynamic.md create mode 100644 docs/Reference/api/hydrostatic.md create mode 100644 docs/Reference/api/knudsen.md create mode 100644 docs/Reference/api/profiles.md create mode 100644 docs/Reference/api/thermostat.md create mode 100644 docs/Validation/atomic_data.md create mode 100644 docs/Validation/boiloff.md create mode 100644 docs/Validation/diagnostics.md create mode 100644 docs/Validation/diffusion.md create mode 100644 docs/Validation/dispatcher.md create mode 100644 docs/Validation/fractionation.md create mode 100644 docs/Validation/hydrodynamic.md create mode 100644 docs/Validation/hydrostatic.md create mode 100644 docs/Validation/knudsen.md create mode 100644 docs/Validation/profiles.md create mode 100644 docs/Validation/thermostat.md diff --git a/docs/Explanations/dispatcher.md b/docs/Explanations/dispatcher.md new file mode 100644 index 00000000..61704af2 --- /dev/null +++ b/docs/Explanations/dispatcher.md @@ -0,0 +1,48 @@ +# The escape-regime dispatcher + +Atmospheric escape is not one process. Depending on how tightly an atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are, the mass loss is carried by a bolometrically driven boil-off, by an XUV-driven hydrodynamic wind, or by particle-by-particle thermal evaporation from a hydrostatic exosphere. Each regime has its own physics and its own rate prescription, and applying one of them outside its regime produces rates that are wrong by orders of magnitude. The dispatcher classifies an atmosphere into its regime and returns the corresponding rate in a single call: `zephyrus.dispatch` takes one planetary state (scalars plus an atmosphere profile) and returns one regime label, one bulk mass-loss rate, per-species rates that sum to it, flags, and a diagnostics container. + +The energy-limited entry point [`EL_escape`](model.md) is unchanged and remains the prescription PROTEUS calls in coupled runs; the dispatcher is an additive API that supersets it. + +## The three regimes and the evaluation order + +The dispatcher evaluates a fixed sequence. Every step is closed-form algebra, interpolation on the supplied profile, one-dimensional quadratures, or scalar root finds; no differential equation is integrated anywhere, so a dispatch costs a few milliseconds. + +**1. Boil-off.** A young or strongly heated atmosphere can be so weakly bound that it flows out on the planet's own thermal energy, before XUV heating matters. The activation criterion is the restricted Jeans parameter $\Lambda = G M_p \mu / (k_B T_\mathrm{eq} R_p)$ (Fossati et al. 2017) built with the composition mean molecular mass: for isothermal gas $\Lambda = 2 R_B / R_p$ identically, so the Owen & Wu (2016) shutoff at $R_p / R_B = 0.1$ is $\Lambda = 20$ for every composition. Below the threshold the rate is their closed-form transonic Parker wind (exact Lambert-W form) capped by the Bondi-limited supply of Gupta & Schlichting (2020). Past the threshold the same machinery survives as a residual capped by the interior luminosity (Gupta & Schlichting 2019), so the late, slow tail of core-powered mass loss is represented without adjudicating how long it lasts. The boil-off test runs first because an atmosphere boiling on bolometric heating has not yet built the stable base an XUV wind launches from (Owen & Schlichting 2024). + +**2. Hydrodynamic escape.** Past the boil-off gate the dispatcher locates the XUV wind base on the profile (by default the Lopez 2017 level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar), sets the wind temperature by a local balance of photoionization heating against radiative cooling (the thermostat below), and computes both hydrodynamic limits: the energy-limited rate in the Erkaev et al. (2007) form with the tidal correction, and the radiation-recombination-limited rate of Murray-Clay et al. (2009). The smaller of the two is the candidate, and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. The selection mechanism is itself reported, because min() selects the recombination-limited rate two physically different ways: genuine recombination saturation at modest binding, and exponential barometric suppression at strong binding, where calling the result recombination-limited would be a category error. + +**3. The Knudsen switch.** A hydrodynamic wind only exists if the gas is still collisional at its sonic point. The switch compares the Maxwell mean free path against the analytic sonic-point scale height (Chatterjee & Pierrehumbert 2026, their Eqs. 17 and 18), with mixture-weighted collision cross sections from tabulated collision integrals (Laricchiuta et al. 2009), a diffusion-inversion route for hydrogen, and a geometric last resort, each carrying a provenance class. At or below the threshold (default $\mathrm{Kn}_\mathrm{sc} = 1$) the hydrodynamic label is confirmed and the fractionation closure partitions the rate over species; above it the point re-routes to the hydrostatic branch. For evolutionary use a previous regime label activates a hysteresis window around the threshold so a time-stepping track cannot chatter between branches. + +**4. Hydrostatic escape.** Where no wind exists, escape is per species: Jeans effusion from the exobase with the kinetic enhancement factor measured in direct simulation Monte Carlo runs (Volkov et al. 2011), capped by the diffusion-limited supply through the background gas and combined by the harmonic mean of Yelle (2024). All exobase quantities are evaluated on a Bates-profile upper structure extended above the supplied profile at a prescribed exobase temperature, never on photospheric values, because the two can differ by an order of magnitude in Jeans parameter and the photospheric shortcut biases rates toward false retention by up to three decades (Johnson et al. 2013). An escape-temperature gate re-routes thermally unstable exospheres back to the hydrodynamic rate; both the neutral and the plasma escape temperatures are always computed, and points where the two conventions disagree are flagged as contested with both rates recorded, because the ion physics that would decide them is not modeled in this version. + +**5. The Roche screen.** Before the label is finalized, the active flow radius of the winning branch (the Parker sonic radius, the larger of the XUV and sonic radii, or the exobase radius) is tested against the periapsis Hill radius. A flow that reaches the Hill sphere is not described by any of the three regimes: the point is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag distinguishing geometries whose Hill sphere sits inside the photosphere. Near misses raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there. + +**6. The bolometric residual.** The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. + +## The wind-temperature thermostat + +The hydrodynamic branch does not assume the canonical $10^4$ K wind. The wind temperature comes from a local balance at the wind base between photoionization heating (a monochromatic-front approximation) and four radiative cooling channels: atomic line cooling by H, C, C+, N, N+, O, and O+ in three-level statistical equilibrium (on the Nakayama et al. 2022 atomic data), the CO2 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018), and recombination cooling (with the Badnell 2006 fit). The balance is bracketed between the equilibrium temperature and $5 \times 10^4$ K; a balance with no root clamps to the nearer edge with a flag. The channels can be toggled individually for attribution experiments, but a configuration with every channel off is rejected. The blind spot of a local, single-level balance is the temperature structure through the sonic region, which is a stated limitation rather than a solved problem; rates computed with this wind temperature inherit it. + +## Fractionation + +A confirmed hydrodynamic wind does not carry all species equally: heavy species lag the outflow through binary diffusion, and below per-species thresholds they drop out of the wind entirely. The fractionation closure solves the simultaneous N-species problem (the constant-composition closure of the Zahnle et al. 1990 multispecies wind system, generalizing Hunten et al. 1987) with active-set dropout, on binary diffusion coefficients that each carry a provenance class (measured, estimated, or scaled). The returned per-species rates are non-negative and sum to the bulk rate at machine precision. On the boil-off and overflow branches fractionation is off and the split follows reservoir mass fractions, matching the energy-limited protocol; the hydrostatic branch is natively per-species. + +## Boundaries are bands, not lines + +Every criterion in the dispatcher carries genuine physical width, and the diagnostics container makes that width visible instead of hiding it behind a sharp switch. The Knudsen threshold's physical band is 0.1 to 3 (heating-geometry physics: a sharp heating layer transitions near 0.1, distributed heating near 1; Johnson et al. 2013), and the container reports the counterfactual labels at both band edges beside every verdict. The boil-off activation threshold spans 15 to 35 across the literature. The container also reports, per call: the transonic energy criterion of Johnson et al. (2013), the Jeans-parameter triple of Guo (2024), both escape temperatures with the local ionization fraction, the tidally corrected critical exobase temperature of Erkaev et al. (2007), the threshold-potential screens, the min(EL, RR) selection mechanism, a boil-off termination timescale check (Tang et al. 2024), a snapshot self-consistency screen, and the coefficient provenance classes per species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. + +## Configuration surface + +All knobs live on `DispatchSettings`; the defaults are the documented reference choices, listed in the [parameter reference](../Reference/parameters.md). The main ones: the wind-base method (`lopez`, `fixed_pressure`, or `boreas`, the last falling back to `lopez` with a flag when the optional BOREAS dependency is absent), the out-of-range policy when a profile is too shallow for the physical base (`clamp` or `extend`), the Knudsen threshold and hysteresis window, the hydrostatic gate convention (`neutral` or `plasma`), the escape efficiency and its mode (`fixed` or the `caldiroli` fitted efficiency, converted to the Erkaev geometry and guarded against its complex-valued region), the prescribed exobase temperature, the four cooling toggles, and the fractionation toggle. + +## Limitations + +The dispatcher's own limitations, beyond those listed on the [limitations page](limitations.md): + +- Hydrostatic heavy-element rates are lower limits. The non-thermal channels that dominate heavy-species loss from hydrostatic exospheres (ion outflow, photochemical ejection, sputtering) are not modeled; every hydrostatic result carries a flag saying so, and contested points report both branch rates. +- The exobase temperature is prescribed, not solved. The Jeans rate depends exponentially on it, which makes it the branch's dominant sensitivity; the optional thermostat estimator is biased high by construction (a conduction-free local balance) and is not the default. +- The thermostat evaluates one level. The temperature structure through the sonic region is not modeled, and the wind-temperature sensitivity propagates into the sonic-point density and hence into the Knudsen switch itself. +- The kinetic enhancement factor on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond, a flagged extrapolation. +- The switch inherits the base-pressure choice. The sonic-point density scales with the base density, so the wind-base level sets where the switch fires; the base-method setting exposes that dependence rather than resolving it. +- Impact-driven escape is not dispatched. The giant-impact erosion law ships in [`zephyrus.collision`](../Reference/api/collision.md) and a label is reserved, but the dispatcher does not route to it. diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index a880c6e4..86bf7072 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -1,14 +1,14 @@ # Limitations -ZEPHYRUS implements the **energy-limited (EL) approximation** to hydrodynamic atmospheric escape, given by Eq. (1) of the [model overview](model.md), and the **giant-impact erosion scaling law** of Eq. (4). Both are deliberate simplifications of much richer physical problems. The most important regimes and processes the model does not cover are summarised below. +ZEPHYRUS implements the **energy-limited (EL) approximation** to hydrodynamic atmospheric escape, given by Eq. (1) of the [model overview](model.md), the **giant-impact erosion scaling law** of Eq. (4), and the **[regime dispatcher](dispatcher.md)**, which classifies an atmosphere into the boil-off, hydrodynamic, or hydrostatic regime before choosing a rate and partitions it over species. All are deliberate simplifications of much richer physical problems. The most important regimes and processes the package does not cover, and which entry point covers what, are summarised below. --- ## What ZEPHYRUS *does* model -Two channels. The first is bulk hydrodynamic escape driven by stellar XUV irradiation, in the energy-limited approximation, with an optional tidal correction (Eq. 2 of the [model overview](model.md)). The tidal correction is defined only outside the Roche lobe, where the Hill-to-XUV radius ratio $\xi > 1$; ZEPHYRUS raises an error for $\xi \le 1$, at which point the atmosphere reaches the Roche lobe and the energy-limited approximation no longer holds. The mass-loss rate is partitioned across atmospheric species in proportion to their elemental mass mixing ratios. The second channel is the fraction of the target's atmosphere eroded by a single giant impact, from a fitted power law in the collision speed, mass ratio, density ratio, and impact angle (Eq. 4 of the [model overview](model.md)). +Three entry points. The first is bulk hydrodynamic escape driven by stellar XUV irradiation, in the energy-limited approximation, with an optional tidal correction (Eq. 2 of the [model overview](model.md)). The tidal correction is defined only outside the Roche lobe, where $\xi > 1$ with $\xi$ measured from the radius the `scaling` argument selects; ZEPHYRUS raises an error for $\xi \le 1$, at which point the atmosphere reaches the Roche lobe and the energy-limited approximation no longer holds. The mass-loss rate is partitioned across atmospheric species in proportion to their elemental mass mixing ratios. The second is the fraction of the target's atmosphere eroded by a single giant impact, from a fitted power law in the collision speed, mass ratio, density ratio, and impact angle (Eq. 4 of the [model overview](model.md)). The third is the [regime dispatcher](dispatcher.md), which adds bolometrically driven boil-off, a radiation-recombination-limited cap with a radiatively cooled wind temperature, per-species Jeans escape with a diffusion-limited supply, a collisionality switch between the fluid and kinetic regimes, Roche-overflow handling, and N-species fractionation of the hydrodynamic outflow. -Everything below is **not modelled.** +Everything below is **not modelled**, or modelled only by the dispatcher entry point where stated. --- @@ -29,30 +29,29 @@ The collision channel is a single fitted power law, not an impact simulation, an The EL approximation assumes a fixed fraction $\epsilon$ of absorbed XUV energy goes into driving the outflow. This breaks down in several ways: -- **Radiative cooling is ignored.** Atomic line cooling, molecular emission, and ionisation losses can divert XUV energy away from heating the bulk gas, reducing the effective $\epsilon$. ZEPHYRUS treats $\epsilon$ as a constant input rather than computing it self-consistently. Setting $\epsilon = 1$ in particular is a non-physical upper limit on the mass-loss rate. -- **Fractionation in the outflow is not captured.** When the particle flux drops below the critical value required to drag heavy species along, the outflow becomes compositionally fractionated: hydrogen escapes preferentially and the residual atmosphere is enriched in heavy species. ZEPHYRUS removes everything in bulk. Fractionation will be implemented in the future. -- **$\epsilon$ is held constant in time.** In reality the efficiency evolves with planet mass, radius, and incident flux. Fixed-$\epsilon$ models can overestimate mass loss at late times. +- **Radiative cooling is ignored by `EL_escape`.** Atomic line cooling, molecular emission, and ionisation losses can divert XUV energy away from heating the bulk gas, reducing the effective $\epsilon$. `EL_escape` treats $\epsilon$ as a constant input rather than computing it self-consistently, and setting $\epsilon = 1$ in particular is a non-physical upper limit on the mass-loss rate. The dispatcher partially addresses this: its wind-temperature thermostat balances photoionization heating against four radiative cooling channels, and its radiation-recombination cap bounds the rate where recombination radiates the energy away, but the energy-limited efficiency itself remains an input there too (fixed, or the fitted efficiency of Caldiroli et al. 2022). +- **Fractionation in the outflow is not captured by `EL_escape`.** When the particle flux drops below the critical value required to drag heavy species along, the outflow becomes compositionally fractionated: hydrogen escapes preferentially and the residual atmosphere is enriched in heavy species. `EL_escape` removes everything in bulk. The dispatcher implements this through the N-species fractionation closure, with per-species dropout thresholds and provenance-classed diffusion coefficients. +- **$\epsilon$ is held constant in time.** In reality the efficiency evolves with planet mass, radius, and incident flux. Fixed-$\epsilon$ models can overestimate mass loss at late times; the dispatcher's fitted-efficiency mode captures the potential dependence but not a time dependence beyond it. --- ## Non-hydrodynamic escape -These processes operate on a different physical basis (kinetic rather than fluid) and are neglected because they are subdominant in the high-XUV regime that ZEPHYRUS targets: +These processes operate on a different physical basis (kinetic rather than fluid). Jeans escape is now implemented: the dispatcher's hydrostatic branch evaluates per-species Jeans effusion with a kinetic enhancement factor and a diffusion-limited supply cap, on an extended upper structure. The remaining kinetic channels are not modelled by any entry point: -- Jeans escape - Ion pickup - Charge exchange - Photochemical escape - Sputtering - Polar wind / unmagnetised ion outflow -For present-day Earth and Venus these mechanisms dominate over hydrodynamic escape, with total non-thermal rates around $\sim 10^3$ g s$^{-1}$; many orders of magnitude below the EL rates ZEPHYRUS produces during the early evolution phase. +For present-day Earth and Venus these mechanisms dominate over hydrodynamic escape, with total non-thermal rates around $\sim 10^3$ g s$^{-1}$; many orders of magnitude below the EL rates ZEPHYRUS produces during the early evolution phase. Because they are absent, the dispatcher's hydrostatic heavy-element rates are lower limits, and it flags every hydrostatic result accordingly; grid points where the neutral and plasma escape-temperature conventions disagree are flagged as contested, with both branch rates reported, because the unmodelled ion physics decides them. --- ## Other escape drivers -**Core-powered mass loss** is not implemented. This mechanism is driven by the planet's own internal heat and dominates for low-gravity planets at high equilibrium temperatures (~500–2000 K) over $\sim 10^9$ yr timescales. It is complementary to XUV-driven escape rather than competing with it. +**Core-powered mass loss** is not implemented in `EL_escape`. This mechanism is driven by the planet's own internal heat and dominates for low-gravity planets at high equilibrium temperatures (~500–2000 K) over $\sim 10^9$ yr timescales. The dispatcher's bolometric branch covers it: boil-off below the activation threshold, and a luminosity-capped residual past it, which represents the long tail without adjudicating the open dispute over how long it survives. --- diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index fc2d65de..6f55e31d 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -1,8 +1,8 @@ # ZEPHYRUS model overview -ZEPHYRUS models two channels of atmospheric mass loss for rocky exoplanets coupled to the [PROTEUS](https://proteus-framework.org) interior–atmosphere framework: the continuous, bulk hydrodynamic escape driven by stellar XUV irradiation, and the impulsive erosion caused by giant impacts during accretion. The continuous channel implements an energy-limited (EL) formalism following Watson et al. (1981) [^watson] and Lopez & Fortney (2013) [^lopez]; it is called at each PROTEUS time step with the current planetary radius and mass, the stellar XUV flux supplied by [MORS](https://proteus-framework.org/MORS), and the escape radius computed from the atmospheric structure produced by AGNI or JANUS. The mass-loss rate it returns is distributed across atmospheric species according to their elemental mass mixing ratios, so the atmosphere is depleted in bulk without elemental fractionation. The impulsive channel implements the giant-impact erosion scaling law of Kegerreis et al. (2020) [^kegerreis], which returns the fraction of the target's atmosphere removed by a single collision. +ZEPHYRUS models atmospheric mass loss for rocky exoplanets coupled to the [PROTEUS](https://proteus-framework.org) interior–atmosphere framework: the continuous, bulk hydrodynamic escape driven by stellar XUV irradiation, the impulsive erosion caused by giant impacts during accretion, and, through the [regime dispatcher](dispatcher.md), the boil-off, hydrodynamic, and hydrostatic escape regimes with per-species fractionation. The continuous channel implements an energy-limited (EL) formalism following Watson et al. (1981) [^watson] and Lopez & Fortney (2013) [^lopez]; it is called at each PROTEUS time step with the current planetary radius and mass, the stellar XUV flux supplied by [MORS](https://proteus-framework.org/MORS), and the escape radius computed from the atmospheric structure produced by AGNI or JANUS. The mass-loss rate it returns is distributed across atmospheric species according to their elemental mass mixing ratios, so the atmosphere is depleted in bulk without elemental fractionation. The impulsive channel implements the giant-impact erosion scaling law of Kegerreis et al. (2020) [^kegerreis], which returns the fraction of the target's atmosphere removed by a single collision. -A model parameter reference can be found [here](../Reference/parameters.md). +This page describes the energy-limited prescription and the giant-impact law, the two entry points PROTEUS consumes today; the [regime dispatcher](dispatcher.md) page describes the standalone dispatcher that classifies an atmosphere into its escape regime before choosing a rate. A model parameter reference can be found [here](../Reference/parameters.md). ## Energy-limited escape @@ -68,9 +68,9 @@ More about this in its dedicated [page](proteus.md). ## Regime of validity -The EL formalism is appropriate in the high-irradiation, hydrodynamic regime that dominates atmospheric loss during the first $\sim 10^6$–$10^8$ yr of evolution for close-in rocky planets [^watson][^lammer2003]. Outside this regime—at lower XUV fluxes or for less extended atmospheres—non-thermal escape (Jeans escape, ion pickup, charge exchange) becomes comparable to or exceeds the hydrodynamic rate, and the bulk EL prescription no longer applies. ZEPHYRUS does not currently include these processes; users should verify that the integrated XUV-driven loss exceeds non-thermal estimates (e.g. $\sim 10^7$–$10^8$ g s$^{-1}$ for an Earth-mass planet; Kislyakova et al. 2014 [^kislyakova]) before interpreting model outputs. +The EL formalism is appropriate in the high-irradiation, hydrodynamic regime that dominates atmospheric loss during the first $\sim 10^6$–$10^8$ yr of evolution for close-in rocky planets [^watson][^lammer2003]. Outside this regime—at lower XUV fluxes or for less extended atmospheres—non-thermal escape (Jeans escape, ion pickup, charge exchange) becomes comparable to or exceeds the hydrodynamic rate, and the bulk EL prescription no longer applies. The [regime dispatcher](dispatcher.md) covers the thermal side of that transition (Jeans escape with a diffusion-limited supply cap) and classifies each state before choosing a rate; the EL entry point itself does not. When using `EL_escape` alone, users should verify that the integrated XUV-driven loss exceeds non-thermal estimates (e.g. $\sim 10^7$–$10^8$ g s$^{-1}$ for an Earth-mass planet; Kislyakova et al. 2014 [^kislyakova]) before interpreting model outputs. -Similarly, the bulk-removal assumption breaks down when the hydrodynamic particle flux drops below the critical flux required to drag heavy species against gravity, at which point compositional fractionation in the outflow becomes significant [^wordsworth2018][^cherubim2024]. Following Yoshida et al. (2022) [^yoshida], the critical flux for H$_2$O in an H$_2$ background is $\approx 1.9 \times 10^{8}$ g s$^{-1}$. +Similarly, the bulk-removal assumption breaks down when the hydrodynamic particle flux drops below the critical flux required to drag heavy species against gravity, at which point compositional fractionation in the outflow becomes significant [^wordsworth2018][^cherubim2024]. Following Yoshida et al. (2022) [^yoshida], the critical flux for H$_2$O in an H$_2$ background is $\approx 1.9 \times 10^{8}$ g s$^{-1}$. The [regime dispatcher](dispatcher.md) resolves this regime explicitly: its fractionation closure solves the simultaneous N-species partition with per-species dropout thresholds instead of removing everything in bulk. The giant-impact erosion law (Eq. 4) is constrained by simulations spanning target masses of roughly 0.3 to 3 $M_\oplus$, impactor masses down to about 0.05 $M_\oplus$, bulk densities from about half to double Earth's, contact speeds of 1 to 3 $v_\mathrm{esc}$, all impact angles, and thin atmospheres of order 1 percent of the planet mass. The median deviation of the simulations from the law is 9 percent, rising to about 20 percent for slow, head-on impacts, whose outcomes are chaotic. The loss depends only mildly on the atmosphere mass in this thin-atmosphere regime, with a factor of 10 less atmosphere increasing the eroded fraction by roughly 10 percent; substantially thicker atmospheres, which can cushion the impactor, fall outside the law's regime. diff --git a/docs/Reference/api/atomic_data.md b/docs/Reference/api/atomic_data.md new file mode 100644 index 00000000..58f19c0c --- /dev/null +++ b/docs/Reference/api/atomic_data.md @@ -0,0 +1,10 @@ +# zephyrus.atomic_data + +::: zephyrus.atomic_data + options: + members: + - badnell_alpha_rr + - alpha_case_b + - co2_band_cooling + - o_finestructure_cooling + show_source: true diff --git a/docs/Reference/api/boiloff.md b/docs/Reference/api/boiloff.md new file mode 100644 index 00000000..1d846f21 --- /dev/null +++ b/docs/Reference/api/boiloff.md @@ -0,0 +1,10 @@ +# zephyrus.boiloff + +::: zephyrus.boiloff + options: + members: + - lambda_restricted + - parker_mach + - bolometric_candidate + - tang_timescale_check + show_source: true diff --git a/docs/Reference/api/composition.md b/docs/Reference/api/composition.md new file mode 100644 index 00000000..46ca0610 --- /dev/null +++ b/docs/Reference/api/composition.md @@ -0,0 +1,10 @@ +# zephyrus.composition + +::: zephyrus.composition + options: + members: + - parse_formula + - species_mass_amu + - atomize + - mean_particle_mass + show_source: true diff --git a/docs/Reference/api/diagnostics.md b/docs/Reference/api/diagnostics.md new file mode 100644 index 00000000..18e3e47f --- /dev/null +++ b/docs/Reference/api/diagnostics.md @@ -0,0 +1,12 @@ +# zephyrus.diagnostics + +::: zephyrus.diagnostics + options: + members: + - q_net_over_qc + - guo_triple + - erkaev_tc + - along_profile_fluid_check + - self_consistency_screen + - potential_screens + show_source: true diff --git a/docs/Reference/api/diffusion.md b/docs/Reference/api/diffusion.md new file mode 100644 index 00000000..9fe3cf88 --- /dev/null +++ b/docs/Reference/api/diffusion.md @@ -0,0 +1,17 @@ +# zephyrus.diffusion + +::: zephyrus.diffusion + options: + members: + - diameters + - b_from_sn88 + - sn88_fit + - b_zk86 + - eq10 + - Row + - build_rows + - bmatrix + - masses_g + - b_pair + - b_mixture + show_source: true diff --git a/docs/Reference/api/dispatcher.md b/docs/Reference/api/dispatcher.md new file mode 100644 index 00000000..8ff4763e --- /dev/null +++ b/docs/Reference/api/dispatcher.md @@ -0,0 +1,10 @@ +# zephyrus.dispatcher + +::: zephyrus.dispatcher + options: + members: + - DispatchSettings + - EscapeInputs + - EscapeResult + - dispatch + show_source: true diff --git a/docs/Reference/api/fractionation.md b/docs/Reference/api/fractionation.md new file mode 100644 index 00000000..ca9c73fb --- /dev/null +++ b/docs/Reference/api/fractionation.md @@ -0,0 +1,11 @@ +# zephyrus.fractionation + +::: zephyrus.fractionation + options: + members: + - solve_closure + - solve_fixed_active + - first_threshold + - closure_per_species + - unfractionated_split + show_source: true diff --git a/docs/Reference/api/hydrodynamic.md b/docs/Reference/api/hydrodynamic.md new file mode 100644 index 00000000..f4d9a995 --- /dev/null +++ b/docs/Reference/api/hydrodynamic.md @@ -0,0 +1,13 @@ +# zephyrus.hydrodynamic + +::: zephyrus.hydrodynamic + options: + members: + - hill_radius_periapsis + - k_tide + - el_rate + - caldiroli_efficiency + - wind_mean_masses + - rr_chain + - selection_mechanism + show_source: true diff --git a/docs/Reference/api/hydrostatic.md b/docs/Reference/api/hydrostatic.md new file mode 100644 index 00000000..b7abd87d --- /dev/null +++ b/docs/Reference/api/hydrostatic.md @@ -0,0 +1,12 @@ +# zephyrus.hydrostatic + +::: zephyrus.hydrostatic + options: + members: + - volkov_flat_factor + - jeans_effusion_velocity + - bates_extension + - find_exobase + - hydrostatic_rates + - gate_unstable + show_source: true diff --git a/docs/Reference/api/index.md b/docs/Reference/api/index.md index 9dcd73f5..a90e5471 100644 --- a/docs/Reference/api/index.md +++ b/docs/Reference/api/index.md @@ -1,24 +1,49 @@ # API overview -This is an overview of ZEPHYRUS' API for the user's reference. If you want to understand the underlying model, please visit the [model overview](../../Explanations/model.md).
+This is an overview of ZEPHYRUS' API for the user's reference. If you want to understand the underlying model, please visit the [model overview](../../Explanations/model.md) and the [regime dispatcher](../../Explanations/dispatcher.md) pages.
| Module | Description | |---|---| -| **Physical model** | | +| **Escape prescriptions** | | | [`zephyrus.escape`](escape.md) | `EL_escape`: energy-limited atmospheric mass-loss rate | +| [`zephyrus.dispatcher`](dispatcher.md) | `dispatch`: the escape-regime dispatcher (one call, one regime, one rate) | +| [`zephyrus.boiloff`](boiloff.md) | Bolometrically driven boil-off with Bondi and luminosity caps | +| [`zephyrus.hydrodynamic`](hydrodynamic.md) | Energy-limited and radiation-recombination-limited rates | +| [`zephyrus.hydrostatic`](hydrostatic.md) | Per-species Jeans escape with the diffusion-limited supply cap | | [`zephyrus.collision`](collision.md) | `mass_loss`: fractional atmospheric loss in a giant impact | -| **Reference values** | | +| **Supporting physics** | | +| [`zephyrus.profiles`](profiles.md) | Atmosphere-profile container and the escape working levels | +| [`zephyrus.thermostat`](thermostat.md) | Wind temperature from local heating against radiative cooling | +| [`zephyrus.knudsen`](knudsen.md) | Collision cross sections and the sonic-point Knudsen switch | +| [`zephyrus.fractionation`](fractionation.md) | Simultaneous N-species fractionation closure | +| [`zephyrus.diagnostics`](diagnostics.md) | Regime diagnostics reported beside every dispatch verdict | +| **Reference data** | | +| [`zephyrus.diffusion`](diffusion.md) | Binary diffusion coefficient library with provenance classes | +| [`zephyrus.atomic_data`](atomic_data.md) | Cooling data tables and closed-form rate coefficients | +| [`zephyrus.composition`](composition.md) | Element masses, formula parsing, and composition handling | | [`zephyrus.constants`](constants.md) | Physical constants and unit conversions (SI and CGS) | -| [`zephyrus.planets_parameters`](planet_parameters.md) | Sun, Earth, and TOI-561 system reference values | +| [`zephyrus.planets_parameters`](planet_parameters.md) | Sun, Earth, Jupiter, and TOI-561 system reference values | The **source tree** is given by: ``` src/zephyrus + ├── atomic_data.py # Cooling data tables and rate coefficients + ├── boiloff.py # Bolometrically driven boil-off escape ├── collision.py # Giant-impact atmospheric mass loss (mass_loss) + ├── composition.py # Element masses, formula parsing, atomization ├── constants.py # Physical constants and unit conversions + ├── diagnostics.py # Regime diagnostics beside every verdict + ├── diffusion.py # Binary diffusion coefficients with provenance + ├── dispatcher.py # The escape-regime dispatcher (dispatch) ├── escape.py # Energy-limited atmospheric escape (EL_escape) - ├── __init__.py # Package entry point - └── planets_parameters.py # Sun, Earth, and TOI-561 reference values -``` \ No newline at end of file + ├── fractionation.py # N-species fractionation closure + ├── hydrodynamic.py # EL and radiation-recombination-limited rates + ├── hydrostatic.py # Jeans escape with diffusion-limited supply + ├── __init__.py # Package entry point and top-level exports + ├── knudsen.py # Cross sections and the Knudsen switch + ├── planets_parameters.py # Sun, Earth, Jupiter, TOI-561 reference values + ├── profiles.py # Profile container and escape working levels + └── thermostat.py # Wind-temperature thermostat +``` diff --git a/docs/Reference/api/knudsen.md b/docs/Reference/api/knudsen.md new file mode 100644 index 00000000..e0f29d8d --- /dev/null +++ b/docs/Reference/api/knudsen.md @@ -0,0 +1,18 @@ +# zephyrus.knudsen + +::: zephyrus.knudsen + options: + members: + - lar_omega_star + - lar_sigma2_omega + - lar_sigma_diff + - viscosity_pure + - sigma_zk90_hydrogen + - sigma_geometric + - sigma_species + - sigma_mixture + - mean_free_path + - sonic_scale_height + - kn_sonic + - effective_threshold + show_source: true diff --git a/docs/Reference/api/profiles.md b/docs/Reference/api/profiles.md new file mode 100644 index 00000000..43ddd8c6 --- /dev/null +++ b/docs/Reference/api/profiles.md @@ -0,0 +1,14 @@ +# zephyrus.profiles + +::: zephyrus.profiles + options: + members: + - Profile + - isothermal_profile + - interp_at_pressure + - pressure_at_radius + - photospheric_level + - lopez_base_pressure + - wind_base_level + - atomized_element_fractions + show_source: true diff --git a/docs/Reference/api/thermostat.md b/docs/Reference/api/thermostat.md new file mode 100644 index 00000000..d235bd36 --- /dev/null +++ b/docs/Reference/api/thermostat.md @@ -0,0 +1,13 @@ +# zephyrus.thermostat + +::: zephyrus.thermostat + options: + members: + - three_level_populations + - three_level_cooling + - ionization_fraction + - front_constants + - recombination_alpha + - balance_at + - solve_wind_temperature + show_source: true diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index e8834969..e65135dd 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -8,10 +8,14 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | Name | Symbol | Value | Units | |---|---|---|---| -| `kb` | $k_B$ | $1.38 \times 10^{-23}$ | J K⁻¹ | +| `kb` | $k_B$ | $1.380649 \times 10^{-23}$ (exact) | J K⁻¹ | +| `kb_cgs` | $k_B$ | $1.380649 \times 10^{-16}$ (exact) | erg K⁻¹ | | `G` | $G$ | $6.6743 \times 10^{-11}$ | m³ kg⁻¹ s⁻² | | `G_cgs` | $G_\mathrm{cgs}$ | $6.6743 \times 10^{-8}$ | cm³ g⁻¹ s⁻² | -| `c` | $c$ | $2.99792458 \times 10^{8}$ | m s⁻¹ | +| `c` | $c$ | $2.99792458 \times 10^{8}$ (exact) | m s⁻¹ | +| `h_planck` | $h$ | $6.62607015 \times 10^{-34}$ (exact) | J s | +| `m_p` | $m_p$ | $1.67262192369 \times 10^{-27}$ | kg | +| `amu` | $u$ | $1.66053906660 \times 10^{-27}$ | kg | ## Unit conversions (`constants.py`) @@ -23,6 +27,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `au2cm` | $1.496 \times 10^{13}$ | au → cm | | `ergpersecondtowatt` | $10^{-7}$ | erg s⁻¹ → W | | `ergcm2stoWm2` | $10^{-3}$ | erg s⁻¹ cm⁻² → W m⁻² | +| `ev2joule` | $1.602176634 \times 10^{-19}$ (exact) | eV → J | --- @@ -53,6 +58,13 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For `Fxuv_earth_10Myr` is taken from Fig. 9 of Wordsworth et al. (2018). +### Jupiter (IAU 2015 nominal values) + +| Name | Symbol | Value | Units | +|---|---|---|---| +| `Rjup` | $R_\mathrm{Jup}$ | $7.1492 \times 10^{7}$ | m | +| `Mjup` | $M_\mathrm{Jup}$ | $1.8982 \times 10^{27}$ | kg | + --- ## TOI-561 reference values (`planets_parameters.py`) @@ -74,3 +86,50 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `R_TOI561b` | $1.37\,R_\oplus$ | $0.04\,R_\oplus$ | m | | `M_TOI561b` | $2.24\,M_\oplus$ | $0.20\,M_\oplus$ | kg | | `a_TOI561b` | $0.0106$ | $0.0004$ | au | + + +--- + +## Dispatcher settings (`dispatcher.DispatchSettings`) + +The knobs of the [regime dispatcher](../Explanations/dispatcher.md). Every default is the documented reference choice; the criteria thresholds carry the physical bands stated in the dispatcher page, which the diagnostics report beside every verdict. + +| Name | Default | Options / units | Meaning | +|---|---|---|---| +| `base_method` | `'lopez'` | `'lopez'`, `'fixed_pressure'`, `'boreas'` | How the XUV wind base is located on the profile. The Lopez (2017) level is $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar; `'boreas'` uses the optional BOREAS solver and falls back to `'lopez'` with a flag when it is absent or does not converge. | +| `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | Policy when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Profiles reaching below 1 nanobar never engage it. | +| `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023). | +| `P_base_fixed` | 5.0 | Pa | Base pressure for the `'fixed_pressure'` method only. | +| `kn_crit` | 1.0 | – | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | +| `kn_hysteresis` | 1.5 | – | Hysteresis window factor around `kn_crit`, consumed only when a previous regime label is supplied. | +| `gate` | `'neutral'` | `'neutral'`, `'plasma'` | Which escape temperature gates the hydrostatic branch; both are always computed and disagreements are flagged as contested. | +| `efficiency` | 0.1 | – | Energy-limited heating efficiency $\epsilon$. | +| `efficiency_mode` | `'fixed'` | `'fixed'`, `'caldiroli'` | Fixed $\epsilon$, or the Caldiroli et al. (2022) fitted efficiency converted to the Erkaev geometry, with a guarded fallback below its validity bound. | +| `T_exo_mode` | `'prescribed'` | `'prescribed'`, `'thermostat'` | Exobase temperature source. The prescribed value is the hydrostatic branch's dominant sensitivity; the thermostat estimator is biased high by construction. | +| `T_exo_value` | 1000 | K | The prescribed exobase temperature. | +| `cool_atomic` | `True` | – | Atomic line cooling (H, C, C+, N, N+, O, O+) in the wind thermostat. | +| `cool_co2_band` | `True` | – | CO2 15 micron band cooling (deexcitation rates measured over roughly 150 to 500 K). | +| `cool_o_finestructure` | `True` | – | Atomic O fine-structure cooling at 63 and 147 micron. | +| `cool_recombination` | `True` | – | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | +| `fractionate` | `True` | – | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | +| `tidal` | `True` | – | Apply the Erkaev et al. (2007) tidal factor to the energy-limited candidate. | +| `lambda_crit` | 20.0 | – | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | +| `gamma_bates` | 0.75 | – | Shape parameter of the Bates temperature profile of the extended upper structure. | +| `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | +| `gamma_wind` | 1.0 | – | Polytropic index at the sonic point (1 for an isothermal wind). | + +## Dispatcher inputs (`dispatcher.EscapeInputs`) + +| Name | Units | Meaning | +|---|---|---| +| `M_p`, `R_p` | kg, m | Planet (interior) mass and radius. | +| `M_star`, `a`, `e` | kg, m, – | Stellar mass, semi-major axis, eccentricity (the Hill radius is evaluated at periapsis). | +| `T_eq` | K | Equilibrium temperature; the boil-off wind runs at $T_\mathrm{eq} / 2^{1/4}$. | +| `F_xuv`, `F_bol`, `F_int` | W m⁻² | XUV flux, bolometric instellation, and interior heat flux (the luminosity cap). | +| `kappa_photo` | m² kg⁻¹ | Photospheric opacity; the boil-off rate scales as its inverse. | +| `profile` | – | `profiles.Profile`: pressure, radius, temperature, per-species mixing ratios, and mean molecular mass per level, base to top. | +| `settings` | – | The `DispatchSettings` block above. | +| `prev_regime` | – | Optional previous regime label; activates the hysteresis window. | +| `atm_converged` | – | Optional data-quality flag, surfaced as `stale_input`. | +| `age`, `reservoirs` | s, kg | Optional; consumed only by the snapshot self-consistency screen and the unfractionated split. | +| `dt` | s | Optional; carried for the caller's supply cap, never used by the dispatcher itself. | diff --git a/docs/Validation/atomic_data.md b/docs/Validation/atomic_data.md new file mode 100644 index 00000000..36e9c883 --- /dev/null +++ b/docs/Validation/atomic_data.md @@ -0,0 +1,18 @@ +# Validation: `src/zephyrus/atomic_data.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the transcribed cooling data of `zephyrus.atomic_data`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_atomic_data.py::test_three_level_transcription_spot_values` | Nakayama, Ikoma & Terada (2022), ApJ 937, 72 ([ADS 2022ApJ...937...72N](https://ui.adsabs.harvard.edu/abs/2022ApJ...937...72N)), Appendix C Tables 2 to 5 | Spot Einstein coefficients (the N transauroral and auroral lines, hydrogen Lyman-alpha) and the corrected O+ level set (4S-2D-2P with the printed weights 4, 10, 6) pin the transcription against the printed tables. | +| `tests/test_atomic_data.py::test_badnell_fit_magnitude_slope_and_misprint_guard` | Badnell (2006), ApJS 167, 334 (arXiv astro-ph/0604144), Eqs. 1 and 2 | The radiative recombination fit lands in the published low 1e-13 cm^3 s^-1 decade at 1e4 K with the published falling slope, and is explicitly discriminated against the garbled rendering of the same fit printed by Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 35), which disagrees by more than a factor 2. | + +## Notes + +The CO2 15 micron band and the O fine-structure channels follow Johnstone et al. (2018, A&A 617, A107) Eqs. (34) to (38) and (41) to (43); their coronal (collision-limited) reductions and detailed-balance structure are asserted as physics invariants in the same test file. The band deexcitation coefficients are measured only over roughly 150 to 500 K, a limitation the module documents. + +## Anchor type + +Published benchmark (printed atomic tables and fit coefficients). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/boiloff.md b/docs/Validation/boiloff.md new file mode 100644 index 00000000..5f0f1c05 --- /dev/null +++ b/docs/Validation/boiloff.md @@ -0,0 +1,18 @@ +# Validation: `src/zephyrus/boiloff.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the boil-off branch of `zephyrus.boiloff`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_boiloff.py::test_parker_mach_sonic_limit_and_shutoff` | Owen & Wu (2016), ApJ 817, 107 (isothermal transonic Parker wind, Lambert-W form) | The photospheric Mach number is exactly 1 with the launch level at the Bondi radius (the analytical sonic-point limit), falls monotonically as the level retreats inward, and has collapsed by more than six decades at their published shutoff R_p/R_B = 0.1. | +| `tests/test_boiloff.py::test_lambda_equals_two_bondi_radii_over_rp` | Fossati et al. (2017), A&A 598, A90 (restricted Jeans parameter); Owen & Wu (2016), ApJ 817, 107 | The identity Lambda = 2 R_B / R_p holds exactly for every mean molecular mass, which is what makes the Owen & Wu shutoff equal to Lambda = 20 for every composition; the literature band 15 to 35 brackets the default threshold. | + +## Notes + +The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 9); the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. + +## Anchor type + +Analytical limit plus published benchmark (the printed shutoff). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/diagnostics.md b/docs/Validation/diagnostics.md new file mode 100644 index 00000000..4dd49cfb --- /dev/null +++ b/docs/Validation/diagnostics.md @@ -0,0 +1,17 @@ +# Validation: `src/zephyrus/diagnostics.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the reporting quantities of `zephyrus.diagnostics`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_diagnostics.py::test_erkaev_critical_temperature_normalization` | Erkaev et al. (2007), A&A 472, 329, Eq. 23 | The tidally corrected critical exobase temperature recovers the printed Jupiter normalization 1.45e5 K in the wide-orbit, exobase-at-radius limit, vanishes at the Roche lobe, and scales linearly with planet mass. | + +## Notes + +The Johnson et al. (2013, ApJL 768, L4, Eq. 10) transonic energy criterion and the Guo (2024, arXiv:2405.13283) regime triple are asserted through their published scalings and limits as physics invariants in the same file. The threshold-potential screen attributed to Salz et al. (2016) is quoted from secondary literature, which the module states beside the values. + +## Anchor type + +Published benchmark (printed normalization and closed form). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/diffusion.md b/docs/Validation/diffusion.md new file mode 100644 index 00000000..0d9c5dd7 --- /dev/null +++ b/docs/Validation/diffusion.md @@ -0,0 +1,18 @@ +# Validation: `src/zephyrus/diffusion.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the binary-diffusion library of `zephyrus.diffusion` against its independent published compilations. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_diffusion.py::test_sn88_unit_reading_matches_zk86_table` | Sasaki & Nakazawa (1988), EPSL 89, 323, Table 1; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The unit reading of the Sasaki & Nakazawa table (which prints no units) reproduces five in-H2 entries of the independent 1986 compilation to 3 percent; no other unit choice comes within two orders of magnitude. | +| `tests/test_diffusion.py::test_zk23_zk86_cross_compilation_agreement` | Zahnle & Kasting (2023), GeCoA 361, 228, Table 2; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The shared rows of the two compilations agree to 4 percent where measured (Marrero & Mason 1972 lineage) and within 35 percent where the 2023 rows are estimates, with the measured rows agreeing more tightly than the estimated ones. | + +## Notes + +The Eq. (10) scaling rule is validated in sample on the three atomic rows the 2023 authors themselves obtained by scaling, and out of sample on the Kr and Xe rows of the 1986 table (which are not sources of this library), landing inside the 30 percent scaled provenance class in natural log. + +## Anchor type + +Cross-compilation cross-check (two independent compilations of the Marrero & Mason 1972 measurements, 35 years apart). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/dispatcher.md b/docs/Validation/dispatcher.md new file mode 100644 index 00000000..189834f5 --- /dev/null +++ b/docs/Validation/dispatcher.md @@ -0,0 +1,17 @@ +# Validation: `src/zephyrus/dispatcher.py` + +This page tracks the `@pytest.mark.reference_pinned` test that anchors the assembled dispatcher of `zephyrus.dispatcher`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_dispatcher.py::test_routing_hydrodynamic_and_el_candidate_matches_el_escape` | Cross-implementation check against `zephyrus.escape.EL_escape` (Erkaev et al. 2007 form, scaling = 2) | The dispatcher's energy-limited candidate equals the released public entry point evaluated with the same efficiency, radii, flux, and tidal factor to 1e-9 relative, and the dispatched rate is the min(EL, RR) winner named by the sub-label. | + +## Notes + +The totality contract (200 random physically posed inputs returning one label, finite non-negative rates, and per-species sums equal to the bulk rate) and the boxedness of the diagnostics container are asserted as physics invariants in the same file; every branch of the routing is exercised by dedicated scenario tests. + +## Anchor type + +Cross-implementation cross-check against the package's released energy-limited contract. + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md new file mode 100644 index 00000000..6e6af24f --- /dev/null +++ b/docs/Validation/fractionation.md @@ -0,0 +1,23 @@ +# Validation: `src/zephyrus/fractionation.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-species closure of `zephyrus.fractionation` against every special case of the escape-fractionation lineage it generalizes. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_fractionation.py::test_ternary_deuterium_reductions` | Gu & Chen (2023), Eqs. 4, 8, 9, and 12; Cherubim & Wordsworth (2024), ApJ 967, 139, Eq. 11 | The H-He-D system reproduces both branches and both critical rates exactly, including the helium admixture factor on the deuterium threshold. | +| `tests/test_fractionation.py::test_two_majors_trace_minor_relations` | Odert et al. (2018), Icarus 307, 327, Eq. 5; Zahnle et al. (1990), Icarus 84, 502, Eqs. 35 and 36; Zahnle & Kasting (1986), Icarus 68, 462, Eq. 36 | Entrained trace minors follow the Odert relation (equal to Zahnle et al. Eq. 35) to 1e-11 relative, the closure clamps exactly to zero where the printed formula goes negative, the limiting flux follows Zahnle et al. Eq. 36, and the earlier 1986 drag-deficit weighting is demonstrably NOT reproduced (the adjudication between the two printed variants). | +| `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | +| `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | +| `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | +| `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Wallace (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1 percent. | +| `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to 1e-12 relative, with flux continuity at the crossover and exact mass conservation. | + +## Notes + +The randomized ensemble suite additionally verifies global properties across activation thresholds (conservation, non-negativity, monotonicity, active-set growth, two-sided continuity, piecewise linearity), active-set uniqueness by Karush-Kuhn-Tucker enumeration against a brute-force oracle, and the stability of composition fixed points under well-mixed-layer relaxation. + +## Anchor type + +Published benchmarks (exact reductions to six printed formulations spanning 1987 to 2024) plus a brute-force cross-implementation oracle. + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/hydrodynamic.md b/docs/Validation/hydrodynamic.md new file mode 100644 index 00000000..396537ff --- /dev/null +++ b/docs/Validation/hydrodynamic.md @@ -0,0 +1,20 @@ +# Validation: `src/zephyrus/hydrodynamic.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydrodynamic branch of `zephyrus.hydrodynamic`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_hydrodynamic.py::test_erkaev_table1_enhancement_factors` | Erkaev et al. (2007), A&A 472, 329, Table 1 and Eq. 17 | The tidal factor reproduces all seven printed enhancement factors 1/K within 1 percent, falling monotonically toward 1 with xi. | +| `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5 percent across three decades of collapse, and the complex-valued region below F_XUV/rho_p = 1e2 (cgs) is rejected with a flag rather than evaluated. | +| `tests/test_hydrodynamic.py::test_wind_mean_masses_reproduce_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed H/He pair (0.62, 1.3) and steam pair (3, 6) in proton masses. | +| `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5 percent), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers (1e-4 and 1e-5 at 450 and 5e5 erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | + +## Notes + +Murray-Clay et al. fit their numerical models with flux exponents 0.6 (radiation-recombination limited) and 0.9 (energy limited) where the analytic chains carry 0.5 and 1.0; rate-level comparisons against their models must budget that difference, which the diagnostics module documents as reporting constants. + +## Anchor type + +Published benchmarks (printed tables, fits, and worked values). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/hydrostatic.md b/docs/Validation/hydrostatic.md new file mode 100644 index 00000000..595bbbc2 --- /dev/null +++ b/docs/Validation/hydrostatic.md @@ -0,0 +1,18 @@ +# Validation: `src/zephyrus/hydrostatic.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydrostatic branch of `zephyrus.hydrostatic`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_hydrostatic.py::test_volkov_eq9_unity_limit_and_printed_coefficient` | Volkov et al. (2011), Phys. Fluids 23, 066601, Eq. 9 and their printed c(lambda) table | The drifting-Maxwellian flux ratio reduces to unity at zero bulk velocity and reproduces the printed linear coefficient across lambda 1 to 106; the test also demonstrates that this correction and the flat kinetic factor the branch applies have opposite slopes in lambda, so applying both would double-count. | +| `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at 2.4e8 cm^-2 s^-1 (40 percent tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | + +## Notes + +The escape-temperature identities (the lambda = 2 neutral criterion and the plasma value at half of it, after Chatterjee & Pierrehumbert 2026, their Eq. 34) and the stoichiometric mass conservation of the element mapping are asserted as physics invariants in the same file. + +## Anchor type + +Published benchmark (printed coefficient table and a published model figure) plus the analytical rest limit. + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/knudsen.md b/docs/Validation/knudsen.md new file mode 100644 index 00000000..61bbdfc4 --- /dev/null +++ b/docs/Validation/knudsen.md @@ -0,0 +1,17 @@ +# Validation: `src/zephyrus/knudsen.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the collision cross-section ladder of `zephyrus.knudsen` against laboratory data. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_knudsen.py::test_viscosities_reproduce_measurements_within_7_percent` | Laricchiuta et al. (2009), EPJD 54, 607 (phenomenological collision integrals, Eqs. 2 to 4 with their appendix Tables 3 to 5); measured 300 K dynamic viscosities of N2, O2, CO, and CO2 (CRC Handbook values) | The first Chapman-Enskog approximation built on the transcribed Omega(2,2)* integrals reproduces all four measured viscosities within 7 percent, anchoring the whole coefficient transcription on laboratory measurements. | + +## Notes + +The companion transcription-pin test freezes the momentum-transfer cross sections evaluated from the fit at transcription time, so any later coefficient corruption fails even where no measurement exists. The hydrogen route is pinned to its construction values (sigma(H-H) = 6.4e-20 m^2 at 1e4 K from Zahnle et al. 1990, Eq. 30, on the Zahnle & Kasting 1986 Table I diffusion parameter). + +## Anchor type + +Published benchmark (laboratory viscosity measurements). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/profiles.md b/docs/Validation/profiles.md new file mode 100644 index 00000000..c31fdc05 --- /dev/null +++ b/docs/Validation/profiles.md @@ -0,0 +1,17 @@ +# Validation: `src/zephyrus/profiles.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the escape working levels of `zephyrus.profiles` against the published literature. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_profiles.py::test_lopez_base_pressure_is_the_nanobar_level` | Lopez (2017), MNRAS 472, 245, Section 2 (wind-base prescription); Murray-Clay et al. (2009), ApJ 693, 23, Section 2.1 (the nanobar tau = 1 level) | Pins the Lopez base pressure `P_base = mu g / sigma_nu0` to the published nanobar scale (within a factor of a few of 1e-4 Pa) for the Murray-Clay fiducial hot Jupiter, with exact linearity in gravity and insensitivity to the proton-mass versus atomic-weight convention below 1 percent. | + +## Notes + +Both papers quote the scale of the level rather than a precise value, so the pin is an order-of-magnitude anchor with sign and scale guards. The fixed-point iteration of the base pressure on a profile is exercised separately with clamping semantics in the same test file. + +## Anchor type + +Published benchmark (order-of-magnitude level). + +Date of last comparison against the sources: 2026-08-20. diff --git a/docs/Validation/thermostat.md b/docs/Validation/thermostat.md new file mode 100644 index 00000000..68e8014b --- /dev/null +++ b/docs/Validation/thermostat.md @@ -0,0 +1,17 @@ +# Validation: `src/zephyrus/thermostat.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the statistical-equilibrium cooling of `zephyrus.thermostat`. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_thermostat.py::test_hydrogen_system_brackets_the_black_lyalpha_rate` | Black (1981) Lyman-alpha cooling rate as printed by Murray-Clay et al. (2009), ApJ 693, 23, their Eq. 6 | The hydrogen three-level system agrees with the Black rate at order unity, with the ratio declining from about 0.5 at 1e4 K to about 0.3 at 2e4 K because the effective collision strengths are frozen at 1e4 K and the three-level system carries no cascades; the bracket catches transcription errors in the constant and in the exp(-118348 K / T) activation. | + +## Notes + +Identity with the Black fit is not expected and not asserted: the two treatments differ in their collision-strength temperature dependence and cascade content, and the documented drift is part of the anchor. The detailed-balance (LTE) limit and the coronal linearity of the level populations are asserted as physics invariants in the same file. + +## Anchor type + +Published benchmark (order-unity consistency with a printed rate). + +Date of last comparison against the sources: 2026-08-20. diff --git a/mkdocs.yml b/mkdocs.yml index c5299258..db2289bc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -20,6 +20,7 @@ nav: - Explanations: - Model overview: Explanations/model.md + - Escape-regime dispatcher: Explanations/dispatcher.md - Coupling to PROTEUS: Explanations/proteus.md - Limitations: Explanations/limitations.md - Testing suite: Explanations/testing.md @@ -29,12 +30,35 @@ nav: - API reference: - Overview: Reference/api/index.md - Escape: Reference/api/escape.md + - Dispatcher: Reference/api/dispatcher.md + - Boil-off: Reference/api/boiloff.md + - Hydrodynamic: Reference/api/hydrodynamic.md + - Hydrostatic: Reference/api/hydrostatic.md - Collision: Reference/api/collision.md + - Profiles: Reference/api/profiles.md + - Thermostat: Reference/api/thermostat.md + - Knudsen: Reference/api/knudsen.md + - Fractionation: Reference/api/fractionation.md + - Diagnostics: Reference/api/diagnostics.md + - Diffusion: Reference/api/diffusion.md + - Atomic data: Reference/api/atomic_data.md + - Composition: Reference/api/composition.md - Constants: Reference/api/constants.md - Planet parameters: Reference/api/planet_parameters.md - Validation: - Escape: Validation/escape.md + - Dispatcher: Validation/dispatcher.md + - Boil-off: Validation/boiloff.md + - Hydrodynamic: Validation/hydrodynamic.md + - Hydrostatic: Validation/hydrostatic.md - Collision: Validation/collision.md + - Profiles: Validation/profiles.md + - Thermostat: Validation/thermostat.md + - Knudsen: Validation/knudsen.md + - Fractionation: Validation/fractionation.md + - Diagnostics: Validation/diagnostics.md + - Diffusion: Validation/diffusion.md + - Atomic data: Validation/atomic_data.md - Community: - Contact: Community/contact.md From 7f7c6213e79718986fd42e191c9af0144728c0df Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 20 Aug 2026 16:39:37 +0200 Subject: [PATCH 016/113] Sharpen pinned-value tests at non-degenerate geometry and close weak assertions Pin the tidally corrected critical exobase temperature away from the x = 1 point where a dropped 1/x factor is invisible, pin the nitrogen recombination coefficient with a swapped-coefficient guard, pin both Tang timescales and both verdict directions, prove the diagnostics container is boxed by sabotaging its producers instead of re-running, pin the scaled kinetic diameters in the assembled table, and assert the shallow-column CO2 trapping branch. The Volkov flat-factor test now exercises the source function beside the published-coefficient oracle. Document the wind-temperature sensitivity of the EL/RR crossover and the dense-base clamp behavior of the thermostat in their modules. --- src/zephyrus/hydrodynamic.py | 7 ++++- src/zephyrus/thermostat.py | 7 ++++- tests/test_atomic_data.py | 26 +++++++++++++------ tests/test_boiloff.py | 21 ++++++++++----- tests/test_diagnostics.py | 16 ++++++++++-- tests/test_diffusion.py | 5 ++++ tests/test_dispatcher.py | 42 ++++++++++++++++++++---------- tests/test_fractionation.py | 18 +++++++++---- tests/test_hydrodynamic.py | 3 +++ tests/test_hydrostatic.py | 50 ++++++++++++++++++------------------ 10 files changed, 134 insertions(+), 61 deletions(-) diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index 9ca61efd..a71b3d32 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -31,7 +31,12 @@ # genuine recombination saturation (the sqrt(F) regime at modest # lambda_b) and barometric suppression at large lambda_b, where the label # "recombination limited" would be a category error; the selection -# mechanism is reported so the two are never conflated. +# mechanism is reported so the two are never conflated. Where the two +# candidates cross in flux is sensitive to the wind temperature: the RR +# chain carries it through the sound speed, the barometric exponent, and +# the recombination coefficient, so a thermostat-driven wind temperature +# can move the EL/RR crossover by an order of magnitude against the +# canonical fixed 1e4 K evaluation. # - Efficiency: fixed, or the Caldiroli et al. (2022, A&A 663, A122, # Appendix A.1) fit, defined against their R_p^3 geometry and therefore # converted by (R_p/R_XUV)^2 before use in the Erkaev form. diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py index 6362b895..67e0a57a 100644 --- a/src/zephyrus/thermostat.py +++ b/src/zephyrus/thermostat.py @@ -238,7 +238,12 @@ def solve_wind_temperature( temperature clamps to the nearer edge with the ``clamped`` field set ('low' when cooling already wins at T_eq, 'high' when heating still wins at 5e4 K, where the missing physics is the ionization and line - inventory beyond the modeled channels). Returns ``(T_wind, detail)``. + inventory beyond the modeled channels). A high clamp is the expected + outcome at dense wind bases, not only an exotic corner: electron + densities well above the forbidden-line critical densities quench the + three-level coolants collisionally, the balance loses its root, and + the wind runs hot; the ``clamped`` field is the contract by which + callers can see that happened. Returns ``(T_wind, detail)``. Raises ------ diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index e8fde39d..a306c435 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -55,6 +55,7 @@ def test_three_level_transcription_spot_values(): assert [lv[0] for lv in op['levels']] == ['4S', '2D', '2P'] # Structural zeros: the H 2s-2p and C+ 4P-2D couplings carry no A value. assert THREE_LEVEL['H']['transitions'][(2, 3)][0] == pytest.approx(0.0, abs=0.0) + assert THREE_LEVEL['C+']['transitions'][(2, 3)][0] == pytest.approx(0.0, abs=0.0) @pytest.mark.reference_pinned @@ -62,15 +63,22 @@ def test_three_level_transcription_spot_values(): def test_badnell_fit_magnitude_slope_and_misprint_guard(): """The Badnell recombination fit has the right magnitude and slope. - At 1e4 K the nitrogen coefficient lands in the low 1e-13 cm^3 s^-1 - decade, beside the hydrogen case B 2.7e-13 (the order anchor), and the - coefficient falls monotonically with temperature. The discrimination - guard is the garbled rendering of the fit printed by Chatterjee & - Pierrehumbert (2026, their Eq. 35: product turned into a sum, one - exponent repeated, exponential argument inverted), which disagrees with - the implemented original by more than a factor 2 at 1e4 K. + The nitrogen coefficient at 1e4 K is pinned at 3.761e-13 cm^3 s^-1, + hand-evaluated from the printed fit form with the shipped coefficients + (beside the hydrogen case B 2.7e-13, the order anchor), and the + coefficient falls monotonically with temperature. Two discrimination + guards: swapping the T0 and T1 coefficients (adjacent tuple entries) + gives 4.82e-13, outside the pin; and the garbled rendering of the fit + printed by Chatterjee & Pierrehumbert (2026, their Eq. 35: product + turned into a sum, one exponent repeated, exponential argument + inverted) disagrees with the implemented original by more than a + factor 2 at 1e4 K. """ a4 = badnell_alpha_rr(1.0e4) + assert a4 == pytest.approx(3.761e-13, rel=0.02) + # Swapped-coefficient discrimination: T0 and T1 interchanged gives + # 4.82e-13, a 28 percent shift, far outside the 2 percent pin. + assert abs(a4 - 4.82e-13) > 0.2 * a4 assert 1e-13 < a4 < 1e-12 assert badnell_alpha_rr(3.0e4) < a4 < badnell_alpha_rr(3.0e3) t0, t1, t2, a_fit, b_fit, c_fit = BADNELL_N @@ -137,7 +145,9 @@ def test_co2_band_escape_probability_branches(): q_large = co2_band_cooling(n_co2, colliders, T, col_co2=1e16) # sigma N ~ 64 assert q0 > 0.0 assert q_large < q_small - # Trapping can only reduce the loss relative to the free-escape ceiling. + # Trapping can only reduce the loss relative to the free-escape + # ceiling, on both branches. + assert q_small < q0 assert q_large < q0 diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 85b30911..efdb2c7e 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -175,16 +175,25 @@ def test_tang_timescale_diagnostic_contract(): """The termination diagnostic evaluates only with reservoirs supplied. Without reservoir masses (or with a zero rate) it reports - ``evaluated: False``; with them it returns both timescales positive and - a boolean verdict, and a heavier envelope at a fixed rate cannot - terminate earlier (both timescales scale with the envelope mass, so the - verdict is envelope-mass invariant). + ``evaluated: False``; with them, both timescales are pinned against + hand-evaluated values (``t_mdot = M_env / Mdot = 1e13 s`` and + ``t_cool = G M_p M_env / (R_p L) = 1.2226e11 s`` for the Earth-like + inputs), so a swapped pair or a reversed comparison fails: the slow + rate is terminated (``t_mdot >= t_cool``) and a fast rate on the other + side of the inequality is not. A heavier envelope at a fixed rate + cannot flip the verdict (both timescales scale with the envelope mass). """ assert tang_timescale_check(Me, Re, 1.0, 1e5, None) == {'evaluated': False} assert tang_timescale_check(Me, Re, 1.0, 0.0, {'H': 1e18}) == {'evaluated': False} out = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 1e18}) assert out['evaluated'] is True - assert out['t_mdot_s'] > 0.0 - assert out['t_cool_s'] > 0.0 + assert out['t_mdot_s'] == pytest.approx(1e13, rel=1e-9) + assert out['t_cool_s'] == pytest.approx(1.2226e11, rel=1e-3) + # Swap discrimination: the two timescales differ by two decades here. + assert out['t_mdot_s'] > 50.0 * out['t_cool_s'] + assert out['terminated'] is True + fast = tang_timescale_check(Me, Re, 1.0, 1e9, {'H': 1e18}) + assert fast['t_mdot_s'] < fast['t_cool_s'] + assert fast['terminated'] is False out2 = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 2e18}) assert out2['terminated'] == out['terminated'] diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 5703f83d..0fed7215 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -62,6 +62,11 @@ def test_johnson_criterion_scalings(): assert q_net2 == pytest.approx(2.0 * q_net1, rel=1e-12) assert q_c2 == pytest.approx(q_c1, rel=1e-12) assert r2 == pytest.approx(2.0 * r1, rel=1e-12) + # Quadratic in the intercepting radius: doubling R_xuv quadruples Q_net. + args_wide = dict(args, R_xuv=2.4 * Re) + _, q_net_wide, q_c_wide = q_net_over_qc(F_xuv=10.0, **args_wide) + assert q_net_wide == pytest.approx(4.0 * q_net1, rel=1e-12) + assert q_c_wide == pytest.approx(q_c1, rel=1e-12) args2 = dict(args, sigma_c=2e-19) r3, _, q_c3 = q_net_over_qc(F_xuv=10.0, **args2) assert q_c3 == pytest.approx(q_c1 / 2.0, rel=1e-12) @@ -97,11 +102,18 @@ def test_erkaev_critical_temperature_normalization(): exobase at the planetary radius and the Hill radius far away the correction factor approaches 1, so the critical temperature approaches the normalization itself. At the Roche lobe it must vanish (no barrier - left), and a farther exobase always lowers it. + left), and a farther exobase always lowers it. The exobase-at-radius + point alone is degenerate (the 1/x factor is invisible at x = 1), so + the second pin sits at x = 2, where a dropped 1/x doubles the value. """ t_far = erkaev_tc(Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) assert t_far == pytest.approx(1.45e5, rel=1e-2) - assert erkaev_tc(Mjup, Rjup, 2.0 * Rjup, 1e3 * Rjup) < t_far + # Non-degenerate pin: hand-evaluated 1.45e5 K * K(500) / 2 at x = 2. + t_x2 = erkaev_tc(Mjup, Rjup, 2.0 * Rjup, 1e3 * Rjup) + assert t_x2 == pytest.approx(7.22825e4, rel=1e-3) + # Dropped-1/x discrimination: that wrong formula returns 1.4457e5 here. + assert abs(t_x2 - 1.4457e5) > 0.5 * t_x2 + assert t_x2 < t_far assert erkaev_tc(Mjup, Rjup, 3.0 * Rjup, 2.5 * Rjup) == pytest.approx(0.0, abs=0.0) # Mass scaling is linear: twice the mass doubles the barrier. assert erkaev_tc(2 * Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) == pytest.approx( diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 6be30b54..d685f2ef 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -62,6 +62,11 @@ def test_vdw_diameter_rule_reproduces_printed_entries(): for sp, ref in D_STANDARD_EXTRA.items(): est = D_ZK23['O'] * _bondi(sp) / _bondi('O') assert abs(est / ref - 1.0) < 0.02, sp + # The assembled table itself carries the rule's output: the scaled + # carbon and silicon diameters are pinned (hand-evaluated 275 * r/r_O), + # so a wrong anchor in diameters() fails here, not only downstream. + assert d['C'] == pytest.approx(307.57, rel=1e-3) + assert d['Si'] == pytest.approx(379.93, rel=1e-3) # The scaled diameters preserve the C > N > O size ordering. assert d['C'] > d['N'] > d['O'] diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 94041927..4f620161 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -12,8 +12,9 @@ XUV to a hydrodynamic sub-label; a Roche-filling geometry to overflow. - Cross-implementation pin: the dispatcher's energy-limited candidate equals the released ``EL_escape`` at the same inputs. -- Boxedness: clearing the diagnostics container and re-dispatching returns - the same verdict, so nothing reads it back. +- Boxedness: sabotaging every diagnostics producer with garbage stubs + leaves the verdict, the rate, and the split unchanged, so no diagnostic + feeds control flow. - Error contract: malformed settings and physical states raise. See ``docs/How-to/run_tests.md`` for the tier and marker conventions. @@ -34,7 +35,7 @@ from zephyrus.planets_parameters import Me, Ms, Re from zephyrus.profiles import isothermal_profile -pytestmark = [pytest.mark.smoke, pytest.mark.timeout(120)] +pytestmark = [pytest.mark.smoke, pytest.mark.timeout(60)] AU = 1.496e11 # m @@ -168,6 +169,8 @@ def test_routing_hydrostatic_for_bound_heavy_atmosphere(): assert res.diagnostics['knudsen']['kn_sc'] > res.diagnostics['knudsen']['threshold_applied'] assert res.flags.get('hydrostatic_lower_limit') is True assert res.diagnostics['hydrostatic']['gate_unstable'] is False + # Cool against both conventions: the point is not contested either. + assert 'contested_ion' not in res.flags @pytest.mark.reference_pinned @@ -219,19 +222,32 @@ def test_routing_roche_overflow_inside_the_hill_sphere(): assert res.mdot >= 0.0 -def test_diagnostics_are_boxed(): - """Clearing the diagnostics and re-dispatching changes nothing. +def test_diagnostics_are_boxed(monkeypatch): + """Sabotaging every diagnostics producer changes no dispatch outcome. - The container is reporting only: no control flow reads it back, so - mutating (here: emptying) the first result's diagnostics must leave a - fresh dispatch of the same inputs with the same label and rate. + The container is reporting only: no control flow reads it back. The + test proves it by replacing every diagnostics-side producer with a + stub returning garbage of the right shape and asserting the regime, + the bulk rate, and the per-species split are unchanged; a regression + in which any diagnostic feeds a routing decision fails loudly here. """ inp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) - r1 = dispatch(inp) - r1.diagnostics.clear() - r2 = dispatch(inp) - assert r2.regime == r1.regime - assert r2.mdot == pytest.approx(r1.mdot, rel=1e-12) + reference = dispatch(inp) + nan = float('nan') + monkeypatch.setattr('zephyrus.diagnostics.q_net_over_qc', lambda *a, **k: (nan, nan, nan)) + monkeypatch.setattr('zephyrus.diagnostics.guo_triple', lambda *a, **k: {}) + monkeypatch.setattr('zephyrus.diagnostics.erkaev_tc', lambda *a, **k: nan) + monkeypatch.setattr('zephyrus.diagnostics.potential_screens', lambda *a, **k: {}) + monkeypatch.setattr('zephyrus.diagnostics.along_profile_fluid_check', lambda *a, **k: {}) + monkeypatch.setattr('zephyrus.diagnostics.self_consistency_screen', lambda *a, **k: {}) + monkeypatch.setattr('zephyrus.boiloff.tang_timescale_check', lambda *a, **k: {}) + sabotaged = dispatch(inp) + assert sabotaged.regime == reference.regime + assert sabotaged.mdot == pytest.approx(reference.mdot, rel=1e-12) + for el, v in reference.per_species.items(): + assert sabotaged.per_species[el] == pytest.approx(v, rel=1e-12) + # The sabotage genuinely reached the container. + assert sabotaged.diagnostics['guo_triple'] == {} def test_hysteresis_memory_moves_the_threshold(): diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index 5eb213cd..6e132701 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -115,9 +115,13 @@ def test_ternary_deuterium_reductions(): # (c) Both activation thresholds are sharp at the printed critical rates. eps = 1e-6 - assert solve_closure(phi_crit_he * (1 - eps), X, m, T, g0, b)[1] == 0.0 + assert solve_closure(phi_crit_he * (1 - eps), X, m, T, g0, b)[1] == pytest.approx( + 0.0, abs=0.0 + ) assert solve_closure(phi_crit_he * (1 + eps), X, m, T, g0, b)[1] > 0.0 - assert solve_closure(phi_crit_d * (1 - eps), X, m, T, g0, b)[2] == 0.0 + assert solve_closure(phi_crit_d * (1 - eps), X, m, T, g0, b)[2] == pytest.approx( + 0.0, abs=0.0 + ) assert solve_closure(phi_crit_d * (1 + eps), X, m, T, g0, b)[2] > 0.0 # (d) The He admixture lowers the D threshold by (1 + a2 X_He/X_H)^-1. @@ -125,7 +129,9 @@ def test_ternary_deuterium_reductions(): x_b = np.array([1 - x3 - tiny, tiny, x3]) phi_crit_d_no_he = m[0] * phi_dl_d / (1 + a2 * tiny / x_b[0]) assert solve_closure(phi_crit_d_no_he * (1 + eps), x_b, m, T, g0, b)[2] > 0.0 - assert solve_closure(phi_crit_d_no_he * (1 - eps), x_b, m, T, g0, b)[2] == 0.0 + assert solve_closure(phi_crit_d_no_he * (1 - eps), x_b, m, T, g0, b)[2] == pytest.approx( + 0.0, abs=0.0 + ) assert phi_crit_d < phi_crit_d_no_he @@ -401,7 +407,9 @@ def test_hunten_anchors_earth_mars_venus(): b = np.array([[np.inf, b12], [b12, np.inf]]) phi_star = m[0] * X[0] * b12 * (m[1] - m[0]) * g0 / kt400 * 400.0 / 400.0 eps = 1e-6 - assert solve_closure(phi_star * (1 - eps), X, m, 400.0, g0, b)[1] == 0.0 + assert solve_closure(phi_star * (1 - eps), X, m, 400.0, g0, b)[1] == pytest.approx( + 0.0, abs=0.0 + ) assert solve_closure(phi_star * (1 + eps), X, m, 400.0, g0, b)[1] > 0.0 assert phi_star / m[0] == pytest.approx(f1_ref, rel=0.01) @@ -434,7 +442,7 @@ def test_low_flux_collapse_and_zero_limit(): assert flux[light] == pytest.approx(phi / m[light], rel=1e-12) assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12) flux0, _c0, act0 = solve_closure(0.0, X, m, T, g0, b, return_diag=True) - assert np.all(flux0 == 0.0) + np.testing.assert_array_equal(flux0, 0.0) assert act0 == frozenset() diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index c731aa5c..86e714a3 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -50,6 +50,9 @@ # Spot evaluations of the Caldiroli et al. (2022) Appendix A.1 fit across # its validity box at K = 1: (log10 phi [cgs], F_XUV/rho_p [cgs], eta). +# The eta values were evaluated from the published fitting formulas at +# transcription time, independently of this implementation, so a later +# transcription error in either place breaks the agreement. CALDIROLI_SPOTS = [ (12.20, 1e3, 8.8e-1), (12.20, 1e6, 1.5e-1), diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index 6d82abef..aa85cd03 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -76,31 +76,26 @@ def c_lambda(lam): @pytest.mark.reference_pinned @pytest.mark.physics_invariant -def test_volkov_eq9_unity_limit_and_printed_coefficient(): - """Eq. (9) reduces to unity at rest with the printed linear coefficient. - - At zero bulk velocity the drifting-Maxwellian flux is the Jeans flux - exactly; the leading correction is linear in the speed ratio with the - printed c(lambda). Tolerance 6e-4: the published table itself carries - float wobble of that size at large lambda when evaluated naively, and - the stable erfcx form sits within it. +def test_volkov_flat_factor_against_published_correction(): + """The source's flat factor is distinct from the published Eq. (9). + + Two anchors in one test, both against Volkov et al. (2011). First, the + test-local Eq. (9) oracle is certified against the paper: it reduces to + unity at zero bulk velocity, and its leading correction is linear in + the speed ratio with the printed c(lambda) table (tolerance 6e-4, the + float wobble the published table itself carries at large lambda). + Second, the source's ``volkov_flat_factor`` carries the measured shape + (1.7 at lambda = 6 to 1.4 at lambda = 15, held at the endpoints as the + flagged extrapolation) and falls with lambda while the certified + Eq. (9) correction rises with it: opposite slopes, so the two + corrections are different quantities and applying both to the branch + would double-count. """ for lam, c_ref in VOLKOV_C_TABLE.items(): assert c_lambda(lam) == pytest.approx(c_ref, rel=6e-4), lam r = volkov_eq9_ratio(1e-4, lam) assert (r - 1.0) / 1e-4 == pytest.approx(c_lambda(lam), rel=2e-3) assert volkov_eq9_ratio(1e-6, lam) == pytest.approx(1.0, abs=1e-4) - - -def test_volkov_flat_factor_shape_and_distinctness(): - """The flat kinetic factor has its measured shape, distinct from Eq. (9). - - C(lambda) runs from 1.7 at lambda = 6 to 1.4 at lambda = 15, is held at - the endpoints outside (the flagged extrapolation), and falls with - lambda, whereas the Eq. (9) bulk-velocity correction at fixed speed - ratio rises with lambda: opposite slopes, so the two corrections are - different quantities and applying both would double-count. - """ assert volkov_flat_factor(6.0) == pytest.approx(1.7, rel=1e-12) assert volkov_flat_factor(15.0) == pytest.approx(1.4, rel=1e-12) assert volkov_flat_factor(50.0) == pytest.approx(1.4, rel=1e-12) # held @@ -144,12 +139,17 @@ def test_yelle_figure1_mars_hydrogen_flux(): On their fully specified Mars model the hydrogen escape flux is diffusion limited above about 200 K exobase temperature, with a plateau - at 2.4e8 cm^-2 s^-1 (40 percent tolerance: the binary H-CO2 coefficient - source their calculation used is not pinned in the paper, and the - tabulated value here differs at that level). The transition to - Jeans-limited escape below about 150 K shows as a collapse; the 100 K - point sits on the exponential edge, so it is checked as a regime (an - order below the plateau), not as a value. + at 2.4e8 cm^-2 s^-1. The 40 percent tolerance is deliberate and its + direction understood: the binary H-CO2 coefficient source their + calculation used is not pinned in the paper, the tabulated coefficient + here is smaller, and this implementation sits systematically below the + anchor (measured plateau 1.70e8, a ratio of 0.71 against the 0.60 + floor), so a future coefficient revision in either direction moves + this pin and should be re-tuned consciously rather than by widening + the tolerance. The transition to Jeans-limited escape below about + 150 K shows as a collapse; the 100 K point sits on the exponential + edge, so it is checked as a regime (an order below the plateau), not + as a value. """ f100, _ = _mars_h_flux(100.0) f200, _ = _mars_h_flux(200.0) From 7297ace1781a677f91f51c49825ea368d59fb485 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 18:46:44 +0200 Subject: [PATCH 017/113] Host EL_escape in hydrodynamic.py behind a compatibility re-export --- .github/.claude/rules/zephyrus-tests.md | 5 +- .github/copilot-instructions.md | 4 +- docs/Reference/api/escape.md | 8 +- docs/Reference/api/hydrodynamic.md | 1 + docs/Validation/escape.md | 2 +- src/zephyrus/escape.py | 192 ++---------------------- src/zephyrus/hydrodynamic.py | 187 ++++++++++++++++++++++- tests/test_escape.py | 9 +- tools/check_test_quality.py | 2 +- 9 files changed, 214 insertions(+), 196 deletions(-) diff --git a/.github/.claude/rules/zephyrus-tests.md b/.github/.claude/rules/zephyrus-tests.md index 6b3a2304..cd399e88 100644 --- a/.github/.claude/rules/zephyrus-tests.md +++ b/.github/.claude/rules/zephyrus-tests.md @@ -103,7 +103,6 @@ src/zephyrus/collision.py src/zephyrus/diagnostics.py src/zephyrus/diffusion.py src/zephyrus/dispatcher.py -src/zephyrus/escape.py src/zephyrus/fractionation.py src/zephyrus/hydrodynamic.py src/zephyrus/hydrostatic.py @@ -119,6 +118,10 @@ Utility sources are exempt from the physics-invariant requirement but still subj ``` src/zephyrus/__init__.py (version string, package exports) src/zephyrus/composition.py (element masses, formula parsing) +src/zephyrus/escape.py (compatibility re-export of EL_escape, + which lives in hydrodynamic.py; its + companion test file guards the released + import path and the EL physics through it) src/zephyrus/constants.py (pure physical constants, no derivation) src/zephyrus/planets_parameters.py (tabulated star-planet parameters) ``` diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index dc6b0313..078d1496 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -139,7 +139,7 @@ pre-commit install -f - `constants.py` - Physical constants and unit conversions (utility) - `planets_parameters.py` - Star-planet system parameters (utility) - `composition.py` - Element masses, formula parsing, atomization (utility) - - `escape.py` - Energy-limited (EL) atmospheric escape, tidal correction (physics) + - `escape.py` - Compatibility re-export of `EL_escape` (utility; the physics lives in `hydrodynamic.py`) - `collision.py` - Giant-impact atmospheric erosion scaling law (physics) - `profiles.py` - Atmosphere-profile container and escape working levels (physics) - `knudsen.py` - Collision cross sections and the sonic-point Knudsen switch (physics) @@ -147,7 +147,7 @@ pre-commit install -f - `atomic_data.py` - Cooling data tables and closed-form rate coefficients (physics) - `thermostat.py` - Wind-temperature thermostat (heating against cooling) (physics) - `boiloff.py` - Bolometrically driven boil-off escape (physics) - - `hydrodynamic.py` - EL and radiation-recombination-limited rates (physics) + - `hydrodynamic.py` - `EL_escape` plus the EL and radiation-recombination-limited dispatch limbs (physics) - `hydrostatic.py` - Jeans escape with the diffusion-limited supply cap (physics) - `fractionation.py` - Simultaneous N-species fractionation closure (physics) - `diagnostics.py` - Regime diagnostics reported beside every verdict (physics) diff --git a/docs/Reference/api/escape.md b/docs/Reference/api/escape.md index 181aee61..094c6542 100644 --- a/docs/Reference/api/escape.md +++ b/docs/Reference/api/escape.md @@ -1,7 +1,7 @@ # zephyrus.escape -::: zephyrus.escape +`zephyrus.escape` is the released entry point for energy-limited escape: it re-exports `EL_escape`, whose implementation lives in [`zephyrus.hydrodynamic`](hydrodynamic.md) beside the other hydrodynamic rate prescriptions. Existing code importing `from zephyrus.escape import EL_escape` keeps working unchanged. + +::: zephyrus.hydrodynamic.EL_escape options: - members: - - EL_escape - show_source: true \ No newline at end of file + show_source: true diff --git a/docs/Reference/api/hydrodynamic.md b/docs/Reference/api/hydrodynamic.md index f4d9a995..2ec0bc5e 100644 --- a/docs/Reference/api/hydrodynamic.md +++ b/docs/Reference/api/hydrodynamic.md @@ -3,6 +3,7 @@ ::: zephyrus.hydrodynamic options: members: + - EL_escape - hill_radius_periapsis - k_tide - el_rate diff --git a/docs/Validation/escape.md b/docs/Validation/escape.md index 1934151b..3f3f5442 100644 --- a/docs/Validation/escape.md +++ b/docs/Validation/escape.md @@ -1,4 +1,4 @@ -# Validation: `src/zephyrus/escape.py` +# Validation: `zephyrus.escape.EL_escape` This page tracks the `@pytest.mark.reference_pinned` tests that anchor the behaviour of `zephyrus.escape` against the published energy-limited mass-loss formulation and its closed-form analytical limit. diff --git a/src/zephyrus/escape.py b/src/zephyrus/escape.py index fbf1ce36..a57f0b1b 100644 --- a/src/zephyrus/escape.py +++ b/src/zephyrus/escape.py @@ -1,189 +1,15 @@ """ !!! info "`escape.py`" - Main functions to compute atmospheric escape.
+ Released entry point for energy-limited atmospheric escape.
Authors: Emma Postolec, Harrison Nicholls """ -import numpy as np +# The energy-limited physics lives in zephyrus.hydrodynamic beside the other +# hydrodynamic rate prescriptions; this module re-exports the released entry +# point so the import path `from zephyrus.escape import EL_escape` and the +# names historically bound into this namespace keep working for existing +# callers, including the PROTEUS version pin. -from zephyrus.constants import * -from zephyrus.planets_parameters import * - -########################################################### Energy-Limited escape (EL) ########################################################### - - -def EL_escape( - tidal_contribution: bool, - a: float, - e: float, - Mp: float, - Ms: float, - epsilon: float, - Rp: float, - Rxuv: float, - Fxuv: float, - scaling: int = 2, -): - r""" - Compute the mass-loss rate for Energy-Limited (EL) atmospheric escape. - - The mass-loss rate is given by - - $$ - \dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}} - {G\,M_p\,K_\mathrm{tide}} - $$ - - where $R^3$ is either $R_p R_\mathrm{XUV}^2$ or $R_\mathrm{XUV}^3$ - depending on ``scaling``, and $K_\mathrm{tide}$ is the tidal - correction factor of Erkaev et al. (2007) when ``tidal_contribution`` - is True, else 1. - - Parameters - ---------- - tidal_contribution : bool - If True, include the tidal correction factor $K_\mathrm{tide}$ - (Erkaev et al. 2007). Its argument is - $\xi \equiv R_\mathrm{Hill}/R$, where $R$ is the radius that - appears linearly in the $R^3$ term selected by ``scaling``: $R_p$ - for ``scaling=2`` (the convention of Erkaev et al. 2007, whose - own $\xi$ is the Roche-lobe distance over the planetary radius) - and $R_\mathrm{XUV}$ for ``scaling=3`` (the single-radius form, - where $R_\mathrm{XUV}$ is the only radius in the problem). The - factor is valid for $\xi > 1$, where $0 < K_\mathrm{tide} < 1$ - and the correction enhances escape; it rises monotonically - toward 1 as $\xi \to \infty$. A ``ValueError`` is raised for - $\xi \le 1$, where the atmosphere reaches the Roche lobe and the - energy-limited approximation no longer applies. If False, - $K_\mathrm{tide} = 1$ (no tidal effects). - a : float - Planetary semi-major axis [m]. Only used when - ``tidal_contribution`` is True. - e : float - Orbital eccentricity (dimensionless). Only used when - ``tidal_contribution`` is True. - Mp : float - Planetary mass [kg]. - Ms : float - Stellar mass [kg]. Only used when - ``tidal_contribution`` is True. - epsilon : float - Escape efficiency factor (dimensionless). Typical literature - range is $0.1 < \epsilon < 0.6$, but hydrodynamic simulations - find the effective efficiency falls far below that band for - strongly bound planets: above a threshold gravitational - potential, $\log_{10}(G M_p K_\mathrm{tide}/R_p) \approx 12.9$ - to $13.2$ in cgs units (erg g$^{-1}$), it drops to of order - $10^{-2}$ for compact hot Jupiters (Caldiroli et al. 2022). - Rp : float - Planetary radius [m]. Used as a linear factor when - ``scaling=2``. - Rxuv : float - Planetary radius at which the atmosphere becomes optically - thick to XUV radiation [m]. In PROTEUS this level is placed at - a fixed pressure, by default 20 mbar following Baumeister et - al. (2023); that is an optical-photosphere-type level, distinct - from the roughly nanobar level where the XUV heating is - actually deposited and the wind is launched (Lopez 2017, - $P_\mathrm{base} = \mu m_\mathrm{H} g / \sigma_{\nu_0}$). - Fxuv : float - XUV flux received by the planet from the host star, in - W m$^{-2}$. - scaling : int, optional - Planet radius scaling exponent. ``2`` (default) uses - $R_p R_\mathrm{XUV}^2$; ``3`` uses $R_\mathrm{XUV}^3$. Any other - value raises ``ValueError``. - - Returns - ------- - escape_EL : float - Mass-loss rate for energy-limited escape, in kg s$^{-1}$. - - Raises - ------ - ValueError - If ``scaling`` is not ``2`` or ``3``, or if - ``tidal_contribution`` is True and $\xi \le 1$ (the atmosphere - reaches the Roche lobe, outside the energy-limited regime), - with $\xi$ built on the radius selected by ``scaling``. - - References - ---------- - The default radius scaling (``scaling=2``, ``Rp * Rxuv**2``) is the - energy-limited XUV cross-section form of Watson et al. (1981) and - Lammer et al. (2003), Equation 6, written as a mass-loss rate by - Erkaev et al. (2007), Equation 21. The alternative radius scaling - (``scaling=3``, ``Rxuv**3``) is the single-radius simplification of - Lopez, Fortney & Miller (2012), Equation 2, Lopez & Fortney (2013), - Equation 1, and Lehmer & Catling (2017), Equation 1. The tidal - reduction factor ``K_tide`` is Erkaev et al. (2007), Equation 17. - - 1. Watson, A. J., Donahue, T. M., & Walker, J. C. G. (1981). - The dynamics of a rapidly escaping atmosphere: applications to - the evolution of Earth and Venus. *Icarus*, 48(2), 150-166. - 2. Lammer, H., Selsis, F., Ribas, I., et al. (2003). Atmospheric - loss of exoplanets resulting from stellar X-ray and - extreme-ultraviolet heating. *ApJ*, 598(2), L121-L124. - 3. Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). - Roche lobe effects on the atmospheric loss from "Hot Jupiters". - *A&A*, 472(1), 329-334. - 4. Lopez, E. D., Fortney, J. J., & Miller, N. (2012). - How thermal evolution and mass-loss sculpt populations of - super-Earths and sub-Neptunes. *ApJ*, 761(1), 59. - 5. Lopez, E. D., & Fortney, J. J. (2013). The role of core mass - in controlling evaporation: the Kepler radius distribution and - the Kepler-36 density dichotomy. *ApJ*, 776(1), 2. - 6. Lehmer, O. R., & Catling, D. C. (2017). Rocky worlds - limited to ~1.8 Earth radii by atmospheric escape during a - star's extreme UV saturation. *ApJ*, 845(2), 130. - 7. Lopez, E. D. (2017). Born dry in the photoevaporation desert: - Kepler's ultra-short-period planets formed water-poor. - *MNRAS*, 472(1), 245-253. - 8. Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & - Noack, L. (2023). Redox state and interior structure control on - the long-term habitability of stagnant-lid planets. - *A&A*, 675, A122. - 9. Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., - & Rauscher, E. (2022). Irradiation-driven escape of primordial - planetary atmospheres II. Evaporation efficiency of sub-Neptunes - through hot Jupiters. *A&A*, 663, A122. - """ - # Radius term, and the radius the tidal factor is measured from: the - # one that appears linearly in R^3, since that is the radius the - # potential barrier in the denominator refers to. - match scaling: - case 2: - R_cubed = Rp * Rxuv**2 - R_tide = Rp - case 3: - R_cubed = Rxuv**3 - R_tide = Rxuv - case _: - raise ValueError(f'Invalid radius exponent: {scaling}') - - # Tidal contribution - if tidal_contribution: - # ksi is the ratio of the periapsis Hill radius to the radius the - # scaling selects. K_tide = (ksi-1)^2 (2 ksi + 1) / (2 ksi^3) is - # non-negative for all ksi > 0 with a double root at ksi = 1, so the - # energy-limited rate (which divides by K_tide) diverges as ksi -> 1 - # and is only valid for ksi > 1, where the atmosphere sits inside the - # Roche lobe. - Rhill = a * (1 - e) * (Mp / (3 * Ms)) ** (1 / 3) - ksi = Rhill / R_tide - if ksi <= 1: - raise ValueError( - 'Tidal energy-limited escape requires the periapsis Hill ' - 'radius to exceed the escape-level radius ' - f'(ksi = Rhill/R > 1); got ksi = {ksi:.4g}. At ksi <= 1 the ' - 'atmosphere reaches the Roche lobe and the energy-limited ' - 'approximation no longer applies.' - ) - K_tide = 1 - (3 / (2 * ksi)) + (1 / (2 * (ksi**3))) - else: - K_tide = 1 - - # Mass-loss rate for EL escape - escape_EL = (epsilon * np.pi * R_cubed * Fxuv) / (G * Mp * K_tide) - - return escape_EL +from zephyrus.constants import * # noqa: F403 +from zephyrus.hydrodynamic import EL_escape as EL_escape +from zephyrus.planets_parameters import * # noqa: F403 diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index a71b3d32..c93be381 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -2,7 +2,7 @@ !!! info "`hydrodynamic.py`" Hydrodynamic escape: energy-limited and radiation-recombination-limited rates, and the selection between them.
- Authors: Malina Ovesen, Mara Attia + Authors: Emma Postolec, Harrison Nicholls, Malina Ovesen, Mara Attia """ from __future__ import annotations @@ -40,6 +40,14 @@ # - Efficiency: fixed, or the Caldiroli et al. (2022, A&A 663, A122, # Appendix A.1) fit, defined against their R_p^3 geometry and therefore # converted by (R_p/R_XUV)^2 before use in the Erkaev form. +# +# EL_escape is the released standalone entry point for the energy-limited +# rate (scaling selection, tidal branch, and input validation in one +# self-contained function); el_rate is the bare kernel the regime dispatch +# assembles with its own tidal factor. The two are kept as separate code +# paths on purpose, so the cross-implementation test between them guards +# the scaling and tidal plumbing. zephyrus.escape re-exports EL_escape for +# compatibility with the released import path. RHO_UNIT_CGS = 1e-3 # kg m^-3 -> g cm^-3 FLUX_UNIT_CGS = 1e3 # W m^-2 -> erg s^-1 cm^-2 @@ -60,6 +68,183 @@ def el_rate(eps: float, F_xuv: float, R_p: float, R_xuv: float, M_p: float, K: f return eps * math.pi * F_xuv * R_p * R_xuv**2 / (G * M_p * K) +def EL_escape( + tidal_contribution: bool, + a: float, + e: float, + Mp: float, + Ms: float, + epsilon: float, + Rp: float, + Rxuv: float, + Fxuv: float, + scaling: int = 2, +): + r""" + Compute the mass-loss rate for Energy-Limited (EL) atmospheric escape. + + The mass-loss rate is given by + + $$ + \dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}} + {G\,M_p\,K_\mathrm{tide}} + $$ + + where $R^3$ is either $R_p R_\mathrm{XUV}^2$ or $R_\mathrm{XUV}^3$ + depending on ``scaling``, and $K_\mathrm{tide}$ is the tidal + correction factor of Erkaev et al. (2007) when ``tidal_contribution`` + is True, else 1. + + Parameters + ---------- + tidal_contribution : bool + If True, include the tidal correction factor $K_\mathrm{tide}$ + (Erkaev et al. 2007). Its argument is + $\xi \equiv R_\mathrm{Hill}/R$, where $R$ is the radius that + appears linearly in the $R^3$ term selected by ``scaling``: $R_p$ + for ``scaling=2`` (the convention of Erkaev et al. 2007, whose + own $\xi$ is the Roche-lobe distance over the planetary radius) + and $R_\mathrm{XUV}$ for ``scaling=3`` (the single-radius form, + where $R_\mathrm{XUV}$ is the only radius in the problem). The + factor is valid for $\xi > 1$, where $0 < K_\mathrm{tide} < 1$ + and the correction enhances escape; it rises monotonically + toward 1 as $\xi \to \infty$. A ``ValueError`` is raised for + $\xi \le 1$, where the atmosphere reaches the Roche lobe and the + energy-limited approximation no longer applies. If False, + $K_\mathrm{tide} = 1$ (no tidal effects). + a : float + Planetary semi-major axis [m]. Only used when + ``tidal_contribution`` is True. + e : float + Orbital eccentricity (dimensionless). Only used when + ``tidal_contribution`` is True. + Mp : float + Planetary mass [kg]. + Ms : float + Stellar mass [kg]. Only used when + ``tidal_contribution`` is True. + epsilon : float + Escape efficiency factor (dimensionless). Typical literature + range is $0.1 < \epsilon < 0.6$, but hydrodynamic simulations + find the effective efficiency falls far below that band for + strongly bound planets: above a threshold gravitational + potential, $\log_{10}(G M_p K_\mathrm{tide}/R_p) \approx 12.9$ + to $13.2$ in cgs units (erg g$^{-1}$), it drops to of order + $10^{-2}$ for compact hot Jupiters (Caldiroli et al. 2022). + Rp : float + Planetary radius [m]. Used as a linear factor when + ``scaling=2``. + Rxuv : float + Planetary radius at which the atmosphere becomes optically + thick to XUV radiation [m]. In PROTEUS this level is placed at + a fixed pressure, by default 20 mbar following Baumeister et + al. (2023); that is an optical-photosphere-type level, distinct + from the roughly nanobar level where the XUV heating is + actually deposited and the wind is launched (Lopez 2017, + $P_\mathrm{base} = \mu m_\mathrm{H} g / \sigma_{\nu_0}$). + Fxuv : float + XUV flux received by the planet from the host star, in + W m$^{-2}$. + scaling : int, optional + Planet radius scaling exponent. ``2`` (default) uses + $R_p R_\mathrm{XUV}^2$; ``3`` uses $R_\mathrm{XUV}^3$. Any other + value raises ``ValueError``. + + Returns + ------- + escape_EL : float + Mass-loss rate for energy-limited escape, in kg s$^{-1}$. + + Raises + ------ + ValueError + If ``scaling`` is not ``2`` or ``3``, or if + ``tidal_contribution`` is True and $\xi \le 1$ (the atmosphere + reaches the Roche lobe, outside the energy-limited regime), + with $\xi$ built on the radius selected by ``scaling``. + + References + ---------- + The default radius scaling (``scaling=2``, ``Rp * Rxuv**2``) is the + energy-limited XUV cross-section form of Watson et al. (1981) and + Lammer et al. (2003), Equation 6, written as a mass-loss rate by + Erkaev et al. (2007), Equation 21. The alternative radius scaling + (``scaling=3``, ``Rxuv**3``) is the single-radius simplification of + Lopez, Fortney & Miller (2012), Equation 2, Lopez & Fortney (2013), + Equation 1, and Lehmer & Catling (2017), Equation 1. The tidal + reduction factor ``K_tide`` is Erkaev et al. (2007), Equation 17. + + 1. Watson, A. J., Donahue, T. M., & Walker, J. C. G. (1981). + The dynamics of a rapidly escaping atmosphere: applications to + the evolution of Earth and Venus. *Icarus*, 48(2), 150-166. + 2. Lammer, H., Selsis, F., Ribas, I., et al. (2003). Atmospheric + loss of exoplanets resulting from stellar X-ray and + extreme-ultraviolet heating. *ApJ*, 598(2), L121-L124. + 3. Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). + Roche lobe effects on the atmospheric loss from "Hot Jupiters". + *A&A*, 472(1), 329-334. + 4. Lopez, E. D., Fortney, J. J., & Miller, N. (2012). + How thermal evolution and mass-loss sculpt populations of + super-Earths and sub-Neptunes. *ApJ*, 761(1), 59. + 5. Lopez, E. D., & Fortney, J. J. (2013). The role of core mass + in controlling evaporation: the Kepler radius distribution and + the Kepler-36 density dichotomy. *ApJ*, 776(1), 2. + 6. Lehmer, O. R., & Catling, D. C. (2017). Rocky worlds + limited to ~1.8 Earth radii by atmospheric escape during a + star's extreme UV saturation. *ApJ*, 845(2), 130. + 7. Lopez, E. D. (2017). Born dry in the photoevaporation desert: + Kepler's ultra-short-period planets formed water-poor. + *MNRAS*, 472(1), 245-253. + 8. Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & + Noack, L. (2023). Redox state and interior structure control on + the long-term habitability of stagnant-lid planets. + *A&A*, 675, A122. + 9. Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., + & Rauscher, E. (2022). Irradiation-driven escape of primordial + planetary atmospheres II. Evaporation efficiency of sub-Neptunes + through hot Jupiters. *A&A*, 663, A122. + """ + # Radius term, and the radius the tidal factor is measured from: the + # one that appears linearly in R^3, since that is the radius the + # potential barrier in the denominator refers to. + match scaling: + case 2: + R_cubed = Rp * Rxuv**2 + R_tide = Rp + case 3: + R_cubed = Rxuv**3 + R_tide = Rxuv + case _: + raise ValueError(f'Invalid radius exponent: {scaling}') + + # Tidal contribution + if tidal_contribution: + # ksi is the ratio of the periapsis Hill radius to the radius the + # scaling selects. K_tide = (ksi-1)^2 (2 ksi + 1) / (2 ksi^3) is + # non-negative for all ksi > 0 with a double root at ksi = 1, so the + # energy-limited rate (which divides by K_tide) diverges as ksi -> 1 + # and is only valid for ksi > 1, where the atmosphere sits inside the + # Roche lobe. + Rhill = a * (1 - e) * (Mp / (3 * Ms)) ** (1 / 3) + ksi = Rhill / R_tide + if ksi <= 1: + raise ValueError( + 'Tidal energy-limited escape requires the periapsis Hill ' + 'radius to exceed the escape-level radius ' + f'(ksi = Rhill/R > 1); got ksi = {ksi:.4g}. At ksi <= 1 the ' + 'atmosphere reaches the Roche lobe and the energy-limited ' + 'approximation no longer applies.' + ) + K_tide = 1 - (3 / (2 * ksi)) + (1 / (2 * (ksi**3))) + else: + K_tide = 1 + + # Mass-loss rate for EL escape + escape_EL = (epsilon * math.pi * R_cubed * Fxuv) / (G * Mp * K_tide) + + return escape_EL + + def caldiroli_efficiency(F_xuv: float, M_p: float, R_p: float, K: float) -> tuple: """Evaporation-efficiency fit of Caldiroli et al. (2022, Appendix A.1). diff --git a/tests/test_escape.py b/tests/test_escape.py index 98434b19..75962e11 100644 --- a/tests/test_escape.py +++ b/tests/test_escape.py @@ -1,7 +1,10 @@ -"""Tests for ``src/zephyrus/escape.py``. +"""Tests for ``src/zephyrus/escape.py``, the released energy-limited entry point. -Exercises the energy-limited (EL) atmospheric-escape mass-loss rate and its -tidal correction. The physical invariants under test: +``escape.py`` re-exports ``EL_escape``, whose implementation lives in +``src/zephyrus/hydrodynamic.py``; every test here imports through the +released path ``zephyrus.escape.EL_escape``, so the file guards the +compatibility contract and the EL physics at once. The physical invariants +under test: - Conservation / closed form: the EL rate equals ``epsilon * pi * R^3 * Fxuv / (G * Mp * K_tide)`` for the selected radius diff --git a/tools/check_test_quality.py b/tools/check_test_quality.py index 93dc8d6b..9ef39c49 100644 --- a/tools/check_test_quality.py +++ b/tools/check_test_quality.py @@ -84,7 +84,6 @@ 'diagnostics.py', 'diffusion.py', 'dispatcher.py', - 'escape.py', 'fractionation.py', 'hydrodynamic.py', 'hydrostatic.py', @@ -98,6 +97,7 @@ UTILITY_SOURCES = { '__init__.py', 'composition.py', + 'escape.py', 'constants.py', 'planets_parameters.py', } From b070eda925cbcab770c4c9f67072c2aabb5e71fc Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 18:58:21 +0200 Subject: [PATCH 018/113] Restructure the docs around the two-channel, five-regime model --- docs/Explanations/dispatcher.md | 48 ---------- docs/Explanations/energy_limited.md | 72 +++++++++++++++ docs/Explanations/fractionation.md | 55 ++++++++++++ docs/Explanations/impacts.md | 29 ++++++ docs/Explanations/limitations.md | 94 +++++++------------ docs/Explanations/model.md | 127 ++++++++++---------------- docs/Explanations/proteus.md | 10 +-- docs/Explanations/regimes.md | 134 ++++++++++++++++++++++++++++ docs/Reference/api/index.md | 2 +- docs/Reference/parameters.md | 2 +- docs/Validation/fractionation.md | 2 +- docs/index.md | 2 +- mkdocs.yml | 7 +- src/zephyrus/fractionation.py | 2 +- tests/test_diagnostics.py | 4 +- 15 files changed, 388 insertions(+), 202 deletions(-) delete mode 100644 docs/Explanations/dispatcher.md create mode 100644 docs/Explanations/energy_limited.md create mode 100644 docs/Explanations/fractionation.md create mode 100644 docs/Explanations/impacts.md create mode 100644 docs/Explanations/regimes.md diff --git a/docs/Explanations/dispatcher.md b/docs/Explanations/dispatcher.md deleted file mode 100644 index 61704af2..00000000 --- a/docs/Explanations/dispatcher.md +++ /dev/null @@ -1,48 +0,0 @@ -# The escape-regime dispatcher - -Atmospheric escape is not one process. Depending on how tightly an atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are, the mass loss is carried by a bolometrically driven boil-off, by an XUV-driven hydrodynamic wind, or by particle-by-particle thermal evaporation from a hydrostatic exosphere. Each regime has its own physics and its own rate prescription, and applying one of them outside its regime produces rates that are wrong by orders of magnitude. The dispatcher classifies an atmosphere into its regime and returns the corresponding rate in a single call: `zephyrus.dispatch` takes one planetary state (scalars plus an atmosphere profile) and returns one regime label, one bulk mass-loss rate, per-species rates that sum to it, flags, and a diagnostics container. - -The energy-limited entry point [`EL_escape`](model.md) is unchanged and remains the prescription PROTEUS calls in coupled runs; the dispatcher is an additive API that supersets it. - -## The three regimes and the evaluation order - -The dispatcher evaluates a fixed sequence. Every step is closed-form algebra, interpolation on the supplied profile, one-dimensional quadratures, or scalar root finds; no differential equation is integrated anywhere, so a dispatch costs a few milliseconds. - -**1. Boil-off.** A young or strongly heated atmosphere can be so weakly bound that it flows out on the planet's own thermal energy, before XUV heating matters. The activation criterion is the restricted Jeans parameter $\Lambda = G M_p \mu / (k_B T_\mathrm{eq} R_p)$ (Fossati et al. 2017) built with the composition mean molecular mass: for isothermal gas $\Lambda = 2 R_B / R_p$ identically, so the Owen & Wu (2016) shutoff at $R_p / R_B = 0.1$ is $\Lambda = 20$ for every composition. Below the threshold the rate is their closed-form transonic Parker wind (exact Lambert-W form) capped by the Bondi-limited supply of Gupta & Schlichting (2020). Past the threshold the same machinery survives as a residual capped by the interior luminosity (Gupta & Schlichting 2019), so the late, slow tail of core-powered mass loss is represented without adjudicating how long it lasts. The boil-off test runs first because an atmosphere boiling on bolometric heating has not yet built the stable base an XUV wind launches from (Owen & Schlichting 2024). - -**2. Hydrodynamic escape.** Past the boil-off gate the dispatcher locates the XUV wind base on the profile (by default the Lopez 2017 level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar), sets the wind temperature by a local balance of photoionization heating against radiative cooling (the thermostat below), and computes both hydrodynamic limits: the energy-limited rate in the Erkaev et al. (2007) form with the tidal correction, and the radiation-recombination-limited rate of Murray-Clay et al. (2009). The smaller of the two is the candidate, and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. The selection mechanism is itself reported, because min() selects the recombination-limited rate two physically different ways: genuine recombination saturation at modest binding, and exponential barometric suppression at strong binding, where calling the result recombination-limited would be a category error. - -**3. The Knudsen switch.** A hydrodynamic wind only exists if the gas is still collisional at its sonic point. The switch compares the Maxwell mean free path against the analytic sonic-point scale height (Chatterjee & Pierrehumbert 2026, their Eqs. 17 and 18), with mixture-weighted collision cross sections from tabulated collision integrals (Laricchiuta et al. 2009), a diffusion-inversion route for hydrogen, and a geometric last resort, each carrying a provenance class. At or below the threshold (default $\mathrm{Kn}_\mathrm{sc} = 1$) the hydrodynamic label is confirmed and the fractionation closure partitions the rate over species; above it the point re-routes to the hydrostatic branch. For evolutionary use a previous regime label activates a hysteresis window around the threshold so a time-stepping track cannot chatter between branches. - -**4. Hydrostatic escape.** Where no wind exists, escape is per species: Jeans effusion from the exobase with the kinetic enhancement factor measured in direct simulation Monte Carlo runs (Volkov et al. 2011), capped by the diffusion-limited supply through the background gas and combined by the harmonic mean of Yelle (2024). All exobase quantities are evaluated on a Bates-profile upper structure extended above the supplied profile at a prescribed exobase temperature, never on photospheric values, because the two can differ by an order of magnitude in Jeans parameter and the photospheric shortcut biases rates toward false retention by up to three decades (Johnson et al. 2013). An escape-temperature gate re-routes thermally unstable exospheres back to the hydrodynamic rate; both the neutral and the plasma escape temperatures are always computed, and points where the two conventions disagree are flagged as contested with both rates recorded, because the ion physics that would decide them is not modeled in this version. - -**5. The Roche screen.** Before the label is finalized, the active flow radius of the winning branch (the Parker sonic radius, the larger of the XUV and sonic radii, or the exobase radius) is tested against the periapsis Hill radius. A flow that reaches the Hill sphere is not described by any of the three regimes: the point is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag distinguishing geometries whose Hill sphere sits inside the photosphere. Near misses raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there. - -**6. The bolometric residual.** The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. - -## The wind-temperature thermostat - -The hydrodynamic branch does not assume the canonical $10^4$ K wind. The wind temperature comes from a local balance at the wind base between photoionization heating (a monochromatic-front approximation) and four radiative cooling channels: atomic line cooling by H, C, C+, N, N+, O, and O+ in three-level statistical equilibrium (on the Nakayama et al. 2022 atomic data), the CO2 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018), and recombination cooling (with the Badnell 2006 fit). The balance is bracketed between the equilibrium temperature and $5 \times 10^4$ K; a balance with no root clamps to the nearer edge with a flag. The channels can be toggled individually for attribution experiments, but a configuration with every channel off is rejected. The blind spot of a local, single-level balance is the temperature structure through the sonic region, which is a stated limitation rather than a solved problem; rates computed with this wind temperature inherit it. - -## Fractionation - -A confirmed hydrodynamic wind does not carry all species equally: heavy species lag the outflow through binary diffusion, and below per-species thresholds they drop out of the wind entirely. The fractionation closure solves the simultaneous N-species problem (the constant-composition closure of the Zahnle et al. 1990 multispecies wind system, generalizing Hunten et al. 1987) with active-set dropout, on binary diffusion coefficients that each carry a provenance class (measured, estimated, or scaled). The returned per-species rates are non-negative and sum to the bulk rate at machine precision. On the boil-off and overflow branches fractionation is off and the split follows reservoir mass fractions, matching the energy-limited protocol; the hydrostatic branch is natively per-species. - -## Boundaries are bands, not lines - -Every criterion in the dispatcher carries genuine physical width, and the diagnostics container makes that width visible instead of hiding it behind a sharp switch. The Knudsen threshold's physical band is 0.1 to 3 (heating-geometry physics: a sharp heating layer transitions near 0.1, distributed heating near 1; Johnson et al. 2013), and the container reports the counterfactual labels at both band edges beside every verdict. The boil-off activation threshold spans 15 to 35 across the literature. The container also reports, per call: the transonic energy criterion of Johnson et al. (2013), the Jeans-parameter triple of Guo (2024), both escape temperatures with the local ionization fraction, the tidally corrected critical exobase temperature of Erkaev et al. (2007), the threshold-potential screens, the min(EL, RR) selection mechanism, a boil-off termination timescale check (Tang et al. 2024), a snapshot self-consistency screen, and the coefficient provenance classes per species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. - -## Configuration surface - -All knobs live on `DispatchSettings`; the defaults are the documented reference choices, listed in the [parameter reference](../Reference/parameters.md). The main ones: the wind-base method (`lopez`, `fixed_pressure`, or `boreas`, the last falling back to `lopez` with a flag when the optional BOREAS dependency is absent), the out-of-range policy when a profile is too shallow for the physical base (`clamp` or `extend`), the Knudsen threshold and hysteresis window, the hydrostatic gate convention (`neutral` or `plasma`), the escape efficiency and its mode (`fixed` or the `caldiroli` fitted efficiency, converted to the Erkaev geometry and guarded against its complex-valued region), the prescribed exobase temperature, the four cooling toggles, and the fractionation toggle. - -## Limitations - -The dispatcher's own limitations, beyond those listed on the [limitations page](limitations.md): - -- Hydrostatic heavy-element rates are lower limits. The non-thermal channels that dominate heavy-species loss from hydrostatic exospheres (ion outflow, photochemical ejection, sputtering) are not modeled; every hydrostatic result carries a flag saying so, and contested points report both branch rates. -- The exobase temperature is prescribed, not solved. The Jeans rate depends exponentially on it, which makes it the branch's dominant sensitivity; the optional thermostat estimator is biased high by construction (a conduction-free local balance) and is not the default. -- The thermostat evaluates one level. The temperature structure through the sonic region is not modeled, and the wind-temperature sensitivity propagates into the sonic-point density and hence into the Knudsen switch itself. -- The kinetic enhancement factor on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond, a flagged extrapolation. -- The switch inherits the base-pressure choice. The sonic-point density scales with the base density, so the wind-base level sets where the switch fires; the base-method setting exposes that dependence rather than resolving it. -- Impact-driven escape is not dispatched. The giant-impact erosion law ships in [`zephyrus.collision`](../Reference/api/collision.md) and a label is reserved, but the dispatcher does not route to it. diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md new file mode 100644 index 00000000..f7e20539 --- /dev/null +++ b/docs/Explanations/energy_limited.md @@ -0,0 +1,72 @@ +# Energy-limited escape + +Energy-limited (EL) escape is the default rate prescription of ZEPHYRUS: the one PROTEUS consumes at each coupled time step, through the released entry point `zephyrus.escape.EL_escape`. Within the [escape-regime framework](regimes.md) it is one of the two hydrodynamic limits, valid when the atmosphere sustains a collisional, XUV-driven fluid wind; this page defines the prescription itself, its radius scaling, and its tidal correction. + +The physical idea is an energy budget. The stellar X-ray and extreme-ultraviolet (XUV) flux absorbed high in the atmosphere heats the gas; if a fixed fraction of that power goes into lifting gas out of the planet's gravitational well, the mass-loss rate follows from dividing the absorbed power by the escape energy per unit mass [^watson][^lammer2003]. The rate is computed as + +$$\dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}}{G\,M_\mathrm{p}\,K_\mathrm{tide}} \tag{1}$$ + +where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} K_\mathrm{tide} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. + +Two radii enter the problem, and keeping them apart matters. $R_\mathrm{p}$ is the planetary (interior) radius. $R_\mathrm{XUV}$ is the radius at which the atmosphere becomes optically thick to XUV photons; in PROTEUS it is recomputed at each time step from the atmospheric structure at a configured reference pressure, by default 20 mbar following the photosphere-type level of Baumeister et al. (2023) [^baumeister]. That level is a bookkeeping radius for the intercepting area: the XUV heating is actually deposited, and the wind launched, at the far lower pressure (of order a nanobar) where the gas first reaches unit optical depth to ionizing photons [^lopez2017]; the [escape-regime framework](regimes.md) locates that launching level on the profile when it needs it. + +## Radius scaling + +The cubic radius term in Eq. (1) is selected at runtime by the `scaling` argument of `EL_escape`: + +| `scaling` | $R^3$ | Description | +|---|---|---| +| `2` | $R_\mathrm{p}\,R^2_\mathrm{XUV}$ | Default; the XUV-absorbing cross section paired with the potential measured at the surface radius, the form of Erkaev et al. (2007) [^erkaev] | +| `3` | $R^3_\mathrm{XUV}$ | All three powers taken at the XUV radius, the single-radius form of Lopez, Fortney & Miller (2012) [^lfm2012] and Lehmer & Catling (2017) [^lehmer] | + +Both forms reduce to $R_\mathrm{p}^3$ when $R_\mathrm{XUV} = R_\mathrm{p}$, the conservative lower bound adopted by Luger & Barnes (2015) [^luger] and Moore et al. (2023) [^moore]. Allowing $R_\mathrm{XUV} > R_\mathrm{p}$ increases the effective XUV-absorbing area and therefore the escape rate. + +## Tidal correction + +When the `tidal_contribution` flag is `True`, the effective potential barrier is reduced by the host star's tidal field, following Erkaev et al. (2007), their Eq. 17 [^erkaev]: + +$$K_\mathrm{tide} = 1 - \frac{3}{2\xi} + \frac{1}{2\xi^3}, \qquad \xi = \frac{R_\mathrm{Hill}}{R} \tag{2}$$ + +with the periapsis Hill radius + +$$R_\mathrm{Hill} = a\,(1-e)\,\left(\frac{M_\mathrm{p}}{3\,M_\star}\right)^{1/3} \tag{3}$$ + +where $a$ is the semi-major axis, $e$ the orbital eccentricity, and $M_\star$ the stellar mass. The radius $R$ in $\xi$ is the one that appears linearly in the $R^3$ term of Eq. (1): $R_\mathrm{p}$ for `scaling=2` (the convention of Erkaev et al. 2007, whose own $\xi$ is the Roche-lobe distance over the planetary radius) and $R_\mathrm{XUV}$ for `scaling=3`, where the XUV radius is the only radius in the problem. + +Factoring the numerator gives $K_\mathrm{tide} = (\xi - 1)^2\,(2\xi + 1) / (2\xi^3)$, non-negative for every $\xi > 0$ with a double root at $\xi = 1$. In the physical regime $\xi > 1$ it lies in $(0, 1)$, rising toward 1 for $\xi \gg 1$ (the escape level deep inside the Hill sphere) and falling toward 0 as the atmosphere expands toward the Roche lobe at $\xi = 1$. Because the rate divides by $K_\mathrm{tide}$, the tidal correction enhances escape and diverges at the Roche lobe, so the tidally corrected rate is defined only for $\xi > 1$: `EL_escape` raises a `ValueError` for $\xi \le 1$, where the atmosphere reaches the Roche lobe and the energy-limited approximation no longer applies. When `tidal_contribution` is `False`, $K_\mathrm{tide} = 1$. The [regime framework](regimes.md) handles the $\xi \le 1$ geometry itself, as the `roche_overflow` label. + +## When the prescription applies + +The EL form is appropriate in the high-irradiation, collisional-wind regime that dominates the loss during roughly the first $10^6$ to $10^8$ years of a close-in planet's evolution [^watson][^lammer2003]. Outside it, at lower XUV flux or for a less extended atmosphere, particle-by-particle (non-thermal and Jeans) escape becomes comparable or dominant and the bulk EL prescription no longer applies. The [regime framework](regimes.md) classifies each state before choosing a rate; when using `EL_escape` alone, verify that the XUV-driven loss genuinely dominates (for scale, present-day non-thermal rates for an Earth-mass planet are of order $10^7$ to $10^8$ g s$^{-1}$; Kislyakova et al. 2014 [^kislyakova]). + +Bulk removal is the second assumption. When the escaping particle flux drops below the critical value needed to drag a heavy species along, the outflow fractionates: hydrogen escapes preferentially and the residual atmosphere is enriched in heavy species [^wordsworth2018][^cherubim2024]. For scale, the critical flux for water in a hydrogen background is about $1.9 \times 10^{8}$ g s$^{-1}$ (Yoshida et al. 2022 [^yoshida]). `EL_escape` removes everything in bulk; the [fractionation](fractionation.md) page describes the closure that resolves the partition when the regime framework confirms a wind. + +--- + +[^watson]: Watson, A. J., Donahue, T. M., & Walker, J. C. G. (1981). The dynamics of a rapidly escaping atmosphere: applications to the evolution of Earth and Venus. *Icarus, 48*(2), 150–166. https://doi.org/10.1016/0019-1035(81)90101-9 + +[^lammer2003]: Lammer, H., Selsis, F., Ribas, I., et al. (2003). Atmospheric loss of exoplanets resulting from stellar X-ray and extreme-ultraviolet heating. *The Astrophysical Journal, 598*(2), L121–L124. https://doi.org/10.1086/380815 + +[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 + +[^lfm2012]: Lopez, E. D., Fortney, J. J., & Miller, N. (2012). How thermal evolution and mass-loss sculpt populations of super-Earths and sub-Neptunes: application to the Kepler-11 system and beyond. *The Astrophysical Journal, 761*(1), 59. + +[^lehmer]: Lehmer, O. R., & Catling, D. C. (2017). Rocky worlds limited to 1.8 Earth radii by atmospheric escape during a star's extreme UV saturation. *The Astrophysical Journal, 845*(2), 130. + +[^lopez2017]: Lopez, E. D. (2017). Born dry in the photoevaporation desert: Kepler's ultra-short-period planets formed water-poor. *Monthly Notices of the Royal Astronomical Society, 472*(1), 245–253. + +[^baumeister]: Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & Noack, L. (2023). Redox state and interior structure control on the long-term habitability of stagnant-lid planets. *Astronomy & Astrophysics, 675*, A122. https://doi.org/10.1051/0004-6361/202245791 + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^luger]: Luger, R., & Barnes, R. (2015). Extreme water loss and abiotic O$_2$ buildup on planets throughout the habitable zones of M dwarfs. *Astrobiology, 15*(2), 119–143. https://doi.org/10.1089/ast.2014.1231 + +[^moore]: Moore, K., Cowan, N. B., & Boukaré, C.-É. (2023). The role of magma oceans in maintaining surface water on rocky planets orbiting M-dwarfs. *Monthly Notices of the Royal Astronomical Society, 526*(4), 6235–6249. https://doi.org/10.1093/mnras/stad3138 + +[^kislyakova]: Kislyakova, K. G., Johnstone, C. P., Odert, P., et al. (2014). Stellar wind interaction and pick-up ion escape of the Kepler-11 "super-Earths". *Astronomy & Astrophysics, 562*, A116. https://doi.org/10.1051/0004-6361/201322933 + +[^wordsworth2018]: Wordsworth, R. D., Schaefer, L. K., & Fischer, R. A. (2018). Redox evolution via gravitational differentiation on low-mass planets: implications for abiotic oxygen, water loss, and habitability. *The Astronomical Journal, 155*(5), 195. https://doi.org/10.3847/1538-3881/aab608 + +[^cherubim2024]: Cherubim, C., Wordsworth, R., Hu, R., & Shkolnik, E. (2024). Strong Fractionation of Deuterium and Helium in Sub-Neptune Atmospheres along the Radius Valley. *The Astrophysical Journal, 967*(2), 139. https://doi.org/10.3847/1538-4357/ad3e77 + +[^yoshida]: Yoshida, T., Terada, N., Ikoma, M., & Kuramoto, K. (2022). Less Effective Hydrodynamic Escape of H$_2$–H$_2$O Atmospheres on Terrestrial Planets Orbiting Pre-main-sequence M Dwarfs. *The Astrophysical Journal, 934*(2), 137. https://doi.org/10.3847/1538-4357/ac7be7 diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md new file mode 100644 index 00000000..edadd95f --- /dev/null +++ b/docs/Explanations/fractionation.md @@ -0,0 +1,55 @@ +# Fractionation + +A hydrodynamic wind does not carry every species equally. Light species stream out; heavier ones are dragged along through collisions, lag the flow, and below a species-specific threshold flux they stop escaping altogether while continuing to exert drag on everything that still escapes. Over time this fractionates the atmosphere, enriching it in heavy species, which is one of the main observable signatures escape leaves behind. When the [regime framework](regimes.md) confirms a hydrodynamic wind, ZEPHYRUS partitions the bulk rate over species with a simultaneous N-species closure (Attia & Lichtenberg 2026, in prep. [^attia]); this page describes what the closure solves, where its coefficients come from, and which regimes it applies to. + +## The problem and the closure + +The classic treatment is the two-species problem of Hunten, Pepin & Walker (1987) [^hunten]: a light major species escaping through one heavy species, with a crossover mass separating dragged-along from left-behind. Real atmospheres carry many species at once, and each pair interacts through its own binary diffusion coefficient, so the two-species answer cannot just be applied pairwise. The closure generalizes the constant-composition treatment of the multispecies wind equations of Zahnle, Kasting & Pollack (1990) [^z90] to N species escaping simultaneously. + +The solved system couples the species drift velocities. For each escaping species $j$, the drag exerted by every other species balances its weight surplus, + +$$\sum_{i\,\mathrm{escaping}} \frac{X_i\,(w_i - w_j)}{b_{ij}} \;-\; w_j \sum_{k\,\mathrm{retained}} \frac{X_k}{b_{jk}} \;=\; \frac{m_j\, g}{k_\mathrm{B} T} - C \tag{1}$$ + +where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale (the number flux is $\Phi_i = X_i w_i$), $b_{ij}$ the binary diffusion parameter of the pair, $m_j$ the particle mass, $g$ the gravity at the wind base, $T$ the wind temperature, and $C$ a common inverse scale height of the escaping gas that all species share. The system closes with the mass constraint that the per-species fluxes carry the bulk rate the regime framework dispatched, $\sum_j m_j X_j \Phi_j = \phi$. + +Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the unique partition into escaping and retained species for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate at machine precision. + +The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim & Wordsworth (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefiere (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. + +## Coefficients and their provenance + +Everything species-dependent enters through the binary diffusion parameters $b_{ij}$, and no compilation measures every pair, so each pair carries a provenance class that travels with the result. Measured rows come from the compilations of Zahnle & Kasting (1986) [^zk86] and Zahnle & Kasting (2023) [^zk23], which trace to the reference measurements of Marrero & Mason (1972) [^marrero], with the noble-gas rows of Sasaki & Nakazawa (1988) [^sasaki] verified against them. Pairs no compilation prints are built by the reduced-mass and kinetic-diameter scaling rule of Zahnle & Kasting (2023), validated in and out of sample against the printed entries, and land in a wider uncertainty class. Rock-forming species (Na, Mg, Si, Fe) sit in the widest class of all, and results involving them carry a dedicated flag: no measured coefficient exists for any of their pairs, and sodium and magnesium ionize at the temperatures where rock vapor exists while these are neutral-gas coefficients. + +## Where it applies + +The closure evaluates at the XUV wind base on the atomized composition (molecules are photodissociated well below the launching level, so the escaping gas is atomic). It applies only to confirmed hydrodynamic verdicts; the other regimes split their rates differently: + +| Regime label | Per-species split | +|---|---| +| `hydrodynamic:EL`, `hydrodynamic:RR` | The N-species closure at the wind base (this page); with fractionation disabled, reservoir mass fractions | +| `boiloff`, `roche_overflow` | Reservoir mass fractions (no fractionation: the flow is fast and bulk) | +| `hydrostatic` | Natively per-species: each species carries its own Jeans flux and supply cap (see [escape regimes](regimes.md)) | + +--- + +[^attia]: Attia, M., & Lichtenberg, T. (2026). In preparation. + +[^hunten]: Hunten, D. M., Pepin, R. O., & Walker, J. C. G. (1987). Mass Fractionation in Hydrodynamic Escape. *Icarus, 69*, 532–549. + +[^z90]: Zahnle, K., Kasting, J. F., & Pollack, J. B. (1990). Mass Fractionation of Noble Gases in Diffusion-Limited Hydrodynamic Hydrogen Escape. *Icarus, 84*(2), 502–527. + +[^zk86]: Zahnle, K. J., & Kasting, J. F. (1986). Mass Fractionation during Transonic Escape and Implications for Loss of Water from Mars and Venus. *Icarus, 68*(3), 462–480. + +[^zk23]: Zahnle, K. J., & Kasting, J. F. (2023). Elemental and isotopic fractionation as fossils of water escape from Venus. *Geochimica et Cosmochimica Acta, 361*, 228–244. + +[^marrero]: Marrero, T. R., & Mason, E. A. (1972). Gaseous diffusion coefficients. *Journal of Physical and Chemical Reference Data, 1*(1), 3–118. + +[^sasaki]: Sasaki, S., & Nakazawa, K. (1988). Origin of isotopic fractionation of terrestrial Xe: hydrodynamic fractionation during escape of the primordial H$_2$-He atmosphere. *Earth and Planetary Science Letters, 89*(3-4), 323–334. + +[^cherubim]: Cherubim, C., Wordsworth, R., Hu, R., & Shkolnik, E. (2024). Strong Fractionation of Deuterium and Helium in Sub-Neptune Atmospheres along the Radius Valley. *The Astrophysical Journal, 967*(2), 139. https://doi.org/10.3847/1538-4357/ad3e77 + +[^guchen]: Gu, P.-G., & Chen, H. (2023). Deuterium Escape on Photoevaporating Sub-Neptunes. arXiv:2308.05057. + +[^odert]: Odert, P., et al. (2018). Escape and fractionation of volatiles and noble gases from Mars-sized planetary embryos and growing protoplanets. *Icarus, 307*, 327–346. + +[^chassefiere]: Chassefiere, E. (1996). Hydrodynamic Escape of Oxygen from Primitive Atmospheres: Applications to the Cases of Venus and Mars. *Icarus, 124*, 537–552. diff --git a/docs/Explanations/impacts.md b/docs/Explanations/impacts.md new file mode 100644 index 00000000..749d2875 --- /dev/null +++ b/docs/Explanations/impacts.md @@ -0,0 +1,29 @@ +# Giant impacts + +A giant collision removes part of the target planet's atmosphere in a single event: a shock launched by the impact accelerates atmosphere past the escape velocity, locally near the impact site and globally through ground motion. This is the second mass-loss channel of ZEPHYRUS, physically and numerically separate from the continuous escape of the [regime framework](regimes.md): it is applied per collision rather than per time step, and its rate question ("what fraction is lost in this event") replaces the continuous channel's ("how fast is mass leaving"). A regime label is reserved for routing impacts through the same interface in the future; today the caller invokes the channel directly. + +ZEPHYRUS computes the eroded fraction with `zephyrus.collision.mass_loss`, which implements the scaling law of Kegerreis et al. (2020), their Eq. 1 [^kegerreis]: + +$$X \;=\; \min\!\left\{0.64 \left[ \left(\frac{v_\mathrm{c}}{v_\mathrm{esc}}\right)^2 \left(\frac{M_\mathrm{i}}{M_\mathrm{tot}}\right)^{1/2} \left(\frac{\rho_\mathrm{i}}{\rho_\mathrm{t}}\right)^{1/2} f_M(b) \right]^{0.65},\; 1\right\} \tag{1}$$ + +where $X$ is the fraction of the target's atmosphere removed (capped at 1 for total erosion), subscript $\mathrm{i}$ denotes the impactor and $\mathrm{t}$ the target, $v_\mathrm{c}$ is the speed at first contact, $M_\mathrm{tot} = M_\mathrm{i} + M_\mathrm{t}$ is the total mass, $\rho_\mathrm{i}$ and $\rho_\mathrm{t}$ are the bulk densities of the atmosphere-free bodies, and $b \equiv \sin\beta$ is the dimensionless impact parameter for impact angle $\beta$ (0 head-on, 1 fully grazing). The prefactor and exponent are least-squares fits to the paper's suite of 259 smoothed-particle-hydrodynamics simulations, each fitted with an uncertainty of 0.01. The mutual escape speed of the pair at contact is + +$$v_\mathrm{esc} \;=\; \sqrt{\frac{2\,G\,(M_\mathrm{t} + M_\mathrm{i})}{R_\mathrm{t} + R_\mathrm{i}}} \tag{2}$$ + +with $R_\mathrm{t}$ and $R_\mathrm{i}$ the body radii at the base of any atmosphere, and $f_M(b)$ is the fractional interacting mass of the pair (their Eq. B1), built from density-weighted spherical caps of common height $d = (R_\mathrm{t} + R_\mathrm{i})(1 - b)$: + +$$f_M \;=\; \frac{\rho_\mathrm{t}\, V^\mathrm{cap}_\mathrm{t} + \rho_\mathrm{i}\, V^\mathrm{cap}_\mathrm{i}}{\rho_\mathrm{t}\, V_\mathrm{t} + \rho_\mathrm{i}\, V_\mathrm{i}}, \qquad V^\mathrm{cap}_\mathrm{t,i} = \frac{\pi}{3}\, d^2 \left(3 R_\mathrm{t,i} - d\right) \tag{3}$$ + +where $V_\mathrm{t,i}$ are the full body volumes. At equal bulk densities $f_M$ reduces to the fractional interacting volume of their Eq. B2. The common-height caps are a linearized bookkeeping: outside the fitted geometry, for a much denser and much smaller impactor near head-on, the raw $f_M$ can leave $[0, 1]$ and vary non-monotonically with $b$, so ZEPHYRUS clamps $f_M$ to $[0, 1]$. Within the fitted domain the clamp never engages. + +Three input conventions follow the paper and must be honored by the caller: $v_\mathrm{c}$ is the speed at first contact, not the relative speed at infinity; the masses and radii exclude any atmosphere, with radii taken at the base of the atmosphere; and the densities are bulk values of the atmosphere-free bodies. + +## Fitted domain and accuracy + +The law is constrained by simulations spanning target masses of roughly 0.3 to 3 Earth masses, impactor masses down to about 0.05 Earth masses, bulk densities from about half to double Earth's, contact speeds of 1 to 3 $v_\mathrm{esc}$, all impact angles, and thin atmospheres of order 1 percent of the planet mass. The median deviation of the simulations from the law is 9 percent, rising to about 20 percent for slow, head-on impacts, whose outcomes are chaotic. The loss depends only mildly on the atmosphere mass in this thin-atmosphere regime, with a factor of 10 less atmosphere increasing the eroded fraction by roughly 10 percent; substantially thicker atmospheres, which can cushion the impactor, fall outside the law's domain. The function evaluates the law for any physically valid inputs and does not warn when masses, densities, or speeds leave the fitted ranges; staying inside them is the caller's responsibility, and the [limitations page](limitations.md) lists what the channel leaves out (impactor-side atmosphere, volatile delivery, and mantle stripping among them). + +The returned fraction applies to the target's atmosphere as a whole. Consistent with the bulk-removal treatment of the continuous channel's unfractionated splits, the caller partitions the lost mass across atmospheric species without elemental fractionation. + +--- + +[^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index 86bf7072..d351bf6a 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -1,82 +1,52 @@ # Limitations -ZEPHYRUS implements the **energy-limited (EL) approximation** to hydrodynamic atmospheric escape, given by Eq. (1) of the [model overview](model.md), the **giant-impact erosion scaling law** of Eq. (4), and the **[regime dispatcher](dispatcher.md)**, which classifies an atmosphere into the boil-off, hydrodynamic, or hydrostatic regime before choosing a rate and partitions it over species. All are deliberate simplifications of much richer physical problems. The most important regimes and processes the package does not cover, and which entry point covers what, are summarised below. +Every prescription in ZEPHYRUS is a deliberate simplification of a richer physical problem. This page collects what each entry point does not model and what that implies for results; the physics each one does model is defined on the [energy-limited escape](energy_limited.md), [escape regimes](regimes.md), [fractionation](fractionation.md), and [giant impacts](impacts.md) pages. --- -## What ZEPHYRUS *does* model +## The energy-limited default (`EL_escape`) -Three entry points. The first is bulk hydrodynamic escape driven by stellar XUV irradiation, in the energy-limited approximation, with an optional tidal correction (Eq. 2 of the [model overview](model.md)). The tidal correction is defined only outside the Roche lobe, where $\xi > 1$ with $\xi$ measured from the radius the `scaling` argument selects; ZEPHYRUS raises an error for $\xi \le 1$, at which point the atmosphere reaches the Roche lobe and the energy-limited approximation no longer holds. The mass-loss rate is partitioned across atmospheric species in proportion to their elemental mass mixing ratios. The second is the fraction of the target's atmosphere eroded by a single giant impact, from a fitted power law in the collision speed, mass ratio, density ratio, and impact angle (Eq. 4 of the [model overview](model.md)). The third is the [regime dispatcher](dispatcher.md), which adds bolometrically driven boil-off, a radiation-recombination-limited cap with a radiatively cooled wind temperature, per-species Jeans escape with a diffusion-limited supply, a collisionality switch between the fluid and kinetic regimes, Roche-overflow handling, and N-species fractionation of the hydrodynamic outflow. +The released entry point applies one prescription unconditionally, so every limitation of that prescription passes through to coupled PROTEUS runs until the regime framework is wired in: -Everything below is **not modelled**, or modelled only by the dispatcher entry point where stated. +- **No regime awareness.** `EL_escape` returns an energy-limited rate whether or not the state sustains a collisional XUV wind. Outside that regime (weak XUV flux, compact atmosphere, boil-off conditions, Roche-filling geometries) the returned rate can be wrong by orders of magnitude in either direction. The [regime framework](regimes.md) classifies the state first; `EL_escape` does not. +- **Radiative cooling is not accounted for.** Line emission, molecular bands, and recombination divert absorbed XUV power away from driving the outflow, which is why the effective efficiency collapses for strongly bound planets (of order $10^{-2}$ above the threshold potential of Caldiroli et al. 2022; see the [energy-limited page](energy_limited.md)). `EL_escape` treats the efficiency $\epsilon$ as a constant input, so $\epsilon = 1$ is a nonphysical upper limit and even canonical values overestimate the loss for compact planets. The regime framework improves on this two ways (a radiatively cooled wind temperature, and the radiation-recombination cap), but its energy-limited efficiency remains an input as well. +- **Bulk removal.** The rate is split over species by reservoir mass fractions, with no preferential loss of light species. The [fractionation closure](fractionation.md) resolves the partition when the regime framework confirms a wind; `EL_escape` alone cannot. For close-in planets where fractionation matters, bulk-removal rates are a lower bound on how fast the atmospheric mean molecular weight grows. +- **$\epsilon$ is constant in time.** The efficiency in reality evolves with mass, radius, and flux; fixed-$\epsilon$ histories can overestimate late-time loss. The fitted-efficiency option of the regime framework captures the potential dependence, not a separate time dependence. ---- - -## Giant-impact erosion - -The collision channel is a single fitted power law, not an impact simulation, and inherits the scope of the simulation suite behind it: - -- **Thin atmospheres only.** The fit covers atmospheres of order 1 percent of the planet mass. A substantially thicker envelope cushions the impactor and alters its trajectory, and the eroded fraction is no longer described by the law. -- **Target-side loss only.** The law returns what the target's atmosphere loses. Any atmosphere the impactor itself carries, and any volatile delivery from the impactor into the merged body, is outside the function; the underlying paper shows that in slow, grazing collisions with an atmosphere-hosting impactor the target can retain about 85 percent of the two bodies' combined initial atmospheres, so treating the impactor as ballastless is a caller-side assumption, not a property of the collision. -- **No mantle or core erosion.** Violent impacts also strip silicate and metal mass; the law tracks only the atmospheric fraction. -- **Chaotic regime scatter.** Slow, head-on collisions produce chaotic fall-back and sloshing; the fit carries about 20 percent scatter there, against 9 percent overall. -- **Linearised interacting-mass geometry.** The common-height cap construction behind $f_M(b)$ misbehaves for a much denser, much smaller impactor near head-on, outside the fitted density ratios; ZEPHYRUS clamps $f_M$ to $[0, 1]$ in that corner rather than extrapolating the artifact. -- **Fit-domain extrapolation is unflagged.** The function evaluates the power law for any physically valid inputs; it does not warn when masses, densities, or speeds leave the fitted ranges listed in the [model overview](model.md). Staying inside them is the caller's responsibility. - ---- +## The regime framework (`dispatch`) -## Other hydrodynamic regimes +The framework removes the regime-awareness limitation and carries its own, each flagged on the results it affects: -The EL approximation assumes a fixed fraction $\epsilon$ of absorbed XUV energy goes into driving the outflow. This breaks down in several ways: +- **The exobase temperature is prescribed.** The hydrostatic branch's rate depends exponentially on $T_\mathrm{exo}$, which the caller supplies (default 1000 K). This is the branch's dominant sensitivity. The optional local-balance estimator is biased high by construction (heating scales with density, the cooling channels with its square, and conduction is absent) and is deliberately not the default. +- **The thermostat evaluates one level.** The wind temperature comes from a local balance at the wind base; the temperature structure through the sonic region is not modeled. The sensitivity propagates: the wind temperature sets the sonic-point density and therefore feeds the collisionality switch itself. +- **Hydrostatic heavy-element rates are lower limits.** The nonthermal channels that dominate heavy-species loss from real exospheres (ion outflow, photochemical ejection, sputtering, charge exchange, ion pickup) are absent. Every hydrostatic result carries a flag saying so, and states where the neutral and plasma escape-temperature conventions disagree are flagged as contested with both branch rates recorded, because the unmodeled ion physics decides them. +- **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. +- **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section rung has a documented high-temperature bias. Each engagement is flagged or provenance-classed. +- **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. +- **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. -- **Radiative cooling is ignored by `EL_escape`.** Atomic line cooling, molecular emission, and ionisation losses can divert XUV energy away from heating the bulk gas, reducing the effective $\epsilon$. `EL_escape` treats $\epsilon$ as a constant input rather than computing it self-consistently, and setting $\epsilon = 1$ in particular is a non-physical upper limit on the mass-loss rate. The dispatcher partially addresses this: its wind-temperature thermostat balances photoionization heating against four radiative cooling channels, and its radiation-recombination cap bounds the rate where recombination radiates the energy away, but the energy-limited efficiency itself remains an input there too (fixed, or the fitted efficiency of Caldiroli et al. 2022). -- **Fractionation in the outflow is not captured by `EL_escape`.** When the particle flux drops below the critical value required to drag heavy species along, the outflow becomes compositionally fractionated: hydrogen escapes preferentially and the residual atmosphere is enriched in heavy species. `EL_escape` removes everything in bulk. The dispatcher implements this through the N-species fractionation closure, with per-species dropout thresholds and provenance-classed diffusion coefficients. -- **$\epsilon$ is held constant in time.** In reality the efficiency evolves with planet mass, radius, and incident flux. Fixed-$\epsilon$ models can overestimate mass loss at late times; the dispatcher's fitted-efficiency mode captures the potential dependence but not a time dependence beyond it. +## The impact channel (`collision.mass_loss`) ---- - -## Non-hydrodynamic escape - -These processes operate on a different physical basis (kinetic rather than fluid). Jeans escape is now implemented: the dispatcher's hydrostatic branch evaluates per-species Jeans effusion with a kinetic enhancement factor and a diffusion-limited supply cap, on an extended upper structure. The remaining kinetic channels are not modelled by any entry point: +The channel is a single fitted power law, not an impact simulation, and inherits the scope of the simulation suite behind it (see the [giant impacts page](impacts.md) for the fitted domain): -- Ion pickup -- Charge exchange -- Photochemical escape -- Sputtering -- Polar wind / unmagnetised ion outflow +- **Thin atmospheres only.** The fit covers atmospheres of order 1 percent of the planet mass; a substantially thicker envelope cushions the impactor and the eroded fraction is no longer described by the law. +- **Target-side loss only.** Any atmosphere the impactor carries, and any volatile delivery into the merged body, is outside the function. The underlying simulations show a slow grazing collision with an atmosphere-hosting impactor can leave the target with about 85 percent of the two bodies' combined atmospheres, so treating the impactor as bare is a caller-side assumption. +- **No mantle or core erosion.** Violent impacts also strip silicate and metal mass; the law tracks the atmospheric fraction only. +- **Chaotic-regime scatter.** Slow, head-on collisions produce chaotic fall-back; the fit carries about 20 percent scatter there against 9 percent overall. +- **Fit-domain extrapolation is unflagged.** The function evaluates the law for any physically valid inputs and does not warn when they leave the fitted ranges; staying inside them is the caller's responsibility. -For present-day Earth and Venus these mechanisms dominate over hydrodynamic escape, with total non-thermal rates around $\sim 10^3$ g s$^{-1}$; many orders of magnitude below the EL rates ZEPHYRUS produces during the early evolution phase. Because they are absent, the dispatcher's hydrostatic heavy-element rates are lower limits, and it flags every hydrostatic result accordingly; grid points where the neutral and plasma escape-temperature conventions disagree are flagged as contested, with both branch rates reported, because the unmodelled ion physics decides them. +## Not modeled by any entry point ---- - -## Other escape drivers +- **Nonthermal escape.** Ion pickup, charge exchange, photochemical escape, sputtering, and unmagnetized ion outflow are absent everywhere. For present-day Earth and Venus these dominate the total loss, at rates of order $10^3$ g s$^{-1}$, many orders of magnitude below the rates ZEPHYRUS produces during the early high-XUV phase it targets; they matter for evolved, weakly irradiated states. +- **Magnetic fields.** No entry point knows about planetary or stellar magnetic fields, which can channel, throttle, or enhance the loss. +- **Photochemistry.** Hazes, aerosols, and photochemically produced species are not tracked; the composition the escape sees is the one the atmosphere model supplies. -**Core-powered mass loss** is not implemented in `EL_escape`. This mechanism is driven by the planet's own internal heat and dominates for low-gravity planets at high equilibrium temperatures (~500–2000 K) over $\sim 10^9$ yr timescales. The dispatcher's bolometric branch covers it: boil-off below the activation threshold, and a luminosity-capped residual past it, which represents the long tail without adjudicating the open dispute over how long it survives. +## Upstream uncertainties ---- - -## Stellar XUV uncertainties - -The XUV flux $F_\mathrm{XUV}$ that enters Eq. (1) of the [model overview](model.md) carries large intrinsic uncertainties from the underlying stellar evolution model: - -- Saturation timescales for the stellar XUV phase can vary from ~10 to ~300 Myr for G stars and up to ~1 Gyr for fully convective M dwarfs, depending on initial rotation. -- The integrated XUV flux, and therefore the integrated mass loss, can vary by factors of $\sim 2–10$ between standard stellar evolution prescriptions. -- The ISM absorbs stellar XUV emission, so observational anchors on young-star XUV luminosities are themselves uncertain. - -Because of these uncertainties, the mass-loss rates computed by ZEPHYRUS should generally be treated as an upper bound. - ---- - -## Atmospheric chemistry - -- **No photochemistry.** Hazes, aerosols, and photochemically-produced species are not tracked in the coupled framework. -- **$R_\mathrm{XUV}$ is set by a single reference pressure** $P_\mathrm{XUV}$ specified in the config. - ---- +The XUV flux $F_\mathrm{XUV}$ entering every XUV-driven rate carries large intrinsic uncertainty from the stellar model: saturation timescales vary from about 10 to 300 Myr for Sun-like stars and up to a Gyr for fully convective M dwarfs depending on initial rotation, integrated XUV histories differ by factors of a few to ten between standard prescriptions, and the observational anchors are themselves absorbed by the interstellar medium. Integrated mass-loss histories inherit these factors on top of everything above. ## Practical implications -For users: - -- Avoid $\epsilon > 0.3$ for rocky planets unless you have a specific reason. $\epsilon \approx 0.15$ is the conservative baseline. -- For close-in M-dwarf planets where elemental fractionation is expected to matter, ZEPHYRUS bulk rates are a lower bound on the change in atmospheric mean molecular weight. The actual atmosphere should become heavier faster than the model predicts. \ No newline at end of file +- Avoid $\epsilon > 0.3$ for rocky planets without a specific reason; $\epsilon \approx 0.15$ is the conservative baseline, and for strongly bound planets consider the fitted-efficiency option of the regime framework. +- For close-in planets around M dwarfs, where fractionation is expected, bulk-removal rates bound the growth of the atmospheric mean molecular weight from below; use the regime framework with fractionation on when the composition history matters. +- Treat single-prescription mass-loss histories as scenario calculations rather than predictions: the regime diagnostics reported beside every framework verdict are the tool for judging how sensitive a given history is to the boundary placements. diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 6f55e31d..991d9ee1 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -1,100 +1,71 @@ -# ZEPHYRUS model overview +# The ZEPHYRUS model -ZEPHYRUS models atmospheric mass loss for rocky exoplanets coupled to the [PROTEUS](https://proteus-framework.org) interior–atmosphere framework: the continuous, bulk hydrodynamic escape driven by stellar XUV irradiation, the impulsive erosion caused by giant impacts during accretion, and, through the [regime dispatcher](dispatcher.md), the boil-off, hydrodynamic, and hydrostatic escape regimes with per-species fractionation. The continuous channel implements an energy-limited (EL) formalism following Watson et al. (1981) [^watson] and Lopez & Fortney (2013) [^lopez]; it is called at each PROTEUS time step with the current planetary radius and mass, the stellar XUV flux supplied by [MORS](https://proteus-framework.org/MORS), and the escape radius computed from the atmospheric structure produced by AGNI or JANUS. The mass-loss rate it returns is distributed across atmospheric species according to their elemental mass mixing ratios, so the atmosphere is depleted in bulk without elemental fractionation. The impulsive channel implements the giant-impact erosion scaling law of Kegerreis et al. (2020) [^kegerreis], which returns the fraction of the target's atmosphere removed by a single collision. +ZEPHYRUS computes the atmospheric mass loss of rocky and sub-Neptune exoplanets. It runs standalone or as the escape module of the [PROTEUS](https://proteus-framework.org) coupled atmosphere and interior framework, where it is called at every time step with the current planetary state and returns the mass-loss rate that depletes the volatile inventory. -This page describes the energy-limited prescription and the giant-impact law, the two entry points PROTEUS consumes today; the [regime dispatcher](dispatcher.md) page describes the standalone dispatcher that classifies an atmosphere into its escape regime before choosing a rate. A model parameter reference can be found [here](../Reference/parameters.md). +Mass loss happens through two physically distinct channels, and ZEPHYRUS models both: -## Energy-limited escape +1. Continuous thermal escape: the steady outflow or evaporation of the upper atmosphere, driven by stellar irradiation and by the planet's own heat. This is one framework with several regimes, described below. +2. Impact-driven erosion: the impulsive removal of atmosphere by a single giant collision during accretion, a separate channel with its own prescription (see [giant impacts](impacts.md)). -The mass-loss rate is computed by `escape.EL_escape` as +## The continuous channel: one framework, five regimes -$$\dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3_\mathrm{XUV}\,F_\mathrm{XUV}}{G\,M_p\,K_\mathrm{tide}} \tag{1}$$ +Which physics carries the continuous loss depends on how tightly the atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are. Applying a prescription outside its regime gives rates that are wrong by orders of magnitude, so ZEPHYRUS classifies each atmospheric state before choosing a rate. Every state receives one of five regime labels: -where $\epsilon$ is the escape efficiency factor (`epsilon`), $R_\mathrm{XUV}$ is the planetary radius at which the atmosphere becomes optically thick to stellar XUV photons (`Rxuv`), $F_\mathrm{XUV}$ is the XUV flux received at the planet (`Fxuv`) supplied by MORS, $M_p$ is the planetary mass (`Mp`), $G$ is the gravitational constant, and $K_\mathrm{tide}$ is the tidal correction factor described below. The efficiency $\epsilon$ quantifies the fraction of incident XUV energy that is converted into work against gravity to drive the outflow; canonical values for rocky planets lie in the range $0.1 \leq \epsilon \leq 0.3$, although ZEPHYRUS accepts any $\epsilon \in (0, 1]$. +- `boiloff`: the atmosphere is so weakly bound that it flows out on the planet's own thermal energy, before stellar XUV heating matters. Typical of young, hot, hydrogen-rich planets fresh out of the nebula. +- `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). +- `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). +- `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. +- `roche_overflow`: the flow region reaches the planet's Hill sphere, so the atmosphere spills over the gravitational boundary rather than escaping through any of the regimes above. -### Radius scaling +The classification logic reduces to three questions, asked in a fixed order: -The cubic radius factor in the numerator of Eq. (1) is selected at runtime by the `scaling` argument of `escape.EL_escape`: +```mermaid +flowchart TD + IN(["Planet state + atmosphere profile"]) --> Q1{"Is the atmosphere inflated
beyond its sonic radius?
(Jeans parameter below threshold)"} + Q1 -- yes --> BO["BOIL-OFF
bolometric wind"] + Q1 -- no --> Q2{"Is an XUV wind collisional
at its sonic point?
(Knudsen number below threshold)"} + Q2 -- yes --> HD["HYDRODYNAMIC WIND
label EL or RR,
whichever rate is smaller"] + Q2 -- no --> HS["HYDROSTATIC
per-species Jeans escape"] + BO --> Q3{"Does the flow reach
the Hill sphere?"} + HD --> Q3 + HS --> Q3 + Q3 -- yes --> RO["ROCHE OVERFLOW"] + Q3 -- no --> OUT(["Regime label + bulk rate
+ per-species rates"]) + RO --> OUT + classDef regime fill:#1e6091,stroke:#0f3a5c,color:#ffffff + classDef decision fill:#f4f4f4,stroke:#888888,color:#111111 + class BO,HD,HS,RO regime + class Q1,Q2,Q3 decision +``` -| `scaling` | Expression | Description | -|---|---|---| -| `2` | $R_p\,R^2_\mathrm{XUV}$ | Default; XUV-absorbing cross-section weighted by surface radius | -| `3` | $R^3_\mathrm{XUV}$ | All three powers taken at the XUV radius | +The figure shows the logic, not the full machinery: each branch carries its own rate physics, caps, and consistency checks, and two refinements are omitted for clarity (a thermally unstable exosphere re-routes from the hydrostatic branch back to the wind rate, and a residual bolometric rate remains in play past the boil-off gate). The [escape regimes](regimes.md) page walks every step with its equations and thresholds. -Both forms reduce to $R_p^3$ when $R_\mathrm{XUV} = R_p$, which is the conservative lower bound on the mass-loss rate adopted by Luger & Barnes (2015) [^luger] and Moore et al. (2023) [^moore]. Allowing $R_\mathrm{XUV} > R_p$ increases the effective XUV-absorbing area and therefore the escape rate. In PROTEUS, $R_\mathrm{XUV}$ is recomputed at each time step from the atmospheric pressure–temperature profile at a user-specified reference pressure $P_\mathrm{XUV}$. +The regime boundaries are not sharp lines in nature. Each threshold carries a physical band (the collisionality threshold spans a factor of 30 across heating geometries, the boil-off threshold a factor of about two across the literature), and ZEPHYRUS reports, beside every verdict, the diagnostics needed to see how close the state sat to each boundary and what the label would have been at the band edges. -### Tidal correction $K_\mathrm{tide}$ +## The default prescription and the full framework -When the `tidal_contribution` flag is `True`, the effective gravitational potential is reduced by the host star's tidal field following the tidal reduction factor of Erkaev et al. (2007), eq. 17 [^erkaev]: +The energy-limited (EL) rate is the default prescription: it is what PROTEUS consumes at each time step today, through the released entry point `zephyrus.escape.EL_escape`, and the [energy-limited escape](energy_limited.md) page defines it in full. It is not an independent channel: within the framework it is one of the two hydrodynamic limits, valid when the atmosphere sustains a collisional XUV-driven wind, which is the regime that dominates the loss during the first 10 to 100 million years of a close-in planet's life. -$$K_\mathrm{tide} = 1 - \frac{3}{2\xi} + \frac{1}{2\xi^3}, \qquad \xi = \frac{R_\mathrm{Hill}}{R} \tag{2}$$ +The full classification framework is available as the standalone entry point `zephyrus.dispatch`, which takes one planetary state (scalars plus an atmosphere profile) and returns the regime label, the bulk rate, per-species rates that sum to it, flags, and the diagnostics container. Its coupling into PROTEUS is planned as a follow-up to the current energy-limited wiring; until then, coupled runs use the EL default and standalone studies can use either entry point. -with the Hill radius +Whichever regime sets the bulk rate, the loss is also partitioned over chemical species. Confirmed hydrodynamic winds fractionate: heavy species lag the outflow through diffusive drag and can drop out of it entirely, which the N-species closure of the [fractionation](fractionation.md) page resolves (Attia & Lichtenberg 2026, in prep. [^attia]). The other regimes split the rate by reservoir mass fractions, and the hydrostatic regime is natively per-species. -$$R_\mathrm{Hill} = a\,(1-e)\,\left(\frac{M_p}{3\,M_\star}\right)^{1/3} \tag{3}$$ +## The impact channel -where $a$ is the planetary semi-major axis, $e$ is the orbital eccentricity, and $M_\star$ is the stellar mass. The radius $R$ in $\xi$ is the one that appears linearly in the $R^3$ term of Eq. (1): $R_p$ for `scaling=2` (the convention of Erkaev et al. 2007, whose own $\xi$ is the Roche-lobe distance over the planetary radius) and $R_\mathrm{XUV}$ for `scaling=3`, where the XUV radius is the only radius in the problem. Factoring the numerator gives $K_\mathrm{tide} = (\xi - 1)^2\,(2\xi + 1) / (2\xi^3)$, which is non-negative for every $\xi > 0$ with a double root at $\xi = 1$. In the physical regime $\xi > 1$ it lies in $(0, 1)$, rising toward 1 for $\xi \gg 1$ (the escape level well inside the Hill sphere) and falling toward 0 as the atmosphere expands toward the Roche lobe at $\xi = 1$; because the escape rate divides by $K_\mathrm{tide}$, the rate is enhanced by the tidal correction and diverges as $\xi \to 1$. The tidally corrected rate is therefore defined only for $\xi > 1$: ZEPHYRUS raises a `ValueError` for $\xi \le 1$, where the atmosphere reaches the Roche lobe and the energy-limited approximation no longer applies. When `tidal_contribution` is `False`, $K_\mathrm{tide} = 1$ is enforced. +A giant collision removes part of the target's atmosphere in a single event, on a timescale unrelated to the continuous escape. ZEPHYRUS computes the eroded fraction with the scaling law of Kegerreis et al. (2020) [^kegerreis] through `zephyrus.collision.mass_loss`; the [giant impacts](impacts.md) page defines the law and its fitted domain. The impact channel is not part of the continuous-regime classification: a regime label is reserved for it, and the caller applies impact erosion as a discrete event. ---- - -## Giant-impact atmospheric erosion - -A giant impact removes part of the target planet's atmosphere in a single event. ZEPHYRUS computes the eroded fraction with `collision.mass_loss`, which implements the scaling law of Kegerreis et al. (2020), their Eq. 1 [^kegerreis]: - -$$X \approx 0.64 \left[ \left(\frac{v_c}{v_\mathrm{esc}}\right)^2 \left(\frac{M_i}{M_\mathrm{tot}}\right)^{1/2} \left(\frac{\rho_i}{\rho_t}\right)^{1/2} f_M(b) \right]^{0.65} \tag{4}$$ - -capped at 1 for total erosion, where subscript $i$ denotes the impactor, $t$ the target, $M_\mathrm{tot} = M_i + M_t$, and $b \equiv \sin\beta$ is the dimensionless impact parameter for impact angle $\beta$ (0 head-on, 1 fully grazing). The prefactor and exponent are least-squares fits to the paper's suite of 259 SPH simulations, each with an uncertainty of 0.01. The mutual escape speed of the pair at contact is - -$$v_\mathrm{esc} = \sqrt{\frac{2\,G\,(M_t + M_i)}{R_t + R_i}} \tag{5}$$ - -and $f_M(b)$ is the fractional interacting mass of the pair (their Eq. B1), built from density-weighted spherical caps of common height $d = (R_t + R_i)(1 - b)$: - -$$f_M = \frac{\rho_t V^\mathrm{cap}_t + \rho_i V^\mathrm{cap}_i}{\rho_t V_t + \rho_i V_i}, \qquad V^\mathrm{cap}_{t,i} = \frac{\pi}{3} d^2 \left(3 R_{t,i} - d\right) \tag{6}$$ - -where $V_{t,i}$ are the full body volumes. At equal bulk densities $f_M$ reduces exactly to the fractional interacting volume of their Eq. B2. The common-height caps are a linearised bookkeeping: outside the fitted geometry, for a much denser and much smaller impactor near head-on, the raw $f_M$ can leave $[0, 1]$ and vary non-monotonically with $b$, so ZEPHYRUS clamps $f_M$ to $[0, 1]$. Within the fitted domain the clamp never engages. - -Three input conventions follow the paper and must be honoured by the caller: $v_c$ is the speed at first contact, not the relative speed at infinity; the masses and radii exclude any atmosphere, with radii taken at the base of the atmosphere; and the densities are bulk values of the atmosphere-free bodies. - -The returned fraction applies to the target's atmosphere as a whole. Consistent with the bulk-removal treatment of the continuous channel, the caller partitions the lost mass across atmospheric species without elemental fractionation. - ---- - -## Coupling to PROTEUS - -ZEPHYRUS treats atmospheric escape as a bulk process: at each PROTEUS time step the total mass-loss rate from Eq. (1) is partitioned across atmospheric species in proportion to their elemental mass mixing ratios as computed by CALLIOPE. No elemental fractionation between light and heavy species is imposed in the outflow itself; however, because only outgassed volatiles are subject to escape while dissolved species remain in the magma ocean reservoir, escape fractionates the planet's *total* (interior + atmosphere) volatile budget over time, preferentially retaining species that are highly soluble in silicate melts (e.g. H$_2$O, S$_2$). +## Reading guide -More about this in its dedicated [page](proteus.md). - - -## Regime of validity - -The EL formalism is appropriate in the high-irradiation, hydrodynamic regime that dominates atmospheric loss during the first $\sim 10^6$–$10^8$ yr of evolution for close-in rocky planets [^watson][^lammer2003]. Outside this regime—at lower XUV fluxes or for less extended atmospheres—non-thermal escape (Jeans escape, ion pickup, charge exchange) becomes comparable to or exceeds the hydrodynamic rate, and the bulk EL prescription no longer applies. The [regime dispatcher](dispatcher.md) covers the thermal side of that transition (Jeans escape with a diffusion-limited supply cap) and classifies each state before choosing a rate; the EL entry point itself does not. When using `EL_escape` alone, users should verify that the integrated XUV-driven loss exceeds non-thermal estimates (e.g. $\sim 10^7$–$10^8$ g s$^{-1}$ for an Earth-mass planet; Kislyakova et al. 2014 [^kislyakova]) before interpreting model outputs. - -Similarly, the bulk-removal assumption breaks down when the hydrodynamic particle flux drops below the critical flux required to drag heavy species against gravity, at which point compositional fractionation in the outflow becomes significant [^wordsworth2018][^cherubim2024]. Following Yoshida et al. (2022) [^yoshida], the critical flux for H$_2$O in an H$_2$ background is $\approx 1.9 \times 10^{8}$ g s$^{-1}$. The [regime dispatcher](dispatcher.md) resolves this regime explicitly: its fractionation closure solves the simultaneous N-species partition with per-species dropout thresholds instead of removing everything in bulk. - -The giant-impact erosion law (Eq. 4) is constrained by simulations spanning target masses of roughly 0.3 to 3 $M_\oplus$, impactor masses down to about 0.05 $M_\oplus$, bulk densities from about half to double Earth's, contact speeds of 1 to 3 $v_\mathrm{esc}$, all impact angles, and thin atmospheres of order 1 percent of the planet mass. The median deviation of the simulations from the law is 9 percent, rising to about 20 percent for slow, head-on impacts, whose outcomes are chaotic. The loss depends only mildly on the atmosphere mass in this thin-atmosphere regime, with a factor of 10 less atmosphere increasing the eroded fraction by roughly 10 percent; substantially thicker atmospheres, which can cushion the impactor, fall outside the law's regime. +- [Energy-limited escape](energy_limited.md): the default prescription, its radius scaling, and its tidal correction. +- [Escape regimes](regimes.md): the classification logic and the rate physics of every branch, with thresholds and bands. +- [Fractionation](fractionation.md): how a wind partitions over species, and when heavy species drop out. +- [Giant impacts](impacts.md): the erosion scaling law and its fitted domain. +- [Coupling to PROTEUS](proteus.md): configuration keys, the per-time-step sequence, and reservoir bookkeeping. +- [Limitations](limitations.md): what each entry point does not model, and what that implies for results. +- [Parameter reference](../Reference/parameters.md) and [API reference](../Reference/api/index.md). --- -[^watson]: Watson, A. J., Donahue, T. M., & Walker, J. C. G. (1981). The dynamics of a rapidly escaping atmosphere: applications to the evolution of Earth and Venus. *Icarus, 48*(2), 150–166. https://doi.org/10.1016/0019-1035(81)90101-9 - - -[^lopez]: Lopez, E. D., & Fortney, J. J. (2013). The role of core mass in controlling evaporation: the Kepler radius distribution and the Kepler-36 density dichotomy. *The Astrophysical Journal, 776*(1), 2. https://doi.org/10.1088/0004-637X/776/1/2 - -[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 - -[^luger]: Luger, R., & Barnes, R. (2015). Extreme water loss and abiotic O$_2$ buildup on planets throughout the habitable zones of M dwarfs. *Astrobiology, 15*(2), 119–143. https://doi.org/10.1089/ast.2014.1231 - -[^moore]: Moore, K., Cowan, N. B., & Boukaré, C.-É. (2023). The role of magma oceans in maintaining surface water on rocky planets orbiting M-dwarfs. *Monthly Notices of the Royal Astronomical Society, 526*(4), 6235–6249. https://doi.org/10.1093/mnras/stad3138 - -[^lammer2003]: Lammer, H., Selsis, F., Ribas, I., et al. (2003). Atmospheric loss of exoplanets resulting from stellar X-ray and extreme-ultraviolet heating. *The Astrophysical Journal, 598*(2), L121–L124. https://doi.org/10.1086/380815 - -[^kislyakova]: Kislyakova, K. G., Johnstone, C. P., Odert, P., et al. (2014). Stellar wind interaction and pick-up ion escape of the Kepler-11 "super-Earths". *Astronomy & Astrophysics, 562*, A116. https://doi.org/10.1051/0004-6361/201322933 - -[^wordsworth2018]: Wordsworth, R. D., Schaefer, L. K., & Fischer, R. A. (2018). Redox evolution via gravitational differentiation on low-mass planets: implications for abiotic oxygen, water loss, and habitability. *The Astronomical Journal, 155*(5), 195. https://doi.org/10.3847/1538-3881/aab608 - -[^cherubim2024]: Cherubim, C., Wordsworth, R., Hu, R., & Shkolnik, E. (2024). Strong Fractionation of Deuterium and Helium in Sub-Neptune Atmospheres along the Radius Valley. *The Astrophysical Journal, 967*(2), 139. https://doi.org/10.3847/1538-4357/ad3e77 - -[^yoshida]: Yoshida, T., Terada, N., Ikoma, M., & Kuramoto, K. (2022). Less Effective Hydrodynamic Escape of H$_2$–H$_2$O Atmospheres on Terrestrial Planets Orbiting Pre-main-sequence M Dwarfs. *The Astrophysical Journal, 934*(2), 137. https://doi.org/10.3847/1538-4357/ac7be7 +[^attia]: Attia, M., & Lichtenberg, T. (2026). In preparation. -[^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb \ No newline at end of file +[^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb diff --git a/docs/Explanations/proteus.md b/docs/Explanations/proteus.md index 28cc986a..bdaa97ce 100644 --- a/docs/Explanations/proteus.md +++ b/docs/Explanations/proteus.md @@ -1,6 +1,6 @@ # ZEPHYRUS in PROTEUS -This page describes how ZEPHYRUS is wired into the PROTEUS framework as its atmospheric scape module. The source code for this coupling can be found in the [wrapper](https://github.com/FormingWorlds/PROTEUS/blob/main/src/proteus/escape/wrapper.py). For the underlying ZEPHYRUS model itself, see the [model overview](model.md). For the standalone API, see the [API reference](../Reference/api/index.md). +This page describes how ZEPHYRUS is wired into the PROTEUS framework as its atmospheric escape module. The source code for this coupling can be found in the [wrapper](https://github.com/FormingWorlds/PROTEUS/blob/main/src/proteus/escape/wrapper.py). For the underlying ZEPHYRUS model itself, see [the ZEPHYRUS model](model.md). For the standalone API, see the [API reference](../Reference/api/index.md). The coupling described here consumes the energy-limited default (`EL_escape`); the [escape-regime framework](regimes.md) is standalone API until its PROTEUS coupling lands in a follow-up change. --- @@ -36,11 +36,11 @@ The PROTEUS configuration block for ZEPHYRUS lives under `[escape]` and `[escape | Key | Type | Units | Description | |---|---|---|---| -| `escape.module` | str | – | Must be `"zephyrus"` to enable this backend. | -| `escape.reservoir` | str | – | Which volatile inventory the escape rate is distributed over. See [Reservoir](#reservoir) below. | +| `escape.module` | str | - | Must be `"zephyrus"` to enable this backend. | +| `escape.reservoir` | str | - | Which volatile inventory the escape rate is distributed over. See [Reservoir](#reservoir) below. | | `escape.zephyrus.Pxuv` | float | bar | Reference pressure at which the atmosphere is taken to become optically thick to XUV photons; used by the atmosphere module (AGNI/JANUS) to compute the corresponding $R_\mathrm{XUV}$. | -| `escape.zephyrus.efficiency` | float | – | Energy-limited escape efficiency $\epsilon$. | -| `escape.zephyrus.tidal` | bool | – | If `true`, include the tidal correction $K_\mathrm{tide}$ in `EL_escape`. | +| `escape.zephyrus.efficiency` | float | - | Energy-limited escape efficiency $\epsilon$. | +| `escape.zephyrus.tidal` | bool | - | If `true`, include the tidal correction $K_\mathrm{tide}$ in `EL_escape`. | !!! note "`scaling=3` is hard-coded" The PROTEUS wrapper always calls `EL_escape` with `scaling=3`, i.e. the $R_\mathrm{XUV}^3$ form. This is not exposed as a config option. Standalone users of `EL_escape` can choose `scaling=2` (the function default, $R_p R_\mathrm{XUV}^2$). diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md new file mode 100644 index 00000000..ee77ae47 --- /dev/null +++ b/docs/Explanations/regimes.md @@ -0,0 +1,134 @@ +# Escape regimes + +This page defines the escape-regime framework behind `zephyrus.dispatch`: the quantities it evaluates, the order it evaluates them in, and the rate physics of every branch. The [model overview](model.md) gives the short version with a flowchart; here every threshold and equation is spelled out. The [energy-limited escape](energy_limited.md) and [fractionation](fractionation.md) pages define the two pieces that have their own pages. + +One call takes one planetary state and returns one verdict. The inputs are the planet mass $M_\mathrm{p}$ and interior radius $R_\mathrm{p}$, the stellar mass $M_\star$, the orbit ($a$, $e$), the equilibrium temperature $T_\mathrm{eq}$, the XUV and interior heat fluxes $F_\mathrm{XUV}$ and $F_\mathrm{int}$, the photospheric opacity $\kappa$, and an atmosphere profile (pressure, radius, temperature, composition, and mean molecular mass per level, from the base to the top of the modeled atmosphere). The output is one of the five regime labels, a bulk mass-loss rate, per-species rates that sum to it, flags recording every clamp and fallback, and a diagnostics container that reports how close the state sat to each boundary. Every physically posed input returns a result; exceptions are reserved for malformed input. + +## The evaluation order + +1. The bolometric (boil-off) candidate is computed at every call. If the restricted Jeans parameter sits below its threshold, the atmosphere is boiling off and that candidate is the rate; XUV-driven escape needs a stable base to launch from, and a bolometrically boiling atmosphere has not built one yet, which is why this test precedes everything else [^owensch]. +2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. +3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. +4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. +5. Before the label is finalized, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is relabeled `roche_overflow`. +6. The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. + +## Boil-off + +A freshly formed or strongly heated planet can hold an atmosphere so distended that its outer layers sit beyond the sonic point of a thermal wind: the gas then flows out on the planet's own thermal energy alone. The activation criterion is the restricted Jeans parameter [^fossati] + +$$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{p}} \tag{1}$$ + +the ratio of a particle's gravitational binding energy at the surface to its thermal energy, built with the mean molecular mass $\mu$ of the atmosphere at the photospheric level and the Boltzmann constant $k_\mathrm{B}$. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{p}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find at $R_\mathrm{p}/R_\mathrm{B} = 0.1$ is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. + +While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): + +$$\dot{M}_\mathrm{Parker} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{s}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \quad x = \frac{R_\mathrm{launch}}{R_\mathrm{B}} \tag{2}$$ + +where $\mathcal{M}$ is the Mach number at the launch level (the photospheric level, radius $R_\mathrm{launch}$), $W_0$ is the principal branch of the Lambert function, and $\kappa$ is the photospheric opacity, which the rate scales inversely with. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; for small $x$ the rate shuts off exponentially, which is the physical end of boil-off. The rate is capped by the Bondi-limited supply of Gupta & Schlichting (2020) [^gs20], + +$$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(-\frac{G M_\mathrm{p}}{c_\mathrm{s}^2 R_\mathrm{launch}}\right) \tag{3}$$ + +with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lambda$ gate the same machinery survives as a residual, additionally capped by the interior luminosity, $\dot{M}_\mathrm{E} = L / (g R_\mathrm{p})$ with $L = 4\pi R_\mathrm{p}^2 F_\mathrm{int}$ and $g$ the surface gravity [^gs19]. Keeping the residual luminosity-capped represents the slow late tail of core-powered mass loss without adjudicating the open dispute over how long it survives (Tang et al. 2024 argue it is brief [^tang]; Gupta & Schlichting argue it lasts); the Tang et al. timescale comparison runs as a diagnostic beside the rate, never as a gate. + +## The hydrodynamic wind + +Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces are assembled. + +The wind base. XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. + +The wind temperature. Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. + +The two rate limits. The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to + +$$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{4}$$ + +with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition (carrying its $T^{-0.9}$ temperature dependence) and $R_\mathrm{base}$ the base radius. An isothermal wind then carries that density to the sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ with the barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$, where $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ is the Jeans parameter at the base, giving + +$$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{5}$$ + +The energy in Eq. (4) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, genuine recombination saturation at modest $\lambda_\mathrm{b}$ (the $\sqrt{F_\mathrm{XUV}}$ regime of Eq. 4) and plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error; the diagnostics report which mechanism acted. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. + +## The collisionality switch + +A fluid wind only exists if the gas is still collisional where it goes sonic. The switch compares the mean free path against the density scale height at the sonic point, following the construction of Chatterjee & Pierrehumbert (2026), their Eqs. 17 and 18 [^cp26]: + +$$\mathrm{Kn}_\mathrm{sc} \;=\; \frac{\ell}{H_\mathrm{sc}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{sc}}, \qquad H_\mathrm{sc} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{6}$$ + +where $\ell$ is the Maxwell mean free path, $n_\mathrm{sc}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 5), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. + +A state with $\mathrm{Kn}_\mathrm{sc}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3: kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the band is heating-geometry physics rather than tuning freedom, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. + +## Hydrostatic escape + +Where no wind exists, escape proceeds particle by particle from the exobase, the level where the mean free path first reaches the local scale height. All exobase quantities are evaluated on an extended upper structure: a Bates temperature profile $T(\zeta) = T_\mathrm{exo} - (T_\mathrm{exo} - T_\mathrm{top})\, e^{-\gamma_\mathrm{B} \zeta}$ integrated hydrostatically above the supplied profile top (in $\zeta = \ln(p_\mathrm{top}/p)$, shape parameter $\gamma_\mathrm{B}$; the form Yelle 2024 uses [^yelle]), with the exobase temperature $T_\mathrm{exo}$ prescribed by the caller. Extending the structure is not a refinement but a requirement: the Jeans parameter at the true exobase can differ from its photospheric value by an order of magnitude, and evaluating the escape on photospheric values biases rates toward false retention by up to three orders of magnitude (Johnson et al. 2013 [^johnson]). The prescribed $T_\mathrm{exo}$ (default 1000 K) is the branch's dominant sensitivity, because the rate depends on it exponentially; an optional estimator balances local heating against cooling at the profile top, but a conduction-free local balance is biased high by construction and is deliberately not the default. + +Each species $i$ escapes with the Jeans effusion flux at the exobase (radius $r_\mathrm{exo}$, temperature $T_\mathrm{exo}$), + +$$w_\mathrm{J} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p} m_i}{k_\mathrm{B} T_\mathrm{exo}\, r_\mathrm{exo}} \tag{7}$$ + +where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter, multiplied by the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi = \Phi_\mathrm{J}\,\Phi_\mathrm{l} / (\Phi_\mathrm{J} + \Phi_\mathrm{l})$, their Eq. 14. The dominant species supplies itself and takes the Jeans flux alone. + +Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} r_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the non-thermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. + +## The Roche screen and overflow + +Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the Bondi radius on the bolometric branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is not described by any of the four regimes above: the state is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag separating geometries whose Hill sphere sits inside the photosphere itself from those where only the flow reaches it. Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. + +## Boundaries are bands + +Every threshold above carries a stated physical width, and the framework reports the width instead of hiding it behind a sharp switch. Beside every verdict, the diagnostics container carries: the counterfactual labels at the Knudsen band edges 0.1 and 3; the boil-off activation band 15 to 35; the transonic energy criterion of Johnson et al. (2013) [^johnson] (can the absorbed power drive the flow sonic at all); the Jeans-parameter triple of Guo (2024) [^guo], which translates the verdict into that taxonomy; both escape temperatures with the local ionization fraction; the tidally corrected critical exobase temperature of Erkaev et al. (2007) [^erkaev]; the fluid condition checked level by level below the sonic radius, after Owen & Jackson (2012) [^oj12]; the threshold-potential screens (the efficiency-collapse band of Caldiroli et al. 2022 [^caldiroli], and a wind-versus-hydrostatic screen commonly attributed to Salz et al. 2016, quoted from secondary literature and marked as such); the boil-off termination timescales of Tang et al. (2024) [^tang]; a snapshot self-consistency screen (would the dispatched rate have destroyed the atmosphere within the system age); and the coefficient provenance class of every species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. + +## Configuration + +All knobs, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. The assumptions that remain on every result, whatever the knobs, are collected on the [limitations page](limitations.md). + +--- + +[^owenwu]: Owen, J. E., & Wu, Y. (2016). Atmospheres of low-mass planets: the "boil-off". *The Astrophysical Journal, 817*(2), 107. + +[^owensch]: Owen, J. E., & Schlichting, H. E. (2024). Mapping out the parameter space for photoevaporation and core-powered mass-loss. *Monthly Notices of the Royal Astronomical Society, 528*(2), 1615–1629. + +[^fossati]: Fossati, L., et al. (2017). Aeronomical constraints to the minimum mass and maximum radius of hot low-mass planets. *Astronomy & Astrophysics, 598*, A90. + +[^misener]: Misener, W., et al. (2025). Blowin' in the Nonisothermal Wind: Core-powered Mass Loss with Hydrodynamic Radiative Transfer. *The Astrophysical Journal, 980*(1), 152. + +[^gs19]: Gupta, A., & Schlichting, H. E. (2019). Sculpting the valley in the radius distribution of small exoplanets as a by-product of planet formation: the core-powered mass-loss mechanism. *Monthly Notices of the Royal Astronomical Society, 487*(1), 24–33. + +[^gs20]: Gupta, A., & Schlichting, H. E. (2020). Signatures of the core-powered mass-loss mechanism in the exoplanet population: dependence on stellar properties and observational predictions. *Monthly Notices of the Royal Astronomical Society, 493*(1), 792–806. + +[^tang]: Tang, Y., et al. (2024). Assessing Core-powered Mass Loss in the Context of Early Boil-off: Minimal Long-lived Mass Loss for the Sub-Neptune Population. *The Astrophysical Journal, 976*(2), 221. + +[^mc09]: Murray-Clay, R. A., Chiang, E. I., & Murray, N. (2009). Atmospheric Escape From Hot Jupiters. *The Astrophysical Journal, 693*(1), 23–42. https://doi.org/10.1088/0004-637X/693/1/23 + +[^lopez2017]: Lopez, E. D. (2017). Born dry in the photoevaporation desert: Kepler's ultra-short-period planets formed water-poor. *Monthly Notices of the Royal Astronomical Society, 472*(1), 245–253. + +[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^cp26]: Chatterjee, R., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. arXiv:2412.05188. + +[^nakayama]: Nakayama, A., Ikoma, M., & Terada, N. (2022). Survival of Terrestrial N$_2$-O$_2$ Atmospheres in Violent XUV Environments through Efficient Atomic Line Radiative Cooling. *The Astrophysical Journal, 937*(2), 72. https://doi.org/10.3847/1538-4357/ac86ca + +[^johnstone]: Johnstone, C. P., Güdel, M., Lammer, H., & Kislyakova, K. G. (2018). The Upper Atmospheres of Terrestrial Planets: Carbon Dioxide Cooling and the Earth's Thermospheric Evolution. *Astronomy & Astrophysics, 617*, A107. https://doi.org/10.1051/0004-6361/201832776 + +[^badnell]: Badnell, N. R. (2006). Radiative recombination data for modelling dynamic finite-density plasmas. *The Astrophysical Journal Supplement Series, 167*, 334. arXiv:astro-ph/0604144. + +[^laricchiuta]: Laricchiuta, A., Bruno, D., Capitelli, M., et al. (2009). High temperature Mars atmosphere. Part I: transport cross sections. *The European Physical Journal D, 54*(3), 607–612. https://doi.org/10.1140/epjd/e2009-00192-7 + +[^z90]: Zahnle, K., Kasting, J. F., & Pollack, J. B. (1990). Mass Fractionation of Noble Gases in Diffusion-Limited Hydrodynamic Hydrogen Escape. *Icarus, 84*(2), 502–527. + +[^zk86]: Zahnle, K. J., & Kasting, J. F. (1986). Mass Fractionation during Transonic Escape and Implications for Loss of Water from Mars and Venus. *Icarus, 68*(3), 462–480. + +[^johnson]: Johnson, R. E., Volkov, A. N., & Erwin, J. T. (2013). Molecular-Kinetic Simulations of Escape from the Ex-planet and Exoplanets: Criterion for Transonic Flow. *The Astrophysical Journal Letters, 768*(1), L4. https://doi.org/10.1088/2041-8205/768/1/L4 + +[^volkova]: Volkov, A. N., et al. (2011). Thermally driven atmospheric escape: transition from hydrodynamic to Jeans escape. *The Astrophysical Journal Letters, 729*(2), L24. + +[^volkovb]: Volkov, A. N., Tucker, O. J., Erwin, J. T., & Johnson, R. E. (2011). Kinetic simulations of thermal escape from a single component atmosphere. *Physics of Fluids, 23*(6), 066601. https://doi.org/10.1063/1.3592253 + +[^yelle]: Yelle, R. V. (2024). Diffusion limited escape of hydrogen from Mars. *Icarus, 416*, 116099. + +[^guo]: Guo (2024). Characterizing regimes of hydrodynamic escape of close-in low mass exoplanets. arXiv:2405.13283. + +[^oj12]: Owen, J. E., & Jackson, A. P. (2012). Planetary evaporation by UV and X-ray radiation: basic hydrodynamics. *Monthly Notices of the Royal Astronomical Society, 425*(4), 2931. https://doi.org/10.1111/j.1365-2966.2012.21481.x diff --git a/docs/Reference/api/index.md b/docs/Reference/api/index.md index a90e5471..7cd320aa 100644 --- a/docs/Reference/api/index.md +++ b/docs/Reference/api/index.md @@ -1,6 +1,6 @@ # API overview -This is an overview of ZEPHYRUS' API for the user's reference. If you want to understand the underlying model, please visit the [model overview](../../Explanations/model.md) and the [regime dispatcher](../../Explanations/dispatcher.md) pages.
+This is an overview of ZEPHYRUS' API for the user's reference. If you want to understand the underlying model, please visit [the ZEPHYRUS model](../../Explanations/model.md) and its topic pages.
| Module | Description | |---|---| diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index e65135dd..31c69776 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -92,7 +92,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For ## Dispatcher settings (`dispatcher.DispatchSettings`) -The knobs of the [regime dispatcher](../Explanations/dispatcher.md). Every default is the documented reference choice; the criteria thresholds carry the physical bands stated in the dispatcher page, which the diagnostics report beside every verdict. +The knobs of the [escape-regime framework](../Explanations/regimes.md). Every default is the documented reference choice; the criteria thresholds carry the physical bands stated in the dispatcher page, which the diagnostics report beside every verdict. | Name | Default | Options / units | Meaning | |---|---|---|---| diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md index 6e6af24f..1e5c6bd7 100644 --- a/docs/Validation/fractionation.md +++ b/docs/Validation/fractionation.md @@ -9,7 +9,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-spe | `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | | `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | | `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | -| `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Wallace (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1 percent. | +| `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1 percent. | | `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to 1e-12 relative, with flux continuity at the crossover and exact mass conservation. | ## Notes diff --git a/docs/index.md b/docs/index.md index d49abfa4..771d960a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,7 +6,7 @@ [![Unit Tests](https://img.shields.io/github/actions/workflow/status/FormingWorlds/ZEPHYRUS/tests.yaml?branch=main&label=Unit%20Tests)](https://github.com/FormingWorlds/ZEPHYRUS/actions/workflows/tests.yaml) [![Integration Tests](https://img.shields.io/github/actions/workflow/status/FormingWorlds/ZEPHYRUS/nightly.yml?branch=main&label=Integration%20Tests)](https://github.com/FormingWorlds/ZEPHYRUS/actions/workflows/nightly.yml) -**ZEPHYRUS** is the atmospheric escape module of the [PROTEUS](https://proteus-framework.org/PROTEUS) coupled atmosphere-interior evolution framework. Named after the Greek god of the west wind and messenger of spring, it models the atmospheric mass loss of exoplanets: continuous energy-limited escape driven by stellar XUV irradiation, and impulsive erosion by giant impacts during accretion. +**ZEPHYRUS** is the atmospheric escape module of the [PROTEUS](https://proteus-framework.org/PROTEUS) coupled atmosphere-interior evolution framework. Named after the Greek god of the west wind and messenger of spring, it models the atmospheric mass loss of rocky and sub-Neptune exoplanets through two channels: continuous thermal escape, classified into five regimes (boil-off, energy-limited and recombination-limited winds, hydrostatic Jeans escape, and Roche-lobe overflow) with per-species fractionation, and impulsive erosion by giant impacts during accretion. The energy-limited rate is the default prescription consumed by PROTEUS; the full regime framework is available standalone. Start with [the ZEPHYRUS model](Explanations/model.md) for the complete picture. ![ZEPHYRUS banner](assets/ZEPHYRUS_logo_white.png#only-light) ![ZEPHYRUS banner](assets/ZEPHYRUS_logo_black.png#only-dark) diff --git a/mkdocs.yml b/mkdocs.yml index db2289bc..af6cd81e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -19,8 +19,11 @@ nav: - First run: Tutorials/first_run.md - Explanations: - - Model overview: Explanations/model.md - - Escape-regime dispatcher: Explanations/dispatcher.md + - The ZEPHYRUS model: Explanations/model.md + - Energy-limited escape: Explanations/energy_limited.md + - Escape regimes: Explanations/regimes.md + - Fractionation: Explanations/fractionation.md + - Giant impacts: Explanations/impacts.md - Coupling to PROTEUS: Explanations/proteus.md - Limitations: Explanations/limitations.md - Testing suite: Explanations/testing.md diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index 6e10db1d..9e1f4351 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -15,7 +15,7 @@ from zephyrus.diffusion import ROCK_FORMERS, bmatrix, build_rows, masses_g # The closure generalizes the two-species fractionation of Hunten, Pepin & -# Wallace (1987, Icarus 69, 532) to N species escaping simultaneously +# Walker (1987, Icarus 69, 532) to N species escaping simultaneously # through mutual binary diffusion, the constant-composition closure of the # subsonic multispecies wind system of Zahnle et al. (1990, Icarus 84, # 502), with active-set dropout: at a given total mass flux the heavy diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 0fed7215..57bd693c 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -10,7 +10,7 @@ lobe. - Monotonicity / boundedness: the along-profile fluid check reports the worst local Knudsen number with its truncation declared; the potential - screens classify the three regimes in the right order. + screens order their three verdicts (wind, intermediate, no-wind) correctly. - Error contract: the self-consistency screen reports "not evaluated" without its optional inputs rather than guessing. @@ -160,7 +160,7 @@ def test_self_consistency_screen_contract(): def test_potential_screens_classify_in_order(): - """The threshold-potential screens order the three verdicts correctly. + """The threshold-potential screens order their three verdicts correctly. An Earth-like potential sits far below both screens (wind side); a compact massive planet lands above the upper screen (no-wind side); an From cb1f2f30fea196830d4cc6e591af87dc4d5dda3a Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 21:50:49 +0200 Subject: [PATCH 019/113] Report the wind base pressure as a level value The physical base pressure the base method targets is a property of the level, not a warning, so it moves onto the level dict as p_physical and into the dispatch diagnostics beside the level it describes. The flags a dispatch returns are now warnings only: a call with nothing to report returns an empty flags dict instead of one that always carried a value. --- src/zephyrus/dispatcher.py | 4 +++- src/zephyrus/profiles.py | 21 +++++++++++++-------- tests/test_profiles.py | 17 ++++++++++++----- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 2775dac2..420acc5d 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -430,6 +430,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['self_consistency'] = dg.self_consistency_screen(inputs.reservoirs, rate, inputs.age) diag['base_level'] = dict( p_Pa=base['p'], + p_physical_Pa=base.get('p_physical'), r_m=base['r'], T_K=base['T'], clamp_decades=flags.get('base_clamp_decades'), @@ -469,7 +470,7 @@ def _resolve_wind_base(inputs: EscapeInputs) -> tuple[dict, dict]: boreas_scalars=boreas_scalars, ) if flags.get('base_clamped') and st.base_out_of_range == 'extend': - p_target = flags.get('base_pressure_pa') + p_target = base.get('p_physical') if p_target is not None: t_exo = st.T_exo_value if st.T_exo_mode == 'prescribed' else inputs.T_eq ext = hs.bates_extension(inputs.profile, inputs.M_p, t_exo, gamma=st.gamma_bates) @@ -482,6 +483,7 @@ def _resolve_wind_base(inputs: EscapeInputs) -> tuple[dict, dict]: n = p_target / (kb * T) base = dict( p=float(p_target), + p_physical=float(p_target), r=r, T=T, mmw=float(ext['mu']), diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index 28259b84..21de6272 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -230,9 +230,10 @@ def wind_base_level( Returns ------- (level, flags) - The interpolated level dict and a flags dict. On the Lopez path the - flags carry ``base_pressure_pa``, the physical (unclamped) base - pressure. + The interpolated level dict and a flags dict. The level carries + ``p_physical``, the base pressure the method asked for before any + clamp, which equals ``p`` whenever the profile covers it. The flags + report clamps and fallbacks only. """ flags: dict = {} if method == 'fixed_pressure': @@ -240,7 +241,9 @@ def wind_base_level( if p_target != fixed_pressure: flags['base_clamped'] = True flags['base_clamp_decades'] = abs(float(np.log10(fixed_pressure / p_target))) - return interp_at_pressure(profile, p_target), flags + level = interp_at_pressure(profile, p_target) + level['p_physical'] = float(fixed_pressure) + return level, flags if method == 'boreas': p_boreas = _boreas_base_pressure(profile, M_p, boreas_scalars) @@ -249,8 +252,9 @@ def wind_base_level( if p_target != p_boreas: flags['base_clamped'] = True flags['base_clamp_decades'] = abs(float(np.log10(p_boreas / p_target))) - flags['base_pressure_pa'] = p_boreas - return interp_at_pressure(profile, p_target), flags + level = interp_at_pressure(profile, p_target) + level['p_physical'] = float(p_boreas) + return level, flags flags['base_method_fallback'] = 'lopez' # Lopez (2017) fixed point: P depends on mu and g, which depend on the @@ -268,13 +272,14 @@ def wind_base_level( lev = interp_at_pressure(profile, p_target) g = G * M_p / lev['r'] ** 2 p_phys = lopez_base_pressure(lev['mmw'], g) - flags['base_pressure_pa'] = p_phys if p_phys < profile.p[-1] * (1.0 - 1e-9): # The profile top is deeper than the physical base level. flags['base_clamped'] = True flags['base_clamp_decades'] = float(np.log10(profile.p[-1] / p_phys)) p_target = float(profile.p[-1]) - return interp_at_pressure(profile, p_target), flags + level = interp_at_pressure(profile, p_target) + level['p_physical'] = float(p_phys) + return level, flags def _boreas_base_pressure(profile: Profile, M_p: float, scalars: dict | None) -> float | None: diff --git a/tests/test_profiles.py b/tests/test_profiles.py index 66bd37e4..9f515de3 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -217,21 +217,28 @@ def test_wind_base_level_lopez_converges_and_clamps(): On a profile reaching 1e-6 Pa the nanobar-scale base lies inside the covered range, so the returned level pressure equals the physical base - pressure and no clamp flag is raised. On a profile truncated at 1e-2 Pa - the physical base lies above the top, so the level clamps to the top - with the clamp distance recorded in pressure decades. + pressure the level reports and no clamp flag is raised. On a profile + truncated at 1e-2 Pa the physical base lies above the top, so the level + clamps to the top with the clamp distance recorded in pressure decades, + and the unclamped target stays readable on the level itself. """ prof = _n2_profile(p_top=1e-6) lev, flags = wind_base_level(prof, 5 * Me, method='lopez') assert 'base_clamped' not in flags - assert lev['p'] == pytest.approx(flags['base_pressure_pa'], rel=1e-3) + assert lev['p'] == pytest.approx(lev['p_physical'], rel=1e-3) # The N2 base sits at the nanobar scale (between 0.01 and 100 nanobar). assert 1e-6 < lev['p'] < 1e-2 + # The physical base pressure is a level quantity, not a flag: an + # unclamped call reports no flags at all. + assert flags == {} deep = _n2_profile(p_top=1e-2) lev_d, flags_d = wind_base_level(deep, 5 * Me, method='lopez') assert flags_d.get('base_clamped') is True assert lev_d['p'] == pytest.approx(float(deep.p[-1]), rel=1e-12) - expected_decades = np.log10(deep.p[-1] / flags_d['base_pressure_pa']) + # The clamped level sits above its own physical target, by the recorded + # distance; a clamp that lost the target would fail both assertions. + assert lev_d['p'] > lev_d['p_physical'] + expected_decades = np.log10(deep.p[-1] / lev_d['p_physical']) assert flags_d['base_clamp_decades'] == pytest.approx(expected_decades, rel=1e-9) assert flags_d['base_clamp_decades'] > 0.0 From 080c7a100de6412467f7769e601311a1ee3aa915 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 21:59:06 +0200 Subject: [PATCH 020/113] Add a worked example for the regime dispatcher Runs the framework over synthetic atmospheres: one verdict read field by field, flux sweeps that cross two boundaries on two compositions, the boil-off and overflow labels, the diagnostics container, the four knobs that move a boundary, the hysteresis window, and one frozen atmosphere dispatched along a stellar XUV history. Every step is a function that returns its results, so the pieces can be imported one at a time, and the figure follows the framework figure conventions with the escape domain color and one marker per regime. --- examples/demo_dispatcher/demo_dispatcher.py | 748 ++++++++++++++++++++ 1 file changed, 748 insertions(+) create mode 100644 examples/demo_dispatcher/demo_dispatcher.py diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py new file mode 100644 index 00000000..eba528d8 --- /dev/null +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -0,0 +1,748 @@ +"""Escape regimes of small planets, dispatched with `zephyrus.dispatch`. + +Runs the regime framework over a set of synthetic atmospheres: one verdict +read field by field, a flux sweep that crosses two regime boundaries, the +boil-off and Roche-overflow labels, the diagnostics container, the four +knobs that move a boundary, and one planet dispatched along a stellar XUV +history. Prints a table per step and writes one figure. + +Every function returns its results, so the steps can be imported and reused +one at a time; nothing runs on import. From the repository root: + + mkdir -p output && python examples/demo_dispatcher/demo_dispatcher.py + +Companion tutorial: docs/Tutorials/dispatch.md. +""" + +from __future__ import annotations + +import math + +import matplotlib.pyplot as plt +import mors +import numpy as np + +from zephyrus.composition import atomize, species_mass_amu +from zephyrus.constants import au2m +from zephyrus.dispatcher import DispatchSettings, EscapeInputs, dispatch +from zephyrus.planets_parameters import Ls, Me, Me_atm, Ms, Re +from zephyrus.profiles import isothermal_profile + +# ----------------------------------------------------------------- setup + +SIGMA_SB = 5.670374419e-8 # Stefan-Boltzmann constant [W m-2 K-4] +SEC_PER_YR = 3.15576e7 # Julian year [s] + +# The reference orbit places a solar-luminosity star's zero-albedo, +# full-redistribution equilibrium temperature at 1000 K, so the orbit, the +# temperature, and the bolometric flux below are mutually consistent. +A_REF = 0.0775 * au2m # reference semi-major axis [m] +A_TRACK = 0.2 * au2m # semi-major axis for the stellar history [m] + +KAPPA_PHOTO = 0.01 # photospheric opacity, about 0.1 cm2 g-1 [m2 kg-1] +F_INT = 1.0 # interior heat flux [W m-2] +P_SURF = 1.0e7 # profile base pressure, 100 bar [Pa] +P_TOP = 1.0e-5 # profile top pressure, 0.1 nanobar [Pa] +AGE_REF = 1.0e8 * SEC_PER_YR # snapshot age, 100 Myr [s] + +# One proton crossing the surface per year: the smallest rate that can mean +# anything physically. A returned rate below this is numerical noise, not +# escape. It is a reporting convention for the caller; the module computes +# whatever the physics gives it. +RATE_FLOOR = 1.67262192369e-27 / SEC_PER_YR # [kg s-1] + +COMPOSITIONS = { + 'CO2': {'CO2': 1.0}, + 'N2-O2': {'N2': 0.8, 'O2': 0.2}, + 'H/He': {'H2': 0.9, 'He': 0.1}, + 'CO2 + 1% H2': {'CO2': 0.99, 'H2': 0.01}, +} + +SWEEP_FLUXES = np.logspace(-2, math.log10(5.0e3), 30) # [W m-2] + + +def brand_colors() -> dict: + """Apply the PROTEUS figure theme when it is installed, and return the + colors this example draws with. + + The theme is an optional convenience: the hex values are the same either + way, so the figure carries the same identity without it. Escape is the + chemistry and escape domain, and the regime colors come from the shared + categorical cycle, with the hottest regime taking the one red mark. + """ + palette = { + 'escape': '#1B6FA8', # domain color of chemistry and escape + 'boiloff': '#E23D28', # the one hot mark on the figure + 'hydrodynamic:EL': '#1B6FA8', + 'hydrodynamic:RR': '#4FA3D9', + 'hydrostatic': '#7A8894', + 'roche_overflow': '#593E74', + 'rule': '#3E4A55', + } + try: + import proteus_mpl + + proteus_mpl.use() + palette['escape'] = proteus_mpl.DOMAINS['chemistry'] + palette['hydrodynamic:EL'] = proteus_mpl.DOMAINS['chemistry'] + palette['hydrodynamic:RR'] = proteus_mpl.COLORS['azure'] + palette['hydrostatic'] = proteus_mpl.COLORS['fog'] + palette['boiloff'] = proteus_mpl.COLORS['magma'] + # The violet slot of the shared cycle, not the tidal module color: + # these are regime categories, not any module's output. + palette['roche_overflow'] = proteus_mpl.CYCLE[5] + palette['rule'] = proteus_mpl.COLORS['ink'] + except ImportError: + pass + return palette + + +# Marker per label, so the figure never encodes a regime in color alone. +REGIME_MARKERS = { + 'boiloff': 'D', + 'hydrodynamic:EL': 'o', + 'hydrodynamic:RR': 's', + 'hydrostatic': '^', + 'roche_overflow': 'X', +} + + +def t_eq_at(a_m: float, luminosity: float = Ls) -> float: + """Equilibrium temperature [K] for zero albedo and full redistribution.""" + return (luminosity / (16.0 * math.pi * SIGMA_SB * a_m**2)) ** 0.25 + + +def f_bol_at(a_m: float, luminosity: float = Ls) -> float: + """Bolometric instellation [W m-2] at orbital distance `a_m` [m].""" + return luminosity / (4.0 * math.pi * a_m**2) + + +def element_reservoirs(composition: dict, mass_total: float = Me_atm) -> dict: + """Element inventories [kg] for an atmosphere of `mass_total` [kg]. + + The dispatcher consumes reservoirs two ways: the snapshot consistency + screen compares their total against the dispatched rate, and a + non-fractionating branch splits its rate over them by mass. + """ + elements = atomize(composition) + norm = sum(x * species_mass_amu(el) for el, x in elements.items()) + return {el: mass_total * x * species_mass_amu(el) / norm for el, x in elements.items()} + + +def build_state( + composition: str, + m_earth: float, + r_earth: float, + f_xuv: float, + a_m: float = A_REF, + settings: DispatchSettings | None = None, + reservoir_mass: float = Me_atm, +) -> EscapeInputs: + """One dispatch input state: scalars plus an atmosphere profile. + + Unlike the energy-limited entry point, which takes scalars alone, the + framework needs the atmospheric structure: the wind base, the exobase, + and the collisionality of the flow are all properties of the profile, + not of the surface. The profile here is isothermal at the equilibrium + temperature, which is enough to exercise every branch; a coupled run + supplies the atmosphere model's own profile instead. + """ + comp = COMPOSITIONS[composition] + m_p, r_p = m_earth * Me, r_earth * Re + t_eq = t_eq_at(a_m) + return EscapeInputs( + M_p=m_p, + R_p=r_p, + M_star=Ms, + a=a_m, + e=0.0, + T_eq=t_eq, + F_xuv=f_xuv, + F_bol=f_bol_at(a_m), + F_int=F_INT, + kappa_photo=KAPPA_PHOTO, + # The top pressure sits below the nanobar level the XUV wind + # launches from, so the base never clamps to the profile top. + profile=isothermal_profile(m_p, r_p, t_eq, comp, P_SURF, P_TOP), + settings=settings or DispatchSettings(), + age=AGE_REF, + reservoirs=element_reservoirs(comp, reservoir_mass), + ) + + +# ------------------------------------------------------- step 1: one call + + +def one_verdict(composition: str = 'CO2', f_xuv: float = 10.0) -> dict: + """Dispatch one state and report every field of the result.""" + result = dispatch(build_state(composition, 1.0, 1.0, f_xuv)) + total = sum(result.per_species.values()) + print(f'\n=== One verdict: {composition}, 1 Me, 1 Re, F_xuv = {f_xuv:g} W m-2 ===') + print(f' regime {result.regime}') + print(f' rate {result.mdot:.4e} kg/s ({result.mdot * SEC_PER_YR:.3e} kg/yr)') + for element, rate in sorted(result.per_species.items()): + print(f' {element:<11} {rate:.4e} kg/s') + print(f' sum {total:.4e} kg/s, closure error {abs(total - result.mdot):.2e}') + print(f' flags {result.flags or "none"}') + groups = ', '.join(sorted(result.diagnostics)) + print(f' diagnostics {len(result.diagnostics)} groups: {groups}') + return dict(result=result, closure_error=abs(total - result.mdot)) + + +# ---------------------------------------------------- step 2: flux sweeps + + +def flux_sweep(composition: str, m_earth: float = 1.0, r_earth: float = 1.0) -> list[dict]: + """Dispatch one planet across the XUV flux range and record each verdict. + + Sweeping the flux at fixed orbit stands in for stellar age: a young star + delivers orders of magnitude more XUV than the same star does later. + """ + rows = [] + for f_xuv in SWEEP_FLUXES: + result = dispatch(build_state(composition, m_earth, r_earth, float(f_xuv))) + knudsen = result.diagnostics['knudsen'] + rows.append( + dict( + F_xuv=float(f_xuv), + regime=result.regime, + mdot=result.mdot, + above_floor=result.mdot > RATE_FLOOR, + kn_sc=knudsen['kn_sc'], + counterfactual=knudsen['counterfactual_labels'], + T_wind=result.diagnostics['hydrodynamic']['T_wind'], + mechanism=result.diagnostics['hydrodynamic']['selection_mechanism'], + flags=dict(result.flags), + ) + ) + return rows + + +def boundary_flux(composition: str, lo: float, hi: float, tol: float = 1e-3) -> float: + """Locate a label change in flux by bisection, to a tolerance in decades.""" + label_lo = dispatch(build_state(composition, 1.0, 1.0, lo)).regime + while math.log10(hi / lo) > tol: + mid = math.sqrt(lo * hi) + if dispatch(build_state(composition, 1.0, 1.0, mid)).regime == label_lo: + lo = mid + else: + hi = mid + return math.sqrt(lo * hi) + + +def report_sweep(composition: str, rows: list[dict]) -> list[tuple]: + """Print a sweep and the fluxes where its label changes.""" + print(f'\n=== Flux sweep: {composition}, 1 Me, 1 Re ===') + print( + f' {"F_xuv":>9} {"regime":<17} {"rate [kg/s]":>12} {"Kn_sc":>9} ' + f'{"label at Kn 0.1":<14} {"label at Kn 3":<14}' + ) + for row in rows[::3]: + counter = row['counterfactual'] + print( + f' {row["F_xuv"]:9.3g} {row["regime"]:<17} {row["mdot"]:12.3e} ' + f'{row["kn_sc"]:9.3g} {counter[0.1]:<14} {counter[3.0]:<14}' + ) + changes = [] + for before, after in zip(rows[:-1], rows[1:]): + if before['regime'] != after['regime']: + flux = boundary_flux(composition, before['F_xuv'], after['F_xuv']) + changes.append((before['regime'], after['regime'], flux)) + print(f' boundary: {before["regime"]} to {after["regime"]} at {flux:.4g} W m-2') + raised = sorted({flag for row in rows for flag in row['flags']}) + print(f' flags raised anywhere in the sweep: {raised or ["none"]}') + below = [row['F_xuv'] for row in rows if not row['above_floor']] + if below: + print( + f' rates below the one proton per year floor ({RATE_FLOOR:.2g} kg/s) up to ' + f'F_xuv = {max(below):.3g} W m-2: no escape worth reporting there' + ) + return changes + + +# ------------------------------------------- step 3: the other two labels + + +def extreme_labels() -> list[dict]: + """The boil-off and Roche-overflow labels, one call each.""" + print('\n=== The other two labels ===') + out = [] + cases = [ + ('boil-off: an inflated hydrogen envelope', 'H/He', 1.0, 1.5, 10.0), + ('overflow: a puffy envelope filling its Hill sphere', 'H/He', 3.0, 2.0, 0.1), + ] + for note, composition, m_earth, r_earth, f_xuv in cases: + result = dispatch(build_state(composition, m_earth, r_earth, f_xuv)) + diagnostics = result.diagnostics + print(f' {note}') + print( + f' regime {result.regime}, rate {result.mdot:.3e} kg/s, ' + f'Lambda {diagnostics["lambda_gate"]:.3g} ' + f'(activation band {diagnostics["documentation"]["lambda_crit_band"]})' + ) + roche = diagnostics['roche'] + print( + f' flow radius {roche["flow_radius"]:.3e} m against Hill radius ' + f'{roche["R_hill_periapsis"]:.3e} m, ratio {roche["xi_flow"]:.3f}' + ) + print(f' flags {sorted(result.flags)}') + out.append(dict(case=note, regime=result.regime, mdot=result.mdot)) + return out + + +# ------------------------------------------------- step 4: the diagnostics + + +def read_diagnostics(composition: str = 'CO2', f_xuv: float = 10.0) -> dict: + """Walk the diagnostics container of one verdict, group by group.""" + result = dispatch(build_state(composition, 1.0, 1.0, f_xuv)) + d = result.diagnostics + print(f'\n=== Diagnostics: {composition}, F_xuv = {f_xuv:g} W m-2, {result.regime} ===') + + knudsen = d['knudsen'] + print(' Which branch, and how close was the switch') + print( + f' Kn_sc {knudsen["kn_sc"]:.4g} against threshold ' + f'{knudsen["threshold_applied"]:.3g}; at the band edges the label would be ' + f'{knudsen["counterfactual_labels"]}' + ) + + hydro = d['hydrodynamic'] + print(' What set the rate') + print( + f' energy limited {hydro["mdot_el"]:.3e}, recombination limited ' + f'{hydro["mdot_rr"]:.3e} kg/s, selected by {hydro["selection_mechanism"]}' + ) + print( + f' wind temperature {hydro["T_wind"]:.0f} K, efficiency ' + f'{hydro["efficiency"]:.3g}, tidal factor {hydro["K_tide"]:.4f}' + ) + + johnson = d['johnson_q'] + print(' Could the heating drive the flow at all') + print( + f' absorbed power over the critical power {johnson["q_net_over_qc"]:.3g} ' + f'(below 1 says no transonic flow, whatever a rate formula returns)' + ) + + guo, screens = d['guo_triple'], d['potential_screens'] + print(' Translations into other taxonomies') + print( + f' Jeans parameters: exobase {guo["lambda_exo"]:.3g}, at the radius ' + f'{guo["lambda_rp"]:.3g}, tidally corrected {guo["lambda_star"]:.3g}' + ) + print( + f' log potential {screens["log_minus_phi_cgs"]:.3f}; efficiency collapse band ' + f'{screens["caldiroli_threshold"]}, wind screen says {screens["salz_verdict"]}' + ) + + fluid, consistency = d['fluid_check'], d['self_consistency'] + print(' Is the snapshot self-consistent') + print( + f' worst Knudsen below the sonic surface {fluid["worst_kn"]:.3g} over ' + f'{fluid["levels_checked"]} levels, fluid {fluid["fluid"]}, ' + f'truncated at the profile top {fluid["truncated_at_profile_top"]}' + ) + if consistency['evaluated']: + print( + f' reservoirs empty in {consistency["t_deplete_s"] / SEC_PER_YR:.3e} yr ' + f'against an age of {consistency["age_s"] / SEC_PER_YR:.3e} yr, ' + f'inconsistent {consistency["inconsistent"]}' + ) + + base = d['base_level'] + print(' Where the wind was launched') + print( + f' base at {base["p_Pa"]:.3e} Pa and {base["r_m"]:.4e} m, physical target ' + f'{base["p_physical_Pa"]:.3e} Pa, clamp {base["clamp_decades"]}' + ) + print(f' Coefficient provenance: {knudsen["provenance"]}') + return d + + +# ----------------------------------------------------------- step 5: knobs + + +def knob_collisionality(composition: str = 'CO2') -> dict: + """Locate the wind boundary at each edge of the collisionality band. + + The threshold's physical band spans a factor of 30, because kinetic + simulations place the fluid-to-kinetic transition near 0.1 for heating + deposited in a sharp layer and near 1 for distributed heating. Bisecting + the boundary at each edge turns that band into the quantity a reader + needs: the range of fluxes over which the label is not decided. + """ + print('\n=== Knob: the collisionality threshold across its band ===') + out = {} + for kn_crit in (0.1, 1.0, 3.0): + settings = DispatchSettings(kn_crit=kn_crit) + + def label(f_xuv: float, settings: DispatchSettings = settings) -> str: + return dispatch(build_state(composition, 1.0, 1.0, f_xuv, settings=settings)).regime + + lo, hi = 1.0e-2, 1.0e2 + label_lo = label(lo) + while math.log10(hi / lo) > 1e-3: + mid = math.sqrt(lo * hi) + if label(mid) == label_lo: + lo = mid + else: + hi = mid + out[kn_crit] = math.sqrt(lo * hi) + print(f' kn_crit {kn_crit:>4}: wind sets in at F_xuv = {out[kn_crit]:.4g} W m-2') + spread = max(out.values()) / min(out.values()) + print(f' The boundary spans a factor {spread:.1f} across the band.') + print(' That spread is the width of the boundary, not a parameter to tune.') + return out + + +def knob_exobase_temperature() -> list[dict]: + """Exobase temperature on a hydrostatic verdict with a light species. + + A pure heavy atmosphere returns hydrostatic rates far below the floor, + so the sensitivity is shown where the branch does physical work: a + small planet whose carbon dioxide carries one percent hydrogen. The + bulk rate barely moves, because hydrogen is limited by how fast + diffusion resupplies it, while the heavy species carry the exponential + dependence of the Jeans flux. + """ + print('\n=== Knob: the prescribed exobase temperature ===') + print(' Mars-mass planet, CO2 with 1% H2, F_xuv = 0.01 W m-2') + out, hydrogen = [], None + for t_exo in (500.0, 750.0, 1000.0, 1500.0, 2000.0): + settings = DispatchSettings(T_exo_value=t_exo) + result = dispatch(build_state('CO2 + 1% H2', 0.107, 0.53, 0.01, settings=settings)) + if t_exo == 1000.0: + hydrogen = result.diagnostics['hydrostatic']['detail']['species']['H2'] + out.append( + dict( + T_exo=t_exo, + regime=result.regime, + mdot=result.mdot, + per_species=dict(result.per_species), + ) + ) + print( + f' T_exo {t_exo:6.0f} K: {result.regime:<12} rate {result.mdot:.4e} kg/s, ' + f'H {result.per_species.get("H", 0.0):.3e}, ' + f'C {result.per_species.get("C", 0.0):.3e}' + ) + heavy_span = out[-1]['per_species']['C'] / out[0]['per_species']['C'] + bulk_span = out[-1]['mdot'] / out[0]['mdot'] + print( + f' Over that range the bulk rate moves by a factor {bulk_span:.2f} while the ' + f'carbon rate moves by a factor {heavy_span:.1e}.' + ) + print( + f' At 1000 K hydrogen sits at Jeans parameter {hydrogen["lambda_exo"]:.3g} with a ' + f'Jeans flux of {hydrogen["phi_jeans"]:.3e} against a diffusion-limited supply of ' + f'{hydrogen["phi_diffusion"]:.3e} (per unit area), so the supply is what binds and ' + f'the exobase temperature barely matters. Carbon and oxygen are Jeans limited, ' + f'which is where the exponential sensitivity went.' + ) + return out + + +def knob_fractionation(composition: str = 'CO2', f_xuv: float = 10.0) -> dict: + """The closure split against the reservoir mass-fraction split.""" + print('\n=== Knob: fractionation on and off ===') + out = {} + for fractionate in (True, False): + settings = DispatchSettings(fractionate=fractionate) + result = dispatch(build_state(composition, 1.0, 1.0, f_xuv, settings=settings)) + total = sum(result.per_species.values()) + shares = {el: rate / total for el, rate in sorted(result.per_species.items())} + out[fractionate] = shares + label = 'closure' if fractionate else 'reservoir mass fractions' + print(f' {label:<24} ' + ', '.join(f'{el} {x:.4f}' for el, x in shares.items())) + print(' A small shift here; the light species is the one enriched.') + return out + + +def knob_efficiency(composition: str = 'CO2', f_xuv: float = 10.0) -> list[dict]: + """The energy-limited efficiency across its literature range, and the fit.""" + print('\n=== Knob: the energy-limited efficiency ===') + out = [] + for efficiency in (0.1, 0.15, 0.3, 0.6): + settings = DispatchSettings(efficiency=efficiency) + result = dispatch(build_state(composition, 1.0, 1.0, f_xuv, settings=settings)) + hydro = result.diagnostics['hydrodynamic'] + out.append(dict(efficiency=efficiency, regime=result.regime, mdot=result.mdot)) + print( + f' epsilon {efficiency:4.2f}: {result.regime:<17} rate {result.mdot:.4e} kg/s ' + f'(energy limited {hydro["mdot_el"]:.3e}, recombination limited ' + f'{hydro["mdot_rr"]:.3e})' + ) + fitted = dispatch( + build_state( + composition, 1.0, 1.0, f_xuv, settings=DispatchSettings(efficiency_mode='caldiroli') + ) + ) + print( + f' fitted mode: efficiency {fitted.diagnostics["hydrodynamic"]["efficiency"]:.3g}, ' + f'flags {sorted(fitted.flags)}' + ) + print(' The guard fires because a 1 Earth-mass planet sits below the fitted potential') + print(' range, so the fitted value there is an extrapolation.') + return out + + +def hysteresis_window(composition: str = 'CO2') -> list[dict]: + """Show the previous label deciding the verdict inside the window.""" + print('\n=== Evolutionary use: the hysteresis window ===') + out = [] + for f_xuv in (0.747, 0.793): + for previous in (None, 'hydrostatic', 'hydrodynamic:EL'): + state = build_state(composition, 1.0, 1.0, f_xuv) + state.prev_regime = previous + result = dispatch(state) + knudsen = result.diagnostics['knudsen'] + out.append(dict(F_xuv=f_xuv, prev=previous, regime=result.regime)) + print( + f' F_xuv {f_xuv:.3f}, previously {str(previous):<17} -> ' + f'{result.regime:<17} (Kn_sc {knudsen["kn_sc"]:.4g}, threshold ' + f'{knudsen["threshold_applied"]:.4g})' + ) + print(' A time-stepping track cannot chatter across the threshold on numerical noise.') + return out + + +# -------------------------------------------------- step 6: a stellar track + + +def stellar_track(star=None, n_samples: int = 40) -> list[dict]: + """Dispatch one frozen atmosphere along a stellar XUV history. + + The profile does not evolve, so this is a sequence of static snapshots + rather than an evolutionary calculation: a real planet's structure + responds to the loss and to the star. What the sequence does show is + that the regime label belongs to the state and not to the planet, and + the snapshot consistency screen reports where a frozen state stops + being compatible with its own age. + """ + star = star or mors.Star(Mstar=1.0, Omega=1.0) + age_myr = np.asarray(star.Tracks['Age']) + l_xuv = np.asarray(star.Tracks['Lx']) + np.asarray(star.Tracks['Leuv']) + f_xuv = l_xuv * 1e-7 / (4.0 * math.pi * A_TRACK**2) # erg/s to W, then flux + l_bol = np.asarray(star.Tracks['Lbol']) * 1e-7 # erg/s to W + + composition = 'CO2 + 1% H2' + comp = COMPOSITIONS[composition] + m_p, r_p = Me, Re + t_eq_track = np.array([t_eq_at(A_TRACK, float(L)) for L in l_bol]) + # One profile, built at the median equilibrium temperature of the track. + profile = isothermal_profile(m_p, r_p, float(np.median(t_eq_track)), comp, P_SURF, P_TOP) + reservoirs = element_reservoirs(comp, 100.0 * Me_atm) + + print(f'\n=== A stellar history: {composition}, 1 Me, 1 Re at 0.2 au ===') + print( + f' {"age [Myr]":>10} {"F_xuv":>8} {"regime":<17} {"rate [kg/s]":>12} ' + f'{"Kn_sc":>9} snapshot' + ) + indices = np.unique(np.linspace(0, age_myr.size - 1, n_samples).astype(int)) + rows, previous = [], None + for i in indices: + state = EscapeInputs( + M_p=m_p, + R_p=r_p, + M_star=Ms, + a=A_TRACK, + e=0.0, + T_eq=float(t_eq_track[i]), + F_xuv=float(f_xuv[i]), + F_bol=f_bol_at(A_TRACK, float(l_bol[i])), + F_int=F_INT, + kappa_photo=KAPPA_PHOTO, + profile=profile, + settings=DispatchSettings(), + prev_regime=previous, + age=float(age_myr[i]) * 1e6 * SEC_PER_YR, + reservoirs=dict(reservoirs), + ) + result = dispatch(state) + previous = result.regime + consistency = result.diagnostics['self_consistency'] + rows.append( + dict( + age_Myr=float(age_myr[i]), + F_xuv=float(f_xuv[i]), + regime=result.regime, + mdot=result.mdot, + kn_sc=result.diagnostics['knudsen']['kn_sc'], + inconsistent=consistency.get('inconsistent'), + per_species=dict(result.per_species), + ) + ) + for row in rows[::6]: + verdict = 'inconsistent' if row['inconsistent'] else 'consistent' + print( + f' {row["age_Myr"]:10.1f} {row["F_xuv"]:8.3g} {row["regime"]:<17} ' + f'{row["mdot"]:12.3e} {row["kn_sc"]:9.3g} {verdict}' + ) + for before, after in zip(rows[:-1], rows[1:]): + if before['regime'] != after['regime']: + print( + f' label changes from {before["regime"]} to {after["regime"]} between ' + f'{before["age_Myr"]:.0f} and {after["age_Myr"]:.0f} Myr, and the rate ' + f'drops from {before["mdot"]:.3e} to {after["mdot"]:.3e} kg/s' + ) + return rows + + +# --------------------------------------------------------------- the figure + + +def boundary_band(composition: str, m_earth: float = 1.0, r_earth: float = 1.0) -> tuple: + """The wind boundary at both edges of the collisionality band. + + Returns the flux where the wind sets in for a threshold of 3 and for a + threshold of 0.1, which bracket the default of 1. The pair is the width + the criterion implies, and it is what the figure shades. + """ + edges = [] + for kn_crit in (3.0, 0.1): + settings = DispatchSettings(kn_crit=kn_crit) + lo, hi = 1.0e-2, 1.0e2 + label_lo = dispatch( + build_state(composition, m_earth, r_earth, lo, settings=settings) + ).regime + while math.log10(hi / lo) > 1e-3: + mid = math.sqrt(lo * hi) + state = build_state(composition, m_earth, r_earth, mid, settings=settings) + if dispatch(state).regime == label_lo: + lo = mid + else: + hi = mid + edges.append(math.sqrt(lo * hi)) + return tuple(edges) + + +def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> None: + """Two panels: the same sweep for two compositions, colored by regime.""" + palette = brand_colors() + fig, axes = plt.subplots(1, 2, figsize=(11, 4.6), sharey=True) + y_floor = 1.0e3 # rates below this round to zero on these planets + + for ax, (composition, rows) in zip(axes, sweeps.items()): + # The dispatched rate, as a line in the escape domain color. + ax.plot( + [r['F_xuv'] for r in rows], + [max(r['mdot'], y_floor) for r in rows], + color=palette['escape'], + linewidth=1.2, + alpha=0.5, + zorder=0, + ) + for label in ('hydrostatic', 'hydrodynamic:EL', 'hydrodynamic:RR'): + group = [r for r in rows if r['regime'] == label] + if not group: + continue + # Filled markers where the rate is on scale, open markers where + # it has been raised to the axis floor to stay visible. + for on_scale in (True, False): + subset = [r for r in group if (r['mdot'] >= y_floor) is on_scale] + if not subset: + continue + ax.plot( + [r['F_xuv'] for r in subset], + [max(r['mdot'], y_floor) for r in subset], + linestyle='none', + marker=REGIME_MARKERS[label], + markersize=8, + markerfacecolor=palette[label] if on_scale else 'none', + markeredgecolor=palette[label], + label=label + if on_scale or not any(r['mdot'] >= y_floor for r in group) + else None, + ) + # The collisionality criterion spans a factor of 30 in threshold, so + # the boundary it sets is a band. Shade the band before the line. + band = bands.get(composition) + if band: + ax.axvspan(min(band), max(band), color=palette['hydrostatic'], alpha=0.18, lw=0) + ax.annotate( + 'switch band', + xy=(math.sqrt(band[0] * band[1]), 1.0e9), + ha='center', + fontsize=11, + color=palette['rule'], + fontfamily='Spline Sans Mono', + ) + for _before, _after, flux in boundaries.get(composition, []): + ax.axvline(flux, color=palette['rule'], linestyle='--', linewidth=1.0) + ax.annotate( + f'{flux:.3g}', + xy=(flux, 1.2e10), + xytext=(3, 0), + textcoords='offset points', + fontsize=11, + color=palette['rule'], + fontfamily='Spline Sans Mono', + ) + ax.set_xscale('log') + ax.set_yscale('log') + ax.set_ylim(3.0e2, 3.0e10) + ax.set_xlabel('XUV flux [W m$^{-2}$]') + ax.set_title(_panel_title(composition)) + + axes[0].set_ylabel('Mass loss rate [kg s$^{-1}$]') + axes[0].annotate( + 'open markers: rate rounds to zero', + xy=(0.03, 0.14), + xycoords='axes fraction', + fontsize=11, + fontfamily='Spline Sans Mono', + ) + handles, labels = axes[0].get_legend_handles_labels() + fig.legend(handles, labels, loc='upper center', ncol=3, bbox_to_anchor=(0.5, 0.11)) + fig.subplots_adjust(bottom=0.25, top=0.9, left=0.09, right=0.98, wspace=0.08) + fig.savefig(outpath, bbox_inches=None) + fig.savefig(outpath.replace('.pdf', '.png'), bbox_inches=None) + plt.close(fig) + print(f'\nwrote {outpath} and its PNG companion') + + +def _panel_title(composition: str) -> str: + """Composition name with typeset subscripts for a panel title.""" + return { + 'CO2': 'CO$_2$', + 'N2-O2': 'N$_2$ and O$_2$', + 'CO2 + 1% H2': 'CO$_2$ with 1% H$_2$', + 'H/He': 'H$_2$ and He', + }.get(composition, composition) + + +# ----------------------------------------------------------------- driver + + +def main(outdir: str = 'output') -> dict: + """Run every step, print the tables, and write the figure.""" + results = {} + results['verdict'] = one_verdict() + sweeps, boundaries, bands = {}, {}, {} + for composition in ('CO2', 'N2-O2'): + rows = flux_sweep(composition) + sweeps[composition] = rows + boundaries[composition] = report_sweep(composition, rows) + bands[composition] = boundary_band(composition) + print( + f' the wind boundary spans {min(bands[composition]):.3g} to ' + f'{max(bands[composition]):.3g} W m-2 across the collisionality band' + ) + results['sweeps'] = sweeps + results['boundaries'] = boundaries + results['bands'] = bands + results['extremes'] = extreme_labels() + results['diagnostics'] = read_diagnostics() + results['knob_kn'] = knob_collisionality() + results['knob_t_exo'] = knob_exobase_temperature() + results['knob_fractionation'] = knob_fractionation() + results['knob_efficiency'] = knob_efficiency() + results['hysteresis'] = hysteresis_window() + results['track'] = stellar_track() + make_figure(sweeps, boundaries, bands, f'{outdir}/demo_dispatcher_regimes.pdf') + return results + + +if __name__ == '__main__': + main() From 6a52f2821fc48fb5b1f78a690eb9a63d61b29495 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 22:06:16 +0200 Subject: [PATCH 021/113] Document the dispatcher end to end for users Three pages, one per purpose. The tutorial drives the framework on synthetic atmospheres: one verdict read field by field, two boundary crossings on one planet with the criterion band measured around one of them, the boil-off and overflow labels, the diagnostics container in the order the questions occur, the four knobs that move a boundary, and one atmosphere dispatched along a stellar history. The results reference tabulates every field, flag, and diagnostics group, with the two reporting conventions a caller needs: a rate floor for numerical noise and the depletion timescale for relevance. The triage guide goes from a symptom to the entry that explains it. --- docs/Explanations/model.md | 4 +- docs/Explanations/regimes.md | 4 +- docs/How-to/triage_verdict.md | 104 +++++++ docs/Reference/parameters.md | 2 +- docs/Reference/results.md | 122 ++++++++ docs/Tutorials/dispatch.md | 358 ++++++++++++++++++++++++ docs/Tutorials/first_run.md | 1 + docs/assets/dispatcher_regime_sweep.png | Bin 0 -> 243900 bytes docs/getting_started.md | 12 + mkdocs.yml | 3 + 10 files changed, 607 insertions(+), 3 deletions(-) create mode 100644 docs/How-to/triage_verdict.md create mode 100644 docs/Reference/results.md create mode 100644 docs/Tutorials/dispatch.md create mode 100644 docs/assets/dispatcher_regime_sweep.png diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 991d9ee1..71112d4f 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -58,11 +58,13 @@ A giant collision removes part of the target's atmosphere in a single event, on - [Energy-limited escape](energy_limited.md): the default prescription, its radius scaling, and its tidal correction. - [Escape regimes](regimes.md): the classification logic and the rate physics of every branch, with thresholds and bands. +- [Dispatching a regime](../Tutorials/dispatch.md): the framework driven end to end on synthetic atmospheres, boundary crossings included. - [Fractionation](fractionation.md): how a wind partitions over species, and when heavy species drop out. - [Giant impacts](impacts.md): the erosion scaling law and its fitted domain. - [Coupling to PROTEUS](proteus.md): configuration keys, the per-time-step sequence, and reservoir bookkeeping. - [Limitations](limitations.md): what each entry point does not model, and what that implies for results. -- [Parameter reference](../Reference/parameters.md) and [API reference](../Reference/api/index.md). +- [Triage a verdict](../How-to/triage_verdict.md): what to look at when a flag fires or a label surprises you. +- [Parameter reference](../Reference/parameters.md), [dispatch results](../Reference/results.md), and [API reference](../Reference/api/index.md). --- diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index ee77ae47..501677e6 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -81,7 +81,9 @@ Every threshold above carries a stated physical width, and the framework reports ## Configuration -All knobs, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. The assumptions that remain on every result, whatever the knobs, are collected on the [limitations page](limitations.md). +All knobs, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. Every field of the result, every flag, and every diagnostics group is tabulated in the [dispatch results reference](../Reference/results.md). The assumptions that remain on every result, whatever the knobs, are collected on the [limitations page](limitations.md). + +For the framework in use rather than in principle, the [dispatcher tutorial](../Tutorials/dispatch.md) crosses two of the boundaries above on one planet, measures how far one of them moves across the width of its own criterion, and dispatches an atmosphere along a stellar history; the [triage guide](../How-to/triage_verdict.md) starts from a flag or an unexpected verdict instead. --- diff --git a/docs/How-to/triage_verdict.md b/docs/How-to/triage_verdict.md new file mode 100644 index 00000000..c7fa4795 --- /dev/null +++ b/docs/How-to/triage_verdict.md @@ -0,0 +1,104 @@ +# Triage a dispatch verdict + +A regime verdict looks wrong, or a flag fired and you want to know whether it matters. This page is the shortest path from a symptom to the thing to look at. Every flag and diagnostics key is defined in the [dispatch results reference](../Reference/results.md), and the physics is on the [escape regimes](../Explanations/regimes.md) page; this is the triage layer between them. + +Start with the two questions that dispose of most surprises: + +1. **Is the rate physically meaningful at all?** One proton per year through the surface, about 5.3e-35 kg s⁻¹, is the smallest rate with content. Below it, the label is describing an outflow that does not exist. +2. **Was the state near a boundary?** `diagnostics['knudsen']['counterfactual_labels']` gives the label at both edges of the collisionality criterion. When those disagree with each other, the verdict is a choice the criterion made, not a measurement, and the rest of the triage is about which choice. + +--- + +## The rate is zero, or absurdly small + +**Symptom.** A `hydrostatic` verdict returns 1e-70 kg s⁻¹ or smaller. + +**Cause.** Nothing is wrong. Jeans escape depends exponentially on the Jeans parameter at the exobase, and a heavy species on a strongly bound planet sits at a Jeans parameter of hundreds. Read `diagnostics['hydrostatic']['detail']['species'][name]['lambda_exo']`: above roughly 30, the exponential has already taken the rate out of physical relevance. + +**What to do.** Report no escape rather than the number. If you expected loss here, the missing physics is probably not thermal: the nonthermal channels that actually remove heavy species from a real exosphere are absent everywhere in ZEPHYRUS, which is what `hydrostatic_lower_limit` says on every hydrostatic result. A trace of a light species changes the picture completely, because it escapes at the diffusion-limited supply rate rather than its own Jeans rate. + +## The bulk rate barely responds to the exobase temperature + +**Symptom.** A hydrostatic verdict whose rate is insensitive to `T_exo_value`, against the documented exponential sensitivity. + +**Cause.** The species carrying the rate is supply limited, not Jeans limited. Compare `phi_jeans` against `phi_diffusion` in `diagnostics['hydrostatic']['detail']['species'][name]`: when the diffusion-limited supply is the smaller of the two, the harmonic mean of the two sits near the supply and the exobase temperature has little left to do. + +**What to do.** Nothing, but do not report the insensitivity as a general property of the branch: the heavy species in the same result will be moving by orders of magnitude over the same temperature range. + +## `thermostat_clamped` fired + +**Symptom.** The wind temperature sits at a bracket edge, usually 5e4 K. + +**Cause.** The local heating against cooling balance had no root in the bracket. At a dense wind base this is physical: electron densities far above the critical densities of the forbidden lines quench the line coolants collisionally, so nothing balances the heating and the wind runs hot. + +**What to do.** Read `diagnostics['hydrodynamic']['T_wind']` and decide whether that temperature is one you are willing to carry. It propagates: the sound speed, the barometric exponent, and the recombination coefficient all depend on it, so it moves the boundary between the two hydrodynamic sub-labels. The thermostat evaluates one level and does not model the temperature structure through the sonic region, which is the limitation behind the clamp. + +## `subcritical_sonic` fired, and the label is `hydrodynamic:RR` + +**Symptom.** A recombination-limited verdict carrying this flag. + +**Cause.** The computed sonic radius fell below the wind base, so it was floored at the base. The recombination-limited rate then wins the minimum through barometric suppression between base and sonic point, not through recombination saturation. + +**What to do.** Check `diagnostics['hydrodynamic']['selection_mechanism']`, which names the mechanism. Do not describe such a point as recombination limited in text or in a figure legend: it is the same label reached by different physics, and the distinction is the reason the mechanism is reported. + +## `base_clamped` fired + +**Symptom.** The wind base sits at the profile top, with a clamp distance of several decades. + +**Cause.** The profile does not extend to the pressure where XUV photons are absorbed, near a nanobar. An isothermal hydrogen envelope, in particular, becomes unbound and truncates well below that. + +**What to do.** For a production profile, set the top pressure below 1 nanobar and the clamp never engages. Otherwise decide by branch: on `boiloff` the clamp is harmless, because that branch launches from the photospheric level. On a hydrodynamic verdict it is not, because the base density sets the sonic-point density and therefore the collisionality switch itself, so a clamped base moves the boundary. The `base_out_of_range = 'extend'` setting evaluates the base on the extended upper structure instead; `base_extension_truncated` means even that did not reach it. + +## `roche_overflow` on a state that should not be overflowing + +**Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. + +**Cause.** The label names the branch that won the rate comparison, and the screen tests that branch's own flow radius. When the bolometric residual wins, the radius tested is its sonic radius, which for a warm low-gravity atmosphere can be larger than the Hill radius even when the residual rate is tiny. So the label reports a geometry, and the rate it carries can be small. + +**What to do.** Read three things: `flags['bolometric_residual']` (did the residual take the label), `diagnostics['roche']` (`flow_radius` against `R_hill_periapsis`), and `diagnostics['bolometric']` (which cap set the rate). If the residual won at a rate below the floor, treat the point as no escape and the geometry as a note rather than a result. Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. + +## `contested_ion` fired + +**Symptom.** The flag, plus a `diagnostics['contested_ion']` group holding two rates. + +**Cause.** The neutral escape temperature and the plasma escape temperature, which is half of it because an ambipolar field shares each ion's binding energy with its electron, disagree about whether the exosphere can stay hydrostatic. The physics that would decide it is ion outflow, which this version does not model. + +**What to do.** Report both rates, or report the point as contested. Do not resolve it with the `gate` setting: that setting chooses which convention gates the branch, and choosing one does not make the other wrong. In the nitrogen and oxygen corner the two conventions can differ by four orders of magnitude in rate. + +## The label flips between neighboring points of a smooth sweep + +**Symptom.** A parameter grid or a time series whose label alternates. + +**Cause.** Either the state is sitting inside the collisionality band, where the criterion does not decide the label, or the two candidate rates are within a hair of each other and the minimum keeps changing hands. + +**What to do.** For an evolutionary track, supply `prev_regime` from the previous step. That opens a hysteresis window around the threshold, so the previous label wins inside it and a track cannot chatter on numerical noise; `hysteresis_active` confirms it was in use and `diagnostics['knudsen']['threshold_applied']` shows the shifted threshold. For a static grid, quote the boundary with the width its criterion implies rather than as a line: re-dispatch at `kn_crit` of 0.1 and 3 and report the range. The [tutorial](../Tutorials/dispatch.md) measures such a band as a factor of 4.3 in boundary flux for one planet. + +## The per-species rates look like a bulk split + +**Symptom.** Element shares that match their reservoir mass fractions. + +**Cause.** Either fractionation is off, or the verdict is not a confirmed wind. The closure runs only on a hydrodynamic verdict with `fractionate` on; every other branch splits by reservoir mass fractions, except the hydrostatic branch, which is natively per-species. + +**What to do.** Check the label and the `fractionate` setting, and look for `split_from_base_composition`, which says the split fell back to the wind-base composition because no reservoirs were supplied. A three percent departure from the mass fractions is a real result for a well-coupled heavy wind, not a sign the closure failed to run; `diagnostics['closure']` carries the active set and the mass residual if you need to confirm it did. + +## The rate is large and the planet should not have survived + +**Symptom.** A plausible-looking rate on a grid point whose atmosphere would be long gone. + +**Cause.** Nothing in the module knows the state's history. `diagnostics['self_consistency']` is the check: it divides the supplied inventory by the dispatched rate and compares against the supplied age. + +**What to do.** When `inconsistent` is `True`, the grid point is describing a state that cannot have persisted to the age it claims. That is a statement about the grid, not the rate. Report the flagged fraction of a static grid rather than dropping the points silently. + +## The fitted efficiency returns something implausible + +**Symptom.** `efficiency_mode = 'caldiroli'` returning a value near one, with `caldiroli_out_of_box`. + +**Cause.** The fit was made on sub-Neptunes through hot Jupiters. A one Earth-mass planet sits below the gravitational potential range it covers, so the value is an extrapolation, and the flag says so rather than silently refusing. + +**What to do.** Below the fit's flux bound the value is rejected outright and `caldiroli_below_flux_bound` plus `efficiency_fallback_fixed` tell you the fixed setting was used instead. Outside the potential box, prefer a swept fixed efficiency over the extrapolated fit, and report the sweep range rather than one value. + +--- + +## When none of the above applies + +Print the whole container for the offending call and read it in the order the [tutorial](../Tutorials/dispatch.md) uses: which branch and how close, what set the rate, whether the heating could drive a flow at all, how the verdict translates into other taxonomies, and whether the snapshot is self-consistent. If the verdict still looks wrong after that, the input state is the next suspect: check the profile spans the pressures the branches need, that the composition is what you meant, and that every scalar is in SI. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 31c69776..d8d4a1eb 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -1,6 +1,6 @@ # ZEPHYRUS parameter reference -This is a reference page for all parameters and constants used in ZEPHYRUS. For the physical model, see the [model overview](../Explanations/model.md). +This is a reference page for all parameters and constants used in ZEPHYRUS. For the physical model, see the [model overview](../Explanations/model.md). For what a dispatch call returns, see [dispatch results](results.md). --- diff --git a/docs/Reference/results.md b/docs/Reference/results.md new file mode 100644 index 00000000..da9ffa3a --- /dev/null +++ b/docs/Reference/results.md @@ -0,0 +1,122 @@ +# Dispatch results + +The [parameter reference](parameters.md) documents what goes into `zephyrus.dispatch`. This page documents what comes out: the result fields, every flag the framework can raise, and every group in the diagnostics container. The physics behind each quantity is on the [escape regimes](../Explanations/regimes.md) page, and the [tutorial](../Tutorials/dispatch.md) shows the reading order in practice. For a flag that fired on a result you did not expect, the [triage guide](../How-to/triage_verdict.md) is faster than this page. + +--- + +## The result + +`dispatch` returns an `EscapeResult` with five fields. + +| Field | Type | Contract | +|---|---|---| +| `regime` | str | One of the five labels below. Always set. | +| `mdot` | float | Bulk mass-loss rate in kg s⁻¹, finite and non-negative. | +| `per_species` | dict | Element symbol to rate in kg s⁻¹, non-negative, summing to `mdot` at machine precision. | +| `flags` | dict | Everything that clamped, fell back, or was screened. Empty when there is nothing to report. | +| `diagnostics` | dict | Reporting container. Nothing in the dispatch logic reads it, and it has no off switch. | + +Every physically posed state returns a result. A `ValueError` means the state or the settings are malformed, not that the physics failed: a non-positive mass, radius, stellar mass, orbital distance, equilibrium temperature, bolometric flux, interior flux, or opacity, a negative XUV flux, an eccentricity outside $[0, 1)$, a profile whose pressure does not decrease or whose radius does not increase with index, fewer than three profile levels, mixing-ratio arrays of the wrong length, an unsupported option string, or all four cooling channels disabled at once. + +## The five labels + +| Label | Physics | Rate | +|---|---|---| +| `boiloff` | Bolometrically driven outflow from an atmosphere inflated beyond its own sonic radius. | Closed-form transonic Parker wind, Bondi-capped, and luminosity-capped past the activation gate. | +| `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | +| `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | See `selection_mechanism`: the minimum selects this rate two physically different ways. | +| `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | +| `roche_overflow` | The active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet. | The Bondi-capped bolometric machinery at the overflow geometry. | + +A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. + +--- + +## Flags + +The flags dictionary is a warning set: every entry means something happened that you should know about, and a result with nothing to report carries an empty dictionary. Most entries are `True`; six carry a value instead, because the warning is more useful with its magnitude attached (`base_clamp_decades`, `base_method_fallback`, `dl_bypass`, `roche_subflag`, `rock_former_bij`, `thermostat_clamped`). Quantities that merely describe a call, rather than warning about it, live in the diagnostics instead. + +The `effect` column says whether the returned rate already reflects the flag or whether the flag reports only. + +### The working levels + +| Flag | Value | Meaning | Effect | +|---|---|---|---| +| `base_clamped` | `True` | The physical wind-base pressure lies above the profile top, so the base was clamped to the topmost level. | The rate reflects it | +| `base_clamp_decades` | float | How far that clamp moved the base, in pressure decades. | Reporting only | +| `base_extended` | `True` | With `base_out_of_range = 'extend'`, the base was evaluated on the extended upper structure instead of clamping. | The rate reflects it | +| `base_extension_truncated` | `True` | The extension became unbound before reaching the base pressure, so the clamp stands after all. | The rate reflects it | +| `base_method_fallback` | `'lopez'` | The requested base method was unavailable or did not converge, so the default was used. | The rate reflects it | +| `photo_clamped` | `True` | The profile does not span the photospheric level, so the nearest end level was used for the energy-limited geometry. | The rate reflects it | + +### The branches + +| Flag | Value | Meaning | Effect | +|---|---|---|---| +| `bondi_inflated` | `True` | The launch level sits above the Bondi radius, so the Mach number was capped at one. | The rate reflects it | +| `thermostat_clamped` | `'high'` or `'low'` | The heating against cooling balance had no root inside the bracket, so the wind temperature clamped to the nearer edge. A high clamp at a dense base is collisional quenching of the line coolants, not a failure. | The rate reflects it | +| `subcritical_sonic` | `True` | The computed sonic radius fell below the wind base, so it was floored there and the barometric factor dropped. A recombination-limited win under this flag is barometric suppression, not recombination saturation. | The rate reflects it | +| `caldiroli_out_of_box` | `True` | The fitted efficiency was evaluated outside the range of gravitational potential and flux it was fitted on. The value is returned as an extrapolation. | The rate reflects it | +| `caldiroli_below_flux_bound` | `True` | Below the validity bound of the efficiency fit, where its formulas turn complex. | Rejected | +| `efficiency_fallback_fixed` | `True` | The fitted efficiency was unavailable, so the fixed setting was used. | The rate reflects it | +| `bolometric_residual` | `True` | The luminosity-capped bolometric residual beat the XUV branch and took the label. | The rate reflects it | +| `gate_rerouted` | `True` | The exobase was too hot to stay hydrostatic, so the state was routed back to the hydrodynamic rate. | The rate reflects it | +| `contested_ion` | `True` | The neutral and plasma escape-temperature conventions disagree about the branch. Both rates are recorded in `diagnostics['contested_ion']`. | Reporting only | +| `hysteresis_active` | `True` | A previous regime label was supplied, so the hysteresis window was applied to the collisionality threshold. | The rate reflects it | + +### The hydrostatic branch + +| Flag | Value | Meaning | Effect | +|---|---|---|---| +| `hydrostatic_lower_limit` | `True` | Always set on this branch: the nonthermal channels that dominate heavy-species loss from real exospheres are not modeled, so heavy-element rates are lower limits. | Reporting only | +| `dl_bypass` | species | The dominant species, which supplies itself and takes the Jeans flux with no diffusion cap. | Reporting only | +| `volkov_extrapolated` | `True` | A species sits above the Jeans parameter of 15 where the kinetic enhancement factor was measured, so the factor was held constant. | The rate reflects it | +| `exobase_not_reached` | `True` | The extended structure never reaches the level where the mean free path equals the scale height, so its top level was used as the exobase. | The rate reflects it | +| `exobase_at_anchor` | `True` | The exobase landed on the profile top itself; one integration interval was kept so the supply integrals exist. | The rate reflects it | +| `extension_unbound` | `True` | The extended upper structure became unbound before the integration finished. | The rate reflects it | + +### The screens and the split + +| Flag | Value | Meaning | Effect | +|---|---|---|---| +| `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes and the rate is recomputed at the overflow geometry. | The rate reflects it | +| `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the Hill sphere sits inside the photosphere itself, or only the flow reaches it. | Reporting only | +| `near_roche` | `True` | The flow radius is within 1.5 Hill radii. The tidal factor is steep there. | Reporting only | +| `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | +| `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | +| `stale_input` | `True` | The caller passed `atm_converged=False`, so the profile is from a non-converged atmosphere solve. | Reporting only | + +--- + +## Diagnostics + +Seventeen groups on a typical call. Nothing in the dispatch control flow reads any of them, and there is no option to switch them off: the regime boundaries carry genuine physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that. + +| Group | Key contents | What it answers | +|---|---|---| +| `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | +| `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won and by what mechanism, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). | +| `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, and per-species Jeans and diffusion fluxes in `detail['species']`. | +| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, and whether the branch was active. | +| `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | +| `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | +| `closure` | active set, retained species, multiplier, mass residual, coefficient provenance | How the fractionation closure partitioned a wind, present only on a fractionating hydrodynamic verdict. | +| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide` | The overflow screen in full: which radius was tested and against what. | +| `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | +| `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | +| `potential_screens` | `log_minus_phi_cgs`, efficiency-collapse band, wind-versus-hydrostatic screen and its attribution caveat | The verdict translated into threshold-potential taxonomies. | +| `erkaev_tc_K` | float | The tidally corrected critical exobase temperature above which the thermosphere blows off. | +| `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | +| `tang_timescale` | boil-off termination timescales | A consistency check on the bolometric rate's own exponential shutoff. | +| `self_consistency` | `evaluated`, `t_deplete_s`, `age_s`, `inconsistent` | Whether the dispatched rate would have destroyed the supplied inventory within the supplied age. Reports `evaluated: False` without an age or reservoirs. | +| `base_level` | `p_Pa`, `p_physical_Pa`, `r_m`, `T_K`, `clamp_decades` | Where the wind was launched, and the pressure the base method asked for before any clamp. | +| `documentation` | criterion bands and published exponents | The bands themselves, so a stored result is self-describing: the collisionality band, the boil-off activation band, the numerical against analytic flux exponents of the wind limits, and the dayside-heating reduction factors. | +| `contested_ion` | both branch rates and a note | Present only when the two escape-temperature conventions disagree, which turns on ion physics this version does not model. | + +--- + +## Two conventions worth adopting + +**A rate floor.** The framework computes what the physics gives it, including rates like 1e-123 kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about 5.3e-35 kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it. + +**A relevance test, separately.** Clearing the floor does not make a rate matter: a hundred decades above it can still be grams per year. Use `diagnostics['self_consistency']`, which divides the supplied inventory by the dispatched rate and compares against the supplied age, as the yardstick for whether a rate is worth carrying. diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md new file mode 100644 index 00000000..1989cddf --- /dev/null +++ b/docs/Tutorials/dispatch.md @@ -0,0 +1,358 @@ +# Dispatching an escape regime + +The [first run](first_run.md) applied one prescription unconditionally: scalars in, an energy-limited rate out. This tutorial uses the full framework instead. You hand `zephyrus.dispatch` one planetary state, it decides which escape physics that state is in, and it returns the rate that physics gives, the per-species split, flags, and the diagnostics that say how close the state sat to each regime boundary. + +By the end you will have crossed two regime boundaries on the same planet, produced the figure below, read a diagnostics container field by field, measured how far a boundary moves across the width of its own criterion, and dispatched one atmosphere along a stellar XUV history. + +If you have not installed ZEPHYRUS yet, follow the [installation guide](../How-to/installation.md) and run `mors download all` for the stellar tracks. The [escape regimes](../Explanations/regimes.md) page defines the physics behind every step here; this page is about driving it. + +!!! info "What you'll do" + - Build a planetary state: scalars plus an atmosphere profile + - Read one verdict field by field, and check the per-species sum + - Sweep the XUV flux until the regime label changes, twice + - Meet the boil-off and overflow labels + - Read the diagnostics container and learn which entries to look at first + - Move a boundary with each of the four knobs that move one + - Dispatch a frozen atmosphere along a stellar history + +--- + +## The full script + +The complete example is `examples/demo_dispatcher/demo_dispatcher.py`. It writes one figure, so create the output directory first: + +```sh +mkdir -p output +python examples/demo_dispatcher/demo_dispatcher.py +``` + +It prints a table per step and takes about a minute, most of which is the boundary bisections. Every step is a function that returns its results, so you can import one at a time: + +```python +from examples.demo_dispatcher.demo_dispatcher import flux_sweep, read_diagnostics +``` + +The rest of this page walks the script step by step. + +--- + +## Step 1: build a state + +The energy-limited entry point takes scalars. The framework needs the atmospheric structure as well, because the quantities that decide the regime are properties of the structure and not of the surface: the pressure level where XUV photons are absorbed and the wind is launched, the level where the gas stops colliding often enough to behave as a fluid, and the exobase where individual particles start escaping ballistically. + +So a state is scalars plus a `profiles.Profile`: + +```python +from zephyrus.dispatcher import DispatchSettings, EscapeInputs, dispatch +from zephyrus.profiles import isothermal_profile + +profile = isothermal_profile(M_p, R_p, T_eq, {'CO2': 1.0}, 1.0e7, 1.0e-5) + +state = EscapeInputs( + M_p=M_p, # planet mass [kg] + R_p=R_p, # planet radius [m] + M_star=Ms, # stellar mass [kg] + a=a, # semi-major axis [m] + e=0.0, # eccentricity + T_eq=T_eq, # equilibrium temperature [K] + F_xuv=10.0, # XUV flux at the planet [W m-2] + F_bol=f_bol, # bolometric instellation [W m-2] + F_int=1.0, # interior heat flux [W m-2] + kappa_photo=0.01, # photospheric opacity [m2 kg-1] + profile=profile, + settings=DispatchSettings(), + age=age, # optional, for the consistency screen [s] + reservoirs=reservoirs, # optional, element inventories [kg] +) +``` + +In a coupled run the atmosphere module supplies the profile. Standalone, `isothermal_profile` integrates a hydrostatic isothermal structure of fixed composition, which is enough to exercise every branch. Three choices in the script are worth stating, because they are the ones that change results: + +- `p_top = 1e-5` Pa, which is 0.1 nanobar. The XUV wind launches near a nanobar, so a profile that stops deeper than that cannot reach its own wind base and the base clamps to the profile top instead, flagged. Setting the top below a nanobar keeps the clamp out of the way. +- `kappa_photo = 0.01` m² kg⁻¹, about 0.1 cm² g⁻¹. The boil-off rate scales as its inverse, so it matters whenever the bolometric branch is in play. +- The orbit is 0.0775 au around a solar-luminosity star, which puts the zero-albedo, full-redistribution equilibrium temperature at 1000 K. Deriving $T_\mathrm{eq}$ from the orbit rather than setting both by hand keeps the state self-consistent. + +!!! warning "SI at every boundary" + Every input is SI: kilograms, meters, seconds, kelvin, W m⁻², m² kg⁻¹. MORS returns cgs luminosities, so the flux conversions in step 7 are explicit. + +--- + +## Step 2: one call, one verdict + +```python +result = dispatch(state) +``` + +For the CO₂ planet at 10 W m⁻², the script prints: + +```text +regime hydrodynamic:EL +rate 2.3477e+06 kg/s (7.409e+13 kg/yr) +C 6.6097e+05 kg/s +O 1.6867e+06 kg/s +sum 2.3477e+06 kg/s, closure error 0.00e+00 +flags none +diagnostics 17 groups +``` + +Five fields, and each has a contract. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is the property a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. + +Every physically posed state returns a result. Exceptions are reserved for malformed input, so a `ValueError` from `dispatch` means the state itself is wrong (a negative mass, an eccentricity of 1, a profile whose pressure does not decrease outward), not that the physics failed. + +--- + +## Step 3: cross a boundary + +The interesting thing about a dispatcher is where it changes its mind. Sweep the XUV flux on a fixed planet and the label moves, because the flux at a fixed orbit stands in for stellar age: a young star delivers orders of magnitude more XUV than the same star does later. + +```python +for f_xuv in np.logspace(-2, np.log10(5e3), 30): + result = dispatch(build_state('CO2', 1.0, 1.0, float(f_xuv))) + print(f_xuv, result.regime, result.mdot, + result.diagnostics['knudsen']['kn_sc']) +``` + +On the CO₂ planet the sweep crosses two boundaries: + +```text + F_xuv regime rate [kg/s] Kn_sc at Kn 0.1 at Kn 3 + 0.01 hydrostatic 4.989e-123 4.5e+18 hydrostatic hydrostatic + 0.587 hydrostatic 4.989e-123 3.92 hydrostatic hydrostatic + 2.28 hydrodynamic:EL 5.356e+05 0.118 hydrostatic hydrodynamic + 34.5 hydrodynamic:EL 8.090e+06 0.0127 hydrodynamic hydrodynamic + 520 hydrodynamic:EL 1.222e+08 0.00265 hydrodynamic hydrodynamic + 2.02e+03 hydrodynamic:RR 2.572e+08 0.00131 hydrodynamic hydrodynamic +boundary: hydrostatic to hydrodynamic:EL at 0.77 W m-2 +boundary: hydrodynamic:EL to hydrodynamic:RR at 567 W m-2 +``` + +The first crossing is the collisionality switch. Below 0.77 W m⁻² the heating is too weak to keep the gas collisional where a wind would go sonic, so the sonic-point Knudsen number `kn_sc` exceeds 1 and escape is per-particle from the exobase. Above it a fluid wind exists and the rate is the smaller of the two hydrodynamic limits. The second crossing at 567 W m⁻² is inside the wind: the recombination-limited rate drops below the energy-limited one and names the label. + +Run the same sweep on a nitrogen and oxygen atmosphere of the same mass and radius and both facts change: the wind sets in at 0.103 W m⁻², a factor 7.5 lower, and the recombination-limited rate never wins anywhere in the swept range. Composition moves the boundaries, not just the rates. + +![Regime labels across an XUV flux sweep for two compositions](../assets/dispatcher_regime_sweep.png) + +Two things in that figure deserve attention. + +**The shaded band.** The collisionality threshold has a default of 1 and a physical range of 0.1 to 3, because kinetic simulations place the fluid-to-kinetic transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed[^johnson]. That is heating-geometry physics, not a tuning parameter, and it makes the boundary a band: on the CO₂ planet the wind sets in anywhere between 0.61 and 2.6 W m⁻², a factor of 4.3, depending on which edge of the criterion you adopt. The dashed line is the default; the band is the honest width. Every verdict reports the label it would have carried at both edges, in `diagnostics['knudsen']['counterfactual_labels']`, so you never have to rerun a sweep to find this out. + +**The open markers.** The hydrostatic rates on these two planets are 1e-123 and 1e-71 kg s⁻¹. Those are not small rates, they are zero with numerical noise attached: carbon dioxide at one Earth mass sits at an exobase Jeans parameter of 301, and $e^{-301}$ is not a number with physical content. Two yardsticks keep this straight: + +- One proton crossing the surface per year, 5.3e-35 kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves this convention to you. +- Above that floor, ask whether the rate matters, by comparing it against the inventory and the age. The diagnostics already do this: `diagnostics['self_consistency']` divides the reservoirs by the rate and compares against the age you supplied. + +A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing 2e-9 kg s⁻¹ loses 66 grams a year. + +--- + +## Step 4: boil-off and overflow + +Two labels do not appear in that sweep, and neither depends on the XUV flux. + +An inflated hydrogen envelope flows out on the planet's own thermal energy before stellar XUV matters. The test is the restricted Jeans parameter $\Lambda$, the ratio of gravitational binding to thermal energy at the photospheric level, and the state is labeled `boiloff` while it sits below the threshold: + +```text +regime boiloff, rate 1.348e+14 kg/s, Lambda 11.1 (activation band 15 to 35) +flow radius 6.314e+07 m against Hill radius 1.160e+08 m, ratio 1.837 +flags ['base_clamp_decades', 'base_clamped', 'subcritical_sonic'] +``` + +At 1 Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 11.1$, well below the threshold of 20, and the rate is 1e14 kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. + +The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Flags tell you what happened; deciding whether it matters is your job, and the [triage guide](../How-to/triage_verdict.md) is a shortcut for the common cases. + +Push the same envelope to 3 Earth masses and 2 Earth radii and the flow stops being bound to the planet at all: + +```text +regime roche_overflow, rate 1.038e+09 kg/s, Lambda 25 +flow radius 1.894e+08 m against Hill radius 1.673e+08 m, ratio 0.883 +``` + +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary rather than escaping through any of the other regimes, and the label says so. When you see this label, read `diagnostics['roche']` for the two radii and `diagnostics['bolometric']` for the rate that won: the label names the branch that won the rate comparison, and on a marginal case that branch can be the bolometric residual carrying a rate that is negligible in absolute terms. + +--- + +## Step 5: read the diagnostics + +Every call returns 17 diagnostic groups, and none of them gates anything: the dispatch control flow never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. + +The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. + +**Which branch, and how close was the switch?** + +```python +kn = result.diagnostics['knudsen'] +kn['kn_sc'], kn['threshold_applied'], kn['counterfactual_labels'] +# 0.03003, 1, {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} +``` + +A Knudsen number of 0.03 against a threshold of 1 is a wind by a factor of 30, and the counterfactuals confirm the verdict survives both edges of the band. A value within a factor of a few of the threshold, or counterfactuals that disagree, means the label is a choice and not a measurement. + +**What set the rate?** + +```python +hy = result.diagnostics['hydrodynamic'] +hy['mdot_el'], hy['mdot_rr'], hy['selection_mechanism'], hy['T_wind'] +# 2.348e+06, 1.148e+07, 'EL-selected', 8431.0 +``` + +Both candidates are always computed, so you can see the margin. `selection_mechanism` matters more than it looks: the minimum can select the recombination-limited rate two physically different ways, through genuine recombination saturation or through plain barometric suppression between the wind base and the sonic point, and calling the second one recombination-limited would be a category error. The mechanism string distinguishes them. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical 10 000 K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. + +**Could the heating drive the flow at all?** + +```python +result.diagnostics['johnson_q']['q_net_over_qc'] # 10.1 +``` + +The transonic energy criterion[^johnson] compares the absorbed, efficiency-degraded power against the power needed to sustain a transonic outflow. A ratio below 1 says the heating cannot drive the flow sonic no matter what a rate formula returns. At 10.1 there is an order of magnitude in hand. + +**How does this verdict translate into other taxonomies?** + +```python +result.diagnostics['guo_triple'] # lambda_exo 301, lambda_rp 331, lambda_star 304 +result.diagnostics['potential_screens'] # log potential 11.796, verdict 'wind' +result.diagnostics['erkaev_tc_K'] # tidally corrected critical exobase temperature +``` + +Different papers classify escape with different quantities. Reporting the Jeans-parameter triple and the threshold-potential screens beside the label lets a reader who thinks in one taxonomy check the verdict in theirs. + +**Is the snapshot self-consistent?** + +```python +result.diagnostics['fluid_check'] # worst_kn 0.124 over 120 levels, fluid True +result.diagnostics['self_consistency'] # empties in 6.95e+04 yr against 1.00e+08 yr +result.diagnostics['tang_timescale'] # boil-off termination timescales +``` + +The fluid condition has to hold everywhere below the sonic surface, not only at it, so the check walks the profile levels and reports the worst local Knudsen number, declaring the truncation at the profile top. The consistency screen is the sharp one here: at 2.3e6 kg s⁻¹ this planet empties one Earth atmosphere in 70 000 years, against the 100 Myr age supplied with the state. The state is not wrong, but it cannot have persisted, and a static grid point that fails this screen is telling you the grid, not the code, needs a second look. + +**Where was the wind launched, and where did the coefficients come from?** + +```python +result.diagnostics['base_level'] # p 3.312e-03 Pa, physical target the same, no clamp +result.diagnostics['knudsen']['provenance'] # {'C': 'laricchiuta', 'O': 'laricchiuta'} +``` + +Collision cross sections come from a provenance ladder, from tabulated collision integrals down to a geometric hard sphere whose bias is documented. The provenance travels with the result, so a rate that rests on the last rung says so. + +--- + +## Step 6: turn the knobs + +Four settings move a boundary rather than just a rate. All of them are in the [parameter reference](../Reference/parameters.md); what follows is what each one does to the answer. + +**The collisionality threshold, across its band.** Bisect the wind boundary at each edge instead of guessing: + +```text +kn_crit 0.1: wind sets in at F_xuv = 2.639 W m-2 +kn_crit 1.0: wind sets in at F_xuv = 0.7695 W m-2 +kn_crit 3.0: wind sets in at F_xuv = 0.6118 W m-2 +``` + +A factor of 4.3 in boundary position, from a criterion whose own range is a factor of 30. That number is a result, not an error bar to hide: quote a regime boundary with it. + +**The exobase temperature.** The hydrostatic branch prescribes it, default 1000 K, and the Jeans flux depends on it exponentially, so it is the branch's dominant sensitivity. The lesson is sharper on a planet where hydrostatic escape does physical work: a Mars-mass planet whose carbon dioxide carries one percent hydrogen. + +```text +T_exo 500 K: hydrostatic rate 3.2861e+02 kg/s, H 3.286e+02, C 1.091e-24 +T_exo 1000 K: hydrostatic rate 3.5941e+02 kg/s, H 3.594e+02, C 7.672e-10 +T_exo 2000 K: hydrostatic rate 3.6912e+02 kg/s, H 3.690e+02, C 3.475e-02 +``` + +Over a factor of four in temperature the bulk rate moves by 12 percent while the carbon rate moves by 22 orders of magnitude. The reason is in the per-species detail: hydrogen sits at an exobase Jeans parameter of 1.59 with a Jeans flux of 5.4e15 against a diffusion-limited supply of 2.7e14, so its escape is set by how fast diffusion resupplies it through the heavy background and the exobase temperature barely enters. Carbon and oxygen are Jeans limited and carry the whole exponential. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. + +**Fractionation.** A confirmed wind partitions over species through the closure; anything else splits by reservoir mass fractions. + +```text +closure C 0.2815, O 0.7185 +reservoir mass fractions C 0.2729, O 0.7271 +``` + +A three percent shift, with the lighter element enriched, which is the right size for a well-coupled heavy wind and a reminder that a per-species output is sometimes a bulk split wearing a per-species shape. Where fractionation is strong, this comparison is the whole story of how the atmospheric mean molecular weight evolves. + +**The efficiency.** Sweeping the energy-limited efficiency across its literature range moves the rate linearly and can move the sub-label: + +```text +epsilon 0.10: hydrodynamic:EL rate 2.3477e+06 (EL 2.348e+06, RR 1.148e+07) +epsilon 0.60: hydrodynamic:RR rate 1.1476e+07 (EL 1.409e+07, RR 1.148e+07) +``` + +At 0.6 the energy-limited candidate overtakes the recombination-limited one and the label changes without the physics of the wind changing at all: the minimum switched hands, nothing else. The fitted-efficiency option returns 0.791 for this planet with `caldiroli_out_of_box` raised, because a one Earth-mass planet sits below the gravitational potential range the fit was made on[^caldiroli]. That is the guard working. Take the flag seriously rather than the number. + +**One more, for evolutionary use.** Supply the previous label and a hysteresis window opens around the threshold, so a time-stepping track cannot chatter between branches on numerical noise: + +```text +F_xuv 0.747, previously None -> hydrostatic (Kn_sc 1.124, threshold 1) +F_xuv 0.747, previously hydrodynamic:EL -> hydrodynamic:EL (Kn_sc 1.124, threshold 1.5) +F_xuv 0.793, previously None -> hydrodynamic:EL (Kn_sc 0.898, threshold 1) +F_xuv 0.793, previously hydrostatic -> hydrostatic (Kn_sc 0.898, threshold 0.667) +``` + +Inside the window the previous label wins, in both directions, and the applied threshold in the diagnostics tells you when the memory was in use. + +--- + +## Step 7: dispatch along a stellar history + +Nothing so far needed a star with a history. Load one, derive the XUV and bolometric fluxes from its track, and dispatch the same frozen atmosphere at each age: + +```python +star = mors.Star(Mstar=1.0, Omega=1.0) +f_xuv = (star.Tracks['Lx'] + star.Tracks['Leuv']) * 1e-7 / (4 * np.pi * a**2) +l_bol = star.Tracks['Lbol'] * 1e-7 +``` + +!!! warning "This is a sequence of snapshots, not an evolution" + The profile does not change along the track. A real planet's structure responds to the loss, to its own cooling, and to the star, so treat what follows as the same atmosphere asked the same question at many stellar ages. The framework is not wired into the coupled loop yet; see [coupling to PROTEUS](../Explanations/proteus.md) for the status. + +For a one Earth-mass planet at 0.2 au, carbon dioxide with one percent hydrogen, and an inventory of 100 Earth atmospheres: + +```text + age [Myr] F_xuv regime rate [kg/s] Kn_sc snapshot + 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 consistent + 45.0 1.62 hydrodynamic:EL 3.542e+05 0.265 consistent + 310.1 1.4 hydrodynamic:EL 3.045e+05 0.388 inconsistent + 1138.9 0.852 hydrostatic 4.695e-02 4.81 consistent + 3039.5 0.495 hydrostatic 4.695e-02 6.73e+03 consistent + 9439.6 0.324 hydrostatic 4.695e-02 4.83e+07 consistent +label changes from hydrodynamic:EL to hydrostatic between 767 and 939 Myr, +and the rate drops from 2.273e+05 to 4.695e-02 kg/s +``` + +Four things in that table are worth more than the rest of this page. + +The label belongs to the state, not to the planet. Nothing about the planet changed; the star quieted down, the Knudsen number climbed smoothly through its threshold, and the physics of the loss changed character. + +The rate drops by seven orders of magnitude at the crossing. The switch is deliberately sharp, with no blend function between branches, so the size of that jump is a measurement you can quote rather than an artifact a smoothing function hides. It is also the honest scale of the disagreement between the two prescriptions at the same physical state. + +What escapes changes with the branch. In the wind phase carbon and oxygen leave with the hydrogen; in the exosphere phase hydrogen leaves alone, and the heavy elements are pinned at 1e-140 kg s⁻¹. A planet crossing this boundary stops losing its atmosphere and starts losing only its hydrogen. + +The hydrostatic rate is flat, at 4.695e-02 kg s⁻¹ for ten billion years, because the branch has no XUV physics in it: prescribed exobase temperature, frozen profile, and diffusion-limited supply that does not know about the star. That flat line is a visible reminder of what the branch does not model. It is also why hydrostatic heavy-element rates carry a lower-limit flag: the nonthermal channels that actually remove heavy species from a real exosphere are absent. + +And the consistency screen fires in the middle of the track, not at the ends. Between about 40 and 800 Myr the dispatched rate would have emptied the supplied inventory faster than the star aged, so those snapshots are not compatible with their own ages. After the crossing the screen goes quiet again, but read that carefully: the state became consistent because escape effectively stopped, not because the inventory survived. + +--- + +## Things to try + +- **Move the planet.** Run the track at 0.1 and at 0.4 au. The crossing age moves; find where the planet never leaves the wind regime within the age of the star. +- **Change the composition at fixed mass and radius.** Add water instead of hydrogen, or drop the hydrogen entirely, and watch both the boundary position and the post-crossing rate respond. +- **Sweep the exobase temperature on a heavy atmosphere.** Confirm for yourself that a pure carbon dioxide planet returns rates far below the floor at every temperature in the range, and that the boundary between "computed" and "meaningful" is where the floor sits. +- **Print the whole container.** `pprint(result.diagnostics)` on one call, and read the groups this page skipped: `bolometric`, `thermostat`, `closure`, and `documentation`, which carries the criterion bands themselves so a stored result is self-describing. +- **Break a state on purpose.** Give the profile an increasing pressure or a negative mass and confirm the `ValueError`, so you know what a malformed state looks like as opposed to an extreme one. + +## Where to go next + +- [Escape regimes](../Explanations/regimes.md): every branch, threshold, and equation behind this page. +- [Dispatch results](../Reference/results.md): every flag and every diagnostics key. +- [Triage a verdict](../How-to/triage_verdict.md): a flag fired, or the answer looks wrong. +- [Model parameters](../Reference/parameters.md): every setting and input, with defaults. +- [Limitations](../Explanations/limitations.md): what none of this models. + +--- + +[^johnson]: Johnson, R. E., Volkov, A. N., & Erwin, J. T. (2013). Molecular-Kinetic Simulations of Escape from the Ex-planet and Exoplanets: Criterion for Transonic Flow. *The Astrophysical Journal Letters, 768*(1), L4. https://doi.org/10.1088/2041-8205/768/1/L4 + +[^yelle]: Yelle, R. V. (2024). Diffusion limited escape of hydrogen from Mars. *Icarus, 416*, 116099. + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 diff --git a/docs/Tutorials/first_run.md b/docs/Tutorials/first_run.md index 9e164f09..402191f0 100644 --- a/docs/Tutorials/first_run.md +++ b/docs/Tutorials/first_run.md @@ -165,6 +165,7 @@ Re-running produces a curve that is roughly $(1/0.05)^2 = 400$ times higher than Things to try from here: +- **Classify the regime**: everything above applies one prescription unconditionally. The [dispatcher tutorial](dispatch.md) runs the full framework instead, which decides which escape physics a state is in before it picks a rate. - **Sweep $\epsilon$**: loop `epsilon` over `[0.1, 0.3, 0.5, 1.0]` and plot all four curves on the same axes. - **Sweep semi-major axis**: keep $\epsilon = 0.15$ fixed and try `[0.05, 0.1, 0.5, 1.0]` au. The integral of each curve over the stellar lifetime gives the total atmospheric mass lost; compare it to one Earth atmosphere ($M_\mathrm{atm,\oplus} \approx 5.15 \times 10^{18}$ kg, available as `Me_atm`). - **Vary $R_\mathrm{XUV}$**: try `Rxuv = 1.5 * Re` to see how an extended XUV-absorbing region amplifies the mass-loss rate. diff --git a/docs/assets/dispatcher_regime_sweep.png b/docs/assets/dispatcher_regime_sweep.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0af9a1c663d1c6cdcfb05e36cf1d4a0fa90b8d GIT binary patch literal 243900 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�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�&$&`S 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 → [Using ZEPHYRUS](Tutorials/first_run.md) +3. **Classify the escape regime** + Dispatch a planetary state to the physics that governs its mass loss.
+ → [Dispatching a regime](Tutorials/dispatch.md) + --- ## What do you want to do? @@ -30,6 +34,14 @@ Here is the quickest path to getting started: [Go to tutorial](Tutorials/first_run.md) +- :material-compass-outline: **Classify a regime** + + [Go to the dispatcher tutorial](Tutorials/dispatch.md) + +- :material-stethoscope: **Diagnose a verdict** + + [Go to the triage guide](How-to/triage_verdict.md) + - :material-library: **Understand the model** [Go to model overview](Explanations/model.md) diff --git a/mkdocs.yml b/mkdocs.yml index af6cd81e..9f52dd8e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,11 +12,13 @@ nav: - How-to guides: - Installation: How-to/installation.md + - Triage a verdict: How-to/triage_verdict.md - Run tests: How-to/run_tests.md - Build documentation: How-to/documentation.md - Tutorials: - First run: Tutorials/first_run.md + - Dispatching a regime: Tutorials/dispatch.md - Explanations: - The ZEPHYRUS model: Explanations/model.md @@ -30,6 +32,7 @@ nav: - Reference: - Model parameters: Reference/parameters.md + - Dispatch results: Reference/results.md - API reference: - Overview: Reference/api/index.md - Escape: Reference/api/escape.md From 74e8005ab07719bf5462cc494a1ac78c520308d6 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 22:12:20 +0200 Subject: [PATCH 022/113] Pin the example output the docs quote The example tests exercise the shipped script's own entry points: the regime sequence of the documented flux sweep, the per-species closure on both the fractionating and the hydrostatic path, the zero-flux limit, the error contract on a malformed state, the bisection that produces the boundary fluxes the tutorial quotes, and the label change along a stellar history with the stellar lookup mocked. The dispatcher test now pins the unclamped base pressure the diagnostics report, and both rule files record the naming exception this file takes. --- .github/.claude/rules/zephyrus-tests.md | 1 + .github/copilot-instructions.md | 4 +- docs/Tutorials/dispatch.md | 4 +- tests/test_dispatcher.py | 15 +- tests/test_examples.py | 199 ++++++++++++++++++++++++ 5 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 tests/test_examples.py diff --git a/.github/.claude/rules/zephyrus-tests.md b/.github/.claude/rules/zephyrus-tests.md index cd399e88..6461bcf6 100644 --- a/.github/.claude/rules/zephyrus-tests.md +++ b/.github/.claude/rules/zephyrus-tests.md @@ -307,6 +307,7 @@ Write the OUTCOME (what the test verifies; what the PR achieves) never the PROCE - Test file names mirror source 1:1: `src/zephyrus/.py` -> `tests/test_.py`. Documented exceptions to the 1:1 rule: - **Cross-cutting coupling tests** (`test_mors_coupling.py`, `test_earth.py`): regressions that span the MORS flux hand-off and the escape formula rather than a single source file. `test_mors_coupling.py` mocks the stellar-luminosity lookup so the coupling recipe runs in the fast `unit` tier without a download; `test_earth.py` performs a real MORS lookup end to end and carries the `integration` tier. - **Property-based companion** (`test_escape_properties.py`): the Hypothesis-driven sweeps for `escape.py`. They sit in their own module so the `pytest.importorskip('hypothesis')` gate covers only the property tests, leaving the closed-form pins and error-contract guards in `test_escape.py` running when the develop-extra dependency is absent. + - **Shipped examples** (`test_examples.py`): the scripts under `examples/` and the documentation pages that quote their output. The tests import an example module by path and exercise its own entry points, so a physics change that moves a documented result fails CI instead of leaving a stale number on a docs page. They carry the `smoke` tier because they run the real dispatch path, and they mock the stellar lookup, because the PR job does not have the MORS tracks. When adding an example, extend this file rather than creating a per-example test module. --- diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 078d1496..a1da6809 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -153,7 +153,7 @@ pre-commit install -f - `diagnostics.py` - Regime diagnostics reported beside every verdict (physics) - `dispatcher.py` - The escape-regime dispatcher assembling the branches (physics) -- `tests/` - Test suite. Each physics source has a 1:1 test file at `tests/test_.py`. Cross-cutting or coupling regression tests (e.g. `test_earth.py`) are the exception. +- `tests/` - Test suite. Each physics source has a 1:1 test file at `tests/test_.py`. Cross-cutting or coupling regression tests (e.g. `test_earth.py`) and the shipped-example tests (`test_examples.py`) are the exception. - `tools/` - Build / utility scripts - `check_test_quality.py` - AST linter (blocking on PRs) @@ -190,7 +190,7 @@ ZEPHYRUS is scientific simulation code, so the test suite is held to physics-gra ### Structure -- Tests mirror source 1:1: `src/zephyrus/.py` -> `tests/test_.py`. Cross-cutting or coupling regression tests (e.g. `test_earth.py`) are the exception, not the rule. +- Tests mirror source 1:1: `src/zephyrus/.py` -> `tests/test_.py`. Cross-cutting or coupling regression tests (e.g. `test_earth.py`) and the shipped-example tests (`test_examples.py`, which pin the numbers the docs quote) are the exception, not the rule. - Framework: `pytest` exclusively in the `tests/` directory. ### Markers and the module-level marker rule diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 1989cddf..ba9d7da4 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -26,7 +26,7 @@ mkdir -p output python examples/demo_dispatcher/demo_dispatcher.py ``` -It prints a table per step and takes about a minute, most of which is the boundary bisections. Every step is a function that returns its results, so you can import one at a time: +It prints a table per step and runs in a few seconds, most of which is the boundary bisections. Every step is a function that returns its results, so you can import one at a time: ```python from examples.demo_dispatcher.demo_dispatcher import flux_sweep, read_diagnostics @@ -323,7 +323,7 @@ Four things in that table are worth more than the rest of this page. The label belongs to the state, not to the planet. Nothing about the planet changed; the star quieted down, the Knudsen number climbed smoothly through its threshold, and the physics of the loss changed character. -The rate drops by seven orders of magnitude at the crossing. The switch is deliberately sharp, with no blend function between branches, so the size of that jump is a measurement you can quote rather than an artifact a smoothing function hides. It is also the honest scale of the disagreement between the two prescriptions at the same physical state. +The rate drops by almost seven orders of magnitude at the crossing. The switch is deliberately sharp, with no blend function between branches, so the size of that jump is a measurement you can quote rather than an artifact a smoothing function hides. It is also the honest scale of the disagreement between the two prescriptions at the same physical state. What escapes changes with the branch. In the wind phase carbon and oxygen leave with the hydrogen; in the exosphere phase hydrogen leaves alone, and the heavy elements are pinned at 1e-140 kg s⁻¹. A planet crossing this boundary stops losing its atmosphere and starts losing only its hydrogen. diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 4f620161..56d23ec6 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -276,12 +276,22 @@ def test_base_out_of_range_extend_mode(): the top: the default policy clamps (flagged, with the distance in decades); the extend policy evaluates the base on the extended upper structure instead, replacing the clamp flag with ``base_extended`` and - placing the base at a lower pressure than the profile top. + placing the base at a lower pressure than the profile top. Either way + the diagnostics report the pressure the base method asked for before + any clamp, which is the only place that quantity is available. """ inp_clamp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2) res_clamp = dispatch(inp_clamp) assert res_clamp.flags.get('base_clamped') is True assert res_clamp.flags['base_clamp_decades'] > 0.0 + # The clamped base sits at the profile top, above its own target, and + # the recorded distance is the gap between the two. A diagnostic that + # echoed the clamped level instead would give a zero distance here. + base_clamp = res_clamp.diagnostics['base_level'] + assert base_clamp['p_Pa'] == pytest.approx(1e-2, rel=1e-9) + assert base_clamp['p_physical_Pa'] < base_clamp['p_Pa'] + decades = np.log10(base_clamp['p_Pa'] / base_clamp['p_physical_Pa']) + assert decades == pytest.approx(res_clamp.flags['base_clamp_decades'], rel=1e-9) settings = DispatchSettings(base_out_of_range='extend') inp_ext = _inputs( 5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2, settings=settings @@ -290,6 +300,9 @@ def test_base_out_of_range_extend_mode(): assert res_ext.flags.get('base_extended') is True assert 'base_clamped' not in res_ext.flags assert res_ext.diagnostics['base_level']['p_Pa'] < 1e-2 + # On the extension the base reaches its target, so the two agree. + base_ext = res_ext.diagnostics['base_level'] + assert base_ext['p_physical_Pa'] == pytest.approx(base_ext['p_Pa'], rel=1e-9) def test_fractionation_toggle_and_split_protocol(): diff --git a/tests/test_examples.py b/tests/test_examples.py new file mode 100644 index 00000000..541814de --- /dev/null +++ b/tests/test_examples.py @@ -0,0 +1,199 @@ +"""Tests for the shipped examples under examples/. + +Cross-cutting by design: an example is a script plus the documentation page +that quotes its output, so these tests exercise the example's own entry +points and pin the results the pages state. What they guard is the regime +sequence of the flux sweep, the per-species closure that the coupled path +relies on, the limit behavior at zero XUV flux, the error contract on a +malformed state, and the label change along a stellar history with the +stellar lookup mocked. + +Tier: smoke, because these run the real dispatch path end to end rather +than a mocked one. See docs/How-to/run_tests.md. +""" + +from __future__ import annotations + +import importlib.util +import math +from pathlib import Path +from unittest.mock import patch + +import numpy as np +import pytest + +from zephyrus.dispatcher import dispatch + +pytestmark = [pytest.mark.smoke, pytest.mark.timeout(60)] + +_EXAMPLE = ( + Path(__file__).resolve().parents[1] / 'examples' / 'demo_dispatcher' / 'demo_dispatcher.py' +) + + +def _load_example(): + """Import the example module from its path, without a package.""" + spec = importlib.util.spec_from_file_location('demo_dispatcher', _EXAMPLE) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def _fake_star(n: int = 12): + """A stand-in for a MORS star with a plausible declining XUV history. + + Saturated for the first few samples then decaying as a power law, with + a bolometric luminosity of order solar: the shape matters here, because + a constant history could not produce a regime change and a zero one + would hide a dilution error. + """ + age = np.logspace(0, 4, n) # Myr + l_x = 1.0e30 * np.minimum(1.0, (age / 30.0) ** -1.5) # erg/s + l_euv = 2.0 * l_x + l_bol = np.full(n, 3.828e33) # erg/s, one solar luminosity + + class Star: + Tracks = {'Age': age, 'Lx': l_x, 'Leuv': l_euv, 'Lbol': l_bol} + + return Star() + + +@pytest.mark.physics_invariant +def test_dispatcher_example_sweep_crosses_two_boundaries(): + """The documented flux sweep crosses both boundaries, in order. + + The tutorial states that the carbon dioxide planet is hydrostatic at + the bottom of the swept range, energy limited in the middle, and + recombination limited at the top. Pin that ordering, the closure of the + per-species split, and the monotonicity of the rate inside the wind. + """ + example = _load_example() + rows = example.flux_sweep('CO2') + labels = [row['regime'] for row in rows] + + # The two edges of the swept range are the two extreme regimes. + assert labels[0] == 'hydrostatic' + assert labels[-1] == 'hydrodynamic:RR' + # Every label seen is one the framework declares, and the sweep visits + # all three in order: hydrostatic, then EL, then RR, with no return. + ordered = [label for i, label in enumerate(labels) if i == 0 or label != labels[i - 1]] + assert ordered == ['hydrostatic', 'hydrodynamic:EL', 'hydrodynamic:RR'] + # Inside the wind the rate rises with the flux; a sign or exponent slip + # in the energy-limited chain would break the ordering. + wind = [row for row in rows if row['regime'].startswith('hydrodynamic')] + assert len(wind) > 10 + assert all(b['mdot'] > a['mdot'] for a, b in zip(wind[:-1], wind[1:])) + # The hydrostatic corner is below the reporting floor, which is the + # tutorial's point about a computed rate that is not a physical one. + assert rows[0]['mdot'] < example.RATE_FLOOR + assert not rows[0]['above_floor'] + + +@pytest.mark.physics_invariant +def test_dispatcher_example_verdict_closes_and_respects_limits(): + """The per-species split closes, and zero XUV flux drives no wind. + + Mass closure over the per-species rates is the contract a coupled run + depends on when it debits element inventories. The zero-flux limit is + the input edge case: with no XUV heating there is no wind to sustain, + so the state falls to the hydrostatic branch and the rate drops far + below the reporting floor. + """ + example = _load_example() + result = dispatch(example.build_state('CO2', 1.0, 1.0, 10.0)) + total = sum(result.per_species.values()) + assert total == pytest.approx(result.mdot, rel=1e-12) + # Scale guard: the wind rate on this planet is of order 1e6 kg/s, not + # 1e0 (a dropped geometric factor) or 1e12 (a cgs slip). + assert 1.0e5 < result.mdot < 1.0e8 + assert result.regime == 'hydrodynamic:EL' + # A clean call reports no flags at all. + assert result.flags == {} + + quiet = dispatch(example.build_state('CO2', 1.0, 1.0, 0.0)) + assert quiet.regime == 'hydrostatic' + assert quiet.mdot < example.RATE_FLOOR + assert quiet.mdot >= 0.0 + # The closure holds on the hydrostatic branch too, where the split comes + # from the branch itself rather than from the fractionation solver. + assert sum(quiet.per_species.values()) == pytest.approx(quiet.mdot, rel=1e-12) + + +@pytest.mark.physics_invariant +def test_dispatcher_example_boundary_bisection_brackets_a_label_change(): + """The bisected boundary flux has different labels on either side. + + The documentation quotes boundary fluxes from this bisection, so the + property that matters is that the returned flux is a boundary at all: + a bisection that returned an endpoint, or converged on the wrong side, + would put the same label on both sides. + """ + example = _load_example() + flux = example.boundary_flux('CO2', 0.1, 10.0) + below = dispatch(example.build_state('CO2', 1.0, 1.0, flux * 0.9)).regime + above = dispatch(example.build_state('CO2', 1.0, 1.0, flux * 1.1)).regime + assert below != above + assert (below, above) == ('hydrostatic', 'hydrodynamic:EL') + # The boundary lies strictly inside the bracket it was given, so a + # bisection that fell back to an endpoint fails here. + assert 0.1 < flux < 10.0 + # The band edges come back in threshold order, 3 first then 0.1. The + # stricter threshold (0.1) demands a denser sonic point, so it needs + # more flux to call a wind: the band is ordered, not just wide. A + # swapped or shared threshold would collapse this to equality. + at_kn3, at_kn0p1 = example.boundary_band('CO2') + assert at_kn0p1 > at_kn3 + assert at_kn0p1 / at_kn3 > 1.5 + assert at_kn3 < flux < at_kn0p1 + + +def test_dispatcher_example_rejects_a_malformed_state(): + """A malformed state raises, and returns nothing. + + The framework reserves exceptions for input that is not physically + posed. An eccentricity of one is outside the documented domain, so the + call must raise rather than dispatch something. + """ + example = _load_example() + state = example.build_state('CO2', 1.0, 1.0, 10.0) + state.e = 1.0 + with pytest.raises(ValueError, match='e must be in'): + dispatch(state) + # A negative flux is rejected on the same contract, and the valid + # state either side of these edits still dispatches. + state.e = 0.0 + state.F_xuv = -1.0 + with pytest.raises(ValueError, match='F_xuv'): + dispatch(state) + state.F_xuv = 10.0 + assert dispatch(state).regime == 'hydrodynamic:EL' + + +@pytest.mark.physics_invariant +def test_dispatcher_example_track_changes_regime_as_the_star_quiets(): + """Along a declining XUV history the label changes once, downward. + + With the stellar lookup mocked, the same frozen atmosphere is + dispatched at each age. The physical content is that the label belongs + to the state: a decaying flux drives the state out of the wind regime, + and the rate falls with it. A dilution or unit slip in the flux + conversion would leave the label fixed for the whole track. + """ + example = _load_example() + with patch('mors.Star', return_value=_fake_star()): + rows = example.stellar_track(n_samples=12) + + labels = [row['regime'] for row in rows] + assert labels[0] == 'hydrodynamic:EL' + assert labels[-1] == 'hydrostatic' + changes = sum(1 for a, b in zip(labels[:-1], labels[1:]) if a != b) + assert changes == 1 + # The flux declines and so does the rate, by orders of magnitude across + # the crossing rather than by a small step. + assert rows[0]['F_xuv'] > 10.0 * rows[-1]['F_xuv'] + assert rows[0]['mdot'] > 1.0e6 * rows[-1]['mdot'] + # After the crossing the hydrostatic rate is flux independent, because + # that branch carries no XUV physics: the last two samples agree. + tail = [row['mdot'] for row in rows if row['regime'] == 'hydrostatic'] + assert tail[-1] == pytest.approx(tail[0], rel=1e-12) + assert all(math.isfinite(row['mdot']) for row in rows) From 9731510a533dcea0b926d0ea7ef349aa91ac796f Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 22:15:11 +0200 Subject: [PATCH 023/113] State the diagnostics group count per branch --- docs/Tutorials/dispatch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index ba9d7da4..a6fbe081 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -174,7 +174,7 @@ The flow radius of the winning branch now exceeds the Hill radius, so the atmosp ## Step 5: read the diagnostics -Every call returns 17 diagnostic groups, and none of them gates anything: the dispatch control flow never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns sixteen or seventeen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch control flow never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. From 1b34dc6c70a4648bd606a499b254449efe7b1735 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 21 Aug 2026 23:07:10 +0200 Subject: [PATCH 024/113] Keep the dominant species out of the flags The hydrostatic branch already reports its dominant species, the one that supplies itself with no diffusion cap, in the diagnostics detail, so the duplicate flag carried no information a caller could not read there. Its test now asserts the diagnostics field and that the bypass applies to that species alone. The figures the shipped examples write are ignored, since both tutorials ask a reader to create that directory in the repository root. --- .gitignore | 4 ++++ docs/How-to/triage_verdict.md | 2 +- docs/Reference/results.md | 5 ++--- src/zephyrus/hydrostatic.py | 4 ++-- tests/test_hydrostatic.py | 8 ++++++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 8b73324b..59fdaa58 100644 --- a/.gitignore +++ b/.gitignore @@ -166,6 +166,10 @@ src/zephyrus/_version.py # Verification and diagnostic artifacts (plots, raw data, plot scripts) output_files/ +# Figures the shipped examples write, which the tutorials ask readers to +# create in the repository root +output/ + # Local editor and session state (personal, not shared) /.claude/ .mcp.json diff --git a/docs/How-to/triage_verdict.md b/docs/How-to/triage_verdict.md index c7fa4795..220ad447 100644 --- a/docs/How-to/triage_verdict.md +++ b/docs/How-to/triage_verdict.md @@ -21,7 +21,7 @@ Start with the two questions that dispose of most surprises: **Symptom.** A hydrostatic verdict whose rate is insensitive to `T_exo_value`, against the documented exponential sensitivity. -**Cause.** The species carrying the rate is supply limited, not Jeans limited. Compare `phi_jeans` against `phi_diffusion` in `diagnostics['hydrostatic']['detail']['species'][name]`: when the diffusion-limited supply is the smaller of the two, the harmonic mean of the two sits near the supply and the exobase temperature has little left to do. +**Cause.** The species carrying the rate is supply limited, not Jeans limited. The species that carries no cap at all is `diagnostics['hydrostatic']['detail']['dominant']`, which supplies itself. Compare `phi_jeans` against `phi_diffusion` in `diagnostics['hydrostatic']['detail']['species'][name]`: when the diffusion-limited supply is the smaller of the two, the harmonic mean of the two sits near the supply and the exobase temperature has little left to do. **What to do.** Nothing, but do not report the insensitivity as a general property of the branch: the heavy species in the same result will be moving by orders of magnitude over the same temperature range. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index da9ffa3a..61335c7a 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -34,7 +34,7 @@ A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanati ## Flags -The flags dictionary is a warning set: every entry means something happened that you should know about, and a result with nothing to report carries an empty dictionary. Most entries are `True`; six carry a value instead, because the warning is more useful with its magnitude attached (`base_clamp_decades`, `base_method_fallback`, `dl_bypass`, `roche_subflag`, `rock_former_bij`, `thermostat_clamped`). Quantities that merely describe a call, rather than warning about it, live in the diagnostics instead. +The flags dictionary is a warning set: every entry means something happened that you should know about, and a result with nothing to report carries an empty dictionary. Most entries are `True`; five carry a value instead, because the warning is more useful with its magnitude attached (`base_clamp_decades`, `base_method_fallback`, `roche_subflag`, `rock_former_bij`, `thermostat_clamped`). Quantities that merely describe a call, rather than warning about it, live in the diagnostics instead. The `effect` column says whether the returned rate already reflects the flag or whether the flag reports only. @@ -69,7 +69,6 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| | `hydrostatic_lower_limit` | `True` | Always set on this branch: the nonthermal channels that dominate heavy-species loss from real exospheres are not modeled, so heavy-element rates are lower limits. | Reporting only | -| `dl_bypass` | species | The dominant species, which supplies itself and takes the Jeans flux with no diffusion cap. | Reporting only | | `volkov_extrapolated` | `True` | A species sits above the Jeans parameter of 15 where the kinetic enhancement factor was measured, so the factor was held constant. | The rate reflects it | | `exobase_not_reached` | `True` | The extended structure never reaches the level where the mean free path equals the scale height, so its top level was used as the exobase. | The rate reflects it | | `exobase_at_anchor` | `True` | The exobase landed on the profile top itself; one integration interval was kept so the supply integrals exist. | The rate reflects it | @@ -96,7 +95,7 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won and by what mechanism, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). | -| `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, and per-species Jeans and diffusion fluxes in `detail['species']`. | +| `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | | `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index e3474d89..1560df38 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -200,7 +200,8 @@ def hydrostatic_rates( dominates the branch on many-species profiles. Returns ``(per_element, detail)``; the detail dict carries the exobase - state, both escape temperatures, the per-species terms, coefficient + state, both escape temperatures, the ``dominant`` species that supplies + itself without a diffusion cap, the per-species terms, coefficient provenance, and flags (including ``hydrostatic_lower_limit``, which is always on: non-thermal loss channels are absent). """ @@ -292,7 +293,6 @@ def hydrostatic_rates( for el, cnt in counts.items(): per_element[el] = per_element.get(el, 0.0) + rate * (cnt * ELEMENT_AMU[el] / m_sp) - flags['dl_bypass'] = dominant flags['hydrostatic_lower_limit'] = True t_esc_neutral = G * M_p * m_bar / (2.0 * kb * r_x) diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index aa85cd03..dd0b2708 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -193,16 +193,20 @@ def test_element_mapping_conserves_mass_and_dominant_bypass(): Stoichiometric mapping conserves the total mass rate exactly. The dominant species (CO2 here) has no diffusion-limited supply cap: it supplies itself, so its diffusion flux is infinite and the bypass is - recorded. + recorded against that species and no other. """ prof = _mars_profile() per_el, det = hydrostatic_rates(prof, M_MARS, 300.0) assert sum(per_el.values()) == pytest.approx( sum(det['per_species_rate'].values()), rel=1e-9 ) - assert det['flags']['dl_bypass'] == 'CO2' + # The dominant species is the most abundant one at the exobase, and it + # is the only one whose supply cap is bypassed. + assert det['dominant'] == 'CO2' + assert det['species']['CO2']['dl_bypass'] is True assert math.isinf(det['species']['CO2']['phi_diffusion']) assert det['species']['H']['dl_bypass'] is False + assert math.isfinite(det['species']['H']['phi_diffusion']) # The CO2 mass rate splits onto C and O in stoichiometric proportion. rate_co2 = det['per_species_rate']['CO2'] assert per_el['C'] + per_el['O'] + per_el['H'] == pytest.approx( From b989dc36028b7417044354d6ed9d805aec5c1db3 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 00:57:56 +0200 Subject: [PATCH 025/113] Render the mermaid diagrams on the docs site The site builder emits a mermaid fence as a code block and no build step loaded the library, so the decision flowchart on the model page reached readers as diagram source. The library now loads beside MathJax, and a small script turns those blocks into rendered diagrams, matching the viewer's light or dark scheme. Without the library the page keeps the code block and stays readable. --- docs/javascripts/mermaid.js | 67 +++++++++++++++++++++++++++++++++++++ mkdocs.yml | 4 ++- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 docs/javascripts/mermaid.js diff --git a/docs/javascripts/mermaid.js b/docs/javascripts/mermaid.js new file mode 100644 index 00000000..feabe7e9 --- /dev/null +++ b/docs/javascripts/mermaid.js @@ -0,0 +1,67 @@ +/* Render mermaid diagrams written as fenced code blocks. + * + * The site builder emits a ```mermaid fence as a highlighted code block, so + * the diagram source reaches the page as text. This finds those blocks, + * replaces each with the element mermaid renders into, and runs mermaid + * once. Without the library (offline, or a blocked CDN) the page keeps the + * code block and stays readable. + */ +(function () { + var KEYWORDS = /^\s*(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram(-v2)?|erDiagram|journey|gantt|pie|mindmap|timeline|quadrantChart|gitGraph)\b/; + + function collect() { + // Both selectors can match inside one block, so key on the element + // that gets replaced and keep the first source seen for it. + var seen = new Map(); + document.querySelectorAll('pre code, div.highlight pre').forEach(function (node) { + var text = node.textContent || ''; + if (!KEYWORDS.test(text)) { + return; + } + var host = node.closest('div.highlight') || node.closest('pre'); + if (host && !seen.has(host)) { + seen.set(host, text); + } + }); + return Array.from(seen, function (entry) { + return { host: entry[0], source: entry[1] }; + }); + } + + function darkMode() { + var scheme = document.body.getAttribute('data-md-color-scheme'); + if (scheme) { + return scheme !== 'default'; + } + return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + } + + function render() { + if (typeof window.mermaid === 'undefined') { + return; + } + var blocks = collect(); + if (!blocks.length) { + return; + } + blocks.forEach(function (block) { + var target = document.createElement('pre'); + target.className = 'mermaid'; + target.textContent = block.source; + block.host.replaceWith(target); + }); + window.mermaid.initialize({ + startOnLoad: false, + securityLevel: 'strict', + theme: darkMode() ? 'dark' : 'default', + flowchart: { htmlLabels: true, useMaxWidth: true }, + }); + window.mermaid.run({ querySelector: 'pre.mermaid' }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', render); + } else { + render(); + } +})(); diff --git a/mkdocs.yml b/mkdocs.yml index 9f52dd8e..6a538b67 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,7 +12,7 @@ nav: - How-to guides: - Installation: How-to/installation.md - - Triage a verdict: How-to/triage_verdict.md + - Troubleshooting: How-to/troubleshooting.md - Run tests: How-to/run_tests.md - Build documentation: How-to/documentation.md @@ -170,7 +170,9 @@ markdown_extensions: extra_javascript: - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js + - https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js - javascripts/header-links.js + - javascripts/mermaid.js plugins: - search From ba082147b899a7a101a54b646bb1421806e41908 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 00:58:08 +0200 Subject: [PATCH 026/113] Name the closure multiplier after the shared scale height The closure solves for the one density scale height every escaping gas shares, so the term in the momentum balance is its inverse and reads that way now: 1/Hbar in the module notes and the docs equation, inv_H_bar_cgs in the closure diagnostics, matching the notation of the paper the solver comes from. The results reference gains the closure keys, and the subcritical entry says what the flag means for the rate. --- docs/Explanations/fractionation.md | 4 ++-- docs/Reference/results.md | 8 +++---- src/zephyrus/fractionation.py | 35 ++++++++++++++++-------------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index edadd95f..5041c9b9 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -8,9 +8,9 @@ The classic treatment is the two-species problem of Hunten, Pepin & Walker (1987 The solved system couples the species drift velocities. For each escaping species $j$, the drag exerted by every other species balances its weight surplus, -$$\sum_{i\,\mathrm{escaping}} \frac{X_i\,(w_i - w_j)}{b_{ij}} \;-\; w_j \sum_{k\,\mathrm{retained}} \frac{X_k}{b_{jk}} \;=\; \frac{m_j\, g}{k_\mathrm{B} T} - C \tag{1}$$ +$$\sum_{i\,\mathrm{escaping}} \frac{X_i\,(w_i - w_j)}{b_{ij}} \;-\; w_j \sum_{k\,\mathrm{retained}} \frac{X_k}{b_{jk}} \;=\; \frac{m_j\, g}{k_\mathrm{B} T} - \frac{1}{\bar{H}} \tag{1}$$ -where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale (the number flux is $\Phi_i = X_i w_i$), $b_{ij}$ the binary diffusion parameter of the pair, $m_j$ the particle mass, $g$ the gravity at the wind base, $T$ the wind temperature, and $C$ a common inverse scale height of the escaping gas that all species share. The system closes with the mass constraint that the per-species fluxes carry the bulk rate the regime framework dispatched, $\sum_j m_j X_j \Phi_j = \phi$. +where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale (the number flux is $\Phi_i = X_i w_i$), $b_{ij}$ the binary diffusion parameter of the pair, $m_j$ the particle mass, $g$ the gravity at the wind base, $T$ the wind temperature, and $\bar{H}$ the one density scale height that every escaping gas shares, itself an unknown of the solve rather than an input. The system closes with the mass constraint that the per-species fluxes carry the bulk rate the regime framework dispatched, $\sum_j m_j X_j \Phi_j = \phi$. Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the unique partition into escaping and retained species for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate at machine precision. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 61335c7a..32184aed 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -1,6 +1,6 @@ # Dispatch results -The [parameter reference](parameters.md) documents what goes into `zephyrus.dispatch`. This page documents what comes out: the result fields, every flag the framework can raise, and every group in the diagnostics container. The physics behind each quantity is on the [escape regimes](../Explanations/regimes.md) page, and the [tutorial](../Tutorials/dispatch.md) shows the reading order in practice. For a flag that fired on a result you did not expect, the [triage guide](../How-to/triage_verdict.md) is faster than this page. +The [parameter reference](parameters.md) documents what goes into `zephyrus.dispatch`. This page documents what comes out: the result fields, every flag the framework can raise, and every group in the diagnostics container. The physics behind each quantity is on the [escape regimes](../Explanations/regimes.md) page, and the [tutorial](../Tutorials/dispatch.md) shows the reading order in practice. For a flag that fired on a result you did not expect, the [troubleshooting guide](../How-to/troubleshooting.md) is faster than this page. --- @@ -8,7 +8,7 @@ The [parameter reference](parameters.md) documents what goes into `zephyrus.disp `dispatch` returns an `EscapeResult` with five fields. -| Field | Type | Contract | +| Field | Type | What it guarantees | |---|---|---| | `regime` | str | One of the five labels below. Always set. | | `mdot` | float | Bulk mass-loss rate in kg s⁻¹, finite and non-negative. | @@ -55,7 +55,7 @@ The `effect` column says whether the returned rate already reflects the flag or |---|---|---|---| | `bondi_inflated` | `True` | The launch level sits above the Bondi radius, so the Mach number was capped at one. | The rate reflects it | | `thermostat_clamped` | `'high'` or `'low'` | The heating against cooling balance had no root inside the bracket, so the wind temperature clamped to the nearer edge. A high clamp at a dense base is collisional quenching of the line coolants, not a failure. | The rate reflects it | -| `subcritical_sonic` | `True` | The computed sonic radius fell below the wind base, so it was floored there and the barometric factor dropped. A recombination-limited win under this flag is barometric suppression, not recombination saturation. | The rate reflects it | +| `subcritical_sonic` | `True` | The isothermal sonic radius came out below the wind base (base Jeans parameter under 2), so it was floored at the base and the barometric factor dropped. A recombination-limited win under this flag is a floored placeholder rather than a rate. | The rate reflects it | | `caldiroli_out_of_box` | `True` | The fitted efficiency was evaluated outside the range of gravitational potential and flux it was fitted on. The value is returned as an extrapolation. | The rate reflects it | | `caldiroli_below_flux_bound` | `True` | Below the validity bound of the efficiency fit, where its formulas turn complex. | Rejected | | `efficiency_fallback_fixed` | `True` | The fitted efficiency was unavailable, so the fixed setting was used. | The rate reflects it | @@ -99,7 +99,7 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a | `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | -| `closure` | active set, retained species, multiplier, mass residual, coefficient provenance | How the fractionation closure partitioned a wind, present only on a fractionating hydrodynamic verdict. | +| `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only on a fractionating hydrodynamic verdict. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | | `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide` | The overflow screen in full: which radius was tested and against what. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index 9e1f4351..e4179644 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -24,11 +24,12 @@ # active species j (w_j = Phi_j / X_j the species velocity scale): # # sum_{i active} X_i (w_i - w_j) / b_ij -# - w_j sum_{k retained} X_k / b_jk = m_j g0 / kT - C, +# - w_j sum_{k retained} X_k / b_jk = m_j g0 / kT - 1/Hbar, # # plus the mass constraint sum_j m_j X_j Phi_j... i.e. -# sum_{j active} m_j X_j w_j = phi, with C the common inverse scale height -# of the escaping gas (the Lagrange multiplier of the constraint). The +# sum_{j active} m_j X_j w_j = phi, where Hbar is the one density scale +# height every escaping gas shares, so 1/Hbar is the Lagrange multiplier +# of the mass constraint and is solved for alongside the drifts. The # Karush-Kuhn-Tucker conditions select the active set: active species have # strictly positive w, and retained species satisfy the retention # inequality (the drift the escaping gas would impose on them does not @@ -71,9 +72,9 @@ def _validate_inputs(phi, X, m, T, g0, b): def solve_fixed_active(phi, X, m, T, g0, b, active): """Solve the linear closure on a fixed active set. - Unknowns: ``w_j`` for j in ``active`` and the common inverse scale - height ``C``. Returns ``(w_full, C)`` with ``w = 0`` for retained - species. The single-active case is solved analytically; the general + Unknowns: ``w_j`` for j in ``active`` and the inverse ``1/Hbar`` of the + shared density scale height. Returns ``(w_full, inv_h_bar)`` with + ``w = 0`` for retained species. The single-active case is solved analytically; the general case with two-sided diagonal equilibration, which controls the spread of roughly 25 decades the matrix entries can span between light-species drag terms and heavy-species mass terms. @@ -86,8 +87,8 @@ def solve_fixed_active(phi, X, m, T, g0, b, active): j = act[0] w = np.zeros(len(X)) w[j] = phi / (m[j] * X[j]) - C = m[j] * g0 / kT + w[j] * sum(X[k] / b[j, k] for k in ret) - return w, C + inv_h_bar = m[j] * g0 / kT + w[j] * sum(X[k] / b[j, k] for k in ret) + return w, inv_h_bar mat = np.zeros((na + 1, na + 1)) rhs = np.zeros(na + 1) for row, j in enumerate(act): @@ -100,7 +101,7 @@ def solve_fixed_active(phi, X, m, T, g0, b, active): for k in ret: diag += X[k] / b[j, k] mat[row, row] -= diag - mat[row, na] = 1.0 # the +C column + mat[row, na] = 1.0 # the +1/Hbar column rhs[row] = m[j] * g0 / kT for col, j in enumerate(act): mat[na, col] = m[j] * X[j] @@ -136,14 +137,14 @@ def solve_closure(phi, X, m, T, g0, b, return_diag=False): Symmetric matrix of binary diffusion parameters [cm^-1 s^-1], diagonal ignored (conventionally np.inf). return_diag : bool - When True, also return the multiplier ``C`` and the active set. + When True, also return the multiplier ``1/Hbar`` and the active set. Returns ------- Phi : array Number fluxes [cm^-2 s^-1], guaranteed non-negative and satisfying ``sum m_i Phi_i = phi``. For ``phi = 0`` the fluxes are zero, the - active set empty, and ``C`` the continuous limit + active set empty, and ``1/Hbar`` the continuous limit ``min_j m_j g0 / kT``. """ X, m, b = _validate_inputs(phi, X, m, T, g0, b) @@ -157,7 +158,7 @@ def solve_closure(phi, X, m, T, g0, b, return_diag=False): active = set(range(n)) wscale = phi / np.min(m) # crude magnitude scale for the tolerances for _ in range(4 * n + 8): - w, C = solve_fixed_active(phi, X, m, T, g0, b, active) + w, inv_h_bar = solve_fixed_active(phi, X, m, T, g0, b, active) neg = {j for j in active if w[j] < -1e-12 * wscale} if neg: active -= neg @@ -169,7 +170,7 @@ def solve_closure(phi, X, m, T, g0, b, return_diag=False): for k in range(n): if k in active: continue - r_k = sum(X[i] * w[i] / b[i, k] for i in active) - (m[k] * g0 / kT - C) + r_k = sum(X[i] * w[i] / b[i, k] for i in active) - (m[k] * g0 / kT - inv_h_bar) if r_k > 1e-12 * abs(m[k] * g0 / kT) and r_k > worst: viol, worst = k, r_k if viol is None: @@ -179,7 +180,7 @@ def solve_closure(phi, X, m, T, g0, b, return_diag=False): flux = X * w flux[list(set(range(n)) - active)] = 0.0 if return_diag: - return flux, C, frozenset(active) + return flux, inv_h_bar, frozenset(active) return flux active.add(viol) raise RuntimeError('active-set iteration did not converge') @@ -239,7 +240,9 @@ def closure_per_species( g0_cgs = (G * M_p / r_base**2) * 1e2 # m/s^2 -> cm/s^2 phi_cgs = (mdot / (4.0 * math.pi * r_base**2)) * 0.1 # kg/m^2/s -> g/cm^2/s - flux, C, active = solve_closure(phi_cgs, X, m_g, T_wind, g0_cgs, b, return_diag=True) + flux, inv_h_bar, active = solve_closure( + phi_cgs, X, m_g, T_wind, g0_cgs, b, return_diag=True + ) area_cm2 = 4.0 * math.pi * (r_base * 1e2) ** 2 per_element = { el: float(flux[k]) * area_cm2 * float(m_g[k]) * 1e-3 for k, el in enumerate(species) @@ -250,7 +253,7 @@ def closure_per_species( diag = dict( active_set=sorted(species[k] for k in active), retained=[el for el in species if el not in {species[k] for k in active}], - C_inv_scale_height_cgs=float(C), + inv_H_bar_cgs=float(inv_h_bar), mass_conservation_rel=float(conservation), b_provenance=prov, ) From c088b23c7fc2c4bd657b6016728178b1c99947bb Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 00:58:08 +0200 Subject: [PATCH 027/113] Rename the verdict guide to troubleshooting It answers a symptom, which is what the other how-to guides do, so the title and the file say so. The entry on a subcritical sonic point now explains what the condition means physically, that the branch floors the sonic radius at the wind base, and how to read the two candidates afterward; the recombination-limited entry states that the mechanism string switches on a reporting convention rather than a derived boundary. --- docs/Explanations/model.md | 2 +- docs/Explanations/regimes.md | 2 +- docs/How-to/troubleshooting.md | 117 +++++++++++++++++++++++++++++++++ docs/getting_started.md | 4 +- 4 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 docs/How-to/troubleshooting.md diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 71112d4f..4ea62cb2 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -63,7 +63,7 @@ A giant collision removes part of the target's atmosphere in a single event, on - [Giant impacts](impacts.md): the erosion scaling law and its fitted domain. - [Coupling to PROTEUS](proteus.md): configuration keys, the per-time-step sequence, and reservoir bookkeeping. - [Limitations](limitations.md): what each entry point does not model, and what that implies for results. -- [Triage a verdict](../How-to/triage_verdict.md): what to look at when a flag fires or a label surprises you. +- [Troubleshooting the dispatcher](../How-to/troubleshooting.md): what to look at when a flag fires or a label surprises you. - [Parameter reference](../Reference/parameters.md), [dispatch results](../Reference/results.md), and [API reference](../Reference/api/index.md). --- diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 501677e6..b9f576c2 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -83,7 +83,7 @@ Every threshold above carries a stated physical width, and the framework reports All knobs, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. Every field of the result, every flag, and every diagnostics group is tabulated in the [dispatch results reference](../Reference/results.md). The assumptions that remain on every result, whatever the knobs, are collected on the [limitations page](limitations.md). -For the framework in use rather than in principle, the [dispatcher tutorial](../Tutorials/dispatch.md) crosses two of the boundaries above on one planet, measures how far one of them moves across the width of its own criterion, and dispatches an atmosphere along a stellar history; the [triage guide](../How-to/triage_verdict.md) starts from a flag or an unexpected verdict instead. +For the framework in use rather than in principle, the [dispatcher tutorial](../Tutorials/dispatch.md) crosses two of the boundaries above on one planet, measures how far one of them moves across the width of its own criterion, and dispatches an atmosphere along a stellar history; the [troubleshooting guide](../How-to/troubleshooting.md) starts from a flag or an unexpected verdict instead. --- diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md new file mode 100644 index 00000000..b6861a3d --- /dev/null +++ b/docs/How-to/troubleshooting.md @@ -0,0 +1,117 @@ +# Troubleshooting the dispatcher + +A regime verdict looks wrong, or a flag fired and you want to know whether it matters. It is the shortest path from a symptom to the thing to look at. Every flag and diagnostics key is defined in the [dispatch results reference](../Reference/results.md), and the physics is on the [escape regimes](../Explanations/regimes.md) page; this page sits between them and starts from what you observed. + +Start with the two questions that dispose of most surprises: + +1. **Is the rate physically meaningful at all?** One proton per year through the surface, about 5.3e-35 kg s⁻¹, is the smallest rate with content. Below it, the label is describing an outflow that does not exist. +2. **Was the state near a boundary?** `diagnostics['knudsen']['counterfactual_labels']` gives the label at both edges of the collisionality criterion. When those disagree with each other, the verdict is a choice the criterion made, not a measurement, and the rest of this page is about which choice. + +--- + +## The rate is zero, or absurdly small + +**Symptom.** A `hydrostatic` verdict returns 1e-70 kg s⁻¹ or smaller. + +**Cause.** Nothing is wrong. Jeans escape depends exponentially on the Jeans parameter at the exobase, and a heavy species on a strongly bound planet sits at a Jeans parameter of hundreds. Read `diagnostics['hydrostatic']['detail']['species'][name]['lambda_exo']`: above roughly 30, the exponential has already taken the rate out of physical relevance. + +**What to do.** Report no escape rather than the number. If you expected loss here, the missing physics is probably not thermal: the nonthermal channels that actually remove heavy species from a real exosphere are absent everywhere in ZEPHYRUS, which is what `hydrostatic_lower_limit` says on every hydrostatic result. A trace of a light species changes the picture completely, because it escapes at the diffusion-limited supply rate rather than its own Jeans rate. + +## The bulk rate barely responds to the exobase temperature + +**Symptom.** A hydrostatic verdict whose rate is insensitive to `T_exo_value`, against the documented exponential sensitivity. + +**Cause.** The species carrying the rate is supply limited, not Jeans limited. The species that carries no cap at all is `diagnostics['hydrostatic']['detail']['dominant']`, which supplies itself. Compare `phi_jeans` against `phi_diffusion` in `diagnostics['hydrostatic']['detail']['species'][name]`: when the diffusion-limited supply is the smaller of the two, the harmonic mean of the two sits near the supply and the exobase temperature has little left to do. + +**What to do.** Nothing, but do not report the insensitivity as a general property of the branch: the heavy species in the same result will be moving by orders of magnitude over the same temperature range. + +## `thermostat_clamped` fired + +**Symptom.** The wind temperature sits at a bracket edge, usually 5e4 K. + +**Cause.** The local heating against cooling balance had no root in the bracket. At a dense wind base this is physical: electron densities far above the critical densities of the forbidden lines quench the line coolants collisionally, so nothing balances the heating and the wind runs hot. + +**What to do.** Read `diagnostics['hydrodynamic']['T_wind']` and decide whether that temperature is one you are willing to carry. It propagates: the sound speed, the barometric exponent, and the recombination coefficient all depend on it, so it moves the boundary between the two hydrodynamic sub-labels. The thermostat evaluates one level and does not model the temperature structure through the sonic region, which is the limitation behind the clamp. + +## `subcritical_sonic` fired + +**Symptom.** The flag on a hydrodynamic verdict, sometimes with the label `hydrodynamic:RR`. + +**Cause.** The isothermal sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ came out below the wind base, which happens when the base Jeans parameter $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ drops below 2. The gas at the base is then already unbound in the isothermal sense: there is no subsonic region above the base for a wind to accelerate through, so there is no transonic point to anchor a rate on. Below $\lambda_\mathrm{b} = 3/2$ it is worse, because the barometric factor $e^{3/2 - \lambda_\mathrm{b}}$ exceeds 1 and the formula would carry density outward rather than thinning it. The branch responds by flooring the sonic radius at the base and dropping the barometric factor, which keeps the rate finite and monotone, and flags that it did. + +Physically, a state in that corner is not an XUV wind launched at an ionization front. It is the blow-off corner, where the whole upper atmosphere streams away, the transonic point sits below the base, and the rate is set by the energy supplied rather than by radiation. The framework has a branch for that, tested before this one on the restricted Jeans parameter, and most states that raise this flag are labeled `boiloff` or `roche_overflow` for that reason. + +**What to do.** Read `diagnostics['hydrodynamic']['rr_chain']['lambda_b']` and `diagnostics['hydrodynamic']['selection_mechanism']` together, then split by which candidate won: + +- `EL-selected`: the flag is informational. The energy-limited rate is an energy budget and never used the sonic point, so it survives the condition intact. +- `RR-selected:subcritical-floor`: the number is a floored placeholder rather than a rate, because the minimum compared a real energy-limited rate against a formula evaluated outside its own domain. Compare against the bolometric candidate in `diagnostics['bolometric']` before using it, and expect the label to be one of the extreme ones. + +## The label is `hydrodynamic:RR` and you want to know why + +**Symptom.** A recombination-limited verdict, and the question of whether recombination is what limited it. + +**Cause.** The minimum over the two hydrodynamic candidates can select the recombination-limited rate for two physically different reasons. One is genuine saturation: the base ion density follows photoionization against recombination balance, so the rate grows as $\sqrt{F_\mathrm{XUV}}$ while the energy-limited rate grows linearly, and the former wins at high flux. The other is barometric suppression: at large $\lambda_\mathrm{b}$ the isothermal wind is exponentially throttled between the base and the sonic point, and the smallness has nothing to do with radiation. + +**What to do.** Read `selection_mechanism`. Treat its split as the reporting convention it is: the string switches at $\lambda_\mathrm{b} = 4$, which is a stated convention rather than a derived boundary, and the canonical recombination-limited case of the literature sits near $\lambda_\mathrm{b} = 5.5$, on the barometric side of it. So use the string to tell you which quantity to look at, not as a verdict. The two mechanisms separate properly by their flux scaling: fit the rate against $F_\mathrm{XUV}$ over a decade and read the exponent, near 1/2 for saturation and much steeper or flatter for suppression. Whichever it is, do not describe a suppression-dominated point as recombination limited in text or in a figure legend. + +## `base_clamped` fired + +**Symptom.** The wind base sits at the profile top, with a clamp distance of several decades. + +**Cause.** The profile does not extend to the pressure where XUV photons are absorbed, near a nanobar. An isothermal hydrogen envelope, in particular, becomes unbound and truncates well below that. + +**What to do.** For a production profile, set the top pressure below 1 nanobar and the clamp never engages. Otherwise decide by branch: on `boiloff` the clamp is harmless, because that branch launches from the photospheric level. On a hydrodynamic verdict it is not, because the base density sets the sonic-point density and therefore the collisionality switch itself, so a clamped base moves the boundary. The `base_out_of_range = 'extend'` setting evaluates the base on the extended upper structure instead; `base_extension_truncated` means even that did not reach it. + +## `roche_overflow` on a state that should not be overflowing + +**Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. + +**Cause.** The label names the branch that won the rate comparison, and the screen tests that branch's own flow radius. When the bolometric residual wins, the radius tested is its sonic radius, which for a warm low-gravity atmosphere can be larger than the Hill radius even when the residual rate is tiny. So the label reports a geometry, and the rate it carries can be small. + +**What to do.** Read three things: `flags['bolometric_residual']` (did the residual take the label), `diagnostics['roche']` (`flow_radius` against `R_hill_periapsis`), and `diagnostics['bolometric']` (which cap set the rate). If the residual won at a rate below the floor, treat the point as no escape and the geometry as a note rather than a result. Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. + +## `contested_ion` fired + +**Symptom.** The flag, plus a `diagnostics['contested_ion']` group holding two rates. + +**Cause.** The neutral escape temperature and the plasma escape temperature, which is half of it because an ambipolar field shares each ion's binding energy with its electron, disagree about whether the exosphere can stay hydrostatic. The physics that would decide it is ion outflow, which this version does not model. + +**What to do.** Report both rates, or report the point as contested. Do not resolve it with the `gate` setting: that setting chooses which convention gates the branch, and choosing one does not make the other wrong. In the nitrogen and oxygen corner the two conventions can differ by four orders of magnitude in rate. + +## The label flips between neighboring points of a smooth sweep + +**Symptom.** A parameter grid or a time series whose label alternates. + +**Cause.** Either the state is sitting inside the collisionality band, where the criterion does not decide the label, or the two candidate rates are within a hair of each other and the minimum keeps changing hands. + +**What to do.** For an evolutionary track, supply `prev_regime` from the previous step. That opens a hysteresis window around the threshold, so the previous label wins inside it and a track cannot chatter on numerical noise; `hysteresis_active` confirms it was in use and `diagnostics['knudsen']['threshold_applied']` shows the shifted threshold. For a static grid, quote the boundary with the width its criterion implies rather than as a line: re-dispatch at `kn_crit` of 0.1 and 3 and report the range. The [tutorial](../Tutorials/dispatch.md) measures such a band as a factor of 4.3 in boundary flux for one planet. + +## The per-species rates look like a bulk split + +**Symptom.** Element shares that match their reservoir mass fractions. + +**Cause.** Either fractionation is off, or the verdict is not a confirmed wind. The closure runs only on a hydrodynamic verdict with `fractionate` on; every other branch splits by reservoir mass fractions, except the hydrostatic branch, which is natively per-species. + +**What to do.** Check the label and the `fractionate` setting, and look for `split_from_base_composition`, which says the split fell back to the wind-base composition because no reservoirs were supplied. A 3% departure from the mass fractions is a real result for a well-coupled heavy wind, not a sign the closure failed to run; `diagnostics['closure']` carries the active set and the mass residual if you need to confirm it did. + +## The rate is large and the planet should not have survived + +**Symptom.** A plausible-looking rate on a grid point whose atmosphere would be long gone. + +**Cause.** Nothing in the module knows the state's history. `diagnostics['self_consistency']` is the check: it divides the supplied inventory by the dispatched rate and compares against the supplied age. + +**What to do.** When `inconsistent` is `True`, the grid point is describing a state that cannot have persisted to the age it claims. That is a statement about the grid, not the rate. Report the flagged fraction of a static grid rather than dropping the points silently. + +## The fitted efficiency returns something implausible + +**Symptom.** `efficiency_mode = 'caldiroli'` returning a value near one, with `caldiroli_out_of_box`. + +**Cause.** The fit was made on sub-Neptunes through hot Jupiters. A one Earth-mass planet sits below the gravitational potential range it covers, so the value is an extrapolation, and the flag says so rather than silently refusing. + +**What to do.** Below the fit's flux bound the value is rejected outright and `caldiroli_below_flux_bound` plus `efficiency_fallback_fixed` tell you the fixed setting was used instead. Outside the potential box, prefer a swept fixed efficiency over the extrapolated fit, and report the sweep range rather than one value. + +--- + +## When none of the above applies + +Print the whole container for the offending call and read it in the order the [tutorial](../Tutorials/dispatch.md) uses: which branch and how close, what set the rate, whether the heating could drive a flow at all, how the verdict translates into other taxonomies, and whether the snapshot is self-consistent. If the verdict still looks wrong after that, the input state is the next suspect: check the profile spans the pressures the branches need, that the composition is what you meant, and that every scalar is in SI. diff --git a/docs/getting_started.md b/docs/getting_started.md index a35eb1dd..8fb09e1d 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -38,9 +38,9 @@ Here is the quickest path to getting started: [Go to the dispatcher tutorial](Tutorials/dispatch.md) -- :material-stethoscope: **Diagnose a verdict** +- :material-stethoscope: **Troubleshoot a verdict** - [Go to the triage guide](How-to/triage_verdict.md) + [Go to the troubleshooting guide](How-to/troubleshooting.md) - :material-library: **Understand the model** From d6ebd7ae72cd296d0e2f640a017a7f781fd3af12 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 00:58:18 +0200 Subject: [PATCH 028/113] Show the code behind every output in the tutorial Each step now prints from a snippet the reader can run, in order, after one import, with the output in its own block instead of trailing a comment. Every quoted number is reproduced from the shipped example, which closes a gap where a few full-precision values had been carried over from an earlier implementation rather than measured. The stellar-history step gains a figure of the bulk rate and the per-element rates against age, the sweep figure labels its boundaries with units, and the first-run page's expected curve is restated from a run. Housekeeping across the docs: percentages as figures, no dashes outside citation page ranges, and plainer wording where a borrowed term had crept in. --- docs/Explanations/impacts.md | 2 +- docs/Explanations/limitations.md | 6 +- docs/How-to/triage_verdict.md | 104 ----- docs/Reference/parameters.md | 4 +- docs/Tutorials/dispatch.md | 450 ++++++++++++++------ docs/Tutorials/first_run.md | 6 +- docs/Validation/boiloff.md | 4 +- docs/Validation/diffusion.md | 6 +- docs/Validation/fractionation.md | 2 +- docs/Validation/hydrodynamic.md | 6 +- docs/Validation/hydrostatic.md | 2 +- docs/Validation/knudsen.md | 2 +- docs/Validation/profiles.md | 2 +- docs/assets/dispatcher_regime_sweep.png | Bin 243900 -> 253189 bytes docs/assets/dispatcher_track.png | Bin 0 -> 272485 bytes examples/demo_dispatcher/demo_dispatcher.py | 102 ++++- 16 files changed, 449 insertions(+), 249 deletions(-) delete mode 100644 docs/How-to/triage_verdict.md create mode 100644 docs/assets/dispatcher_track.png diff --git a/docs/Explanations/impacts.md b/docs/Explanations/impacts.md index 749d2875..2ef42bdc 100644 --- a/docs/Explanations/impacts.md +++ b/docs/Explanations/impacts.md @@ -20,7 +20,7 @@ Three input conventions follow the paper and must be honored by the caller: $v_\ ## Fitted domain and accuracy -The law is constrained by simulations spanning target masses of roughly 0.3 to 3 Earth masses, impactor masses down to about 0.05 Earth masses, bulk densities from about half to double Earth's, contact speeds of 1 to 3 $v_\mathrm{esc}$, all impact angles, and thin atmospheres of order 1 percent of the planet mass. The median deviation of the simulations from the law is 9 percent, rising to about 20 percent for slow, head-on impacts, whose outcomes are chaotic. The loss depends only mildly on the atmosphere mass in this thin-atmosphere regime, with a factor of 10 less atmosphere increasing the eroded fraction by roughly 10 percent; substantially thicker atmospheres, which can cushion the impactor, fall outside the law's domain. The function evaluates the law for any physically valid inputs and does not warn when masses, densities, or speeds leave the fitted ranges; staying inside them is the caller's responsibility, and the [limitations page](limitations.md) lists what the channel leaves out (impactor-side atmosphere, volatile delivery, and mantle stripping among them). +The law is constrained by simulations spanning target masses of roughly 0.3 to 3 Earth masses, impactor masses down to about 0.05 Earth masses, bulk densities from about half to double Earth's, contact speeds of 1 to 3 $v_\mathrm{esc}$, all impact angles, and thin atmospheres of order 1% of the planet mass. The median deviation of the simulations from the law is 9%, rising to about 20% for slow, head-on impacts, whose outcomes are chaotic. The loss depends only mildly on the atmosphere mass in this thin-atmosphere regime, with a factor of 10 less atmosphere increasing the eroded fraction by roughly 10%; substantially thicker atmospheres, which can cushion the impactor, fall outside the law's domain. The function evaluates the law for any physically valid inputs and does not warn when masses, densities, or speeds leave the fitted ranges; staying inside them is the caller's responsibility, and the [limitations page](limitations.md) lists what the channel leaves out (impactor-side atmosphere, volatile delivery, and mantle stripping among them). The returned fraction applies to the target's atmosphere as a whole. Consistent with the bulk-removal treatment of the continuous channel's unfractionated splits, the caller partitions the lost mass across atmospheric species without elemental fractionation. diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index d351bf6a..72c8d707 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -29,10 +29,10 @@ The framework removes the regime-awareness limitation and carries its own, each The channel is a single fitted power law, not an impact simulation, and inherits the scope of the simulation suite behind it (see the [giant impacts page](impacts.md) for the fitted domain): -- **Thin atmospheres only.** The fit covers atmospheres of order 1 percent of the planet mass; a substantially thicker envelope cushions the impactor and the eroded fraction is no longer described by the law. -- **Target-side loss only.** Any atmosphere the impactor carries, and any volatile delivery into the merged body, is outside the function. The underlying simulations show a slow grazing collision with an atmosphere-hosting impactor can leave the target with about 85 percent of the two bodies' combined atmospheres, so treating the impactor as bare is a caller-side assumption. +- **Thin atmospheres only.** The fit covers atmospheres of order 1% of the planet mass; a substantially thicker envelope cushions the impactor and the eroded fraction is no longer described by the law. +- **Target-side loss only.** Any atmosphere the impactor carries, and any volatile delivery into the merged body, is outside the function. The underlying simulations show a slow grazing collision with an atmosphere-hosting impactor can leave the target with about 85% of the two bodies' combined atmospheres, so treating the impactor as bare is a caller-side assumption. - **No mantle or core erosion.** Violent impacts also strip silicate and metal mass; the law tracks the atmospheric fraction only. -- **Chaotic-regime scatter.** Slow, head-on collisions produce chaotic fall-back; the fit carries about 20 percent scatter there against 9 percent overall. +- **Chaotic-regime scatter.** Slow, head-on collisions produce chaotic fall-back; the fit carries about 20% scatter there against 9% overall. - **Fit-domain extrapolation is unflagged.** The function evaluates the law for any physically valid inputs and does not warn when they leave the fitted ranges; staying inside them is the caller's responsibility. ## Not modeled by any entry point diff --git a/docs/How-to/triage_verdict.md b/docs/How-to/triage_verdict.md deleted file mode 100644 index 220ad447..00000000 --- a/docs/How-to/triage_verdict.md +++ /dev/null @@ -1,104 +0,0 @@ -# Triage a dispatch verdict - -A regime verdict looks wrong, or a flag fired and you want to know whether it matters. This page is the shortest path from a symptom to the thing to look at. Every flag and diagnostics key is defined in the [dispatch results reference](../Reference/results.md), and the physics is on the [escape regimes](../Explanations/regimes.md) page; this is the triage layer between them. - -Start with the two questions that dispose of most surprises: - -1. **Is the rate physically meaningful at all?** One proton per year through the surface, about 5.3e-35 kg s⁻¹, is the smallest rate with content. Below it, the label is describing an outflow that does not exist. -2. **Was the state near a boundary?** `diagnostics['knudsen']['counterfactual_labels']` gives the label at both edges of the collisionality criterion. When those disagree with each other, the verdict is a choice the criterion made, not a measurement, and the rest of the triage is about which choice. - ---- - -## The rate is zero, or absurdly small - -**Symptom.** A `hydrostatic` verdict returns 1e-70 kg s⁻¹ or smaller. - -**Cause.** Nothing is wrong. Jeans escape depends exponentially on the Jeans parameter at the exobase, and a heavy species on a strongly bound planet sits at a Jeans parameter of hundreds. Read `diagnostics['hydrostatic']['detail']['species'][name]['lambda_exo']`: above roughly 30, the exponential has already taken the rate out of physical relevance. - -**What to do.** Report no escape rather than the number. If you expected loss here, the missing physics is probably not thermal: the nonthermal channels that actually remove heavy species from a real exosphere are absent everywhere in ZEPHYRUS, which is what `hydrostatic_lower_limit` says on every hydrostatic result. A trace of a light species changes the picture completely, because it escapes at the diffusion-limited supply rate rather than its own Jeans rate. - -## The bulk rate barely responds to the exobase temperature - -**Symptom.** A hydrostatic verdict whose rate is insensitive to `T_exo_value`, against the documented exponential sensitivity. - -**Cause.** The species carrying the rate is supply limited, not Jeans limited. The species that carries no cap at all is `diagnostics['hydrostatic']['detail']['dominant']`, which supplies itself. Compare `phi_jeans` against `phi_diffusion` in `diagnostics['hydrostatic']['detail']['species'][name]`: when the diffusion-limited supply is the smaller of the two, the harmonic mean of the two sits near the supply and the exobase temperature has little left to do. - -**What to do.** Nothing, but do not report the insensitivity as a general property of the branch: the heavy species in the same result will be moving by orders of magnitude over the same temperature range. - -## `thermostat_clamped` fired - -**Symptom.** The wind temperature sits at a bracket edge, usually 5e4 K. - -**Cause.** The local heating against cooling balance had no root in the bracket. At a dense wind base this is physical: electron densities far above the critical densities of the forbidden lines quench the line coolants collisionally, so nothing balances the heating and the wind runs hot. - -**What to do.** Read `diagnostics['hydrodynamic']['T_wind']` and decide whether that temperature is one you are willing to carry. It propagates: the sound speed, the barometric exponent, and the recombination coefficient all depend on it, so it moves the boundary between the two hydrodynamic sub-labels. The thermostat evaluates one level and does not model the temperature structure through the sonic region, which is the limitation behind the clamp. - -## `subcritical_sonic` fired, and the label is `hydrodynamic:RR` - -**Symptom.** A recombination-limited verdict carrying this flag. - -**Cause.** The computed sonic radius fell below the wind base, so it was floored at the base. The recombination-limited rate then wins the minimum through barometric suppression between base and sonic point, not through recombination saturation. - -**What to do.** Check `diagnostics['hydrodynamic']['selection_mechanism']`, which names the mechanism. Do not describe such a point as recombination limited in text or in a figure legend: it is the same label reached by different physics, and the distinction is the reason the mechanism is reported. - -## `base_clamped` fired - -**Symptom.** The wind base sits at the profile top, with a clamp distance of several decades. - -**Cause.** The profile does not extend to the pressure where XUV photons are absorbed, near a nanobar. An isothermal hydrogen envelope, in particular, becomes unbound and truncates well below that. - -**What to do.** For a production profile, set the top pressure below 1 nanobar and the clamp never engages. Otherwise decide by branch: on `boiloff` the clamp is harmless, because that branch launches from the photospheric level. On a hydrodynamic verdict it is not, because the base density sets the sonic-point density and therefore the collisionality switch itself, so a clamped base moves the boundary. The `base_out_of_range = 'extend'` setting evaluates the base on the extended upper structure instead; `base_extension_truncated` means even that did not reach it. - -## `roche_overflow` on a state that should not be overflowing - -**Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. - -**Cause.** The label names the branch that won the rate comparison, and the screen tests that branch's own flow radius. When the bolometric residual wins, the radius tested is its sonic radius, which for a warm low-gravity atmosphere can be larger than the Hill radius even when the residual rate is tiny. So the label reports a geometry, and the rate it carries can be small. - -**What to do.** Read three things: `flags['bolometric_residual']` (did the residual take the label), `diagnostics['roche']` (`flow_radius` against `R_hill_periapsis`), and `diagnostics['bolometric']` (which cap set the rate). If the residual won at a rate below the floor, treat the point as no escape and the geometry as a note rather than a result. Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. - -## `contested_ion` fired - -**Symptom.** The flag, plus a `diagnostics['contested_ion']` group holding two rates. - -**Cause.** The neutral escape temperature and the plasma escape temperature, which is half of it because an ambipolar field shares each ion's binding energy with its electron, disagree about whether the exosphere can stay hydrostatic. The physics that would decide it is ion outflow, which this version does not model. - -**What to do.** Report both rates, or report the point as contested. Do not resolve it with the `gate` setting: that setting chooses which convention gates the branch, and choosing one does not make the other wrong. In the nitrogen and oxygen corner the two conventions can differ by four orders of magnitude in rate. - -## The label flips between neighboring points of a smooth sweep - -**Symptom.** A parameter grid or a time series whose label alternates. - -**Cause.** Either the state is sitting inside the collisionality band, where the criterion does not decide the label, or the two candidate rates are within a hair of each other and the minimum keeps changing hands. - -**What to do.** For an evolutionary track, supply `prev_regime` from the previous step. That opens a hysteresis window around the threshold, so the previous label wins inside it and a track cannot chatter on numerical noise; `hysteresis_active` confirms it was in use and `diagnostics['knudsen']['threshold_applied']` shows the shifted threshold. For a static grid, quote the boundary with the width its criterion implies rather than as a line: re-dispatch at `kn_crit` of 0.1 and 3 and report the range. The [tutorial](../Tutorials/dispatch.md) measures such a band as a factor of 4.3 in boundary flux for one planet. - -## The per-species rates look like a bulk split - -**Symptom.** Element shares that match their reservoir mass fractions. - -**Cause.** Either fractionation is off, or the verdict is not a confirmed wind. The closure runs only on a hydrodynamic verdict with `fractionate` on; every other branch splits by reservoir mass fractions, except the hydrostatic branch, which is natively per-species. - -**What to do.** Check the label and the `fractionate` setting, and look for `split_from_base_composition`, which says the split fell back to the wind-base composition because no reservoirs were supplied. A three percent departure from the mass fractions is a real result for a well-coupled heavy wind, not a sign the closure failed to run; `diagnostics['closure']` carries the active set and the mass residual if you need to confirm it did. - -## The rate is large and the planet should not have survived - -**Symptom.** A plausible-looking rate on a grid point whose atmosphere would be long gone. - -**Cause.** Nothing in the module knows the state's history. `diagnostics['self_consistency']` is the check: it divides the supplied inventory by the dispatched rate and compares against the supplied age. - -**What to do.** When `inconsistent` is `True`, the grid point is describing a state that cannot have persisted to the age it claims. That is a statement about the grid, not the rate. Report the flagged fraction of a static grid rather than dropping the points silently. - -## The fitted efficiency returns something implausible - -**Symptom.** `efficiency_mode = 'caldiroli'` returning a value near one, with `caldiroli_out_of_box`. - -**Cause.** The fit was made on sub-Neptunes through hot Jupiters. A one Earth-mass planet sits below the gravitational potential range it covers, so the value is an extrapolation, and the flag says so rather than silently refusing. - -**What to do.** Below the fit's flux bound the value is rejected outright and `caldiroli_below_flux_bound` plus `efficiency_fallback_fixed` tell you the fixed setting was used instead. Outside the potential box, prefer a swept fixed efficiency over the extrapolated fit, and report the sweep range rather than one value. - ---- - -## When none of the above applies - -Print the whole container for the offending call and read it in the order the [tutorial](../Tutorials/dispatch.md) uses: which branch and how close, what set the rate, whether the heating could drive a flow at all, how the verdict translates into other taxonomies, and whether the snapshot is self-consistent. If the verdict still looks wrong after that, the input state is the next suspect: check the profile spans the pressures the branches need, that the composition is what you meant, and that every scalar is in SI. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index d8d4a1eb..20e0d715 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -31,7 +31,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For --- -## Sun–Earth reference values (`planets_parameters.py`) +## Sun and Earth reference values (`planets_parameters.py`) ### Sun @@ -97,7 +97,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | Name | Default | Options / units | Meaning | |---|---|---|---| | `base_method` | `'lopez'` | `'lopez'`, `'fixed_pressure'`, `'boreas'` | How the XUV wind base is located on the profile. The Lopez (2017) level is $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar; `'boreas'` uses the optional BOREAS solver and falls back to `'lopez'` with a flag when it is absent or does not converge. | -| `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | Policy when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Profiles reaching below 1 nanobar never engage it. | +| `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | What happens when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Profiles reaching below 1 nanobar never engage it. | | `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023). | | `P_base_fixed` | 5.0 | Pa | Base pressure for the `'fixed_pressure'` method only. | | `kn_crit` | 1.0 | – | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index a6fbe081..f3a6628a 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -2,7 +2,7 @@ The [first run](first_run.md) applied one prescription unconditionally: scalars in, an energy-limited rate out. This tutorial uses the full framework instead. You hand `zephyrus.dispatch` one planetary state, it decides which escape physics that state is in, and it returns the rate that physics gives, the per-species split, flags, and the diagnostics that say how close the state sat to each regime boundary. -By the end you will have crossed two regime boundaries on the same planet, produced the figure below, read a diagnostics container field by field, measured how far a boundary moves across the width of its own criterion, and dispatched one atmosphere along a stellar XUV history. +By the end you will have crossed two regime boundaries on the same planet, produced both figures below, read a diagnostics container field by field, measured how far a boundary moves across the width of its own criterion, and dispatched one atmosphere along a stellar XUV history. If you have not installed ZEPHYRUS yet, follow the [installation guide](../How-to/installation.md) and run `mors download all` for the stellar tracks. The [escape regimes](../Explanations/regimes.md) page defines the physics behind every step here; this page is about driving it. @@ -12,38 +12,50 @@ If you have not installed ZEPHYRUS yet, follow the [installation guide](../How-t - Sweep the XUV flux until the regime label changes, twice - Meet the boil-off and overflow labels - Read the diagnostics container and learn which entries to look at first - - Move a boundary with each of the four knobs that move one + - Move a boundary with each of the four settings that move one - Dispatch a frozen atmosphere along a stellar history --- ## The full script -The complete example is `examples/demo_dispatcher/demo_dispatcher.py`. It writes one figure, so create the output directory first: +The complete example is `examples/demo_dispatcher/demo_dispatcher.py`. It writes two figures, so create the output directory first: ```sh mkdir -p output python examples/demo_dispatcher/demo_dispatcher.py ``` -It prints a table per step and runs in a few seconds, most of which is the boundary bisections. Every step is a function that returns its results, so you can import one at a time: +It prints a table per step and runs in a few seconds, most of which is the boundary bisections. + +Every snippet below runs on its own, in order, after this one import, from a session started at the repository root so that `examples` is importable. The example keeps each step in its own function, so you can reuse the pieces one at a time rather than running the whole script: ```python -from examples.demo_dispatcher.demo_dispatcher import flux_sweep, read_diagnostics +import numpy as np + +from zephyrus.dispatcher import DispatchSettings, dispatch + +# build_state assembles the state of step 1, boundary_flux and +# boundary_band bisect a label change in flux, and stellar_track +# dispatches one atmosphere along a MORS history. +from examples.demo_dispatcher.demo_dispatcher import ( + boundary_band, + boundary_flux, + build_state, + stellar_track, +) ``` -The rest of this page walks the script step by step. - --- ## Step 1: build a state The energy-limited entry point takes scalars. The framework needs the atmospheric structure as well, because the quantities that decide the regime are properties of the structure and not of the surface: the pressure level where XUV photons are absorbed and the wind is launched, the level where the gas stops colliding often enough to behave as a fluid, and the exobase where individual particles start escaping ballistically. -So a state is scalars plus a `profiles.Profile`: +So a state is scalars plus a `profiles.Profile`. This is what `build_state` assembles: ```python -from zephyrus.dispatcher import DispatchSettings, EscapeInputs, dispatch +from zephyrus.dispatcher import EscapeInputs from zephyrus.profiles import isothermal_profile profile = isothermal_profile(M_p, R_p, T_eq, {'CO2': 1.0}, 1.0e7, 1.0e-5) @@ -79,23 +91,34 @@ In a coupled run the atmosphere module supplies the profile. Standalone, `isothe ## Step 2: one call, one verdict +Dispatch a carbon dioxide planet of one Earth mass and one Earth radius at 10 W m⁻²: + ```python -result = dispatch(state) +result = dispatch(build_state('CO2', 1.0, 1.0, 10.0)) + +print(result.regime) +print(result.mdot) +print(result.per_species) +print(sum(result.per_species.values()) - result.mdot) +print(result.flags) +print(sorted(result.diagnostics)) ``` -For the CO₂ planet at 10 W m⁻², the script prints: +Output: ```text -regime hydrodynamic:EL -rate 2.3477e+06 kg/s (7.409e+13 kg/yr) -C 6.6097e+05 kg/s -O 1.6867e+06 kg/s -sum 2.3477e+06 kg/s, closure error 0.00e+00 -flags none -diagnostics 17 groups +hydrodynamic:EL +2347722.550685174 +{'C': 660973.0964302735, 'O': 1686749.4542549003} +0.0 +{} +['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', + 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', + 'knudsen', 'lambda_gate', 'potential_screens', 'roche', 'self_consistency', + 'tang_timescale', 'thermostat'] ``` -Five fields, and each has a contract. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is the property a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. +Five fields, and each one guarantees something. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. Every physically posed state returns a result. Exceptions are reserved for malformed input, so a `ValueError` from `dispatch` means the state itself is wrong (a negative mass, an eccentricity of 1, a profile whose pressure does not decrease outward), not that the physics failed. @@ -106,42 +129,60 @@ Every physically posed state returns a result. Exceptions are reserved for malfo The interesting thing about a dispatcher is where it changes its mind. Sweep the XUV flux on a fixed planet and the label moves, because the flux at a fixed orbit stands in for stellar age: a young star delivers orders of magnitude more XUV than the same star does later. ```python -for f_xuv in np.logspace(-2, np.log10(5e3), 30): - result = dispatch(build_state('CO2', 1.0, 1.0, float(f_xuv))) - print(f_xuv, result.regime, result.mdot, - result.diagnostics['knudsen']['kn_sc']) +for f_xuv in np.logspace(-2, np.log10(5.0e3), 30)[::3]: + out = dispatch(build_state('CO2', 1.0, 1.0, float(f_xuv))) + kn = out.diagnostics['knudsen'] + print(f'{f_xuv:9.3g} {out.regime:<17} {out.mdot:11.3e} ' + f'{kn["kn_sc"]:9.3g} {kn["counterfactual_labels"]}') +``` + +Output: + +```text + 0.01 hydrostatic 4.989e-123 4.5e+18 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} + 0.0389 hydrostatic 4.989e-123 2.28e+18 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} + 0.151 hydrostatic 4.989e-123 3.06e+10 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} + 0.587 hydrostatic 4.989e-123 3.92 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} + 2.28 hydrodynamic:EL 5.356e+05 0.118 {0.1: 'hydrostatic', 3.0: 'hydrodynamic'} + 8.87 hydrodynamic:EL 2.082e+06 0.033 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} + 34.5 hydrodynamic:EL 8.090e+06 0.0127 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} + 134 hydrodynamic:EL 3.144e+07 0.00558 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} + 520 hydrodynamic:EL 1.222e+08 0.00265 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} + 2.02e+03 hydrodynamic:RR 2.572e+08 0.00131 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} +``` + +Two labels changed in that sweep. Locate each one by bisection rather than by eye: + +```python +print(boundary_flux('CO2', 0.1, 10.0)) +print(boundary_flux('CO2', 100.0, 2000.0)) +print(boundary_flux('N2-O2', 0.01, 10.0)) ``` -On the CO₂ planet the sweep crosses two boundaries: +Output: ```text - F_xuv regime rate [kg/s] Kn_sc at Kn 0.1 at Kn 3 - 0.01 hydrostatic 4.989e-123 4.5e+18 hydrostatic hydrostatic - 0.587 hydrostatic 4.989e-123 3.92 hydrostatic hydrostatic - 2.28 hydrodynamic:EL 5.356e+05 0.118 hydrostatic hydrodynamic - 34.5 hydrodynamic:EL 8.090e+06 0.0127 hydrodynamic hydrodynamic - 520 hydrodynamic:EL 1.222e+08 0.00265 hydrodynamic hydrodynamic - 2.02e+03 hydrodynamic:RR 2.572e+08 0.00131 hydrodynamic hydrodynamic -boundary: hydrostatic to hydrodynamic:EL at 0.77 W m-2 -boundary: hydrodynamic:EL to hydrodynamic:RR at 567 W m-2 +0.7695387060616504 +566.3838601554727 +0.10311115795045854 ``` -The first crossing is the collisionality switch. Below 0.77 W m⁻² the heating is too weak to keep the gas collisional where a wind would go sonic, so the sonic-point Knudsen number `kn_sc` exceeds 1 and escape is per-particle from the exobase. Above it a fluid wind exists and the rate is the smaller of the two hydrodynamic limits. The second crossing at 567 W m⁻² is inside the wind: the recombination-limited rate drops below the energy-limited one and names the label. +The first crossing is the collisionality switch. Below 0.77 W m⁻² the heating is too weak to keep the gas collisional where a wind would go sonic, so the sonic-point Knudsen number `kn_sc` exceeds 1 and escape is per-particle from the exobase. Above it a fluid wind exists and the rate is the smaller of the two hydrodynamic limits. The second crossing, at 567 W m⁻², is inside the wind: the recombination-limited rate drops below the energy-limited one and names the label. -Run the same sweep on a nitrogen and oxygen atmosphere of the same mass and radius and both facts change: the wind sets in at 0.103 W m⁻², a factor 7.5 lower, and the recombination-limited rate never wins anywhere in the swept range. Composition moves the boundaries, not just the rates. +The third number is that first crossing for a nitrogen and oxygen atmosphere of the same mass and radius, and it sits a factor 7.5 lower. Composition moves the boundaries, not just the rates: that planet also never reaches the recombination-limited label anywhere in the swept range. ![Regime labels across an XUV flux sweep for two compositions](../assets/dispatcher_regime_sweep.png) Two things in that figure deserve attention. -**The shaded band.** The collisionality threshold has a default of 1 and a physical range of 0.1 to 3, because kinetic simulations place the fluid-to-kinetic transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed[^johnson]. That is heating-geometry physics, not a tuning parameter, and it makes the boundary a band: on the CO₂ planet the wind sets in anywhere between 0.61 and 2.6 W m⁻², a factor of 4.3, depending on which edge of the criterion you adopt. The dashed line is the default; the band is the honest width. Every verdict reports the label it would have carried at both edges, in `diagnostics['knudsen']['counterfactual_labels']`, so you never have to rerun a sweep to find this out. +**The shaded band.** The collisionality threshold has a default of 1 and a physical range of 0.1 to 3, because kinetic simulations place the fluid-to-kinetic transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed[^johnson]. That is heating-geometry physics, not a tuning parameter, and it makes the boundary a band: on the carbon dioxide planet the wind sets in anywhere between 0.61 and 2.6 W m⁻², a factor of 4.3, depending on which edge of the criterion you adopt. The dashed line is the default; the band is the honest width. Every verdict reports the label it would have carried at both edges, in `diagnostics['knudsen']['counterfactual_labels']`, so you never have to rerun a sweep to find this out. -**The open markers.** The hydrostatic rates on these two planets are 1e-123 and 1e-71 kg s⁻¹. Those are not small rates, they are zero with numerical noise attached: carbon dioxide at one Earth mass sits at an exobase Jeans parameter of 301, and $e^{-301}$ is not a number with physical content. Two yardsticks keep this straight: +**The open markers.** The hydrostatic rates on these two planets are $5.0 \times 10^{-123}$ and $1.5 \times 10^{-71}$ kg s⁻¹. Those are not small rates, they are zero with numerical noise attached: carbon dioxide at one Earth mass sits at an exobase Jeans parameter of 301, and $e^{-301}$ is not a number with physical content. Two yardsticks keep this straight: -- One proton crossing the surface per year, 5.3e-35 kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves this convention to you. +- One proton crossing the surface per year, $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves this convention to you. - Above that floor, ask whether the rate matters, by comparing it against the inventory and the age. The diagnostics already do this: `diagnostics['self_consistency']` divides the reservoirs by the rate and compares against the age you supplied. -A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing 2e-9 kg s⁻¹ loses 66 grams a year. +A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing $2 \times 10^{-9}$ kg s⁻¹ loses 66 grams a year. --- @@ -151,21 +192,45 @@ Two labels do not appear in that sweep, and neither depends on the XUV flux. An inflated hydrogen envelope flows out on the planet's own thermal energy before stellar XUV matters. The test is the restricted Jeans parameter $\Lambda$, the ratio of gravitational binding to thermal energy at the photospheric level, and the state is labeled `boiloff` while it sits below the threshold: +```python +inflated = dispatch(build_state('H/He', 1.0, 1.5, 10.0)) + +print(inflated.regime, inflated.mdot) +print(inflated.diagnostics['lambda_gate']) +print(inflated.diagnostics['documentation']['lambda_crit_band']) +print(sorted(inflated.flags)) +``` + +Output: + ```text -regime boiloff, rate 1.348e+14 kg/s, Lambda 11.1 (activation band 15 to 35) -flow radius 6.314e+07 m against Hill radius 1.160e+08 m, ratio 1.837 -flags ['base_clamp_decades', 'base_clamped', 'subcritical_sonic'] +boiloff 134848975815225.14 +11.10021097177663 +(15.0, 35.0) +['base_clamp_decades', 'base_clamped', 'subcritical_sonic'] ``` -At 1 Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 11.1$, well below the threshold of 20, and the rate is 1e14 kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. +At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 11.10$, well below the threshold of 20, and the rate is $1.3 \times 10^{14}$ kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. -The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Flags tell you what happened; deciding whether it matters is your job, and the [triage guide](../How-to/triage_verdict.md) is a shortcut for the common cases. +The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. -Push the same envelope to 3 Earth masses and 2 Earth radii and the flow stops being bound to the planet at all: +Push the same envelope to three Earth masses and two Earth radii and the flow stops being bound to the planet at all: + +```python +puffy = dispatch(build_state('H/He', 3.0, 2.0, 0.1)) +roche = puffy.diagnostics['roche'] + +print(puffy.regime, puffy.mdot) +print(roche['flow_radius'], roche['R_hill_periapsis'], roche['xi_flow']) +print(puffy.flags['roche_subflag']) +``` + +Output: ```text -regime roche_overflow, rate 1.038e+09 kg/s, Lambda 25 -flow radius 1.894e+08 m against Hill radius 1.673e+08 m, ratio 0.883 +roche_overflow 1037700965.4610901 +189433055.79726917 167277833.86655325 0.8830445835470955 +no_transonic ``` The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary rather than escaping through any of the other regimes, and the label says so. When you see this label, read `diagnostics['roche']` for the two radii and `diagnostics['bolometric']` for the rate that won: the label names the branch that won the rate comparison, and on a marginal case that branch can be the bolometric residual carrying a rate that is negligible in absolute terms. @@ -174,66 +239,118 @@ The flow radius of the winning branch now exceeds the Hill radius, so the atmosp ## Step 5: read the diagnostics -A call returns sixteen or seventeen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch control flow never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns sixteen or seventeen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. + +The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. Every snippet in this step uses the same result: -The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. +```python +result = dispatch(build_state('CO2', 1.0, 1.0, 10.0)) +``` -**Which branch, and how close was the switch?** +### Which branch, and how close was the switch? ```python kn = result.diagnostics['knudsen'] -kn['kn_sc'], kn['threshold_applied'], kn['counterfactual_labels'] -# 0.03003, 1, {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} +print(kn['kn_sc'], kn['threshold_applied']) +print(kn['counterfactual_labels']) +``` + +Output: + +```text +0.03002758706914175 1.0 +{0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} ``` -A Knudsen number of 0.03 against a threshold of 1 is a wind by a factor of 30, and the counterfactuals confirm the verdict survives both edges of the band. A value within a factor of a few of the threshold, or counterfactuals that disagree, means the label is a choice and not a measurement. +A Knudsen number of 0.03 against a threshold of 1 is a wind by a factor of 30, and the counterfactuals confirm the verdict survives both edges of the band. A value within a factor of a few of the threshold, or counterfactuals that disagree with each other, means the label is a choice and not a measurement. -**What set the rate?** +### What set the rate? ```python hy = result.diagnostics['hydrodynamic'] -hy['mdot_el'], hy['mdot_rr'], hy['selection_mechanism'], hy['T_wind'] -# 2.348e+06, 1.148e+07, 'EL-selected', 8431.0 +print(hy['mdot_el'], hy['mdot_rr']) +print(hy['selection_mechanism'], hy['T_wind'], hy['efficiency'], hy['K_tide']) ``` -Both candidates are always computed, so you can see the margin. `selection_mechanism` matters more than it looks: the minimum can select the recombination-limited rate two physically different ways, through genuine recombination saturation or through plain barometric suppression between the wind base and the sonic point, and calling the second one recombination-limited would be a category error. The mechanism string distinguishes them. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical 10 000 K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. +Output: -**Could the heating drive the flow at all?** +```text +2347722.550685174 11475561.253503852 +EL-selected 8430.51967382717 0.1 0.9175976086377635 +``` + +Both candidates are always computed, so you can see the margin. `selection_mechanism` matters more than it looks: the minimum can select the recombination-limited rate two physically different ways, through genuine recombination saturation or through plain barometric suppression between the wind base and the sonic point, and calling the second one recombination-limited would be a category error. The mechanism string names which one acted, with the caveat that its own switch at a base Jeans parameter of 4 is a reporting convention rather than a derived boundary. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical $10^{4}$ K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. + +### Could the heating drive the flow at all? ```python -result.diagnostics['johnson_q']['q_net_over_qc'] # 10.1 +print(result.diagnostics['johnson_q']['q_net_over_qc']) +``` + +Output: + +```text +10.112600626056176 ``` The transonic energy criterion[^johnson] compares the absorbed, efficiency-degraded power against the power needed to sustain a transonic outflow. A ratio below 1 says the heating cannot drive the flow sonic no matter what a rate formula returns. At 10.1 there is an order of magnitude in hand. -**How does this verdict translate into other taxonomies?** +### How does this verdict translate into other taxonomies? ```python -result.diagnostics['guo_triple'] # lambda_exo 301, lambda_rp 331, lambda_star 304 -result.diagnostics['potential_screens'] # log potential 11.796, verdict 'wind' -result.diagnostics['erkaev_tc_K'] # tidally corrected critical exobase temperature +print(result.diagnostics['guo_triple']) +print(result.diagnostics['potential_screens']['log_minus_phi_cgs']) +print(result.diagnostics['potential_screens']['salz_verdict']) +print(result.diagnostics['erkaev_tc_K']) +``` + +Output: + +```text +{'lambda_exo': 301.102296003742, 'lambda_rp': 330.8696490591677, + 'lambda_star': 303.6051987475083, + 'thresholds': 'thermally driven lambda < ~3; tidal lambda* < 3; XUV lambda* > 6'} +11.795855551916663 +wind +4233.123936051893 ``` -Different papers classify escape with different quantities. Reporting the Jeans-parameter triple and the threshold-potential screens beside the label lets a reader who thinks in one taxonomy check the verdict in theirs. +Different papers classify escape with different quantities. Reporting the Jeans-parameter triple, the threshold-potential screens, and the critical exobase temperature beside the label lets a reader who thinks in one taxonomy check the verdict in theirs. -**Is the snapshot self-consistent?** +### Is the snapshot self-consistent? ```python -result.diagnostics['fluid_check'] # worst_kn 0.124 over 120 levels, fluid True -result.diagnostics['self_consistency'] # empties in 6.95e+04 yr against 1.00e+08 yr -result.diagnostics['tang_timescale'] # boil-off termination timescales +print(result.diagnostics['fluid_check']) +print(result.diagnostics['self_consistency']) ``` -The fluid condition has to hold everywhere below the sonic surface, not only at it, so the check walks the profile levels and reports the worst local Knudsen number, declaring the truncation at the profile top. The consistency screen is the sharp one here: at 2.3e6 kg s⁻¹ this planet empties one Earth atmosphere in 70 000 years, against the 100 Myr age supplied with the state. The state is not wrong, but it cannot have persisted, and a static grid point that fails this screen is telling you the grid, not the code, needs a second look. +Output: -**Where was the wind launched, and where did the coefficients come from?** +```text +{'levels_checked': 120, 'worst_kn': 0.12382483136593705, 'fluid': True, + 'truncated_at_profile_top': True} +{'evaluated': True, 't_deplete_s': 2193615254279.937, 'age_s': 3155760000000000.0, + 'inconsistent': True} +``` + +The fluid condition has to hold everywhere below the sonic surface, not only at it, so the check walks the profile levels and reports the worst local Knudsen number, declaring the truncation at the profile top. The consistency screen is the sharp one here: at $2.3 \times 10^{6}$ kg s⁻¹ this planet empties one Earth atmosphere in 70 000 years, against the 100 Myr age supplied with the state. The state is not wrong, but it cannot have persisted, and a static grid point that fails this screen is telling you the grid, not the code, needs a second look. + +### Where was the wind launched, and where did the coefficients come from? ```python -result.diagnostics['base_level'] # p 3.312e-03 Pa, physical target the same, no clamp -result.diagnostics['knudsen']['provenance'] # {'C': 'laricchiuta', 'O': 'laricchiuta'} +print(result.diagnostics['base_level']) +print(result.diagnostics['knudsen']['provenance']) +``` + +Output: + +```text +{'p_Pa': 0.0033116709279622522, 'p_physical_Pa': 0.0033116709279622522, + 'r_m': 6828145.239345033, 'T_K': 999.7834337004138, 'clamp_decades': None} +{'C': 'laricchiuta', 'O': 'laricchiuta'} ``` -Collision cross sections come from a provenance ladder, from tabulated collision integrals down to a geometric hard sphere whose bias is documented. The provenance travels with the result, so a rate that rests on the last rung says so. +The base sits where the method asked for it, so nothing clamped. Collision cross sections come from tabulated collision integrals where they exist, a diffusion-coefficient inversion for hydrogen, and a geometric hard sphere as the last resort, whose bias is documented. Which one was used travels with the result, so a rate that rests on the last option says so. --- @@ -241,51 +358,136 @@ Collision cross sections come from a provenance ladder, from tabulated collision Four settings move a boundary rather than just a rate. All of them are in the [parameter reference](../Reference/parameters.md); what follows is what each one does to the answer. -**The collisionality threshold, across its band.** Bisect the wind boundary at each edge instead of guessing: +### The collisionality threshold, across its band + +Dispatch the same state at each edge of the criterion, then bisect the boundary itself: + +```python +for kn_crit in (0.1, 1.0, 3.0): + settings = DispatchSettings(kn_crit=kn_crit) + print(kn_crit, dispatch(build_state('CO2', 1.0, 1.0, 1.0, settings=settings)).regime) + +print(boundary_band('CO2')) # the boundary at kn_crit 3, then at 0.1 +``` + +Output: ```text -kn_crit 0.1: wind sets in at F_xuv = 2.639 W m-2 -kn_crit 1.0: wind sets in at F_xuv = 0.7695 W m-2 -kn_crit 3.0: wind sets in at F_xuv = 0.6118 W m-2 +0.1 hydrostatic +1.0 hydrodynamic:EL +3.0 hydrodynamic:EL +(0.6118163711150405, 2.63867996005799) ``` -A factor of 4.3 in boundary position, from a criterion whose own range is a factor of 30. That number is a result, not an error bar to hide: quote a regime boundary with it. +At 1 W m⁻² the same planet is hydrostatic under the strict edge of the criterion and a wind under the default. Across the band the boundary itself runs from 0.61 to 2.6 W m⁻², a factor of 4.3, from a criterion whose own range is a factor of 30. That number is a result, not an error bar to hide: quote a regime boundary with it. -**The exobase temperature.** The hydrostatic branch prescribes it, default 1000 K, and the Jeans flux depends on it exponentially, so it is the branch's dominant sensitivity. The lesson is sharper on a planet where hydrostatic escape does physical work: a Mars-mass planet whose carbon dioxide carries one percent hydrogen. +### The exobase temperature + +The hydrostatic branch prescribes it, default 1000 K, and the Jeans flux depends on it exponentially, so it is the branch's dominant sensitivity. The lesson is sharper on a planet where hydrostatic escape does physical work: a Mars-mass planet whose carbon dioxide carries 1% hydrogen. + +```python +for t_exo in (500.0, 1000.0, 2000.0): + settings = DispatchSettings(T_exo_value=t_exo) + out = dispatch(build_state('CO2 + 1% H2', 0.107, 0.53, 0.01, settings=settings)) + print(t_exo, out.regime, out.mdot, out.per_species['H'], out.per_species['C']) +``` + +Output: ```text -T_exo 500 K: hydrostatic rate 3.2861e+02 kg/s, H 3.286e+02, C 1.091e-24 -T_exo 1000 K: hydrostatic rate 3.5941e+02 kg/s, H 3.594e+02, C 7.672e-10 -T_exo 2000 K: hydrostatic rate 3.6912e+02 kg/s, H 3.690e+02, C 3.475e-02 +500.0 hydrostatic 328.6111274527813 328.6111274527813 1.0911011454535496e-24 +1000.0 hydrostatic 359.4124832776042 359.41248327479303 7.672381654045139e-10 +2000.0 hydrostatic 369.11630434704324 368.9889813172862 0.03474918563048364 +``` + +Over a factor of four in temperature the bulk rate moves by 12% while the carbon rate moves by 22 orders of magnitude. The reason is in the per-species detail: + +```python +species = out.diagnostics['hydrostatic']['detail']['species'] +print(species['H2']['lambda_exo']) +print(species['H2']['phi_jeans'], species['H2']['phi_diffusion']) ``` -Over a factor of four in temperature the bulk rate moves by 12 percent while the carbon rate moves by 22 orders of magnitude. The reason is in the per-species detail: hydrogen sits at an exobase Jeans parameter of 1.59 with a Jeans flux of 5.4e15 against a diffusion-limited supply of 2.7e14, so its escape is set by how fast diffusion resupplies it through the heavy background and the exobase temperature barely enters. Carbon and oxygen are Jeans limited and carry the whole exponential. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. +Output: + +```text +0.7405112884785615 +8714304920630702.0 270144275279648.22 +``` + +At 2000 K hydrogen sits at an exobase Jeans parameter below 1, with a Jeans flux far above the supply diffusion can deliver through the heavy background, so its escape is set by the supply and the exobase temperature barely enters. Carbon and oxygen are Jeans limited and carry the whole exponential. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. + +### Fractionation -**Fractionation.** A confirmed wind partitions over species through the closure; anything else splits by reservoir mass fractions. +A confirmed wind partitions over species through the closure described on the [fractionation page](../Explanations/fractionation.md), which solves for which species escape and how fast at a given bulk rate. Every other branch splits by reservoir mass fractions: + +```python +for fractionate in (True, False): + settings = DispatchSettings(fractionate=fractionate) + out = dispatch(build_state('CO2', 1.0, 1.0, 10.0, settings=settings)) + total = sum(out.per_species.values()) + print(fractionate, {el: round(v / total, 4) for el, v in sorted(out.per_species.items())}) +``` + +Output: ```text -closure C 0.2815, O 0.7185 -reservoir mass fractions C 0.2729, O 0.7271 +True {'C': 0.2815, 'O': 0.7185} +False {'C': 0.2729, 'O': 0.7271} ``` -A three percent shift, with the lighter element enriched, which is the right size for a well-coupled heavy wind and a reminder that a per-species output is sometimes a bulk split wearing a per-species shape. Where fractionation is strong, this comparison is the whole story of how the atmospheric mean molecular weight evolves. +A 3% shift, with the lighter element enriched, which is the right size for a well-coupled heavy wind and a reminder that a per-species output is sometimes a bulk split wearing a per-species shape. Where fractionation is strong, this comparison is the whole story of how the atmospheric mean molecular weight evolves. + +### The efficiency + +Sweeping the energy-limited efficiency across its literature range moves the rate linearly and can move the sub-label: -**The efficiency.** Sweeping the energy-limited efficiency across its literature range moves the rate linearly and can move the sub-label: +```python +for eps in (0.1, 0.3, 0.6): + out = dispatch(build_state('CO2', 1.0, 1.0, 10.0, + settings=DispatchSettings(efficiency=eps))) + hy = out.diagnostics['hydrodynamic'] + print(eps, out.regime, out.mdot, hy['mdot_el'], hy['mdot_rr']) + +fitted = dispatch(build_state('CO2', 1.0, 1.0, 10.0, + settings=DispatchSettings(efficiency_mode='caldiroli'))) +print(fitted.diagnostics['hydrodynamic']['efficiency'], sorted(fitted.flags)) +``` + +Output: ```text -epsilon 0.10: hydrodynamic:EL rate 2.3477e+06 (EL 2.348e+06, RR 1.148e+07) -epsilon 0.60: hydrodynamic:RR rate 1.1476e+07 (EL 1.409e+07, RR 1.148e+07) +0.1 hydrodynamic:EL 2347722.550685174 2347722.550685174 11475561.253503852 +0.3 hydrodynamic:EL 7043167.652055521 7043167.652055521 11475561.253503852 +0.6 hydrodynamic:RR 11475561.253503852 14086335.304111041 11475561.253503852 +0.7908366641614278 ['caldiroli_out_of_box'] ``` At 0.6 the energy-limited candidate overtakes the recombination-limited one and the label changes without the physics of the wind changing at all: the minimum switched hands, nothing else. The fitted-efficiency option returns 0.791 for this planet with `caldiroli_out_of_box` raised, because a one Earth-mass planet sits below the gravitational potential range the fit was made on[^caldiroli]. That is the guard working. Take the flag seriously rather than the number. -**One more, for evolutionary use.** Supply the previous label and a hysteresis window opens around the threshold, so a time-stepping track cannot chatter between branches on numerical noise: +### One more, for evolutionary use + +Supply the previous label and a hysteresis window opens around the threshold, so a time-stepping track cannot chatter between branches on numerical noise: + +```python +for f_xuv in (0.747, 0.793): + for previous in (None, 'hydrostatic', 'hydrodynamic:EL'): + state = build_state('CO2', 1.0, 1.0, f_xuv) + state.prev_regime = previous + out = dispatch(state) + kn = out.diagnostics['knudsen'] + print(f_xuv, previous, out.regime, round(kn['kn_sc'], 3), kn['threshold_applied']) +``` + +Output: ```text -F_xuv 0.747, previously None -> hydrostatic (Kn_sc 1.124, threshold 1) -F_xuv 0.747, previously hydrodynamic:EL -> hydrodynamic:EL (Kn_sc 1.124, threshold 1.5) -F_xuv 0.793, previously None -> hydrodynamic:EL (Kn_sc 0.898, threshold 1) -F_xuv 0.793, previously hydrostatic -> hydrostatic (Kn_sc 0.898, threshold 0.667) +0.747 None hydrostatic 1.124 1.0 +0.747 hydrostatic hydrostatic 1.124 0.6666666666666666 +0.747 hydrodynamic:EL hydrodynamic:EL 1.124 1.5 +0.793 None hydrodynamic:EL 0.898 1.0 +0.793 hydrostatic hydrostatic 0.898 0.6666666666666666 +0.793 hydrodynamic:EL hydrodynamic:EL 0.898 1.5 ``` Inside the window the previous label wins, in both directions, and the applied threshold in the diagnostics tells you when the memory was in use. @@ -294,58 +496,62 @@ Inside the window the previous label wins, in both directions, and the applied t ## Step 7: dispatch along a stellar history -Nothing so far needed a star with a history. Load one, derive the XUV and bolometric fluxes from its track, and dispatch the same frozen atmosphere at each age: +Nothing so far needed a star with a history. Load one, derive the XUV and bolometric fluxes from its track, and dispatch the same frozen atmosphere at each age. That is what `stellar_track` does, for a one Earth-mass planet at 0.2 au carrying carbon dioxide with 1% hydrogen and an inventory of 100 Earth atmospheres: ```python -star = mors.Star(Mstar=1.0, Omega=1.0) -f_xuv = (star.Tracks['Lx'] + star.Tracks['Leuv']) * 1e-7 / (4 * np.pi * a**2) -l_bol = star.Tracks['Lbol'] * 1e-7 -``` +rows = stellar_track(n_samples=40) -!!! warning "This is a sequence of snapshots, not an evolution" - The profile does not change along the track. A real planet's structure responds to the loss, to its own cooling, and to the star, so treat what follows as the same atmosphere asked the same question at many stellar ages. The framework is not wired into the coupled loop yet; see [coupling to PROTEUS](../Explanations/proteus.md) for the status. +for row in rows[::6]: + print(f'{row["age_Myr"]:9.1f} {row["F_xuv"]:8.3g} {row["regime"]:<17} ' + f'{row["mdot"]:11.3e} {row["kn_sc"]:9.3g} {row["inconsistent"]}') +``` -For a one Earth-mass planet at 0.2 au, carbon dioxide with one percent hydrogen, and an inventory of 100 Earth atmospheres: +Output: ```text - age [Myr] F_xuv regime rate [kg/s] Kn_sc snapshot - 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 consistent - 45.0 1.62 hydrodynamic:EL 3.542e+05 0.265 consistent - 310.1 1.4 hydrodynamic:EL 3.045e+05 0.388 inconsistent - 1138.9 0.852 hydrostatic 4.695e-02 4.81 consistent - 3039.5 0.495 hydrostatic 4.695e-02 6.73e+03 consistent - 9439.6 0.324 hydrostatic 4.695e-02 4.83e+07 consistent -label changes from hydrodynamic:EL to hydrostatic between 767 and 939 Myr, -and the rate drops from 2.273e+05 to 4.695e-02 kg/s + 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 False + 45.0 1.62 hydrodynamic:EL 3.542e+05 0.265 False + 310.1 1.4 hydrodynamic:EL 3.045e+05 0.388 True + 1138.9 0.852 hydrostatic 4.695e-02 4.81 False + 3039.5 0.495 hydrostatic 4.695e-02 6.73e+03 False + 6189.6 0.34 hydrostatic 4.695e-02 1.58e+07 False + 9439.6 0.324 hydrostatic 4.695e-02 4.83e+07 False ``` -Four things in that table are worth more than the rest of this page. +The flux conversion is worth reading in the source: MORS returns X-ray and extreme-ultraviolet luminosities in erg s⁻¹, and the state needs W m⁻² at the planet. + +!!! warning "This is a sequence of snapshots, not an evolution" + The profile does not change along the track. A real planet's structure responds to the loss, to its own cooling, and to the star, so treat what follows as the same atmosphere asked the same question at many stellar ages. The framework is not wired into the coupled loop yet; see [coupling to PROTEUS](../Explanations/proteus.md) for the status. + +![The same atmosphere dispatched along a solar XUV history](../assets/dispatcher_track.png) + +Four things in that figure are worth more than the rest of this page. -The label belongs to the state, not to the planet. Nothing about the planet changed; the star quieted down, the Knudsen number climbed smoothly through its threshold, and the physics of the loss changed character. +The label belongs to the state, not to the planet. Nothing about the planet changed; the star quieted down, the Knudsen number climbed smoothly through its threshold, and the physics of the loss changed character near 850 Myr. -The rate drops by almost seven orders of magnitude at the crossing. The switch is deliberately sharp, with no blend function between branches, so the size of that jump is a measurement you can quote rather than an artifact a smoothing function hides. It is also the honest scale of the disagreement between the two prescriptions at the same physical state. +The rate drops by almost seven orders of magnitude at the crossing, from $2.3 \times 10^{5}$ to $4.7 \times 10^{-2}$ kg s⁻¹. The switch is deliberately sharp, with no blend function between branches, so the size of that jump is a measurement you can quote rather than an artifact a smoothing function hides. It is also the honest scale of the disagreement between the two prescriptions at the same physical state. -What escapes changes with the branch. In the wind phase carbon and oxygen leave with the hydrogen; in the exosphere phase hydrogen leaves alone, and the heavy elements are pinned at 1e-140 kg s⁻¹. A planet crossing this boundary stops losing its atmosphere and starts losing only its hydrogen. +What escapes changes with the branch, which is the lower panel. In the wind phase carbon and oxygen leave with the hydrogen; in the exosphere phase hydrogen leaves alone and the heavy elements sit at $10^{-140}$ kg s⁻¹. A planet crossing this boundary stops losing its atmosphere and starts losing only its hydrogen. -The hydrostatic rate is flat, at 4.695e-02 kg s⁻¹ for ten billion years, because the branch has no XUV physics in it: prescribed exobase temperature, frozen profile, and diffusion-limited supply that does not know about the star. That flat line is a visible reminder of what the branch does not model. It is also why hydrostatic heavy-element rates carry a lower-limit flag: the nonthermal channels that actually remove heavy species from a real exosphere are absent. +The hydrostatic rate is flat, at $4.695 \times 10^{-2}$ kg s⁻¹ for ten billion years, because that branch has no XUV physics in it: a prescribed exobase temperature, a frozen profile, and a diffusion-limited supply that does not know about the star. The flat line is a visible reminder of what the branch does not model. It is also why hydrostatic heavy-element rates carry a lower-limit flag: the nonthermal channels that actually remove heavy species from a real exosphere are absent. -And the consistency screen fires in the middle of the track, not at the ends. Between about 40 and 800 Myr the dispatched rate would have emptied the supplied inventory faster than the star aged, so those snapshots are not compatible with their own ages. After the crossing the screen goes quiet again, but read that carefully: the state became consistent because escape effectively stopped, not because the inventory survived. +And the consistency screen fires in the middle of the track, not at the ends, which is the shaded span. Between about 40 and 800 Myr the dispatched rate would have emptied the supplied inventory faster than the star aged, so those snapshots are not compatible with their own ages. After the crossing the screen goes quiet again, but read that carefully: the state became consistent because escape effectively stopped, not because the inventory survived. --- ## Things to try - **Move the planet.** Run the track at 0.1 and at 0.4 au. The crossing age moves; find where the planet never leaves the wind regime within the age of the star. -- **Change the composition at fixed mass and radius.** Add water instead of hydrogen, or drop the hydrogen entirely, and watch both the boundary position and the post-crossing rate respond. -- **Sweep the exobase temperature on a heavy atmosphere.** Confirm for yourself that a pure carbon dioxide planet returns rates far below the floor at every temperature in the range, and that the boundary between "computed" and "meaningful" is where the floor sits. -- **Print the whole container.** `pprint(result.diagnostics)` on one call, and read the groups this page skipped: `bolometric`, `thermostat`, `closure`, and `documentation`, which carries the criterion bands themselves so a stored result is self-describing. +- **Change the composition at fixed mass and radius.** Add water instead of hydrogen, or drop the hydrogen entirely, and watch both the boundary position and the rate after the crossing respond. +- **Sweep the exobase temperature on a heavy atmosphere.** Confirm for yourself that a pure carbon dioxide planet returns rates far below the floor at every temperature in the range, and that the line between computed and meaningful is where the floor sits. +- **Print the whole container.** `pprint(result.diagnostics)` on one call, and read the groups this page skipped: `bolometric`, `thermostat`, `closure`, and `documentation`, which carries the criterion bands themselves so a stored result describes itself. - **Break a state on purpose.** Give the profile an increasing pressure or a negative mass and confirm the `ValueError`, so you know what a malformed state looks like as opposed to an extreme one. ## Where to go next - [Escape regimes](../Explanations/regimes.md): every branch, threshold, and equation behind this page. - [Dispatch results](../Reference/results.md): every flag and every diagnostics key. -- [Triage a verdict](../How-to/triage_verdict.md): a flag fired, or the answer looks wrong. +- [Troubleshooting the dispatcher](../How-to/troubleshooting.md): a flag fired, or the answer looks wrong. - [Model parameters](../Reference/parameters.md): every setting and input, with defaults. - [Limitations](../Explanations/limitations.md): what none of this models. diff --git a/docs/Tutorials/first_run.md b/docs/Tutorials/first_run.md index 402191f0..729a5955 100644 --- a/docs/Tutorials/first_run.md +++ b/docs/Tutorials/first_run.md @@ -67,7 +67,7 @@ Rxuv = Re # XUV planetary radius A few choices worth noting: -- `epsilon = 0.15` is the conservative value adopted by Kasting & Pollack (1983) [^kp83] and used in many subsequent rocky-planet studies. The full plausible range is roughly $0.1$–$0.6$. +- `epsilon = 0.15` is the conservative value adopted by Kasting & Pollack (1983) [^kp83] and used in many subsequent rocky-planet studies. The full plausible range is roughly 0.1 to 0.6. - `Rxuv = Re` sets the XUV-absorbing radius equal to the planetary radius. This is a lower bound on the mass-loss rate; allowing $R_\mathrm{XUV} > R_p$ would increase escape. - `tidal_contribution = False` ignores the Roche-lobe enhancement of escape. At 1 au this is a negligible correction, but for close-in planets it should be enabled. @@ -85,7 +85,7 @@ Fxuv_star_SI = Fxuv_star*ergcm2stoWm2 # XUV flux `mors.Star` loads the full rotational and high-energy evolutionary track for a $1\,M_\odot$ star rotating at the solar rate. The X-ray and EUV luminosities are summed to give the total XUV luminosity, which is then converted to an irradiation flux at the planet's orbital distance using the inverse-square law. The final SI conversion uses the `ergcm2stoWm2` factor from `zephyrus.constants`. -`Age_star`, `Lxuv_star`, and `Fxuv_star_SI` are all arrays of the same length — one entry per timestep of the MORS track. +`Age_star`, `Lxuv_star`, and `Fxuv_star_SI` are all arrays of the same length, one entry per timestep of the MORS track. --- @@ -129,7 +129,7 @@ plt.savefig('output/demo_earth_escape_vs_time_MORS.pdf', dpi=180) The right-hand axis converts the SI mass-loss rate (kg s$^{-1}$) into Earth masses per year ($M_\oplus$ yr$^{-1}$) so you can read off how much of the planet is lost per unit time in more intuitive units. The conversion uses `s2yr` and `Me`, both from the ZEPHYRUS imports. -You should see a curve that peaks near $5 \times 10^5$ kg s$^{-1}$ at 1 Myr, drops by roughly a factor of 30 over the first ~30 Myr, plateaus through ~30–200 Myr, and then declines slowly to a few × 10$^3$ kg s$^{-1}$ by the end of the main sequence. On the right axis these correspond to $\sim 10^{-12}$ down to $\sim 10^{-13}\,M_\oplus$ yr$^{-1}$. +You should see a curve that peaks near $7 \times 10^5$ kg s$^{-1}$ at 1 Myr, drops by roughly a factor of 40 over the first 30 Myr, plateaus near $1.8 \times 10^4$ kg s$^{-1}$ through roughly 30 to 200 Myr, and then declines slowly to about $5 \times 10^3$ kg s$^{-1}$ by the end of the track. On the right axis these correspond to $\sim 10^{-12}$ down to $\sim 10^{-13}\,M_\oplus$ yr$^{-1}$. --- diff --git a/docs/Validation/boiloff.md b/docs/Validation/boiloff.md index 5f0f1c05..0fdac7ec 100644 --- a/docs/Validation/boiloff.md +++ b/docs/Validation/boiloff.md @@ -4,8 +4,8 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the boil- | Test id | Reference | Scope | |---|---|---| -| `tests/test_boiloff.py::test_parker_mach_sonic_limit_and_shutoff` | Owen & Wu (2016), ApJ 817, 107 (isothermal transonic Parker wind, Lambert-W form) | The photospheric Mach number is exactly 1 with the launch level at the Bondi radius (the analytical sonic-point limit), falls monotonically as the level retreats inward, and has collapsed by more than six decades at their published shutoff R_p/R_B = 0.1. | -| `tests/test_boiloff.py::test_lambda_equals_two_bondi_radii_over_rp` | Fossati et al. (2017), A&A 598, A90 (restricted Jeans parameter); Owen & Wu (2016), ApJ 817, 107 | The identity Lambda = 2 R_B / R_p holds exactly for every mean molecular mass, which is what makes the Owen & Wu shutoff equal to Lambda = 20 for every composition; the literature band 15 to 35 brackets the default threshold. | +| `tests/test_boiloff.py::test_parker_mach_sonic_limit_and_shutoff` | Owen & Wu (2016), ApJ 817, 107 (isothermal transonic Parker wind, Lambert-W form) | The photospheric Mach number is 1 identically with the launch level at the Bondi radius (the analytical sonic-point limit), falls monotonically as the level retreats inward, and has collapsed by more than six decades at their published shutoff R_p/R_B = 0.1. | +| `tests/test_boiloff.py::test_lambda_equals_two_bondi_radii_over_rp` | Fossati et al. (2017), A&A 598, A90 (restricted Jeans parameter); Owen & Wu (2016), ApJ 817, 107 | The identity Lambda = 2 R_B / R_p holds for every mean molecular mass, which is what makes the Owen & Wu shutoff equal to Lambda = 20 for every composition; the literature band 15 to 35 brackets the default threshold. | ## Notes diff --git a/docs/Validation/diffusion.md b/docs/Validation/diffusion.md index 0d9c5dd7..e5d25010 100644 --- a/docs/Validation/diffusion.md +++ b/docs/Validation/diffusion.md @@ -4,12 +4,12 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the binar | Test id | Reference | Scope | |---|---|---| -| `tests/test_diffusion.py::test_sn88_unit_reading_matches_zk86_table` | Sasaki & Nakazawa (1988), EPSL 89, 323, Table 1; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The unit reading of the Sasaki & Nakazawa table (which prints no units) reproduces five in-H2 entries of the independent 1986 compilation to 3 percent; no other unit choice comes within two orders of magnitude. | -| `tests/test_diffusion.py::test_zk23_zk86_cross_compilation_agreement` | Zahnle & Kasting (2023), GeCoA 361, 228, Table 2; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The shared rows of the two compilations agree to 4 percent where measured (Marrero & Mason 1972 lineage) and within 35 percent where the 2023 rows are estimates, with the measured rows agreeing more tightly than the estimated ones. | +| `tests/test_diffusion.py::test_sn88_unit_reading_matches_zk86_table` | Sasaki & Nakazawa (1988), EPSL 89, 323, Table 1; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The unit reading of the Sasaki & Nakazawa table (which prints no units) reproduces five in-H2 entries of the independent 1986 compilation to 3%; no other unit choice comes within two orders of magnitude. | +| `tests/test_diffusion.py::test_zk23_zk86_cross_compilation_agreement` | Zahnle & Kasting (2023), GeCoA 361, 228, Table 2; Zahnle & Kasting (1986), Icarus 68, 462, Table I | The shared rows of the two compilations agree to 4% where measured (Marrero & Mason 1972 lineage) and within 35% where the 2023 rows are estimates, with the measured rows agreeing more tightly than the estimated ones. | ## Notes -The Eq. (10) scaling rule is validated in sample on the three atomic rows the 2023 authors themselves obtained by scaling, and out of sample on the Kr and Xe rows of the 1986 table (which are not sources of this library), landing inside the 30 percent scaled provenance class in natural log. +The Eq. (10) scaling rule is validated in sample on the three atomic rows the 2023 authors themselves obtained by scaling, and out of sample on the Kr and Xe rows of the 1986 table (which are not sources of this library), landing inside the 30% scaled provenance class in natural log. ## Anchor type diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md index 1e5c6bd7..b2e286d3 100644 --- a/docs/Validation/fractionation.md +++ b/docs/Validation/fractionation.md @@ -9,7 +9,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-spe | `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | | `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | | `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | -| `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1 percent. | +| `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1%. | | `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to 1e-12 relative, with flux continuity at the crossover and exact mass conservation. | ## Notes diff --git a/docs/Validation/hydrodynamic.md b/docs/Validation/hydrodynamic.md index 396537ff..1dc91a15 100644 --- a/docs/Validation/hydrodynamic.md +++ b/docs/Validation/hydrodynamic.md @@ -4,10 +4,10 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | Test id | Reference | Scope | |---|---|---| -| `tests/test_hydrodynamic.py::test_erkaev_table1_enhancement_factors` | Erkaev et al. (2007), A&A 472, 329, Table 1 and Eq. 17 | The tidal factor reproduces all seven printed enhancement factors 1/K within 1 percent, falling monotonically toward 1 with xi. | -| `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5 percent across three decades of collapse, and the complex-valued region below F_XUV/rho_p = 1e2 (cgs) is rejected with a flag rather than evaluated. | +| `tests/test_hydrodynamic.py::test_erkaev_table1_enhancement_factors` | Erkaev et al. (2007), A&A 472, 329, Table 1 and Eq. 17 | The tidal factor reproduces all seven printed enhancement factors 1/K within 1%, falling monotonically toward 1 with xi. | +| `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5% across three decades of collapse, and the complex-valued region below F_XUV/rho_p = 1e2 (cgs) is rejected with a flag rather than evaluated. | | `tests/test_hydrodynamic.py::test_wind_mean_masses_reproduce_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed H/He pair (0.62, 1.3) and steam pair (3, 6) in proton masses. | -| `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5 percent), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers (1e-4 and 1e-5 at 450 and 5e5 erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | +| `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5%), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers (1e-4 and 1e-5 at 450 and 5e5 erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | ## Notes diff --git a/docs/Validation/hydrostatic.md b/docs/Validation/hydrostatic.md index 595bbbc2..e97be578 100644 --- a/docs/Validation/hydrostatic.md +++ b/docs/Validation/hydrostatic.md @@ -5,7 +5,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | Test id | Reference | Scope | |---|---|---| | `tests/test_hydrostatic.py::test_volkov_eq9_unity_limit_and_printed_coefficient` | Volkov et al. (2011), Phys. Fluids 23, 066601, Eq. 9 and their printed c(lambda) table | The drifting-Maxwellian flux ratio reduces to unity at zero bulk velocity and reproduces the printed linear coefficient across lambda 1 to 106; the test also demonstrates that this correction and the flat kinetic factor the branch applies have opposite slopes in lambda, so applying both would double-count. | -| `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at 2.4e8 cm^-2 s^-1 (40 percent tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | +| `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at 2.4e8 cm^-2 s^-1 (40% tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | ## Notes diff --git a/docs/Validation/knudsen.md b/docs/Validation/knudsen.md index 61bbdfc4..3df1bf1d 100644 --- a/docs/Validation/knudsen.md +++ b/docs/Validation/knudsen.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the colli | Test id | Reference | Scope | |---|---|---| -| `tests/test_knudsen.py::test_viscosities_reproduce_measurements_within_7_percent` | Laricchiuta et al. (2009), EPJD 54, 607 (phenomenological collision integrals, Eqs. 2 to 4 with their appendix Tables 3 to 5); measured 300 K dynamic viscosities of N2, O2, CO, and CO2 (CRC Handbook values) | The first Chapman-Enskog approximation built on the transcribed Omega(2,2)* integrals reproduces all four measured viscosities within 7 percent, anchoring the whole coefficient transcription on laboratory measurements. | +| `tests/test_knudsen.py::test_viscosities_reproduce_measurements_within_7_percent` | Laricchiuta et al. (2009), EPJD 54, 607 (phenomenological collision integrals, Eqs. 2 to 4 with their appendix Tables 3 to 5); measured 300 K dynamic viscosities of N2, O2, CO, and CO2 (CRC Handbook values) | The first Chapman-Enskog approximation built on the transcribed Omega(2,2)* integrals reproduces all four measured viscosities within 7%, anchoring the whole coefficient transcription on laboratory measurements. | ## Notes diff --git a/docs/Validation/profiles.md b/docs/Validation/profiles.md index c31fdc05..2c69d277 100644 --- a/docs/Validation/profiles.md +++ b/docs/Validation/profiles.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the escap | Test id | Reference | Scope | |---|---|---| -| `tests/test_profiles.py::test_lopez_base_pressure_is_the_nanobar_level` | Lopez (2017), MNRAS 472, 245, Section 2 (wind-base prescription); Murray-Clay et al. (2009), ApJ 693, 23, Section 2.1 (the nanobar tau = 1 level) | Pins the Lopez base pressure `P_base = mu g / sigma_nu0` to the published nanobar scale (within a factor of a few of 1e-4 Pa) for the Murray-Clay fiducial hot Jupiter, with exact linearity in gravity and insensitivity to the proton-mass versus atomic-weight convention below 1 percent. | +| `tests/test_profiles.py::test_lopez_base_pressure_is_the_nanobar_level` | Lopez (2017), MNRAS 472, 245, Section 2 (wind-base prescription); Murray-Clay et al. (2009), ApJ 693, 23, Section 2.1 (the nanobar tau = 1 level) | Pins the Lopez base pressure `P_base = mu g / sigma_nu0` to the published nanobar scale (within a factor of a few of 1e-4 Pa) for the Murray-Clay fiducial hot Jupiter, with exact linearity in gravity and insensitivity to the proton-mass versus atomic-weight convention below 1%. | ## Notes diff --git a/docs/assets/dispatcher_regime_sweep.png b/docs/assets/dispatcher_regime_sweep.png index 5d0af9a1c663d1c6cdcfb05e36cf1d4a0fa90b8d..374438505af71b69296b6c701919dd108f56cc00 100644 GIT binary patch literal 253189 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 z

VhaBmwi>H?jN;ij1n2L<+{;@H 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
Dc}I*)I( zy(#3D32M{$(k2iRPIr)Ez#GkP-Iuz)RF3o{boVW2@;1#sS@wLgFf|?hBVHdTQ*bG9Yx2#a21{YNApOt1sx3lcE)~A@5 zp9hWD1&$%&(Z$BIv$844hT4{#ifu_pkTY?@8#d}`3!@EFVEOr5^dYkZl_+ZSv-HrB z+HJ&l(qUuP`7&_v{(jdyo^9KcD&~2tqZYcxXI6(m5gwG9XwNPkdy!H<$?g)ct)A~XyHL`wl3w=#1rzQO_5qZT5z_!>xN zEw!r)+~%S)!mC(xAnWwNEiW;#y*>AmEQ23K=lW!vN=7;*$W%spy19G$Bn^({O{{gL zK933U5g{IkwV+;0qpH*(Vae4X{aTWcwW zz0*S!ZvmOvXyBQ&YYzcirVAV(fR`{DwB0~CVs4m!@Y#yFHtQaAR_tpIJ|#IBLCh@o zX3(>;W=-_6AHNPKDTLodXNT#m;x>oQ0>cBITfGfJW?z2nzkNmoimcGpn_(D7p5Wuv z9_!qq%OCd8#WH1^H#JCsj*8jrp2W=d!~!iWPeRYEcULH3B~}(;=D-ziAK|**rfSp6 zt!LPp+aIVp@(Bb7{DSsFEL|emm5ks(DFFQn25^#^HO3Gz^gwnrPru5I@IHRfTH{fw zvp3@$7M&nQTs{?N*VL#_?;WM@_DbKI$j8LUxE9WS{wTdzuEHdjqBy>+ZITN?TjbTu zQG>{Jl?_~LINC*(;5qP1oGS-7in;-umjmZXW%bcXP+Nj*j5g5?)hcUkij_%6DezaL z#kOY*6HJC*`3FLINw`LH58k7i6AFu5r>7=G`1$#sr+ZX0^0knF@w~Url{2Ml2LKH! z>L@eGId6Zv5amdgS-%750YZR|H1Fvb^cm1GC9SX0C;*~qO0&`&qnyZTU}2{gS=&o~ z&LbJ}oj_cHAF>HJ(}JIBpf~MNEW!iKVG2k#S;fTxJt{jrxIq?Y*C9*IKjQ$l4n$#H!%L6f-b={7aJ5)7wC?An@3)j}V;_IsCC%&#EG+ET}GS!h5*N=S;9V3(2?8gEHx%w$=>H@9{WQ#Nz1L20X~qKmyeD>)Pa5 z>23Yr8#Zo>Ss9MQqR!ozAPG8(k8YyuH>IVgk@KMM&0L-D%I)#s16YhV)f7ASJB?3H zHjmq}0-t&o+yl_MfU}+g#MaB@_mYHG2So23I&_Gzm?I0!l2R+6`=VGL% z?Rg-FVzs=rF>eMXwgAdIkJ84YAT^I2#A5|)Ajg&m_600uI^=Mse%EeHjlEG+Ha8zM-ZDF=7VG$q zZitIN7FEv-kv1WST?x(=G5MNTFze|w4)y0Urcy%0z9EH)kXVJIZNyir1|^qykHG<0 zJ2i%WSQl%1Zh28mtltD7r7PQ})ARVYkAM`Dg9{8uAr6QzRGK5FsM~950Oh$G(kHcC z8%Gf#$F)~iRc{y<8WVYSpl@iqe*`;piS?6{lLOG}X_`|h;a#VTt@@=8EKftDBwZx+*c0CNYTP6#K)(;Zu3NnX%7+AhA88lo!x-?vm4Z+*C)~=mOm4SRexBEo|rVU zUvWAhyw@jvWcdLDIm7nKl>O`KZ6~?or}!$lWy(uT=CV8ngg9=6b`RuUheEd?8t=5E zlIeLPvB8%IK75HXJZ}1x+j;()h<*`|;vIhDbLO@asimqX^@-DtA0DgNie7^~=RDw6WO?F5_E~h|G~eBfW>n)H{;UDB z%Bqp@XWBVh@0@vxcI%4s{jAs-`$F0E{ZD?3Uf=uahzyc}ZvO)8%F*Vp3WkDy&jDh< zi@09}Y49>q2V~!~ecOMEnsqrdN-T$T(~K+q$}{pmLzj4?QZ~V!nxZgL#r=nE$!fFl zAc5h-PS1VLde?m?aXd4G?r@U^kAxJEv<}%PDQSd_`_e_}NdGK^$O~TWroJAXP2exn z%^ciC>fXc%wTA2n*ES3H(+fLa0!E9_Dd1TXy(aXRF6#%oMgGniXQuwE+N?smsH8Iw ziZ6?Ck8SL9pN5|$sw-sNsaU!rkLUgC+e_{ybtGe$u#Jp3Tal~&FZQt7CblaPo#Xsn z$+PNAb^lOHlU0*if|-5>>fyV^H@D92lp8^@_uWSbMTps}YlWI;|8y(7aGKP&jrU=B z9Z1>O_b-1rKY-^qYNWu7>7V&4QI!De?DOz&W1%t|gIA$yFyrGt?E;`8{v;2Ibk}4D z_rNV^?E`*sZPLu){iI}Be$-6w8ELK=%KGdxrW zp(?(KP!(T9L@IrZ8L}X0HaRd@V{bt}N&@Nr8 zZ>4`kI#?xp?z=;J$?=~juB34h+L3PBE8@xwLqfZ?H$s%vC)%MJgV*a*x6tO7CowMA zD#S7jSUaO|h-i{?puYfPd)>|be^|YN0XWwVgyP88JsYV^b^nW zBVGyU3g)3CI23d#)>lvnhJw>mL3H*d!NOkoNYDxAQ`hnzAoHXjb9rmV6#a)VkBscW zedillx}2kA;XB;ih5PGGAw|8%%NC^7yrVB4-PlXf$m!aXFX6Ri)1{I zD@X^6-2n`E0qp$UG)PyY%v*Uc(j)#0J56oVS9bpHj*}@!JCfIbKsAotj4v)sfd$6T zdHT#%j`9;1o6!XGj?*n~1@AyH1SAZM%whCv_} zP?grtGwWUc{MIj+RC49xW*#QbP6;=Rf^w6Rs zHI@0m2)U?JdDYS!%AllXt9(C>II!m2k2328hVcK)t8l-tgp};<+wFoT32AT`dJ`x= z6iWv@QV`5wHwH8?;dhE6uidhi(A?Tbx4CsH1lmf*0t+E=y_tiPr~9Pg46o9kon^Y{ zG#M4MKRGa{kX0;OHl+Cw%o{Wtqpy5t(-sukqi}gu+V;k6?E)&*9d%GI1viTB87#AX z6Ysuti`IVT5H;U~CBmlI)X1lJ2eC_CFM!2hO!HriM72#{NYDIi7ioDf?DaK*@sA0P z-4|W{LDVk%qDA5{aXI8f8xBgL0(E^t62||a5pSaX z>Zl~?PzUP{=K71yEK%Qy8=f7f{?haxy!Al5 z)1Rd!hOg6?Djs}9=sjm|JO$^D>J=qcRoVi8@22-yE07KpQfW9QbPw4k{5HKOe|$!+ zAO}a*b^w`TZ!8#UIrx_hImui@KWm5Ugvv<8gV)fGWT&2A%A4*=R>=s)j8D)2W>4T( zi1-<^jxkokNJCar8&{^|Ab^FYdMEYUAt{%Llx_dI$KXgXlY$eJ?_`Z2ZpX6^H#dzt zoZG%kV^+l0M>n!mvbeP5xYSZgZQdrb6b^l8rX!GsB1udF0*a$~Z|`Rk=UcGl>L3z6 ziR|DErcj7psAxfm2A(Rv@YD53Nj4m1i;}$)cDwHe9~wLJ!3`OH>92W{cs(G z5vuMxC7-H$1(S01JWYU2YK{Ya^k25#=T~CX zry-3iSKE4B9{Gc6-W~zq?QMLMVLCp%-SzK>kAzg@!lS%Eps5S{_Vyk|gx%%x7uJ=o z_b1Q&C9@LulWX0?3G^w$=p@KDBQJ@yS0RP0oc;^f;TGW~Nh#0n z)s-US3|xWy9BZ>Co}1q`z*4@2lLBa4R14&0!2 zTQ5C%xkByR%F7E(BrzuQ`2pf`=ntU~S=Sz5B+LZb3k)<-iQzNMuHK%r(6ej2RoMG> z1~CmAk0`@q%w?~If=u1`r@i6FH^;3sEKhr@kd(nBwkzjk1z8>PBHMm7Bn&4V$|F=BSvx5Fhq~;oY+wO9bC?c^aEnZm zR>NiU5yEK#^OcX`y|sNhUu3o+C@6$9^NG?^p1{>;t{mC1r5yQpy#VshunzWQO|bztX+KtPy2bXt7a_I{DKTKw17rrt!NQ0H> zDdi@O&dd71ISt{3g=Q|;aMoedEv_191+!imgrF!v%+mf~B6q(=4EqRkPGXnpoqt-K zNWA@z$TES32NQ|ZYBs7=_dvb5+Kn4YZ2*;q{xgts=4l9251|{}LmJ3ZF{#{)=~`s; z=AYYq9`z3;YD_pYu$Mikm6neYxuufsk;0)0bcu;P09%pR@)q4(r|zpC6=!W_6g^U}5rN7JBcyAPYO>g+7lp zrXS0N0aXRQ<47B8MW(Josm`6)y6I~7`4MX7omoko`Zk8S3hb}Tv(Cd7i{a?vM~xjq zR-><pi$va3u_k!Bg5gb|9<`t4sd8R(4-z;jrr-t}gC3 z0{N00=+kb|ON&QT=j;#^j$13eJUeur6DRWaD^-jJ_v5Pc;HuBhyhyn#zIDAt$$c#8 zz|-*kaQu0(D{t~nlIv_h|SW`1CVK&NuElP{Q>}QOdFGj@t>C3rr)L<=*Zvwfop5c-WSko@Q*rbo$I@;dGY;5!18m#KOCBs zSKy6XLm!S5e;p&wRcdDU)t~UMgvyfOT$JBr7<3K@CspJnP8})6ttGV3i!=5~tn*`tY6RXSAd^fQTJo`359mo-W z4BnS`sIi%=y-Cf2ogUp^rnSD$_r_h-BBIREH>t36>U6F|=B`Cpqh1yLV8QJ}#g)px zjPhczp>Hlmr2sVK;nBYi%U;P$J%Dp=_ffeLZML=UFq+{pL2Ospjy+6{QES;4_LH|0 zYI=%v_&{FdX|e*S&-L}@Uw_>rY<7k$H*X4Jrs{FsNuC?`8+NzfR15r|hT!o+#5ML_ zyVsIEVKu|>B2?hFBu7z3<$3$9Q|7K|?ajJ;=mG0mOZLXUuH)XD|Ct5)VNclMAW!5; z0rtj!_0isIh;s}tYJZOJyLK}{D+9zjSe6`=UnkJOU+jIE#l|;^B4=g}l6fdO?#(;Q zu7T?Qz;Nu|Ll52K%4%p#W%HIkDusY&vJoYTIM(5-qbXLQpy1k#+iF$miv<3joh9N# zGq6albd?lpranh3BuPk2`y^-Gs=FNWJVUYG*{#~j&|N)f+FruBj<3*Stb3fJr5^>w zy%c}!Ln5nLp*(1ab;8^R{ZrbMR)||91I*rUZfjgSiIsh}fA2*#{1+O{q)3g!RbTnW z^@=CNX`O!G*qO>Qfxn(K6`ML(p(!h)5Yvt~mq>2h-dmY^GGUTjJg$4t)45EPY{oiM z!)P1QJ=#?idvzKYoAoA-Nd2*|A0M-vC+kviWO%Hmxw2|LPI;RDesWCcUrlAvTwy(G z42Pit@Gf65wzOb8LXykg%9U2|oPSX{%~jIEOSl{?#@z-9Vz&9ACSW1!+l}MT&Of2Y zfaaKwv=Ua;R_^h6MS4W-?QpL?ZrMV+qo4-28#6yz{1AA;lg);J3o-)!>^`wU+u?M)G$)-Pc9@MSEIIE%O z^k~L^S;jBYb)(V2Lb-}5=l`g*s+N9DV;!?>w2fgSXbodUS1VSlM~YS!Z>{QPodmMK z9Vb0TNj+qD#MBpaEfS(KwC)hjx9fSjIogC5p@q9X}PAB;{k8L>(K6f$e~ zflif~UY_jq^p2YJ92@R@uDHu2-G@cAu=i%UWJdgBhi4`cF$ z#n>3%ryl$+u<5}*c4?`Zn&CE*@gf^WY)F=w?#3mwx0*n+oUd3F#-aryAJM#bgYeMN zHOi_jim^AWbL`5OhcSP;W?j9H@;pH%q1GMrAtHbHppI?9HKBYBfm&`v`&2&tw7;>e zrcWAF^ylX;_}RhQ{G+Z_|41WHMT0u0aU4=||09wbQKhOUB0^9rmwVrIk~in-m)`Te zRfq2@1u!u9K;~<0#z)qN9N~GdeK9V=0ciH>rb$unGuk6$&@BovHJ#qzb_g1Y>;QY3cgh#PF%=>vf6pDB*th4xSLtW5+owypMD=x1D z1ZH`vd+>4406mrpmyD?-@y)9D7%FQwJuJA)CZx^KDrUgYDr69)SQcaP77>4FzX!bi zWIq^eq<>_;K2A@y99rhl*nd{~7=z6ZUu|Q9kn&dAej4*2L7Pm_KNk_F&7vt*?Y^aU zK_9~R$|A*~nR1b|o1bHpD&o2LP!&TXRC!jrl)I~p zjwJ8x%gB0(Ejob_`bhT*ygAApi#KC21YHgGJC;PGZxQwjldf2ik^lAmX6TC*v(x{+ zS}-H%g2nyurA4`_2UjfF`Nmtm@Cc+hOn+B66Ogue4f{vC$3Ptn*@pwwU~(_MWw8B6 ztK-51IQf}Pi%`#Nan0`E1^C7}Y_F@SYFoRsJ}k(z(k@C2@gv#uu8F` z9?P2dXrE~|FCTQrI%0HVcyZ2-bB;<9OL+#xpI&1h7Ra?|TMSJH#%M62HAo(^XN$%5 zwqd@;Y98?M*^irA2l3gY9e4F)U!YsjmUj(kZjx_iY3QSTP@JiVp3^R}RvC9Md+6|S zi!YEsnz@gsIVOG{kY6r_>M0n~^WnQ>llEz|k~(3y#0&MH=VU ze|gw@xwN0dY#v{ybtE!Jelic=s{1BpQ7Dd+GD?uVS>x`(&MZS=tKRC`*HO5nKXL?V zHL@RRebPU)3;1MgopQ9DWwSlJT7pF=H@Ek>=-9=a?-gcGX#S4TTEEBfs90tnBf9xs zb}}lKoDV+inPCfkMAw+jw%BuJMl?#W2^7jkFhV+k-Hd^u%Ek-@+6)=w-uof&VA@C$WVX(+q-eypi4Z9Lqb*}Q} zP|P1MO27t`u@oD!jVfPQXhc=A+HP!p8O+dd)wicMfySJ|) z7D`?Pa8yVypjvNWcm;2kOhV#05?6@idCrDZ7PGfChQBv3)_SCzGR9Zsw3t zNKfd9?q;&7yC4R5;uz6UnU-xcKd*Q`J@K}fys)sJLV6UWFhyci3i3WKA7k(Jnj03& zG{(QP&J?uc9<%EbqmD%D1}h8N1$OrKzv=X(UI?h{KC%Mex7S=gUp?< z^TFILZ~4{Ox3rTZnj_7}3)Ac(g>eplo)K9P6jhM@@FfH{sV5~#|ID6$`GE2ZPAd~} z+KOrx>(h#lWK|}u5Ekk3^z{}??gXh+glkH*7!>_E8hjprs50M%VlKrmI#q<$Lgl0+ zW1Xx!Ln~Rfa>1zbEZ=|R{uwwBki}YZQY|sWWHhpsrY<&V*C=G!o!dHl0p&3FZGs%f zPA_cF06TNNONyNyB^9OFkohS6c_D|H)S&|<=+2cd7Nj5#%>9k$y1xFd^Gi8 zk2_cij6#1-HmB<;!x_jzs+V_a;a1B3sO;m=`*oL(wu>;EPJ&a5>cnL%P&q{u&vBfh zG!yXZa=I&~Yh&4`SuPLQ;epv$hq1(6UX8+rb8O|=W1?2=C+M~>Pm(YCIU!yomIa+* znD5EZijy_;@_ZJG_(@x>{jeV(2FUFT+tEj@YaXE);RTJ;X+L}(~!PFks7;Bw753?V9$japKq;Bi-WW1ZgN zX-670O;z1VE0V3_J^XroQ4|OLx2v zSvG1|wphfg4Y`!NA@($mGwRG0ef9a-FlVmCxl`uRjTKa`tA~oeK50T0L2I>H=Nje$ zNw=;X{u5Np>p$^Ogm}3ADo&#YBK4EA zPjVzLNdLSvFE%#F4v80M`o%d)^XNU%QN7S%3VCIN*B+YM-h6k+b2mQz;8-rxld|fw zzqHhaoGndUzT%a3zU9+?3)F-vgA#;CzgKVTj`1B{MchMX^u4l4BoInm;_fHebsv+z zE5mpAv-_pjMUl6+YGB05stV^3x63=jNt{BU2rkFJoG4>kvuEU7jPbQcgyIeM%DbI> z#l^*chST~R$F*z{;}0(9GKG1gx%h7)8tCuc@}7X`*yq3#x+ghLYv69tCL=M3JdNS6 z=j@cDssy3RIziA>B8CZ^7H9vLATR9^#f z!`5Fazm|~JIA8JaP&t$6)tgdZwUs}D>m|j(wR4YTPm${W%;Y5StdxdB%f9FoJw`Gf z#$e$Fkc2~d(h~QdC;UPG@0y{a#fMIj^FicD03j-_Bn@>?3?AowadN@k8oq?U&$ov9 zd{uVVtJG;E9J$kvUz&eCC4D!^nIxAeJd!yliS7=tbEO>Fxj~=De?>!ozH3tS8?siJxPPrxJ<>6NtXsORm|YC&S0Y#TDq_k zNMBfVb3e)-Svhq01+vV?9u55r>!3~udHGT)W5w#d^=M>MA8f&HNKK{RBS)#{0Ey-! zQWE{<&6}AB{{fsmBwYqevcYbz$5&!u020qt^MThw76y1!tZh*xrfE>EYmoZ`Y8wd? z9L|wBxw&`8#}$gLunH$msB1k6WsDGPVlUN+`m^e$BFI{8YdG%ZlqI<1y^+5gjVh$X zgo{UfCBAdVRf+!lf65ESQD^n?y(7Lcya@|iuA@pgz=X8Xpbmi(X(F$^Hquo12UXB4 z<|wv$H#%!PV#U}=t+CR2^o*3Dv{d#S;h}GKQSR-n7U7v(sFU(un~I{2LjM&gY6?Hi z{ba5n<=1vn6hwOWRa#oL;uYIXfhk``M#ksu?(_0)Hi!Kw-QBC4P8{DwlX&TVQs&F5 zRsTzg$;yLX-J=-)WNeO2((ZEh3pH)9)GxV-UR9+UY4dHtTPJQeTmaEG5l z3(Cn=DlY^?yR_U>{u$wK@O6%QKF{+&MEJ}=9CCsLFWpAHCGN56cj(m5?BzCJUB{_r z;|hNs`|?Kzou;?~4L5s-pET3zet*R-@RLtQ_LT;k*R_8J@6{Wv%CESvGnjy#IkSD6-4=0Y`zHBX;wjZ&gmP%`M2)aT)*Q)36Oe zhOKa~oZ%$-ymD;LZOyMY?5cm#p~tqaO}27jaIEZ9um3nbkG&(Gr-q-`IIt`6(b>m? zQ)Ugk+0nsKlpa=a669Oti)p;u3ueu={)cxS(1LQZiv@GvVAJ&?Fn@p z30$EYc78w4qaV=}rMOC%l=IfSjgCkQ47{81{!Mg5mP*Dc6n0$l+1R+&?@0lTajAQo zuf>b&girs_UcT|6_}4QZ+&79R9lk^4iCs&Ji-qe29||zsP)cJ_b?o;l5AjCRSC@d@ z3ql6A0lm=+LMarBt2mE3j)~-#*x``4U8F~C$8Np8xikw)n*Q?)%*5XI%N{pZHzBJV zx24lFJUlvbv0l~HmQP6@h|=!R1>|>f`A|0C38Y;7Mymt%rJF>e-f1LHrh5^{a}hFI z`CbMJ@k}2dGOAmM+x{*JP>$!sw^Jp&4P0GZZeMyq3aypG@=XzU_3}sPv5o&GL*E}x zPVI0+d=2zeI5(hN-Ih>haE&2*ssO~S{jdYNVW?8Jv26PCfTXO$&(q~WSoS|&OcXo6 z_;2su7Xo4XAFmG%h(Q1Mm(P?Y#IgV5)mgAJ<^T46y5YA!*`9xYaJM1(&xzZ=-+dc= z>+i|-zuvw|`@c0|*K(nq>$F0pmuiWnmK2g#l%s<4mHd3Ao&We@en#u``SX`3LIT<{ zL~{PFENNBb@}aM@`A}tz9xZY#u6yOmmAf=pw4);evhum{`1Z@{t*ryMp6_e!4`BU+ z4P^>?kwX%hoh$$SmqcUj|JH)&lcd0BDK$NPdUe>OH(U=2wE$#dfA1z-{;_XYmnvYW z6#0!xk70Z#CE>jt9Q_1QRKsXDaeT_wYgpdyPws^2z|OPqIeCSN=@t|-_{nR{4^^#w zq=IAZa9KIIj$hZfdc(KAb)EM7JygMOG^IH6)as@F%Ld%$G|hEBKH*;yv&iTvrMPlvDA z%dks4JWEXmP0o5+eO2zI@>)Q92K9Aj+B8%R`PL+emS)gyTVuAiH+_bcoOaU;pZ<&v1`z0 z=D^B)>H1eK!MowsOjE>$qk+CY7T*r+!X{Jf&XW<}tDBQ)PpAytb5-8lJf_7_PR<`V zz<(y2!fCd?9T(CCRbndK{lpQnM2CwR6d&S3Ye}h!%Yq`he?SlaMF`~R{?AGX5n+i& z=&q7iR`#aHLfpVWElZnec(vg(9n?wrgO*h*S5|$}$N9BtUpY(7u)LxoHmUYn56)bT zy}6-*#oPPk$uFVXiUE@M8YXjBzGg>>X>ym_i>Fe=XoM7P-1n+cq~}eh5UPMICDT*?{Y`~PNKcktg@kP_Ud~-1!M65GTm$*5 zg4(Zc14$He%Tn$G<@6l~T5=ln;)j1dlU}|tSt?6k`BKbutkqNL;T7JZW6mygX%y7o z4g{oEbzD8OsG#XGH$XAWR)rj9bH1=gX<5p7UsJ*(oarYhiE75=F(d&7& zW;g@6VB9dX=kH5|#8BbY8?Or5Va6k_;bNvY>954B{CY<9jUwppZ}j42?h(qCYDz_F zD1$3j9qW%RP20W@yZnt})^^hCHa#zz&e_!~<^MFO(7y(itJVA>{9xo?OLvCve@_MM zXgkhd-Ke4%-fZ-jmoG1s!*X3esbe-V=WTO~Hle7GCr6)fzj3V9+j;p0+>sN#18;T5 z*SPH=-4n4qeW?^b?FIn$SkPYS=0fMFIJdPbjod0Bal>x1MwpQ3ivKNgSi^SG+h*Ol zS6@@y8thnl(6NyU6x^EZbE^ zNBke3Jn5(ldmSD&I(^~4XoH>qP%3mOBN^%c`dPTh|F1oh|NGXdwYeKHxZ%buKNZ;K z##m*QUO?jMSHZ8kYiRf_wx37|o%7ZmMw7NtW=4@aR@#$YWboiG|SU=q!9}iRn@gEqs=2 zKN-d-Yb5nlEzORJ&!+FTJT?F843-0Tci%Fb^6z%Dns$&?o;;>u)|KC&cm9NuU0Ozl z#b7;0Ux{JV!w@=^hd%|O&hzqzVS{^=O*#65eVA;=BN2y=Iyh!Zyn-$W$=(8%9V>Aa zj?3Q<#odt$d-38$)874=4^{W^nJZ}k8R{D}S1bgthbJF9SAYT{?6&rb#h1}U6?Rd=Knl|2Fa zq+a}ZBU``NKZegLwVr&svG&U%+q?ki75$QaVQ>>Q=A)vUtT_j-Aq2+i+XeA%$*ar4uqU7LO1X_8De3g8S3()4%>0&N@#@>H}{9@ z0}?Z4vGs-adk5d*z+3DRTaS#5r&qP6__nU3cv!ET2}d zKk$Rxq|^92ulqiE^zDiQ6f=qn^jFUza{fGaVS}EqiK7pXd$YYg;I4Va?Z=QXZ@#wy zi!{tIE6dDngQ)oa(K=hK9W14W)1qo+ea!+C*7h4DZfF;qW}lFvGsUtKPlQke|@ELUJTdwa?Cz@ zx&zuoQTgqKt%r`1DLvd=#$EBm54P=Vof2R6cD9hH(N_qBr>d;d$?HgXp8y_w>>m>1CU%+hR$9GaR&djKH5ry`giOYH#^s&9 zmzDo9nT9jJs;9fNO$UxJP-^pkmJQvNR$Jeqg9oA=wu=k8Pv&yeQeyNy=FA8e?q7mi zmN>Ms^i>d9qFgM6 z`%q2q9hb&cLu_=LeNd2TxKT1akc7%s6HVw;R8aW#vGzr=OD|jPUV=%yn`B&HDaUmF zlap4XkybHVBa=dIGi9XJpn`RQ)wr>c(Wcov-IblCKPa5#HQ0BUT}NH3w^xYLTf5(B zrek=CihbhCJ)E;ecV^y#p-jO!%KL?5kcn9Bw22Yi;F3~ExW(>M4gp3=M!dVMEsLU7 z^CgB)j*ba*<{g<&J~jJ7cYw=aC9H-pdiE2oSlQU&PdOGHYv10jke%*G=ji8i+N5dv z+Ef^+7U-{9qd(Z4c|+7fVS6mg#cJ@u*Qw3}yX+C0C6_rX>}=8XcA@9i<&QURxLJRG zV?L0mAHSLlKr}=W-@jkpo?}f38II2NA#=*#bv_gnk0XtMMNh)EX>B^H$IgJBKGu*$ z>;3LA4kjkG+IZTWx8IkC-aiIt1?#(^0HQG@QF{di}eDHh*fu(RkDEgjCiA)r6G?6Qljt_^@s_<=j8P=dt5iyz&*J|71~ z&eG=IW3|Qw&B`uj(5EVlVCV9z+$#mxy16$_5mk#nOl@8lgiHM5M4!wzw&nq3; zxETbVxnI}W zsbUy^E?rEtVxs*1tuPT05zxNkLDVZ{cz2!B`7U(P_LZ==Pr{}rhm9@1^Kea9%lJ*l z(i>}@@*El(q9%NQmaTfNsqVyXrcS^s!A0Jib?ZveyZ{?NiM1opBT*Nw#SDVy*m+ zN?C?M?^P?#z+;#7#R!`;xTlmrCK2Rmy=DZL3d_iNVO=>#O-{d=Uu;QC=Ro=jsu=E* z!yszqL0e!qG2~dMfOu;@rzXgD&u>uc*^;hQG6%!&=Je#1!UaaMd#E>mZ|kj`Hufeh zRx;a7?Pg=*dWhpS7N5-xs~!XXBkKDHAEV|lv+2kUhJ}QL_=&9~vPtXBJX`uQwI}@n zB=5o{gq`QRhlmGISWkB+wJM?FMMs;qytvb6sLiYNy&DvA8+2w6qjp z!f?hB`#N*a0SZAT=|slZQqwGaLbKoA$&JsKU^(%>`WoFlXVwle=@-Vbl96?+zv*11 z7qP6W#waRwXQ}ZRtgcM=+%l4q%*E1_TJngBCBDCYnl^+GDlF?T*SJ&1a2V=FJNFUNaWzXyk|N%-h~`iIZ0I~t~K)qD5_ ziGKKL(`gH?Ecd8pF6KQ-E=Ajzx1F#ddl*2(d&$pn{l??Jeb@qb5!98Afb-th-b++m zMO*gZL?fZpI;IU0>Vv`t=jjcD&#T$l`S*_ON;`>oC404tovKrG~5k1a=B&qo;?mkA1}h=J{pYKeQ#H{#k2dzu!=P;>MP!_mKRTqU`F~Z4(m3| zmg=IppG;Eur=>!2P<)G@Pdf2^wnj!|yt`XIa}a$BxB+EC=Mz6eletpCVzki`GaLPh z`1uVQfm|DV+Gck;r3+w9SiyAQ@MHv92eLtt{2H-$D}L5xE7KlU)MP&@!TYo#PWs;q#jH#Z?aLdT z>$eW8sYzgDWfj!2--@@<_K+~^Nz|tm6@U0rpJo-wd(2Ef_Bjc3hqrV}=JNGRt-5s| zBpEGvdXMhMTjsg8?KwR0ec^hXzqnPE^>9f*>)O#; zT0OX@GYV|7AB~#6>t>{;#+;;5(hfg#w9A4^+@`9v>fpGXvfb>bGvPUkyUFq=!`^gC zJ$-gqZ0%xp#l5`SF80czoG@T%FVM_2CcKz(@2s`Rmn-ZN+oZ=fW6mxaN1W%!h@Ap|)q{ z=WWa_CCoa&Dd1}=-m~B5saC0N5g5o^te%jr+AoYyv5ke^`;*>;K&Sb^jQ#j&-4RYQ z0EIPhK!)2dPDmsn+CV(Hg4_?~rIVry+^Y2WLd%aivVMTV9ouyY`*< zF+Z=Q;7v>q5F}=+u{E}}VFUAhltUm*{rV2X!@&vHvqo8dhKIjPg~pES8|$nhB6lN_ z*}gP46Sq5~H(p|%3O&BuM`#N@*5ez-4y`e0I9+d39OFz8Dh6(_?ebJc@V2BXR_Cza z3>zHzFWv(`U~yqV-L$tbTf01Y8jC{t;c;gIybgskLKq|jzI?-|0(4>Q%`zPCnXSm( zKCdMvInMCuh@Qr54By!Nq{-kbV~C}%Xx|8hCf_~vcbIei_8!P`LQ$u8d(Y{H@mmdU z4VSq}9(q-8TXdre15pP~!;bBEJHnl6u#0?6% z!t%W1T0`Gnla;;(KCkZ#4G!F5NZhmdJ3sU8{lq4jo0khc%5-KvR6OWZM`;q#c#I9& zI`7DS@CTE>s$3695hTK6N_OdyqB~mt>h*mU7ViY%sMH{x60_AIqL7nFE3?1}^^)9d z)x1o&=jzr1+D`L_zMKA0HcRC3@P+1Ltk7(35LT<951yg)ZVAm<6^!V4pDSu&C zpnPp?YP4;Ad-lgX+DFcJxQy9ZK|Fi+yzAw2Ai$^X$1)Y_5}f+qZDGh`iwVQ{9vp-K z6<4VfAK7kS;ULp}_^pGIur(RogTtX`O`4wFFg8wCN9m!NAl~Whnf0T@QMtIfX2C5@ zf6ohoC^ZpO--~`HfdZM3smFJ7@i8iwUPrA5L`|Wb#Y^-{EqiWq)m;5F;^sWtn_*x= z%u=(!vO~(>f0%;pR3`X;Q+`m&>{9-8R$*88O)wXoiaf?zXq)pcL4@UB(~qlwjZ?ea zcyPVIuGxtxBlSBm9!w>57Yd~?+n=p7dFjN zXrKr06HN>Z=(}^RhbU$w^oQ1e^FTMMPB-G_OBN&t^a3Y;`)=1Krsm>@c%j+8Dvju< znIG<1psLNky${7WS)=(mbiQVE$6j9x`22 z>NxAbJ%^bSw1RE}Zi9(ldQ{STocW!HB&#+SsCsZnVC)+zMVsfm(K;Bj0C!*EmC`bG z*!9q%W6EvTagJb058L187FJRYf4^Cm=ISi7L@_j^pRLR)2it?ci~M>&y>}b-K!TT5 z)!bt>8qw9|`!8^V7{e&9SbWBaYI5as*oV%moYdcI&{6>(e185wyB@*!=hoz6ONT_1 z28Ep;mkq%IH%hZg{Z1q-nU!#OSeW^$JNU2Wsx^5+B{nH}ak}q1w^tu3h+n-Rp~kM^ zq;=)8=#ba;DM$zPyNME_A7r0a`#9ou3XB27B*;E=n(d96T%%HDR%(gmSH~*M>PB{M zkIwHSOjjg8Z~{KoRE(IYKkuFJ_KxH|` zi`lEsdoQMe>#CEu0ag^>KU1?jIef&Szh#f(s3S2zWaPkU-!~aQ@x2Zak+8Dc_ zjjADjWY7Pv0F+^&bDP>6YYni4bljBP-dvl0^32Ldf1bv~ZJAHpj8|%$~H9K3Z0QJ{>Ub%VOnJFZ_3B&Bhu_104c|J%=Wi$$ZsV8uyf-3?%T3+BI8$0u z{)1cr-#UI!ON?28shv-TMhW{a*fy{n87Yl?oHlj3NhzNd5r-9aKQdLqzL66llEL6H z-pUS7L+AZwq1(W2#qv18`6bnpm@eY7xU%~|=-1(~@BGgPN=&zv z$J^8oSM!;oqFy>hn#fKul>zj)chr2in?1E9!D2sNstA=gZV?$Z(%qq*Gez86FDK#E z3Z4|c7_0rox{;38C2pK2O8A#3#y5!&=cs&7IuyF%#dwTGh%k}#YE3I*igXHdE`F*# zDSEIB%P+|Evn8zLL%Usr6*r?lW%#dyPtsn-XB8efoL1q4{3@HT8CB5U2`|HpS4`S% z5VRfjp640+6cLf<;Fp-%+@WRNuO6QNxZ=&mF*F@Tat{6~IlDZ+H#Y}y%91lG3^d;u zC9E1phYnb#)#KmXu;($}wTtN{o;L*5y-kp6Q1&}4jN*Q38>(UQK8 z9qNe2^VsFuKGiNKfhue{NOtZ zStykYh7VkTqCiHpGb89P|;r;!&!y$0XtRuvp1Uc5SS(?_=w6Hf-Bj&47&_U1hbN^jZm} zb8V^!n0$7MBse`HF8gD*l#PzkW*OwFUxLD*TY_|F4Ud8hZ*c{ z>2tzYJk)r?k~3h4aLeNWVH%;2!lZr0Vf#<^CB7ZB8!oU6luDgWd9%pUQoj|5AgjNw zF)ytRwdPuoE2Tf`<#>Pa0d`tcTg#0bVT;$_wtvLQ_9Ddw4ch!4eSd|meNXJcLS`K1+$Y>xjw83uO}j6 zr@2bXYO_?6PGFT+UFlR^|MPh-Z%M*dnAtXs%NVd0EXstG-y%e_ zRsoYfez)qp&_MCSSJ1jCeBk0{5+VB7V|9hduQ$HoZF~;J_w+7o6#U1bRpq{m>m2?f z$!TV$0t?YXR37o@;iH$nSO2-rOhG{b)J8j>$u+23lKhU%CHPh^R9Fqv-**x%Jw8M6M`6*uC9-(@HqXk)&$k14GPswmACr<&S5LwW zqnV8} zvfHnXmi4Sx*SHasLg|RXMznnLKj*(He4uoUc9E0wp05z9@Y(RgEsHz;`rHCjXdh>} zbrhCdTnrzMnl~w7+cZ#1s!L-G4(rABUJjYHzpGC8eTht2i}m>D z2Hcp;lG|^`5M+YoMixx@_q@tPmw@2nEk8m=TkJ;a=k9f0kY~UoXvFYS@)w4ot+AbUW;c|u344nxbE2r z#j6R)hY?9HTaDYO^ALP=9v}z1k^i<~U3QF*mv`O+Vr?G4@d$?7(eV_dVNgyhiMem| z!tXXopsLn>eD5uO@pahpDz)BVx$r3uEwybLs~VOA!eQJe99Bnm{qR)T+JwjbS-5Cv zPvW@>XmAz1S0w7Z$N@qTDA1M_AiHaCKU}YQtF=B2FjiGSCvY=o4d%ydm@!AoR6#;C znEvB4LHzDtnbDGwds(>$43rd%VT0;Dm<*c7mo&>*$Q3{E^5hQ{4ZUgZC>#PxD-~)F z5sYD!5$R=y!8q+n6}1Sj4=upK6je{rSdv;(?Ys|{wnRg zla}_sP(9s=iip}nz`s|m&=A|UP=*`^K6ZJJrT7#I6BZpFJ_&O!I=W3NT;~^M1QRJi z%;A&d;SA~}gIl68^0xEUv*=j@_6Y||Su2E}$~|@rB1%GdPR-vn{nNpdI-%A8IxOL`{Wbn{!iK zTtq@%tPwh`1U?+rAHV^eiS^cPR-ePe!(Y9m>u!2Jjiu2x_`y0Rj@twExMo-!scksP z&$Lw;+mX)2))Q(Ib*?J7$K_pvRW1Xy`@PkA2B140htd`gwPK#NhZ}UE z_>pt5KEszC=HV(vQsSI_Wr<1C4XR>U^d`a&cR zwk&>CJjK{yph&YR;K~;?f_nG(Q!mf2D8n0q_IfzO)0lLF^kN?KB9Ak+F1~AICmrA3 z*4B&E{;b9?E#dS4%QSKXwzmt|pWi2}EYP3NF)p@`We}oZ3?4)-J!8&c*G?guJe9Gt z^4*H=MI-Nl^_x)u6XXHTYCTf_-b5M&q-?p>iaVE1 zxx$K|edPfN@HBap5({XO8P?%702w{hzr>_lOe7NVzfUIC%6DHut-S(0rJx(*@KJLI zegPl8x_}?6u*wBva-Lk%p}Wf=T&i!}>jODGZ_78v0Y0;ql?o@GxY7$|9a*7k3;4ZN zu@vY`+2I%l_I3v;Jz&TY^sOEfZ%q;RI_Yd9m-!z?_M}&6>Ljh)b(`hzHcJxjDJ3gC zbpe8E0n}Lt5a}4FMvcZ3$B%#na~3+vQMJkU|a+F>kweu>^j<5GZIOialTY z`r0zSx!7dtbabs2O01MAixYE9kzP&2I(9`cXho*Y5jI}{&26COp6K^hZcauDtxIHD z)?muAOro>h|1^?xC;E={FEfff*&!w5U8Bst0E9X)XT|hlwM=<_q}au0tC#fRZV-t9 zi0st)7LPI={Ei0J-;)JIe~inaVO0=RIC}v)ZrNjx;#zmx*hLIT6AI1d*D(ZyIv-g* z9Sx#nZB}f$9A!(6UUa*5Nb^{S`@LjZDXI+PEd!GlZioB!$npwG_DzR!Do$?$%35!? zE&irA(eQGA!RfbMq5m?vJ(_>@eNcayJ}XAht+tEL2|87%Nnf{w(8X*xQ99Dl(#9XU z?It5rer+AEuVdN6@~inmBsrzzoA$HIC8QhbK)23&IgEUK=C(AfWGGsRgGONo*5H_J z%SRAdXlExfQRZvpz0m8VNqj2b_kq%`bvtMs`}Au1O+^PXVHd#%$uAGkCNrt&m21Q1 zd##1bn)xq=DJk-_LYLh)%5*sMu3gOqTy}Y?Dw~>9w}?WDFlqt0F_GE$_7#U^m^8vK z-`K_9d!47Am6clWg=?ubX&g8-X;JVc%oayS(JkAM+y<_-C1c6BNZ{=kq-pYdKtFg-b#i#g~Gi@<89k0tGNVE{bD69 ziS2&M1HHcuD&%h?42ieHCQNz3cQ? z>BN-5BC+N2T&2g!17Cd2!R$iGtP{+Ry1;WBEua|gv4-v_3JbQ1~c|Mk)Apc$My4W;^WJ_t!Aj;wSJubS7LYC7myys zq`esO3tB^AYyA~wVsNg=I$#JTreOx-AvZuLf^ebil&yJc&1^W+hJSDHs`4l%+ENnC zPU@8BBO!riHAJsK~eL?w5mzs@NYAhCT}O^|qRe_u zCO*p{q%?rroqy3fk^xStSNbx#fp8$C?qOOty|yRWyICD6Xnqx%WpJWs-Y9+9u#&4^ zmzAaPQWZ{ITrD|`N4lJx;=qdf)Bv0)QQ7M9+dbSu<{-(A(?BjI3 zNAc;4*8kf)78-09tG9FsW&3Bm`{p8O9!lSj`_Ln0INesMNH5gCGHdiBhnEr>yyo=Y zp`x)I>;hN+0LCZoAHHc@nwD=4{zn7-=wWWp?TK(IPr`k_diKKAK!G7q=dK1gset$Ril|eY%X-6^Ap9oH z)bjhFbs>S>r(WLPzrytGRjlRnEIJR>`wr9 zi!J&A``rIaQ~2k3pktW_$XenxE-KLvcnINEL}~%} zOS$!$_y1fK4zxS)o#d=~ugJ%A+nt|ZN_ZIMK@IM`GrzdAsxyWo)h;l~Kll)n2WG6S zZ{))IT3RvG+`6e7{_(kHEaC5w`slDbNYv}jWLCYYMurisMBe=mQgr?K>FmV~Ihzjk z=4CZDYR;udJ*`M5HQ29C0~8Ox`w=tB%X!FXLKcb@{zCHmqRAe~09aXcC)s!_Nx^D` zziCh~Ql$7a^!lMrL#reRNdWiEH$sm>4JgoT*q6P>Ae;mIwNd!-2BW$eHVPPB;8|H< zjs60nErywR&~q9>jdXXG`0)E0vI{KO7auG@oPE0^MjE1*sH-EO)hA&RFB^)yM0DKapN^P~s(8ye1$)XJDb zgLF{k4M)kmi^Y+p2U2@~(P++j^5@hSm#}Nc9__NCC0zu=>p=1bl|ch>Nn7Igz9VvE zncV!Z*;F;ude^by-PzAU!3zfm|_)7Uel%@cCXH14AZ6v9$OK`~>uM={vA z`{JK$BIHdHtLIwlwytPT60dxJ3ZS0*>S%f~_CzN95^d(EbmQLOftG-z*QZWh4o4vf zX$#kwZ98aKcD{a34VYwTfQ=L>1;t%LQHU(!r^ds^iEmKT07w4gL}E7zdhN!$Kbx9N z+gz%$j*xw6uxRSJx|SgGqd!CWE}RT>C9!&F15PtuSpre6IRd3$D0cLu4{^jvbI7o9wvkE{d9i+Eo(Kg&KAtMPc>r2RXtU$o0Wickb zDGA?t418AQu2MfoCcHT4`|W*qh&|rVzq3j3S=3LQ<9Pl0RPFX4J%hCkun?n(D;gsJ zb?%J+$4Z8ImM5PX?7h3hN}f&OySuX|-&x^As&YMg5CH7RH!eKlTp^TBu?zSSJH`Oy zBbTtIm-09K2Bnq5e(;&G4jX>{2XJGLOSNB8D;Ie5EQD(^VFe}8Z$5ubQ(&M1Dk%xE zm!HL*(NV{3u~W3v(Wlp0M0fu~q;%{4cy`Rex-6WkjMN{XsGCutCyU_}>U?m4j4S_w zSu$7uKG18$yy;2zLf#WDU+)722Mh)hDs0oaFH~+hb;?G!POuP<_1U=lf8$;2n=O!i zGNFte=~`M`Jo~xh0N_nKLE4yZhm8GBb!95+)qG%yibH%`KH`!=F99=X_DRlxGc?g0 z`w=)D3uEU|u2)}YGp>?wm%$<+mOXn9z>U`k!!R6_{P+@5M25D@Agqy734XYpC2gr| z?Lm^q*oVYwx7Srwv5(1p48kRL3L+x7*CTk%29uYE>gx1ayOFk4Xo~m*W<>-uAQKW| zM;8R_ReG8~eYpxMz~U=B_0G-d+WA_!8J2+(soz`zPQI{laOfNR?M0@({GLw1Cj7mG zA!2zTH&frfUTcboM^$i&+?J8*j>`->+29UZK5t+GXA&%=H8GyLGbjKp0wp#-0%S7? z@Cey}7O*Xngi&Fw%RV!y|9iK4KmZMw3ATkB`=QbsB*m?s! zWwO{OiZJLZzHAux^~roN8dT3z>%t#G9su1Qox<^7K>;TM00wT|2q!9=x1SxYxpjgt zlc=J)$5O|l9eOcQQ3XtvM@6I?b-2{pQ)PC5Gj7vx55)ZcJ58cH`n5(rL`7>?gDG94$vr&0^&rA|ckft*&?c>$Oy7kcW(3e>rXD#%{P zxQE=o@AG|fwj9{-t#`2W6>fyfO>M@p!NHuxygiq2<$F>Bt9X<#DMjmx^&=TU^Dhs~ z`K^a%FRwk*;k~1#EP42fMZtS4>nObk+lwm3a6T=PW3t%V-qCDzx5Kwikul5B3prrE zGLTFseOIp@lp>3LG3t}7Ba{lV=02BOA@nw>uEPy3RY^We11}d@E)r~6&?lj5D;xg2 zQ53#M51P)Vy#cjbl70QIHLC452rKchi2x|A&yYv&cy5bE4GK$F*!v<}zkf;e0})r6 z8Fv!1K2)(m%hF2~=3`2sjC%<`9}SIL59DO2HYNS&H4Bh>a2NWMsiS9N_IjMuq zkQD-qn1c+OP6W^E<#kmu+n7D?O_JxnA4YVZ0ks8P#A9`qFgI(ZDWIFzMk^7e!qW)B zk2q3=FTc(=ngd~7gr(tZSbY<%Cy-~=4tk)PCe6zg6^=_6rAdo~~cQ#o#H@AVA3gv4yAls(uie*uF!*#DkKB=K*f zngwHNEEbgFP_YcBdh=9+Tt?b?dgI`OZJ7M|;1A@es%4OMaEo2ZaPL}9I2?V7(74ie zUB>nOjuD8{dZ1Q@FK9VBA_gTWP#E7oS@pzp_46RZI4L5rYNehI^Jt<-%! z`d>f-TLwO)BOC?90-~E!j29mKNx2H=u9;_;-B4C^f}s5`6%5U|b5n(&81`wO@iz7H zxOqhED-PS?YMB#G1Lu(oOm5Z#KlF>S1t6qy&nfh$<}MMjH;8~v)v|rt`T)e+?zsD? z(sH~jac0_zBU?GSx6F)nlv~G2MVSX`v>$bhXJQfXNUOleXXG3QP>^uBaP{c+FbtpH z$+kmaWXF09kvho#Y)l6HhM@S=I;baXjwc*P2#AomW}8O$BsMzQaJtgQ$oY-qObs*I zZ5q@W1_9y$D@UR$%9x$?RzWhYBnHXhC@ck)GU%|iyA=(j8l%R)Ma<`uXWs^W#$dVP z4}=5kx?CB7kWzwP;wjbt`riW(RvWE-B0vb2J zlndV$Q;KW}ciKN&C)1&I?a%_E-7aMluMQRpk@IuXp@~D{O+^Q<@`-hRk-*q_!-GP- z)i+igj?=W$6YU=yKlni9Kf2q$u#Ogs+tSwy`2N>~^K6BnIs70n!AzG2d;sE4qUHNy z@kJhR%$=j}Hv%L-U8wFiKH&tp=!ud07x`j)^v;3}Prmc*)=64yStJg-7xv%|{XeTJ zn7#u8l@At`JyoD<8yelA=kb|}v8x0|&4rmP%{_E^&>t$P*Hb;GD8caiO8*Y!wVaa) zpCITAdZP?~_@j1WQ&+q79h|Et$qsjxQ$PPuL6v%u#nw(V$s->UI5{K*@uARQkPMT9 zgM^fG&S-_z{LHWEFiz?Z@SmAWk*zDQee8wIzm74vEYi2zH~773+A*32Ak(IJ-A+9Q zXeobcPToTDMuxM|7y6q{Jb;z(R0ZjWYjwkv#TY$@L-}^s*Cput+XIJ{_!FyMv|aUo zX^%^b?^0a^@{hyy63381{m{^mtRkHNo2%g~2}A;3WSzbg$@;6I&R*bl?n@Kd-KXU3 z(bqlR!B%u0-yvY1m1#4XmYG#?N?6}fPCrHkL3* zD}O`x2W#5cAvNMaoh(hzGDc%PRF-*3Tde16>}a(YDhqRxyW_Q-a zo_Y?f{J)LHL--{t^%ww1&pnNqhiXeaI_5|Q71LFCl8BB>7dWx!gwfJEu^}#!`1_;I z@xG!J=cGm;n++vjO^+$}GSH_n6yYWvepbZ^+n+yw{@1dkgl#+UKIJdkF5*T>61kxC z4<~LIAtT@s1t{8#6&~5QwGym?1 z4Htc^)dxkT6K7Q3;_bZ+2F}0FT}KSu_P06tHIUnujF;3MqWHxMR8i2%c$ous=dT&E z1b*w3WlaX-OD;(5bhx{0tsax~DHYaf!eC%J)U)^&{f&|9C5+durNqjHYoKCQTh8m7 zpFSgyV$7qMEdGEeqUgq zpmo_Y{_I?l&B`vCZu4u0U>&1}{gjqjGDCN`zGLmEK)ww~k_Fa6Hxbn| zyBoJo>3HqiqjTDOOD6Juzut^iSmzj_^#sk~nAceCHS?NOuL@fmuJgmioUTIo{8P^3 zOLhN(>L^TPIP?sQu?IznKCyx`MINxG217cY#UsP2KcK1d<1#=@lm#;2oaBW?b7#jGDCASjK!Cx zkbLY8N1Y+;4fr@153gH~qKXAa1>G zMa%b|Z)wrem^ve4SonMW$_@U+g}yv~-`Jo0_*0w;9sh!oOW476+mphH5vZva!(AMzz4?7r$9xCbb* z^3Cc55!io;h%}!e z-rzE>&;o%KyULjV5vGylz{B^%?_4cYbrfu0di*v8wZJFnMh05{E7NG+rhWbGMeCyAsifWA;Za&&;1r&b?6!v447}L4QNUXM*Z@FsHdy+aNLWVBn)z1A#v~Ax<+^>aSnex9FHv62+$R28Wv}%8r|Vk3 zQQhup8M}Uib0~7`PizR;^{YUVhP7Sb!QvFi4Pz-ucZE%m<%|j4!jijh2$Jn10pp zXUvk5i}hgT0!*I+V79dmFhoSP2(96^B@fq!pbvbQft2U~QR{Yq$SPZXGh36JvmY71 zcd=yZ9TtlHC5H4!NqNNE+ilv;XqdQt?70+pI-=Zl-g;*_=>*4otXusEC$+DDD1u87 z?F$Bu6I*W5xJ>T>FdU}kih9(`g9Azkb388M3+LfFdK5LO1S+lyfUn0YwF`T@&Jf0k zeo&Uougs=HsVBFne5oFhPIoMAH0;wq1il3@3GQt>l7la>UvuLyE~GoZ`g)hz7QhU7 zFRH?B;w#=A#4Bp^!K%R`&Q7G&3}PM}?CiP#EM!&18pGuLjg+uW1*V9@+ zx(`+N-a=1ygE5HQoGU@lU0xsI%2$=JCfn51g(*5qBNb)d9vd_Gl6!ka|4@HuX3utn z-CGVpXooi`2TSeXXKvr#DQ)c*1f&oyF&NmTe_L+D_b3zEOZ0}*s)}n!10YQ+Zt%dG zWsfT!9<#sN7E2HH`2w&#=sho)bD_i>#yc@C%Pm~`13aa5>Z4~a=6Qq{Esy1+wx^he z#u}u&bvUip-tm?^uE+!3dJ$!8;>S`Du4QIr8g9M=Pv~`DViV8d&)5%?oD!VW#Ek|q zw+R7Xh48B%Gg=wzmFK@cM2uxtcE}O*HYnY$9o~8oZ1Y)FZXlpW&~v+Xpp@BrWH_J_ zSsu;BEOZ+)FCBH~mK`6-o*^tc^!3M=UC?WAF5IbwE#c^I@)Vt$%BuX(3-oprE0uU@ z6#z~R1Do}u^al3_vh_@GcgaMcsy~L;MU^QXT8$KxbfsOD8?81+9pdjMeLY>xu|>03 zVK?xQd}U|=?5r?oFMsDwdixqQ&}?i-IYQj)ccTeWl=lpseDY)R<)wL=$HEx2qW9qymBL)k&#i!%cu}udV4^? zvc{2>%?QXiqmq*Rnkm%~_vnF;lr@M#bvnQgwDap^T@`C|beVMV+R^tjcWCqmb47^I zdr~p@e9J0u@1na%&Sm4Rk62li8;-iOR;PAQTL$I-00so-2O^tiMkn)aElQE~V;znK znWTIVL$nGiyOz#4ULWH=?HK=k>xz={Fk10RKd2f|rR~vaiIpgGu)f+BmAN>V3k+o( zq?H2`AweAPfR;nlVBj%)yHlJ@Yx z%n&?^Q;8vr^m2ZhzeV-QhPSf_Lx5Dtq(zCUNmuksU!G$UA}ADXnyqIq=hb9Ff4?I% zr73Tnm$6M*Tx=QijHH>$>*At5#vSum{G_yNZn~SHsP7w1ve}o5!3H2_bYH8KKzC2| zC=cXmIm!EwFVnjminT4J$KCLE>WvH+f94y6m<{2%4Ow|a$R&7u_L#ut=fEa$OB(nC zn{_N<5VmQm!UE3OYFc=Nyl8aUbl&TUsjqEIO}-lcg*YC*iG~WwZW0alg6Xqo_r)?X zEj2CQKswnJ=vV`|_zO_D0M>($#!q{sy8a9RTqX%OWzCvBm7(gJU9Jg0j!6x5)9QGI zEbWN|->A!q;+c7$wzSf4$rCLQm|#uyp>y+I>+&eX(&%tf8%|-3f1W0N_7-IO^5x@V z_x>n@(SvaGwY2T|?9!PzR>C$wJQ}mb9F1zMWc(#pOI%plS^dpgRPDkueF@wxOSTWw z6m)?#2@{f>oCIL_8H-nnjDx=nUy4(8A&}YlfUmV0ew~Ve?^2tfwDXpLMG%r_oXCw_C zwHG@%9$R6x$VKO`17-(Chr2x+$RU|dF>ZtD?riS^kq7@8QTdP4mVn^bpRMu(rB2}6 zR~XObUtlN^5fC~@(roC|rXI%yDqE@UeZ%7V&6uu-tzr%s)muT57G;kAu-yTTf{Jsn z-DIKOK>HTnwVUcporte9<*V0qi#*&p0Khge`afYjLEo!6nKqFSF)c?NXFsuAeFp*g z#=d)HkL&L$fgtut1fWj%ah$TK-R7NVS+``v^@LRFQlL;AoT}*5N>6aQ!j26{FCVF} zOinEbqnv{NmGU-W<1@{55pM%!slC!cBj<;D^YW?*;!Xt#LRNE8*IuVR$5M#$W+$)2 z3-NJ01!;EoHsR{cTktV652GVLi!39rSuV`>Ps=|BTVxRQs!YlPr3e6SB_fEXfQ<&< zPi2xukupP)M#VWvbD0PLNaxCT^G0(Ca3JAEJ37MoEC46>uVg0!EL*y_BtiH9eR^mp z+mfcj{tGjkFw5Sjk9`Nxzq|jT(s&FIWYkB`ZasJW{snV$^EMm~XSH^^xywXsRs&jA zn1=)HEw$TXT1Ep|nU62~DyV1qrr<*^-A;PiC!6e_-_vmTKp;5{9NLcCPWj2 zl)5+mnbb-1UuIso~}{yOk7)7#Red->g@Ru7g+cY&`=FtK@rS}R(8Jr!t z@4h|q{k^1pIM=ZO%CD=4OI*vna%M(p30{{oQYgZ1LUt<%>6fyIx+IpRD4fSkHSHB6 zC0K%k>hGCb6r&_}TOMUMNR6T>-G`6k;sDXkPV(*j{J`*0jWbBAk}r+ey4nQb-;HnhxfeY2Pxkc`w41q#k6#KR%sbkd?2N6Q#Uiec0985kGX|x3$B`Z@pBaDSy5D&LrTW6=n z(GnjLXVLF|%EPI@yG}oYul3uO`y|s^eUp5t(&~3RT+Et#gReOdaRIdyjx0VsnM!MK z-CcyW{kSm)ho|ziDuO48zg$q8hoFaZ_ppp)_Lq{HK=i)DSRP7QlIe@V`bl3oX_Ve~ z8EOqD`fX>ej*_*a{}Z!f;|K=#S)?DX59hXEdzzK?OswPLQGf(cuo|F|LG(+A+%#j` zD@=lLc`km)VK5{0ywuUF2`4&7?Oo@?D_6QZmh?HP1A>A^I%R?G*PN+wNmP2L*0fGY zr)&*-Ge-&QkDN@4*{W%wFu=Ob_OG5MN2%SdpSwv6U8Yh&F7u0hVB*e3R47E{295Dt zPn&~z=R@%L)e?45;3shaL+YNK-6x1tbTyL9p3QcVYjbZ{q5~L7ZJTA)`>&yP-}+ovzb`>$ zo<2TpKwGf0(@>JYhu=7UJIzDYYz_E5g1myK4so3_>~+MDJ1xJXPGK7!^JQ=BuC`$D zVdWYAFe@J@d7MJ~lSGDl)1bFO3iOlThgxMpn@?l*nUDKv1U4C))o_?*W#{8bH9=ti zhRhbI1D9<6-&Mdhe_q_zES|%1H@qnF%fJxZm5okh+O==r~SzD8a*Y+ z{Toz6;sNQ1&l_H>wVv-h6l7=JT_}|dG&tu!;iMKNMTjw72|4CvEJc^kWG0HiIo=9p zT}Y+S1bQPHf)>C4Q;1~X9a+4uz50hsl!roL-Pxs8?qRo@D85voCVYx7Ma%)Q7 z9Jf=7AmM(Z+;cbT;855h0ONWbaH}dL#8qtStb8$*m|13Vab&B!u`#OcUl&2Sw#T{f*4x|L!StWq zwO3zX|9vU_QQ6o@@N_(X6_r>|%K;c^9LXy+&#I(>*pjZ@8Os*eWkigR*L82W5XG&l z+u}F5!zo~qxn!-oql=e|eOtg&uS#Fu*(~io!a5^mF*ZLhcs?MckIL9WY zVfJ)VGT_Em#rYE2{7%fq&jeFKqQM zSQiglkOU+U6g@sZU44%*n-%GD=)S!7Z#IQ+H1Wo#2UplGin!ks&Tx1&6TqrTaytRT zFr0{yhJW!VVkobxT;JdKq;KzAy&h@H;4c|yUR^izz^|7CLf|>|J@mnw>lsJbo5ZLCznLHA;-o7e^!>>3asF4{3!|6R36)KSOcVL`a9W zRb1rfUzs24I@|DjmP#xtiFZv;v-JXcbjkd}Vz)>k2AI{RGddvSGg2Xu1FP*NbEx8l zE4s=qv>d`uMp=CMVh(@yeK$P^a>{1^dk!*y16=e^(Wj>FwsbwpuJjsIB8H&Y6jw1) zETZrfa&iKR_`k2)hMZy}2kp%zv9#Nwy#A5e#4it8EX_#n_x|s^d|lSvy)>4aJbw1s zhof`TNd~<3NhJh*Pu=Xw3)Pf9HTBcxdK+nusy=#rI@HM0s+z zsaR}`Tzf?@r51oq<)(P2iu*30Nh!voobeQ^hiWn7wl^AvOS0(Txk!W zJ*k5PwJY->zS|k-%}!2MWnQh*2da|d<0@MHv!G>QB~oU}dy34u%*e4eNF{{`4Jsx} zTfsMSFZlv%FKtPgxOa=MC-aY@fMh+ro_-FGsjt@%d?&-vnEBn9WIgxgquvEPSh!rb zGVD(9JDaM1eP~w+em53RX|ci3!@0YB*-YUP`~1(JCY~$`icfJh%(GwrDI4}#n6IH? zGx}4C8gi%RrkJhdwrpw zw|A0Yc5aeM)m!H3j?0o$($iCo44<+|#)B~9k3uM20KaJF5a8;{DliRr;^loW^Henz zGV8AHRC@si3$(axJ7kbJoBk^wo%217figT&`K;}uk@#3$yohho)7LZaE>XPtr|@yb zoxsv2-V!C74JhJM3#_B%m24>3lmNud2fMkVuIs9*`Sa%hpg`^iZM(Hr@p4q2o*m!EqO;P=U>P#LBVxOU`uwF_aUs!;cY&mNG^@fPP{)l_fda7`0Cv3nw`4) zFUOG5GPHpGXxq}zGicV;3Uj8I);fjCpmx#I$hWpM%AzEsU__F4lR{5b^T1BY)(gs6 zlVLeihzC)!=`oscvl(#J^SSQ?8b5&L?Z6Nka;Z-0QM}1wl5b$?p_|Rv0gFoQKnb7H z+DP4$)!JGGpVsJyQ*3L9#J1R;>kq-tApHF3M*AhPy;Xszf#Oy;TQcnn=>qQ|Ee);1 zO21$WNffo4^_Um;#A4!NAF|?Iav?IrdN5}pYL|rMKo;5Pl9Cwn^jigmJ^_6R9UQuE zvS?xs|N7`(|5MehU<4ZIiXM9+uQd2G?v|33!=k;I2(i{Jv5$JX$azmhZgefFjW7Nx#C(mMU*?pNCFuinL*GW^e9${G z$Vak-(p_t>v<2lADoo6gO%EhOw(ZM)(z^UA&F5X)LIif0FEAzfG7|p zGD~!VFo3`d+o8)t(ZJR(*_~>Z0jjh~Z0u*84uhEASA6BF#LB1-%XyOO^IjJleajuj z+Eo@p5|7_kM+QdTyz^Lwj=JQOa5%D6uZE&J(0A<_A&P-OF`CqFRHGJkM@I85hO2R6 zK8Z30UZVeygCGVC83Wf?I)$wIUnx4O?`9X zXyEO0*GO*5$coJlq?s>-N0Y6FM!UCIkt{+2W+t>TV^M1(RS4suU}p)!rS>)fd-tW` z?tZ~nGhZj;s)sL_&3wJhaml=1>arXWw-;axGB#t!5X{!o4uBI$%2usog z1Bd!pJcJRY7Ca?&ro3nM-p86 zZ;EYqerG+sOL)zf^mJ{<#)ruC$_Fv$|5FS(9!Mgr;>a#yyi_T-vO|o_Mn&IVLE%{I zagZm>#QNP5Jf?1aDY7`BqG!)>NNQVP)jB@CWd>Fdu|f2zqb#?o75KLznh`~Cg= zAY|&y>g>R&Ph8`8-BBuL-+kCoeu(Sq6M*a()IEw1GQQrfAP`9rwo)k$Gm-t;rSHK8 zLJTWA=Io4Xf)c+WUo19EJ031?0C`KQj5UJvaiA+IEiF~BF$0EM^g4r$x>l>w`d=i| zqR2q?6??!>#|2|$x4uJhz zurL%TWBMeQ70@gKYoK6r=6>%p7)>>kXD1DTr63fy(j$VofbaU55s;Q4JcSlU^ zM18OV{_4B4C>W1_fNPU8ciD*qIS8sUeQCqLQxi5X zjZdp!?pysRvtfn30qEoUm(d_XTXLKL|KV~rZJBL5a=lKS3kIKxi^G4`+yjp@Zj$ir zCxbQAKmwd|yPtJjhwOwzG z%)SR}J)*HTWgoxlR62(WI#hI>laYzB%zj4VD2>eFpNot6sPns3>>U8Dms3cpyH}dk zy#E!aW9EMuBWYmGTM4AbK*d>ovQ4fdWAte_~5ryD6MQy>Jk!ulZ9Z*EW#`W^$OV^>omiNo* zQwJ*V-!EP?bby!}L{tBnppa}dp^>T9{BVdYiUkx<=E9SngdzzfeBz>^C1e=3D0}N$ zSuF|9Ywz)f_1?FdU0E^n^zQ`Q2o-57@IMNQ-UQ#KZCKwvIcgdK$aVOE_tpmCg>8Fx zqC`F<4e9`x6;K2&FgXmNcQJ6wXX83E4^J`tSrW&~TU4)nYSt4Z1NUOUsJjd?Ae^q~ z#qQfyGjkqMG4?3buc<0luoaMQ(YzwmHuxLEtE^%lt9PqwI9gwX$By$Uq3BRDkWvyl(q;36LN>>r+1DX3nSR`Y~kLjWU#>vqDwENuW_0jSN3kMT zfBR%Xfh~qO$%+VR6}^B`MDi3t)E4Cm0seHm`)>nd|ASbKB`~&f{O0C^EEGDvV{!)Z z>vrl!k~a-bJofA^L-HcEM4g*jB=~CE!&=e(koBPI>@3gdG0z1;bB6{(N#*?L!Oe2p z|JE@e>NGtkPwC*mgQ$tUJck>;_JCX#Y!ha$BYly85a2r9ghdCl#P8iS*qh}2{?qey zL<+nQLzCNj+|7X}BclV_)UbtM! zJ_T#&aR_7fFN61+9U>4(2r-WXu$H$5&Xc5rUh5a4jEOn{RcxqVbDV2O2LxwZegCg_ zw8p1cu?A2)#9MIc)N$4~$k1GD1uMdJjh3vJU_7A{S-9H#jj_wa5Z=rVgk+Y#Sh|RE zhI6?o$@9sBno$x*FVM7>*8RPW#9xAa!gY23{mX$ecOnZpgNPmkj8(DkK}ICRj_}!^ zKH2>J`-i$R)JLBkrfT%lTk0b=EH#&~ZCjMAHf>v)fr3eXeZ%KT*!jx~l3wEd1GnN` z7Oea9H?F=&+kz0t9ms89QBUjNw=Q0~^nF$-1&@fTSQ#6pRFFxo3ms>_ZzzxamGv@>Wt;a^6A7PIK$3CwFFiSXYtRZ|FZiZC8bcGa;Ll!Hc z*h_GpUeIo!N&0balV%}kyXXfB4b|trew~8=FytO2+zs?SR{Or*2GkGwBP3l0^3GK? z{HaoOa{i`GMM71;6J1G53Hg}?Uz(DKDu(dA$d3K+`MU`M67MwrKOtbib6uxosy*Qr zup9r;jV58v1(|;BN+k-vvxgmy;xTHF2ccgdm(V2@_~!6dqVQD)pGSxU3$$PKO51oy z#N56W$ObzVJOfGGTj=}oRot#*qB7KS4a-$bq`E(;48A!-XskkBJG&js^H_@O@ zM$IF{srBiP0|yMkdAjL(szlXS|A2CGy1~BYryhfplbXvSPbs@G$iW3KF{XyCjph*j zXDyIi6VF5@A+zu#CZRx>n@l9W=F+$~Zz^A{n|+ zB?+On0w5=JyON=HKG0?${b{SXkgE7~hWx3MeSLqPy9;>WZNS`i1JRKe{60l>3OPUA z=!9~z7iGnBFTg2{e@a~hap=}C#gH_uJKDi&h06o*A*25Q9f*Q6Ey&Cik%~1*_nreE z7cg5MimF83SO3iV?@iu-oMqzv3MXm{x<}JtZu*kuCov)a`(ES$;+b+=g z84!$ZP^=Vh&$oFCG$z>2#B^he?lv=pkbwpwX*4?0tZLF{qgv+7;m(~rsq-qfh~FVI zD`R=lVAkkp33oV+E5^6cOyy~HEkm4Q1UTjIZ~#NHnO(6leS<;7+JEm62y(%&5~6sS zB<0!-D4}Cz8LMUCwFh?P+$$^nljyEaR}Y>?mP@0vAel!N0jQ`&ZX2cW|A9q7l-J5s zs|?!W1PJdEOg6VLx7ys&)H7&w!hx2i=aT=!!i2K;JI|Cs5y-!s%ZeY3@~}Nr*YmD* zQz(F5&P}0Qhx34r@?>Lu49U)y*=Z#SE`*fa99WcH`$P)V7Dx+sj#-WWq*uTP72r!Z zG7v@kUHgw`CSCTjCj8G2GvOqSe|Sj^5Dvz(G~g4#>ZA{8RP>VJ?&zOd&-B&ac|VFnx_eYjY^7XyoMu*L9r!A9wE=6;<{{52D?+t%8{#h$sd! zh(Mu46%j$IkW^$4kW5jMV}UIS2qH?543aZQ&Y+S6Bo;Z9l5>tln)9&xH*3xRC0%yTus#W!XYWdesDMDrn4t z(y>K4axZx=A1BYT+CqX2{TZ-uUL=X)WKBrj99=hLMhx@Wg9MrxC~i1|LxeQY4)8u%Z3Y#>Vj*nfyxyU~Q+rGs}w@x@KWsgC~L(;6xy8 zF%sxI(O>QSWf_9BQ8%D!~V$*I_sXLccX-?UfYIG|gPOct6T1!#p%OdMLG zfV{tz+6Wa6P(vneJJ-_;zxM3R{(J=*8Vs#Y1(Tp65l_mO>bIY(SJC=#=9iOh#}f?g zA2NRoW<^ZmZLANju^bOq==+dR$H~dCp%AJsI-JENLC-!CtZVi?&H8Z`S)9 zj)xiwFX6EILUorMIM*<5&$4PEHOo_qHzuKYt@GRU*9;sC0?A1%mr9^ZXTaT~Kagn> zNT*sI!hSBea^*i+@SSslAn%`&6OMF_(r%BXq*##X9mQ$7haC z_N6&DHu}KA{BHP8oAt%R!g90nZEB`rVR@DkqI<0bq@5wMu!RycayBEccW4t?V4-l^c*d z7pmv~bg;Voy}3xOG;w6a5Q@~O2($MFZD-KxdFBa7FCv&{`Q3WJyyH_vUm-4KT_yix zG|$M5Cr_?i`AW|_DnDp5C;+WLbkvKxs$v5yX&r+$22pG z{YPL{R@S%s60!utzr5X{LLl(@d;~g_ueO@8bi))z<=E9#hjpf<>h6}jeZv}r@SCzl zUT^;vw0&7qY%Pscm4i1}9;k8PT7rJhs9}fhxH%NW&@9)n;A#CseF40RJDW`2Wp7%K!IcpZ-6dp!xrk1+Q4y{=2E}O8ZAdq{B=Y8H_ac(Ic<> zFC|7NCT6BT|F`Mxa@W__3)!-3v!$?&t{$RzeirWd-#;gND)(RP?HNUNWoTrrF`(GF zxtkXwk5e;urYb+qFHOzJWV($6c5bip|Nb8@+Hs_cU9!>84j7l#7@$c^{4Zg7dFqZ- zgU9)1_F_p)7cY*!d<1&_9nNFYYX@a%tN$(8A8aC*ou&$4nGw(Loe-1bKd4(5R`o0kZ{U zIC=gzO!T}F;=Zz1*05a|Lc>f<`8oA`$Zkz`Ma0CkeQ0>vJegc$=Y;Kg2ErknOI;$| z=X2e==gT0--uLCdkiu#JII$yhPBBomHxvvcd?=kNULn9-z zhK|D3^}H#M7WI776dkv%He_zh?;qBTp(vDAzzw+|8?hv}?#RNKz3qABv4)^b2RyX5 zxq*&Kh2kFkW;(7PMc%4gkoBXbc;W9I@b7f{7l#*t;Q4e+s;l>Y}dy zGu5ITi$SNR@XEX8PU|-X{{7?d4*8&I=%C%qWhyt*WM<}XD}-nuoFDqSsKf2)v{8P_ zTudX^FoT9mJ>6okB#e=pg5vsFmjCwr*6IdnKiOq#8Rp=s#ms;;RUz7SH{Ym5JA7Hg zqCz@=rF`5NCeHo-x!WG?)}&nHP2HJp5&%tc!N5C2$ZV_F-NrTGOL6bD-E3dRT{%qg zg#G`X`uC}5l9*H|aRM8^Qkpwx-!ka2T=V#&kkY?1=V4my-ciqfj1SAfvFICYZswz5b$jG5o(d zw0F<=yye8RHUdwbvgttk;D6hH`Rs)YCajIk%~+Qm6Xf6DUHaej-cMfFVR!)-@NL|~ zkN*2>zKmUCx!%jQaUmWF=;-Kx zid2gHTW_ZScKKZs+to>VM(E2GSP~n{&dSc-5LiNSo3yiaf)a*hbq3bxu{{xm-|Fq- z!^goXfa`mptsPJK`z^c}(9`#u+*}$->`=~DkW}`1%b&na(JYAndS5~L*X3MWh zt78dpRv@ZD^Y*OrbmZgWSv#bo)e>90dDD z$1T!?b)h#`>Yo{>h4NEtO@*Y;Gas*+G$yV^tRJRerTHD!f*-*w*shHJ<()F=fLh3a zxxaZe3tNxBU0)D?x{*8GnWklV)=0ZF(i6-jra|n9)ge0Xs?XBeE3~z>*@>IAeyRX# z68cRWrQ@6_^~HB;1Iqj|G_xfROV-=1o4;J2>opE`XI9g^!zH;SCs&ZQ53FZ=G;y4$1 zcSB9R!X;sSzTZqRiRtXw*m`_fsu;nkKjSJgutLxxXIm}qA(R)+n3?`yEk?wc-R<@M z-E@OS8cCWu@J8Q*A%}{kb|0!gbmJT03QEhM z-oYSn&2M#eQpnx0|05i~v2sODEasOS6<2!*QdIUmPR_WdLD{1P20=idvk2Q7A+fDh zYXZ3!Bp>00BCT^QZ~3nNaIwDjQ85WKMP|TfZ})Cm@=VQ_F7RJ{ph)RFZIYp0Ui(DM zs`|O8{I)#pgKKkr`5OAQ74bo7Se>QPW5l82O>c}szUpbm-HTEsfVlI`rH|2Tfv_Q#9rZd&pA6cbX;!xD|>bksB zYlz}TQWbC6ziT(WeZd(3WqRt;tw@VB%OiG0gD`+8gLl9Cm4$7@vD zi{nN1wa7;EOsOhanM8f)E7xh;O^VOU<1dYdoia%h;P8H?m`=@sosQbRbTg1-GeQ+6 zG)9$F=+_RVnj=oTzHA=Lmqbf)k3lFp^2IR-&g}EhZtciVi;Grv;?727XZ1o0!iUv%C^@xA*c^(R*45ry{JKT__S$Fm zCU4#CIG zI>K>RK2<42FN(#B^ZV6GTtR1A_b4)oY18F`x=+W7I}*anF`uoOto)&xZ%kUA*X0v#>hZrlnDc6Aa{0 zEmD;e*;Dmqqde7WdXF3`$U7f_mR&0AV~ zdwUo^gOOTv*sV3L(rD2;o0j?Jz2ByIi^A`@TXc10^Ds1YXOKRXJ8u-%qzsDh->R~3 z^qU`4ssMN7UvVqN-@nS8RK#Mj9}0c_uV21=SJ#nqy7BRIF;wGBTY0$M{D1+gPSNuZ zmk6UVhx1kFPRxzA`I6K$udx*K@;X!=}W-FR`R{fvuNnZ2~3<*h&sfwx? zeo6iNu5YNSiX|qsXxe$Q2WkTvYhAUU-JhKIiV`iEnKL0$fmUM-x28?6)@?PUu|xK=Mt#SdSmC`|5twcJb#G3C9^M7xh`IF{<(x-!^gM3t@Zn+aAky zD*2spej=KaPEzmaGCy4Ppq-35$1>beg4@1dc#PtOFc^D~!)5Vfaw1=E%v4fJia~69 zynmr1$({$Yf=-jU%FSgCq31t8#gxg0-YsA2I`8Nh)Lb|I>Cni0KkWOKH%^C^oY6rmciHNVWNqQIbyA0`3tul&s zTMBYon~mYtiYQ#!4aw%|k1W$nl>Id1YV8falE|(C;SVJlq;0xKJ89xaADLW)UuZ%&;d zHrp)CVi`F<_Q7y z^dsJi0~tj`1y-e)A{u-9ZsxCA?$s;X?o2Lf^MjKXXMgSrB~1hx%||-s9BVWj7voF! zf_HOy=(@E3gE%QF6?YF`>Pwd_j28y-!@Dx~RM=u2)9sYfRf}bEjaqndGo-An9D^p) z6LO4I1r-TqOEyeZyzf^Ku*;yI8eoX=oC;GzwD5 zEbEO1RW~>!IXIu!q@5DaJd-t2XuRjEg*hW^IUHZHmH1jWnE0&Tf69*pK|F>M38NJ2 zFa-Oo??qnOXw=p>8%(8Qu!VZAX|Wb2Ppe=@hgi%dO)p~nBIjAXIr1D-U}1&lupIFy zFz;o@nj?OAw zaGO%$Al&4cwaF-9Fv0Qf-=D_yR{&aHtk|{6E;*yTlc88KcmMwVVFG5qAImjs<=vC5 zU)Px~$#LY!5sm5q7P(Au*XWo$6Jn2xECt2TU+|K9t!*Ha29YumS7!e3M$g?EgAbL`o8@LBaUgrx(;j%R@{qxU1eFZqrD^b_2 z4aXY8yDdhB=YYCNYN;?z_1xQ|v4k|YX=jagtRej)Tx@^}F%#(z#*lWm}s|7iu zvoyM?uFPpIwZv9Xha*`nt^_o26J&{FjX}yEIn`wQ$D1`y*Y)nSxF0>0Z<@aq;p$Fa z8@|mjwYhW-D~G}FYH?tmJ$$LqS+_G`2{V)JB8jB)HL*cP-F}2cf^8ipxGnT9_YgA{rfm_4UKXT^xGJf4eFi@c zc0tMD>5WWvVj8z=YKPo{gGVxsT6Wz-P=)%~v?WVLXHI`8ZP zoSOXl$H)vV?MH5nOkk)a%F4yu3R8u2Kav}2nUaX7(P!ku11@S{2 zOCv0^w+x>=d0&7NwAdS+8Nr1$KIBLW@Bh{uSt?5shXXo?x-o=N$<$OHX{l(P>$m3| zwy>}WTW^$O*Dg~PG5Cw(OZXLwmhL}c>C8XJ#}ki@)J_J_=Tp|r$tXlu>?(IPHr|lR z+8416D+re@5W0Qa_($>?nJ7-R^g0K{jx-IaxQBj<@O+XYtgNa)V-=KyM~SNSpUKp9 zFCu+F`*Z75nA7tp6n$2Jz){yraprNv?d*m?whUbVTghvXV<}|EO2XOL`{O7T3;K}) zlFQN2B?DWhRt-=u1x{GX-G6paEe2H{zKKf^t8ij8u}M$=IlLs~O17CY@9Ku9>L{uY zE^!(2mK^BqRf9B1aZH99hoU+7B1<)cgJ^wdvDMVKcK)Jy1aSd&dRapt)`Rkbo@iHK zbfW1*=AcIre2m(6j0y450o6`#1trT%Z26%B_v_cM)vEt+f0_5ZjhV1EMr#>G6yabg z6!h{8AYPwZ9^*({(yQ^#5qtF~i&{=RyH;xal=Dvy-*6>B^5K5Pc#^BA>rT(JtP*>lWA?|JG)#ATX-k~e z!VaD&fW=qk_41fG@dTulqBT6kXrWE>nu)L?(GVi!?S#w<7U} z-$l{X4{^021^K4Enq#3hIqxB{1=d1srW=1VuPIVkyx9la9KAstD&M9=jviroNy;*; z(c19bhJWByse;?he|m+bR){4^azKPsDqZOBaRGRRV$eHz^5pVTX1cKbJe@Z--pB{H z&Z^#9)E4qM_Q9Lcu`z>{?9-wgDxAIx=go)r+>e?r_XZ0&&qqiOw6)2{J={y)Ah`+t z8-u>AAE)JxKM4~NHoe+B3gCdGLc}M}_=Q?Mf9|zJ=LrJ@CV59>`_o`b zrr4QUf%U=m&8 zISa3muT+0_A*28|Sc2v=+`BYV!6fdQUN9%bdhJ?uD>hwKJ|EwWLY7M}a4VW9ZUti? zBZU}~idDmjS@Pv2XRphgPbwCnr8nJi^uKn>Z?pcW*W0YDLKBz$y+525f5tS`@%8Vd zJgYw|6D3ldN)C&Dp7V7yst4rAfN0VYi88A(Z!25d{4EEEZJ2R7lgkrEzlXDV{=C(% z>aVniYknhad~lh9*9%sB`KzUkO~<5sRnYBh$3x#1f5q8M+x(zWCZD>PZavY=F#P81 z_4Zem`XN8_zIAtNm?$KnaN)u&E??^}ef#!}-|g#tV!>Zj({*Z>h5oL-5D{19Baus-s4kP)^FF7D)*7`AW(b5Lft!*c!VLMgW6cca4O7X4{V`u2;Q@2jQ?h!Ek9wByG+0kkO z+m)_HxzyVF1lMcYe`gmedtf-#IgcVgdunNgy`8PVD-uo;+YnDyN9)gpkLzWePE7T4 z{6%@15jI|1Fgkqd`-eD>f(n9Ditb@e=f5a^+CDtU5YEP%tL3K3EdUPr=iWV2QboYa zmoH;GCmMp%0KAJQ;>w-Zo@8p?iHn@*{{}ZtzFGLf$x7oTJz{{_tZx50BNCRbLx^-teq}o( zYGekui3UkbH0Y|-`efo(*K=!Y#f-3V=+aNijS?-cy##lDB3vkR!-&d~ttUBh?dVUm zd}ntze}(Jr!|->xjzk*b=E}JNM$na@hRyiY@#9_VjKa7upWcT`5Y@~dyjDFyN!cOT zq+zl!MDQrc)DoJWNz|#8fQVbx%Zd={cVB{6>ks8LL$O27Fk0L9g0NTvL95bLORF@L zC!|~>BUQ|7+2pO2OE@$YhLgTAFPfoIcm-n>Vq|c%$m7^^Db(edm3)P~9224;TrR!l z5ltFzOUn|Z10G5qr*&E~TG%JW%qcSnhAza?oC92!D0%bs30ei@u0x$15(5s?bTBaz zg+p0DDJ)#&3jnK<4c@?DI2p5-b8DDKez4Kz)y==Kguqp~zIGU`mz=${|?10U9&Aj59rf6Zfauyn&_bMZ|0TLk7e-8i+p z?V$3(-Mz|3T!mE!131TH#=Q7TK0r570=eUKq1~|TeIz|eQ^}g1Y||IAnf#2|--x~> z;$XaDc?lvQBuZ1Qzpe^dttRhqYd*Pq_fu1yqZWK6S_Or+th zZW-P;T%rz(PtwrivYJ|2N`)A%QomDWCS_#}Fwm8Fx)KsIXl-H`zzg|jzQGJiVxX?S zAEr_2)ht8Ukwo3zJw`AHm2 zQ}e-7;aX@ih0Hp=4H5(LT6Pf(h!>pCV@z5EDexU z0l3Cl)Oya?KKtd%UrxIfsw*b|9d9ur)1L4+*mkCiD{W5DV(6wXsl@j2Hd;F?7{IKW z*6ln2v*Pods(0t-=TQtSkSf%{Fen^{Zo=Y}fh#Td8a>fkC^xgI8+G2Aj#U7F0@Ql2 z?$N?VmCVUXKBGVu`+3!g9NnsiL!~{p;?@hx>sKZD2Q3AZgNiLEFe~pyiI{4?<=*B=GHEIR#XdU$8mWSo8V2Y zl!ir9b1B?b*DsTHTAxmP?emdtm}p5tvsv(Z*Fzu^HWT$X5CYeO4&tf=;YXh z9!6gZbX^#bU%XMK0=AH6tTq9KYNwWR5`9gcgkb2(2=`q9H5dGMU9^1aOMa@W-dsDI(-ruWFl` z&_V3j)&}KTsv(qlPdxK$eQ`NwV6cd23Ic&s4!g9vsuX(5Aa5<`aIg<8&lEr?B&+Ev zPA^oTP|P?Ia8CZ&zgMb&_C*>7Li@)T1ld%8`H}{93EyD85x6k@Y;Zl?g7|Qin)IzPM|iN zSwuv0&}p^ZKcSHl2Yl5NxIhlh?$D)w!G-fexji%^6>SPN6KNV5u6ay<)7Z=PqEOH3 z5VYkog`Px-ICLdhVF>#!%cGdSQ(S)kkoy|kxjqh%_8`RMN3O75+${7R4yk3}Pc|y# zjSkZ{@7Y}Cl>~|ou3i8o+44lok)rstq*_$nSi=*^~%cH z5-%4ZZ_8XEJ7e0Jy(WwdXuR@}`uG-aIx%=-qsDUT0n;)F(r;q|z)@fO_3%nsR~9K5 zqvd+Dn#86p>qC3NzF1_J;FKsMvoM)$`bluwT|yE~il4aUUq=_xFp=t@4}FMfYFT)R2t1G$hYUGSE}rqd z#MhjcA-RHA%D(TYkw~shgKtkocf05FmNeK>;HAeJlKAucdsfCnqsQBmW3~pexzM`? zVXoV|Edbl}#@I7di`l=KDa1dDkvO_u&7aSD;`s3bp_U3<<3odb|6W7=NbvIxnY>>@Vd&={e``Pot zCD=^$jHq%l-LOGn9~4h))bA*6<2zA*{8sM^mDys_Oklw^g=Kw-H0%>htk-8iEa z%&pZ0oIjQ20$s#|v%#?c`CY1635&Y68LHXr?Jt8=BJVh3qX}(F?w*uBi$jt=!O1!H z$_V^we@V>;#8L-~fT>yS4^kXqVa9all{DFLnqOjP&{SE#VmA5DU2B9&qPVL`*P4}e z%aA`>XB!40qM07L?rdiFxstR2R(TYBdwo3h@x(ji;e&yPBJYYG+szIn zP;_{u0ODkgahNno5TX>X6WzN(rtND1mwaYeI(-SBNLcZ(J%DSevN#kB2yB)|KuiyFJww7rs2! zXx6PsdY14wh@bFT(|^1v9KRA91P@3&A|MT}iA;3e{cpF1>vV;jMnkx@D$LKEqM}kR zwPVb;s>z{4A3pl$pQ%k7b3hFm8?Ue{sz(YH_?a|hC8R17AlCZl=~gAGQfHVC7NBEd zVmykn{MPQD(b2(IIX`|1>?m+DsTI6DH+w(VtLA}f9orDZURxyRTmqqeT5z*tm9TzC zP(>x-(bjCtI{-fHtlu3{dm6`^!?Q#jt%_2lsr;XW6kz(t9zD~igV3i97Em2K*myMeT zwx;nTu|dEIaNX>^R`d1iy|o$Mr2RzT%38gCN!X4~%4?N7HN_(65!Y|q0qBuc+JCZT z3OWiaW%L&)!n=scaM`jlC1v8?uDCKPr%ju&s(*-IV-T!0)wXQ>h)YazR$5ytaPotm zNQOUlnwV)$pZ+vhYG0T7{=4~Ac0rZyKb;kb5FM1Wz9yA8Ecthu4Gazji8$VR?I|8k zJazJ&17<&~(uhr`LWDfs$a75^FavqVCoys64$tF=9z_U4@{b-R!>KhZ!K~z*xhlos zyl#%5=`-3JLK^u_874cG`_0J@GkW$*`3;u;OiKzoMDb!@cN_6(mSKhL&GGp^pN*w< zh6&qOWWvtL9CQlN9??q3sUR;~J11^pjXRS6F>zV)H%NRVEwOkRVK>E)lLp4JU)Kxn7q$NQYcM&QAtTMwuzo>((quew_JsaxzlL^1{`fkK(8AvP3s`LqJ{G&u3f9 z)apgX*_qnqsTPCIq1uZ1sZes1o-L~AGIHnk?c{re6<-t$kJ{NOcVb(jc|$)bsr=&MIfSpbLz@_S_3!@GKAKS=o@CFs7N8#)%SLDJ*hBwYjU+d zPQAq8pD+SZ38Fl| zmk{oICUkwS?_rUmO68vW>df0v4+ppvsif?$I(gIbB+d_(n11>4)uRARpAG$`R(Y5| z)XJTFUH3+$o@TK1;pNc`sy za;j=}Y~lvcIE)CJ*(ZG1dJ#AJCiItU!$#05E6_*&Je$c#PF z=a7bgtfQ1}e1@>+c#g1(J`pLl8~sZNbUwgkJkx`XWiNi)z{^A-e()QvKI+U=B<0*tj!N*s`dAAv&cOjWzuunS3o zOs?UszL&6&kZF6hrA#;qoxV(9gk)V6c#yUXjgJgR2aBy$V8FB@JW%YQk%L3g)VRFZ z(6}U9i=(3>n|$m8k2{-Sq)x;CNL)cV=!c8 zBUH5$X_3j39Ua!Oj#sJiWYMtRMJE6gnp_?XbWvbD)xjq5UHap~}S`daeMx;xg6uJ~FC*_wmh zqFgU>X68Fw)XIc%f$ivGkAk%s!Rln=F;L7snCYa!Vn2NUjJ>@euua&RE;ZMzmMGz* z$HClnlQs!!Sd2-^boin-7850eyWLiXu&XKh+pN(PfozHoch~!E%J;vrl-Rf2?iMp! z7eD^@-=Dp}4Wc?y=liB>T(dXVs9VRaxx<;sCH6pip7;@&)f_2Q_JM`gpyeZaL$-_8 z{JM$4I23Yt9X}vz7u8L{XwZf4Nfvcpe>g>M5jRT*u`Ayiiw}P2OCLg$VcuJU?#|Lt zA+Jv9i`D|qM}I@_ddfrJX#}RHZ`aLyg{MVSzEfhUnLxCv<%v42s*>DD@+%Wf?-qY; z0_Mxdlj>K`Cqe*!;Naif|E0UT-?U9;0>c-(mdqP!zDKX?I1y6q~FvyNbfhf_ksWLiZbh zS|)7`U=!_(+1+TH$Gc0%cqJtn1&-Sj2riV89PPQbFX2O6oYO>wjrt4Xqv)u=^z^5h zVFpWWI}0<^ACyKT&xf1A3p{N-EzzHr)N>7XL9WrR$=dl~uV+6($OJ4bxXZ`DF3Dmw!1n?mV*2f{VED9wNyZ~3&Ug&Zc|*S=+B`n9X*8fNNb;{=?h zfW;5vJ386agCTTe&FR$2c&2oNRvn?YhrrXQ)KcuZ>7j) zDhIsQW?tK5C#lk`BG8GN=%~|0RMHIBSR<`&8LoOA{9`GWE6t}7jAy=S{x{pr4b?0?kpiaxE7^dC-mgC4Mr3n>F)#Zs`Ae{T{L=B#w zsa~wwC>q1_JOLe!b^mMCN0|vh?=dfrTrEpL4Y9VOe{DCEm{2P>EBjQV@ z`U}OegqH9YHjbO7y|JNF(icJVF(qZ^{$jO*0)~8C_dSGDa{hf0`1%OpIdqs-&S6jw za*YkP-$fojejGJL5^f-DhKw#lJ`R->g6hTQJ17~&?JB=dH}fB;?u>$3f!(nJ=Xovd9^YS#DSC;6O8RfU&E zSEu%ECKo@buHiBk6LkMrvHi1*5eaj^7#brIc#2l(JA_=6-1#Np2KSddl0iF{*iFTQ z(ALM*-HitGMBGdYEbUECc=?KF$sea{!mE%k18 zIcIrsBSLld2My>{AcxZrTV!UYD(5=A-L9EwfqO;2?yVABJd`*9^xdZb2Ua_+&8LC1 za3OPTDKmDV0%uYvq9dhDXre7b;d@QhSM{521ZWLFrj-V+k%z^nn3(XyO%E!DxB;oB zPd_2bw3kY%rhIdAv-~_u=5=(K(%MXCzO)XTKTBaB1Riw4L!U2#TutrC~s=U_P&L$=c3vJ0bfhN&z0dt#FY zvr9A~sJEW;^>LafWSd%BIx`nEiXk9=t*z%g$A6Z(@-(G)pL=*K5-^c4Gpl!;z%6OD zQfw!ks!~`0zAKXeONGRn3!Zlf6ckV8{zZyw8|l3uX`)|szk)pg;=(MYz7!P$>ZUJ` zR*9@!w3x4abbrA@E4b4rmo|o+RoK!+F8UTC2ZvvGN0lh)4P>`T*R0z$X|R2@f0KMn z*$r0>@{I!Hu2!C{t)24 zH&EPyx)%-BU@&){ z)=VatJ0bo?l4tlDt_e(b=jn`HPUT=D0-m@m?rmFHT4qb@oN1ow&eJ+{`C!9~ExtMl zTSogaG|5*1 z6#HLsg=AZ+*h)Z#5E9uiJUPkAw9wGja6J=%X4kwvLLu0s_}eiZJ=o4ai}#x&+P-|1 zh_lH6e-0Jh_lSye7chh^FD~A!W+HE!*-?5V?vHf<8v9{iIv%S`N zPEG2<}7E2etdq?~*7g z&vrW|7c#>$v{U6D)90cJTz6|(2l3bee=s%#aV}x&tGbeiRAnRINNV;e~Xp&WtCraIVd^p=%sfNvWn? z+9 z?n+aso8F+ogP~u_myu7#gqY~tzP3=Vfd-F`{zSSq{`wG`h12n-rE@GcBjZhv7Dz=V zK35P6?HyrZDPdaJWYtQN$h-YumC>@41GzK`r^stFZPRA;{s{=^ zekWfU)w#emgn9Sw9k5Ax?eQ4KgcJ78`;ehH`l*sLy``b>Z~gON;2X4 zdYG1V$9nt%;+HfvHaJ6tFZ?$IeW2ktsE<&)Dz*2W+2k7d3`gg*dh?phm!=I6A2(D+ zB1SaEI8AWP7&r~=7R>cS@#V!|Rp1&$0zfe#gvG=&=k&8erFeSo{3dZ z{y_#Gq?_;*M63w>76X%yCZ=-@n_|z1pY(}K*Vci+vz)0HL4@P!m#2CSE+53e1#+hz z$}b971!^{hp3|fpgK)5-TrIOlP?x__zUj9pVvGMBAGikR#4yX}>*vJa4t-I6eTP&5 z=ljL}2B;FYlO2)(pF9fey=fJ}YWm0@flV)u91mH~hLgSvk!R4##?Fq{S8Dx5zUZGv z8SGI3=@WDsUEVU|O*&AFx5&C?iI_n9-M*a8Qq3*{(*RxC&f++`M%PRY$&D{FlRHer z@ufe@V;WDj@`_Y-wfE|ky85p+0C%atZI|zba2RzmXJnO>c-72THr(QY+Lv@7d7x`! zgWg`?O9mqpFP#2s(h;{G3in8=0MI;m6nObxfZpqj(KjM){Q|~qa=Reoy0liQ&8@-n z(*8iKP|q=YPd?AKy8rx%$d4%v2BP}A?9R_ITM=O6I}s<6z!v&iNcH!;W&pJtVXkzyOX!lTp zMx7uA-{C1ezUR}ubgQaxfYu_|eyfRw4A4|-bx~P`?8@xnG#K;#5-otm*oFRQIcEL; znpt7--3|4uP*$AnB=;XI+jelaZbz<8P;D!5*rHliCnM|Jymt4~!rHhgTpKTpH2*;f=kvvgSSk z=C{1T(ew5?Itz3Y$liVB`CA5~L2Mw`9|wmPP)&AA_2wGndO@Lu9I^$<_kbxy(t@cs zT-ia)ueUIQ_6vi#TdE(5ofk4q2DF7|lVn2`l+(yz1(F6VWsszT^#A=dm^h1v+_Kco ziB$}<1H~)T?fK!I>mw`}Cn*-?#qDb3tP;JFQnxCrwk0hgbjv z)pSy{TejM}7K86kT?ckSl){N&pIHo*8PFGgjN@|YYu$MeIJTeJI#TBc@o1(CS7KRJ zG@}jsVsw1mFkt7jAah@FV;AE58|SL*jFURE@8TPMQ@X!^L5}p|j@c38E}D;sLPAX1 z=c^{Tl<5Z{c0Z7^&Aph!E$@SojlbLo>JmIc!o$Pav8+sKh{FPYP7Ba-Yb$~Lg6=m} z+J68IifHuD-vYNL`ySkx%FqZ7?RApf~PnFQnG>;^l!@zL|yl_5t@O09g)g;0hb0rTsv|BJmh zkH<3o`^IagGA+h5O_Y+7%95lkMW`f^CHqcM_9gqyObg0ZNwR0po^07GAzQL^_0xt|f6rk` zlTtV;EMS7k?`b9UAL3p@B|PI2vIUy&a)ar zm+z?-%4@6?ck@8uz)PnL-x_w6)kLr#~gv-%GpW<&~ls%xpV2-f<~|mX@|24QC; z2lpu5c>h3W zIT^UMPjtsu6Gox+P;S>NQsnE_yPm7={N)Mj8k4jwmG7MoJy#6qI~_+w-}ym*eroqn zuyIq4>%tbXGrA>399qwx9dMr+l*t+U$Ro=TrmKpd#jm|h)ammYy4TU zRGTEF%ox-qF}#ClR%95?q%1mC3ex?&_ZKX{uIU6d{=nq$@bgT433iOaxA#QxU8bi@ zG}UBt9cR15Bxs*IvaJ6h{Pb6tntNkVd*_PmVfZu60zudC{(1nA6OO6^VE9-@>Tnhm$ z!-+eOhta1bNdzhgf8pG}mpkP5Ik zqB&K4_q1PX>^pRM=U;!Bji>zMq%JYw|r6;Fcb*dBh1 z#(KrX4&hRPbIP1EpTl%cM?epD3HZTrt)Vf+^21I9B*vHou-vEY@)t?%n*yPqN-|L< z0O-0N-k)U5bIxF6m4HQpx0|rBwk9c7&NYl$wm&#W;zNwPnvixrER(=B8Pgi6h$qYMIni8UV$gAv0iT+6+rRgIRP^SH5vz|xP4jMAe_(W! zF^x+2lMl}j&W4F$)gxrhSyl>(Ux@AoS-blGpJjei9*$(~vF z5u-+j40Krwp4yM`lBeJ%GN!M5E1M4jvBD+JOZ6$&U*$>|$G1denjOF@>2+^Y!J^~I z<}*>##Zl=zJ#^S_Psrr^T~NienwPYp5FdXs6!y9%#TV*s+G$W(IN8{S%cBI$Pq>$& zMvZ@WZ%5Zrh7_T9#k}@w1?0&NrVkg7l>B@uuM5Bg8^ylw`Rf0vaEvIyC`ngNnRy#) zuBl0f%^ZgX6H|wy9+yuoP3PKI&SyQeSBS=G-NZxbp^Y<_&C<0 zCr$mKk^TUY?2+*Osat9JEPl`{qCkd$V@lnki!wfm2JD|fdgROIqh>!eX|{K&jFv+1T^4uxDE7NsMyC81;?OGp=m=p+Qn*uw<&Y$Pi zAG8E1nuSdN343~trCL*6HJLjHnLnH4pZagAaF%6bK=1Q3=k$svZAeqzA($4K&rgZI z=s0ybn5!*TBA0#L$)>#CvlvFd|ASlU#ovpR3G?lcy?^w^1l_zd8*UIf#R3r{98 zuXk{8fMLsrKRkw~EUgsk5@ae^P6J>L8&trK+BDT)vqyg7Q+|!DFsPrT7})Xiyt$Iz z`wD~v3a_~f(9V`Pt5`KkZv)2UlrcP{;3@kG?v* zaZHw%zT@d>g8qSjq^7oLVJoF;%7d{FXK3gN<6G#@Y0Xipe*{T%;Ofh_kgabb#A0o0 zH$|8vmz*N=ddd188~=U621fIg%$1l&2;e+m|Mk6mcd<(wOJZ=mbjbOszqk!%{;h() z)sk^|nhUCRI#E|$KSq9U@z4UG3bL*O0yp3sNeqZg~XRQTE5{vZ5FU6VYw=cb7f+1qB)_ z)GiZQ(Nm|?(0t@d>Kaf(PO5s;hl1LG#<42!@cZuWx{pur;$zVH$yU|_oP1V^K)1)Y)M1mA%V7$_!H4Zkc5-RF zOCZJQ{%gk>ysHPp%F1W)sTf7TEH}BRkGY?(?m1; z>o31F=V&@WTU746?WC~Fd_$QR9jz6pMQ#fNL-xCyLOoSvrPMR6b0Bp&B&nHe)&i2r zwl?19x^1@Se#z9g@AGDz=qYYHydsCEBpXGoKkQaK3SPlzPnqkq%lpq@B?$$$xNtt^ zPE_Fv3(KWt=8>YIV{~vTJBje;1P_L&sPvb{GX`ZJ?A2dhzxQovyJE><9|IKho!JW= z={F%8kaL}$OaIew>(bAC)G`c^k=<~+INiQoa&DI(YjWSqxYSe!wG1B^Jf{UiMSH%B zC+OiJ6(b1^}L>3QBt-k;GgiW3WGyP8=Mg(43 zD^!=lgK4_o@Q9V!r)>2+i#=^u82MA{!%O^t%dlw+_Dk-3G%+}vxXi0ORKL^_m!Zle zVy#r{yjxBpIPRL5*9FI4i0Hc|W0r_@D%7Okw}&q^Lomlwyi)>H38lD8*Tl|Xp{I3ayJTiD9L13KBG|wu-pNH# z<*;A04Axa_Jf=DIeohP0@vnoUCZzOI{}0jLeD2ir8YO<+y830J?3!vf_QrBIsvUkv zD10&%?8-0i5a`^viwNwCC8pE@9v(B-AOLGqF6|xxWAM#0_w_5otg!)8JZQ9eS1;mz zyj*y?on0mMIpO?zqr13J6P)pYwa#sXl`<3_5fRHP;WNys_Tq12&|NwI0%D$0l4sr< z&7)sgnM`L28eIm2D4fUH-hZ3}Jt|p#rT@~>aASV#2&3YaD=$h+yXVRWjb1#4oPFns zh5Xa*eRr^*PV0#!2QN78k-Lz2_x{eB8qClC=zV1sxV*glb;$4x&->1iDLhukm492_ zFYoRJ64xo?E&*MSc+i16ZHw%C^D>=_W-(uq4&V$(ClKnI>jmlE4odiCc1)Uq){q=s z<{6et@LPh;1zN?VoV)FuFb(<7FeFtP<}dfF0=12oi|Xk~Dh}dMVzXq#`H+FxyuVfH z(%eLwK%EB1sZ*ya+|t25)5q^ENANhX6Zh~=1 zFGoN*hm2wE#@bA0V3Oykth;oS14QKasEQ7hIL*+f^}cvRP;>>vg^xely7tPx?wWkx z5UV1PX$&(Pj>p`FP1Azet39?hJ0&&pO>zc5@X;$?P{j;_9c^@iIp`0~klUL9NNV1_OP5C%|k$1(Zm{e7f?L;b(t-(z} zSb?hPa-C+jf{~Gt@6ro0sWb1)Z5!ZJ-DXavm{C2#vCRP~L~OvE0;bRIPUz+0j)@*m zw3JacwOJhFH}a_({HHZNAPr?*3ThV59~gvYyWgIEyb}b1unZb>Z~MRe+;^vs?caX| zWM@cXj}!Z8MPsG?o>9yAR=rZkk*FtJm<`a-U2_+)*(ypTvJOUIJsA3|ydQ zHu0@|Wi^wak-hxEhspID^4l`!t16j8 zj(xjSzaTfOAOHq>>Emk6LbEIKDEvFis7)ez=M zL5FPAKEfQKn3(4~kgve#rNfOeI;C{v)^&HO=>8uz943@%YUb z$&RW`)ygSpIs(r;bc2p5pU^nnr2tk7nj}_d|f$Lb0R5XWF7zuj7Vl`bSJ%T^(0-V$=nL6;D5+i!$!|c;HuXHa-~5 zcf2^~<~G|vLm*hXmWQztvE4&q=|&IVN(ENDQUuexqRA3tq&;ckmBY!SW9E#dwjDpt z-YT~DBA^BKur6B0GfIXZBKh9!I3yLf89PNwwb)!{kbvAiyD1Bi#8u3a?M6Q-W1y1B z7;C1U@tfQ&wLFX494@L&fB$ov(i?J8esUfcKPr0l0l9dNz#Z?S_VB)lBJ6$~Bgnro%73IRE%4`qrJ4VkRw&ZVIuv zm>FD`cm0a8hq_{RGO-k@HYkHSvd!B+9;kkJ5S%@;W#fZxMmHjiarXqR`mSd$xi%Hg z$XYd>XU#gjf{|_4gs|o#SGU@>WohJZ+ujF^w(ieOGh9&wa6bj9?%}%S3A(1-NMZLY zJ!hQ81*r^C9tkKkO$l_Ei(b(fU=dX4d6|s;GxcG^Z^~#GMc%p&Wutqld%6&YdRhk3 z8Reu$hk}G0j-e@#Mf&R&I=Z(0N;%v93OgvxWXUUE?o)AZK-F%lwZ-J0^IAmd3_d(# zys2qhIy(bH|1paf5nz&z;uNzRxIcX-3JttWn24AMmG3g>eT}4A@Z2^6HbXjoGoS}C zXqrDhNz=50CqUT>nOwpx;`>ky!`PV>sLc!KBK{)&U8ayPzqvwKRUOc zJ-eD?(Ii_Fd`tlbS$dyV!z%tCsq~?asrmY972=x^e%fXj!-9u8HNTMF9(QaaO*>D= zV|gLZSaV88STDOl+Lm`^bSqh}U3pW-vyq>wSt`Ax%%#ceL)k?T`Zd25l&8E9bdu`< zjZ~4`D?&Iry#k^@3ueZ#yotRjh62P;Ak{kWF5)#zp(v0q$aOCURvqSLZadk04o+4L zbzuUu=2(fOC?XHeNi``Igk}!?ifv?q1KzpaM5i5-sQdXYh|43I$QbyCRcsKueudi5 z2z1E5GYN*}y0yk-0!YW9Nw-Jv63y@Xn!%$z+6VuN#aug0F5QAlAT9DtuFCWirh}y= zjGp&5n!2SyxyK1j#@ac))j&ttPi6u)rN?M_@HgBWM;pLdcB73g*>!D|n!4`O`Q2#s z(Cck4n}u2C9{+bwBAGHK`?bX}Bk^rHWv=0o2mX8C4z?yV>UQ8lrA znx0a|V3qN--cyl<9|wtN$PFGrOq!aLmG=lAKRta2#CxP^$fYjIMIH^Q@MB8bM7w8? zz0T}R;j>9$XVbnrnONw6&--_jqmV5e>eG&wiWBD~OB^Thc;tU7fv>G;U1W-6+*R0; zTv2scib%;%n!M_9n>r{wD-d~%NAD|}a*~$h!c3)wK3Uov%GHlYyF8xZ1y9u(8ge*? zfw>+Z(aeHDm5PAQ%4BBEB&DPnh$5eX>nrYTUbbm4@$c96n46_b?x;+vGSpQIfAIY! zVzo_RZL5)Kt^9b&&d!b~5h*=|Ewjg(=c~rL#&%?8+ zIZ>wMxS6fpS>v+l15wcI#a(QrQ?Ag@^QVTRn!mAR#;?K**+hO!V!bx*E! zWzU|b7XJ02h_)c@zUJO+E|k#lMbBNl>0!$Y zjE258Di)fr$^vdvf-2wLI(Yc$t(_ws{<88_i7>P|bA6u#QD*EerRrrxRFW%K_gIZa zUEUE_Y9Z`AvS!i(m?=Rzbiaecyjp;Kf-QTF`Amdy7ewf@ZM|9GO^3xP#BZ^-^ZW5v z9O^!h{o1GAGlV=JUpAQ9p-bLdEK+`SV&r+@A(|Rp2K)(|3DytRRS&Sx)I*wJUZO&_ z4E!0h5?L*}M_;=n0b8}H*{7JB8&&mf+?;S#+?hWSmc-qcGKgpnNMoMI`3I^Yjf(?A zQP`!g1yYF}+3BoR6^fjm`(jm%`*16~g(LXi?Km>m{J3hz*U3rxF`hM}IL(~n=9;gJ z?omT_EF@gE3`EgfReq@N^a`FCn_Gdcef=Sh8OofnNVK-5yeNu*x}8uOJlt^ ze3YRw4x^ZIQbv&-tpBdmomcwoU4F~kI4w*&9^K`bmYv=;{{;?z86}J7O;uJnGfu>t zKWeK5uy|{uk93#k@4KIC<(uW5{WQ76uTn~NU!fWOTBXRpXUvXhoZ&67T}QD+z+#Iy zu?2%k1j~nbj{gLH8Hm*y&zx_4g^pf`QZ&S_O$nRuU`J2Vj> zclj$il(l?I2}vp$8tH!?>dBPUY4V6jg61bQmjIM9a`nT_nZ@_%x%4_)6Q|Zi2$~-a zchUq~@d8e-``<#Lg6wAvwjL<@I!JHzML{c#*u(Fqo~r!$4lI50_;$AD$!ZGN6(_Ud zp&$ukDXYjpRw!iTkcHeDSQ$WTzBJGLp!e?9>PRll)JiKmyB5+J)rYz!6D4QEqeGnq zb}rd+Hj=<$U{D}BJXmew*u4{U2$jOkw8(c%) zTKU$>HBT~*7q`KY7;-IN`>5?8kF|oS&{861c=xU+V`n1ugf?tFeX>7~n#(83axE+^ zX_~KoUYYM>r6WK}=ksW|v0Uw(9Pf*HsdJ-`HTbDi2uJ)#y%PXPb3xg|oKvI{aN{CG zGyIwE2i&WXsTVXdwc6983|7veeJ>wvq8(4{%Cj6JAZ0E=D^a3VhaS4Tc9WE|40Ok` z>O*1N9i)+MbT1dflh;O(gTU~w@xXB-{3dfpRp=ofU>O;TD*SU+_Err?m_2q?s&~jj zdMx7+dD75-CA=gy_IAsHm8w9S8YKcQ7F?PyuaMM+Y~#|=VV)VjU{zA402^0o$|$)4 z3M}me86DMil=Jnua_g4Fc&MiGLcVhMJHPHcOduNIht-^^$N+e0cPBRA=xbs$Clgm! zVYHr>C>N<_?g7_}epWiPN4QJ>;EXlvoPe#Mv!Z+(((Q35#2xn$ z;XmPAdkSjlH-BV68yd=MrFG`|hR^0V=O?vya$nQ=WOsAb0(j#I|C4Kw@n_2S@8MJ& z^|sJEuGWnRoqAu_(gMqzOAp_2C_TS=tH*UqMik^urd_Z(bMK3T1trU>M8Mb2pP#Yb z+rg>5Xj>h2q#h;c+q+Mj@*bkeH$@pqJMC;YW;FZ!%k+cof9JgcUZj*PeYz?4pw}EH z_!m~;+t;mY2)>zTPL@v(%jBd5HggS~&8|ld6m^h-406UwhyP?7Jb1>F7;tC5;fK8h zqjybQTXhd(*6_o1e{UGSOMlF6Q|3gS$J71E7F-*v1?Fhg&KNp*}}z-p|7ef3WQ z@;b*Qtzu_Bc%i^!CSmwD$F1P(YXx)b-fI;`5%)rof8DxwOl#E1b?Yu&otx}VBy^@R znDulf>wDSTSO0eQJfQ$D!mgoTh?abQJma(+w@UarXP(rUUj}0ku6xz8yVqZOPF*&A zLS1xGA)ondxQ*}BhM(W?U;p`SF#6|}{MRq8TgNZ4Mo0YbUtDMQ;dBWhdJr#=AUK&3 zzGvOyFW=^>!cS+_^+>Q*Roxpo|MQz(OJgfF=Vt(PB^WmQ>u1WNLq2IkvmJT+0N34g z{PDxs(e=pBH~8l_{QT$N0$Xo9`LAF2`R^}I|9e;d+kd)hvo;0$Z(jqiYjADA@;|=% zcimba`aiz9F6^gW>Hqlh|HtL~uN{y7r;;{(oE&r+?Oq>vXt5GHd+jw%1WT$-u+P5I*;@#|muC;MQ?~x)T-{d0<3zsAIlZ zu6Pl9@He>hy%F=`(t{FBv4Q1o|JvWST>flVIrbU0l7bG@BJrb&6~5%yJ9Fc@2g(3g zuij^6=ViU{=qp-w8i}QGyCKktwhYvWb7l;|qa_-g+s;GW>n;sD>SlB6^!|7==HK=v zx=dmgauOf41{U$h@NIFdeorOT7t}ZvKinay%YXHXO}#Nr3d1Qhp%#T-Sg@H67(=;YtPDDfAew?677w(poRm$m8?-91?Yt5nd%>Ko1{fzXPpkJH3Df0Ng z7w<6DqdfiRjiY*GOd9>GOCS3|km&Xbx?X58ZO-)$qHx5XhR{=Pcd@#oTR%;PkPb~# zLj6ZzZd`i00xME0i*xrAea9_SxoFansX3|b3gDsI z@3Z7xJ6!)Tw4W48jc}nW|G%{l`Kdz0vkIWc?3YSD-s{6R@7}rd&OwU)*6rJTmegOA z(-upJ!4;m>bi|){5__tC)(Ee=zC^Dc1f@*sky5S_&mo!d-SxZIpB;y(BPouQh?kB7 z2memcDInW@pCUc-LzaxT&hEYG;Gl|jZoDxM;|A@;jXk{AzI<{1>o59V}{ zeD?2Kx6_6gcKsCxDg@@Pfds+?Ml7{PE9&kH@u( zX4L3@y|r^M<6(v)5{K*@@t?m2%z5%|eop6Cei>j{s_Fm(4mN^pVu9*}sOSvXq zGij_0dED$rBd~s*V_2$YmI4GFKTE`B;CeX@y&_z?CFcRCozTj}yKvs9q3@6&l$&1)pmBgHz;*b;srp)D_5A&_w7TlR z9rcn$(#t=hFMH>@jCfStV<{P7RrOQnT@&>b1DHisx}E)Om*3rE$b=6|`EzbVLk8vN zSJj_B<%J4kfaY@upwtNw2Tjue-KGZ4dAskOVjDMjF{ax%SSe7qNh+UGv{vSPdhUjG zg8%d{$Fb}R2>VZ@6djeY`y)~c{xJoiKMU@lkJ`&P$$s{*w#!7P3egOQd>{OydZa-( zZiIwz&DVL1I0=eUmoI~xqaHpmh^7EIUo|Fc#NWs~Y$_WB8_HxiX_j+e&9&`5sSLr( z!Vjf;SJCWxnyX>BwA!kfqj}`>Y!`ZPNHF_1#6FAG~83 zz2=P!e;e-GxWTl6dO0*_tms3x^Is#B^>3mD9j7CI*C|RAbqH5Y=e^hRp3}=DxRymu zAo$e#UC>NcdNCJe(1|*VmNem)u6uCy=3CE+$6RCahkWRt6N_pjXV3$r2vCG~InbT$ z-1(TD569ApUYXVtS1!G_10$iT7&ovPk`>|~?PWUMfX?JK{SPJbwiG&3VAb|JlTf@@ zz`jbci}+GTfL&$ANEy!FneQQ-Sdif&eDJH6CASl?YR!E6*LV!1?vgf6;~P!X|Yd*e*TK>V`*q$j^TL z?>-tcAe z-6Q34ABG^PBR~sqigN?kN43&F>IKouJU~5W3h#v0C!6y<)iI*a^2zNmX5jm$Zr#lB8 zZyV??P(7vMn0~GrV1aK|&8{G9Y<$9O!zq!7(>5w310gU`ZeaXt95!%vn?Y#~5DN(U z4(Wd7s44Fb7_*Ws3%2BfQ$qyC;XHo)67Y7Zhb;Lo4XR>*+9jP|_%0R7EBScw419kl zdp)jtM+rJr|54~N6`5<+O@Gbf-y$exZlf^s*sSqHccE^gY*Z`7w2gvVmjkxeb8ZQHD%2p2oL|M>pKjGCX7llnV&AZME|`CrQL z@kas=ks;ygTRO6aY?nSTZKR>$d{|frJGhi0rx~D^FF7>gUext${rku9>mAz*qh5SZ z#yT^7|MDPX&$H{{{yy!69;+p}7G3G^(<6)mZV`PVXU03Ha?jy@3LMwv7k%x9J}`mZ z)X4JWs;EAbNDM4Y2peC`wL&UTFbI%C+KC%dUCSq1LFu#wvCBuT`Y(2+_t$AYfU0f+ z(i};E##2o~LeLdZdfym<)oumg)+ z*m+qE^LVKcmb=yi)$Fj0B#_dF4-Z8TTZ4<5c zW-PU&sM^hi4;Ws-X&c0@&7ra)!hrWSqR?IK@06GG06f9yAeIM~q{6NcI9z$1AC zp@+S!{<6y|dI25R4{nnYedUi&S?QJKkme-QCU|bVBZcUhyM-JM2`{;UJ-U|zj8P8d zR5tjuumxZ~e$X65dL-UGhT0iB-&t&zQjskA)k#^?p}s~);hoEmZ7 z(DgA+ltcg+9M?wr7?MSb!h6OQoeP(+K}sbyA_|w za=v&f7_rK!f8@j@V^bjsP6?}mitx1don0i()g1yd2r-GOX=&lRc)D~P?*NJCpwHw8 z;zSOUVbPD7XfZE7+xDA;XPg~?bRdpuaZWS?E!iU{XX{06ph%iv>sACWgAZe5x7jZ= zneM;M!DTZPOpZFLq5tyA!QP2#G&UsU2*x}Yf%*G>>pURlMW9#t>V6VS(6$1XrJ&|p zPOBF>gF%@mhGzI?*~jjltW_;7;><;>B?vx_g$bgB;{+MxSeCBtj(4~0E!i>B7Q`aH zg-P&5B?~>o39stM3!W4Dj{Bldp*dhm-%4UQ!|wx-iDgO)Www3?X9**-xIBh!xMWj9Ff{3~L^~mA2h5HFSS0 zs!v);;?It#ls1FA7p+zb3iI>VC=+(0+2Tc}!Tu&qi-kt>^T}v@lN%CcW{2YgMHIo- z*A~hR)nN{rDr99kb@K{XunllEMmj3vwcm*xLN(7HX3>cdBA0*TbQ;7xUcAwnK{^h& z+AzesJUT2H<4hS%hSgN8Fcnl}UU&)ns1cPqjB&ZCdm(L(uc5ZciLRu^R{CpBjKS;? znc$L9uFDVIhdb4A-n?{9!y_fMWe+MPkH|JD1-+|3#yVVdA~Z%Dlk~H<=<%Cshq0mjFX~vi=uws6^__Tnwz1vGN{woxKaE}+c8NTCdA#L<>if& z19gE%7!QgcP1l`=-E-&%xpdt^j?O*YA?l^>v7vd(tt=`T7ECGPoDbc453xh}vz7j6 zBX^Sr-?D}NVYq1E23+Q|_{7#)&WYs9R_-Qu_$7wL%-XO>67k54LGN(WMcNo)clb*X zZy=xc`vaGcZdqX#nQh~4N*JpzrM5<_ax3x7G}YI;i<dDGKmQp4A*}7fehe{lzDI-GrtIIbL z&zRTe#3)u24Z-adoO^A+~Wr3AyjmOMFrrVapYj1t}&5^LPek&&rz~y_2WI; z>Nd&x`xjs@l0YYtnoi^v`kq!tz=l-x2ua}RY2jUI3z6qgdkB#=x9R6+(cjbNO1@+> z>_6c0*B`0wKK=7qS9-<0W=|bAq2t}}e#U)S4LbhD$`;d+UJuoaYA?QP!Oj(ztJ;$6 z_AF217VZ8yW^29Wt0#9ehH}6 zy})|4G6`RW2xrNrLJ<=O2jI;pR2#+fW+=8!p0o%YXn8=E*E^4;) zEbVXHF_F3%W&E9cfyy0)q4;gv2X5_@bOuLO*Rb}nWzKxgLJ-Xhy&B{Iw50W30(aEs z#npj);@+k6QfbQV+ryUL^}$Eg6Uc|OZhrdPR+Y%D+qN{q6-0^B{j{`%2Qd@oIYtW+ zjJzf>eqsC)NJkfTS#3uNBC-^dRASt!0J+h0p$(s$W=Q&Xid-*M-aUflPv#64P(i*z!FqrSvZ+KN z_sJ~j)?Y~kQ9somabE$VN%4@^iaSj%0dyVhD9jiYFiX|Ui=hgAu7UV~fOyIvGUN!} zzbjJ@|NF#!!Y(N~D;Eo_W(<5Q@(c#5Tax<}m5B)&x#Rd)#y`B}lhsqwM|vZ`VIymX zxG@fLtL?h>rrJip;?tF0_h0oWixthFswzzs)3szd^a3fkR8O6x!ufwe#Z3-pkbmRU z&Uy$3I%Xa2>=9sD)#gYy>nbUGaV!w|8yjq#7juz7SZk*K19RqYxj*M<{5#PKKYGk7 zskf8!dcJ;Vw0`33H~Db}**{8&BpZwYvak8epL;C^w=FzvP;o6Np$WRX9aJ>)+;1P# zx!+l4+qz-H1`|-U=re(Qj^3v0@tN(pQM0NXAxKN~y}SI}P*b-gE9zFpe7mVCO&RH0 z^MGq*@d`m%FfwMq)tuM+HyeY`)6;N%6G@WSgxS&kxngLC8$skA1v{UI5wv+VShPda zGcSGoE+@PK8GMz*N^>XWzb7*!`T=8TTQ=Usn!cZ!pbWsY7vg{GDm zi;J02LURh7`RwV`2^@;35}b43Qy{LBaikbVN2=Y6wE9}>tPm5>lGJtOQtE=z2wxbTm=N_*pSeFBG(;%8Ml_#AkaW^-vpz-ahij zxKDcQpJ>`e8F2V=3wPwQ%}`xH!wLb6Rb|4A5p>*8zBQv_}q#6Z_ki z*)aM}#`3_82eZ(rxP6!8DmzvqKaC9@=EX6XRu?g#x^IUy^R07Cnv?eo=mil*$py-&NAg%( zMp!OtrV*cd(Ub2CsZ4NJ@I@V<}Udl*1v zN7~H+6tu~0&mP)Ob~25XfaefHEFFD<-z{gkVT&XI7|CtVW8uZ8*DT>$I%#lsVrH;D z!0x~YxDe1rRc@tcd$#7iTYA@r9yu4A1g%aOlzIR~m80x&PZn~B(RqJVSjcUqf0QrB zgc7>TZ|PIX3QhC#2E&5Y&*xGXA4cvpT!nM6M)u;di%~-XOrp`7{6f|KveShpS&m6t z+pMl(g^}WI4E2+)#UAF-QS?raa;J)8qd6v8x|OFu6e?_N>?&FGY2!LZ48aDWwQa$i zs{H#-@PNR}*S()R`YU1`XsXmO1(F<-&Gi-h%WU{G}Q^xAzz_^ zKubUNX<>%M9Hnb7^~QY5qNxluoqfKYhsv0`;L>VVcHIReb2z+QhLl|e>~kn5k_ix? z@3~E7$?3;O-6%I|5U_1g+WpAx;LuGECl=F)P~pTI3k^9+cnRCjug{g4g0%e{$w*^g z%DjkedCY7MK@2c+;NdC(?~g*VR$*^l!I=U)e41;$hu5z0h! z!MG2=(%l14cABxZ60a+;by;eKj5kb>Ltiq`12tNBnT%Qwo z1+tC=A2TseTGf2(8zc!{EDSb!k4uk9CbX3tb^3mNd#(gDiUB0-QpKYJYJy`Rx&?7* z@)KW292pPM%}%uEUk=t`*TSep5$pOZWV|U%f3A1g3S=%-dro*W3+kOS85K8dSf6&& zPS=9c(){e2J~5zUftAO7hSewV%ay)%ExN#N$^UnzGjX6iF;dgEf%Wa>udTG-Lxiv_ zkIR-6IU!DRBXm!7eUYWq$TS!hSDaeCQKPy`Hjh}aYiVh*6j`<;^DUNW)1++7lV9;A z%xAupgnUoBJ%9FRya`2Dph*0ew_k?M1faoPBKkx)VpC*3=Ok zq>UX@6)iQvpP=p{pq^(N8+IDVKR$|itg=NJ&1m6e1Pg~WetvsI8(2hU=0#(aq%G>u zm(Xt9iEd5Re{V-@cN;=?$aR-hAvZHoL7kg>0Er6Z7Z@3N15b+om4BR)!z?O73i8S3j z4dbRbdHgn#VOXZtFme)(5RiK{E#{U*i-GU49M+Dop(R z_A*5f|E!2JPEyE*;5}pH1dg>EOswG8k`CBYFE4!kx{Ok&dxyJP&1r4SL7Y-ZQaBXE zcX^P(MxSWJaGpy$ER-T36Wa3(_}6m5NWncZiqAMzGB80c+~5VeSSG~G0VBF^Ma>#| z8ez}m#A6kl-Yp|~@X{k(R<(1GJfIrg9y>G58NAQ`_13}UtoILrbGoyxCs^YV|#U5?>TAu-0q&&tu;G?FahZ;t5b7ziA z-pHBZ5G2Ltxr?owT;d+6iV)J!RmBn@Q6wmq;5fg^@B1CTHXFAxNG#1q1lL96z5eDR z7s$4}H&i{_@g8D%&3@EIiF$|xISw%qaFFQV2`hcN@eo37%4U~rK|ang?UnSP@|=|F z??LSr<<`?YD#^I<`;h9i!+rM4gVONHBZ_u-uct%GIZ7aoG2-M5-MP`Hr}FZQy`k4c z{Xed?oY252Ctu$T1?dGic?I3R9ZS|5eDp%-OJUw386oJH#5aCDNWoPSFjLkP21K(=6S)KT>lBy!1VW>6jqMXCqwKmqZxAc}i;&(?HpBz@*J zWG9KDL9a@8>gs|tAjhdjMXX46Lc=P`_Z~K+myS^nSvG^OQo+78_OfjM2c?-VNLSd_;RwIo! zU{-j=v{hp=d>O8$2yId;tqZqs?!~Mon`BL>XAM1fE1ZHXf<89mOO(f;#&QR=3{mc# z$KSe;j3K-@scqHw%!!fLWE=(TvS zeRA=DIN-tKyt?9Wuui}6Yt*(x%U6Ykre{}0klzwH@(a4#SFP!qP<=0HoRMaig#Jm@ zZ#0Sxvj+O!>Y~q=$jR=4WS6{jl56OoTy$Z#kJ_MgNVc2i zto^FLAF<80X!>*XToIxvAm& z<{EYrpXB*WRRZP=Q=jza@^h(SAI>YV9ewW5n`T1!@_0+2;cD3S1!@%pg*pj`9s0%4v!9(B;w+4;)l75A+Dgfzi zbmA4+_2lP#`mveu)HB`L(pPNXW@ehuL@@3zkH1cIF4$U>C*kODep8aKc-K&mV&v#M|-)ZZ{n=gZKJz*D0 zruXXH5;M;+jm>m)0?YoNLCi;`exWd9#}T>F08y&5yxC{W<-x~&uADNc;^Be6*M?r8 zIo6Q5yU3|2#vJt%1SUZUI$gO`xsUhybK^JFG*hLCsO8x#BhRQz3A=uM4!TNAQzDn# zq9)ACO3XW0-p&VlAJwF0h`+fHZycgw234nVw7wh4Jj%*E6K%O2vA3xJ7skEsy3ehk z_F1^*nZVfLG9f?>kNMO_dDM|UzB>HPT^|NM@RrM__^|LlA{C6>N&BkP$BrV=5QWr< zcf_h!d3#)%G}7uW`ZMZ#3&2r&bjlV8n72rO(;58l*=^!v6pvDzBQbd2aSzPKbwokY zXhd_byNs=HP$Sdzp2*_2UsHfmLE98UscB{>PB+o!Wfd}l9zFH5C9pVvV5^1(aT$e) z@ik8>**stpyUoXuq)+9hs;Bkr0Q?0A_V~E}7>eyo{fi_4Lxp)XFp^7$Xasy1>e|34 zp|V(*drdqQbp7$(NBj-S^R`jt8f4(!HWGEjn6y5j@M=qjswx7%Tfk3X{xUCU-pM=K zu|mV8bzBvk`79%po~nt*M2CT&s!X~=4_rIza>n|{aXtj(W<#Pfr%{U7T!-r8PYiN?wxvQ0nRU&9iK(S>P8<6S_K^{Mng7wlP9OUzASFJ6YYiL#5@c`wU! z&Qof#b#t!8W?o8w)qkjf;gc33+?js`xL)I>V@a~d_e^n3oYDn$W7q5|9ru@{3A=NB z_v!oCslS;sDi5g45|=&A3V}WyI`rJWy>WR61kJ9qei0msZRYT*Xu9iD!K8gCDLEtH z<&CW6WiVT`R|@rR_e1gmGncN%M(?JMjTtE!25bsM?F2s^KKD<%FK5;jK5*zAL?aC*mKV^m6>j)4_XB|mf| zvcpUe_0pW^AlFo{21Omomqq2U(|F(J5j!|o7LUj#l$KgsUsVF=VEX2kIDICL#W5Uw zD0g$sg>2yiCs{AzVLRHcbD4qr3gqP5-J^&mnWSt$5#pJPbprdXu800BGfMjBtWgo> z=q)_D9?Xf(}Hq~ z*Uf`W6)yTO>aGvqS`06}dM!>Ur1Apd8%aS4qe_i;m?A}c7_7!4?fJrwn~FFe$<%}- z@SHHnJ~Qzh*gz=Hj6m4X-VlsO#)gub%&5I@Zr9GN` z;@?g|96>ooZ?qsxZ~aK$P%5PBu@ZkE*JxS+_8t2}Lqtzn_PCa9IxE8{;aX6RmsQ3m z8kxTdL953aNRWc#mY49A59M3ZNKrYK=NMroOjl?(w#vWGXx?p4T_nXYd#eggla>N= zp)$j55KqX2AD2};EaUy+s`w+R$Bq(NRH_&PFi+G5>!5wqb|2msuk~l+m<|$tF^q3! zv0t3^KtHRRz4Ry!^H)Y$-wfrf3ZKB6G5u}3ON&qWv7t{5rL;{k@_n!TZR;f5;$|U} z%f3n#l?rKeY^2nNJgisMEp}Fh*&EM0A(*6+l92p*5^RDpJ#E`=-^5!VsFiB7%*xyh zsb4=tT;^QWPDXcjQH_l#sp=MnEaN53KV68I>6)XTVaXkysV_AUr_|hg0_j(Z?&^9^ z$NZN%@}Vc+BaHwe`gqKR8L5;0QOB!p-ftTFOooO?phnH!^Wt}6Rz+P|RLehUK>`$H zL{=4UZ`vaeNCayI_DB>e!;W^mFOI~;wO_DBN$KCD(zBOabQ@Ky4U_`y6t>M zKw-I%pMi48bTV8$Sv#==$NLNm@heB&dLi(LU%>GInvA2~hVV6SN%1fn`2F%oQ+(6s zbHC0a3yyvo?@Nkm{d2C?&dyOjQ`$_P*ozm`j#H8oblsvc5vtPG#?*_fvxnc2>Hs`$O!%=*4gFyH!xHg4U_ zg}tdJD${v>)M7FJJtLf%Y4@DC1Vs&-~$-#?FsE+X)Tkx%5__jV%uKj8=_<8A4g7ePo~G#Sh& zz3}736FyLMLy=~EfVyDl$LIK9`dqO0Uz{2jZ1B2v+U+S~V|fr6!OLUx?c*i6@0W}+ zmWWtP+=q+#H3>t+AnF@HIH1EHds8+P>VEz8{KPHW@%?|fH;}-tN@|iy z>AJw;{-dFGrmYOm{iOSf_)gBp0gY}L<&U-{2E#){fBNHSP5GhR(HU5;92gY+52(Bx<7>LePjX;%OpcgN%C)FT`eKgYAG~yKoZ0o z7I%^7gqBY;dVS9 zQp>7-ng5^O`I)M%>ELqNzr0po8$PDhVBAx)O7&_<5O)scHy*#j=Z{o{v7{sW+M4P` zEWI->%MbKyuW~~L88`SLGWt_~o#bg1qSTdOX0j+?eps|WSg1>DwW(f8O3HdT-&0t} z`9>T&PppC8Xy~agVM>)06=(5TC0pBU9gqIr`zjF2Ee`j~QF>lwCQYh>X|Xf+)xO^@ z>0e8oHKPtNppop%F;~!wA+3Frq3jqE2pSXWN{yy^+@5qfJ2{Q4SWON0xcCTl=iPaC zA#HVJXjWj^oBEgHRC0V6qSUy9Lay3z{AqF+0 zO%mnM?gA$UpD+yh(%Da?@gc|OrjR4Mpu&bHiF>O z7HwZtR3zOZ&N`n#AM#LS@yE%gE$!$n8u|l-M{jD1h=@2Fj&~&}kDV~tDExZo^yYh= zE-Zp8v?m*Sb_73uF#PHM()&{wA=tBBJERV-SZ5BO>b^^3OSuyB7F)KQkiFGA*EQAo zP|w=l8Tp*N4(V3DKtNw%34{;2=Verf9*r@ivzs(auQd#4lL#PSRYYgoKK)8+ebOCF z52se>b}|@7e(W2UiUnPKG5aR75d^&*7qq_ZA*1wpBud~Rhi z;RovQqq(`gpx9YDSWCXVwQ*~Lx@3KXdBXgHLvxO4+iXK+)YHBUKi7`vJ3-e$+2=oG z0*L7xa=xYQP^h^WFE&diFiSkDUAL~I>y<<0De`OGmU5r$c+kWcaOU{+7wr5_)x2IQ zoxnP)9%p~dlE~xbq-8$stb~!y$?{5nr<&+@_pSr@X{ls(dtg#-pt_S?OO3nuTe#wq z4h|V+H#1oikHL{6Oj2t3+EG2l&4mtk*r}7R=9^M;gLl?1ypig#>-ChU8bFW8O@=ZY&u&fprYwDRIzggM^2p#M!y7}dncFQrQOpES-1gR`I;Wy)>e!lWn z>SeUprm*yT7~v)l57#7(A1D@`WU4XUkaFjOi=X3H9*Q61)iyb$)pO3@z}8;~YU91u z_f=_!3QE=JdXW`OgtM*xPkZnE)>PWHfjaiaU_%8IhCx6;VCYI!5h+rnBy>=!^xg?r zL6M@;yC^jQLg+1^(v&JC^Z<(VCJ+b^%2}Ivzw2D@cm9O)`HM3MA=&%c&$HIO?owgW z*=psxwwCMIy>FHIA6v&l@XthC_hw_MU1I8bh#1xgK74?34%DkSPiq!ICavSkemgOu*fK+=P9?8l*_#RvQS`yS zeCLlqwOMeJeG=mIYY0_e$B|a^kh6j%<~{plURn*CkSciah%QIPbdLPPP;3*|xDTj9 zYGYpI*LY=A;v+Xbi=qIZiN_jHrpe7Bj1wLR8x?Syi>5pN{yuAQnU^Hi=J)U463+Rc z|LpK;QgWTsCWVpD*fjB=Wnn*Mg85_DrJ#&VjgNsgBh|TV(UFm9ug+@iZd;I6WPo9( zWe5BkYqh+4(=dL~PcV%dh-w%~b91d9h#YGG z8_*l>ezVek$q)_#g95va`j7`Y=G0rO3KkApHrV@N`=tk4EYCtvdVk_wg7;eafK}; zzQ4Pa4kko}yQBjnzgZo+#4C$}v*Kyr5m5T*eFSIV9J|sLHG36p}K* z;`eFk&`AgC@@s*sSFY5Z8m!rU>_40@NWv8S^aet-xT;HdczAEObr?#(B>zFGLtO)t zDTX}>SMV;!H8TvF;KWM~;g9zPpm6&2@ZS1gUO9AV9F*^HMhk<>e zeY)F}!tE&e0@(a)!4+a-8tt&k=9u2;?cAnla8_e)#T=%Dcj}k~e0=^qfNP82s6Yi@ zMR^LQ&3FM}%ZmUft*xP1Uy~*sN^MA<89*VkH`FI6zhe@$dkA131RMcU*nQUN>WzRiK0b(rUPPLiYSdm#H zs~VTnAB=1goc!CNQh(vrW*tbCI?sU?J4V@od`_YIPG&Q@OMNCIVJVMd(~2G~ogr>@ zu0-R64C0bMRJ?#&=|ffa4Jqz44FMwp$sn9kT6d9>S=2R++X0uQrZgqFSEm-XF4{so zAXt=$*CADmc2r>G-IKn$U{x!Ad2zLaoi8G=V8+{VFryeos3(sx9QkuA8~E=1MsW_& z_2!jX)p@FlvmyHLcny=dLt29xXLg$Ts&A;r!=d%xwe&ZLrXJOP z8$#)=kpZ@O`uPvua*Mf5J;*$p$H5K7B{1Q{uek13xZ}F!Z+yJ-%9r81rL@v_25zn! z2lg3?`^An$F>rAJ#B)9_$A+ zr!~_%huUp&Bpy8os0@pX1{Yy!%|N&kK6r>spu{ z4{`iyF=o?gqtY76&lUd5D<0ILh!HpP#2j(_)2Ex6XTPT>jBP|Jtul64`X$oxP6N=F z36hftC4|#Z6A*cCUd(z(@z$+!w~ghR*Uej-v*_mF3ca{iOReqARS~c6`$Qdky3=Pf zLPlq2aT%&iv!9OyVSBcz-W7;0&{O0c8vYtRql3-4axbr>U_LycImvOPSlxXAH*;U| zcTSOV=^%U1S&q&V3>D=S1M~D)c(`pgL-c&E)bnVg)ly_WvZ9%F@b<$w))i;nf%Iq> zTx>g;eB{vOfzmGD#ek{kl6RtyM*a53l7e56jbh(>SHd(AYu7I{Q0lmws|#hSKMhkk zUi;+Dn+GU78dbAhO+LlC^wlh0WXS;9+An0gGn$8T2{lnYHOy@Lbw$8Q<=*XJ~F(R?6r!Ws}_ zV=uNQiYm}cUl$>7!$>(B${9ve7%{7hA2S7NM@Fn9r&*t!7({rYS^X)mn(fJX{yb-^ z=9b1bQ&b2J{8yMp@*oC)2UU=^vo(u1AOMrZ24F0#Mr{?=11-G>r6SY!nv~(qk&An) z%!4EM3I~Vv#I>>KWw&2^Ar-yCoaNQ(N|lq0S@WEzXiUm!2z4g3g)+Os@!yl1XfQ5a zTy1_QVZm*FK-7MN6sz)ca&k7hZhg1^yiHydD+)KYyd zn8dz+|D~F{Qw*n5ofk1#IGx?xH`PGb1RK#i^}+EM;+3p-o*v4WIj@0X?;4r}M17#L zcYTfx=F6eXqHgaed%y+9ib=Q<;#Qi}xWr9>)en8DaNXASmI~@z5(%ivTAjfp=^Na( zDO4J8Oh{N%5u_^_5QMGTZ8nypX1ckzZ71g?cfP~K=p-Rox`O-D3qc?7)-p2o<5CFA z@eCb>rERI2aP{ifjVl4Ty^mS6lbNFWnnT2)`+h1n&!rnpjg1P-{+k-dj_q>xnNxh7 z@4%pwZnvcWiiwFVAb;Fa*Hi!%({U(vl#?vZ~5%nM&1Bbb9&a zORYA*jmVN(ogukzcp?%o+VxUxq$l~kYnTg%lUgg!aOiS zr?sBLnY3e2Z*tHpgVoZjH5l9owIg6hV{k2rvKH&<_OtHTYvO`oM@LNYcyDf?Qhk4` zW6ichaDSzbkA4-A7zJ4@wc)@lZl2%2@M|_n)UkDA!@Sj>914#+s=VMesWp+sj83GU zQ#IKp{^di9wM6gpB)++eX7dFX%}5op?F zlnxXq>hElqyfP|nZki;jrx<6{;ZWdAYTH6x2@C~laTb9%Of=NbmH^Tal=L1x0pB)e zS#*+QFn49Qt8Ov#o%x-Fr~*sF@j@R|JvYa~lY;LFKEZ>d2L$!FmCs+g;S$?`-?uN# zZ5Kl=mr8cBq>hgMwK~^NK6Ou7xf2YD<_7}M!R9{^!4D*ES}zm=_fjiIzZmPl%v(ld zN`+tvwZ%$!;S3u1Bv)F6uqjzIM{4YBHOL=SOO{HH$W)6fX`PuQ&*-~qc`7DOA0@Qt%dzEWUGIOcgCcY1*{<7b-Z-#`pQu~hRR@vF0Mf9WPv?U+=U(GWE z>8^nsIqMr6Gfz^VX<@cWI>sWD#nRlGM_qxd`sJptIQ?i*#y&r86x$94K1b}ZRqpIH zz}H(Z?=`?22t_3VkH;&7VN6`N7H)9={OU@=~*b|1Wd61mqvCSb6}!J9(; z{^r!`)G#U{Q>BvOo}%LSZa82mTIy-#jjlr;sK`h+UNP66OVX>q z#;nm^TV|7LT7Tcczf7J+pSwm}FDbd=O8P_LlGGy>GwrNVzcV3G zAn&&(#|a1ajU3rUBT=)29RK0LQd^w(F0Dk39PP9MM+PFd0y%JXZ{i$`jKEciz=qEB z;EUoP*AFn%YxzqU&Wq`kfH3Qko$UcAw%6uI@CRu0Q&3T=lEQ~ly$C1E?tXm?>v{C^ zvy8qZm(YK_zTYJKIyy^Jx9(-sD?vnYCL&6PHM;!Oy+BorxV-!tFs{tu-BI>hTi7do zetxrZ`>}P1PL-X2?2K`*_W_4ae#vm&|A^{$X~FN;Hg(gm}$%$);=trO&5gr%ijvF~5TmDp{dfPSC_sbQot z4LMQkPF)y$Yl4ANdB?R!a5402cC5hdKs8{CpaqVsX0fN7GV}FYJEEFy-t^ECaa23B z?!yap@63ZZjv#z#@I>nniutXCdN|=QJxdx_iciC-1QBcHcqLwB;`x>xYQDD^pG?Uo zKftIhL-+I31!glO*Q&a@I^+1Uwx-jkMk&=?>hU$Z$ICZp0#YreAr{U4V+F&uv@a)MIs+H6^ zQI+B5M~q7Wk(s+A_rggdr^j^m-L!0aTf5<$g@Xl}H_@6fLtE4t2?m*h67+r=u=cVS zVua%QEDN(?-=1b!q*$-$ieAfke?VHzK=;<<1sVZLgsuIj&}L9!3=PW8(()(9ELT?+ zpz4G89h;Uu=fHJP08!Qq95X6LIxTq5VKxfbEY;<|Qw|=n$fdOcX4J8n;@<LWwS7VSuyUX_D$U45wr0l&_vcFKXz)g@sIEgFzik*j5_vW}K zbYszm_TwI~-n1xDEtRQ%POj5vzLa$+Ahn*Hd&Mpb?cL7S3SOHU_x9(*?35Hdv?tp? zYzlDaQyQV3mh`nrF}$^qaBXh(ORXl3IG>#d<|y{m z*y7p`I%O^|t!bA3L-h|T!y4+otRi~7OhB!BWdY(6c6or?M8-_C++8-W7xZPCWUle& zA_20pkaWpMHZvl`-Wh8%*Gg#3fU>@{IHpIrbDH3Tj}vStkZ|z0z6eq=?TCiZlLVO6 zSwkTOkP(uR7I|=30E@r3{YJ=gf3$EI%eDf(X32zvH8LSrC`=`Jj&uP%KuGkVd{gY~ zO?4B4j7FO;tb5DJg<963A$OQwsGd_TF>z)M0__o}z>@?p>&ya}bed%rW(82|)_9V= z>Cx|&Cp~3uZ7OpP1r;mjGcrX$gLJ^@({W%6cM{(DQYqd2i6RjVC&r&`Vlk?7v z2#Z>p^7|+X=Ul_$3`f_?ofM}quXE0?EDfY{{G3UtoT*p^ic0Zq?#1(Gx|*oaS`$gCOyz((-BJS2d)Bg5Is1;Km4Rw)3Yn&Wna_E&^eqJX=O_?Ii(3TwMLcnv#GWRUyoS^ zt$S5phu>}&`PD1e zHw@^E3+dz~VvTdLkX4@n5wGS>0*iK@&C&}Kt?@Qr*6~qYf4_PJVx8a_S;ZKBd0$uz z@@vz%^dqcRdP^1{d1I3KDO=$@7I?%5$<#FW9KOm3`vxOFJ9Mlc2aYE)^k>FwX-S#G zgPk|7YQ%@0BP=~Qb_HIEfz2mj z0FX3A^L>O^q8Y-j)Q4~g{%DTj?;IveQdTxaVFtr2O&R^JvQX}OaN-|)mDOt8z6EnW zp6A{bCl2%RSmy40TG_n2Cdd)g27M^7_#1iQA#uz|F|8FI`-hgHuJY4qj8O^tK7w6WR>0 z{53KO5H@yp?m625R=e6@*bgY6e7iKQsCx6KaPE$O`r5*9Drp4Y4d&7x;Imk|v@c#m zM?K3kGTS=7ugn)(U^*6&Pv=r#MmoL*co)v#`3nZ^6-(853H04?RAJNV6LXAgH}-fi zZ=P{++1>my@fcXBqfgGK)PB>t77=3ACd64hXeYKh-PO#u{W}dcg28)Smav65!EA>J zaYq)2hERa5*_x82BWgc$WxHU*YJRxf2$G&jFfz!hBi0M!yFCBG`3|8296g_c_{wJH z*Rg1ZK&0&W+edzeGA+z9)vpTr^6tqLjGYhqDp}>jrR(c|G}~yxD*1Zp3Sx@!=^-P^ zf`gHS9u0xU1M3=Wa~5m_5u%ssU|X!UpRPVAv`JX^8l%Qzt(R?rlVk&icfvB*IXUk_ zKOCAc0SQ3D^`Pzk(PO4tY~?;gc^>#Y%b=HkbCl>=Y_Zb5`Gdy5Bt3(IVDj65#ayG_ z@R%#xq|9duTg@4yO0Y|9bQf+e&{$QL-oH0w`Yx;7m8sgZkW@2U8P!bb=VG1C=3>>! zgv1Mi>7j9_zsk9A1)D}G67B;Br2ml0M8ERmc{{SXo85vI3g9OPIBudEojmtgjc$(| zU&<>e*na*ZpJ8v+@{ig<9)psQ1)N@O-Wbp#2G2<@HeesY(N0h)T6(^<(Gp46t}L%&^3-ye(PU z>gDz}mCb%&>or?Xrl)|n@1RaGd+9hvml}#{Ph1+Rn~BU>c$?%z#q^CestV$4BjBAi zNAco-3U|>Ih%_CW0D751)fz8smCV+Y=FHB}Izf{6hk~kBLCVIP=)Sv6ozC5@PNkF0 z?Q%2-=m?qCqHIp}ia6a25X~}CKQymPIkr|v(_htG@##12iQ2Xm61m$$dfQ=221R+6GSw!Eo0+ zI6d)eiEXdL_EMvo+%>FY8ktw%LRscx>%or-yBfD|KYd0l_LzDz=`fKQ3H0kOBZq5KYrY@Xvlf&*fBJW8`(T2=JXK6o_+fdsn1BEIPWV> zrc=^Pk)T@Aln;Kr2-N@}2kE*>{n!fmnk>c2aE<);-kmK7PeA9Jd&5Z3pXKS7J+Iz> z{}|u~Is({2Rk|0qV`#Yzy7elAIk#b7*u$aVlC%5qfuq7}x-&Px1mfmSTwpwl9q@c) z6_*&1)2*uMF49e_wtkOOorhRXPmLXsKY{>ohBvGXOX7tIQ-O zzrJ{8{Z+%{AF^Bdcdgo(F7VCRT9Hy`|&5zqD$CkjCd* zw=#O6O_u{DLJz@g;*Jcg1M_SD;-+sx@(SLC*zh_9l4fk+4Svs1O>o?n9Ix#JEg@p7 zzhHLo;5rT*T47GXEPgFQAaQAMv8EC(bAG=a7%hL`uHJ|-xmM!QHqkm!f<1l`Emu8zcDNG2eonnYO0x5)(no*9s5Sv@d_qc&BgH5_`K(O zJn5FJcW2}2R@cZs2gXk<>%=hi`$lP)C&IiT4%<0DKvXdBC;QBf2wO2V>Ou-P02+nl z#-k@sYNy`*5!eSX=+N5bZJMLrr2d!Y=4Q%v3=FthYwVl{1;vKNc2v>DHVj(VB$KF6 z!onGC{}PI~M?LmqG#IweDhJp9`C)S)MJkG+zM;XU^H+Ap`tA-bFp%E&B@a(r4ln{U z`g-hZ%I!~s4^hGEKej*q8XGfvshT8a1kd$52XtvHjHQ08Lh?B7!L5~pliiX0sLpeP zgfV(9AKQ5dC>`pF#^p3#9CS!h*SRdc8NPGFqvh0zW5+a>eomxC!SXZ^akNyvs9R{6 z3tCa+gIY533I_grW|4c2sILPHMDA5C8l zs?LSzlJLutc_aSfYUY%c71B0!WHNd!m$G;v9Zu%>pSgrlVo@WNLklo6qzq(B$mJ$TM<8cF} zHZoDm9C-bz{70ZMnFv-nI4~VxHtp!>h<;@nreC_CP}{ei*Xh{5Nlhe)Xy zNx3PcOwi2N-I(fz;mG42G>7b1r!MD-|wFwBgW3$ruVQ9cMlXd*d_o|!Gd=D z#jL-fV=z+f6#eytSg=AI&v~C$zdg^2#-j}l6YG1zHs)3Y=z5O=JH@qJ)sqKC(oh0F zthoCwZK^qjf#mq!UzgZ$K)N#9wElR!v}=V$RR38nHLP#=Fbwl@3cn%-SV>|3QUv)5 z|5Lg?EUp-6iW=D)7ZY64KYaX1hhKf|;x|4HlI%EB5S{A4M6}kPya0Se{fK%_?GpRJ zfpZ2WZslr8GV?BjpgR^!f)F4kZYwp{zlSnYFsaH>IA;G0m86Ak=Ug;qq}(<}%l^hJ zsC6=;&NRme;71=ca#A^68?W3@pMLQ6PLbC)O>kNKobJ(^N7I0T;Dhz0)rYrb3i2ix zzH}4xe^A6*_Fcv?pbM8DvfL0W2#@AVz$rc)vjT6+C<)AF2rS-I1jRFUb-NvZMHH4y ztI_E4#aUzoUfL#=-54=YA{b79SP?9=w&g=>&yPi@5Rd@?uqmPktuj}Dp_T_7CF9;X zKj1DqgRl8>CgvQjOhUM)-DXE-y_6fl#xe&7A?%8m{3LB{zGbYJTPw4CXrXr`L_EYO zVAJ|pRh3uBk$qn)!0qBeFbCI(mRRc?2aTdfr$ry#A4y%?-rCZ}8yji)wHfwu*$e2F z-6s(8)USGGde{%fnvUpe+jwaE`BibM3x=a|7HG=-i&fOQ4pk`TP7*-Q!vm!tG6vAD zTY-@;q>PY#{M4_nQ`xj~Jc4Jk)?m({4>hWiXmjW71#%WtdVi-Pw-OrnIuzB z_8tY@re}6*$oi6$ThxXZ@;<(B^?@;J_KP>|%oV?D=pV1|z4bE_pZfqgk&aGNz_FJ_hO{YO;)C_s-x*Vw*3h-n)6f#J+S{`YF$6 zSk&hh`WG|1)}v#z!r$tZrKCJL1Ey&{i(AJB)^ zcCVRs@?_iN40(K;d+?d-Lx1V&*iN$IzOVq$1@snrm;7blmL8F;hwx;Ue0-B?VGomc|f zTJ4Oegx{~1wT-gQThF;CVoX0++T@(M7j{{4!im-8@L@P?l=O*~xgHB{xtc0%iBB?C zfSRLMUpM5GZR9I0VH(RV=GWAb6I>ik2h|L&-*|JF7n1KsQG91mZmj$h_LrW{1gbIO?>a z9FntZjW5m^gYXuOTWV@UP0B74BH_&81|e4SORM5zh}oG=rCTo|522pxeFpfC&rIB8 zqC^eyU-sS1%2o5pudl35b+kq~?BDl>8$jwu!F0?!S*aB-0O$PM$HNo54b%>9$6=|! zJ~-NeX3VTs%%$W=ltwp(SrBawA+zn6wh8AA;dU9k>trJCYnkJ&e<&j@k6Xs=>jS{I z4Cb7*JR}$4Art42CvJ?Cy07Oi4Lj?9+v`;<(P(T{=D!*6oG>QOmhXejRsrWZWU* zJ0XI?YIjid;oxN1Za=HH#&{Vy{GRR|ere6vCgt)@j$dQ*>9)Oit0}-zN}Hmpd!6jC zxqnHcaX4saGy6C*0a2Tx2(mEBsQCL=2ljo7$Q1FKl8fd|O1FS9fX~#AAAv#TdSF`^ zN=hSmM~x`3`hNKlwPR{#w%T`Aefq*{^XG5bO_W5l-vie%16A>JY;2X%)qbN&zklwA zt11Bkng)s;f82hdLVpvS>psA|aOyrQ$n(v8@BzCRMG!hWXC)DRsng#wlbs*2^1^5d z^5x&KMZ<8Bwb!amc?hP;sDz$emBxVIsXzWqi5T&x8MW7}7qCSOTd4t!OCU=6aSn%+ z$bBsqyEi`=bb`lQv$^TT?t5im_a9+`})2)^3X436@6_Uvgl!OS-^T+p=cpN&nZ z&yfc3`;nmO8B}B5A4s-AP@uGF{Ly4okzI!&9dnO(y#j!f-2D>LU{Ug&JzOR)chFzB z4%+#<)tfFAuM+y_tLRzGb8=!MBh8r>6;|gX9yYeC01coq8)QDN>+xo=p;A5vu~y;? zJc*ep{+&hlzwB%up?t4pSNXOv%}8sz4x_uCQ?@|iQH~M9?@zo|E_AOc1$tZOsXi#z zu=WW($4>~O^AzLOhe}kLk;!EC+JXIBqNZgx`oXktV{<)1oo`KX5ON4b9zHGKbVV<< zbg9RlKaP07ZLYHZa{Ac>D-E~%_;W_u0NfIrm+}Q2^96(60^mod59R#J^sP(hK}Jl+ z6pODZ_-I=HI?nW7j0F0S477Oy)s$ecub9tsAd?V^~MBC{OGEr}iOo9Irx|CqUn;!)2Un%fN3#b2h z&yMI*6<8S`20H>gVN|KmC*9%S@qq)$hXwkMfD&Th2|kqbZZ$$pgS)<3pbH4pg~9CM zlb1e(%j|UL)xDM7-MV+0_%|Qxdlv(2#fJJN!ue4cn3m>RkHD zWG;?&rLJ+1%&LSnCdPBG)$E3n>d!^I6>b8@Gt2U)W)RT|r`@GW^n(OR$7;Z{9ODgX za04ZzZ|wj5{P*{ptrvR~p*U=NvnGk=&0(x%dYivL^CXMNU#$mUI*==_D*QQ#JH#M> zZdsPxjWH?7GN2j{6k0h}*duh9ou@BAB2UeIr3^tb5H{vfVZvz9vOBB^`YARK*f|l> zYl`1yITQw+_G6z?0$se6l~g+8B0ZR9>XJ z&U^Pe#WpC0SW}L1;G<1XTcwoRZh6B?hGMJ|S(wEBCcV0K>{wVRGaEzMBn$9NQCfcU z6|AIO-{;V7r8qDHJlNCKE`<-5-Do*Q4{AMLftuKf>MpAm&5^7>GE%^f?fM${2Rprm z{p&DA-8c1=PQ%DCHL8HC##U%sIX++7T>B`G5lg63_z zzv`$gfqx`UE;DblzwOr=?Cm($UKR=GFJA54P!f#|Uq%2Px52M)+5q36%a7=2o+6TR z!JKP#rdzQ7JfHE0e%Fcq;$1NKI7bS2W7!rTF(Vc>Y!KM}(N{+lY-7&_xc_=Yq%7k+ z_@wf|GY#5S#JAz%Ph{f)w6SxD`id*1r0VW<_nAmD$2xfs#B5T==t;o0Z|=-zBd%kjPxHRWE^fUW)$Ja(5yt0EG>?nuBb5Vw)Rl93{}eiuHY62qnQ^p!|J(FGGPezJ@R%$4m2i+YwB zcApB>q)E;cE~qEzjT0QFy>UQq&Y zTSV1`wt}zeuEto=vF_v}BvRm!jYItpb8~nr%91;M*=Rn4>u!nN=U_!+cBUJHXT-n% zW(3P?Y_k8FH%8L`!zSg`{b!r2s2p95jrH}bAhy`OB$<&CFr0-{lWk9~z@mxd;r$wY z`@psc=ZA~|?LT|J9vXCCE10EsSvj;}s~v;2LCdtzN!O9FUQ0i1z>~Im*S~mtRzu@0 zKkFEb!4dqc_=dbi2^8#DdzzX}S4NaXkt660vA74HpO!Z00?^tMNGIN?3$jX~IZ2;x zMdI(Lgflwm`=Eu8*_|^(>=X!uUCyjJs7vMr7eN+39UM}1qk+e$NvZ)UUZeR;9>#@y z2M}1A+M?w_<&aGB1ZF0r3+MoMpwN$KV$v%cq$dyHqR-k?2Grgce>O+weuu+N1W1`6 zJ>{bQ{2~3x%XV=^nuT}W!6%_-d=2C0 zM*&OOY<2U<>4ykQ9i3yC&cLgq^bRiGui4pzi5ZP>86iX1Q`+7s@xIf}RI|rylO}y0 z^|4n(|4b#xHilWxNsfuEB_*6a0#3$o!5!n$Tq_J2Z&EKTHc-P4}9VGW|qsx?>58Km_sRNDttDeV*^bh2(&{#LYX5 zKS3oyph+u1%DXD6+=XLroUt_}yF2ybf}@%k#E!kIsoBk?LX@mS@n);E5^rZ~P_s$E zYB`J7qcWuB!-KWA0=`N@xwG}ikB1{ZKor`Wy;LZ8g=Asy^ViJ{BPAy zlw2lJR0C%5!qfPsSj}%+<=vTW#2L+xFI_fQ-ZSJe3wgb<=v2ZcISrV;{e6!!S5Xs0w4fJEnN5Aj zt}+sUY;tfQla<@@Jwr&qW5+CQa4jzpc2D1gt_VmDv(M;d1w--w*5I_0H!?D%mevDc zfXxHU$AMG3pdCIrCL${<3yJIL`WorZp#SK~DCV~2u&B%*!Qrd2m=X7mqUk^{nEAlL z?83`E1k(>7n@{I)ZZ$OvWJLtY)ZnUVGGO~V^rPG=#e>J1Sr~C|2CaEABT}JYHi2?3BIL zE)ylFh5l!m6cZU6nRV4;zA`-`I0`*%XO5;_VZR7`2T8o3RBjte3e4}( zTRzL#Rw_%tmKf4N#R5PkV)F~%*9{^Fp!Vp5%hQwZu7ImH$CWE--WXP}-c~wWg912LxM+m&GsGL>!~Io( zYFV+G>_}Z{XYQ6PNa0jnzYEE3g5qyJ!?R}+8rj<4-eq{1o3oZ)X1{VpS2#nx_!`Z> zvaYU9o9im*h@@925k8<3BlqA#IziUK7b|XH(Ud05Cd$dl*&4(L0wsEB%45!u-GNl* z9X7Vl@i$ztGbCKXga=F}ra5!KU~wuUT=qU#1I)`*gLLK4GywFf!X1#0Va=iK_@Zl4Y6>HXQ5knKo5b0z1KJ;L(vUF35JR#0s;ckw3Y~;bkXpLgKo6}4}=L(0-1+iy1=g**7s#22;e zI~yv}Sn|#6Q_&eTGHqBI@lXH!?C^C`3`~b4iyW=I9lMfxv3l~eJ$$Rn_u4bdRsVet z2rc4o8YQ~4bYrKp}AIF|6Bb4C~VEwPiy z82xq`v+X(C#xU7#7#%`Dp;UygdjvEE4MgF)8rj;mMui?pe}6nY1t@UbkT5V4OOb{?Ldu**Z0F7`lstlr+d*BX1{-eT2C za`t`&edQSbba4~bai^cpx!`OnVxwmP7bhAhY0!9osvcKhRGk5pa9UGYfprZqDmP8x5ij7Ym zuqc^CH|bjArNvv1w3MzaFKgauU+|f(zi{r%nZ%jJ(b3N}KzLxNq(NY;Qfr*35jzW} zrRa>IC03X46wPn)L0y)18{wen;0IFP>sEOQ5-DF+Y{(TBhu2R1J_&`gKF4x4kQ?5m zJ+HfR`G%)_hoEzCsCr~dc+ArSekc(~esAA?sUd@*Zy*s(U6~ZPXbSrUdQi+-{i~C< zqGEnS04*v*Edj(1L_7=^`iYJkF5@CT6h%^=dyN4t@+}hTJKlVLcGj^P@#Xn=?@zVh zEUn6DW1s0ms9eqdbbs^A75}X=Z_|6)k*nqrbBL}3F;Yp!EXdpU<##M>Lpwp4Vy|8O zEl2;gx3|}&;0Lq>R{`$yx4vTZm;JLNboT)VTir}>v<4Ovw4xQLd&I5f6FlgmM~7Gc zyy@|_x&2;Bk-)EM2i>OeM*UdD1k@S3%&^OF73X@!v~g$@4tR!K}q{6mRX6(HxnsnW{a{;2~d9ko~((i^cDZjH|2#03F!$5ZN zE;tlz{w!2SdL^Rt#O2EpZhZ@w0|2Ou9*`69>#IF}^mqFwW6NYvIAsWd@ULAhSPJK*9FPLg(B%j8Jcz1d+TzliO%mVAa^Ddlt z`}S!@8A@C#Gio!uf$$yVa-iJemG{DuVU!%lsl7HeEGp+f*`p4T?-^CP^+4K3F}ywd z9gElF<}^e;;7|0K87lu6FK){tATai9SD!ip@aL{-34tp0{NRylhA<_)4e}4N%c?mDFv-9@ z$Ikz1in?dkxTP)^bh3xSSXkuK%G4aB3p*9^DnRu_NDj~hF6Q>a-U;V&_@9@>7Cbka z7=lK0;3O$B?KcJ1hYEP{_CTovCWYmf6Iv~&2N8N}kv;5@C>U>nHJb(`)E63FK2>%W9w;|Q|Hj?wH=>8en=CeW3&A-^ zuYe2|t_f#&eAedJ0(L_f&E!|-KROsm+CmH#LW2dGO{+@?M7|6gnB~CeF1As(c(J$s z_3ql>@XDz(XG~elP*)e%69{rQAJ?!j3L3&w(G3*iB2YzcS~TM;oIXo6EW_X|t}~tV z{+6`+bf;1jZ@El^ax_DmuMa|Q4^0qb4oA)UM{y^4$lvs}=w2j8dAvT){eiKIbFVFt z2J$crQ$TNKKhW0Rt`o(J(u6kXTt{IL?DW2~#UMh-RvNntf|QQm5J?M?DD~C87sp>D zY|h)flSf+@K6vsp0|QA33%>~v<&=61&IX8bv2Cl`KnBtCgQX)P+|BUpK|U|ocf9@k zZ=dU{aeT&AvDxkKw873Ih^oH6+x|2rCdST~QJkBcTy0@lqkHg>-rJbgj0XXER!ai7 z-NoA4F9qh6;BX;WziDw_$Qed6!<&n<$UzE&C5qKvgSRXj~m2m<3s&B7lDZn+A$6 zUKE*R(2d>Hv3RkPoD6e|gfljq@~iIm1~nVDhmEXDVF+l`o&N;ftg|3$JKbkj1nPid zTQYc;OJo6j8)y{((tpGw_T*sD^9nzLzywn!SGa3DVj_Ll0@qV8nz-nCq)+cv zw+%3%siAR4D2thiH(ad&8ji--P=|vy7XwVxSBbsgu63-GW1-wt$`ORtKTovtfc>sM zbO~_^x8efOe ziiGpe=WU77nSFh_<42F)f3p8j0m;Tc42TYih+hQ^9-12m4IoQ}NBgRj94A2^O4DFO zUIc*$S7q34?dp6zevD2mRpkz zf@p?o_kV}&Bh4!54U=xf^Sk8+DQ1ZMthWi~u{ux$_h2 z7i$^x=BsMfJ8|(s?(uAEKaK!O;K~(FY19I?@_Qg2%nYo~iZ`aDvhkc_;Wy#@WpzwY zP#m&NcCSiE=)Y1@0*}G9uh*IOJq~f3`pzcmFwprXOAmT{NOHg0wdn+HB$P5+XwjdB zx5~B4?x#wwNm6?-UtK59U0@Xm2#_6zMjT{2Z(5_hqjU;8y~AI>)*>EOJ$VeAgZ~&P z@P0PPyJK#Fd{O}V+mdAQWo6ePx_mm>ccDXiW5sI5>Ol5AZ@L)Z6ayMcIECaSFL>>7 zY4(+|gYnfOLceB1G9y}J9gJ7$;osN#muJ!Liyh6UZ2R)7Gt`o&QdxdDoV$$CE1u~V z&-p7691-k?*R?V@m*Kl_BE<_rn39`AXo1yliPBwcLs8J3VHKcGIrVy~Uv4pEJ0-|x zFXy?;sDZQr1mk`C=;N>VCnk25IdBnN5-nYYld>yfapBaS^hD|=XoWmPHDoHU_3;7Ly-TQZZ{OK|WK#5uzYQl90l++&-6$AgA$Z+98CWvF0OrZ^) z>5}{+C;f%oWOG};rdlNgUi7P7f|z{|_|ef3K(&u#ps>uGUbuTfz^HRirT|3Qe=p|V z?a9CWp9|Q8U99eflukMV;;jI@I`}ELz-y&Qw=Ut{bjo(1hyc%~bT|7@D3Ta}jO$Gg zoj4C!^Q}_d>`;JL_JR&Zh2XEDU3zl@es>9iU=SRPDz93#CGNc(j4O}tAw&BXuAb$J z*D(&88Egb9F3h}KRf@74I%I=q&VMz8Ofmi7GJE>fqi}I)ga311c{S5s zGKt#!yV^m47gsoO@&CQ3a4*YzRpTU#fCd_<+s;BhcWQJIc`%So8eGfkPE~@=4-m1O z|EzRHy8nE%i?B}!*8kh}lpgT`B;Uy@_JM{)y87Z#Z*ON`#yG1VAL{p%cs)7RXTj>! zJ3|iMxo0+PtH`|kT=-nq-~l46iq0!5EBml{$S~k$Po0)L@&P@c134>RJm3l2#MszJ zW1^4Gzd!x>H8`<=bzfjC2qAr_A1V$B_3m+k{59UPOd&ievi)?yxCFQjvZ0|iM1XSS z5_SMMhMa+cx*!H7<=GqTT_&eMaE55PMRcC{E-c*-hxbuX1IcQ< zoSY4(Y~gu>T48qY>VWMfdz$pD$txrk@uc2ryxk7!-9uKU>|tJNOc1`@mR8UB!E>c6trecqp8EA4#gPS zpIwvru9<%>FPj?i!*{f}E&oy)KYCImq!nJ21auGjwd0-%b#-?jv+fHJK*Znu;zoYa zSFBx!4xTH$22nfwuRjlDquG#a{oj8c5B|$h{_n5uEB)6P=6`+F0Rf)=KYxb)WvKnH zua{l^cg6homz^a4z3%`0)lrXsH}U`e>Zkd=`RRXuao_*F;s3cH|96G|b0z+7N&Nq0 cN$eiUsIW!toW9YEd|)McwL5vYA3Xhk0JCEj#{d8T literal 243900 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
$NMFBOGn?p2uVsX-j&2Bnhh<{PJ7~t>d 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�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�&$&`S z1?_m9apdN&^GCW`c0AC%*RjG7i(rl(yB~c_2*=+kPu8pu(I5`i2tKz%y%s89dUH+O z6RiBdg1v^+Nd6&?^O?cvpz{G+-_T&;DRcjq*v3_aJs(-q zXxaZXq*1@H`01y?3ki@tm3Io}Tp%8DiQ3S=vd2T}ua)dq%|JXmnTJFX_ba%yXB*?+ z_kk%VNO?Y`72nRcfy(t*pJyLieaqHl`KLY`FM|{8IrP@@*Z9WE2$&~$Ur{51DV(G= z0xteXK5MsF5(!7PF|sdLI_1S9SLdE?O~@Mm{z zL^1Ip`2?-bNuVn=D)NZ2wTxTM})P?We z)F%pLK6*IeU!HeQ3t^w!{mcdoBL3kHAOb2fzXP_nB*bL6M2piCU)!^t&w$X6S)F($R)3R5=zlCn z^Vf#bl=5`5_#3H6O!x@6Ntz+x_7K3WM#t{AQQ50jULS`za8-Ql z#NTuQ%ztdk8XYfZsqwA?O8wi+%>?F7e^8*!3m9u!(rkiPp}2(MPjZXZEmeed5LIJs z_uI{7%FXx>f_MH^Emm(Iq~sMVi1m%zx-!ol{sHNCR{;I*Z%u4~^1>D$7~H5(D29N# z_(H)%HsXNn&;MP@XYq9;FpGNCsuG&1O>DsV*a-jQeD^T^tmFb#nn(sKHRsd)UP*It z{I?FxPWR7Bp7lVL`)$2~->vY-KnlM`=kJ~A)UN&!gZxHdasY6=`2tI+-rj@})LNe3 zZ62JI-+7_%Q6}Qj%KdG+sAxvP+^|8g?3CngrOBYP0|fY2Y;6}8aEFla0vacT7JmG; zoV8a@s<8Y-HMJ&u5y!zaSoqwQA({$C!^$>H(pS2VDLOzBP7=opT@1rjFp5D>i5iP_ zM1hQFJtc5!Nm{QRi{M#mKB7b*q?ed{9+rT}xKe)5{z{RKLiEka|2E4iaEh^SVr@fE8c zrP4U{8T{m`S}fO0rM4Ip{EJTm^56IrptqRW`P?0y$iu?PsRC;3@@e7$RXyYa#b(FX z4i$r8U_uVR&ulHau2w6)u~YVSeDW#_a6nB+$H^qpKGAw9=N^MgQ|9C!()?rJaShfY zU+<>ymzo}O#pw_tt+=6-NSFOFj+`o^IGD(P+rYg<1QC%4>P$~?_|2xU_686U9q<@D zn6M)3YW~b9dnlToSeJ1i1jd#5-2Uexwjl$0CxfzD`hEr;7GOhY3yS_G(tnl~U_%`0 z&sq_*^4srcKY2mk0r_pktMNWThn*?mM16mTO;@Rl#`L zORInL#8whP^HtD5T}AoR2bV)jjF;_9+nD=hNS?o8~i``imQkyCH?se8>`7;<2a z0}e>Rtki|^!hWrV%Hf*jV%@It1#`5(3@xOa``ygf2-g;Xho9vT9U<$K?NcUYOcJe^ zH1sj;GLNE|YRm4;!W%LfLbXebhntSL*`NT#s)d;*K`~KRqG$F6u=*HhQKCv5oihwZGttY zn+?PTBN~VO&cKR$2GqsU#*6xNGcXnfRC@g#*rf&X;d9&$>OdJ9m|sW9?DsdkFY+fI zL9Psbujz4(ApqGJF+4)m0ymQ@2fP81I*`5#(hX&QhXuz#v$w6NaNbvy|E|DUWbh}M z>kp0n{g;2`pVIjM^5a{=e*=>L<)^p9{)RXI%TMn-1*H8yo_nwVj%N8Uzjl{G&$<;15;fJe z;P+gTTHil^Nj9oH_&4DCpU>mjBk;cke0E?@f#+TdD0^_bK0z0NfSyD&?Cg`jgHTKY zfVgUbLc?3&Bi(#dB$gwGLzRw<}CkEBo()ebfCZ$ikLP=1RctxdTEBn8JaV<@4rIojT0S*wQsWP_b!1YpsHXo^{11Dic`oODdQ%Ptl@M`!VtRvL#4J8;7I6$s z<^S)q8I{aH3NNEI(k(eZ^v)S|Ij-mYsamsVPs7-@)j`W)7# zw->i$*=1TOWDJ#O1l8L^@?z=M@ms0%IaJDKG-RhF=~|L(EawcY$)WQNZ`2=HJigX^ zSy(80uhXr0X7hE0Tddn%?cBsup%_x>S540j=CONz`Me{I-tb@W`S+XG?@5mZNzrdO zH^CC9Uzr0YnEcbVP9>@~d# z6^HL3;nte<38nta!+dk4odam@I|8eVgVruykVHudu;pNxunyvdM%|i~tOJO(<+@v!|opJiE zzwi>&{_^QNA#(eHfNeyWwpxx8W%*6OxnPAcj`RD@Dh{JJelGh05P^+#aQ2qZAHlWXS-&8;#gjS z_;=@3nFx%w?s>BfD#iL9ZX3L>)=rAz4e0Z^*zR)pxD?iYVr2B-WGWPK)*q+>N-tXM z5uowkmWiW`UaV;}ETkUS;%Mf+?eO$Md*i|CR2br$me+Xo@6PRX#rZ6|)3N+Yq&?;V z+UJ;SNiZbRZ|X+?p8xaL$0xRB5cuu~L;N1nuv^UM6jDpr^SK}7`;X@+h~ePevO@#& zR1s5A|M`$!KSWx>YUV%!<0JnaC5ad*i5MqY--$55|HmVU@J0QP=l_Oqu0WV7b^!B_fc(!p^z703 zKjIeuTL=7K(?0&UHvAhSU~mnj$*}ZvM?Z>%;u@7M0poHWdB>q7lQi?SzB!M8J=@l^&l;f(BlMWge+iP?Hkgk*C>A%b|##5Z5e-3bAn1_wF$$7tfWtBhMMJT^vh zwW28y1D)&beolZxkSl>90bj40-W4jAj+`bpL`Ox@0e93{?Q78bLK!ss8JBUxl56t0 zQ;~Tan})B2AM7>9<3^(}xxt=}gHZ~&vk)PuMisdeFa*L4WYYj8o*KxmVbI9E>I}L% zt86aLSLGfAI>u%<`=82oW9|+hjsu#e)F0glSLqriP;4eErO33SdVPl69#FCETz`HdnUjDgf`446(SQRBCS_@v0%V=?upK2hRc9v@rWJ(cy{wbbkCucNo@AYFrMwvc%& z8b%K|!E+%xeoJ6@Z69qeZfsku*I%j$fdqLr+aJbUhAYxk?YC}IfJxV+?pzW_9v9hL z%-24S7~Ds;p-;HtnBB;}1HgFRIoMn$Jg1*cs|^(0S}g{;YS z^wJ$F(D$a? z%^;Pd*A5FA7c{+ZMN!5vJQ%g|yHlJ*Ku($a?o_%4(LC!p)dkr@eqhz{-?{u*81KC9 zEj5p5G!w>saSw4zO&~cjkAD6F+sea8tTt*bMLX$l6S5{g_Ag5;NlbGe&_TX4ei#Ga z=$u+WT;De-fWzj^l~nT7yY+d`Ml}!5Pl6X=?096<+wFllC?{YFTqTEFs^WEn;-VWo zs@i;Ud7;{DThaL}1rigdJREYy-$DE0#W=NG%P5#obW)oilz~fD2IfE5{UU}LE6tia zsAZz$bNw2>wPp9g0Zet_2NB52Q~eDn*an1i(G&*sOK^0Pd}`8^jA;Tz^;-qH2)qql zk|I)v8;VuNsJPs;`G`lG3PDC8nTY6OjTGIDN~XoStHnks0#!Iz3&k5o1|RMqIl^X+ z37w&t!}H;?8Q6(b>-A`2@NJ98vx!INV83>dFtVpQ+>U92p6~_Uf1DDU{+>KLS%+)uH5D&OQp%llfmm7 zYBNarSd*E*z1hi9v|4<~gL`FHpKrTeoyT5mCC-rOUVzoS5VO)nqM#Fi`1Y!)KNyZivo2BTKT*5ZTP`$oq03)4z91L`wD0bl6V0b4YDn7oFSULtcpnUCc zWJ~NexCC-CG6!&2elCZmqwK-KfHv~DAn2Ofm?3N*J9h6Zb4z9ugRc@4tLJ74gh*9DhIr2g01HsI#D4`3>XQ}FKN;Qp>- zoRhU+DNr<8t;m8L0XoIVBZO(G!O#e}6}1p7lA|wx1JOps#+DM9H>q*MJ;t;^_GwA; zPg#uDo3#&MH1u{`h4B?9L;k6~o3^5nn9zASn0T{{BAxC9zr?P@VlH$IUPM^2_QW8u z2C{2?1-}Gg5;99rM6%Zim!Vg)T5>)dkCGbo>1Qaglui8n`5n*APXC2Xuhw3*7z07E zO#2YJvnJW7-ujAB+er=KO_`n>o#0VhC@h{Ix} zU5d99ty?qmlEi6Nx@@#Um_vhi?G4V@t>x8X7@rk>k)V*!<{pG<3+%U`Oj{@t1ZVs( zc{OSz8)uv5`#f$Yjx7u(L=DJf-40ec5*#5s^?Gd>7yDzzdtSVt`kkocNiN=CVtmrW z0CBM!P4gGZoEgLE^~(iTF(nC)h;T9!OHD6i>216;iqq2t56}KZc3gd0i@6v(6 zlap~r!zJLgv+#Mxd7u7?Z=GJyuDT-+OcO~^76YojoUfCSbuX&n;hRc|plzTV=5{t6 zL&J~j*WA?Imb!P5;Gd>zRj_yt8X0P@p3K8H#{53V2)La7$i`1L)!`y*Y`hur-}{UU z@@QzHEQ%_@0W&g+o-pfuF>kbQY%tsWhMT}?sEOFrUd1NstAlEq`s2R9i~S1Yz0WbA zxSd0jTNBLCW#@eMFdmOV)dZaHG_Sed{z^Zlqz!l!3e~7Jiwz_a!TAO*hBOB5e|OLt zio51J-Q%VWD#SoOs}O@W1x`P7fogzH!U7JC%apP%lr5p-SVw%PiB21e@mNMCE5P>F z=FZ`DEA_{CmAm#|tB0XUNxzyaY@nU5=i(jAW#Y?NT&4LMxvc|c@6#b^8yN-M*K+d{ zWq@mVQ^$`{N1{^~Kg3qxhmpQ%%j|yUl@ZJmy_AYsQz7F}5*{4I^#U75Hlz zn93}M8;9Y0bN(H!$e4k7Mpr``ZS70lPTu)QY1RJRlMKn>C7Q%y<@$oSkk;qahc`vJ zx&DlNPA$@fAx{VhwD}iFoKkV3A`d85@)c)4$VVg}^CZFyP3ijIL6x&gOT!tGxmVoW zNpM3~TnpnLVPoH_LyM(}&6B9!fV?wIl556X3vF#r8L;Z?T|zBp z7M2cAUij+qub()Fcn%a9ZQQF44A5crNkvD~>F@874Ykv-O2gnM;mgD15eW%Yc1HoW zkN#jKwq!y2e6B(*_FXDaq-9!$JPK=gf?XL@8Uk!V14|l|)7?ONA|;(3Pu?G6zsv|^ zKJHGtJnVy0j}jB_Fz0DO$zu;D%eqdEElS>VFQLi zVUT60bDusPxU`|fr#=SEw@1H`!}^}Mc*rdzn*99NwpY=5yU$1U?Mz*?C&v$zn=RQ3 z>J=Dv*B&Y;=jR*mW8E9LoGWm`nVwa~zqmrNGc9yovmucgc@rM=R^9d8!g_UaLi_jc zX+PGvxtVjNvM?^P=aIyu1plj!g=?u{Y$a*iW@`URu+=Bv3bcMCq2DJq&@Z~pf1*z zT1<3Mn^ut*7LkhDxa`5Vrzo(oN7`MvbJbK-A3Gs^ylM7@ISY0gS{V9!xw&Lmc{>}8 z=JDEG2zGvnP6`QDDp_~igH#Y5A0G#)ht<^)*4u7*3Uo`}MhZ(kY!7I?Myq>6Q`s@M^_)AtMCoN8Z~J>x=Vlvs-n+ERSTCRa6s9zm73}QFE%| zr^Pn*i&6{-piN`eat$fk0bW9{=C=`14q&Dl03S1RM5UQveU|(DY@U|(U37BVgzcI= zGCDeNqFnppU=2n8>f%GH;tuM@@7}_#d1{bf7>3v~Z%G?@iYgQNvuq0F?K>T|zplDf zSCrF?o&${2rfL<-iwgSc>gW`WRLl=@!*`?Q>mt#_CE`t=k&`R@YPos^E|YS|+rx7x z%&}Bh-W6ke>McOm!j%xY?DkeDM0!QdF;f?!*vU{R08w;`Qq0iR!M<9dF`3NEF~$kB z9TJ9yz1XFCxcLH(iOOM3Fj36GFxP&;P=&=^7%a$Z}Tn;4yA|jEI zm*mOaB6Na+cUM+c$Y{CnWJZ`jh)8(J#v|kC>P|x-Z4;e@7Z>_)CBs(wt)Q*mv9d-! zZewLU1$EKvM;u4ortd=Rd zDw-!(NVPSQufR|umJuYFFHcU(g(AaT{y{=w!bFSElJNy}STYRL(zcAzUWLt6-aoM1 zYC-gs!|mIg#=fE<@6tPpU6B=wU(!pDHPwTcxyFBn+=AUKTD*TwqcUwVS*(F(XF8?V zB0}*jTQ+cAhB+W?aEdyCpnXAdmUpD1gTTBbCdlpP*Oy${)a2x+Y-W#S;=jbi_y!mb zV-t~vA0MOltg^%<#N(q;y8CouBB&mS?Wo;294w9Kf*UH+D>1FA)?RE)IbJ9Sw&n8Jbm}fSZF6Lw z7Si{5SI+Cc5{9z!at3=9JCg|?FR!-?ZHhMz$bS#|y_nnKh!>))mj3>vATlO3>57Fh z7ygF!iAXOaDC5BZ4Y}vs#|GJI7K;?3uBjq?qD3jmGc&LOD z@Jndo#vH5w?iJ8gR8;PH;04y6`LHC8wYVQ)GH5kK!0HT@N@YJ`$aKn{R#XZKo+Eg@ zhy7mv<(o1sDG_t@Zxt0*n_C!3oF4aUkoWEz6t!dkIaFW8^P^cp%+c->Dkvom-DWT) zCr^F;>J2%R)gh3~PVzjt{bG=B)y;ge_8E{h1y*%$vAoOIzhkS{J0s7`%vfAC`y%f1 zp6AR*uwhP z!6&*41HDgTi3pA#Ho!=`CWva#CM;A{mD9x5PXWKi-}w|=Er%@QWOG$XY7ga3f;mm6 zHSeG9+n`c0JS6^N_7T z1ok=kL$XE9Rgh-`?1*M z&phOvDwZpJtR|p8Qy#@TeKiJkN`+K@@|zi>GE(1by2L7Tfn%#TS&8X8+_fuuNx!r^ zgALffPce%3OdxGg(ASopREMcoaBU!vIh63Ow-5_5#=F+2WE~ak!HxuI%GDKJVvM2FIiHVxw zgs|JBD{d*Qy5#B_Nq-=gdyRmYDZpq^HN1j}LjY)6Kk5V$W&1ZtdEK9Qm_y=Y$4YmX z!xrWnqK&u%XjvpxpJiD864H6(esOKl_(8lcn3B3>JZ~T=>1h(L4T;Bf1sZd?mBp1i zpsOn=N*mmq%pLB+jRM;aeTMAZ{^N&qrhPP}e^`qA`CPSrg{;Z_7<~Zi{a>YOl=Q63 z%=Z`Jhtxxwwdz?%ky<(0i|M+ro!d~`QDNObyxfACW(R^hvfg2wxe?Qei4hR&;{}Tf zziUIgy1Hbiprl^!)NB?X`Lmg0p5S8m-uqALS41tTfC+IsAX@=wxkKuSy)R&GUv4^~ zbk9?T*RN-KWsc@sl9HbuQ56Hm;@n;nn1y}t@)6(lO-+_QRpW;a7$4m0D7FM|voUK$ zZ->Y6v2a*wS5G=JQ>{npBdIg&7@z4{$E%BVz7IoFSYQK1Qu4GhuQy%r05pgW?%xN{ zP*lV-zg%oLgS(u$ZQG+0{vh(cIQi`5<@J8|MFD=G$ZLm9(S>!z!GwMHn99A`K?pdt zFy+^n?3oHh6V)fxP+m`D;jrh=pC5%Tdc;S5uD~x{+UcaTw6g9%g`x`sQTfWmJMI#T z$=7K5$k&eZncB!xmSg$g5tRcz zKKN&Q>wH$r)+5$9fg-)rO>ibmQf}WGKa7s=%}qhci60yzl=E)2lWd!Au zuQ8?wU&oF)e0`A%HyIUOu>ou9y}>~1hN?MyP&H6@z1@7d=>T}quR*OLYGxWjZWwV} zx^C|N0HzmYw!m@0|P_bOFeFaqsQTRgpm7@rm$D4;wNRf+I;ArRvuYs}f(k_eoLaSV{7+VZe80{ek*|N1K~^ z#d6n>QN3#hEq3|mj!*akahQFvn#ni{Gi;CV`+|4(A#Y*-=2YRX7jXFOJ4JkW*O(BH zr{2@k(-EmaBu`ajv;}Bf(c+4P!veMOyq_H0vU0mi^RwiJfX%4)na&d#r8g<@@qr3N z?k^OtO9`Gl(eA62c@lFVD!5|vl-HdLY7^ymvaH%G6!|UxXF#yj_eRRX@sb|-r-%)J zcN~y2mrv{K=^6YS_OSoiW#%!E^agKI@v9Jn?oFhEEHPZ1YyoB!7P8|C^J_o+TD*`q(y|;fAbxcN!&GmHfmn!I zxnalPZf+7Pe>3s!^Td+q?4;J7@PjUUaFl`9W##+~H{%8~1Rv!{Ts=^j7d2O?1cpp@ zq#ksv!ZdI~qMqgr`J+M(S4QJ_ueVs`*4GXJVS)6M=Mgd^%GGOXm1Yx9f3;jZUNbO= ztfFUUxCupOTO?#AXh%JvJH3r2D7Y#kG$4mm2TL$*o|i4U&|+q1@5o}-GLrA2TgHx{ z#Su#6FusFtNG;Nr6ZD*m3hxNN^qup2KRx}0I-&sm!j_4RCsM;b-%CBNgSR=L+FdKm zWtA_S&2{!NVjK@&RU+VuL5G*|-fr)`2xTdtW#B+mKp|37F;20mWHOXY6;+hCMPFl7 zp*L=E0u-oNH19)!fu}DaCe_X8@u_`K?Iw=b>eawtcE8!fnCi+(+n1Vkn%P(*@}Jb- zC>FypZ+X4#{G#BG5$A-k_Le7xu=rI>kJUv@KHjSRE|r_@W9Tq#vNJQ6RqMH6=S z^0Wr8x5`Zi{y*1`Q-weF7K9p2)l+tPoZlZ95T`U%6MtrX0c~M>EP!&n>cdPPXf^r( zJH{#B*jTyInrCm`V}FeiUsl=i&KiSiVBAzuhruVkJ9J`bpvhySxQI+56FSgJXe#iu zyE>SSW*S8zX49o#1UKG}QRdE0lYUWVJ{IoOAl{?L(g>TB{tZ-$S5MJmONHcZL-h1D z>)dg~lspO#e_RKpq>yZl7X&7-6|^o4;h~_Qe2|h7mbZO*+na=(;+44N(EN8Y@#Ln5 zVrzq*-c8ARyA-tjvT|c(Mx9)99{V4@u?W0tXSO&H?dUAjvdbxR(^u|b6_2k%Vx~EN*|0~1EAAvrqL}{;9DQzma4pkjJ7>B$jOnW zjd6^K&a$7V24>dtS1)g)t&4kSdN=8rxkeE;V3AQ%1F3fMtKgGh77ndR%59`?xHC`I zj|auG35|dX8p^hK^JPl74o}_Ve-kI6Aec zeL8;MXs#?p&rE*(aDwRdt^+UBW*bjJ2GXvveG<9neE90I4SunpXpn7Gm*iz~w;$9! zk|Nh*`B1^f&tG?W$C#1}WoJ?2GF_UsjsQ2Je(QYcI_TXus7S!N9s=cec{UW%)5{US{`@%(KudR# zG0u-~D!RS1s*+gf)}cz{cw!3Cf9>`TzE+^e$HsTK+i1*)Y5w~_mFUGLu$yh-D@ zu!Z?enA(fq4|ep^xWrtJhH}Q3vK%@+UVEwT6%)MnoqVz6frV_QssaI?O~X-R^*Yf* zDfvghNu;~E6?!i`Ai8J(?B12fBY#6QaBre8Ls+R44vWF0?bf8AdIsK=bjTB2$YEai zR19!2fN5sKF2Pq8vbDFKarQVJ#lA}0Jrr>OeW{kFMYOKYE+^la*{Lf#?4jt)BuIRI z`;4lqi-4sJ%h~S4*{y|;#4FhaYxy|-i1ymxtfFVm-R9t_h*AnQt+7;!pAOiOBOW28 zN<1L=gOjW53}h0Xxx&l_2SWq^CBxcy4P5moozFbjVmUjWxSINiK(UTWNd7>;VExA zjTde1VTAJ=DB|5LG^4)7`poPy>qua9HYXw||5afHsO(2aq!4)&ZrJV&2HSjLtWI#= z%iiAJ)(9Nlv(1{~p2sR@8MWr~_rC{KCEoE42QDIJJ&?z;x3F5po#W#tq}{#Xz0YZ* zNl8L-pk>}R-jVfV7bMH#QgtO@1aXY+yMoyYJ?Funhs|Zj?9a0rK-(qDvojim+9`55 z2>ce>s~6C;7e6c#65_Ns(waABCXTAE4SL3yc7Ov7NPvP4fp%+rV~ui4c5(4D^Mt-q zYAJzoy;T&!_d;TzE#u-#oMfM$%bLhMjog_kQGTEAngL>1w*StPbjsroUXb@xOiZl% zD!Y)`V@n>$_f}PxCNx01cr`UX5Cg;A6VCxy2*X;C( zt%Y(fuZom}U*&pSPntdD-lSFzVE%n)7`hI9D=1Zb%2hH^z;}TQ(y|ZwwCy>0L_~Zb zLVf<>tv!&yMS_Cz)I^Hnt|ovtmA;{&E<6Hf`eK+tPfwKN2P5Y>WwT1XD$~bKU~gse zI$gnZK zI6Z=UI+2U*e(7?}8K-0v;gvn40_i19*d1?=W^43=GQb`tGyRE&czPgC*6SV^7oN}cO@mI#A;sea; zwKao%rqX8t9LD2F-WR8BEe)_`=&lRW3Z~*Yup*euAE)vJ=KUP;eRCHnjv&z}X)Ly% zZFrOPwe@Y(u%w<#^@(B@URT4~--x}UxC1~I1e6~DGGd&>hPd}$UNu!bbIiJeX%WbXY%CF5lyhF}*Zaem(hV?(@u87k<42&U+8VGg8mI=*@RGZQrGdIIrP- zUvxO^Gd`2>V77+0h%8$0h6lBRJAW5PaclDQ`*C0<8rw#-sse{NF`TmA*}fylE>XVZ z2yqwf$HEcDxClf-{t?gz%S_=PuPSU(v)pvrf(2bGY(ur%f&f7y&`@bHCi@2sa{vuB z7T({}{FPhIseSk^Etvg)9swlNEz_?<-lmlJ02iXN)+~q%lD(_tcJVfF4^N{0`LYl> z!hmkg`XF(>*c6Vjc>S_xvq7me=m11hfC?Xw0@IRg;l4QC@f&kr-*0F1c*aIg59J2l zJmp$fV#Sw9z(*wzI&1v#BSSrsH89(OF-rOgQjQ92AXKDU`y+OMKK%C{H|g)~9?38u z%yt%`bm^aS*>q=@i}L{it_)7+L>^~COahC&Be&2Dq3y2(YJ76!uk6jiFfgc*M2ub}y{ZR>ox)1-s zoYY{eKu3pPym%G0q;JzSOQOu=q8b6eW-HLbr^6d+4RH!qsOD(_o5UpM_HE{A5FOFW zV0oJ^y)v0*wW65@`km^M3EPp*g8U#*18|H zOc;%hj+N`|8Wd@;llu9ULg_%zpscd2=Takr;+vSN%qnAhpX~LPf}oHc^adFi@96lY z>SLlUb$~m55OvRgWGY?5zBZg7yV6=6`eeL4$hU&oZSPUzhbs%y0&+1ZA#~_zS+2 zh(sqaP|NH$T}2!;K1dCJzoINuK+!whn!L-?$U|A^eGdr~wpcA~+}~MnP+nb)c&wR| zrQKOS`1w{uaRNstf?ls>MX91%8*EU=^A&Jx@Jje?n=j{!c#Hr&q_v zD~>MHWLde{x-hTjNY)O_yK58ofm76|Sd%;>GE27j_^ul38|+_l^h)HOc+&&1^LYv+<;eU+F?I#h4UIXbc)m&lZs|? z^jXCd_Z8AFdE>=VEQZ7Kc4Yvx8HB}~O}WlQ?zx{Ik-DC5UPe~)@bU0)E)a9x0p{1V z$JuM7rJlgCjjai6z_zLs86!%5xYCf4liwE<s78ZuK?UboXXqfq~OVf z6;N%}Yh5KM4U9i}b=u_O8@Kf#l*=>c!`Hx>Ek;QK{EzS(k7_d&htoFwqJ=Z$XgH~| zF>vwCj8PluDHEM!Y8Fex40Y*9+=Oa zDg|;*Lq47!-|tLeQt0ixUy&2$-<*;ndKKQ{K(;KDkx&uP7rr0x0r*_7cnNt33psAc z2=0+b^-4Dtob^5SwF5hNYrW9NQd9b}kN=BONN5O?%a&uSXJhWi<>_*mc6y(s^%bKR zfrj=MQ7gf97pL`&{j~|wz;Vz@@}2e%fvb~YhL9(G#A9nO+kE@m0#kr(^aPe@IHc7^ z4{xAlrbcxcNMTQ(E^Kd5v~Jxo{*|tjws>W>ZQokrBd9OoC`bX)fI`Dt5_~3zJRYK- zed*UTQ8J}{**NjURx>eeDY;`>t~3NO-}n9Fv#7HeXwrt%}?bO`yQMIw9gT0h>FQ!GOj~u8*Aq1COC0 z1Vu6$Kv`ar^wQ7=QIms{aVvnU)iu@othpgLJG{r+T5z(u?`_0_s}Ut@jE7hc7+xP# zzRu7+TtBXxeS@n7e2celd+)DTC!e{_$q&TU2->y<0gYjSg!e;cz2tcc&d!`HK)sd} zvC_(Yx>9+&!jSl=?suBnxyPySX{tDRQTa(9p*QW59uB`U8L2(FS1;$Gz_yJ_hw;lE7a z5co32XS+iIoCzkQ0Eab|N4o`zq z%x1@oam$f%&AIT47*Qn8<`fbGNfK`m1dg@t&wKR--903~0>8;>djbSJ;+U<_Ben40 zz7ZfqMhdaN_Y*`C?|j8eDE=Z3BH!&Ou=Z+Vmm?hnM`*r8YCb#D2<@Yy#Q>hZo?SZV zyvOc?PvCw7Rm;Z5$8WiJ?1#=oOiWCu7W~m^3{JPJW>KtKDFFe&3izL40R^A^E{_k% zLW+gByL{o#ud!KZ_c7?~xjpA_?GIyRCW^nkUyazShc96p45%G;xmT#-asb~Uiq+jm zwm`za*avLq^VwM`uWwyld=H_oQm&!|`sN}L1opHi7&P(Kx!k)x+i7=rMVt7+1bC`m zuiD_rV8r2b1*9}X@$fcNQ&YLr@%5a#=S*wN3=FOJg*{k_!96Jz5| zr-Nh{%nbh;>Q81x!5Zve8s1GJq#ISyt2`xCEh!S}xU~23^0}_VKM$+a?$zSIm_DcD z!>1M=NM^<+YJm%tjaq#4_3`^PO`{bPm+i|5uv9$qz%NEUi3up{WqK1RF=yc|W}Wq` zXk>Iu8v>#Lf<}uul$fM^7)Z5t)JqtK53yq;2IQhkaCi;N4jNLA@X|-8rn;x(e9=rJ z%xfLsx0-JZRMKs5I-59Zt>H;QX#Ie{vM)=ZJj1MkCLqf!_niXE7=p!7cnEK?1=-v8g0ydIte1S@0Itp-bsa~aDvPLWTZJg$$Vo(2(q_*&S=XKTrU{$!QfoB?E}V2EnBHYzE6m zec+*uymFI1kB*N&nT=Jmu6qiiBW<(Ui$+Ngn;lmZmg+6$GiVZCnWV|om4e`j@Rz5+ z>#w9=sF!j0b1fMuX`l0G){6{;wA*J_7t`Dlzdo6;>w^|)Q%3>gGhJw`3$cMy`)ZIO z!ylsz{0R1-qqLSv4M>1V^%EBSDWoG?4#9r(B!{K9l9$>VfVmlsr=`4KZD#o-%@-51cxwr$h>flihmm=&<{DSS0X1rJF9EMT z*JP=(Cx|*2$xq!+Wu=9LBJ;1Gno-ng+1ZwL_dG+E*CC9LpUz%3rvvVMCYuG>iTiYR zrn)x+y`7pTaW7hQsoj98Ffk>me6Tf*xvlilM@@e)g%Cbdr&MM$b7_Gwc1FpBRB1Z@ z&eDSjV6sHL;e7T82&V3Gxn?Ig&Er1uDUIigm~Fj`a$oXV-RQApj6bGi9Pe;i-T`ic zEC6^Q+x`Lk`Pv)^_e8Ex4JEa_oTg6)Nf43rpV?h4Jz{V_-CEi&m!oxhlX3X@94$?= zImsQkHbU(^@3}wvd>j(eIE=A1Nn@{)1p%`lw75SCX-Q!{_dD(eMn2m@>kw@2Zfn&{ zz8g`ixko3PP7hLR)`+*T)C0vqYFe`?^SLgO#fsA8GFiY&i4{CLI-u; z-t5jqc`^lb6vXG4K3Vd`D1#`7J(RCVrmoxy%p7$H?DL7~!r1;eS$WX85E1yIC6n3} zkx>Akwz)Nf4a^pPeI)?3n!uG~K1Y|=Ma3`KXz_an@3NT{IeT0(oiUdz)Sk>9T|o=h zjRC~AF;XV3D?VOUc z{qAiwBBGdSk<<$PJp<5F3bp0>gwg%V%yeNeBi-v3NXhdAKA2eR?Yx(fy?RDt-#FQe zHAAEpJj5bzS@?%1KkD$q+$prGDogqgO1#0@tWybTUk7OPQMk)GW{ zYT?7mQ;4%@Xq>Ad@ul8}%SxlL~6V(a$0NrWuDo`DP1D{_X_lOE( zTlc1jhKZehG_P3DSEh3icX1%$bMLSBt>f|)xB{8FI#$c03Ndj}-aH`xDNCmA99P}( z4$^7B9NN0W_K?P>tDD$HI0#JQ)@icJ$;AwxD;ZLd7u>U@l#&?*2^j7-xwTvYST24D}^3!F^HKVF#KxJ#;vSii#FTCm@R~w)Y1h)K8iX=+Mxo50H_O zL;D{Cf3SF)`xwyHKzk&a!0eptR@lJZ-Yv3Gb}=+G*ON_D%Elf0SBvI4^a<=;jf7F!pE{CwjkOeN`jlTe za8ZTapaU-ZBnyA?ygNvx;|@3*ZYEj!GRw&hDx7Qo9QWjaxUn4bf(x4h0oq2k-(1U3p9c#OFQ*ZpcK z-ra7mXY!{rkQoFm{K~aZ5}Bl4Xn^y7sYN8p{LXv0#06TT?RLg2bxwBfuN~ihAqF}i zhe6niUw`6Pn3>u~kjUa%C#0$b9E=D*5qpVx$eP3x5!tm(*7YOBFCN)SFowt#f6e?& zO=4j6Dd^mS?L8+ytedqlamqVw;xNC&uUq)+ofhgC`bg$(x~Wr8B#>-@xZCWy!(Pvw zn8BTXnZT{_tvQw!6A;ibbe?#zSi^5Ks_VlkI?nkUQGH=yG8k`}L8wV&G+Y#Rd+Pc3 zBwmH5^*eG zg2rkLxS%l_IG%IK6hNDg%DPgj4}Q646~yUAi@LM>>0r6x`TkMP#KwF(k#*ggTL!%8 z^7FiU0*5KOA+>O5zkBEO^gWFx`O=2*N<k=83W@*^!;bgz=5*18w+3TXnSzW%pX)>&PoLQl(?fGEzWxQ-+V7G(s$)R$(UdtOSnc~Ny+AT&{?sA} z-81~)Nx*BTeQkGTkaOtt3pDGjJS%dpNVwl14u*c6gNxI<8Zici;a?-4EoUx4s!R5X z&+fKmFST+Xi%aC$VbSwI{^82~&sJj;`JV&J&6B@F$AWgH{`fj%RPIF=ygeqP_9r4| z&2C1-LeXN;Q^E}pG2`I_NxFTZ+ihz2g7IB6BMghig|e$B&Fqw774?hz)B^=LkoBjT z&*mq(oxJC|w6~;^X1#XSbbj;%fIV&9C*-Mf2!z?|`~_Co#*p)c9n9^y9bf}*b`C`` z=^6!f2$-7A5O*kCb`|BcGRVJsgJyLK+8Ebf-&|;>y(Iqdh5Q}(znBWbrGLK=_2n)! z{8=Np3MuY1kS!$*5RL%FxJATXrgNqEc){C~bjd5_0DdC z`P5dCab%oN*1KNT{6G#Mq+4e>GV|_z%YY!+P_0&%#onyi!Klt5yK!=qPN@Z(yJ&v2 zo-*)L8LXZ>dwT z088m%u4U>aova*~EPew^_T!riX=H3#HNvh4fdWOH4R-u|Hu|Xcl45)<;Gy0Z7Mylh ze_^n?4!ur4}UCN6jsAc-;K88(aJ}<{h0=( zvEtY&>m3&O=GOHSHO>q9bc4Cby`xS)_KfkZYY&uIxbpfRtE+>ePbxe=am3fBCi&>( zHiS_Ld~cK8Y>ml9qwqy9;k1JZ0)&TD3$-g8OVZw8c)kv;gEML))|mD`OMx4oeK*!4 z%cC!2pz(EB0^b@N^{kyyEzOKTD`1*8sHK9UALMzyQ#3iqUhq zu+R|#FW-KYUJ~%C^1RCkbF~~ zN%O0eGuWKV8E8S<72WbtH-Ri$Q`oY(ABB}LQr-aN2!>PZ+Z%$8RNfw>cAJ~P0jqF$ z!k3|h_%u@-f>5`Lzd=)ySSTkiD`lbWFPmGO6EdjzHP^7btOK1nUBtWciAzSSV50GT z0Y#>~wk5DtK5)b~Z54p24lqN2l2N6(oUQfyQQFyKhKXBj)$s`>6I#r-Y96>D z(qwb9booL`AS!Bw$a!&I41;oJ0BgjnN`~>pKbOd@Q-jNHw=i?SJgcaC&nXa{iWjS7w|?9h#g#D|t2SRh^u(z36y(p3?vc`5H!L^`O_z zc#ug+eCAVDQglw*PpZLYZQiJ%-{U&Fj>5I>Nf8KtEdUxS&hd|b9>%>{hT#mrFwiZ-k9}0fQ@7FzGjxsh%N^G{iPn0#8 zM#hlcjhEksg+aT{SE88&?V>-YO^+M-Ep!zXuez*@24R06nkNXxcv=4DDhgVo;}uR^ z5&S4r3q3dM6DCb){9d_I@^v$A`1APV2Bi{J3KjRg2eVa~O9l$oyU6`$`#OGrNx98d zGi%m#9yKxCwOjt%(gjI}-$uQ(eB5ZD0h@kw`aC9DIpzHHhWhS62+*=`6)Fz zx)muqf*Ij^ZZd>aw<5o-o2*QCAQLpQAuKdJ^Ib`-?KnP9*$A3a!w08a=;qo%ooW`U z^Y?{VkrnDu+ynce9uQzy@d-#G)W@S^L<0I@1{Zqo``po~G%!n<5oWxE&e+tM6^WzY zw`E$SeaV_1%ht@gA}YFeg`2Q*iAUh!E#*OAx~aQ3H=ufw9-W=*Gv5sKHyQ00yzemU zKk179PS|nxr>!uz^PU6{b1!00UcWxQ!a7sJ?;b5J`;&ojn_Ss59ppJR`#P#Q1{(K~ z?>8D{hOk7hkfTIO4orn6a}Q6g&fsOvp^J3R>ayQ}+(NQU(~*uPqlyf1 z{iV{_J}!r!ae2xB5oW^k3kyzu4Ie+;IR5oZyTnPfZfuL4A?Y!0U4c5A2FFP)0a5;xTbr0fQ-atmz-WblG1#w{wlQRB6 zH!AX1={fZrPVQs1!pV|qSN#||Nk@r^+Y)dKILOK83rp@kR^9quqy1E!mlO{hL@Xtm zTq^D)Y`seGl5*>)j{1Pa0vdfy%_a$UH&?*j+lF zSyF(TzX=f$*X%J#y1jLBdyosWGDk?^li*F6_Ux!{G&F0QL-o}mdgVn$^vt1$DQycx zmTDFieoNBz=?l!#{-)b(v=;)@AE9WG}np8+VNXJ^O%S3U`@ zRxLnMM?!z#&9cUrk-0TyfGQk|dLKBxj}`0U>ncB9f2KqoK0>=5d3pyia_dvykV*ZL zkv+~M%-1#gNQ}L>G*8qKB2P>_I20G3Y=cBiRh8Rv-mBrF^HmoYAVG&Q4B6T}3wAX0 zQJvimDq-c-8{S9iv#4f4&!2tBJ{tvusro&iB6BS+@GhSTx2>GH4J|+i=)Hs`{%QZd zL`_9CX%_6JIPuj~7>J8^mwYK1XqrK1qn<2E@{w$1bvCo~2-V?3&T8|zteK^TFjT+7 zt5kc=(t1U#mjhT0ez9fc(yoQ&YVJUSB!xV(+oKjSCo{Wk@$kp5o`=@Eg2K4peVB{y zl?u^}lu0mAnA;qzvxs=yxJc)U9U55hr1=Zb04dMsSR5P&#}R@IS;)OOopGtLhViSc z$>$0>?Ok0`UXA#}zkgYk8UVdRb@o@MOq_R0YTI^d8_%7WHLqx}p_*dZT7%=__&5gL zVH{lyvj?n|c>}lSk9(6bk5jD31Z>VW1)|S{w%p$@F56%jnb^Dq?5X9YnCN{6|DZ*J z4&6ivwgML<2PM0mV!aGw{)pVCkT4_}N|qrb$+z2H>KQXoi5wT6rg(KYok_ga%Gh(r zSq0*Q4?^04^5v*VYttl))%Fn-UQNSXVnk~h$PTum_`27x_ngql@7`V++l&gd*&|N2 zm|R&H66lXkGMnpCZy%!j0}cLU7!~d;pS7KJbvJ!tJ7|l%Du!!Q)ltvy+t+c?h*gM# z=B@?JppUIMs5w}1Is&N0Z6l8!G#At$L?fR58!%7?I~F`ewq};NALYLkR3E}wXX-PSg@R5M9if`eai_{~t3 zN*>wP%+M6s4*|$4P6a6w% z*b+wl(~Z)P4*dP^@xbGBsPbhL{G1|J-|8?uOM!}CyWWHz1UYEh2apz(|6DPHE-|`% z3TDkVE){2Rw}N#iBLwNM5&}~ zP{-TEJ4Ks1=*27OVl?6p)cu4_3=SUC$?21tJqlx=^|l1KwY$U-^B|$#A0A@Lr<-wC z@N|&F>G{!zcr4jle9u&ZG9~0V3(cr8U<|GE#GwEELta7S+4qdJG>K$o2_>ccQV)Ep zd!GfWJe=R=DVJmu*}(oT9d$968cy~7^R2}!+q)7JLmq=10o^d6dqWVBX% z7&*WZ6EnKas$!g$p3VpX9BH|o$Xo6;wVSt2MQUnfgaK`T5F}lO-#hT9kd~EwbB_fF zW~)PC`CKCw0@18&uub}jN-Xmxh#^1Ziaeg*k-3;siOZqLcBy}M$M8c!ybn|kuM8Cr2SV0ZxbQIOK_KK2rO-JrTOG)Xhv!mn2YuJL{B_>{o zGEsaQ^?eRT=Jo5^y|O33COtH~SkEw6AR|*ULAq3rWXtaFkK7=ECYE~szD>YIC}aFq zRFssiUfZYAvBg)hB>p}@8U5hw%iXoxS1R?cdJ6w$*ie*0ASB4>l~is(D*NQthdu$` z{`EAyqEW;%^5-Oo!|1saNn^0p-}6?Vdio(EUhG(*mnof_`A6F@D89&LJKKKvOC-Nc zOib+92PQNm)p!a!N9?aWd;NM5>!J9sLA%=9U`B?_l=$A&MUKJ~yDhDdd$MX1&?bO< z5h6ifb9J_c7AdR$LE12@pkSmFOCb%SN}j&gaLLl$9II#xKi@-1Jp#EaY2y9i z{m!m?y)0H{^_iQJEFvu=HiM2$80B;^eKSlUd2(0!{mpF(gjtkZeb!ujo%Er}26+%$ zc5$Q{sb?5d_9CJ{Ji=3o6=~?Zx*ya*0vs)dNFBv6x?Ai4&j_RWOt|9S>(E|i=U0*X z%{36T*y%6IL>E<5eyc-C=~h<8?ZW2bepJWMo*W;8ehlN*NgIxIN+i9@;pW9#48718 zB}9@?6W;ppJSNgY(XcCCOvTdl%x|$1b*#X#up`+K!vmUTjcI)bVab%pcZ`t@#z${5 zy`~b_h%_ur*b6N^19*$bcuQ)DZ>YF~&Yv#GEXXG64pY%qX)OVdio2;Ym3MlZ6~!t$ zQvEt|N9*IrI&=`QxFPV%$<7?A*gW{4Jt42&6P<8EfP)|=isqkZ4eGdBghnktXs-Nd zGg3@iREVvoV~ax_vF9!9@B|2Y7rEji$fC8AGS~E#AbSuKkK|;FUI{;>PH_rHcVZ-X z__&Espv5WGF$b|C-7_1T+yNnE2PTv<5AX14xYbI_azfw2{>Fi_X|2zi%}5Av(5-MDt0JRX%aFZ76`5^qM84g;c{j_=}8SVCI%N}2-LF!-7Xxj~aNDgDC_y%=|otT&tRnLuHRaLd*AMNg@ z=m-J^0kcj6o9{+ySg>D0)7&q1xR#qJTK|Tm0)p(*>)Jdzatexq(xd5V5-e_EUFy7n z$Lfjq?+@deK(eKi_togo>Ejibvc?H~MAeT5MK{});2m>SWT>g3j5=l5-kzVf%zm7Q zhewT=OvdnU+zk@b(t{I9YOXtRLpPS#KFTv!T>4sE{4O@FHs(hS7ZU?p+~4JP`#x0XkA6{qorWX?K!NC3s1jVS+)9|9RxkE8A>BqI*z^!B zW*@v1lhBWY%Oe62K%-!pIVj-GV~e~xAa40-119*-`w<%c%V{DfCqe=@INg>832zlUA=5o~8N}udU3EMCq=)fwJ zNWFc~Q%~!CsP#MeZA5w~`cYCNzw)5V4inI$DBpgsleJMKtynJvJNiYlnP135{1iVn zEvGlhuU^TnT3XzHFKfFS2f*3#s(?(nI>*w&3X^WEm3S6hYU z-SL;#ikJ5+blETZ7QoGaU)GRQL2~I4Y^WdQ-&B=aXQO~DhcHCQOr13uJ@KVhQ#)vxATmnQDc;KbFaJWWmL&lsaLRJ?P*$4&~SVcmmXpkUl&Oo2A zZ+Saa+IK}oZTJ#{{*;Q^Y#pz*@P4|WprGHeYNcKn)j*C_x)>}ok-wWA1b^rV%`-#t zyvfT8AQZMJ?0T7Z|L%Gapj2`m*f9cSF?s4|iR#2D4m`9Dtxi@*W-gms=Y?;W9CIWW z_`FRB_K<1SR>)BjF}JjYV^zq_fx)-vH;+(vK`X&DEP#}qscEFSv7KoFIErPu7?9A} zlFaU12Qz^5=&GO&II(>h*8~JS7U}ua$1fo+McNQck*8wicrcZnig9MA*g#_@@d z9F?zE&+0B3{z!rdG^E5iYg1S8@t?P^Ft8Pj!0}Q+`V}uUwmgW54JLiMA4SK$PT&}= zwBn4&Bv+6;>agzJk8TKmg!Ni}c`yqb6#4ME?8_r1gi8WkhA}mXAOIG*T`2TEDisqD zNd{oso9S;ehhlNtiilqVgyl+Xfnf$Y=uVglLNaT>n1Ed5E3C#zclDB4XXMyQ@E8dR zk;;-0lnAR(HdNAm361x8A)jlM5hTm0=qF=?cpn1mq*x|*LZl$TXWLz!mo_kSy~E(w z0CqlSSLBeS`XJd2k`JJ)u@+dDHc$fQWy8zEH@hoNL^paZf%@XtjCz##hF*wSbE^uq z?%dqsPptB*1zj#rmD-O<5N->5s%&|9b;VPlMoKMVpb&E(VPmoK%*^NAynjpmoqAtC zYyETO`PodAP?AjQl%FPnJz+`2eY%K7nFHR-F#5Z#6xGN=O&y?W4A z1AdYm>*8+yg+b<#gU^ASKsT601KY;(UGx^HQJ^DvcWMi0m1qf*r6_cDE}H;25?yjN zWlMrL>2~CC-}{2L`#kd`NK^r)?PyG}{*cL#I8n4ML<$6%fx`ZB=CbA!CKs+ndWpn0 zGMbO2q?i@SrLQb5Ej8p|l3*gRcNdpggVsdd5XD;%dmJX)aHC^EC~*Bd1@%Lqmyzv|0)#>CZN|1!sKiekSeQOmu>+M zc}`|*gw~G?cLNKHL4-lISV*<67b}DoXn>#9jt9}-Zs5E$O1pJ2ga8yf_yH31PiWA6 zX5KpzO!M@S!VC;4y-gypY!hc1H-%hO3kjaK zy5t#~nsUHTkOi0rmK7G2sUi;(YlGe?TN()6yzfE$mtQ-`@u{(t_@-u%L5AUmo!{`D z{xK7~?|H-wbiy={&g$>8z=h5cVvl!74MJiu=Mc zs$wecj8W~~1+K7v1I~Ol#-X27vC++)_9ZT^Z0FN3n;g2BWFN`BmoNzi;!6!_Efcf7a{{5f(0vg5N`zn(gW?2UZ z0n4Q&HtvG1HS8gw2u?6RdXO`(pl$-{jz6O8qhnWAz!?LmkN?t4dfw|{4jC(IE8^wA?$Kf8QE@j?}{1BTPc7D{ElS< zBwmG1oaS!g@e%!Gz$U4jgD;^GM8KDHR71ImV18l<wj zmjTvG@w0Jc3^qAFYZwRvCly~>ake$LN3dg)5Jf-yn}xQtNKxMV94>oDH~Cx3O`ibO ztS5F1cSI!IL_6kyss-qfeIq(BJhd|MYryo#L4j4u<{EkDap${kht=Wd%1mFt-3!_X z-I;nRTls(#YU^h0AwlO!4_)pSGx6}?mi5y>4HL+@D0L>!Vx?n3NtXh_k0QgU=-u=m zVP9O}zp`;_QJBB5=u@33MrO{U1L_hMCZ;#YZZqlX?E1)Wk!#mx-3EXe^kfeUJKmO? zKL!T1-l`LltqNEGm-8c_3k^-lL6ew|pFX{5W*49nWqiam-t?PmgZdqKX%TM>=np?8S)u~=O2f7(%<(~sVU}lRW~QLb$KKC@1CL&Tf(O1P+XDLI zuc6`0Rz!hBYM+lO0lv-ZQVBhw;gcDAzXNcL2&}8~f&Y|&VGSK}Y?daft0ya&fCh6? z=ImMY-3xTRp!p7YD?c!b0G=5X#dxpK^WEAgi55&J)RAMj6@lVqYj<2ewzqQ?y%@Ok z)XXdkb-cHVHzdnx)y2?D0B_e%<|m{^+ND#THS(-y68Ay+u3ZVT;$w}4i$nJ#I3Y85 z6}F~M@g`VF8a)Ggz)b?EPoOKRraJ>>%IAy>Eg0v_9ds05x>BIH)?ESTacax!iICqh z)Xn`^ix)slU3YvPoP9K=L9}=9XN-udG&(b-4~W3fCBda-0EH16#nznFc!n1Hxo*k= z2RjRerZ8-JGV*mk=qlQ7I-SXoV~IC8<6C-~r#g!hh~xjjdS++gBqF5H5k( zR)zZZ;3k^hTdB88;X zH*y82h~PyKnsyPhT!+{8EdceF{hAC6y|jOGOrWT}JzrL9GrJdk0F!+ax+fuC;d>0+ ztO8I#e2PO`gdC&aUnu(hwL@N1GBH}YPgizUUEOy248(0e3@R={4yZ8=+-n4dJyWlw zXthTQ>pS64@6;;~(=9SgrU3pe3d_iLsEFZNvFdN zpyVr|phbX?D?$`e=y5=|Ru@!y0@xOSkrI2?_A0H2M=r6zKb^y0_Qa=2dYrA`K5?0N z746)yQyGHiU4VDuTX@ntaR2#PARev(sPhy7Td_81$D*G|JC0co2FLM)u^#S>gEVsHUr1J06$a%);q zD!A)q&&xB6nVDO^2EVpjK^x<~l;GhJ-e1zVuyga0c+2}I_=IQjd>f{~Gb~CK>#4{? zsC(?lRbM~=Z3^;qP^&b>2e7M`DG(5Zd>hVs-klLB00KrlaO&vUj*5(O>|MA6{a=63 zTs3ThBg?CK1!~K@Qv{j9`S=(S8O>|&z_2WoJ=o-Ek(j6G=geCSePMzZ)dZX@*ulY@ z1p&4kCmYz)B@^xq9pn$}ij9^JR5I753{=JOR06Q6B851#bMUygWWjSyH+PJO04^c*L2DWXPFa4ebI_M$B~U1qhdS^0GEwh z(zr8KYOQ2WZzISqp)sJL!iT4XWHceB8D1LGTK1zYokeOrU_w@M>RWGVZ;oFnQaF&VZQ%PZ6Sje2tNbNyEXbzjY(o_*6*8T3p3_2$*>_;JOUiPY&_Epyvg& zslo7PA2f4nM3NMm{e|a$9B+to{8*xu*5V>;OHs9o%Y zd2d@m4;pYSb&p!nBL{8sSDvNWg=J-adYq4)w&eVw`T|vYgF+9x{k5C^4X2(l{oxPQ zjlGTBhTHV%!&@KK=Zoorq)qb$MX2{m*=+T~oqnUBO5*8-iSsv}p;noyzsShvpDEvt4hmO#0A5idA*6<)==KSat7jQ-z=-EEx?umF zsWcAxLY)zJHURk`+*AFP{?JfK$?V%_O5hIuh!wd6bml=>PvnaWf8lO<=BCA;;{M6W z^jB{P<~u=p_j2M;?hm_3y(Kg+uSd0hb|>NdB75u0lbJWMVwP7v6dY>Kd33b>__0Eg zQ>D?hLSlCBN%9dYe1aM|E?OhE+)Bq*K7L&c2n`>>ovKh)gj4Lo#Q6!1&yg)VS`gfk zA8lm!OeZtG4vFNRmydf12*7((_ydFv3SFK=p~GhSgjXn24nOd!9y*AC`2hq726MdY zl$4X-l_nnVb0(zQF-ItZUx?fJnsKI1`aS;h17TIw0CvrqtuL?2p{TuUd!nTm8Y+De zEzON|=Rs?fZq-PW-na(d6c%oXge>`Hh13*&8ql zDxL6FtA7F-_%C7S#NgBA5%wpA|R z?`teSBi6WWtIOBgDA-rzwN?&H&0F`+fF}WNA@~{}Kwr?}eaH$5ct&R)BwH@LFI-Py z-IJ|W{+{@=+RuR%6g!2=W`cslrXWBa)qk7mho%ShJ^|8nk>dcv$ zsp9AF+Fvl>zJRI^G*iuJiXiL6bNd?>aY>+NyaWfo1BIsX+qVZHdAE8w(5|k1pO_9d z%j>6}e{u6RJFP0^p5MMUrTG!}1p}+Qi%lTpbZB#}#)TgN47+h3$mc0X>jj`xZSaZ8 ze1~S~DdbR?ez(^JD=U+t4h!viPAT6#dba8+=~1DS-~y%a{7l{Nm=kt~WY=g#Ik(X8 zHP9Se&^a2gG|6?OA@aRK1Dwqu&*rsLzJ_+c6EhF_5LZ}S^6lLP?{26oDJdP=E=H)M zA-`%U{oj5GrJDT5J}YHp45L{alvj)2>K2D`sCRZD-5`?!{#BvlfQilFE?0c5L#4JE zbbYVE;1B}NLtGw~IlVGbEexJK-@e@RZGzUlq?jS#b&s{U&{Hk;(51lV*262by~Y&;M^f?HP*X#A7i)$EiMpVIf*59TJj*IPoOfwqozeSGEB zMrBBa%M3p)wz$e~dr++4z?^&ZdyoU<5%8)qfdRnnd=f+1TQ2}|)8LSpg4!Y_wDS|N zD$xP9VdDb0#{%|hvK#4M;k3qll~xq_`^**HxmXhfy|Kka857)BdqX<{L52l;TC*wm zCb%(2n6x^HvD^MUsF$gVDUuOW7-O3I2QYK2O>%bcH=SPxu;f|zPZ2_XS_ zm}OV5YVJh8SAZ*yr!e}F$9=6W#;gATTkT!MN7jSzU7sTl4~w2$Zpe~?!KwefvK*4_%cu2$B9C?vJ@D}i3`_9$ zeJ~mK{OH-2#r}MPqy43;0z zon*O4S(!5*9(G}B01*mHiz0UtKW2(ZgBxM*_ZT*A+a2VqYqV29nN9IF0asBpy&K@| zDDc_E#^eO05fhEk=9U@W`lU`^Yb^NB&sBHl}d_=BX@KlrXY;E8L;**Hlb!JiV2}2nM3Am^UZEVZ_9AX4~lqLL+eU5uH>6${UxR3d|Lc|Qh9-jlkL%W7e_+J_^|~d9ZVdmAs~wG3{Etf}43MM$ zaY;L&A<+MEMb5x3{XecqwAko>{9wfF|Nn^pV@MJI|6Bb3dZPX#Df-v^&t#BMP>}TU zx~STxYHVhP%`V3d*4)u9U;k@;WWEG)4XU}BkwY|8&>QAI$JBqV0|F7B6RcLHc+~ES zfWyo@2MUF{TsO12>ObEZm#na&NqOH00|J#?GPFJab5(KNKj2o37l{TxXh#z6q9VVI zii-QG?q8o-^f3!$*jrkv;Bf#7mwo@K46CJJ`q<@vFT0ejTlDl7exLmcJ3YQOZD3>+ z(Z$Ed*IbzVn%jK~0lFN^tbqUg3<80LvAMYkE(_m|_d{OffBbm;4FRcjg^)bC%pEwZt?db!DU8V0K0y>t4a+j{+;NX-Bo|^w;*gOlo z+4OVcZP_O|1VY_-DaHl!KcDL0fo>~*o^HeU?<9$d3CewA=pEXF`}&JS(Ke_ztAP?nWg_EG8A2sQP6SKf-a8kvD=KR@^?*&rXFX)v)S}>L+8HO%l&Jrk$)4-qA0;A+$R8 zz^4<)IA0gGpGv(Z{$Q>n-(Ey3S=ne{xpcVX(6gaPGf&3^DN|Ej{su$pG%(^KH-FNkWb{j zaP{h5fS3{*%g9i82w4KZ@BZtKB6h9(#-X8WFtq7*oG^m|PznDhmf$TNY?3&{TDzrSUs;gpAE&H}Ew&=nAN zA9+l;4VsHtCyAy;LTVCr$taAwpbtXK;drwDok%If??9;wqk0S2Euchw>Ldu~yG$&c1tfh`+61(Gugu7S#4J$tq>zV7Pr%+LBiWBalWliC7*TTnS0s=B4+S;E=n3$Q#jg5^{ zT9*g&FiA*AWJYddJLl*;(a}kH#;sW%(Yq#mcHd!=j#IB92eHud>A@Uec;3*^kka~z-&S>Yj3$`c*yi z2z-nzVFWm+WhZ)K+ovKPLLuw?5~TKw#r#Y zZw$@tk>aZOy69-K(J|}y z5+P^LkHf_GHpE|UFK|t({9)|*`!~%3y*KM))yNOYAn8~cwCyq7T^WLNTO!hIzXU^f zf`JxCoLqD;_emeIbt@3O$v=?)$$at^F_OGKR-Bc^y4;_o|M#x<%X|rGXgGrQ*PG+T zU{f*vS6GV1d-Uj$&B%!;L`o(PuagSySP@GJWSLBsx(RIF4pY-i4cz4&(T+Q9uLM49 zZgbU7#TfdMpeEdpIqv8eD+fO#|HN#I3<+ua*3g6q=P)=R828+uVf}O)iH!O(**nMX zcTkcQ#rtECev`{&a;?WXBs+<_h8a8y_6 z`G>F@BjHE8E0(nc;Jre5-z|28LeIsetioqk6`8BbkMFeHq?}aHaUWS4mjjviI;qBgpHl zSu5pmicMqGVYRJ6;6t(<4)j%gDex(N#C(np$dJ)ZNlhJ?Kl{L?`?g#v?A_;pUP@sf zhJ5{M&Y+)19#UBfI=FZqF9n}3gq-QJ-R9g?av=SRFBW6Po7K=CtZ=8)9Uz6 z3J;}tL-_4TsWm**($dnRxWi?bHi&TH`}ZeDqVbuEZx06GQ$XZRx;*{p(zV7BKK4=r z@umC)6&39wr%<}_^biV)hm5eUn8YnC*yxp_+{tNiyrK+U9NohSBEBflMn>yatt=tnM4RM=N=!FAo$>sYm z4lW<<-Bi!SWrvo+uV2>*`sL*}H+MNA`1LA16xKj$5EK#;cy8@76&V>GUSKi$`*#jv znPm(P27N6Pl`-8MLh-jV^yA~U^Ad0HKLelnPLtCx+hrjVPBER@TN7p)N!+NLNZ}W+ zF&?9e{rEB3!c$i5^`%`H;4*tIVZl=tB?$ye?&8XdY4^7aFkvPqlbaTQ+Z!b_=MqNW z(i)PrawQbZW3J~Y{T@@0nNWBU1Gd%*SFS?Dh||cB5-*IAIkI1=3O#)rQLI2DS4DzY z#i%RyV|qUu@HV!P!hdThm8_!j@}}bSkj*9YRIFBLF*7SB2B!vI`v!^V3J6|qz8tU~ zMAA|V&$E}<^ysbF-nNzsqYM*vJ;C0D{~;pX`HawX@QBi{-V16G6%}sy)t=?Aiy1HK zN^9DxfN*hfK@KU9g}}}M=GY-G!qU^{sO$US6<%B)CqXG49~l2wEC^ONbUZjrVC{FM z%K6C4!enS@tP5JI$zPRGgDcEqrO(zp;srew32(w(^l$ySt@&|qa4>UqStso|sVp`F zV-iIUFy7EtuRbIb+GQ_@>L~ei9ONN;IYG7Gcd`(dmzOUY|DaoLXWBWko6_16N)!65 z^OIFAfm!FDsYgV2?O)OPoVF;4c#!HbyR3~@T9;eYgv78w>L^>r-PS1?Mk7Fk7m$Kl z`4ZgR-%na*#k`wk`Xs1%tIExN`s|eM;b?0sg<;rHjr1;AV7N4`{sB!r@vrtVt*5Nc7jBB1==_LwIJyI0Q+nc(pV+}UI!e@ar77Y@^rJh~ox)My(6gX`d5nU%C zk!UiNlCE9#G+FcayHB5ji)NVNbRszi*yorj#qHi|u5jgC+Sv%f#;0Hu71ejJY3n;?o&+wbnT(95n0o9;)Ty`+1xsGZKeeeM@*U(qIkI9YwS%JyvC6c zogC+=^%37m!a@53O+x!$#n>%x&x(iV6d|jNVo|u=D+o1#MQ^S~(aNoVUeMS;j`_7K zv?7Gnt{Y@GJWmdAKXB^4!k+liXGIN0ly~hKZ}sTeY|nR=Badn9ivzo)+9jubDg4f1ypO8tJ(#pdEx7DJ**D%DP+>&_NbZZUpEQ`6p{J0$b|-umxwg}8bO z6rAcF!1dT$Wz{J|A>pm18Vkiz{Nf^IiN!$Kurr*=7LENc@FLxAJ^o3B!{)ul#zw5x zva?!(v1;dl7%lU>0de031`&5+hM>5(IOEeJzV4x+&fm}Q!EIxGOl@aw1`>t4rbqp% zr`45Shj@*RP1ue&p2w=c@J=AKJO-lPA~(=S(UW1VTq?!q)Z^~myBHX7fYao!uWgYw z%u5w5q0|lI<5!D{9N8R!D8pmkmF!zDrjv90>#MojpUEledM#oS3zX(lOedCI<)upY zVti$p;;-d>Bb@p%1$xc1?P}PLEG#TGM=rHp_rOM>Bcst-kU;zIHimZT#!CzAuWL1NCv+ z6r92HO$qVwvS#};H+_$uykqf3@5iVhV>fG*14MQ`PWJXMkyot;OK@#$Y~H^g9n@kpp0qJwP!Ya$5hBqEipuZ4x*J`J$n^+JK`dOOjLq}a^5As5!L?G!8tE&ZJuZ@;``j6tsPWYLN!*am-lIj zkmcNuU(W-M0O>^i`nu3vP_Q>LJ(KaQ7thckI@`eeD8}kE$#)N_=|Y5mr6ycS>`;K-LA7x^xf*ee&2ERou*5PsM}(pg&jTyIhW4g zBx~qN;#*2?`4_#i>guFjiJ~}4N^2a1d(2RvJmM95(e|0xu=^1R`ZsLPgK5!Bm2llU z68*_H;K^bM(eTgCs=uh`9&Xs-!GV=?udK0)BF@XzRh#&FhYOHKb{pvSb0Rc6HdvkY zVTaFJ*r~s&i;Hyb39z|UJuny{fS1F-aPj3} zp3Zd0PjM1aauSl)*A0JusOehxnPhtO_DM>s$NoCf_z{krfw_BMl{33~j;6*=Y!$_8 zCVD}^>yN_|2u1l#4ho6w2nb1cFd`y;N`{9XP4j>|J|bOmOc7D%Px$Yv5E~>Po7=9aOE64~d7BWu8H=0xW;G{nKzbgbt_{0BhLSp9DdA5TpA2pO_uQ z+n2Ae>$SBRn9>TTi{AC@@@il4+FQN;><6i@*4@v(;#a8dKiCrb9_M2F`&(zH!p<+D z#Uix~Mf@^GE>@gtG*UVsVi`}7eBPhCWH7z9d98w-Y6x8C%#(cd8uREqYP%AIg4d-; zsi^~n&o1a>@j&go@Kc`&Rm z(e)XA3+Pnze?~Qp+jg0>KbuL+?fLnu*TdEJ^>DYOc=ECLv1Mdr{7j+AS>)Dpv3;5C z=d4rZNcpt4?NDy}Q z1ML+ZEe%a5jC-l7Ih2K6hJ>7F{mtLiN;vAQTm)ho)8%3$eSO{BJ*@H+dliU?e*W33 z-eBbCS7fq-E_jm939Z5>Ue5Fnu!Cq^VXCfYMi;_8*3kSlo;fOA{O$YMs9GN*R(OND z#Bxk0GH=Ltc#DKH=$0<<-3RjxaIM+dLsv3yzqxw-Eo4uRl9e-2JUm|uJ%5Uo<}6u8 zRgq0eUEw+;`-MR#BBIATUic7mcw_{oN|3?N(a{@uI;E(??M9hfK#;Q-%}kzk9#G~{svC6-I!2hIh@_D#XCMw9Wv{z($k-#Tduz1>f#ic zn>##wzvi?H2i&iekt-`JGrvPuda_J$+L!-{#tdv6z>(7~e@1rc3RQ6K9b-k`z4$|m zv1}$iJw4uhC}7L~)-Dx5K&o=iF}Ac!cBCO|?xufT%tpaodrNZ9oSjaVTw|a=0 zYMotcO>)KyFEB1&3nvT}up1592+aIZ1oDUPpShui@fg6_@b>DQO8 zKG^ymQ{l1uN%rK|S7|I!x6jdIKa_HQHIMy{6K05J{wS}xEa=UG`~0Ys;D`G}+{O!BvV7me-%HReyk28`8+=_RZq> znez^g@O}d&#&0lBSI&Tfth0v^N46R_657~7uH&Z|4dFL)P;*X#ngu#xw4zo2wN8dU zKlGN5ze~=pnNM^>PFA*YHjAfl_vZv%RC};~>)LPELdc4HOjGNr0yH^vNvl_b+XhOB zgQ6^$(u(4>gvOO)IfBk$XKCy!;`dg^_ZZlltTaHHSls@*I%GtK z-Bik#)!o~qUVPR`P{?&XsPK=&-zN}#iGG4$c^z&Zo<}R19H1P)1Dvj)adwAG~)|BJ4$nU@^W04c;5mx0aa@IUkUqDFAA1Is2t5>12cuOOo z@?xO;62Y?RRvK$-@~=~}o+OhRO&U(pN; zgRro!L$2eDRP0?Jo1*XeZBk*RKbMY=aiEfah%A%TSFHD~_qof>&Dv8|lcIe2T=c@r zEX$>mz(s|s7n`J^6BUjmaFjyi5KGyC8YH(ywzdQtoYTVb2SM?vS?}Hv`umHJp@f~6 zF#v{WUtt`JijRNmI&m)DEda;w+%YVpJU!lJ{bxfG`B&y?76!u(sg02xP*IGVg9k2q zDA&ZWP2ACY+ZqnFGcz;uaD@*CNxapIrDYh`y7Kv+B)j5pQh8Ru}ZM zc#eH@F~Wg9qA^y$H+k`;nVOoKjdnS>^;~LZD^FQj9>Xpx<4-})Uk#HrFhziXR^_oTKK+5WCiX`TOZMzy}q7d)z{ZwyB04_~9S0w=2NlNP)9MjXx>B}F{R zS%ZdNxIPY<@03j=0M$X&K)2%Yk*rSm#77=<_K6&vU*^cjm}6cb-hktw{i2_ z#-^}j=HVep@;+nYG^}L1&kty&*WMD#f5tH-QY}x1@5jf}(#4{kofmK8?q;>Q&prwa zH#!bWfSc<~2v{D-AuIhT)C4FGCQi`8&i?8zma6BW{PDuBa4f8fpWE6L5|&wmhhm9*Jq(OxNqoJ2eTM$jN_w5oT>5j2e%h~ za@)Q+!2fEeU%Lsd1+tvbs;9F-Qz@GV2Uzh!a{wj|XFbENATo21fd1%(aKAi!eFP2i$Xwc9QDC!E ziarxL>AGwK-X5Cglu~kbNv~n^t;Yr)X$1l{rm(d^$Nj z{kF<^W!8I7HL7nv>W{0Ohey@o|HIx}M`hW4Tf-Qrs0fluiy#f6q?9P#4bm;$(xE6V zpa@a|(jX<>AT21}T~g9;6O!M$jNf_B`QGvU|BZ3(Kb}WW2G`!#-h0h8=Ui)3MKuQ# z0hOv<;3~Ff`1I-Qw{8R5lOy!HeAeXJ#;9(ch(}p~E$R9Hu=`2(EPwS-e=aP<=i3D) z*+$uL=bbn77`-DE69_c$r4Vi|F5S7n)EEv$8o*{DzfY#o8b$YF9y;jpI{USI*1HVu z#sZX)vU3nXAM>6mrU5DJ4Goq36325A)`yU#B8C*Tkx!p~H7uy=Tpca;fr*=PQ>dA$ zu-hR5miN5vGoFs{XRzfv=kiLG{j~$556rdhjO>X*mJw$sH&oAui z>ic6STowNPyL71rI2q5k@H?Msx%1gWUjC2masbm=wptAyBmhY*wc{vKtBIiHuv9P=K z5c(rg&eVQ5ffCC%;o*!fd~|el&L~huJtBX;4Ni-2tGRe+++)(_LV{7``dY$S2@ zQ30&Cbm6$i3hg)QTL#yg!LOdCebhD!dW)TorgUBY?TfGWxKQVcDcyju$py}yN`v(Nb zyYbRLkYFQ&EQpxWOXn95qM07HwCv9;Ggb4L!7f9cMZ?EOy0?ZNNM@d9JfrA&OE!U$ zpIIBF1{^*ZzLVt-wyK44SA zhPE(|;n?VlCxl!aGW@BcP!`xjfhRH!wzeXpC6--z*5uAEj=q}OMLQA*|3A_~*bGWuSpdqQdvgcX?NaD|N8R`7LM(-0$b%ssGuj zLP`}dWuM)L_1#&`il(9-C4SitcxQ{+I0L@2PfP~eP6AUiso%WIz~KqOkGdU8#o@Lu zRs#T{^P9LdvbUI-WwOe5jxS!Ld~Ep9Vb5y3=;U-mn)`UsWYeI#+vn@j@^UhWfJDW4 zcVR(VjaM+aW&lB zm#VI}q>0ImcwP)acyVl2-%QzYb*ri+`P0d9af3eJ)yo|lt0#f%4rY1_MF$GVC14*m z_OP(yUd@7_WvO1;{QShDJ5#ZRask!bd*5cOkM0AP%VpI(&Bx9{ucmmQ;0}q=Eg`F{ zCR1pAc{+Jw&y?_>_$6v{$6`gmM$X3K$Jgm7PA8S$J5|gH@hih8!ezYDsbNF!alVJ2 z4QFUq*Ih=nqVwM(nF;s?1t`$6RPx|}>h>f5qS(IMPnGLcTeELmr=OAr*QkJ17_h$| z3;(H-`Lp$*at$_qSpGTvzuG!$k9>7Jk8{2*kP6u1fM>yd)rpab5qs+NAW~Q1CI}f2 zds+=Lp7d%JxYjq^?i;`-qCB}rSNr3K;Z^cq96%tPZ;9cw_Jv|fL4cgIj%U9#iYp4A zl0VVVm>qh1F04=f{j<$2oVcQyWw#6O?t~1Mx#!0zfRCyR@*6#k3g^pra(gr6`TgVI=@NyJr6RV^XPmJ<+{!tp|U`|RXbgp|H(Shs)?Ff%Y`te;OBUCG#pAkscPuAF9gfo>W zl7#~!)#w|+T~1Cy1P)%&5|Q`u@tKvk`Ao6)~q6$jHdp zmF~m>8ACrK9<`5XsJE@6VdNW$2u-1jwTiz6%4~0c|8VQ1V-u)ghOYcGEp zHJ6CqyswqnRWox-bTPfPF54>kc9rOH*Q1MifXeG0&#&rZyh^JAV}A9D0%`LAO4WX+ zj*6k7p)PEf#r|}GkOZz@z~!T(qw{^yu&(tp`ledLkzQ-CVCArdYW59|o#4_F{vHi1 zYNeCcQT1v9GU%Kqm1F{^Td@=qATMNV7keXbJqhQ_AInIFCJ2CEAO~S}|G|@lQDfTs zbfz)CfnH{qRb-0Z;M;D&|d8l1S#s!H&NF*Y|b)Qat*+pbijP*xQ69fwKW$8^2MFh`G}Pe5x>`>Ao_B88EGfkC!T?FC<7Uv*1+VRrp} zxs{P>QS4g68~&i?{GoL+t=?t$TnJ(hFXO=3I@hqYJMS5{Bj*)bx~96|9s_o_>MHM7PBX zjoG*BTY$T8$H&HWf%KBU36oTT+{6H%j4_k(3Vi<4BgLbQhEQ(Dd|L#ae?c4e zMLVs$bOlQ_fC2CFYjOb$(NGdb6&x-;zHMpm~azm>9O!5?d{Z*@^1KW;Y(B?4LTeRm@VdOq`+E-!!;-gH366t9Jae zOmgJ6zX8uk7z|LGo1*0YxfTdFoAgq%yp`@X3k40TR7_9W`_w$>qoLu^VBh~G>jP_x7r=K>@d3VL7 zdz`PT()kl#dQc=G9HCIV4|GPZW_eP#5M{nk21LkjD>BlZ2?8x$)7H13h03ZEz;ZoH zONdxwA3RkCmhBHTPA7aviupF+P&kJMa_i>AA$dSeXDhI|R|yCRzILck@bhb<_@q4< zRC5H2&6Kg)!+Xms;!(DQ`xJw@cKz6&VZG-l3 zlp{wz$4ps#S)pZQa{vKq1sxouHc!s}jdvN3qWLZ9d3hUYK9D?c zI1jj~q3~(vU4wax?saE3x9M@G$pK?r240X^ryCjxM}|thPKhtd5cY#chmDUEK%Mzu@fiQMl=Wn)6^x{dDevmHc5v6M6dc1%~zl1=zM`kFW4=Can_D?;q@fJfFB0FY(&TTu}2%w2#k$+jt6RCqf zn3ltmkvT$!hE&jOXk&Om2YwDI6#V$&IDhW29V|mQYv^Omb3qF>Fn7FVC?I?ndW z@_PeH9C59QXD0-)zUkl>VvM~U^w%F!t`CaHj=5^`>6f~sthUZW<1=OzgN;FiEazK5 z5X^V&zYN?0j)`d#2V@r#$ z31`s8x4c>m#NdNtF)l6Kn<8%T{R1oJ6#`}glF`yrG+sU)d{fRhvn{eyp#r6sXCS*F z=FEOs`0ky^DpM#hT~~nV1IwXmK&|uU*;1=<5ujBAmDd0loX;Q3`Fa5@N4?}ZxRAkA zpftnJU-RW?Mq1%7>mf9va1^IeWZGIV=dHXI!)Eo`=gNE{(7Qt6bK zuT#_1HezXbHhvhM!4>;!H5PLM!?)gQjPeaO=cvUW{@nKS$s)l-P?&;8QV2Gjwz+Rn zy^&u&>w$r_{XrciI|O(x&zY1IhQ>e1m7R0z9EwIZW@Ci3c;S0o=;Z0XB$7d2B4Ccn zD|TG+2B}RC{D^=Pqo;!gh`hH5ds(PsvCYTKcuT2c@U7g2gNez{Z zWDa6}Ggu5a-r#2#A)GV7abZ=pQQKlLec`Xuu0UeuE+o)W5Q#>(*3A)!Ta9x zF)d%up{@H@ucCx$wqD=h$5Tv~QgI_in$ExrFc~YmKH;@a>WgZb?EB5inN2RVzU|&k>h?IiEH3k399}`rCVv3mFRWdg0)9>*N zCPDuDA(bE^FSMULy;ERZJh+ECxinm0ywp&fVS0KRpiK&em8Fr7 z>$7FCdlynYv??9y`?G4eo*lgYXnFKXoK~acwYsv?Spkpw&)1WMM-jKqCuRC&-a(WY z+^O2za89Gd3b!bZ$4f9PB_drm0V7QJ`43!Suq(+GOBg|dFLCQ+zFlL#)+Jf_S*ra) zM^LkQzmywfSlWlPxs!Z8YMt@ptakfy-QyTdhMn=Gu^idLs}FWIscFT!YMdrL>&{U^ z2vWQ26(UlrYF|;NyPdX^p^o~Kje>ht`$le)6%gRB$@N$Jj_UZajkG_sy3ct_KGvc%&e$oqKuDk{;RL3j@4SZIsm;ViMx4g~_6f{{_G ztHyqi>?-jCuE#3OZE*~QH34HSZvu{Ra+?|HWQ`W_ zk#bgA{L`JMo4Z!jF-3M@)jWUULVb6)`~vGWa&CGxfAr_D`Rm8VG#5_jJisFz#koh` zcU*Z3IFyVog6o^4=Pq2Wiyt3V<|j#b^9J+=-#`^TK)-=)5)Zu2%E~&WiZe9$UK=Q@ zMMA#*{QSI)z2wQAr1bPk3R846&=;P|kn))DM{d`b|M(V5SZ=>CP{!gRS&_Vm)Np+C z(g{AyFDz{MD0uF!;|Cjt%9L6~CPv23M!l{%Ved#tN$x@h4Z^%|7Xc2AH;>b?T%tR7 z@S*f_nsnTU5yjt54j8%90ctG(!s_(EDi4f2)4h1il8B-6MJ=mXy^8=t`jN*jzmi?jb6pc@bzyJCTE)!bE)uB&z$?^O9 z&R0p;l!`7ZLRYu0QdySPg}8WUS7-k_IhtiQ*I!=5>?*6ZrwpKc|NgyM&bq6s^QADA z=LvflBcHYJT;#os# zPmJn!En_28Y~`C;TQNXuyPoq3HTR8>*LhzoDF%3!R+j_biPrZ0^q5fM++J`fkoY&c(Mdwxj zgRtB0ixkT3go~}Dpmm7AYtWpigBPx2Z(L*1uEA^M;~QsRV@PGU98t@96(J-|#Hp0k z*6RJszDPn%yst_#v-h+YYzq3rJxxi<#6X+|LzerA*K4T&-}^EFWIl_} zA&Q=CnjZjke-RL1bG+A~CE$L1pgeoRtc{mjtD2*56GX|@_~oT(W};dOy95gElarH; zJ+IsT<_hvu#m;V}J@k6i^4s&${RcJL18(ZoYBf_R~9g0Oa{5-MlJuUFUA!zFlN8p;Tm98fJ(qUFEqN8p~;oF(Z7Lu;WeT zk=$0>d#0CQsS7M&(%EFm4Wvp%1Fgh~)%xU-;25+>k|bn#UR@m*-YXUPy}eyNRl-P6 zlQ}YI%`B}Ajw+kkW=z4c-pAFk5+NZWv`;aXnjXK+Y&7A@*0{4 zyk}JZ@`=P%*TUj8m@NHERu#f5k^(>xnt|yQta9Ger&U+ld4O*uHTNw7v0?~~zGu`5 zA*S4Wjy5%)Gpbf*59L;5^mOWc8k?~lcXrO1H z>MIoG?3N(Gz`(e{W*GGm4^9fM11yr)h+~5LvES84O@Z~X54`AQu{JN$EU-zbZD!5aiF0(b;tPPd}Eg(R@Uyz&hlTZ4q#FrQA z>gyjZcq-*AX{f8~4|NGX2t8vXodD=t;o={rfmVx{)$a9TLw5i$q^X;aJ5p+RUF;g9 zTN@^Mo()Aa{W)N88>OYCx>9T(=NzV@WPy2{_AZCgD9D|UZuq}VZlP~%4o-kn=G^%f z*RsKf2@`xf9G$3)wDf(<+#tYlcaCZ81q}&Hz0t3H86Fm2<>%!c6P{h@h*PZ$U0gKL zEVom}&QqzThZ|`6)@V|JfKN6Gnh!%6#c~(+l%z=$Hvk3@Z*J8$XCMjj0c|9H$WFoTk=xVs@Bct<&0A>a$wNIED(HYAFzV8{lZuah6ms zNJQ1jbjb<=vW08hP7xcqoPY359mPkPVsxjFQX^7bajus3CeB0}}t`fy4k zeIXu`!i|t?^@n%coC7U5E}%VSAHrjxr@zdv>Va;%N7S!;hbN80&5ei6l(K!Dd-VH^ z`6^mhl8d5YYnX7DZNX6BUIRN)blF4m4;L0c8+Al5*c>aeW_b;{oP4`)v*f8HZ9ew9 zcKhBvg)IKOea$96EOPYCk>XSDoG`!SrA|F_^C0RV!oZ0XF2|MgC6<$C(7@;>u)8Wi z%hlXU#{+2n%DHo%R3~wTg}9gT>1qA_e0-*N<0{SeZmUG6!i#CYZ`Agl4wIOeSWt6i zKKkCE^%&kUX$m7ZO-_d5Aq$8~5XiDtY{w(h6@=5Knr8D27?de0s z#l*fq*}&#(ODJAUe?p6fIQupzaJT5`)wB3nKq&=Ivh%er&74&obobte1leXUH(})1 z-%=+h+S zz;u7)hh*zLsj7L}23z4vW~9W}*w2A|Tyzof%02KJ6i$)_+OIgv3TQg0PRc@!+*n4sc+`>2E z>6LO+gt5K0e$YYIpz!YL#Zq zmtdZ;zdjMppj>bs{8w!8k`nX~7AIQ1uK#R{>-#f#{ggd@ZbvP6)DlX* zIF?#z;**+hAd-kjKA`&PeF3`%yO&oWbt&Kyvz-{Xiprqo{+tp@N3TSw=pIvky-bt0 zl&<8-4^NKnva$6Yav>4-pz&|aa++_~@ju)nzcd5y{|2{yl!=Qi+6{JBMsIKL9lmM- z1@m>4BwO-?EHhPMF^B!H^4+nKOzLck2NOLBt#BU>)J8onu^8@qP_wI3+*Pfi%GXKn z!Jt?XZh{{p8cIIfyU^Jh?*$-DFk58D?C!mLJC(8quZ{~vUVpq@*? zhXmx!IGx+&*9NJ3tbZrYAE!OK6b<|sIE|Q?m{2c!x0{^;?FPR)UX90L+WOM*TXnk3 z=YMkxv%W!~9hiwp&d-mM3n8xY$_FaBnorT4%~p;-C`2FmeS7P+R!7b0K2JePgXsOOLiHi;|w z%fIt@2`v|nX{f3ElY!TGxF%{0b|kIpczfS9LveY?U==ugmJj2fSIf1ySvLQT#-E0Y zN_UT}eEY=aC;sf1wrjt^VXc?o8jg==uaa&`<3h-|6D2GrthruoV`PN`!>Elv`i$E z2-EG8fBeH(!`b;f7*04co=9QqymYyI6ik?M<`ti5%*#DFfyQzP0p>VY8*t&Yw5c& zC%sQQZPq6|1jnjHoRGl2cK?)nKV-`s&3+8F z-P;cysNaGz=I7vNH02}2dTYjj6wU6Pc+!+ykB|%@p;dc$Wc^tEt-@q-NwlS+Aqg_s z9{PU_5vjxgIe^Y0M_jX47}eRxMNYkDo53&xJ07|rI@>jaiiC~5A;V(-J-k(cjSL?@ zHF8raATW?1SVR5iQ@>+lY2u)o`I8gtsbx3m9Dc|3VFsc-vwn&6a`|S}j}JXlEpvZq z%4eIr#rq(AfcQ(g8v__3J+KK0(@|AdC@V`Mn3ZurHB|3xQWQ4|hspptJ{mB51F*zz zQ?Zu0P^P5u9jQJ+hRXXN!X=!O{TwY)wY8ph*$i%#MTAx@p z3VHwD)Kpr>UCKkb-EyF)HSdtV*6r6%d@HI#Q>moi^?Mq{W{JIHw6hFvbbiHn);&U( zPx0TMccA*Aom^qUegI%GE8B)rWjw`V_}m&ZGbr`|LMA?Ag}%W_YB3#_qn~vS6BM825<1| zhxhElk!#RBlS;>xjB0OgCW7P$ABoJ$DqP$wcD=0t#na2fX|=CDSzYxp2pE%+q*B>L zm#Y~i`3s${i(3z_Rdczb%1lO~RQGLflkhE-B9rT&)XJguH#RO^CFOX;Vt(+Xfc8l* z7J-h=V7j$V)B5e9;iae20_G}ieF`OMwHmxP=bS+3A1YmcP7zNX#B}mWS#jZ)eDluA zFZxl=4<{;0P&D_qe5u6F9{zzAukD6|{$m_PNiM_XB zGiXW%M+Cc>5@91bpXY1Y1c9J<`?WC_!SA3NDrYGTn8JN~e?BSkoYs^2Gbyb}mcc|E z58+n|jUwFH*4(#%5-os?(5gb5y-BBl$CxmfLBp+wCe{2vVxAV=XipX4%_>;GuXpH_ z`LhTLdOL&DHe97Wv51ZteGmmD!ChIZwTA0AnbgW|)YJ?rn5Zlzr2AEx934U9*-hXH zoqzp|7&*@P1{2~SeG1X?(&ftpd<)rMN!r`nr|0i@hC*u#0HgmBfEWT0Mqj-23*>(j z&sTZ-B$``msT|M(xTrX?v+o6zbn1M@mW}6)u*gMwb3YvnwX370P$2xyfl(Q}^xD;~ zOe1L)Aqp8PIrJYsyyEQgJlaomP^}i?aSB);n_ul$2rHLw`}N*C!pArGh7Y_TDmP6~ zyf0iM`h-fmM7M=9Z{?vpL*;8JLK!0kQlZZ(v9!~ki*mH-P`j@j%;IYqoSgk z>R%4m>2=DJCj}+oKS+D7yfR$Lz;w8voXS2qeEW9vd7Mm$Bv(oKae!`;+8si;xf^Wf z>*_RnRs9M+QR&C>o|z$5GU{COulKpK#7ijazE*aN;V0z=4XT z@DCcF+Oo+z1GmC$Yr+_iP65TuS1&o!xHc4~`Bipo|7AiclYTI17hHw9gzJr%0K9Cb zc>!Z(@(QE}UAZH3gJy()6!&G_V_)%#lPFGWGN>lPm;qb11gCG$MMx?D8{;&>WmRwB z@2Z2%fxsbXj}0tAIQ1o$$r_IaAP&(t3ydU^bzhtfYY$Zr5xPvBldV>Mxg`YSUE*az zdMZ~I+PfRLzE?@llxxQ0^hypwa(M}0lHgHYgJ@DjGP8f~Ql(@;nohC^`;8ly$i=H@ z3w}k^)(RXQPhMJ>naTvd|rE39wlp05{&GZ=Utk6?B?Pd`H6(YE|(^ld&VXryK^ceZ`B zG-&}yU^Oa4C3_##tps2#kKE^AsM_? zk?4D==$k;|V{qW}&?s<|qL~f+h=KML*X2bT{w6E$YP?QE&b;)c0Do(jO17H(RnmK6 z$tT9`QNGzv3Ij_(awi(h4Vc945kW7#oU{qKsu+ieU3jo^ep2j2OUKeo5?i84X;|Fw z?#lJ%_V3@j%H$u5FNo01mVA{7RJeTgs?d7PF*?Q-G^k0&E324)nPtuo9(onjk;^vW zjIS6vje?S*cu#A&ePF!MwIsA8Uj}G5bMTTPp+@`dq=s z8P^Lz78LSH!6hRLc>x+m?r;R-ld~@`><(tsM&D1X2R^aLa<2ANyrO17C9%rn$bm?$ zH!u9G`GL#U4-w(FheUSenx^Q_^641?(?cmh&5!Nd$Gv+oCqTP&m7YHAp2R9NmU=u< zJh>K+dRZoPo$ki|w?+g-(W}L-@vid`d+~W&j4rD3rsRyg~!0 zT8~3tz}bGGMdDLDkPC$H znr`i)mhRWRTtJgMU3U%3#R#+8+^ol(EW*df50;E%ksQ!bfa|Ij`zr;!U)Ek887bNo znQcBDt;zEn2)}$l&d6PboO{oQWcK_LrPtmbl*h)?qz>e zQ2v|S@v8N@iI0z-kX7St5I&BDoWn^dFs~y>BYYnCqO+r=>v)#2cRd-m=G&8%Yr)yn z1=3u1iPQQdLN=-I#47#TntQ`nnM^?jp&n@#1mlb4ummGX5k-9e1X%=wa^K-Tnp~+2 z>F(0 z+@g&X^jL`f@CP;t2~ow}77f)a6=SzVi(<1S+4|9%qg?CN|0!S~r&?(A?Afz-jbfY? zg3{v zIO;ZGIvO{wCzq$?d4t&k&D1M%n>5BN`Nu1Dmpvv(gx z|Jhb;QU8Ff#8kTM4Q{h+6OFhLuS82?>$n4Q9^>#HVnZIM)n+I%arjA&hB&)Fr8=j+ zg;C8wL%Ii{iBfWMcTcp6)r;D{Wl;k=jpEo{2Oms#k@)TIlJVN{u0YVRCOj^lZ~4&? zcLf-^B}-2)`h3z7=*ATM`O{ktB%v_bR1iPFDTLZwi=nb7*ri|;4K$KOicU-li;J5; zKf8rn-rzLd&p`{+#Gaqi-~w;)!#dFDJ>8l>gy+=jw8*a1voeeBqNz3Q&?De9M|dxEJx9Qr;6^wIKU%c z9s%0!uGfS`H~TS^Pw1^aIHn0pecCoKkIVV|0QKuW8J{PkNgkbTlO0^QR8ig^SLt~P z<2c&k*>0(HCXP{Ysb~OB6LsAGI58hXpNFqq*OQcq3XHz_4xcX8n8*0|phMAHmP4Y~ z_o2=GEo!j^TPRm$IY9G(9t9$=iGp9fIv>}9ec$ouJhXbnn1P+LIFw(l-K^9sDV`b* z_C88pUJ^8$r5+>q1C+RpRMz`;VQaBBR*m!_XkT`gIjNVt`n}9IR)+1x41n{S`haZNV!;D(1<`E6}9P_xrX%1GhT6i<0wOoK9chDSm%rMmOvaccC98iA6+I zxolH__!8DB%=qFC9Pywmo}6-HyioWR`kTq3FlDyJTuA?*6HW!a{VIO2QJ&KL1|G- zEofJ1zrfU$iDmTY(W9M-Ck{N~FX#}ilro*n2l&)DPgI^{i+ z&I{N)0VO+&6Zl|^2@B1XXbq!A;K*;{n#=CT4K&?B>xe#FDBsU47Lkl$P)PY~a z*Q(INRy#^y;eG$Wu2IxZEqV>LJ}4Sy%LZ!ymF|70*nn~`-*=RpKcJBKny9F#hwN&o z5(wzs&T7tF2#jC$vfsgeGz=Txoi3SV~%d!*{FL@+|x@^5HTN6 zmYSN{rIE7})eZjFD`>Kel!_q(Xzu*L7X&QSl^J%v9ec%A$QP`v@DVnhWqPID-n;CN zx|0_9pCk8pX-&ZSqXTYiJYPk!#GFJ}2&Z!wT6eoL+7y(P4HZj9NhM|imq_7PSZFeu z)FjCYO?z4gP?4ah58F3Fzq$y9^d2fw4@DJ051>N!cUOr!K5#RbY@=*MODvx3@D>Uv z7Jr)AYX(1+ukvY5cZH75r1|1RG9d();2TX3S!n!q%A7Htc4A~@13r`V z6o^80X3w?18s(>;z(5gbrEwkiw)<4I99)ITZddlhfCze3bbGtpg_>f^gnQ2}OjLPf z^&-juzG+FP%c4044wy2AMalU1NGYjqj0HmJ;RMHDD{4 z>bT$HY$Cs~+&!}=K@WPy{%HOoK2ym|1{Gn;oECkq@i(K>!>Ga`K@zmtQ1yu_FXtW` z8$)pr0>3ZF$hFU)l7lnxkx3_)5$@RC;rNGJlLVB(76_aT?Iwr1~OqzL9R!*RS0lorW+z|QMS zmI97uAX_Wck@UeW${DZz!PS+5MYhh#_SjlEhr(opiTx8^KaH!_xVy00dOL@GgMgH8 z+DnkL5dD@e>qCKiQ|%=T40(T~ccZtMet;4$-z$3nqtM{?35~yMh8!6@eb1=o?{oOs z-)*Zf4mAr%gcBSCW=%4Z@l|H#!IhzyuaPV)%^^4GMs{agpuN^T%>}JAP%wj9ahu4) zEszJ~D3UipS<0;spiM3n*AlH^`qK-B(30+Q+sjZ#SP zN1iRC=V$NkG9KrM!Z)G3t=L3kX6>nBnvCdIYYbX_SmL%@eWq+yJz&0~!iyvxl(*bs*v6f$aJ? zoO5Si^;^@c=4NzDi%Rz+yw}AlT>dv7^Twx<89+WK4!voejX{wt=(YfVko|KQVQeJ&3P$PIRnAMh^779E@DX zUx`AN&GIKzIFp7*GPh(acwM}Xl_iTT#}6>Q)!;ou@KeZEK;fHW3?3e&2l3U1`t#Yt zm#$n<9hTM9B$4^R<#Qo8Mt>{Z^m3~xto0~f@fh}F$h~!2d*+fX3ynJ-#`Bi5uN6w0 zTlXp2C78DLEjb_U2OuMdCNwzGLO2?|dFrVJ6P{1cJx}-B=M(5=_ux~uMX27SB0=|W zPmx3|3D0hA3_W}Dvv`r^O4M80Hv+ZVE$dx1q%sNoK?pH80)mVWMBGH3$%zNS-8CK> zuY7&XMjOF&410(J|yC^A0R*O2(lE)QCJZzH4_(2#iaYH|xM2emFQ zfev`Y9C>A=s#+t_^j)+19-sNV!~U;v+^P$#tohLJkOKN&Vlgl<OzNc+ipw%d0ocg#C3ZADS_EwCJSu< z<`HAw+O+mL;UI!;(+{2=hZG>b+z`;ahmaCvd%)4cY^$W_LuWcxgAt`7v;Ifvo+%2c zcGP7*zTT=ZS5TPH&QZ`6@#26tmaSHDo~e3-R!Qua7QlPNzhu`^n*xysX|chUamoq3 zsn!ZI0x~jaQ9t{!5-IU@fUWe0hT)5SUdF`4jOtwEIaMQ<9JNt#b9 z?FRd2Ms(3k?p}G>V8&aE9*JB{ZdlT?>-K-Uq){HcgGMi}rf-V`lpHH(83$STP6^Zp6)8nKt{H95PzAM&rG+Wxt%_=HIkDB7Jkm&Z-^uRlT~aL1IaJD6U={P zup)9sZP?mug?U(%WT$*ew;|KwmLj)iD(s`8W;99D~9U$>>UlS&k7iz-k zlrkuGSH~laalkpt^C0tn0;Fskx3=*VJ}HT3Yk-Wz6Uq(4F3E}Q$~MInKOkl|CPA`7 ze+@M?UFe(*7^Bza_2s#5Nb|uYOXw-q{61$Ca)8^JDmj;>q?A+z>D4}?eTaKD`Id$I z=gLvqdLRq3B9V_55!eCXRo&v+&-%z@K9C)C-1!e^e@#!&tX063#Yz+NqgKj7L*LgcK>3t zkRt~VE{>(!0qQ0soHVUm)RK5D&^v6v0UU%q(pGn8E0l(u_b7O4Ut;V;87l8Ef7zygDg!_U4m=`tifFut(w=EuIlLzPao zf1_-I1E>GRYm4cqpc-0V%C*+}%D)hv5scq{>>&GW5Rj01tnDhlC#qL?H@wZu(<`27`FkdZhnkKCk@ zB@qO=n>u{ft?s=X)@8T zKr7teJg)q>3cYtXytXft+t2m5kN^gESna`B9VuzvoTbS>of6cnSxL5KCxq#N%d0S< z2VA{QvDuwU0|hh0D{F4e!s|+Z?p6D^J*B^>8I(=*QfMsQ1=X+6fPwJ=i;=y`9Au|l?mway%b|=8V0M19 z$0wxHN;qiVpleD`%s-T{DDS`;bG{=w!lJ%EA?Zosol96)sw3K^GOMtyp{KPv6tH!~ z@g%K^G&g4~f*LZPl*8!wM5wm&3IQX<5?6@fCals4d z3>&Asx0eggf}8)<$Bz^cnl6vzPL>6fo;mXs)Pij;@M`~I<_5*{WN1&! z#Z1;4L79uPg!uTFwQhSGi`@oQyL&C^Ut}*~Vjf3))dz{_dr9>4;*`I;%l1dL{3KfS zqDxX?<$4cOFd%qq*4W{PlJPY|fWRgqxB$*3xRA=wsV(GeZZ54(4GHiS&9VGA(NG;o zz^qQ`&k0AwxA)8vJ~!d`o`QEnt1QA>zPz@&{56bP@^UBgH1MJI_~jve3QKzb=-0Q? z0hH0bsF*02e;{tILaY|=jg^%@*#6mXu30|wQZzJS>iBRE8vZ?(y7N*wP0Gf`0ZJf# zdF3tSo+4T7z#;BLiV5Zlw30_zBL0UND853W5#;5@vi~`~}#d zuty92(!78`n%%EnZ4AIoXL~@SQ&VO0tUW#b=5=}X9k|P(%7gf0H#d}@y2kwH+JWwb z1xQYb@|G4l*V|HVCkb>l_=Rq)jk^VRfK{-+*8(0<;o2XY3H-4q3IVVHQ;6b_kdF8^ zWbXrtHd}_v96#IIo5}vOgZVFp&e``9f-ji;!P6i9deGr7GTvB7$h3c+Y4o$va>?(9 zmk+%EH@N;D$p83{eDhyv4mm&n=O>KhKTib@_TN8Zb|RU4Xa4*Iq_Vp!A&8mN&;!;0 zvTMSQ$<9C*IA%iVGW_QgVC(1@X2H}^S0@B|D~Dusva90% zDCU1Z^Y8!i&Gl@O|MThoef|Ialz&+IfB*Ks{lE2ZHu~QO_U9|Amj4PX|Luq1i~s$F z{~+rBoEgghoznl;l>Gh1|1O&UT{QoQ@2gQ%R54U2tY|o3Q-dsumn-jvbB`Lh`9VrrTF<}$Q}p6RwI@%+ zxpOM}#r&euDnkE&Oi@n@a zj(bO%BvRsjPi=Ieu|ZRtG95=ecwgcL+`?CE^|xd0xtxX0Ss(K5 z$4LS!rg)WJ|4E1fJweYWP{*B+?m_|gEhV|e2Aq+lq?FaRe*rT8+^hvDhdah%?* z9}NCr2n;a3X!z|tW~yX_5OlfQaH@U){Vm^R|Ms%uq$e=F`@Ld?UipYpFwVIBAAs!7 zN=5+)w&rp=Ih!UG`+~lIth-v&8t%NKDo)?|2JPW(f!7Da>lu7{m8Lg|w>LN_D2mgO z4xizP|LF18>p5;4)k~58CocURNBAT`Z32czF3%ILi{>TAd5)e%tr2p`t-nA~cYQs3e4x z?7g?5$fk_4BaxCKl}gGeTgICZvZEn;@3Lq1{vEIG&+psg{^PE@-0$~mT-SA;=W#p_ zt{Az;-}deed)!t}9bQ#Nw(X?e|E_@gV}x?-+SSlbC5n0MlP40?w6sZoUxaU@mXyj+ zr4JN&!!7;3e$~d-wo&|yINzQpYHESOTH-}RFBlag&(NagDDDu>ynOw7eElkMC1v;i zr@g+k*p(NscsEMO$kTrLUAFrl%{Pd9bAdD!EGqxb{DmIOVYv+6?*hXF*DSOwMkXX3 z(15XaS2B#>r*dx`B7KmO;w~#c+G9KAdiPTK;WOf!D(-Fjc;=L}vZw;%{){gtak&!g zzYpylYDm9`FEkXwus6)7P^Rm{{AnrPq{&^@8seXj(=&Ti_~yu2^p+B9h2Ooqa%<@? zhh0~m{}Gu-y)d>G3t)CE+3mF@eYq(7v1J6EwUy~+Jn^SRWFR4J&#?#jhCJ1%=nlw^ z2-$h=+Yj>Kb{OOoU!DcFcDy#T4549adJDw&F*sfC<|`k-p#L$4 z0>h_VEgwj`Fl60M;4~Mf!=`|A=xrg5HpReBG&L3f#B>Id=fl-Q{}otn3+~~FCsL8U z{O@b~`ud$RETJTml9AzIPaZ;A3uSw@&C}QuhnJ5X=4M#2-+sBB)O>4><8W(#jA_5) z!nja}=gRI^X@$~-$q_x{&$cUl%llH-aF*O0u#Bf(z{+ojTTpJ?@?Wu`##BtnT$i9* zyLuX6f`4twlSHFk_IZ`& z&TznF%*5)cvok|6WvBiNmBCe@u`n|W7EIdkcMi1@B-FAn&1hI^Z}k8EeYY`5`^#5Z z$H_@l%q4?~_S`=RQY}~ie=65utvYU=`!q@aSRhYSzlJbAY`ML2?Tm?x>a8qx&u#uP zG2H{BjOjBB7re@3>y8p1?cc8_+$yI?VE_7x5tM z-}JvXQP%#cmY!Uh)jw(41-1)bU);+t9mrczKC#A@x3Z^;hp+GASE_>9f9i{WPtdGr zdhBC&uLX@OoPA6}c3go=OPvb-5yZ8>rug6XULdD`t^C&)vU}S$^0yKXJAPfl4}aU4 z`0W;La(7vmP;qyyUE?**)c-3GpLG3!+Z?kh%5=2F0)s-|S7*Tp1X%`r3F7qTL}&A< zz<=xM?1kiN`KoAgwT$bM{*3>-LThw?k8Cq)TI?~Cy&CjzL4chGzd86@Mlt9iq3r(O zFK@p5<9b`uahWw=+l zXd5Jq8w-=(%eyf^PVh}971Un|%pDj&Vm%h-IG;D&kqib#Z6l?{AB&7a>N?_0b!uqJnxr74~gL zM%kR_=YeOP=+rqLXZK3@R1iH6_u2VB-*f;QKEQg;QarnrUtJim6Swg4pA>_n_<^W#ohGA6jZ(b zzmt*UT;bcY^fzLq*rTUsTTgBE+9jo{%ZPl)D>gQ}aN&FULbpI6e-Z6Jn7X7>#7zo4 z{HfR^DEq*y@zvFI(#$Y_xXsrIMo6-EmCT_ubT?#qITJXbay&$M2&pD3Gk zVa@3o8404KuU7C1rl(;F`X|iIXlaX%|GMWj(oD))Zw^jDvkm>%e(c~MGpZ5nSb5OC z>l{-sGX}KK)b>H;8{MqS$0w``sE=lZkM9#SP6*|=e2rtwBy53Yap|VhQU=vTXHf{08D7C?T>HHiHX>%5nrYff8EG79 zxbds26GW053?+i%-s=xxq&dPT&N^Uj{xLJ>;+u|KHF)&^Ct$@HKtFh9eQo<^w>AAk z1Gq70KGTS;4`*6@@@U-&itQjaQDr~uWY9+rWs;K90I1if7 zo4N|z13rG_C-Xs+(CeFLV{WCJ;@Fm9EY3zuj7Bjz{p9h75<^;FIAWwcHum7lUQH(v zqtD&}?M-&{)ums#mMW#*hcwthQ7|==4pyJ?!C4#zOs>j=+DB`G45wPOG%L@?*Xi227n7BcXWh{ zmKCQiU!;m%`P#F|;l>Shx7T;x9m;c_^#3Yb&N3uqZy10R|M0m%bhwN2mE8SxFXd3i z>t8B}O~n7XO=mU>p;^W43lkH^WQ&;hu!v>_092rTbG;K*&R^L^GXA^q~*KI8v=UMj6(xKMLmB3@I zXWw>nyS&!6;k8B>9bSl8u%<2>(~if;bdr;x$r?5MjYKrx6&!D83cZE481BVlmI|1tR^hSJJE{yo%O3Cmyh-{ao2Y z1_fz(-8CME`HtH#-Xy*DBjzobC>-+JPB=QgrTzW@U`}6Aqcu@afC8kHax*z4`4@tw zW=Go%`lmx!B<>)%ji+pRVbrg;^xo=n4%8^`N@db-{3*IMHT9&fFx#ec8|2P}SOCzr zdk2JHhqE%nMFIu5>CCf~9lKUzXFmnM%3fWKY)+=QN5vAYcHw*O%s&1b4Z8li&wobp zTlSqLt;qf!b>IC>XO&P69_h`I5)*(|k=V+jz=B#oH##{P;^R6=KHZUfqqv+SK-v@U z&hj(Jdr@kb&b@R-lHQe!O2m`CwFt2T?VSY*#c)>FjpB>D_KO%Ef^U7hNt8mUq1i^h zl_1E?an!HGZG#Z2L#VxRjXt_|Z}Ql9vpPUU4`9V($t|jSzBNKVi%jjGg*OO$6q#4y ziT3PC{M~QU*eQyapi!zku)883ObeuP`ys9C2&eR%z9<<6Z-7qB{mQfuqWc>d!B9!QUUX}g3HV65n}s5?o|&Q?;;uX-%Y^6G1ij4)4JLA%Qv00P_ZuTgG#SX zO9N9QSeROLdo;VJYd_gj9s|xF$>9)CALgnO!HR;83rS^LsQP&y2ivADuIc7qCT*aA8b{?V{mx;FE zHs_K4-wE~dA>VAw{BYqY`$oj?M!g;vb)huHfLLv`V}*+KtzE&r7yOPvZB^UYB(|B3 zWJSb7;bY9vDxhoyvG~lu390_~yiYlkuh%u_%`vN?V}fwYck`uB$q-7rn=te!z06h} zeII$!;^!MbnI9sH_H+6uYlP&)Gq>;Yah)i6BP>!95gFYT; z|8#`OI)92O$y0PLH63T3cP^dFNYi?$f1j3Ys<%`|5zohNW|2sh^bUN3pfekZ;bVE2r6r#;682LMX3^H=^Y%-MKZ=iCc4w~)fs!GGyA1ju%&3p z>TdFZpvp2UY;qELngUKOvZw9ZHh)l#QnP*pt7OaPYdltssjqA2I#BBHqMd4oC&fS{g zPt0#FL!zZ7XEJ-xqx;1;&#BFv7&kGo^@M(iRcz&LxT^so4+UE9()SEbQUL{Wz4_g# zJeSe?Z{J=fRkmk)9&O7W{n{|SlsQ)-i&{LK-A^J2jMLeY$M%>yt?om#z8#y>Z7Yz-bx_Wgn}(myKn2% zO{F?)wGSBux2dU>7_G`wdhS-0Yge>`%GimAR{i`(Izr)7?>M5!kY`Q3M&l03LIJtR} z{$On;Sv8loOw%^vdU>sn*|p~Fej{j&W62*Y&s5pdx4!b%*6fH9=h)EWjx(Ij<^FUc zth-V0ho(wV-;s{5iq&OA)L66x%YT)&dX<*mCNk?JMJ_!}$I8H-cB` ze3&_J`t5HJ7Hhz~_1&Q5NoPUULb}FG05<{sgqU z6bj6MG=D%bOXHG%eo3eZhXH`6PFRp~%;_7er7A2GHUG}`rDJR zZ^xR(MX&$*cx=ysv$4)>2}^lGb`3jRT=eKnu|W1UB%IR!@yE4~Dwfogcw$4y{?}VI zS^^oLG*bk%ymDlIFDwd7kp$PpPR#Af&yFSEYT1`iMN1B*iaF^0sP?VO?Yl|8o9Q$T zzR9qXP7bvurCl&JLIFlF&Ahg3OPF&oP)Bb7Y#@Umj?|8V(SST}p)y3lkS6*YhEHLc z6L=%$&DZ;#=sSp_nam_;nd*`uuf8zRDf8f2%3elBt~NU;JNAsXQ}m%ath4&u9SIA> z! z{1A~jrk*d7<7wjv$ouG3%6ZzRVON^TiglxmRndg${qg*Tv0CB1M_~|k5HpT-xI##e zlh%O-^D+OS-#bk^F7A!<{Z8Hj{Uc{}*QCsQEav8xcQf~wRcYu4zZ$~zo|?A{c>GH> za(R;%r^Uu8cRsh-k(kE0)l!*|+Uoq23+fA%A#Am=mI}#w`Nl~~yCDrGKQWoD->vbh zq1t=H&-K+js*sq*C7?L*mWt=i4aF@;#F~ClTU7r zX?XK54C&f&yjyab={6LLVjjz*E$C;FI(a^{7|Q7riv(87V&(7I+1ZdIZCaYiKMYRC z<8QQ6e-!v9I`ae2{Mcc~58ck?mMJyB6ZwIB;9)%K=t{!TgZp)+^Qg;1CSk+TB{os7 z16a!`1=6&6wVu7(?j>&6;Qi%toRB=)GC?Qf6p9hdUQto8xV|Q8T;R1EhKt3;X>TEa zZ}GEDEHi^YYL~55&7u16EuV)JA4+g$So%xwDnATXnp#_NJ$tPtH7n}lM~5uyZVK16 zvZPHdt=A;~$cGc&`>Q`+??Y&*u~^Lg*z33(>JQb4yDKp&Uvs-GdTiV;SfTF#=mdkbC%y^NzcP*;XXC#%m@V z4r1Uvd>z5Ysw<2JJaIUR%y+3A(>s;5 z&h)hPljSL7v%I6u%&6Xq%i(K%9Co6(wY&H3y>ou$BA=uIo|R0TJpGfSDt5%(0@Gm; zzGI?egEw=BaSW)1vutM>@eEn%WXU~kOUp;#R~yOJ55!XLGQjj=wNK`rL_dj+T~jkb zeLs%8O`p<0$%zTqVV3+u1xBEz)6I+Mf}q7{j{2q-SbI3zsc;mgVLyXLL$t|;>a9{=!)*~|yHbIbFu``qz!TpzR4 zHApIaru7GesG)}3R|oG`2%3mLO;g3VMTC8Q zCdhMdH=94`Srip@u{9uL&W;OFTc|`)kI|fn!~6C2VkKWRl>-wKQ?z00NiMyNt(dn^ zZrO5?I3<8n;*aJ_vEMT+&e6`J^DQ~{`yk&Nvi*sZ%X;Lw+mr<>^ZSxXxp@N@b8lRG zQqNJDMoI@Z1^rXbyl>uL@?D9b8L)ZrBYV9*;9y*wagB#AaX-=j0ZL2?<~!1xjrmB^ z#?&wsPF8W#tRcb8WJCrQCY5x2hC|KW>u?R;`a8QHZ-~~S!Fc~odb5g0GEK?z`d;LH z7)&kiW;`yt{xhPUoWA`ur*> z)8P?wH3tCfkUwM&spkz?3(-w=aQM0{;yYOs(&EwWlM3tJ0w=dq%MKgeqHXv?$p_lD zTStpt&M)EM@sLq?Thh8wDjZ3#abnQQ>#|34vO1hQ8WO*cB+}Z3JJ+30?#)!-Gthfb zMT&be;EtA#Xz{=S72kY&v^~|x-2to&$+tMrz9fpL z|C6?bJ`~Z?ra@0W*K=b!?L~L#hj`u8*rDmC*;TYOzjC_C{O^WuCjV>pwdYR!nhr1H z{`=muFkS`7g?;F2uq=-ZgI-zS+K3ari}dVgxF)&TQ^>w#kBbrsWq2yA<^)muDfD)u zAWt!HPdGO?XYIX<@vPM8D{)u+mKjgpdV9TZ_tXsM0L(H1qfx>|tg5@PF7H2OZYk(} zt{0h0e^h3s=BCAHtWn*v5 z5K#j^0B{7&eC>C(;2(UQc){X4vKl^ij#z@@3o&ZF2Qw6KZw%2wEr{k-juL+0*ngD! zoFWAo;t8aoiGF+}AoId%clbA{$|4}r^s_V-eK2~UA*QHf9p!+v`?cP@E3^ppQ&ZZSio?$#wIlp)4Lc-P|H(k#`(8K> zK%+-=YguJ(L-#Cws-0+|0J34N$JfyrG=jjlTwJ++i4+7_pu_x1UYf@j_wp%Ji{|$Fq zdWFjChnW`iY<3%{l7TX~k6{|USei!V9!fc$FEziL(P6W4>YU1F5v5N{C*1gL26KW< z|6YqJRq)F=(KaLuq-p8+ybeo$=?SGN72Dcs@-zxX{Kg<@iDyP|kq0I1LUU0jeBpab z?*aOMkIBSrZmd)1^c4sJz&E^ut&@ zas`?U>#9e)vV(0InG4^ON1F~g6L$mL zcgIcEk2bF}p0eAV%AR0D!@&ATZ{vG;-=&!_mKD@6a5xTDhtrzLgs3lh;#>G8)SFXs zmu@8|H=BD&!sB>3qyNDY4c%Sif)#G|WTbN5DfZjOT`*5cK~ano8o3r%QfbRXh?V^LcE_R z@Rmo4I+wLL($e(-N>L|bc?s?>@gu;OL|cYQGcC-a>ac0c`lFL^N0IX);9lT)xyD7A zU|Ud*6!#M_JK6(I6Q%9G6Gj9ULN(1U@@nOqGiL9vm&kXDkOXX6E)#9B;atphzB~r| zb}Yg)4uF?EZ(VCxxxJ&}Z-C$1U+S@;>%=PgYYFd7 z=o9M5>ej~9fZbXGyd}nD^&_JSKOqj5qSbEDJ9TSjo_FAcF8iV(PPoFyjj}f*WTXDu zYmE{h#RS~O&i=y{Mur}Y%NQwYd?9Lo=U`VNkepG&n0^Mz-YofWoA@t*S+REE;ZpS9 zp853JQ@uEL7qI@`>kZ~87$g2Ql7SJQ2phCPf7p) z+>C=U20fA1x8)`=^G44o>tzvOx4y4#H706HroI*qe{%$=fg25s#S@>f$P?~g5NKm( z---7O{zyVMzZVHQP;RWHeac|TCOJ=bt(gdse|yU3A9nQ7m-eLa3aU4JCevv{e7Z=n zs+=|pz*T1npLB-#S-@phcC0;rC$hUJZLu1`3@ml|^4ri%Z#00YJwpb6z99$XBANp0 zNAq%;zM$jf4c4=wJQJoYsQBiX?{W-lRJV~v_tM6^C<_B$Z4X-;G6dU?DWMTCAtjE4 zf`@EE()hL=x3_Y)UOADnjDFc`(G!ZH`%izAaGC6QfBFjf;u5P4-2L0B#w1I(&C$1E zjv-*xz!)c5K^vD{A0p1_tx74f#&7#$P{nn$$=1J9as`0}F#%L>?K<14jLlMv*1$W> zPklR%a`D!T_NN#gvWD5&^QneG%@W1MCXOI7qzr5Tl4n@tb@9-^gz?44$CpK6Te@;Y znj%z_aCyP6e%$!9$sfUIP<$ooq}}t|J|At=z9IJI=?mFI;YbrHN_+|y`5riTB$Kpx zPZw6`f4;gO=R(Rpq_D2f87H+VH6oP&?r{2o3Zj43bEp)t3D2(%K6z&Bit}%6q@oaK z!hv|Ca_gd(YjWrr;55L$BsiLY3R#Z%!lu>F>x?2-srRt7JOGAWt55~!+KTtPt$V@S zzb*>rU!ezuyvvxk4h3x}(mo!T$?V}=@eIWg_xr0As+WS+hp)F6ntiw|Wa2#Dk;{zl zzG>CN!KSw4wrP)hMA2{0VD?YdJn5TPB@oT=MS-; z)+~+K$bwI#c-wi~_V`r0>49;B+NF>rFGUQ6JW!twWJC?{}(7im*#`UR!I9JwjJosqZN)t}OL#7J74l$6SJ^GL~`8gn5 zn@VLKX$<^5h$XdX;`P0wJ2n0vA`~B1%E~1nQhw| zc>CstT7<(1q?@dy>9^!tY|ps5S3A$RNPKB-1mn!hFxdDm!Ugqlr27vytv1T9IhIGmc8jW{*bm6FtR05MxIEP>K3M>##md?xzZ z1M``#uw`iEr_q!@xYGR7_Ig_~2kfri<)tMh{MSZy z9XH9={d4X@SO@Yus~_EionQFklmB@mebI+HRz}4l?(1mQn6Jk}0#kRV>CS;4Y7zY5 zn(!nM(k%a1+F0P8^BGHjd-j7P;zOb5;?yQI{OQWJQ!)AA5D?#~(&rb9=_KX->)}yMQAn=zDrY%d ziflFcw1DmM_p3a&V@b^g*3Xq&yw6W>N=Au!1;!XA30W6>E)NQIMM~t@#A(q#==SEc zP>c%7w*9PiAmuCME3mf7kVf86hRYE+fcXyLTO_N5*^Uz?z7C`FEdDQGKSaV|V(qAa z-S_JU#66^Xue|&6MFrV=!jue}Yg1VJ(f(~=9Bo<;Kr~X4^BY7vBYVQ3uk4tAfVQ^^ z-;+dGp(a0J8pf@a7_Tic()P)6=LDimsL=%Z()5E_4N4Evilg(7fMDjPXtn+UN;xxP z;D^102u7RzjK$zx&{ymJ&?5nDW=EZ21+T3+n#Uw;$|xVMUigk;?_Ntzfz}2nRYY^_ zC3{Q!8^oJyYxnk7J|fT>^nGZGp9f^c!O4O8wZ>;%0U~zd(0(yw3n1O>LdZnt*2<$o z3$e|Ch&;dk>->w4tNG9-@fb>Ml3?TPDs-krpWx|hj^FT0+8UgRmdkv0YexFq6BEiv z5$7*><+DUw;p8j|jV1UnSLPDw$hi46f@;w;PY zU`RyO1MOR~^pb-1%O$05sq)s=;+%eY7U-$5R?-$opVd}6Ui0x0bn_muzXdKVP+oF3 z|5b?+=4pwoEG@Vv-FOyrZULvMgGB%Tkk=u(aCas4pH+>5Z1ZDndkhS&s6TpCe?S(P<{S3vW%cK2%fNxH^ZpFx9lOPlxC&Ng7Rsj<+%IzAvsZuoG%K}MjuT# z!$}xOq?p;yXhj?h_&T`h6g{&U$6(vsD1i{xudJq}nd+Be7x!LzNa*vR;5c{tujZ^S z%aT_w5Mb|$kNkz@X zxk^?n`G1Vu&|g{A@`tqzs&ttIZQiPt$R7sbuD0{3)_7i1^zBo{6IQshzi#boCI+Mc zZ5|pJ8X{9sp$Z@5D3IJn_T!acBiEHbu3<-mn@1!CoPR7?yhkJr8PJ|I#Xp{@b10Zr z|EAFIY^e%Ab(G-*%`<%okKbIZiMML}ycKT9Jw2+z8a&X`YkYC)U~^^2oht3ywM6UI zWAUwSE&g*DF;=0{YluGEk@$eDZjvEEMd4X0^_Y)QuKJ~2Of4q;h5z%*OZXa%&XW9C zpYZkd(N6s~)BU^s{oA8#7xzZJ?R>NnE1~oX98ApdU`C&I6}$3hla{wV?0wsKc*+BM z?7MRxxXZErR940wH$SHKxdLWZUlc>(gKLF6*3sI$25%kBu3Qs$R*XEkKQ(nJOGJkS z=UPPZkdq;F`eBQ1?-t&+iPJAdUG0cQ2DOC46!jZ%_xFE0vgY%i1Lk<`+f(hpOHv+y zt*r=7Sg$;aq}({e&wu_^)5y_RftJnL!O|2w_d!;a;`toE9I@4>QsvDK(_m&nO}(m% z4+{!dK=eKwC~<31_4oC;V3t$z z-@$$CR^I3wLLIB>rVMkgO?!sgR1~KijC@ZEe?$ox5PxrOw3*hEOs{cHb|KYhYdTgv zE5pY55iJwRx(f*A(bQ)0Vy5=No=(|!)4ZmE%kl6N@DC9e8=GaCnQD0B_m`I1BP5Z9 zm4!*&49yn};%H|E(`b7&x3%x=>Pp!<4Z&+-a`tlulLcj#c8bKEZ_YZ(_d9puHXl$> zSISZxR)6MjUyn1Ceml)0@F?AxlA|*r|bQ-ECs;EuOwFqVg!XkQ1#`HUBG`* z-T1}d)|o-y$VWIt3*7k4A6&5>32QTU$e6jMM9svZZRr2%M>1o|;uo-og7~LRR<0vb zKuSyZOP2&36tZbco;^UTL0h|Ic>!F)j!(4`t{+#%C1gJ*y%ag@y?Xvhi9h{%(yQ-# z0;=hF^fjqhrh5HSH5B(^Atc6;|7eDFWz+hTF3*nyoO*diD|tuH%{gui$4GCEJ`w-C zd;L*-%i?b;Mad`W)3=xpJXyW-)b!-FjIy$6voHzO`;_!|n~Cn7wtz8bZ4ec+5cdW% z@4#5=jPD3TNRk`k>CcvhBIAkkhv>!dq< zh#yC!;rjRSpZ6#!!$6^00Gjo8djUxlV!uThpByp3mn>9!2CBnYcuvmu~3*|M(r#3E{QuT8v#WqO+ne+=O zZR0<9xOteO&8q^G z#WU?eu%+JFwAT54O03yIvbs%q<__`d*ac6KOrY1_6UW+C&_aP-g-hw4iD zs3iFsxd&7tf1??KB8xtwRN*mF<3&N_r zqc3qH7@|il&SHzZm={@|D}(^@#$a_EHKrYli)t%MZXW?s^@)8%1GRReKD$~z8XQR&N9s*H*$Gv1YHMoZ(>xG$HetMwQnQc80CLon zzpo#$wDm$JMa{NRwB0M@fOycfnM~8v4v4uOsQ(aj zwCuN2)v-Xa+kff6b$+LLY|eWyHk|ozYo-MX`;xl{Z3D+MSXfg%nn_u|7w^;ha`R{< zX-mJmKpy`3-J5N58`_IYkHFrBP@JUPbGReRDtU5CXJc<}ywGs1KWG}v|Lwp~ z7Mfo%(vYyFDYgCW)Z;oRR|EjhsWplyw^2~WVlg41_y}0~2L4z}hb9Y>0bAfTE z2;e%Yk5#8JONOvC$>myJZLKA1uk~+qHmt;^5auTLP=Gz|G{Ilp*-fAiT8nM>op{Zp@Et}-Tl$>)VXt-I_ipa z(6YzK&?gyaIwkq6rlxY&(B^B8cO>}fn9MZ3^u-I@gtp zf9S;<-YLy3b+4^HbWl3_xEq282VB(x)dunw>)%; zPdl$>2MU-^PI>|nWuS|(h-B3#m_TQLO?hDQh58qhR#F>TppUob<|_LxSSKX zJ5%@E7 z)qX(;r~A<%o!yfoQD19iD}Oo*?W@r#pMgmNBLtjo4^GQPrWl|SNb1=EpWt9Y`RCmC zkz+~M2cJt>#cpeYOC~oE&KmJzN7ApdviBhYKf@-x_K+zt3D)IybBFWvg2g~7prEj> z^e&6zjQF7?KXpk(!?xGWQS#3N-jHEPWY~WbBeb_j0CHF@t1?Lk&SQ7*L4T(Z z$|wQo_d~W1QPrv=Xa#x*wmmip~h}(K!{Jor>&rsIkM{*Jk zN04=7#{tMVLDk|ZQ&dviszpa?{N#91vM#9Q<$=f9CJV%94A88pnfwKwc@C}}m5(CN z$4FOsyUgdivH^Ih9Z0gN-DNIf7?VHn?ZeD~=)i#Gu+yZCq8D>iC3A}@GTE% zKqYUo*XEgOjGN$9W%XWJ4P3pcT#voe(;EsOYZscMDGUq@{Jp1I!XlP76BY8V;6A{&E}*_xRkdO#QcPvM_xC^xu3xQPNAVmh_8 zh+RNxL!}vhBJO9rn@YP~)RmI6FAV!(lz5%OUFmv$zIroXBzby@K@N|miJCdkUB3No zIU1gsbY!gOZgB<5k+x{W1=)qphJ6K%PFcAv{Oxuh*cx`2YH=&*kjvQ!Nk~ZikytUE zbj3I}UZ-d;A*h7XlunqZpK|BU%3%05S-F+%CpvO@0u%Dx^SH4j5i4_vHynK;3kvKU zW~EuVr!7pMo*A4wdQwmj*+e4RLiNi`Nnr=G9qSp2{TNMM#=CgbJ1+!VCkGsE)}^mL z>i$NATizo$98E`bBRBy|tq6+*n^5QDC=Rny{yGS>xj^n!q5Bf+kJ*&AF5& z!EWr}0F0}S)wC;oh)l#hO!c6*S4z$Htc{MCq<=;QdNxCPxi8Jygs-HiuudjQJr7Mb z)39@2bP_d>LGU`%k&~O7+p`=F0Z+o;Kh?t?V()$oLrHNR*%TKLFkx2zp4Td}=#<>a z^hhIyh7<#XKf?bavtScC)=Khih}sK(Q}i4$6`)Smc+SWBgBT?rS0&TST60~P-`(-a zh1^1!rSg67D4|Y1ZCj^nPr<{eM{{GpaSk#%F{EHfq-i;T^^Ds~n#GEu7a6?^l0U!Ag-Sh@+Kg*b)iM@->9W zBUfSCJmJBEoru9oyzv=!tAgV}xy=%Uine+FxrH1d5 z^hQ?46_xcPo1?fal=nrler)!K4-#j0sopzrK0aix#avkdgXI>Rv~b>8zWokB=)5oE zm-Ew1iXcwAaA*LS$KXud!rX)WQ#fRh|4J>O}>XE*a1NxtVBLF3pF5O1ok z*E_xLx7}B22ZT*wDU5`6K{EOBrs4Go2Cg1%JrkdgBR-tQ1vJKHbjPASX&$~f?7y?O z2311uEU8UkG)!A|0+unEl$vX=}l1>YDZ+< zKqX)N)1K!$7+G&1Mv#i4o1&%eu(6N)psxbD-Y+7PfhJ?0$;lv%eOvq z?0H+Wu2G&-1tyF1rZCCjWA_0gWZ%uLopZguO|*48qqyht@jzjuF$ISUCW*l)Ku%AS zb4lu++V4} zRkpsI^!{g6GXq04TZQ6oEIow&2);%~%&^Y6txEOwih0&oPR2K^7d$_Z9(BaHh-R;v z{7IqabrDS+M14#Dc*%O!b9pRH7w}ueZ|%Y}7yjn?=?GoUuy@YZX;&*(R`qVByhQZD zwo}@?`7!ga)&ijk^V+f_-TJJBh2`MU!aY0(gi?woFgL`RgBK9Hw0~#Xe=$h6WgfB0 z5E&qfkwI^((zE3aMhWFTx^$GOM){ive%9|Q4UCh;$}5C4o_u-FtHC1f{b6gZ;KVKj zBL^0xTmUWA_g$~GT&!*XQ$b1Z`Yq z)%op^Q?LE&D(W((xtR0c_B@yy8y;&7Sryd0C*;GAfvdZ03hx7=qFsp3;}dr`DxdaR zM#FlcnLKrY#nWQ(BZvuweMSG!@@?CiF3+K+7$GPv)vuUKI8QdwXPPV17MNr?wNgH0 zJ;gdbZE5ijOBO9b|DPtDM_uQCx>d$??cu}eZIn;AiHG`^@glW;9ZLi)YN7tGwPuv* zZqB16NJpGq>@L55+=iJ+ZsmN!ojXoz`@d#wv^+l;%5~-7wBL7Ap}l1lO4Z-L(`kHA zESZi8_!WO;3(4gq;=9XxkI2+wJV8v3yC)sk-Xm z=y(V9(rL>M*_zCTkgd0U4?Z&_9f^MU{>9CKhBv;xS!dYfjfe<@UxksxDTk+^f)aT$ z>1LJmrrynI0azB3pg+;dV( z0**A>Ypy$7t^1t-EA?A=l0|BckS-yO0M-PDh1H#e|L33E4i)Gw=;h*da`vE)kT|Gk zZbNZwYDNJq)n{6%ntRE2GN=ZM-CEp{W7o+bwhl!*+Faw8njFgm#V*^h_lhLHEAuXO zHV9CPtJ!h5|9wES7$CCO+p^Lx9LF&_-*tSi*g9c5by>T2;XC97b=AScRo|Yc^#C6J zxjm~AvJPt67~}A7gm4!gT7Kb>Fru!xBCZ`tunmoCY-MP(nCatT#Vr3`xS75G`g zw4Yl8iI>NXGN^^@7fq42O?b_Xq%>pSL z9fD!dk1mDU<|7mX2SjgBtFU&KhARwyyt2lG+*DqF3%=buZ}$FlH|?gC+OG%7goZmM zr4_xB!OXjc=4>Tv$s0qDBJ=m|Kla(UwP?eqsgd{LrL^=|&ld+zo}6=8TaC>9`ZLp% zUd3s8t&-}AqkpsR@E_+iq|g2R^CO8m-+A;5QDvNM0;>U=h%V7VbIqV%uFHdzGFmNc zfUsVgnw7Ij0pWZR!5+2AdbAG@2<+Ne%ioMc+?Oz!1&8@riq-rZ`$wA7o|l}e(JkZN zzP4CAs)I%OCNZ!Y?oh)n;g~rzjfRAF&eu1cdr`bMFe!95CtCiQ*>tdwm0O$q(!TDZ z2OiSYdao4lj6PRB+#T@h%mdE-lPw7^8u-Ghe&vy#v(LyXA;7JodpA>Q~s0v1eEC&d)sCs|jI2gXLnfM7m>GSZl>LFfNOu$!8q;+vr~ldmg}W`}}y3RdF?U*pM(`*??kw z`p*M5QO(g(;B6d6X7@{WAbA%dDFLT+#Owijwv0i`pw52aYyDZArhm!cd#GG97mGdQ&w0YWHV3|A;kB$T)O!>_|gvVLUn> zSilNm7iRw*Nj(4mGc=U>-!tSq+NMXXuzau`#z+Skc>HzY8gA&i-FoPiUr!4p)`1}* z%?{apt7{te0ul)rxRQ%fY~SV;npKwH;^zu;K|^jg8i#1kY|-Axp>ehE{?aCxq>6lv zVn@P^SQ1+$67nG!O=7~@==&*0N5L@HV-xnL3xG;MRsQU6n8G1Y{E4CKg)s$HYS@s} zuZc?~Na8$5G9Y-JWN)3z&kYySY#Nq9lVWRnu$+rJLy}!B60=B^4o-C9r)QAWF~pbK z27tv0ISF+K2M3>ogoF!YYXMZD6Z1>65iNq+e3Hk-3ML4QF^NRFF!rUmbO*)mwYfXRNNh1B|Kb(lCcj}2&Dj)Mi@V!u6SKeK!7nPAhD5gjQ^=Vwkj;Y+=Wi! zH75*suZP9TU;0lCLam_RS@P=_HS%B@Su1PRbSX5ex4)~ev)GzG_Y0^G1(AEY-nfHx zHKSdZerJy4?G9Slg5ZvT6Ouu%7)V-~BX0WiP}V<*sW`|foxV9HGm|#kt~F3BKRX5i zRG@dfmOr(c8MwA8?)@ZP;s~_sJKSBy&x6+aFRB;ebQz=U2@P*T$EH)R26$HGOtA4|wpm$UX4a1^?Y;-Nlpe zfJm{oj=eQ9m<#(*7fm1oIngj+uv zH@Ix^{L-)azl}U_&vBO?{WlJZ6Z~&IAjL^xV2Xxd8%?{BZRz_c(K`TWpqH|R(snm< zLqKpaspo(ey3`zjkwp$_G2%~!k=BZ5;L;dpGp0N2!z)Cp(M_FcNoiVIv!^Faltb6c zfsNWjjJeCOhbQC+l!HsheQszc8P;Y-0go5jYdFNn38ZK~IbFMpjOfeVEF#3Bu~qeS z>-nHw|2;|*w^>2MOwsDNC(TDrPN8EI3L4^ziq+20lGRRZxPGL^B7g?1?)|ar3GxZ* zB~gAm)s4&|C5Sa(Z+?XcGLzXoi*B!ItLpv2-~e&}1~GA5=}3`mT20#4tlOh$)%;us6Xb2grc1B0uYvcu|W2*)&t$z#fBGXv> zIV|E&z_Ko67u!|ZASWzx_KToghAaZi2}70KhUsW7;{E7SvR}S2c7@&qXBW9c2z2z; z+6D<*8N||2VCB2Vtx)>IvQAS5WCB;q?4x~gNedCyi z^kUKc#Hn+MH>~>?#lqxek32np&_{Msm+PJDV}^qi?C)X@zm>W4acA_K{=HknkL;*B zG~4xnm3rsfmJrQw!{s_n%A{WhV$pIt<2jhrO%C?8G@!ykJWwtHDkSiH9~?Y8BXsjQChwl zl-L|^ws=1x=b*+4i8QiepYLj6mHZtK$P3H3GN`w{Ha8arxZB?>yLjVgU9I%qT2SDf zptm|6yi%ThLeOmBcxlKh9;)9*7OeD0cSRccoF|3M{gg=x375iYlv{=VKEh;<`_t2D z(Y!1DoRPva&zn-ZI-1-s8=GwDCT}Y4GvVW|qhMXeVTf8w#(aTrH zzVPjDOQ!h`fpVZK-ft$SZ1M0m7MYL)XQVkb_>jx*uWFv@;|gm_gOZ-lt>~M-f1kVg z>f&~)2-CUI#vik{P{n?i7kS*!D=@PvXx_DYJVexXS+TTZZZs|Do7JB)tYilln0^(d z9dpUoz1(})%=JNCoL^(S+Qs||S65dZS=lWb9>W>Q5?KW|8o4>xuddy>A>)?pDXL-f z|JwWRx2CeLZ5+okDj-7>DH#g_BA`@3+Q@(c(mMz!NDIA$o?rzB5D-D>2+~`mgcgd5 zNHeq$FhGb%lP$~Rp7rxhDgp+X2+2^di_r315*1bZXX%p5pG&FjLPp#Z; z?nhY*E%I*sclLYI$ClQgtVkTH)(qwz@MsE&EIKbckluaXT|HjK} zF}G4S)l2YZ=J__N3d^lcp{BvtL1_khjEwPJ^SxbepNzY0n@xYZHv$iSt_9C*{Ypp*9IbS6`VY$syAHAWrhR1S zvz8e)(P@(7WihHJMP;a{I}L;tUL4 zFF=Dov3ARqT53Rbp=Lnvi0fOA-t)wZpXU1V-v~jcKOW0EpSFckH)#DHs+hRzlvC9u z%EEFthv^S%%o@%q>JFCdZR0cd<%&v?$0!5N*%|Ms+HTQ885*)sI2-vy5Z-iO0m=E+ z)KORSDt#y<;!RW0#v@k-y(T$Swr6IsS`oVMFqNG(N}G-kp)y8XVKP%y^A^QCNyh!< z^itW2#>PgD&&jss{uhOW)Vr9uGn|O_bbHb`a>N-Lw-o4R)J+3`!4}f)3jjWm6S#Mn zfgz?*7syY#NlpL9q*z!+C>6DXpUu20pln0slAN5kuoy_ZL6(xP!ESLCEpd9`Bz1m! zWHQ{Z=DkuHpG~;P?TYh6X7LN>&wtHNkz^a7!bw&6#+qGuMuq*~!w?wBk7qwL-AZR^b=|EWma@I`RAX~!A@r*w z|L$?ePw!4{1=-EflwaTY>v8_M!HQ`KEt>VlG<$0P(%#-4`{_Y48$xPZ#Inx+ih=FI zmr?`hL-e_?lI)uIj2Z%|#obdhN^JfTB-O6%t~9YD+;{gZ%k3GZ+=c}S^UH&tA>*TA zhK0sjDlW7AVz+i?d$V5zi*J23cGG|RI$*@V_fxR+Ik4D#KrQ#AvV+A01#eOeQkiqI zvc5lI5wn}wr2j+w0n_uN-LUj3|_KuMMQv=;gXvNx+O>ZTAi z;wZC0Po^qkDO5B#xm@6+g+F^n3Q{3^bky}gap zTmXpp-fVPXVZ=of|95ZQYm2{HxfGZ9095}v~u4(=fHgM5g4 z-r41=b1=L|X{T+f6O)rAo%;<5Nl7MK=t=U_yw$YWnKOTODbgM`l&7 zpO7r>jgO1V8f~&J3&NFwDo&ye6tZ@9SHf~9Nnud%8qeF`U3qOO8+XyDch!uUR}ONp z*9WCK8z7}}?g@*pt8GMKVIfFqIz6S-1sGUk;w6MV!yZfOf+KlrC&a7!BtE)LM`^F< zl{K1jQrPtEYshd){luZX@cZ~;c7g!6T~JHB_>u{ z-uj8XlL0gRVwGfcC$z(J*mnHT5~U$bfA=GQoN%_K`S*o|6}3ivN2e@Q_>LDJ`G z&6gnZGW)jwxAWW^V<5U(E)&`Hx@RNR{vy)EniBL=AaI~NN? z400+C4+=`xT3B6M$bR&Q1Vvjam)17k`b^)ELf%uPwMVqaiP(l0TR2#AZi3F)3~6Ab z+a14g^|j`#}XMhjpvO{~yOP8%Pfi*tnsCXx@m%0hH*YikRfUwfV+bC7}I-nnpN zuw4(Ge0R`^7Mw)^#r-4FbiscAqM=M$QsxR|mK8XF=J07ApAr%y_jh-GIWN8Ys z+a5joj_cuWeT9byE2_ZqqQ$30Lwp z-(l+hsQw~8A;G`v3Wheu{6zIHB+=fRvrZsA_;$47@(+cUR_B&_+pre4Q>PLpXK_$x z{A{Mi?~r*=Ux}rrRlc!)gU@tqXyc|==w!N#+i>@njTYzbuNh8?r+ij&&?{;;A3&}i zLGPT_l2|1=-;HvvB82uJD9Ur9ot+V}RHm4=`S+QHiHU3(s}L!QE9a%#Mc=K^T1t?o zh+BLFTc~PDNy*HRz}}PVW#+ert8~PSiuIe>5E8z1R>9NkmJPuZX|^EorFHJcv;I68 zYAtKIR8ILJs76`Mlex7-^9kzaIvg=%Qf&T4)UwHECT=MS@&qCv3s+c2rz zbXX^HCK?EhLF0`P82WH=p|zI)7& zR!o)GtKV5Q*|lVD;pgXfqAyc--k()fTh|4MXjpnZ0F?MH^7E^P?4gX6_BUUEi}D&o zodnxH5lUd)oFSQ5)jBW%!Zd<~4F`S`##t|F@@!(5v+xJdS6=ECo90x8dNPSl)6#iRTv00*)a*2FiJ7Zl+qzn~KMy}SD9J5;3>-7Abeb|p?l*2jhmZz zWqyDVi_ZeAfmGHt>?@WvezH6%+Ye4_1&Bo^Hy;H`zen?&RjY?+z;rdfrY7G#-SHXM zwGlA6H|6^ZpGD*q6xjLtwaTYHp87UB;NJJ(V59Tb`}@dK`qq$Z>E-FEr=bzvnXZI| zxbjSgSYvP5gzy4etESUuZY){G{iDd}T?)Ork&qzUagye`!G{YfdLbv@Zv~aqx==l2 z2&GSEmpCjNF_!c#8ZcufR3ywmC)@+u2^%9u(6UWyX>NUO0LXrKYfjCezQUb6@OJGs ze97^zV3zYCzEDTUeo@A-v6BoCTAN=ck^6KHGH`9i-YFPbacL!7w#tBILCWaJIwXBK zLL0&v7M2|F!}GneHI`TKMv`b)tmY|I))tj6qz|eQjK>?Pc<1Ru&G=Xn(g=J=CWK-p?=@d!Pi%IMb7xik z%KG;c>^M#Eqy`F2Oh|=BxPZL@3Pp=$l)~Gfma<=oVVih)He|ZHvSRGIzv| zwKGJabV2cgSJU>UU^CKggGJAhr8Q%Vj0>S_a<8SrOk!?W9vWX+Q|71|3(>h;Cj$Z4 zYI0EuB&|XyWp{*yN@{)2f|)50)+ZsMHv8x86#6vIPshZL9;exk1et&eU(X2o6R82R zrb=qAtVqe&H)L6a$Uv7mY4?{@0*Pc~OAQ(*;b!j9Q;}@>6=x~6HS$nl zN{3hAeV@Pr_hI55$s;n|I%nTYwS@>^edx0paB_#w!rcm%~2vRTm@l3pMX1o#~ z@nLG%>Xh|{Rs0p)k%&Oyvi*a{(1NCi6smi|i@2}8ZX{&J*P;+c&BxfwBmw9r)g8BB_*K`Tl&(1*12#_l#3=D#W(evVh$(C*_9n; zoXhK_)A7y&{e~5>fw%7sx5`)<1qasw|8nOk z6&wTDmFo@I7G`EHa&o>3D!H)xX%?GT{-U7~c0zfADuQP;n={Ozz>y!nyzJqZ3!EU& zM{1W21&=cNT(^}oz*FiGbKa;(_fMi?Y7ypO+GRqbm}PC2POkPqu0gJ5trQk#dQb3J zqs4%@KGsK{o0a^iFFa7FcyM;67Z=>XmB@iK zy2S8HS8ufPC@EPte@@K?`HjS=X}T-w*?UhbMba#Gd~`Ge@OVxTW^r*53kAe^knlrJ z^7DObUL3enEHg1bkDijC&L_K97CIQZ6B4B?4;(l!d7vyYEG$ehaTUQBvScS>-O#(b z9UfnZ0?93{{qeC&C^ldz-ckLL0KplY+KYiX-Lc!iSZd=waC%h15?QeOh&kz-p5Ak& zp|JFHEQe@4Ey7cyQhJKZ(42_g(|(C_6beHQk!k&tWV9&*+J#a z@Qv=*0+P;?l6cY0ovkfoPiDZe-<)C=c4A{=7tG#%o1V`98xfKP>Ed?&wAk^nu{X?0 zJg?j`I_CFsO>{@UeaqAl(9s7mEF#4^u%+x)Vs8?sgau3#@p|8-Z>p9xUi_5OMSGn2 zTF;TO@u{g-lR= zq$6H)1HF-CYgTN`$h#Z|jcd>9=;+{AS~Xh~{`fS*PBQzj>AGwff9$dfv!RS~M*-uHV5{txe|1j4#o6e|J>} zp0(;uGq`K4il?yxe24^II`J{Ty*_Oh4$!T@Vn8=+{@nSj2OMH4x!;-(64BN+Ha1C5 zSXIN>`gaq^f!{Oam^y^7nO@?kUz@zSw?pykO&uCZJD6kgRv-3bLdq4RgWDSfLpmt% zoBNSKa88brHz9}&R=O4sSO>{cHqP_&XIs2o?u}?-XD1toicZdIwnTYG#h5i8JctXP zw!yhmr70WDFnfY9)}=Owif=dk1+`)*pK#e3n7^~lER~BOn>I`91D_5^ti&cW%D0)B zf~Cc1J*;Fc&TY>oIWusL1XTrIS0#XA+hI+mJCHFKu)n08mV4I_U*(l_%{B3PRCTpK z#F|Db6DZL6No~P3bA!rawwz&lD3b*Bq1a$05o-nu`2dkhmZ&K{)&Yz7I{5y z)Cz(Fy!8x1E8Y8a%N?`^-U4SQz3!9qDaMWR))MSdt#K_181I)0jFWgU1l7lW1J2ln zvr0--Ng5M9y%kER?60OTPayhwn~zJbCOT*dzn{oLk_wQ-P+Zb#8=F?Lq5&YBI^|Lq zvUuQp{3}wW>#WP?lO9YF&6%|m;dyQ~XJfOH+l1r-7YamM_%EIjGFvDy-U_VE_qpp{ zV=AKE$+1xm*}$nF%60PiQNgVB`QDH}nyfIGh9p_r0y@{dgb2<9e$dW;2+Blei>uV~ zttdBmlMH+d^s~!Aq~MJcG1s|0mxyZX3_Cjm+T{aQL8{;gx9anOQKZW|Vcuq&hz&6( zkE5WoCvi|pc=ekm772a;*GMOkXwW6E@Rtr_;C1@Oi;$N0ovQ}cbv#YG=TNT<=%Pr` z^Tuf_magP7Qiz0v^CFLu1;2?Ln7Vk59_D{l*$gO8}3w>%{F@Xy7*>J52`}yFtK)xdv)Fq@1p2pUF~uIbm-$e%~#rVkWyqk z_Ka2=tythaMH8)T`|kN;Wlf5=Y0msfM^lpuh)wC!Fz5=mJvGH-P9UXsQcBdVZ3kB%F@Ijd!k*5W?eA|{?i)dz^*N2XCI(PIJ zOS{{EZ(vkls0V(EQ5WCnMU#aG*RZf63(H;94~srkg@;%QCA|=2KL@KZ&-zO&u&u!%;gM^n4gOU1 z_fL?QFLQ_@3CrnIYJGcVq?~bXl*4FRQ?&GyDXg{)5-qTABnCtoE$Ug;ZTgLHDKKF$ z0H%#e7uQ1)PW)J1?FI{RRHk9TlHN$W@85#pfEA}`!W47>5iKyycz9asn4Y7f11T?U zO}5{)X0)2xv48MLh3!<;Co~Cd$S#~kWx4#OY<5vWcOU5D1QA)oe6pkRkhY2NiG%gFwUzrjZmUrQCS zsEibHP(LPW)V?t9zEAUekHodx5E{aIC1NeKC!5a-wmvK3hzM4=n%+!x*$Y7!X8u*e z>ScCpkX zeD@SIDM@h}vS|*t|3)0PnErYPy_?Rw2AdKtxLLz>XIU6_7_2lt$v+?<-*?^|Ny@Cb zu7W=``M@lmJ8B1X<{IA_>JsrL6)K-zmMzksV5Jj91JrMN0YpKRXIm1RzP+j! z3TqiGv>cKiEL%HXY*wy)%@9T-re7im3 z7_9TI))>1Lg)ybgo9^|pGYvxL>4EdZ9TUzn;+2uYuzxa)U*VN|G801EA)FlArV;{w zy!VnVqs7IsfiJERlB$sV`0=moKUNLz+_{rxPUy0N7%UMA5qqA3MeGAUU?oR8HJntlG8G>a^M{Oy$=22u zous6s)1XhiT)<3RiDmuTo$vEwrhhz=N#GFzx+zyDz26!_R*H&$8b_!qHYi@?VmmJ; zhUFpf%gUNTJltdQYoOnT0$0>vsA!9OL3oy-|aOGwCz zQ6ro=bN`Hx^!&7z<{l7r1)l**$J`bQKN`yFp-b|?J(zgdlNtyH z6X7^6901$q)%VNnh4l0il_FkHvmdL=*sK(6VmNctri@_+Ie z3|||{A%G6vH;k9%t`~?8|L2NzTgT(#;_f|NdwTR0cy{y)u1>tNp68~yxV>_6il48tbi7qLmWH=F^NhMm2wy#qc> z1b#jb%2K&(V9gJo;~J$u6LR1m@IIK;;GE+Xsn;6mYww9t2-@BR0PCf%)*1~tKw0oJ zw~eCW$g%m}HgzsKmCWFh@iR~69olZiA$_(l-&Cc@tUTu!ljy|Hu`V|-a?8xFP7^~- zS0=UC+1TiB0Ku!^dkgAWB|e68GDA>SB!&K(mG`BB+#-eg@thQqm~sv=t4zq^0O7L% z-G3hEe_d|fWu?8NKJ#2^%x~ay?%7s8Ti`$k_E3J2b%y1gUqFD{26EL~NhH$GI~~`d zr?^ymmY*@s(>+p7(b?{b%0`HPzMqP0GE$ z@1N74gVyIrC6-if8z3Yh3R_A)4fuk&AeMak|2$lx((cyE`k6mKY35m812;~73{q(J= z)rCjl|E~>nsZkN@(%zHaD3lQ(DVTO}SP^7y`HOGY44wodH0a{U-$3U#_`C5N0R8?1#doQX(DICwrEV)=2T_Zd z5JH;k!pEC_$HyxmD+4B;&C@4gs291pVK2nNTp1X$T1aHD0XXeB9(jLVxV=+02al}# z=}W`0jWCt4sDw#V@Gw#O(ydrX8ZjYmyoFu0%-rnNaR!Dz1VEs=;Qp&ucikqTIv*%` z*(<{1GC*6=_l;?uGjieIgy?5)Exz;$OSxIIF+~6E-~aAM+Hyha$$$U5%A@*o8~pci zkE{R8&VL{M>cLk0?<4fz-i`kAApiZz{ic5wkbfU#2>WM+{;#7Ef7KtB|z@Z`F-E}o-^)0cieIRyo?dSkUY=M-fOQl*PL_n?uoYADJBjk1_p*x z>W?1iF)*B%VqiF~cKjH4M$c~134D|DQ#J9^_jK?JwDGZL(6aIKa`W_abGE%4VDIDW z?CEhwL`+OX?AB!`KR+*DIZ;vf|GYxP)5lTNXZXlAxXKByN2b0E3?kR)k3&J($^i_A z7#P$a+%pJDUK$My(#P>Ouj=%o*<*Xk5`M>DfxKdxVqjBMZ4_pKEu+0Ivm_rElsWTh z@)+Cc&sS8Qk+lReyU{T>cJ_6TYxRBh3tNRL>hQ`)&yD%|#Eks4wy<@vSG?T)Fu3zS zzU*x`Hvam@|G|$kNoRf?`PWn5xQP2KU!qr=tSF}b<_{N?lYi(onLhKYS$_mjEOGFHsZEnv+% z<^tlSZzc5OK+q=0Pqa*9a zsl4nT_U28H(?j~N|G7OJ&y){k1+T+=2PwqC1O*9B@cYZW|Mw9Z{5tZ~v3$sHe&r0e zQmDbgrLScs!b~TRKZ%$px;#M^hlW-^`|qv6Php=64t>jPKD)8sg>@cMM#Lt@TRr1d zwzjVH#6L7X$&(k~kz}}f@?T4Rhy9+ygn~n*nWXQsPNEo9&Gc6MS?X-!W3y712%|!? zOsi2j*Nst>!0pT5-aF7!<$u1CYrvGx2_$voY$>N^gu#XV2YJlv;ziuX3~(7&?Ik$k zqN58^>b6|wmeCX?&3I)0WM=cm?gyQ=@o{89F3W!|1b#@?rC%$5hxvm1>lGIRWDb?g zlO5o0c3}ukdm#heZkZd#_@b^m<5QuD5}QI1HRMjgucH6Ff>(}sNXTJ^g49Oao{vMy zgM`m#&V(%D=02R7RM*=N@u%N7-+tYJ;{M^lET=&&(s0(`-!s8OpNR_JEh|30+(Cl0 z1tk0G)t{Q9UCqsEff2PsV^u?LX6OJ*zV_4qysr!dQdfNKwnk8xWTCZj z`jsoWQT~6N!aA7$^=eL#a646wUE&&6Qd06DkryGg*n|Y*u=amM5!h$uf4{8K73bwd zmiOwOf%f(G#l^Sd$ zE&BSaAK$b|1jDBD|N6Y;Z%|+tCZ8H8v_w{KH&7^i`yoO%Zj+!MWm{7bz)n zUMru@#^}Yy#9R{<&3yUlmEoP*S`KNKZ(wZ-z-)?hw56qOu8F&Bmk4dFI$EnoSGf_= z@#6HZE|TVEH(Zzr6ZM+g%Fh~ya|K6N2{A#OJ!374%8k;Hz>&$#-N9+Zjk#fnrGr=3S9%4-;k$EI6>h|#XzY4F+yZ1qN&*n zx&XcHTyWu_vfl>sKPl?I%1ir7v$!v@g&+?I-VxG_j*U-EM=5_P+-GE6s7iWMrzrBj zAD#Z)tN6-W#`A0B+EXF4>3j_h?cx%`FY?k=@0uw1FHDl(fN;6&=soV+Faw7MIARSd4SQ zZExKm4z8YKAzZumbFD8+@$_aH7KK8E_%9X)6q(QGvs>X`RI5a1N%$at^OnS~ zZ0~>VRo~A&edibyS{%xq36Yi|>!a^#9ox^TzFDb9w7YUgDH+q}n5uBQ=k4a3-;jY_qYRD-v+a$|zE5<*0rkwfX8^nV* z-x_9}_sVNHJ(po2t}H=B-$E@SeE$0j8DUdQFNPFk8|~1!qmCMt zsQ(3xiO~l!$O3`(BIasALA}mwBz~e`a&9xwosdHTpj%15N^G3?V8H; zSWur0Ax1|bXJX>K|ikc zM*_=}HfGVA>tZ@JbCk~@k9_Fu?IRIjsaxU2T%qp(digNwxiz-WLSjym^oA_WvP)Dl zu2Q&VZX$3l$msv%h$mlte0?`@_&%5#F_M}$D_8YhlRv3~9l_EZA^F$oi za2;h?pJXOE!V$QY3Z-Df-@KLyJM_c! zD|W~IDFI3G9c{N4GqSUC1S-3GYqG_@K4x)G>bMb8v;F>gp2h5a+(l;8A%^c?0p?`5 z8@z(i^>4qR`Ockzq4NgY4t(oI`8p({#cg$P>&TuwC&TmdBjlkuR%_m_2UEvEwEM1a z;th5$a!Px~;2eAh2a5d>8kZ2bunrKVe3~z4Z%0dd(CzkD(lE zxOE=b>Z1O)J~U=*DIGk%Q9gtrMIVB;ib2${2bd>)j{6e>N{lQ#K2Av;!E(u;3~YSw z?{Mk(h?)QppzsO|_PKm-?;QojuyrFnra2x4FG{PFp~W`^KG`8>Lg~4dRz(%@#s3bu zcvq~4=Mrj4^Tna=NJ~g^m1TE@ZuUnI1IXIa$TlL6Z2Y&_{;BcX9@P}Vus5#<2{AdL zMV^jOQQsHOEp3{0t`i&a;{(I~oFsx=rDrZknXz`1e}>-op(s!@_y+4}&-O1w8;R^dCBcvtybU%WVGm{p9DeqlA_s{!zRe{#f;N^CMS_%ja)AHUXgdyVL zXWyG5ATo-~t@4ah;rBf;^199E))RcRG_-p}vBJ0f>pu)v^k%Y-W`6oKQKnOS{FUee za@kU@rm`y~aIA<#2pl9RDUB6ybDO5Gzg%n&4rZBwAk^NpHYcGtKu}23J04+Zz4jg7 z)~7Gy`9=6b_>9xFhF3GwjXR9=&gN$W=xkuB_1pt_7t-@?c7-Z`$Ce*rkda?Wjc9Eu zKauzJ!Ut7#^%fQasJ?&Z=FFY#jD)6mS*N%s=OW@SbS>dCw2gN(^z5J{{v1h5$ z&i!{Ain$6sQsi5o-j4OJZDe9)HViV!GpBCv%B32=`f=HsSH#_siPzJU2c*Ex!}KwZ z{D41!L`EgB&+#&N4HW!_2k!35@UMnK>pQ=|32S6G@Isb)$IOgXx5I)aE@ribQb`R} zCEcGixbNKRm#vSFPBeO;EIu>STVXqr)JB|FV8dn-D5k6YH$oEdBLyoZO9nF8%Y+zgC|!IaJCpu6{hGk{#(R zA%~3>Hge65{1-z0yJ2E$ZzHrho7;y^-BNu`t4Al#{b!I~RUn7z#oUNU`45K6dwS^L zK$`&awvc~&MkJX`HqN*EPg@vtKPagBg79`nUmtxqTqP31Pky{Sd?cmH{+WXz@rx?A z^3C7D|E`LHJZxaB7r3~t^YZcnj7F{M@0S>Ile%>BjmD)rvV1sa^9Mme*&qLg>)!>u zy~F+f%2!?sL1~dwSUw%A&5<$e#J4I@hMU1+$^8x@! zMX_R0yvmamMGrS!;>0ifJ;}MDcSz1!~I4LWO7u{)4meNWg_rIB;?==FVqFsIZ3|_}3%ox5Eq%h-C zd?%IY@4dFns#- zZdlact0#jBm74KIuMro^%!*P|nHX3(y{EN?tK93Z=WC~!uy!4jQI^0?91eT^7lCka zaKMwSg#%q!?MClCIoQ-kVBg(vkhH99(4(r@r~c2<@~tF_q$Lw+G4&6pc-VhJg= zj%@Js>9=qPI!6b3Nh$XshDXt7&qhK*n7#+k#Tj>wGr345b@2R@H~-pk19F_zP!#NJGG^;VLzVf% zG0@b2xAOeGZY!IchSaJeZhEM@OwYQrDGijxxh7ZnFZ)sUDVOQ@_}?$Ds;eL~M=L4T z$+}aaJ=Sb;O#mcUIDfFKMuIr2EisK@;{FdxqQC3zDrisRvZhtt4TJ@IZ3yoTX~dP! zc5G5jBWbe$(aO5jWx+i!MbuaPXY+!0JujG|Gb?j~o}QkT{yW(K&3lpvg+>TWqLQYL zQYgG83VvI}iunSKR3d!&yY;JM6rruszppTtT3xLo=d+R5P<2g>i$Fkmiuzb*_T;gU zLy9wvAov z4X{G=cPJ{Vj9FPRMIASGd;GB;ZAlZY{u!me&YUQ4{razbYx}gmbNpxHK7IODxa77I z1Q8Mx)TngD`%t&36q3G%#{26n&3I#B^9nDb9Uyg<2E|eyJvK;{)tQ{MdH?R+=cp(h z)e*Mr?A*n{p3K(v_GnZT3beO|nGYj0c2pmh4;5~22W98vw6qa4aR_7Mi1~RY?rUI0 z!&!NCLqclnq4jKMc#0DxU28Wj#w&u$*V-L&Yto`)Vi5j|18g;(1_qM2BJ*6g7}1}r z)6M=MYS%vucR3D0Ff^uhwh^KbhgIjkbNfQV* zHj^%cB`;KXL219H7D@c|?p&G4+Idb+1QCa*Q+TMS2g2_xpbE?d<}$>a1hy^KHaGP@ zTwuR2BzotLJ{YHwgG2n@{=NaiNH{DkEN(|BHc-1ciWlEw*Bt98Rkxq4t)qkQiNT)- ziO>*Xr3DI4+tb_CiuhNI)3INIevV-#UNWCQeR_i8&7_C*q?!GqU?W`UOcxj;Ri zXg4FoeH9hMx&ZftVw_Zx)*>DmI2i9(DpPSsT>L$Hxxc_rQ_^+dmOmE)SCFX|B_JTH z9z3gX^ytw7qargV78Viz@!l_wZ@3SYHQJc#>6NL-%ktF>QlFqaELBxi8zhkB5&OX$!6Y=_Zu~KDyuDuXjw!fxQdOHtQ zSd&1MO868Td*Gws3m?E34N%&aJ5;LS{Kf2+mX@AUJ2n4X2j4>L(dW6&7JeD7WIKP} zz{ZYCG2n4?B;Rj0DIp1o2LSxWrKPR!kJJZ$C@U-HQ@626cNwT~{@T>m)~3HV*`T4V zQ5@?FA+Go3;|;tXl@Nb5#V>?_Dly>U;|H?np%F`dJ2C_CprB;4ocg>IBy5HY(hp!`S-J|;>bNO=xrkin3%;i86XEhS?D7z~EkpPyNLNveIO zlu6F#&s&G~J#F~GPVUqci|i;57gyE?dCNkZhGHXpvE`^-fQ>`B>H2IJUKG1mu(>EL z^Vjfo0daA?{oPHR@HI~(H#fJhO^?9GA+OIlZ??iKT#a?R?kIy~p#6&RR4-q`$y<^a z?>MwKXgv0VebkYK?Nx)4s`eRWdB^PwXrP?8$PW%BNxAp7e=V;F-SNq7wu;Wk%*2(e zv0B3S{ar??O9{;=vm&#yKc4$54N+#5A(cKpK3pEGOiX&sk=zm+L_~k48f!wT^`%Rf zSmv?<$yOnOKjov>8f2_PSHosI(#R{r!E5iD{r5K;G!>TLoZ{SUh*EYLDw~l5gXtrI zP4Xm)M^Pel8{92VH-Ej5=*^^*Kr&o#!U}^7QSQ*y^YSS3htRPB`b4wxWGy0j ztdS3A$HRLQ=XxxL*@&W#3EWtW{bFs7;3|7T2OE42TpKVB~E;ppl( zd{M%c;wEg3x$o@k%!1n4-7Rn@NY&c@K5ZGYz}I-JOZb9jDLz&|U};d-Ev;v36d_N( zwF@d@4xi@1z}7hJnK+@mT$~WVL^@}dnEzj1rnUgJkHql_oueD^HyM8cB$m--I)aI zN|#NS?A%=WP3OUq^xdsRgewx=MDm?$wd)3ov4Aa(jLbz4b~O5A_NXz2jAhHRAbSNapA)b)_5iW{58X>|%#+Se*B%GRUaZN~v8sS-{iYwsCUx(qyN*!3S(%IR?EQ%eg?2YjEL8`AWenM(Lc zL44@ng*opyz_oZg9fj-&PH8p*zp$d^IBg{cwzt3@fg$rK?*67(u$Y?y9#O%$Oli+a z@3S>AH99UXyAdwjGlh-M+d0ZUPeP47X^Zb<8)_w@#t*vbSL^TZx2691^T(-WT(j~I zIXiK0!EtwGKM?or9u(DF(C%9sNLEr@8$4%LN5P(@g097-C!^7!JiWdp7Uuv^2I9?U9=@J2*!Ch^D!h+Ffl<+t{{?A||@NsR`Yy zuUF_uJ}AN@iJ^Z{V?cd|ADHITA5r{T19x_Dj5vh6zZLiS zv#DF!5k{8z%y+ztb*AN#2N8H&v1OfjlyRbEUBJSm8jtX5rCIF9k0;T0CN1fyNZW?| zQcq7$5`N&Bs7#agCy!}~D$p#x9HH$AKi-j;ZPW0EI7y4} zUKCS||Mbn+D%emnK}3i?{bk`@Ige8cjGH2bs|0QBA8Bax>gyu5fN`D?dL3C~D{RS>a(&FdaHli%?@B`eK!? zbqY;69Z8Y_ONikbU&nX*l;u%`4rLic^U)AQ5d`K;q`V=#H%&L2UN0dZmoz2jc1{~bA@V6<1RCj_EEBt>*U zjTeJ-!L?ewSlt?D2Q5pppwfX?DYVtsBXD^*8$yQMtqUNDR7C+sx+x;5!h8CLR_fl@ zv5@ssn+ttyBr51?pWp;x`$rjAY6BOtcr4{)-P$@kd&)(l`r_T?N95v%l5<&aX!)B( z4>(B>;hE&vv^39}xxck48R?^pjEIm*7ZzpE$gn_v{`{G|Yk)M;!W9_%1}Ce+MFv0+ zO`pHWeCm`T0APIyC?kX+Z>Wr}opo?W_H=G;?qXAtCvIDM-1~3R9u&un-`UtI_wiyx zxMeQ5K)?tXr915~n-l9HS|XUk4$q#w z&dA8%f-wn&QuEWk`4l#-w3m0WUHZAczOD}noxY?nK%Ab~l;UO{NXDtRq6cY zC6Kcu_IA&xzL^G4`urK5Wj_%BKS6+JntRq+wzL#08Y5hiUji(j3OP86-W^_KxuW1n z-gC9n#m`MQM=g#~AG-GCOucHF@t*j8Z`6BkR25?cScN|`mVTA})zvbix2JA&q)^d) z>sCa_}n?%h+hLT-@=NW#O>Vo-GhhShv9Ip?>g z)(ynRNA#KSZ3mFp6&cm{=WKCQqZmho_Bzuk|3Vj|Ug(Oi_ld5J4L|yzch}mGT=#ql5HRXZO_9@mVE-#4l(x@WORCZZ8VSJYY&=%|HEp=pC&&x$_|x=2yuE7{ zT_`=l!lD;+rYmh}$xU&6ggImj&8m@t1r-c|#HNSyLhFAMK0tW2H8ckHSrxKS}*+MnOhzCzL2@mtqYfaBHsFPg0`RmiT!&r$+%{nn*%^~O9*a;>Ex{))EN{|UUigc z49f~>`QGLjz#d& zs(iF=sP{fU*!SDt#4k)~r<~_Vw3Zc?mNrHh6%9~%wf#&mq;i2Ygy*;taja-t&d2cRA-=> zy!}Y*-bAlnOrZDdDSp{I;Bes^@>=<#-nQ)&=(DdM3eZ0D&ZbkoqqdoqkNX9}nU zBcy4jb6<}9Mw*0k*~#c-3{@m|x@*@Xr>_dO&v>Ekmy_!DB9d=+I_fB;3W-EMjHuP3 zBlIs{E?zo$3;->?&10fD4;uIFD=NJEYmH1)OJE4MUbzo4H>K37c1S z|NbnE@SW>qQZz-20kVO1P-kQf-LD)d+%eXJNtRQ2gC5;+3`Mx$ESPy59qku~=2DHV zQdNPup?0~}RWhjiGMK1eJg)@{e0m0o2!7-9j9l^Yk&%%D9nzzD7$`L_fHW+A@g!i? zhRYqJU_1V)IXY=q`dVDSM{>(=V8eNPa?>7*lxjRRjL;vXZ{WGK^@MLMEG)hLcq_z< zBaC@~nxw4z06v4>jK=W8ZLJe!fJCpOyk0ol`PDLqPwE3;TsB75MQ=(<8XkLf@6|EO z90amfqsXihl)W^xjt#$da(7DLXb}KNL#U(2j=B7L%jwth{g6w4-e-V;L4IXPtIrAD z!5M3)x3JdoUBB+MvA^ZowBZTTvelI>`}KI?kck(JaWTGfUpTqBi#~%sFl`LIWXN4) zga{yyWm?1b4MERWp`2rm^1y-4rl2K8StQ_usQ^}kh~A0}Fv+RVPLZqK9QaHeMIzOzRnT}nDVF_WYy#zG5Ipziekdnmi zbadOaA<}AeL5T}+8wnO6A#sT?D3ur?Z56olB@Af)5j*48fK4njYmaYKZNv*5vPsOA z^S8CXeeoHfvR0lZ!*+KZp+F6#FbsaqRNEY0oYsKyQvJsi&>L$e;qF>V5nN2}8NBWQK3LUk7p-F~@W;zAkionAbQDdOF7hc#MR3lD#v~^tAwX|E4>Hc;)?xA~ z^5Y<#6wzhS+=~VP0o4<;8F@qJpyD?nUc@vDj7Pl{`LW&y=K|dwG5|f{&#^i5ma>80 zCeg!iT&VSR;5dH#=+6SWvtjSOkl)a^doI0M`NV<9cw`hxTwJ_j8_5@9w`VRFbQ^BE zl$^|^xWBZ%3+oJQ_A~cQaI(wJ0mEQsFqwB(Ehc zw4fn8$_ZaQ8Zu*uhqYvX%jk3me1QZJtY~j`Ir^+ma3`tF&f3t{HX1#eXQQIH_WR=I zGOiD^=jPy$Lx+EKuHwKPH3n1Sf&KBWbnk1Lydwyb_t&OR@n0?dxa}CCv#2~U4aR9M z_;g6CnkVAThqm-&pS=eesi6mk-15tN=FUK7Cido|hb!uz0JJM0bMw&!1W=^}hASPB z2d4XJ0c`7>u`0-mS-R5J&LR{7CbU zc6LAQ9AlVx+yIe!uFu4{3K*D4qtnQh1Hc2dN`5`h!&A&U22le+aVx+YNS-|)bp@|$ z!)pjd=EhoS6vI+#z1V>;RKhzNZ3&b`CF-+ik=nfNnUlUgKAS7oq81XY=Y~*#b1+zk z@8|!zd|&-w+wR43^`aG|4o<@)t}XnrO?aUN2$d37WZ<^mZjAal|Ap)$DZ559virM> z&LOik>`Nq&F6P_1l*{2K%wkQ;=ZK#VvpFS7WAFB1Q;ghbYP?Vjpm0RT(q>lkSEjz* zOIQe-ODkuzd0%GJ@K900;iKZL*{n>&jk7R*6@Qv_#1kTPI(o7F%itaQQk5DLqoOHWk_Y|-Abe@ z@=}gtYH;l!)CvMkR+*`H!4)hl%vn8&Do**M-@ZNo+LYOLvcy3LitB#HIeu7Pv89If zL2=ouAR1)*O!(z?!0ts7W!d;{NU-h}NAoriApJb*wZz8~VCHC11w-r(m)=!_pwDEW6EZxV5mtC_6*S?V#i z&9ZzTv*WF#Ey9`h$~>ZYMmKj|k@4HLgi6;0I>?RWRrVOCOdQ#A?aw19$VL9yu9w}c z{RCJs|6T+#Qdn#-XukW(Xz02y<#y_I^e)ll6puvSAk;$FOFNf`9}ZVW?+=(0jqVRp z&jb1evdmp%h%f?6?mlcl)(%nw%$Q&R_8h^ov5&5m(VPvF?o56?+9Zp+b^Md_z!${iH*wU{595u z>g1KyI0PtgRPN%P@vfAjW2ZRI57EBAc*OzR-(<1rH1|ZSZbe~`zq%gK;Xladz3D_k zRuumQ&Um4P(sv)digTnUN4F%wgG7o}s=H;nhVsDJ8LV^7O3*Xyv3Y zG{pj5_%5(LRGEABXo@NsPbCAL?*vUcvK6>Z?y}`u32S(Mgc@xw%F?ERh@l1-F)cp9 z3oTGf3pU;Q7<@mI7iQLl7Pqq2O0#@+yzA-h`KC#guEo=T>#q~-(XQeGpj)_;3)i=O z`nZ+mL#{NoiXU$&u+lqVZw0ZUN*Tw(u{YprU(wv4G4#ajg0?F)7HcpLA!CX_svAO) z221tn^pj9v{v$%5jL1wt!)62BExL0kBf&c4hYi6KzNh=xQw;!4c2U!*5;El6n21>S z6?Oc{IV5nT~SbX>C34cOSye->}Y&MvY2lUfR5*f z;CPQ_zD~d~7yg>Y=j*FwlI!p`grBPL`06eJkUxN!(amoCSXk^ezxts=heCG0<^pGt z`&Dc(V3jcQPcW+XRVK>U3^V&>6IxSUtha z+y_9s=DhIc(vUuge+N%~ety@{T7Ojvl=h01J2jl1~GzuKL0ajO@-}fgExT5{qmkzL*inwdd!W)+mr6$f{FUdv=OVG9{uU_ zMz>#YO@@;b%q(w9Ne$%NPWNIzz};gT^DoaacPW$gj_X8U5Z>*(^4d68yHIKWnI4!S z0p;7&Nk+1e!k%BZ(^&n^u;sU_4yMr6#suKk0|kB{X?pzTrkMM1#k;YTm8u3;o7UKT zZOytgaT0-U=>tvZd|at$!bLE~BTlS}8=uf<-#P95{jJ`!TLMuP8-9>(&FEniHjlpM zyq)fVe?_B1Iyl1LmpH!EN2Vuv)a!OBQXkXDLJPhfRAT2q8FWtF1o{BqJ)8Zv$to6p(GW%dRo{$xoq_dCQ^IE_oXlQBq5<%~iJ7*Qt;#?=R zTt6KUQA;v{$n*27kz6%KG%_G*mn|!wluY2aIQ|lW{qDzSLb;J53Ov%PEAEx&ZmV z)I@m|@&>_2r0r~g`H;PZrPh5&O9x!5LfB=VCt(Gus>CAWR6H>DCM?QK+Sr6l=7;+? zNE#dduK!!x0Uj2G{VY%iaHInPww%^2ejL?biY)h z`n_+^`x-dvi-fkQ8=vHqGeAQ&%TUum!?|^0QK0514{v6ViEYqkEYKYMgF=0n6`P{{ zHs*Er0g*rn0CXu&$o!#%xy|oKGP&f(o!*9>qnjVDf=0L%q?YApzq4}T{z0XsfZYJsbA=LB?rw#Zi6 z?hZQ(i9Ho=Wn2KV{nV~7XZ zr0na;-oC!g=9gjG`;TwLV0MYF;ohn6Wzz&C{+dU%l|S*qFajdm+cz`!D9dw{_uQz~%J2z121B48O z>5IGD1MY+hC^aA#W)F2+uAz!h9kUMYQ)Laj73>c@v97d(Bb0zHo>9wG>~%ofUkrPb z$^zZr=<5<;j9``zxb@@UlHl#zPhK%v8|`XGhxn0ayT>YB13&KruHP~IJ-XqI6{*70 zdv9+~0+tME>%E|a0u$D=*?{y7h8uUePj+=bWLHuN4+|p}%X^}fmCdT0CQsi4P7Iko zV2vpFg2krsR6E9wh0e%Ux{mf1L0`Q*EEzh;w)^MRDzUp*i?8Evlm7FvcMLG)4vr9e8I969||7DB_*}&0%_Sj|4Q?pwN)>XKKGldtw0lhlZ|eN!M~6j#*1Pl3*E-41JaRFE>veS*N-QmJ)g{>w%SFc^;PL+1W7vm-y)HDXK zjk6h_^sdeU3NErAS};5sI6C9=TQ3^K=wf$gr=Z*)OPPzogd$Y6f04w+lN@pzg5mC} zmYl7-gBFmECm>e4lv1+ZoJvW+@25YJoCdIXv~g&TnS})q*U2m#bKrCfW{(#Y>D}5P z9Z>>*GmP=iOsqAzRJr09m-Q#3;oJJ`{%m)^7RD;b#&>gm(#%W8M+s%e^QQDFSC*8h<)23kbYyedR$w?nwrH35Nb?sxeW$DI@cHMk6k|B4iWGLV9sT!zvMVQ&^<_ z$&Vko33G%pdxU-(J=$jA?gmSn8qsnAH-l?_zZ@v^R)E_FD*?Ca{7+`lioetN>uaNx zAvlik0OvM2_H1BIVVMgC#I!aPWJprCNE;Lj@FoeF?U@U;+-0$UCc%NL+gfN%1Gu<$ z3)2G_4E^i~Q?|p05BHBY7C0W=63DA|B@%JDyucnb@23^e*cf(r9t4u$Vri*a5euFQ z%o{E}Q$NpAZkkQ<6-c{{m=p)sAiTE4x|a4XwE|*byplFV0L>KcD0^(Z0#sLoTc$f3 zrkX;KayP3}Ock1|vKp{*A@i3;td!amegsUS_vY9lUEHhc% zK9sH!-YSs>w#NbnLhh*}L!XXQfHfT`hP=RBkx*cbRU!^&mxFZI=C}7!a51^|Dk!sz zEL{DamUR`rb0Q#ln9B!}dI7R(3vG`VZVP~$Ra8Hb4_uCorNQ|br>Fex-DwuhHm`C@ zzxPU{uReI4w0{Gppx)=$-k+Ut(jcMOvcFV?F}M4^>G@(g6I~#>Pj&-JYDwrSFz5|q z+LM8z`r;KMu39%!k5Zt3Kgn4zRPIQai%m@hq6qvxz|(zv2^JY5De?&WwhJDNI)S7S zdm03U>qx zE+OqAvtr}FMoj1T09!ZToCXuj30y5S`k+ExnQUNbld81?h&)?pYiTI6TE*Lg7o3$D zvX#yP59)FDD7*&eI+4?*2Duq`6h5?34MT9pC zOm&`f%nc7ksqm@kxKvoJ__Ifk-U1@c82FLoHmD18)@)qo4T1veUU^3%Q(6m0zI^$T zwNItE%oWF^r3WncMyAwhjEX89l!)KCLn0a3?=AJ0WxFCL0qhibKvQsIJ?YV5o z(iasf-g<5kJlOjP{ztKXe)uopJl#E+YLa%dx2RPgKR)hAR8#{#kk36%bW0at(gT6~ zXigG!G0wSt*D&n;bpbIkUATx<259$P=}Iix5%oCdJt6~GW(&JNeG(^`XFfa?PFa0D zt$j~HJ!E;vF*Z6ngH1?VG(0{zxo`oPNOnJdU87KpfODW9$hDhGJt|sBwNp&uNm;tqHj@$wcCUDO8CP+OT2w0L;DM^D z(IclC@y4bm;^+y_MWCAdn$&{h0;kNduvZ(Me;ER0l|2w+0#sq$sO3>My{4^i1!uXq zECiahx_*0^9NgjKGZd{~(F@~3-ON^!3bE|z=^^%@lK|_Pj)Cspl&JXAoHMbmA5GVo z*{wo{@~w3V8qx8o%SN;*P-&eT-@`YkFO@6(7cY=T>x}b{j-`!w7k0a13d!!3mLo{e zS^T!siFIy&`CcA1S{u;AIcr(JU7Pys~(9JIN$8~kE2lc@S`|AQlH|NJvvYo)$ z3e%bPUE}{brqXE!#JD)0k&O5&MaP$K<(qx!aq8cew!$-#wVtGy%oT70otRU~t)G!s zyT988pRb0*06y9e)m#XwR5x87*g|LG()EoM*XE~pJqFy|N2`kNs{}=J#n<{7Klx_Y zm^2libP7OYMlv=RPW&dc80NogC<(EfJBdKSkUJ#5(s8GD^4fqM9^*}565Xw-?e4P zr6CKLS&lN+uzwLyz`xh?5|}RF%Ds8!%w(K+KrmR@TAZ?cosSiNe0^`1wYQJpqL}ao z%)l%8j^gV;ja=;%3Ex>iuqEn#6Qa^&(yd`ThC0gog}a-)d0?H?)mooiDJyvWCbr1M z)>*;Z@+PU2?)6Bn8DIPn&SOMnVPEWNPBjP(?O~%_7pRL?V!i<5t`-8PpU#azt=R*Y zi$9}Aa-7FQi~MQ(#@ji&tO|f{W;bZX{VD+SPZw$CC_#0g|m=8)I-5e z*xgO?q>Hr(m0Xb!=tvMaKV#IY0BVvT2iyOg^!IuwRR7p~x+y~N`f)=n4DG`^-6|CB zv@+3FLHE}v(*lc3R-;%N zK*`H{1SpP25gd{R;3OUiPMZu*+oZ^!8{t7J+>8Brs3|&r894TPwWK4vEAc1$(tyhV zIB|MFQR5cOO)0Z$W>GxYj!DG3Vyxi%hEd@10V`SZ%d22OZ3&|I_iRFR&SP;5LiR3jGujS~0t<79J^jK%Ac5mUHgO2Noe}R4q^3XXg{`s929`tBsrOOwB*VDGiu+7_K+FtKx&fSeRzTrSGfGq=Mt=ckSiw9BlpVg9kL;!^!s#0ez)LZ{pI2WY$4;#$urTNKamM zJ>XcQE1LlAq*hKmf(Eujie5v9KMj4=xDCtbenABQ{ZfGpM8R5L7PaO0a!-}WvK_OEsp+Z zHAHa5w^3bN&PH5XFS((;_XLRh9$m1Dl02P z!hW4QYUS#f`1b8_x;Cr_lW}WxOfzcrEh=b|HDpkN5*`Ky^g?zGzm*uL<1McJRsqEK|_}f_@5#G(P$x9pSUUyf&)1L7$|d7 zVGl7FB_aWZWOTIf2c}_gEqhi!9MW0`$bgltO`_X_+dCnP^vstQhp6xy@&Sz5(3mLj ztFtO>C<8+zu~(B(j_aCWt62MRoiQs~7G@FGj=c%~F2q2D^msx0Vcepvot=c!%4z@Q zUe!|^QU)nzxEb@CzmrV!hAnmPt8gn%U%zn!;QD9$XU|y@=N5bkIsQU)fj^pFs0|SV zPCM_}%&OeNfLF?noB-VKNgfzO<@S_pW)UYN`*naQyzoQoNMIeLeUilAyK_ z(-KqR^@CiySS&w7g38^MvTrpYjnuT+D8KqK;e}=4k}+8-YfLpl-aXn0JbfgvQm@Ax z4`k*Fj)htA&jg<`ihYSQ_x1JlUzzx!aVgj4#UkBT2-;^s`{aVtfEWX2I^qvT-fq-5 z3<$&ry2ch_zhHI1e==B#tUdo;jy(th5t5?#g_Q%6#>o9>&*7IZU($WeiaWpTb~opE zD>lf=bbs^`3Q)I-I~#XcY=YGbjFH7E_V^;6gIh8IORg+kY380artm!_Yv~BC{3fl$ zSRn>(>z-jyf-HC(46qBk5u9ER4Jf4_}PdJT^a*VAY-W0frYM$;+zJW~b_QZoqU5?c{g5F_CrwG;q1;vT zjo}-*nPvOzL8%(A5vthIVi<4M#MgV>xg!xiI@Sz?>4v6Llz>VX-5IN4JRWbX^2VYV zm?8c0w&^CUR{xQ;+B{47a0*COt$xWsC~|5WD53=P-OxI(H?b3#!_3Nxhi;8!0(VtE zrUS@nlw?_LD528bl~xC49OMaqNIfv_y8x-#tmJ9B(cZew*IA3ipHZZ;8KF+1cc&rf zfc%|A%`qc)&Ix=g;OVOhTc)nDEn_bL;uEx#Va)7?-R-TSQc^~u*o}>rxV1exth=# z0Pev$T^Oh})P!y}p0_lZ*rj{_0KeVi8v{IlH^Bkn|Ji6g_wV2D&%7)75x`1U98uDP z*AciThtZHIx*K78yTLxOjoliS4dm(}xJ8N@Xea$!_;M3W=|^&{Sd9vXOB+gC^?`@M zVoX{r-%T@1y_Z$_;15OV18rCH(xqHPr{BU9*TvAeloPdX-7}Ola3rMKZ;3fkQa?$m zh(xli3j}{Cp_wFW6bt<2dBEvOp@73FeotvIRMa{sZxp`ceED!1j7d}(tUuqk)iVBdEmj77tl z)P3h*x3 zFb&AM&UCc>`mAk8Dr9%lx8A5TRS{3J%gV}qT^Y$AK6fRp@ z9q`EE#~=44SVKuG`ooZI&_c!_G;(6}V?clOMEQ9Lmm(5KhMa|Xndqx>^|1HfTaAjds;{IqY=e0tS|#47p%i6vm_}8g?P&O{zw9i7+Kw%d z;=%>fT`*@#_Vz^$o2uRvJen5B_wC8A=t?NP`7DPMkW997e{-`OO2<_tV{`q?;c`7a zm03RMf`Jp^j^?pw4QJJm#!IeCcWtb%Q@)K@Hc1tQ7`QDtuVTAfN4ikof9B30(8-Me zQug+{Zmw84={VezK%sWs()PVML{1CIE_|uo>tcLlLZ**)67qlI=Nwj!VHJRQndRl> z7e1*&f(YH*nDS-f+xC##P7W>FA1Z`8Ieb8CRH``oA_bu^LM-~;?)Bm*-r7;dkMyiK z+yY;j7QYMY&4KxCRFI`+)%I#x#bBD;{K-uKhypJn^0l&lQeLhI-xVL~DBg zyzR77T+KDk<1<@$I`HBcSpjUHAQf7v<^h4RweG=Z3K*#()eu|hQ_wF_=-V- zk0^;&n_Fzg-R4givPc>xHn&jGZXJU*O7hgd+kQ=CP;(jcLXKM4I(2feETZ(xLw-Bh zt>}?D15Hu}`fJyw-2(;nEe;(xFa;H0#&*F{hZ#&l!bNB2udnAJd0eEpR-m5!Kw4Wh zQ#)J6CjBs6j*U>-S3TSYtl_Sm?L+lktJ3U&opVAds6@!cQE%2~l8xew+Qq?)+fMfv z7|8iR-ZH+dFiTxkHJsb5@2SNm2;^LjbTebi??S4-xR}RmAVKn!i0yXCPL&T0)8B&} zOZvcbs_1Y%x+*CnV_SkrVBT1nBeb|d*-wkK&Ad0i^U@azN~*Dr8mPp56D8*}b)KFw zIDPgkYI+gSC~?-NxxXL8(Cr?7ZA%YgvjD(p`;e?`(z&ElGHYt+uQXTtaXHMbt**ik z(A?#UJ2#=p_2kQOU$)#WB3RG#sdlZSm1g)#Ehr6ERty5AN^zf2j^pr7D_Q3yyz81P zfam%Y*R#NWq;uP99jaVulU9Z}^77`8$cC`bBM6wTy)S%`0Zt9#b6s){c<0GJ6YsE6 zosTn3L$1zR+HM8IT=XCZpmXDGP1#n>wiYx{c=LvhfQngIxZzWy2PV-Rm5{{*Fd04h zag(MLn~%@{q=lvsy-Jfl87U9JV37@9J z0-aV98n~p)l{qe+bmeTV@D259HUr|*-1}wPh)*s#as9cu@^(`$c@-79H4kJryKp8Z z-}OFao?YAmJI1T@yEPoIoSmWj8_~^WcIYMIx+!#v>g;RxQ7#Y^_VyP{eCuQ_9?J2g z-*1jYU?^=@f6=!yQ`hNGL=Nv^C}Tjq=RAP`8tE(M)EOc>59Mctk=?&EWq@-?~``%sURS5Z1n)t82E%tz>~jMy}XzfWEQ88hd|*Jzq>!OC1G8z>YK*!-b0l8Mi1 zv_;98aGUB6&-N)7j86^E!($Uac#=;od>{Gj=Dar79wH}1$jw%|K5-)TD(F9f{_2!c z;R=LYa7-#k&$2PC{*30f=*lkkZ~N$Zh|o{#yrtkn>Ou)|P$~6ti|4965DRHtCf%br z^e{?ZDN3L)TLFW!@^e(KM~583g+*TtEG_~{duO6r7Y}vOKSX2y9ZO(o8j_Xc!#DfOUIMAvl zL4HI=PRMn`4tQm$KD#`rJyz4*SZr&O+#y4F1cder=|_j^gWt$#U$+BsJjs1m%LH!^ zF?}Y~-cp9J&!s&le*Bo;h7dF3ZWpk(cr`N(zQtsqbet=`Oq=XxX=bbqx#J&ez`l~A z$-D}5muwAOez6?L6w~5m8M|*XD}gAV%W>hN^CrUUww^KDAQa>Mgyuo3iJnS{Al9YD z?-ABycmm!h*6si)U`M-DW_0M>d~UWzagNw(#adihN0DqakaI$}H`ivyHN=hFp85JC zB-~0@beUa@5|S!Dv0np+_6L@VTHZv9DfbM}&Rgw1Ti9ZZQ3D1HAV|n#uNb!6ehc}Q zLF;}(wJHXrp6v!o!re3ugI9oS2SL_&*EW-jd9itaDsv8XDkNIZmIangtj3kmFf$6T zZTW2&jwC<9>O$DuUKyK+t>V+_?R<2Dcgq_3uK}^JU^nxho{)hh!_W0W1L(zV(S)@O zhV-j6TbU;E#86&gVz?m>GP}M?-LxUJO^lBLb7!`aM7%4%vpO=;lP!@Fc& zlcmly2%LjTMcm(8`=Ch_ghmb~0N44gF1Ie8BOlP|NX(RhX#vKXE>f)s4ux1#n*IDc z7*3$E`kkhtx)f5ErCSp)1|Z8J_%G&D(dP{ap(;y z*)7LlP=%#J4z;ei8wEfdX@dxHL7>v%*^IO}`Q`COKcQ9KKoN}HOgHn*o4cAd)iiBj zTT)>(FaSX?P=9i9b%k^V28k@{f~#mMPw)UKXXe2~%BtXZ5WkuXyzgG=(Ut3I-gGzF z?aY1LJvrhhkO7DsbA~bnLdI$u{$xsKRl_y&8YWK&hK)a!&7W4wOJ_g=Ad6Jl0svw* zdEQz!u^VgiX?-}82E!W+-+x+(iQk)qu+(m5=jZzR6vS&C6>EbQRU*u&oHk07c7`AO zTviu6raIA>gZef9o44t}CFd2KxXO50u>6ZvyxWE(jj(l(b|eEIy;z{|>U(N#({u>+ zGR$N7IjH^l!H#idc28E_RjEW!6tc$(kTe0_pJSS@OdR!uW+zVitk8Bx2qLYS?bmPG zdLXjBQh;8W%sI+lE)VVU>YM5i$6pAVyELX?IU!b1C z#oACepvCN=3N+?%k~k?DsiL^JHx!&Q^co`ggi`0rx9u}1IV>vllF4X!6XxA(vF{>) zO>8wf1Pm*eM1a{Ch(?yymX)47dDoS#Gryt^EiQb_t6W2+*QR_giC%aY2g~eKz(Ixrf9SIh`5qg4 zs6wNph8YV~8&x2as25ywSL+K6RR*0zJM82dviTY?LVZv+4aYvriHT|dYY61~70XQ; zWML#nnFx7C?g|2+=4W7Ueg~H{Szn^uz_u(kLS{&HUOOPnTyBv_>@aTJeUDfVT8vfrwp@~rpLxPZ5#oao84wnigZM# z!MqzJbbb1CY~Ns1{1hR=L88$EN6${xzDWvB_V6I_cP3D3adi;aX5KXsU^&ezH8lpRqcno&(nQYg zj;*Zg_q1eEojgZj*b(nrAxGKUJRHlA|KuI)Qab26tlW5QxWCX4Y-eubhT)a7w zgR67}8aUZsxRC*yHLcRszP5q|}yLf%Oj?h!@@%_FN+ZH>W4UyWk; z*ntw8H2b-MsTK>ETz-Op^^eASpkyW2#rI6Sjf_;A9=#$7`@FN?!XF!C>;;9~tau>0 zUV2>&iC@UWd`#4_YWNGq1-8%i=f_Pn5!X#@mlNqPE?aVQ`FNmlWwqaeG1Z=Max-iq z&!{D#@|yeB<5z*QwzhVSu|i4?_*?3katBG})<+t!Qi5)H;R@o8^QqHN4SZ77HefeF z*qE=f+o<@k-J7SICR&@5yFr|p8VwYd$L~b+6w_b5z-|>IAg780H9gO)bO%(%pm>2u zovq$%zVLow*p?jF0YPoVd^2NO6JheuS6-K{9?-{bpLOsZoi3qS+h7JIPL$Fks+Cbl zvyD3xNXP1Qv&9nYd(KJ|ps&lYB#Z2?j;5BhK-kHy+@hh`n#@+LAMNn0aZ&QIh3Zz7Qbv9rvj9cm~a+I zzXL)v7HE;NZJ?@e+%We>*j9k_wffRvrlL5;l#W-;@keZ+QV@l}sGLYUs8)@O-EQozuf4^DD5#$;8A)_Gskt8Ac6a5m@s|Dz zwC^Gn9IJY=juU3kVd1Q{W1{f3Z9c8b@D6Di_xtIhe)G;ki%Ny!oD|d#q;PS(o4k8g z4PQbNkcojrVnNg$>7%Lu@n}_3i-=94BO5 zg^5bg=lFfOjuj+RRu;dIuhf3lg(fZXPjrypJRu%yz{RZMMo{2{Ey$ev8VE=usV1Y)_BkW|^}&blKzl9?L_7 z>mv{_V*E4(MIx}KGl>WS1&EE zsDL&+h0xeo({*D-5z@{BaS_Y_{_J)qo$b0~i)Z59RS_zXQFB}cG%XG9H4O)X;=4?V zOv#Y12=fLM=~~7u37BT1L4G@=2ZPDxDvkPk!#71{{fUszu6=@If)+3SP=T3fI*TCT zRlP}m`^n)GlM6&EcH2vmfH6B})o$VJ3GV78#$l^KTj>Z@c5-rNWa5x&WHU^q6)Mfl zJNg*&2`PateBNyboRs9Qn$rOSaa)GDAVo!`r?`h>bi-Ki!0=qxrrSyiAdT~I`sNHz z`n+YlpGGj2BY@)MNsPdJC5p$tT&1koqIJA6+75mj*r#J-gp}Hs_qhyvZpZT5D+3{; zUgdiosK=2C#=?w`$zr@8PH#q){(^K63_yHUyz#wm28W(xNQ)!xBbL|dZUZW7ugt$v zs{pO0q`0G>KlenaBd`E8waRQ2Y;Efr49}zh>Y9eM61Vw4GV%t1*g``?S&~{4psWU9 z<=&tio6Z!{8Oo;y``GiKd2?niVmOk(4np=yePd10tiMtVOhX7`Hv%d;12VEJidtZ)}@A`hl zCoCjZ*If&2Xd;9QDyb7DYMdZeIwi6p4~iftew84~_7^YqkByHr-MA=!Gw&uM0YI-# zCI(pxI>6j#H>W*lofC2{w4LIB3X&3ZN6&wl1ufcCJP#i4C|RyHc5fBat6W9Ue2GDP zE9(^r<3$}mBqIU2G^Xa5>$@cGozT5VOX@I95%iH!N^?s^Iy1n!Gp=chmEsLg01Y!$ z#cNWKv8quxar}l$}&pK-RI#v2UsK%GIT zHL70nhALgHm{Lj0Db{F7nG@H{ggmD$;WR3CmrcL1%)nD1Y7JN*+VHY z5$-xk$@==H@QBuQAhbe*DG4x5DnJb$bjvwIjG4h>u^_LzDoOE%!niN_RjD1}9nf4= z?;rT`9JUp)#dB?@OGA7b=o(N0uj(tXr~+d77$Aua;xuMkjKG=TF5+YInd@^-7tp?D z3A#s)U^JwvzpN72+vG%=T9Mv0Ku#%its$eQzXn|y_L^e>E0ELjwmX-hJib!yyPn18 zPj|H{Edb*}@?N!D`<4taOIw#hngf%+T$QA>F+W6JD&q;o`a8!(~3J?!_={dYXzt^>K}qjEr*G>RAC( zjbi&SC>SxB9&?B>+HKl#Ah=WW&)VYfKD6aJfr5fxb(jAF1)o)Fg~8~+=eELMH6r9s z%YcWlentDk^ituahRgq8n6IkVBW>Cl>Z`}VOGFjKhuh0Q6Oz15` zm95RTf=KnMU-ih+4twQ_FBzTi6AL_GVDR#&uSi>V`NO{}S2-VE@=Lb?n@-4%2Zo_Z;CI9U z-!Qd8dh4B#vu}<*bRxH#7g|$Zd`%Kl2erDD!PiEm^E*D!@QHMD)ozBzaB$;z%A8J> zn~*Dq(L1*H32J%|kRGXC(3ldw?0q~A?LTyADh#FFC3Y6KyrN7J^B9o$3V}z*_>+JI z#wtmijc|&JDiKJ^@>PwSk%)ZC$EheBv=jsP5Rd}Bq$C*W?N3~FOsIiS0skA zAlP4p*5@(R>NwL3RaOl&8alI*F#P{Iz~N&*^wB1X5#X?aqb;~3oX%vHgV8+N5P~JQ z;QIAMBp$vYkS>6r6b^A{sRBaHmLTU9_%{zId?#FJv-uWPd`UZVEw*L+=V=<5Z%~}! zVY<(%`>8YI4%cz>Q%R59>BztBv3B8?EOTmWYg?dwfo)HbIe}@fg0jGXd?_Xf#O1I@ z%y%}=jE3svhxV*JdXh?ZP2YIvtD}E>m6~W@S1aovHRcX6h$-sdDThnm9z#aYQZ23; z)4Vg3^2&WKsP~DD^Daw>*ew+FSHK;z)xqnRCK;S^a;9Q_ochme?R`=4ftUC|?-R_y zrN2RK_DYU*E$`cz=pl_+l^4vc zioT>7*S8I-{L|L-*F|rOAp^tERyjHq^>ZSCiDo%TtRFY;hz|Q7y<_FIku52t?HziMN!rlbJ7X>m2yG6#fsrizEm%?y$!N z|2a7&;~AEz?FD}gx~y5dwfL9X9HDhCF7(@pFGBJiM3{`2zKj4in*r? z<*Wpy(0?9am=<}9>#@|z?dAT9wCAfVmeq}QM5OA}uBF6m<*A!d@{5ZHs8R9hS5uN+ zKs!@CK(#O{OE!1+XWspHmMr6;QrCyu;qKA92C6xV`7-qd%BGYR-v$Kr z#>W|j`7&RwuQOb(mHYlo*!S>C0jh0zEzx&Rm;2A?P4L6Wd0YlnR^oV$&_$aAKD|;S zqk1i1%t~>A*y4zHqWezMP!H!0>K8Cx;b~6v)vm8&LR0aL`^FSysYVCiS`O5DTZN4n zJz4zMy1VzmpY?uB=>JSj%&9$N(2;=kSbLnLHy%7rc_!&rOCe zcnQ0t=NHUxX=Gi`oQ#~kQ=uf1Drn;M+FdH3?%kDCQyR%S`zW1<9?er8+QU=vw{_U5 zj=fm<&wY3`kez#aCLm6>&~kg9f zz1uXS#py>>w$%Mbg}azhKAv;Qu%K&F%;gRepKq1_Srl+T4rBsJ zW}<(6mS!58kyOfm0N=zpq%AIXaFdavr+KQ#R4GpM#=LS$S%+ysR+lexl0kvwRIh%D zK{R5JzH`&TuG{D0r#ao#9nFNMWW3d#_2pQ|w=HN3TimmH;{`@}5kfi3>qr9wquVA1U%Y=H5%%bre=X-rdN z>`u{P(Wpe58xv}Ff=!Tm01=Yptj8Y#e`US3Y^o( z>F1%zU^k4ZPUSo}jxn-~K6haA)VDt#W$#1+5)bJoS3EgKD9US^5B<*#KAdOVL zbu1o|HHpCIjw*9d=&|XEW_#iD3{xg{&6D>iDFxm^n;zE z7{j7}*TXLj8Hr_NafE`ynmOhft8vK%c_xOIZac@ZW9qQ3$v-Ci< z$>!Lk-VfNLLVlg8$*(o(^?vXVo*AA|x%hS>ZQ(YZ*P(UBZ@U9f1u@8*E~s)a8i^OE zKh4|7p$1mKtx?PQ_8QSFRRGP+m$onMKhJ?o7>A*}&^>nTPVqo(bfVkf2`tz3h*?4T zFTt_I2W-8)Z|DWIp4>QhntC`196_g_b$Mf`0nTShkyN#_i362K4JkW+V z@W|>~>w@2m$&rv$RN zZv*9*BT8kPZ#JktV;<}?<)$|nr>nXlLdWhiW+t~yMLlezs{EoqBq&Eg2?f3&?QUQh zpRm}KYwVpJ3R;~E8(TU1|I>1Q0>N$`q^EvNWUD{kAv04JhWae*HL%zW+#I#viv;~t zGJ5slCQS4VF4lD#1&aCBVJ0~}Oz0AQzkt-IGlo*%nb3-c9)X`ZiYe}_yC2*@H#}O{ zQY;2E#!L@_fq!t4k%OHB`t_etATba*c@jYDXMn1(wUm@|<3HQO3z`;GYx7};6^r4v zy-c~U;~KA}=tqV{>2>|Z$EGtoV`i&9zS@Cz#iaYj^*-r*J7vPe`s*%VWpt9L)>Z_W znfCw36lqETnDJN+f}W-cuoqn`C{IyLT1HnJE2$UN8D;eUU;Nx^o2JGS!|%seF226{YaGuEC0E)jDvazds%r1n-dWE^ttv zrudQe@}dYAgRRDcXH4j{@DkakZz{$`YN{sHDy<>OuP+pESby`Cw#|AsLD1vXx`UOc z7t*m{FaFx&AgFa}cR=AyJ6orOUy;cpKXqeyp=7C=f6Pr2C3KNfU#JmGLjZ-xbp(-; zur04GDrPT`bdr)=_L$@PLc?|K)89o{bL2)uBF3e*pvU&I5DJ`YtohNUG>;3ttGxg5e;kgrWrjXkBtBs+r2uTtY*U`?5{G7L269ZIM5V?`{a?Ic8y2xvKKi)Fi zlBs6O)>@NkOzl2F=n143NmA|ovg-S4XaxVJ+5xkrIF zJO%iT=UXnPk(H+b0ZyUm@)W)KQRR*XE&;YXCiMjjTxCxps_eR-eUZ@{kD>&;+v@bs zl?bM-d85|8vIG@T{m9aC9w)UXiX6S59A*WL}GDDfO)L zB_pCt?9{hJieNS8)OX@0*6YzD5%47*lnp@K$} z(sowq=pb1H4^qmJ`J_u`Glt{S+bY7VVT5Tz%jk!aipE8fKEe5?<6~0ZC(G!SQ5}lM24*bZwQWy4`!UD|J z&FEDx6H(9>_cZo8!~kQN_vV=|*Zmtm)lD;UsHcid|4Eu*@xr6 zy*|=S5TY&{z#DR=!`d|VK9DZz$q>n^N+aEXnz(J-%R1?>pl~Il(R)4{GlLW~ z4LHuMzzBuBH+Ovfj|E=^+{GUgOjqwGU9Sj3s8Iu>34y)$Dou0H)dL$&%&Sjtu)~Uf z{8y!39P^*s#K`SgmSt@~&Zz;@81VGUQs>zDJ9Gd6tH|7Yn66A|ZL22j#|VwMVuFOKRu zrqUjj7@XW;8sf^>Ct4R-&#gAVuMI(j#;6jG_+$O$u~ntm+S|^Zf;tvh(kj?Kzdx4T zmtUgDpwm>!ZC(OI)yS+H`3wJWO>5Hqb^8bRt`2GdR!S zZ@^ILk3?V{XP6D%hq#wMd7>wC3?j4e>S^>s3!E|d(6}fdMc;(5bI*zDIEIoo0hs|X z3H)Dl#FG+F&QtsvjwTdnPmw-*zmBry-8))X{sruvl@S%QmC2N|)7{4x)eGidaMz?w z-hPs*gh&614+4J22b+$MzRumGJ`S5PA?op8(=8XJ0Aqr2rHlaUSf?g+zahNQ|GCGR z%*M)NIji?8hs3L6G(Q#npA4m?Ig-90k$(;d@p#qyN^c!ao#4<&6II1j$yC8imkNL1 zV@oPQ_(-~PX8-?}g~20Q2QtcbzyRRGqQbT3!VvwwX(=G4cswx8>c8Fz>$HkV2x zOPqY=nsmOd$}5IL%xF%-&dehRtJ!Fxl~WQyqED{uBS`li+*r!{ov#Fc-s@+9s6pj1 z7ey?%vZ*ksT%z=n8NJsw6$^cWZ-trVzqczdG%WzbX$e{*P4E2wZu=a`_U22OiH`aOd8n9;Yx zmLM(XIeiJR@I6>+(P=+_Z0VVff-Q^tKiIO_&Lx<9%E<-^?LU_a^Ru9bu^d*o<2Gch zeoI-_#9Jy@u|Re;#gLrdfT{nf)r=!xIWvE`&aR)zl8VZ?czAiY|J^h-S?tZcrT7sf zt@IkJ{^dmjBzqX!lfn4{^o2B%G;9Nn8tHGfDo@07xG%_r1NgH|ubPfIHV)V-s5l}o zcuumj{u>wb&Cgd0s*%BZ_uQ58M-4~CzYly{<>JeUcMjLf#|l|FIlt_?m7$rKcu8ys z1wSDN4buLJmioHu>+8dF6x89oeYS zM3uO>yI~7!Ya$kN;Es4V&-ovOw~}wnC9yL+K@SPNrjf&Q{7M9nxB)o53$fiUN* zB6LZ{K8NBo>$&g0xl_q;t|{x$5ahFwWc7Br@B_6JmVW0OHZy2WLoTmH2fp9NTF zGTi)lXTnCw+R;Dw;h(tYgIWWibN)AXzztuOtmo3O<)xRlf?G>cm4H3yHtnn&rRsAK z6b(K-Ig#D-FZ8>+PY|WR*8HT?zF$Iw3>MYbx z2TvMyHAO#qR=Sl|s!7?NQM&9*c(_>?EL1Zgs+WGGs{&Nt8n96lGX$0IYmcFr@lSz* zRA>$gIsR|Ul@UykWEhV5leVh&+!H%Cod;k+>bI!k_tp~Z2-vD=c`#pcJ8ze=U=VL! zK>>K}v%H}OsXBnv7#ohas9P)v1JYHrQuSG(Cx#f081Yea*?FZ7c53BakN7R6hM^i3 z-m@&ckb69+a&!@eJK>JYKF^rhnfhYof-|oC3S)2nLo+tI=6_w`4BqwC5(l+1v*7JK z3S?T5*b8tz{ETUyF(lT)&U_M}zr-q`n~H6H?Tii=;Qdq0iNWq!OOjwnY9T-l@Ekwq z%V0Q57a6t5f60FyXrPCb4ze_{Rs_MVf2Q5z3g0UjhH1 z#QzSC-{N)(<#An8>G~O!(bZzZDzwFIX&z;hDQ{y*#khu4cowF)pp>(z*+C*b&sUwT zhRMB&TZKAyo06YH(7$59+tP5-7}8EQKpja&zW#Lzo1vGfkIKHXaid4wf|811{oTC2 z_GV(S1C@{bRx|B4aS4TrB3QQeejBNi3QOh{0%`ZUX>Q%)d(b~ecWm#8AD!^|oQS7& z$ZFL?zNh##$yP!0`OH;4If>N=NPRvtWfG0e#44nUca{#^ZR|7X{Yrfxc;L82G+IY~ zzL~Z2MXT#EzCTg;OPtr;ON~13ABr@`VuNuh zm@MOSArT?5+2&dTCOttP``q#0t@$q;M3Iu*p1u_+GyQf(xkfWhe1%Dw;dECjb)Z!J zjIz1{mKbJ!Ks4{O{S4D|h^AR`By;hvCA0TBBqpm!I4Rbg8TP$K^Mc-Y3i%_F4RGE{b z&0et)uHO`u)W0)N4F~bjzrRaD!V%K=L>1N%k>y+0v+1i?k#xH-qIzkfx{7&KA}*UP zQz^C^YwFY3!vFi~Bp$YRPmmj?J^z?6x3l>$dzHYk0hvW>tj$W{rzBvr5C_4*_p@$c}HB>Q(brjXxOtk~*vrzGXFEv3qp(1~@LmTatC z%{p?Or;@Ph$Z674t|bV8P2oL-2ga{mcAtDdD74(jQ6W@z@0Q!(JKUI^ZQY;zzWuY- z!rKA`DOsBB20H_eo8Q_W1osYX$(ZAZDr`rrBpPOxC4;k6r3Xy*lO$Bs+xK*2GH968 zPan&?gx3ohG!AD!p(v>qD^=9>gd?(pu{m*WU2R%*Sh3qBBA-Su_TRZBNw%l{Qnnu6 zfBG0TzExL4g5zRj<+fYt-S6HCHV4+%`z*dJoSC}b>MA_!JDjXwwrt4^a&4Bf0o7fJQrOQ#b~T z)>(45{PLJ*jW)h2sp==GwWQf!Ha=GN)F4af-$CU# zaYyhG&z$?@k?fy#Dx-ul^9ltTKhpkk3q2K_@b0w6_6^o@xx6K# z;t}8U?~&HGnenvL8>7TzVlB$G2C_4+){QPs`|nnyt%>Z&aN%SFKh1RH-8YDJ%O?~0 zaq(-@UnD^nOCCfA(6uUIn;wR(6v*`zM?5&+D*^#&3dc8k!|yTUw}jsQt3Tj*tG3*Y}MwaC)wG${w6ci zE3n}Q8 z&ehMT2Bmy56?o?U@0%pY+EaZg=qFg04f+?myI1R3^T$eJN8_Q#yL|fCm8zf%h!sha zd+=%|&c;nG!CiQ%u%4Mo-EOHMSDr&<aZWK>a`!v2A662fJ3cVsp>iwxtbF_De3tP_`h#iZ4QLz)GYL?N7VZ{Ys zE$B^Vb9!Jm*vEx6sg!1OE_0#&*JOH}?qbvV*yn(Ez5Lu!WLL01=pwCR`-F~bW=))1 zPTdJj6PJa$v*<0IX0hz(Mty&(iYhWHhlEw?{IvXn0_yprfH1U*?}#+UWd;gwDw;@l zOK6tC0^XhqsG7EL7)ajQD%bC%ICih{oVKd=rL@n9RYN=1iTI>>HY^YbL*`1y#I>B; zY1EYznIzF;{>64b9v{j~h@5~V+IWHbH?-jhgRIN6h8ZRRPkv}N%O*~V{K19Z@f@2o z1(I6J=bu||uCOWdUQpGmkb~{2t~1uPQIA&XEZ)MS66N3L%?!q|7xU!(1wD^`PyiJc+5%=Bl=WX1TDMvWm<>WCLvO_}H$Qxd%5E zZHhFV$)q`=YCP_-!RrO&kh|~2CO4sy)I7`U@JQ_uG4mB&HP1jyWzA$ZChxa zE~iud+L0rpc1s-#m{5ZK}{AvKCf{ z!8G4`!jCS9t=7p znFZiSq-7rME&WUJvNAh3P2T0 z)>q8u`5Zk=xi$P|dYpUW{O^=gGNW)m(E!jmgh&gB^(mvo+2RIb&xGF?c~QCF05`Xv zB?{TDx0AN23uQhZg;JO>S*(P=h{g!^DUY?rc*oPr-wCg{8QNX(A>}zsnas7Xy?g1q zATlsT#0UWkzhBW+hnuJ4=IfV-N08=pHM`-9QIT^Mfx?|p!EIW?<8QB!cZ!8H1%G~w z9~-rw80+3SkF)<+V!(7gjUcx_koRef@b;Dot7d+dmD$j9u?@YCPY7JLmLc7CbIMnJ z2HCLK?+0e(-;X8Xuhy9d&b~W)xUgIa*sX@Km9f@H&}TPzQ*>o#K(SG?L~L1_8HYAm zE2bf`)pr31^q=ils5#EA8c;A6Yw7=#BQg|XHN0N;u=#rM)nfL9<0{7om%30TxQxCe z@U%34GtanUvet}ROTDeC*vj-w7_f;Zdw6dA+wt*Er+wxUP|YLktOG2Tj&l4q0th5yvwtoS=9p4 z0z$ogGHM}*Pt!gVVj8pA=?QZ0!i>K57A`DC`#fe~X+vY@^FaWN%sk!3W8>^Xi<7{@^JV2^__}bnkK;HRHpV|;^8Rkc%;WIVRbmb@1vvELimg(Wv4UlvUy{IxN-Sk?M0Y1L2T+)@F1mB0EX!6M+L zNssjxZPCsoXC63kz0%5TyxB%YK`n*sz`Cqi_8a3 zeQ`}|)%!pKsLvHm>`31hHyr5M*O7(_d_PA==0hALzje7Q>x}e3>3729uqRoEG`6DC zQQ$P`)aKMJyMa~-PN&A7d50#eQA3Cit?19jR&L&rpyjXZH9!k$Z*xM>N&tjklmmHi zkNwbj?VrGYb-MMAqA1UMvqV5!M948P4SX^x`kq^u@--9i<+h^YCCPfbUTRUNLDGEX zw`OvYY~9Zu-EVd&kbw-$y`4u55^G(X&(U^YnJTzUaBL!`K?uxI_2c_1?BBZjQ*Zn8 zUqm-;2kF>UBAR01eBrR%TdEPE;{Gl)9F7Ur`30kHUFq8r_x3Mdg_aW&a~v2d_)nb>3UrC6JrjiGupG-`cr|q^)L`=SyVz}qWASu+6=11&(PAuJB zaV@r|-A_{JAlNNU>we>XLq7>ga)`{%kP!a-A(D$i3tVN}x#u~1-&~~a3v+XIzP|N( z{peYVY_LPkFJcgZ?V?C<+H%SnSs-%$3x9P}`>_^2cVcnaBC12BIaoT1%i}mLZB!BB@QxSf9R5v+}APJ**p@uTwz5*(zZ{h;1()=q{%x*`ULsQf|Lf-y=*{@ z7I&MV;d5V-g+-%AZn{+?VbRcR3glU813&D9oKMd{GQz0-s1m(oRgQX+h^9kGlOVx? ze{0w?G;GY*aqFvWG;w2hs9hr7t@r)7H9xVYfn6qY(F8VDw%*O?4#t|q2Yh756>>g( z&&3G+WtKxUR`QpNHYvv}7Hy@C+=bA+d!w+VE6oe@=IU6P>2#P$?y{oV5Z43Bvmz)p(pQq2d0)}x(Fb3?3^^N=FEO$s}<-k}$qOon@!H&-!xPYj zzzEgJPm9|j*0dxSiSK7$(cl6ITOS{N;qCkM{6a5_%hq2cQyHRn+y+*yzx=fBNzpw- zNxwjRtM%P^6t?W4O8qOXKTZE0sU2O!=Kv zK8d+BxyqmF`0X2_4enYg@(fF2Keoy>kK;|!k%R<6zy!-z%+nV;onSlk12ziDqRwPe>>E4in*DqD+##j}#ZAb-n zq0m=VYM*js0F!rcxu7FE;ZjTl;pJ9eskM!N+y+`ra41{fc_}kxqj9Kux}T9JW8!ZT z#eMh$?tsQ8-$!8^YAkMP=MA2Tg#-W#zkXe>~P_5H)(qdV`5BWT|VXUufNb8TRT+fBpo?GTg;;Gx3p~C32|@?QeCN)(JzpM z9N2WsM8`s$A~+me4gOrc21*U<%dg|NcHHMP0`yXu0>`tA9yT=RXZ$a^-UJ@X_KO?W zrX8(hm!b%jkX@;e?E9YVd$Jo#r6PNT>}B7E!WhQ(WDVJw!5Bi;F(%8{2J^pes^|B- z@B6<$6)|(qbzjR_zUQ3pF}M>8Eg!J=rfUp1{I6F`cx-+B3>lP;(l(yzoqw@1c`X2f z-p=!YrJxovyld_Y6i6B`9K>X0NL<@Jd(+TgFG_OP3IJimIV z^iwO`E#~Bey@(d<>@kFdjE)vjN6Ri^1rP-M_*xt;57>iD%@vyg91eM_)&Ncd#*My-mOzno zUz%i`LxF;~NR`8!@11ICq~@6iYd3!S>>e!e&vQ)x9e=yW72SOfx|fLk`I2C9^W1XT z*o-$fN+;c<;6(-COz2Fk5}!r5og=keK`037IPPX3?%e~VT{}B(zIuD?U_clW)Jji& zFlvq5c;Z&8=<0#eC1XzyzlJ=fMXQ_fn(rr6)xu@#ybuylbI^we9wk4d!CLL`QJy)8o(D7zWg7PAP;;$=$3 zicBmJQX2srgV!w2O%7~Oep3`t$?OL?QR7zx1Vn7%z%~11g+@Ohrp6^kcL{<|d3@q8 z5R$%dNbf-$r^2RHzgkW9Ktfc{(o)qQH*=}s_8?=ABF;SLTAYlv7 z`Fx$j3JieVZ9RY^T`}^KZ?$>4pPs?hT+=GY@ZLPbY{aKTlLmqOXGy}~k<5;FTn9Go z%!W_fWVG38Zhbf_w5XMiZj#L z^~Un?ETDxrrX2>#MQ!0QB>z!Sh@T;sQ)|CNEQ{EW*Y&3T<=c7A|~d(2;H!&d|pXshv-XOcJap_9m zI~BfnzyWBe8nqOXbM0!wG7hvk>&Hx&UJY49>Khnm10x00VW`S&O<)z zUGtww$Y6TuDU)=Pxl1M0Z$qhJsK=sq4#XN7w+n#9W1>?SuInP24EXV3!=1o@l(7XR zNB;%)8AthTcVy%z5yl`^Xg1<>GoDdy)baSV13oKmqVy`pw0)+-kyp6idg(ne@x;wC z^j6P92zgS9mv{hkwbbPMGZH?KJR4ME3Zn_uCtHk-ze+;5ZWIAf{FEJxhLK&7y7m`P z>(2>q&e1b4HZTncL5^+?`iv@~865o&zXU-5AP?uKRk^Js#noo&aAKCgJkaKrMO?>% zXvWc_V-6+2`D@Xr!9Xwx>+8XzqPu9__}9s2vw6}x9RH(oy;rYj1IxJ7xp%4waTze} z)r>+ly}fumgE()TOyR?vL9Yg+#)u+Xsh?oUla_aawxrcCCj< zAZApUASP%E%pGAZm}`Guy!T|!;su-@gha@Aw*l^8AstHhZ}$@j=YtI5-u~63g}^YR z?AYg;4L?*krTv|=I45vM@J_W6x*%#O_Ed9A?gv;tb|Dt=D%~~T+a{!%29GqXUMwzc z;tjoA!5|z+hTA}71$il5KdTM*fZZ+{BIv+9@I(X5%TEp5B%jI){&t{JY~r(UcqLBs zbDY^f>sYH=y(|EqDu~+Mv5869cCX+UHGiz$u{*EO^qc{5{Pd4+^-Xe+D^agf)8!N) zdeJdi2#N!?TTGs^s}DS>mK}cIc@PSf<_chJdKWppp`#Mzw+g=FX|}QJ76OnY&@4+v zs~^?^!TBS<%)<@cDY6W7^u{`Jn{7E<>8n~qp8N_piRT>rv8E*r@Dv~lSJvqj$IDDy z{@)?#3|_GB_pi*W6^y}7b`P7J7cPYB8RW59Ze`p^mn-w4JiT3@GvXs|yS;7}VY@s6 zh9@r&-L%?kP@>(&_NeYV25x^onk$Szzvc@pieeUR3-N-vC}Qvig9&>Mqsn9a02aPa z(nCgQ zzcNxFsRLayD3JPg>Dz_uq_d|QqBE>aJnxffMh%p$=GBbaNwf5$ki~b(ZhLd32e_%F zHYVUb8L1FtvSAvq0$ihL_o;J%w88}%2{>CdwQvjMgp=Ly7qK~^g4a>kchGp+7W`VC zJ^h3eXXUH|F)yx!_;^NRGVMO|!aZH$ked_TZ?7F_pIA)r zfjN83`RoG->A54X*UR_fkmlEGCJtQsW-NQy?q^NC(DHOem>md3prbX6yR_m=`sREU zA7W-rI&04&{B{Pd8XV>!G0@ZYdgAa*$!k0a(Z5}_cfM6nE(2h^)L$<8`4tmR$V1Dv z9y5hHgw=dBJ`Th7&@=gys;(BvPpcm=K-%3@&~wi}UsR-CEwDJ@X_mWohy>6gB?eq` zq4mvP+I%FDvr`WV#9~%Y-&mm(-)-9C!`V1JT(&sgc)>rzNtp9TEZ1)TNmo_j7f=(~E zlAgV6iV&6Ij}x3C@d8Q=EYY{1vvx;$?CDPtmy(iV*S0VnUT$%5QxcGn?7s8eqB;Ub zKDz?H(9AaQ9R1AKx18AfM~Xzj#sCp)o^M0_>)7YE5-*yZkwPg19LZL~Z)1NYn?L^e zL9NMfNtCdjc3gjM2R>WTfaw&qVoe!!D`feKnZ=AGAoQWY9(_1lBpN4^Xy)K$G+g6% z@UE%kHtwNsiBHIam}wA7sQbmOGX?ps_$iO`)-6p#!o-+dHj$UX?e#%>nT$Pboj+e( zD*rJoIJvyB@|D}Hq|Urov6J5O%Z>13AMMRbKDaiH1-N}J-?_jh^EUg< zB2pM&ec%}@5dk9|P8isMXGE^gG1rPZ4dGHOF2KsV+G(Q!5`+x1m6Q|jb49nzEU7b^ zUN>tHRGs>b1_4Xw0*k!yms~Cm7A<Imn6~;Mg3!ba~6aaa{&Ib~P;*mEJ2@$m!DrNVwCFZ^Xz#;Wj*llr^LcEwkx{fvg?FD#O7}R^yOn8Zfpi*7#@ph)fS>GA>}|PL~feM|{wFpUg;^LVhp{oZWg6*=kqKQ$%X28m-~WnI2;8 zuscBzbpXfv?KQ0GtFNK&W@HAlY$Lc-HjJV3;C(jBWS#pw$TtEe?4yBZ`$Rs36mF|y zzohSK&4nB4x9CpHg6(?g+ACyxtbVE^%;}4xbe>AIKYezd`Jr>YS9c$_Y?|t#5d|y= z)yM50gRGI}0f$#Hvi{@{zYmMiP{I?RZt1&D0?#?c=q%!`%X@8tQpn2 z!rk10F2BWjnt|5_PE`+fo=ZOg4wP)-8bbHG*vvm_(BHhgJoL*(MTD)=+txPTN%u;N zGTrxaiRpz#V!8gcHH-uPw0bvxFl~Xkl0P{}laHDd=XB&GnTy-cX}yOF-4J8oQmkp? zsua4>dB18WvdXWhtnb#jzLHz+U2UU7S^^${i^#Wm`Fvoza>u_Y1{NW7!cjjXUnqzQ zr~%l$d&1j=Tjv0sy+3=J}~6^Aelk4 zQ~@+NuenayD=eqBK$hX8%CFRk`DpUF6^ykTo3cNMkcnqY-hp=A<2BFoyT?r?n6V$3F7-jjc3@+I+P(WZ zzn2;w;Np({s{IQr`@LCfZQYOH51nDwTwH&-wEj}bJ=JB9?<8&|Nj$U~H>4)ee1Y#uOw)jDb1;>5C1KCDO*_cjDNF1^DVOAV!``>6Ld!meg(_ z)X%IDY`+cinch>qp>-gI;C0Ulc8t9&u+X0X?}aRGs?z(LzRkO~=5zP)fw4vuv3>)1 z(9wSGyRJd=LJbs5vq18+Ici}T1WxbT-~0324_^e<;z_&~Z0p$N+c{&ahbC7KA%I(> zD$r)CRp>$Kroq^e=HcG?<2b? z3W10l7)i(lUL=F}P7)%<=0ZcFk-E*yMu;$jNM4m_=n0-I{eMa%BW4@~_BA{rZpPUp z?=a*;Q_HUB$+c@1%N$F*Rh9}gvsf+;z2`l|eclG%!?UvRAgwzqpuMWDTg^Y96#vaA zvNn0(qw(!)AQqViLiEO80=x&q33saX@>{{4Z2%JUdyGNPl9}{w@+EyiK6;9==+f1K z&t==rG$K3PO{h|md%3g2H2EBjoJ3hJiGXpUz%Fg>{GtKHV4b{h+YNChIYkjnenuT% zV*kbHM>pdyl_-c;IYd2*(mUzj=~!Lii!+Z>u=OdhX>NAFHQU?j+MP@XD{*#jB^38o zLjCVb2=C@z13mxw|8hUHLC&v&xRaG-N$!_r!)xF<5hDX;PWi)r{a)J-&1I{f>gJIS zYT}Q|Kf{wP63=+(3TD_b*c%+-VUE3P5TK5Isg1p>ImU%yda1trkmp2R&DVnd$xSb} z!PPYmW<3{cJbA!#6pcK$DCJbi-;_{y>^0KApp0;4$lK(0spRML_yQ27BrTHG59n)H z+FK#qv{G#n?^~yN)c0VPnO-#6 zPv2oawYibW_JpK=;;KX%vicyMUZ>hvB^4P#ygdkbmrp6}CwSS-HLl z>-2eapO>?rM;?BAS0#}HY|b?-9}J!Kt`Lln&M<$JMiW?nY+)ensR#%e^Wd8N9Ah-g zNll%ZtrFRnwNY)?%cdTY9-WW=~&+RL>PhM{2@$m1G3{NyX7-X?W5V1 zI2$v!%Mb9-0i1p1|902mj~xGxJ9CD969S|I&d9YUJQ(|+d(AR>$;f@Oa{dO9_D!95 z7|LPY*T5QhGuEqmH8QGN)PX9(7*8R82MhhzU&p^Xblv`uTmf)F_!nu6y4v-3go_63 z=8u$f`_(f?G&d;763wGLv6_8Xi%u%sk8Zh?*jOs`fu6J6>PCyLaGRsUkwt<}YWov( zsMe&jPlSF)4p1nUpMPjEqTKw{Yr+-QAHx8z6bG^1=@b|3K9C7Z_4v}C{rdt$m?2{e z7$j00rd1tY%8--N$Z~V75#<1$W7jkfW=T1AP&RLoTC>DV-pN3)mkdVcxy~jMmy9m=M135Kp4#D#b+Pe?FS`_JXq~}OninW za4{1ZO9vJK``{hPQ=xvf(Whj-|19*6@0u0RXqtN%FRJf>y^TBOFWXgdrMb{v4y#`^ z1(M$jYllx|AA|PZ`d*4Xl}y4wx=W!kYMmXJ8J334eKa7m4J<=h2%WJD$RBb0R-7+; z=8hz=uk=-9uRE#P#Oy3jv|iF-;KS8DUX0{=Z9sicI8v{*bq(GDY+QFCJ6Vq;RUyq3_lV*F1 zLHIGkEgF>bdsokFA;RbLBQ{E=uj_`Sg7vY@sz}YegXh8u>*5w$EpN28=YJxtj~hOy5fka}PRvffq~-_Cr|~yzEfsBZC7hSs&K!7h*xa zrzq?n*5se1dKX{vsGECQG!M0hIVCa%7-L^v6R#=UJCS040)e_~YNS}yFc z)g^oS<$@qCHzfdYJJRqc*O<`OcR0bbk7+lZIDJVGX;|r3siQMk@Rl6w=sEo>h4HTU zNz>{#zl=3M3NULYiwM08=1*+wTGp_*SA=D=zZry_pwxRV9=gkuuV_zY>+z6h*n2Fn z|Jfj4@du@wiI0jucx+nSYUF;^jKocl54)hSe;`H{kwYQ{pF6EOtGR2J~`BL4d60JV1*O6T*Yw*XnrxD(>F zh&QB}$JTUCPcbW7Fsr8+Ly+yg9ejGU#TuL19TfYjT{ZGD>B`d!n~Sq4#6AViV2}^+ zllINIflXLFA#&@}=dBlSfE5_&^EGmR*qX@J2>PjhR_KgFuI5qp*nU_H{X;`JxTqcP znKBO-dnR#v9LFVwh%72-dz}G?ZdO_!37>Gq|6eZkKeW)1W9R!#b-=Fl|K}pzc&Sj0 z4EJMfnaM8S%ZtbUx;`LP9dbf^R30)~w+Co>`LEB;l!zDpPfzKNXrU$+P-Z=Ry%7WyMCjzam@v4!@B zzgFJkIAO`0e!zm0?0yS8)@^ssFALhvEGh>`f z#UHx=D!Tf%fKv;#L%8jJyWsQwPoMX5v|!&z(mUjYt2o0;fw;&oYJc?wrS2VpR_eQr z`>!LNlI#i=u}kXDBGv$(zykos!+i~QWteV1*4;N*AVsMT=K%}wOz~*W6z(uWHqsIvEB&F$*-yJf zA)7eLX)}Gf?$tJIZreoolG};2M*E&Guq?kH=x-mN@Eno|W9=3%2YnpnK*Fxxqo}i^ zqNoRl=|YYhiosl+4#}FnzH54@&h(IMckNyA0^<4y)iV*aZBc zg>Rk}Ohbd`q2kPJ^5BNP0f@_4fc{)Kb)`h_QNpbeDe>3SkV2s}>@>5n`AG-g++b>=DS9}t(++LE zL3`U1v}Iai?wiLC%0ha7xuvU9G}qzxLVR~d9e~D`0)oxEPNU{=&oa!Z>UdU}M~z?Vv8eS!FHH~Cn;v@k=?xYuwnOL|bRz5jG!xc_oq+kf z_a!L%=iby_D|yWngD-BWaeDj}$~9+=p~BA=Fa*c)oRtp!SlUZ_E;`f7Uv z|LJY|t;Jj?#MKw3q2Z$LIJY`Fy$MN;Zg%YwJ&)AensGG};-5G-#HI$^$j$*4G@fVN zA6&d7nDZfcU+1dWuILI|*hDT5n3lAFLgh<|nIsr`V?T=0YvE8(Krn=Ra;sYuEC}H9 z6NI!e<~Q%ZTAn{&BBdXhlI|A9kd6O8iv+vW4+45c(8e_Mf*`3;$HZ=D>yX$Eve|Y# z-s%>469hRyS1TipEQ#z%UhM{-P|%aFTaGO^zX+usK;2UZkuXp__q=$*GRgc<>tA&K zCZ{TwLL*D@EsG@vrIaP#yHf5fF7w_qD`Ru9#9;Es1MsB>0FD@d&Lu`(A6bn^lx1q` z;SGxW{_#m3wFGt|Xk?X6=6ge-e{R=okwJ=v+{sxU6ZT6^?B%32NL^L!z-tfRU2@ny zr(K_#@5+?VL=!l9^dRT{SNU!DGn!h!#O|^{&WD6l1IT&EI!q^sz^8U6@4PuToomuOZz(CvOd~?Q3=nKQToixW z5VwF3KAyyr?j~(i{>ikou#s8R*dzN!rEtEUWpqoIGm2F6aU|6s?`S%i;h7W|XBRUl zsw_2~cwpo;*}v($8LCbE0@|S^-&nMdiPO17P5`SbzEGv;=uz$G-#7`E+FebmdtfyS z?j33ckz`2832sh|q+d5EG88lJ^s6+C@U79^d5jOZ1w>(V^J=$Vx_6d2venc(oEI6r(y zLpUT?2{w3*%gC)SCBb{PJd|e4!3^;MNTvg%)tErrx*Vz2V&pZ$AI0%*J--&b$F|-< zsAK4nXraJ|&(iMHkR?qtMi1fYIin!LujKj_RVad4`0GWMY>rj~Pcet5hVIiAUv zyi*p|FQkr<2&7@@(@WnxYkMzZKVeWvWm{}22NV{&b-3mIW1$m^V_fdELWQAYGC=qz z?CAXFFf&N{J}C*IRs$?z;}<>_7Aj9G)u>*!!<5;iGC8hCgL;I4EJ;VyhPLm$nz(4mzQoQ_Dxn1Fdl`CD4Nu%4G<=RzwT@k}3qzZsIl~n$r3}9CxJY~Zk z@}$X0m1XZvB0xW95vl08iPuc}x6oY{g7_H@Be%^R$rEhVL+S+Qd&DxTaS*If{zk3} zQv*2C{3ggl*a>CLuhem_p?0$wsXep*Q{>i*&s8rz0x5xhpFL`g(`3l5{FCw1jvt2} z`jWwvUm*8uoZDJ8pw#zDTwVVetwNgAF%j|dM>-k_+0UpBvbe+bD;^#{&mX)|-qYij zu-Td~MyYbaYVN76pnDA8Jwa&g|46Y{7HlrHC}z%90>HQp^FEzv5-5SoZlBbGVyoYZ zuVOop^d7N<&vO~4aBe+83sD)sv5g`5Z3KLB-*&buy3@FNJ58kbKu|m|4eNF!Njm~e zL${18GsnAU1(KWQ^xG}<2vK%+$U)5w82oa&n}$V_ytb)`4zvZ5RABqh7TW%|C+ z^0>e8E}IO9Y`mnS7Btp)aT5sM%KidSt0yocEL&EO{?%q~FOuXM?SL$6`(dOpWTxtj z4I24-^2PPqxs+J3Aapnve{;gxtmP-w6E62{MU1k)-29+kgdd{nzLD@mCLgd42tX~( z&mbL23kB$+z#kEYC~5EwL$D#%TU@JYc60w#_1$z;Sxa9z&XW?G180r}rq^~y#U^Y7gw->u8)ty9GRv-YWzFZ!#8~50Zx?{5 z*wq`#7)PNUB6MgzUX7=)gr8N{)5=tl+P-Bg3AzDmWY;hV%FwqlIqir{ZN8>g9+_kX z{e)1&5t!>ZQ8^6dG*rsAS1nH!dGFO%5PGq3;`A02eg475h|+`TH9>{<$Mo2h7J}5~ zI0>uqV4D|p_Lbe2p$}AgSZlRlGoM&g8`C)*p5@w#x7^v>-R9{wvBNFS{{W{tM zwk<^t?eZfN^7Tsm!gW(ch;f$5dpj1GxrwX7X(Ae6bD>EBEWowFL$1vOd{*6U+{pdG zEp`ZxRo9=B3TT(y~+w2R%zY8f4^_@Qy_C%U0t0e!TIN@K)FMU z+J%osqBWrrg6ki5g2g>2E^0bKINk(UgNn_NcL6LZ@1%v#<1d?#4#Jh;lB*wr$PU7& zNuW*t(VZoQ3b*s=p|05y)+ZvO8=u&$vYPmBD}5(%hTkq2gq>g#zGdsM{pMtQ4eQ>A zP(3ee%>Y}^}=x#I@b12NAt2gGjRpENHUiy|gHIa<`;8=rSS&XHgD1PdtD_ z78>8sL|ai!c!iYT@SXONbQsc6%`PTJiw~-8-Mj9!z6SsbdRBm?8F;uN`j~IdC_VQO z5WP!UaRDQK9xK0X1-p=umUhz??m;weuc@i3GOXRYDQ#QrG%7WBp3@NXK4~~9M<`Xm zS^DxH#xoh%`vtJZxxFT0ztpk-pMSxZmySYl*|v{8Ew%o$D}aw@fraz%Kh0H9D+@kuc=c2r))K3W zqwiqLjeg@1*M=^Rt1}cXQDz)55=fF(kEWSP?xGtJ#y-HifB(X5PVo#!&!_ ze(9bvg5H_;FdN!7VQ8hP+c*$CMLjm8yh?>0tKq<%s!Maj6(xCg7c0Br>m(gQ#qt7YFDOYOThyJhgoqfrgV8>Ysx*?p?E&j3C%TP+vrE!d3iFE=d}` zsIaj6BxNl-2ti)h&R<%ZNrDD5k_}}77ItqOp;M+QMvX2HkNn+PR4sAA>26ptWk7P#4f5w~dj|aGuy6Sxx-EH=T#^9k zgw+>a*9B3lSvHE#^*PYFEhSH6#7D6{kO-$abO_WOD+Bky`dJYm|4fE;47Q6Q%gVHo zqt0>0uhVHeCKC!F8dqa=^&9o#Z`@TXV0(fbLmb ziD9WXA*X%!lGy^{0_5^V^|Oc;q9=|sYC^PlkqnmU$E_p6#pdL3Pqz_pl>0yzhxdGU zpoK7T)8FVe^9aE>&cyv~6F4 z2<XlqJ$pJo^4_(v|ENeoW1Lx!rS&YUV8fN#wWf38n_d#t9n** zy(&^&x!FnA0_(efPORdrUZrecqP^!@n%_r9_ht!#ZjObu3yj-@5g3T!4we4fSmLv| zGAN#IZ@1P5_cv$A?>dJd4GXk3U95Bsil_MF6wR8MbH13-gkn=@Dvjz_8M6YK z!n+rn*|J|8pl)z*`u$|U%n*Iz*1!p|`#paoOD73M-iTDo%vP&og&L}zy2?hbVn`Exyg<=ik6H0>x$*J+EGecqk^8#Vfk_3gea z@_GjY%OXgh2jLh%5fZZ2*4f!>S5(6s(F1<}y!`FXBIs`N=L$L#GI*&{Xvw1GsqPZ> zU1}}Jx@v&BA^g3LPJX`c(P-D^3C$~e|Nm0(M5-1t+>wabBbd2)_`mN81%bN5Cvu=0 z%AfchgxbC7X&!ev0dpD1Jd$~$8@5M!wEG(wOP4{jLyP(%31#4XuI&(Zf)JF-MQ^}| zRB9^?Uc%1$+YZ}(x%`ztAu%u=lh*p+#L*l3Tzx{A%P+hHO&pc%jRfep>|HW<8%uVl zIx_gbH^}CDASbc+xaKtf8D#4@&YsB<=EE`y?7C#(EfAD+|}c=94vSzp!BBR)aw9807%WFq8bnR z&!UIm&P6Pif}ejou}huy`^}exwsN#U zm2Qbu=M5BK&iQ?1h{j23%T+z!7X$qOnr@|IukUWomk2=Se7_dPFuS$&VY=eKk})Az zGC}zFj@&xcAX`#JLQ_@}CzQLkHjan#Lur0{m(3M-x}wQ+n_X20svFw1^-;=aIwTZJ zEVu1l0psuQOI{E>0jNqIdphtO6rcemQOsy00~6fXT7FX4`9ahr4mSlc4gd|1s~FeO z+R_o*Xd8pUYk`DRVaI_S09EE^WtFwy3GRtWG**4yx~3adQeM6_mi;Cg8u`lt<+{Wz z;z`nMZ?+!h&xcY`35VzbzML07R(}A&4d{uYI3LJEdrhAE;9}JLD%LT)yxM$L9p{Z_ zQR9#R)lG{NG(B&*Q$B*P>eC&`?iEhAnbAwr zOeM|{bT2ms?sd<~Y%i%>F4cNDmhVPqUO_>hMI7ah6NRWWNLZb!0!6C7ujfg^`L+Q& zK|)CBfi!kwU*GB!pE;9LcA&lLyW-;Fadl4c!Y;aJKn1%D!Epjtd&(#bVp{AJw|&+7s!?9 zqEWi#8yFLhu$^DzHUlG0I@(&vF^>e`Q8i&<#Ok;a*mNzmc3;iL);>5^bHuX}Hhp){ z!MtW4mAsHoJ2gli^12_>eYuor2N2D)mHAgyo}Fy7oU{`LwYKNnzr|gu7W0h(LH&yh z;tu9cZY>@{u%iEi0V{{_x@>=E3AiJzPy2(k_%QyD)!t)`l$iv(qKG47qVw)J|4|dt zaBZrM#u1gM2NA59NDBFlWBHDLd^?sRB4Au~FFQ&2PClk!aFV2*ufMeJwI`HZe=k|PIFn==SvCsEwC1zI-pWKzWK>{y5sn;Ec)=;D}aZXU?7MKEC z&{Mj-U0R+D`n;3Ky!=pu)oURZFmWQ_y_nlt7Em`b!a1&eYj5udI=C=BT;k$f&Crk- z#3|*R|F52nZ$Fog4~2R}0j4u5VA$sa>(LD}nxlHRv>E}<6p56xsl|q*vGi5a3hZ%8NWRE-e0;1 zP;tl=u)yYTh>g7(QbN1E&rXDmPVemLOGh8-ckrxs|xH<$nqZDs5POx87Qs_z!=n zRcj8vuZHifp?qpb{2d|tvZ&d?#XY_JNCp_XSxRJMgR=Mc3s|muzh50lH&O3klkkjO z9rdpbLPSXKXj)iUC>fq=0lbVs^|T@Sl*zaa=iGm#Kj6ov>zvrL6ILM0xn|o@zi)^m zkU6Q3kw$zaG6)M8PgDI?y-JF}J-5@)e%mCBu=Zbp^n8`wk}e_~lH}iZA5MF^9P};c zLcFP7V?2)#_TBt$X)-GCV6BG4BwU*Nm+ye8lr}UA+(jk}7_axhHhZhjyD%b|D|D6~ zRE`6;zH|`dF|T_Tp{=LapOpY^zjt*>mCtwIkr3F`^yXB+64lh!W<^Xr6OGoF)sE!_ z9{(n(y=G)Kv=De$?6=#IVb2v>-`dGR%*`cOny{U?N4Xa@ z_&po4P4_PMPRkoDPlWFmfB+mwRsF3Y0}g7P9<(pZLGUFaFCpIOP9M^zqb`8M!}LS? zFaJBk1Mw~9!J;YX_Fd~GLlhcuWGWk?%x5Dw1O3^2wkHQsP*7lLQVXUHc(iqO!u@|Y z&-2xKn-H3DuRW#SeyTw+ZJ`mDj;^6BHfNx(I}FjP*@5=D_NydbKcfo>?cr*JMB9J0 z3i%Xo5GE?z6R679uURho#Xrizne1j9ME1|@ABqMYs%;mBy-wMs`Yh$n;qeB2F@=b{ ze7ludt5iAo8Xi+L2-{leEyzLaJFtn&{nt(^WdquU)nqxq^Y!c33CqjhJ!7FUmtJ65 zjI#c@LzaX0qtUY)^gGe-mno$0B}<+XYIyR3V45BVR&DIN-7eCNAy%pwC_>KZ?j$K_#5p z8i`mNxXLJOkA(I0_s_D?N-!X5C_Cg_&^vnZ%D=`c;d!s}p1l*uZX9Lg-O_kt*PA?Q zm6QpPUS~-NCluT0>(%PH*IXUKpHzjF1XkCMPcNT7($Tli*Gfquy9q3zXIqc-gc0~}Q^ z4ji5-)leCnlmfLSBE#$4+iU*BdpJzCic|8_Ehnrd_umN_q7UTTy!>!i2FZJLOFO=N zRk_@OU71+90Q6=k3aAftjIn=u$|gn-VATp@3+1CZ?9#P^u(-H5Ji%k67f8bF{(Q`> zjoTrOX=KW(jvh!LI|Rrtr8ZUsL38(d2AIp9j@xgR05^sz&na`({w7at<@P_FSiE7OT?%X~o@n>buw;YU&k{v5Z;Xw$1(Olb=D-6Nx zDR+RsDNnmK;b-L5?skki(eKHr6V#;TdC^U;)ui%d-^R(fxtA@|h|SHh`ZYAp1NVh| z`0v6}i90s|H)-+kIhsI=oAD=dphIUZUIIKqEAAA}subU;tCN#cT$2)j#t;(zsKqyU z{px0bJm6nXrvS`Lo0<3DvjHHVDUYQ@%C{o^z;ICM((`|~n&rW#TVjh+M7UD?RErW~O z@4Ysc33zrM}ygJ+tMETJ5^_=T*cgeyf{4b&jH%&sDFv) z*&UeyX5jds7c4e=7%;5<-T;_DI_2bcV~@c8`S({*JizY}*)`iEn;4Xi_hT@; zyu58QHzVtynoXkLhi*@D)bS3r*fxvD_y4?)J-Kl%Xqptb=feikiUA1$n(&75bG&Sx z=-!AHxQRNE@%bc^2!1CprEA*6AG6*@q-8Mr>vqbUg@0gK^xTH_%WMdcS;=mzApO85 zy4ylN3LIYksu}g|UlXqBig$v+jP2HwjSv89>z@%s-hrIT>${GuO(?iQOo36pOJ{Py z+#I7U{ug;0wH3@uYDbP<&_Aq>brGn}v*7g;LjB!rk)}!RdzKFbuY9&%d}8F;eR;{V z>P-?GI8M#^h5aB3;rMMsp0?LN0gfD{4D8n6?tZ=uH8h=s-`0tR5bF8r97t4gon$LQ zpNWvZ7;<^@?Sr&ecR7pzhUQJ&rj2sv>gmjCH(2>$rov?O2SKO$rV88=z~ul4_MG_` zjP>$e7HCf z-KJrp(5feI0#O5>=hH)bk{c$%(Yp;+_hy>CAxlF8?r__q_fUwwFG0?miHbBwCGI?el_t=QB!ro*v>9zCRdJ{I=u>=teBvV3E)3Er7e{t{amd3kn>7(f5TjXA&(px*IUju0aLXx9L3 z9R*;8^lJzw27x0Ky7Qdh?IJw04B!2 zJgt4&9EBP2mIJIMI8X9Y2v;tDvr z18I8!sZ&WEiPahPHdsD?&9=(7Z|pE0kWfAPwpR!N&2iMv(lUN*nSr=Fwxmz1EKD%T`I%PF-xxFPe=t zAOhW_$X_83oJ6JkH79{70sS<36EDGw>>hyHt<a*ybR`Z@ zyIq6`%#4#Z-!w5_SGQ8ReP1%T5|R6c1+WXr7gg=lHesv1&*R6JJHxR%(0F&RFAYG5 zI6j~&0*F?eiL*t+(7aynu0{EeYG{_ww+m;KF{u<+v+v~A)>b#P=(OELmJ)o3?C(^Y z&O{+*aS>Bp7Y0$eZ%e-5Kn3dd_9yOfF;;inW*BNLwsz(nclJEsiYx)4P9VlUjhc8w z8&imt&bj%;dHVi<9`|+Gf(3HWwO&i-Tgw@(Kck9#%x@4H?kTk=NF`4-2zF)08D{YE z*WQ})1=%$Tw`TVP_MKAePFkrgc^wlM-)Ii_TdR~$;>2=zBce>i01URxWT7{jIs!3u|{KPHp(qXcNyId%e;rm!j@<-(q5@aXJ+aC?QI7 zrT&cN`P9>4!TU^!(o(M8Fo51 zlOonevGtD!5SXs7b0hHl;u6DS)UrJJIbEPgaC3IL0%A0L29r32@s-}@-kx-#okLS9 z^@S7RjY8F=j>DT?3j$%t=CBKJvv7&hNh0%~@yqZw{K3dEoWpQBkUh}C8_BX z)hj~=-o*6Ii>xBB5g*Bwh7#05>p=3k#Nwxm>ebgtVNF<2(Trx}j~}jE`>P;6l7QeF z-h<%fRWgdzpAXuj4^XO1fMp~9oh-e%eg^02(mP=ej?bs#0w~Q9uBP{_E-Px@zh2Z5 zZ+^o-Oz*yu1UVx=QtB;I7^P9@6|gkjI!D>wHRHo{*={|imGl`kfw-Cy`afM45s`~C zep={QF~&3KG3U3|j~vAZsMJ`yD*;~uMfuu%?$~RH^ZCArv2R6jv0?kjUo-3@-0+Lo z_(pp6@m+QLoZUG1^Ps)=(pxzp+rDof)@mh4=e7aq@B=tyYuP^8|Lgsw`CDbKi6FM7 z30b!V+6in61yyP46yG&jqi2&Rp^roOO=Ja;S==j&ONxhFn~rOkU^Y)OaiTX#vzfKS zJ^@S1%lcKLGw;ZADj1^+{e!;->5b7qv{qJ2G1K5*H1A{rzK1Zo=ngTX1FJKbaR?&c zyN2o^ znxuC*6QA~=1(14eZ=j^ha>>Krd;{^J8Y-c>%ig{TOXIwi)vL+0Qs_{<5+o5ZdL(%T zYo>3sTOqu2ytM~~729_vZ#(Rj z@|S|-{<}P381<8ud;-@{`xGuY_e+>i8P;#x-*A*0zjK()$q?`w zLq+p*d2Is0UhTyuIy`itTStrIOQuTawt!eZ9fNn>&f|s7IVB)G9Q2x2X#J(0){L%^s8u6k=z2t zDO{qU9du^i+`<#nP-ELuGxZiFjRIuvu6>+Z0~|}s6Ih#GEfZom_QLN?Nk#ScXXxV4 zTkKv4Vm2_`^J;-VMRKKXnS#Dxm6AC$gu+SrK@q^Q4Xc<$MW}2nIs}!_o zG*=s*B)m}$oRYal`W^VomoI;wi+jVBvMPS=oVzN;&v#-d*-;MS-~a@8fG>nh(rQkt zD^C@&{aJHrpQu8D)bcb4zSPki;+a?N%5wp%a}3U~&N~N=j{ZUQo(sD)9r+#Nm}C)Eb)B`S)nTU#LitDdZLci(8>_0Rz1!EH85cmq9P>+XiVwhJWow@$&pbna z+<|>_ENPiu6De#@X7lw!>`UkJ2TSU@-!5XOGWSj37Z+zHI@gc zhF%siwM@`bdw4Mc%eAL(ZGkWA^UF`F4f^nA;A4}>TiqsSe0M&Y7SaBa054hj2Q$A~ zpYn0auo6TSm6+Xrp4udDug%Tb73u(#!jOoojLWLodMV~MXZ_f10I>A(rlF}%&csEQ z0Ae#BpyWbguh|*q7v^@q2}|q;XYf^0ygbo=D?Y1cr}n&2iMNvZ+MQbIk8X*r6T0Vy zp163my#!H|e;9Uw@q2DcZ~%-OOvd=k1FF0HTz(HBA-B9-7r6pB_DK(FE6b#*pdcqm zA6uSzcjRnK!SbI$fA7yOFX5Oz-C&o6LW%YF_cQ6&-!W^R3vLtWPmhq~P?+ob6u{~= zvoF5=yu(mwg%ZqTA<6F(ToYlL{rJNr(!wC8=`?9hjTvH#0UaeWEdGsAl?u=#irTg_ z9clFZ>F%|$;XPfwmcExwe+qnFc8cEvTB((wZi{<4IXPWNxsy-FRig{^S>t@!K@$x+ zXDpz+%i@qip+CLx3$buWZoz^2NfM6bWvWu^IG%NXs!i$iPf zJl~_+TjLl(%GOB}5F>CHD>euPyq3QX2b`L)K7Ra}dC9NE!&DjBG>5*3qb(-a-&cw) zAIDoVZfO%rl?B?BJ4GtiY7q&kj!umpDe=7wD&mJmh5PV-na>C3?bl2ApQ1xhQ zbc!z*g90ng%JB`^u~NU3)@6I}NB3(s5I*L*Sq<2tJdQo}@3xX&`5V&-d zP6#~-Jt|TZ>45;DNbkLb&c6Xaym#i$%)QQ#tGi$7iW5*ZsHmr;{$G4FI<| z?c{Q^_8ZxVJAW>|XOBazXJ*nv7+=^uQi?dV+Aw9;E(jyUHA1)}q*2-uU6WEPagZ#Ex+^8vE4RGL&7{}7( z@VU0yQBqP?l)}J6^O(bZydlk_LCvGrAo#zPa(R^nS)y-nr+&ey^!nIuTgw04UZRiY zZDAtUwp9~nyKzBpPms)Y$<9iyeBMTt^Z#a(?$u@Z_OmE#;55766 zJlS!Eb41(S5j$OBnz9{lHvyl`SO=gKsc^#M+F|0j549K+dV{7K*Uc;^Mm{_j+g)6Y zO3|$&;T$`7e%D>1v*djWu{lj#$H9<#6$c0O-WDbWz$0U0=5%qZ5YS#)sYuKzC#NTM zE4cA^654V!ed@2OoP2*zF3i;aM~5$Jb7M7CqrR^oW_MPCOvn)+csfgNZ7_fE4zyZ; zY{g2-ZLk%{GNaWsF?wHZA;WK@)aSn=0$0kwCPrL*MP?RQR*HH&I97=|_%6)k>t|+~ zqT%?0=-Ho9)>6ogrGGB>=kovW;l*>I47z~DIcK*IdNabCUQh_&RXS-QXupAuHZP-X z`kpJ9*9&juzWn+iiWtjl9BWh?OO?}_X83_zbmR-)G$~--eg#=@MS*6f-+IlQ4gMgW z3oGL^9NmpH*-|~esHg1eV~bm*gk*P6%`8@jsC;g%7wA`Qx42ojOOlLMQS)6UJ4cB z0{b$7_*cJnURlf88(P(*70y#tk1yVvGzT$T?KF3*$K@r3*5cg}3OdQOKEv=&7^cv_F^Lplg10ud^t7&Ne zeRr5im&j?iC|aTjH_7_+YH^y%KuO+G53xjDhCiw2JbLhb0?A}=zo^S84R0b--fp8( zB%+9nsa?s3E`wCB7NA2-2KS{*i0S|R#fFyuq`sdyxgHU_-WY!7M^%27a zx$RGG|F0>w-2y6rzon5HpCt>O{LL&6e@+wycH-}6ybuTbcSI%4fy`;*|{ldk0TA zSaz6r5?;Rh=P%E$zjFHHs#E;u=eU4}-d-5eXa4(l*ws6dyu>5_hUAYAlh9>`Yw;w> zTm0a^Raw`fo9RJ~bmRYji-zv|{OT*{4t8kURm*=5TT!2v!Kz10&skbYZ7;uS+(& z>>SA_?rzEL@&exe-Rn|L6rzlOUk&TMjz(?`e=e0;X+c=k^x= z`;8q51VHV(b`Y-a3wpnUFLx*A=6^(ltY06)#JqDm!b2NYvbSh^G*JJ!=ndM|kxVE0 z%57$+;=gZ2FTwmoZ7WWcY5%P3nN!F@aTV5vn2$c4}f*}6=yU$Uyp5A80E=-*7(?2IQ9wy z)~IFfpK%llWmBk|tNA%DWA_q!(ys2V`{!^4Y49HOU7XWnJvYVJw2INSYa6%R-;k2G zV)#dOL3*t9v#u^c0z#@kFY&(bNBat?Nn6b8tT7*ucXnS~Hx~JMH-DGgcb#s&=tGx8?A~IuTKl`=-~QgA9h#sr{3|szweipIxSLU+#;MgoGfhPMU*I2` zW6#9#;=36GtD>_1nmaG_!yUHmRD$UVQo13KQ%syXXkk<1ve_XW?P3SyHcvV=BTW6w?Q`gnVoB5UYHB3u6$om-Gp z_q$@NBryxSg8s2470_wmxn535!#~9cdW_0N`6xcjNc4X4^GHRp6>&_bO>x;)Z&m7A zoM*3?;Ci-%ef32$jETYS0DudLh5;xg>1&^TH#dei#MwSw)(-~Ocx)3Zc5=RKV!~ph zf0{U2i#KRop6&0OyZcytYtv;ViOTK=GgUwOvpEv1BLI1 zxGwl=Z;g#x2dnS;Z+o)YcXUccB)O37Fyw|fEGS7`6%*q&<^AXW6*}8rN=oClL%-y; zcYWGDUoy8vN?Brm6rJ-R-u~QzP?tjb)A3vxwVx=S7F9B@3FB0Bq5C@n9OUL10Zx1O zvyp}{5`xClmK`OmW|qId?3Kw%Fz6{$GQYrQb^kwK0YKV$`;hQDD+z-Po{W+?m}~fa zJfoNy5{>2?wcq`PJvp~5uLFX;V^Qr%Y9grKgaS7)MBfKgO4`Q`m<;Ydg%|F(->L8O zI~JLd^yy3CH4p+CinA1@kBz0GG*P>Ay+<;BClopX)FT@Q$9rvdR;{Q7LG>*CGbp3) zzJIqbV;DrGfpI&Q6liv)v94kbTt~EkZHT^929N9FSj2+h?j3t+J|>&J18reaoi=M(y3!f21gxm%kyG`Om1RztiF~ACQZHYH+)2Sr69o-2}-g2Gmjw z_dKuTR7qmX%mz`+gj9lbJVDa`{=X-1>RK%6FdTgiv*1rBB&m?XW44h+><<6P*8ze! z$1YoIoQr}2x{~fDU++%-@b*pD4(6ZUmS(SlP~k4*@U7Nfm%4}a+$s-rarkL_L~IN4 zLmogXh_AL-?{dH4p#y)%FaZ*dZwvo%PJtVi;oBDL_PE!Vu8t%qo_3hR#<|`O6kWQD zD*}=Pwn0#~?e5pTTAx+W$dB)k<+vv#vfOBSrqmwyL24vKQS6;2#i3V46MkYNtvXgs zE5k7tF!Rt#cGG3rUEZNnX#V|?F?^PF=WdN@kbr+BDY6f<6<^cwESyLCE>28LJP9Sa zh~Mv?tlxv_oHKR@9tji}r^aDOFkK!gAn{=D@*r?pl2^NLZBP_V24GEo1Segeo^DEd zw>e!oPO#gJ@%IEBh7DR456bN;F|Gl7w|Q)NaPRk$)F=cfllEf`ySjRT&f$CG_I=lI zW5cTYEtk4M(zu;dJL;G+_WtegP3mtD`?xIhl6{Pe!}qQJ9g(~5sK3wiY-<_Qbj7u;1 z*{u@7{B-Fsmp{Eoy8QHC%Mf%GOw^9bU0R8hJTgp&Nh|9{Lf(&gc;GxJQ?45(8~yr+ zdVbS~-Xp)=II`BL3;KT9t&XOkQ`L7DIb($Gk|y2kzC)^{Lv?~4PQxc4kPXCc$$OT} z5rI}bBE~HyW}p)5u5BD=Z}g2+G5*i1DENH#NrRB>CtQn3YoUQIJ|gC!Q(@-JGKM&-K68}^Mry ziSvx@cHP=vy0Ij*y6M9(NLw9aU}+rS4ZgiNm2j}ZQL+Gs3Tk7oVcK> zrNtUo&l1wk5nhw@`P&^zDo2g2O;?leGrcsRjs0bmOujpbjHLpW>Me&ZN2xpQ+hLu? zz|QySa)npE7kFS;No(>iO})5sp~bltmrJjlM8$SONcxWC-Q~7NT83O_p(bJnfg%N` z|C=Om@Cz*(_m>H8{%@uvx821rTX~N7UU_}@^HtMDcV6^OU9&sxXnaAi^XV_@3$~6G z#_zB5@jX0lY*EhtWaJt3)RcOB>=oy&-^@3eEJOH|M~Jq1rJ15E^#a4;DT=J}(|;(9 zAl8FqtL^zYmq;?a8aX|GCIa^X-PMdYA-47kFsaVX`~nQMr^hYH_kzF3w}_Llr5% z;Loe+v;~VV)s8nDaZ;z*=(ZX{J;#(#>KaJ3eXi|%PT7dtH~ir>=TD^Ai_!kTY;OF^ zgGbx)V?=FRkNx#c_ps(Md^fyD!shBgv{5I8^FS8RqtepH_ z^YYgfD3W^S^y!jqkYeWtgK~q!35@!e*th-uGaxZNc<-KGp6UF2-o|dK?Vdd|S6tcq zDlS-1#gM*M;?Jmm&Te2tDGJ@taFTm_d+uB=k>g9fhDVvGy5*I;cDWYPA6etr-x zQ07}G)0!9|%zqx2>hws;$TCw+j_1RmSZ9Zzm+RJ9VN|ETeI{v3XTZJD`sIC$ikCt7#XjWycSyZ(2gx+aX7{~%*|PS-_#^kr8IsFzg94pgd*}1#&kGCjU;W;`&2i39 zPV&>=))|uS28b-ZXI^pgI&Q&@I|IsUc(3I64H|#H0Q3p8K>zCEIOMk2DBWxA>w9cJ zwm^;4Mro^f#H7oGa}h+cloH-pMf`P@JMPqn?SYjpbN9At_2FVz9Xp~fU8rgk^ff4P z^#slMs{e&i`UI_aWO|w(=Kaobe%9tScS8MLS6}E|q0HHzRmEi?A9efd*V|^zXcVTV zI_P4(7z+afgZ01qZMPlH!Ca!>S%fzZ%<9HNt>|v9i(O#BleuE1yZ;*cXV%Baw^OdX zegz^;_2P~E$Jmq;eHCJbM<4yB_Zh+lk3t1&D?sPi^cDRxy7eSf1|i3 z`nUJCde+~Fk{5KH`$sLRvHGYpT!S>NTuo{Hmm~OmhsVbe`wq?_WJ7d&jw{pJ2;ArcgILu?a2b_YJGV2l<18HE@5SGfAy>fA3s63tm~Y}uvw zf8T|FrDeS00^Qu*OSV;WL2Um9N^Wq%NO)(nZJQI&umAnp4PNv%Q*X4h;dkB;Pd;~A zdfUE5T=>^d?}?z<*?f81F3O*aFsdBeHk4lX>v{+WpYTTUZ$h&eA;-jjZ=Wghi#yx< z2l%7eCC>9s#eYGC-|?ceEk$(7sBSv~P@K%pA;RIKvbbl*y8OB2CpJGcz8^bEu2$1se^t26U_Z^r zrN?UU<`;g5g>d+WZoG@gYGH>(Llc3?cQT)G8U6FwM_ zCSvF1wMWcgWp%asNl~encjJ?=uO`Y~aamN`3O=h#zQa$qHjDMkr2<;RICV<(j{f4kAftiP2tA{T?SIQ z^vXCS9)EuM^3_KcMfy-KHCg*HT%$WNG(0dckT5Rb+558Ft)G)R_;_$)Q4;{)Wtm}Q03M>|7OZKDvgTEr0TNJ;3-tu~JBf^48 z!D$W2uU6*f9A1aA9acEOaJ?y6q!d4`-{0R4lOtAfg-Hulb>aQanqWQoeLgrbk;#3z zktOn`vmZw8&xsu5x1WrBq%EgEtpD|ECvNqA?G(kBrn;D7j@>6DgV~A5Gcs*TG_dRa z=B--4u^M%qP3!aPSeG#wlvzuYrA)BnL0>$M`tCXf(m8D2mA)-u12$YtmFwaK(-W{^zf=)t>C;lnS748MiJ;qcU*Q zYHVz@N*iCBt}?G_U6|gNZ_)_18+XrkXg$pA@N`%rQ^HVfR92l{ky&jdYBUzF^^S@& z?CZm4?M_FI9MLX$^0ub3Si}3ka(g};a<78nF1+}&FU3;5r`br_)Gzu)c&fR)X1i0) z3Eq5$x#d3ep5A@ox?YLhkMvTv6&ncj!~D*%e*W@ByyE-!k(u7h+IbHCbumKL0@HD! z?2EtRjTieV`YB=Wp9TDqoE;ru|@^&hE# zv74+d(RGwK=RHLgUEsGG@uo7sjWj0UQXiEc7YY2hyt1M-R7^ve1SDaqR&z2Jwd-KI zTG+EhEH*AU_;7gpne{D3eK(8zp@5aU!TGm1q(8mzSbem9>)zcbL?e3QpW)6k1cgY)>(F~UQ{cX7LB@o{Lm}3 zb|rjB!(2ABt{|n zOIL;nk-WBVj-IpIz_twj3~Pbzn|3R6Pi30GR_dMm9>s56HaLIi1dR!#r#WE0*N(m1 zZ+&R?zGQ*|eLplt*Fbcr7sc4nOL7Pi;=5O7ZgAbAtAkc%Vp!!OHwF z#<}z1wYCGZY#Ql_#$+NfeY&t5wX>gnC|e)95F_d?84S5wDLq4*nOSA$lO+8+=L7y^ zn*Y{U&eYYi25|ozsPvnsx{5igz~5;~d@IJT!L{~?cXUYBDp0uTc2dp9*8V`TN9}X= zbNfJgeST46G@Y5(W7ES0(uNktv!L0gd20s1)gNsJsy}>so~2v( z*?xQzMT;@*(ne@x{b=}ynEud{fZS$3etpBkvBa#Tq(s_1@~)bi|0K(A+_T266m^}9 zWeR0gsZ5@PO^{YcMNgkO1x+ianUA$(n4Xba8?4d5Z8cW$dVal=GPWBFbfcbqy@crJ z*Y^}@IjL_G%BGI<+Pj~l3gR}X#vxny>eZF|%QEA5>ulQLA2B+jqN3zPgR;loP|d

PR&FAF)8L)Vqx%%2S+Wj1EZ@&VC?=R;X@b6FD$Iv zk7Yn~pv<&8-b*Gxy!>=>xn2b8+cyOz5AwHuKLU+?xJRV0ykXgvmZ9fAsRqWI$!g~K zaWfpRbvVhokzQKbb1gHME?pvR_>@(#^#+O7{>k=`PcCSyuH@%Eff(Ag)m13BAQqOD z)$jRIJExBU(O-3l+^#4fCC)_|wr4Iaq$<~pUZ+(m(-jDnM>~Cs^Q^0x`R4~F$+9Ka zd*A;3JiVYCv)jd51GBPq@XbB$*0b$37 z597;LR*&&ouLN0j`i3zvU!hs(dzWSMqi^Nt;lt0II67VX&YWHt{)WweIIFBzX2V-C z@8<5N+W%s$CCiwKk~=I1`M;xdPu;sBhqV*U-bX2I*k-QCz&=L{mN`titeU^|Yr0@v z_Ef7@KA7IqBHpYeeGqr6*s+Iv|C`sZQ?*fRF`3M_ZfR1W&C*PpjirObxD76ryB@-< zZzRYQS_Nk+YLV8&i7o_W@1)s{HjUDZH++)lzar zyySHVXe6C>tOz5cIJ4|o{MT2Qa>vHT>w=D(C3C|y!;nipKa6iy6iGXESxTpaoK7?Y z1cIrKS@h)oFI?+qLsAw-eY5O_CRT3N^G4Km6g-VWTWl#R9v?xXDNr-w-rKXv$gYL4 ziYdE5EFD~qNQqM}by=hx6LMLg>Oi{}Go@J)_(0nnC9z>tzasCsKI_B8dX4cxf2BX_ zsMY$dUKXToVbiYPF{PPRy7{IqR)k&VXBcNxrH4@E*lb&yCVWVifVRfNQFxY)F5%0U zJ%jae25M{?>hI3gBGv6|T9LCDD?+kLiURAEE9$pzzxWx>9ml4Yo;Xw+$)*U7KfPF~ zLiDXPsNZBZUFI(6IaSivM>>^K!6c@;7223J#Fv4O-HZE2YgC&7s>_hTgU$V9cC&r= zDymqnUcLGNTxg|2o2M=D9{WSt)S8%WWxBEGVArXLfzxNspdOV=S`yImEDEu>7IuxN z(z43Z&t_`JwacPucr8*NSNI7E8*S~~|MW)J@kEld1VlmXU=9S{fQVu9E!Q0MN}QBn zRgN{3l@{5JPS{O;{rdIBd8?_iGYnM2c3ZDsA3*d&*qKrl!~{uVjy+ffl+1%WunXknkJ$B5t=#8S-n(o@t zWC+v2Lx)T!Fg-9J)nl}ZT|K6ccH(g(zy(GYBJ%hw>q-y^i}oApw}nTCmhuA*%`&A~ z_jIoUj-G+8-sr750+D;FVU^;TKT%A@?*98EPN}=EX;Xlm6LQcE{&-pHb&?1lpSqaB zvP^SI{R0b&jIJ_3WE*@xB;XJliYHu#OjiU?-Ick2A6GA?h#N3SzIvtIT*NUz%w|9u z+$|Z2SWhm!M<WFyONN$2R@s~%EdP+c!hpF}RA{Gby|l8fZuAv} z$c)iu;}PxL&_RpXs+R|8c+K)7Z(3zQB_ny*$%?iUUp8GUUup4C?uJh6fiu*ydHm zuMBm%3|0rhc4*6|&VKSs#HUQyg+?waqG!@JB6agMbVTc^WG&S%+? z(e1u!1~wr&w&v7S89KJWSRqan*%b=vO4)&@qU$IY-*xes*Y@oown zv_ZN{6YZRF2B>+=S*d$cQaW_gVh@W|J|Oa~@vUCSBi5ELghcU$nJIj)Csy^LG z!+x>{7RP~bh}`XFiw7JW7>n7fGQd2`N>#85InBh=yROUVVLc$Gr=dwdbYcu~$NT8d zP@a_F;9$GC0U6S917Q|wfl%h|Bf7D`bHaHArCNn`n2d~d>SK+$^@#2?n?YIhSPLTM zoA=Ql_b6@-n2V%eNrJ;`bdqdKFv)jZFQ?c!|lxjSFcJV~n@*F!7>Xni3k3@h8)08Xx{C?4~GOVO(<~$}34Aq4?Exga0p2$@{ zpW{~fDCX(0SakWLJqv7+PvvjSC33xNSLOy)p&V+;5Y}U(sM~3tlbN|opAM;!6-&KJ z%)2|=7glk+E>qI( zHrxjRGziNf1vc*i54ruLN6GFT50>L2yH0EJWF6A1S*Q-iBATAeG3)#HyR`o!S4fxZs<3B;rJn>c47m)+tcR+(ci-OJ?^$>4d@$sZWsSjDLN<>I8i-S znXq8$(pI_6RXGtCI~Bk>Xb%6aX_&iV|?`LkpqS*9Y6obkv#+6$Kdew^o0+Ej79gAQSHBXMJmVq`QW zF2{{-X}Tv1mMR<-L#(2K0}#X@yNZd@!GPgr^7lCDefaQ!d{JI5Q&(WI!#ryQtV(`9 z;62Ko+H%xx}_HDEF z&xJ#qn?6j?ax&B}AOO8q`bg2vE6kUdB1RNV0=uWQ6>#0>g*}+*ufy7cW}51!-lg z{G1LR?I=qatNxJSQ1`vmtg24L?``3RRYxlYUwB+xe@&qV!e*_aM43@DtO{ORse0^7rf^}u&=#_?MWbXb}iK7LFxX5g@m zA-J&(^YvokkHyRJcnzqCqBdODY8|FqHZgs+YHK(yRJ+hDbnuo&rYj0qr7C%zR;c$mwG2xydCfr6x2E; zt)Sv8@CPEC=ZAGfDJUqKi9LaN7rqrI=@#a?47P+LJAir(>sxUwa#>7=t=)k#N1Q76 zDHKk`eR6j#T^*~LBVsp-rqGsz#mXq_w0kvVYQ+j7yk?!MC^Nj;IG^R>kCZqqZ&LVq zb0{iHEi-!Z0#Sv>ef2n}fro2VOm_CQ6AXMeE3!fpI?$Gei!_Vi>)DyO&JIZWZ{7*# z(nFiQ^Ruxy*0*5RQx-Egzr1`vjmfB(y55ydMdQ6YZ4cC*_NOkmbTsj#5Qy5br*DH%u`$Fc4 zM2)wnTM1OU1y@FL7#2yZ+3P;8-Q=*D~#B73HT}XrnF4A93H$cJ>$= zE(OGy`8=G?2~R#1K+Ky&Q>|S#;czukVr_{nVuCjx>h8CVUy>=Z8B8aqz4cJQ3fF+T zU81A!xuM2u@}TFF?b^cBQ~MH6>z|L(<3hZ{nMO+;d!C!z!^X!mo?uvV_WPRoe%WEd zQQZI$Zs4H=rotw5xxeAh5=ckD9wf`IDMqU^afn ziFu|EudS^iq$tMq*dg8@!bO`t$DF#b^1E+q(N^m38}P@0YJ$aa0u( zCmd2Ub>;?ZQUGx+wO|{6KVcE3cKM)!e6c6QSbSz8VYXEY_N4N8+B}m$*3=xVQ zvtY))rB6;`dQ?ALx);sf833od*1=nbhK7p^&9Cx3w_d2abcqtn14UaiwDOpLuton9 z6cp6kp=`UgLDUi15*x0yEwG;RG6VmWR$pdX0Z^AQLJDTE?a2+(p{=ZYW|;sId8%(3 z3P8+>RQpGSbE*uha_02N@;4F>>BR!PMEv@Sg#kx6 zb8<*qK3#p$%w^I0c39xcgL48cJrAYx1(%4%;pW?O`CHpRa=QD5H;X0@tL%5iFn%NJ5ctxO<` zx2((H3T-rZAN;9SJnY=B?c@DMTQu?X(BXkWZ|!KR&PlIv10q#MPwIMH67_An$5ZP}BF>G9A2FGFE%;K|Zd zR|;O=6{vt1*|mYKci^Rf?_o+g;hHExhVp2$C$=Axh=u)7!C3`-iORI7`$De|gDJqr ze)3C>$HBz_J2VQ8F~Z$P>Zaq=bTGImV`<8{lO?rAc{+}EVCHjH^+|qQ0E5^E*}y1; zIDrJ@4|Ja;A=&=TnA38v&qto&N&bfVn6=`*zCPv2`QefkS=l0YOWKXHf{HGpqZu%1 zQ6z%t2Kc@7s_CjSQD`-Uh7hl$_ffRmAhhYNNW1p^DM+DGoWoKHds zIfg#WuY*|}tzc5sP$rGv=9ZV}gaGtmE_TOTw>?}b(Jw7hCtNC$1p^VS&w17PpKl-U zcn$P;A~ECeVE)Z0lqI2cR5VSi)Wx5D`o5dT!Kp847~ExB z@*FvR+#77Yl<6BY5*nXxa;gS)vp_T_&%LQ4bZn7v?$erNa0E0(WmyQ7Je)uFdmnoB zHSK{$Ua~x$C|--?JSYm!CbldgNf1fkRM+CH6oc71v1fERj>Tl6?Yhfw45kGwf5F?w zN2{)@$TG@>IGQ5jO6!`i#S-V19Kxcg9UvEW^%FQ2E%u7i$|feMWpq4}6@HX?`OM7J zBp!U>dx#=Jf8$MhPy7d(n-&?`sPS~E`tDV$PGVRKIn-rBLO@&d$;|T zvX%Sm)`URwkg;9u^w(R=d#4AXY@xivm_l_+QnAMf9%I$)hqrwyQ;ml83fVP~t+ubo z1ay5$9Sh;G7wQy4L~g9P(TTdO-SbZ&TS66gW#_$@4A~^0q_(U&GrC+UMg~TC_;ip@ zj!~$jovv6EN3oe{V#4MI&|PLgjU1Uf(!@K*@FME>OD6 zFMKRby*5&TIJ+n>G?VXIPmkya5K=%y5!fr$f@c?F1noOU%a$fOEK4noU0yPicCcPi zzQdMhM&588tEg!ACp`Cbl6e=(oJv0Ky2{(P{Eo?O+0PRM9Y>R)Ze+SzO&Ab{#x$1; z!iqDInCXa*a7L;51k$$lmP^?U{h~%x1(T6Arz1=n-&?nv)q8GD;t1AQbFEsAt5>A~ zMNt6!LP=cQt4mZ*&`}v&FOpB~v0@ zqY+%N#bmru&wjX9K6W8bltJ*9RS?ION{3G`e*b0^*<9{-u@m=P0p7?`D$33Lkt3^W zYEZgbu>k>X8O{W;6x1?Ve3IVV0+t`+w)t$_NAL8xiSE)UkJwv3a?N@dsCim)`Y$`w zcNN)3srlw1V&XoeJs;kf^ac76E{o7zBoLksA3vrnE*_8HF1Q9w4(Zh}0h8|zOC~58 zxUHZhk28!loF_ujyqEj-hXy&hnm52HJr1gFHr48!Ydry54juV}OOLb1t+E}rZp%js z){NZ?+gn=9dTGC5jYx}h`|Pj45_Pu{K;utnu?(Ns?pV-_4SIdPi$*!tK-D5I+Y@}9fGtU-Gro!!I|xR zdb=cqMM0ZRY-#z-9MMr!_cR@yrM=tAPfALg-~PXdO(-tVU39z5pKzb)mBNhQvXun% zx*7NpRiJZQkUCQK<2VvWqkP<;&~InW0M0qtUaYZ3WN7$sS;}sC<`kWPo2Ev>=jhB{ z1&HNpXU;D%F*A>DP>4QIZmLx~w13||l1Hc7{382_lT(4d``}Zcu*EM+z7J;7E3(r{ zko5diFSdrWihD&yVfNkkgSsUEY`G+W?W=KcF3@);Hr9C-r@G{9jkc0`&GDM*rNtHC zCX<})JR|uQkZi!R4j;^ct)wYhA1iV>t4}CXkAQ~p1Y3~rTyw4^L#ceK5b%{|GyAVX z8aTPE>S}3VfhAVw>z#uk03w=?w_3XV-bCxECuc$CI+dUgL*CmUz1(GY#8ORt*77B+YKrzh#7$Q52e?=pWY9q&bedzDozK7)v z7^oa#b8BCs-Tc8S29I?ahLWuS340FRg0^HNgx2JXwSJlU{!KI7W%kQ40RguhH(yEy zQfG;*k>BdVKjAZP=~yITt&5ZG_vi?s0}JSrqfc)}F4W{}h4sT);mruoVV>VPsFa(s zl_W;D+JhiAw(LU7!}R3{mw^Wl>H+npT25+&dTD9YT|^is$L$hWQ{%90{d^1Ps@t+> zm((#t4P^R6J5SmC*O+hR?sfw;0N(v zOYyDq#P?qxHuT7an?WloV3XfHZMm&+?AS56wM08jv_&B)ZWN$zz{W`c?ncs>LSavH zV9kOPE8c~hH1H@Qq)&}g)`3qzDpRL}yoUdL&$gKTeUZeVY^Z9XGP6t*tPm3D&P?rp zl;W7mi+u+(Ubg?xE3^^H4;O0Ud3O>Z73K0bf!Vrx!@AM&$`o$Y1lkDj@I{-H<(gV>0!jkWO>u1==1yNY38#jLN{8DyU^) zq`TH?&9)vJ4?NMWo0a7hVo#d+2Jr?EN^Ra;tBb;lyAmh!Oo7P^masME4bReTAuv!h zSJY_e@(tB>tu1^TpH5+a9UcwiqZpE6Ix=!SENQ6Aa;n5z&}QQG;PMAF1uF*!?y~K+ zLdq+H#h|-{O(QdU&}n1!gnA&iPOODa$GO_Uao4rMI(Qt!v)(%-%|(JbQrohHe?=1j zdppxEOrr5qZYgSi%zm=X%~4M*D(;y1&8Yia7uW?1dh*RnG_veL^S&?~=Q+}DOqM47 z;hRJK+jsApo1WGzO#B|kVYda@U6|nUy;1#i_%qfF5^f?i2kt-5>6f- z9&FnAsWkj%iJKd1NlsnOeVJ-UxAa|v!~y9^0O%vdJR10Ah?Jsg)xT!wh_1P%wtU-n z@Yp#V@b6KXD>v8xkRxq%5TB@(IL)fwanhh<@D#eGc`L?1%oto2giL>BSbvgSI4c)d z-B1ZEea@9}>zd~Tbf(sc>9D!MpJ_(5guP!V+0{qZ502A0pZjI-u#o8P?%qZibs5Qq`i*WOG*Df&#XVgo% zC&+Of@3q{r4i}|e_3rwu+xzk$F7-B@TAEYb(SiDu?1l%_{*royE^1N%akwF*P`*|9 z6=o()?5%uu+yJ^Z?ln*Q?T5_e>taZNG{z2|)>QS=Y& z({#9uIaGBf?cz+`9FNI4Y>ZF~#=z5^e@RCzO<6#1-Z_|MIs(vWlacIRbxZIG(zWv5 zkdz5cNpc8)2w|1@s#TldGrI(x=TzUA+k}Gs&=%!ZO^v_QT-Zn0_@RC>6l@Ann~qzr z=sq-xz?jL&$~MItlL-k+&7B+vCY3_UshVv}vNadQK8NX{sH z$}P#1fIyS6{89Bu7Em)uAPETI+RPd=(vDJbaliy5R0Wv!eyfNSFh>KpZBfatn;K-+ zni@OH;ur`(0jIZS#Cjr~LBX9SXwq)yD7IXiGqOR%Ey?4xX zu>thZ`2kz^PlC56Cq~e?W@&3-vEYcyN@0qwy0s02Xn5nxSaiv=zTx4N@K{&budF5G zC%0G47d09_v(#C!^{X-+7;9{%erY-+d64ig!MUw36)}XS?j|s>a@(*PC|H$1T0z1o z+Q;(1Ft90oe(e+MKR)myq$*e94Hz!q4VoycK>+i<#*9rfJ|2iZ`{K&ZLbZZyWAy}^ zlwWp8xsO*roo1Fz)xl)mh^iHITh3O`)J@XLGam0OoCm1fOW$SX=?0%MS_iG`z^vHC z0|aOD%&E(qRbW;~y3Vm?Okl2Y&CuLR=P0bBu=>k4vQY~$M9I15%mnc$COv>?sHQaa zYL%Wpf39v|4zd+D%&%wxxxC?ZBZ19<{ywjNOks1B+Nj(7*k6+=!dY$AZs z!Dq6b2uVBGex&b@qI*B699}{>%XF)l4r&_1hWM1T=S_+i9D&G$qP1l9lihOmFYnU(C(W>8E!!- zA;YFqlvqYT`xf}w{)S?c%eltQ@hpc%fK|)WT6M2TM`@SX-8(AMJl!9-Qw{ zJ{h`5)9sA_knl$^Gcq6~D|j#!-lh|DYg1!RTX!Es24F0@#&UB?S$Xtfw9$!Rm0Jx1 zPvE9)JyrT8{W$_j9v_d%2N7VvF~lVfuk5E{#|7 zTXjkg{=$(+ufXyCF6^l%HDU5(T8l`QE~;P!{RH9-SR)$xP$d zpTnn=V?VOC7awA|ADKKx)KH4;93=$&R?x_l9E}NlGYTZzw9Q1r&~21!L8x5ijv7h& z9o!WSpGkbr*0Mx!{$|gjOST$2r(O}xCZN>PG%4zK(mBq^aTrqB;4m(oWHJVeq{VS- zGTvaH@Tn^#-%jR7fX4cKAQVpijXO_LRe_wK#w^_+E4FNP%)DmyoA1PZC8q&Sbo0tx+Ya2_Jc zG)W9b>ZtgeK7$ab85#=7wXbpySv8&JCs&4{}M)DiYV+q1|x?>{QAR z?EMdRJi=uUzuq}PyPV2o3M@LHLn|B9K;D6-jp~4PPi9Od=;Mx<*Zm`)QX9$J63pzW zRX5sH*sND9EfIvxI^F*mWzwgiKB+gorCn%q*C~w+OrjTKEdH*fq}kB>G#8hKhnAfM zta^sR{7ylwnQIz=hAON*5z2jf49{=i`6w?}TYaV{Q>3HNI1X?G4Ob#Vz6<{oo8Cu{ zT*h05d9A(;*pbZww1rrC7p{%+K0r1egMX9A{@PJ)lBNY$YD*>`wNaeJ$t9{El3drs zUN077BSi)xPAzNqTdKzOT^?2X&610Yn%G!s`W?CF7ixc+F7iIhwgMUBx@eRIWn>dN z9|H>0Z>PWO$+9i`wvfYm3W!H<30DGd$!WkXL$f@xM-4I5mGvPdYY~hh z3Ou~9emEA{LBC_VR0AQ{(X-WAzzNC)gFK?&2_IaXukYJl2EoM^A@_T z%%#DG4fFc_GZaBm{rF66=v+~VeiES=3?&|->wY$8f!7W&O9mWEj54dX-NJGwxmVEn z6e7#@e)> z+o`yTn5x4RbzUZ&3GYo+7G|ZU*|+GX`E2h34B|n%6$5VffL+f-d)_#dUREv4eHt_6 z%6*>L%pJ)$?l{?9ELL%{8$j9-L@z^{Y{lA*oA`xxPtA=vZkf^|d(}-hXP%pxOc18& zA3UbnBgBqhN1S0%G&bo3UTF;FD3)`ymp9!&iu<@rU#7dyj&!xawIxlZYR;$$ShSJh zw`Vv5lkzzyIYA(VJ|F<$&`rSHKEuAtOL6GSSaYZj?b7t`{8 zMf1uLFw@VR^&B(5EKRvij|1IFzUU9`eZ!}6l*=LwQomHP*kMW;V*2K(5hE}Nyym!U z!A<+In?9=~4G_#jSihH-xXzsF8(O%Mrjc8T=XAJjq+25>z^A zdZv9l9kl!2=gOLOaPF`M21uPe<>utg&ll?{)Ylv=)lw8JeO5u5tCDAQUky0k43AH; z@?fFzA8t;ktK~^{uo&MaZQs=#51OS$!q0I0tRtb_c65#ssg3!X&Z$usZMGJ)0SPOV zCw~JAC!~!6jcaWT=4zMWl+ZKjtkSg{P-Iw`ns*nx(D#@!U0In`+{vz)DQReU(2}au zWfLuYKZvw#J3C^R!k__|wy5JU+ADUZ?TZv8J-w9xd_MxvvipZ#U2O62+!Rm*)Z`;m zIN7NvUQ08S<@nn(EDN~i`jO5;+q9*3etu2IxJwc*O9g6ofJ!Xm&Ye5D+6FGpb5P8_ zS$lI6!=D!+yh6pP`*CU9{S1pj?oodb#CCjIDXBd}ybm4}N1Q>49c%5lvn^%00ZA)E z=T1XUB4>F`JKJn%&zwmBcSn}6iET309;!EphZ6MV>6YSK9)7+vn{1CK2`Ckkh^gvb zI7cI>vp&Mh3=0(k#wx<~(IunZJw1xnC7bCw=JN96J`B05uC*jP0;ap>IWR$Xo^0%e zMY5agD=nX$ZHoi#$2%$}=Zkf+u`!UpgC1)>UqU z&w5};-Paq*R*frqAnoU&S}`{Lj)b+fGYzop;2Wk{$LX(H*4>w1v(NRT(qtXsgo%pB`zyUjZ;ll8O<~YA) zBY}auW${8|7`1a_E;9NQweUgUGI7WnD!LIzZ4qnpOuC!(8IJxg&QACGeADL2 zv1K6lacwz0qu<|#gtg20*>smIF{f%KQul!NU)|?l$LHFMbS_&a}4^|#&#PO@xHMu7zvR+ftsEw$*74d)tM9FihSa$Q|lKyO3T$c%rpIF@?5EAr@ZyGe%==B<|brsl0} zDDIinm6f#TuZq+WzbjanO!~tt&6=`f%lp^)tUq{cJ}nybCS}E)80nIScw8odWjnI+ zTI03AJ&^D@0THXYPKVAE7Ms2uV>}VsqnfEYn%NTu?!H@gXkCn03U^t-MrAi3p`*~A zD8$aTMn+6bjN}9_&Mz*ukaS_MzaI$4pFMTz6GLTSbKa}CW{7;5Wk5E(I$L#w^xqtj zsA6LB&tpTw$xJ&iGZOBrqg4@8yz+|r<0PH74+TT3ALW*22Pl|7f!ael7@C+2K*k$r zor(z=qHXD+k^I&}znbUS9D8^I?M$-7wxUy@y@p~iZ0JM?5lLYpX?+5n!VYITTl^In zKmZyS!5Ib>ha3S`a!Hx8A+WFu{ek_9owgDj?E4^_no|#b9})^cq0ArOmFn;Z)=n#Y-HR66I&*xRC)zW8$=8wM7&-Zp z!;uJeVjbPt2=4EpXIPN1XgD%EKNRYUYD`8_v{^_MKgu(_UGjfa zU3VbV|NqygPxWbkK9vd~pHd;D>{+RVjQY0bH*?X_E z&*6;U^X>Zd`F-yn>CXG^Uhmgmw)S*A455cTxlG?s^{K7^O94DQbpCa8=%SM1( zNG!()No;S}Gpvic4R@7L;~6B}lKNbRxvl!jI-w-S*KB=13t}gr%&7Aletn@vs#ScW zVmRBAE_rHlZ2Hyg2IVTc!aYWK(gf56kQLuOCUXA#`AcjcJy)**NDi8kMc`>R^n((^ zC2TJNZNs;$o~LmklIt4K;LLIR-baacSi+D1&}2U~e$!2OU3`j&OP!y$iG65|H>YsH z)fL)bzoc@k^*@IdOw3iSKcxSDxo!Ac`|Kv^ceKIK@$wbQF3+aDbOWnAe_Eq8uJ=UX(9 z?CozEwwK~6)9j4oij&(~FKgtg5R5lxRT73TDrhn@9g-EbACx;_Qcd8|v*pnMLAo-Z zgibm-6P?Px;#Op>m9pFpLof>WW|5vVWhn}m+&rDK&%7mB}q%XL+jwF?}QpMlf%jkL#+LCdfx03@)XuF zw%{8*L;4GKv@m}G7KeXt;IgRYJkf(9GYT{h`5wgER=Y7vIeq7R>m>j2rmxC-V{VC_ zlAz}&xHIb8XZDfLjAmJI6;t9}0m6qjCUbJ@72Pj&Cgp4D@@f}YW<1D?>?%Ox>_+DZ zL?+wk-@|LC-o%wsGVbSuIn^q9vYrkLoGh_!oa%J;W-;%+QNOh%56&>4=(=xa@4@O% zpB(gkpJ!;}Dj0>V-VF@=>5tQPGa7LlY1F@~@4l3^rCX|2AH_{<+;-~tXMSUIQ?)?H zRlvICR)bc)3Iw~_*{*I0GCp^L@GgT-#kyjEZbMHY)P-Nn=j%M#7!)h0?BE{uZa9v$ zo}T=fy~O%U$?Mk|u?2ZiIFp#lqw^R+Iy&clp2q#9&rf}uj&SwJuKk=mza>Xkc*t!M z6({W4m0<;dWt;3Uemj}&A6IG9+@h9o%eH)}>(9|T=E+D#!s7Jz{x?U4n0v~lZF36sH7@H{l+`G% z)_vJwHq&`)moa=U1z2X|n~F6?6m-xIoZ=X=(FZ`c&%PrX!S(&l3Dq7=aS~YMthEgY zV+YoRA*JV>%n>fWLE}GaphIZ%Ez;42MLqa0;Cn5NHvvu;3a~f6#R?@L$zfyZN%~}P zMAQma##m?n$;_N3e~OorZDHGSv<~~@!v}|;2znfzjqkxJUR{-Y%MDf{(l@1Fi8-@G zp(A26v$ICJFc*qplZ=ycR%nK^eTl3L@Prf5VucMW1rHvmJI>CC)Y}@)-W{zo*gh&s zrI7HMzn?yHEOY3KykU`o2~zI{zO7KUzPeJ_jVDiTAlP@ik?)fWq8?KSVeElA{A@&xEqs?uJ&OF~# z3u{aPi)hxVb!WUe2J`)dghqqs{gZGkYrZIa>XHcvQ%Hh-K!wk;3*buFd7Jjl#V6kf zSDCw8~B2%^3`v81G9~c)*`l3`KnN+Ja+7ufc>m^>3C|gYF-V`{vo{U2Vch4tWlK& zBv*inZQ+@Hzpr8+_USNW@0m2XE0?QPA*7f+b6~!zRB0ETxBY7LVY;u+La$4qqe6{N z2j0PwOzlViQ1@nSXQc}*F!SQh?P@GEX`20Zied1}^Q1Q-Izrp{4&m5>x1kSln;zc% z0MaQEo4>|1Thlvo1F3~{$4h7n9##L%8KCz_y;D{D*2>I*KWzF7bqsmB^?4vjohexB zVUxM#H2TbDR+j_?T(w#NksWXtcJ#CVZDVuI4e90$m&g-U$~WY*^RN!M5MS3|~rp*n08o`{oJKu>rPr z^sVlEqk~87r{8quc3L;tYzAK$;HIySBG@Y)b?EHzJs?^j@Jn341_yKp+z#qS%*p-p z7>eX9hC%v_G{$@%7}oeef7Wqx-7$6r*jK*(-F|5{6kw;~%?=(uY&-oXk?o_P6`xb2 zaa0oE-_vZ^KK+t$>#;~th_znp0R}AqN|qlB%>FfD!u0vtY1Gx2@33|kZr+BO;B82) zR4GC=zq>tCkRayVR~=E+d+hMuSV1o#-Zg8qJH~M*v_)QtAwbvw#URmoTZmHtsPc$c zZG@$Q;~&z{VOf@J1ejG61P!$`yHPo4Hy5I)AEo_ON*p+NRepEoi?!-5TioKp(70+l z*J}YdhoQns;S)dYT;>k?O6e6@uZm%F2H7q13LdhV#UM3zssqO+6N$( zl+(2-A9&bZs11F&BFDzn-@6xld|bK_RfnC2<`Y11bf7EoXU4z2l=gHwd8A1F_kA6b zg+;dt5Hm$@3aC1GXP$?o!zaO`D`gW(Dlr@NCyAouOU#8z349TD>f`E3x`dhz*@n`cuZk2)o*VK6xY2WLl4=W(u z_sfGeBn;QUZJ2(U_c{+ab)$^)dRG8mX5Rdc9pLx@=Q&{3R7gtl;HC$jNPu$&mP@m& z2)bb@(*T3%a+>SJ0R|c}v|@*Bly*UPzA9F$Gx^sxKxb$SJimY6;xZc_pY-P8y*@8E zpOgY%DnlV_-*S6yL}bA&pBqdCmdXH-)DdlmGKf{zR9nVui^#7VeDxY_DhsWFK*@k! zTbb?d*aCJhoXzAJsDigP4`0mO$*YFGJTGzpC5)>tG=ama7Pqd(dhSl}ijyYoO7pqD z`^er2-_%V*es_jOe9?n1)Nko3%^{d5N>qb#E`f zn*aWmX@@80T^QQ7@Zt8st!1bE^H=os^$)u}_SW;Do{Ro&EKhx9mZu6_6(UZVFv&Lz zlx1M=IzmAay8^_4jN9RU4A~5{uK;)68qA{Mmp)L)tmah99DrkF4+2#!R3Hg>G_pnt zhIeK@(s##RWF@@^wy%v#rhF7`V(CG@>GsEJHPWNRL^refaG-L%*_yZaPdg? z8SB6RmJ6@S65Zcsq{aisLXZCB$&?RQo;uUM(1$NOnlU@y26!BMCVdL^+D`Rvy(LZy zc8GfpwVK5VJ9Z5&+`Rde+!YFlgH6vMmdXvO zZP9AuSWOw#jQe^}dVfPQrNOJ zrJm@n>1av$fGm_TM5BTBnB}qkxu<{}ukgc%{VdQW%rk%SHD026_>N&y%2s(vhI3(X zS2@KS@=~n9MTN<4MC|hyFMw~70G%fFtuj}Y6bD&^K?%ET_@L{5*H%M-Hp(gaffw?! zzc8Gam6WUqOLCD86G9wYub%|{GMno`=BmA-6%a;dsAa#+h~O%6WPt*O?ck@|&?f?d zoUW3RQdq7@Q+5i9kxN*(V=|}ljmUebCL_Id*qlP)Pwhs(Cl7sjk*<;RZjnrOtiJZa zX=O$e&KC_pjH^LA5zxDk80kUxUk&sC?5G>F#~ev9E2Lh)TQ_m>u{~f*WCJ*WH>XOG zB6MUX8J9ME4dyi%>p|^E!<)LApaAO;)#&ewmwgFg2%P{b_SX8H}UCT|`YE~l=T z&5cv}XQ>P8Aj{dBC@m%%R%e)7Y}}61FBJMGVpX`?f^@g?b;s#gPw3@;aJL2H_$~TcYJ)38C+&dp5U^Um$IhNy!7T?R+LPRR z?{2?{N|UBKt#9OoKyxI1Y)MYmxJZ3xYS8u6wYSUM*i|7{WI$iGdj9>*-D}q_!BgTd z%2VM-kLA`=->JU$&VDyt;B8qwmjg;1NP{*XrWC}SXO&WUddZ{?+sSN$S}!s3fV36A z!I-80O&0_!sM>Vc^+Cc>=J?sQUg&z=Q50Vb)bk)U@JqWmYgM@WvP`xDSxei0L(r=4 zUF1>8O#PI5sB8Z?r%G+TNmbA-fm(LG0y+F@Q#nlnZ(u*vC9y+aE;5$y=-uUt_8ov{ z2JXZPqMJic>4E&u2XhMWgaCmXaZN^HZH>wyDyk*PVHx!oD=V%x!9@$JhLg382igyU zqlJzBd2m2;=QWdv(ATE+@cZOQ9wt5?j^hJY2(d^=ed!!|X`w#;o0N&0+GS*!Av$Zof7l`lzNoyy5%L?}%O; zxCG_*(hY$s*78WW&vN%02B zT>SGMiL(n=>9-qhc4@zPvU5I&haf+^W6wh~5jsRjuhXpOZn@ja{c<-)z<(9+*Ir=^ zg66xulaDI27pI!bv7(Odw_tP0Jz&9bXfHrqbpcG$0<6K%X4B1~Vdzz;CfTq_EUX$F zk%)p;w8g-%BCy(kZ>tE1e4Ib4IkJ6eOPqvW7Jhn**qTnjyMK|2TuH3HlOZ?y?MMR& z5OB*I2YG>uhA@AKoS??C~(ky9lulVL=SZs(aF(D6=R-wg~( zlfBx$-7R8cH9@ib9yOQAv&3@^<6)Y!^t36ec;G+en9Hu6r75Jj*xrxqtmkjvx;0VH zdndy+FGV3}q2YB7GPO_`l9mAZ%fw4goubfQPr#LA=wee~?Wcp7%w%0^d^5nCvlU^qT9OE*QGFicD8S!#keJ}?RO8l8Q>{O#g*V5?dkwN9 z(;JZ@;G24(GEV-dxNX9tM>j$8i#{LY2@LesJQ-&Js}>F25^^gfds!^3 z+trE(4z1n>*dq_q5_LfeEKOz?7jh~e4{=8i>e0@n`F~)e3!-lAlWlqVqPfK3oF1NK zDzobCL)o7t`FXMv@=8jEHd`6+`%nq%F9>X9yZ0RhDT)fbnHRW;3Xt3DIQC*^Rg&%4 z8=?iIp&6ZLE_C|P`oMd|mYHoTtCu;@^#w`174v11)aCalU{xYyU(anT;A_;KlkLhk z%LB$chwC3WOd(H<_(JN5-S%|||GL`W)0lu{AIy?=pOXz(Kx_g)?RW9$|0XOO;34%r z$w7!<(xwR6Br8@3B^$6GWNm5SfP*_?bw!;rtYxXd?GWxoug*V^latFe#{xREV%;wP zx8Hty!-&0~_;h{o#Y;ibblWBtdTyy5h!q+ZSKE;;K*OuN%`$8~Q?vw|;}Oz$PT! zrr%?#B{`h135BAJ$}K%};u!RHn$P*enSMzZ--=UL=ho&gG)oXPFn;cVfLS25!7m(-=hH!u5e_$*5^AYdf#o2h$YYI?PfviSx%~AtPzMX`$57FuKX3Ba%Rh?} z*O73wD#(p8%K?SyRO+T6#W}V>FpE_U?%7q9Cg?(1c5Q88(jf)w1^EsQQ$kyog$W|T zChd60Z7ls>9%tYC-Rr5;wG-S*pU)Z8)YhiDc>cN>S6}>2i(Q|7UuaiE>JBO|#!v(z z8k7VCt$ItH8%#wq)C+^*M7Ab60kIK5rOmDZ$|=umx+mShZ~79fqN&#Gh(TMOL`>nb zemk^`Ljt3&E0iHL)xQb9Y-w5iWS%?e@`p8eU7B27Lq zr*!9oe_DSE3FrraT1`^bhP9%aEH`?nolO=%N;Y-E3=c94W$8JTgnKth+)fk0e9FHz z1c;L*X>qc66KE+SrxX@sIAgLs!MdS9b61v1-7#P}JKfgg)aejB?=;oQ(Jgv}HOCBV zqwgAJ#i5<^$%BXC;yJm<%eLx)(P7{1aI`OBc;ROq08s|Z$;sicel*6N;3;_zQNb## zhqESrII6L#E1i&P)rF|TQdw>K)v|%YVcFG~AcZCv^S+J%JPN%-r^aN25W27Q@%LAT zk^e?v*JSTq{bqQzzP&vl3n@2vA9`$|brdr-X<~HcbeXQ-7tmAzDGaZ9CrD;`!v8*Z zjzFA)!VgdOc`H!06SRU|^n=-pXJ2P?Me-( zmeAiseQ}MtUbLm#Jo`VFw;ZD3Ls;(o*>n(5AwWVky{t!|#UWt1dKcFQUuy;mAMV$= z`T1K@xT_QoeenZ*iFg+kh!i)_!u762&G#HGgwv^i!v z?HO41MUVe`bRo<*Ginh9XYmmm@?IR7&3b)3F1`ce$S98posCr zp?gcb$gAN^m-w0=QWl^{Y(7({U+SO$?`s<;D)Be$iP(ZY2TvIZ7kSOB+6J8#>6$VC z=?RYb{sNRmY(WH8%>u|9li43l`OTLncnQ6%ZCC66jTyN=?(!4_xl;JL17^s2n9uWB zZVeCV_Lu>v^c2C_8}QmwVZ{ZOof%I;q>=%YTN)x{si8ky6Z`-YTX|%nWGiQyKEPXV zhN{LwkO*35;X|B-!KWqNUsW(%YnwWU-#!QePSW&TJtl;$Zx-kYC~!??4A$c+nr9_2 z1mdZJ|M!8|o^1WU4^%dgC8V!TvDTfDbXxuT7nyaw2;c|T_#vEjPVe`A!V#=os9?1z z?D+s5X@DQptd_1qpnNTX&24MSq-oW~`Ye9JCC>23zqqO7irUVYWWOs$IeetF*V zhXf}eE=a6*99QsPNP%Ug4uag3CypHp%U*zvgvl#TRVC?oR!hRx zbgP-$V6ys&sjr7p2}@b#~y z@1kXcC?W6PYf$2}la032uXrWTzlQu|Q+P{^JVR9PE|~k^>OMQ?g>ZT1%Bcm?!^~oy zI>6>206-jWLHgr8sCfPxke$@uhiX-oJ+!a{R=RNl1I@Mgt>B1pg*eG9kl9p+W922M zYUW!A;yFO|aR2@QQBXW}+A36TNB4XXvkqbD}4~)*s>~df1=gmWVk9Jr_9t*p7;K&DE zZkV%lHv68s=$!;fBH7~?(<~@@NZq1g7=+0*A-`^WYZ5Q#_y&>=tO>3{)N8A(w-)GA z@AWTiXPyzUD|!cpm;*Nw6BA>^Coh(-cf}%lvw|U@Lu1ulQEmO9KmKEr2}S18^{ zDi9x}IGAnnITyscyM=;47)hmHJ44;;`fzQKYP@(cfykO(fB9GTk4U@rQY7=uF-xTk zS1%kKk`*dUW#8!rC_b|2x_1^1gqX$pTOcI&d3IRZKj=rMroGaP*X)KXd8St#WSMfP zE`aIhC$;OJU|^UGbAxp-4#nf?SX|`~WMaoL3#gRvF5MEDbDd#VSq=ndBRr?Mln=1=Wo3WFQH0=+H}kX za`Gc*)l%dv60skJn64qS3m86`dgau~)rI3uwcNlAN>SYOm2%k);jK%OGzM?pdGnfa zV;gL|c<25KeyR$9{Qx?asKCq$^yKR?IX=l~HkkGLG2(qM9 zDpu`5{mBMmft7`?pP!aQyy3lEhVG`2?f4S8UnK=`_OJblInHH0C(s`}Hj%QS&8dWG zK3ik-sVChlb5d`4dflcVt`Q7D#;KhnTqW<0qpT7Lm6nhvvOxBrn;C19cr!-CAOi+! zq%CF_+Pu5s{T3CSI$8w6;xXIfI=pJH@a&9X4r8C_>uo=l6`weLJ#DY1G!#5wKQ||y zJa%ko#cEJ7LGpbTAoYNYQ{ujsd+gY8`V*(q#9bHDRMNvT9+a0r`**mF(K;YR@dtFX z*kzF{-^S*C#`w1Ipoz!wLaLe-G8llpG|$+CjoE4o2b)OBvu87a8U<`stFyd@2J{Y^ zK$#Wu=pKiCFW0=JC)f>N9r~u)-JUhT;s@>hN_VQ;_=~{%-cnM~a&=DC5n=AvW#dK) zfA}eUR#(L;SurjsukTQ%rte0^{VV?UW2pU=CUDoBp_AGZRLT*~0fn~`s~4dV=uL^&925CSANe)up-E?@I+3VHVI2d?s-5`fNoHK54wRZcA%OeOJC zS{@sll-xrhr6agx$RKhc8_jtNi7w_}4fO$q8%|GMYy)Vgr3ifNV(Z=#Wa-{pDzohT zBw)1Il%bLHbRXgos(Blb>Y!EikhoI)PXaid5G0JDP+a3K)|OH(?Y}a~f|w$}LsJ_L zf&_`y?YQ5EGT+LpI|+D@E~C%Kq}o_wZIMuM(Cm63LXX@%)22&_guBT zSyFq3&n|z3)Qu)aLjT@zu1}!XfL1d*YjJSJWJku*1uTe4KU?4`GCe&o-TC`q<)yM# zs*|UVx+HSKJ)$qWG9m&x0+pd_b*a*1D5OB!=SYYFKcj&A=SvGLo^g4GkNcY5*7 z5oXcMwS!Q(nd>T-K}wPkI&rFlq{KW~Hi@Rt=#;L!7j3>&1oXb_UQE6Pg~h)%6NqsY+q2rBk>qTYzVl`2 zzP@|9dn5CyOG^XEjF!V3*Kk9C07n*}UYMHTp0qGrlL1wcNtTP40!ueaoREOyxAVw) zM;hoJQ%ETh0mcFp z=)`gRr9Dj`<_ciQhnMp1KBS@cBwLoC(qmhw9;<=M#_2?HIk0BMMM9` zAJL}$87TR@HAyHm?=CR%dAhsWvN1^LwYVyRjLH?>Y3TlZGn@86JR-JP!@ug}WYbg|9LH z^G+5(fQ0C~W!3<>DNE#+&4vZ}(f5oQ0x#@Y@Ag|p-cxh6f9Fk`rVmVDJhwA#DgWP6X(0Y1ZMgS(p-=t$1>t9~9LV;9FefB@ z5ZwY0D{N-p!q6ew$)vaQ>f_G9RP}bmv{l~;JVPQKn{gvYM3w2%4jbgPp^t9tDzJD- zI~Gb27ZY?%AlYfZ)BpRfRpn>TS2yU#s#B9a_P~C#8@%Y^hz(4+=^m|}G`5r9B z(?pMuOIB&`>@p^cJ0>V!IXhxjSi-NFC^)(&`J^aBC%JlUq(HQdcXJQuJ=YQ%#`2c)F(^>R2a?ijGH4R0*>rjq#8?9*J}Z7{D(x(g%);+&F>GPSLc@c)6W3;ps1U`@s0YrGYM^2 z!NKWPWrfG`$ng+OJRo_r`-7Rslb^#2e?BN53L!zK?Rr75kI;#a_yY8hy|(c`Qn*E6ZnB@gXPtErE~&}HHDtsF)7xzm5lckE zUeApXnz0D&9c_Z4y$(u!7UaP>botg@o44ik3t{4_f5X$cXW{eSgJe=A$>tHZ07T#~ zv9W!W-?8AM{dG3|44Ucl3zMBWSM=A7vdd6DmpLlg(UL&|ygzt;#6@xbH@|i2`<}bd zW|zX2S;A8c3L>b9+Wk`6_$=L05VsW|E8T`kQ3n+=Vt%yaMCrZGt6IX_M|o8p(1Yu4 z``VeEeSk`ks;=kJn*qs=6Zpctj^ebd1pAOokXpYBz|iCDvVclhq~vWHyue!a7s!G@ z%#n7-diy2`?05pE&B}4-wq}BnPG^iDtrXq^Hkv0vh;@H#0SIqkz;CRo{Hvv)_NPA! z&-d8|E)Ub*d-wY~Q~QJq>>1lI0>_ zRc@1{Jl0oNFP*Pa=C4rN?*{w&av`^%yWaNWJw}}j$}v{M5Y(1hL9qat z-aoxx0`=06@JVwQ+}H^q#t0$`8npkT)8X>k+HiwRrjKVQ)(qYM`*Fn5(tF=uV6Fy= z3RZ+jYH)JNt}4RgV~0x4#9i`fP68jI+kX2vFFzx}J+M*nUm>-w5Bg_yZEU!gtI)!n zzEfvtwoviXfAYRS?1D~S)-fdLfxaHE%I>pVrGKG+d}2<;FHEqLM46M1M;TZ)axgNa z$obl(sRi_yE8{~y`RpItMHhMuC``}{-g>fgzr8a#J7|8Q;>bWez8byUrai|AJfbna z0_)!fIAnPHek9>#_|a6^FBej_p4JA`^NHGu+&Q={mNodoDZO{|c59`lY{b{_25I8I zb9z>7MeXwonpKq$SOVS#iTUYxLDQ2Z`;Y5t;fDN^wW|9BoYp)U0*zCt zwHFu#42JnO3r36f3UH;?GDWPE(7=b`lHv41pWgQm+8fI7`!t_S|d)EU$F{zN~nk&%sF%?uVNjO5J?hA<;4&I2$;x| zMibkBF~{vMIQ8qKL^?H!5=)ug<5yz8m;A+?MMzbghU&-FSY>_JsnIAs8w`prH@o_j zwdsK3w8LNtsi1=)XWHSFn@6RV)ZxrjCD+ajBzQv}4*_ipKL%uxLNTBPA^7VWS@LRd-!FRz!^+?G0N zHQ+b`_XVpV9F(I$rzah50tk&(5)6PTg=qVOnnNo9Z%!~DKL>W1Mosa$&~aA!a)9DG z12}0M#u(uu0BC2bBgf$R^OE8iGXTgxKf#g78NtN?6)o#n>PVfksLMnsw5@P}-~^%* zJqQhd)hSlVbm5EO(pG~Y-#S(*ImU@pu~v>W2|zFlP!sn7HL3!7P;Xe8ECr{b)Y(-y zw}U_e@gQG+-}L(cP18vagAOvu&*UY7U-<#x8ONa!S#Ti?uQODFLc0p!B2+UqZU7}= z!6{&8Bi4CBa!|+A?ilSi=2}bG`5Mg4?663n;IW zmm8bzy`rad>Y?yI`0fjskVbClR^9*!$5~gX1ZF&VU$VY3nY=>k`qnNqid!mP8Ykv! za4h2WcM#qt99$CQTAePWjdqsRY z7=l*xU#*bIs#!4t{12~#UDppEh->TSmq23zYup(B9ulQ#DC4HbGlAwgND!o(gv=uH z(1fLJaPLBj=W14q^D2js8k@#h*TmaG>%~P!3yf~#QV+GV&z)?ZDwJI zi4PZ0TerbbN`XvGT;EM>t@P^W-)<-+=zH;k`L!gP*jC{o7Q`s>eUQ%@@tHtmsxvz) z&A=G|>I)q4+Q2?^H0@Ua)U|`fU0OZFq*M2=rqB^u$&)@*0eT3429vvcFMs{D@Y<=U*3I#5-bu*Rs z7aGW$tE|e0ePmmLn3`h*Fu^R=1U+;GIUCdhu5SJQJ-1lU@AIwtYB6V0i_cL!QEblh zq0m3$fd;i92!JL7)h)w6+MaIaH-Fx&zhaY7Wa=O>tN$*bqGrR!XM(0@0bl@N{SKXJ z(65K%I+c>HG1FbB4<>AdjHO+hswDW!0Lw{%5#K08KZ3(=J}LG_HJM2e z+Q)lAu0T)J{sP$|CI)DQSeYitsgB}UK<>RX{zI{3O+dH6(wD_+$P7`;0YzFTa|H+k zFcM+qbm*(m{Gf18M0eb(mI;&-_~)W52E>T5xbk#p$+W?4H4~5M7?-cMV9om$*-$a! z>U6Wrso6DVQz^YXZR@5U1 zJRWp8LfI*bnS*&{%rnhwG9Qw5dt$UJ=r2jtf#u4CUhh3I!%PCtjCAR0f(kn`x zNNwlhO1gUTz((tS{XT7rMznq0k;m2`#KkP?LS7=VC9PlR(?!F~uxa_x7M51sZF!_ca#jP}% z5NoaV_P-H?9Kz#plBJt{Wbgb&HH>2zD=AX_kl&)ED{$Yl0ZHij;VKs*Yuu@E4F(W% zmEb@Z6Q_@8ZYoD#O;*-1nuU_t)b@k{hu?d16)zx<Z9SbNaQN``Lsq{G|q ze*qYzEnM-i5>yyfF~F7wUCj3-j^@}0)q4>MwNE#tm6@kw`3%TI^0<_uFdZm_BMmYL z`qLFiTA&ku>$x_X1$+oVA%HN(tsUp7&{r`F9Rg)&*IIR5M1AX+3IwG0`eul$npLsA z3@~U|9o(Q@p9Ed|%>7cReAmn8&)OJocY~Z9zFoEazFC&(9l0i$Mwn_WEDG#z2bnbbeKFrRNv0jFI4{J&kZT44`*CF%ipFkz5~%Rjk}q;!r2}$IQfQMEd7_h{RxwDxb3L@SS|5 ze^6|{{efBpiv9qbN)g3dq~GvaM@0ECn5BC-DDQff|KCF1=i;zv4_kr%T}}jF%@l|0B5em)@Oo~I%7S6U|GCo9yrb} zKLd3n)1_6gx#Gt(>TE97<8~Yfky@pG$eN%oIrXz;q@F9;vHr}C=AXp6sTYX8s6*6q zBm`;bGD1ZiRSL3EU4<6dzH+xTH}XEqEk!%H6$lp}>0H9M?2N+`pT zZl4zX-L7}v^4$9bPzll6V+BA31pA5fv6fxJ@(t_spFe+|Yd#J2(*{Zi@Hp0Q0&W;B zvI2e?wKAe<+U`$d{;mYO7{Nszf_sj-x0uAUE99}7nDn|}-@OzD*t zsgKEgYmAdfeek|A|4bBzvX;IFpBxwx+{;mf#ud=vGr?F5tDdkWxC><0ya@8VM;-tS z&1$^>kQ~#E12gVEe4c$iAZ7}s6g=BeZG%3+x$Qn zw(Kgq&FZm{j=~Jy^acH1UUJoLqS8#P1V+$tYW10@WXp~43)}BPq}F=O_mqHxt_1me zo>u-q(+TwfIi5Tn3WR4^*QFG-UF@)vK=?(3F7Xsh9)6D$$Fr@?q?dEx)Xit5Sn$aJ zBL2x2&F7R4iy4E)8-oAEMsgG1tFy*l=>dT5@~6;`>3aIIjMQF=+DFAn1^KP(OQXPh5 zCVmb894RO!aFJu2YR2Lk%%dwe7O|0+*R*#qt@bS=9N-Xp7R)(BH#b@q!6Fs!)GHdh zf*@~6fOWYax_LbtDmG9n!$RwMs!3{mdQ@F6Pixd>A*^z_yQd$~CFa422!Q7!s(oeL ztPWu{j|V%f746I%h{YpO*HTb9W_cHdt5%v4|82)XWrB{5huj}+p%>>xXqJcWTq01q z(3+Z9H56)Nav!8pVy!}u|1eT|PYa;8-l|qr@8k~bjH{+zv69dkn(D_Dg08JzoYl|> z$K-(_2-pi7I1ME*4vLPB+q znInAC>8#htSKihNUG0$UMhUaU6G%8oIv$5q6DQ*e`+wbHm^~Rlj6D*^bnGG3?fy-g zh*6PVm)HK^=&JVb@#wh~yzyU3s z3R<*+SYg-?1a+|>M~no0K2s)RySTje+%hYx23=)vpvwdtQ&Wn^5O^xDFGs6TjSHsr zD)n?@A9g@6vg3wY8zW+0(BPD9W)<=#61YHS8$~%s{O7GXluPop@RpAV6;`Drxqs@A zoE~O7-n_KZT(#67ImIRCvD0od$O7!m--rRW|Lb5?54VwAlp1J(h+iFxfocPN_T}M-;yR zkN23cRez#8B0a{5@+uUZAB*3R-h+5nCasBKhBVJ)L%OKW4h!ok`cBv0@TWJkl9 ziwQ2`x*n(t;WZ%%4+&c})3^*!uAR(I2S?5f<XDsRHQGIvxxBpQrmvU8MjO%tuIXPbmrPioaIMglIzoS0jz+PzoE z61!6j^?pz587XTRLvwqpyIfsrV*?x9r73a&JnumHlQ0Q}S9T<~(QnbxV2r1_bm4IM zeU8}+d*5@A!o|<>aoD%+vd}Gc_;!DLrqfEjrS#fa=TtkR`V83aw94JGl1UJO0c8Ft znMB}f5DB{T9x=)!ssXnf%zvbap1}FZF`NETp&PT5`~}uNvuHk{(4f}HC37Su#s2nH z#2BC$r44OxfNF%k3_C9iB237h;0W9?`EDqf;612EN_XXcck4yGkW!s_J;>zK*cI7u z&*q5-)y#|rWA~=1KVFhv5?YGwYY&kXn<$1hHlcvM2~BiG??0TQJ9>qUZ}Y~CwXRrd zDf;f+54AN8$&ME7UHOh6eNAERH!R+=-H0WkPGROaq;FUG4t;u}eV>8H1~)A1wp>Ks zXnkMHJ?p!h;mG~JY|#w4CY|zcugg>9!Z)^lsKrZ~nT1_Mb$RyT)b(Synml^dZ<@+s z$R#p+_3eEvaK&0OtVSE+lM604&CeYEe7Id7%ana|!?bs|t>|=$=gz)>A9}oT1|@$E z>AZgO4sf}CZg^>p-*vsVWcrB=3grS^So1c1-8xj*p@kU_5jXQ8tlP}wDV39-juth~ z7oTZfC^$A87%ciw15W~__N3bq~% zu187_-V=jlw}^-cqt$u0&F!a7WeEW;$^1i5;68h3Rra?ZU&{o|a$%||yNXG0tC}Qu zJ`X-~^=_7yATDrxblhTa$S7u^^Hdk$_0Lb%>W^i7_;8o9F@3@F&;6Ax$9=@QTFfT{ z_+IktQthx5tgOA;<~!`iY!Q=D0KE8yI59`CqymE@dwVvPrTV|V25%ASY$V`X$ zN_(?G9c8bYi@^E{$wD^%00#$$+}$gRC$WbUnoPYH3&( zL`^wPlA16O?>W{moLg>|xyEUbY-Hr-^^ITGnM4%G-W;e7QPI=0eip=R|L86`DJ6xI zo0~i7j3c`}#oEX)Q}xarzqV{$xV)oQsde1s>7n}$ru}`nI)mTMk^}K$l`mihj|53&??d(b= zaIQ_U2#@7&wyiyrY!D)OQyHY;=TMt>!}4wFu9k1DP)p1=Zab<8O@(~cNbO4cY$jtZ z``LV=ga1K5P9kf-ev9O!q+6C~7@T^Zat%r!{e2*Fucey;y^Rgq1M{7QMl^BUR< zWL1>S%+lG~K=<;?7fnK1%$uHDFoNG28t~`!2`Q5|a1D)(YO(pGb!A7(5)J$?PC9jAZ*N>|jm<>S7iKLReEVQsOsHx*tn zHku|D_F>B;=0mqimfEI|y4-u+Yu!Ha(xm=T;WUXN6?)!7l*+{{Vi>y4d}6)X$ke5z z@NS^#IlcaZ^uM~9h!%Zinztydu6@OB8(xZ>Qk8G73Ys*kLpwqpUyJbsrS=pKLx4s} z4(JsZyQXNkY0WoSZzZK@wLd#G!!IuTt-fC9i;}XEbXv`2qT+EAz4$ee?4wOo;4lfy z|B%kNY3`Sqw(hRb?T5OMUxLHCeu1S^8`+1Mgcu*=MOfCZhlORL#SgZDp7Qdb%r$ibBj~(s0vx-H@;XPB);JAj?Qq{D^hB5w zJwlKr+`$^;a*~UavjzNL-t7VPWvG^Nig9UMJ4b^>HW7&7&^FYS_B+%T`qAg9XxGxX zz9(@B+$Z$CVy7uvVaGV6DuK*tMK~(81>(vcdQhZp3lh>xB`8R+xBC0LSuW;>sBW~k zzPlhBP%^rXJ<{<{VdaDIH;KOTkrtyOtbg9IvEsK2`|QH|1(Z`xha{8Qvao)K7~HGMzx5cU zXxt0L*Rq%Dw4pp4d~I4?;>6odFBxQYoz*nKYs{C0uzIB@{-qe!=Sl4~XIjWmsKz!d ze8vBD7~PKuQhTv@s#I=QTp7Ug@$tZFF$as0$kt=QO%I&39lXxf^_wjTwN*jP*R-Pa zCHv-*qB4NYh4t!p3>kA@Q?0^-S*Vt}zJ0kLGbS+JeaKe8;-rVnOSUpQyQO8)Q7QF4 z7RN>gIa%vt_m9Ljq{!FCDTR*zk@ zv#*xFv?1{0*3H2Bo(VN2bJDHv8MO^^TTC-k^-G>p92bFOCTWh13K*c-{hP zzthGFq!=V)$*vLPeUdC9U2E==5^Js3+*XPM{Q7TEz^Rj?vAELSziBG#VXAS=AWpQxWa-(A zN6kl4#EDuVg#mr&VmmI*habuTVu3kOn^P>X3T!Vx(YSd0jV{(BEar8{#`n6MvD2Lg zsJRr)7+wvtNwXAQeJmbaX7A z5yxCcOesISSlX^NNzN7S$6+YeC0ivH%WbhZv#p*4yxrQdhBpg|Fgy5kF%7Dslb?^b z0y_Ea1^Mbr0s_Pn^^J|$)SJk9r%T&y%d@oq2D^1g0vF6x?}6rLr`|>ByQ124Fg}Zm zi%+#G!L_G%J|q_C=-Vc*e<(i!od(8hvyY98js3JT&V%`N9OJc>V^;lJ{_Jb_r7mj} zB`t1K$&;`qKEJhR=5u*Cy1iZDk}e)!lHley;oRumX4f^n(jy&JogyDRrIdo3>%wwj;PvQ4rW{L<9s>dKXa<>C(G` zNC`zsq!TM3irDB~dItfiAu0mWYY4sf-a=?e-dW&%KkxH?KfW9X#)Go5)>Y=3Ip>^n zSVfe81Dv+CkLkm=xqAACBDVd1KfAj#LWgBA0j`xhuF7{)!Qof;H&f^2c_v=fVus*$EWf8|HRisXq;aO+7U|Tl7n`fcxdvphRO1*E zwUo@BLf_A{G#aJ(t^w!Tvs6fB^Dm93dnI$&Lt564pSz~(MSG0}z=nlm06R|C_QZG# z*R|83TZ*n0^jAzdrvX9QC$wj-1CG7tDV;X>TCL#G+`9|L{}lj23f29JYqqJnses(loOa>os8 zOdc6G2r_CoX=!C;B|fx1;yfAWn*yp9cU4q^2_x#-Prh|z)HH)$XoA}c!@3l-7GCkS z;m2;L*%eXr68XnBs04o z%(c9ytlCDT9g!=2<;5y^e5BeW$-oZVKoqZ(xquU4eIf1Y zNA=0vTrD$sGR5IO(O2WsnNT>8D(U{@?%`^7`Sgs8%e=aarEF&q=>=Agn|wNh)&3q{ zN@Fy)tgX`k6VHGyT3S`GW5FpfrD1W_y;CdzX)`FDJD$t-;tN=ZF>A95AsqlB=N8crx2WZYzXCf|ZZFmtP+}dh|x4)YcpR0{fVykiW%2h&Wox zeH~jaEw#{Bg2v~V1z!Di?OKO*f7u53`5=zmbfuT!_tNhc*oi_(ohRkbXSKJt4=&G% z)cpNJ%zaW#!=^i*_D18@bb2;wwn&j%CaY+fv8|2EAyL>RI#SQcOKLP`fv#gYcrS#Hq!C% z@pT+(lWE`5NIEyHpzvCJD??ykzuCG1XLz^@BC@ifmGtbd={8Wc0d0kspDV2QA6(TT z%~!qtys`0@`y5e3uGYZVI4e2Et>YAKa9bVvnbicxTx6JoWQO zhhZ-08{Xat;xlfs8`B|9(ZD*`yVWjER@7vRJibVpgF~;7ymCf4VmTT_idMi&SjEjL1Pv`LG__ zB4*T&5BIl3J_H99ql*51U-HfJ3n@!d|4@Mtru^6~2t&d>@oH$>mS3%9mgiya%{Dzn zA&^tn_}wVBb(!Ph!T#^PWo`mAtaj0-T&QH)G%z%So~@*WK zPazup0tYghVEKDcHfjAGvqXXChJWme@B#4r+?NUpiL1x5^}9c>|3rNfoQPOZUdnGj zWh6eo4@+!qb06!fCVt0JQ+w=7v|ak$U$9V{q}-_u48+M7E>oTHf$tk031l?X@i$|s zZiW$scG+lVEhpDZOTk`#dHnWMnYmVap|NQ*=eEUuN3k0o4MpdL`vl7h`*H4Wqm3uWW3ZJq$5@U?2R0(w&>UXbK(8_p?ePtA zI#zx`!9iBrFL?^gs^2|b0huHV_i3vY!Lpew>|HoDg|aeLn@SrVwIxC*?H3dhf-(<=-9LBk@6S$~_42%BHL?9;`H$T5fB^A9T6BHiK__&-+?%ywY?$z3+WeO}OGy`MB=?<7}i6vM0c?S@GIlfXv}8{MsC0u~J|3?^O{{uKy~!P!`i%4ZmoB%<1xlxu>8red{YHqz%urun zzfN8q`;qMUtI9|E0d2sGwg&{Q3U|x#fa5?!^C8J;Kh!rNd z!}kk&f_g8MT$B|*e?p4V8Sf|_Fwopfsb&@5>Q&cY-1@0Mw&af8QL!3PE({GH-(+c* z*D-e3*y{xQf?Vd*r0wYFSU?i7`gp1xHbn|lQ2J*sqig!HdPula(3lGiPNGDnZ$J$Z zet~S9E%YgX>61#7#LSmB{8uYYpi4rZ!$co9A77SMG%IFXVT7-weYIdbidtfHRY>Wf zHyA=Z7HBW>`6_#mAbn4}s)KhqtMabddPE`8wp)V3o}>$n>d+lwKd4VvyHQ!K;9G#; z&g-f2&!0~PlrL__IxW~k`;6%UTnuD$?fm!+%FDt}(-8c%P=a&uss)y*#6Yi+@l5xX zzSN|3^AWygH;aJ7mvl&3MysP0q^W+YhvAIywwIy9cr-SAz19HW5~dTO>;<(;)mx5^ z_%!pyfGCzgd9d99|(UNpX{N_ASfSVEoMyE(z-C5W10)z7iY*53XQ&#U(;2_+${ ztO?eOvAsC#_HoPf1ksR~x7QzU66ex?yf|b9jXJ#-vZoHWcb81eV`d7ASMnj!l-mXp zPzNZ`qZ@>Drs@S$bnf~WpX33^O*w`VhtLx$63QWfZLxQnz?ZO--pUG=tH4IEPcfvqN~iP_k9^6zdtIOK}YpkHg+jVdehQps$4*YHBO)@V?$RzusZ&pjK)bGO5}@Nh}_y* zI<)U9D{FzU*?wb&#uDHsTrQ0=xrZ#3r_+xGdEtF}Ux4f0THVr)QxZ$RMwIFA@B0uO zoJ6l8ssbVi!hJ5SuQ@OA@$pUeYDGQXc1XHirpzQ_5G)gJOEpU#rIZEbZ#+9OTcU9l2n_doZIh@UN@hz#xF9dGBO@)ShsS;#2uuGeDjAGXLj!sTA zBwOkTZ6BJ1Et%-wLSO}`-_eGd;^w~G8k}i>P#ZPM%e`n@ji}{v;8>{qE_hYJ!C;cm z+bc<4c%6LQ0TAIp>F_w@D+wfj^5kg~6O&VWjk1iw!u0dp0|suNpK3C>>uS-;G!31R zGiOr3CrJ!>+Xe){`NAd3+0bUD8}T&_)FN5XIln4YuN)?B1gNx5GE@yh4^XHTshxX* zBF*>dL)!W1(YFoVVBbroSVbo1J?2Gz<$cY2^<6AVMT**+2mNdvdG*VFJs$Wr*MqK( za+!f&(P?7ogKBbvVpGG~ni@Q!3=0@1PVCSLNlmK9c8hpQzfEh;f;D{k@KS?xl$!fo z`pzwuJnkrPA8S3>mXEO0_7r@8_8JTqrBVJ`oE=sn4HxGyhvoE&by%`hPn2eMBa+M4 z|FQgata)t?6KcAjR_wxP85rqWd-neKY%gv!VsX%8HOw@uRDidSy}N9^yC=N#e%#lu zB)n^1i~R8pWr9(h!F-v_B-Wc^TYjzMT(Y6_T(1H{;JMSzDpO59&kgL$^j&&MIc${i zQVn!x+@U)4ijz?d;YmC~9C~8K&?#9tqHww>PX3@#T~$L>{9uXmHPx)W&p(`<`Lc8Z zJrB*`bhe(%<=bvOk@IZ-?R1)f!Jr}S`|50q9IFz>B*gehF=gG%cgj1PkPZ-k?e8lh zTMOAHxN`TcOaiZMGp#R^eUS<*iB=<0?}UrEp0@TkZ?dgjrXvz3L09N6CFmK($IQej zH~Y4v02S$t3tp5B1|QcH@HXRBqQs|aI9b|=BE1)~38)ebuycXbqZlCe@#EjbX&!!V ziHYwiSXkDk1nU#Bl|0c$>N4*_+|@d z(mI}=@2Hij>8o-tcdN+{a>sM$B%VwY+$e#Xy$C2lVWWIKoqi+DtjiyVS??BS5)0@iiqQG?P|9>k(12Z}0Z~)Ds`s4B^^$=l7;?KVik&CAZjOv zN{8NNRYg&5$-;2`qboT4R|=@0g^bH?zfVj1W~;vyAX4xTi4wkku5Rv0DQ{nVc}~xq z_{Pfz?o(mZ=}~&0SCRIWX~%8*O(mC~T*pbXG4D6P|1}Y1?(em{5pu}TWqt5j5ETb- z>s)Owb2|l2JzN77yS(inP*?P1;p|rl+9@eC`WT3Y+&gPenPcg;}>IY{tuS=i3uh z2u2~F%kfxJZ=y8TgLM(|V?8q+26nAY zGTzBYM)-sJ8f64_+{6~nMtkZTwV(d&~i(eM+{q-Wyhxj*j_059iK7cBQ4v2&Q@3%h}j572Ccw(pB@nuZZtcWlSPhz6EPiVv1gu}^}VA7fd zC6fyxSW}Swi@Y6qhH^0Fb5Y>g%V0zC?j#i=mYJsv5L+1NqAl7hA}g zd2V_ArPDLuqUmr`mSA}0VLO3z-E6A3rqd^^M=^@6Nw2I(g6pbZc8o{e=mIaq>RtxeEoXO4O@k2{PnBI+UCHDtE6LT9nDqW3ce7Ybu-H^92Wne_PI4R_F@eb zL-^Xj5B&V;6AxHOP{S>NH3rS;p;=wjKG%o0!A5cOi%^>ZSZudWTcym@)z(7FXw+GJ z^zqAunZWLLZ30>k9Vx!2U3;y(_fAN&Wl>#SP#BT4()ZQM-|$Q%KvCB(BqS%^bf)Sl z7NXjs_sPwE_O@-$Omv&}j$Q8;-Lr?df1&HJh_UjSoSqvo>uP zB;Ex)1#-t1DlboAx%x`#?s(JFN6N)c8FrKn0G<4KsX>vm^kj_E(v3=XmyGa#y=g-B{~W3K_;4=QnG@ z_IK0Pvoc~wPf}p4oqnGX%&Y%$ z&MCfaDnqNn$hJdXLqI>jW5=NnI7h#ez_b$_j{D&;-LfSYe)}F1ieRrP`yh@@IMyU4 zXI5fyaPP-{pF! zTroDDEV5C0MUOwg`DE+I>^6GRnous4E%)*?^qY99wpgz2(#xV6P`Gzbit4{)?1^Nf zWml|^uD3%N2YP7%iV3F=_2)4K-cc4$I7v%mToeI(Fi7obWT-AgKj=zVo(aCIsN7N> zi3{YY(Jhpn?tWU>~wg#ohKXnz(2~dd#db&`h+WVYdY{RKW^|l1KZ`VPOkHN_Yid)!q7Bh zVq0rd^=8F55RV`z(D zYH#xH5r&wVRXR2Rg6}chBl67BcjD!vnD3GI&{;WQwv;j3OTKKvql*>zG_9G#S}&_E z@$e`PU`SDH!O_uK@xCVl)NX-Qh8K-aMq5)${+Ln(EUTyJP`^XE_h;5*lycW>e-i3j zvTT`nb@TJ@(nz#pQ6c-Yq)2Zy#vH|o-3c|zu9CI`Y zpWkTf9^yQoj^fANd?F!Lwr9F9P-e6Fl*G)e)4ys*81qygHNH=-Z82qU6qQrqH2Jbq z7`jK7x5J9kbvw0ZW&+8v{3E*knKtM8qj7+C&xR1jy!Vh6I#euRf1zh>S#thB9b}lZpj__QV%5vf|!0uxeOqMiBHtGjXn;=@SHh( z2oU)unXPuZyq>v|?XPd#SmmMyrI_~6`LCZXx69(O3#@*8-qzjvqv3YxUwhP46ZO`e zKIzKX`|?I4rdqX4_R;L9>fX+l9+LEHMS<8>4uamNd7g(FN2J+0rI;Yq3Ea~bex1}EA7nQkjIxaUHcuYy1MY-|pJId2=6pYYK zB)etj_tNhq-I~?9Xg!ZS4PTe26%rOM(+Jugi+jf2s(cP}5kr2M|rzBm_GgrkojpdQ%^jhr*al-`J2nYObOa60{ zMFz*Kh0ZU=pFgo;Z@ZDcf6x6<%+apU!B#A^^>+xz zQSS|pPw>Duat;Q#UiY(k62Uc2d_^iu_M|N9kcIg6JpBPuOP@dFcF;lZ_)qVor+@Ek zN=^|Sfk&REeh!k?cCL55&yVCJ$-9g3A4M)@YRIQiKgUNq6Ad;`8$v9KFoM(OUXADf z9B}(ldz@8UQhGvd?%Mgl<2#p76B#zOMCz-ruZyx9?NJ-xxNsrVw34IpL0?`E6tDmTC8mik(bZ=hAy*`JY`Krj@QpsTS&`*qf{`H@-<(aEHqLM>5*;(km zj9yfJnAdf@x^jGM%op8cD6{eD)2E6O&OPleAQlBAtM_$df6M*RLim?G_%AAlyb)#S}VT( zSA*la+@Srx#t!Fp#{`D=%;VBN;x&vmc)&qvXE4ro!C*AgIj^-nE_9pumNQrA_D0O5`oxgc=C1L9U$#8FEj%35w!^|e zT{#K1Cve^A4wU>&|9&-T`oWG!4FyANX;ISbfpvjW8(xpBv3bDlg?|`z`#L z{c!PCin|c$nKt~rnPEA#B2bb-;OvsCp?oc%)1?9N$^+$o(c6gxWCR5JWk z#@C_BZhTdKN1Er~^UB9`WA)mc(Q~~mbUj~fq2+OHzGwEpnahHe2Wccbmk}|Q-52BE zIQpgDv6DNs_%tW!m-Y#Iba2ANs83I_A4F9o@%nTY%22-KPQ;+PSYXgMrwDF7q2Qvt zuQ-uwgGhGlyq@}8;;S-Yj~3a7c7e3*8)}y*tl^{1YG> zS=Y3bZ@$YhbcVMx)&t)HRG7WX*tB&u6R1)vUwY@4V^{bLzbdiTuh-K#iJoV~w7im? z*hya_*GLHjh9r71?!|G|uC4+me;}EJn^xNG63WEk?TwM7`{!^GWszUn8I8?ms;ZxR z=1zzX0BX8AN#9gAvvO`YzERqUxu@`0sy1>(;!Xsv=LT7B^68<$w;AHma zolT_s^tR-8)7P($Y);5zeW-Y_?b~a=!Z7`Ai=~5A!UfMANSMJV=i%C=ApcOw!Qr!o zIKd3>BFE{G6c^RL$9Pu_NwdC#MlLH+?(>Nv`Qm0# zk}TO%;bq&NUc|n@&FVSQ^q5G$ka7zOylV=%iD}F^Tt4}~vm5KaGrNECl6#^guZKpu z_NoPW)DnO4*q?hB#7lBTQYu35b((=G9pHOzE-rNlf4jCE^Ld=-!Zv!@6$iyJ8=Nd1N2*zPfxEr9nKWfpLi9;@ zCe4Yo{OOVme@nLyL%(#_YDc8vFK~!7PcqS`7j^2&)t|Y!zmL*-Ps4eIs58C2(%23u zi)51tJ~e>1@x}|zqRwhD(c+ZQc;|X``QKy1*}K>bT=RO$w$SjdHPwzSJ(Mz>D!)K$ zF#j#n!0KmZywK2aOE=ac8~o9%46iMq^Ze^u5qDAfV|&^yC-i)$EWnY6RCbbJ$g@4w zUm^JE+}lk;-jE05%m%}v0os)R8vR%6<$C;&n>!Zxja2J@tqk0V(IWh<_WTFJ%$w^% za52j}JI4ibU3fKL5}g&UEO{&QFL5KG)iG&@iYvIYTXuh8kENh#)Oe~Z$9be=^(kG; zj=9|ZS!|2no2w$jr*}-~|K~?88)1Grf9`qYt@D3ZCU6drq9z2+3^gq{J&}DfJ978z z@Y#9$^SQ*^fT`ORZ?MW{2fBn|ZtDMR$%h{uKDlEk|L5k6##uj{aoRz!Z@{_r=Lc}B zx7qs#TJm>~1Hb?E%$C1)p5o~hSY`kH{p;~3Sw{pbchAz4|L6C`8)W|7U72y$s3nL9 z+Mn0W)X2#5NajXv7Vxak;o^}%ZPu97U!?z;a}dZuW|hI~Sz zT_BKJ!TP%qZP1X>j*fV%1+eIY=Vd zea5Z-_2iW%?8XYaN9bXe-BkAOUof7=1-Q;HAJ&8e|EbUO|9iXxj_#g7*8gkrHHXdW z16&jB><@6m9bT7{{okKMy(#$)k(s)__`e1$WgYd4XK3ePUV<(A^FZ(x;6L!%^^Y-j z{eM1)EI1q#yt|YJ#o+XYrK$@llI4|S#{r$lN=QgJtks^gxc!CgcSD0fC6GM-<2PDn zz^;YgPv4o=%fxC{3Fr3a2R^zWze^;B@%F4L*_ z8u29?%{$tg*H5g#bj=hhAWKV>4ml;%*}>`g+Vwf|^Vz9;d%j--Mgk;b0-VnU0|igp z-Q7K*ZuhDIYVcH)mFE3y6R(}bjt95`2ehpfdA6tbktEGO*7Zh3N=_IP#;I$2{&@&O zQ$RM?3=qfU^I>O~?}V6zwYJ`C*!29y$BcRPPGV^EPROp|ru*oMt8R0LU<^Kpao{@F+?${P1qE4X(G3gaf^bB7 zC9eHEz4!Vc)EUGFT6q3Fb?q`-R%mL@g|}wRS-ik>!&K36*G9bjxp1@W+V1gs9$8*D zdns)I5KPq`A3J^OcFw;$ABn6+hTX}^p@TL4)UOA_7=6L5%(#K8B0c>yqKxbedd5^cWQU_l~^|1eXIo ztpj@RU~;lGa6 z1?66p3oCVjF1&YCk`)`m6VnX}?ZknO0vUU2y}pm5ORkz~iN*M#93FU7XIr322VXWy z0znK*$bbd~2g9kYz%C!1{*GDvK$#01NWr`&P$JpE0~H@owdg2%9;kWRK;(wn9ed(r zi`3vm?l(tArvm4id$yfL3XnjDe06Zel%~FQT6dv+G9-ikS}lS=aCB`&xvRHKQX`{x zMBOe+tQ3Sr6*6FRP3lgR_>&BDBS5Qg zdz)Q#+q$Tgq6<_EbvyGIaly*ixEy+7B>)}WdZ8c7&BLQ%W0L_5L*nN9N@oW5l7m8j zJ520M+MvAyAFw&`m?nhno`U!?PyIxjcV}vHvEtw*vDf3TeUf18G?Kky0ot`9h6@Q9 z_vD%#LiW3npj`%d?`c>*5fN4S^J1DvB){HH8o&d`i^Z`4@+)nzZ1QOtvkPW?`h|9h zCKyUwhnRMTZYt1_b>%hgh;q4Ea^R+k{j@l!!?`BO`_*RWYPd9MgUWp5iUkTizQfKypsd z_+2AiJec1k&U^of%%yM^sgju)ehUKk!1iCb8Enl0BE79;>`mF5z0jEp&8#I=LkvAz z_D1wYdw73|_Mp7d$E#~j@a~EV+h}-Xp+}@ z4BaI0tjqv_w>HPg&$PbbZ_TY{p#_QZ0kBp~MOGTH)yON~B%HgaET-ZEAGLSB4=9l@U5ItxjTC3Axo#Dg5Q@*Cw$Q=0L~*8ui}@w#;+221U~DiIko*g zjlf(zRCIC{Zt3D&KUQLp2rQu%w|KsG(40xbKKi+?sGQ4>+t!D+WXD}`X^8B8(cEKE z=b={Bv+jL6%-op2eXENer9Uk1S1MYcy7y z4D3&oP%7VqTw*uNWE0*_paG&OZ0 zoh^dug9v4ytPhl>_(~p@AsmzDz&IF5UP43RcAKDjhF)IMbXQ(-cv3P{ETtAD=vt+w z;>VXZJWCdy`GR(xy^e=6VwU4QT!0UkQq~&}tP>P|8eiMQf5oU2sssXSnc$8!?%Qm_qyjA(co4}~bnLME zu~oBANFmfGjsfIE*2L}g6 ziSZi&EMCvx{_INnXNc2~NpGb}Et_cUH&ju1$KpCkU4<<1Rv&76U6Cfh_2VjKO9MSZ zLqLeqDVxcfVLqG+X4QteBjI1Z{2LJSIB_5;2iEtb&rBBH?_@If)t2p&#@gCeAn-K5 z;m6){Qn)r6$U@CZ! z0ZbD53;|5(d`99Cs72RR;L8z#5j?ZS>Mhu-qdne%CiJD$d>UwptvJY%Z5*t!T4nMDsYj**eDoUsgzQxS27m? zX#dVN=JdyNA(cA=gPf6T7g9$J8G}jKtZpdWwEZbDQ!n7W@v;sy$7F!R*G7&gv;hSY zne;%JXsgme;UyA zglsx<#kUvPN>;ztDF>i|UDE;pe|xH#d|NlYs;Dt|7R`{+V zr5k+;|M&%{p880Y%7lq1xU0oMq%k0O6Gi&lnW-fWIaMZkA*&WE=32SASB1(uP}j_- zflyOi2avDBRIx=&M{07U;Yha%v&3{*ax|i9f~Yi|osSTh;F+tf7gTmuQdUs6zU$AW z1MVQ#xU=YUZ^Iw!V}ya#QH`e1VR>eBLbS(tsx?(9L57t8EbF!|i>Op6#k!4%NR?&h zsAl!7`uy|VC=Y)hT|x30{9w7t{Z-@uJ~rz(z|e>6xxw$mX7~Cb{jP5FUZ*d+Y>tO zm|yo$Y~9jGK4({5^~(|{P$)xzrB@*UNaG$5NU_o-RB5M*?q{OFC0l8yw;tg0Y^$DM zC)kQl#!Aa(dW|$Fbmy8Svvq)pN19AQXMhWXp1$WDb0}Mr6-n#)R;-p42Ul|QPG1vn zi7*90fi;g+d$bCxLpU&q&HUy%b2UJ2BOQGr9rCQaCgnfrP~Cz?K>Zhvl?2~@BGN0E ztNdZj*Z0%uiVI~DdIp7z)Z^gDWJ0q3;$Raegg)+TUCE=)jJ_{$#Baq8yP~3ko;$G4 zQ!NB_Xn(B+aoK%tWAa*OJT1ZfZ$mAFg?6e(FL48fLHbDwIVNz;+ut=(?#LdvFIsi) zqly&qRAO?nPU%H(;A1wz9zGesx*X~i)QnU3bWw;Uo6#SHPA0!Nm_64=stdqB?m30q z%96l;z4ay*CBE|ZBvQn3{3@^_prnu|RuUS+?lnS)O&c$l#EI>nXjpH(8fUkt;DsAupSkhG3lSPy}~|3z&V)<7f*os?Tl zN`}I%^RIVPJdD1sArM#YV#5cX?O4LY=v_-_Qt?jeHcZIl<{1f>>4*NO=UhfJWkQUv zH9C9Fz731v<`gOH*iuQoMx*+%iaFM5u5P(!vdmj0xKFCm3NUd;xO`>U znTU^nuuxEh?nKnVPn|)`II`D*! zSq=aX2#*{Ko)DY}#Gco_qpXatBBGA7@=H=})QY<`!pr}q)e>##(6((Wv47EE!dDQLY5 z3%U@~q%#tZ@a$gFztzA)r%O-+UDcnPdQwUpl4oTym2!6`49fcAi{@cGuU0mSvgaqU zO*L8BT130K|8@gOgxRaI+2rw_1*P1TMk)Cdz8g%T&yd0;_qEvveq-a~(B8h%J6rY6 z9W{g*wG?4jq6O#;8-f0aN^;xcgTh0ku~MAEXRYM9Tj}<=t^QLIq{zG%-hAB0#b>Wz z$sIF3fp$ij_RhN~LrcT|1)nY|1t0R}ote3BgXK11S18vsW}{p<>kQry zMs-Xu@fjI5ayGM}Er$#Xox9*?ejuPbSkf&D)G^+gJlu;D;+G~1v;yaX5*}2%qe(pf z!YuHdb$?#?ZAk@2k&f+&Jkv35AT*rYbgfc?$^Zjx121*pBn2=D-!6F@yWtT)!|d+- z+ihgn6gfeC0<|;sUq$Ywx?aZAosMr)k*Hi8a;!WMRA>JusX+H~u<@V$dt!q#qJ4B8 z05*fbNF1CT`q4}skTi#ZbGx|)iBI-+s0qw8&P%%X&Ad*VyjYCl_+KaSPgpXB8E7#&&=+nQ4IgLFZI#2*PY3 zrxO)E0wiMZk9TgL{k_tN2kl)Y`M2|6a;Qa9+T;nDK+9i#8tB>F>dD{iCv>2Rk$J&w zeK^>lGjhfb-BULmL`kgXy3t6l8_DR+t%i}e1t=OMi4F{Y&Kvk$Lu~mT)C~Bsi)9?e zyE#7X9XLo^TeTux?doa!^(!;UFMhZKnd@X92K-3p9a7e(ez(G^+hyQ!OhRON?N_7t ziZchNNUB5j?5r2~)IPdz&NKiGtk-^2J18_XB|l#fYMYxrdZu!vf?PsvtuV8Fcbd6k zv0)Zn`li9w6I<<%xEnudUNDE!1I`+!$^2k^2)vJt>58uCI z5>`Si1JtDzWXwP2;pZoOHLoLX{d@(Dd=on!KD2C0Qs(AyVs&+p`Un8Sb8h($BG3#{ zR!D6JH+%ZqKM;`ppk3_opB?PcX8G9Bifc64KU;&&)uy+`KAZd;9nI20ZW3Qn60)_< z7%E*TCjfyu-AI7^B2cNC0DkiLQ;)HUi3rm;!P1RS;o+uwSucORj3sP(WB}+C_j!af zW+QjA#{~nRc*onoB-X{V15jK>UTx!dUyP%+EpbL?Aa&aabv`2_y)nQyhYOwC&(n1 z>s6k+!RJz3yi_-pzn&}JKnx-bhvFglv08?jyj}s-RG?ZHbfX}q-5j7-ol1$To|>|V z7El&`n}D=-EK_HgF8jb>xp|0{TLg?Vs;#wkdQLryVr<6u#>8xA$;CQ2iOo881`Oa< z-Mt(=ev+`Z@O?og1j+pQB_~CfM?3r2mNY;jwjhpH<@|8E-HH|3)&Fvy(GaXOWW|C%@hkq<+w~tXJ@B=Ws1^7BR_x9rMm!Dgm*{=}t2r>uvLp z=?}it_$dueRLz$S{Swz_#@)a#eFnNFN+&VhX%^&72i^;;~zzd!S}h7bWwGI9ZF z2JEKoyd-&hrD=1F!KuysRi$FEb$!trV#^^7km*0Q7_E(n%B>D!Sk^pD23~AVwri-i z0GA!D7Sj)nK{7_Be>M%|HiGzV=AXj(>o3ksIHtrV^wRNgtz6=ezVR1;EwRR?Q1SfT z@zt%$?jko-)LgZuWP8WUrI2vbPyOD6#~uUaUf}{0igL418l-;X#*NIiJF2Pz%Kbf9 zkHFg6dijon?7-jpOMTg0RmJX0d%LEb4g5)M?N>Yh-tL0&nsD$gX}K)mBy}DK<(W&CY!Z6L-=v2RZQT^e3P7xOcUre?p1$kp)WloN!7z7rfKu0 zh#@BPAgy?YEL7QISa<+&P?WnYgZsYhqq?&Q)o`O@V>8pJY!OfR&!H&(M)PRMLN@MX z84n=2x~F5>*+%^K%t||UkXH1)x7U{S;-IWgCxk-<&`qqihqY<_W};U3c-6bqzTEte z4-0$n0HVrel$G_`%jsPKNYqM!C4F_Ot>=_M&iy#^4H7jkwYk)VziwIa9%z<2LlNKP z))@&**m7MFSg67&hQ)G zBfZ)+-YG**LLk7zUGXgH`$7HJrmW7>Pxn8$G03p&*`tUj0`iOOC5SIXHEgJm%pUb>a=jBPR**M&W!@C-xq&AnLH*!%%<#y58T!hROx%Dd%kYHI z8c`$;R|P6B#FlD-2f z!@`24{%&69ALK2#hX2yr-+u-lVh|(8+}xJ5jQY$PsC3#X2}Z;KKxAlN|470o6*Z-| zb#w*=?gdCp_5E0XQ~ngIH9%HuV>$ZS#!|}kdq7-+2r?>A6MXMp8k9}`IE7o>R`jGgl`* z)M@>-QuMqfQPG0=N#}LBjM!MUY%Jx`9k*mv>i5SI7pw3o@3waxJItFmyP2Z6c*qpp z58HSXBL8s5v5Wi0SGMTcwiJzoH!+^pk+H(oqs0hFBZ`4YTSdm}C71WWe%e%M`ZehJ z@pG|9Aq#bYUN#e?kFtwvPkE373iAg^z(?@}RBNY{<+6~F7K5>C`M?YFzR8^*ZwTHt zfR4v=fna|6Oo#GH9*)p?jK3^F2zBjwZODgQZC20qT(&36i$ma6ALZUvuud5mHd3ju z%`Vk++h`#x4!CXnrM~rMszuX45dZHj9jO*I#RQb!DCI+UDc@RVwuf$1Tdil@_)&AO z9Mp`XQ7r1{8-FOTv~ioigHe%lM$+&1Uzcs~%hbj4wVGc!ODM5&gd21!kUpIvxQb~{QaE)tPOj|9dIT&+VSf_umo)5paU_c zMX;PJ`7Xn+1clhxjgAW%+Z_fJb=!DN@VSI6k<>86K=WAAUP$deU89;dh9v1mK>zoG zZ*D7(kn+x=zG9~kVf(JX)o7q)k)U#1&o{49Fr%z$(EtP*xsYW>pOo&`pHPhu9-p}1 zzx@~6L}mbjFdQ$$7u_BYKEPj)DsW7LjmiuLwKpTp6P zGQcjxq2CuTCW7gHl24%+W(YSf^4* z586KefDk0gqyMkX;bTr_(83}y(S1?|Xo?=JSNdF_9KOV|x08_&h@1Ue!)A@a$$1Mm zuc@G5m1(`c5n@8@p0N)dmh)+!|J@oIdX|Wod!Q_Hq6*4yfKReXnz8T)tjvp>H?z-7 z4{F{TncSWMPB%}YT;~iuakhEjl*i`O1l;Kvwdng&%Zr#DYzV|il_w%yyfc&ep%<3| zdlPFWk?HNg9hrq*r)}w77^PYCS1AROQ?O>|BbCM;+68u-Y&JsiHh8h>8-LdB-?qe? za=ah1*gkH_TQ8J!7M9OHK&$Yqyb9;}O#G3RS%-d>1-7cas==V(!Ai$|mC9omT)-J* zbKeO~^(q<8v^?j3ti}XI8Z8bL?=sgYP+)q*Ef7(a!MYO#D{)(tLo^cJMbVzq=WM(4 zyPR>LJO>#CXUMBh{raQ=+8ah*_|r(#^t(VWQ=T;MzMU(tTwMX=%cN>XSAhj23ClPX?fL8YS~ zOJVv);9AFY{}yZeEe4aMuh&LaivZ4o@}VxFc`R`%4zw3{A=Kc;~O8@)b&QO?eVh{$?09aBVpmxQ*k4e^w&nRo*;n6+NHZn<5#YMBNS_OHLW ze~AmeL!hf6vlqA+%^H}Ha>SE^Hf}VWuHC#(=ol-xPN+92Gc?ZDG0rAE)mYkB!we{Z zA4}tYlYM)xH~c+3;@r1>Oly42lF*L}Y_!2&RtDBH4NnDU)tLY9@)VPcZ*iIfUep&{ z{g4BRavnayHUUcS1g2~(SSynhW{J1e7USdN&^02u4Wy%z0R`TzDs_OWQc#!Z`5a?% zzt&~+gZyL?rZ-m1#QU_P?a*Uz-adzfB$qA}HwoI#O~hbYnq;V7LeGYXJ5R>0t~v*m z_H_q^S-IP-5lYZJ%HAYf=rz3jbgRckSc=?Eb?y*jFL0XRtMCFX0lbmRKsxBS=)m&Q zt~4u7Z@_Y*kR#MZj(P|9(OhH#MaeU$E&_XtCF zt4>QP((Ng<*MW-PRUpoQtmR|M9W1%A6lx=d7czB=?~ZU9B1sGMbh|nT{6S3sBp_nG z+4VgVcLb8QHfaD82+5=%He(|VQ#7JQSAw3i4!>9ksXe4x9^njBzhnMP$C?dwNOQdf zijW?}C((2WSqF;FX~Nc)D_I#Jon@p#K=!D9`=-Dn?=R4=2h_II6_h_}-n;h&Vntw~ zRNI#$LJFB8#u|6;el-``4O=%k=d%~gbig6aaW?lkA!GCO zOylUDe(j_GuaVpZQeb;OI@jK-uVOk`;0z?n8cn=r&7$xG!cc| zxL7siwtF{fcNPsF0zJO0pK|7AlQurGE@uC`Yn=lx>5$s`t_T}b$ffYhJh$_QUd*BHfVkGzwBRpbw@IN7V& z2>D?|^=O8&HGg9IYNXrvl>01>R;MRl+W^knR#*K#O^gO}O@ zs0bE&+Ewh*Re)G@WuI198xr0y@N!ItTqjMlH6X+HGI-18t*mJ`vm=}!7# z{OyKu8MIGqjk1n8E29b7y4Xf%uYZc!$zn7uz6fdQJ{OD>(Eg9JD!h&hG(I8U5ACoJ z>Wfe3QZ=mxB)@Ld&Zq*AHeX7z^CHcKlz9F$x5lT9$0IzTcqBO`Ltf9cD;pA*lheCr zYO2=sqVIwC3Hr!G1&!v1qS2C<>i~! z-(crBeXkNqj^8}k06aFNx_I^HFAMaqAvtSLV@Nq8wR)hKZD`_sRdN3&>C@`OiUVl2 zhEcW)?YbBjN5t1U%~tzFoSYl*I%(*ca3+o@e0%qWE?s#?$3giDK-zBe;{?_7EWEzt zn%z#fYWqLzy>(oaYxg&btteq2(hW)~DUE;vlF~V-G)Q-&A{c~pmvoMRGy_V9bPU}? z4P8UcaIP`-*57&F^FHVNbIu><{(j$Mkg?p5fZL;F@I$AQ)cN15$fqkrbm5*F@F z!`0POWaJ(EVHIFeh#bw$UR3Wd2S%w917|11Dlc0v(d^7yO-U%(iR}l#G8+ipw*xgC z>o%JQS}|bF1}k@wB_>@EY)lv6&>+E83B*MXOydMv?Dl|iXe9s~*T{HH9pn*`<5vOv zqW%Is!QJIyx|QoEAn+agHE<3B9NWaPHM_>9CV*|F1~!sP7v(res3(qu!648<>!Dbbw}PCqVI7M&=1fz3(66dmH%7}_bdoJDqlIWH9N5f0J#^E4Z&XoKROHa|mBw%A zCva|G@)iO?yx1tyH@DsQmPrP`N>4-2t|m0>_(a)4?^sX}gllrt3XiW799gIs+<&NI z*`q4^W#BqqiDadp^cqz*4EcQWu+o2kKmR+id4ba4g{o3^__<2PkH~sQHd2Bb3&7b( z(}msl%m){W@d~lVvhrumgIaiCADgR6831{y4a8W`5C%lIVg1z?YVKYEG>Q$Q03m+< z@wvbcMat>&5fH861EUlqIFtjl@>@%sAR`Cxe-nV8$={p)gCF>~8L!nD0nRGptyn@L zveF`u*OpcJPLPOJ>;Ep%ZBAiBcDrxOdwIVH*i1CM#^28sjUH_M3PgWv3?d2r2}oY- z+X(1AK(zf-qAyfi{S3@JUm}(DsiNt>*2vD<$2wU-!adFIJvm+3bCFrHf`?U->H%~%i5NibE^Rs6zpc0RAlvT;iQxED-dv|s6sk)-g-ZuVlR&Ue((f^hH zUF0hUJNN1cD#VdzIotj|0+k*KHyx1r-|%tsfa~+ibYMvM zozhtUnG!LG0bqn}7u*qXT3P%NMUHKkS`&MKK1x7cDU7qO#6p=}&;?jADY&xg#-^4s zp(_QNAdneBj6q-iDu1mQ@%e%%K_ik~t>?Uj#h1tb>prN28XXMIHD?)GELH#z)_>!i zrK4Wm{Q<*idIO7oip7~CL=NO;;*+_U{=3KE;t75ltqWm-7Ve9#$2QpWR!#TyH!1(u zwBP2GU&cth3<7g_Jbo@DHt6y;P@U?V0dCHXrJ`R`-G3G9!?js3Y(uh_uqN#+(BF1e z$S^v{%exnA{vkvAQ+}dp7DF$Oq}_@1svhytAY8cZ!&ZJrg>}@}QC|B38(R@8@v{HV z@I}B32^oJi2Vz@#-y=TYQ31ld^+$8))H|Yz^;FVe}urx#i!XV!YJP$nw9UKUV_AP8!mCM9^uwN0q-`g1ud2Y6tNN8wdTu zrDCunRMwReERcl8l&Bwi>qx((Wh+}gC(m~OGv-0&+yAV-xe-v~s>wBy0p>0pb^624 zw4$Fah`lB%0RAlXJV@rJPct9we5;z27}q8Lqr?(*S}j1iitWa2(2e_lc0}#L9ZF=Itt8@-&#@daSkZ_vPb82kgp| z9=mU*!T*$OVWj0-atJ%HgH!#Br8Cy4J>?|#@$&^_bmp(c^OaV-l>6h6{aoyh-uY63 zwrFL!Jy)^$`kf8VQ#KH~=l$0d5Yh@Weoe324fZE@_4)Zr#%Wz zv@Htq=XD421-lQ==ZaYm6cpT4y&~7+WFfgIjjNdn@g^)#E~JTD);{>?d5- z0exoLDsdy`&X%huovP@=Q@a=boZw~Q%)UFB#cSTjOAe7N?7XF0PU0T%&vh}#x2l09 zS362h;XHlA>0I$5s5WkFT9VkHCQ(;&z}Wu>wLfm4NHjw4;7i^RY4$j-#?rA?T!TxiE(xVttC3u5_s%)_<8HiCDZ!=24H9|VDkIJ!`p_A`b^qpH~p$~ zu}}WKsLioGQr7oGrS2i-)F*08cccM^|A7xOmPZ~Q{lr9LqI055(PFURveeIt)xVw; zgMsDkmi9d9gGQVrg-2(pC<+t|S_I#+i=N)|lhqZ{(=%>6)gtZfxAR#4qSY*o_z-p+v2m6=Yy$uks-W6)(Z}o50*J_qII(u_ z?)&rgK20AU2_;_zwG=*GA`ZrPLr>(rh**ceg>$oYy#KA*;Nakc_zOvuOppYQ4Ojra zwV&E67zkB*t7)FZ`5iTYglbgA_g%(THVVo;wlZd8&taNNCyfm1o*%?Kr(+9Z0C_Q&lORO=D16T??*dnZ(czK z4@5`XD2R~~I0{ga==^h)ar#X_D--Rl9et^aLYYLlT&(S&B5uZ7^~u%MjyB%$1qT5~ zKqSk~N*pC-1E99fr7aiXw$9F;3^tt-n@vv3ag6`7K;YF$Ywe2wNd23{dZt!2B41zSeQW`&V%)P7M*&Nz;Ad6shr=G(eWD*n=@$A+sIt-Uze$}Z%45m;lSa|nUn=mDas_8m{#zFf4r+ie- z`D@01+^B)$&_By*;Y=|3=R$TK22h^HCIX+NTO+CCKwuFj62BSq{{08M!mF9_X#jcg zTtaaj0Ad^jdo>~|NuT6sXPd)u@NHN`VkD^@#%3RYLhY=`LNyd9zW}%*gkLVVVRy>a zf`2$Ww#~Qfd*DQRw%xdRso|Lf&t|K?V~bA>4T71Od2j_<%hdo76S*-rfZV2?2P8y!kpg zD$RS5>y8Z{UxI)rnL|rV-CMqy)#12wf6P%hR(g|I^i`&>Rc))6SdQm(F1NIHs8~TD zVivsC6VJhS=!wu?07&Fz zF+k%l=X+1Oy-t_f9&F0v2mYibuG89K`btmB^#J-E@cn3N68$ECw@$el(02}4hpp)x zU@ECmg;uZc4CYF?1U(M~N|(QrWrAg_FO6IDfr-nM}a4d(kq_?n`#sXL4Dcm?{ZDEEbUE&=;*U1O=nBX8Lj5 zT3jMWb%bPgLo@;&-6?=|sC_*+zk`(6{`ZUnUPsDMY23YtE;NX`Gnk>4`*{_3R%L5> z`W@*eG$t{o?>mk>3+K@__p>}yCfuIL(D2R#-an9}@NAg!8Pv7;cFV}b1e6{LST6@~ zj_Xe?=@5IOPC4b}ngG$l99~+IUO`u)U%m(6*ZLy!M_H_$SGpBIA?`?o)T|2J`-C*C z>2Pci)lAW`D&hEw5{@HC)SY*y>tdGl`KC7mJ7 z`9D8&(cg4msGE>yaG|6|bj`Ftl+=7yxN6U(%gUqD8L6Im)brN=QOE4&ZQ$mki3A$d z(9nkGC(A+Z@f)MXd@L`H2AHxzhC5Y{AWFktB4uE$eEnIzX2~PZqn+MVg5#dkwrtnI-~nFS{p9>&1kiv0Cp!B}Ll--t_Bf$&7}vl7#N@@^&2 zq0-+SvUs~bJU!x%dZEciDsq8a_5b|PRs5a}*JK*=ye`>mw)CLS&`CWPc^iydTaL@bqhB3G7sDJji(I-etrG( z<_NSuZgWU*#nmpW;x~?pRpZC-&e>f*$DdJ>zkfSj-}A+^pIpKJ&ds%q`@u=`qM7x& z7d|z=tM|(RK)L-zuG{B}_4PyoW^Q%68GVQugQ`C9?HlvAGRxyre%@8E;d# ziXC-I{2P+n<4?-iOvIDC2_4ul{cFm235Bsc?j{wn$$Q}D0e$m60I~c4tV`T}##VxC z%*zoS?elc=e>75UaweqSg6FRWu%uTxcH!bVXy1leUYF&+>%vQ@1$v%ZC<6Vn=R3e> zz-B57VWd!MgetY8v&zi|u3>Ae0#eNRLp50rd;Ed933gM<2-a%dQjTmP`%C{TzG zvCLWw{S`3hADE>8gP)+A`^18BcuMbSpWZBPs02)z_JH(9w#fCZKE)AaC&#~v*H!1uy7CW#;D@>O3!c*&(t zwK~Z=4yr%Te({bqNYP02npOjoBykMl=~a}KpG#N#wVaXw)aI)`IHoupFc`>f0=-0y zjL#a6ITNVg4H^@@BfDgHo50h#2q5P#Gc#e^`hEEtJ)la)6Ir#W(^BiX|u2JF@CD?lDe;g{iB6{C@VwJp?4uD>dT5<&=O#!z%>Qi|C`5 zQaol`4xol4)!pW{0g}T7J%Yt{Yi|%42ed*5rS-(ffxpfg)J53i=Ud)Oo11P^1>Va+ z?k9>d?tAJ@!j!=o-pAP@M>8y-WLon1oz+x;Ma^>O-V;iw)bKFBcGjicx@Fv61RpoN>4=;f%ycC3b_NR##A<{@CIul~+%h=&>@= z1HgtGbc#x)N+nv_{`4gN9wu#Is@Y3(Zj0E06Z8Tk!K3c;$E~!Cw8a`h>y%4>9ivT? zL55a8H9NaH7Caowl(C>}jqU3FZkErVzfurINMda!3=Pfxg^z!~{^u+jwzIJAJ*>R= zm6^(Os{)t@NS`kx+55$E%M{U{0F<+(GS^y*gB%_Zv07DxLbM=vABWD&&Hxzb%Z|ui znKJ}S&cgq9KbsaakX#@nJPr6u`Owgh zz4q_7)UQ^+y8Lzd90vSpfy93IU)i4iG)`k5`hVFJ_WySWy9ht7|6nNm|NQJ=*#(Zc zEr@(J8$aBQCqq1`}~htN+m-mg*PBwzg*nhxy4 zPAi=S)#DitE1&CDgB&+PORRkHrFGZ0N|Oauj1Y*n?}tYRR>Ry6*_p5b7Ke9)*&2&< z0iut9;S{07i_JP$P!&Gg$o=fAe^G6VrT%n!VOw41`hR5Eo%$bGaqJoa3WBRQRIsPn zxAcF$vY)KARUV7qAXSO|@~h7e@IP$RzpnpeNyh$$#+Gh4KhD$K!|s)?a5EO?9g_bmEl z^Ik05H>kqLqULI^-er7(uMzs9;4JB%f?TWxYe)BO&{6lKOGJ23y2{!k*g8sXr^q{L zh)3MAhA*?MfJqaF6^Qj z)`E>C`->rPJ;J4H;!|O8z1!A!D(KTj_D$>XF_d$0V)n}}o0WotTNCdyMC0h1ibj6C z4GR%!Q`Nq6u%LhI`3b7~%+(xhs{cOL3hwjKrG43+E^*fb(YO^(+^!ODBrjgo?y^&0 zQR`Rpz6oX?)Iw{kfCHqtjN}8=X~z}5Y$&ajeUm*o$FG-TZ#S`|N_dSWv-KMRR3|ai zb1QtMm@%otD!xwR9&8=@NW`B-rZn2O7Fe_e{hUu+UcKP0;sNfDe=a3OtU2`JyRv{s z)ozUo5oN6U6Ga~F$|JhoJZowR{Tk!e1v!Lp9e&#azl+`Xe$Jt(N z*GxRP_^-#dUY(Td^v&=_qoAXk@(A#G71v;B!XH!9^A7aE$LNJq=8Jo+MUC{bp)=ZP zEKNkmI>7FUF6Qsj+jq8y40{E7terL(1LUMNkWpKQUgP-a0m-FgCuP$|AiERF^3_>Z z?zMXJEbxp&&7fKlk3d}4KT~R z!ORTe!-uFUSCu>WWZo-=vxz(?-FF$Dxt_l7TWiH6T@Y;^eDGy>#jfGll{M>{j-PIB z*FspA%JcXZ4SrAP6qK=sS>Ai?v}-%Y{BXPP;^KDr8(m^j5o@i)wzjRb_`s6#5k@JG z5q)`A3>k|2lJ|sD6JLZdZ$#=Zd^&6&vG#B5j;yk;Y9l^Yc6C2FbAR01v%h5;^aleq zhKZ8xzSz9v&5LYgXo=iFc@srZ>xh4PVY^wxK#y^CujMJ-KYNEA!s}nZt`1Z&UX$vT z&V3~+Cx)aakYkcG&nrk@P;18Nv7Q}LFnoAW|ImjQ& z&atqCaAZbaZ^Um{8?vU=e^?KhN$Nx4ch8wrqZdlv%Vv3*Cymocy(l6tY>fqi*4oM6^5%^NpKNl%1~&TUm(MhruT6-9y>N@zGe60cQkpL`TN3D(xL4wm7h z2-NYMg;au_UHz}8u6utYOc_Va^!??NB-l|DS%P}Ihy~clHR8=18RA}zLDL;qjt|b9tJ)(mXx(2nI#@>JCp~c* zE@k^xm_l&9}UA@Bf5l6uS8Wi-SHe#VnHX6%qFlrj$OZ`Aaf3--S-Xl@-xKZ zQI>VA(6^f;25P9^tR0Zz*W1*9)!qI;h7Ygw-OR?-I|{$v&*E{#+H21d=*2aXN zt-1?5n{JU<-*weB%POHwuW}MPS{%cA8?J)w@2qS@K^)tQgx>umi#y6RuEfHl1mXbaS8E+fyyI(66M^ z-~6cm&A^3Aa3625q-!>;xsO)yb2_b2RS+A~ghubZYNu)`t2_>pnRYz1QFSCzHH~-9 z#&Xy*&Jbm(>>#_j)HK_5X$e6Y7}xU>Y8A_Bopt!L5FrjuYA15ntkx6NN`~!;`8#R= zYQ}06y=HJ--5Xxhx!0B#wKfukyKLll%vrg`5IoIxV=ET~mBm%#x4LYds5NO)x}FZ) zI!nr;T#Br;yFQ&~;Ie8OwX$)O;gFZ*>O{Pkr9U4_PuW8!mk%q_Zz?HhJ4y^5@8qd{ zGO?7|4urDjrb50=K@KNWNrG$J*0HPrToK)4V`;Ve&W`!**nbugVrPa40M_1q!c(~i z7GGe?==`2|wvRr#yLn@8lHlxiB_Ibw562=8$Iy%@-B^oeFzqVOU~JhRAQ4h z9$?w^Kf3nriFCCS$B*rKYMZ9|mP>bK+Z(wt7a^kW?RZF|v-`?4q7Un`KTnG7D=rZ} zT^1PAC>*(aX?M3}2^lh&&ur;+mz%JyeWf6ZY)BTSp2hB}TTlz}@`fFE=n#$9IqLEE zbbk5-|JZCjQ?Y`~TJMRwTlxI6vg(O<8G$D;M zVhyf#>_gB3Kiw$5f6 z`tNYQa%+XFgzBM`QEc9+0rv(x>3(*HVR31x=Rg!jZLvb8FRFuwhsTqHjcUen&aYY0 zPOBD?q;V`o5HN8$WJzTBvi#%wMdDr(j;kN&n-@p;9xz<98|7`c9A(W6KZsPjTh3?d z0?pQnqrYez(ZWbkeXEUOE2}kgIG<7SDC9E_ zT>~Ej&mh%`MFb+3srsjtl$o70a2cwBVY68I&Q&8xh_$frJOno%+uKzZlV9HF#jK4G zQ?A^a5I65rclHIABG%1SD3EU2{im3vbQH@A`hE-qzQT%}bkZMz0XEfiv|t>oYe z$iAVnSYX+RDymBBT@BkA6s={bjxypFJ5!3}HDNHJFm)86z2xmOeQyP%=_Z>ZG&myttc2YkE=v^i%l6B3f zp*e{jqp4hTJuSa=Ha6|fhxbvlLq(|+S`@o0d8xK#hK^JApC}Ms=kK0{2i@tZf&fBi z5H%3`<^UJAZVIVrwQ_HrwF65Gh)ZiiiD>d)ZCZ)^0SMJmA{y2^VorSuugPQgjG;I@ z^t+$KH?YJp##CX|xGeDw2%()lX$y@AUeQ~mbJ1hj=jz>CaWryIkJK#o7Eox=_D0&u ztr;^Ey>cI>*pGLyj{@)+c$QsY3aiKl9l{~EIy ziLn&@bS&#Jyhf8dmqlM4Uh^Pm+R@#8&dI4|^+nj|Fnd{M747a*!jRAL(wZZmOTQdo z#9k`6v%Myd5mWMKv(V@ zkj&Q)x!ciNZ)L+C<#>lJ=z+ zihkREE~`$Cz3-s0&!1Gp4Yp6H&e&!_pmHj*(+ckA>f9&%__ugESSs^?5PU8S*5}&N ztnKA<2c^Ynw;LnY9ZLKY?$l5!iS;X8m?FX6fg$SoFt*fRiY~>~aat8LyfIZq9S~vjcvAnxPhF&*-amr zywqG4^vLXHR(ge*W|#l6cm(?;9HmoDx3X&pTukw56L4Ft9zUcc*ymhw6vx zAe`^D?(VfLt%eL10HK&=1;kH(=*n045PfbTziWWi@(4F?d*2Yf^(^hV%yq_DlFARU zSmGQ%^9{BU`SK$q2MG~qfrH)B%U(gAE>t--x87(I#KIdnXC1l8C!6?D-9L726W+Qt z*t+$`&=qOuL8Db8pf&L^zA&WWr$2#+sUYw91xME6h8ix*iCdCnBi+L)Ys6}Ho7#})cRcOi?4!@_G2@B8{9#`|a5T;wMs8Ft`U7N9E z5)hJYO@46+ads~c=uUnZxI8YmLPSi_UDrvj{iv%2$d-3bMi+LAf?8MCYoeB$h=*wf z$JpN~RHe2#rkPfanO4!?>3#C8B+!KVE1$HBb+`Mu0@Wq zO{oPjsp^c3CQ|j&IJc|=M5(zvBlDJu!AXH}#!iJ|5BL0@z({ZNTxG(lU6mk1kQkI5 z9x>X-P?jmH&G+2|Nf!D5rfSN8E~KGrf%mg28WhXTK93pBRsv9J< zgRu>Ng9Xspul5&K-b&TgQOE;-+)nAv;-$ZGC80PttOC0I095q5l*T{aJEe0!h=Ysn zEnE(;CZ&f>$S|`6_7Vknw|@#_MJZcZm5P;=mouy`0VP21KdU4qf6`M?zx0(!CZ+Nv zo&AyETDssSgM`OKlkovrW-GT99TyAH#`cA+NV^2z6=^Af>L@HHy1GQLSz;1U()!Nn z=55^BkhqKO3cf~CIbR;g=%Ei^dpqp@b4tN>C|`KibYwmw13P76yde7ai(G_uM&!*g zd-4j{xSim6-xA z$pEp|PldQ58Ty7;d3a^FiEk#XR~Gcc!>-ID{7|?xYac%in8V(D`gFCT=j~Vr+1!-{ z{v^@$eO(roYB+1(eOb_cOm;_+vi*%5*$ex+f*F$YA?5rJgavyOodXK4ujjXAp1LkO zP<5y^5zr0s|Q`GbFB>+b)mq%fM?ddY}NNY#`ds3wt2RvbdH|Jw`XbV7?4GN&(=tS*SQQRb%XmqLDa|oy9VaD@-oz_g>95^&!Y`J!%KPSS z^M9Q~(C5Ghy0-9G`lD7RqPRr)cA_e+S!-;u{4u#aGVcZHT!)3DJV-s%O`U^#&A>2HLtR01C``@#O4LVjIK}~ zPj#8?aTi@H4fjjau%J0d=ghfEH80{@H=7mE7>6tC{04^0WW{x^6B&j+9K-Ld3*;oi zzW2}Pr8j1U8rZulQIt zqU=Sv=uL%QzW4I{U76-q5@1RXhe}hqYA~JvXQgdtDBXMijd5o*WN)Mkwo$ZJz2GHW z;Sh6JCqX4u`V^xJLnotm3!Etd3)`xKmn=9m98GR>EOTh+Lnmrh40f))^PTXpNXPzX zReL0|S~R+50H3EJi9MFrkrko_=8O>iDp zs8+o8QYnDIik4OIYNXy$SaKjwcS4s=vX1^q4-8WY2<4HpsP)}cCBEI1lO#4io=DHt zJ$=+v(yh{YOfJ$9XVZk;xMQJ)0)?+sFL2 z+k2h)9NS(gT~OS~F3&;vRkf+axNVQU1r8L%SdaPH-T%5q*-{VpmkrNwpE|mWNdnIUlN`x}tFn!5)sbo$4A>Dw!|PUxDBo(5HJD!6NCy za8cT!_v{#4$@zrK#*63;(&z68b2tZL?uAuIrFb5pzLO%?sbf#_TJuEJq}FN}EeP!F z*RGmvWG?ef_|9%1!baaqiGyeY>AgCqTQ#1bECd-qy}r7<8qzmPm#@!Ny&&!wd(Hf# zjs^#uD!euYqE1acOCXI&mP=OHQj~#YHp$<;eQ?bA62pJ0LZo)CWX?^uf>Npg(N;oU z!N@LEO3ug3K)bXtA=b@7vS!aE?xjWZwLxsLt0Z;cVC+=Hi~vx!?Vgk0!%yb4qw|On z=1b^dJsbL6>~?pWxDWrgS{eyYlIdE9T}O9Z_{iy9EiEz!u=@Y1Wm%S8xWz}<)Un1 z1aapq$Pcin?ENw6P57@|z7kTp9?PItE6JEE=h@1}v)iGERoC8yIHtanOg$WRG# zRKDOY$bRye7SWm($!2q1%6dFGRL0s$^^xde%how%ni?ND>S$c_fzh!_-!sv3r#Wl- zn-6_%Tzo8&G#5dh6e3hW9vpWCqgARq+j8$xMN?#Mxh@lX^SibZuByW~m(QN!syt+< z3zf|SZ2HE`V}-5Bdz_E%W<?}1h4NxsGS7_JP9&b*kM z+{>+{6eT5P7Kj|4_mbOHKGm3cox`>=uVnig&(fP5+V@x71O(0pW$e1a1diI123{V) z*sLLXx6{s`+~f8pP2ORg#se$YnsgW#>RoD2`iu@Y32OLPV5e}t?mrI*c|`++Wvoc? z9KJ{B+#|YH1C3&Fk2ivwcn-73&^k{wchOr9gXkXC+0nHYi{)+xA~6zc=g-RttT1_t zHLZ6cx1#XR9-gs7pCYN13hD|yjwFZDC(UUV%*i z5VfKZB^;rlmkE%;t3DwyOGPY~{Wi2?<92GCsZ#3k`Ng<06x*u+XgtKltYWSFNJRK} zD6BPz`%Z%1_~DwX=zwAuI_T#2B*8ql`HqBC^h9YCz1d{hs@h%OsMaD@5CP*~k`B{D zjh%d?U-AYZX$$(=omWeMB|wRhQ11LEZIdfVem+XYbNhC$-1M@MiDQKNMc0$u_(|=0 zk?T{@%T1bVd`|;ag*-;6FtX0Oam?q8Goc8AmR+6DNjko%5F}S92hrg+b8351*vgK{ zu$>W86}keQQme_lLoDwlCmGs&lu_sPL$MVD_KK~jnN|XHJr7HkDkI0&D363Im-hV6 z_0fC{z?l}idzWu2YV-K1yxq3qd_m15%#aKqO}xWApekBbt)z`R4a=fADAIL$a%eC z0p2-dKKhJPQDhs8-sglvC*y=V;ns790lLu8XQI|Q?Ma9hp6t*1%o_{08R733f>H90 zhq9F8aktFg0Q&fP+m3v`~SrBJ+yL@KUNLMPre`aiD(*OI$M9&4)Iw1q^DZp zk&pFM)U3SY=C*ri^TFZebC|I?+nN{(%p+Z_%iM=`sr%`H=%c=+%UfIjV2__}0vXbr1fa31BY8@9)i3XC zh6Ryr#wr)FjFTjtgxA=wDHbHhI*~u52_3KOuCHB1;uf3zG@n> z%H~*yXVyH4C&f?YD#bR>Og{sfO<9&MlJG5TT%unFus#lbTl+RJ44- zP*3pSTP?;SY0iz?CJ)Nwng(U9e2SIX2Ru%NUV4*ZMW~$DhmddDLFH&E!nkh>ctw$| zq^zEbVU!%;FGtJs2~jBB!6Cw<^d|XE$87g`Q4JSp9x8;N!=#{f)Zn9Qh5MDFjMj=y z9WF=cRCWC1=<&$;7>&=R#}%)=J1>OrnQTmIgbCj5KYX39^HkxbV11tOiM{AzW#eF% z$5Bk}%Zd*%r|s?dcq$n1l{E*oD{7bOby(2NHXlm>pnwVb)OU1#m+MJEh+#!*@FTnY z{)NVJe$*i}?4&lH5B^v<$sT%A`F(rz6b{i;gWH#bcls8cf?irkWh_a(2a-HZvuSao zj4CZG_~f&8rotU}7!U*neCm1MNk=UgC`#IcMx$U(wX;D7V(Ns7p;j>T8qI4LGG41* zVFID>nhDRSgfHz1f>$gi6DKBs?pkyM*UxVkn}PbM=@#8N3C?dHxji$4>Rko{ANHMs zX}ZUas6#_&pT)Syb({(oauT=VW(FR+)T?(WW%Z=aHyNN&sdffe?~q221XI#H4ZcyQ?XJi zI&tiT<(c?bMqyqc0`P=%wqW1pPeu114hpFwul*Q1E!Z*~H*l9XB=Gw$1i3}ce^1mZ zbX

q*NE8$Pc`Ubo4`STJh)$TGr-6bTQ^`D~(b5J+Y2R9_PKhS6%yPFFkv7#}X2p zgvp%B>1H{0Oc~S3+yeTh~oirrq<{Sm=d(MLOgV* zzpu-DJCax4B0;;?t58!;k>g1J&@GdqluT?6v;(a z0VY1`TOZP!E{MNG+YL&b3y70t!K^O>bxY*o{Uw0otlF7>CxnW zhiC8R1t@%!2tw#2h600j&H5!2)@Bu;cXspc((x9Ps1o%QbeR%b zz4vHvGe7jpD7#?WI`p{4eZ8WJz2-P4uP`%8n9mf9YXaR_zjO3~BZ{8kg$}X4S47Q0 z1P5cV0Lx6|=o&C)C>|bmpFvSQLmUVQRP_%J@Z_01FVqBhUX||~mjaYoHscGpE8tkJ z9IfPS;*M_Bf2g`l&kZk4$0&Ghs@~_I>yIK?QDNm_ishmVPOmz`BR?P`yLe?j;0`4V zu`2qLBT=lbY^yiWNQY`LyPsO^g_?|9aFq&*Hc>Q(C z=3)JK(J@}V7yHe!%RvLnM`x}tBSEA+<6TT=qEMUgIn%U@GtYXnoh~XqrX+~7SfD6_ zwn6NTyZXZ;jZ2&zGMXV?yN->smk!P!h(@l8A3bXD@#va~XH|_O24x8>I|^x|Yn4pMp)uv^5-kw8nL+)Iez ze%|V*41lfUVLB=AB+c#0Oq|b-4aA|4df#j~Q#jYGdcP}8U?;{!mGNd+FO>o3rs2n~ zhNFdywdUF3E~cXOJ2xYiYO#VL;NGK0cJy3L!4aLfSB!m64$ruslXz8;aL)eqYgfIq zm(O0bfAvl);k^ATUo_Mrp+~pODp1b!@N*K<)Vhmo^mBz?&#?zYe!~%@GR&UwHc`~Q zywI7|S_7=9%r3jTeA`Vot&1H8_H?REQxZK6hj$!lL%QEbu#~Lwe!%TS{W_t*YmOuy zermP;jNT5a+MNOD)*%EiMcKU}`4pwQu)%g{O@R)^(PYrJ>YJFD{_%IF$IG9vy-&Up z$#CwK-I-QzDd!Jz(2MYhYnz7q9Fe$7L{|Xi$;#aD2GHWvtyw^~wXGWL)(ENEjcl zb>~XXDxY)bN**<&$gkw}`AvGWo9Yw?s>GG z;MsYn^8v&jgEl)H;D?Nb=5NmHRV-`u>r~G|K0!YnVdZ=Y@cw4K!Xx7|(mV1LkvB6d z81dpVk!vT@seNY9v*0vp#Drcxws)9j&@dgg=SXX&fDc5L9+$3#egU!vc{$Tte0yG9 zMAM}|WWD>r(K=V2iO6nt-|kj>dmmgRNyFY)F5kiI_7kCy7V}9#PxCMj2nJLKe401C z{^F?*5c$l}nVND|th5hP?Ns3JABGt$!F&40vc^o89fcy@C}i@lc0f4L0z8y~k2~p? zFeY+a8e6nT35-i;v$%mo0Z)T~L_vgyB`2JhaW<}r@x(KF%#jlk7mo@*^0G^6_aw+Z z%20y69{8wXkOH%7mdzeci|j1mkCZlqYDf>3-`Tg@;D7y{%Au2RavC~BY1ALWzgBrp zq_Wj16Ky~O4?^C)8JO9O7J=qr_|a6o7KQ;v5Y&2DMU-8lJws}*x$=Bek*=<5M4!fFdDw3?{t`I8(){?j3XvbLP9dyvWt&45Y7*Tym_=SxpOA*xG<(K zBder@camxf%MqF`U^*X_Y-V1{`kXicd6+s(L8Pr6o9pI_43CVgF8ub&p#q4(Y$~sH zq#L4yZ>O6s7AlwjX~m=txfD9E}uEcxhu~WqMCgl7GW3db?e# z%aOTEeLns>YJF!t?B1F{=q#fs6sJij>^5aXaeT|$8cMuMsYS4Zdbktc$eLb9tTlR-N}15<;l&CbT|6G2y|qU7@^Z zSA?>$TQh5?ElH=g##AMR5OTGRsVCToN9DACOz$*rbW-^A2VSI%z1gC$dq^395Z5a4W#y?pM`Q`F@- z(xh4oT@V6OiT{7F^(Ej?cJKe*_FW}Kwl=8{D#^ZuP$)YwYDf{XjD1il*|Ur6iENWS z!x%00E!&KBWE~8~K4uvH=NZ-eegD_*ToU6vXM4`M*Ux>QX^UN}YI_!?da!=+kV zH{5~NJA*{RYvb2N8)_7MM7VBp3Vey-*um)}6~@BWyJ3Xu68qBCtPP_UCGf0XcrF)Py)4z8j7zN!O8% zow#uY+neUf6_#hE4-uK5IMwbVuFT6=q0MZftJK{t>5+L?Rm7i1nRF5?>c3DksG|jY zAv1y5HX!-x7?_xt5Dab{&6`R@4y`YfND8_GEPoy`6aM(J#9O1t@)#pGh4OB2Z7VCT zvpZG{*VSdxC0&kQz-rl8S!GQ@ittwP6aJwXV9}`yd}7ma$4osfn6#^ z5QbH2FEqbJY6UngdMcKd?m5}zDs7K%KbM;ql2Cc*XlzXAUV5UPU9fda5qLsQq~_RW z;u{VUS6eRzgQ3k*TIx@FknfVg_`%zZ1DC5O?;CG<7bR9=`@JS>rqp?WR*^4WXsP#a z0HRL{8^4xQNW=ukD=1#cr%l9Gav0(4+=YG_XJtFy-Io7!=mph%D1FQjZkKyM{nh?) zT?;I$UG60VhyyW-oFJR#Mfr-k3(zI&OhF;`96$OH6pWRL!kygv^G3PqRfkIkojC>o zvcM1ybV>9f>BpM^WLAIWWsnZU5Pl~(I8GeyUQK}>XOs)C=3fT1*iYB}Zt@Vg6dT-j zXyV+&;W1kslU0D64C8}Fhq=!%r=tCFHwtNSbWTe0p3aHYZ2~~ zQPDGbTz5dJ9%RH}9VF%RCAM(%S=Mv2{)=`=)`>2C8RDwp^yjStzNvOd!fdc2e~rie zL#oG*ha%vHyb(h-&73EEYA?LehO^MnfduC4?X^EB4%Ffc)~~kKzIUn32fGKQMauVvV2zt z`K)ttF(xhqM{gxuXzd7k_O{-1+Tt0E=f^C|7D_85qj?;HKQY~A0=Jm!^nBu>zxi0K(R|Wl_En72SG$c&S1FO{ zWm6+ynFGI$-ss8gm0f?HR`l#^MS<1d(Pr*ovAXyqF=8Uy_B1ro3((0nR77GbY3Z$X zBlG6Lo8a2ZRB(%SbWsQiji%48EzLN#=-=S1N0)Z2^iBPM%j)FE{T*V%1BE-h z&5jQ-x_N)!^xe-u%bi$E+Atuj1~$UFEL+zM z{X%65`L0r=jcLQH%ejSEsbRS7-_|cR?;x2U{Wu{d!5~Gcr^>bmg`YhntKMFWcu|9v2^Zxy+B+vM5HT~(w?QI6f}r6na+V*z;Od#vEETB6{s1r=Z@ z{U#?i7WgEle{DCvJuf8Z2qZild(v8DC1v^Q-l0FU_Q}7TGa z?uZOZQzl8s`sulU(6_Ze7ESQOXh9*;<8<^0ctt?>c(NE>B2P4qPET;|*6`zTPbPT% z+*nwnTg)))v}1(wI(V5Yv)&G-CF9SE@7;;y248pV2p?W2Yo5lcoW|-Syif{Wp;Mmq zBv45L{Qha}AC&HjEbR9LeMC+nuGxrae6jvBs#DxrKkU4mZM$%ZvMwPq^!bRT$nXCE!ep;p%$M$<;!2SZ26g*dptAmvQDvtk3$Y=52;5tit4Y_cuOAUeWNvg z-(0$aXXS=4?9rRnw6}Jre#THmMi(;qKb_=hK!*ZUwL3 z?PS$n*+_MKZ_xS~AFP~4qexR81!ESuHZ$Z-2~Pt@1e1>%d#QXyXrikE!QjHN9C_X@ z)_ptoSL!pd@zWkgF(*Bc`)1$8rJ5;ukJ?(;3SaopNNeVU1@5sWk>_bA8Tw5llf$2P&nS8fSQ^b)kV{Pf;63e zaA1c^vRj_rPZ)Bo#;>^LOv}NPyHPS}<*-dxWL1RAZ97|i>_&1@?G;wkZEtM>+0 zuSl#cyU?unxOcHFeG-|_*1oU|zQZq2MSd;nRLX6wxf!QO;?Wnb&gNU}FDsO>88Wyk z49L9}A+(1j?q@`7rYG*6o4s(f)I!Qsi6!Klh%qw%<+uEowBZu)^N@i;+e>ZI!gGPJ zFS)n+^*nYec>RNlIy7eSdU@CWS<%-OhK_X87oJ=Fu?+@^={SXuZmOg}Mz>@d#IhS4 zewAEpN5SV`;%uL)!&=_~u>9aJ@2>8U_yff1r>{o*b>xKDd)0SQ?xkQ{6)HN+4SV-S?d90IuB?v{iF@i?P{yI^*SbOEg z3oz&5661OI=l92UQD4Y}p7bR+Jr=@lAN+M1yX(*NGMO6jK(Zp${O|P6pF`E&ORK#H zXI1dB?^AUdCy|)flnTGQzvKBnAB1QB2U{5=Y__@nQn8LXs?ED;_T!OVR0SE$Atu;Q z!qPub&CH-606|g9SGMszP*}LKHK#`ltr(NCooU z^GY4d%IW;)X~?xys>=H7j#^4@!CvYEwr}(1Z=B%xx{zHLkBwT-GS7|eq*NF_z`j29 zr;oj-e;QnSL%ehukFW@0Ply9O`&@$L%PO{EiqV1x-Rh98vk4x-TAHu~b}SRj`wc1* z?!Nfl=iLCkZuPW&nS7-LmQS`w|6CpZ*aF{o?|)DgJE&Xlz^Y}($@JNW5$EtBb*}vD zJW7BF`P_w2zCNl|KvTqnue4}%L*5KJ@8Mp)kyyg?Vc3lfIP4MIXDl3+0(W1Nq?Nr~ zKc8++R59jg*t0Ok9TV@;Wcxe~v3FsMyXb`My&iR~)t^#-h9MQ(hk$Jjf`>$u|4C8- zU)odatR{U36D1an=b*js9&|XJi@qy_IK#Z-(93_;d|!ML2R#&RoEoIHH0+>;53E#B zzhdMiR@?+a?rrsPLHZ4z|CLcTlKWL&X zks``~)qyW<*37!NwlBG}b#gaQ{8EQ;q>v@7#^}yf^jUkv>yd!I9n|vyfZ$`=Ug8k1 zRhB#ztBmI+`g5Ma>Wt^U47kgxkQnm0PyW}JQ@qCEmJ@CeP@YNn2o(Iol=*h!tb2y& zF7V(r+l=pSCWb?p=~FPv8_}Gkq!SvM{71F>$8!e!Q~98YrXWrlzHKF{I!7E>mD-n% zR(pL9Pe=KBg}xw+*1l~`^TDUR9gLV&VCQ^j`;(~q)3TnJZ+>84OWv+JwN2izgtzwU z5_7Ude&XFrkd-Twn}N!P->f3GIVAxn?BP*I6MaCAKKGf<8hF=*o*MkYT53`~^Adg5 zKWi4wp8n0lsFXs!-h~N=5 zBp{L^3}zB5cdO>| zMsdkNpG=O0VBr^Q{f_=q1m9^LVUQ*gqDsx6W_HRxlkroYfy&;<%P|ELrE;^OS zGJEpXL-3o=)Ycg(&^=RkBBamPxv%ly0^&9N)2yfel4txWo=c}}B?J0G&}ZheW=HaG zOZ+;~w3o^&xyA}Y&`#`GV&-N#K$Ti>%waU19KG%NXj_rejj$oEJ5V+dNP`FeX*t%g zbx|={iyoqdZszipm9Yt2zZxe>^gpxk$jfxTo%u2qe7=+8jt+tc9w`%2Dw}g+jyH5p zH1907Hr(O^O-oKjbK$XRV|Yb0ZzG#qPNxvu+;BVIkm7*ScEspSy=x)`xzQ=FjS7FA zENdOh8Q2VCIs^J;3i>BnrDpk9!uZVz1}T`gyS-!HwsK5QJVcvxWfbkX2xM0?sVg-= zw9!RYWgA-TpgNS#jqRee4^a07g^heS7)9T^Vav~1nqFz7e-$l|ren~mhShkzCSZuG z!kE`-);~+)8<9YwTr-8mZrvEx8oGsVI(Yl|9;uTZ*w^hS!Nzm4Vv}oXeryr&Ge4ni zoBUK+Ms?^k@kZNh+eJuD&rB6L@Dq8unaeHH6Em<JU#AkH5+x%a%8K3SoOvkgWH60Na`1kX z-@8_>q{pU8_wADEzUMn5VqoLj%JbBBUoI>Kaqd%gx#e8E8;SY5@Ofs-fuZ%enK>L+ z&FJZ44N??l-lr-vCYVXLY!4GR>BI`Rojly`7m6QkBsk!%?Ns)2_kOi2_%@9_f|j&_ z2(I_S#Xjfipxk4Q55la~E{?B|W9@Bdltx#adFRKbGI3G!0TPc`k7MDW{)$J-eZI{O z?G0i{xBGX)h|e-UL$`L#zaGD-zDe1y8c_Yv2)#6!lh3QZ57xI?^%9r-8@CM%q%lp z+}G56u;EdNCD!ko==h+R8y0o`>`a`S-LJ6qlUEe;%g7f!W{!HJ_N{+B;bG^SE7?h` z{F#(ik*>CHz#%0Zc(wdHd8rfLXp6+qqx>h^aC z6w8!(jzRb2f(@hZD*ns>%8eEK#$w1wmRPiw{*Am_{Vg=skiLK)PnC|=hYr18Q*55$ z30&c^0UU{m>AThh@m0Xa;kM6S4R4ZeZL9Isq6^Fzn1`^CxuT3f1s^L0MPLeYjJD{6 zWJiPb%$P6-h_FVmHj$V~7Q3kJ6o&BECcn+6p7ipJJ)ijTLe>zzWBz@dTWMvhb{s`) zS0di<|7{`C!N=|yHjL)&A~eX^O}p*E3x`t*WnfvP|NKg39dsK23RS@#1?QUY<%+hXRF| zSgJrjf<{Hf(L&z5NP2=DQc-e7Cr1@AW`k*7F?=ou>M*4>LV`vexw!LKmZ_hts##+&kDbc*jcIADK@q{hgTV9uiK_a@Gz&4kw3C4y5{C#I}~Q6 zY2UCQlJ+i+LFkxnbDM_p0)Y>ijD9X#YagMq^ynpRA!Mpqd|Zs2Ik>Ur%emYqo3v{X z8i-H+`QcrGEnBubf3v4M=2!X^@%J4~XtZ~h(UYSQ8aWS?po&`T(H4MturBCR8d0P9 zmD_76hgf?_duxmH(~R?9o~@0VBE0~xR!;rBwNWGJf`sR=clcMcyqx+WBMr_2&qeRy zOGfJKBi$1`X3pX3FwRlSC!uzQy_D1^-Vo9GTPCc`y!<0S`m9@XNS29)dhrTS6|?th z+$2)iAnC5-o@<@cWxgX1Jgn$Q*4u)h4r&74a9oh61zIln zCCD2-EGZaR+M|5u&Yh{Lsqk}{`SJLviD?~mN5|l;6q%jjBFfxn-2^mq)!Fs?gP0y( zshc?T@}!Br?WKO=aSY1oODjVAA9)uuq}Xy!L|lAD(gC)QwGOl8><_+9OE}g>=11=u zH?Kf#h~Vo7B;j6{Iwuae!?s%kk_Z6E)|Q#nor%qE%p+kUO0zLV%JYWRk0L+cY}4Ik z4F8<5uSdH-y$N(Wl44l!_- zUd{Tcw@xzMF2h?k&g)3wk_yN7z_Vw7$=9#4(M8iYS{h4_2LIrYX8r zR}L8%eaVd!UoVrR_V$8!f^Q#=Xr3#2&{#$Ecw}AZNf4P&a;m*1CiFqcH? z9rP;?Url;!w|*pb9^agl{oY;-+1lJKxyUXiX&y`QT2NjfM$X+I(i-bFYUDbX5Jz3R zE<8T2nK^e~j9mR|Ia)%@{3zSVK z&@VUbTqnAk16EjN_Mck%xE1Qc>4EX3JD0z|BVLNnWoRgdXU0KLr}= zPTn09VyZHuDb}7}^9Et2!r2!yvo{MXKa|;~YW~&;nz9i8(4(h|Epf|NTLrT3oCdA_ zE)CA38dq8MpA1Rx;f%+uz^6V_C$DnNgR8TcZLoCbN#|cfx6C`OU5E2G9~FmF9GV#9 zf$_BP8Eq2XsQskCli9dtfxl!~Hl1sZi;rI-m)oMA9PG%@%%0qm{Gi9G zZZ71#x)XpMi)uah`n}8MqTR$upfgW;7WkV_1IN`ZI}lV8%+O#3_VYvLh>!%iZH(VS z(zeYFd|G87`iNmYWYmFbRisE5mYi$-xkz&_U+N~sI{_U#Ag`ytKgW9z=|O<3#ailH zBx~y#9TnjZTK&-h*Q)o&X4<-1S*XfOq43!=rG0q{JE1v5eQkp-Hve6+&K{1GojsOt z{L0;d#bF7=Qnhl*1@O1z1%?&=cdg72Gp(BIN*OzE-?r~-vuVxaew7OTq^8OS6;X#41JmPc!CsFhnDM-t%CE9wVs{Ww>Eu~B$W3|c7ebZzrS5pJub{KYZHIR zHGgihCY^sd&xEL#y)~or=7-6lCrsY6{*YYDwqz*!zaO)za(&J7!(+88*l3U)mou(a z+`#B6z==W48MS<}Ly#DX1V9tX zssGtgCs`f~JTWzUo98MfQ#}vuNVc{AuY%R(Cj_(F4w=G&J9bZ}^UVLRVV^fJh0trB zae0s}h^_BGO(bfijUG!nE}Sn<9#~kqR6TR_IJAgXFMpF6@G}!w=dTj%ea8|`TnUpW z+syh;4e4LkE7%$_aKk`#wo28G;|J=ymGfG;+N$iYh&-CPk)%V& zA5b$|`~O1`LdU}FrIa#et{1yj%`OKIxZ5IBb_OtZT;P9JqF_`|!jf1s{ChJu3NobB z8~^FFp-$ha<(g*F@jG@GB*-O}`qs^~;NAiYbz02Gji?KdpOsDIzfTxEPjv(_+99R| z$rBZcj}>-vZSI^YGap<+t*or5MMA*`L2UooX%e_f+&2>!$MSEtl~pRO>7+7V z$;1D=;7g4x0ur^VFGVpTnTn-JhE92wxRNW&+WdE+gQRujKg$rsa7-S3pxW-Ib|X1IdmY2c@r^900rE=}!k;?a>_0m%P z?>NW6%GTEJ8McuuR4s2#y0^sMx^BV?n}^$h-RooZADWw$V+L;%&-1r5;n7ymmjWqJ z%Ad6!!S4jk>g@Z^nvU(g&YCcCQY8+FnI;D-eBGP`ANi?uuPCa95@BrhLwy-HXbv1J%x{O=-Yn=ARJAWK<|XtA8Z!t?W?%s2W{%@4zyd zdn`;^F85r;ekvy;pZz>+3KAW<=~;TxJ=PK9mEYC7CAIV%V+8kF%MRnb>)-*U&ZEAuq+ z4eo>MM>@1yrLxyH7GbZx9|1tdnEUf$0P8me=aDX{Aw!3nQG)o+>+nSgJ78wtF1~-} zLg;=UEir>_c9LG`{dhVFxf*q__a{59X zS$dfUmJlx4%>qB=GJuaxybSfcg)N&qDotG~4FBNWzb@4LUgQqhi#U{K^cT;;hP{13 z$4I53vgE~xijbieut9%m&u!G3)b_I#OFap#qQmVvzG|!?S#T@`ocfBIX)s; z5|J5ZdxU`JGoo^__$uP(#@dJ44bSQ>qjFnCT@tjZ8HL4fZ}jmWj%yP8L$L6S9;p=Hb4 zb4qX#6X&sF-E7G9$tbslzrM}6xtDAH+bdsJU}Po_z)jnTgT3w98H1Plb)nOoc^(9% zojdHWjA*oRNk%gf7?`L#(u7hAE(11^2Ke%$VLpA)^uy7Up%tol0XbI8pewxrDQVS6`6^ki7=^PA( zR&}fG2+Btv=5fa|5mB;ozW^n(GOsyB#I8mqdJk2HCxwE&vccTaaYThXJ$u6$VY){% z{64-5ngiL3%t;@V98Awh^7XN}UbvyC&nrdf<6g3Jc8bhDlM_wr4)t6y$E?Z+vV zio9!xU8g540k?cRp6InUopaVuC9AMdog%yRh8y|tQ#6)FOZIO0Sai)AHQ>_K$1Ee~ zF;)c@wvyH+oG%D`sT8~hvK zu3deSbW(4R&|*)A?AlH`2^U|~d_7S4{`Lk61RAW|y%{h1sL$EZ8nEukIPd4sN?o*# zQ13h#%+>!)+r;N2^2Br#+SckR=gP@<0*&|Jibxt7gGtL-{xhnoQ8TG($>B0yV9V*T z3V2`HlDcT?<(_`DMEjl%s3cdmXIK@z9)O(+k(|9`9ee`jsT#9REjUfQcKv#0aozk! zP3dBt%}OGn!0KyV#Y)XSB(Xo~5~sh;)8_J7q}-qk#nXn+etqKoYnprWdzm{OMi~tx zt_syLX^QLzls82M7)ws-9V{Edn0;P7QC7WU`*!P_Y54{CzYE8bGzP(?fC!iboS(b| z&w`1HI|Fy6*Dvuw&K5JL+qASNVm7@w`@J?A<;lC(y|^6ezV>?5n=0ll2EsNZkUExm zESfh=GrVaLz3!w};U8LBE)RG%3eu=TUb!tT>q)q>=>mSIACiN2Y4LJBv)&U&=o^|b zy4Q4^iC8k8EL16F*MCKMts&uQOU;TbhTS1c9~FQl8Z^#&8639 z@%&4<0IRduO4X}Rn8|8?&=xzD_g6ML&)KN2aJcp2j8pOt4$TIv<2*TIpvWnmQ29M4 zoUywbL?(S*z0s>jmseJfSGY`Fo}_u^G&jlmYZ&;+j)W6#mi99r_^Rn+G;$OrP_B z@f7%)%3@n%5L|&#JlC7S%K`$cjK71-6C{GI7_B2Tr1~n`yr=N%W;!335Nrv4h|Svq6+lMU6+OyQb+L zp^o9|zKIG)Y?9b4I&Wj~=XWJab=~sP(v+Py_HKsvq%|w^5F`_vz+!G`Xk>ixW$xBL zu|8Ms`+Cm7O)5G>Vu6d+<2HC#-BBCI2n)*I^wL%(jmq?O4QRJJ`r4c54@hqx>WUs8 zFTnlXZxOx>!StdCu+{kE19>z#N=@jCJzcygh6LaF;n1)&Z34bC^fi68R-6sw_cxeGN(ZsYI5DJoAmYugruDsu)+oZe~Bn_>{n%VPYT z{^rf^B+`|d@1%24C1L}Guxdbj1c){e(80id5jnglUu;TDGaa$Wk{8dXlR9a&f~Awe zto(s8vT%22%j)3x>&)e^Z_jWg0Kz;;n(PSh(}idWqvXiVlfQoXc&oAEfWK~QL$FFf zOS%1|TABF4W8m*TYVn=&6)N0F0lS?1e0i8SDJUH8I#Y~a#u-x|WCF)Tdr9Dl6G%dV z0A|fZWjq+WLF3@X`=kuGwbE(xt=<_CGSr>Oku_Ny*!*u1oz_^YBXI&qHY&~HT%)f? z(#KHai0*g^i-5|7>J9)gRIZp!%`I)ukoCHUiygT^TZH9ZrcDFh%DQh?2cBOq@1#9f z_|l`6BnkjjyEX4C%VD2@gRej+kqKe9~pNxR91X6EJtO1 zFoo7dB|@=77Bh(DWom78qI1K%)l&h26(-h&+v|;U_hrd`DwYWAToe-ISrBh5C`j~3 zsat<&>T3UsN<&N76q|u~v_H%4Q~z~eH15FHJ1^Buug=q0c$>=~Jek*i4K2CD?Wt1) zWB$d>S8G0W3J2~av(%i~*Lg)|@h_vI8kQ{+W;w70(()0>#k(P?oGJTb{( ziIm4ud&+u2$Q^&dIF{T<4p}9*V6-* z+FvXwJmaNZ^OgphRc}n%RuiX?^5tv)rkvOAYpN2fzlIQdNi+4E56>LFK#tWpaD%j% z1a@RcS9iBov9w;UY4)A?QuAOaY(cljF$qKYIk@2k$8|?&3Uzpd-0-X;YDldpx=)1F zvIbXow)LcgJRB#G%j!uN#jgSNZMG8-m+(rN%E*OI zma+K*T$$w~gOteye$*WpPtm4KuXhr!MP-C1h@}tBE87@9fVFW33HkZNEcsz&~8Qg<;cv$h6VUBJ(y0-W$qt+6<)5mV$BGR)r*Ro{Lt?TXkdH(sk1pd}T{p_MWE?^CejExsxxMu6+;sAF$ zhFlqoi6J$M0gl|7Bn#U=&P;|8VD9tj75VS3S}*S2cD8W63%^)XGVo|l=y2l$!|0M8 zcYZqg)pJ=ft`zO7{7V*u*}pu08)WiLRXVKYwB7D)|8OCjL=55f zeRn&&^*`}nak7jrhY>!o5Uy+L`Sa~!2(58|iBK1bPr9;n4dKACVdTf<{J6~$wYIjr zvzA%rv1@I+TDv0irkLH+c%`nr_9+rTU6inU`n5t_x6khDdYPfTl&Vp_1ETFzqKLAk z*M@dMP#c|D`piZ4GwUs7vbv7iX(a@!=O<52vHIUE22s)=^j(}pwJA0Hz~i|n(Dh0o z3aR+#+?joI++LsdBrw2<*~2EOwtdq^)&IO5UTBJtQ7hI)$Wl8}E-NeIW=oI0Boe=kMW0CEE1f7`Tw^-xSW0CP7 z*SFWG6db=|3&S{EuTe1_h+3w}uh-9p?4NhX&>CW7(m=x+`u7nDv~Leo?^)`Xf_QL+ zua*EyzDA&HB)AWQ1X61%rmja+xTuG?z|Q>cKCYc4VIqXBkOC>H+(a#FI@MxcAFXEb z&so8AWL&Q&CUkmt0Y-Oz9^5CF%z1kA*XF>1DAv-MoRP;FCD-c2et4JeU@{YkZ*LdC z+qO3xl^7OvAF*Qp>P_05cwU(bR@r@``4GkumFtJuFk6-2VDg!NjxD@v6G7ALkXfs^ z6JzSE1fmaE?IyFZCb`<0;$^?C=8>i(2iKmvdw49)ieBp^{ZwS;);ow@@3J%RbB1W_ zj93mrOET=14n|ysv-Fx+<4As1i6sces>p9P?tNWc1E|ye-DGSiBj*$VM7uBM>H-s% zb<6a-t3~9#mG-+T8%d8^;|w+Gd7nJ7y{GQj@j0>n;I5PKQOcbu5QU}vKT%i*nb;0( zY)8zjN^#3h zJ|N%S_vb7=)#?4P(cv_4dN=>EeHY(P?ZJ^Ncs2~QjXqA$$=-H2*Kb6E%DuU|asf9V&++KANoVhbP!ZP}p6i$i@88cqN>y|VVx zbbr9E`P98CrJHueA%mq3CJ+$GN0sXb$g0w@TV_ti#A9Z#um+z0rE)I)s?(%J4C$@n zAw6~VKwO?lw)cQ@IWE^2_Dm4uGSl>)V&NszLpf~Q#VV<}FDO8FJA37$tFdj+LFCXa zg25>*%!o1XMV(V~J@^xsg$td&n#mbAC+XuLbMjVE6uCrr)e?LNOO?Z>IVWW#5jHAP z_gdDuiCs2PWf*%|ML+qvhA+Kp_0|(3xJEq8Uq9a6D&V09{*`<{XwWA18hv>-^w#ld zA1*CaIxkRYqmbKmPIf2pnyBbxWQ43ydm3ZIKv6G(HJ21J=d5Hff z?_aghOh6*n*I6qA#4&B{D86EX1)xA;Y>kCal4?aOS%ND}MbAufkGdGtyg_S2^)6M61z@%!kN2n0n3(K@@0BzFCp&cE02`8XI7 zAi(yQX{5{-{U@~@gfEc{(~=fD)zV7CLB)H*m-cHn0aeTGaX(aM<%_8|{U8E?s3%gM zv`qK(!b7E(T3j}gK;ocALUww(5{%x!E-{(L*S^<|bN{YwR+%V$O*=a%5Y4#6rcpb6 zR%z`SW;HX6K6Jy(o9kKC1}m(Ov}^@XGo8B$6jLt8CO;j0{q?|uLC8YO=FV&s zHVmLxRX{cg955Yc7Yx1*royhZ#EGW;r}OzPb^jFN4O=SME)tLG^^|;FL---jt&Ce; z32P6eK}VdBueiG~ADWaE>bxC=7er^lu!A3>a z^j|Bn*2QRSJ|udKu=bF+BwO|1KeK1+esU02JJk}L=N_`dFBJ%ZF3$6{D01<72=%Cg ze}RVyJBkOc2QJhAdz`!ON`Z|r3QN_)83-T#xnAa&Rj`HM1&_(4yS_LGPD9r1!$K2_ z6PW{nVpm*&fh{`sDXK0JREVtrzADzwz$h{buF4y3)a@aGm?Euf#~V-f+56dy&Ci8i z1=SdZtuIFoxJ~m^0dOQ>+NCLcC!`=v8dvi{2TBoy66sW}yE%#?jjVCqP&9f=-fRGQ z`A55j8yrNb=MMi%J$2%A@%KH$!|qGo3!^(H_NCfbUO%4TQoD)E6f+uax)0hj+XKZb zio0$i3-Y*X+q`*@si__}Lee&+)*s_yMU;0>m%AuY{-|zDnY;LP6o8kNg_K+8Rl~-G zG0#q21VII}US2jzE8qZCjY6^DZ@&+EJtK76xC|KQ<0e7Ah^wtu-=SEva&ke$quWV( z`Tu6>&Z^eN-)ooRYtzq{9>ms4xe01J5r98c@2Msj-)$Lae1^dA;@sy}o0DG(gu*mU zf!sP8;Jk4pyLt}q!SX@Fu;sr)%xca8E-2Gy;d>`V_5pHO5T3M^GUo9%Ft*waqln9Vy-egL4= z#}$*D>c_krIX1ghYa0sc7*Rmb+xD6N3L?dxs^`_RI{*ML=aT7#W9{s)jfaG8twX)e zuRn_ID*EIxF}_z!8lwjDtPNR+d=@DP9()UckXjFt#AnQr^Vx&-Q!iZb80N>cB|R=! zGTc-ozO-m^O?KlI?OTs56*2eEnpHh_d6Wq>dq$~xERrGt5*4j0wid4S?#Afr>t__U ztS@|CS#}pdnzd4Ci{7Rj4uqP#HydkH%3KBXrU$vq;L)FI`!hcS7v0oSheitrcB+>H zvXxyp9vD@DThNE$dj@6n!Q`7xCW#>9WGMC8jd`rU`(!fH0Z44;d0R&fm`Zi&RTCrwo zl(9m{{MdP7L*@_|nARRBJXAw+Y{#p!M+T5&U&9e7@eQ!B-8^CH@Tz3cHXp>^rUT2Y zcuB6{43|5|BT?i$@cM-{?v;WBu@BaTGmcteG5#}0Cb<7R&HVkapR;&aUe>htQut0l z%Iy2Pu!$zQ5zO5mFNuPxW)A^qNyp#9kTyJ-^fQOO1JPA1Hi{?-tR8U(p^;1d`-P&4 z2tWW_NDQ{^D-CTZ8d${s;5rBNsHF~|n zf-Vv;(A#?ZVOZ97o7s;b5h#lbiI3>14s?93wv*8olbL4+QwB}v6cr$}1f!VsU#-!1 z3Sr6CIE<3{)e%K=z3k ztkKdt8cl-Bp~{Q)%OkY2U%XHyMeR?+K2wFGLK3z9%ZJ=iX=#eJo};Td`5bvzJwZW1 z-Wjk)xlSD&*;~f98L84DQRpy(Ga5pEk9_?Qq^#)fyr|t^iXWMunAy#fT*~9=)7vMx zw65M*{BZ12aWUcor+*zBq#b|yGY1IGuJO6W-%I-HNMk&I0YSp~Y}pm35^eh2m%H!_ zHEPA?Lpp+wbMXy=zU0%Yn?@x@Fb_)0zEvq+=+yhv2Szf#g#!^>cM#qXd7R6$suIeE zkX`vVY`e5v!Sq1%Be}a@a`+Q~h&!9xx*mW%_!lRWXZ^-ndnI$9~7#$_e*q{8L_j<#?ej_f3TEXFJAtDl03>yt#E4F4$@q( z&tMBrXjp3@eIDb?zmXyT-B$6r3s>7a+|zY%xcTX!$toMmi4^_ohs4SCVx<$`K@yQH zFaRI_$t+Et54`)0K{{gPFx{>AkFDo#b4QovO>p8v^e`dt=%>2N5Lp&>`(K!ru$92( zPZf+>_=ukD8<*~ot6leqD4GnY7t8s-01P(KXlx2-Dp((L2*mqPfF3yoaUwH^{{=~a z=|2a!2bC^nK%D^{4QgPtwEEwc5+U3Wg8^pY3%*Z30(+uttFhrl9FSc5+~a4gO%#s9 zg8+5_NRpzC;|BzL-K}RpT4>15U(}%?i9QN+c~QePPg zzBaoOIwa>yRC#_B+LYsXM^(=q-RJim_y*DvJ!aho97wXfs{2parn7{|YVaYKc7UX< zxG#UVHIvz@6haV05wjrMFYK5<)b}7-quV7V&&^Y*3yOlT`XLG&6(jYK#>hw9ynTW` zc{G9ERk+l~5*j1&5oht2XEE^>DnJcA#DEJybV_3*$w)JonZn0$dEN_x;P`1H^M8C! zY?V@uArJn;B}M5h9C?d`lql%x)yJ5N5rgl2&Xtk-Fa-M&tPF4`#Be0!+I{ zx#absVR6jN&RUL>Czrl2wtP~40;W;*<__(Y=|{*5m_+SAu^=(joG7hs=}8TgpegbQ zOlCY;_rf}NKk$Im5{aSJ5nzq{l$}S5-*9cKo|>HvJBM(gOsprFCgWk=in6q!vVFV! zOew{9Q#@~s=|}7)od=}pCU4A?4t_G;bc-i!R;In45Ba;7eC{64ipUpal}y4-@^dnr zt2Jk`aXW)pHD!u*Alh4Tn2^sy{X9#jBtZQu_qU_d%M4+w>%^rhBxPdm{UKNU=E$xD zTE6B5&O^*)HIR=fLzWt5iy7NxQ{469g`=0lh9+y{vLsxibV zL;>P*au$bwL=-)&-iI76(#$R`6|-KCA6$*|^7=}(di*%EP6mKxJH}#6b2?<{^*Qq@ zJRbLxHiu&Xbfa`I`h$r}kCND+E9STm;XIiTCu)u8XfD z&TmBm!NCRrex#Vz)c^^}!cC=(!X#>u%-TCmeNS05C5{)Ja0=Bgjv=yLhahrCE5G*#3Y8fpZFIqy% zE1#G~CF*t|Tj^gZMFY-#kAh9+7GYN3Yl3;DvCpz|m&#fb6U8=`u0r-PbU-KM*xM>P zz9N-?c|4|UrN+>y`M^9(pHGz?3q}%+2jAk2*E60q9NDvDX~xd$thE5=A=0<~izN1@ zPZ{rX&}ekUyx->9xLD&gSKD{qzO)V{BLZoMZ@E0bwXka5* z8+2?Xb?L)^%3)h>Q@pvc7TmC5=e>3sm>{xq@=2TX%&)!=g(uosS#_rPalaR z7Wwb4*LkI@c36mD{7fqB4GDlo>S$57e(;-|0UZbnK;9)_qaF|Da{D2vV&e@DA|OV? z4B^t!827oaerl$0aQj&^N8`a0e@qAf^X)&j7o^IlSySE$9lmlNahN=589f#}lV3ZV zX7rt)z5-H(jJCChMh|$E+bq@qTdqC>r?<6=a-#2m=B$xgr2PSW;FE6#Y{vxGk>HB_ zor}a!tAqQG3)FFV3{}Udd3lXDy>o-l%-C3T{Z;dsbRxFg=4aEiAR45_4rWpMq+`4y zALMzzo15~}3)rA9QK@LO7Qq0yVI;ihKhp(}l%X z=)s-7Umeu`U8k&ueb{e%>g1e9!#ZggeMJtv4;~3 z938a{84?uK4af_jqjtDece0ru{On@{xik$6AB_h~FL!o;C1%l-c_)VJl_(x14jPqR zv3rVZGW_onv0fk;d=v5i9ZnJic9L<0YkWn%BpIz9G7{9V;eS)XrQcqku=?%QesxoL zPr>F`FsnO^(K+<3%HY8(wHrhAHymuxjC2^Dv0xCq9<%SnN}OjT=p0G zA%Ja1x-1#9Q~{tlzrOAU_T)aBm;&p6*;!WgKGB$Kt*T49WsG=p#-^G3&dh(qYeQ2= z%g)YDmtqT8qNexC;tR?lnTe`!oa;o2U$OHHI5yjvrIK@c{|?Q^YN4|@62ukjQaqf& zr*i3#|1nj`*czBNn>k>ZN5L($DSVdmO&gG_nTT~&{%Y&mk#VPEV~woubgR}Hp^YCEtGxqh9Ooc*G1iCne@A#SV# zC=^OFNrLX^zB;sdyu!O(m9K%g$ZA4Nl{HDtNCG!?d3~F&jWUJ~*;dig{g|hEDTQwr z7i9btHg&Z&k;}!9F)EX(ftT9?g)osWWUwP}94PE3*v7D>5qMbz6dH8+n+hwl^kK-{ zUvyw1oM7SEG-yNQVP?rYLyJL{qjtzkZ~N{~KLD-&PAehEX4D9R4c^ix#I_Rg9)!ib z3K38xIr=>Ea4V3xdtFS_vov9vixkvBR@z}x=naCyFc+_{@vHfA73E0z}y;N9CaEX2Hc=@SZFLF zY5k=h$}qd}GWKDen^5J_y|3`6!6FU=Dc%n)g?ICKCbw+XGyAw$&N-g2<;LN^x@8J z&yPsUBBqX+P-7ZJU1r}Ok%l(iRtdU3vRHp3F?DhJ7XE?`bdDlJPnm|G-XmULuAES~ z^X^J|*4nD44042I32rgi0M|s;DY!~bf5zCNhumi>7ByJ&AVqnrWL_RQE<01t%iy>6 zFHV{MLw3g>L2nYuAvrCom6*Ls^W#}@9zfJ$A?|k>4lHynVA+$Q4s9`1WgE=$w*dVA zaFzJ<;XyygRO#O|xN=zb(G}G@2@<-pQe;l#Y+(jz0ek;bye(RZL(GydEqj`>g|~srD>KpS(K}P*m~O5~sYZ#- z2~S&E(Gzf*IDnRs*K3DGB7Xg|#?N*j4}=dDq*e zgI<=n?$8#=jE4wllK_A%>SnaX6Ed#{^e?>@Tpj|{*-junyPmm>s?7$9baBz`yTS(R z`~O`hvw|yn00~t#zs`VX3m-r7ga7|g_10lkc1`>6Mg*jkk}gF;QbM}(rX-av0V(Nj zkd~5eP`bNQT0rUU?%H&2zO}ud_j!Kb{zH!gF7{QkX3jb1oLPQA%zCyn#^HHWt(ow@ zcoD`B4s1i^~fhj_Ij*2Ww0?k}9ZhmRhPdo>gO3u?i1H`-}+ zhlrxCe*sghHGq1rb}}9s<+oC`=GOEd9H1HJr+RmVxp3t9pHEgdS}ax<`+uf+(NTyr z#}1TTg?e4yqFYp6>XkLi2;D%h-_DTy-ycBokr<}Iqq87wh!8-Vfd6>oMR3B(my8GH zDQ)+Ke2^3_l}$OfIS=L^{x5AAPks&>RMK&eitMPtpTPIL+PK=RYb|Ozf?ekCJDxJt z?d~mI)oM?X#ohn+Ts{>Y|1zKdc8C~)%Oj0g+dkFf7Xum%@%NVvr-Mz7n;IqqwyA}O z|BHZO61i3~U|@v0bsWQArz3?`=3~lHI40=YsO#nG`hK$Q2!?V7gnJsmY?~j_FPn?# z|IX?B_tb^~@0S?kY;0m>rQp6c3^7J9`0|gnN6E4a*v99b;5n{ljk%-5rTbM|@X@ZEF<5Ns^Wl^giIy{?cwp`zbEnu`QyI}PYj*6Yh9f5oUqCo8l=734tLGt;q@$xx$GmLMAPHD zW#EPSuc0rxpZ<9cm#-=VIH2LqfBKuvbAK)GHR)4=X78T}w|lEXI{Ctsij#2i;or~C zdMu2%aqOWTONxJoD4c-Y#VBkf(#s`c(S6(#fdPLJFDQ%)VPoo+N_KPt`tmIc60XL9A$S!QWAQs<$6-;_8OOE(CbQ*Ad5PX*SO zzg$wdZMX4)F#$lSQ9h{y>u0#x?#lyG;Hu?&c*sf6bE^>jFq4d=!5xu2|Je!Mv|yP1pg9vPt! zd`H6h`B&3JiM6*viAvsXFx6tx+g7u&Ph{S!eZbD&w>uIr&&zl>?Xo0umekNY{%@VF zNr0i4E_#!W9K;iPWp`SW(@7>C|IQyU|C(hM^u`;;e}7QOz+v1U+w2aeX#d~Jbt`UZ z(Vy#ft(lMh8k|G5!xq4RIjg#i)R?ELSbrhYN3vfzW-g%92> ztIB`V(NLh90n1_!s9%bJIGjRYN0mtrCe!W+QkfEqvIZIZ&EEx1egFN&pY{40f92D9 zBRt@T!X+R=v>!GdI0&t-Y z{eQpejg|V}n&f|mNWrg79EH5R4R(CH1P1P{|6Rp^BD?-FB%d-_Xi*9)!e`c2-$47{ zn}T+qOn@dM95?~-lY1FBg0((usb&>|yM2$e^SCP6ZQLRpMeSaK+umQ!@ zGAodcv}7AO4|*@Ssf06h7@dsDvh0mVX2iD&!s-njCzJF_4J3q(NnsIG6Jujk(wfz# zQKdjpLagQ=vc6yDDfSGu_2cXuN$5W0sleH{!o%zEGEe!kwu{2BsAlpq^6MkN_Y2k> zo~tn#lb~UM(rmS*4*K$RNs4-Blca1amB-#(U1`JP2xV(`knc!FPa*q~GaY*SMYCaJ zQtLcO=#JGB&e?vPf1QT*T$qtzPN}eemDvf zFMJ3OjJR;Joc=anrHFD2{XDSAv@^6N?ryy%ao83)TdUG(PG3}&W!TYL2Mt>y7?-JM zDGn#$$}OY9ZoE(xJKSn$a{uU&Mikmpxu^zwCuR|X&xpx2N%rxuy*8I1Z#UdRjF(Mk zv9H$6D5l_0ROE;Y$X@!}bV~tYV~hu%a6_mEx-r%i_zNgt+q5;zNQqeKUN=OZN4Hz! zjbVj}zm6~=ulj6B;R@lK5d|;JJ!KzMi$Ak9jqA}udvR*IC62ElKBOPM13FpiKVuB& zo{2PL-}GykY#UPWQCsulq3wJfV3`0W$a*6I9%vXY9Ilf&92?yHs-WGz@t#-Tv-7b% z=r1arGzg;j@r?W)TgP=`qJ}vyljg)7(Z{Rpp_9UKx!roomNqq8%c`Mfasz@pI0|}h zs=*~mk(~?PuXG3%RuxrEg4R|$moME4q&9Jc|ISxEvEi^J@;Yug$}cLCg=em>USmDk zu9Rh&6ttdesttf&ku6BI(tt2g2h8_l-TIPoFTN$wn$eohW-K#e0)s}9oZXOEt5y{! zC;d9ItgPS3-P@RUx^cTX+j(1zOqf#IdZSsQQB^x>3|Z^AU3w5CbDEwToBGk%m^s9M zGi|8Z=wLQse&c;{$lDlFjEQ&^Q(eHIoL%44Bo^A##C%(UzF*l?KhUwt$Y>SHba?nQ zU{#lN_G3&;WA?mUmxJ@uM$xWYo*}_>8%CS8ZnydC6^aG1 z-}({_{e!`WtyGRA`0^-Fe!ARN#Z3XRf)$k(Z{3ckCp;sOey_y?s$Ezd1V1pC?b&Nz zXYnLyX4<^7^hem(o>Ild#ro7Qt|Gwi2ykWHrSDZoR=y=^khpS+!#{lqW{A*7j~*@W z?8GgOVWB>IHe_S}^8fwx=dVwWGRvq)28j#`^TU7B|1+^I>F??O@1N0t`F;^)A!CPp zTUt^0*T#xsbW#1k-;(L@qRtMYdUN|at20cH0RF4Y*k9E-X7GCkNIiE=@tWpbeSss%BBaU@c0B0NNIiKXk;fjJp{db3S#nX_Xf$DUGMSr?%Q6{&>(+^|L`l0kDxz}2~kar zU_4(}evk9x$B)CgmQo()4``6`>guk(H7R`q1A}92uUkXB`T0@=$nQUYZ11*TOixcQ zZw#nyPvm6`m+AXHnr^XZYTt_t4i*pnV2Oo~f9a>P(H~dtwqfTtl_hUu^X6R!PpHLI z>Du)v!SOBeCHL&?Y^E^mE+4R3nzf%JM3K;Q`!7Z<-jS0ljCe0U>#&PFTsZDMqVnHJ zOe9R@^F}ZkOz(`LCBNFed`^=~^DB*kpir$WFoJB3_BtIrrEVy0p3TmvF~2wL5rQwm z8+LZTsw(zEHBie-Z zp6^bIG&xxsSX<}WlPok|c4#RmD9z<52zETcV6c28u!1Y(b#&fXY+|JCMTCU3U!xP) zUY|U7apCVa(bE%`lB zLb0*2O-Bk#%FApWY`QA4Pz=BeJJv>ixWXmp_jm#+uc_&VW(Dbg`V_yOn82d9($%L@ z?|w<%ywoD5sE8#eFCQhK#TiSdM0&nAAvTuF4Bjz^i(p8L%Qa5R?HNHl%GpuS520sK z98N2l-O~*gT#)ZpX}nkNBOcOg5u^fvMBalq@s~#nm?m4z9Vgyeb!!>2WxE!hUf&T(MUn^IhLgCQZZduO z^5wfC-8WiiE7f9kgoD`{_(Q?awf?xY=BZMkTJO2VJebkugYt}g_5SwR6ZB_(qCbR7 zwHp+{E&?28<5=f=Q?irpj1^hE5r#KmNgXG@h4QjARMeymgYGymoR2`)B?jp*h0w#9 zkn|c%_wHHk(KITgysD}b*tPhjaep-tx9w_nxrhFe)%u?lHA4Z&aI2V!$K4q!WO;qv zpDO4g)Qan(qNwhYkCfNrah=r?{-m{)RRq85$#=~Odegbww=(gJQTyk40Y86I0;9q| zJmflF-C(%7zJ5VZkG8qFY15yCngAf*LDB4Q}JB{T53{C)JAm zJXp64Z7q2^+R5N?&+1^Wz1%;))HgN@xLb-)(W*9$0BD1_THf*{71cwDBCfW1n0Ss!T%l+@UnmwR6 zUV3e!1*#qG?d08GpNqA)IgVu88q(pR`ArrLZk?K>^0_~~JX{FMOQ3y(=m&vZTsYCG z=3{~WL}axD8XFs%Z_R^#K~D{?PvSaG{Gn^Z`AVG}Eqc4Ut!@E7#DdTVfU$HR8;AvL zfUO=3ZZF6(Szo+(k-5Q|)hqgABXPW|>v3-+nRJ|MU{KInM?k1elM`l{ZtE9sVF-j$ z>yFj(-py38O;Ao=g<9F{~dsDP}KaiUYrFR1B zTRu1lUtZQ1rV*?CJfm1|^8z?bGWleV!0>SS%E_ahod7VPcX_2#%H?52K=g|kBnbl$ z>2%ulSins^O`r)ku&_v3y%iNF@|*7`u2d&d&6So~>y|`DeMm`6{O)24wf$u7QT8`X z$e<#xVjJ7izRQqukdv$IN&dBAIx$ZjXCiL4(i!yZ%Ho2bRL~BOK5jFT#CowgAZ6|? zcoIc4xzn0F1$&A+;x@9O`VJr|uTP%#-U z)gkG#M_7G?^puSEN!i5Xuidq?WtJnh2ET# z7&H_VRpahSqoSg=S8gy=n4Nk*!JPOoyF!&N;2tq%GWcfkOhrc+Oj8A zMb)8tTiirZvHbV}FvQTU;+f;Kvr)pWogJi060Qo5Zu+zR5wfw|cQ{BEk`fXI;0o1i z+~6LCqo>VtFQiCqq1<5x4TE@^!mu}Nlq3w$ljJc2YNe|~N!}|vVUwKF0k*bEEnDF_ z@BsiL(}UB^KU(!m^&#OYwckynUILaiK6{8rki`~QYws0m40QM0qNJ|P^%Q@qw8`+k zjYO&0h4ptTD`t&_1+sb0dOe+Bz9fOS_d~rfG_47n=y}e}%Dp>3^!O(fmzH&}tig1# z_%%%!g`a2u8g;{>%MXLqq5Nso?Ae9@=e(rH=D^T-G+wQEISQU%OpwM;LSl z((HBQxqvY7D}g1Wyv2TN&~P`lFFFGCT^c{U#RL%|=nV_o8q)hN9MU?6@DkL`A6s{kT^_Z=H!1Q;xW0l?kqdc+0mn$`4ZBO^H+y70o*$KI=>^*l z%^8SanXXuq7JQ&pNb9&mLLaF#M!!25uvxdWV{_56UTW=LrG8jm?UvQNyoX*M{ff#; z_jCxH< zd(TXiK^#I}H5N@^*6A5up{hnkH>IA8 znlOPG+Z=z}7WX>R6%em`Mm(+eqzlm}Jf)7%1Lx!IMOw!Lh!Cb@jd3DtxTnW1U)vvU zHB7KnKGMgb0g%)S;B|#vxAJ&do`8zfr<54wg05;J_6pmzPttR9wVo)tZC>F_DO_;S zpW)$g+`0V1`nd%A$(;$S8K6ktQF_7;lrut0r= z&-sXz8_W7g*S05HSHOLH8?{)s>M4jnQ*Nt@DPZ;gPP`^~mnP`<*5X4)`{LsFhVGa? zBh%6BsB-TX=LZDf)eTG%96p8jMrH&r#zaL$al0QjXHyn3sNp`s)Jf)eH`zSavCwpR zy!P#fn}Sg7X!v+G!~@VaY=M)8{M=wrdlk;-x?8<{e+kx0v)4Vc#8vf1_Y!%3oA znO>IKk(YX#Q(XJ4Gv%HDOVCrY_TVKc8Ca?tbd}oe;xI_aL{4l;uqBKwughw&F+3v( z_R@7JSGmAub^Wz=y$fp9r$ON<=CtUV1%SW|_Uoa%h{6-yU0wPE-deV6n@q*(t#~t4 zv_dwOBKJ3D%~99%+w|?_5v#+r%^i;+ucqu>tMle>4Y@Q&BHZS1u_ml_%PnwKHcRfz@`^DBMR}=cA#a z?fNez?PeEL_J>r1VWg*ANr1=ypU?d++@T-Z{NyN5&)$ zyX0lomSF_Tav+|mH;vD^+;rs&9?}(#60*J-l14F12D!f+vNjX|&%x=C*eoe^qh1D_ zr{hs(W+NdXQS&{CWXl7=|KsrT11h!0$<{znJX1=R==I63cma~ktW4^!ZPg{Hq((z9+`ML1Pc<2$4E#kAQE$XtkW&F z%Ku8N`?z6F7e_BgC?vVX2`nPm3(-s1XZHC%i0Y;@l|1H?`4P>oCqGqx_$(0!!83gK zOERo}24o}@!>h8kmGO|QOx$^iP<)ZJ*_ve_NPsNwPFMio;3wkyxXJnGIgI5)F`fA& zp5Dk}vxdt0P{OmtqeTSByLA5WND85s3hDgOlMmoeM*1>Jb$Hu5I{j#5A)P^yXtYjXrM)p7j=VZ*lSek*>(94O zW^?4_w4OnOd>hy>ov(jE%w-<@==xO5>f<8-J4gjR9#4(4d1yPg`L+=}_)(xd6TKvF z3BX-a?$rb4`oO3Y5#@as|AHcBhyBya5++H&M)KRjEZa3nI&de&B_-ITcwthJ6oyBw z_wf51w(jhar&B8}?g^Q1Blsib;!>Y~a2b^a1;85OQ&NICS)!5S$UIYHRO@rwfk$wXg?YP0s?S^tQQADl&Rm~S^6&}L#2Af7pjG-Bj18v&47es zxJXTp-|bF(TsH@xeTzxF?oa~1oE+*$h=|bTb}^9aiMz;w=(_nw@3C;;N~hOkLpYc9 zA~2s99j#9x;JQZ|-^;3&={|3;-}o}$^;oafqaAp^>9z;TmsD$&#n;!K-N8$etINIu znUvdKpEG<1mebL!kRgZ&ayV{YUYW)v`ZyW9V6_?<<5>Fl$`(sJ_FIPC{S%p-w6wI< z7IVaL^dH1)_h+z(h(fpkq+Bl;%k*4vyd>G4vc_^cn2+E0%#@Ak0c-s8XU0;UrU(!) zX?Qk4!k=tO`)&ub%l&k-gf73UyZiWiP7-@wZ``IbyX}c;Gw^xB^IoR69}axGl?R3e zT&|w9++Ili^Upl2tFI5WM5{(TN9OrADygSkJzYO<7u-Q=h!1!sydKv!_n?fxr@g+O zO)+swo9^}2tgNh8OA4Jfhx4vV?iC*;Msgh)VwrW&oSdAVJVom{C1A0+`lZD0exbcx zXSii0F4g-Fvtx1i-|J4#%OhxRS$g3O^N^0<0nS!(4i2S0Z!1Vg*f%-pOcM-j*l}3B zx;JXYgJZt46VWok`{m1$&$L(xm<0tz=(|&8L3h`wFSuCS^CB~ro$h%fD1<_ek8PU0 z9}t8v$iIB-{+hdcFCS4}{^pG0*pKeX5XcKlndKGBbjj9-GAID70L=f5x+O6wi|(HL3fQ-9eHT&n*D^7)=@vZ1OfUf{zC z!{K5J3gsbptAQVKzHS!p2@hZAZ#e{^wz7KX2SI?v=sh@JgZoYqLT6!*_h$v52w?_;+PV$wgYT~QoMZ6)w%rZGRhP~mvNHuHVatOb>R(+z=tbS5l zVu?jciV>NoV0*GI-3%x$aGW=c2iFhz=^K|6fOb2sP;n(R#7c^bmsdw0zb{htRVl6C zn%IhYb~xV>3NRh&644hwKj+!&G>KK+e^=S*{}d@3K(f_4MkJ# zESuoU{3+{}-Z0$z?@ji%-kJjp-M8m; zQQS7m-^=%x^&=bXVWP5RLc2XCC@JjDt)_e=T*YEBJ>k_6L;{~koepQI7}d&jF$WTu zL=LqZsxL0VN~}9<5%+z@5dV-BC4V^lgNhKgXARz4RNLB=Uf@n+(Mu4HLt^=Hz zmCEmnKD1{dopMxu?7lteewHN}+1+qT;9slVV7KzSV2xKcY{B~&%W}>UFCGPx)W=MP z*6bif*PdRHQmDCkwNmpvpcK&weoxTpky=me)&SB(+hAsN6bF1ScBL>O?_z&H8rMSE zE>#m_nsp2D2i6Nlup}oIGxHFxU8B7LK>kplzt!vwQ*WOn_p9oOd?hk>C(DH9 zmahJ|GDf3x2Bl2y!BpPTsv|g8n#7Ju#A>(sJ46C~bN4qtHW^ts^#fz4kZc0FC0i1P zyVH^Ix%vB=2%?j*H>5&Qij4(Ioyh8Umye7Fa_`yiy9W}sXG`+(W4FAuI5S1=-7>u% zEEghBadFv52NMO65N|HWT=gb&nw-cM+%K@>2?jGlOLh1x&Ol;<ei!<88Fb8r&h`DlI^>`M+XK6t}ajAc44%GUb&w@=e-FBd%_ zw(a!Rx@HWtO!&{q{GMg3k#}Zz-C+alf{b-Zx;_9f&En!4b`||~ing^Nk;Z|LG(mfO zF@S{8VCok`AN|+|cB4~ob1ghH=ef>@EGVt?gbZi#91dnREPC`no^!zG^s#?@M^q6P z!kEZ~ve4+ry4~924iXp58tGqmJkEoRfIHGLdHD7XOSM!}g^D`|2*bHOZ1ke%h}o^a ze7i0)kL#aqv#yiOz;3&LF^i(t;vr(9udhko1ZJsbdiFAB9^p{S;Psvu%PLm-f3iWw zN+>Wn+qSK@f#UeoW2`_C{<%3!sbJJ<#W~$%!HW-l&h&MnC?U(G;-ls*_`uTum%CR# zj7}0qsKACLgS$fmzcs2PW~!Q;cETF$Kbif}1{TY7hAQYon=Um(ThPi9II@ zgn9s#+Y!DuS{a65Yy48H?trqk<9)lA_Y6JuEFu(0Y z!mBIlSnfY@3*=}jD)21a>mDVTtqRDWi2*nFB`xj3@Bu_O{rzdE%l&5f@P{f%%wo+N zQIk(@h6`ouZh+NxJNxGs$4rYmR~Q8sXCLc8eA&-NN7SRW8Vj{7w;J=lbU#il*xc6u zbOO|YPoF*|zVRZRt+UQMuLuYDaME(_ct~gfi-ZJSMMY)Ap6B!S&=s_|owx4t3W|$C z$o)@so5f5e5^!2Mr>jH&!2M3+qM#jb2cV`6 z%*+ZLe*pSNlX7iud4b&;jVdeFb#cgs?5(`_kiG^9^*Aq+S$DQ`3fBi zA8Kr4#u?HYJxHc=m{i9zi$!A_dE&1L<$Ue>QX7qD^RbMNDu+ge@ z_nXFW?9MSPxH9agur1LKP9~j^0v(1v?;SFKsX)}HPkl3%)TZa=437@Uw#S-GqKR}G zop$`aJl#WQFDUr4v$)_vN(n2yq=c!~@>anFiyX^Y^gi!}kojW;xeQhni-Fpo3l8?Q$ zOuT+g5K5_tef2u0=eq@QJm*j-Af9Hc5{=_|x=~i%epaMta<-Zx5=VguVP0du9cLQ| z2ns?Map@zXz{d}iO>j)WkSptbCHSQ5UE1t)n{&b-I0t}%y-T5+q5T@yH#c7^DG2@C zoXAK>EP%~O?n&!WGV9xc87G;=K-@X+pO=uJwDklM^ppaiKS1Q7-(DWbRNlpi{`d*P zoZ9w8WE~Fn|e#04>s! z0T6#>D<1#{?N75oFMVx?q2T)lu>`G$1_F-9stYs{r;%IKIS3$g;7vNuTAQd=8CVRaIP0SCqA#!-7 zF5mNF-ZhgkA&^e17Q?Q9j6|n3)j@a&R67GG`Ogi10N5K`nQop1^OAlS*qcpwJMDOx z-jbm9~-f=g%L2%82rn8={9V_Gj$*J+7p|%K%5hoH}^*6J>gOzwhh= z|FwW-ZZPBnxISE6ibF1|<+}j%=tErn`P(=R0CNm;W}TTEv?CqOBh0sk5>;lV#-PB}N&4*I#G0AY)?20xI$j zN0aZ>FHUdi`(Nb_?68|iBxT@a{O0gasH@8lvjSF8?ylF)<}2 zOX{*TvoF{_s|I8%`TZZ`q%xMg{t%wwlNpcIm-1O z=!*~^z#Y;Oc{uF5hzh%OB4aM^uD)cX0JHh#upqV?>GR`XRCQE%OkdZ)2Onn@r!afE zUE(3>y>e{+hE2HFdf#$IF(SSDI)>)E`2>A*?HC|0sx4B!nGFpcF+6>RT^x&-BuC@s zspHs0(=QpHc(YflaHLD8%l{%+R$%Va$8=p?PzA$}4?j=l?5QXM6|cex)TAmSHX?i$ zP0E6dpR1)7lC|}$!Kna?rQUTfez4WbYRaFo)8jgIBu}Bk-T~Oj ztGX;0A(ts-38Q5*&{=*Q|0U#rY*;Xmz(TP*E?v(pT%fwz5Fy;nZZh=Msz|#5$BP77 zG}#(r46qVzPb6-Q<-K)Eb_F!dv5l<=VCm2=>HtkLH*(XzwwwjDMQxxlj-b;%w{D9} z{ga#zCCOLkQ+m;aFD~YS^_1k9<}L;j%EUEJ#>u#C6dimMWn*YEgljD|CoZu3*J*-+-f`iJG#Y*%ch9%?^-;pX6Fjzm?KZrr31kWu|Z{aDe6qaN>F%1Yz}3#UC$;IbvJMAOO=) zh!6Beqz!M!P`NwZHF<>}Pc^AM3m2SCOiKD8?CZar05-_2zSx^6YT6d>05n3)g^Kgx zJd%=YuddrBhrY1TNJs^!xbH0VTpaKPJe;ogrDcY(!>LJQ64HxP1!-N@4E4ok*AY#o zs`rXEZba@%52F<`Te}&}mXgJw`hI-BKOSN8i%3)+5McW>uaglt$$%gnqx3rkKJPzWb%%D*+ct?_%pbFsFruQzLm+Ee*(NVVAJn7qu ztKT#Byj3CmZfEK)LvVhIbNQ6J1Qg&VzgOlzefl(WNW<_5QMp6?^5E1&Pf0QdM8rJ- znt%3t+x^4`W*1MD8|q&@PPn0M^e}Ey!Fy;O6FD2Fv2ySq{-+su)iY(d$88 z6YD7ik4ahlN{F6b(}BN8;e)#_*am?c8J;ST5yFLpnaJSx9z47AhD!8-} z3T$9*8L;)|##bsVMMaU};g~nFj9L_B-Va{o%C`qAXGv9kgCEsFVyskKLUNc)z|^HO zbTv6X@w~LOw4*YpR|QCzl=kZX5@V@0QPO@lqli%8AwbEDiRTRtL?!_rrT*sD!rS_A z$y>Pk?$)}Es5yrBzOO!m4l3l@nq zSzV%+3@3j5nvN}9o4GeXYSr+l<+j?SZL!X}&2%0NE&J9?1~Hwh4W~og0D7AMx#rz{ zvMvG+!Qm(#g*3qJmTI>?x!kj|X*&!&--~8ekQXP)Aiaq+j8#HS^6Bj8DBnJ!&TL!% zgii~vAIdNR&0c@Uxa`>M%nZ?47Mbxo0e4emu~!l_F(F@UtK&kED0zL+AxxTP@s#6v zUM+5!7`j|m=AYQhD=K`8WN}wm;B5SqwPl>miGmu>G!VFD>bCeZoJRs6ZRAQNOd6|P zX@sge7IU2oba1AN%?0Im$17AIQBpH`xI7XH?oYVbouTSG(YwhPQlp`v*&fY_Y2O3v z{Y%Zs3vGaeHMF#{O5&rF8r7-M)Zgv6=&*|I+$UCBn5au4-->Hc8X95_6dL9OmxuNs z^_SX&3ES9=s)+-`RaZ|$_kQh4A#M9&#H*qS!B+^Xoy>vn$+^^A;A%J1-Y!zD=U~_W z+Vy^N617Z9hX{8dfguR(c|ZC9K!4*}oU)#6>RFPGB{NC_{OMoWE$TVmRi>750!Wr$ za-n&Ae}V**DQ`{5peLJuLfOn|gC}Hv6}kh8U-8`lAU=VN4rqE1S6avj37>Fr9pqTD z=t)l}sFiB>E#IcZg9vJNOn83pQ*nv#+MxK>2|8-5Bv}FQ9C33-fqKOwyG=QlXG@Kq zy~~Wo(A|j=Dm2xJ_jcE-IRj5H!v{FEi`A8Y+(i^m+YRW<(%J`i5f*nfs8wPrB6M(3 z^6Dm{p&v5dk>wx>lEj3Bglw~a2d?u5#WRL`ujECNebwx#GJ_KGA8abvFo{j-RlS(n z>$z9}iSXjYSyc1Ci--cf#!ppu40PW(_>aPX6PRlZsl<@)k%7kM-gs_74kKuz$WwfghNo<_Z-iJ)f` zD;pcsaGvhZ@*4kEv#U};X7$fC7QNQx_D+AC#W?!+;uV<^n6u;%P;Edn?tf*p-0FPP zD%q!>F_a-OgARHrzIa@pndrXHQ>0UrI`AaM#zp|OP2&5)_a!u%i{-XdR`c~gMp#(c z+1UYP>I9m#WnrV2{Vqm!uYFxmCzLxnJK-Xjk&M8z@xbw zA7ft}&P9USbqJf35VzZ%k@9Tw zXb%WYaJV=>xxkOJ9*b)@gCW`mh8DgrB)q!S$|*5 z4eBGu-atdBZ(#v)YIG&6Q7G;#dvF2DB@qL_edEPS3(Kr0a&{s?6^C8dc1R$mgmf&>30Y7iNEB0*PaY?j;n+66fc` z^vq|}drKp6;y{_CB{?F!aRW#rt0M=uGcz-fK`sWWV|eHUOg$x9brN+X(MlXe0xXC) z#x_mvM}owhR$s5t@mFT-@2Tg)H)g6#GK-bZcV!s-3glNSLWJ@hqcpwvD!@|9ma^y6@q|vqH7WI2uYxYL(hU*HeOh###2dL{8iu`2OglD zeN$4jzIsu-%=|6JJoVrn%N9s<1h;KEL)m*-yAZmuCyD@xS<{vjzckhjVOPqgu|9In z-0<>r%X3Ks_!NeK@C)QatOW;44fX^I{QSpv-RN*-#^T~p^!vr2<|s6%9CXIi@_MzX0M|gHeCzuO#-Md_7S4b2?b0 zV&t;eq~C!KZ>;4hWa4s?D`aGf7gYA?>hZVX#Zt;0@$hWKrVGfWbPZ{k|8v>fNG; z9@br&0gD2cngd(1UaCt^ueaY~=I2je?G8YXCbpl|X zcQG1)D&a?VTvis9X07Ru8okw_aG)jb2oo})w(!~oyP$Y`ua9Q40;v)yWO?iIIS?`_ z<%ZRV%~q_T=7?(5y`x*2DSVF(mpwvkcE`BC@_CvwZUM{>&+4m2IvY>53+G`fErCHqs2WmpqG3?IQ>f zS4f{7P%#%>uZILFei$AdWs?wrG!mXpzxVXc2Lk1#pZkJPG=kT$`<_Lt*Ee2pnfCEj zUrfE>+7=7YYpYmGs=TgTJzd>TB>;R*_pzQAE?X87GV;fr%IE5hpONgg1_N%+cYgqe zK3}Wusonaobo04)U-J^`OlQ7@1&2JB%|GHS9Y{181kF@ZFoR{R)Cjrba@o?lU79v(-fPQJcw!x?zB zwLRBq8$d0Zx#4+x5!xR_lQ3>q@i$ta)P!n5z6%3MyrzOk$l78H0fjvtvnrj&9HNhC zNKdOb?V>ZyVnV4_9r@m5iNeLj>h&#(sU;YrMvsg^`ifMoK$RX|6b40+fPes=!Vd*s z0mjG#i4Q316Ee7Cc?KEL#Jk_dwnA#N~5NleaMiG_~_B`(xl~d-NX0wQE9kx%i(D8 z`9OSc+BaL^k^xToIm1&Xsdw%Z<7BDTIq2gvNr8;{6V%=xL4d!iaGZ0x<6I?B%0MSz z31RziE^pvtX!9*9Jr7SiDSgqtKdM8xF_lMI2#ckK0@v`6L0JW;;-WzDJ1pakwCXAz z1W4yQBgmS{4SShEaR>NWvKF@s;S|o2Fx_ZQU5{Z+^U$!cQKI0>>nax5Tq7pRQ}XE4 z5pgsI1_p=yVe*u^&q$C|0r#gs(r@G7fOigfs_7=Kl~*s3L> z&i~{Px;@2$Twb(?e}bJnfbUaQsqn+k_4dV(J8h zPX$u1TK)YAxA^3%Bi2&(XQ~XxdcqTVEbu|&2umZ=%a=H63-dM;OoxQ8oDa2uPWgGG z^HF>zI(`V9VN}X?+p*&Ffzc|soyS%f&k8q#E*FdH_a&MeO?+l}&!1EGr(>5n9gGig z9}C#DxuWQrt6A5YZvx>}(JRS+wvH%#_UaCo`^E@d_I5BId?5Z(;y=Z$9%+$StlRa6 ze3U@@A(L}Lr&o(1C&%VB6W&Dx)ot|(mDh4!S?ui9WDnWsOGCHRtj~PUPC$p3G=hP>a|Z2z$k= z0m?nhD-RzfLNni?UEWK&rz;=Nq%7J;E7LIbK~Kh??e_0SN^9DgjS?m>r*^|t(k4fO z^Gy%JYfu&XxO%4rGPu|lR2({yEJ;k8I~Q%9 zQ^Q_`uaBV2MMz8y^+x-Z)l2rDqJFz9DW4Ff@Htz>GH4-30$RJt!{u>u=fL# zgdvco`F%k`{|N-rfCS@q1VPVn@8!JLwTx)N9F06NwR?m#>t;ofa#Hy-wjL8#O+MRI zJR13=_;o=6_lwVPqyFl3i^1)5mp!>eeAd@LB%8)tV+)&qy)R^g1(sANKwJSs0WJVn z)LAXS@mGb%20f$Z8nOv(}AJv1Ft zQv|}=8nendG9gyZj*jg`YPJMUX?*Uwc)`x6J@P9LfO~8o{3&PC!&}NZdx;d{o0YV4 zE2{a=-OXF+HMVA%_a{q26&2EvZznC}qq?B-pl?gP+6Dn6^gcRG&TDW%FXAI1&y)7H z2dkg8mUC~6eqn*P!lFXHhaHuuZBSAd$;Qcs`RU)TIFBUG=v?<9L1N1~EA0Wijd2WY zEUf(VR<{<g^$d!nO36Z;tuYVeWJ>Ai;6JYt%SHz7LAXY^SxO;&WxBv#l!w4l(CegqHeAbg zcV9w|@Ekq$l%`A$-_v`4oQ=MJ!*2gB9`mJ|6H4OiXm2}7t(jpV6Ieja9_;z0y`AX4 zEm&+{30ML%CD1}2y@Ke2WYz`U%-02s)ECPN#I%8FZTiD&3kfS?5<fdhjF2)z#H95Ng5OhkWXPe*m3rxHlm0Veb~ApQCQve*`GkJPx~(W^EFcA@k292%*^4S+a<^P zw)KzLs8jV)#RjaS9H15N4pUn&pt5T6`b7+_*1 zUj3nd9a42h)IU)Zf&~m{(-QQ*p&g~+(!N8xAD4AOvt-gj^L2qsz^e;l{O>Q`gLe_8 z8y_D{YirX38nB|%Ud!mnR7Ez_b6`J$mTI@qSA#lADsP%%q0*d1BXo(8veG|3STDd70nifVwYJYDiGM z&FU>NM}Eexy>#IDZ`szCW_WB96`&Nq`v<5ZwC8~O--|$yE+Sr}r)$d; z!#T2Bcx6+(0YhRRjFYwr`DTvLL)LH}Cb1K@?=6CbYvi(LC)4UNpkS2NNWD_0ku}JY zjvmdzd*z-pd=QqC!vGTeFIsh0E0YIv_0C6v9i6z91`^`pAN!)cmp3*7fc7TO#Y#N3 zbsbGsc<3BKCg%_x>u+w(_60Q2N@X*%v7y;N=tgDQ8HEG{N$Gcb^V!^;x%!ns?sqAC z!a}ZRFNv2i8&uHx?~fWL%$pYoh7U1u93s;I6`i2!EMxJle5ALtfK=hh52Sj zlDCDuNFm~Y*ZSG+C%Odi0F5NT?FJtW?7tP{+v2VIinDcF>Z|V{q5WnHx4-3HwOKfTW z0RbypKiZb>W@3nGla*CkJ+7C}57_y+xgW>J#}kWS6|4-eWMxwFqoAO`n?^uc;0u3T zmF?N?jMx*frSdU0;L;c{J7PW9%^6RRaQyOfla(EiaLi_vUs(0_{!q#>Yrbrp7x0*K(3clY%Ok*T*q;oldoZ0Ipyh? zRS-H9R!i?b+M_rJtb_(Z}$QAQPeF<@1JcGk}*h% zyL*;>XM0p;#eNT8K(lFMtoq3R!nEvFjUw~3vO^%sc!z0MNFSYzX4dvTwwlk+Ztn|lq7`VW(yv6W2Z=GK@HG54D~c>AU#n_eM)#85svf04y)Sy^XWrb z7iyHVYtuxGprp=s=MK;*7}dXq^T!zv45%HbU%)(fZ@n)nEiDZvWcxF=8x9m(q0TY> zsYdv=^TF$t=tUTQ`DAN@0t+zi)8Zm&Qdv2jWS*&t$s>0tPbesQI*g~9H^4h#aU4^u zu-{a7G4kTu-FehqM{@h=oThg(%g&xteTdq6uFZ0SzF+nJ4_w36-MgYLZvtX^%a&e> zs8mKpM8vBU`}Y?(oTu`?;#$R99xwHVi?}28uAvOcn?kASB!^IMq2o{SItQG`6o9Y2 zF<;fWo&4gtRnF|8J4ET7L7_-%L@c{=Vu?fHguK2?*XQlUm=Y*}-97u_ za1NW2i8x1izo==@17h?t+a(%?QHV1FuGEKmjO5xBcZ?)BY4i`xS3lCEfDE95{L98~ zMv1KvvsbTwrLA0LmEgT&^HU&hgx6|(M_1uTNI(EKEWYTvFCiJK2^Gd_ha!(n2TM%y z?RQ5Dp%^cdjtV?T_Lf6Vl{;gY}ByHGP(yiM!0s*Zhf85qk;0N zmBawO6-nJ!?UI)>GsY+aNg@U&J&jzZ{Q|0dM~rSG_lwPHSM?7a?5c+rLeyd!%m(i* zKNk*V*2cPHGl_x|j=SGnyx@zFp!RMsNzwZPZvl@bp~BIWPA%{Kha3B$^p7PrWCx*psz{61wn^Er%L=91kmJseK;u&5+{7mJ z0PanJ()qp#wgK?|E-wSzHXi0Qk4mBR^Hq`!n2p!eNJk3q!rZv0M47{qKoRj8wY zaUwSo_R1G%)PAY^0Uet{a!#eloTPKjFS?2UXGt2@1Hf^ZldP8EF^`r)>wqCiMhy4U zoTlBMwDS$emqjm#hNAXnX~g-nUr+3&yw#_TrsXyBcXg4C)8!aNI*OI3c!~4~wUTL> z-?=uTiG3_>N>Z8K{d8fvN__yTgWlXuV8r(Hjn-JMQ%T|nzD(qU@$xkXqsuU%mUqr|DlejK zPUkfKfzr9wAfo|%i87jCaTv&;%A>j{K#m_!kdgTazX^ChSQZR5NMxFJS~T&uusD9@ zX^myap1%~D)>{vVS*29jON9^1YzK(H;c-adzsq|z>Z&{{1_pL1?JR8w%%c10%3(Z5 z--^vu71h+$6O~f2YS&=>yQAQ2##dxLEc+zQ$RZF8dKx~jV%lTx#_67xefaRwE3OID zRey4+9ZfS}d40`g)ZijI;$LO#kl-z;slRE1#u(^)k&FxH?5Cw67fMm0jrW956NgaY zd`qp_o_$wxm}?2%+FbUm9<{7z?T|V9!9g9DI)I?=+3L;(w`c_!jK!HM%N8&c%wunZmUE=1} zuO}8IXdMU!J)@gwYTpxC?g}? zkt|GRu3mX2xWQLozqd`HQc^U8_WtRqmN22u4u!1o&u%ejuv}O-k`;>#s^{!=TA7hp z7nS{!^l}*~)1_A5>Ydn$^Y(6+b$Y z_^g_19h##FICj5Qb=uBCGowz4nko7R7-}EilkytATj8;r?Nti#nsSU(a%jN_@RE*w zTT0pcvNVR*@d~srscF7%#^Sj2qNzp$Y~`EK(9oQN*+4IO1~Lzbp~aewLplV-&kW=qSf z`{B}5!r5BiH?zc%s%i{Ug?&+1Z zwurAi^=AzYF;G4MiC}DO6(4~45~|PeCeARXp}z!Lf}7hlw!BvB(Rc5xy-$zC^1HYS zzrnnaSoLBmeTLU%PkK&sCGn`N+@by=QX8T!u?tQ1>q|GdFm?>Q*jmsh;5jH_wz0Mr zau-nxWcNY4IQO}i>#Fgi(JEB5vxMMt>Mg39)ck0`2N2(ZrKJ(`oe4wOEn<_$w`aP8 zaO1+I!kI5Ll0&c;#1jYF#Rx^ZHZP!k`o?}s_m*8QtHWGw+H8-~LF8S_nrm*`!Rtf^ ze*OKgEl4kQ?2dg#zs&!*UsM%pNCE-^wW5lki_}H-iCGlN8SXkC-oBLwINZIBN*N8c zL3^ZTab$V(PEt~m)$E!9WQlPeTlNd=oz*c()@#H{G)QwzTm|AD>yr-bnchljAa8m_ zvL8#<4;b)R7k)H(sk_YX1e=41>#U%lU_VsT1?T&VoZbl5IL2^4#b<;Jd29UQsZadJ z33_~=Ortoi?BA?K(g3)h;0mgA%HJ#Y_=^!=KRiKv9@T7OIy@=ZEbA{JtwDX zoxQmHmAcQUP?^CYCG?ggsGoYP&lXAJ+0fFWu_lqSd*Mj7*J~f~B4yJN9tEU#2~TU& zDbob3O({B`28B^HD6Wf%jjv6;mS#VMDZaYbL+~X|TN!H`D0RRC2%4nG@h9hZjVa$c z*M2|Qn?O;M^fqFR4BQ**Iy)71_-Sqv10*|?BkS?^!P?`_&d#6~?A;ef3>b!>&hmJG zFH+hAw;GEm3{We8;}pi{2n1o>5xuQ3L)4pykcj*hg*4?ya2+8r<%b3)69WSS-g(v^)ylQLJW;QDap(3O3G6VA z*KSE}E7hQ@6COTRGfi^eu*|aBZ|D9->^lwv(vd1BdJ}VFV;U-%Sh|X7{@oWsz-?4C z(7H(4jdxn460+;*J!bAhwy*+KKzd`cDVPie=gJj-sQ8|5RE89V==LpkB=eCSd!9%M zY{nx51FG}>J(3;F22;_yaU(xhwx43x>ChX{ClV9A$K|ZTXmt8@)5(v?SGQ*gGJ5Zk z65-?fGMiR2s?OY5`Vz)CRx$%-a&o#0N+<>`H#A>711vj(>Q3?dTmj83*-i7&JJ$N* z)m0u&#}U;!r$$_MDAPdZFI5ajwmp`%Jcl+G0)v^|LGT@sL^S0rWa+!v$78weNQ)mg z8c^rw=5o}XkuyLV8?Vsw@SH{ zM$-3Q@_<{b>XG}T&naFWo*d^&UBNm~IuQj9@9QbpnsnxiEP@&>2P;TazF%rqBZ9an zQ{9xGYNkII)p|?F;!Eq=CZdxFDzF1ygdj?*ReqgGPcOvIzVUpw86 zj8?m!c?0XML#Xd1;*CR-u9CnHnxjS(6dQBjiP~d%<*bKc2k%T$p-|`;ne>_{M7s!y ze=gm_IDWmMtr&?c0CS#JN|9}RfGT_MMv60A2k^~%vqvczwwFS=sr>*wo`I`_iUNE? zfd1H}n+t#6vC;#|l#qu%Dmu1qo#pjS!$xlF4PvnaE=AR^k=M~ZuqpPw!|HQd4vhD?{1)eFt=867k$wO0Y^~Y0PXqt~0Pkv=m7Gj6-dUo1PW%RFk+W6zX|%E2(6)%eP*G7kGsP{3WkaTJ zF5ec0P$7BH%pp!a(jvUUPtm}6 z)?lVxSfoadh)Ju~vN}L=tnd|LDi&|KPLqZcelH5_=DC1!_9lW4yEXz+{9)t&fxqmd?5^5Bk57>!wG z)dbdNYX~H=k1ayC4n>*5^_GSQ5=Vu@7_|}Bi!@t#7@$ncHpy75yHyqTH%ydt%rf}# z{K{Uw6gb$Kz^NSF=Ye8+^;Lc!e*=gZW9f*v>diVR6L=QA@Xp^XiRLs*d1n4C;yR)*5_*?o!f4pcJ>G~7bMV_VNU7Pdx!4qFW(f31_T?#I(AiG85tN@bPsMT z4AprBiwaf@0`f(-_ha>wN#ojFr**?N`O-W?9Wy3sYRE~h934Vw&Bgb!J0-7R6Ugi| z0-dGjr>Q@{g{bd%c(QSUq}^c*3QZDb`-Ahwlwo6PHI@BiZFO7jJYSD>+@p(U+7L3j&N+?bGe& zu(2Db+p9`!XW1I$B76&Y9hpYJV1@{dXeWOI22EgttX!hEvu`GN69%3)m}4R-R_W}CVk*sT=mA6xJ|MFt_U=bZm5$`dIDv!ofk*GK=XL9wps(!$Cbt} ztj0Ylm2X8aqKF-EYZ`?G0j}ONO#FcF60%2T4n6y^ybN5@b2|W0*qmPi%Y}zX20nyBVxK>JFivQ-{CfFLNB5`Tl84;S5Dlc)Q}AufV}sW#FB}}6 zUjjTtM6Ah<4PLo76=Lg#0gvvyh8S@6tKB^O_02+`_ zSYPJo%T+uofEMhZ!@v-OR3xHm2>KLBZ8fTFLr!G;k1+vy{bhJ}HW-^5bc=L9i~j(K z=?=)sfP~%;P^SW=o5q4!_RbFy>>zHWP5dp(g3L`)SaNJGeRmH?lqF(1uedVR3p8zwqe1Yb(EecOJm?zW0!JE=#H-F6>P)wDWZ0$7 zI*6;Rtn8gAevb?o$owT%_xDeRYb*`ke_>wX(8hgW`9)r{sx4KCtcb(f|nY8&7(KYd0LK4>K3D97u+l0L%*XGs&IE#Rv61#WLGl!WQCLg!m zk_Y&Jo((e>lr0AoE3%{STAnie8ik0OoNE+?5<(3qm~b>afbBfrP?o6BqQB(4jOO^2 zd}=wK*LD>So1{a}7DPa)g=L~$Epb^y*yF&n$O5zc91Y*f3;;c5zNbRQGX@PfHamNJ z*8mz*RaN!G#^&=Rtx{*PwhL69&grdB*))KOw9DjHo9oTIPG@o@+eAsFQV$aD?%?H` z7G$8K8*mWNg*47|CcQR*5}HdGlQ2x^9GgC-u}zZ8mwgc`-cZrv%wSfEyR2D%A!2IpF!By$m=pO?(l2PH0F0 z21Hc=J2(bPA50I+UgzpHPQ0l(cB`)DN70$-h`Ttb1r8&tdBo1E4A{Yw%=(tVmJ%UC za2*{TC5KZPDxm2CVa>cNr&*s@!@<$eIpypJj7=7t=KU!Aha4iRhz3M!WPV5XD9YvA zPjF&mtr{1AwzIOb^2y^OS!aTt5xguFVx@TCv)vnyINTl;_pFKo#U_7HIn&*o;{-X0 zs~`)CxTWx##(~ecWAl>%lj10YW~BgBGh02yLzMrq~#zPYiMKp>4Ub5kh`_PlbMo@ymMZQcbgGca(6T#4uDi&cGhl8cvjS<_UCvF5t7&I0}a z)D3+@wbU@XODKayCYcIY=77BaF+1fo(TK+uQ&RfS4P@*jhOY3=VTUlq*gnte9-o=< zjJaF%=tn%oD(C{BSS4>29TZ;#n5Q=1928ksK_1k0WF*_t5^_iQ&#Gb~kkAxTfv+j` zAHoiK8DOylk~{7m9uRd3b$QWWxL{+u)GatsIyX{jmdDlrOe;tu7^;>tCEN(_p3b*U z_TG7R7^RG@o~3?sN#EkYOF_T|wl@Iwe^4qXWJ(Vmu!E$)^TO8qX_-R1*2bL`B(m?M zZ(kWHvnUr6>-V@gr`PiHqSqTEc;4j$BM;N#H1rT^G07xz{yt zsKJJn>}D`Y*Crjh%GYoo0|ctrI|xSCa4qmMk;+&IYoI5HNtP)iD1(azO%ZH2(GE7!hJ%Q&|E-Z zC{zRDIsqaJ(g{b~W$>Jo02YO-pkSp|h2WyJ^QR@7U+y6M@wI@_8{aAHKtWX$=pVU; zZR+4dk9Q<|zWsiytm`IV;Z;i?-C0oDeS`}&G9;&mpA*6F;v7Pkc3eyzDUHZJ_5)Bw zK?8_(LByd)P^?8OmG&=P|9O>)YUywdaFeZJD;3jC!RVkwAPN)LkGIVh%r$@vj#-Rk zYbUIymmUt2FkuyNva;4JYTODcya)}AK5FJ(J|<|`ygRBh*Pe2pR?Aomk)45GLlfm?U{=>m$OAxXCMg=7jqk27eM;qxEtBu#!g z2Ldt-8f9nLQ{;N0YA6x9#2_bqC)iJkc~0Qfx6TAcusy#feJQle394XS+$izl0gn?E zBTzb0pD{O0Bzt;!5gJ@e(Km zcf`w21#%}654=>Ntol*23Li)$oF5L}0nL@LHQG&A*oDnLnl`Yd>HPlILTyLfn@_{7 z(p|(LAB&XQ#RB%OH#x%+?5{9!>or#yR0TrLUIFdS#5V5RXwU6pt&tIKF%!wlG@w%u z6k{L{fx_DR^Qz?zH{Zo@vUeKmJvQ`!Yt&}N484UiioV4yT3|{T14HbCj3lgFFLqCW z7jQYGMDDKtj2H8p6Zd2J2_OFRK9}H(etmY7^heN?uR`qXv%XIm1iacphKE z+trktNl^w10--Gr0Eh;J4oGg;A(+hh-m`a$ECfL@;>ISxr*B{_4EYTfnvpy=>;md1 zsqb#i!<@ zbj`yDmGdK+^bVjR>yTDYgbpncE}wPg7btl zTfZr&e`VRBNzi`P`M`?hLAJUpR0$;Kphw#)Aa}#QC-Ws#%B4OKyNHMk&x9dj24u^@^vC4B;gwZRKZs@xWqe0w_~S55o5{5XIPgco%&#tZlnrHN&q%>4ACWwHrD%Naf^% zS;wvIVUq)fPXZ`DAPS^|#b)%SFA(fC2%Py=IXUPK`Nur5DQBXy(uW#U&`obdy9(KC zak>$O$l)?OjhSuOo0_Q85NrYLVgS|Wcv&JXkt~_aqnA?V1PY0_Z;Pld4KBvOfWi8#IUbG)o-_z@@+qO=|`)#9VipyFdA0s>IVm-;>aTj|$RIjYpN`IRKmk z-{ssk1rPorH3*^E#=b=OZzf*?W=1kEfYiuqU@szKWQmxDC~p~~uQ!L&qk|a$X&uys zg|6vIUqI?M_>ud$qVDVUW$_|%)R0m4Jy)oQgKWr|>LeCJ1!B>?nK#fU`UeKaNA1j> z%&rkE440DiWtStk)3K-SLaqq720-h;)4!^Z%BWQl@quFpr05hN*(fo@0Lnb3ed%6i zecw;j8TcqM*N0vPg(K04hKp7k{Z^OnK0RH$JX{07*4jl#--pmXL<2UTP{7hdzu3z9 zp5*ge%K&U_Q>e1rjVh$+R^t=4PLC7GE+e_CuIIc>)gpwD8 zz-)UwzE{~tZb9ix5OqHZkRJUIu7jMQ4@lYh@XcG8e*{4nQ4Y(WAO+4%dN`R2`cw8> z3wKav!QLX`%F$fZ`d+48xAo8+$kGklNN+#;c>{}_?-e9)$9pq}&SA)YF<$!d<0YcN z?zI0DFe2^^XGv*wO{4PcA|oPnU`v`APP>jcCs2vN4ZRiKq)!9Nzkt7csa08)r0-So zvUR+^zWo@6N|6Iw?_T@#O;$+j9v$u_>b=3b{bYsmYbL%c)=^X0UucGnb(z~2{2DKRJeUO=&X9V4h_S!DR15K5Kj`6rL)|!3 z94oX%hw>%nE=Z(jctE`@@p*nq+FFU-;^0|7QqDRE2ocE#2q_e80Zsbi>j$-bDu7Nv zP8+lO+-ICkvhGHRlQCKpQ4>+(U+h{Vr{Z(+-gh2|7i?gZidG%SGsv-+cY&4R0hGxf zTZ=d`GY#FarRwvE*Il7!ehf2$uSTO7<1dw8S>J;k@4z#z+R*H<5%&C(`~w(uDY=SzV)y6SVU8*5B7;lJ)(V3}GiX z)Z>Zc-%nJ(*cLpiWvOjCd+0>6*Jz)>Vd1|pAfNs8V!;y&-xpt>Z)^n=JMRijcCAMd z-!&k-;>d$n$f&(RgpsnMZ~aK>!N)|36N{s;`n{)(9c6Sxc2aCwcx2Z#XBDt5a zm9y0)*6g>VpRG(+)Yq=nR;MKDuO_D57M>j}nD<1-zSOLv{6YSTIM$+Ec&WY!fTe|Z z7aJu@y}aHlexy|sSGL9Edm($9B(#r~thMUwbKsw!K|2dlz^B6q!*YtlV`YTmKv)fa zC#Y+R0q#cTsVwLVa1Ij_Kg`119Fu#D9K!1#mefa}%%#W~Ar49u^@V34N;`}4C6t~h z>tSUClWUoP=I&)c7tq|7>>nC{Y9Eih^;m_UAtMt#1|f|%3VTnz z7?L}KcI_J5CBmOSb3jyb=Zpg6TmT||)eZCM)1n}^7Z+EX8qw1&ljEdi2!IhIp4SUL zHVzKX%P(KI99j6rD`BB{7EX6JH@Dv4g}HrBN+yB9x0r5%f;B)DygMD3H;2coU z&Mqu2ba7}1gS4Ui&tVXxg6JZs5hzJxwdj%3hVqo=2p0bfciOhFIz>6v&7)Guxf0IR z)#R#ehl63HmRWU(ehMX)-zj7+?mjMVAY@ohqkyEKF(cU(K!#;&k=Fi21IOPZ#9df%&?F8`^K zd5klLzML2TlGeAtK&$=J;M9ZCtbR2%@a8ceidR5*x_Z>ojPbOI2kYX63&QvA(MU^A z!Zp5?RZCw44j{~?S7~YI7Zw)_uS91k(lo+HcaF~9y${Q>pQ})80D!P1 z@~4sxK3#&$D79Ri&)~cDNm&F$_2FTDx)|liCRy>fn>g9dF;R&E72nbQA{iG|3amY#ckX4<-HE6ekK(Eyz1rS)0_uOH1zniFen=^5cG}CWiYp(e~W3fW^NQiY@f{2U`}h$)B$g7H zohrwui{>@ba*%UXRLIUE_p9=I6TmBSQynE<@$5v11g&-o2U6xv#$V!nVIE>JtMp#} zlya6l)-wv8(WL(-^-SMGkTx$N?<}PUmwG&M*3?j$&c#l>hS`6Mir|Ymj++(?bq^C;`n2w#a)$- zJH9yQHrgO7sIRX{IrMYU5eFu16>pg_<9$59LAf=`>VE5eC={LK##>fk8Dnb0?XZSf zw9Kc|K`fUIoW&WDG<{m9U1v^)95(vBl`&KhbEjnJ%T%GD!(*@Vht@PQtL)J<7H4+$ z^+1y2ZIk{Ji;E=;Wj*ZhZ0i>SB)Q`?Q@UI_U2={A zJoIY9*ts1Br}^?uQPweViP(J=tuEmOHK@u&lh^^8* zmxa#bEVb2>=0-G`EI0vqAE9Uk;7w-J{QN@K($dJzqDbE8B(dmaBK{-`Id9VY^m;v` zHaRw+<=$75EUbxB2ZINwQ7)s9FGkH$?Sg+5ZUuZep+w!o(Jc?lBrbBhZvG2ZQ0zpC$+QW(X>(GNC+`42j>sd-|n>!ORbR`%xtpzHzqCRZJ~ z#PMmBagrtR-G#1>c^Bwg=M=lSRmKSFwYJu|216dk&|A9PY=4PHT4wjfOgvPvLDaA| z4>l@?r_0TaKA?znmOtOi*YcphbC&mPB0ei;pih|0B-KFzH#v>;P6-~a!q4Po$JAjF zA+GZNClR#Lx+xu)(zlc%^dpvw{95J-d+i%E5J^_HmHsFeUHc{QtD#}kz$CN^@-36O)*L|>!i>Ic7Vd7~=on^;%r>xv z8KC-yv@k%Sq+}s}`qaaq0FlAy5`X+C8Av-+*Zz=pcrfdd7^FxtNIa>-o8WYjVVmH) zh<&HRHIN4Fha67pJLbPm+5O1E;v(2@l$WLMN5PZG+VTjBp37E$?`uGL1)2N?nrj=e zC<+d&tel<3>`&!2KZgC_SHf$1eu6_l{sInzn{4cdHAi&!^+{V#o|)!36gAbtlHJ|K zH1ywFRev(ksCIWRRVbD~F7f*a>5QcLxVfc3_lJRsfErrza(fSi0GVdkZDFcWUC7z; z3-R#lLJGZ9xAJ?2#NGdkhDDYbgP9pUuuc^;1OzCR=|Ve;W+`w!bcVIn)EEz)c>X6( z3#$NApKuR#HRM;TuS85=z&IH+>9b8XM+$d?(xo2?V~us%RQ@uNA6Ke~%`b%bukSXS zN;52MY$-H7@{5vpMcydQP2?HX`KBvKEtdISunlgFR369QdGjLb-!Do|hHdTLZBmx6 z7b9_DJ9+k|PsonyO~ClRb8Bx=Bgta9hm5&14}f-oLT7!8cz@q6@{!p3sqTL|l}RJ7 zH&eQ4oYW$KSBuy{13C+=_Ka$GKlmWvtg5C?YT)>1h>_1ocj-rzv2@(6C3p}kfNBaA zvRgg?_!XFOufZ!k4zIv{Qy%SIblm0~qzhvXo*O#(L*$R)Xf~Jrm@o04gs1|D8|85T zyj(d$Q=yyi5~;T%_LbDVBBt{19mW|ClT6bse|2_4#t23!KTu;3<YHJv+wS^(kE)&h870ygjs${ z28aKQaZIa_x>$uOtY|nC(7<9|Lt)g6rZn0zPvp9_tx;mV2vjjLa&ou&mOjw3@*ccf zXm*y2Y#u)|`kz}$USj^hhGQHeTS`W+8 z%4X%0Thg5AFA~k`{d;L`@IuA&Qqo?`f&O9&>{?Q0jc052l1$^<>09DrI}}HJXfztJl--{&+?;zgEQyH)!WF z(L*MeIlt7Ea1qFdVGo|2bRhUW>NH9x&x9cgKm!C_(CxfkbQhTLaL_zNbi4vD59I59 z-8jEvv-GIKVf}%vhKT+RCaqErAC)W#tvFb-)v*sd3iXDRV`=|-qRwq$sy>Q)slHe; z{~4{=5j@IfPiy^lkLND3Li0bFz&~r!l0$%$d{+2wE5C2)39D@&tQz>@wT>!oQZy#Pcp_CtS77!fu1VddlJ z8T z?S7HeBF4@%3#kM~Zf-OxD(f#(AJ?S+x=P3;Hh0c=>9PPtf>5sDldX#l2X%D=QN7@@ z7>RG3z@qk1-{*)(DFF_TDy8eueR`^NECzP8vRV8T-vj z(m;Pu+5>qXUj(Ell0W-|Gk2ygqu9=L6F`wF2p_0dw$hj&wC?X8Q?C2zQ;j`{H#SpC z{(Z6yau(KqOjh6+v1hm^AgAUy=Q|P&G@!p!z46eUXGf=_ip_mu%Ab;1ko|oE*uYzd z#Vjd)?=52WWl^TUS3-~`w{3UsMVT|haDsGrBVZ3%OvdfM=;v_^F#Rym ziPQT0XXX04+K<*XG(75uK19#wY@;k47t35up#)RQ+*`K*U+%w$!5J#TrziG{Hj?0% z2>KPYaVK`8r56%{_JDR4Z6obbNU=5P9~>Na;lC&ox|scNn;EI6jZ`|kZ{GWRR(rDH z0m>LffB^6Dsx$xhUSaDsq%M9M(k(|oZusW{vasy#Sps4gq_5Mz z4uLA5M@#ruT~My}dbJWHoFE@>6tHyLX74tXz>}>U^_B6dWTS!-E&g_Ja1F$$6j4_r zaDNRzJOhPiF=YEe88fZ(@uNqtcGnH{M&4Eb&|zl0SfmUcgZfK!d7+a?mQ^%3g@CQH zPJevz)jxwllN78mfGT+i%}uX1#9<%d%mCeIP8;k$GdwjN*5&<43<*`#= zVtLDFZ0vpaj^oq6#Y8{W?17$K^ZOjZa1O|jCwKND9SGyZ+oCu*pw{LT`*Zzo7w(!Q zGi)zxp=l$|&7Pk)A}*ecx^A8=@g|~A?}S*gks}WMpPA(lgzrg2 z@(zvt*AC-*bbVl16_7(>8d<}oT`#WOv7YQOzJM?i|M87+lc`Ik6N=@e?Qx*a$7GtJ zUWfrGR9{XIt$?EvF0Td6yu_m2-9@9?KPxBfa)^kE!;SozDkq;^!I~-j5lq}XINw1d zzVLhHBBZAC$;{MGM%ck%wyR(;%iHT5w%q#j*X|xB1(CEH+KVS~^q+SC*1M?<+-*^_ zSd9~>Skh9B8>b!A9FrEIh+@JQfK9OA zuT6b3b{t>jXq!g*vG{Qr8BPEHF_XZkliJ5nIXT~+{;WX7rFtK;0^o7oX`8l!`i39q zrc1v6e@{EyEon&+%JxTxKtF;1M!In$E|F8?!L zY^O_KfwCEL_je57s?atAw3EFCp|=qTpmlLXe|{zEVpaf!p?F=lJrgeUlb7-PpG04Q zteoB<@nmnwKjxQ83Vj?TnnXbCfphTL(x6+$<38W2!_VUWI4*5CO;3ugdA) z6Nx-FOezk*=rm!$JNb{#Fa$g(#QoLTV$om%+J#+ez^M2YeFuSEy~z)`>Xu|Y#_^p+ zf4f~GAqq{5=J4jOQvHtbU^pl|r=dkqSF)r@0s5IU@fzD&&_h-$-EtjdYiGVaLxHPt zJkHRr&gx}wIvM;w|BT)RDL6@z-!9HX)0(Tjb?N1AsWQC|(V#(YJKKvV6`m=etgP%^ zya`k$Uy{35_z!t5gU}mkF>svqpdL>ke5tg-Z-6?8IWgp>pLEwl4_0OCE6tAXaM_Zw-wE1avCI09^%3jFCaY~BD$8i!(P$@BHF-l5UzVF>pxOHYKJUq4*G$`3p{JF--CmVZdXwrLULJWf1 zM18T?U;BeCX5D@Rv~L3>f>8Fz;mXV^Ud$nqn|Gd|8nztn9!QlNJ%wgbuF=O7!Drzu zsQ1q)t8Q7(n={?zOF)4h-x4B%%0YVoC_x6#fP+CMqXBT{cZ)1VLCC91-w}4F>(1o< zU`#&O)!mRO`rD&NCPC%`O6ZaE1B~-0Suf8n9QN^>kBp3bWXSsT2G&A%pu-~2p2!UD zBFf3b1Nk7{D4g^$?(Z9da7;~InDDxrq+I;>W_Nbi;T|N#;HW2e;%3uGw0fqxL-d0n zv#0|o1cRyklu#(TYq@=X+pJ<27 z`iQ@m0I?|=uA_27pm6DY3p;+Y(0~368XA@5L(rqKnf9OQ$-fJ2I+UKL{O63w50P=L zU6P8Fv1~lgrx#9c-`CyM{!$375~+<*du=PpwY9gQu%lO^={5smzIw35n|l`?WW%=gAJyy;5oftk;bj8nkHJKs5S(Y zn`7NWsxX8A)FvAJB>vx7*h=B{3HLJkPGXQ`+UE{(FQMsihH(M3fng#4r7830O@rb^ z3M6A%+x~b}gwXF11vteW#_L;avTuI*hky2&WaiSe&=EdEwW=keU&{xxt_5Ym+=6ou zc%iAErT>1ro?YP~0zB@oAZCJtMo*Vg3ym_^jPD|pLuY^Q#J`6#apUH#eAw%Cn}4^8 zR|W6<)ax^Ej0>9d^K5@9I{&!|g}tClo<_C5|569}OBmU2fNs7e_y6uUvNUsq@6XKg zaJ47-lsQz)IhY6CJ+OZH5P#mNq&B$N4*OsJyyurDrtsIqdHU+ z8~4CpP4D$lzHP(`Jiv!q>ip6zpmov##Pi!=DsbFPcOv>Q=~h|b2w0nCiFJKHkk ze|$@Qs$PHC)#+ZMOvs)@n*a{s)>(jm&1y%Y3B0pv1br2#f4qjnw*8ezz z*w$p?0%rx}^6pBx)5-iiad&RiKO=&6mNDFR_Y^3#9Oz&JLYgeh@?QMsd2Fxd7kDr{ zKnpeLa(%j<8XzoPz~_u74`h%;bn7K+d7iH95DmQ5Z3`(jd@RxrS{92EJXGSe30WTulLf96} zSp+a6;P0la`Tp}P_b^H&k4>Zv&anT=hc&Ez{}sI=qjGX6{Jh~NWEr>eBYS0i9TlmJ z3o(V0IsS5IxmS%59pC>RZ1|!}K*rZUhE2oIF{Ojv%+P$c*F&papbmVTU7 z9N>PWdXh*@Y1n`XKfac{^odk)?&&#nbZP!ZvV5#Tsw_Yn#LJVJr?t4M?yv1F6iPX zy-fShJPIT&t;O(^EDI2-`Mt^9R*ee#pF6{|A**zfj{F^q;{5N(dRz;}@uY5FE38Jo zM{`~GS0ew<$m1H&Sliq^bo#UF{{QbkdSsGa9MGzK_GQg451N%l*9Hv-4-b_ht{swi zUO+DRG%?HG8pBIpnF>-y|2;yO^c7F9>c1?d#UTks`{nX>!QgQN(D(<^-Pvv*3sKnt zcEMHXnFoLY`837p<|u$2ynZ82Nl7W77xQb(|GcckkIg6f?+a&td#rjolv>w-iVJNR z&2r89u0U9vx^4T<5anH-b+xBE56vloz+mtBKYkL)>(<&!dBnf4Nzm@>Qjvj1a_7gB+qP|i$xv0L&0^Bk zePbU4EGJv0eE~*Q(^Y#KTtaZ2J^`{%p&Fchu*9hi_Mi<{Y*`7-?lY~TLqiEb{29S< zxJRD;3Q#K$g{3W5`seu~Ban-$Mvge=>YnT#}|Q20tN*I2U__+;~@r3 z7VNKIpDWF3{b!ybKNvjvNf>l`74ioSaTkzZ1fGF%l7IsuR+07Hv2cXTpzF-SP(Gf8 zdU4meTGW>((P8C_UCH?}00JOlo88$eL>GRx*8~dhE5r*pk39vJLT8o}H8iZ`iQN9> zas7V#Gy5QBNvRY$vq(gS8-kX95~z1EL+Dltx~zcM5!+wU<<|ou#@i-aZ3Csm*F_*$ z7gVH?B5krTP$?X8svQP;WA+vfz`-Qd(Q#3bX$zPx`@MskeEZIw{FKn(A#lZc`%1fZ zRfC3{HK_bYwlwe9#ETWu8Gj!>yZdha{b0r4ceD{Gm;mL$pkG^9 z2&?|AuRRb?zZsi>v>k#^^e-$b5(9}+g=k2wsk1N4DnbVVq_Io))1`y62)AmDn`Yi& zauqYWcv+$s*y~=r=mC#basvCy%qT|e9Zb%Qoq7o>f0y~3F@#+x-b|Ts0ki2^@;3ky z{O1S~p<@3wG`+F71+>kur$Sd7w|NUlGLdQdhJS_0Rhig`?@$qrQyu z!0e@QEeF5EtyfSjAbOusI);-1Qh8_rexAN{zIR;oCS2~~;*!u7-0dGqP~6S?ppn6y zu9D`-Q)+X*nD##1Wqv2D>(sK1MAg}8*8fC%LD#|~=NI+T_#d3?{4_H9@Sdu)tBeZ> zn3V6W?Z8Z&7%p8;ECRju1a;`h(x>nN`qQRqo(Fg=!61Zw(0+;tgOG;uId2H(8R!nY zUc`Ib>Sx8#SAG+jWuksH}YGy>zlhkaYrwg5sq0p{qS1Mw>T6xdiykRmkFjyVYk5ZPefLROurX zKxVB94*M&cb3HxAde7Arr`HFFqKg(A0zQjFr!9clziqkbc)@a{NCW?MU#hrKYZM!y zfmC=mtTmKro>GKZ%4%_NFCx0}q2kt95;h^j!{ovc#$R{v>o!aSqt#~?^}hZ#NRnv;%;BMT-T`T6XyG8*y>(D8)%{UTc#T^UpBYO|j#*bN zS#fOFC;Wqa)w@YMxC^q&m#;nNajKr{$pS*aT7pApu~fV?SE_emfv4{&UmIP8))yLl-S+6N~RTxF%{pT7^ap! zcc1S3F~9xB83hH0s#AX_pKrPiBUKN)u#}syha_TNlhVGfSR_pX0Cl16r_lTCL=I2v z*p(LrP_tS|i_HYLHkSKT)_7jD26bp@rcgf_|N_Zg>~u23CEZHhhP79rxmCm1?XY{u-hJeZfM&v z*pZi*|Dcsg2YCbK^w(|&7l@dz($Ek;y@XnEg@3if*v8iOEeBUV#>I=DcTDneafoje zWNKI8l)h68+hx4LfiEumt|l#?Xmw!QXXFUdcA@lP!qAFOA??KgzQx@nhvP9k$Z)z( z0a#h705IdvMOsFd`Tlio6=Q~LwJa$j(=brne#OU!NQM-`bV{Imytv=ejD`Ze8AU)$ zl}0V^^@trnS>hkLV?a;gst!T`uae(=28AB1FpdDAGnf=iwTH`f^|#&wQIml=7g0g` zw6X31pZ=9mtTS(3OI}G*rnA~#LLIK!N4ZZI*0^#Nbu0u>z(o`!B<>JN>HGNsauN-M zmhm&MvyL)5Cr&}ZHQCsStG73&AV*-QIH=jH?}RD;+oyr*+yg9#mM34<*6rB*vhmbl z<0GSv;wsCr0_N0*ZXYZ}N^82FIgj6W+QN!nnTD}m^85FewAkjf7j{I0iq8_3x{WU= zTRnS5PuLg8J4#`pNIL@9=VVo12?Ck9Ji!oO*}3+wyf*6%VJYpUqYGX{C+uVrQ=&Rv)km<7qi0$&z@G zvy1d;*-6CwyxrmI=Oy7~XSpFI39X~*=xG?z*I%IgIneW{c1CdJg2pWbu};G;cWN#z zp^QBpbDyTCYAB~zZRdYxvLQh|AL~fb0s1C9{;|9r5v)o2#2(^|)YK{}0p+p=F1P6K zQ&Cfk_l-VLO18l!?WjhJ6V-ph9pkVRdTVo5WfaZ)>-hMk?^dJN?{keAaGA#^p<_eZ zGoZ(SC^pHbonMODk4Nx(`BR0DZTk<^tR%daToz1Z4yU$X8erZ^{Wfc5kukZRm3Dai ze{_8XSXA5hHeUM*Dh4R6ph%0-tso&%(tQB|8M-?}1(Z?{P`Yb?kr;YFK|oqMhelwC zp@yOP_F)w7{XPHhJdb+sIdk^eXP>=Syz52(+L6-FX{2SwkG9-Y)$}eMb>E zd8RrOdKWDkyMQ+SohPWhHVH(-f|LJ<%NiSM<)?O2n^pR!E^oL)h`3hKj}9r?G_x+R zjZ9$6h=cvVd)RnKQ@={lWNmKp$vm~S&A)xHoI>M0!L-<)-(_Ca{ox7;jZkS@0?3J9 zYu9zNt7+Ckn&^J{>A*)-j(?v~{*H*B~hcUoyy8R`JO}3-Zyv5I{6Ca@#^(3+(LcCi$WqF7-t zYmG*huNSZw7Y=;*G$5UB1_Q;m?#UH4m9>fNjt^Ij^;bJ~Q^;AI+!fnoL%hY*?u9 zF{@I{!&|p*y=J%!E-FT3ibku2g@uRXR%P2+_{%m9#IPNcXM$$;z|Vy~A74LUn~J9VUfy@dxNx z^~)psPoIW4&b0Q;&wf2Fj4_^`cAFT8nzmEj8)dn~#g{n8&d6IWzZMZSq^hIy)E52u zfm_c@FwBGl)+jCgVLW?xDrJwFH#2Hta)1xIF#d>sWVGB#SOsiR1uRdP#ytO0HP(vT zaxk?QPwAJ$NaHOrXJ&?sr;puOYVPRPKlt%7R5WD`Q7UgOzbjqlIwGgvKlrT` zConzjgxdAPE7kPrI3=COjv&?SwQ|XHoqKL!hVxNUo_qCj+e-~h$mqhV?;>O7b~6bT z7_QMa-3sBn81AgSKA~ToB@$B&+B~7DQ{^3NMmBR&lo*^JJ09$^!#@#Fi>t+t!dhmP z?h%hx>)Iy<1rejRw&9Nz6c8&YKZDu*ouyt|@zC5A6z*&80X~tva@8%^d+BOx?0x<7 z{$f_k!{<$6%IYIr>|TD1CLbE6?^u+TX{D%U$9p2BVYJu+T-dtPIRvOzabBc?TF z|0|<@R#8!oyuH8jw= zof`E1v@=RTGIn23_CEW4cic{+kNqkwhhBN5ygi#%WzNK;c(f_Yq)&?V(WLn6>t~H; zrMV&vpVC~vUN{aqyLs{Q5)n=nY^LF`=Xj9Sg97z|d;9b~^JMhBL7wBbg#C=5DyINGw(vt(*weo6xTljXk^+<6oB~eY-xp}jkKp;;NB)|g`svnv>cT?C?chR; z5MH!Ch)+-7bLXWFyZWQW3fc@6*-RPl#=VdbI(l98PrcZ?1`xZ+c)oKubMekTFtG zQ%lFq^FG&?4|x(LYi4E!Lzk=OhI|e_0Vc=~d1@|?eol&hM2Vr{UwC7l#lAT`+-*(Wz-4EU(SNcnUoyg% zSHI?gpX7>&IKY|o8RpNH8l5`L#rV6YU-nrGwy2CEulmuQ1?LonDOMiRiHPX=(+t+( zznpQBUb8@&cRluZTFTUuqDuE8x%XFln)ToC1dPnyyPy^fWi?L6t`o?CW3> z5YDP{F@GOefxxQ>pz8Bx!YKzI;Q>r4eunONqE0yDDHC8wMa{vKCsFJon}tly^1kZ zkZ+}6IYuPrvK&o9l=;TDCfPC68rZhix8CF7W3-`C_`Q+gQHolnq}I2cvq)-snpVdd-G}reDEQi#mBKl_4S` z%DlOEF(Jxmj&R{J(99pvb_fGv%2}Jc5fs zg-DA}c-xeJZZ1`bY1%G;u-a?llGBRJ`c^ zLs9uXRVV+HrhGqxOlt&9`EqPmkI+yBKj%A1Dp8e}+xV;w;V50F*J`<1y0(^ub(xxK zFU6!@CQ!*|G;E+gkvugv@>e1v!cglK9wTymf6<)8`Bmn)O_@+gisid_)|iMHTB3`e z?say-97n5OU5VJdcG=t>Zks~PZE-C=;li>ACHTf)%z1p-va6$k?aG|1y=9_?Qr6I5 z$Y`Dhi&TyT6K!TTvNkjI^OR$2G_0>UqN!i)-l!sV6zc_Qh zy4bCb>~gL51tOxGM2G<*pXf2l?s20+E!X{HM5ORytYB__V;E{1)PZ=K)2d}XGPL@; z+kZjbzI6Gr>eGomK`t=;-iG2)t=tbYGE4j6kpQyn<_^Dfxzhg1)^;5HhuiXj6?~0~ ziK$UwBa_~7K}qTq9qG|G9n;t~`&MYn#RksQv_mF#caGU~gT>N-y$zM9+g+v-ciK1# za`SVT=+jF@w`D?LAvPzE?*2z}BFr-+zy1dZOA+}j2Vx{E!LBu`TBD`5Mgiep$k%*~ z%x*PanxcP|tA?$nIZYFKG<$u<^1r2R(umX3fYvZCGOfN*3b`nz;rQ)mUh|#x$jX_^ zEBIL{W>@wE5#4jC$J_Y#Lx~={<1R11}g0UkSC-2dH#7N~`dFj%nO3bLoPTa87 z{#U&O6(?d#tEXTpgA@o%Y+?I) zwsrq!CDGkw)fN5adJD*fsElZ zY2YQoQ_T_7896zuh;2{2Xy)#&?_Gw6#!r>QjQPhj`YV0M_VHN@)!vfP*v0lEm3{GA z?>C3)`i{d4{1|574RpmP5=xiu$Fj{T zDmqj}-1r6bjB0a>#kC^bubu(Jsxi9z3!YBK%3bMQICQoLv??S+!DZtU@3zW`pzhn> zG%9c7TcffZDi(gy__=z)L=FWTa^AgOgezX`pHn||)Yb|A_aB)*RW%F@PZR73m6wv0 z)xpAMK_eb}s@%`tjVtMwKF{|%Pnox(APNV2-`-7o$$&INcfyNp*CG>hOANyC!P7c*w$~{$ z&v8^eL7?{2Of?c{Y+B3WMfOnyVggN?jCJKPp#0;i| zN3v=wDGe2JNSXIptN1%v{#D)^G_Y0)^K{3ZnWZ>tHZ$HJ|NGtCFrA)|`?BXAUOoe^ zWd0@91#qP6-R+x+S&KqA-HrBwFkot<(K66*a2|bd}=t^;FdH0}Tz~Y!TG-`xnKfl!TAgI2G z{58S;;ig!*sC4Pl1UIn1XpjY~cAmRisXi?UF;NIa)!tXgqUGNHW^nA&kvUDoZFCKM zjix}mUz&s>*d>6EF;qn9?Aa9>r1fou4p4e=UI-tEK&6CrJ`EkTZ6H>g%xMv5C;8nA zpXkDCwjvFm32#C8oK@}z9K)oF;$~S)0`o=rZj*5rm|^TuvKNH;A1H`8lt2oB8#@zT z)fF^gFAM|YE`SYE#(W_E-6#>#RKt^ZqAV^=qyakj75ZM}dNy9A^oeBku`ZSA?Xf96 z=6&kjU^6GU;F7xp9&KAl!EK?KvQ@ReFNIoJ^4G(`+4=R&%(5KY{>Zw)e2odu5Zj99 zfT95AIuN%v!+KyHxx6|lzRmE)y2;(M;*=Nmwn>f&S|Btc_s`xsT#OVy>hXv;2!1N(g8YC5bLdymUd88*2HnA zJ7qGVuOY!Z*C>=CbxF74PKDX!y1KfiMJIS-qM~`Pb$1T`8g8EUzN(tu61Ovg{(M(N zR4jRu0wmK2N5ox=H({ZBJQ{D|Wse2kOq7g3@RIv_KhIdL^rLo70LQ zc$dLT8FXZM3L2+oxON-Pm!69Q-{?(kNQbS|h290%a{%7bVbd?u;xBWJ2tsD}++gdT z4_Fd_EfXQXTd8Frk6OM+70EX$IPuBv{s|dqxUxF}{6Cj&WXt;Ul(dqiJlNZLu6Q64 zmg-ycaC&Mgt0?CQkSbYBjj-;|Nfta+yGIRS1kF9N!Dp_$`s*dZw&)KyxNm_UGmVEF z{me(}?xjwT3k4tTV%V>fnJ*uQu0(u(B?$iceW=t$e_ZP0>r%QjOb5=1aUagbUsn~a zHN$}_GZlFIlJd~DI~DBm`$nLh*<_#k=}!_SFW=!{{koVqa_>^ttrD!QiLKR-Lg=Jw z(xFx+To*$b%K(6a%Ok{|FvNGk5dXRrbOB||z|dr~W%cd8?5ZyrXeID1Z97TM4fKl z2{zsG7WhvaKJn-zz#G!z_u4i4`(NYZ!%!PNW*;O&5P<iaeoC)+MYgqP9I;V76K z1@C`nPB2I1&dh)gA}uKyG=LB|NaEHgO(SYD`U zX=OW)cp~KOE7z7J(o$1T+Tnf&d(amU_3mAwg6NJ8Tpf{xqiUCT5%GBgTPjUz$kr@0F=+kW6(XW; za>=LVQ<2Y9MB7*!-`~^nzX=W4*m$B)^aeD`1Rv(s)ekxh_{KuOn!Uzs`#W-;CT&n?lj-? zP{?rob=WL#!buTsCa%9k$H;%AD^`;=U!4g6G8n9zZsc#X)ipzgxjwxg} zaK`=LHyU2@0N0HF&l_jd>Eq#Chw6vOnsfa8MXLrX`yzEV9(EqE>(bGoQfDapfvP9e zHfB2MEcBhJ=rEKkBW{yDHd04FA{u*18naMH+U_tUei@oVd_+=RknkiNnfRRiM(_$| zhsMpvLlOAvQsPJF9;u5H;+cS@-&Pwp!e>Cmnu5s_* zZ?fAQHv9!)3$4;ilqdNiJ9O-gWaZw}&z~4?=ixMLRSebA9jGnBv0)@5k2jCijAl$L zA%;OSX-tf3V$X82UQS?U_*{|Y&W4TDpFY_T$$AtJM@<#0fmPgeR*nwb@Q*0hgv>Um zdmCrl%fAgGJL4gL20ihT|Y#;eBPw}RR9-KIg>PDQYu zwfTbFHE{kPQ6+Q$uk(_Sv`f)PbZk_QZ#QEjp^?a#9XP#y&{Y zRR3GajRhJ6k>_n9_yh02^hbv)^&tm%&uu(50|aYA2QP^3GL#Har%U{4Hrp^*0mom@rSq?mE-mGY zbFDX{LFNt>gYxz1ub7UYC}1XEdjs6UVKPQaYtRba6zGRS7<i|qLqpM4r+l)jfLwo;Ju$(!GIK$BQ{6$n4QD^rkB<--VK zn3}9)!lL75NGo(xir0)Tem1`$;Y0KE-wKd!`*mE+k(u)fzAw8*Fsb>7f?d4L`#&d% zZ2yxC>UGX5c`t2|bHiF1qlHbaK8F2~1@9PS4YQ{jXejcMW5@iV^BdyyBVN&5X2~3) z2P(A+d?P7U76W#1PTQISW(!$vYq`!vR%o{}^wQn5KSoM&IB5c1VDmCioo(m52#fDf z5nK>m{ivP`%F@Gz(t~@g`^S{@Kij+~W7T1hdHm#w3fL8|C(B3*Y}qF5hxNwxeLt|O zxb^w+AJOxkUF3mZ^G*Gs2@qkr@dnZwyYxV7=y}XVXra}gK20`mjx--Am_8=IPX2Gx zTfwgfbEuX?xn6*qe5whsBVoLJ0t}#_)knf){q}Did6AP4aUmxxie-*}H!49~OFd~H zq^Wo1(7gRp{hvD@?DmtkD^dAUfrosl_Bbg2{$QzFS^m89pK&7cx(8|Jk4}fJUer<= z4ZwGYhrSm4>*8G&wcL))8NK%mU>~y%0ppecSi`~Y4l(MWV+N^b{q3x{W9RqFFi%m! zD*%^9?z&_w@Yked2utbUEkNDI{!voV$$`S_g3gPP3|Gm>wkl0Ql$5!?&rkFZUUVXi zAVwnoyrs`eu?Gf8OP-rdmZMvy!As4}%@>~D{QWSWvAa2ELC5n72+DOItjmkzk+~Xa z8S(Cqz=q8rT=`{+n4uURLg`hWzh_eE#9Icq2l&@}z|R-|Yx4 zc}jq|6AiMoUqjbrX^z6R##Ugh1`gxW-}jR0N>58W#X$eN4Y9k|^BbR<;f#g}u4U5U zYp{|9`VnIgYi&Z0G(QEyJgU)F_~#f|Sp%sfov3)AX&4SXE=rN&7HA6p6(m`yRWP(T zSZIo{v$t2((_@b^YckBwd?4vJSY$@MG+YPCm1>5tjQ zH67AC4m(A6>D!LTbOR83XP}YZ1qhp{Q|m6qhhAMIX;?q-9fUtFoEq zryMo-)3ESv1{T@Y!kFG2$wo2maha!9dQ}aMZdz|+pul|XNe0!L8{=wd&eV>#8qN?(1`;c^1IZx3OWz*>x)^Vx>5$~JG5Pn?I^tY;$V|= z2|O3<6NVX_x9Se$s7gLfQ>qTKw25bT-!H`b$9I>L#4zVIh}tQ{h3M@yBvd%fH)K`A ze#UMMmU~J?OimaY^`NxLNv`*U`tSW;!B4qkNm-H0n5 zm6%s(*TW2n)$*Sh7RRpOzGlPx6OO2DtJMz)+}7iUq0wg1j?qv`lyw#Uz1NndUkh^x z>4<(AI`3EP%xwo1>bO6UF$d@z^Bpd|dE1N8~rip-gjq$}HLp{$K3*4}gdJ`aaaPo12CdgmmwHIpxdo?hod9Eq=T* zt#39deEkf)Z8D8Px=jbaITmMMzu+3Z+&Rz8%AD7;=e{vL+jy2^zT|qL<0N+!%dJ~w z_4X~=r5gGkd!D(y2U6_-=4(vx>oW_97pf&$#ddW8_uJ0kp|b?ylU<%mE0ehNMl+5GO5tKWOKrzO`&>M(i(-g zjR*xh)!bnzObWYndD^b*LwL*#QgB%GXPbU%%u=cPg<(fH06BZ^G*rdvu<4a2OX8_A zZB0z#mJss$UI~Q;*UG1M3%N|bt=uE7HPQi@JUs=E>`7>yg5uq`uOPL zaUVX!=DbglUv&?@21hnERPAlJBdz=7c}HyGM%NzQD;dg_8Qn|d9ods+k7D^}&1!9 ze6ZN+>O$$!yz+jd@NS%Is#tY2V1~KzoE(Ib0Y5}0tZEx$?zu9Z%1mnwc45w|!u$>B zOiuy->naXx1JeCGE+vE_89(YSg&%gW21VHCahrvg03AAyfJm^ zqrJ&#&Bq0>>zei~mNkNvLrLWT=*&iUu+!7))`nb9HfSL3z}`2Rf2}^c%Gc}E7mq4G z=*Ylr9(QI2kK=tk|!Xx&K|9#`bB^;o7etoq<6%0Q<=>>R{kiZs$OK1p!8r3E(2QLtGQUi8Nj zx&nn+Sy^$LZ|z%8uvI^ua~3;VHo3mO$>=cgW<=@*yMF%DQBP6+#QE3CfK_7B5)b!} zcTtN9*+Eq8*hZ^g)|h4&RYnB4V=E^H8#g>9oPU_XTBji|&Zm%amUD%oF5O_Qj2SS|o73k>A zk<$?(8@u-H&zIl7^erw1-zq#*G<#veL@yK&8iyWe^QwsKVYJascyWRGWH|1}<;z?~ zAgv`GzcEHVi0qiWFq}3u^-T+bd_HH_s{6S=rI(LIxlhma4RLKIu5v&wW;VK+V?DDB zZH3yGpVq(Mk!nzT>ME_EE_=j>4{G<1;5#}S5Wt_x_PQ@56V|MEZ5Oh@zl=gI3?Qol z#a*brH*DVqvByZZw?R0!eEMfhC1&ksYv0DApl_AeUAZ0H1vc&c$LIZ1Ivd!?0_BCx zQfVr{+WRhz=+dI~T1``5Ts_yW^zfla+|P*pK~?N$D_tQNyf>$7_mM0{$eE$A&SgJR z(^xL@XxV*L1k*5VqRIOdQnX8t%9ji3ls@Pb7C-8Z&xY_gz{EPM>8C_5b%%we87=|> zk2jhx!qDdzb24aA3gq$j<%WhH)|7g2I7(i#fuPa~`Yh_EZ3 zFB80?H)7N+r*&zH-*1=sl>=A1?*BXta#*oDqcP>8j|iP_}JqD)Z4!pvYo$aR~x)kxBUK&UOYZU z0Xw3H1Y4237LrOFu;6h75m@pB=X5>qeHpap@?LyzyciY7QZb|>!B z^ra8wezO0m&ROo&++>lukS@oZXWFivSW|Pe8tYv4giWiUa-v+>-{~0G8ur&Q7Kl!u zUWp~RAP&iHlyF^OT=WPy&0buE0_7{&fN`4=_Wu23o_3zPNs8YCG?OLRAgl>gAIWr_ z@059S_UtizxH{Odu-Bc|z56G-MrsG+`E#3ENnjsj@%7$sp$sw*pK|SMM)}Xxb9?2^ z7(}%>wkr1RJO~P%U{wck+tqV_!yH0^!CLB6fiBotGq*YOw||%BA~y(+(7LpqBI-Vg zpiG*yDa%FyI#Sq)Rd>9TzpU~3(a9&Kn$lh-Uv?}2rQ|qbpo6}bEIzUntXLLy_Kj>~ zzh#X<@6?P8_nx<~&*GY%-9<8!iHLlQX&6EafJ`8U-b^;|7zB(BI;!>WgUxp%nvI)a z!IiA~Di-ODhnc7aElo~w~zo#WaR2^2T2DtECy=_#p;THbjFFo&>L9=?m7AJc^tR)xvd$Fh zzP^Wt$9H>)XttqZ_nz}+@zh1QXj9%UK(jml{j)ew-j|BFUuL=Yv6tHpPg5N1!tM4v za~eTVk=uRbAuy)0%qCeibJP}xqEg~cQ%zdrYdD})qq1c)e$Y-6|DK4(a7ii}=1GBim}>2*>kqUM zGLw>e$hgzb0=T58`Ne=^w7wvVFb5l5Ud0VpdQAVER(DhAs@E)E!pOd~BVG=e^oM~k zC3pEuL37@ZY}ErAWsCoVi&b0D1#r(y8i>PGE**db0f%mzQXQIx4jyTR$kwK{3q%1= zuFshri(zSFzPeL55I0WT*iQVL21xmptVdstO^XW;`=(v+EbA04|D9BRGB&*lRl(Fp zf$vNLxYE*$ffurtnU;~^N`<6&J~s!rov0l<-(tN?hq>+t?V?-nOxivnM$_ASS0msb z^c810Z{OmVi4%1C@&5P@=KH?qmCLE*$?HWbX&Gs~v+{cK%zZzd`yz7F< zr*!SG53#YccuzIBD&*Ak2j``xs=R*m2)KohKWEEKvPLieo@Zhx<=OU*BC?X<+pSO>_)PF`dX|)h z$jZ0PcR5(63fwY%sB6!pp%M49<@YxlFJ{HcV|nE`)yx(9au)iBn(ThJMnqTocatYJ zfKetrh2gslIPFs{;YhFNrWGB+zkLU>jSu(!p|0;qy^hoOo@8tN$k_!K@z^~3SYH18 z_V)Xh%qdia;5sMsp@KMU)F-it1CM1CXLq+Hu$#Q!V4$Rf+2nJ~fF2$>#AUivnV7qS z#)sp^#6wlK`=_IHFBLgnAd6Uhc5MMYM-|ax4QDu#`$WDh?FlJnw?3t9eI1HbV3Wnc`luFTTYUC7CnL`24BpfPq(DcHSYPl_(+T@3oG;A znCRE9N7evHbHY*X=wU8}P-Oi&;DA3OC^IgQ%hO$EE-_RjX$t-T=H>+?Wru4;$2 z8)QeBbCq<>b#qkjX0sq@GA8}vGUvKXRrog=8EKTm>x0d?yo=rj2dly!7f7*HCn}zo zS`NuTM@{ZY<|@^mdZ7I$l&Kn^u#6xLO)&$q^5V^rp)ZfJZ2NT5z=rR$J6P|`^_7VU zL)6B0jN2lPHzE%G1m(7&(v>d9LcOzpnid9%yK9x%Mf_|{KqMy{Cd`l8tpyA0Z%$&? z`6Xh&);sWjs&z5LRwWSE^5;OrfpZo-&U-133xaP5$HV5&_1|qYr{+Dh$O#53DaFdZ zNxsH<%Vvg(mR*F`7On)=U-rXVc)`s-;0&3g^}y?()-5;o@4)af3J- zWUF?`$y`$FwO&g-WTZdWg{D6seP(=}WrS=`LgX{RF}MQ((#h0PT}zB2BJv2-c9^{A zV)wfoa&k&I;ALy@qFp?tdj#r9^&wmk8_<-+xinvQ0}p zvHXUS1SsW4A}N+AKR@4XVnu2lV3I7{+}zLS9fXSltK!#RxAE;2CFa_Go(JSHb<4R` z)d!m9)6qyfJ}Md{VB5Z{tI@yldtiJNnK?N6ct^b$yQX($xJ+CP&Rl}@8P|mBT(@#P zrZ2&}^EG)qqO`x?r*$YtQ(1U*`S`Y5Cpp*?$mq+@V9C~K9yOr%g<jud4IEA48O_uA-6(EseT5rvxK8z@+&77&r(Im1E-%x`O7a=OSYO#qIo} zId^EQN!PotQkXK+gkEg5eAj?!922~UVyviR4oK}oj=5J1CrhGvsSf*|h*5}CD?sG* zvGK=r|192pdjXG7PU>4<4+VtuTfn`Leg`s(fI!xQ{%Dt2b;Xw1BSEP`!1I$4bl%UZ z+!Y#FbkZaaoVa|c`}2e2#=O?)fIBhwxwagxfYo~}BXbs?VXFucW^pUz`pt_@>fKd4 z2GJnhi0reGk!eeOM(nUos8&0DIo#l7kWb6e67Y$(=OalldLm^@K!CX>dNcw73IRxl zadxZyHc~J41>%drsBt;(C%+wpeCR$=6AT0w2~{^6V^Z30yY@(3pjDeGgTBw(zcV<#aqHFe24r|Q#gIN-};l;-=ZazprX%;RQ`V*O%^ z1AF|@y}zP1F9G4NQl5Iy45)S*NQ**7fIF3@wlXD;Rqqhib3wIwv+};VFyrsX6aAIa z9ZJ12Y~uR+mB#68=T4eJ(bklWh8BLe#YMb%Pf&?xgFJd|S-C(^$U6eFX%yO-6erlr z#B$UQCa(pU*934S;75S}%ZI=ja9E6pa_Onw-Z(8RuX8un;$64D5WpyU z3L5`oV)QiUnSr~d22uwSJXVlW!W`9N)|ER+Be9$Bft{BNc(W0)v3I(RVft2iAesV5 zUCEDUo+!w6LEL&1IZFQt<)absp#^Mf`{wJrbl{ZF^KZ2eW_=44lz}JVHr@KhPC$56 z2ROWzBjsQhUaK|pJmB(SLShigY9=ZFNc?$!wyP04wp_V&1XdUbEU9Xt+=3y~18kL@ z+8R@m37CCO6~fQvIrR8=pP5q!$x}H6l{;7<$o1T{K~N)WWiOv6MxNj7l{~GW77wNO zAJu`0c_`}TFawcid6yIFRp{!3xw3^v1q5OiT?#4I+IhsWWF&6W ztJFv$x2XF=B7&5bJfpVUvBLmee!`ROsJAE7<7uV39*1d0bKK%RZv{orBtWtc18Tos zn```NbrO-%(bJ2cn`w`9AEjB`U%J!Sa2A<2p~G~ap#$7R}<)J6C^7EFXtpMV8pl}Dt?@xGi0-{c; zU@vAs1`gqXBG>Q73#9MCsb`qkh!0r@5=da{#q8E9+>^t4e{{x<$N~0q$kV4!Yu^0{ z(EErIm#Bsn4sx29=}8xW#^}m5YpCgBP1-+Asum7dxGfE={CkLSv2}~?qojpF)DWHT zqK6WSegvaxUJ0X@r^*9a9kU81Q0y`*{)9~1Dje!VFNVf4?#a)DBKJ*|FkNl z+XCl*;_9@oU%wWZ%(1^EqaU}VsH26OB(NOrNZ>k(K%T1}GK5<2-+^qOXgdMVP|i4l z%J9jA_yuZkP)aH?lH%V1bXXI_UF4)D*if4Qzu^#Wbx(k0bY1=L&z6=UI-FZV7_>%D zXaRNvw{`rY>QITb{=W%!nOS!JSkBu7%LGb!m>3r!|KuHH5DsCKs`lPakg< zNg!A!>w@NR*wJ=4kNwY_e-jTBm5sd?0%mxcU(!Ohq!KhjAtJBAIDVGvq3Tc3STg9Kbu)WN>L!Q(%X(J%V9{zyVch-MJxFg+dB z2t&Gc$9tLhg0JzPfd8)26mXQ%V-FQE7*!BjhcXQTwQKq?hY{H~Lg)W-^bc>92m?3t z$EKK}33SslRbbMGr)pbO$qWp%3c>E1w)P_XM(#@9|^+TfH1&H;s$YY zBzS@Far#E;Kfg5-|Gw2^Ewla8ef0)vQJr?-gXFhw-`0HiW7~Xru?n<~LKx8PHZQ@= zbQmaS!JvVpC&s!m8zg{*x+y8;)41=-;O2N0c}E-qA&?z1Ipj0$Kau(K0#ky!lwiG` zIb<73pg!81&a?(@uk@(5pv;V}&3hh;{@E1`(3Z&Fg1zVVzzhv;ecj=@AL$ROK=L+{ zSr6z{4v#Ni>DbuhME5r17#hD1(9bL=dyGsn4>EFFP%bA-Nm!ieP zYT)vEdV0%;R3SnGnV|MnN(i-pbXZGrx|T5donXE0qVQ5!f$x^>x7lWE?av1)zHF#{d%u9_SL^gj)1l|td?Lj zZ2bDra`Jgjh7+6+UY(un5gEb#U)xKPMR1r+=du~ zU5C-lF^DfT-K_q6-}iNdNN<|Gsqp3(6lS1MDnJ?f!eTDqHYf<&WYzlw2;je+A?g7U zk(*;?CFAitD4f*oj;%@q1wbw`LUP(? zS+mOHwaC`Gz1;S;IUuzua8%uWL7*&)p=KN?-r_jx7YVTL*Q;QKuKna#&IW*&dCmPv zGiVTrE~+khkKI6R4^sYOjEe>HQ~3c>ZVJO859wknE1(C;$M9IKW(QvvehQY}!$UGQ zQOzA*UXV}$b)P8nYDE|RT9+opq3IF;1KcH0CR`6O$k{+e{U2eNGJIs@y?f+H9}kes zYyjZ?hj!R4`H2?fMgC$!U2KIUD?57|JQC1l|JzuLJC=kaU6ba|W21nZtZLs+{cjbJ z$n$s?n7E5lB~XA%@igdNUy`^xVi1H=YX2=-EkA7LxBCsXnm}LWOdeQzXEH!7ceADs zfRkk090fORr#TdXKL6P8QAP8c7lS-0KearaEI?Rd5*5{#&yWQ*WSd%ARQxvWCA4gcWblt0Y+9SB{Z8ZN^)3Zvq|NwE%aMXdTU#d!G>8FS1u*Dh%uq=v zNFqvZ@`+mv!c1(LwfTx;UEx|4MN!5Y>1m7eRuh~V`}(pw35Dn2Ka^7! znd`hPoMw1_%W{(|SE9;msc-7^=4odb`Nxkb32yYK;C{{{{Fq36qAB>@aw1tZwQSKS zcV5r?bAfknzqN8YOtw|g;cW&RWofJ6J&vC#tlafL?Qh3`_|eW_2}c8-Bn)s7=V+EbSc99B$EkgCX~Mk6QsIBD zZ#3ZRj}ZkBSDMiGCvQI=1b$|gX(+uAta^XDVt==An;HtED;|JotU85Vx1#Xcg1r~7 z28d=&cb1HLAujucc7`hmvqd#u{q{i>9=fH=9u@C_F^jXAxU;uBsUQ-w%+Sas2X1GG zyX%ok#-TTX+XS&KhhF}fd5n1;4t`c43~)Mt{H~JcvwfCUQMv^e5ot&_!wj5lH}5}7 zzuuFI*n`!Cr~3N-1xZH%T+w}`Gq%cS`fx7LUAnSeNFQG}-G_%vQ=dT~0s+{DX=)bE ziv#Tn;U9kN1Q!zXz*DUDMybn}wqriT#As)@#=CCt>)H)OFtf0n`{&{4d~d_9vGH{I z`YH=#?)PM`ShSCz1n|3oMP7S;ZwJAS&fJFG*8l=osP?JYdNk>Nn~+pYiA7e2CvJ)u8PV0{Bs zG&EE)`0efN9QSa%bA<|`VRaKb_#h0Z?bY=miw0L8OgaD2D5TQ>U6ExLp8hsCP}Sf; z67V$>%|s89%j{=dTamCH7<$VagsWE++=R)<$uj_Q`Q4$y*m<{NNH2#?l9Jb=J09gO zTwh{6Do;YmmC56-Ds>*x4@4K4x4bs`K80KYDJU-~A=p5v`OY2o;BDcLyjH`hzu+ygLMaK(pA#3V&f} zsWiGqLidWsbK$J;L5-{)4rFg)@&v8>mM@1OiZ#vagFcn-wHmc^5G#1h!%B^3JPx0P-o9-4^nt zXggoc=yike$8nw+b3|pPL2by|)>cp7j0>nMvJLC(yV?g-o5K(ruldyX%W%u37=HW6 zeS389Aj-X@&uG+RFAaP)tvSyKl*y>m&>~3xXcw+WZPuI!=CdtrZ$C?PQP<9Ht(N)* zj4xJxaS)GPLzfyvTW~@#0g3ce*Fl8Ce6-3_AlY>E?Yw-WUwl;yerb8JEhek~RPOP} zNm>tUs^59%n9%fyRM6MCl?IxP%*7FuwrQ+u2slBTt^!TVH)U%-=UTp(Qau9VpGchr3&%S(f)tkn{uu>mi_SWuYEaa|r0LEN(Fa`fZ{HSw@ zl;wP}B?b4-XDIx>|2?_;hgSDkAOOn`_C|&6Duj96LFu%Z5wCei5XRXNR=2Y&&~wKb zBcFHFq%7I+t*_s|{1<7TZ0Z!P#}plEyD9LooZO1J2k1_{u02v6J-3UO?iOq1H}ADT z%vgKBU!}T0?G~ixHRqa^x{3FYehN}m9Jh=CmgK#+h!-$E6kUl`5N>_2zsJ14PQ|BT zw^h~7Izql{19~5z#Wk@wmjIqRUb0mE$F45Lc9@<$F30dyOyawp`RJ7GtZn?I-qzS;#@+HO`gT_9v!iY~OXw&MAr6`7d}T%+d3#+A+cAleeWxugwh667|N0%RRFjO?3Vrtx$b ze-wpz!`LtnM^yDm~99s-H+j0@k9)!Md_rHu|@Z}wLzKIdHzl-nPobF z|ANLN;|rPJzdMLL7|}@4o!oy9cB}@A)$duGuWxot+s$$Qs>R3{^CD2MNDFC^b&BL( zC8n|j>MW7O@miDc@zp&e1$EBDtPnaESXEEWgP)*FFs`c9REaLH{YT)>Exs4~#l~Ib ziERKZwfTJK&Yf4nF?=!4Xj?JL5?15ij(WQc*V`^OEFBfTXahs zHH2h2hMXdyc)qhi{UD)hI(wHmTG}O~u%Lj;@Y}M0u~}#78#_B8@5FyfhUR}2Yk6OD zH+R)hBv-Sk4T2rc#Al8kQeEF$whfm7KZOQa<>|)4!cy2~Ps{&2QQfjJ%-AvB+57!F z@BYt|Fb|J~eZ!pIcP*L`;7OshJVk0!olC$@Etba<1ZN|02^QZ2f$3qOeLAg2AgcoW zM}UQFBr7f(x2RpH8w&5N@)WGAtIzhR)~y56Bo~B0fYW{QS+Ml?(Ub<#V~v*=_~Dn% zwy%u))6%>X0{26M+Qk(SGhfD1SrMPUG@ zAs)OuMYuyiI{O)8{^bx_s4l=s%T_SAp>DU+o^>IB41Al{dtCq;PfkeTZ~=EiNd0>@ zh;!pqbGFuDwLknJZ93UaVQ+>p!mEvqnQC120Lj`-4-Y+uj;7zQS7g@J1TS{OMgKUR zmGh>G(6l^Mcq`bKu; zD9yv?`LB1^19x$Oq`c5*^wN(~a|B>anC1T5oeFQ~0@EyX@H;7EwoLeKWE)srhab#S zR#pL@4d4>~^#_Nqn;E>Rk{~`zM&RWOfk=u^?f8%6M}fGd3hW$I_fNHNSIRWrGrm6F zuDm|h;cb1qM>KoY`l?L>0I>od<3~KBEO=t1EI}?p`BVXmD%klYrOXQ$S!k~YT^eM+ zMhr+4DHoW@c}(~=Aho|ZSbcG)QS>`k>#szhL=$2VdwFKt43bO^YnCNn3U(0z?54ft zT7~k7Z1e8DWjzYdPNwq7yb4@>jP=}*b#-6R_50l3`+osfMq`bfwfh58S9YxVbd&1# zc8oQ!UmtElYWDox5|^?h@2K9D$_j@2B9^D`al1f`;F0bUk~n zPKlmbrc%$9i|NG-OrAkZIwiy{SEef@Bq_`DYwBKDOkNLika?y@N3Ulf_7@ z+$?_nY?A=^amVcVX;6MZCw9bbo*K~*$*!B8CL7iByo!|GZyuP&O?QLD9_6SJzP4%w z@DDNT_uE&p+x0*HfIq;}Dv0dgIb2jkKJNhip!Zz6=)96F>_e`w*YG@Z+k1*4VtI&Q zD8XH9B=`k{Q!|uO6wYe_wfM6wF5`VlJq*~i5A*@+oK6e)sA%W*gE=UO{`j$7?#!ED zHuyI{g9IQZm)*BFpvL3r6G zbj%Rs7%H+a(H8{jTN)eR(7q2q3345mH(oo7_;F3t|w6j zWHCJd7BId&zGLl(Q&oTU{|I{vsHoQVeHc3d6BQH;Kte=P8WaKPk}f5syJPUEARwTm zG=g-D#L%GvBHauP(%mpL|9b<+bI$wy*828ZE?hHv?|JsKpSa_?uG=^`Yk$ho;s9Yf zg*4E?!QmjbH}LQd(0f{Nj#gQ3_To%OPYAW_06ejDyuEw&L-))oJNQ79lRf#c_cE@) zriHbiu_#mv*0A?3S)10fp6yAhUxKY=fIb8eM)Ul*sdkm!lq$e@kfCZDAw+k|tgGu;yiweZy4>u6Bm{6G#Cxlr-O zGLEHQjlar{9|- zzKW;}pnZJW1|L2WEwi+9IlT+_ST(3*=3bW9Ia_=ydTO!Qd>{FDlGP_Za2aLWub^{L zeQDaLczMt=ba4n*u$3uF8#-@rhqExG&v{I|c(M76i0G0_R)&6yF89LlnsNiOJ?>t0 z`~2k#IRz-EYQL7-AESLc_7XC(vU_n^a0*1-x^a$n3i^-sEgxb5=R18p_Dd^6lCm_; z5Ou1Ybg$|kFaLe_7XVSy>|v)}o~R_Fx^t&&DkHZ)B#}-f_qfqNskWQMh&iFvb!MN^ z*hB^J8+H2;jL1}(I~f{Kk&nO$d8CvJ0U?Kpx2M$cT_7lpE?yOsYKN8n;JDpe;=F0~ zG{uG#1@H5&7q7S7h`_Cl{~tAG8yrDQkfd&lToYd zR{$bGINA00?eM;RFaI~ObpIx$TN_~z=1|z4Eu4M!`0?YXj9Yp=ZR+?aq{bbOmhRK` ze}D-D$B9IN4Hge6cev?MA;{y@g)lXww1Y)>!+H6`2c2J_`}*j}3A;8ByuO^dw*v0{ zJl~fr#UUVmAF#sre>z1Ty_y_hw)OSH*j2{0r|7Q5%e4HFd-mPlMem*wrOaJK_oO%P z@xl0*kx(^g9XPf*EVJDnW-qXsn3n4dv%MsXNWgUe;QNwUzSi_k??5IZMp_KQ@32pST!XmqDSMx_qjScYHPvgz z*SBr=TncgZm>#j%f-gFxD7g+V#DAdbsG6a~_91G?jCC z^jWOsnT3U4W*CcHEUdiPd=`=5PbWxJg?jSD-?ZZ>lpWioOaB0NFU-gk6pNC z5Wv1cRaMokI@gV|39HGr+`g7vUa=KJCv}$+1SGKYiCt*dw%fbbpV0yZ*MNQS}SNIgZN)*=AU1G<4IAEYru-Vb&*BVP*2<;WoQVFj>4Tj z0R35ayy)c*)vD{lsADL-N!*!_OrB_AUI7uum%s(O%;HrM<5KLHSoxy2^^19YYWvlZ z;Sv3jWR{H)TnG)#{UGu*wNmLlK9AkNF4&z4Bg7z<6@a6ENfpG` z$xsdiIVToF>=f>rWq|)Cw%;GH)rLS~Tp8HyO$OTZ%{>C{{#ycz5Lc}9s{0@N_da2?{kew*S@VQ$M|CN*+ep)?L`vbRRq+ zrxPqCc$Fk2?39*>puNUjMRIef#kco)=4xrMb`vYM-0fFeOMTPx)`~=In@JeIM&0Kc zJL|kqhjW;VZ2+h8MaNyLy9jyWk(5N=K>(!eGA9#~X&MGLtmW5)Rwh zFOaZzXp2G;z;k^UmsgM=;aDW9DWxw%>xA{oexC8ESeFonvHl@V50 zY$d;X@%0{My9rsM&XzTX=!MV9HPqC!v<;=p+1t1%la$ZES?sN`+=v%LIe z?YkG3v86iHF&dtxuDzn2sRf`Hn>`UBW)U1^gK2s8R7aRnm05MjBh z(TBg67$oHVUvQnWS<1HxmE zxik%0Y_KVej?;j%7QCV4#$3FmICL3mYiVZl6*$88dHr&q?(xx0W}2}^i7 zpu|JsugxmD2tya{@^I7cXg@Smj@<-@VqzhmwZ3-Q&Z#OhkQD1~&6(Y<#KhR#Hu-_* zGS(|NEpbKl?^fcy(iDE`_j}QK@IwkY{n`tpebzB9(7uBCzm}LGTdbUImx0wnoEwij zmE%2@4eh|PP1db5a0yQ!r&IhY)lfVi6E7AbKk}(5R?wi_qs)*6<-7`#&IX`HeHjbt zuZk0(z!r&}urk<*i3?@d14^=TEXe!YdwckL$%eJlwGGXi5OYOGg|Zl{j#*E|u6uEj zaB^C|95XLADJw1ft)s&#qii4&(GEL996;+fa6Ms@%zq{a-_5J6kh>Nz2}|iR2NcYn z{>IJZMgSs!MtK9zW`LkCy8sZV)qOc5B#KwsIUU9#JP`dwAMVwwP}GF~+Qc=v`Va`q zAThl5)XvbYGGFB^U1Q8O4(rK8Au{`~=}{uZSwPPy-mSULz=fz?;>r|)m^{HN@jURx|M2JM|B=yt_U0&2F+^&9E{em zCKU{o2m$4kFaZ5cUbBrq)jJb{ndD?^2Q8H`j_GUv3vJ<((9*4*TMq>_E5e1P5sd@ zKU5i&zW8I`R?GejNMGm8<@SdfsLu#~wkC*$~t~Fe^UZcHnNV8QYo>(klIhO zkBlBOQJGsm6Fj~nR9Q2z*e6mXS3|@x`RmYRdz^nLi+*Z(`IC@%(M^lRZ1W|eI*q(1 zrQ%T|ZQma1?L6+?{3Tm3hI&ZDnxk81xALm&cdOP=l)?*XbAg#m;JG=4+r~!dhh8RA zc^^7=*zRW8gXHi(MBkgAEG#UnY8!{R4O-&2q9Gvr>vmYfrucr0<|w%8F>*CQ8Mm-u^60e08{Br$$5-ZLC)Tz}@Mj1d zBieTi2^#2n?__-32ROiMc|r*;T6nlBI+XmH+gy}V-ps4*PUO*VHoa4z0FfLdS*#an z9tvd}jGgDd3&Hd=jToJ7PfNL9JbW7=(8{N<@ClbSj4-ZrFNcJ#{nqQkB$zZby#le; z<@t*Z$vv~3T5Q2q)Xd8mOcemvrzBb7Z9KT zAWczfnJ1;#8ZGx_237ORSm2(vvIMIsj;sX)41@G<|08sc=W1BlgR?+2X}6cyA7Ds8 zHB+%jl7QpG0qyS|5zi8+S_w;3IZn<=^Y!^sl`-kiNzFQO#cMv$`$GwjN zOUH-9;2rXhJPBmWRdS6HNCP-?8a9P$L|&iYygAD9vXQSYE2}MA|Dw{ppa*veQ`fzM zUQT2NDi;~OZ8z>1Hm{x9X_k?-8l%G+{-`l+1^OsxA8gnxUh-9z(Tp+Kox@-ZeryUg zlod{;wn#KPk~ynO)6(Zo)p?Ljw3DPKtrUGnK&~YF;w}b+CK|S5`L<#7fd3uIN?iqx#v{p5>YEhgP#tqoU*dKd2dSP3ryr6F^8KU?&XjJu1hy$ zFEY+24*HrLAg$lBt``-rK*^Qpwo1bDGE%-kq7{ozymQ&!=VufV@c14({B zUo?Dza7?pnnzRByZ3?#g++k-b^|l0}L%SBPKZ##?4Mm;`7W=DhM+H^M?GZxuh*zt(MXJt0?}7!8)cjOOFV z-$r+xe;Oh5GXP1yLMXJU@*q|+4P_ocR6n%uhdvPU3Kl?7z+naoiEQQ=FL!L)CJ7JK z5;r{DC?BHb=>r)C-t8?F@3D?NdoSJEP!)4-gEjL*`bB?YAt#TD8fAhG&B3z#s$2c6 z^zR-f326Y_x8_)jf+|RKYK9?>)VMRJH@5w=8VQ2bUQ>2pE%O-#VCUD59b+k|G{HG#0nAs&w$&t;w>4tOHG+t+ z2ojwuz*~idYry)B)pbyh#loWO$LBKFH#_elp3SL>O8Z^elpTNlP#qEq`xncVjd(%o z4pLEKgV-xLeLfkqm?@|XtquC+%`-A+`q3eVV3&do^`d)XW@--Anqpc!XU;sAq$N1M zl_lw4A(Jb9kG^=o2m!Od6{w)OPum^E>gr?59&sFD{AWNf+C^!(|^ zprG4M-SDbp`-LY=z#8J-Ec+T(Uqkn@q#K2nhd-UR&iG%t>kH|;J5SQWxgs6$_=agP zC(=K2(LcndVi@CCdfsE?Sxb7bAgEgFkd1`*ti+dW@1wxcb*qEL2HQ z%Lx134yd5*wB3ZH(w$ohmrJFKVF&FsgHgwA`a)o)R`zG&*!kY6@IMi(n;&}2sY^~M ziS=v2ICmx16yj>-3}ZE2NyZp`1cocZe+W#$I_P#}ibL53g09fO{LRmIv$aFUOkC9p zty+CmGZB;cZgVMPAI}qIPMq(O}lA!8$kB8!YB0j zfl25>G<)(zmeyDlDc0=;6)h7JR6fw3=EkiaVSMvr13#?D0E&~f{HUlgVCnB@Dx)<9 z(DAEnhZJ+&JKPMvDU7>IWSccO5A85mN(3%}K|2Zd2q<3=B+8MZ-m|$RB6dWqg266bFX^n*N#8Dkc>sp^&NwoWe5oe7xIoVW*-NWEva`VBRFYlei)=nQ zj~p_M|Yp1bhY@Ok%3JGn=Ro89QIB1eZh-wTsc1`UzOIMI=Sjnz&D}k`TLn?zrhv9Ib1_z_5jb zES|DSH(aG7hhoFtv~NdR#HgqG>0(V{5=)I{KBvOGosqs^!4WA4c!1 zp9&Wz1B3Y47~?*AJkdhL|g;k|(rW`?@};IppL6UUAbYe&2TZCl8Uo z9HZWJ00_dO;pcw=-0=`ldO3FQ;=vjV`DFxtu`#tXB zWzc_G5m8dgSD?Ffizm^LvfQyjLlvQ7(pnC?mfX^?M1d~&q|M8OueyKV5pSM?fk7H% zTh!uwuT|lb=aR>6u&Y+&zaoUC$Td+Hcty`q1PNs+L>GsLSZTugXXoqxcuTGubr+(j z%0^<(NcyF)-QAO^JSPsNSBeLL!ScO-QvBSX-&q4_IVjiOt0H`~M zq^&IA02W)4Q~sL)dej}EDEb&wegg2b2y~F^%kNFui3*_4T4Vq`<40;)UmG2FV6Xjm zMT3C{J*-h$wV8h%M36n!ZY-FYA>RJu$3<*k{CiyY!-*5&^a@>?Z)Iyw2B!=aJnhhS1wC(Kb|DM}KIP?lKnQjZokQ z@)yZfP(+$$L-?9DtPU46^5@D# z)V=njV3O4T9ef9@#)<^Q83H4NMx|A9EHEM>M|Ry__Wh_(#{iS*%o>uf+&@m@-}wog zS+#vE##dwrX=Nz3qHPI%Lm}fmoqy(VNjp8Nb~zbhvP=V0e_w}plQ|W!gT%79_L1Cs zqt9wu`gM_kf5O&as$;(gXD-{?EvK)0_Kc{8*eVqa?8JC#;w z<$j*x%Os%f%*+xT9Gu`qU;HCwXFY-J?Je?l7hvB3#E(3J&N@S$dIH^*a_0+A1 zT(beolOxBU$jvT+WpVh%kba6-{DVst~U)-`c-Be1^r?FAjA0rH0r+ zG1$8QjwHy-13|IaFjyHhL{0)5oC3J3v&al*dlwQ3mpk#v7uB)!A!3y7z{P5zcOC83sL7jVTEenx$65?j3 z7RIVsd-N}Xy8xV2L!=xdgH}9Q!qS|PZ3B;N-7v! z6n&jTiTB1!KU6u-?4xdNcpN0t^?Nr~x{3{RPkVU|g8>Ic{33(mSGfL*!88i$G3bN-S(!xyUkf5ctLTL}(9EK>w@@zS71tKsn zyH{uAd@MO4x(aQhAXSwh;B{pRV9|juu1@x&(f5l6obX9l18#`nJt_L}*JE+J*<-%S zKt6sAI*+T}q?pmpP8eWpiPJs#vJhBL=h@skGt-%sP;Cx5Mkr|12C!L-c9o3t&U&!l z7l{atNyrqpDCtF}Ljw3*9PAW)YU?fU?($o3it2Q%+3p4HA?4TV2%`QEHEaV(?WV7R zUD-O6p+l=Mm9y(8g@`aXV(Sh1Qj`4r{e~IUs;jD6LRUz#tvW?IZxEpE)8tcj9DC(B ziX5?0&NO&mc*nezw5@l0RrGd@Z;9&Bf*pHVWxv8VxdLSCX?Aw)-`myEzp@qSoKUy(r5E= zF3ym2MWB!d5cK;tiu7b1*wqtTOZ5xM+htI}25nzEc%3>#44Tr`foeTxZAfFu|5tfyB%U?R(F2b`uPcY*KuCE5Hd4$X2%QW>ui5mIT=6Jg90Dpg^w42gB`8e{sfONlyG3-`Gn7`n#PZr(Biynn? zKt^%mcHYD+t!0EfQbQ3>AlGBv85cah+#=DUwrlHKvSr{`Ib=Cj--7?JH}y(Xl++BN z5)2-*`Mj}`6Ewy@44Y!!lA@Mx;a_bm6aImrPW ziFE{|vNNGqJn2qm^9hNd16pT?*U|O{rQG_C`4$sXcd@9g?Q1LHlg;luJT+}!JkRa$ z*uY4M@dX52dh)EGu+WlIPj3|G&MWW6WF$U4J-cbGrha9NXN(KSJv18`!i3|J{9Nhd zGBuf&+i%(R&~a7Odw12bmvJ%vu`guNTnB$wMo}7Ut<9ZXnC&f?9LgXo zSb6*H+c&;m+qvG!W(b;=4w*!-ncvon0&62t+BZeFju-@D^gkmwfp1GTBiS>%rC zmF$ccoMjQKR^+W0dKc#FfE&L%!IVdnMv}20}0f*LIpx@yV6@g-!q;1 z^)Z&T3bAW^*L7HPh0~J^{og44$K-W25rl|xf&$uHM9LF zzB$x`_Sk&5WPrz#hj?K+q>3jInIUnv5*LJhboSir9Mjf#Om7^~`7+=BA(5SFO?Bxa9dD2x0!n1)a#rB3h3=5x)0`qqQ; z*}QFe7X9W9Lx94kCegYPn0taSn)rr&CKkC>^vjMJ8|V4Y=0pWTq%Klz$#N?Ovxe#U zA`u+cR-OR1cHWrKQ?G+qn(MB%o(jgPLL^}~Gb;^#^m4!$+v+`CM8@BBY>zO{Wl&Kq z*Og}uUCP0sjOzuWgr)CQ^Vhdn4co7y$G}c^HQmk_mz?P=#8S)WTTt{mwVaF^Mr|ZD zxpf32wOFlAD@6@MJb|xIY_v#EI7g+$X;1r2>C^gPt^e~WUM|STvJI&9;&JI-bJt)A0B4y zI|pk-dv8iB6JX({J5KygYx9QA^87&6!_NQ?;`%*axMdN@sK}x2@6=EeojVsz>#p{@ zg~Lrl&&iupZ6cR8?+sm`0s$=0+>^zy{aIUz+>#Q$ zcqlV#IlwAsv$o*G`E;Ec1u7<{7V37$cfek@p6vtlLaMdDuC0NHCh%yqqxLEhV8ssE zKOF3wxppwZ1o)(p)S`$_Ag#hR&0w3k(H3ICKCZ`Q=)#}S%x|J#Rk-?Tj#Rg~DdwiD zIjIXNDt_uxZ59*_zF*@3;ea%yEO~ARE1W$jS>c)K5}fqUwBY?|vR_Rivg|!FfVEhS z`;6WpqU8xJM~@z*;^OL=C>aq@MqE|KXC$aQ@iAaTZ%n(p~8Ch7-4LHs4;t^w*xPaR60o-+hLZb;iuY$8{ zheTh7i^UJ(LM{9Iw%ruVjteY>wzL`cI&ZFSmLLny)laW)FLM37pF&6j@10K{5d>X3 zFC_DqU;30>t48Tvi`uAV4wN`wY0-6Z3{ ziOK#9r9&@tyb9hQHfOueVY8JddykFkskynpQdhn~8;x7X$1~~|p@*VhetNwGq+zx_ zeD&Xx={8W*m6Ylqrb8ino%?P~n}=L^pGrz%$x!!bCK>U*p~)#Jt97&3E2;zN?)WFY z)O|uH`?CY@DvGt_B=Wf5-qzldwkOqksIwW3crXD(PK@BsaouKVW6P3x^2F}^Gk969 zel!5HJ9h^E6y0AUJG{1vpKb+x)K5jSTqSy^JZhJ&x`*s}(sl%UljTmT{E#@USB1<` zB+nB4rMf=nnkJ=XQ?1)wVWO;s6_Xq3rS1h3<~&YIO%|nA%;*s5W0-r@6p|L*G;mzdnr5kkY1nG%&m- zLg!t6@o#xt4}aCEzI1MI`!Dz|)C za=FJvH^q=VwkRyJ9(Nr*emn`aTZ5mm6mn+?S5W)WLf(^VECay~N;xbfu|aR0^so9- zEk^_3`E7Ovuvvk@lA?@B7EnOkLy-W3wqygKvPfhcIYF5GXnTVPt<%4A#7z;_YbSMN z!PLKa`EpVN&o&!YtM>Q0VR=?uT?NoA%Sjs1{=&>av@bFxlz&F6i?_NHco~Y=& z06Tm{bxcJ2j=F_~NXB&%JTYko&(OTDi8WNrhB@Mul9gjd3in7-zPWPET709BeI_Oy zEJX!tam!!FP;3=YaVnZ8cx6=yALQ%+3x`ZKJ^=xNjnw07@?we~g1DUR`%c7^d!0H{ zy?GNa^Ucqsof}~X6MjMUF-BlX7r>M8vPN}K8(wq#Tog9bsp2$$s=(4H4;ooA+iJRs7LnQSQT~7NEo>WRTq*gaX({s%Ig`ak&Zq3JuHB(Lw`BA?6EOElH z@}JFsJv$C+p110;)b2XJ0>|S}LdS>iubEe4L4WUvQ;iWT_5Is@?bd!Mjtf|O*M6n{Sr}`1*XsHH=~YUYoauN)Cjy}S6dd7o~MB{a#o%Psi>X?<7TwpNrnSY(Lgb$ zCyz^UN}kR+2#M45=`e;cYtKLD--5ux^4@E?NJ*?QL_o^ixYz2Nrtwbq2y|cvH8oaMItg<`B4cr+25>v1JXK(MN_BzTIyLJ!XS+d9UDY9_C;vQBi=A;# z$H7(a(k6z{C4?&@Q55burr#2eQO-3;!i>@32Z6jcG$KYX%Dy@!AGM|b7o>`0rx#0{ zfpsw4Rs`qIr$KR#FRnW@9PIC@^a2Am|<9}HtD=jkg>>@Bv;&-ImI2$}a5*htUy zaYtx&c6JuvN=_gwpulkYqBT!HzwqGFnbxE`HO(*<0;If29yZTUrL&ZiIU8jYT<01O z3@_c{kh^$y$LO7}%OJyBcXvmMyU?)H4Mqf2OIICj3J$hPP_lx4^8{;I8V-pJc&dpY zl{qOOVhUM0ue4$JW?(JUI}b?^a%4vEcUv|7u>cFL4h+|XP(87E3mu2c;2R-Jx-G4b zg1qb5xB8M~h14up@;EGzYld2ow)!lou^;?1TLr%#?V^PB^tTtVF$DXu*8k<0(? zZZhXwfdVM?P^+gKDLJowFJuf6BdtOfhz3TLA7B`m)Xe{TK&!Xp&gnQzR^2_jP^XfU zY+Cv#lwm0Mv2VnuPhToYQ8M(!TgfjpHf@YoI%0hUX6-QCsf z&?t4`c3!X8y>#{JxXlc-hl(`4c+`Mf&9H(CaD=c8OqY`^pP@n1=7>V>*=_vqBrVgPkw?1Fi!vT?z>Hc>m^>I)W z0Aqjw=8o3Yq3|F&<(FFzHE1X)f1dC~!ZJdPQpPyc3FtMYNPYgRWMh#D^Rln@3L!Ex zO&**Oc$$uRXpa~^HTt9*5cm!r3FA7^b3@eQ;}}%mN=6xkx72n z?=p0oC_NYY!-wa#qA)u77_3LW(msRk%U;}N-i zQZQS4=q|$#@jNF$tffL#)C6LiQ&9yW1>bmDz=N!dV3LiEvJ;d3Xy1Rd#<#$FYTSLU zq$vztDtHlQ86MQomaPln=9lE+sn$Xxj@sv4XAb$H(j7laa9~|E%ddyyrXIOdcmI2? ztUWU``#M{QGoe%22#!Rp>bIq-BuEWq8)D_jP|L4eq8_UB7Fe&CAxj5U{a>$NTkksK z461m&R%%-$lYx?cj1=~-BrW&V4ZCS~I}fz$d{t;z)1sx;zHG^y>P0`RC80p&qhazJ*R3 zT0=5T1@jDNq9&K22>|nxcmoWuoH$H3359E#o13fGUAu50rh7JTsDJDCi%i8@&*jEi zX&?i|#Ku}-BXXw@{y)&(RvP@`z_E;lLb_pK? zqfw$N&5JnUdEc)SM~pELFzp*RXA%FA?;|kNBtGl?JmTtilY>KqkjE@a($ekCoAJ?) zxljFQf_-JBZkiGv3NXSaZdG`Fd<9GnxYgPRihGoEuWS9vf++kceod{wXVKbP$Wr|G zLE*#Bh03byX7npoMM7I5N8;hV{e4Iof%}xqziH#v@wWDN#yW9Bq=n#V`k{|qaE6q_ zp7nZgZgj^xh|o0nyHqc+i9XpOUNA~pm<>W6=<8n1_5IUa{VK1M(seHJ)E~q-AP#tN z1NcKBDfLy1RW{PS6ATO~!0eQhouOQf^@H&4o(mu z&$t;D$aeLglq+ljPeepK5xiSM2eKDDdGhAB zV%FiM>kX0nIkKMrR9@A*!^9-p@4Oo;JN?m}%&PO99^(k?2o+jLZQST(&Hr?!XFWGOFl*LQj88fYl<8H z^X>DOk(C|$Cdi3BQ|jQ_=qHRP+{WzR_eM?}bj1I3)3Ff%9hhma@4H@Bd(OncwNxK# zzkdYBEVyldI)C|35l0X0Qy$geb^Sfr|My#hDn~&u9^qaCr~c=zx0(=luiJS)X7b;c z{&e)~C#UPfAIj=ek>@vq%<4gN;ExEosGU)XPnHh3WB#72Xmvnhz6-Vxq*3UO$b_$@ zsx$sQhA&hdjNu@nxou74`>2%hVOn&FebU`z=59gLVDT#5wT;oz9R2=wEP=_UFI zP1}BJ_a8rgsFIo@=4cm_ESC&o)r$P5s@NqG5E4|1b?zEf83m!I?06PAN9{QP9#)JUKJFW z?CMk-iL^Tp;06Pg&CM+_(aJS^E=9?ST(tfn;h%4hw=Kl3cM;>W|Xznkwm_eqQr zqKm|uSG0V7IUoCMc|B6h|p8CDyc>q2uI z^*8HPgs5)bMENTckTmm-^#hO2|lN%x8yTzZmTn4|?3|*)Xqo%*jB}Q}x^#>Wi zSEY%pMkCwT-f`EhoJI_0K9@%8BWs_T^oAmW{EfTvUc9O&JbPBkY#t@rp{uQ3z%{#d zZ6PK$=CmR*_4W?Fh36KE$o9Iwub-wzO{pH9Px>@Y<-A)V#NG`)#4(P30}Kt*Qt4=6 zW8=BtN(#zt?7J(MD>9Mr_udh$&B%FJTUI{3vV+mjVviX$3<%SJr@~cLU8wo5gF_bs zB0t^&zTdBRW^(s5)a6p1$?&w7uEKHMy4sMGDkZ~P zx88bTj7ErWa9AwIR31BVEXh9W=VV|0Ymg;YxE)pvBu)P%QwW*~u1w`aPsZu<^FLl* z$MU{x@9B>SU90ab&^QeD|O&GO`Ia#&Guxof zAx$|;y?dp{_N^Gx%Dpd)+!Zqu3BzmtlkRt+9uq-bLTYI&q-?%X6w=L$0NK6;weO697m~W zg)c1yToV!7Fr8d}6^yg7S9Nf3V`R#*$N}K(Ux$yhO*N-aHfKZ_$fJ`XH5L~ir{B=G zy)lHQ*f6ZJVBab2G~YaR>OYot}O}RP8>a&=#addEM5B>z z^lFmLl2sk3GIWjXSCXaD!&Szjvb3+ldiIGt*MQ~-8w>?!a%8sp}vNv1$Nb!6t7573<3jA;;=k<++F=~h3Rnn2p zhPGVozPHmOC=Li3KBMx2ASfyQ!pC`+>bG$)#fP2shJb!&>_mAYN6408Rt zE__ePr_YSUtiGT5XD2>n$@eLs@`pHBB&MFQU-Ef?1;#ZyoYb&4cI@HN=DSLz7;f&Fo3 zkwpU9+3jsL`&Bs&^yCRKTG+^NMXb+^)yTk(dQE4c5H?(ptFY{Iol0&BOnvp5KMflo zuzcRt*gB?)bFsJ@!g{2=yK;`mKDvJt)1;k-l5W3JF2Al>XB`s4+8MtKmef#UEoMujcxt`*9;K?|VOv zgzeeIw?|ML55B$Ch;L~2r+?oxuQJ>A$@ZtgglF6Ru=z=BT3W7#v&8xHFW%N8;~-7B z@H@5qXD4=UJDjlzON3m~Gih8edo%T@85{F#;i(v}Ges$(%S<7F}JVw=0TH~}>U7|Wr+z)Z#h zMUrsr@nogg&{Zxbe_ z86rzp?$>vw%NDvBJWC0kTWSdRR#4tRdD~s44XD8(xP$$pM3=z39?8;Oc7+e5?Cy!5 z$pyGVvi^`;fpxhxF|Ml6VPQguyXy@A8?vn`h!Yg~_*^+`UruFQA5-m$i*3p2{oR-u zXn5Zu+mueJL`0H@_h-^6v?O}gVb#O^OzWGw!f7hZmR;&=W4y;WP<0$*6pkb;i3-vG zj1Q-(3!%Q(7WQ&|WY1u4clCRBZDAm2EYePKq&i5N&lTqqusXw=n6$&LYxtmmJ98e-$)G-F}| zK71k<4rQ@@wXs_AOpZpbc1bm*Eg1}a$T*>u+?x3t2=bnG8(x&<02@R!H%{qiP%eG5=c+TS2EtORi(~{!hT1F2; zR=jAt(a-oSx|SQo@f_s$cWP?4t1T_!hpg6fU#j zb}{O`1rEE#xz0hsf?RoVG8L!Q8#3&>3HVdtb*NX##VTJG5PU<+PQh|F$9VI8r;&}) zy^<(CMp{}?E#6IKuO0Q!i)RQ3niDtYEDQy|MMvLMvu%@dW}W2}meG|DQg_+rE?(@p z2z%wUKtmR+eYVqM98SxM64TY6kDOMke5(uCv{U{Gm&e1011=@Z0HPYS6gst7{!HcF zT;uLlr|W^fy5BCU^rjz!F%x%DwB^U#Ojj}XT#8CUyn+Q-%57rIP|YefvBd4_t8LdIX_`t4d*S_jU61LxLJa^%Dr?#Mb5rt%*@9B9q1&R@r+MGFURgb}{qe09c|2pwj!v42D7@P^wwK@ptBJqseK~8Vt=*Jv*wUysbZ3ICt}OgLzga z+gJ3#K^?$0w=kV$%BU!RQe(8*ms|}9VYiM6CcWYybRsM+ld$Z*G~49~-L2G2Q_7Xz zBqWu$v9YOV(DfH?OO}^TAriN?pCeT-{PgpQ5H%%7GT+!ejg4Rh1NMGo2OCZ6Zp$|3 zFJ5SFp|~BDYjK^;N)hM1VOk{FM-ofimh52U6u?umvrQ{5GG(dKLzc^nog>7U*VXg> zpN~cBfi*H6`Tc+O25WlfdL;`<-vA-%gh)*DMiCLNa;9Nrliyf1YsuG;wa8nLYYhWa zh5sJF2U6JY+<8A#7#dOE&Eqts1FBQL-dBi-L#K95kJRXwTPq;{s&unx8K{LrLPC(u z(&|~j;Unw+gbI+6mG@W=e@nURSk`ah#Wjn>E2r^KF|>aSnr#bDf0ioMH^$zO0fBBW zZ|cmge-A`H^TFa3?n8uZDEn5+!}o~LqgI&dv=okipM%E-{;5m7HsepOTt&k}c{E69 z_@AR3wnfWBhklYtn>I-3Su?mqdvQoPESF@b0Lwe^H00JkIhDAG@x55cn&ggK$)}t3 z?T(tlxp(F19uaVllAEJWYcT$MP{?0Ecb3#1$$K3o`=8H$vXD?IZ>2g2={u|cJ?fyJ zU3a4kPrA@Clb4?p6&1x9)We+9y7BoZ(tz0}O!>&tiq_%NUjOqW$jvz5W|IFqgmp;2 z-Pj8M&*$(Xd`*LTZJZ)gOUnO@isM@+VEsZ@JQ2F4Sw&5)UKbK>be)%jra5I_oc!$+mrUXGIk{xT@A};U z2`aCWRj;v~UaR6V{Lg8wmdNsvqEsAu%VwbQ1$xAi#m0M5t~dyZjs7|K79c#fr4DBE z*^C>7t9BH@5SA+5B;=_0@t9vOPDTJd{Ks=fE|S_hcFFn>pL!^($;)@fU75YK`8hK^ zz!#XjWZ0ZoQmgAA|7z=6R%I+@o=DQ;16&NrO+sXI zq#}jUfhWafR_B(>PtV?F{f%MsBz?2dPeYA$^(T(0&4p<4$b!3 z@*#fxEtjcxQ>VEp|6BzBacu^~{w3Pney8FeWo6--yZ2O*&?VbRQgwSV5)j8pfWbxG zmy3-vXij{kf`MfGKL^zfpi_a zSi=o-yD`?A65^Z2=|N~^!w#|=my^Z>d1D}Qgl_xK0NsC2%_|BTw^CSC{1fV}JnxcI zPE5_+oeU$ROmb+WNtVg?18k~xZl^URk2)|N6l5$sYZ$=uUYWF%OtgqQU1Il7@fhT3 zMNT5U+v~L5MgulO$=c`%9X&nH8B4&znT>xXxXuxd&X{aX{;WredOA`QxFVSJPah$d zKY+_qLEJ+YvC6Y18(G6TwDU}w+qpqK2f!$s*9UvFbJqYYIzN{ zuyBgQZ0#LXuG6W>0Z{RtJr1_jrAwEdwT{5Oxx_wkiKFOMK4xwI4x^`i@Zjr7+P?~s zJisMU2yTO9XC%=!=1D?*xV635h{)yE&E|AsyLBB12d$XD1)jx2z#wm|d6`;4D}-fa zEG*6|9EIQ>xSQD)bq;l*g?uC+)s|B?x|j!MUZUxoXxm&Ssna(?JihZ!MMbfx_Ghxk z=i)f*#^2Rw9X@=xHQD|me$f^q1ao>SFGJdSOR?~Uze^~W9D)0tyEZ$e(p({aGA-++ zC-JD{kr1DGzc{=R!4e-|51(dd+rAi|nJ&A0Mp(tj7EXCM{Kn*BY^br5Eq#;Q)>90tae&?`%H>Y1uhzMB%lRn+VMkG=PP zYclP+hH)H+u^>94ND;;YiU^EU=_;d0N0HtX1f=&~Vg*Htpn&uygpL?`i%L`JC4?S& zAP_=0m0qEc8FLM$Oy<5qC*$7-bj_?=tnww@(!H;~qnmzOXB$uV`Bzdh?VNCxjh#*p!|UCVN& z>LB)7!%c;oJ=NCdwR7+3-}rh1I1p&6*(z~w66`0hB}~}hvI-CBE&Ewq9aQ!Z( zf8J*yN}|NMS-cJs!C-lWxMJa$sEr@(d4W$cIWz1&_dBl8aBymgqs*>bcLLQCYfnT1 zE-bC*o75#GP*07@Lqgd5;)hnrqm7(2L8vjd<)KQ8A@~uXu!Lt>xf0ExU362jZt2Gl zJ_KTms~RQHruhJqg+M5}M%J|`((}`ifE#HY=V?xiTZDBXx}B5CE}T*bxiwQ$GN4At zQ|`?hyreYXIhs<-PJhQ$O%zYY!SQ7jFKSWQ%q#Q$$TS2>WCek%U}k$<3}zVPYgI%2 ziD9*e0T$B$ASB|Gbc0Ii0!lFM>;$klCWXBa6?RKJ3H#KN#dI}fwt^Q>Aj{&dmXobw zeF!iAdSpPXoXQq6=g(%qL9QAzm$O|AD4d11ebQeQP z`DF!6PPqKWCH*CLFT#4`zsU6mXPz(RboSN)r@mVQL=KBbmNo;9uCAs0I+qH49kKen z@A%qX9c#zfp*$tp(J>)xj{6uEqp{IfbZ?s7Yg>y_V9c^u$@EULf>F~uC3SnyF)Tk) z6#G7q>mx|#T2S)O1*bckG!t(y`+8G;*^3>CfLIBuuje3WzFno1?QoTE>F8hCz`j6= zh^JNbco!7m>2vUWEI~IzDqHbad@Bi8^G42}?(P6DZj=%FGe7q96eo~V_Y3K2YHHTD zF&#Xr6R#uSQc9a2q|7eE?a~b~0p@L3HQsk1VSPt&<><|w=y`;Ka1`DP>W1Ye@Uq(p z$9~^vF^pWOa{ZWdzd+CJ)>r;tf-4~^yG#HsX1nk#fsDYrP_ZB2LOYP-DnDu;2JHVv zq^S9tpZjcIo4Gq2;^#3xKEf8v@*nIa`CIEo@f&7lslcDp9lN8+>VsznN(DPMPBzoa z{OrfQF{|+P?K$_0o(Yl%lp}H@rWAg|Tyi2dw4Q8F~ z1XSwV(b2ulR<4P;tq<#779FTamrI0K5%P-**$T?B`vq^)Fg5QEi)sSGcJy01M@49=2{g1Rprn!?o zc{&1dkkI{DqDyc=lXRY3O=Xqwc}P7&TP^XO=1p$nJ=Pf?KLVnD>Do0oavHO3rhY=5 zyL5*OnH#-m>hEhz>fIostOW(dds}T_k4mU+k+J$7Hx(3mKI^|bmj`c-paRhf@Bx&ieE?bWQv=c3Ga+0NH=PMde^T?0Tq7=&Io_zCWxu?lJXV0F6C#5cytE=7J z$mFgxck0k#CUVfc}-2$x`y?WQ?>g>-LPDZ@RD}J-8>EL1EUDEs!84 zIjHd4YUkU1F;%h!klyn&>)I?uPJtUhLGnN`6`Nr{*PCc*fJj5OnL5o2cP*$v8 zMO(nXK7oFp5P1$=($rhmxE0*s}kL75mS1PW2!6Kp>o>#!VUo;KzjJt)LiXK(R zg#-kQyRBNgAvcJ6`(bAJ!^cUML>YG&&P(Z;-#}f0Hi{Sz@<-c3&b;NRpQof~V|9w~ znle6bbx-T&8}Xr!Q?^+_&A9&jMg0W`gNi&Cc&F;`-RmA=?}jU(-9pVaDQUS)+xaCm z4W2nl9;(rm_N3r6-eo?1fNgdgj#7|u+5amPRCYj3`piAoNQ{1T29h3!@GAQzLA9jK zc%4FHO0nC}24J`Di;KtejWFu+s@vK~#(whoR<2!-y_%Ig80rP5`KJ8>1!4CSsmG~u&o8V zm^6@GQ*cIH54c(vetLslU$OSlCRCwXmx!?YV#jfTU8~rmTyl{oC?gqQ+Cw5n!4F*u ziFFOY4=}|in60f8Sif|hwyUn)nYG&4z<0f=#mbqwDCg{&RNjPxDm6#@^6XlCA)bfJ z4<&8BCIj~)XjSDJRLb5_R@T%QgaX`wLHTXA2oZz=-ru@T=C01h5TwL@om2!|61m7X zy9Q}<1zb7&jLesMg7#aT_`_xQ3@eA$=!y^v#|q)}hV^ZT)w)1CicTknAM$H$Rr9-< zHnO{j8YuU+O>JxcY#?UQXa@^7Bgt#s1hOVPq65=R`1moCl*mjc_PijzzKVro{?zt{ z=hJpspiSg93D;T^cB;54C`WN?V%Br;xI^{QYQ;7=?6f7$2{mHsH=G;ee$T| z4c(cyO_cJ_yiSB##J1B^WfdPeRq5h{V#017I`Es%T6#YMC+g%<)3)mBzPXXL6-3>x zn})Z;#NX==VGg%8!B4(3-Fz1=voT<;RN{`kwJ0G~ zCG*ZT;0bqa_F1j|06C?lrA}Mv#pp^|6ln*>MwT`0XZUgg(Tj9(P{6h;k&9!cW9&RT zb@Fh9_}Hx%LAf?j$~h+a!9VL8AVdQ>4wReE^2@86&2`+C04;ES%*dFVk{F@Q;Kb2H;yDLb5EWHaYjQ%?gqwg^aetll;cScq*M+)gko9Q&4d$rv*;E z;qsl~y7hv!HIlk001byv%mB%sA@Ye(>pq%JeQ#o^+IWcRr?x55y9p|~>6Hz0(|dmddKi;`6yc;vqCdOtDQWNOls| zGSF6!S4z)pt^jfF+pmn)M?tp`wJnJL?t=T=&{uPS0Y=-AtX`L}dEJ-Bz1sHyiN+Wq zY&Hw4>CwYS58a!KZtW?5=&zlpY4R{N^|Pg+JJbwhfFg47_B}te(1~qD|DgWLN^0FH z0SiJ=@$oy1N3DlE<)`do1WurH3r^4A5}@f0Mp|R%nwR8#?A8o|>QXhZ+d8fR^t!2C zINP(;a;K31Y-XMgiT3-rIOsRhc--Af2IGh~cC16F5l~Mgc`cl**&Xk`e1df@Ldw^4 z0LP~hjmw$1sBS}Cs6mb$)Z$wc-z^2|{D?kS!^JmQ0f_Y{7QD4Hcg3MH_%PYoKaENd zy>%iW*76l2a8j^8z;g0Adr$s^Xk8)%eMoGIf%^gVj%HB!HPn&=KFQx_dP;)YsG>pK zawV_$ul8R%BkwG1%(G&@$K@g`pPo<4o*-RnH2w$IjM?N(R| zc7CPt_r>ex&<^v`qQue`lH=9xN$U#1^IDovqaddq$dq0!It}|awN{9Cz6=b^vY$I; zGg$eupvor;an(b!InEyq8lg|BAlfOAe=X^?!U>cPk$w(SSgY+4OtjRJ4;X)M;zhPs zIAH=^Wd)p4*A+Ht+Fo9Lx7y1F$p#gciM1O6kzt(D3&oU`LaZ*RpYZI{Cm_B48BZa$ z7&$`!aEEM}@1r#z$m96=B=zZA%Z58Ob{UFII|1K>5Jnhi4nsvF^t2j>>FQ8!;L-ax z%_4a<60-@@f=)K?rG4gKB%!GGH9G^YTor*Mp2RybOWjs&q(N>}ZyGj6IdWI8`fu0` zx8+@u2LVF8l!b)1ZlNaIiD-MSGqmsq6(jMn66<~=pq1|daO3Ws1RQ9?p((K}Q*Oiu z+!bXCMY)EPLAE{Q13nWq;nXgX@Mg0g^p?*E9uqm0n_yGn^8LxS{3RCO7KI}W4M>U; zkSM1@liB{*6u&qvWRzEd6%wv@WDkfM@tU1AieGHwGcCwlz|NhjS#2>7WIk59(3b(A z+w3_jsl(9zvFUNs$H1qyty%4-x7Hs)B0EA1DZc|aDX?k#dck*<&ws1?QMmY+Qdg6y zU%ENbe^5R0@_QjP^N3&eb?z2jD32YhS3|})p-?Rwq5o~oRW7)nVKf}z!)*#9j2RS3zU+(#_DJQKiRk1a*_JwA)OIQ`Taphee;R7ptuk=M; zDP_-)>Kkxr#emNyLX39P=WA=dg$K$7rzf*4ua zNz*imCh28l7s6FRSC3WA^b3DF4n#M@rQ4t!6J5g3R_^R7B1(++(F@!Ayskg-J&~9M zxtXco%JZ`UG<%8JxQEXVZ=Xwbe`C29UfKT`XGs=wgb{>8358eNlGErd{p-I>dGg4~ zeVqb8)@$&oLJ+mC-qgKWHhp!WuibsM?;v^yRO-~ZUJw2z;HDF5?Jp|bjfjBn>&($h z^?TX`P4yk=%tQI&0`bxf8VOSQl#9FLI)Ia|pMYrhj|fSwXMebCdI^WPBv~R}Rk+G~ zVjKOVyO{E1<&QF8(eWHY@(A5@>TzC5%Ac}+Fp6^fGne|(m0WE~=#G(iJTZDhNks#{ zQdpA@usN~5(!<S6K1QT#|v|dm#uI)MBq1dde++kmH~wMn-BStW{MVQZ~EyS#Eb| zJ#`nvQr&<#y~}tqAz`Db;aIy}JobDC6`kJ$n8t99n7l)|#|IK_gJM#r@eVDSZ?>P| z2^xGKtowh8v9Gi#!gFpC_1)$ES^J=34FLR0GFNCqX;V`Z?O5lyuj-qgKh~rjEACpl zel<)595p*8*<1AnYaU5_7C$THHu*S-h(=q@gnG)iZH(9SKk7mr7Zjks;Gd0$LMQH* zaQ*y#h~X)K8mDU8N<3bPw*PE8spbOgoi>Olc7(}gH;Ejy;a>qQkZJ(XGy}wAf~z0g zZSg(lX@u0Plo0n|)F!TMbF~J)V#k$dP~oDU{tbi`z(h+1g>OsT#{G;M;$miaGK5Ij zkgY#$FAX?h>>DmtPR@^t3sqVdH4=NF#yT9;Y>7eOX7+LBVOPV{xWzUg$$VD7R=H8m zYw(}FdiA25?Z{20>guu_Cs}}`v;f*0sIU$1bsR{u;K$Fb#$p7+Ar5o^b>0KDgf7V& zlgC;gVcsO>-e`x`(|nKuNR3k}_JXBwtXn&*(vGq8fzS4e>VECD`vHGqW|}cvr!5md zW@gU5yh?ctB1g%h=+?N$J^MYELIW6{XgspAnj1|$Kk(T?Jxm%4*MWqqg_#J-O*ow!KP`pzjp| z4&mw3msNf|ygbqZINd^r{F|YWKnK{vGC)KQb61f?l+HYoZv#!wKM!zsu+}HjuXGnp zv|;9<3RNZ#mcmLS{(bAV4PX^B&o!_uh;M<~wnZhE|Dr=#6C*>)rJ zaY;t5K%@4w>5P&5jtuUv{a=6_JLSb&eHbhvW!>7zm7YCX(4W-yTH}L^F_hq$qoXO% z-1qjwM^+PGMc*}Y`)e`Vt~>2v0eVkaTfjfyNm&c{NBeJ1t;>XSbd<#)%svz!8mX?3 zlH7yhc%J1=a0nd7RkYOF3u2C4cM$O*)U2*%Q1OYnw)q*mjw~0AbbQu7fhNoPB7G!Y zBaW`Dla-aR0NO-7- z&_~0_=4^*E_+$Yg!;0G|lSRodaEun)O~uKq@PHuFUVgQHML3qeH9ja^C|mfcqvM&( zuPj#qzI|er2lS24%9NE`b11%Y=a~hmMKZ826mOgjN`$gTS>iNDftc!k8K}Pc$rVB| z-8r|q6Hr!`h$(R5%Yw0Q87~dQ9DO3r10q-pieG?$Lw!73-sI?Hd>))={UFwUtZK}l zU4RV_;FWge1Irq0bb*t>+8K}meX|p{y-pZm-&(K*NnDtrIa0+V$S4cHF0Z-*qsc;V zIq`nMeLzj;W?5A3sP=qoSP(lWvoypHB^x4TJggDA+~*G%n@p-1G#}2!Ho>c0K&{J> z%PIo<*9zFg^*ZlHuu7&sD8O2NNL31GoZpaC>8tn*x>2TDk4J5&?tpm1(dw&LJJo5^ z?YtLQyZ|8{>a12eUqf$Hshr)+9o|*-UFjvOtGRSxP1#p^=3Ol@{Zp#t-BvKhN)jTJ zaQ#tk$;{_LVUruCfcUFc2ZeFE4j-_GSIm$}A z%i#=D1_dd*cb(WK>76H%Rq0<@zzPgj(No5z6()Y8%4{-uzG=t{@K2DREbF&(@c#}m z77KfqG?bbz7eEvncHL6r+UVT?6*ZGY8zYr6(WyTbcyykB<$y{r?(3Q)tznfRv9;0j{}I(@vm4_fUGJS zs~0~uR3R=}wiur*16hv$`KtK4<2Kd}-zQ6oq;`*7d^6!bXZnAlm6j%`wB zvzO#mBQGG>2y)UQY+A}t)!IC6Q_aw&RCedt5jdFM3+d|Q$4O|T*J2QWo6EXZnh?1X zjglvJIV8%)DMVJfFQgP=lV@1Ad}oyrm17gAJw{dFS`ke-36Dl!*3KL4ETV5)#deqW z+v&6)mV4o;3kYRTvC?_8P!*C=Ap)6J(uV1-$3~8r&(?D~p9nwyMUM>&h)ebozS~ql zWe-@0$K&#p6pVY*;}LmYXXYBtR^oJY9tE%;I4xwN6(WK9%j{}5uVKOOg-dV^?1OYIGEY|%$S z)_{4J1}B*u$jmm9Cpp zagsDoe_Hos0-3wXKP_d&Wa7n(#h2yd&|$!^XpYO(K{%~@b(`)u03M;e+?%Hz1hq^> z2pZ#+1n=?E718_Fv$K*#a99BNLG)3;qLP#1#9hOHL;#Fn7Bx}Zy^_uy!Iw-J!Wdwv zOT-D_DWDHVrK+;F2)Mb6aOZbrD?RQ(7azj0`*}I@-70x^^YO&2VlgBW@_wWnyPN^n_S&(P_G~M zZcOF&PF5YK#LQw=$>H)uKTW8++*YW%-A>F5m+nFCh!BZ5pu>=$9}#if$t3ar`R8>t z4hgqlKo@N&yE_$0pl!-AR6Nq&Z&G4eQ=7b~QtL8c=MlQ&m#{X!CDb%rMwndc--Q;x z3{Ys`;}`E~br*YLS3Vak&^_Wp3;R3wZ|5-*(mh2cy5LdA|H6I+LFi7jqX z`9#u%d_sBuG28yU*SanxHV+f*19ln(1jF25VNrLROdoGEzjKLOeD?gA=w`$gGAoXy zqE{ep7HQW2)4vJfmy8Ts~}4Feay zblAIq6M>=C>4mRT5Xr644-AI>3&WpEV7#*1bupH7lJ~%F61s zdq+aAN+C8^{*=&<*GwEe8ukX_LJt6YUoV70L0aJIc_qlhmJMos+-*6`AmpqV$bljU z1JWOMvrwaIp|ux3Px4<{hNBqF3cwpSpwkr?dg`i*!0MgdL zuKKh^RzZqc7FOOC3XAL#xZ`qA6!5v`)u!ZwfPnxC6sI+B=l4uKSt3_p^icOccqC=S zXKZd4rhNP3zB!4ly~L~=we0sC&H=Io#N{_4SBV4_L^_1*l{itGl=AY^lAK)tPQmmL zaTqJ3(=Tq=wjo>T-us=SklM0;AHx?7koff-%LPpXei@kPe!aRI=1f4P4pg|9eYn=waiX!Ovo+kgm~JEqHwd-0PdF1z79G^UdLVatpx-OaQR}VC3$ti2=*;xdZ4RGwGCui z9&k|rSydEZXzXSXMPOOznsZABd_%NnmkN;C6vj@8N0|?6A-Io=PJ!On?Bg1dN4aH5 zpN~6E4NwCemoEZ0FkF<(dYM*I_nU3~V(uY#U`lVze!t5~`_3OtGmwj+eGlhqU8&|M zV9U(Sc zwvxufhvh*LJK!a7UilYj5lneswRqso1>idyZ8wZUjo$#21l!&_q?jRq%B1H_$)!PLdQH7sm- z!G9_%>kj(2F91k@0AM2yhX$1u=unI+X=@P!)%KumyY>+TBT=zY8KWtGLhA*bZX}!D z^3= zHMGn{S&7|^P%qfPPvxuS(Gd21JSg)&fMvg=1C#?(k){ygF|!B2^BO8b9VJ8HA7M$& zNxA|TjU6YklgYHfR6)6F4K>jJ+Et0?_rQ>s!d|HSoZrSxk8@S9##FpB!t&lxQWMY| z0j~|?uAG;G*0^u)G9agl>FNrh6x9qnEsz4ra%r0juYyAWzW2lyGZKVZK_>Mi&7xIY z-IzjF_tl-SN|a!N#*FXSdAs42wa){&<8~9Sq|1l}Z^v2)&-@EE zczg|0_toEtg>!GERm62R4ob`#|L5BzbVUeWz8+HXZydRQE6)PZr>n*6stE_#1ir3} z13NiQ;s6!LsC>alyH6Eg8;-TRLh&fWmxhW;6JPjuG0E1h+??KsUygDG@V5$AM7pb* z>nqs_+VJatI;IL1q*`0gf(|y?fm2@ey)B?sMDTYLuNVGYy%Qkaed~--I^-K_uin^} z;wceUY=!+p=NZA8%4itn;hsG3&S=<*C@a1UjmfY!j*mSI)Uz>&!!Lu8TiyDNr%w+Z znH+?>X1NVP>TGmmB&oy?c()&{A>4rJynQgi2>vJUEyoH*9ML|Moze>#AK6X!zj*o5 zM+{D~2IIf=jvHaLLMDQ$;NBUw`K2!ZJhn3J@1&%xu5`6N&1fi`vF)E_Sya>+sCV;b z8h#m4meZL_p`oEm$U&-H`PriRv>CcRiE2;_E^c+7JwafFNN%5uUl!zTJf?DIb!5w4 z2@Xu*-mkt6zyVH?cHOF33;V%k4%%SVi;&(~krh}{C`30L?JV!#=u7*`GusmDrI2UG zw(#=2=U#T8TWhDUFh4ol4dP!Alqlrgltd1$KT(kMKX?T&z)#zau*7Szg$UnDh5?W# zIXNd;r2RMZQd5WD8PyO4O$!q6%fMs)@!r!Jwb{crA%@d}o-z&-=KG^Q&^l58q(9V# z6qe@iE%$GxEgiN_`c~t_^4s3h(atsKKPK%r`2oLtM#fLn6awax?d-ex!5}ss1+lR- zi00m~=lBQ!Z_yA12Pp1m8^sfor<1rk&bSp6UhdUy{E{{VU~?lZQ5^jAQ7-Y?!UCO) z$i0iY*OTQ?&D>h!v<}v95an|Xt1{1)0_amXHCRP?a#p8GhpBLCKluFRYE@;nSQ5)T zfU#OJsD(`Cv>Cv&YkP@}h%Tjqwm_gn8G)l4qu~16KV@W8PyQ4+EDM3$**kow!QW1! zzl@%8R;TF}JiagbvaGaJPw!b1FB_YGxfY;ad@F>;Fd$>~x{!b=97#XfBfssvW4r|LD5Og0b6mT!IKw5Ne$Sy?e zXLuU}vM@F?XdGWrE@&O}_&(-zjp%68!ff;k0l}xBv@{TR9A|;7@eU$;=C-k|KSS`!9Aq$%w>6!KT=qpuiFEy<|p!phA$xAY@pZ_i> zh%G3{Uofa~NbeF!h(7?$TQ{FR-N)5_0KUMy=mRd>-w>?_1Ry*wN8D?d1Buj+bcj@!LUVMoAFZ!#C;2lL z+XoS&Yny-m?5ci=l4@wN6v2Z`e7OTtwPYYkXxK9Mv>Pc^2ny$N4Ms$kQI~ZV9|LKt zoRbMP9zvKc^11f?|v1TN7p%Zs(3q%)OtxH7tW>CYBSmyc) zLP5?g=8Jmv=`SaR>?=YSlOQpAaby60Q8 ztM$CQ!o%hh?Z9M$cvu~&cdz zbh^OxN&%KrTO;U>IP?W9DRkvCfpZY!om)}sjbL3e$yE~|| zCeT*V0V+z&(J7c@0rgxu0F1=7J_NK}(j{ifL0>&&s~)~~NUVMJ%BhZVE8E&SZguWR zcnB7xq4|1bzZxL`@P?(_7r(E=GdQ(hkdgs#BDxQuouOFaVnYp;otSjGmSCp9XzWlf z1dH3n6NEKKiV7R)7od}2tq=0?-Xf&@ZjBe$N&k&H#Kn=ZAJGgdA#7q#nXV^V4>T%r z^iAKgrlhq&qdGe;DCasejP-uPxvT*U0lW8vSm3%ModXRN<|!W|5F!ASp4rnQiuMBe zk#?0O^=9~C@W*tac07ef9OqzA*R?O2RHQ(Mljs_zkZEZQa`P`=7|OtuEv5K%a7a(b z(-`RnsMC?Z1~_Y&-S=x6wgki@;LRuOTv;t4(g#_sru|^?eGG4Cf*F8;I9-CelkE^h z#Tj6j63n0v3Mskro$pp6ImLJ9x)NOoXW#hNKyI>Wv6*)>yaK)u;UpEd7Yr4@n~e#B z+~^`~)!VRxor6KIgeXcbpS_y>Wdhm+{a3NhAX>}Sl99T6ugnQKx%}RQhITI67B~e1 zFpg*x5M7I=`GB2x4Rs8Sa0yz~CW!{5;dI+n+XD%*uKPjPzl}| zf|-Ayv}@xl1u;F0b!r}{@kG@&DXA*=@;lZRzI;P>4vtsl1v)M<_;uLw-xaXB*nuP$ zyJF!AS_s*VZ>Pci^5b=LP+QDUJ>`3I#O4ymAuT}!+QRV_WO&;TVTj+{m@nn+k4G-S zbeK2R=r3_Y-0-Vq<6yaWF7WSXEQ~+hH^HluabPG=HV03q7(ufgxV@jB-6dU#}GEL%M~C9LVxcGigMm z=K}N!ZZrjr$559B?vxFA|DMb!{6N+<9=ho3YhQX&j*wfZNp;wSI$CU4=c0v1&WCI?A zqQ2bT$^voXI#ntL+0eHQZ#Wtt(|azT5r7?-TI+_KlEB|&W(gce5EGrJtg0sft(VD# z(#U5l`>xMyC=Cw2h!Y@|Kr93hh6K?NAr*b->j?NNXh1!BMlKB;OpM)54Iw2kG{kI? z9zxI`NAN+`eb3ft=+00$+j|a^y7WSVM)Tn!GIcrn3ZTYE-ygatO)dvD; z;}u1ESHQF3ILR~C`4kjbnqB}!-Gt{CCu$M+kPvMzU2HKJ_DiU4?rnF(;v!1m1Tp&$ zSjtq$dJ(z4c9y2PyjtA3tpldQ?WO(2K-z%8(M8hhS1(0EPBYPa4G{p$3CZ0;92iX=fB~-Ay0*_|5#z~|Y-7E8F|>tLuvG}- zh1{q5%Om00O8%gkP(b8BpMFT}Hlp3ZP9Lh-A-RfWK%L{>JRP^*>;}xe znT3A-hEzNJQ)sXg9k0y2UuEeoq!QKM#*Kbj~0$Y~6wo#EIrMb&gL|wB8(%ARPn~84TF;CzwIc zoqwuTVok?_>{hWK&cMFER*Uf{7laU(wpygK8ul;LC3g`aU8(zFWN^a;A=qO-pnRaV ze~wZwf-9?#JxrE_tPTL$eCRM(rEHNvVP9MAARNoWaUwqsmz!-p@f&HVC^6@L&P+r# zYynXK$Rdzz8aYADDMdVdpuHL_rF4Nl-EC8~S{NgI^1(sPM~_}y*1l4>>23oSFFAojJeXjBfdP( zpCM&GAXSK#{l7m?IMxjygZu9f;s*2I|DS%aH|Iz=uod10q|L^Ji@3Z*7yLJ@*nVPY8IoFj| z>u1o#DEhwe5NdC{`F)I~T6oCI$l0;G;j=R^f`$zlYvVK5ikB5e4mPN8{@pArC&078 z02}bU)M2my{P;;d*;>l#%F#HRD4svBA0HbF4t=9tlA{gg!Tu#S{r8~jUV!v@UrG-c z*ka({Oh*&}ktQR2RJnj@PQs>rq=t))pO3Hq`~>nl*R2uQ4f#CbR)J{`A+cEN#uh@c z--a@b;r%6%ko8c3N>ER34TF z{D81W>o2^{NV(~Oq8!&48t;-g^?3Z_4?rjjccRUI}O~IasKL4yz>hMvzAG zbDuqXw#+F6#+V|OyP56S^?QuWTrS=%dHSyRGh8fWw_3Db7Hr)F01maigw9k=%)H2j zy6;ZvS?dFhWxHYdB6CAi6Ti54>7C{FLvYAf}YEU6av=Vx4#geeeaVo zJlk!xy8am7>IBNm&3P2J?YIVE?(;~^G7da}5a)I0397;RmeH^~{tT<^!W*F`>!oq* zA#K_Q_%Rm}lTdf<2RwStcn+sax)S-Mr3cB*`xufYY$TWSuH;(ois$~Gvw;`Fs*Bb8 z7!4Rdy^;vW9UwrK{~lDA%wWja>p%YZ4yR11rU98OHPqSUgxG-z+GRdE~19R+N6rZ+#gdA(3DZp?3N{q+fhO1D@*K>9QZ ztbjbj-NygVFWrPD=D2H1Rxw+R)oa1*Vm31oG7_QXcVU)L*Ho=S5VI|~G9Q**tM%VH z><_&Vo}0!aiop5=u2;e!KJdRz#*5ew9I0Ezz_TI^=c3zf_a5Vy|1n!-N!?gMA*P6D zM?N~AXW|n5l3sCJeyKc1J9pZJ0RHwcIKoSm8|Z@_K)Dp#qn{ao)vA^LM z$2F%XKvVgfKnV$-1*9Jb`K0{5gK^7lUjOnm32A8sPDOTmbVraz9xOAp#TTr2sl#)q zAm#8IH=@Ar{V(Z63H$!f+R~m2!u9&md!bF!=-&)O^F^us;DYc-o<7J9I7A<(fVsQz zg5jq{=EBKe8P>x~V~X###)%zSN>>cGp8Y%}ms^JeNG3-|dr)Oy9ckHvkId`;BnVH= zxoxi>j9C%}pYI>6fBccxEJT@bAuLbvS4W-zeglxyf=ZVU&Hh@Msw+xN;BXIi`w|L% zeV*<^Fdq!qvWr)?Fok_E|HO)bA0ybV$>l^QV47+2&sR~Bo)vZY) zv@|@A#wN_dgHpyCzU!ny&E6Oa5FvpR#oh&`{0^OjvOgC;Joo4vp$2mFLiG2LdftxrS z3W4j(C;4$$!j#Dm{ZczN*`1!pAm?RUI{=MEJZPZ{7cM-e#+3}z`d1z0yp{!k6-

    Xz|m$iHE{nN7Z4h4R)KxjRQu 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 literal 0 HcmV?d00001 diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index eba528d8..413ef151 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -77,6 +77,7 @@ def brand_colors() -> dict: 'hydrodynamic:RR': '#4FA3D9', 'hydrostatic': '#7A8894', 'roche_overflow': '#593E74', + 'solar': '#C8860F', 'rule': '#3E4A55', } try: @@ -91,6 +92,7 @@ def brand_colors() -> dict: # The violet slot of the shared cycle, not the tidal module color: # these are regime categories, not any module's output. palette['roche_overflow'] = proteus_mpl.CYCLE[5] + palette['solar'] = proteus_mpl.COLORS['solar_deep'] palette['rule'] = proteus_mpl.COLORS['ink'] except ImportError: pass @@ -671,13 +673,12 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No for _before, _after, flux in boundaries.get(composition, []): ax.axvline(flux, color=palette['rule'], linestyle='--', linewidth=1.0) ax.annotate( - f'{flux:.3g}', + f'{flux:.3g} W m$^{{-2}}$', xy=(flux, 1.2e10), xytext=(3, 0), textcoords='offset points', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', ) ax.set_xscale('log') ax.set_yscale('log') @@ -702,6 +703,102 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No print(f'\nwrote {outpath} and its PNG companion') +def make_track_figure(rows: list[dict], outpath: str) -> None: + """Two stacked panels summarizing one atmosphere along a stellar history. + + The upper panel carries the bulk rate against age, marked by regime, + with the ages the consistency screen rejects shaded. The lower panel + carries the per-element rates, which is where the change of branch + shows its consequence: the wind takes the heavy elements with the + hydrogen, and the exosphere takes hydrogen alone. + """ + palette = brand_colors() + fig, (ax_rate, ax_species) = plt.subplots( + 2, 1, figsize=(8.5, 7.0), sharex=True, height_ratios=[1.0, 1.0] + ) + ages = [row['age_Myr'] for row in rows] + + # The span the snapshot screen rejects, drawn behind everything. + bad = [row['age_Myr'] for row in rows if row['inconsistent']] + if bad: + for ax in (ax_rate, ax_species): + ax.axvspan(min(bad), max(bad), color=palette['hydrostatic'], alpha=0.15, lw=0) + if bad: + ax_rate.annotate( + 'the snapshot screen rejects these ages', + xy=(math.sqrt(min(bad) * max(bad)), 3.0e7), + ha='center', + fontsize=11, + color=palette['rule'], + ) + + ax_rate.plot( + ages, [row['mdot'] for row in rows], color=palette['escape'], lw=1.2, alpha=0.5 + ) + for label in ('hydrodynamic:EL', 'hydrostatic'): + group = [row for row in rows if row['regime'] == label] + if not group: + continue + ax_rate.plot( + [row['age_Myr'] for row in group], + [row['mdot'] for row in group], + linestyle='none', + marker=REGIME_MARKERS[label], + markersize=7, + markerfacecolor=palette[label], + markeredgecolor=palette[label], + label=label, + ) + # The age at which the label changes, from the sequence itself. + for before, after in zip(rows[:-1], rows[1:]): + if before['regime'] != after['regime']: + crossing = math.sqrt(before['age_Myr'] * after['age_Myr']) + for ax in (ax_rate, ax_species): + ax.axvline(crossing, color=palette['rule'], linestyle='--', lw=1.0) + ax_rate.annotate( + f'wind ends near {crossing:.0f} Myr', + xy=(crossing, 1.0e2), + xytext=(-6, 0), + textcoords='offset points', + ha='right', + fontsize=11, + color=palette['rule'], + ) + + elements = sorted({el for row in rows for el in row['per_species']}) + species_colors = {'H': palette['escape'], 'C': palette['boiloff'], 'O': palette['solar']} + for element in elements: + ax_species.plot( + ages, + [max(row['per_species'].get(element, 0.0), 1e-30) for row in rows], + color=species_colors.get(element, palette['rule']), + label=element, + ) + + ax_rate.set_yscale('log') + ax_rate.set_ylabel('Bulk rate [kg s$^{-1}$]') + ax_rate.set_ylim(1.0e-2, 3.0e8) + ax_rate.legend(loc='lower left', title='regime') + ax_species.set_xscale('log') + ax_species.set_yscale('log') + ax_species.set_ylim(1.0e-25, 3.0e7) + ax_species.set_xlabel('Stellar age [Myr]') + ax_species.set_ylabel('Element rate [kg s$^{-1}$]') + ax_species.legend(loc='lower left', title='element', ncol=3) + ax_species.annotate( + 'heavy elements leave with the wind, and stop when it does', + xy=(0.03, 0.62), + xycoords='axes fraction', + fontsize=11, + color=palette['rule'], + ) + fig.subplots_adjust(left=0.12, right=0.98, top=0.97, bottom=0.09, hspace=0.08) + fig.savefig(outpath, bbox_inches=None) + fig.savefig(outpath.replace('.pdf', '.png'), bbox_inches=None) + plt.close(fig) + print(f'wrote {outpath} and its PNG companion') + + def _panel_title(composition: str) -> str: """Composition name with typeset subscripts for a panel title.""" return { @@ -741,6 +838,7 @@ def main(outdir: str = 'output') -> dict: results['hysteresis'] = hysteresis_window() results['track'] = stellar_track() make_figure(sweeps, boundaries, bands, f'{outdir}/demo_dispatcher_regimes.pdf') + make_track_figure(results['track'], f'{outdir}/demo_dispatcher_track.pdf') return results From 60056ecdfa19183dc98e715ecece4bbe6f33209c Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 03:11:43 +0200 Subject: [PATCH 029/113] Read the wind-versus-thermosphere screen from its source The threshold potentials separating wind-forming from hydrodynamically stable thermospheres were carried from secondary literature with a note to verify them. Salz et al. (2016, A&A 585, L2) confirms both: energy-limited escape is valid below log10(-phi) = 13.11 erg per gram, thermospheres are stable above about 13.6 because hydrogen Lyman alpha and free-free emission re-radiate the entire input, and the wind weakens in between as the heating efficiency falls. Their potential convention, -G M / R, is the one the diagnostic already used. Their grid is hydrogen-dominated, which the reported attribution now states, so the screen is out of its own scope on a heavy secondary atmosphere and stays a report rather than a gate. --- docs/Reference/results.md | 4 ++-- docs/Validation/diagnostics.md | 4 ++-- src/zephyrus/diagnostics.py | 32 ++++++++++++++++++++++---------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 32184aed..59f9908f 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -103,7 +103,7 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a | `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide` | The overflow screen in full: which radius was tested and against what. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | -| `potential_screens` | `log_minus_phi_cgs`, efficiency-collapse band, wind-versus-hydrostatic screen and its attribution caveat | The verdict translated into threshold-potential taxonomies. | +| `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | | `erkaev_tc_K` | float | The tidally corrected critical exobase temperature above which the thermosphere blows off. | | `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | | `tang_timescale` | boil-off termination timescales | A consistency check on the bolometric rate's own exponential shutoff. | @@ -116,6 +116,6 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a ## Two conventions worth adopting -**A rate floor.** The framework computes what the physics gives it, including rates like 1e-123 kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about 5.3e-35 kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it. +**A rate floor.** The framework computes what the physics gives it, including rates like $10^{-123}$ kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it. **A relevance test, separately.** Clearing the floor does not make a rate matter: a hundred decades above it can still be grams per year. Use `diagnostics['self_consistency']`, which divides the supplied inventory by the dispatched rate and compares against the supplied age, as the yardstick for whether a rate is worth carrying. diff --git a/docs/Validation/diagnostics.md b/docs/Validation/diagnostics.md index 4dd49cfb..431d2bb1 100644 --- a/docs/Validation/diagnostics.md +++ b/docs/Validation/diagnostics.md @@ -4,11 +4,11 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the repor | Test id | Reference | Scope | |---|---|---| -| `tests/test_diagnostics.py::test_erkaev_critical_temperature_normalization` | Erkaev et al. (2007), A&A 472, 329, Eq. 23 | The tidally corrected critical exobase temperature recovers the printed Jupiter normalization 1.45e5 K in the wide-orbit, exobase-at-radius limit, vanishes at the Roche lobe, and scales linearly with planet mass. | +| `tests/test_diagnostics.py::test_erkaev_critical_temperature_normalization` | Erkaev et al. (2007), A&A 472, 329, Eq. 23 | The tidally corrected critical exobase temperature recovers the printed Jupiter normalization $1.45 \times 10^{5}$ K in the wide-orbit, exobase-at-radius limit, vanishes at the Roche lobe, and scales linearly with planet mass. | ## Notes -The Johnson et al. (2013, ApJL 768, L4, Eq. 10) transonic energy criterion and the Guo (2024, arXiv:2405.13283) regime triple are asserted through their published scalings and limits as physics invariants in the same file. The threshold-potential screen attributed to Salz et al. (2016) is quoted from secondary literature, which the module states beside the values. +The Johnson et al. (2013, ApJL 768, L4, Eq. 10) transonic energy criterion and the Guo (2024, arXiv:2405.13283) regime triple are asserted through their published scalings and limits as physics invariants in the same file. The threshold-potential screen of Salz et al. (2016, A&A 585, L2) carries the two values of their abstract, 13.11 for the validity of energy-limited escape and about 13.6 for hydrodynamically stable thermospheres, read from the paper; the module reports the hydrogen-dominated scope of their grid beside the verdict. ## Anchor type diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index dd41d43d..75fbe8c6 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -37,12 +37,20 @@ # full-surface redistribution, for sensitivity analyses. DAYSIDE_FACTORS = {'energy_limited': 0.26, 'recombination_limited': 0.31} -# Threshold gravitational potentials, log10(-phi) in cgs (erg/g). The -# Caldiroli et al. (2022) band marks where the evaporation efficiency -# collapses; the second screen separates wind-forming from hydrostatic -# thermospheres and is commonly attributed to Salz et al. (2016). The -# screen values are quoted here from secondary literature and should be -# verified against that original before quantitative use. +# Threshold gravitational potentials, log10(-phi) in cgs (erg/g), with +# phi = -G M_p / R_p, the convention both sources use. The Caldiroli et al. +# (2022) band marks where the evaporation efficiency collapses. The second +# screen separates wind-forming from hydrostatic thermospheres and is +# Salz et al. (2016, A&A 585, L2), whose photoionization hydrodynamics +# simulations find the energy-limited concept valid below 13.11, because +# the radiative input is efficiently spent driving the wind, and stable +# thermospheres above about 13.6, because the whole input is re-emitted in +# hydrogen Lyman alpha (above roughly 1.1 R_p) and free-free emission +# (below it). Between the two the wind weakens as the heating efficiency +# falls. Their grid is hydrogen-dominated thermospheres of hot gas planets, +# from super-Earth-sized to massive hot Jupiters, so the screen is out of +# its own scope on a heavy secondary atmosphere and is reported, never +# applied. CALDIROLI_THRESHOLD_LOG_PHI = (12.9, 13.2) SALZ_SCREEN_LOG_PHI = (13.11, 13.6) @@ -185,8 +193,10 @@ def potential_screens(M_p: float, R_p: float) -> dict: """Threshold-potential screens, log10(-phi) in cgs (erg/g). Reports where the configuration sits against the Caldiroli et al. - (2022) efficiency-collapse band and the wind-versus-hydrostatic screen - (see the module constants for the attribution caveat on the latter). + (2022) efficiency-collapse band and the Salz et al. (2016) screen + separating wind-forming from hydrostatically stable thermospheres (see + the module constants for what each threshold means and for the + hydrogen-dominated scope of the second). """ log_phi = math.log10(G * M_p / R_p * 1e4) return dict( @@ -202,7 +212,9 @@ def potential_screens(M_p: float, R_p: float) -> dict: else 'intermediate' ), salz_attribution=( - 'commonly attributed to Salz et al. (2016); quoted from secondary ' - 'literature, verify against the original before quantitative use' + 'Salz et al. (2016, A&A 585, L2): energy-limited escape valid below ' + '13.11, hydrodynamically stable thermospheres above about 13.6, the ' + 'wind weakening in between; derived for hydrogen-dominated ' + 'thermospheres, so out of scope on a heavy secondary atmosphere' ), ) From 48abaf9b26473eb931212b4377243e9393befbad Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 03:11:55 +0200 Subject: [PATCH 030/113] Anchor the evaluation order with its own flowchart The regimes page listed six steps in prose and left the reader to hold the order in their head. It now carries a diagram sized between the overview's three questions and the full machinery, on the overview's colors, with the two refinements that figure omits drawn explicitly: the exosphere that returns to the wind rate, and the residual that stays in the comparison past the activation gate. The interior-luminosity cap becomes its own numbered equation with L_int named, the residual's dispute is stated with what the cap does about it, and the notation is made consistent: sonic quantities on the s subscript, the exobase radius capitalized like the others, and the effusion flux carrying its species index. --- docs/Explanations/regimes.md | 70 ++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index b9f576c2..09076986 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -13,6 +13,38 @@ One call takes one planetary state and returns one verdict. The inputs are the p 5. Before the label is finalized, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is relabeled `roche_overflow`. 6. The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. +```mermaid +flowchart TD + IN(["Planet state + atmosphere profile"]) --> BOLO["Bolometric candidate:
    Parker wind, Bondi cap"] + BOLO --> Q1{"Lambda below
    threshold?"} + Q1 -- yes --> BO["BOIL-OFF
    uncapped bolometric rate"] + Q1 -- no --> BASE["Wind base on the profile
    + thermostat wind temperature"] + BASE --> HYD["Candidates:
    energy limited, recombination limited"] + HYD --> Q2{"Sonic-point Knudsen
    below threshold?"} + Q2 -- yes --> HD["HYDRODYNAMIC
    min of the two, winner names
    EL or RR + fractionation"] + Q2 -- no --> Q3{"Exobase hotter than half
    the escape temperature?"} + Q3 -- yes --> HD + Q3 -- no --> HS["HYDROSTATIC
    per-species Jeans
    + diffusion supply cap"] + BO --> Q5 + HD --> Q4{"Luminosity-capped residual
    larger than the branch rate?"} + HS --> Q4 + Q4 -- yes --> BO2["BOIL-OFF
    residual takes the label"] + Q4 -- no --> KEEP["Branch label stands"] + BO2 --> Q5{"Active flow radius
    past the Hill radius?"} + KEEP --> Q5 + Q5 -- yes --> RO["ROCHE OVERFLOW
    Bondi-capped rate
    at the overflow geometry"] + Q5 -- no --> OUT(["Regime label + bulk rate
    + per-species rates
    + flags + diagnostics"]) + RO --> OUT + classDef regime fill:#1e6091,stroke:#0f3a5c,color:#ffffff + classDef decision fill:#f4f4f4,stroke:#888888,color:#111111 + classDef stage fill:#ffffff,stroke:#1e6091,color:#111111 + class BO,BO2,HD,HS,RO regime + class Q1,Q2,Q3,Q4,Q5 decision + class BOLO,BASE,HYD,KEEP stage +``` + +Every branch below is one box of that figure, and the two refinements the [model overview](model.md) leaves out of its own flowchart are the diamonds `Q3` and `Q4`: a thermally unstable exosphere returns to the wind rate, and the bolometric residual stays in the comparison past the activation gate. + ## Boil-off A freshly formed or strongly heated planet can hold an atmosphere so distended that its outer layers sit beyond the sonic point of a thermal wind: the gas then flows out on the planet's own thermal energy alone. The activation criterion is the restricted Jeans parameter [^fossati] @@ -29,55 +61,61 @@ where $\mathcal{M}$ is the Mach number at the launch level (the photospheric lev $$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(-\frac{G M_\mathrm{p}}{c_\mathrm{s}^2 R_\mathrm{launch}}\right) \tag{3}$$ -with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lambda$ gate the same machinery survives as a residual, additionally capped by the interior luminosity, $\dot{M}_\mathrm{E} = L / (g R_\mathrm{p})$ with $L = 4\pi R_\mathrm{p}^2 F_\mathrm{int}$ and $g$ the surface gravity [^gs19]. Keeping the residual luminosity-capped represents the slow late tail of core-powered mass loss without adjudicating the open dispute over how long it survives (Tang et al. 2024 argue it is brief [^tang]; Gupta & Schlichting argue it lasts); the Tang et al. timescale comparison runs as a diagnostic beside the rate, never as a gate. +with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, + +$$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ + +with $g$ the surface gravity [^gs19]. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{Parker}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. + +Whether that residual lasts is disputed, and the framework declines to adjudicate. Tang et al. (2024) find core-powered mass loss ends early, once the envelope has contracted [^tang]; Gupta & Schlichting find it continues for gigayears [^gs19]. The luminosity cap is what makes the disagreement affordable: it holds the residual to the interior heat budget, which is small once the planet has cooled, so a run that keeps the branch alive and a run that switches it off differ by little. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion without the code having taken a side. ## The hydrodynamic wind Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces are assembled. -The wind base. XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. +**The wind base.** XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. -The wind temperature. Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. +**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. -The two rate limits. The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to +**The two rate limits.** The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to -$$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{4}$$ +$$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{5}$$ with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition (carrying its $T^{-0.9}$ temperature dependence) and $R_\mathrm{base}$ the base radius. An isothermal wind then carries that density to the sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ with the barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$, where $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ is the Jeans parameter at the base, giving -$$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{5}$$ +$$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ -The energy in Eq. (4) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, genuine recombination saturation at modest $\lambda_\mathrm{b}$ (the $\sqrt{F_\mathrm{XUV}}$ regime of Eq. 4) and plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error; the diagnostics report which mechanism acted. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, genuine recombination saturation at modest $\lambda_\mathrm{b}$ (the $\sqrt{F_\mathrm{XUV}}$ regime of Eq. 5) and plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error; the diagnostics report which mechanism acted. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch A fluid wind only exists if the gas is still collisional where it goes sonic. The switch compares the mean free path against the density scale height at the sonic point, following the construction of Chatterjee & Pierrehumbert (2026), their Eqs. 17 and 18 [^cp26]: -$$\mathrm{Kn}_\mathrm{sc} \;=\; \frac{\ell}{H_\mathrm{sc}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{sc}}, \qquad H_\mathrm{sc} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{6}$$ +$$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell}{H_\mathrm{s}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{7}$$ -where $\ell$ is the Maxwell mean free path, $n_\mathrm{sc}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 5), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. +where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. -A state with $\mathrm{Kn}_\mathrm{sc}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3: kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the band is heating-geometry physics rather than tuning freedom, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. +A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3: kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the band is heating-geometry physics rather than tuning freedom, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. ## Hydrostatic escape Where no wind exists, escape proceeds particle by particle from the exobase, the level where the mean free path first reaches the local scale height. All exobase quantities are evaluated on an extended upper structure: a Bates temperature profile $T(\zeta) = T_\mathrm{exo} - (T_\mathrm{exo} - T_\mathrm{top})\, e^{-\gamma_\mathrm{B} \zeta}$ integrated hydrostatically above the supplied profile top (in $\zeta = \ln(p_\mathrm{top}/p)$, shape parameter $\gamma_\mathrm{B}$; the form Yelle 2024 uses [^yelle]), with the exobase temperature $T_\mathrm{exo}$ prescribed by the caller. Extending the structure is not a refinement but a requirement: the Jeans parameter at the true exobase can differ from its photospheric value by an order of magnitude, and evaluating the escape on photospheric values biases rates toward false retention by up to three orders of magnitude (Johnson et al. 2013 [^johnson]). The prescribed $T_\mathrm{exo}$ (default 1000 K) is the branch's dominant sensitivity, because the rate depends on it exponentially; an optional estimator balances local heating against cooling at the profile top, but a conduction-free local balance is biased high by construction and is deliberately not the default. -Each species $i$ escapes with the Jeans effusion flux at the exobase (radius $r_\mathrm{exo}$, temperature $T_\mathrm{exo}$), +Each species $i$ escapes with the Jeans effusion flux at the exobase (radius $R_\mathrm{exo}$, temperature $T_\mathrm{exo}$), -$$w_\mathrm{J} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p} m_i}{k_\mathrm{B} T_\mathrm{exo}\, r_\mathrm{exo}} \tag{7}$$ +$$w_{\mathrm{J},i} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p} m_i}{k_\mathrm{B} T_\mathrm{exo}\, R_\mathrm{exo}} \tag{8}$$ where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter, multiplied by the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi = \Phi_\mathrm{J}\,\Phi_\mathrm{l} / (\Phi_\mathrm{J} + \Phi_\mathrm{l})$, their Eq. 14. The dominant species supplies itself and takes the Jeans flux alone. -Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} r_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the non-thermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. +Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} R_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the non-thermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. ## The Roche screen and overflow -Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the Bondi radius on the bolometric branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is not described by any of the four regimes above: the state is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag separating geometries whose Hill sphere sits inside the photosphere itself from those where only the flow reaches it. Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. +Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the sonic radius on the boil-off branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is not described by any of the four regimes above: the state is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag separating geometries whose Hill sphere sits inside the photosphere itself from those where only the flow reaches it. Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. ## Boundaries are bands -Every threshold above carries a stated physical width, and the framework reports the width instead of hiding it behind a sharp switch. Beside every verdict, the diagnostics container carries: the counterfactual labels at the Knudsen band edges 0.1 and 3; the boil-off activation band 15 to 35; the transonic energy criterion of Johnson et al. (2013) [^johnson] (can the absorbed power drive the flow sonic at all); the Jeans-parameter triple of Guo (2024) [^guo], which translates the verdict into that taxonomy; both escape temperatures with the local ionization fraction; the tidally corrected critical exobase temperature of Erkaev et al. (2007) [^erkaev]; the fluid condition checked level by level below the sonic radius, after Owen & Jackson (2012) [^oj12]; the threshold-potential screens (the efficiency-collapse band of Caldiroli et al. 2022 [^caldiroli], and a wind-versus-hydrostatic screen commonly attributed to Salz et al. 2016, quoted from secondary literature and marked as such); the boil-off termination timescales of Tang et al. (2024) [^tang]; a snapshot self-consistency screen (would the dispatched rate have destroyed the atmosphere within the system age); and the coefficient provenance class of every species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. +Every threshold above carries a stated physical width, and the framework reports the width instead of hiding it behind a sharp switch. Beside every verdict, the diagnostics container carries: the counterfactual labels at the Knudsen band edges 0.1 and 3; the boil-off activation band 15 to 35; the transonic energy criterion of Johnson et al. (2013) [^johnson] (can the absorbed power drive the flow sonic at all); the Jeans-parameter triple of Guo (2024) [^guo], which translates the verdict into that taxonomy; both escape temperatures with the local ionization fraction; the tidally corrected critical exobase temperature of Erkaev et al. (2007) [^erkaev]; the fluid condition checked level by level below the sonic radius, after Owen & Jackson (2012) [^oj12]; the threshold-potential screens (the efficiency-collapse band of Caldiroli et al. 2022 [^caldiroli], and the wind-versus-thermosphere screen of Salz et al. 2016 [^salz], whose simulations find energy-limited escape valid below $\log_{10}(-\Phi_\mathrm{G}) = 13.11$ erg g$^{-1}$ and hydrodynamically stable thermospheres above about 13.6, where hydrogen Lyman alpha and free-free emission re-radiate the entire energy input; that grid is hydrogen-dominated, so on a heavy secondary atmosphere the screen is out of its own scope and is reported rather than applied); the boil-off termination timescales of Tang et al. (2024) [^tang]; a snapshot self-consistency screen (would the dispatched rate have destroyed the atmosphere within the system age); and the coefficient provenance class of every species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. ## Configuration @@ -133,4 +171,6 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^guo]: Guo (2024). Characterizing regimes of hydrodynamic escape of close-in low mass exoplanets. arXiv:2405.13283. +[^salz]: Salz, M., Schneider, P. C., Czesla, S., & Schmitt, J. H. M. M. (2016). Energy-limited escape revised. The transition from strong planetary winds to stable thermospheres. *Astronomy & Astrophysics, 585*, L2. https://doi.org/10.1051/0004-6361/201527042 + [^oj12]: Owen, J. E., & Jackson, A. P. (2012). Planetary evaporation by UV and X-ray radiation: basic hydrodynamics. *Monthly Notices of the Royal Astronomical Society, 425*(4), 2931. https://doi.org/10.1111/j.1365-2966.2012.21481.x From 67121bfa163010f4403031c4e5b8b57f94e045f3 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 03:11:55 +0200 Subject: [PATCH 031/113] Make the tutorial's first step runnable as printed Step 1 named variables it never defined, so the one block a reader is most likely to copy could not run. It now defines every scalar, derives the equilibrium temperature and bolometric flux from the orbit, prints the profile it built, and dispatches, with the four choices that change results called out afterward. Literal exponent notation in prose becomes typeset powers of ten across the documentation, which the troubleshooting and validation pages carried most of. --- docs/How-to/troubleshooting.md | 6 +-- docs/Tutorials/dispatch.md | 79 ++++++++++++++++++++++++-------- docs/Validation/atomic_data.md | 2 +- docs/Validation/dispatcher.md | 2 +- docs/Validation/fractionation.md | 4 +- docs/Validation/hydrodynamic.md | 4 +- docs/Validation/hydrostatic.md | 2 +- docs/Validation/knudsen.md | 2 +- docs/Validation/profiles.md | 2 +- docs/Validation/thermostat.md | 2 +- 10 files changed, 73 insertions(+), 32 deletions(-) diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index b6861a3d..7bf5cf1b 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -4,14 +4,14 @@ A regime verdict looks wrong, or a flag fired and you want to know whether it ma Start with the two questions that dispose of most surprises: -1. **Is the rate physically meaningful at all?** One proton per year through the surface, about 5.3e-35 kg s⁻¹, is the smallest rate with content. Below it, the label is describing an outflow that does not exist. +1. **Is the rate physically meaningful at all?** One proton per year through the surface, about $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate with content. Below it, the label is describing an outflow that does not exist. 2. **Was the state near a boundary?** `diagnostics['knudsen']['counterfactual_labels']` gives the label at both edges of the collisionality criterion. When those disagree with each other, the verdict is a choice the criterion made, not a measurement, and the rest of this page is about which choice. --- ## The rate is zero, or absurdly small -**Symptom.** A `hydrostatic` verdict returns 1e-70 kg s⁻¹ or smaller. +**Symptom.** A `hydrostatic` verdict returns $10^{-70}$ kg s⁻¹ or smaller. **Cause.** Nothing is wrong. Jeans escape depends exponentially on the Jeans parameter at the exobase, and a heavy species on a strongly bound planet sits at a Jeans parameter of hundreds. Read `diagnostics['hydrostatic']['detail']['species'][name]['lambda_exo']`: above roughly 30, the exponential has already taken the rate out of physical relevance. @@ -27,7 +27,7 @@ Start with the two questions that dispose of most surprises: ## `thermostat_clamped` fired -**Symptom.** The wind temperature sits at a bracket edge, usually 5e4 K. +**Symptom.** The wind temperature sits at a bracket edge, usually $5 \times 10^{4}$ K. **Cause.** The local heating against cooling balance had no root in the bracket. At a dense wind base this is physical: electron densities far above the critical densities of the forbidden lines quench the line coolants collisionally, so nothing balances the heating and the wind runs hot. diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index f3a6628a..4c621668 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -52,37 +52,78 @@ from examples.demo_dispatcher.demo_dispatcher import ( The energy-limited entry point takes scalars. The framework needs the atmospheric structure as well, because the quantities that decide the regime are properties of the structure and not of the surface: the pressure level where XUV photons are absorbed and the wind is launched, the level where the gas stops colliding often enough to behave as a fluid, and the exobase where individual particles start escaping ballistically. -So a state is scalars plus a `profiles.Profile`. This is what `build_state` assembles: +So a state is scalars plus a `profiles.Profile`. Here it is in full, which is what `build_state` assembles for you in every later step: ```python -from zephyrus.dispatcher import EscapeInputs +import math + +from zephyrus.constants import au2m +from zephyrus.dispatcher import DispatchSettings, EscapeInputs, dispatch +from zephyrus.planets_parameters import Me, Me_atm, Ms, Re from zephyrus.profiles import isothermal_profile -profile = isothermal_profile(M_p, R_p, T_eq, {'CO2': 1.0}, 1.0e7, 1.0e-5) +SIGMA_SB = 5.670374419e-8 # Stefan-Boltzmann constant [W m-2 K-4] +L_SUN = 3.828e26 # solar luminosity [W] + +M_p = 1.0 * Me # planet mass [kg] +R_p = 1.0 * Re # planet radius [m] +a = 0.0775 * au2m # semi-major axis [m] +composition = {'CO2': 1.0} # mole fractions at every level + +# Equilibrium temperature and bolometric flux from the orbit, zero albedo +# and full redistribution, so the three stay mutually consistent. +T_eq = (L_SUN / (16.0 * math.pi * SIGMA_SB * a**2)) ** 0.25 # [K] +F_bol = L_SUN / (4.0 * math.pi * a**2) # [W m-2] + +# One Earth atmosphere, split over elements by mass: the screens and the +# unfractionated split are the only consumers. +reservoirs = {'C': 0.2729 * Me_atm, 'O': 0.7271 * Me_atm} # [kg] +age = 1.0e8 * 3.15576e7 # snapshot age, 100 Myr [s] + +profile = isothermal_profile(M_p, R_p, T_eq, composition, 1.0e7, 1.0e-5) state = EscapeInputs( - M_p=M_p, # planet mass [kg] - R_p=R_p, # planet radius [m] - M_star=Ms, # stellar mass [kg] - a=a, # semi-major axis [m] - e=0.0, # eccentricity - T_eq=T_eq, # equilibrium temperature [K] - F_xuv=10.0, # XUV flux at the planet [W m-2] - F_bol=f_bol, # bolometric instellation [W m-2] - F_int=1.0, # interior heat flux [W m-2] - kappa_photo=0.01, # photospheric opacity [m2 kg-1] + M_p=M_p, + R_p=R_p, + M_star=1.0 * Ms, # stellar mass [kg] + a=a, + e=0.0, # eccentricity + T_eq=T_eq, + F_xuv=10.0, # XUV flux at the planet [W m-2] + F_bol=F_bol, + F_int=1.0, # interior heat flux [W m-2] + kappa_photo=0.01, # photospheric opacity [m2 kg-1] profile=profile, settings=DispatchSettings(), - age=age, # optional, for the consistency screen [s] - reservoirs=reservoirs, # optional, element inventories [kg] + age=age, # optional, for the consistency screen + reservoirs=reservoirs, # optional, element inventories ) + +print(f'T_eq = {T_eq:.1f} K') +print(f'F_bol = {F_bol:.4g} W m-2') +print(f'levels = {profile.p.size}, {profile.p[0]:.3g} to {profile.p[-1]:.3g} Pa') +print(f'radius = {profile.r[0] / Re:.3f} to {profile.r[-1] / Re:.3f} Earth radii') +print(dispatch(state).regime) ``` -In a coupled run the atmosphere module supplies the profile. Standalone, `isothermal_profile` integrates a hydrostatic isothermal structure of fixed composition, which is enough to exercise every branch. Three choices in the script are worth stating, because they are the ones that change results: +Output: + +```text +T_eq = 999.8 K +F_bol = 2.266e+05 W m-2 +levels = 120, 1e+07 to 1e-05 Pa +radius = 1.000 to 1.091 Earth radii +hydrodynamic:EL +``` + +In a coupled run the atmosphere module supplies the profile. Standalone, `isothermal_profile` integrates a hydrostatic isothermal structure of fixed composition from the surface pressure to the top pressure, which is enough to exercise every branch: 120 levels here, spanning 100 bar to 0.1 nanobar and reaching 1.09 planetary radii. Four of those choices change results rather than just labels: + +- The top pressure, $10^{-5}$ Pa or 0.1 nanobar. The XUV wind launches near a nanobar, so a profile that stops deeper than that cannot reach its own wind base and the base clamps to the profile top instead, flagged. Setting the top below a nanobar keeps the clamp out of the way. +- The photospheric opacity, 0.01 m² kg⁻¹ or about 0.1 cm² g⁻¹. The boil-off rate scales as its inverse, so it matters whenever the boil-off branch is in play. +- The orbit, 0.0775 au around a solar-luminosity star, which puts the equilibrium temperature at 1000 K. Deriving $T_\mathrm{eq}$ and $F_\mathrm{bol}$ from the orbit rather than setting all three by hand keeps the state self-consistent. +- The interior heat flux, 1 W m⁻². It sets the luminosity cap on the boil-off residual and nothing else, so it only matters near that branch. -- `p_top = 1e-5` Pa, which is 0.1 nanobar. The XUV wind launches near a nanobar, so a profile that stops deeper than that cannot reach its own wind base and the base clamps to the profile top instead, flagged. Setting the top below a nanobar keeps the clamp out of the way. -- `kappa_photo = 0.01` m² kg⁻¹, about 0.1 cm² g⁻¹. The boil-off rate scales as its inverse, so it matters whenever the bolometric branch is in play. -- The orbit is 0.0775 au around a solar-luminosity star, which puts the zero-albedo, full-redistribution equilibrium temperature at 1000 K. Deriving $T_\mathrm{eq}$ from the orbit rather than setting both by hand keeps the state self-consistent. +The optional fields are worth setting even when you do not need them: `age` and `reservoirs` are what let the diagnostics tell you whether a rate is consistent with the state having survived, which is step 5. !!! warning "SI at every boundary" Every input is SI: kilograms, meters, seconds, kelvin, W m⁻², m² kg⁻¹. MORS returns cgs luminosities, so the flux conversions in step 7 are explicit. diff --git a/docs/Validation/atomic_data.md b/docs/Validation/atomic_data.md index 36e9c883..e000aea5 100644 --- a/docs/Validation/atomic_data.md +++ b/docs/Validation/atomic_data.md @@ -5,7 +5,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the trans | Test id | Reference | Scope | |---|---|---| | `tests/test_atomic_data.py::test_three_level_transcription_spot_values` | Nakayama, Ikoma & Terada (2022), ApJ 937, 72 ([ADS 2022ApJ...937...72N](https://ui.adsabs.harvard.edu/abs/2022ApJ...937...72N)), Appendix C Tables 2 to 5 | Spot Einstein coefficients (the N transauroral and auroral lines, hydrogen Lyman-alpha) and the corrected O+ level set (4S-2D-2P with the printed weights 4, 10, 6) pin the transcription against the printed tables. | -| `tests/test_atomic_data.py::test_badnell_fit_magnitude_slope_and_misprint_guard` | Badnell (2006), ApJS 167, 334 (arXiv astro-ph/0604144), Eqs. 1 and 2 | The radiative recombination fit lands in the published low 1e-13 cm^3 s^-1 decade at 1e4 K with the published falling slope, and is explicitly discriminated against the garbled rendering of the same fit printed by Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 35), which disagrees by more than a factor 2. | +| `tests/test_atomic_data.py::test_badnell_fit_magnitude_slope_and_misprint_guard` | Badnell (2006), ApJS 167, 334 (arXiv astro-ph/0604144), Eqs. 1 and 2 | The radiative recombination fit lands in the published low $10^{-13}$ cm^3 s^-1 decade at $10^{4}$ K with the published falling slope, and is explicitly discriminated against the garbled rendering of the same fit printed by Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 35), which disagrees by more than a factor 2. | ## Notes diff --git a/docs/Validation/dispatcher.md b/docs/Validation/dispatcher.md index 189834f5..b39f70e8 100644 --- a/docs/Validation/dispatcher.md +++ b/docs/Validation/dispatcher.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` test that anchors the assem | Test id | Reference | Scope | |---|---|---| -| `tests/test_dispatcher.py::test_routing_hydrodynamic_and_el_candidate_matches_el_escape` | Cross-implementation check against `zephyrus.escape.EL_escape` (Erkaev et al. 2007 form, scaling = 2) | The dispatcher's energy-limited candidate equals the released public entry point evaluated with the same efficiency, radii, flux, and tidal factor to 1e-9 relative, and the dispatched rate is the min(EL, RR) winner named by the sub-label. | +| `tests/test_dispatcher.py::test_routing_hydrodynamic_and_el_candidate_matches_el_escape` | Cross-implementation check against `zephyrus.escape.EL_escape` (Erkaev et al. 2007 form, scaling = 2) | The dispatcher's energy-limited candidate equals the released public entry point evaluated with the same efficiency, radii, flux, and tidal factor to $10^{-9}$ relative, and the dispatched rate is the min(EL, RR) winner named by the sub-label. | ## Notes diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md index b2e286d3..ba70681e 100644 --- a/docs/Validation/fractionation.md +++ b/docs/Validation/fractionation.md @@ -5,12 +5,12 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-spe | Test id | Reference | Scope | |---|---|---| | `tests/test_fractionation.py::test_ternary_deuterium_reductions` | Gu & Chen (2023), Eqs. 4, 8, 9, and 12; Cherubim & Wordsworth (2024), ApJ 967, 139, Eq. 11 | The H-He-D system reproduces both branches and both critical rates exactly, including the helium admixture factor on the deuterium threshold. | -| `tests/test_fractionation.py::test_two_majors_trace_minor_relations` | Odert et al. (2018), Icarus 307, 327, Eq. 5; Zahnle et al. (1990), Icarus 84, 502, Eqs. 35 and 36; Zahnle & Kasting (1986), Icarus 68, 462, Eq. 36 | Entrained trace minors follow the Odert relation (equal to Zahnle et al. Eq. 35) to 1e-11 relative, the closure clamps exactly to zero where the printed formula goes negative, the limiting flux follows Zahnle et al. Eq. 36, and the earlier 1986 drag-deficit weighting is demonstrably NOT reproduced (the adjudication between the two printed variants). | +| `tests/test_fractionation.py::test_two_majors_trace_minor_relations` | Odert et al. (2018), Icarus 307, 327, Eq. 5; Zahnle et al. (1990), Icarus 84, 502, Eqs. 35 and 36; Zahnle & Kasting (1986), Icarus 68, 462, Eq. 36 | Entrained trace minors follow the Odert relation (equal to Zahnle et al. Eq. 35) to $10^{-11}$ relative, the closure clamps exactly to zero where the printed formula goes negative, the limiting flux follows Zahnle et al. Eq. 36, and the earlier 1986 drag-deficit weighting is demonstrably NOT reproduced (the adjudication between the two printed variants). | | `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | | `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | | `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | | `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1%. | -| `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to 1e-12 relative, with flux continuity at the crossover and exact mass conservation. | +| `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to $10^{-12}$ relative, with flux continuity at the crossover and exact mass conservation. | ## Notes diff --git a/docs/Validation/hydrodynamic.md b/docs/Validation/hydrodynamic.md index 1dc91a15..92fbf809 100644 --- a/docs/Validation/hydrodynamic.md +++ b/docs/Validation/hydrodynamic.md @@ -5,9 +5,9 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | Test id | Reference | Scope | |---|---|---| | `tests/test_hydrodynamic.py::test_erkaev_table1_enhancement_factors` | Erkaev et al. (2007), A&A 472, 329, Table 1 and Eq. 17 | The tidal factor reproduces all seven printed enhancement factors 1/K within 1%, falling monotonically toward 1 with xi. | -| `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5% across three decades of collapse, and the complex-valued region below F_XUV/rho_p = 1e2 (cgs) is rejected with a flag rather than evaluated. | +| `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5% across three decades of collapse, and the complex-valued region below F_XUV/rho_p = $10^{2}$ (cgs) is rejected with a flag rather than evaluated. | | `tests/test_hydrodynamic.py::test_wind_mean_masses_reproduce_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed H/He pair (0.62, 1.3) and steam pair (3, 6) in proton masses. | -| `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5%), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers (1e-4 and 1e-5 at 450 and 5e5 erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | +| `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5%), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers ($10^{-4}$ and $10^{-5}$ at 450 and $5 \times 10^{5}$ erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | ## Notes diff --git a/docs/Validation/hydrostatic.md b/docs/Validation/hydrostatic.md index e97be578..af5ba9fb 100644 --- a/docs/Validation/hydrostatic.md +++ b/docs/Validation/hydrostatic.md @@ -5,7 +5,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | Test id | Reference | Scope | |---|---|---| | `tests/test_hydrostatic.py::test_volkov_eq9_unity_limit_and_printed_coefficient` | Volkov et al. (2011), Phys. Fluids 23, 066601, Eq. 9 and their printed c(lambda) table | The drifting-Maxwellian flux ratio reduces to unity at zero bulk velocity and reproduces the printed linear coefficient across lambda 1 to 106; the test also demonstrates that this correction and the flat kinetic factor the branch applies have opposite slopes in lambda, so applying both would double-count. | -| `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at 2.4e8 cm^-2 s^-1 (40% tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | +| `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at $2.4 \times 10^{8}$ cm^-2 s^-1 (40% tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | ## Notes diff --git a/docs/Validation/knudsen.md b/docs/Validation/knudsen.md index 3df1bf1d..ebd6b957 100644 --- a/docs/Validation/knudsen.md +++ b/docs/Validation/knudsen.md @@ -8,7 +8,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the colli ## Notes -The companion transcription-pin test freezes the momentum-transfer cross sections evaluated from the fit at transcription time, so any later coefficient corruption fails even where no measurement exists. The hydrogen route is pinned to its construction values (sigma(H-H) = 6.4e-20 m^2 at 1e4 K from Zahnle et al. 1990, Eq. 30, on the Zahnle & Kasting 1986 Table I diffusion parameter). +The companion transcription-pin test freezes the momentum-transfer cross sections evaluated from the fit at transcription time, so any later coefficient corruption fails even where no measurement exists. The hydrogen route is pinned to its construction values (sigma(H-H) = $6.4 \times 10^{-20}$ m^2 at $10^{4}$ K from Zahnle et al. 1990, Eq. 30, on the Zahnle & Kasting 1986 Table I diffusion parameter). ## Anchor type diff --git a/docs/Validation/profiles.md b/docs/Validation/profiles.md index 2c69d277..6c5cf745 100644 --- a/docs/Validation/profiles.md +++ b/docs/Validation/profiles.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the escap | Test id | Reference | Scope | |---|---|---| -| `tests/test_profiles.py::test_lopez_base_pressure_is_the_nanobar_level` | Lopez (2017), MNRAS 472, 245, Section 2 (wind-base prescription); Murray-Clay et al. (2009), ApJ 693, 23, Section 2.1 (the nanobar tau = 1 level) | Pins the Lopez base pressure `P_base = mu g / sigma_nu0` to the published nanobar scale (within a factor of a few of 1e-4 Pa) for the Murray-Clay fiducial hot Jupiter, with exact linearity in gravity and insensitivity to the proton-mass versus atomic-weight convention below 1%. | +| `tests/test_profiles.py::test_lopez_base_pressure_is_the_nanobar_level` | Lopez (2017), MNRAS 472, 245, Section 2 (wind-base prescription); Murray-Clay et al. (2009), ApJ 693, 23, Section 2.1 (the nanobar tau = 1 level) | Pins the Lopez base pressure `P_base = mu g / sigma_nu0` to the published nanobar scale (within a factor of a few of $10^{-4}$ Pa) for the Murray-Clay fiducial hot Jupiter, with exact linearity in gravity and insensitivity to the proton-mass versus atomic-weight convention below 1%. | ## Notes diff --git a/docs/Validation/thermostat.md b/docs/Validation/thermostat.md index 68e8014b..978721f7 100644 --- a/docs/Validation/thermostat.md +++ b/docs/Validation/thermostat.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the stati | Test id | Reference | Scope | |---|---|---| -| `tests/test_thermostat.py::test_hydrogen_system_brackets_the_black_lyalpha_rate` | Black (1981) Lyman-alpha cooling rate as printed by Murray-Clay et al. (2009), ApJ 693, 23, their Eq. 6 | The hydrogen three-level system agrees with the Black rate at order unity, with the ratio declining from about 0.5 at 1e4 K to about 0.3 at 2e4 K because the effective collision strengths are frozen at 1e4 K and the three-level system carries no cascades; the bracket catches transcription errors in the constant and in the exp(-118348 K / T) activation. | +| `tests/test_thermostat.py::test_hydrogen_system_brackets_the_black_lyalpha_rate` | Black (1981) Lyman-alpha cooling rate as printed by Murray-Clay et al. (2009), ApJ 693, 23, their Eq. 6 | The hydrogen three-level system agrees with the Black rate at order unity, with the ratio declining from about 0.5 at $10^{4}$ K to about 0.3 at $2 \times 10^{4}$ K because the effective collision strengths are frozen at $10^{4}$ K and the three-level system carries no cascades; the bracket catches transcription errors in the constant and in the exp(-118348 K / T) activation. | ## Notes From dd80ef100762b5c1aaa7a45a066bfccc72a7aa31 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 03:35:53 +0200 Subject: [PATCH 032/113] Say what the RR mechanism diagnostic separates The string claimed the two cases differ in their flux scaling, and they do not: the base ion density follows the square root of the XUV flux at every base Jeans parameter in this chain, so a fitted exponent sits near one half whichever case holds, departing only where the thermostat is still moving the wind temperature quickly. What separates them is the barometric factor already returned beside the rate, the fraction of the base density that reaches the sonic point. The docstring and the troubleshooting guide now say that, and both state that the split at a base Jeans parameter of 4 has no source behind it and places the canonical recombination-limited case of the literature on the suppression side. The Parker rate is written as Mdot_P, matching the other rates on the page. --- docs/Explanations/regimes.md | 4 ++-- docs/How-to/troubleshooting.md | 4 +++- src/zephyrus/hydrodynamic.py | 24 +++++++++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 09076986..5c576cf1 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -55,7 +55,7 @@ the ratio of a particle's gravitational binding energy at the surface to its the While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): -$$\dot{M}_\mathrm{Parker} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{s}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \quad x = \frac{R_\mathrm{launch}}{R_\mathrm{B}} \tag{2}$$ +$$\dot{M}_\mathrm{P} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{s}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \quad x = \frac{R_\mathrm{launch}}{R_\mathrm{B}} \tag{2}$$ where $\mathcal{M}$ is the Mach number at the launch level (the photospheric level, radius $R_\mathrm{launch}$), $W_0$ is the principal branch of the Lambert function, and $\kappa$ is the photospheric opacity, which the rate scales inversely with. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; for small $x$ the rate shuts off exponentially, which is the physical end of boil-off. The rate is capped by the Bondi-limited supply of Gupta & Schlichting (2020) [^gs20], @@ -65,7 +65,7 @@ with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lam $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ -with $g$ the surface gravity [^gs19]. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{Parker}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. +with $g$ the surface gravity [^gs19]. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. Whether that residual lasts is disputed, and the framework declines to adjudicate. Tang et al. (2024) find core-powered mass loss ends early, once the envelope has contracted [^tang]; Gupta & Schlichting find it continues for gigayears [^gs19]. The luminosity cap is what makes the disagreement affordable: it holds the residual to the interior heat budget, which is small once the planet has cooled, so a run that keeps the branch alive and a run that switches it off differ by little. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion without the code having taken a side. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 7bf5cf1b..52ac3b09 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -52,7 +52,9 @@ Physically, a state in that corner is not an XUV wind launched at an ionization **Cause.** The minimum over the two hydrodynamic candidates can select the recombination-limited rate for two physically different reasons. One is genuine saturation: the base ion density follows photoionization against recombination balance, so the rate grows as $\sqrt{F_\mathrm{XUV}}$ while the energy-limited rate grows linearly, and the former wins at high flux. The other is barometric suppression: at large $\lambda_\mathrm{b}$ the isothermal wind is exponentially throttled between the base and the sonic point, and the smallness has nothing to do with radiation. -**What to do.** Read `selection_mechanism`. Treat its split as the reporting convention it is: the string switches at $\lambda_\mathrm{b} = 4$, which is a stated convention rather than a derived boundary, and the canonical recombination-limited case of the literature sits near $\lambda_\mathrm{b} = 5.5$, on the barometric side of it. So use the string to tell you which quantity to look at, not as a verdict. The two mechanisms separate properly by their flux scaling: fit the rate against $F_\mathrm{XUV}$ over a decade and read the exponent, near 1/2 for saturation and much steeper or flatter for suppression. Whichever it is, do not describe a suppression-dominated point as recombination limited in text or in a figure legend. +**What to do.** Read `diagnostics['hydrodynamic']['rr_chain']['barometric_factor']`, which is $e^{3/2 - \lambda_\mathrm{b}}$, the fraction of the base density that survives to the sonic point. Near 1 the sonic-point density is the base density and the rate is set by the recombination-limited base ionization, which is the mechanism the label names. Several decades below 1 the rate is small mostly because the isothermal wind cannot carry material that far, and attributing the smallness to recombination misplaces it. + +Two cautions on the `selection_mechanism` string itself. Its switch at $\lambda_\mathrm{b} = 4$ is a round number chosen when the diagnostic was written, equivalent to a suppression of about one decade, and it puts the canonical recombination-limited case of the literature, near $\lambda_\mathrm{b} = 5.5$, on the suppression side. And the flux scaling does not separate the two: the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain, so a fitted exponent sits near 1/2 whichever mechanism dominates, departing from it only where the thermostat is still moving the wind temperature quickly with flux. Use the factor, not the exponent, and do not describe a strongly suppressed point as recombination limited in text or in a figure legend. ## `base_clamped` fired diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index c93be381..f3f36c43 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -378,13 +378,23 @@ def rr_chain( def selection_mechanism(rr: dict, el_won: bool) -> str: """Which mechanism min(EL, RR) actually selected; diagnostic only. - An RR win means one of two physically different things: genuine - recombination saturation (the sqrt(F) limitation at modest base Jeans - parameter) or barometric suppression (large ``lambda_b``: the - isothermal wind exponentially throttled between base and sonic point, - which has nothing to do with recombination). The split at - ``lambda_b = 4`` is a reporting convention, stated as such. This string - never gates anything. + An RR win means one of two physically different things. Either the + recombination-limited base ionization sets the rate, the sonic-point + density being close to the base density, or the isothermal wind is + exponentially throttled between base and sonic point at large + ``lambda_b``, which has nothing to do with recombination. The quantity + that separates them is the barometric factor ``exp(3/2 - lambda_b)`` + returned by :func:`rr_chain`, not the flux scaling: the base ion + density follows sqrt(F_XUV) at every ``lambda_b`` here, so a fitted + flux exponent sits near one half either way. + + The split at ``lambda_b = 4`` is a reporting convention with no source + behind the number, equivalent to a suppression of about one decade. It + is coarse: the canonical recombination-limited case of the literature + (Murray-Clay et al. 2009, their fiducial hot Jupiter at + ``lambda_b = 5.49``) falls on the suppression side of it. Read the + barometric factor when the distinction matters. This string never gates + anything. """ if el_won: return 'EL-selected' From 186aa8c62f870c9ec45bc6478f8267b6da75ce6d Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 03:48:42 +0200 Subject: [PATCH 033/113] Retire the base Jeans parameter mechanism split The selection diagnostic claimed to name which physics made a recombination-limited win small, splitting on a base Jeans parameter of 4. That number had no source, and the split placed the canonical recombination-limited case of the literature on the suppression side, so the string asserted a mechanism it could not test. It now reports which candidate won and whether the sonic radius was floored, three values in all, and the barometric factor already returned beside the rate is what answers the mechanism question: near 1 the base ionization sets the rate, decades below 1 the wind cannot reach the sonic point. Its test asserts that separation on the factor and pins both supercritical cases to one label so a threshold cannot come back unnoticed. The regimes page, the results reference, the tutorial, and the troubleshooting guide say the same. --- docs/Explanations/regimes.md | 2 +- docs/How-to/troubleshooting.md | 4 +++- docs/Reference/results.md | 4 ++-- docs/Tutorials/dispatch.md | 2 +- src/zephyrus/hydrodynamic.py | 40 +++++++++++++++------------------ tests/test_hydrodynamic.py | 41 ++++++++++++++++++++++------------ 6 files changed, 52 insertions(+), 41 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 5c576cf1..9e50dcb4 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -85,7 +85,7 @@ with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition $$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ -The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, genuine recombination saturation at modest $\lambda_\mathrm{b}$ (the $\sqrt{F_\mathrm{XUV}}$ regime of Eq. 5) and plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error; the diagnostics report which mechanism acted. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 52ac3b09..22215571 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -54,7 +54,9 @@ Physically, a state in that corner is not an XUV wind launched at an ionization **What to do.** Read `diagnostics['hydrodynamic']['rr_chain']['barometric_factor']`, which is $e^{3/2 - \lambda_\mathrm{b}}$, the fraction of the base density that survives to the sonic point. Near 1 the sonic-point density is the base density and the rate is set by the recombination-limited base ionization, which is the mechanism the label names. Several decades below 1 the rate is small mostly because the isothermal wind cannot carry material that far, and attributing the smallness to recombination misplaces it. -Two cautions on the `selection_mechanism` string itself. Its switch at $\lambda_\mathrm{b} = 4$ is a round number chosen when the diagnostic was written, equivalent to a suppression of about one decade, and it puts the canonical recombination-limited case of the literature, near $\lambda_\mathrm{b} = 5.5$, on the suppression side. And the flux scaling does not separate the two: the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain, so a fitted exponent sits near 1/2 whichever mechanism dominates, departing from it only where the thermostat is still moving the wind temperature quickly with flux. Use the factor, not the exponent, and do not describe a strongly suppressed point as recombination limited in text or in a figure legend. +Do not expect `selection_mechanism` to answer this. It reports which candidate won, `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and nothing about why. An earlier version split RR wins on the base Jeans parameter; that split was retired because the number behind it had no source and it placed the canonical recombination-limited case of the literature, near $\lambda_\mathrm{b} = 5.5$, on the suppression side. + +The flux scaling will not separate them either: the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain, so a fitted exponent sits near 1/2 whichever case holds, departing from it only where the thermostat is still moving the wind temperature quickly with flux. Use the factor, and do not describe a strongly suppressed point as recombination limited in text or in a figure legend. ## `base_clamped` fired diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 59f9908f..00cd8fd4 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -24,7 +24,7 @@ Every physically posed state returns a result. A `ValueError` means the state or |---|---|---| | `boiloff` | Bolometrically driven outflow from an atmosphere inflated beyond its own sonic radius. | Closed-form transonic Parker wind, Bondi-capped, and luminosity-capped past the activation gate. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | -| `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | See `selection_mechanism`: the minimum selects this rate two physically different ways. | +| `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | | `roche_overflow` | The active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet. | The Bondi-capped bolometric machinery at the overflow geometry. | @@ -94,7 +94,7 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a | Group | Key contents | What it answers | |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | -| `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won and by what mechanism, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). | +| `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | | `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 4c621668..0c5ec12f 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -320,7 +320,7 @@ Output: EL-selected 8430.51967382717 0.1 0.9175976086377635 ``` -Both candidates are always computed, so you can see the margin. `selection_mechanism` matters more than it looks: the minimum can select the recombination-limited rate two physically different ways, through genuine recombination saturation or through plain barometric suppression between the wind base and the sonic point, and calling the second one recombination-limited would be a category error. The mechanism string names which one acted, with the caveat that its own switch at a base Jeans parameter of 4 is a reporting convention rather than a derived boundary. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical $10^{4}$ K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. +Both candidates are always computed, so you can see the margin. `selection_mechanism` says which one won, and takes a third value, `RR-selected:subcritical-floor`, when the sonic radius had to be floored at the wind base. It deliberately does not say why an RR win was small: the minimum can select the recombination-limited rate either because the recombination-limited base ionization sets it or because the wind is throttled between base and sonic point, and calling the second one recombination-limited would be a category error. What separates them is `rr_chain['barometric_factor']`, the fraction of the base density reaching the sonic point, which is 0.0095 here. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical $10^{4}$ K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. ### Could the heating drive the flow at all? diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index f3f36c43..8417242d 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -376,30 +376,26 @@ def rr_chain( def selection_mechanism(rr: dict, el_won: bool) -> str: - """Which mechanism min(EL, RR) actually selected; diagnostic only. - - An RR win means one of two physically different things. Either the - recombination-limited base ionization sets the rate, the sonic-point - density being close to the base density, or the isothermal wind is - exponentially throttled between base and sonic point at large - ``lambda_b``, which has nothing to do with recombination. The quantity - that separates them is the barometric factor ``exp(3/2 - lambda_b)`` - returned by :func:`rr_chain`, not the flux scaling: the base ion - density follows sqrt(F_XUV) at every ``lambda_b`` here, so a fitted - flux exponent sits near one half either way. - - The split at ``lambda_b = 4`` is a reporting convention with no source - behind the number, equivalent to a suppression of about one decade. It - is coarse: the canonical recombination-limited case of the literature - (Murray-Clay et al. 2009, their fiducial hot Jupiter at - ``lambda_b = 5.49``) falls on the suppression side of it. Read the - barometric factor when the distinction matters. This string never gates - anything. + """Which candidate min(EL, RR) selected; diagnostic only. + + Three outcomes: the energy-limited rate won, the + recombination-limited rate won, or it won with the sonic radius + floored at the wind base (the subcritical configuration of + :func:`rr_chain`, where the returned value is a floored one rather + than a transonic wind). + + Why an RR win came out small is a separate question, and this string + does not answer it. The quantity that does is the barometric factor + ``exp(3/2 - lambda_b)`` returned beside the rate: near 1 the + sonic-point density is the base density and the recombination-limited + base ionization sets the rate, while several decades below 1 the rate + is small mostly because the isothermal wind cannot carry material + from the base to the sonic point, which has nothing to do with + recombination. The flux scaling cannot separate the two, because the + base ion density follows sqrt(F_XUV) at every ``lambda_b`` here. """ if el_won: return 'EL-selected' if rr['subcritical']: return 'RR-selected:subcritical-floor' - if rr['lambda_b'] >= 4.0: - return 'RR-selected:barometric-suppression' - return 'RR-selected:recombination-saturation' + return 'RR-selected' diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index 86e714a3..edf73387 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -147,28 +147,41 @@ def test_rr_subcritical_floor_semantics(): @pytest.mark.physics_invariant -def test_rr_barometric_factor_and_mechanism_labels(): - """Supercritical winds carry exp(3/2 - lambda_b), labeled by mechanism. - - A heavy C-O wind on a massive planet is strongly bound: the barometric - factor is exactly ``exp(3/2 - lambda_b)``, and with ``lambda_b`` above - the reporting split an RR win is labeled barometric suppression, never - recombination saturation (the category-error guard). The EL-win label - is independent of the chain state. +def test_rr_barometric_factor_separates_the_two_rr_regimes(): + """The barometric factor, not the label, says why an RR win is small. + + A heavy C-O wind on a massive planet is strongly bound: the factor is + ``exp(3/2 - lambda_b)`` and suppresses the sonic-point density by + decades, so its rate is small because the isothermal wind cannot carry + material that far. A loosely bound hydrogen wind keeps a factor of + order unity, so its rate is the recombination-limited base ionization. + The selection string reports which candidate won and nothing more: + both supercritical cases read ``RR-selected``, which is what retiring + the old base-Jeans-parameter split means. """ rr = rr_chain(10.0 * Me, 10.0, 2.0 * Re, 1.0e4, {'C': 1.0 / 3.0, 'O': 2.0 / 3.0}) assert rr['subcritical'] is False assert rr['barometric_factor'] == pytest.approx(math.exp(1.5 - rr['lambda_b']), rel=1e-12) + # Strongly bound: several decades of suppression, so the sonic-point + # density is far below the base density. assert rr['lambda_b'] > 4.0 - assert selection_mechanism(rr, el_won=False) == 'RR-selected:barometric-suppression' - assert selection_mechanism(rr, el_won=True) == 'EL-selected' - # A loosely bound hydrogen wind (base Jeans parameter between the - # supercritical floor at 2 and the reporting split at 4) lands in - # genuine recombination saturation. + assert rr['barometric_factor'] < 1.0e-2 + assert rr['rho_s'] == pytest.approx(rr['rho_base'] * rr['barometric_factor'], rel=1e-12) + rr_h = rr_chain(0.7 * Mjup, 5.0, 2.0 * Rjup, 1.0e4, {'H': 1.0}) assert not rr_h['subcritical'] + # Loosely bound: the factor is of order unity, two decades above the + # heavy case, which is the separation the label used to assert. assert 2.0 < rr_h['lambda_b'] < 4.0 - assert selection_mechanism(rr_h, el_won=False) == 'RR-selected:recombination-saturation' + assert rr_h['barometric_factor'] > 1.0e2 * rr['barometric_factor'] + assert 0.1 < rr_h['barometric_factor'] <= 1.0 + + # The string keeps three outcomes and no threshold: both of these are + # supercritical RR wins, so a split on lambda_b would have separated + # them and this assertion is what forbids one coming back. + assert selection_mechanism(rr, el_won=False) == 'RR-selected' + assert selection_mechanism(rr_h, el_won=False) == 'RR-selected' + assert selection_mechanism(rr, el_won=True) == 'EL-selected' @pytest.mark.physics_invariant From a3c66f887a4157fa03209ff0740cd97c1d41a40d Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 04:13:07 +0200 Subject: [PATCH 034/113] Divide the luminosity cap by the tidal barrier The interior-luminosity cap on the bolometric residual is a luminosity over the work per unit mass needed to lift gas out of the potential well, and that barrier carries the same tidal reduction the energy-limited rate divides by, measured from the same radius (Erkaev et al. 2007, their Eq. 17). Without it the two rates that compete past the activation gate measured different barriers, and a planet close to filling its Roche lobe was held to an untidal cap. The new test pins the enhancement against the 1.92 printed in their Table 1 at xi = 3 and asserts that K = 1 reproduces the untidal value, so a caller with tides off sees no change. --- docs/Validation/boiloff.md | 5 +++-- src/zephyrus/boiloff.py | 23 ++++++++++++++++++---- tests/test_boiloff.py | 39 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/docs/Validation/boiloff.md b/docs/Validation/boiloff.md index 0fdac7ec..1991439b 100644 --- a/docs/Validation/boiloff.md +++ b/docs/Validation/boiloff.md @@ -6,13 +6,14 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the boil- |---|---|---| | `tests/test_boiloff.py::test_parker_mach_sonic_limit_and_shutoff` | Owen & Wu (2016), ApJ 817, 107 (isothermal transonic Parker wind, Lambert-W form) | The photospheric Mach number is 1 identically with the launch level at the Bondi radius (the analytical sonic-point limit), falls monotonically as the level retreats inward, and has collapsed by more than six decades at their published shutoff R_p/R_B = 0.1. | | `tests/test_boiloff.py::test_lambda_equals_two_bondi_radii_over_rp` | Fossati et al. (2017), A&A 598, A90 (restricted Jeans parameter); Owen & Wu (2016), ApJ 817, 107 | The identity Lambda = 2 R_B / R_p holds for every mean molecular mass, which is what makes the Owen & Wu shutoff equal to Lambda = 20 for every composition; the literature band 15 to 35 brackets the default threshold. | +| `tests/test_boiloff.py::test_luminosity_cap_carries_the_tidal_barrier_reduction` | Erkaev et al. (2007), A&A 472, 329, Eq. 17 and Table 1 | The luminosity cap divides by the tidally reduced escape barrier, so it rises by the enhancement factor 1 / K, whose value at xi = 3 is the 1.92 printed in their Table 1; K = 1 reproduces the untidal cap identically. | ## Notes -The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 9); the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. +The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 9), whose barrier carries the Erkaev tidal factor at xi = R_Hill / R_p so that the cap and the energy-limited rate it competes against measure the same barrier; the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. ## Anchor type Analytical limit plus published benchmark (the printed shutoff). -Date of last comparison against the sources: 2026-08-20. +Date of last comparison against the sources: 2026-08-22. diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 3a4757c2..aa9b8a75 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -36,11 +36,16 @@ # identified with the radiative-convective boundary, a documented # approximation on a static profile. # - Luminosity cap, applied only past the activation gate: -# Mdot_E = L / (g R_p) with L = 4 pi R_p^2 F_int (Gupta & Schlichting +# Mdot_E = L / (g R_p K) with L = 4 pi R_p^2 F_int (Gupta & Schlichting # 2019, MNRAS 487, 24, their Eq. 9). Capping the residual bolometric # channel by the interior luminosity sidesteps the open dispute over how # long core-powered mass loss survives after boil-off (Tang et al. 2024, # ApJ 976, 221, argue it is brief; Gupta & Schlichting argue it lasts). +# The barrier the luminosity has to lift the gas over carries the tidal +# reduction K(xi) of Erkaev et al. (2007, A&A 472, 329, their Eq. 17), +# xi = R_Hill/R_p, so the cap and the energy-limited rate it competes +# against measure the same barrier from the same reference radius; K = 1 +# recovers the untidal form and is what a caller with tides off gets. # - Termination diagnostic: the Tang et al. (2024) Eq. (8) timescale # comparison, run as a diagnostic beside the rate's own exponential # shutoff, never as a gate. @@ -92,6 +97,7 @@ def bolometric_candidate( F_int: float, lambda_gate: float, lambda_crit: float, + k_tide: float = 1.0, ) -> tuple[float, dict]: """The bolometrically driven candidate mass-loss rate, in kg/s. @@ -120,14 +126,21 @@ def bolometric_candidate( The restricted Jeans parameter of the configuration. lambda_crit : float The activation threshold (20 by default upstream; band 15 to 35). + k_tide : float + Erkaev tidal reduction factor of the escape barrier, evaluated at + ``xi = R_Hill / R_p``. Divides the luminosity cap, which is the + only term that measures a barrier. The default of 1 is the untidal + form; a non-positive value means the barrier has vanished and the + cap is dropped. Returns ------- (rate, detail) The candidate rate [kg/s] and a detail dict carrying the wind temperature, sound speed, Bondi radius, Mach number, each cap, the - activation state, and flags (``bondi_inflated`` when the launch - level sits above the Bondi radius). + tidal factor the cap used, the activation state, and flags + (``bondi_inflated`` when the launch level sits above the Bondi + radius). """ T_w = T_eq / 2.0**0.25 mu = launch['mmw'] @@ -153,7 +166,8 @@ def bolometric_candidate( if not active: L = 4.0 * math.pi * R_p**2 * F_int g = G * M_p / R_p**2 - mdot_lum = L / (g * R_p) + barrier = g * R_p * k_tide # J/kg to lift gas out, tides included + mdot_lum = L / barrier if barrier > 0.0 else math.inf caps.append(mdot_lum) rate = min(caps) return rate, dict( @@ -165,6 +179,7 @@ def bolometric_candidate( mdot_parker=mdot_parker, mdot_bondi=mdot_bondi, mdot_luminosity=mdot_lum, + k_tide=k_tide, active=active, R_sonic=R_B, flags=flags, diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index efdb2c7e..f8315b98 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -11,6 +11,9 @@ - Monotonicity / boundedness: the Mach number falls monotonically as the launch level retreats inside the Bondi radius; the candidate rate never exceeds any of its caps. +- The luminosity cap divides by the tidally reduced barrier, so it rises by + the Erkaev et al. (2007) enhancement factor of their printed Table 1 and + reduces to the untidal form at K = 1. - Error contract: ``parker_mach`` rejects arguments outside ``(0, 1]``; the timescale diagnostic reports "not evaluated" without reservoirs. @@ -29,6 +32,7 @@ tang_timescale_check, ) from zephyrus.constants import G, amu, kb +from zephyrus.hydrodynamic import k_tide from zephyrus.planets_parameters import Me, Re from zephyrus.profiles import interp_at_pressure, isothermal_profile @@ -130,6 +134,41 @@ def test_luminosity_cap_applies_only_past_the_gate(): assert rate_b <= rate_a * (1 + 1e-12) +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_luminosity_cap_carries_the_tidal_barrier_reduction(): + """The cap divides by the tidally reduced barrier, K from Erkaev Eq. (17). + + The cap is an interior luminosity divided by the work per unit mass + needed to lift gas out, ``g R_p K``, the same barrier and the same + reference radius the energy-limited rate divides by. So a tidally + reduced barrier raises the cap by the enhancement factor ``1 / K``, + whose value at ``xi = 3`` is the 1.92 printed in Erkaev et al. (2007), + A&A 472, 329, Table 1. Discrimination: multiplying by ``K`` instead of + dividing would lower the cap rather than raise it, and ``K = 1`` must + reproduce the untidal value identically. + """ + M_p, R_p, T_eq = 3 * Me, 3 * Re, 1000.0 + launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) + args = (M_p, R_p, T_eq, 0.01, launch, 1.0) + _rate_flat, det_flat = bolometric_candidate(*args, lambda_gate=30.0, lambda_crit=20.0) + k = k_tide(3.0) + _rate_tidal, det_tidal = bolometric_candidate( + *args, lambda_gate=30.0, lambda_crit=20.0, k_tide=k + ) + assert det_flat['k_tide'] == pytest.approx(1.0) + assert det_tidal['mdot_luminosity'] > det_flat['mdot_luminosity'] + assert det_tidal['mdot_luminosity'] / det_flat['mdot_luminosity'] == pytest.approx( + 1.92, rel=0.01 + ) + # K = 1 is the untidal form, and the cap still bounds the rate. + _rate_one, det_one = bolometric_candidate( + *args, lambda_gate=30.0, lambda_crit=20.0, k_tide=1.0 + ) + assert det_one['mdot_luminosity'] == pytest.approx(det_flat['mdot_luminosity'], rel=1e-12) + assert _rate_tidal <= det_tidal['mdot_luminosity'] * (1 + 1e-12) + + def test_wind_temperature_and_opacity_scaling(): """The wind runs at T_eq / 2^(1/4) and the rate scales as 1 / kappa. From 5dfb7b654ac0fa3aaf55fad1259cc2ca13410153 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 04:13:17 +0200 Subject: [PATCH 035/113] Keep the branch rate under the overflow label The Roche screen replaced the dispatched rate with the Bondi-capped bolometric rate at the overflow geometry. Its boundary is a comparison between rate candidates, so both sides of it hold the same branch, and substituting another branch's formula moved the rate by a factor of a few hundred across a line the physics puts nowhere in particular: upward where the bolometric residual won, downward where a hydrodynamic or hydrostatic branch did. The screen now renames a state and leaves its rate alone, and the per-species split follows the branch that produced the rate rather than the label, so a wind that reaches the Hill sphere keeps its fractionation. What the label means is that the flow reaches the Roche lobe and that the rate beside it is a bound-flow estimate, a lower limit on what tides would do; the tidally driven flow through the inner Lagrange point (Jackson et al. 2017, their Eq. 3) is not implemented. The subflag separating dynamical overflow from a missing transonic solution now tests the outer extent of the atmosphere, modeled plus extended and reported as r_atmosphere, which the photospheric radius it used before mislabeled whenever the exobase alone sat outside the Hill sphere. Its tests bisect the boundary in orbital distance and assert the rate is continuous across it, and pin both subflags on states that differ only in that geometry. --- src/zephyrus/dispatcher.py | 72 +++++++++++++++++++++++---------- tests/test_dispatcher.py | 82 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 21 deletions(-) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 420acc5d..7ad355dc 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -52,9 +52,10 @@ # conventions disagree are flagged contested with both rates recorded. # 5. The Roche screen, per branch, tests the active flow radius (sonic # radius, max(R_XUV, R_s), or exobase radius) against the periapsis -# Hill radius before the label is finalized; an overflowing point is -# labeled ``roche_overflow`` with the Bondi-capped bolometric rate at -# the overflow geometry, and near misses raise ``near_roche``. +# Hill radius before the label is finalized. An overflowing point is +# renamed ``roche_overflow`` and keeps the rate its own branch +# computed: the screen renames a state and never changes its rate. +# Near misses raise ``near_roche``. # 6. The final rate is the larger of the surviving branch rate and the # bolometric residual, labeled by the winner. # @@ -195,6 +196,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: flags.update(f) r_xuv = photo['r'] + # The tidal reduction of the escape barrier, needed by both rate + # branches that measure one: the energy-limited rate and the + # luminosity cap on the bolometric residual. + xi_ktide = r_hill / inputs.R_p + k_factor = hy.k_tide(xi_ktide) if (st.tidal and xi_ktide > 1.0) else 1.0 + # Step 1: bolometric candidate, computed at every point. lam_gate = bl.lambda_restricted(inputs.M_p, inputs.R_p, inputs.T_eq, photo['mmw']) bolo_rate, bolo = bl.bolometric_candidate( @@ -206,6 +213,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: inputs.F_int, lam_gate, st.lambda_crit, + k_tide=k_factor, ) flags.update(bolo['flags']) diag['lambda_gate'] = lam_gate @@ -231,8 +239,6 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: if rr['subcritical']: flags['subcritical_sonic'] = True - xi_ktide = r_hill / inputs.R_p - k_factor = hy.k_tide(xi_ktide) if (st.tidal and xi_ktide > 1.0) else 1.0 eps = st.efficiency if st.efficiency_mode == 'caldiroli': eta_eff, cf = hy.caldiroli_efficiency(inputs.F_xuv, inputs.M_p, inputs.R_p, k_factor) @@ -336,57 +342,80 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ), ) - # Route. + # Route. ``branch`` names the physics that produced the rate and decides + # the split; ``label`` is what the caller reads back and the Roche screen + # can overwrite it. The two are the same on every state whose flow stays + # inside the Hill sphere. per_species = None if lam_gate < st.lambda_crit: - label = 'boiloff' + branch = 'boiloff' rate = bolo_rate flow_radius = bolo['R_sonic'] else: if kn_sc <= threshold: - label = hydro_label + branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) elif unstable: - label = hydro_label + branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) flags['gate_rerouted'] = True else: - label = 'hydrostatic' + branch = 'hydrostatic' rate = mdot_hs per_species = dict(hs_per_element) flags.update(hs_flags) flow_radius = hsd['r_exo'] # Step 6: the bolometric residual stays a candidate past the gate. if bolo_rate > rate: - label = 'boiloff' + branch = 'boiloff' rate = bolo_rate per_species = None flags['bolometric_residual'] = True flow_radius = bolo['R_sonic'] - - # Step 5: the Roche screen on the active flow radius. + label = branch + + # Step 5: the Roche screen on the active flow radius. The screen renames + # the state and never touches the rate. Its boundary is a rate + # comparison, since the branch whose flow radius gets tested is the one + # that won step 6, so reporting the winning branch's own rate keeps the + # dispatched rate continuous across the boundary; substituting another + # branch's formula would not. What the label means is therefore that the + # flow reaches the Roche lobe and that the rate beside it is the + # bound-flow estimate, a lower limit on what tides would do. The rate a + # tidally driven nozzle flow through L1 would carry is not implemented + # (Jackson et al. 2017, ApJ 835, 145, their Eq. 3). xi_flow = r_hill / flow_radius if flow_radius > 0 else math.inf + # The outer extent of the atmosphere itself, modeled plus extended, + # which is what separates the two overflow geometries. It is reported + # and used for that separation, and deliberately not used to trigger + # the screen: what the screen asks is whether the escaping flow stays + # bound, and widening its trigger would move the label boundary itself. + r_atm = max(float(inputs.profile.r[-1]), hsd['r_exo']) diag['roche'] = dict( - R_hill_periapsis=r_hill, flow_radius=flow_radius, xi_flow=xi_flow, xi_ktide=xi_ktide + R_hill_periapsis=r_hill, + flow_radius=flow_radius, + xi_flow=xi_flow, + xi_ktide=xi_ktide, + r_atmosphere=r_atm, + rate_branch=branch, ) if xi_flow <= 1.0 or xi_ktide <= 1.0: label = 'roche_overflow' flags['roche_overflow'] = True + # Dynamical overflow when the atmosphere itself reaches the lobe; + # no transonic solution when only the flow radius does, which is the + # narrow band Owen & Jackson (2012) describe. flags['roche_subflag'] = ( - 'dynamical' if (xi_ktide <= 1.0 or r_hill <= photo['r']) else 'no_transonic' + 'dynamical' if (xi_ktide <= 1.0 or r_hill <= r_atm) else 'no_transonic' ) - # The overflow rate is the Bondi-capped bolometric machinery at the - # overflow geometry. - rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) - per_species = None elif xi_flow < 1.5: flags['near_roche'] = True - # Per-species split, by label. + # Per-species split, by the branch that produced the rate. if per_species is None: - if label.startswith('hydrodynamic') and st.fractionate and rate > 0.0: + if branch.startswith('hydrodynamic') and st.fractionate and rate > 0.0: per_species, cdiag, cflags = closure_per_species( rate, elements, t_wind, inputs.M_p, base['r'] ) @@ -428,6 +457,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: inputs.M_p, inputs.R_p, inputs.F_int, rate, inputs.reservoirs ) diag['self_consistency'] = dg.self_consistency_screen(inputs.reservoirs, rate, inputs.age) + diag['rate_floor'] = dg.rate_floor_screen(rate) diag['base_level'] = dict( p_Pa=base['p'], p_physical_Pa=base.get('p_physical'), diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 56d23ec6..e1181d23 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -10,6 +10,10 @@ - Routing: an inflated light envelope dispatches to boil-off; a bound heavy atmosphere under weak XUV to hydrostatic; a light envelope under strong XUV to a hydrodynamic sub-label; a Roche-filling geometry to overflow. +- The Roche screen renames a state without changing its rate, so the + dispatched rate is continuous across the overflow boundary, and its + subflag separates the two published overflow geometries by the extent of + the atmosphere rather than of the photosphere. - Cross-implementation pin: the dispatcher's energy-limited candidate equals the released ``EL_escape`` at the same inputs. - Boxedness: sabotaging every diagnostics producer with garbage stubs @@ -222,6 +226,83 @@ def test_routing_roche_overflow_inside_the_hill_sphere(): assert res.mdot >= 0.0 +def test_roche_screen_renames_without_changing_the_rate(): + """Crossing the overflow boundary changes the label and not the rate. + + The screen's boundary is a rate comparison: the branch whose flow + radius gets tested is the one that won the final comparison, so the two + sides of the boundary hold the same branch and the dispatched rate must + be continuous across it. Bisecting in orbital distance, which moves the + Hill radius and nothing else about the atmosphere, brackets the label + change; the rates on either side agree to machine precision and both + equal the hydrodynamic candidate. Discrimination: substituting the + Bondi-capped bolometric rate at the overflow geometry, which is what a + rate-changing screen returns, differs here by more than a decade. + """ + comp = {'H2': 0.9, 'He': 0.1} + + def at(a): + return dispatch(_inputs(3 * Me, 2.2 * Re, 980.0, comp, F_xuv=13.4, a=a)) + + lo, hi = 0.05 * AU, 0.3 * AU + inner = at(lo) + assert inner.regime == 'roche_overflow' + for _ in range(50): + mid = 0.5 * (lo + hi) + if at(mid).regime == inner.regime: + lo = mid + else: + hi = mid + below, above = at(lo), at(hi) + assert below.regime == 'roche_overflow' + assert above.regime.startswith('hydrodynamic') + assert below.mdot == pytest.approx(above.mdot, rel=1e-9) + hydro = below.diagnostics['hydrodynamic'] + assert below.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9) + assert below.diagnostics['roche']['rate_branch'] == above.regime + bolo = below.diagnostics['bolometric'] + overflow_geometry_rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) + assert overflow_geometry_rate > 10.0 * below.mdot + + +def test_roche_subflag_separates_the_two_geometries(): + """The subflag reads the atmosphere's extent, not the photosphere's. + + Owen & Jackson (2012) separate dynamical overflow, where the atmosphere + itself reaches the lobe, from the narrow band where only the would-be + sonic surface does. A Mars-mass CO2 planet at 0.028 au with a 2000 K + exobase has its extended structure outside the Hill radius while its + photosphere sits far inside, so the subflag is dynamical even though + the Hill sphere still encloses the planet many times over; a bound + Earth-mass CO2 planet whose bolometric sonic radius alone passes the + Hill radius gets the other subflag, with its atmosphere well inside. + """ + dyn = dispatch( + _inputs( + 0.107 * Me, + 0.53 * Re, + 1600.0, + {'CO2': 1.0}, + F_xuv=1e-4, + a=0.028 * AU, + settings=DispatchSettings(T_exo_value=2000.0), + ) + ) + roche = dyn.diagnostics['roche'] + assert dyn.regime == 'roche_overflow' + assert dyn.flags.get('roche_subflag') == 'dynamical' + assert roche['xi_ktide'] > 1.0 # not the trivial planet-inside-its-lobe case + assert roche['r_atmosphere'] > roche['R_hill_periapsis'] + + bound = dispatch(_inputs(Me, Re, 1600.0, {'CO2': 1.0}, F_xuv=0.01, a=0.03 * AU)) + roche_b = bound.diagnostics['roche'] + assert bound.regime == 'roche_overflow' + assert bound.flags.get('roche_subflag') == 'no_transonic' + assert roche_b['r_atmosphere'] < roche_b['R_hill_periapsis'] + # The rate under that label carries no numerical content, and says so. + assert bound.diagnostics['rate_floor']['above_floor'] is False + + def test_diagnostics_are_boxed(monkeypatch): """Sabotaging every diagnostics producer changes no dispatch outcome. @@ -240,6 +321,7 @@ def test_diagnostics_are_boxed(monkeypatch): monkeypatch.setattr('zephyrus.diagnostics.potential_screens', lambda *a, **k: {}) monkeypatch.setattr('zephyrus.diagnostics.along_profile_fluid_check', lambda *a, **k: {}) monkeypatch.setattr('zephyrus.diagnostics.self_consistency_screen', lambda *a, **k: {}) + monkeypatch.setattr('zephyrus.diagnostics.rate_floor_screen', lambda *a, **k: {}) monkeypatch.setattr('zephyrus.boiloff.tang_timescale_check', lambda *a, **k: {}) sabotaged = dispatch(inp) assert sabotaged.regime == reference.regime From 3618fd244e718642bb985ce1f094a86ee7a6c204 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 04:13:17 +0200 Subject: [PATCH 036/113] Report the rate floor beside every verdict One proton crossing the surface per Julian year is the smallest mass-loss rate with physical content, and a regime label attached to a rate below it is decided by the ordering of two numerically empty numbers. The floor and the comparison now travel with the result, in diagnostics['rate_floor'], so a caller need not keep its own copy of the number, and the dispatcher example reads the reported comparison instead of recomputing it. The module still never applies the floor: what counts as negligible is the caller's decision, and clearing the floor does not make a rate matter, which is what the depletion-timescale screen answers. --- examples/demo_dispatcher/demo_dispatcher.py | 15 ++++++++--- src/zephyrus/diagnostics.py | 23 +++++++++++++++- tests/test_diagnostics.py | 29 ++++++++++++++++++++- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index 413ef151..32b92590 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -24,6 +24,7 @@ from zephyrus.composition import atomize, species_mass_amu from zephyrus.constants import au2m +from zephyrus.diagnostics import RATE_FLOOR_KG_S from zephyrus.dispatcher import DispatchSettings, EscapeInputs, dispatch from zephyrus.planets_parameters import Ls, Me, Me_atm, Ms, Re from zephyrus.profiles import isothermal_profile @@ -47,9 +48,11 @@ # One proton crossing the surface per year: the smallest rate that can mean # anything physically. A returned rate below this is numerical noise, not -# escape. It is a reporting convention for the caller; the module computes -# whatever the physics gives it. -RATE_FLOOR = 1.67262192369e-27 / SEC_PER_YR # [kg s-1] +# escape. It is a reporting convention for the caller, so the module computes +# whatever the physics gives it and reports the comparison beside every +# verdict, in diagnostics['rate_floor'], rather than applying it. The +# constant is imported from there so this file keeps no second copy. +RATE_FLOOR = RATE_FLOOR_KG_S # [kg s-1] COMPOSITIONS = { 'CO2': {'CO2': 1.0}, @@ -209,7 +212,7 @@ def flux_sweep(composition: str, m_earth: float = 1.0, r_earth: float = 1.0) -> F_xuv=float(f_xuv), regime=result.regime, mdot=result.mdot, - above_floor=result.mdot > RATE_FLOOR, + above_floor=result.diagnostics['rate_floor']['above_floor'], kn_sc=knudsen['kn_sc'], counterfactual=knudsen['counterfactual_labels'], T_wind=result.diagnostics['hydrodynamic']['T_wind'], @@ -287,6 +290,10 @@ def extreme_labels() -> list[dict]: f' flow radius {roche["flow_radius"]:.3e} m against Hill radius ' f'{roche["R_hill_periapsis"]:.3e} m, ratio {roche["xi_flow"]:.3f}' ) + print( + f' atmosphere reaches {roche["r_atmosphere"] / roche["R_hill_periapsis"]:.3f} ' + f"Hill radii; the rate is the {roche['rate_branch']} branch's" + ) print(f' flags {sorted(result.flags)}') out.append(dict(case=note, regime=result.regime, mdot=result.mdot)) return out diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index 75fbe8c6..d86fbbd3 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -10,7 +10,7 @@ import numpy as np -from zephyrus.constants import G, kb +from zephyrus.constants import G, kb, m_p from zephyrus.hydrodynamic import k_tide from zephyrus.knudsen import mean_free_path, sigma_mixture from zephyrus.planets_parameters import Mjup, Rjup @@ -54,6 +54,12 @@ CALDIROLI_THRESHOLD_LOG_PHI = (12.9, 13.2) SALZ_SCREEN_LOG_PHI = (13.11, 13.6) +# One proton crossing the planet's surface per Julian year, the smallest +# mass-loss rate with physical content. Reported beside every verdict so a +# caller need not carry the number, and never applied: whether a rate is +# negligible is the caller's decision. +RATE_FLOOR_KG_S = m_p / 3.15576e7 + def q_net_over_qc( eps: float, @@ -189,6 +195,21 @@ def self_consistency_screen(reservoirs: dict | None, mdot: float, age: float | N return {'evaluated': True, 't_deplete_s': t_dep, 'age_s': age, 'inconsistent': t_dep < age} +def rate_floor_screen(mdot: float) -> dict: + """Numerical-content screen: the rate against one proton per year. + + A strongly bound heavy atmosphere returns rates many decades below + anything with physical content, and a regime label attached to such a + rate is decided by the ordering of two meaningless numbers. One proton + crossing the surface per Julian year is the smallest rate worth + reading. Reporting only: the module never applies the floor, because + what counts as negligible belongs to the caller, and clearing the floor + does not make a rate matter (for that, use + :func:`self_consistency_screen`). + """ + return {'floor_kg_s': RATE_FLOOR_KG_S, 'above_floor': mdot > RATE_FLOOR_KG_S} + + def potential_screens(M_p: float, R_p: float) -> dict: """Threshold-potential screens, log10(-phi) in cgs (erg/g). diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 57bd693c..e8eb04ee 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -13,23 +13,27 @@ screens order their three verdicts (wind, intermediate, no-wind) correctly. - Error contract: the self-consistency screen reports "not evaluated" without its optional inputs rather than guessing. +- The rate floor is one proton per Julian year and separates rates with + numerical content from rates without, reporting and never applying. See ``docs/How-to/run_tests.md`` for the tier and marker conventions. """ import pytest -from zephyrus.constants import G, amu +from zephyrus.constants import G, amu, m_p from zephyrus.diagnostics import ( CALDIROLI_THRESHOLD_LOG_PHI, DAYSIDE_FACTORS, MURRAY_CLAY_EXPONENTS, + RATE_FLOOR_KG_S, SALZ_SCREEN_LOG_PHI, along_profile_fluid_check, erkaev_tc, guo_triple, potential_screens, q_net_over_qc, + rate_floor_screen, self_consistency_screen, ) from zephyrus.planets_parameters import Me, Mjup, Ms, Re, Rjup @@ -159,6 +163,29 @@ def test_self_consistency_screen_contract(): assert slow['inconsistent'] is False +@pytest.mark.physics_invariant +def test_rate_floor_screen_separates_numerical_content(): + """The floor is one proton per Julian year, reported and not applied. + + A regime label attached to a rate below one proton per year is decided + by the ordering of two numerically empty numbers, so the screen says + when that has happened. The constant is the proton mass over a Julian + year, about 5.3e-35 kg/s; a rate 90 decades below it fails the screen, a + laboratory-scale rate passes, and the screen returns the same number + whatever the rate, because it never modifies anything. + """ + assert RATE_FLOOR_KG_S == pytest.approx(m_p / 3.15576e7, rel=1e-12) + assert RATE_FLOOR_KG_S == pytest.approx(5.3e-35, rel=1e-2) + empty = rate_floor_screen(1e-123) + assert empty['above_floor'] is False + assert empty['floor_kg_s'] == pytest.approx(RATE_FLOOR_KG_S, rel=1e-12) + real = rate_floor_screen(1e-9) + assert real['above_floor'] is True + # Zero is below any floor, and the boundary itself is not above it. + assert rate_floor_screen(0.0)['above_floor'] is False + assert rate_floor_screen(RATE_FLOOR_KG_S)['above_floor'] is False + + def test_potential_screens_classify_in_order(): """The threshold-potential screens order their three verdicts correctly. From bb2589ed68d22758ae3955c1acdbc6e57fddaf35 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 04:13:25 +0200 Subject: [PATCH 037/113] Say what the overflow label does and does not mean The regimes page, the results reference, the troubleshooting guide, the tutorial, the model overview, the fractionation page, and the limitations page described the old behavior, in which the label recomputed the rate. They now say that the screen renames a state and leaves its rate alone, that the rate under the label is a lower limit because the tidally driven flow through the inner Lagrange point is not modeled, and that the subflag separates an atmosphere reaching its lobe from one whose sonic surface alone would sit outside it. The troubleshooting entry becomes three cases keyed to what to read (the branch that produced the rate, the extent of the atmosphere, and whether the rate clears the floor), because the bolometric sonic radius grows with the Jeans parameter and so fires the screen most readily on the tightly bound atmospheres furthest from overflowing. The tutorial's overflow output block and its list of diagnostic groups are re-run from the code, and the luminosity cap on the regimes page carries its tidal factor. --- docs/Explanations/fractionation.md | 8 +++++--- docs/Explanations/limitations.md | 1 + docs/Explanations/model.md | 2 +- docs/Explanations/regimes.md | 18 +++++++++++++----- docs/How-to/troubleshooting.md | 12 ++++++++++-- docs/Reference/results.md | 17 +++++++++-------- docs/Tutorials/dispatch.md | 14 ++++++++------ 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index 5041c9b9..4dbdd148 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -22,14 +22,16 @@ Everything species-dependent enters through the binary diffusion parameters $b_{ ## Where it applies -The closure evaluates at the XUV wind base on the atomized composition (molecules are photodissociated well below the launching level, so the escaping gas is atomic). It applies only to confirmed hydrodynamic verdicts; the other regimes split their rates differently: +The closure evaluates at the XUV wind base on the atomized composition (molecules are photodissociated well below the launching level, so the escaping gas is atomic). It applies only where a hydrodynamic branch produced the rate; the other branches split their rates differently: -| Regime label | Per-species split | +| Branch that produced the rate | Per-species split | |---|---| | `hydrodynamic:EL`, `hydrodynamic:RR` | The N-species closure at the wind base (this page); with fractionation disabled, reservoir mass fractions | -| `boiloff`, `roche_overflow` | Reservoir mass fractions (no fractionation: the flow is fast and bulk) | +| `boiloff` | Reservoir mass fractions (no fractionation: the flow is fast and bulk) | | `hydrostatic` | Natively per-species: each species carries its own Jeans flux and supply cap (see [escape regimes](regimes.md)) | +The split follows the branch and not the label, which matters under `roche_overflow`: that label renames a state without changing its rate, so the split is whatever the branch named in `diagnostics['roche']['rate_branch']` would have produced. + --- [^attia]: Attia, M., & Lichtenberg, T. (2026). In preparation. diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index 72c8d707..fe8c1286 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,6 +23,7 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section rung has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. +- **Overflowing states get a bound-flow rate.** The Roche screen names a state whose flow reaches the Hill sphere and reports the rate its branch computed, which is a lower limit: the tidally driven flow through the inner Lagrange point that such a planet actually drives is not modeled, and neither is the accompanying orbital evolution. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. ## The impact channel (`collision.mass_loss`) diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 4ea62cb2..6d4f3a2e 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -15,7 +15,7 @@ Which physics carries the continuous loss depends on how tightly the atmosphere - `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). - `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). - `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. -- `roche_overflow`: the flow region reaches the planet's Hill sphere, so the atmosphere spills over the gravitational boundary rather than escaping through any of the regimes above. +- `roche_overflow`: the flow region reaches the planet's Hill sphere, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow. The label sits on top of whichever regime above produced the rate, which is then a lower limit, because the tidally driven flow an overflowing planet drives is not modeled. The classification logic reduces to three questions, asked in a fixed order: diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 9e50dcb4..870c659a 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -10,7 +10,7 @@ One call takes one planetary state and returns one verdict. The inputs are the p 2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. 4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. -5. Before the label is finalized, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is relabeled `roche_overflow`. +5. Before the label is finalized, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. 6. The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. ```mermaid @@ -32,7 +32,7 @@ flowchart TD Q4 -- no --> KEEP["Branch label stands"] BO2 --> Q5{"Active flow radius
    past the Hill radius?"} KEEP --> Q5 - Q5 -- yes --> RO["ROCHE OVERFLOW
    Bondi-capped rate
    at the overflow geometry"] + Q5 -- yes --> RO["ROCHE OVERFLOW
    the branch rate stands,
    as a lower limit"] Q5 -- no --> OUT(["Regime label + bulk rate
    + per-species rates
    + flags + diagnostics"]) RO --> OUT classDef regime fill:#1e6091,stroke:#0f3a5c,color:#ffffff @@ -63,9 +63,9 @@ $$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{lau with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, -$$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ +$$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ -with $g$ the surface gravity [^gs19]. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. +with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that compete in step 6 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. Whether that residual lasts is disputed, and the framework declines to adjudicate. Tang et al. (2024) find core-powered mass loss ends early, once the envelope has contracted [^tang]; Gupta & Schlichting find it continues for gigayears [^gs19]. The luminosity cap is what makes the disagreement affordable: it holds the residual to the interior heat budget, which is small once the planet has cooled, so a run that keeps the branch alive and a run that switches it off differ by little. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion without the code having taken a side. @@ -111,7 +111,13 @@ Two escape temperatures gate the branch's validity. The neutral escape temperatu ## The Roche screen and overflow -Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the sonic radius on the boil-off branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is not described by any of the four regimes above: the state is labeled `roche_overflow` and carries the Bondi-capped bolometric rate at the overflow geometry, with a subflag separating geometries whose Hill sphere sits inside the photosphere itself from those where only the flow reaches it. Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. +Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the sonic radius on the boil-off branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is spilling over the gravitational boundary rather than escaping through a bound outflow, and the state is named `roche_overflow` for it. + +The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won step 6, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. What the label means is therefore that the flow reaches the lobe and that the rate beside it is the bound-flow estimate, a lower limit on what tides would do. Nothing in this version computes the tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives; the closed form for it is Eq. (3) of Jackson et al. (2017) [^jackson17], and their own reading is worth carrying: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. + +Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`. The other case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. + +Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. ## Boundaries are bands @@ -145,6 +151,8 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 + [^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 [^cp26]: Chatterjee, R., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. arXiv:2412.05188. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 22215571..89c96b83 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -70,9 +70,17 @@ The flux scaling will not separate them either: the base ion density follows $\s **Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. -**Cause.** The label names the branch that won the rate comparison, and the screen tests that branch's own flow radius. When the bolometric residual wins, the radius tested is its sonic radius, which for a warm low-gravity atmosphere can be larger than the Hill radius even when the residual rate is tiny. So the label reports a geometry, and the rate it carries can be small. +**Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. -**What to do.** Read three things: `flags['bolometric_residual']` (did the residual take the label), `diagnostics['roche']` (`flow_radius` against `R_hill_periapsis`), and `diagnostics['bolometric']` (which cap set the rate). If the residual won at a rate below the floor, treat the point as no escape and the geometry as a note rather than a result. Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. +**What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. + +The three cases that produces: + +- Subflag `dynamical` and a rate above the floor: the atmosphere reaches its Roche lobe, the rate is the bound-flow estimate, and the real rate is higher by whatever a tidally driven flow through the inner Lagrange point would carry. Treat it as a lower limit. +- Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. +- `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. + +Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. ## `contested_ion` fired diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 00cd8fd4..d955ca19 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -26,7 +26,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | -| `roche_overflow` | The active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet. | The Bondi-capped bolometric machinery at the overflow geometry. | +| `roche_overflow` | The active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet. | The rate of the branch that produced it, named in `diagnostics['roche']['rate_branch']`. The screen renames a state and never changes its rate, so the rate under this label is a bound-flow estimate and a lower limit on what tides would do. | A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. @@ -78,8 +78,8 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| -| `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes and the rate is recomputed at the overflow geometry. | The rate reflects it | -| `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the Hill sphere sits inside the photosphere itself, or only the flow reaches it. | Reporting only | +| `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes; the rate is the one the branch computed. | Reporting only | +| `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | | `near_roche` | `True` | The flow radius is within 1.5 Hill radii. The tidal factor is steep there. | Reporting only | | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | | `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | @@ -89,18 +89,18 @@ The `effect` column says whether the returned rate already reflects the flag or ## Diagnostics -Seventeen groups on a typical call. Nothing in the dispatch control flow reads any of them, and there is no option to switch them off: the regime boundaries carry genuine physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that. +Eighteen groups on a typical call. Nothing in the dispatch control flow reads any of them, and there is no option to switch them off: the regime boundaries carry genuine physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that. | Group | Key contents | What it answers | |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | -| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, and whether the branch was active. | +| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | -| `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only on a fractionating hydrodynamic verdict. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | -| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide` | The overflow screen in full: which radius was tested and against what. | +| `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | +| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, and which branch the rate came from. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | @@ -108,6 +108,7 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a | `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | | `tang_timescale` | boil-off termination timescales | A consistency check on the bolometric rate's own exponential shutoff. | | `self_consistency` | `evaluated`, `t_deplete_s`, `age_s`, `inconsistent` | Whether the dispatched rate would have destroyed the supplied inventory within the supplied age. Reports `evaluated: False` without an age or reservoirs. | +| `rate_floor` | `floor_kg_s`, `above_floor` | Whether the dispatched rate has any numerical content, against one proton per Julian year. Reporting only: the module never applies the floor. | | `base_level` | `p_Pa`, `p_physical_Pa`, `r_m`, `T_K`, `clamp_decades` | Where the wind was launched, and the pressure the base method asked for before any clamp. | | `documentation` | criterion bands and published exponents | The bands themselves, so a stored result is self-describing: the collisionality band, the boil-off activation band, the numerical against analytic flux exponents of the wind limits, and the dayside-heating reduction factors. | | `contested_ion` | both branch rates and a note | Present only when the two escape-temperature conventions disagree, which turns on ion physics this version does not model. | @@ -116,6 +117,6 @@ Seventeen groups on a typical call. Nothing in the dispatch control flow reads a ## Two conventions worth adopting -**A rate floor.** The framework computes what the physics gives it, including rates like $10^{-123}$ kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it. +**A rate floor.** The framework computes what the physics gives it, including rates like $10^{-123}$ kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it, but it does report it: `diagnostics['rate_floor']` carries the number and whether this call cleared it, so a caller need not keep its own copy. Read it before trusting a regime label on a slow state, because a label decided by the ordering of two rates far below the floor is decided by nothing. **A relevance test, separately.** Clearing the floor does not make a rate matter: a hundred decades above it can still be grams per year. Use `diagnostics['self_consistency']`, which divides the supplied inventory by the dispatched rate and compares against the supplied age, as the yardstick for whether a rate is worth carrying. diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 0c5ec12f..658df4a5 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -155,8 +155,8 @@ hydrodynamic:EL {} ['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', - 'knudsen', 'lambda_gate', 'potential_screens', 'roche', 'self_consistency', - 'tang_timescale', 'thermostat'] + 'knudsen', 'lambda_gate', 'potential_screens', 'rate_floor', 'roche', + 'self_consistency', 'tang_timescale', 'thermostat'] ``` Five fields, and each one guarantees something. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. @@ -220,7 +220,7 @@ Two things in that figure deserve attention. **The open markers.** The hydrostatic rates on these two planets are $5.0 \times 10^{-123}$ and $1.5 \times 10^{-71}$ kg s⁻¹. Those are not small rates, they are zero with numerical noise attached: carbon dioxide at one Earth mass sits at an exobase Jeans parameter of 301, and $e^{-301}$ is not a number with physical content. Two yardsticks keep this straight: -- One proton crossing the surface per year, $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves this convention to you. +- One proton crossing the surface per year, $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves the convention to you, but it does hand you the comparison: `diagnostics['rate_floor']['above_floor']` is false on both of these points. - Above that floor, ask whether the rate matters, by comparing it against the inventory and the age. The diagnostics already do this: `diagnostics['self_consistency']` divides the reservoirs by the rate and compares against the age you supplied. A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing $2 \times 10^{-9}$ kg s⁻¹ loses 66 grams a year. @@ -269,18 +269,20 @@ print(puffy.flags['roche_subflag']) Output: ```text -roche_overflow 1037700965.4610901 +roche_overflow 24622841.930601332 189433055.79726917 167277833.86655325 0.8830445835470955 no_transonic ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary rather than escaping through any of the other regimes, and the label says so. When you see this label, read `diagnostics['roche']` for the two radii and `diagnostics['bolometric']` for the rate that won: the label names the branch that won the rate comparison, and on a marginal case that branch can be the bolometric residual carrying a rate that is negligible in absolute terms. +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit, because the tidally driven flow a genuinely overflowing planet drives is not modeled. + +The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the three cases. --- ## Step 5: read the diagnostics -A call returns sixteen or seventeen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns seventeen or eighteen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. Every snippet in this step uses the same result: From 90bacde420a1e1be50bc94d7d6ad255995b5e63e Mon Sep 17 00:00:00 2001 From: maraattia Date: Sat, 22 Aug 2026 04:33:06 +0200 Subject: [PATCH 038/113] Set the figure annotations in the mono family The track figure's three in-axes labels were in the sans family while the sweep figure's were mono, and the one boundary label the sweep figure gained last carried the sans family too. All six now use Spline Sans Mono, which is the family the visual language reserves for units, identifiers, and annotations. The lower-panel label loses two words, because mono is wider and the old wording ran into the dashed line marking the crossing. Both figure assets are regenerated. --- docs/assets/dispatcher_regime_sweep.png | Bin 253189 -> 252181 bytes docs/assets/dispatcher_track.png | Bin 272485 -> 258452 bytes examples/demo_dispatcher/demo_dispatcher.py | 6 +++++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/assets/dispatcher_regime_sweep.png b/docs/assets/dispatcher_regime_sweep.png index 374438505af71b69296b6c701919dd108f56cc00..c7d69bdf171152e7edc85a3e7101773f28e2df21 100644 GIT binary patch literal 252181 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

    qD=qE5D^hq{GdQytdkOs^eBb5txO0~;?NI7Y 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�jai7~x{Wiul8kJAb@-rveCzdRsS1Vup@J6iEaY_6eGz+Do;}aCX>cwT(+_4! zk*RWkM%_{{JGL?fMMaDW?&wT+j=bLkRw_o1>(D!G0Z&j?d$o|NnxEH=v5ZmJ*vPcx zxPK8s_mcx$J-IG(?zbbZWgI?u(8ktQk=;XF`AAyy9rCGEWxV0SlA-Nxl*Gmv3g7l} z&3xS5ym0r=zgtsvGTv(lTBUYlObd!WOT6;~+!-3yvdohYl9;4)UH=5v25}7!sqDHf zsi6@nVAYdCU(7we2*`KOckfXuHKpP=>%Qwv*B%f?C*&4=Hbbpc&Z>-5#+2d`;^VwD zS*6u`K6*u3PO4=r1A53exkp@enzE4_Xi|L?Gm4GYp~sl@DL@0E?Nu-_O%1@;T;OZh z48q#bN|*0>pKe!78h8 z=jqSM%d2Qrx||(+QP;v7wCC!G4i$*RaM2F8V4w? zva_EMXUBy!a_tfn6co`!O%HK#^3z@N`Q!}M+`TAItsckUAH~*)WN?aeq2(EhX^9L@ ze=PZvRg+K}`vbK;fBqc0F)OK&XXDNPGnVSCBd9@yHAW9yXW?N=IvNk`!0T7Ro!a>W z=?vP!)c0|o{xj9t!>2{uznnP1Gj>WnclT9EQ`1!UNM7CY&G~#x`RI?H9+?-Ja{#AK z`@`_6rxdJqvWL;gtY$&EvvG25&E!wTMv;9p%7*A!gIF7tz0(7m%`^k+$@S^Io8$cr zdM!6$C$H}z3S}Ee)Bwz6tfSb95~m6}=UtBRzJk0@yhi+!4UTrdn+LCHcc$J}^gg|G zRit5$T(0f1j%=i`;*QXJ|>GORl~@sO~3^ z)2O~^>{i;esR}wZB+^60;JJ)Q(j%0o-tf2(evzn&`bxF?ub=A+GBXN)~RgmMI!~g+O1adpGMRtn<^{ zNQ!ak0@041!neN79-F4z@`FZ_v%v0S0Gz`S&HTA`I;+y8f|bKgMVTtzrp}YAMw2f* z-)(JC7mqE?gqM|ju6rK%s@u!Fi|ovkrm(5i15NTZH8sMniv>syj51Du1NWZhQIiVV9&@j2bocF{Vn2a}3(pXiJMAu9NBY z=@%=*h0?TLmT^&)byN&a--ta^%4x>6GEMAfqXRiZDJV6iq-uzRorR(JHOALc%CHIb zRCIJnemo_y0ZDS2`sWPlCW^{LvAIufz6#{z1Pc(5?@VxweMJ31y$Bzl?2SB)pxRIY zgXgX#LQnQp`$iNmPgTCNViOhZJAF9qSn5V;aoUsb#6#?=D*kq3)9N!_rScvZwanXe z&ES|)0)E!jdC@~>?bs$mXU&NK|3y+$xykH$`4J&E z*xNB-$JvrdrwxPKRpHq`Z``b%M0O(n!JZ&a%{zen2~q+$u_c#Uf!bw(xo>G^Q}Iv2 zmrx^ZdGy8nk6Oc|o2s*Za=d<(>M_S)+8!OrpTuZ8mhLcnd2A5~p>T^3+Gk7G_zl;Y zaOVRnJW-c+aHV7fw(x!&=1oQ3WD!q8z(9(j4urDnIOwwyGu)cee?@bbd%loNh+ zigOH?Gu;|~P2e|KS1T+orc HiYa9(WSD~|^!%k0dQEoI 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⁢f13){H&)CaA^PSM;=D?W5fx{MsR7oK*F)^$l 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

    o_e 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 z

    VhaBmwi>H?jN;ij1n2L<+{;@H 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
    Dc}I*)I( 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 diff --git a/docs/assets/dispatcher_track.png b/docs/assets/dispatcher_track.png index ab7cd866f12231604ee7677173a97ed47d9bacd5..268cb493820e120f7d5f46a892365681c515b9d2 100644 GIT binary patch literal 258452 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
    b~+N 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

    H8;wGCO=cHBruPjp+WrrG5!V`={*)2s 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

    ?dZ9x`^6%+=2${~%{M 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%0DnyDWheEB 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%0D?3j&>O<$Q^I?pVv=sRa>a3iE=Yp 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 literal 272485 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

      Xz|m$iHE{nN7Z4h4R)KxjRQu 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 diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index 32b92590..d0526f39 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -686,6 +686,7 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No textcoords='offset points', fontsize=11, color=palette['rule'], + fontfamily='Spline Sans Mono', ) ax.set_xscale('log') ax.set_yscale('log') @@ -737,6 +738,7 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: ha='center', fontsize=11, color=palette['rule'], + fontfamily='Spline Sans Mono', ) ax_rate.plot( @@ -770,6 +772,7 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: ha='right', fontsize=11, color=palette['rule'], + fontfamily='Spline Sans Mono', ) elements = sorted({el for row in rows for el in row['per_species']}) @@ -793,11 +796,12 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: ax_species.set_ylabel('Element rate [kg s$^{-1}$]') ax_species.legend(loc='lower left', title='element', ncol=3) ax_species.annotate( - 'heavy elements leave with the wind, and stop when it does', + 'heavy elements leave with the wind, and stop with it', xy=(0.03, 0.62), xycoords='axes fraction', fontsize=11, color=palette['rule'], + fontfamily='Spline Sans Mono', ) fig.subplots_adjust(left=0.12, right=0.98, top=0.97, bottom=0.09, hspace=0.08) fig.savefig(outpath, bbox_inches=None) From f559a4f14f4ff7a73c40589d509d38a41c9f0c4b Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:12:08 +0200 Subject: [PATCH 039/113] Cover every species a coupled run can supply The last-resort rung of the pair ladder substituted the nearest species of the mass table, but four members of that table carry no kinetic diameter, so the scaling rule indexed past its own coverage and raised KeyError out of dispatch. Eight of the thirty-seven species a PROTEUS run can supply hit it, including hydrogen sulphide, and aluminium was absent from the element masses altogether. The substitution now draws only from species that carry both a mass and a diameter, two members of a pair can no longer collapse onto one substitute, and reaching the scaling with an uncovered species raises a ValueError that names what is missing. --- src/zephyrus/composition.py | 1 + src/zephyrus/diffusion.py | 36 ++++++++++++++++-- tests/test_diffusion.py | 73 +++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/zephyrus/composition.py b/src/zephyrus/composition.py index 597c146d..1cf6c74d 100644 --- a/src/zephyrus/composition.py +++ b/src/zephyrus/composition.py @@ -28,6 +28,7 @@ 'Ne': 19.992, 'Na': 22.990, 'Mg': 24.305, + 'Al': 26.982, 'Si': 28.085, 'P': 30.974, 'S': 32.06, diff --git a/src/zephyrus/diffusion.py b/src/zephyrus/diffusion.py index 437f1da5..afbf7ec9 100644 --- a/src/zephyrus/diffusion.py +++ b/src/zephyrus/diffusion.py @@ -76,6 +76,19 @@ def diameters() -> dict[str, float]: return d +def substitutable() -> tuple[str, ...]: + """Species eligible to stand in for an uncovered one, lightest first. + + Both scaling rules need a mass and a kinetic diameter, so a species can + only be substituted for by one that carries both. Bondi (1964) prints no + van der Waals radius for aluminium, potassium, calcium, or titanium and + the kinetic-diameter rule therefore reaches none of them, which is why + the substitution set is smaller than the mass table. + """ + diam = diameters() + return tuple(sorted((s for s in ALL_MASS if s in diam), key=lambda s: ALL_MASS[s])) + + # Rock-forming species carry two standing warnings that no coefficient # improves away: every pair involving Na, Mg, Si, or Fe is a scaling on an # estimated diameter (no measured coefficient exists in any compilation for @@ -290,6 +303,14 @@ def _anchors_for(target: tuple, mass: dict, diam: dict): over the retained anchors. """ i, j = target + for sp in (i, j): + if sp not in mass or sp not in diam: + raise ValueError( + f'no binary diffusion scaling for {sp!r}: it carries ' + f'{"no mass" if sp not in mass else "no kinetic diameter"}. ' + 'Reach it through b_pair, which substitutes the nearest ' + 'covered species.' + ) eligible = [ (pair, b1000) for pair, (b1000, cls, _src) in ZK23_TABLE2.items() @@ -471,15 +492,22 @@ def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: _PAIR_CACHE[key] = (b1000, s_fit, prov) return b1000 * (T / 1000.0) ** s_fit * 100.0, prov - def _proxy(sp): - if sp in ALL_MASS: + covered = substitutable() + + def _proxy(sp, exclude=()): + pool = [s for s in covered if s not in exclude] + if sp in pool: return sp m = species_mass_amu(sp) - return min(ALL_MASS, key=lambda s2: abs(ALL_MASS[s2] - m)) + return min(pool, key=lambda s2: abs(ALL_MASS[s2] - m)) pa, pb = _proxy(a), _proxy(b) if pa == pb: - pb = 'O' if pa != 'O' else 'N' + # Two distinct species must not collapse onto one substitute, or the + # reduced mass of the pair stops resembling the target's. Take the + # next-nearest substitute instead. A genuine self-pair keeps any + # distinct partner, since it has no second mass to represent. + pb = _proxy(b, exclude=(pa,)) if a != b else ('O' if pa != 'O' else 'N') r = build_rows([pa, pb])[0] prov = f'proxy {a}->{pa}, {b}->{pb} [{r.provenance}]' _PAIR_CACHE[key] = (r.b1000, r.exponent, prov) diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index d685f2ef..310dcf85 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -24,6 +24,7 @@ import numpy as np import pytest +from zephyrus.composition import species_mass_amu from zephyrus.diffusion import ( ALL_MASS, D_STANDARD_EXTRA, @@ -32,6 +33,7 @@ SN88_TABLE1, ZK23_TABLE2, Row, + _anchors_for, b_from_sn88, b_mixture, b_pair, @@ -41,6 +43,7 @@ diameters, eq10, masses_g, + substitutable, ) pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] @@ -258,3 +261,73 @@ def test_b_mixture_blancs_law_limits(): b_fast, _ = b_pair('H', 'He', 1000.0) mixed, _ = b_mixture('H', {'H': 0.01, 'He': 0.495, 'CO2': 0.495}, 1000.0) assert min(b_slow, b_fast) < mixed < max(b_slow, b_fast) + + +# The species and element sets a PROTEUS run can hand the escape module, +# transcribed from ``src/proteus/utils/constants.py`` (``gas_list`` and +# ``element_list``). Copied rather than imported: ZEPHYRUS does not depend on +# PROTEUS, and the direction of that dependency must stay one way. +PROTEUS_GAS_LIST = ( + 'H2O', 'CO2', 'O2', 'H2', 'CH4', 'CO', 'N2', 'NH3', 'S2', 'SO2', 'H2S', + 'He', 'Ne', 'Ar', 'Kr', 'Xe', + 'SiO', 'SiO2', 'Si', 'Na', 'K', 'Ti', 'TiO', 'TiO2', 'Mg', 'MgO', 'Al', + 'HAlO2', 'SiH', 'SiH4', 'Fe', 'FeO', 'FeO2H2', 'CaO', 'NaOH', 'Ca', 'KOH', +) +PROTEUS_ELEMENT_LIST = ( + 'H', 'O', 'C', 'N', 'S', 'Si', 'Mg', 'Fe', 'Na', 'Al', 'Ti', 'Ca', 'K', + 'He', 'Ne', 'Ar', 'Kr', 'Xe', +) +# Products an atmospheric chemistry network emits that are in neither list. +CHEMISTRY_EXTRAS = ('NO', 'O3', 'C2H6', 'SO', 'PH3', 'HCN', 'OH') + + +@pytest.mark.physics_invariant +def test_every_species_a_coupled_run_can_supply_has_a_coefficient(): + """No species a PROTEUS run can supply leaves the pair ladder empty. + + Four species of the vapour list and one volatile carry no kinetic + diameter of their own, and aluminium appears in no diffusion + compilation at all, so each reaches its coefficient by substitution. + What the ladder guarantees is that the substitution exists, is finite, + and is named: an unnamed substitution would let a rock vapour silently + diffuse like atomic oxygen. + """ + for sp in PROTEUS_GAS_LIST + PROTEUS_ELEMENT_LIST + CHEMISTRY_EXTRAS: + for background in ('CO2', 'H2', 'O', 'N2'): + b, prov = b_pair(sp, background, 500.0) + assert math.isfinite(b) and b > 0.0, (sp, background, b) + assert prov, (sp, background) + # Substitution is recorded whenever it happens, and only then. + _b, prov_direct = b_pair('H', 'O', 500.0) + assert 'proxy' not in prov_direct + _b, prov_sub = b_pair('H2S', 'CO2', 500.0) + assert 'proxy' in prov_sub and 'H2S->' in prov_sub + + +@pytest.mark.physics_invariant +def test_substitution_preserves_the_mass_of_what_it_replaces(): + """A substitute is the nearest available mass, and two never collide. + + The reduced mass of the pair drives the Eq. (10) scaling, so a + substitute that misses the target's mass corrupts the coefficient. Every + replacement must therefore be the closest substitutable mass, and when + both members of a pair would land on the same substitute the second + takes the next-nearest rather than an arbitrary partner: titanium at + 47.9 amu paired against CO2 must not fall back on atomic oxygen at + 16.0 amu. + """ + covered = substitutable() + assert 'K' not in covered and 'Ca' not in covered and 'Ti' not in covered + assert 'Al' not in covered and 'Cl' not in covered and 'P' not in covered + for sp in ('Ti', 'Ca', 'K', 'H2S', 'MgO'): + m = species_mass_amu(sp) + best = min(abs(ALL_MASS[s] - m) for s in covered) + _b, prov = b_pair(sp, 'CO2', 500.0) + chosen = prov.split(f'{sp}->')[1].split(' ')[0].rstrip(',') + # Either the nearest mass, or the next-nearest when CO2 took it. + gap = abs(ALL_MASS[chosen] - m) + assert gap <= 3.0 * best + 12.0, (sp, chosen, gap, best) + assert chosen != 'O', (sp, prov) + # The uncovered species reach the scaling only through the substitution. + with pytest.raises(ValueError, match='no kinetic diameter'): + _anchors_for(('Ti', 'CO2'), ALL_MASS, diameters()) From 352957408f1f9581011ff8a1ad30d20cafcf8abd Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:13:30 +0200 Subject: [PATCH 040/113] Keep trace species in the exobase anchor The Bates anchor dropped any species below a mixing ratio of 1e-8 and renormalized what was left, which deleted the species carrying the rate whenever a light trace fell through that value. On a Mars-mass carbon dioxide host the bulk rate fell thirteen decades between hydrogen mixing ratios of 1.1e-8 and 9e-9, and hydrogen left the per-species output entirely, so a depleting track crossed a step that no physics puts there. Every species present at the anchor is now carried and the rate is linear in a trace abundance across eleven decades. An anchor with nothing on it raises rather than dividing by a zero total. --- src/zephyrus/hydrostatic.py | 8 ++++++- tests/test_hydrostatic.py | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index 1560df38..ff4a9e55 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -120,12 +120,18 @@ def bates_extension( r0 = float(profile.r[-1]) t_top = float(profile.T[-1]) mu = float(profile.mmw[-1]) + # Every species present at the anchor is carried, however thin. A trace + # light species can dominate the exospheric loss while sitting many + # decades below the bulk, so a lower cut on the mixing ratio would + # delete the rate rather than a rounding error. vmr = { sp: float(np.asarray(v)[-1]) for sp, v in profile.vmr.items() - if float(np.asarray(v)[-1]) > 1e-8 + if float(np.asarray(v)[-1]) > 0.0 } tot = sum(vmr.values()) + if tot <= 0.0: + raise ValueError('no species present at the profile top') vmr = {sp: x / tot for sp, x in vmr.items()} zeta = np.linspace(0.0, zeta_max, n_levels) T = T_exo - (T_exo - t_top) * np.exp(-gamma * zeta) diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index dd0b2708..d1313c17 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -123,6 +123,23 @@ def _mars_profile(): return Profile(p=p, r=r, T=T, vmr=vmr, mmw=np.full(3, mu), kzz=None) +def _co2_hydrogen_profile(x_h2): + """The Mars anchor profile with the hydrogen abundance set explicitly.""" + r0 = R_MARS + 8.0e4 + p = np.array([10.0, 1.0, 0.1]) + T = np.full(3, 100.0) + mu = 44.0095 * amu + r = np.empty(3) + r[2] = r0 + for i in (1, 0): + H = kb * 100.0 * r[i + 1] ** 2 / (G * M_MARS * mu) + r[i] = r[i + 1] - H * math.log(p[i] / p[i + 1]) + vmr = {'CO2': np.full(3, 1.0 - x_h2)} + if x_h2 > 0.0: + vmr['H'] = np.full(3, x_h2) + return Profile(p=p, r=r, T=T, vmr=vmr, mmw=np.full(3, mu), kzz=None) + + def _mars_h_flux(t_inf): """Hydrogen number flux per anchor area, cm^-2 s^-1, at exobase T.""" prof = _mars_profile() @@ -304,3 +321,34 @@ def test_jeans_effusion_velocity_shape(): v_heavy = jeans_effusion_velocity(T, 16 * m, 5.0) assert v5 / v_heavy == pytest.approx(4.0, rel=0.01) # sqrt(16) prefactor assert v_heavy > 0.0 + + +@pytest.mark.physics_invariant +def test_trace_species_survive_into_the_exobase_anchor(): + """A trace light species keeps its rate however thin it is. + + The escaping flux of a minor species is linear in its mixing ratio, so + on a heavy background whose own rate is twenty decades lower the bulk + rate must follow the trace hydrogen down without a step. A lower cut on + the anchor mixing ratio would instead delete the species that carries + the whole rate, and the rate would fall to the background's the moment + the abundance crossed it. + """ + rates, keys = [], [] + fractions = (1e-6, 1e-8, 1e-9, 1e-12, 1e-15) + for x_h2 in fractions: + prof = _co2_hydrogen_profile(x_h2) + per_el, _det = hydrostatic_rates(prof, M_MARS, 1000.0) + rates.append(sum(per_el.values())) + keys.append(set(per_el)) + # Linear in abundance across nine decades, so no threshold sits inside. + for x, rate in zip(fractions, rates): + assert rate / x == pytest.approx(rates[0] / fractions[0], rel=1e-3), (x, rate) + # Hydrogen is reported at every abundance, never dropped from the split. + assert all('H' in k for k in keys) + # Removing it entirely is the only way to lose it, and then the rate + # collapses to the heavy background, which is what the step looked like. + bare = _co2_hydrogen_profile(0.0) + per_el_bare, _ = hydrostatic_rates(bare, M_MARS, 1000.0) + assert 'H' not in per_el_bare + assert sum(per_el_bare.values()) < 1e-4 * rates[-1] From ef0bbd402ede8ab4558ea822badc436fc4094497 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:14:13 +0200 Subject: [PATCH 041/113] Split a dry reservoir by its base composition A reservoir dictionary whose masses have all reached zero divided by a zero total and raised ZeroDivisionError out of dispatch, which is the state the end of an evolutionary track reaches. It now takes the same fallback as a caller who supplies no reservoir at all, the mass fractions of the atomized base composition, with the substitution flagged as before. Negative reservoir masses are separated out as malformed input. --- src/zephyrus/fractionation.py | 10 +++++++--- tests/test_fractionation.py | 10 ++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index e4179644..04bf8c83 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -268,11 +268,15 @@ def unfractionated_split( The protocol of the energy-limited path: reservoir mass fractions when reservoir masses are supplied; otherwise the mass fractions of the atomized wind-base composition, with the ``split_from_base_composition`` - flag recording the substitution. The split conserves the bulk rate - exactly. + flag recording the substitution. A reservoir that has run dry carries no + proportions to split by, so it falls back to the same composition, which + is the state the end of an evolutionary track reaches. Negative reservoir + masses are malformed input. The split conserves the bulk rate exactly. """ flags: dict = {} - if reservoirs: + if reservoirs and any(m < 0.0 for m in reservoirs.values()): + raise ValueError('reservoir masses must be non-negative') + if reservoirs and sum(reservoirs.values()) > 0.0: tot = sum(reservoirs.values()) fracs = {el: mass / tot for el, mass in reservoirs.items()} else: diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index 6e132701..8e367866 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -502,3 +502,13 @@ def test_unfractionated_split_protocol(): assert sum(per2.values()) == pytest.approx(4.0, rel=1e-12) # Mass weighting: oxygen outweighs hydrogen at equal mole fractions. assert per2['O'] > per2['H'] + # A reservoir that has run dry has no proportions to split by, which is + # the state the end of an evolutionary track reaches. It takes the same + # fallback as no reservoir at all, flagged, rather than dividing by zero. + per3, flags3 = unfractionated_split(4.0, {'H': 0.0, 'O': 0.0}, {'H': 0.5, 'O': 0.5}) + assert flags3.get('split_from_base_composition') is True + assert per3 == pytest.approx(per2, rel=1e-12) + assert sum(per3.values()) == pytest.approx(4.0, rel=1e-12) + # Negative reservoir masses are malformed input, not a dry reservoir. + with pytest.raises(ValueError, match='non-negative'): + unfractionated_split(4.0, {'H': -1.0, 'O': 2.0}, {'H': 0.5, 'O': 0.5}) From 7670e84b21d13e1793e348d7a20f866118c36318 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:17:03 +0200 Subject: [PATCH 042/113] Pin small quantities against a zero absolute tolerance A relative tolerance passed to pytest.approx does not displace its default absolute tolerance of 1e-12, and the larger of the two governs, so every pin on a cross section, a recombination coefficient, a physical constant, or a sub-nanogram rate accepted any value at all. Inflating the proton mass, atomic mass constant, and Planck constant by a tenth left the whole suite green, as did a thirty percent error in a collision integral that sets every regime boundary. All 210 relative pins now also fix the absolute tolerance at zero, and the boxedness check runs on one state per branch with a rate of order unity or above instead of one near the denormal floor, where nothing it asserted could fail: a rate tripled from inside the diagnostics container now breaks it. --- tests/test_atomic_data.py | 18 +++---- tests/test_boiloff.py | 16 +++--- tests/test_composition.py | 26 +++++----- tests/test_constants.py | 32 ++++++------ tests/test_diagnostics.py | 42 ++++++++-------- tests/test_diffusion.py | 20 ++++---- tests/test_dispatcher.py | 72 +++++++++++++++++---------- tests/test_escape.py | 14 +++--- tests/test_examples.py | 6 +-- tests/test_fractionation.py | 48 +++++++++--------- tests/test_fractionation_ensembles.py | 4 +- tests/test_hydrodynamic.py | 36 +++++++------- tests/test_hydrostatic.py | 30 +++++------ tests/test_knudsen.py | 18 +++---- tests/test_planets_parameters.py | 28 +++++------ tests/test_profiles.py | 38 +++++++------- tests/test_thermostat.py | 14 +++--- 17 files changed, 240 insertions(+), 222 deletions(-) diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index a306c435..cc6c12dd 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -46,10 +46,10 @@ def test_three_level_transcription_spot_values(): radiatively forbidden couplings are structural, not missing data. """ n = THREE_LEVEL['N'] - assert n['transitions'][(1, 3)][0] == pytest.approx(5.22e-3, rel=1e-12) - assert n['transitions'][(2, 3)][0] == pytest.approx(8.47e-2, rel=1e-12) + assert n['transitions'][(1, 3)][0] == pytest.approx(5.22e-3, rel=1e-12, abs=0.0) + assert n['transitions'][(2, 3)][0] == pytest.approx(8.47e-2, rel=1e-12, abs=0.0) h = THREE_LEVEL['H'] - assert h['transitions'][(1, 3)][0] == pytest.approx(6.26e8, rel=1e-12) + assert h['transitions'][(1, 3)][0] == pytest.approx(6.26e8, rel=1e-12, abs=0.0) op = THREE_LEVEL['O+'] assert [lv[1] for lv in op['levels']] == [4, 10, 6] assert [lv[0] for lv in op['levels']] == ['4S', '2D', '2P'] @@ -75,7 +75,7 @@ def test_badnell_fit_magnitude_slope_and_misprint_guard(): factor 2 at 1e4 K. """ a4 = badnell_alpha_rr(1.0e4) - assert a4 == pytest.approx(3.761e-13, rel=0.02) + assert a4 == pytest.approx(3.761e-13, rel=0.02, abs=0.0) # Swapped-coefficient discrimination: T0 and T1 interchanged gives # 4.82e-13, a 28 percent shift, far outside the 2 percent pin. assert abs(a4 - 4.82e-13) > 0.2 * a4 @@ -100,11 +100,11 @@ def test_case_b_coefficients_and_temperature_scaling(): tabulated value falls back to the atomic-O coefficient rather than raising, because coefficient provenance is flagged upstream. """ - assert alpha_case_b('H', 1.0e4) == pytest.approx(2.7e-13, rel=1e-12) + assert alpha_case_b('H', 1.0e4) == pytest.approx(2.7e-13, rel=1e-12, abs=0.0) for el in ('H', 'He', 'C', 'N', 'O'): ratio = alpha_case_b(el, 2.0e4) / alpha_case_b(el, 1.0e4) - assert ratio == pytest.approx(2.0**-0.9, rel=1e-12) - assert alpha_case_b('Xe', 8000.0) == pytest.approx(alpha_case_b('O', 8000.0), rel=1e-12) + assert ratio == pytest.approx(2.0**-0.9, rel=1e-12, abs=0.0) + assert alpha_case_b('Xe', 8000.0) == pytest.approx(alpha_case_b('O', 8000.0), rel=1e-12, abs=0.0) # Scale guard: all case B values live in the 1e-13 decade at 1e4 K. for el in ('He', 'C', 'N', 'O'): assert 5e-14 < alpha_case_b(el, 1.0e4) < 5e-13 @@ -126,7 +126,7 @@ def test_co2_band_coronal_limit_and_detailed_balance(): a, b = CO2_KD['O'] kd = a * T**b ke = 2.0 * kd * math.exp(-667.0 / T) - assert q == pytest.approx(HNU_15UM * ke * colliders['O'] * n_co2, rel=1e-3) + assert q == pytest.approx(HNU_15UM * ke * colliders['O'] * n_co2, rel=1e-3, abs=0.0) assert co2_band_cooling(n_co2, {}, T) == pytest.approx(0.0, abs=0.0) assert co2_band_cooling(n_co2, {'O': 0.0}, T) == pytest.approx(0.0, abs=0.0) @@ -163,5 +163,5 @@ def test_o_finestructure_positive_and_activating(): q300 = o_finestructure_cooling(1e8, 300.0) assert q150 > 0.0 assert q300 > q150 - assert o_finestructure_cooling(2e8, 300.0) / q300 == pytest.approx(2.0, rel=1e-12) + assert o_finestructure_cooling(2e8, 300.0) / q300 == pytest.approx(2.0, rel=1e-12, abs=0.0) assert o_finestructure_cooling(0.0, 300.0) == pytest.approx(0.0, abs=0.0) diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index f8315b98..e0a7136b 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -99,7 +99,7 @@ def test_lambda_equals_two_bondi_radii_over_rp(): lam = lambda_restricted(M_p, R_p, T_eq, mu) c2 = kb * T_eq / mu R_B = G * M_p / (2.0 * c2) - assert lam == pytest.approx(2.0 * R_B / R_p, rel=1e-12) + assert lam == pytest.approx(2.0 * R_B / R_p, rel=1e-12, abs=0.0) assert LAMBDA_BAND[0] < 20.0 < LAMBDA_BAND[1] # Monotone in mu: heavier gas is more tightly bound. lam_light = lambda_restricted(M_p, R_p, T_eq, 2.3 * amu) @@ -160,12 +160,12 @@ def test_luminosity_cap_carries_the_tidal_barrier_reduction(): assert det_tidal['mdot_luminosity'] > det_flat['mdot_luminosity'] assert det_tidal['mdot_luminosity'] / det_flat['mdot_luminosity'] == pytest.approx( 1.92, rel=0.01 - ) + , abs=0.0) # K = 1 is the untidal form, and the cap still bounds the rate. _rate_one, det_one = bolometric_candidate( *args, lambda_gate=30.0, lambda_crit=20.0, k_tide=1.0 ) - assert det_one['mdot_luminosity'] == pytest.approx(det_flat['mdot_luminosity'], rel=1e-12) + assert det_one['mdot_luminosity'] == pytest.approx(det_flat['mdot_luminosity'], rel=1e-12, abs=0.0) assert _rate_tidal <= det_tidal['mdot_luminosity'] * (1 + 1e-12) @@ -179,11 +179,11 @@ def test_wind_temperature_and_opacity_scaling(): M_p, R_p, T_eq = 4 * Me, 2.5 * Re, 1000.0 launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) _, det = bolometric_candidate(M_p, R_p, T_eq, 0.01, launch, 1.0, 5.0, 20.0) - assert det['T_wind'] == pytest.approx(1000.0 / 2**0.25, rel=1e-12) + assert det['T_wind'] == pytest.approx(1000.0 / 2**0.25, rel=1e-12, abs=0.0) _, det2 = bolometric_candidate(M_p, R_p, T_eq, 0.02, launch, 1.0, 5.0, 20.0) - assert det2['mdot_parker'] == pytest.approx(det['mdot_parker'] / 2.0, rel=1e-12) + assert det2['mdot_parker'] == pytest.approx(det['mdot_parker'] / 2.0, rel=1e-12, abs=0.0) # The Bondi cap does not depend on the opacity. - assert det2['mdot_bondi'] == pytest.approx(det['mdot_bondi'], rel=1e-12) + assert det2['mdot_bondi'] == pytest.approx(det['mdot_bondi'], rel=1e-12, abs=0.0) def test_inflated_launch_level_clamps_with_flag(): @@ -226,8 +226,8 @@ def test_tang_timescale_diagnostic_contract(): assert tang_timescale_check(Me, Re, 1.0, 0.0, {'H': 1e18}) == {'evaluated': False} out = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 1e18}) assert out['evaluated'] is True - assert out['t_mdot_s'] == pytest.approx(1e13, rel=1e-9) - assert out['t_cool_s'] == pytest.approx(1.2226e11, rel=1e-3) + assert out['t_mdot_s'] == pytest.approx(1e13, rel=1e-9, abs=0.0) + assert out['t_cool_s'] == pytest.approx(1.2226e11, rel=1e-3, abs=0.0) # Swap discrimination: the two timescales differ by two decades here. assert out['t_mdot_s'] > 50.0 * out['t_cool_s'] assert out['terminated'] is True diff --git a/tests/test_composition.py b/tests/test_composition.py index ea21c9a2..140d624e 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -34,14 +34,14 @@ def test_element_masses_pin_isotope_conventions(): averages (Ne 20.180, Ar 39.948 amu), which must resolvably differ; the reactive elements carry the standard atomic weights. """ - assert ELEMENT_AMU['Ne'] == pytest.approx(19.992, rel=1e-9) - assert ELEMENT_AMU['Ar'] == pytest.approx(35.968, rel=1e-9) + assert ELEMENT_AMU['Ne'] == pytest.approx(19.992, rel=1e-9, abs=0.0) + assert ELEMENT_AMU['Ar'] == pytest.approx(35.968, rel=1e-9, abs=0.0) # Discrimination: the elemental-average masses differ by 1 to 11 percent. - assert ELEMENT_AMU['Ne'] != pytest.approx(20.180, rel=1e-3) - assert ELEMENT_AMU['Ar'] != pytest.approx(39.948, rel=1e-2) + assert ELEMENT_AMU['Ne'] != pytest.approx(20.180, rel=1e-3, abs=0.0) + assert ELEMENT_AMU['Ar'] != pytest.approx(39.948, rel=1e-2, abs=0.0) # Standard atomic weights for the reactive elements. - assert ELEMENT_AMU['H'] == pytest.approx(1.008, rel=1e-9) - assert ELEMENT_AMU['O'] == pytest.approx(15.999, rel=1e-9) + assert ELEMENT_AMU['H'] == pytest.approx(1.008, rel=1e-9, abs=0.0) + assert ELEMENT_AMU['O'] == pytest.approx(15.999, rel=1e-9, abs=0.0) def test_parse_formula_counts_and_strips_annotations(): @@ -86,10 +86,10 @@ def test_species_mass_amu_matches_stoichiometric_sum(): hydrogen and would expose a dropped count. """ m_h2o = species_mass_amu('H2O') - assert m_h2o == pytest.approx(2 * 1.008 + 15.999, rel=1e-12) + assert m_h2o == pytest.approx(2 * 1.008 + 15.999, rel=1e-12, abs=0.0) # Scale guard: water is 18 amu, not 17 (OH) or 19. assert 17.5 < m_h2o < 18.5 - assert species_mass_amu('CO2') == pytest.approx(12.011 + 2 * 15.999, rel=1e-12) + assert species_mass_amu('CO2') == pytest.approx(12.011 + 2 * 15.999, rel=1e-12, abs=0.0) def test_atomize_conserves_stoichiometry_and_normalizes(): @@ -101,12 +101,12 @@ def test_atomize_conserves_stoichiometry_and_normalizes(): negative entries are ignored, and the result always renormalizes to 1. """ a = atomize({'CO2': 1.0}) - assert a['C'] == pytest.approx(1.0 / 3.0, rel=1e-12) - assert a['O'] == pytest.approx(2.0 / 3.0, rel=1e-12) + assert a['C'] == pytest.approx(1.0 / 3.0, rel=1e-12, abs=0.0) + assert a['O'] == pytest.approx(2.0 / 3.0, rel=1e-12, abs=0.0) b = atomize({'H2': 0.5, 'H2O': 0.5, 'CO2': 0.0}) - assert sum(b.values()) == pytest.approx(1.0, rel=1e-12) + assert sum(b.values()) == pytest.approx(1.0, rel=1e-12, abs=0.0) # 2*0.5 + 2*0.5 = 2 hydrogens against 0.5 oxygens: a 4:1 ratio. - assert b['H'] / b['O'] == pytest.approx(4.0, rel=1e-12) + assert b['H'] / b['O'] == pytest.approx(4.0, rel=1e-12, abs=0.0) assert 'C' not in b # zero-fraction species contribute nothing @@ -131,7 +131,7 @@ def test_mean_particle_mass_reproduces_known_mixtures(): convention slip. """ m = mean_particle_mass({'H': 0.9, 'He': 0.1}) - assert m / amu == pytest.approx(0.9 * 1.008 + 0.1 * 4.0026, rel=1e-12) + assert m / amu == pytest.approx(0.9 * 1.008 + 0.1 * 4.0026, rel=1e-12, abs=0.0) # Convention guards: atomic mean, not pure H and not the molecular mean. assert m / amu > 1.2 assert m / amu < 2.0 diff --git a/tests/test_constants.py b/tests/test_constants.py index 53fa9afd..11d2801a 100644 --- a/tests/test_constants.py +++ b/tests/test_constants.py @@ -45,9 +45,9 @@ def test_gravitational_constant_si_cgs_consistency(): SI ``G``; a cgs value leaking into an SI expression would inflate every rate by ``1e3``, so the ratio is the discrimination guard. """ - assert G == pytest.approx(6.6743e-11, rel=1e-12) + assert G == pytest.approx(6.6743e-11, rel=1e-12, abs=0.0) # cgs/SI consistency: the ratio must be exactly 1e3. - assert G_cgs / G == pytest.approx(1e3, rel=1e-9) + assert G_cgs / G == pytest.approx(1e3, rel=1e-9, abs=0.0) # Discrimination: the SI value is order 1e-11, the cgs value order 1e-8; # they must not be interchangeable, so a swap moves the rate by 1e3. assert G < 1e-9 < G_cgs @@ -60,7 +60,7 @@ def test_speed_of_light_is_the_exact_si_value(): The boundary case a careless value would take is ``3e8``; the guard asserts the shipped constant sits more than ``2e5`` away from it. """ - assert c == pytest.approx(299792458.0, rel=1e-12) + assert c == pytest.approx(299792458.0, rel=1e-12, abs=0.0) # Discrimination against the common 3e8 rounding. assert abs(c - 3e8) > 2e5 @@ -74,13 +74,13 @@ def test_unit_conversions_are_mutually_consistent(): per-second erg-to-watt factor must equal the plain erg-to-joule factor. These relations are what the MORS-to-escape flux hand-off relies on. """ - assert erg2joule == pytest.approx(1e-7, rel=1e-12) + assert erg2joule == pytest.approx(1e-7, rel=1e-12, abs=0.0) # Length: centimetres are exactly 1e2 metres. - assert au2cm / au2m == pytest.approx(1e2, rel=1e-9) + assert au2cm / au2m == pytest.approx(1e2, rel=1e-9, abs=0.0) # Energy flux: erg s-1 cm-2 -> W m-2 folds erg->J (1e-7) with cm^-2->m^-2 (1e4). - assert ergcm2stoWm2 == pytest.approx(erg2joule * 1e4, rel=1e-9) + assert ergcm2stoWm2 == pytest.approx(erg2joule * 1e4, rel=1e-9, abs=0.0) # Power: erg s-1 -> W is the plain erg->J factor. - assert ergpersecondtowatt == pytest.approx(erg2joule, rel=1e-12) + assert ergpersecondtowatt == pytest.approx(erg2joule, rel=1e-12, abs=0.0) def test_seconds_to_year_uses_the_365_day_convention(): @@ -91,10 +91,10 @@ def test_seconds_to_year_uses_the_365_day_convention(): about ``0.07%``, well above the pin tolerance, so the test documents which convention is in force and would fail if it were switched. """ - assert s2yr == pytest.approx(1.0 / (3600 * 24 * 365), rel=1e-12) + assert s2yr == pytest.approx(1.0 / (3600 * 24 * 365), rel=1e-12, abs=0.0) julian = 1.0 / (3600 * 24 * 365.25) # The 365-day and Julian conventions are resolvably different. - assert s2yr != pytest.approx(julian, rel=1e-4) + assert s2yr != pytest.approx(julian, rel=1e-4, abs=0.0) assert s2yr > julian # a shorter year makes each second a larger fraction @@ -107,9 +107,9 @@ def test_boltzmann_constant_is_the_exact_si_value(): (``J -> erg``); a cgs value leaking into an SI expression would shift every thermal energy by seven decades, so the ratio is the discrimination guard. """ - assert kb == pytest.approx(1.380649e-23, rel=1e-12) + assert kb == pytest.approx(1.380649e-23, rel=1e-12, abs=0.0) # cgs/SI consistency: J -> erg is exactly 1e7. - assert kb_cgs / kb == pytest.approx(1e7, rel=1e-12) + assert kb_cgs / kb == pytest.approx(1e7, rel=1e-12, abs=0.0) # Order-of-magnitude bracket: a single decimal-place slip lands outside. assert 1e-23 < kb < 2e-23 @@ -124,8 +124,8 @@ def test_planck_constant_and_electronvolt_are_exact_si_values(): of about ``4.8e15 Hz``, in the extreme ultraviolet, which brackets both constants at once and fails on any single decimal-place slip. """ - assert h_planck == pytest.approx(6.62607015e-34, rel=1e-12) - assert ev2joule == pytest.approx(1.602176634e-19, rel=1e-12) + assert h_planck == pytest.approx(6.62607015e-34, rel=1e-12, abs=0.0) + assert ev2joule == pytest.approx(1.602176634e-19, rel=1e-12, abs=0.0) # Cross-consistency: a 20 eV photon sits in the extreme ultraviolet. nu_20ev = 20.0 * ev2joule / h_planck assert 4e15 < nu_20ev < 6e15 @@ -138,9 +138,9 @@ def test_proton_and_atomic_mass_constants_are_consistent(): units), a dimensionless ratio that catches a swap or a decimal-place slip in either constant. Both are pinned to their CODATA 2018 values. """ - assert m_p == pytest.approx(1.67262192369e-27, rel=1e-12) - assert amu == pytest.approx(1.66053906660e-27, rel=1e-12) + assert m_p == pytest.approx(1.67262192369e-27, rel=1e-12, abs=0.0) + assert amu == pytest.approx(1.66053906660e-27, rel=1e-12, abs=0.0) # The proton is 0.73% heavier than one atomic mass unit. - assert m_p / amu == pytest.approx(1.007276467, rel=1e-6) + assert m_p / amu == pytest.approx(1.007276467, rel=1e-6, abs=0.0) # Discrimination: the two constants must not be interchangeable. assert m_p > amu diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index e8eb04ee..1805336f 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -63,17 +63,17 @@ def test_johnson_criterion_scalings(): ) r1, q_net1, q_c1 = q_net_over_qc(F_xuv=10.0, **args) r2, q_net2, q_c2 = q_net_over_qc(F_xuv=20.0, **args) - assert q_net2 == pytest.approx(2.0 * q_net1, rel=1e-12) - assert q_c2 == pytest.approx(q_c1, rel=1e-12) - assert r2 == pytest.approx(2.0 * r1, rel=1e-12) + assert q_net2 == pytest.approx(2.0 * q_net1, rel=1e-12, abs=0.0) + assert q_c2 == pytest.approx(q_c1, rel=1e-12, abs=0.0) + assert r2 == pytest.approx(2.0 * r1, rel=1e-12, abs=0.0) # Quadratic in the intercepting radius: doubling R_xuv quadruples Q_net. args_wide = dict(args, R_xuv=2.4 * Re) _, q_net_wide, q_c_wide = q_net_over_qc(F_xuv=10.0, **args_wide) - assert q_net_wide == pytest.approx(4.0 * q_net1, rel=1e-12) - assert q_c_wide == pytest.approx(q_c1, rel=1e-12) + assert q_net_wide == pytest.approx(4.0 * q_net1, rel=1e-12, abs=0.0) + assert q_c_wide == pytest.approx(q_c1, rel=1e-12, abs=0.0) args2 = dict(args, sigma_c=2e-19) r3, _, q_c3 = q_net_over_qc(F_xuv=10.0, **args2) - assert q_c3 == pytest.approx(q_c1 / 2.0, rel=1e-12) + assert q_c3 == pytest.approx(q_c1 / 2.0, rel=1e-12, abs=0.0) assert r3 > r1 @@ -88,11 +88,11 @@ def test_guo_triple_limits(): """ mu = 2.3 * amu wide = guo_triple(5 * Me, 1.5 * Re, 800.0, mu, Ms, 1.496e11, 0.0, lambda_exo=12.3) - assert wide['lambda_exo'] == pytest.approx(12.3, rel=1e-12) + assert wide['lambda_exo'] == pytest.approx(12.3, rel=1e-12, abs=0.0) assert wide['lambda_star'] < wide['lambda_rp'] - assert wide['lambda_star'] == pytest.approx(wide['lambda_rp'], rel=1e-2) + assert wide['lambda_star'] == pytest.approx(wide['lambda_rp'], rel=1e-2, abs=0.0) lam_ref = G * (5 * Me) * mu / (1.380649e-23 * 800.0 * 1.5 * Re) - assert wide['lambda_rp'] == pytest.approx(lam_ref, rel=1e-9) + assert wide['lambda_rp'] == pytest.approx(lam_ref, rel=1e-9, abs=0.0) # Deep inside the Roche limit the corrected parameter reports zero. close = guo_triple(5 * Me, 1.5 * Re, 800.0, mu, Ms, 5e8, 0.0, lambda_exo=12.3) assert close['lambda_star'] == pytest.approx(0.0, abs=0.0) @@ -111,10 +111,10 @@ def test_erkaev_critical_temperature_normalization(): the second pin sits at x = 2, where a dropped 1/x doubles the value. """ t_far = erkaev_tc(Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) - assert t_far == pytest.approx(1.45e5, rel=1e-2) + assert t_far == pytest.approx(1.45e5, rel=1e-2, abs=0.0) # Non-degenerate pin: hand-evaluated 1.45e5 K * K(500) / 2 at x = 2. t_x2 = erkaev_tc(Mjup, Rjup, 2.0 * Rjup, 1e3 * Rjup) - assert t_x2 == pytest.approx(7.22825e4, rel=1e-3) + assert t_x2 == pytest.approx(7.22825e4, rel=1e-3, abs=0.0) # Dropped-1/x discrimination: that wrong formula returns 1.4457e5 here. assert abs(t_x2 - 1.4457e5) > 0.5 * t_x2 assert t_x2 < t_far @@ -122,7 +122,7 @@ def test_erkaev_critical_temperature_normalization(): # Mass scaling is linear: twice the mass doubles the barrier. assert erkaev_tc(2 * Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) == pytest.approx( 2 * t_far, rel=1e-2 - ) + , abs=0.0) def test_along_profile_fluid_check_reports_truncation(): @@ -174,11 +174,11 @@ def test_rate_floor_screen_separates_numerical_content(): laboratory-scale rate passes, and the screen returns the same number whatever the rate, because it never modifies anything. """ - assert RATE_FLOOR_KG_S == pytest.approx(m_p / 3.15576e7, rel=1e-12) - assert RATE_FLOOR_KG_S == pytest.approx(5.3e-35, rel=1e-2) + assert RATE_FLOOR_KG_S == pytest.approx(m_p / 3.15576e7, rel=1e-12, abs=0.0) + assert RATE_FLOOR_KG_S == pytest.approx(5.3e-35, rel=1e-2, abs=0.0) empty = rate_floor_screen(1e-123) assert empty['above_floor'] is False - assert empty['floor_kg_s'] == pytest.approx(RATE_FLOOR_KG_S, rel=1e-12) + assert empty['floor_kg_s'] == pytest.approx(RATE_FLOOR_KG_S, rel=1e-12, abs=0.0) real = rate_floor_screen(1e-9) assert real['above_floor'] is True # Zero is below any floor, and the boundary itself is not above it. @@ -215,11 +215,11 @@ def test_documentation_constants_are_complete(): and their dayside reduction factors, are reporting constants consumers rely on; pin them so a silent edit fails. """ - assert MURRAY_CLAY_EXPONENTS['RR_numerical'] == pytest.approx(0.6, rel=1e-12) - assert MURRAY_CLAY_EXPONENTS['EL_numerical'] == pytest.approx(0.9, rel=1e-12) - assert MURRAY_CLAY_EXPONENTS['RR_analytic_inherited'] == pytest.approx(0.5, rel=1e-12) - assert MURRAY_CLAY_EXPONENTS['EL_analytic_inherited'] == pytest.approx(1.0, rel=1e-12) - assert DAYSIDE_FACTORS['energy_limited'] == pytest.approx(0.26, rel=1e-12) - assert DAYSIDE_FACTORS['recombination_limited'] == pytest.approx(0.31, rel=1e-12) + assert MURRAY_CLAY_EXPONENTS['RR_numerical'] == pytest.approx(0.6, rel=1e-12, abs=0.0) + assert MURRAY_CLAY_EXPONENTS['EL_numerical'] == pytest.approx(0.9, rel=1e-12, abs=0.0) + assert MURRAY_CLAY_EXPONENTS['RR_analytic_inherited'] == pytest.approx(0.5, rel=1e-12, abs=0.0) + assert MURRAY_CLAY_EXPONENTS['EL_analytic_inherited'] == pytest.approx(1.0, rel=1e-12, abs=0.0) + assert DAYSIDE_FACTORS['energy_limited'] == pytest.approx(0.26, rel=1e-12, abs=0.0) + assert DAYSIDE_FACTORS['recombination_limited'] == pytest.approx(0.31, rel=1e-12, abs=0.0) # The reduction factors are genuine reductions. assert all(0.0 < v < 1.0 for v in DAYSIDE_FACTORS.values()) diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 310dcf85..51bd7ec5 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -68,8 +68,8 @@ def test_vdw_diameter_rule_reproduces_printed_entries(): # The assembled table itself carries the rule's output: the scaled # carbon and silicon diameters are pinned (hand-evaluated 275 * r/r_O), # so a wrong anchor in diameters() fails here, not only downstream. - assert d['C'] == pytest.approx(307.57, rel=1e-3) - assert d['Si'] == pytest.approx(379.93, rel=1e-3) + assert d['C'] == pytest.approx(307.57, rel=1e-3, abs=0.0) + assert d['Si'] == pytest.approx(379.93, rel=1e-3, abs=0.0) # The scaled diameters preserve the C > N > O size ordering. assert d['C'] > d['N'] > d['O'] @@ -96,7 +96,7 @@ def test_sn88_unit_reading_matches_zk86_table(): b_86 = b_zk86(sp, 'H2', 1000.0) assert abs(b_86 / b_sn - 1.0) < 0.03, sp # Unit-slip guard: a wrong unit reading misses by decades. - assert b_sn == pytest.approx(b_86, rel=0.05) + assert b_sn == pytest.approx(b_86, rel=0.05, abs=0.0) assert not math.isclose(b_sn * 100.0, b_86, rel_tol=0.5) @@ -179,7 +179,7 @@ def test_build_rows_source_order_and_classes(): """ r_hhe = build_rows(['H', 'He'])[0] assert r_hhe.uncertainty == 'measured' - assert r_hhe.b1000 == pytest.approx(1.6e20, rel=1e-12) + assert r_hhe.b1000 == pytest.approx(1.6e20, rel=1e-12, abs=0.0) r_krh2 = build_rows(['Kr', 'H2'])[0] assert r_krh2.provenance.startswith('SN88') assert r_krh2.uncertainty == 'measured' @@ -190,7 +190,7 @@ def test_build_rows_source_order_and_classes(): for r in (r_hhe, r_krh2, r_co, r_si): assert r.uncertainty in SIGMA_CLASS # The temperature law is the fitted power law. - assert r_hhe.b(2000.0) / r_hhe.b(1000.0) == pytest.approx(2.0**0.75, rel=1e-12) + assert r_hhe.b(2000.0) / r_hhe.b(1000.0) == pytest.approx(2.0**0.75, rel=1e-12, abs=0.0) def test_bmatrix_symmetry_and_error_contract(): @@ -213,7 +213,7 @@ def test_bmatrix_symmetry_and_error_contract(): with pytest.raises(KeyError, match='no mass'): masses_g(['H', 'Zz']) # Masses convert to grams: hydrogen is 1.008 amu. - assert masses_g(['H'])[0] == pytest.approx(1.008 * 1.66053907e-24, rel=1e-6) + assert masses_g(['H'])[0] == pytest.approx(1.008 * 1.66053907e-24, rel=1e-6, abs=0.0) def test_b_pair_ladder_and_proxy_provenance(): @@ -227,18 +227,18 @@ def test_b_pair_ladder_and_proxy_provenance(): values. """ b_si, prov = b_pair('H', 'CO2', 1000.0) - assert b_si == pytest.approx(6.0e19 * 100.0, rel=1e-9) + assert b_si == pytest.approx(6.0e19 * 100.0, rel=1e-9, abs=0.0) assert prov.startswith('ZK23') b_co, prov_co = b_pair('CO', 'N2', 1000.0) assert prov_co == 'molecular-background table' - assert b_co == pytest.approx(9.28e16 * 1000.0**0.71 * 100.0, rel=1e-9) + assert b_co == pytest.approx(9.28e16 * 1000.0**0.71 * 100.0, rel=1e-9, abs=0.0) b_so2, prov_so2 = b_pair('SO2', 'N2', 1000.0) assert prov_so2.startswith('proxy') assert 'SO2->' in prov_so2 assert b_so2 > 0.0 # Cache round trip: the second call reproduces the first exactly. b_si2, prov2 = b_pair('CO2', 'H', 1000.0) - assert b_si2 == pytest.approx(b_si, rel=1e-12) + assert b_si2 == pytest.approx(b_si, rel=1e-12, abs=0.0) assert prov2 == prov @@ -253,7 +253,7 @@ def test_b_mixture_blancs_law_limits(): """ b_pair_val, _ = b_pair('H', 'O2', 1000.0) b_mix, prov = b_mixture('H', {'H': 0.01, 'O2': 0.99}, 1000.0) - assert b_mix == pytest.approx(b_pair_val, rel=1e-12) + assert b_mix == pytest.approx(b_pair_val, rel=1e-12, abs=0.0) assert 'H-O2' in prov alone, _ = b_mixture('H', {'H': 1.0}, 1000.0) assert math.isinf(alone) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index e1181d23..7f80fd9e 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -134,7 +134,7 @@ def test_totality_over_random_physical_inputs(): assert all(math.isfinite(v) and v >= 0.0 for v in res.per_species.values()) tot = sum(res.per_species.values()) if res.mdot > 0.0: - assert tot == pytest.approx(res.mdot, rel=1e-6) + assert tot == pytest.approx(res.mdot, rel=1e-6, abs=0.0) assert isinstance(res.diagnostics, dict) assert 'knudsen' in res.diagnostics seen.add(res.regime) @@ -195,8 +195,8 @@ def test_routing_hydrodynamic_and_el_candidate_matches_el_escape(): eps = hydro['efficiency'] r_xuv = _photo_radius(inp) ref = EL_escape(True, inp.a, inp.e, inp.M_p, inp.M_star, eps, inp.R_p, r_xuv, inp.F_xuv, 2) - assert hydro['mdot_el'] == pytest.approx(ref, rel=1e-9) - assert res.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9) + assert hydro['mdot_el'] == pytest.approx(ref, rel=1e-9, abs=0.0) + assert res.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9, abs=0.0) winner = 'EL' if hydro['mdot_el'] <= hydro['mdot_rr'] else 'RR' assert res.regime == f'hydrodynamic:{winner}' @@ -256,9 +256,9 @@ def at(a): below, above = at(lo), at(hi) assert below.regime == 'roche_overflow' assert above.regime.startswith('hydrodynamic') - assert below.mdot == pytest.approx(above.mdot, rel=1e-9) + assert below.mdot == pytest.approx(above.mdot, rel=1e-9, abs=0.0) hydro = below.diagnostics['hydrodynamic'] - assert below.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9) + assert below.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9, abs=0.0) assert below.diagnostics['roche']['rate_branch'] == above.regime bolo = below.diagnostics['bolometric'] overflow_geometry_rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) @@ -306,14 +306,28 @@ def test_roche_subflag_separates_the_two_geometries(): def test_diagnostics_are_boxed(monkeypatch): """Sabotaging every diagnostics producer changes no dispatch outcome. - The container is reporting only: no control flow reads it back. The - test proves it by replacing every diagnostics-side producer with a - stub returning garbage of the right shape and asserting the regime, - the bulk rate, and the per-species split are unchanged; a regression - in which any diagnostic feeds a routing decision fails loudly here. + The container is reporting only: no control flow reads it back. The test + proves it by replacing every diagnostics-side producer with a stub + returning garbage of the right shape and asserting the regime, the bulk + rate, and every per-species rate are unchanged. It runs on one state per + branch, each dispatching a rate of order unity or above, because a state + whose rate sits near the denormal floor would compare equal to anything + under any absolute tolerance and the assertion would not discriminate. """ - inp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) - reference = dispatch(inp) + states = { + 'hydrostatic': _inputs( + 0.107 * Me, 0.53 * Re, 440.0, {'CO2': 0.99, 'H2': 0.01}, F_xuv=0.01, a=0.2 * AU + ), + 'hydrodynamic:EL': _inputs(Me, Re, 1000.0, {'N2': 1.0}, F_xuv=100.0), + 'hydrodynamic:RR': _inputs(Me, Re, 1000.0, {'CO2': 1.0}, F_xuv=5000.0), + 'boiloff': _inputs( + Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU + ), + } + reference = {k: dispatch(v) for k, v in states.items()} + for expected, res in zip(states, reference.values()): + assert res.regime == expected, (expected, res.regime) + assert res.mdot > 1.0, (expected, res.mdot) nan = float('nan') monkeypatch.setattr('zephyrus.diagnostics.q_net_over_qc', lambda *a, **k: (nan, nan, nan)) monkeypatch.setattr('zephyrus.diagnostics.guo_triple', lambda *a, **k: {}) @@ -323,13 +337,17 @@ def test_diagnostics_are_boxed(monkeypatch): monkeypatch.setattr('zephyrus.diagnostics.self_consistency_screen', lambda *a, **k: {}) monkeypatch.setattr('zephyrus.diagnostics.rate_floor_screen', lambda *a, **k: {}) monkeypatch.setattr('zephyrus.boiloff.tang_timescale_check', lambda *a, **k: {}) - sabotaged = dispatch(inp) - assert sabotaged.regime == reference.regime - assert sabotaged.mdot == pytest.approx(reference.mdot, rel=1e-12) - for el, v in reference.per_species.items(): - assert sabotaged.per_species[el] == pytest.approx(v, rel=1e-12) - # The sabotage genuinely reached the container. - assert sabotaged.diagnostics['guo_triple'] == {} + for name, inp in states.items(): + sabotaged = dispatch(inp) + ref = reference[name] + assert sabotaged.regime == ref.regime, name + assert sabotaged.mdot == pytest.approx(ref.mdot, rel=1e-12, abs=0.0), name + assert set(sabotaged.per_species) == set(ref.per_species), name + for el, v in ref.per_species.items(): + assert sabotaged.per_species[el] == pytest.approx(v, rel=1e-12, abs=0.0), (name, el) + assert sabotaged.flags == ref.flags, name + # The sabotage genuinely reached the container. + assert sabotaged.diagnostics['guo_triple'] == {} def test_hysteresis_memory_moves_the_threshold(): @@ -370,10 +388,10 @@ def test_base_out_of_range_extend_mode(): # the recorded distance is the gap between the two. A diagnostic that # echoed the clamped level instead would give a zero distance here. base_clamp = res_clamp.diagnostics['base_level'] - assert base_clamp['p_Pa'] == pytest.approx(1e-2, rel=1e-9) + assert base_clamp['p_Pa'] == pytest.approx(1e-2, rel=1e-9, abs=0.0) assert base_clamp['p_physical_Pa'] < base_clamp['p_Pa'] decades = np.log10(base_clamp['p_Pa'] / base_clamp['p_physical_Pa']) - assert decades == pytest.approx(res_clamp.flags['base_clamp_decades'], rel=1e-9) + assert decades == pytest.approx(res_clamp.flags['base_clamp_decades'], rel=1e-9, abs=0.0) settings = DispatchSettings(base_out_of_range='extend') inp_ext = _inputs( 5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2, settings=settings @@ -384,7 +402,7 @@ def test_base_out_of_range_extend_mode(): assert res_ext.diagnostics['base_level']['p_Pa'] < 1e-2 # On the extension the base reaches its target, so the two agree. base_ext = res_ext.diagnostics['base_level'] - assert base_ext['p_physical_Pa'] == pytest.approx(base_ext['p_Pa'], rel=1e-9) + assert base_ext['p_physical_Pa'] == pytest.approx(base_ext['p_Pa'], rel=1e-9, abs=0.0) def test_fractionation_toggle_and_split_protocol(): @@ -400,7 +418,7 @@ def test_fractionation_toggle_and_split_protocol(): ) assert on.regime.startswith('hydrodynamic') assert 'closure' in on.diagnostics - assert sum(on.per_species.values()) == pytest.approx(on.mdot, rel=1e-6) + assert sum(on.per_species.values()) == pytest.approx(on.mdot, rel=1e-6, abs=0.0) settings = DispatchSettings(fractionate=False) off = dispatch( _inputs( @@ -416,7 +434,7 @@ def test_fractionation_toggle_and_split_protocol(): assert off.regime.startswith('hydrodynamic') assert 'closure' not in off.diagnostics assert off.flags.get('split_from_base_composition') is True - assert sum(off.per_species.values()) == pytest.approx(off.mdot, rel=1e-6) + assert sum(off.per_species.values()) == pytest.approx(off.mdot, rel=1e-6, abs=0.0) def test_settings_and_inputs_error_contract(): @@ -470,7 +488,7 @@ def test_caldiroli_efficiency_mode_applies_and_falls_back(): ) eff = strong.diagnostics['hydrodynamic']['efficiency'] assert 'efficiency_fallback_fixed' not in strong.flags - assert eff != pytest.approx(0.1, rel=0.05) + assert eff != pytest.approx(0.1, rel=0.05, abs=0.0) assert 0.0 < eff < 1.0 weak = dispatch( _inputs( @@ -485,7 +503,7 @@ def test_caldiroli_efficiency_mode_applies_and_falls_back(): ) assert weak.flags.get('caldiroli_below_flux_bound') is True assert weak.flags.get('efficiency_fallback_fixed') is True - assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx(0.1, rel=1e-12) + assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx(0.1, rel=1e-12, abs=0.0) def test_t_exo_thermostat_mode_estimates_and_flags(): @@ -505,7 +523,7 @@ def test_t_exo_thermostat_mode_estimates_and_flags(): assert res.flags.get('T_exo_thermostat') is True assert 800.0 <= res.diagnostics['hydrostatic']['T_exo'] <= 5.0e4 if res.mdot > 0.0: - assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-6) + assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-6, abs=0.0) def test_extend_mode_truncated_extension_keeps_the_clamp(): diff --git a/tests/test_escape.py b/tests/test_escape.py index 75962e11..7feb9ca8 100644 --- a/tests/test_escape.py +++ b/tests/test_escape.py @@ -58,7 +58,7 @@ def test_el_escape_scaling2_matches_erkaev2007_closed_form(): val = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) expected = 6479585.361332079 # kg s-1, hand-evaluated at the reference geometry # Same closed form and constants as the source, so exact to float rounding. - assert val == pytest.approx(expected, rel=1e-9) + assert val == pytest.approx(expected, rel=1e-9, abs=0.0) # Wrong-scaling discrimination: scaling=3 uses Rxuv**3, not Rp * Rxuv**2. # With Rxuv = 1.2 * Rp the two branches are 20% apart, far above tolerance. wrong_scaling3 = EPSILON * np.pi * RXUV**3 * FXUV / (G * Me) @@ -83,7 +83,7 @@ def test_el_escape_scaling3_matches_lehmer_catling_closed_form(): """ val = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=3) expected = 7775502.433598499 # kg s-1, hand-evaluated at the reference geometry - assert val == pytest.approx(expected, rel=1e-9) + assert val == pytest.approx(expected, rel=1e-9, abs=0.0) # Wrong-scaling discrimination: scaling=2 uses Rp * Rxuv**2 and is 20% # smaller here, so a regression that reverts the exponent fails. wrong_scaling2 = EPSILON * np.pi * RP * RXUV**2 * FXUV / (G * Me) @@ -128,7 +128,7 @@ def test_el_escape_tidal_raises_below_roche_lobe(): rhill = a * (1 - e) * (Me / (3 * Ms)) ** (1 / 3) ksi = rhill / RP # Confirm the constructed geometry is genuinely sub-Roche-lobe. - assert ksi == pytest.approx(0.4692904927637428, rel=1e-9) + assert ksi == pytest.approx(0.4692904927637428, rel=1e-9, abs=0.0) assert ksi < 1.0 with pytest.raises(ValueError, match='Roche lobe'): EL_escape(True, a, e, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) @@ -162,7 +162,7 @@ def test_el_escape_linear_in_xuv_flux(): base = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) doubled = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, 2 * FXUV, scaling=2) # Exact proportionality: a spurious additive offset would break this. - assert doubled == pytest.approx(2 * base, rel=1e-12) + assert doubled == pytest.approx(2 * base, rel=1e-12, abs=0.0) assert base > 0 # Zero-flux limit: the rate collapses to exactly zero. zero = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, 0.0, scaling=2) @@ -180,7 +180,7 @@ def test_el_escape_decreases_with_planet_mass(): light = EL_escape(False, 1.0, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) heavy = EL_escape(False, 1.0, 0.0, 2 * Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) # Exact 1/Mp relation: doubling Mp halves the rate. - assert heavy == pytest.approx(0.5 * light, rel=1e-12) + assert heavy == pytest.approx(0.5 * light, rel=1e-12, abs=0.0) # Monotone decrease, and the heavier planet still escapes at a positive rate. assert heavy < light massive = EL_escape(False, 1.0, 0.0, 1e3 * Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) @@ -204,7 +204,7 @@ def test_el_escape_tidal_correction_increases_escape(): tidal = EL_escape(True, a, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) assert tidal > no_tidal # Pin the enhancement factor 1 / K_tide with ksi = Rhill / Rp. - assert tidal / no_tidal == pytest.approx(1.4594144515815166, rel=1e-9) + assert tidal / no_tidal == pytest.approx(1.4594144515815166, rel=1e-9, abs=0.0) # Dropped-K_tide discrimination: the ratio is well above 1, not ~1. assert tidal / no_tidal - 1.0 > 0.1 # Boundedness: for this close-in geometry the Hill radius stays above Rp @@ -231,7 +231,7 @@ def test_el_escape_tidal_eccentricity_increases_escape(): # Higher eccentricity gives a smaller periapsis Hill radius, so more escape. assert eccentric > circular # Pin the enhancement against the hand-evaluated K_tide(e=0) / K_tide(e=0.3). - assert eccentric / circular == pytest.approx(1.2290962685206341, rel=1e-9) + assert eccentric / circular == pytest.approx(1.2290962685206341, rel=1e-9, abs=0.0) # Sign-convention discrimination: the (1 + e) periapsis slip would push the # ratio below 1, reversing the inequality asserted above. assert eccentric / circular > 1.0 diff --git a/tests/test_examples.py b/tests/test_examples.py index 541814de..0ebe7ef3 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -102,7 +102,7 @@ def test_dispatcher_example_verdict_closes_and_respects_limits(): example = _load_example() result = dispatch(example.build_state('CO2', 1.0, 1.0, 10.0)) total = sum(result.per_species.values()) - assert total == pytest.approx(result.mdot, rel=1e-12) + assert total == pytest.approx(result.mdot, rel=1e-12, abs=0.0) # Scale guard: the wind rate on this planet is of order 1e6 kg/s, not # 1e0 (a dropped geometric factor) or 1e12 (a cgs slip). assert 1.0e5 < result.mdot < 1.0e8 @@ -116,7 +116,7 @@ def test_dispatcher_example_verdict_closes_and_respects_limits(): assert quiet.mdot >= 0.0 # The closure holds on the hydrostatic branch too, where the split comes # from the branch itself rather than from the fractionation solver. - assert sum(quiet.per_species.values()) == pytest.approx(quiet.mdot, rel=1e-12) + assert sum(quiet.per_species.values()) == pytest.approx(quiet.mdot, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant @@ -195,5 +195,5 @@ def test_dispatcher_example_track_changes_regime_as_the_star_quiets(): # After the crossing the hydrostatic rate is flux independent, because # that branch carries no XUV physics: the last two samples agree. tail = [row['mdot'] for row in rows if row['regime'] == 'hydrostatic'] - assert tail[-1] == pytest.approx(tail[0], rel=1e-12) + assert tail[-1] == pytest.approx(tail[0], rel=1e-12, abs=0.0) assert all(math.isfinite(row['mdot']) for row in rows) diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index 8e367866..f970f031 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -101,7 +101,7 @@ def test_ternary_deuterium_reductions(): flux = solve_closure(frac * phi_crit_he, X, m, T, g0, b) f2, f3 = x2 / x1, x3 / x1 ref = f3 * (flux[0] + a3 * flux[1] + a2 * phi_dl_he * x2 - phi_dl_d) / (1 + a3 * f2) - assert flux[2] == pytest.approx(ref, rel=1e-11), frac + assert flux[2] == pytest.approx(ref, rel=1e-11, abs=0.0), frac # (b) Subcritical He (retained), D escaping: their Eq. (8). for frac in (1.5, 3.0): @@ -111,7 +111,7 @@ def test_ternary_deuterium_reductions(): flux = solve_closure(phi, X, m, T, g0, b) assert flux[1] == pytest.approx(0.0, abs=0.0) ref = x3 * (flux[0] * (1 + a2 * x2 / x1) - phi_dl_d) / (x1 + a3 * x2) - assert flux[2] == pytest.approx(ref, rel=1e-11), frac + assert flux[2] == pytest.approx(ref, rel=1e-11, abs=0.0), frac # (c) Both activation thresholds are sharp at the printed critical rates. eps = 1e-6 @@ -187,7 +187,7 @@ def test_two_majors_trace_minor_relations(): ) / (1 + (b1k / b2k) * f2) if xk_ref > 1e-6: n_cmp += 1 - assert xk == pytest.approx(xk_ref, rel=1e-11), (f2, frac, k) + assert xk == pytest.approx(xk_ref, rel=1e-11, abs=0.0), (f2, frac, k) mu2 = m[1] / m[0] xk_zk = ( 1 @@ -208,7 +208,7 @@ def test_two_majors_trace_minor_relations(): - (m[2] - m[0]) / (m[1] - m[0]) * (b_hc / b12) + (m[1] - m[2]) / (m[1] - m[0]) * (b_hc / b12) * f2 ) / (1 + (b_hc / b_oc) * f2) - assert x3 == pytest.approx(x3_z90, rel=2e-8), f2 + assert x3 == pytest.approx(x3_z90, rel=2e-8, abs=0.0), f2 assert n_cmp >= 8 # enough entrained comparisons to be meaningful assert zk_dev > 0.05 # the 1986 variant is resolvably not reproduced @@ -242,7 +242,7 @@ def test_first_entrainment_with_two_retained_heavies(): assert flux_hi[idx] > 0.0 assert flux_lo[3 - idx] == pytest.approx(0.0, abs=0.0) # The library's own first_threshold agrees with the printed expression. - assert first_threshold(X, m, T, g0, b) == pytest.approx(phi_thresh, rel=1e-9) + assert first_threshold(X, m, T, g0, b) == pytest.approx(phi_thresh, rel=1e-9, abs=0.0) @pytest.mark.reference_pinned @@ -272,10 +272,10 @@ def test_zk23_nontrace_ternary_relations(): X = np.array([f1, f2, f4]) zk19 = (m[1] - m[0]) * g0 * b12 / kT / (1 + f4 * (b12 / b14 - 1)) phi_star = f1 * (m[1] - m[0]) * g0 / kT / ((f1 + f2) / b12 + f4 / b14) - assert phi_star / f1 == pytest.approx(zk19, rel=1e-13), (f4, r21) + assert phi_star / f1 == pytest.approx(zk19, rel=1e-13, abs=0.0), (f4, r21) ph1 = first_threshold(X, m, T, g0, b) th = _activation_threshold(1, X, m, T, g0, b, ph1 * 1e-4, ph1 * 1e3) - assert (th / m[0]) / f1 == pytest.approx(zk19, rel=1e-9), (f4, r21) + assert (th / m[0]) / f1 == pytest.approx(zk19, rel=1e-9, abs=0.0), (f4, r21) eps = 1e-6 _, _, lo_act = solve_closure(th * (1 - eps), X, m, T, g0, b, return_diag=True) _, _, hi_act = solve_closure(th * (1 + eps), X, m, T, g0, b, return_diag=True) @@ -297,7 +297,7 @@ def test_zk23_nontrace_ternary_relations(): 1 + f1 / f2 + (f4 / f2) * (b12 / b24) ) rhs = g0 * (m[1] - m[0]) * b12 / kT - assert lhs == pytest.approx(rhs, rel=1e-12), (f4, frac) + assert lhs == pytest.approx(rhs, rel=1e-12, abs=0.0), (f4, frac) def _activation_threshold(k, X, m, T, g0, b, lo, hi, niter=100): @@ -338,15 +338,15 @@ def test_chassefiere_prescribed_flux_partition(): X, mm = np.array([x1, x2]), np.array([m1, m2]) phi_c = b12 * x1 * (m2 - m1) * m1 * g0 / kT f1_c = solve_closure(phi_c, X, mm, T, g0, b)[0] - assert m1 + kT * f1_c / (b12 * g0 * x1) == pytest.approx(m2, rel=1e-12) + assert m1 + kT * f1_c / (b12 * g0 * x1) == pytest.approx(m2, rel=1e-12, abs=0.0) for frac in (1.2, 2.0, 10.0, 100.0): f1, f2 = solve_closure(frac * phi_c, X, mm, T, g0, b) f1_ref = frac * phi_c / m1 # his Eq. (5) mc = m1 + kT * f1 / (b12 * g0 * x1) # his Eq. (7) pred6 = 1.0 / (1 + (x2 / x1) * (m2 / m1) * (mc - m2) / (mc - m1)) - assert f1 / f1_ref == pytest.approx(pred6, rel=1e-12) + assert f1 / f1_ref == pytest.approx(pred6, rel=1e-12, abs=0.0) pred1 = (x2 / x1) * f1 * (mc - m2) / (mc - m1) # his Eq. (1) - assert f2 == pytest.approx(pred1, rel=1e-12) + assert f2 == pytest.approx(pred1, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant @@ -377,7 +377,7 @@ def test_universal_b_closed_form(): ref = X * (phi_tot - beta * (m - mbar)) np.testing.assert_allclose(flux, ref, rtol=0, atol=1e-10 * np.max(ref)) # Conservation on top of the closed form. - assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12) + assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12, abs=0.0) @pytest.mark.reference_pinned @@ -392,9 +392,9 @@ def test_hunten_anchors_earth_mars_venus(): """ kt400 = kb_cgs * 400.0 f1_earth = (140 - 1) * AMU_G * 2e19 * 980 / kt400 - assert f1_earth == pytest.approx(8.1e13, rel=0.02) + assert f1_earth == pytest.approx(8.1e13, rel=0.02, abs=0.0) f1_mars = (130 - 1) * AMU_G * 2e19 * 373 / kt400 - assert f1_mars == pytest.approx(2.9e13, rel=0.02) + assert f1_mars == pytest.approx(2.9e13, rel=0.02, abs=0.0) mc_venus = 1 + kt400 * 2e11 / (2.2e19 * 850 * AMU_G) assert mc_venus == pytest.approx(1.35, abs=0.02) for m2_amu, g0, b12, f1_ref in ( @@ -411,7 +411,7 @@ def test_hunten_anchors_earth_mars_venus(): 0.0, abs=0.0 ) assert solve_closure(phi_star * (1 + eps), X, m, 400.0, g0, b)[1] > 0.0 - assert phi_star / m[0] == pytest.approx(f1_ref, rel=0.01) + assert phi_star / m[0] == pytest.approx(f1_ref, rel=0.01, abs=0.0) @pytest.mark.physics_invariant @@ -439,8 +439,8 @@ def test_low_flux_collapse_and_zero_limit(): phi = frac * phi1 flux, _c, act = solve_closure(phi, X, m, T, g0, b, return_diag=True) assert act == frozenset({light}) - assert flux[light] == pytest.approx(phi / m[light], rel=1e-12) - assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12) + assert flux[light] == pytest.approx(phi / m[light], rel=1e-12, abs=0.0) + assert np.sum(m * flux) == pytest.approx(phi, rel=1e-12, abs=0.0) flux0, _c0, act0 = solve_closure(0.0, X, m, T, g0, b, return_diag=True) np.testing.assert_array_equal(flux0, 0.0) assert act0 == frozenset() @@ -458,7 +458,7 @@ def test_per_species_shim_conserves_mass(): per, diag, _flags = closure_per_species( 1.0e6, {'H': 0.85, 'He': 0.10, 'O': 0.05}, 8000.0, 5 * Me, 2 * Re ) - assert sum(per.values()) == pytest.approx(1.0e6, rel=1e-9) + assert sum(per.values()) == pytest.approx(1.0e6, rel=1e-9, abs=0.0) assert diag['mass_conservation_rel'] < 1e-9 assert all(v >= 0.0 for v in per.values()) assert 'H' in diag['active_set'] @@ -477,7 +477,7 @@ def test_shim_low_flux_and_rock_former_flag(): """ per, diag, _ = closure_per_species(1.0e-3, {'H': 0.5, 'O': 0.5}, 8000.0, 5 * Me, 2 * Re) assert per['O'] == pytest.approx(0.0, abs=0.0) - assert per['H'] == pytest.approx(1.0e-3, rel=1e-9) + assert per['H'] == pytest.approx(1.0e-3, rel=1e-9, abs=0.0) assert diag['retained'] == ['O'] _per, _diag, flags = closure_per_species( 1.0e6, {'H': 0.9, 'Si': 0.1}, 8000.0, 5 * Me, 2 * Re @@ -494,12 +494,12 @@ def test_unfractionated_split_protocol(): to the bulk rate. """ per, flags = unfractionated_split(4.0, {'H': 3.0e18, 'O': 1.0e18}, {'H': 1.0}) - assert per['H'] == pytest.approx(3.0, rel=1e-12) - assert per['O'] == pytest.approx(1.0, rel=1e-12) + assert per['H'] == pytest.approx(3.0, rel=1e-12, abs=0.0) + assert per['O'] == pytest.approx(1.0, rel=1e-12, abs=0.0) assert flags == {} per2, flags2 = unfractionated_split(4.0, None, {'H': 0.5, 'O': 0.5}) assert flags2.get('split_from_base_composition') is True - assert sum(per2.values()) == pytest.approx(4.0, rel=1e-12) + assert sum(per2.values()) == pytest.approx(4.0, rel=1e-12, abs=0.0) # Mass weighting: oxygen outweighs hydrogen at equal mole fractions. assert per2['O'] > per2['H'] # A reservoir that has run dry has no proportions to split by, which is @@ -507,8 +507,8 @@ def test_unfractionated_split_protocol(): # fallback as no reservoir at all, flagged, rather than dividing by zero. per3, flags3 = unfractionated_split(4.0, {'H': 0.0, 'O': 0.0}, {'H': 0.5, 'O': 0.5}) assert flags3.get('split_from_base_composition') is True - assert per3 == pytest.approx(per2, rel=1e-12) - assert sum(per3.values()) == pytest.approx(4.0, rel=1e-12) + assert per3 == pytest.approx(per2, rel=1e-12, abs=0.0) + assert sum(per3.values()) == pytest.approx(4.0, rel=1e-12, abs=0.0) # Negative reservoir masses are malformed input, not a dry reservoir. with pytest.raises(ValueError, match='non-negative'): unfractionated_split(4.0, {'H': -1.0, 'O': 2.0}, {'H': 0.5, 'O': 0.5}) diff --git a/tests/test_fractionation_ensembles.py b/tests/test_fractionation_ensembles.py index 62100213..f96fadfb 100644 --- a/tests/test_fractionation_ensembles.py +++ b/tests/test_fractionation_ensembles.py @@ -141,7 +141,7 @@ def test_binary_limit_matches_closed_form_over_random_draws(): for frac in (0.3, 3.0): phi = frac * phi_c flux = solve_closure(phi, X, mm, T, g0, b) - assert m1 * flux[0] + m2 * flux[1] == pytest.approx(phi, rel=1e-12) + assert m1 * flux[0] + m2 * flux[1] == pytest.approx(phi, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant @@ -233,7 +233,7 @@ def test_active_set_unique_and_matches_bruteforce(): assert a_set == act wref = max(np.max(np.abs(w)), 1e-300) assert np.max(np.abs(X * w - flux)) <= 1e-8 * wref * np.max(X) - assert c_bf == pytest.approx(c_mult, rel=1e-9) + assert c_bf == pytest.approx(c_mult, rel=1e-9, abs=0.0) if len(a_set) < n: n_partial += 1 assert n_partial > 0 # the retention branch is genuinely exercised diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index edf73387..a77e44d7 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -73,7 +73,7 @@ def test_erkaev_table1_enhancement_factors(): toward 1 as ``xi`` grows (boundedness: ``K`` in (0, 1) throughout). """ for xi, inv_k in ERKAEV_TABLE1: - assert 1.0 / k_tide(xi) == pytest.approx(inv_k, rel=0.011), xi + assert 1.0 / k_tide(xi) == pytest.approx(inv_k, rel=0.011, abs=0.0), xi assert 0.0 < k_tide(xi) < 1.0 factors = [1.0 / k_tide(xi) for xi, _ in ERKAEV_TABLE1] assert all(a >= b for a, b in zip(factors, factors[1:])) @@ -102,7 +102,7 @@ def test_caldiroli_fit_spot_values_and_flux_guard(): for log_phi, f_over_rho, eta_ref in CALDIROLI_SPOTS: m_planet, r_p, f_xuv = _planet_for(log_phi, f_over_rho) eta, _flags = caldiroli_efficiency(f_xuv, m_planet, r_p, K=1.0) - assert eta == pytest.approx(eta_ref, rel=0.05), (log_phi, f_over_rho) + assert eta == pytest.approx(eta_ref, rel=0.05, abs=0.0), (log_phi, f_over_rho) m_planet, r_p, f_xuv = _planet_for(12.5, 0.5) # F/rho below the 1e2 bound eta, flags = caldiroli_efficiency(f_xuv, m_planet, r_p, K=1.0) assert eta is None @@ -120,12 +120,12 @@ def test_wind_mean_masses_reproduce_lopez_pairs(): mass by construction. """ mu_w, mu_i = wind_mean_masses({'H': 0.9, 'He': 0.1}) - assert mu_w == pytest.approx(0.62, rel=0.06) - assert mu_i == pytest.approx(1.3, rel=0.02) + assert mu_w == pytest.approx(0.62, rel=0.06, abs=0.0) + assert mu_i == pytest.approx(1.3, rel=0.02, abs=0.0) mu_w, mu_i = wind_mean_masses({'H': 2.0 / 3.0, 'O': 1.0 / 3.0}) - assert mu_w == pytest.approx(3.0, rel=0.01) - assert mu_i == pytest.approx(6.0, rel=0.01) - assert mu_i == pytest.approx(2.0 * mu_w, rel=1e-12) + assert mu_w == pytest.approx(3.0, rel=0.01, abs=0.0) + assert mu_i == pytest.approx(6.0, rel=0.01, abs=0.0) + assert mu_i == pytest.approx(2.0 * mu_w, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant @@ -139,10 +139,10 @@ def test_rr_subcritical_floor_semantics(): """ rr = rr_chain(1.0 * Me, 10.0, 1.0 * Re, 1.0e4, {'H': 1.0}) assert rr['subcritical'] is True - assert rr['R_s'] == pytest.approx(1.0 * Re, rel=1e-12) + assert rr['R_s'] == pytest.approx(1.0 * Re, rel=1e-12, abs=0.0) assert rr['R_s_calc'] < 1.0 * Re - assert rr['rho_s'] == pytest.approx(rr['rho_base'], rel=1e-12) - assert rr['barometric_factor'] == pytest.approx(1.0, rel=1e-12) + assert rr['rho_s'] == pytest.approx(rr['rho_base'], rel=1e-12, abs=0.0) + assert rr['barometric_factor'] == pytest.approx(1.0, rel=1e-12, abs=0.0) assert selection_mechanism(rr, el_won=False) == 'RR-selected:subcritical-floor' @@ -161,12 +161,12 @@ def test_rr_barometric_factor_separates_the_two_rr_regimes(): """ rr = rr_chain(10.0 * Me, 10.0, 2.0 * Re, 1.0e4, {'C': 1.0 / 3.0, 'O': 2.0 / 3.0}) assert rr['subcritical'] is False - assert rr['barometric_factor'] == pytest.approx(math.exp(1.5 - rr['lambda_b']), rel=1e-12) + assert rr['barometric_factor'] == pytest.approx(math.exp(1.5 - rr['lambda_b']), rel=1e-12, abs=0.0) # Strongly bound: several decades of suppression, so the sonic-point # density is far below the base density. assert rr['lambda_b'] > 4.0 assert rr['barometric_factor'] < 1.0e-2 - assert rr['rho_s'] == pytest.approx(rr['rho_base'] * rr['barometric_factor'], rel=1e-12) + assert rr['rho_s'] == pytest.approx(rr['rho_base'] * rr['barometric_factor'], rel=1e-12, abs=0.0) rr_h = rr_chain(0.7 * Mjup, 5.0, 2.0 * Rjup, 1.0e4, {'H': 1.0}) assert not rr_h['subcritical'] @@ -195,10 +195,10 @@ def test_flux_scalings_of_both_limits(): """ a = rr_chain(5 * Me, 1.0, 1.5 * Re, 1e4, {'H': 1.0}) b = rr_chain(5 * Me, 100.0, 1.5 * Re, 1e4, {'H': 1.0}) - assert b['mdot_rr'] / a['mdot_rr'] == pytest.approx(10.0, rel=1e-6) + assert b['mdot_rr'] / a['mdot_rr'] == pytest.approx(10.0, rel=1e-6, abs=0.0) lo = el_rate(0.1, 1.0, Re, 1.1 * Re, Me, 1.0) hi = el_rate(0.1, 100.0, Re, 1.1 * Re, Me, 1.0) - assert hi / lo == pytest.approx(100.0, rel=1e-12) + assert hi / lo == pytest.approx(100.0, rel=1e-12, abs=0.0) # Zero-flux limits: no driver, no escape, for both chains. assert el_rate(0.1, 0.0, Re, 1.1 * Re, Me, 1.0) == pytest.approx(0.0, abs=1e-30) assert rr_chain(5 * Me, 0.0, 1.5 * Re, 1e4, {'H': 1.0})['mdot_rr'] == pytest.approx( @@ -221,9 +221,9 @@ def test_murray_clay_fiducial_hot_jupiter_anchors(): """ m_planet, r_p = 0.7 * Mjup, 1.4 * Rjup rr = rr_chain(m_planet, 0.45, r_p, 1.0e4, {'H': 1.0}) - assert rr['lambda_b'] == pytest.approx(5.49, rel=0.05) + assert rr['lambda_b'] == pytest.approx(5.49, rel=0.05, abs=0.0) assert 2.0 < rr['R_s'] / r_p < 4.0 - assert rr['R_s'] / r_p == pytest.approx(rr['lambda_b'] / 2.0, rel=1e-9) + assert rr['R_s'] / r_p == pytest.approx(rr['lambda_b'] / 2.0, rel=1e-9, abs=0.0) sigma_pp = 1e-13 * 1e-4 # cm^2 -> m^2 at 1e4 K for f_si, kn_ref in ((0.45, 1e-4), (500.0, 1e-5)): rr = rr_chain(m_planet, f_si, r_p, 1.0e4, {'H': 1.0}) @@ -241,8 +241,8 @@ def test_hill_radius_periapsis_geometry(): """ r0 = hill_radius_periapsis(Me, Ms, 1.496e11, 0.0) r3 = hill_radius_periapsis(Me, Ms, 1.496e11, 0.3) - assert r3 == pytest.approx(0.7 * r0, rel=1e-12) + assert r3 == pytest.approx(0.7 * r0, rel=1e-12, abs=0.0) r8m = hill_radius_periapsis(8 * Me, Ms, 1.496e11, 0.0) - assert r8m == pytest.approx(2.0 * r0, rel=1e-12) + assert r8m == pytest.approx(2.0 * r0, rel=1e-12, abs=0.0) # Earth's Hill radius is about 1.5e9 m (0.01 au). assert 1.3e9 < r0 < 1.6e9 diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index d1313c17..977a6687 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -92,14 +92,14 @@ def test_volkov_flat_factor_against_published_correction(): would double-count. """ for lam, c_ref in VOLKOV_C_TABLE.items(): - assert c_lambda(lam) == pytest.approx(c_ref, rel=6e-4), lam + assert c_lambda(lam) == pytest.approx(c_ref, rel=6e-4, abs=0.0), lam r = volkov_eq9_ratio(1e-4, lam) - assert (r - 1.0) / 1e-4 == pytest.approx(c_lambda(lam), rel=2e-3) + assert (r - 1.0) / 1e-4 == pytest.approx(c_lambda(lam), rel=2e-3, abs=0.0) assert volkov_eq9_ratio(1e-6, lam) == pytest.approx(1.0, abs=1e-4) - assert volkov_flat_factor(6.0) == pytest.approx(1.7, rel=1e-12) - assert volkov_flat_factor(15.0) == pytest.approx(1.4, rel=1e-12) - assert volkov_flat_factor(50.0) == pytest.approx(1.4, rel=1e-12) # held - assert volkov_flat_factor(10.5) == pytest.approx(1.55, rel=0.01) + assert volkov_flat_factor(6.0) == pytest.approx(1.7, rel=1e-12, abs=0.0) + assert volkov_flat_factor(15.0) == pytest.approx(1.4, rel=1e-12, abs=0.0) + assert volkov_flat_factor(50.0) == pytest.approx(1.4, rel=1e-12, abs=0.0) # held + assert volkov_flat_factor(10.5) == pytest.approx(1.55, rel=0.01, abs=0.0) assert volkov_flat_factor(15.0) < volkov_flat_factor(6.0) assert volkov_eq9_ratio(0.1, 15.0) > volkov_eq9_ratio(0.1, 6.0) @@ -172,7 +172,7 @@ def test_yelle_figure1_mars_hydrogen_flux(): f200, _ = _mars_h_flux(200.0) f300, _ = _mars_h_flux(300.0) f400, _ = _mars_h_flux(400.0) - assert f300 == pytest.approx(2.4e8, rel=0.4) + assert f300 == pytest.approx(2.4e8, rel=0.4, abs=0.0) assert f400 / f300 == pytest.approx(1.0, abs=0.2) # saturated plateau assert f200 / f400 > 0.5 assert f100 / f400 < 0.07 # Jeans-limited collapse @@ -193,8 +193,8 @@ def test_escape_temperature_identities_and_gate(): _per, det = hydrostatic_rates(prof, M_MARS, 300.0) m = det['m_bar'] r = det['r_exo'] - assert det['T_esc_neutral'] == pytest.approx(G * M_MARS * m / (2 * kb * r), rel=1e-12) - assert det['T_esc_plasma'] == pytest.approx(det['T_esc_neutral'] / 2.0, rel=1e-12) + assert det['T_esc_neutral'] == pytest.approx(G * M_MARS * m / (2 * kb * r), rel=1e-12, abs=0.0) + assert det['T_esc_plasma'] == pytest.approx(det['T_esc_neutral'] / 2.0, rel=1e-12, abs=0.0) det2 = dict(det, T_esc_neutral=500.0, T_esc_plasma=250.0) # Gate thresholds: neutral at 250 K, plasma at 125 K exobase temperature. assert gate_unstable(260.0, det2, 'neutral', 0.0) == (True, False) @@ -228,7 +228,7 @@ def test_element_mapping_conserves_mass_and_dominant_bypass(): rate_co2 = det['per_species_rate']['CO2'] assert per_el['C'] + per_el['O'] + per_el['H'] == pytest.approx( rate_co2 + det['per_species_rate']['H'], rel=1e-9 - ) + , abs=0.0) def test_extension_truncates_when_unbound_and_flags(): @@ -250,8 +250,8 @@ def test_extension_truncates_when_unbound_and_flags(): for ext in (hot, cool): assert np.all(np.diff(ext['r']) > 0) # The Bates profile approaches its asymptotic temperature from below. - assert cool['T'][-1] == pytest.approx(200.0, rel=1e-6) - assert cool['T'][0] == pytest.approx(100.0, rel=1e-9) + assert cool['T'][-1] == pytest.approx(200.0, rel=1e-6, abs=0.0) + assert cool['T'][0] == pytest.approx(100.0, rel=1e-9, abs=0.0) def test_exobase_locator_contract(): @@ -317,9 +317,9 @@ def test_jeans_effusion_velocity_shape(): T, m = 300.0, 1.008 * amu v5 = jeans_effusion_velocity(T, m, 5.0) v10 = jeans_effusion_velocity(T, m, 10.0) - assert v10 / v5 == pytest.approx((11.0 / 6.0) * math.exp(-5.0), rel=1e-12) + assert v10 / v5 == pytest.approx((11.0 / 6.0) * math.exp(-5.0), rel=1e-12, abs=0.0) v_heavy = jeans_effusion_velocity(T, 16 * m, 5.0) - assert v5 / v_heavy == pytest.approx(4.0, rel=0.01) # sqrt(16) prefactor + assert v5 / v_heavy == pytest.approx(4.0, rel=0.01, abs=0.0) # sqrt(16) prefactor assert v_heavy > 0.0 @@ -343,7 +343,7 @@ def test_trace_species_survive_into_the_exobase_anchor(): keys.append(set(per_el)) # Linear in abundance across nine decades, so no threshold sits inside. for x, rate in zip(fractions, rates): - assert rate / x == pytest.approx(rates[0] / fractions[0], rel=1e-3), (x, rate) + assert rate / x == pytest.approx(rates[0] / fractions[0], rel=1e-3, abs=0.0), (x, rate) # Hydrogen is reported at every abundance, never dropped from the split. assert all('H' in k for k in keys) # Removing it entirely is the only way to lose it, and then the rate diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index 71d29312..04a2b9aa 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -84,7 +84,7 @@ def test_laricchiuta_cross_sections_match_transcription_pins(): """ for pair, vals in PINNED_SIGMA.items(): for T, ref in vals.items(): - assert lar_sigma_diff(pair, T) == pytest.approx(ref, rel=0.01), (pair, T) + assert lar_sigma_diff(pair, T) == pytest.approx(ref, rel=0.01, abs=0.0), (pair, T) # Monotone decrease with temperature for a representative pair. ts = [300.0, 1000.0, 3000.0, 10000.0, 20000.0] sigmas = [lar_sigma_diff(('N', 'N'), t) for t in ts] @@ -119,10 +119,10 @@ def test_hydrogen_route_pins_and_temperature_dependence(): dependence by construction. The error contract: any species other than H or H2 is rejected. """ - assert sigma_zk90_hydrogen('H', 1e4) == pytest.approx(6.4e-20, rel=0.02) - assert sigma_zk90_hydrogen('H2', 300.0) == pytest.approx(2.07e-19, rel=0.02) + assert sigma_zk90_hydrogen('H', 1e4) == pytest.approx(6.4e-20, rel=0.02, abs=0.0) + assert sigma_zk90_hydrogen('H2', 300.0) == pytest.approx(2.07e-19, rel=0.02, abs=0.0) r = sigma_zk90_hydrogen('H', 1e4) / sigma_zk90_hydrogen('H', 1e2) - assert r == pytest.approx((1e4 / 1e2) ** -0.25, rel=1e-9) + assert r == pytest.approx((1e4 / 1e2) ** -0.25, rel=1e-9, abs=0.0) with pytest.raises(ValueError, match='hydrogen route'): sigma_zk90_hydrogen('He', 1e4) @@ -149,7 +149,7 @@ def test_ladder_provenance_and_geometric_bias(): # A composite molecule with no tabulated radius falls back to its # largest constituent element without raising. geo_h2o = sigma_geometric('H2O') - assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12) + assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant @@ -164,11 +164,11 @@ def test_kn_sonic_equals_mfp_over_scale_height(): vmr = {'N': 1.0} n, r, T = 1e14, 1e7, 8000.0 kn, sigma, prov = kn_sonic(n, r, vmr, T, gamma=1.0) - assert kn == pytest.approx(mean_free_path(sigma, n) / sonic_scale_height(r, 1.0), rel=1e-12) + assert kn == pytest.approx(mean_free_path(sigma, n) / sonic_scale_height(r, 1.0), rel=1e-12, abs=0.0) assert prov == {'N': 'laricchiuta'} # Rarefied edge: eight decades less dense means eight decades larger Kn. kn_thin, _, _ = kn_sonic(n * 1e-8, r, vmr, T) - assert kn_thin == pytest.approx(kn * 1e8, rel=1e-9) + assert kn_thin == pytest.approx(kn * 1e8, rel=1e-9, abs=0.0) assert math.isfinite(kn_thin) @@ -185,10 +185,10 @@ def test_mixture_cross_section_is_density_weighted(): s_n, _ = sigma_species('N', T) s_co2, _ = sigma_species('CO2', T) mix, _ = sigma_mixture({'N': 0.25, 'CO2': 0.75}, T) - assert mix == pytest.approx(0.25 * s_n + 0.75 * s_co2, rel=1e-12) + assert mix == pytest.approx(0.25 * s_n + 0.75 * s_co2, rel=1e-12, abs=0.0) assert min(s_n, s_co2) < mix < max(s_n, s_co2) mix_scaled, _ = sigma_mixture({'N': 2.5, 'CO2': 7.5}, T) - assert mix_scaled == pytest.approx(mix, rel=1e-12) + assert mix_scaled == pytest.approx(mix, rel=1e-12, abs=0.0) def test_hysteresis_window_moves_the_threshold_the_right_way(): diff --git a/tests/test_planets_parameters.py b/tests/test_planets_parameters.py index 8c718aa2..6ac6a12a 100644 --- a/tests/test_planets_parameters.py +++ b/tests/test_planets_parameters.py @@ -45,8 +45,8 @@ def test_earth_mass_radius_recover_rocky_density(): an order of magnitude and fails the band, which a bare value pin would miss. """ - assert Me == pytest.approx(5.9722e24, rel=1e-9) - assert Re == pytest.approx(6.378e6, rel=1e-9) + assert Me == pytest.approx(5.9722e24, rel=1e-9, abs=0.0) + assert Re == pytest.approx(6.378e6, rel=1e-9, abs=0.0) rho = Me / (4 / 3 * np.pi * Re**3) # Terrestrial mean density, ~5.5e3 kg m-3; a decimal slip lands outside. assert 5.0e3 < rho < 6.0e3 @@ -61,8 +61,8 @@ def test_sun_to_earth_mass_ratio(): brackets it tightly around ``332946`` so a mantissa or exponent slip in either mass fails. """ - assert Ms == pytest.approx(1.98847e30, rel=1e-9) - assert Rs == pytest.approx(6.957e8, rel=1e-9) + assert Ms == pytest.approx(1.98847e30, rel=1e-9, abs=0.0) + assert Rs == pytest.approx(6.957e8, rel=1e-9, abs=0.0) ratio = Ms / Me # Known solar/Earth mass ratio, order 3.33e5. assert 3.32e5 < ratio < 3.34e5 @@ -77,10 +77,10 @@ def test_earth_orbit_parameters_are_physical(): orbit cannot have ``e >= 1``. """ # a_earth is 1 au by construction; compare as a number without float ==. - assert a_earth == pytest.approx(1.0, rel=1e-12) + assert a_earth == pytest.approx(1.0, rel=1e-12, abs=0.0) # Bound-orbit eccentricity: 0 <= e < 1, and Earth's is small. assert 0.0 <= e_earth < 1.0 - assert e_earth == pytest.approx(0.017, rel=1e-6) + assert e_earth == pytest.approx(0.017, rel=1e-6, abs=0.0) def test_toi561_star_scaled_from_solar_values(): @@ -91,9 +91,9 @@ def test_toi561_star_scaled_from_solar_values(): must recover those multipliers exactly, so a change to either the solar anchor or the multiplier is caught. """ - assert R_TOI561 / Rs == pytest.approx(0.832, rel=1e-9) - assert M_TOI561 / Ms == pytest.approx(0.805, rel=1e-9) - assert L_TOI561 / Ls == pytest.approx(0.522, rel=1e-9) + assert R_TOI561 / Rs == pytest.approx(0.832, rel=1e-9, abs=0.0) + assert M_TOI561 / Ms == pytest.approx(0.805, rel=1e-9, abs=0.0) + assert L_TOI561 / Ls == pytest.approx(0.522, rel=1e-9, abs=0.0) # A sub-solar star: each quantity is strictly below its solar anchor. assert R_TOI561 < Rs assert M_TOI561 < Ms @@ -108,8 +108,8 @@ def test_toi561b_planet_scaled_from_earth_values(): density. The circular-orbit assumption ``e_TOI561b = 0`` is the boundary eccentricity. """ - assert R_TOI561b / Re == pytest.approx(1.37, rel=1e-9) - assert M_TOI561b / Me == pytest.approx(2.24, rel=1e-9) + assert R_TOI561b / Re == pytest.approx(1.37, rel=1e-9, abs=0.0) + assert M_TOI561b / Me == pytest.approx(2.24, rel=1e-9, abs=0.0) rho = M_TOI561b / (4 / 3 * np.pi * R_TOI561b**3) # Rocky super-Earth mean density, a few 1e3 kg m-3. assert 3.0e3 < rho < 6.0e3 @@ -126,9 +126,9 @@ def test_jupiter_nominal_values_recover_gas_giant_density(): in the Earth values moves it above ``5 g cm-3``. The mass ratio to Earth (about 318) brackets both pins at once. """ - assert Mjup == pytest.approx(1.8982e27, rel=1e-9) - assert Rjup == pytest.approx(7.1492e7, rel=1e-9) + assert Mjup == pytest.approx(1.8982e27, rel=1e-9, abs=0.0) + assert Rjup == pytest.approx(7.1492e7, rel=1e-9, abs=0.0) rho = Mjup / (4.0 / 3.0 * np.pi * Rjup**3) # Gas-giant mean density in SI: about 1240 kg m-3. - assert rho == pytest.approx(1240.0, rel=0.02) + assert rho == pytest.approx(1240.0, rel=0.02, abs=0.0) assert 300.0 < Mjup / Me < 330.0 diff --git a/tests/test_profiles.py b/tests/test_profiles.py index 9f515de3..f47feef4 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -92,7 +92,7 @@ def test_isothermal_profile_obeys_hydrostatic_relation(): for i in (0, len(prof.p) // 2): H = kb * T * prof.r[i] ** 2 / (G * M * mu) step = (prof.r[i + 1] - prof.r[i]) / (lnp[i + 1] - lnp[i]) - assert step == pytest.approx(-H, rel=1e-12) + assert step == pytest.approx(-H, rel=1e-12, abs=0.0) # Curvature guard: the r^2 growth of H makes the true extent exceed the # plane-parallel (surface-H) estimate. H0 = kb * T * R**2 / (G * M * mu) @@ -133,13 +133,13 @@ def test_interp_at_pressure_ideal_gas_and_node_exactness(): prof = _n2_profile() k = len(prof.p) // 2 lev = interp_at_pressure(prof, float(prof.p[k])) - assert lev['r'] == pytest.approx(float(prof.r[k]), rel=1e-12) - assert lev['T'] == pytest.approx(float(prof.T[k]), rel=1e-12) + assert lev['r'] == pytest.approx(float(prof.r[k]), rel=1e-12, abs=0.0) + assert lev['T'] == pytest.approx(float(prof.T[k]), rel=1e-12, abs=0.0) # Ideal gas at an off-node pressure. p_mid = np.sqrt(prof.p[k] * prof.p[k + 1]) lev2 = interp_at_pressure(prof, float(p_mid)) - assert lev2['n'] == pytest.approx(float(p_mid) / (kb * lev2['T']), rel=1e-12) - assert lev2['rho'] == pytest.approx(lev2['n'] * lev2['mmw'], rel=1e-12) + assert lev2['n'] == pytest.approx(float(p_mid) / (kb * lev2['T']), rel=1e-12, abs=0.0) + assert lev2['rho'] == pytest.approx(lev2['n'] * lev2['mmw'], rel=1e-12, abs=0.0) # Radius must lie strictly between the bracketing nodes. assert prof.r[k] < lev2['r'] < prof.r[k + 1] @@ -155,7 +155,7 @@ def test_pressure_at_radius_inverts_the_profile(): prof = _n2_profile() k = len(prof.p) // 3 lev = interp_at_pressure(prof, float(prof.p[k])) - assert pressure_at_radius(prof, lev['r']) == pytest.approx(float(prof.p[k]), rel=1e-9) + assert pressure_at_radius(prof, lev['r']) == pytest.approx(float(prof.p[k]), rel=1e-9, abs=0.0) r_mid = 0.5 * (prof.r[k] + prof.r[k + 1]) p_mid = pressure_at_radius(prof, r_mid) assert prof.p[k + 1] < p_mid < prof.p[k] @@ -171,16 +171,16 @@ def test_photospheric_level_clamps_with_flags(): """ prof = _n2_profile() lev, flags = photospheric_level(prof) - assert lev['p'] == pytest.approx(2000.0, rel=1e-12) + assert lev['p'] == pytest.approx(2000.0, rel=1e-12, abs=0.0) assert flags == {} deep = isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e7, 1e4) lev_d, flags_d = photospheric_level(deep) assert flags_d.get('photo_clamped') is True - assert lev_d['p'] == pytest.approx(1e4, rel=1e-12) + assert lev_d['p'] == pytest.approx(1e4, rel=1e-12, abs=0.0) shallow = isothermal_profile(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, 1e3, 1e-4) lev_s, flags_s = photospheric_level(shallow) assert flags_s.get('photo_clamped') is True - assert lev_s['p'] == pytest.approx(1e3, rel=1e-12) + assert lev_s['p'] == pytest.approx(1e3, rel=1e-12, abs=0.0) @pytest.mark.reference_pinned @@ -206,10 +206,10 @@ def test_lopez_base_pressure_is_the_nanobar_level(): # Scale guard: eighty decades of headroom is a unit slip, five is right. assert p_base < 2000.0 * 1e-4 # Linearity in gravity: doubling g doubles the base pressure. - assert lopez_base_pressure(1.008 * amu, 2 * g) == pytest.approx(2 * p_base, rel=1e-12) + assert lopez_base_pressure(1.008 * amu, 2 * g) == pytest.approx(2 * p_base, rel=1e-12, abs=0.0) # The proton-mass convention differs from the atomic-weight convention # by under a percent; both stay inside the pinned band. - assert lopez_base_pressure(m_p, g) == pytest.approx(p_base, rel=0.01) + assert lopez_base_pressure(m_p, g) == pytest.approx(p_base, rel=0.01, abs=0.0) def test_wind_base_level_lopez_converges_and_clamps(): @@ -225,7 +225,7 @@ def test_wind_base_level_lopez_converges_and_clamps(): prof = _n2_profile(p_top=1e-6) lev, flags = wind_base_level(prof, 5 * Me, method='lopez') assert 'base_clamped' not in flags - assert lev['p'] == pytest.approx(lev['p_physical'], rel=1e-3) + assert lev['p'] == pytest.approx(lev['p_physical'], rel=1e-3, abs=0.0) # The N2 base sits at the nanobar scale (between 0.01 and 100 nanobar). assert 1e-6 < lev['p'] < 1e-2 # The physical base pressure is a level quantity, not a flag: an @@ -234,12 +234,12 @@ def test_wind_base_level_lopez_converges_and_clamps(): deep = _n2_profile(p_top=1e-2) lev_d, flags_d = wind_base_level(deep, 5 * Me, method='lopez') assert flags_d.get('base_clamped') is True - assert lev_d['p'] == pytest.approx(float(deep.p[-1]), rel=1e-12) + assert lev_d['p'] == pytest.approx(float(deep.p[-1]), rel=1e-12, abs=0.0) # The clamped level sits above its own physical target, by the recorded # distance; a clamp that lost the target would fail both assertions. assert lev_d['p'] > lev_d['p_physical'] expected_decades = np.log10(deep.p[-1] / lev_d['p_physical']) - assert flags_d['base_clamp_decades'] == pytest.approx(expected_decades, rel=1e-9) + assert flags_d['base_clamp_decades'] == pytest.approx(expected_decades, rel=1e-9, abs=0.0) assert flags_d['base_clamp_decades'] > 0.0 @@ -252,11 +252,11 @@ def test_wind_base_level_fixed_pressure_method(): """ prof = _n2_profile() lev, flags = wind_base_level(prof, 5 * Me, method='fixed_pressure', fixed_pressure=5.0) - assert lev['p'] == pytest.approx(5.0, rel=1e-12) + assert lev['p'] == pytest.approx(5.0, rel=1e-12, abs=0.0) assert flags == {} lev_c, flags_c = wind_base_level(prof, 5 * Me, method='fixed_pressure', fixed_pressure=1e-9) assert flags_c.get('base_clamped') is True - assert lev_c['p'] == pytest.approx(float(prof.p[-1]), rel=1e-12) + assert lev_c['p'] == pytest.approx(float(prof.p[-1]), rel=1e-12, abs=0.0) def test_wind_base_level_boreas_falls_back_without_dependency(monkeypatch): @@ -273,11 +273,11 @@ def test_wind_base_level_boreas_falls_back_without_dependency(monkeypatch): lev, flags = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert flags.get('base_method_fallback') == 'lopez' lev_ref, _ = wind_base_level(prof, 5 * Me, method='lopez') - assert lev['p'] == pytest.approx(lev_ref['p'], rel=1e-12) + assert lev['p'] == pytest.approx(lev_ref['p'], rel=1e-12, abs=0.0) # Missing scalars: same fallback, no exception. lev2, flags2 = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=None) assert flags2.get('base_method_fallback') == 'lopez' - assert lev2['p'] == pytest.approx(lev_ref['p'], rel=1e-12) + assert lev2['p'] == pytest.approx(lev_ref['p'], rel=1e-12, abs=0.0) def test_wind_base_level_boreas_uses_solver_radius(monkeypatch): @@ -320,7 +320,7 @@ def compute_mass_loss_parameters(self, m, r, t): scalars = {'R_p': 1.5 * Re, 'T_eq': 800.0, 'F_xuv': 10.0} lev, flags = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert 'base_method_fallback' not in flags - assert lev['p'] == pytest.approx(pressure_at_radius(prof, r_target), rel=1e-9) + assert lev['p'] == pytest.approx(pressure_at_radius(prof, r_target), rel=1e-9, abs=0.0) # Interior radius: the level pressure must be between the endpoints. assert prof.p[-1] < lev['p'] < prof.p[0] diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py index e39ea057..2edd93a9 100644 --- a/tests/test_thermostat.py +++ b/tests/test_thermostat.py @@ -64,7 +64,7 @@ def test_populations_reach_boltzmann_in_the_lte_limit(): ((n3, g3, e3), (n1, g1, e1)), ): boltz = (ga / gb) * math.exp(-HC_CM * (ea - eb) * 1e7 / (kb_cgs * T)) - assert na / nb == pytest.approx(boltz, rel=1e-3), sp + assert na / nb == pytest.approx(boltz, rel=1e-3, abs=0.0), sp checked += 1 assert checked >= 4 # most of the seven systems thermalize fully @@ -81,7 +81,7 @@ def test_cooling_linear_in_electron_density_in_the_coronal_limit(): """ q1 = three_level_cooling('N', 1e8, 1.0, 9000.0) q2 = three_level_cooling('N', 1e8, 2.0, 9000.0) - assert q2 / q1 == pytest.approx(2.0, rel=1e-3) + assert q2 / q1 == pytest.approx(2.0, rel=1e-3, abs=0.0) q_lte1 = three_level_cooling('N', 1e8, 1e19, 9000.0) q_lte2 = three_level_cooling('N', 1e8, 2e19, 9000.0) assert q_lte2 / q_lte1 < 1.1 @@ -151,10 +151,10 @@ def test_front_and_recombination_selection_follow_composition(): from zephyrus.atomic_data import alpha_case_b, badnell_alpha_rr a_n = recombination_alpha({'N': 0.8, 'O': 0.2}, 1e4) - assert a_n == pytest.approx(badnell_alpha_rr(1e4), rel=1e-12) + assert a_n == pytest.approx(badnell_alpha_rr(1e4), rel=1e-12, abs=0.0) a_mix = recombination_alpha({'H': 0.6, 'O': 0.4}, 1e4) expected = 0.6 * alpha_case_b('H', 1e4) + 0.4 * alpha_case_b('O', 1e4) - assert a_mix == pytest.approx(expected, rel=1e-12) + assert a_mix == pytest.approx(expected, rel=1e-12, abs=0.0) # Ratio comparison: at 1e-13 scale an absolute tolerance would swamp the # difference, so the resolvability check is multiplicative. assert a_n / a_mix > 1.5 @@ -170,14 +170,14 @@ def test_rootfind_contract_edges_and_root(): edge clamps high immediately. """ T, d = solve_wind_temperature(700.0, _base(), {'N': 1.0}, 0.0) - assert T == pytest.approx(700.0, rel=1e-12) + assert T == pytest.approx(700.0, rel=1e-12, abs=0.0) assert d['clamped'] == 'low' T, d = solve_wind_temperature(700.0, _base(), {'N': 1.0}, 5.0) assert 700.0 <= T <= 5.0e4 if d['clamped'] is None: assert abs(d['q_heat'] - d['q_cool']) / d['q_heat'] < 1e-3 T, d = solve_wind_temperature(6.0e4, _base(), {'N': 1.0}, 5.0) - assert T == pytest.approx(5.0e4, rel=1e-12) + assert T == pytest.approx(5.0e4, rel=1e-12, abs=0.0) assert d['clamped'] == 'high' @@ -222,7 +222,7 @@ def test_balance_parts_sum_and_channel_toggles(): """ comp = {'N': 0.8, 'O': 0.2} r_all, d_all = balance_at(9000.0, _base(), comp, 5.0) - assert sum(d_all['parts'].values()) == pytest.approx(d_all['q_cool'], rel=1e-12) + assert sum(d_all['parts'].values()) == pytest.approx(d_all['q_cool'], rel=1e-12, abs=0.0) r_no_atomic, d_no = balance_at(9000.0, _base(), comp, 5.0, cool_atomic=False) assert 'atomic_lines' not in d_no['parts'] assert d_no['q_cool'] <= d_all['q_cool'] From c4b100dda485e54e68a9352e1513d39cfeed1293 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:18:00 +0200 Subject: [PATCH 043/113] Check that the validation inventory names real tests A Validation page listed a test under a name the suite no longer uses, so the row a reader follows from a published equation to the assertion that pins it led nowhere. The quality gate now resolves every test id named across those pages and fails on one it cannot find, and the stale row points at the test that replaced it. --- docs/Validation/hydrostatic.md | 2 +- tools/check_test_quality.py | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/Validation/hydrostatic.md b/docs/Validation/hydrostatic.md index af5ba9fb..256e7b62 100644 --- a/docs/Validation/hydrostatic.md +++ b/docs/Validation/hydrostatic.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | Test id | Reference | Scope | |---|---|---| -| `tests/test_hydrostatic.py::test_volkov_eq9_unity_limit_and_printed_coefficient` | Volkov et al. (2011), Phys. Fluids 23, 066601, Eq. 9 and their printed c(lambda) table | The drifting-Maxwellian flux ratio reduces to unity at zero bulk velocity and reproduces the printed linear coefficient across lambda 1 to 106; the test also demonstrates that this correction and the flat kinetic factor the branch applies have opposite slopes in lambda, so applying both would double-count. | +| `tests/test_hydrostatic.py::test_volkov_flat_factor_against_published_correction` | Volkov et al. (2011), Phys. Fluids 23, 066601, Eq. 9 and their printed c(lambda) table | The drifting-Maxwellian flux ratio reduces to unity at zero bulk velocity and reproduces the printed linear coefficient across lambda 1 to 106; the test also demonstrates that this correction and the flat kinetic factor the branch applies have opposite slopes in lambda, so applying both would double-count. | | `tests/test_hydrostatic.py::test_yelle_figure1_mars_hydrogen_flux` | Yelle (2024), Icarus 416, 116099, Figure 1 (fully specified Mars model) | The branch reproduces the diffusion-limited hydrogen plateau at $2.4 \times 10^{8}$ cm^-2 s^-1 (40% tolerance: the binary H-CO2 coefficient source of the original calculation is not pinned in the paper), the saturation above 200 K, and the Jeans-limited collapse at 100 K checked as a regime. | ## Notes diff --git a/tools/check_test_quality.py b/tools/check_test_quality.py index 9ef39c49..e22d84dc 100644 --- a/tools/check_test_quality.py +++ b/tools/check_test_quality.py @@ -51,6 +51,7 @@ import ast import json import os +import re import sys from collections import defaultdict from pathlib import Path @@ -59,6 +60,7 @@ TESTS_DIR = REPO_ROOT / 'tests' SRC_DIR = REPO_ROOT / 'src' / 'zephyrus' BASELINE_PATH = REPO_ROOT / 'tools' / 'test_quality_baseline.json' +VALIDATION_DIR = REPO_ROOT / 'docs' / 'Validation' TIER_MARKERS = {'unit', 'smoke', 'integration', 'slow'} @@ -535,6 +537,35 @@ def physics_invariant_status() -> list[str]: return flagged +def dangling_validation_ids() -> list[str]: + """Return test ids named under docs/Validation that the suite lacks. + + Each Validation page inventories the tests that pin a physics source + against its primary, and that inventory is what lets a reader go from a + published equation to the assertion that checks it. A renamed test leaves + the row pointing at nothing, and nothing else in the gates notices. + """ + if not VALIDATION_DIR.exists(): + return [] + pattern = re.compile(r'(tests/test_[A-Za-z_0-9]+\.py)::([A-Za-z_0-9]+)') + dangling = [] + for page in sorted(VALIDATION_DIR.glob('*.md')): + text = page.read_text() + for rel, name in pattern.findall(text): + path = REPO_ROOT / rel + if not path.exists(): + dangling.append(f'{page.name}: {rel} does not exist') + continue + try: + tree = ast.parse(path.read_text()) + except SyntaxError: + continue + names = {n.name for n in _iter_test_functions(tree)} + if name not in names: + dangling.append(f'{page.name}: {rel}::{name} is not in the suite') + return dangling + + def load_baseline() -> dict[str, int]: if not BASELINE_PATH.exists(): return {} @@ -590,6 +621,13 @@ def cmd_check() -> int: print(f'{"TOTAL":42} {total_baseline:>8} {total_current:>9} {total_status}') if total_current > total_baseline: failed = True + dangling = dangling_validation_ids() + if dangling: + failed = True + print() + print('Validation inventory rows naming a test the suite does not have:') + for item in dangling: + print(f' {item}') if failed: print() print('New violations vs baseline:') From 6df48e1ea619158b095843e671d1b15bbf656cf5 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:18:00 +0200 Subject: [PATCH 044/113] State the near-Roche trigger the way the code tests it Three pages described the flag as firing for a flow radius within 1.5 Hill radii, a condition almost every planet satisfies. The screen compares the Hill radius against 1.5 flow radii, so what raises the flag is a flow that reaches beyond two thirds of the way to the lobe. --- docs/Explanations/regimes.md | 2 +- docs/How-to/troubleshooting.md | 2 +- docs/Reference/results.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 870c659a..1669f9c8 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -117,7 +117,7 @@ The screen renames a state and never changes its rate. The reason is that the br Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`. The other case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. -Near misses (flow radius within 1.5 Hill radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. +Near misses (a flow radius above two thirds of the Hill radius, so that the Hill radius is less than 1.5 flow radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. ## Boundaries are bands diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 89c96b83..322d0ab4 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -80,7 +80,7 @@ The three cases that produces: - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. -Points inside 1.5 Hill radii raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. +Points whose flow radius exceeds two thirds of the Hill radius raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. ## `contested_ion` fired diff --git a/docs/Reference/results.md b/docs/Reference/results.md index d955ca19..60a896b2 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -80,7 +80,7 @@ The `effect` column says whether the returned rate already reflects the flag or |---|---|---|---| | `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes; the rate is the one the branch computed. | Reporting only | | `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | -| `near_roche` | `True` | The flow radius is within 1.5 Hill radii. The tidal factor is steep there. | Reporting only | +| `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there. | Reporting only | | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | | `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | | `stale_input` | `True` | The caller passed `atm_converged=False`, so the profile is from a non-converged atmosphere solve. | Reporting only | From a1f40dec6ba85068f2448be08809e1a1c01c13ad Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:18:50 +0200 Subject: [PATCH 045/113] Read the nitrogen recombination fit from its table The six coefficients had been taken from the secondary that quotes them, and its T2 reads 6.379e4 where Badnell's own row for Z = 7, N = 6 prints 6.739e4. The transposition moves the coefficient by three percent at the top of the thermostat bracket. All six now come from the table, are pinned individually so the order of the digits cannot drift again, and the guard against the secondary's garbled form stays. --- docs/Validation/atomic_data.md | 2 +- src/zephyrus/atomic_data.py | 19 ++++++++++--------- tests/test_atomic_data.py | 8 ++++++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/docs/Validation/atomic_data.md b/docs/Validation/atomic_data.md index e000aea5..4998f1e2 100644 --- a/docs/Validation/atomic_data.md +++ b/docs/Validation/atomic_data.md @@ -5,7 +5,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the trans | Test id | Reference | Scope | |---|---|---| | `tests/test_atomic_data.py::test_three_level_transcription_spot_values` | Nakayama, Ikoma & Terada (2022), ApJ 937, 72 ([ADS 2022ApJ...937...72N](https://ui.adsabs.harvard.edu/abs/2022ApJ...937...72N)), Appendix C Tables 2 to 5 | Spot Einstein coefficients (the N transauroral and auroral lines, hydrogen Lyman-alpha) and the corrected O+ level set (4S-2D-2P with the printed weights 4, 10, 6) pin the transcription against the printed tables. | -| `tests/test_atomic_data.py::test_badnell_fit_magnitude_slope_and_misprint_guard` | Badnell (2006), ApJS 167, 334 (arXiv astro-ph/0604144), Eqs. 1 and 2 | The radiative recombination fit lands in the published low $10^{-13}$ cm^3 s^-1 decade at $10^{4}$ K with the published falling slope, and is explicitly discriminated against the garbled rendering of the same fit printed by Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 35), which disagrees by more than a factor 2. | +| `tests/test_atomic_data.py::test_badnell_fit_magnitude_slope_and_misprint_guard` | Badnell (2006), ApJS 167, 334 (arXiv astro-ph/0604144), Eqs. 1 and 2 | The radiative recombination fit lands in the published low $10^{-13}$ cm^3 s^-1 decade at $10^{4}$ K with the published falling slope, its six coefficients are pinned against the $Z = 7$, $N = 6$ row of the table, and it is discriminated against the garbled rendering of the same fit printed by Chatterjee & Pierrehumbert (2026, ApJ 998, 236, their Eq. 35), which disagrees by more than a factor 2 and whose $T_2$ differs from the table in the order of two digits. | ## Notes diff --git a/src/zephyrus/atomic_data.py b/src/zephyrus/atomic_data.py index 0299da51..2576f4cc 100644 --- a/src/zephyrus/atomic_data.py +++ b/src/zephyrus/atomic_data.py @@ -86,17 +86,18 @@ # Radiative recombination: the Badnell (2006, ApJS 167, 334) fit, # alpha_RR = A / [ sqrt(T/T0) (1 + sqrt(T/T0))^(1-B') (1 + sqrt(T/T1))^(1+B') ], # B' = B + C exp(-T2/T), -# implemented from the original Eqs. (1)-(2). The nitrogen coefficients -# below are the ones quoted by Chatterjee & Pierrehumbert (2026, -# arXiv:2412.05188, their Eq. 35); note that their printed equation garbles -# the Badnell form (it renders the product as a sum, repeats one exponent on -# both factors, and inverts the exponential to exp(-T/T2)), so the original -# is implemented and the printed variant disagrees by more than a factor 2 -# at 1e4 K (asserted in the companion tests so the discrepancy stays -# visible). +# implemented from the original Eqs. (1)-(2). The nitrogen coefficients below +# are read off Badnell's own table, the row Z = 7, N = 6. Chatterjee & +# Pierrehumbert (2026, ApJ 998, 236) quote the same row in their Eq. 35, but +# their printed equation garbles the Badnell form (it renders the product as +# a sum, repeats one exponent on both factors, and inverts the exponential to +# exp(-T/T2)) and their T2 reads 6.379e4 against the 6.739e4 of the table, so +# the original is the source for both the form and the numbers. The printed +# variant disagrees by more than a factor 2 at 1e4 K (asserted in the +# companion tests so the discrepancy stays visible). # --------------------------------------------------------------------------- # (T0, T1, T2 [K], A [cm^3/s], B, C) for nitrogen. -BADNELL_N = (9.467e-2, 2.954e6, 6.379e4, 6.387e-10, 0.7308, 0.2440) +BADNELL_N = (9.467e-2, 2.954e6, 6.739e4, 6.387e-10, 0.7308, 0.2440) def badnell_alpha_rr(T: float, coeffs: tuple = BADNELL_N) -> float: diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index cc6c12dd..85c0e2af 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -89,6 +89,14 @@ def test_badnell_fit_magnitude_slope_and_misprint_guard(): + (1.0 + math.sqrt(T / t1)) ** expo ) assert garbled / a4 > 2.0 + # Transcription pin: the six coefficients are the Z = 7, N = 6 row of + # Badnell's table, not the copy in the secondary that garbles the form. + # T2 is the digit-transposition trap, printed 6.739e4 and once carried + # here as 6.379e4, so it is pinned exactly rather than through a rate. + assert (t0, t1, t2) == (9.467e-2, 2.954e6, 6.739e4) + assert (a_fit, b_fit, c_fit) == (6.387e-10, 0.7308, 0.2440) + transposed = (t0, t1, 6.379e4, a_fit, b_fit, c_fit) + assert badnell_alpha_rr(5.0e4, transposed) / badnell_alpha_rr(5.0e4) > 1.02 def test_case_b_coefficients_and_temperature_scaling(): From 8d987789b4916daf94708540ffbd299dba1677e1 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:20:18 +0200 Subject: [PATCH 046/113] Correct four bibliographic records Three of the papers cited across the module and the docs have been published since the references were written and were still cited as preprints: Chatterjee and Pierrehumbert is ApJ 998, 236, Guo is Nature Astronomy 8, 920, and Gu and Chen is ApJL 953, L27. Guo's published title also differs from the preprint's. The fourth is an attribution error rather than a stale one: the sub-Neptune fractionation paper has four authors, so its in-text form is Cherubim et al. rather than a two-author citation, in seven places including the module source and the validation inventory. --- docs/Explanations/fractionation.md | 4 ++-- docs/Explanations/regimes.md | 4 ++-- docs/Validation/diagnostics.md | 2 +- docs/Validation/fractionation.md | 4 ++-- src/zephyrus/diagnostics.py | 2 +- src/zephyrus/fractionation.py | 2 +- src/zephyrus/hydrostatic.py | 2 +- src/zephyrus/knudsen.py | 4 ++-- src/zephyrus/thermostat.py | 2 +- tests/test_fractionation.py | 6 +++--- tests/test_fractionation_ensembles.py | 4 ++-- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index 4dbdd148..ae6303e7 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -14,7 +14,7 @@ where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the unique partition into escaping and retained species for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate at machine precision. -The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim & Wordsworth (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefiere (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. +The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim et al. (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefiere (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. ## Coefficients and their provenance @@ -50,7 +50,7 @@ The split follows the branch and not the label, which matters under `roche_overf [^cherubim]: Cherubim, C., Wordsworth, R., Hu, R., & Shkolnik, E. (2024). Strong Fractionation of Deuterium and Helium in Sub-Neptune Atmospheres along the Radius Valley. *The Astrophysical Journal, 967*(2), 139. https://doi.org/10.3847/1538-4357/ad3e77 -[^guchen]: Gu, P.-G., & Chen, H. (2023). Deuterium Escape on Photoevaporating Sub-Neptunes. arXiv:2308.05057. +[^guchen]: Gu, P.-G., & Chen, H. (2023). Deuterium Escape on Photoevaporating Sub-Neptunes. *The Astrophysical Journal Letters, 953*(2), L27. https://doi.org/10.3847/2041-8213/acee01 [^odert]: Odert, P., et al. (2018). Escape and fractionation of volatiles and noble gases from Mars-sized planetary embryos and growing protoplanets. *Icarus, 307*, 327–346. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 1669f9c8..c9f8ef82 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -155,7 +155,7 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 -[^cp26]: Chatterjee, R., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. arXiv:2412.05188. +[^cp26]: Chatterjee, R. D., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. *The Astrophysical Journal, 998*(2), 236. https://doi.org/10.3847/1538-4357/ae2ffa [^nakayama]: Nakayama, A., Ikoma, M., & Terada, N. (2022). Survival of Terrestrial N$_2$-O$_2$ Atmospheres in Violent XUV Environments through Efficient Atomic Line Radiative Cooling. *The Astrophysical Journal, 937*(2), 72. https://doi.org/10.3847/1538-4357/ac86ca @@ -177,7 +177,7 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^yelle]: Yelle, R. V. (2024). Diffusion limited escape of hydrogen from Mars. *Icarus, 416*, 116099. -[^guo]: Guo (2024). Characterizing regimes of hydrodynamic escape of close-in low mass exoplanets. arXiv:2405.13283. +[^guo]: Guo, J. H. (2024). Characterization of the regimes of hydrodynamic escape from low-mass exoplanets. *Nature Astronomy, 8*, 920. https://doi.org/10.1038/s41550-024-02269-w [^salz]: Salz, M., Schneider, P. C., Czesla, S., & Schmitt, J. H. M. M. (2016). Energy-limited escape revised. The transition from strong planetary winds to stable thermospheres. *Astronomy & Astrophysics, 585*, L2. https://doi.org/10.1051/0004-6361/201527042 diff --git a/docs/Validation/diagnostics.md b/docs/Validation/diagnostics.md index 431d2bb1..8018a488 100644 --- a/docs/Validation/diagnostics.md +++ b/docs/Validation/diagnostics.md @@ -8,7 +8,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the repor ## Notes -The Johnson et al. (2013, ApJL 768, L4, Eq. 10) transonic energy criterion and the Guo (2024, arXiv:2405.13283) regime triple are asserted through their published scalings and limits as physics invariants in the same file. The threshold-potential screen of Salz et al. (2016, A&A 585, L2) carries the two values of their abstract, 13.11 for the validity of energy-limited escape and about 13.6 for hydrodynamically stable thermospheres, read from the paper; the module reports the hydrogen-dominated scope of their grid beside the verdict. +The Johnson et al. (2013, ApJL 768, L4, Eq. 10) transonic energy criterion and the Guo (2024, Nat. Astron. 8, 920) regime triple are asserted through their published scalings and limits as physics invariants in the same file. The threshold-potential screen of Salz et al. (2016, A&A 585, L2) carries the two values of their abstract, 13.11 for the validity of energy-limited escape and about 13.6 for hydrodynamically stable thermospheres, read from the paper; the module reports the hydrogen-dominated scope of their grid beside the verdict. ## Anchor type diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md index ba70681e..ca0ddbd9 100644 --- a/docs/Validation/fractionation.md +++ b/docs/Validation/fractionation.md @@ -4,13 +4,13 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-spe | Test id | Reference | Scope | |---|---|---| -| `tests/test_fractionation.py::test_ternary_deuterium_reductions` | Gu & Chen (2023), Eqs. 4, 8, 9, and 12; Cherubim & Wordsworth (2024), ApJ 967, 139, Eq. 11 | The H-He-D system reproduces both branches and both critical rates exactly, including the helium admixture factor on the deuterium threshold. | +| `tests/test_fractionation.py::test_ternary_deuterium_reductions` | Gu & Chen (2023), Eqs. 4, 8, 9, and 12; Cherubim et al. (2024), ApJ 967, 139, Eq. 11 | The H-He-D system reproduces both branches and both critical rates exactly, including the helium admixture factor on the deuterium threshold. | | `tests/test_fractionation.py::test_two_majors_trace_minor_relations` | Odert et al. (2018), Icarus 307, 327, Eq. 5; Zahnle et al. (1990), Icarus 84, 502, Eqs. 35 and 36; Zahnle & Kasting (1986), Icarus 68, 462, Eq. 36 | Entrained trace minors follow the Odert relation (equal to Zahnle et al. Eq. 35) to $10^{-11}$ relative, the closure clamps exactly to zero where the printed formula goes negative, the limiting flux follows Zahnle et al. Eq. 36, and the earlier 1986 drag-deficit weighting is demonstrably NOT reproduced (the adjudication between the two printed variants). | | `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | | `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | | `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | | `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1%. | -| `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim & Wordsworth (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to $10^{-12}$ relative, with flux continuity at the crossover and exact mass conservation. | +| `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim et al. (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to $10^{-12}$ relative, with flux continuity at the crossover and exact mass conservation. | ## Notes diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index d86fbbd3..3bfd4347 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -110,7 +110,7 @@ def guo_triple( ) -> dict: """The (lambda_exo, lambda, lambda*) regime triple of Guo (2024). - Guo (2024, arXiv:2405.13283) classifies escape regimes with the Jeans + Guo (2024, Nat. Astron. 8, 920) classifies escape regimes with the Jeans parameter at the planetary radius and its Roche-corrected companion ``lambda* = lambda K(xi)``; reporting the triple beside the exobase value lets a reader translate the dispatch verdict into that taxonomy. diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index 04bf8c83..64e8c827 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -36,7 +36,7 @@ # exceed their gravitational settling). # # Exact reductions verified in the companion test suite: the two-species -# limit of Hunten et al. (1987) in the form of Cherubim & Wordsworth +# limit of Hunten et al. (1987) in the form of Cherubim et al. # (2024, ApJ 967, 139, Eqs. 7-9); the three-species deuterium system of Gu # & Chen (2023, Eqs. 4, 8, 9, 12); the trace-minor relations of Odert et # al. (2018, Icarus 307, 327, Eq. 5) and Zahnle et al. (1990, Eqs. 35, 36, diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index ff4a9e55..47f5d563 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -56,7 +56,7 @@ # - Escape temperatures: T_esc,neutral = G M m / (2 kB r), the # lambda = 2 criterion, and the plasma escape temperature at half that # value because the ambipolar field shares the ion's binding with the -# electron (Chatterjee & Pierrehumbert 2026, arXiv:2412.05188, their +# electron (Chatterjee & Pierrehumbert 2026, ApJ 998, 236, their # Eq. 34); a hydrostatic exobase hotter than half the gating escape # temperature is unstable (their Figure 10 criterion) and callers # re-route such points to the hydrodynamic branch. diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py index e2169303..a4310fbb 100644 --- a/src/zephyrus/knudsen.py +++ b/src/zephyrus/knudsen.py @@ -196,7 +196,7 @@ def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: """Density-weighted effective cross section of a mixture. ``sigma_C = sum_k n_k sigma_k / n``, the mixture weighting of - Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, their Eq. 25). + Chatterjee & Pierrehumbert (2026, ApJ 998, 236, their Eq. 25). ``vmr`` maps species to mole fractions (renormalized internally). Returns ``(sigma_C [m^2], provenance dict per species)``. """ @@ -214,7 +214,7 @@ def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: # --------------------------------------------------------------------------- # The sonic-point Knudsen switch. Chatterjee & Pierrehumbert (2026, -# arXiv:2412.05188) build the sonic-point Knudsen number from the Maxwell +# ApJ 998, 236) build the sonic-point Knudsen number from the Maxwell # mean free path 1/(sqrt(2) sigma n) against the analytic sonic-point # density scale height of their Eq. (17), # H_sc = (1 + gamma) r_sc / (4 + sqrt(2) sqrt(5 - 3 gamma)), diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py index 67e0a57a..baf0c895 100644 --- a/src/zephyrus/thermostat.py +++ b/src/zephyrus/thermostat.py @@ -33,7 +33,7 @@ # # - Atomic lines: three-level statistical equilibrium for H, C, C+, N, N+, # O, and O+ under electron impact with cool-to-space losses, the -# machinery of Chatterjee & Pierrehumbert (2026, arXiv:2412.05188, +# machinery of Chatterjee & Pierrehumbert (2026, ApJ 998, 236, # their Eqs. 26-30) on the Nakayama et al. (2022) level data; the H # system carries Lyman-alpha. # - The CO2 15 micron band and the atomic O fine structure (Johnstone et diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index f970f031..12055f5c 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -5,8 +5,8 @@ - The three-species deuterium system of Gu & Chen (2023): the escaping and retained-helium branches, both critical rates, and the helium admixture - factor on the deuterium threshold (also the ternary limit of Cherubim & - Wordsworth 2024, their Eq. 11). + factor on the deuterium threshold (also the ternary limit of Cherubim + et al. 2024, their Eq. 11). - The trace-minor relations of Odert et al. (2018, Eq. 5) and Zahnle et al. (1990, Eqs. 35, 36, 42), including the adjudication that the earlier Zahnle & Kasting (1986) Eq. (36) drag-deficit weighting is NOT @@ -73,7 +73,7 @@ def test_ternary_deuterium_reductions(): """The H-He-D system reproduces the Gu & Chen (2023) relations exactly. With helium escaping, the trace-deuterium flux matches their Eq. (4) - (equivalently Cherubim & Wordsworth 2024, Eq. 11); with helium + (equivalently Cherubim et al. 2024, Eq. 11); with helium retained, their Eq. (8); the activation thresholds match their two critical rates including the (1 + alpha_2 X_He/X_H)^-1 helium factor on the deuterium threshold, which must lower it relative to the diff --git a/tests/test_fractionation_ensembles.py b/tests/test_fractionation_ensembles.py index f96fadfb..dc20846e 100644 --- a/tests/test_fractionation_ensembles.py +++ b/tests/test_fractionation_ensembles.py @@ -6,7 +6,7 @@ configurations per test. The properties under test: - The two-species limit against the closed-form binary partition of - Cherubim & Wordsworth (2024, Eqs. 7-9), including flux continuity at the + Cherubim et al. (2024, Eqs. 7-9), including flux continuity at the crossover and exact mass conservation, over 200 random draws. - Global properties across activation thresholds on random systems: mass conservation, non-negativity (including exactly at bisected thresholds), @@ -37,7 +37,7 @@ def isofate_binary(phi, x1, x2, m1, m2, T, g0, b12): - """Closed-form two-species partition (Cherubim & Wordsworth 2024, Eqs. 7-9).""" + """Closed-form two-species partition (Cherubim et al. 2024, Eqs. 7-9).""" kT = kb_cgs * T h1 = kT / (m1 * g0) h2 = kT / (m2 * g0) From 2fa1a1a3e631bf9e86e697c1296401a995adca2f Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:21:37 +0200 Subject: [PATCH 047/113] Bound every numeric dispatch setting Only the option strings and the cooling switches were validated, so a negative efficiency or eddy diffusion coefficient changed the regime label with nothing said, and a polytropic index above the monatomic 5/3 or a negative exobase temperature surfaced as a bare math domain error from inside a branch. Each numeric knob now carries the range its closed form is defined on and a message naming the field, with the physical edges of every range still legal. --- src/zephyrus/dispatcher.py | 31 +++++++++++++++++++++++++++++++ tests/test_dispatcher.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 7ad355dc..b9410ff0 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -120,6 +120,37 @@ def validate(self) -> None: or self.cool_recombination ): raise ValueError('all cooling channels disabled; at least one must stay on') + # Numeric bounds. Outside them the closed forms leave their domains, + # and what a caller saw was a bare math domain error from inside the + # branch or, worse, a silently different regime label. + for name, value in ( + ('P_photo', self.P_photo), + ('P_base_fixed', self.P_base_fixed), + ('kn_crit', self.kn_crit), + ('T_exo_value', self.T_exo_value), + ('lambda_crit', self.lambda_crit), + ('kzz', self.kzz), + ('gamma_bates', self.gamma_bates), + ): + if not math.isfinite(value) or value <= 0.0: + raise ValueError(f'{name} must be a positive finite value, got {value!r}') + if self.kn_hysteresis < 1.0 or not math.isfinite(self.kn_hysteresis): + raise ValueError( + 'kn_hysteresis is a window factor at or above 1 (1 disables the ' + f'window), got {self.kn_hysteresis!r}' + ) + if not 0.0 < self.efficiency <= 1.0: + raise ValueError( + f'efficiency is a fraction of the deposited power, got {self.efficiency!r}' + ) + # The sonic-point scale height of Chatterjee & Pierrehumbert Eq. (17) + # carries sqrt(5 - 3 gamma), which leaves the reals above the monatomic + # 5/3. Below 1 the polytrope is no longer a wind solution. + if not 1.0 <= self.gamma_wind <= 5.0 / 3.0: + raise ValueError( + 'gamma_wind must lie in [1, 5/3], the domain of the sonic-point ' + f'scale height, got {self.gamma_wind!r}' + ) @dataclass diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 7f80fd9e..ba155b8e 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -453,6 +453,34 @@ def test_settings_and_inputs_error_contract(): cool_o_finestructure=False, cool_recombination=False, ).validate() + # Numeric knobs are bounded too. Unbounded, an out-of-domain value either + # surfaced as a bare math domain error from inside a branch or, for a + # negative efficiency, changed the regime label with nothing said. + for field, value, expected in ( + ('gamma_wind', 2.0, 'gamma_wind'), + ('T_exo_value', -100.0, 'T_exo_value'), + ('efficiency', -0.5, 'efficiency'), + ('efficiency', 5.0, 'efficiency'), + ('kn_crit', -1.0, 'kn_crit'), + ('kzz', -300.0, 'kzz'), + ('lambda_crit', -5.0, 'lambda_crit'), + ('gamma_bates', 0.0, 'gamma_bates'), + ('kn_hysteresis', 0.5, 'kn_hysteresis'), + ('P_photo', float('nan'), 'P_photo'), + ): + with pytest.raises(ValueError, match=expected): + DispatchSettings(**{field: value}).validate() + # The physical edges of each range stay legal: an isothermal wind, the + # monatomic index that is the domain limit of the sonic scale height, a + # disabled hysteresis window, and full efficiency. + for legal in ( + {'gamma_wind': 1.0}, + {'gamma_wind': 5.0 / 3.0}, + {'kn_hysteresis': 1.0}, + {'efficiency': 1.0}, + {'efficiency': 0.6}, + ): + DispatchSettings(**legal).validate() good = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0) bad_e = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, e=1.0) with pytest.raises(ValueError, match='e must be'): From 4d0d9a3fd72b9932f917736252bd6c775eb464ea Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:23:11 +0200 Subject: [PATCH 048/113] Report what the tidal factor is doing to the rate The Erkaev factor has a double root where the atmosphere fills its Roche lobe and the rates divide by it, so it raises them 83-fold at a Hill radius of 1.1 planetary radii and 670 000-fold at 1.001, with nothing beside the rate to say so. Below the root the same polynomial turns back above 1, which would reduce the rate where the tide is strongest, and the factor accepted those arguments. The domain is now enforced, the geometry where the barrier is gone is flagged rather than silently untidal, and the factor and the inflation it contributes are reported beside every rate. --- docs/Reference/results.md | 5 +++-- src/zephyrus/dispatcher.py | 19 ++++++++++++++++++- src/zephyrus/hydrodynamic.py | 17 ++++++++++++++++- tests/test_hydrodynamic.py | 11 +++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 60a896b2..eced0c77 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -80,7 +80,8 @@ The `effect` column says whether the returned rate already reflects the flag or |---|---|---|---| | `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes; the rate is the one the branch computed. | Reporting only | | `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | -| `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there. | Reporting only | +| `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | +| `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | | `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | | `stale_input` | `True` | The caller passed `atm_converged=False`, so the profile is from a non-converged atmosphere solve. | Reporting only | @@ -100,7 +101,7 @@ Eighteen groups on a typical call. Nothing in the dispatch control flow reads an | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | -| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, and which branch the rate came from. | +| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from, and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index b9410ff0..cc59987a 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -231,7 +231,22 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # branches that measure one: the energy-limited rate and the # luminosity cap on the bolometric residual. xi_ktide = r_hill / inputs.R_p - k_factor = hy.k_tide(xi_ktide) if (st.tidal and xi_ktide > 1.0) else 1.0 + # The tidal factor has a double root at xi = 1 and the rates divide by it, + # so it inflates them steeply as the lobe closes: 83-fold at xi = 1.1 and + # 6.7e5-fold at xi = 1.001. At and below the root the barrier is gone and + # the factor is undefined, so the rates are computed without it, which is + # the smaller of the two readings. Such a state is already relabeled by the + # Roche screen below; the flag says the reduction was dropped rather than + # applied, and the inflation the factor is contributing is reported beside + # the rate at every geometry so that a rate set by the divergence rather + # than by the physics is visible as such. + if st.tidal and xi_ktide <= 1.0: + k_factor = 1.0 + flags['k_tide_undefined'] = True + elif st.tidal: + k_factor = hy.k_tide(xi_ktide) + else: + k_factor = 1.0 # Step 1: bolometric candidate, computed at every point. lam_gate = bl.lambda_restricted(inputs.M_p, inputs.R_p, inputs.T_eq, photo['mmw']) @@ -429,6 +444,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: flow_radius=flow_radius, xi_flow=xi_flow, xi_ktide=xi_ktide, + k_tide=k_factor, + tidal_inflation=1.0 / k_factor, r_atmosphere=r_atm, rate_branch=branch, ) diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index 8417242d..5975cdbc 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -59,7 +59,22 @@ def hill_radius_periapsis(M_p: float, M_star: float, a: float, e: float) -> floa def k_tide(xi: float) -> float: - """Erkaev et al. (2007) Eq. (17) tidal factor; valid for xi > 1 (K(1) = 0).""" + """Erkaev et al. (2007) Eq. (17) tidal factor, for xi > 1. + + The factor is ``(xi - 1)^2 (2 xi + 1) / (2 xi^3)``, which has a double + root at ``xi = 1`` and rises toward 1 as ``xi`` grows. The energy-limited + rate divides by it, so the rate diverges as the atmosphere approaches its + Roche lobe: the factor is 1.5e-6 at xi = 1.001 and 1.2e-2 at xi = 1.1, + inflating the rate 6.7e5-fold and 83-fold. At and below the root the + polynomial turns back upward and returns values above 1, which would + reduce the rate rather than raise it, so the domain is enforced rather + than extrapolated: a caller at xi <= 1 has a planet filling its lobe and + needs the overflow machinery, not this factor. + """ + if not xi > 1.0: + raise ValueError( + f'k_tide is defined for xi > 1 and has a double root at 1, got {xi!r}' + ) return 1.0 - 3.0 / (2.0 * xi) + 1.0 / (2.0 * xi**3) diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index a77e44d7..7dbdb649 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -75,6 +75,17 @@ def test_erkaev_table1_enhancement_factors(): for xi, inv_k in ERKAEV_TABLE1: assert 1.0 / k_tide(xi) == pytest.approx(inv_k, rel=0.011, abs=0.0), xi assert 0.0 < k_tide(xi) < 1.0 + # The factor is defined only above its double root. Below it the same + # polynomial turns back upward and exceeds 1, which would reduce the + # energy-limited rate where the tide is strongest, so the domain is + # enforced rather than extrapolated. + for outside in (1.0, 0.5, 0.0, -2.0): + with pytest.raises(ValueError, match='xi > 1'): + k_tide(outside) + # Divergence at the root, which is why a near-Roche rate is flagged: + # the inflation is 83-fold at xi = 1.1 and 6.7e5-fold just above 1. + assert 1.0 / k_tide(1.1) == pytest.approx(83.2, rel=0.01, abs=0.0) + assert 1.0 / k_tide(1.001) == pytest.approx(6.68e5, rel=0.01, abs=0.0) factors = [1.0 / k_tide(xi) for xi, _ in ERKAEV_TABLE1] assert all(a >= b for a, b in zip(factors, factors[1:])) From 8d961e4b71d8c615aba369d7167e91ca48013fba Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:24:23 +0200 Subject: [PATCH 049/113] Declare the wind mean-mass convention and what it recovers Two claims about these means were wrong. They are in atomic mass units, not proton masses, and the call sites multiply by the proton mass where Lopez writes the hydrogen atom mass, a difference of four hundredths of a percent on the sound speed that is now stated rather than absorbed. And the printed H/He pair cannot be reproduced: the rule makes the per-ion mass exactly twice the per-particle one, so 1.3 halves to 0.65 and not to the printed 0.62. The test had carried a six percent tolerance to let both fit; it now pins 0.65, asserts 0.62 is excluded, and the gap is recorded as an inconsistency between the two printed entries. --- docs/Validation/hydrodynamic.md | 2 +- src/zephyrus/hydrodynamic.py | 23 ++++++++++++++++------- tests/test_hydrodynamic.py | 29 +++++++++++++++++++---------- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/docs/Validation/hydrodynamic.md b/docs/Validation/hydrodynamic.md index 92fbf809..79854e94 100644 --- a/docs/Validation/hydrodynamic.md +++ b/docs/Validation/hydrodynamic.md @@ -6,7 +6,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro |---|---|---| | `tests/test_hydrodynamic.py::test_erkaev_table1_enhancement_factors` | Erkaev et al. (2007), A&A 472, 329, Table 1 and Eq. 17 | The tidal factor reproduces all seven printed enhancement factors 1/K within 1%, falling monotonically toward 1 with xi. | | `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5% across three decades of collapse, and the complex-valued region below F_XUV/rho_p = $10^{2}$ (cgs) is rejected with a flag rather than evaluated. | -| `tests/test_hydrodynamic.py::test_wind_mean_masses_reproduce_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed H/He pair (0.62, 1.3) and steam pair (3, 6) in proton masses. | +| `tests/test_hydrodynamic.py::test_wind_mean_masses_against_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed steam pair (3, 6) in atomic mass units and the per-ion entry 1.3 of the printed H/He pair. The per-particle entry 0.62 of that pair is not reachable: the rule makes the per-ion mass exactly twice the per-particle mass, so 1.3 halves to 0.65, and the 4.6 percent gap is an inconsistency between the two printed entries rather than an error in the rule. The test pins 0.65 and asserts 0.62 is excluded, so a future tolerance cannot absorb the difference. | | `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5%), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers ($10^{-4}$ and $10^{-5}$ at 450 and $5 \times 10^{5}$ erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | ## Notes diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index 5975cdbc..e90f87df 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -296,13 +296,22 @@ def caldiroli_efficiency(F_xuv: float, M_p: float, R_p: float, K: float) -> tupl def wind_mean_masses(element_fractions: dict) -> tuple[float, float]: - """(mu_wind, mu_plus) of an ionized wind, in proton masses. - - Generalizes the printed mean-mass pairs of Lopez (2017): with hydrogen - fully ionized, heavier atoms singly ionized, and the electrons counted - among the particles, the mean mass per particle is half the mean atomic - mass and the mean mass per ion is the mean atomic mass itself. The rule - reproduces Lopez's printed H/He pair (0.62, 1.3) and steam pair (3, 6). + """(mu_wind, mu_plus) of an ionized wind, in atomic mass units. + + Generalizes the mean-mass pairs of Lopez (2017): with hydrogen fully + ionized, heavier atoms singly ionized, and the electrons counted among + the particles, the mean mass per particle is half the mean atomic mass + and the mean mass per ion is the mean atomic mass itself. + + Two conventions to keep straight. The returned values are in atomic mass + units, and the call sites multiply by the proton mass where Lopez writes + the hydrogen atom mass; the three candidate units span 0.36 percent on + the sound speed, and the proton mass sits 0.04 percent from Lopez's own. + And Lopez's printed pairs are not both reachable: the rule makes the + per-ion mass exactly twice the per-particle mass, so the printed steam + pair (3, 6) is recovered while the printed H/He pair (0.62, 1.3) is + internally inconsistent by 4.6 percent, 1.3 halving to 0.65. The rule + follows the per-ion value and the tests pin that reading. """ mbar = sum(x * ELEMENT_AMU[el] for el, x in element_fractions.items()) return mbar / 2.0, mbar diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index 7dbdb649..6489b018 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -121,22 +121,31 @@ def test_caldiroli_fit_spot_values_and_flux_guard(): @pytest.mark.reference_pinned -def test_wind_mean_masses_reproduce_lopez_pairs(): - """The ionized-wind mean-mass rule reproduces the published pairs. - - Lopez (2017) prints (mu_wind, mu_plus) = (0.62, 1.3) proton masses for - a 90/10 H/He wind and (3, 6) for steam (fully dissociated 2:1 H:O). - The generalized rule (electrons counted, heavies singly ionized) must - recover both, and the per-ion mass must always be twice the per-particle - mass by construction. +def test_wind_mean_masses_against_lopez_pairs(): + """The mean-mass rule recovers the published pairs it can recover. + + Lopez (2017) prints (mu_wind, mu_plus) = (0.62, 1.3) for a 90/10 H/He + wind and (3, 6) for steam (fully dissociated 2:1 H:O), in atomic mass + units. The rule counts electrons and singly ionizes the heavies, which + makes the per-ion mass exactly twice the per-particle mass, so the steam + pair is recovered on both entries while the H/He pair cannot be: 1.3 + halves to 0.65, not to the printed 0.62, a 4.6 percent inconsistency in + the source. The rule follows the per-ion value, which is the entry both + printed pairs agree with, and this test pins that reading rather than + widening a tolerance until both fit. """ mu_w, mu_i = wind_mean_masses({'H': 0.9, 'He': 0.1}) - assert mu_w == pytest.approx(0.62, rel=0.06, abs=0.0) - assert mu_i == pytest.approx(1.3, rel=0.02, abs=0.0) + assert mu_i == pytest.approx(1.3, rel=0.01, abs=0.0) + assert mu_w == pytest.approx(0.65373, rel=1e-4, abs=0.0) + assert mu_w != pytest.approx(0.62, rel=0.01, abs=0.0) mu_w, mu_i = wind_mean_masses({'H': 2.0 / 3.0, 'O': 1.0 / 3.0}) assert mu_w == pytest.approx(3.0, rel=0.01, abs=0.0) assert mu_i == pytest.approx(6.0, rel=0.01, abs=0.0) assert mu_i == pytest.approx(2.0 * mu_w, rel=1e-12, abs=0.0) + # Unit convention: the values are in atomic mass units, so a bare atom + # comes back as its own standard atomic weight and not as a mass in kg. + assert wind_mean_masses({'H': 1.0})[1] == pytest.approx(1.008, rel=1e-12, abs=0.0) + assert wind_mean_masses({'O': 1.0})[1] == pytest.approx(15.999, rel=1e-12, abs=0.0) @pytest.mark.physics_invariant From a723c6ef1e5437fdf9ded462fa46ed126a8e7dcc Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:26:24 +0200 Subject: [PATCH 050/113] Scope every flag to the branch that produced the rate The hydrodynamic candidates are computed on every call, so their cautions about the wind temperature, the sonic radius, and the fitted efficiency rode along on verdicts whose rate came from somewhere else: a bolometric result carried a subcritical-sonic warning about a rate it did not dispatch. Those warnings now merge only when a hydrodynamic branch wins the route, and the bolometric residual clears them again when it displaces that winner. In the same pass the exobase temperature mode leaves the flags dictionary for the diagnostics, since it echoes a setting rather than warning about anything, which is what the other two settings echoes did earlier. --- docs/Reference/results.md | 4 ++- src/zephyrus/dispatcher.py | 24 ++++++++++++----- tests/test_dispatcher.py | 53 ++++++++++++++++++++++++++++++++++---- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index eced0c77..4dc6368e 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -82,6 +82,8 @@ The `effect` column says whether the returned rate already reflects the flag or | `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | + +Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | | `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | | `stale_input` | `True` | The caller passed `atm_converged=False`, so the profile is from a non-converged atmosphere solve. | Reporting only | @@ -96,7 +98,7 @@ Eighteen groups on a typical call. Nothing in the dispatch control flow reads an |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | -| `hydrostatic` | `rate_kg_s`, `T_exo`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | +| `hydrostatic` | `rate_kg_s`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | | `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index cc59987a..4dca1153 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -279,21 +279,28 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: t_wind, thermo = th.solve_wind_temperature( inputs.T_eq, base, elements, inputs.F_xuv, **channels ) + # Warnings about the hydrodynamic candidates are held aside and merged + # only if one of them wins the route. A warning about the wind + # temperature or the sonic radius describes a rate that a bolometric or + # hydrostatic verdict did not dispatch, and the flags dictionary is read + # as a warning set about the result. What the losing candidate did is + # still in diag['hydrodynamic']. + hydro_flags: dict = {} if thermo.get('clamped'): - flags['thermostat_clamped'] = thermo['clamped'] + hydro_flags['thermostat_clamped'] = thermo['clamped'] rr = hy.rr_chain(inputs.M_p, inputs.F_xuv, base['r'], t_wind, elements) if rr['subcritical']: - flags['subcritical_sonic'] = True + hydro_flags['subcritical_sonic'] = True eps = st.efficiency if st.efficiency_mode == 'caldiroli': eta_eff, cf = hy.caldiroli_efficiency(inputs.F_xuv, inputs.M_p, inputs.R_p, k_factor) - flags.update(cf) + hydro_flags.update(cf) if eta_eff is not None: # Their efficiency is defined against an R_p^3 rate geometry. eps = eta_eff * (inputs.R_p / r_xuv) ** 2 else: - flags['efficiency_fallback_fixed'] = True + hydro_flags['efficiency_fallback_fixed'] = True mdot_el = hy.el_rate(eps, inputs.F_xuv, inputs.R_p, r_xuv, inputs.M_p, k_factor) mdot_rr = rr['mdot_rr'] el_won = mdot_el <= mdot_rr @@ -348,8 +355,6 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # Step 4: hydrostatic branch (always evaluated: its exobase quantities # feed the diagnostics at every dispatch). t_exo = _resolve_t_exo(inputs, channels) - if st.T_exo_mode == 'thermostat': - flags['T_exo_thermostat'] = True hs_per_element, hsd = hs.hydrostatic_rates( inputs.profile, inputs.M_p, t_exo, gamma_bates=st.gamma_bates, kzz_default=st.kzz ) @@ -368,6 +373,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['hydrostatic'] = dict( rate_kg_s=mdot_hs, T_exo=hsd['T_exo'], + T_exo_mode=st.T_exo_mode, r_exo=hsd['r_exo'], f_plus_exo=f_plus_exo, T_esc_neutral=hsd['T_esc_neutral'], @@ -402,11 +408,13 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) + flags.update(hydro_flags) elif unstable: branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) flags['gate_rerouted'] = True + flags.update(hydro_flags) else: branch = 'hydrostatic' rate = mdot_hs @@ -420,6 +428,10 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: per_species = None flags['bolometric_residual'] = True flow_radius = bolo['R_sonic'] + # The residual displaces whichever candidate had won, so the + # warnings about that candidate stop describing the result. + for key in tuple(hydro_flags) + ('hydrostatic_lower_limit',): + flags.pop(key, None) label = branch # Step 5: the Roche screen on the active flow radius. The screen renames diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index ba155b8e..9374d263 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -534,13 +534,15 @@ def test_caldiroli_efficiency_mode_applies_and_falls_back(): assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx(0.1, rel=1e-12, abs=0.0) -def test_t_exo_thermostat_mode_estimates_and_flags(): - """The thermostat exobase mode estimates a temperature and flags itself. +def test_t_exo_thermostat_mode_estimates_and_reports_itself(): + """The thermostat exobase mode estimates a temperature and records itself. On the bound CO2 case the estimator returns a temperature inside the thermostat bracket (above the equilibrium temperature, below the upper - bracket edge), the flag records the mode, and the dispatch completes - with a consistent per-species sum. + bracket edge), the diagnostics record which mode produced it, and the + dispatch completes with a consistent per-species sum. The mode is a + property of the call and not a warning about it, so it belongs in the + diagnostics and not in the flags dictionary. """ settings = DispatchSettings(T_exo_mode='thermostat') res = dispatch( @@ -548,7 +550,13 @@ def test_t_exo_thermostat_mode_estimates_and_flags(): 10 * Me, 1.8 * Re, 800.0, {'CO2': 1.0}, F_xuv=1.0, a=0.5 * AU, settings=settings ) ) - assert res.flags.get('T_exo_thermostat') is True + assert res.diagnostics['hydrostatic']['T_exo_mode'] == 'thermostat' + assert 'T_exo_thermostat' not in res.flags + prescribed = dispatch( + _inputs(10 * Me, 1.8 * Re, 800.0, {'CO2': 1.0}, F_xuv=1.0, a=0.5 * AU) + ) + assert prescribed.diagnostics['hydrostatic']['T_exo_mode'] == 'prescribed' + assert prescribed.diagnostics['hydrostatic']['T_exo'] != res.diagnostics['hydrostatic']['T_exo'] assert 800.0 <= res.diagnostics['hydrostatic']['T_exo'] <= 5.0e4 if res.mdot > 0.0: assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-6, abs=0.0) @@ -621,3 +629,38 @@ def test_settings_option_raises_cover_every_knob(): with pytest.raises(ValueError, match='T_exo_mode'): DispatchSettings(T_exo_mode='nonsense').validate() DispatchSettings().validate() # the defaults are a valid configuration + + +def test_flags_describe_the_branch_that_produced_the_rate(): + """A warning never survives onto a verdict its rate did not come from. + + The flags dictionary is read as a warning set about the returned result, + so a caution about the wind temperature or the sonic radius must not ride + along on a bolometric or hydrostatic verdict, whose rate those quantities + did not set. The hydrodynamic candidates are always computed, because the + diagnostics report them at every dispatch, which is what makes the + scoping necessary rather than automatic. + """ + hydro = dispatch(_inputs(Me, Re, 1000.0, {'N2': 0.8, 'O2': 0.2}, F_xuv=100.0, a=0.0775 * AU)) + assert hydro.regime.startswith('hydrodynamic') + assert hydro.flags.get('subcritical_sonic') is True + boiloff = dispatch( + _inputs(Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU) + ) + assert boiloff.regime == 'boiloff' + # The same chain runs on this state and still reports subcritical in the + # diagnostics, but the dispatched rate is the bolometric one. + assert boiloff.diagnostics['hydrodynamic']['rr_chain']['R_s'] > 0.0 + for leaked in ( + 'subcritical_sonic', + 'thermostat_clamped', + 'efficiency_fallback_fixed', + 'hydrostatic_lower_limit', + ): + assert leaked not in boiloff.flags, leaked + # The hydrostatic lower-limit caution appears on, and only on, a + # hydrostatic verdict. + static = dispatch(_inputs(Me, Re, 1000.0, {'CO2': 1.0}, F_xuv=0.1, a=0.0775 * AU)) + assert static.regime == 'hydrostatic' + assert static.flags.get('hydrostatic_lower_limit') is True + assert 'subcritical_sonic' not in static.flags From 393321cb1a17b57ea497305323f9792414c486aa Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 22:27:49 +0200 Subject: [PATCH 051/113] Define the rate floor once The floor had two definitions under one name, in the diagnostics that report it and in the hydrostatic branch that prunes against it, the second hardcoding the proton mass instead of reading it from the constants. It now lives with the other constants and both read it from there. The same pass replaces the en-dash placeholders in the parameter tables, which the repository voice rules do not allow outside bibliographic page ranges, with the ranges the settings validator now enforces. --- docs/Reference/parameters.md | 45 ++++++++++++++++++------------------ src/zephyrus/constants.py | 6 +++++ src/zephyrus/diagnostics.py | 9 +++----- src/zephyrus/hydrostatic.py | 11 +++++---- 4 files changed, 38 insertions(+), 33 deletions(-) diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 20e0d715..f262622f 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -16,6 +16,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `h_planck` | $h$ | $6.62607015 \times 10^{-34}$ (exact) | J s | | `m_p` | $m_p$ | $1.67262192369 \times 10^{-27}$ | kg | | `amu` | $u$ | $1.66053906660 \times 10^{-27}$ | kg | +| `rate_floor` | none | $5.300219 \times 10^{-35}$ | kg s⁻¹ | ## Unit conversions (`constants.py`) @@ -40,7 +41,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `Rs` | $R_\odot$ | $6.957 \times 10^{8}$ | m | | `Ms` | $M_\odot$ | $1.98847 \times 10^{30}$ | kg | | `Ls` | $L_\odot$ | $3.828 \times 10^{26}$ | W | -| `age_sun` | – | $4.603 \times 10^{9}$ | yr | +| `age_sun` | none | $4.603 \times 10^{9}$ | yr | ### Earth @@ -49,12 +50,12 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For |---|---|---|---| | `Re` | $R_\oplus$ | $6.378 \times 10^{6}$ | m | | `Me` | $M_\oplus$ | $5.9722 \times 10^{24}$ | kg | -| `Me_atm` | – | $5.15 \times 10^{18}$ | kg | +| `Me_atm` | none | $5.15 \times 10^{18}$ | kg | | `Fxuv_earth_10Myr` | $F_\mathrm{XUV,\oplus}(10\,\mathrm{Myr})$ | $14.67$ | W m⁻² | | `Fxuv_earth_today` | $F_\mathrm{XUV,\oplus}$ | $4.64 \times 10^{-3}$ | W m⁻² | -| `age_earth` | – | $4.543 \times 10^{9}$ | yr | -| `e_earth` | – | $0.017$ | – | -| `a_earth` | – | $1$ | au | +| `age_earth` | none | $4.543 \times 10^{9}$ | yr | +| `e_earth` | none | $0.017$ | dimensionless | +| `a_earth` | none | $1$ | au | `Fxuv_earth_10Myr` is taken from Fig. 9 of Wordsworth et al. (2018). @@ -100,36 +101,36 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | What happens when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Profiles reaching below 1 nanobar never engage it. | | `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023). | | `P_base_fixed` | 5.0 | Pa | Base pressure for the `'fixed_pressure'` method only. | -| `kn_crit` | 1.0 | – | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | -| `kn_hysteresis` | 1.5 | – | Hysteresis window factor around `kn_crit`, consumed only when a previous regime label is supplied. | +| `kn_crit` | 1.0 | $> 0$ | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | +| `kn_hysteresis` | 1.5 | $\geq 1$ (1 disables the window) | Hysteresis window factor around `kn_crit`, consumed only when a previous regime label is supplied. | | `gate` | `'neutral'` | `'neutral'`, `'plasma'` | Which escape temperature gates the hydrostatic branch; both are always computed and disagreements are flagged as contested. | -| `efficiency` | 0.1 | – | Energy-limited heating efficiency $\epsilon$. | +| `efficiency` | 0.1 | $0 < \epsilon \leq 1$ | Energy-limited heating efficiency $\epsilon$. | | `efficiency_mode` | `'fixed'` | `'fixed'`, `'caldiroli'` | Fixed $\epsilon$, or the Caldiroli et al. (2022) fitted efficiency converted to the Erkaev geometry, with a guarded fallback below its validity bound. | | `T_exo_mode` | `'prescribed'` | `'prescribed'`, `'thermostat'` | Exobase temperature source. The prescribed value is the hydrostatic branch's dominant sensitivity; the thermostat estimator is biased high by construction. | | `T_exo_value` | 1000 | K | The prescribed exobase temperature. | -| `cool_atomic` | `True` | – | Atomic line cooling (H, C, C+, N, N+, O, O+) in the wind thermostat. | -| `cool_co2_band` | `True` | – | CO2 15 micron band cooling (deexcitation rates measured over roughly 150 to 500 K). | -| `cool_o_finestructure` | `True` | – | Atomic O fine-structure cooling at 63 and 147 micron. | -| `cool_recombination` | `True` | – | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | -| `fractionate` | `True` | – | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | -| `tidal` | `True` | – | Apply the Erkaev et al. (2007) tidal factor to the energy-limited candidate. | -| `lambda_crit` | 20.0 | – | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | -| `gamma_bates` | 0.75 | – | Shape parameter of the Bates temperature profile of the extended upper structure. | +| `cool_atomic` | `True` | `True`, `False` | Atomic line cooling (H, C, C+, N, N+, O, O+) in the wind thermostat. | +| `cool_co2_band` | `True` | `True`, `False` | CO2 15 micron band cooling (deexcitation rates measured over roughly 150 to 500 K). | +| `cool_o_finestructure` | `True` | `True`, `False` | Atomic O fine-structure cooling at 63 and 147 micron. | +| `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | +| `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | +| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor to the energy-limited candidate. | +| `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | +| `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | -| `gamma_wind` | 1.0 | – | Polytropic index at the sonic point (1 for an isothermal wind). | +| `gamma_wind` | 1.0 | $1 \leq \gamma \leq 5/3$ | Polytropic index at the sonic point (1 for an isothermal wind). | ## Dispatcher inputs (`dispatcher.EscapeInputs`) | Name | Units | Meaning | |---|---|---| | `M_p`, `R_p` | kg, m | Planet (interior) mass and radius. | -| `M_star`, `a`, `e` | kg, m, – | Stellar mass, semi-major axis, eccentricity (the Hill radius is evaluated at periapsis). | +| `M_star`, `a`, `e` | kg, m, dimensionless | Stellar mass, semi-major axis, eccentricity (the Hill radius is evaluated at periapsis). | | `T_eq` | K | Equilibrium temperature; the boil-off wind runs at $T_\mathrm{eq} / 2^{1/4}$. | | `F_xuv`, `F_bol`, `F_int` | W m⁻² | XUV flux, bolometric instellation, and interior heat flux (the luminosity cap). | | `kappa_photo` | m² kg⁻¹ | Photospheric opacity; the boil-off rate scales as its inverse. | -| `profile` | – | `profiles.Profile`: pressure, radius, temperature, per-species mixing ratios, and mean molecular mass per level, base to top. | -| `settings` | – | The `DispatchSettings` block above. | -| `prev_regime` | – | Optional previous regime label; activates the hysteresis window. | -| `atm_converged` | – | Optional data-quality flag, surfaced as `stale_input`. | +| `profile` | not applicable | `profiles.Profile`: pressure, radius, temperature, per-species mixing ratios, and mean molecular mass per level, base to top. | +| `settings` | not applicable | The `DispatchSettings` block above. | +| `prev_regime` | not applicable | Optional previous regime label; activates the hysteresis window. | +| `atm_converged` | not applicable | Optional data-quality flag, surfaced as `stale_input`. | | `age`, `reservoirs` | s, kg | Optional; consumed only by the snapshot self-consistency screen and the unfractionated split. | | `dt` | s | Optional; carried for the caller's supply cap, never used by the dispatcher itself. | diff --git a/src/zephyrus/constants.py b/src/zephyrus/constants.py index 6b048708..175b0006 100644 --- a/src/zephyrus/constants.py +++ b/src/zephyrus/constants.py @@ -14,6 +14,12 @@ m_p = 1.67262192369e-27 # Proton mass (CODATA 2018) [kg] amu = 1.66053906660e-27 # Atomic mass constant (CODATA 2018) [kg] +# One proton crossing the planetary surface per Julian year: the smallest +# mass-loss rate with physical content on any planetary reservoir. Reported +# beside every escape verdict and never applied, since whether a rate is +# negligible is the caller's decision. +rate_floor = m_p / 3.15576e7 # Rate floor [kg s-1] + ######################################### Units conversions ######################################### s2yr = 1/(3600*24*365) # convert [seconds] to [years] erg2joule = 1e-7 # convert [ergs] to [Joules] diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index 3bfd4347..dbf0c795 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -10,7 +10,7 @@ import numpy as np -from zephyrus.constants import G, kb, m_p +from zephyrus.constants import G, kb, rate_floor from zephyrus.hydrodynamic import k_tide from zephyrus.knudsen import mean_free_path, sigma_mixture from zephyrus.planets_parameters import Mjup, Rjup @@ -54,11 +54,8 @@ CALDIROLI_THRESHOLD_LOG_PHI = (12.9, 13.2) SALZ_SCREEN_LOG_PHI = (13.11, 13.6) -# One proton crossing the planet's surface per Julian year, the smallest -# mass-loss rate with physical content. Reported beside every verdict so a -# caller need not carry the number, and never applied: whether a rate is -# negligible is the caller's decision. -RATE_FLOOR_KG_S = m_p / 3.15576e7 +# The published name of the rate floor, defined once in constants. +RATE_FLOOR_KG_S = rate_floor def q_net_over_qc( diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index 47f5d563..76176467 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -13,6 +13,7 @@ from zephyrus.composition import ELEMENT_AMU, parse_formula, species_mass_amu from zephyrus.constants import G, amu, kb +from zephyrus.constants import rate_floor as RATE_FLOOR_KG_S from zephyrus.diffusion import b_mixture from zephyrus.knudsen import sigma_mixture @@ -68,11 +69,11 @@ ALPHA_THERMAL = -0.25 # thermal diffusion factor (Yelle 2024, after Banks & Kockarts) -# Rates below one proton mass per Julian year are numerical artifacts on -# any planetary reservoir; species whose supply-free Jeans rate already -# sits below this floor skip the diffusion integrals (their harmonic-mean -# rate could only be smaller). -RATE_FLOOR_KG_S = 1.67262192369e-27 / 3.15576e7 +# Rates below one proton mass per Julian year are numerical artifacts on any +# planetary reservoir; species whose supply-free Jeans rate already sits below +# that floor skip the diffusion integrals, since their harmonic-mean rate +# could only be smaller. The constant itself is defined once, in diagnostics, +# which is where it is reported from. def volkov_flat_factor(lam: float) -> float: From 0c5a8a995ef5685c4d9507623a0d4134d8abc3ce Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:36:04 +0200 Subject: [PATCH 052/113] Catch a malformed profile where it enters A comparison against NaN is false, so the positivity tests passed a non-finite temperature, mean mass, or mixing ratio straight through, and it surfaced wherever the value was first combined with something else: a NaN at the profile top came back as an error about the tidal factor's domain, naming the orbit instead of the profile. Every array is now checked for finiteness before its sign, a level with no species present is rejected, and a mixing ratio negative beyond solver noise is rejected while noise-scale negatives still pass, since a chemistry solver returns those where a species is absent. The mixture cross section normalizes over the species it sums over, so a negative entry can no longer shrink the denominator and inflate the result. --- src/zephyrus/knudsen.py | 14 ++++++++----- src/zephyrus/profiles.py | 34 +++++++++++++++++++++++++----- tests/test_knudsen.py | 22 ++++++++++++++++++++ tests/test_profiles.py | 45 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py index a4310fbb..fd1d792c 100644 --- a/src/zephyrus/knudsen.py +++ b/src/zephyrus/knudsen.py @@ -197,15 +197,19 @@ def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: ``sigma_C = sum_k n_k sigma_k / n``, the mixture weighting of Chatterjee & Pierrehumbert (2026, ApJ 998, 236, their Eq. 25). - ``vmr`` maps species to mole fractions (renormalized internally). + ``vmr`` maps species to mole fractions, renormalized internally over the + species that are actually present: the normalization runs over the same + positive weights the sum runs over, so a negative entry cannot shrink the + denominator and inflate the result. A mixture with nothing present raises. Returns ``(sigma_C [m^2], provenance dict per species)``. """ - tot = sum(vmr.values()) + present = {sp: x for sp, x in vmr.items() if x > 0.0} + tot = sum(present.values()) + if tot <= 0.0: + raise ValueError('no species has a positive mole fraction') sig = 0.0 prov: dict[str, str] = {} - for sp, x in vmr.items(): - if x <= 0.0: - continue + for sp, x in present.items(): s, p = sigma_species(sp, T) sig += (x / tot) * s prov[sp] = p diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index 21de6272..3ce3c35c 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -13,6 +13,11 @@ from zephyrus.composition import atomize, species_mass_amu from zephyrus.constants import G, amu, kb +# Mixing ratios below zero by less than this are treated as solver noise; a +# chemistry or transport solver can return a small negative mole fraction +# where a species is absent, and a coupled run must not die on it. +VMR_NOISE_FLOOR = 1.0e-12 + # Murray-Clay et al. (2009, ApJ 693, 23) photoionization cross section at # their representative 20 eV photon energy: sigma_nu0 = 6e-18 (h nu / 13.6 # eV)^-3 cm^2. Converted to m^2. Used by the Lopez (2017) wind-base pressure. @@ -51,20 +56,39 @@ def validate(self) -> None: Pressure must decrease and radius increase strictly with index; temperature is unconstrained beyond positivity. Every mixing-ratio - array must share the level count. + array must share the level count, be finite, and be non-negative. + + Finiteness is checked before the sign comparisons, because a + comparison against NaN is false and a NaN would otherwise pass every + positivity test and surface far downstream as an error naming some + unrelated quantity. Mixing ratios below zero by less than + ``VMR_NOISE_FLOOR`` are solver noise and pass; the consumers ignore + non-positive weights and renormalize over the rest. """ - p, r, T = map(np.asarray, (self.p, self.r, self.T)) - if not (len(p) == len(r) == len(T) == len(self.mmw)): + p, r, T, mmw = map(np.asarray, (self.p, self.r, self.T, self.mmw)) + if not (len(p) == len(r) == len(T) == len(mmw)): raise ValueError('profile arrays must share one length') if len(p) < 3: raise ValueError('profile needs at least 3 levels') + for name, arr in (('p', p), ('r', r), ('T', T), ('mmw', mmw)): + if not np.all(np.isfinite(arr)): + raise ValueError(f'{name} carries a non-finite value') if not (np.all(np.diff(p) < 0) and np.all(np.diff(r) > 0)): raise ValueError('p must decrease and r increase strictly with index') - if np.any(p <= 0) or np.any(T <= 0) or np.any(np.asarray(self.mmw) <= 0): + if np.any(p <= 0) or np.any(T <= 0) or np.any(mmw <= 0): raise ValueError('p, T, mmw must be positive') for sp, x in self.vmr.items(): - if len(np.asarray(x)) != len(p): + arr = np.asarray(x, dtype=float) + if len(arr) != len(p): raise ValueError(f'vmr[{sp}] length mismatch') + if not np.all(np.isfinite(arr)): + raise ValueError(f'vmr[{sp}] carries a non-finite value') + if np.any(arr < -VMR_NOISE_FLOOR): + raise ValueError(f'vmr[{sp}] is negative beyond solver noise') + if self.vmr: + total = sum(np.clip(np.asarray(x, dtype=float), 0.0, None) for x in self.vmr.values()) + if np.any(np.asarray(total) <= 0.0): + raise ValueError('every level needs at least one species present') def isothermal_profile( diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index 04a2b9aa..fae6e5f4 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -210,3 +210,25 @@ def test_hysteresis_window_moves_the_threshold_the_right_way(): assert effective_threshold(1.0, 1.5, 'boiloff') == pytest.approx(1.0) # The printed diagnostic band brackets the default threshold of 1. assert KN_BAND[0] < 1.0 <= KN_BAND[1] + + +@pytest.mark.physics_invariant +def test_sigma_mixture_normalizes_over_what_is_present(): + """The weighting normalizes over the same weights it sums. + + A negative mole fraction must not shrink the denominator while being + skipped in the numerator: that inflates the cross section without bound + and biases the Knudsen switch toward calling a point hydrodynamic. A + mixture whose only positive entry is one species must therefore give + exactly that species' value. + """ + pure, _ = sigma_mixture({'CO2': 1.0}, 1.0e4) + with_noise, _ = sigma_mixture({'CO2': 1.5, 'H2': -0.5}, 1.0e4) + assert with_noise == pytest.approx(pure, rel=1e-15, abs=0.0) + # Unnormalized positive weights are scale free, as a mole fraction is. + scaled, _ = sigma_mixture({'CO2': 2.0, 'H2': 2.0}, 1.0e4) + unit, _ = sigma_mixture({'CO2': 0.5, 'H2': 0.5}, 1.0e4) + assert scaled == pytest.approx(unit, rel=1e-15, abs=0.0) + # A mixture with nothing in it has no cross section to report. + with pytest.raises(ValueError, match='positive mole fraction'): + sigma_mixture({'CO2': 0.0, 'H2': -1e-20}, 1.0e4) diff --git a/tests/test_profiles.py b/tests/test_profiles.py index f47feef4..8e3d4f12 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -331,3 +331,48 @@ def compute_mass_loss_parameters(self, m, r, t): fake.MassLoss = SkippedMassLoss lev_f, flags_f = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert flags_f.get('base_method_fallback') == 'lopez' + + +@pytest.mark.physics_invariant +def test_validate_rejects_non_finite_and_negative_entries(): + """A non-finite or negative entry is caught here, not far downstream. + + A comparison against NaN is false, so a positivity test alone passes a + NaN through, and it then surfaces wherever the value is first combined + with something else, under a message naming an unrelated quantity. Every + array is therefore checked for finiteness before its sign. Mixing ratios + slightly below zero are solver noise and pass, because a chemistry solver + can return one where a species is absent and a coupled run must not die + on it; a genuinely negative mole fraction is rejected. + """ + n = 5 + base = dict( + p=np.geomspace(1e7, 1e-5, n), + r=np.linspace(6.378e6, 8.0e6, n), + T=np.full(n, 500.0), + vmr={'CO2': np.full(n, 1.0)}, + mmw=np.full(n, 44.0095 * amu), + kzz=None, + ) + Profile(**base).validate() # the well-posed case still passes + for field, bad, match in ( + ('T', np.array([500.0, 500.0, np.nan, 500.0, 500.0]), 'T carries a non-finite'), + ('T', np.array([500.0, 500.0, np.inf, 500.0, 500.0]), 'T carries a non-finite'), + ('mmw', np.array([7.3e-26] * 2 + [np.nan] + [7.3e-26] * 2), 'mmw carries a non-finite'), + ('p', np.array([1e7, 1e3, np.nan, 1e-1, 1e-5]), 'p carries a non-finite'), + ('r', np.array([6.4e6, 6.8e6, np.inf, 7.6e6, 8.0e6]), 'r carries a non-finite'), + ): + with pytest.raises(ValueError, match=match): + Profile(**{**base, field: bad}).validate() + with pytest.raises(ValueError, match='non-finite'): + Profile(**{**base, 'vmr': {'CO2': np.array([1.0, 1.0, np.nan, 1.0, 1.0])}}).validate() + with pytest.raises(ValueError, match='negative beyond solver noise'): + Profile( + **{**base, 'vmr': {'CO2': np.full(n, 1.5), 'H2': np.full(n, -0.5)}} + ).validate() + with pytest.raises(ValueError, match='at least one species'): + Profile(**{**base, 'vmr': {'CO2': np.zeros(n), 'H2': np.zeros(n)}}).validate() + # Solver noise passes, and the consumers ignore it. + Profile( + **{**base, 'vmr': {'CO2': np.full(n, 1.0), 'H2': np.full(n, -1e-16)}} + ).validate() From 546acb157554cb644e026e80ebf59e869be1acb8 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:38:12 +0200 Subject: [PATCH 053/113] Stop the profile top at the last bound level Two off-by-one defects at the top of a profile. The isothermal generator truncated one level too late, returning as its top the first level that failed its own bound-structure test: a truncated hydrogen profile ended at a Jeans parameter of 2.19 against the 2.2 the guard enforces, and that level is what the exobase anchor reads. And the radius-to-pressure lookup clamped silently outside the column, so a BOREAS radius above the profile top came back as the top pressure, the caller's clamp test compared that value against itself, and neither the clamp flag nor its distance could ever fire. The lookup now reports whether the radius was covered, and an uncovered one carries the isothermal extrapolation, which saturates at the top-level Jeans parameter instead of falling without bound. --- src/zephyrus/profiles.py | 42 +++++++++++++++++++++++++++++++++++----- tests/test_profiles.py | 40 +++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index 3ce3c35c..06564aaf 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -6,6 +6,7 @@ from __future__ import annotations +import math from dataclasses import dataclass import numpy as np @@ -142,7 +143,11 @@ def isothermal_profile( H = kb * T * r[i] ** 2 / (G * M_p * mu) r[i + 1] = r[i] - H * (lnp[i + 1] - lnp[i]) if G * M_p * mu / (kb * T * r[i + 1]) < 2.2: - last = i + 1 + # Stop at the last level that is still bound. Keeping the level + # that failed the test would put the profile's top exactly where + # the guard exists to exclude, and the top level is what the + # exobase anchor reads. + last = i break if last < 2: raise ValueError('isothermal profile unbound at the surface; check inputs') @@ -184,13 +189,18 @@ def interp_at_pressure(profile: Profile, p_target: float) -> dict: ) -def pressure_at_radius(profile: Profile, r_target: float) -> float: +def pressure_at_radius(profile: Profile, r_target: float) -> tuple[float, bool]: """Pressure interpolated at a target radius, log-linear in pressure. - Clamps to the endpoint pressures outside the covered radius range. + Returns ``(p, covered)``. Outside the covered radius range the pressure + clamps to the nearest endpoint and ``covered`` is False, so a caller can + tell an interpolated level from a clamped one rather than receiving an + endpoint that looks like a solution. """ lp = np.log(profile.p) - return float(np.exp(np.interp(r_target, profile.r, lp))) + r0, r1 = float(profile.r[0]), float(profile.r[-1]) + covered = min(r0, r1) <= r_target <= max(r0, r1) + return float(np.exp(np.interp(r_target, profile.r, lp))), covered def photospheric_level(profile: Profile, p_photo: float = 2000.0) -> tuple[dict, dict]: @@ -346,11 +356,33 @@ def _boreas_base_pressure(profile: Profile, M_p: float, scalars: dict | None) -> if result.get('regime') == 'SKIPPED' or 'RXUV' not in result: return None r_xuv = float(result['RXUV']) * 1e-2 # cm -> m - return pressure_at_radius(profile, r_xuv) + p_xuv, covered = pressure_at_radius(profile, r_xuv) + if not covered: + # The solver placed its XUV radius outside the modeled column. + # Reporting the clamped endpoint would make the caller's clamp + # test compare a value against itself, so the pressure carries + # the extrapolation and the caller flags the distance. + p_xuv = _isothermal_pressure_beyond_top(profile, M_p, r_xuv) + return p_xuv except Exception: return None +def _isothermal_pressure_beyond_top(profile: Profile, M_p: float, r: float) -> float: + """Isothermal hydrostatic pressure above the topmost level, Pa. + + Integrating ``d ln p = -(G M mu / k T) d(1/r)`` at the top temperature + and composition gives ``p(r) = p_top exp(-lambda_top (1 - r_top / r))``, + which tends to ``p_top exp(-lambda_top)`` far out rather than falling + without bound. A constant scale height would instead extrapolate + exponentially in radius and put a level a few planetary radii up tens of + decades below anything physical. + """ + r_top = float(profile.r[-1]) + lam_top = G * M_p * float(profile.mmw[-1]) / (kb * float(profile.T[-1]) * r_top) + return float(profile.p[-1]) * math.exp(-lam_top * (1.0 - r_top / r)) + + def atomized_element_fractions(level: dict) -> dict[str, float]: """Element mole fractions of the atomized composition at a level dict.""" return atomize(level['vmr']) diff --git a/tests/test_profiles.py b/tests/test_profiles.py index 8e3d4f12..9a03f6fa 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -17,6 +17,7 @@ See ``docs/How-to/run_tests.md`` for the tier and marker conventions. """ +import math import sys import types @@ -155,10 +156,21 @@ def test_pressure_at_radius_inverts_the_profile(): prof = _n2_profile() k = len(prof.p) // 3 lev = interp_at_pressure(prof, float(prof.p[k])) - assert pressure_at_radius(prof, lev['r']) == pytest.approx(float(prof.p[k]), rel=1e-9, abs=0.0) + p_node, covered = pressure_at_radius(prof, lev['r']) + assert covered + assert p_node == pytest.approx(float(prof.p[k]), rel=1e-9, abs=0.0) r_mid = 0.5 * (prof.r[k] + prof.r[k + 1]) - p_mid = pressure_at_radius(prof, r_mid) + p_mid, covered_mid = pressure_at_radius(prof, r_mid) + assert covered_mid assert prof.p[k + 1] < p_mid < prof.p[k] + # Outside the column the value clamps and says so, which is what lets a + # caller tell an interpolated level from an endpoint it was handed. + above, covered_above = pressure_at_radius(prof, 10.0 * float(prof.r[-1])) + assert not covered_above + assert above == pytest.approx(float(prof.p[-1]), rel=1e-15, abs=0.0) + below, covered_below = pressure_at_radius(prof, 0.5 * float(prof.r[0])) + assert not covered_below + assert below == pytest.approx(float(prof.p[0]), rel=1e-15, abs=0.0) def test_photospheric_level_clamps_with_flags(): @@ -320,7 +332,7 @@ def compute_mass_loss_parameters(self, m, r, t): scalars = {'R_p': 1.5 * Re, 'T_eq': 800.0, 'F_xuv': 10.0} lev, flags = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert 'base_method_fallback' not in flags - assert lev['p'] == pytest.approx(pressure_at_radius(prof, r_target), rel=1e-9, abs=0.0) + assert lev['p'] == pytest.approx(pressure_at_radius(prof, r_target)[0], rel=1e-9, abs=0.0) # Interior radius: the level pressure must be between the endpoints. assert prof.p[-1] < lev['p'] < prof.p[0] @@ -332,6 +344,28 @@ def compute_mass_loss_parameters(self, m, r, t): lev_f, flags_f = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert flags_f.get('base_method_fallback') == 'lopez' + # A solver radius above the modeled column must reach the clamp branch. + # Interpolation alone clamps silently, which would hand the caller the + # top pressure as though it had been solved for and leave the clamp test + # comparing a value against itself, so the flag could never fire. + class HighMassLoss(FakeMassLoss): + def compute_mass_loss_parameters(self, m, r, t): + return [{'regime': 'HD', 'RXUV': 3.0 * float(prof.r[-1]) * 1e2}] + + fake.MassLoss = HighMassLoss + lev_h, flags_h = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) + assert flags_h.get('base_clamped') is True + assert flags_h['base_clamp_decades'] > 1.0 + assert lev_h['p'] == pytest.approx(float(prof.p[-1]), rel=1e-12, abs=0.0) + assert lev_h['p_physical'] < lev_h['p'] + # The extrapolation is the isothermal solution, which saturates rather + # than falling without bound: the reported distance cannot exceed the + # top-level Jeans parameter in decades. + lam_top = ( + G * 5 * Me * float(prof.mmw[-1]) / (kb * float(prof.T[-1]) * float(prof.r[-1])) + ) + assert flags_h['base_clamp_decades'] <= lam_top / math.log(10.0) + 1e-9 + @pytest.mark.physics_invariant def test_validate_rejects_non_finite_and_negative_entries(): From eaf45b59e3328d22515ff8b98f3de9012d188d22 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:40:10 +0200 Subject: [PATCH 054/113] Requote the boil-off flags the dispatch now returns Scoping the flags to the branch that produced the rate removed a subcritical-sonic caution from the boil-off verdict, and the tutorial still quoted it. The output block matches the code again, and the surrounding text says what the absence means, since the hydrodynamic candidates are still computed on that state and still report that caution in the diagnostics. --- docs/Tutorials/dispatch.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 658df4a5..9074c391 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -248,12 +248,12 @@ Output: boiloff 134848975815225.14 11.10021097177663 (15.0, 35.0) -['base_clamp_decades', 'base_clamped', 'subcritical_sonic'] +['base_clamp_decades', 'base_clamped'] ``` At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 11.10$, well below the threshold of 20, and the rate is $1.3 \times 10^{14}$ kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. -The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. +The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Note what is absent: the hydrodynamic candidates were computed on this state too, and one of them raised a subcritical-sonic caution, but the dispatched rate is the bolometric one and the flags describe the branch that produced it. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. Push the same envelope to three Earth masses and two Earth radii and the flow stops being bound to the planet at all: From 23e90e77a2e4c3b1c08f7ace44a84f7d7e8d7565 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:42:29 +0200 Subject: [PATCH 055/113] Build one upper structure per dispatch The exobase temperature was resolved twice, once for the hydrostatic branch from the configured mode and once for the wind base under the extend policy, where it fell back to the equilibrium temperature. One call therefore built two Bates extensions at two temperatures, and under the thermostat they disagreed by an order of magnitude: on a ten Earth-mass carbon dioxide state the branch ran at 9117 K while the base was placed on an 800 K structure, which sets the base density every hydrodynamic rate is built from. The temperature is resolved once and both structures use it. --- src/zephyrus/dispatcher.py | 24 ++++++++++++---------- tests/test_dispatcher.py | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 4dca1153..e988a057 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -267,15 +267,20 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['bolometric']['rate_kg_s'] = bolo_rate # Step 2: hydrodynamic candidate (always computed; it is cheap). - base, f = _resolve_wind_base(inputs) - flags.update(f) - elements = atomize(base['vmr']) channels = dict( cool_atomic=st.cool_atomic, cool_co2_band=st.cool_co2_band, cool_o_finestructure=st.cool_o_finestructure, cool_recombination=st.cool_recombination, ) + # The exobase temperature is resolved once and used by both the upper + # structure the hydrostatic branch stands on and, under the extend + # policy, the one the wind base is re-evaluated on. Resolving it twice + # built those two structures at two different temperatures. + t_exo = _resolve_t_exo(inputs, channels) + base, f = _resolve_wind_base(inputs, t_exo) + flags.update(f) + elements = atomize(base['vmr']) t_wind, thermo = th.solve_wind_temperature( inputs.T_eq, base, elements, inputs.F_xuv, **channels ) @@ -354,7 +359,6 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # Step 4: hydrostatic branch (always evaluated: its exobase quantities # feed the diagnostics at every dispatch). - t_exo = _resolve_t_exo(inputs, channels) hs_per_element, hsd = hs.hydrostatic_rates( inputs.profile, inputs.M_p, t_exo, gamma_bates=st.gamma_bates, kzz_default=st.kzz ) @@ -538,15 +542,16 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ) -def _resolve_wind_base(inputs: EscapeInputs) -> tuple[dict, dict]: +def _resolve_wind_base(inputs: EscapeInputs, t_exo: float) -> tuple[dict, dict]: """The wind-base level with the out-of-range policy applied. Locates the base by the configured method; when the physical base pressure lies above the profile top and the policy is ``'extend'``, - the level is re-evaluated on the Bates extension (the same upper - structure the hydrostatic branch uses), flagged ``base_extended``; - under ``'clamp'`` (default) the clamped top level and its recorded - clamp distance stand. + the level is re-evaluated on the Bates extension at ``t_exo``, which is + the exobase temperature the hydrostatic branch is given, so the two + structures are one structure. Flagged ``base_extended``; under + ``'clamp'`` (default) the clamped top level and its recorded clamp + distance stand. """ st = inputs.settings boreas_scalars = None @@ -562,7 +567,6 @@ def _resolve_wind_base(inputs: EscapeInputs) -> tuple[dict, dict]: if flags.get('base_clamped') and st.base_out_of_range == 'extend': p_target = base.get('p_physical') if p_target is not None: - t_exo = st.T_exo_value if st.T_exo_mode == 'prescribed' else inputs.T_eq ext = hs.bates_extension(inputs.profile, inputs.M_p, t_exo, gamma=st.gamma_bates) p_ext = np.asarray(ext['p']) if p_target >= p_ext[-1]: diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 9374d263..c36099de 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -664,3 +664,44 @@ def test_flags_describe_the_branch_that_produced_the_rate(): assert static.regime == 'hydrostatic' assert static.flags.get('hydrostatic_lower_limit') is True assert 'subcritical_sonic' not in static.flags + + +def test_one_exobase_temperature_per_call(): + """The base extension and the branch stand on one upper structure. + + Under the extend policy the wind base is re-evaluated on a Bates + extension, and the hydrostatic branch stands on one too. Both must be + built at the same exobase temperature: resolving it twice, once from the + settings and once from the equilibrium temperature, gave one call two + thermospheres, and under the thermostat they differed by an order of + magnitude in temperature, which sets the base density the wind rate is + built from. + """ + m_p, r_p, t_eq = 10 * Me, 1.8 * Re, 800.0 + # A profile whose top lies above the Lopez base, so the policy engages. + settings = DispatchSettings(T_exo_mode='thermostat', base_out_of_range='extend') + res = dispatch( + _inputs( + m_p, + r_p, + t_eq, + {'CO2': 1.0}, + F_xuv=10.0, + a=0.5 * AU, + p_top=1.0, + settings=settings, + ) + ) + prof = isothermal_profile(m_p, r_p, t_eq, {'CO2': 1.0}, 1e7, 1.0) + assert res.flags.get('base_extended') is True + t_branch = res.diagnostics['hydrostatic']['T_exo'] + t_base = res.diagnostics['base_level']['T_K'] + t_top = float(prof.T[-1]) + # The thermostat must have moved off the equilibrium temperature, or the + # test cannot tell the two resolutions apart. + assert t_branch > 5.0 * t_eq + # The base sits on the same extension: between the anchor and the exobase, + # and nowhere near the equilibrium temperature the old path used. + assert t_top < t_base <= t_branch + assert t_base > 0.5 * t_branch + assert t_base != pytest.approx(t_eq, rel=0.1, abs=0.0) From 0530c8533e1988b9948e50a5b0c0d2d03e760db5 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:44:09 +0200 Subject: [PATCH 056/113] Take both front constants from one front The recombination chain chose its ionizing photon energy by composition but left the photoionization cross section at hydrogen's, so a nitrogen-like wind was given a section 5.3 times too small. Its neutral base density came out 5.3 times too high and the reported base ionization fraction fell from 0.86 to 0.54, understating it by a third on every heavy composition. Both constants now follow the front the composition selects. The rate is built on the ion density and is unchanged to the last digit. --- src/zephyrus/hydrodynamic.py | 27 ++++++++++++++++++++------- tests/test_hydrodynamic.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index e90f87df..c64f1f6f 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -9,10 +9,15 @@ import math -from zephyrus.atomic_data import HNU0_H_EV, HNU_I_N_EV, alpha_case_b +from zephyrus.atomic_data import ( + HNU0_H_EV, + HNU_I_N_EV, + SIGMA_NU0_H, + SIGMA_NU_N, + alpha_case_b, +) from zephyrus.composition import ELEMENT_AMU from zephyrus.constants import G, ev2joule, kb, m_p -from zephyrus.profiles import SIGMA_NU0 # The branch computes both hydrodynamic limits and takes their minimum: # @@ -338,9 +343,10 @@ def rr_chain( The ionizing front follows the composition: the 20 eV hydrogen front for winds with an atomized hydrogen fraction of one half or more, the - 33.6 eV nitrogen-like front otherwise. The composition recombination - coefficient is the mole-fraction-weighted case B set with its - documented temperature scaling. + 33.6 eV nitrogen-like front otherwise, and the photoionization cross + section follows the same front rather than staying at hydrogen's. The + composition recombination coefficient is the mole-fraction-weighted case + B set with its documented temperature scaling. Returns a dict with ``c_s``, ``R_s``, ``R_s_calc``, ``lambda_b``, ``rho_base``, ``rho_s``, ``n_plus_base``, ``n_0_base``, @@ -354,8 +360,15 @@ def rr_chain( r_s = max(r_s_calc, R_base) lambda_b = G * M_p / (R_base * c_s**2) + # The photon energy and the cross section belong to one front and must + # be taken from the same one. Taking the energy from the composition and + # the cross section from hydrogen put a nitrogen-like wind on a section + # 5.3 times too small, which raised its neutral base density by that + # factor and understated the reported base ionization fraction. x_h = element_fractions.get('H', 0.0) - hnu0 = (HNU0_H_EV if x_h >= 0.5 else HNU_I_N_EV) * ev2joule + hydrogen_front = x_h >= 0.5 + hnu0 = (HNU0_H_EV if hydrogen_front else HNU_I_N_EV) * ev2joule + sigma_nu0 = (SIGMA_NU0_H if hydrogen_front else SIGMA_NU_N) * 1e-4 # cm^2 -> m^2 # Composition-weighted case B coefficient, cm^3/s -> m^3/s. alpha_b = sum(x * alpha_case_b(el, T_wind) for el, x in element_fractions.items()) * 1e-6 @@ -370,7 +383,7 @@ def rr_chain( rho_base = n_plus_base * mu_plus * m_p # Neutral base density from unit optical depth over a scale height: # n_0 = G M / (sigma_nu0 c_s^2 R_base^2). - n_0_base = G * M_p / (SIGMA_NU0 * c_s**2 * R_base**2) + n_0_base = G * M_p / (sigma_nu0 * c_s**2 * R_base**2) f_plus = n_plus_base / (n_plus_base + n_0_base) if (n_plus_base + n_0_base) > 0 else 0.0 if subcritical: diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index 6489b018..3884dcb9 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -22,6 +22,7 @@ import pytest +from zephyrus.atomic_data import SIGMA_NU0_H, SIGMA_NU_N from zephyrus.constants import G, m_p from zephyrus.hydrodynamic import ( caldiroli_efficiency, @@ -266,3 +267,38 @@ def test_hill_radius_periapsis_geometry(): assert r8m == pytest.approx(2.0 * r0, rel=1e-12, abs=0.0) # Earth's Hill radius is about 1.5e9 m (0.01 au). assert 1.3e9 < r0 < 1.6e9 + + +@pytest.mark.physics_invariant +def test_front_constants_come_from_one_front(): + """The photon energy and its cross section belong to the same front. + + The chain picks a monochromatic ionizing front by composition, and both + constants of that front have to follow the choice. Taking the energy from + the composition while leaving the cross section at hydrogen's put a + nitrogen-like wind on a section 5.3 times too small, so its neutral base + density came out 5.3 times too high and the reported base ionization + fraction was understated by a third. The neutral density scales as the + inverse of the section, which is what pins the direction here; the rate + is built on the ion density and is untouched either way. + """ + hydrogen = rr_chain(5 * Me, 100.0, 1.5 * Re, 1.0e4, {'H': 1.0}) + nitrogen = rr_chain(5 * Me, 100.0, 1.5 * Re, 1.0e4, {'N': 1.0}) + assert hydrogen['hnu0_eV'] == pytest.approx(20.0, rel=1e-12, abs=0.0) + assert nitrogen['hnu0_eV'] == pytest.approx(33.6, rel=1e-12, abs=0.0) + # Both densities scale as 1/(sigma c_s^2), so dividing out the sound + # speed leaves the ratio of the two tabulated sections. + section_ratio = SIGMA_NU_N / SIGMA_NU0_H + measured = (hydrogen['n_0_base'] * hydrogen['c_s'] ** 2) / ( + nitrogen['n_0_base'] * nitrogen['c_s'] ** 2 + ) + assert measured == pytest.approx(section_ratio, rel=1e-9, abs=0.0) + assert section_ratio == pytest.approx(5.3006, rel=1e-3, abs=0.0) + # Discrimination: leaving the section at hydrogen's would make the ratio + # unity, which the assertion above excludes. + assert measured > 5.0 + # The base ionization fraction is a fraction, and the heavy wind's is + # not the understated value the mismatched section produced. + for chain in (hydrogen, nitrogen): + assert 0.0 <= chain['f_plus_base'] <= 1.0 + assert nitrogen['f_plus_base'] > 0.8 From 164aad17b52728a478888f3d0d03ab4feab6c071 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:51:48 +0200 Subject: [PATCH 057/113] Refine the supply quadrature to a stated target The diffusion-limited supply integrals ran on a fixed 400-level grid that neither the caller nor the result could see. They are first order in the log-pressure step, measured: a refinement triple gives a Richardson ratio of 2.012, and 400 levels sat 3.8 percent above the extrapolated limit and drifting. The resolution now doubles from a coarse start until the relative change in the bulk rate falls below a target, and the levels reached, the last change, the worst change across the species, and whether the target was met travel with the rate. The finest grid's values are returned, never an extrapolation, and a ceiling reached first is reported rather than raised. On the one case where the supply cap binds the rate moves 3.9 percent and the call costs 13 ms instead of 4.4; every other case converges on the first refinement and is unchanged. --- docs/Reference/parameters.md | 3 + docs/Reference/results.md | 3 +- src/zephyrus/dispatcher.py | 22 ++++++- src/zephyrus/hydrostatic.py | 115 ++++++++++++++++++++++++++++++++++- tests/test_hydrostatic.py | 71 +++++++++++++++++++++ 5 files changed, 209 insertions(+), 5 deletions(-) diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index f262622f..909eb6bd 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -118,6 +118,9 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | | `gamma_wind` | 1.0 | $1 \leq \gamma \leq 5/3$ | Polytropic index at the sonic point (1 for an isothermal wind). | +| `hydrostatic_levels_min` | 200 | integer $\geq 2$ | First quadrature grid of the diffusion-limited supply integrals. | +| `hydrostatic_levels_max` | 3200 | integer $\geq$ `hydrostatic_levels_min` | Refinement ceiling. Reaching it without meeting the target is reported, not raised. | +| `hydrostatic_rtol` | 0.01 | $> 0$ | Target relative change in the bulk hydrostatic rate between a grid and its refinement. The integrals are first order in the log-pressure step, so that change also estimates what is left to converge. | ## Dispatcher inputs (`dispatcher.EscapeInputs`) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 4dc6368e..203ef463 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -81,6 +81,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes; the rate is the one the branch computed. | Reporting only | | `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | +| `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. @@ -98,7 +99,7 @@ Eighteen groups on a typical call. Nothing in the dispatch control flow reads an |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | -| `hydrostatic` | `rate_kg_s`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. | +| `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | | `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index e988a057..dd36f777 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -100,6 +100,9 @@ class DispatchSettings: gamma_bates: float = 0.75 # Bates profile shape parameter kzz: float = 3.0e2 # m^2/s eddy diffusion when the profile carries none gamma_wind: float = 1.0 # polytropic index at the sonic point (isothermal) + hydrostatic_levels_min: int = 200 # first quadrature grid of the supply integrals + hydrostatic_levels_max: int = 3200 # refinement ceiling + hydrostatic_rtol: float = 1.0e-2 # target relative change in the bulk rate def validate(self) -> None: """Raise ``ValueError`` on an unsupported option combination.""" @@ -131,6 +134,7 @@ def validate(self) -> None: ('lambda_crit', self.lambda_crit), ('kzz', self.kzz), ('gamma_bates', self.gamma_bates), + ('hydrostatic_rtol', self.hydrostatic_rtol), ): if not math.isfinite(value) or value <= 0.0: raise ValueError(f'{name} must be a positive finite value, got {value!r}') @@ -146,6 +150,12 @@ def validate(self) -> None: # The sonic-point scale height of Chatterjee & Pierrehumbert Eq. (17) # carries sqrt(5 - 3 gamma), which leaves the reals above the monatomic # 5/3. Below 1 the polytrope is no longer a wind solution. + if self.hydrostatic_levels_min < 2 or self.hydrostatic_levels_max < self.hydrostatic_levels_min: + raise ValueError( + 'hydrostatic_levels_min must be at least 2 and no greater than ' + f'hydrostatic_levels_max, got {self.hydrostatic_levels_min!r} and ' + f'{self.hydrostatic_levels_max!r}' + ) if not 1.0 <= self.gamma_wind <= 5.0 / 3.0: raise ValueError( 'gamma_wind must lie in [1, 5/3], the domain of the sonic-point ' @@ -359,8 +369,15 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # Step 4: hydrostatic branch (always evaluated: its exobase quantities # feed the diagnostics at every dispatch). - hs_per_element, hsd = hs.hydrostatic_rates( - inputs.profile, inputs.M_p, t_exo, gamma_bates=st.gamma_bates, kzz_default=st.kzz + hs_per_element, hsd = hs.hydrostatic_rates_refined( + inputs.profile, + inputs.M_p, + t_exo, + gamma_bates=st.gamma_bates, + kzz_default=st.kzz, + n_levels_min=st.hydrostatic_levels_min, + n_levels_max=st.hydrostatic_levels_max, + rtol=st.hydrostatic_rtol, ) hs_flags = hsd.pop('flags') mdot_hs = sum(hs_per_element.values()) @@ -376,6 +393,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: unstable, contested = hs.gate_unstable(hsd['T_exo'], hsd, st.gate, f_plus_exo) diag['hydrostatic'] = dict( rate_kg_s=mdot_hs, + convergence=hsd['convergence'], T_exo=hsd['T_exo'], T_exo_mode=st.T_exo_mode, r_exo=hsd['r_exo'], diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index 76176467..b1e95d87 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -121,6 +121,17 @@ def bates_extension( r0 = float(profile.r[-1]) t_top = float(profile.T[-1]) mu = float(profile.mmw[-1]) + # The extension is the inflated thermosphere the exobase quantities must + # be read from, so it cannot be colder at the top than the level it + # extends from: that builds a falling temperature profile whose exobase + # is more strongly bound than its anchor, which inverts the construction. + # A prescribed exobase temperature is a stand-in for physics the branch + # does not solve, and in a coupled run the profile top warms over secular + # time and can pass it, so the temperature floors at the anchor and the + # call is flagged rather than raising and stopping the run. + floored = T_exo < t_top + if floored: + T_exo = t_top # Every species present at the anchor is carried, however thin. A trace # light species can dominate the exospheric loss while sitting many # decades below the bulk, so a lower cut on the mixing ratio would @@ -151,7 +162,19 @@ def bates_extension( zeta, T, r = zeta[: last + 1], T[: last + 1], r[: last + 1] p = p0 * np.exp(-zeta) n = p / (kb * T) - return dict(zeta=zeta, p=p, r=r, T=T, n=n, mu=mu, vmr=vmr, p0=p0, r0=r0, unbound=unbound) + return dict( + zeta=zeta, + p=p, + r=r, + T=T, + n=n, + mu=mu, + vmr=vmr, + p0=p0, + r0=r0, + unbound=unbound, + t_exo_floored=floored, + ) def find_exobase(ext: dict, M_p: float) -> tuple[int, dict]: @@ -188,6 +211,7 @@ def hydrostatic_rates( T_exo: float, gamma_bates: float = 0.75, kzz_default: float = 3.0e2, + n_levels: int = 400, ) -> tuple[dict, dict]: """Per-species hydrostatic escape mapped onto per-element rates [kg/s]. @@ -206,14 +230,21 @@ def hydrostatic_rates( the harmonic mean could only be smaller, and the cost of the integrals dominates the branch on many-species profiles. + ``n_levels`` sets the quadrature resolution of the supply integrals. + They are first-order accurate in the log-pressure step, so the error + halves as the count doubles; ``hydrostatic_rates_refined`` drives that + refinement to a target instead of trusting one grid. + Returns ``(per_element, detail)``; the detail dict carries the exobase state, both escape temperatures, the ``dominant`` species that supplies itself without a diffusion cap, the per-species terms, coefficient provenance, and flags (including ``hydrostatic_lower_limit``, which is always on: non-thermal loss channels are absent). """ - ext = bates_extension(profile, M_p, T_exo, gamma=gamma_bates) + ext = bates_extension(profile, M_p, T_exo, gamma=gamma_bates, n_levels=n_levels) i_x, flags = find_exobase(ext, M_p) + if ext['t_exo_floored']: + flags['t_exo_floored_to_profile_top'] = True if ext.get('unbound'): flags['extension_unbound'] = True r_x, t_x, n_x = float(ext['r'][i_x]), float(ext['T'][i_x]), float(ext['n'][i_x]) @@ -321,11 +352,91 @@ def hydrostatic_rates( T_esc_plasma=t_esc_plasma, lambda_exo_bulk=lam_exo_bulk, K_eddy=k_eddy, + n_levels=n_levels, flags=flags, ) return per_element, detail +def hydrostatic_rates_refined( + profile, + M_p: float, + T_exo: float, + gamma_bates: float = 0.75, + kzz_default: float = 3.0e2, + n_levels_min: int = 200, + n_levels_max: int = 3200, + rtol: float = 1.0e-2, +) -> tuple[dict, dict]: + """Hydrostatic rates refined until the quadrature stops moving them. + + The supply integrals are first-order accurate in the log-pressure step, + so the change between a grid and its refinement estimates what is left + to converge, and a single fixed count says nothing about its own error. + The resolution doubles from ``n_levels_min`` until the relative change + in the bulk rate falls below ``rtol`` or ``n_levels_max`` is reached. + The finest grid's rates are returned, never an extrapolation. + + The detail dict gains a ``convergence`` entry recording the levels used, + the last relative change in the bulk rate and the worst one across the + species, and whether the target was met. A call that exhausts + ``n_levels_max`` without meeting it reports ``converged`` False rather + than raising: the rate is still the best available and the caller can + see how far from the target it is. + """ + n = max(2, int(n_levels_min)) + n_max = max(n, int(n_levels_max)) + per_element, detail = hydrostatic_rates( + profile, M_p, T_exo, gamma_bates=gamma_bates, kzz_default=kzz_default, n_levels=n + ) + history = [(n, sum(per_element.values()))] + rel_bulk = math.inf + rel_species = math.inf + converged = False + while n < n_max: + n_fine = min(2 * n, n_max) + per_fine, detail_fine = hydrostatic_rates( + profile, + M_p, + T_exo, + gamma_bates=gamma_bates, + kzz_default=kzz_default, + n_levels=n_fine, + ) + rel_bulk = _relative_change(sum(per_element.values()), sum(per_fine.values())) + rel_species = max( + ( + _relative_change(per_element.get(el, 0.0), per_fine.get(el, 0.0)) + for el in set(per_element) | set(per_fine) + ), + default=0.0, + ) + per_element, detail, n = per_fine, detail_fine, n_fine + history.append((n, sum(per_element.values()))) + if rel_bulk <= rtol: + converged = True + break + detail['convergence'] = dict( + n_levels=n, + n_levels_min=int(n_levels_min), + n_levels_max=n_max, + rtol=float(rtol), + rel_change_bulk=float(rel_bulk), + rel_change_worst_species=float(rel_species), + converged=bool(converged), + history=history, + ) + return per_element, detail + + +def _relative_change(coarse: float, fine: float) -> float: + """Relative difference between two grids, zero when both vanish.""" + scale = max(abs(coarse), abs(fine)) + if scale == 0.0: + return 0.0 + return abs(fine - coarse) / scale + + def gate_unstable( T_exo: float, detail: dict, gate: str, f_plus_exo: float ) -> tuple[bool, bool]: diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index 977a6687..a892dd2d 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -30,6 +30,7 @@ find_exobase, gate_unstable, hydrostatic_rates, + hydrostatic_rates_refined, jeans_effusion_velocity, volkov_flat_factor, ) @@ -352,3 +353,73 @@ def test_trace_species_survive_into_the_exobase_anchor(): per_el_bare, _ = hydrostatic_rates(bare, M_MARS, 1000.0) assert 'H' not in per_el_bare assert sum(per_el_bare.values()) < 1e-4 * rates[-1] + + +@pytest.mark.physics_invariant +def test_supply_quadrature_refines_to_its_target(): + """The supply integrals are refined until they stop moving the rate. + + The integrals are first-order accurate in the log-pressure step, so the + change between a grid and its refinement estimates what is left to + converge, and one fixed count cannot report its own error. Doubling from + a coarse start must therefore drive the change below the target and say + so, the refined answer must be the finest grid's rather than an + extrapolation, and a ceiling reached without meeting the target must be + reported rather than passed off as converged. + """ + prof = _co2_hydrogen_profile(0.01) + per, det = hydrostatic_rates_refined(prof, M_MARS, 1000.0, rtol=1e-2) + conv = det['convergence'] + assert conv['converged'] is True + assert conv['rel_change_bulk'] <= 1e-2 + assert conv['n_levels'] >= conv['n_levels_min'] + # The returned rates are the ones the finest grid produced. + per_at_n, _ = hydrostatic_rates(prof, M_MARS, 1000.0, n_levels=conv['n_levels']) + assert sum(per.values()) == pytest.approx(sum(per_at_n.values()), rel=1e-12, abs=0.0) + # First order in the step: the coarse grid is measurably off, and the + # refinement moves the answer toward the fine one monotonically. + coarse, _ = hydrostatic_rates(prof, M_MARS, 1000.0, n_levels=100) + fine, _ = hydrostatic_rates(prof, M_MARS, 1000.0, n_levels=3200) + assert abs(sum(coarse.values()) - sum(fine.values())) / sum(fine.values()) > 1e-2 + assert sum(coarse.values()) > sum(per.values()) >= sum(fine.values()) + # A ceiling below the target is reported, not hidden. + _p, det_capped = hydrostatic_rates_refined( + prof, M_MARS, 1000.0, n_levels_min=50, n_levels_max=100, rtol=1e-12 + ) + assert det_capped['convergence']['converged'] is False + assert det_capped['convergence']['n_levels'] == 100 + assert det_capped['convergence']['rel_change_bulk'] > 1e-12 + + +@pytest.mark.physics_invariant +def test_exobase_temperature_floors_at_the_profile_top(): + """A prescribed exobase temperature never builds a falling thermosphere. + + The extension is the inflated structure the exobase quantities must be + read from, so it cannot end colder than the level it extends from: that + puts the exobase more strongly bound than its own anchor, inverting the + construction and biasing the branch toward retention. The prescribed + temperature is a stand-in for physics the branch does not solve, and in a + coupled run the profile top warms over secular time and can pass it, so + the value floors at the anchor and the call is flagged rather than + raising and stopping the run. + """ + prof = _co2_hydrogen_profile(0.01) + t_top = float(prof.T[-1]) + above = bates_extension(prof, M_MARS, 4.0 * t_top) + assert above['t_exo_floored'] is False + assert float(above['T'][-1]) > t_top + below = bates_extension(prof, M_MARS, 0.25 * t_top) + assert below['t_exo_floored'] is True + # Floored, not falling: the extension is isothermal at the anchor value. + assert float(below['T'][-1]) == pytest.approx(t_top, rel=1e-12, abs=0.0) + assert float(below['T'][0]) == pytest.approx(t_top, rel=1e-12, abs=0.0) + # The exobase is no more bound than the level it extends from. + per, det = hydrostatic_rates(prof, M_MARS, 0.25 * t_top) + assert det['flags'].get('t_exo_floored_to_profile_top') is True + lam_anchor = G * M_MARS * det['m_bar'] / (kb * t_top * float(prof.r[-1])) + lam_exo = G * M_MARS * det['m_bar'] / (kb * det['T_exo'] * det['r_exo']) + assert lam_exo <= lam_anchor + # At the anchor temperature exactly, nothing is flagged. + _p, det_eq = hydrostatic_rates(prof, M_MARS, t_top) + assert 't_exo_floored_to_profile_top' not in det_eq['flags'] From 9baf726a149ff086d5bd6192ca5da273a7bc95b1 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:51:48 +0200 Subject: [PATCH 058/113] Floor the exobase temperature at the profile top A prescribed exobase temperature below the profile's topmost level built an extension that cools with height, whose exobase came out more strongly bound than the anchor it extends from: on a 1500 K profile top a 200 K request gave a Jeans parameter of 203 against 191 below it. That inverts the construction the branch depends on, which is that exobase quantities are read from an inflated structure. The temperature now floors at the anchor and the call is flagged. It is not refused, because the prescription stands in for physics the branch does not solve and a coupled run's profile top warms past a fixed value over secular time; stopping the run there would be the wrong answer to a question the caller did not ask. --- tests/test_dispatcher.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index c36099de..1e99c938 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -272,10 +272,10 @@ def test_roche_subflag_separates_the_two_geometries(): itself reaches the lobe, from the narrow band where only the would-be sonic surface does. A Mars-mass CO2 planet at 0.028 au with a 2000 K exobase has its extended structure outside the Hill radius while its - photosphere sits far inside, so the subflag is dynamical even though - the Hill sphere still encloses the planet many times over; a bound - Earth-mass CO2 planet whose bolometric sonic radius alone passes the - Hill radius gets the other subflag, with its atmosphere well inside. + photosphere sits far inside, so the subflag is dynamical even though the + Hill sphere still encloses the planet many times over; an inflated + hydrogen envelope whose Parker sonic radius alone passes the Hill radius + gets the other subflag, with its atmosphere well inside. """ dyn = dispatch( _inputs( @@ -294,13 +294,19 @@ def test_roche_subflag_separates_the_two_geometries(): assert roche['xi_ktide'] > 1.0 # not the trivial planet-inside-its-lobe case assert roche['r_atmosphere'] > roche['R_hill_periapsis'] - bound = dispatch(_inputs(Me, Re, 1600.0, {'CO2': 1.0}, F_xuv=0.01, a=0.03 * AU)) + # The other subflag on the branch it naturally belongs to: an inflated + # hydrogen envelope whose Parker sonic radius passes the Hill radius + # while the atmosphere itself stays inside it. + bound = dispatch( + _inputs(3 * Me, 2.0 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775 * AU) + ) roche_b = bound.diagnostics['roche'] assert bound.regime == 'roche_overflow' assert bound.flags.get('roche_subflag') == 'no_transonic' - assert roche_b['r_atmosphere'] < roche_b['R_hill_periapsis'] - # The rate under that label carries no numerical content, and says so. - assert bound.diagnostics['rate_floor']['above_floor'] is False + assert roche_b['rate_branch'] == 'boiloff' + assert roche_b['xi_flow'] <= 1.0 # the sonic surface is outside the lobe + assert roche_b['r_atmosphere'] < roche_b['R_hill_periapsis'] # the gas is not + assert roche_b['xi_ktide'] > 1.0 def test_diagnostics_are_boxed(monkeypatch): From 68dbae98f8607c40d439975e3a4fa5d3531d8086 Mon Sep 17 00:00:00 2001 From: maraattia Date: Sun, 23 Aug 2026 23:51:56 +0200 Subject: [PATCH 059/113] Sweep the exobase temperature above the profile top Half of the tutorial's exobase sweep asked for temperatures below the top of the profile it ran on, which is the request the branch now floors, so the lower points repeated the anchor's answer instead of showing anything. The sweep starts at the profile top and runs to four times it, where the lesson is the one the case was chosen for and sharper than before: the supply-limited hydrogen rate moves 3.6 percent while the Jeans-limited carbon rate moves eleven orders of magnitude. Output blocks, the reading of the per-species detail, and the track figure follow the refined quadrature. --- docs/Tutorials/dispatch.md | 16 ++++++++-------- docs/assets/dispatcher_track.png | Bin 258452 -> 258528 bytes examples/demo_dispatcher/demo_dispatcher.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 9074c391..fa6c84b3 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -429,7 +429,7 @@ At 1 W m⁻² the same planet is hydrostatic under the strict edge of the criter The hydrostatic branch prescribes it, default 1000 K, and the Jeans flux depends on it exponentially, so it is the branch's dominant sensitivity. The lesson is sharper on a planet where hydrostatic escape does physical work: a Mars-mass planet whose carbon dioxide carries 1% hydrogen. ```python -for t_exo in (500.0, 1000.0, 2000.0): +for t_exo in (1000.0, 2000.0, 4000.0): settings = DispatchSettings(T_exo_value=t_exo) out = dispatch(build_state('CO2 + 1% H2', 0.107, 0.53, 0.01, settings=settings)) print(t_exo, out.regime, out.mdot, out.per_species['H'], out.per_species['C']) @@ -438,12 +438,12 @@ for t_exo in (500.0, 1000.0, 2000.0): Output: ```text -500.0 hydrostatic 328.6111274527813 328.6111274527813 1.0911011454535496e-24 -1000.0 hydrostatic 359.4124832776042 359.41248327479303 7.672381654045139e-10 -2000.0 hydrostatic 369.11630434704324 368.9889813172862 0.03474918563048364 +1000.0 hydrostatic 345.3493715507801 345.3493715479417 7.746587977671953e-10 +2000.0 hydrostatic 351.51013842063026 351.3803695476915 0.03541670869293938 +4000.0 hydrostatic 1553.1885864133374 357.67085653574424 326.2824298111698 ``` -Over a factor of four in temperature the bulk rate moves by 12% while the carbon rate moves by 22 orders of magnitude. The reason is in the per-species detail: +The sweep starts at the profile's own top temperature, near 1000 K here, because a prescribed value below it would ask for a thermosphere that cools with height, whose exobase is more strongly bound than the level it extends from. That request is floored at the top and flagged rather than refused, since in a coupled run the profile top warms past a fixed prescription over secular time. Over the factor of four above it the bulk rate moves by a factor 4.5 while the carbon rate moves by eleven orders of magnitude. The reason is in the per-species detail: ```python species = out.diagnostics['hydrostatic']['detail']['species'] @@ -454,11 +454,11 @@ print(species['H2']['phi_jeans'], species['H2']['phi_diffusion']) Output: ```text -0.7405112884785615 -8714304920630702.0 270144275279648.22 +0.28260377845019297 +1.450974373622763e+16 258509561614714.28 ``` -At 2000 K hydrogen sits at an exobase Jeans parameter below 1, with a Jeans flux far above the supply diffusion can deliver through the heavy background, so its escape is set by the supply and the exobase temperature barely enters. Carbon and oxygen are Jeans limited and carry the whole exponential. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. +At the 4000 K end of the sweep hydrogen sits at an exobase Jeans parameter of 0.28, with a Jeans flux nearly sixty times the supply diffusion can deliver through the heavy background, so its escape is set by that supply and the exobase temperature barely enters: the hydrogen column of the table above moves by 3.6% across the whole sweep. Carbon and oxygen are Jeans limited and carry the whole exponential, eleven orders of magnitude of it. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. ### Fractionation diff --git a/docs/assets/dispatcher_track.png b/docs/assets/dispatcher_track.png index 268cb493820e120f7d5f46a892365681c515b9d2..2f914bf568028dcc70ce4408d2db433332472667 100644 GIT binary patch delta 222985 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 G2~7agsj2$_ delta 222834 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 z z24KW|BWP3ABb0rRMQ7pkm3ylX zuOhoRIbptvsqv6Y>Fbv-?`*7eJGYq>-g&JQx>if9%kK8J{yLSxQ+4~+GjG?X9Z1-a zHt^FKPX7LTv@=|T3`@(j!Vb?NI3_o;n9$IM`E@Hos0r0~{-pGpOn!w87OjpK#eHC{=B9KNCsy2xdV6(WpR|4S0LwaML=OLA-@98RV zP1Hiy!W4;w0BN;szcqI{8B{VOyhtn^PS!cG0~S~#L) z37*T_{zoo;Xyci&>@tzZZC4)8DwWzV8fJD2Ewa#XSwf;O>H!=uadB~R?sGq~t9_O( z2{-HJ(mff78}M4=7PfK<{HE&4tNO)w%^hgaTUAJ}annr*}cW za~gYiM$12ke_^lzEaYMbnuVD7aJ*^6a0MC*dlM#p!A)LKkpPNHF#sFIO_Z~HS?a%^ z3#uFh2;FuA9Vco#7bfWxCt99fNB|oUZ1YszegHJr#2MP0V!x1lSehi#A$$mVB(Z}+MEM|qaB)whMGcF&( zEP79=PRe;ai)ZHN7rD!8xq7)5WYKZ2j~rp?QD3Eff3fepQll0!okCvH9n^m9v#N^8 z(JA5Ax!tg2KM?)l!-pxu!v0)9Vggl!OUn{Af55nmxiJ@*dUxVbLQ#TVk}N>cA)dY< zJG4v0|7+l7GB6@D5V%;5p(s?tG4Y1rLV-QB=on0peD~6NUvRx54l!IMv1u5qCSkyI zoZY;43DBX{nH(Trq61hK3qak<(yG1{xXk@1@BVHmUUv6*B_r8R>F(X{Di6(sczD5E zBLMyO@Mz3%A7}(gj1ssDnlHPptecQ3ap6Iw^QAi85I+0j1R$FV3v>J5;l1b+47BcS zH33x(y7E=}j9Ys1ec^r+yMW`06(PIm6lgckNwmDbocfNNy@PC+qld@{+`H64zEN6a zJ8~QpJPwOkEUHj{M!wGAx#1`%xH?go@bz2yA=QQVf<_9C)zsVXBY$by4wZZ|WfoS3 z=4^PURbyln0qSn8%QSEIeyBEBnA$NgJwkGn-O7Dz#;vca$eW6hG!Lz$Du&qr&~Vx8qFQ{DZ}#uMF6hnUnzn)qS?id@a<@Ra?nukAN(nPK*Aa{Thns-d5}uC$xGE z4D%Bv#5I#eM#f1JYP!;5IX1HhF%@axu5(zd!vB6 zr$9#q@PsOTfSb!(TBnVb0?lL8!IX#|pltH;@saX9;uR8>SvmSJ1-Y2JtXXr)pB(zN zpbtJv*QH-q9;%oS;y7^hD0bben6lEO5m0%yc&u528|hyw+Yg8-ld+ABL-^nh*>?a= zn2b3-s$81whUWbCmDqOp6B(o}SL8&I&;9+qS64Gdyjl*+%PS7J6$o2**z_ULEEYAV zf=&HKY*ttMl78YAL-*nres07TKT%S?azRYD+gk9ui~7V3rG>5uKJV3#Ww*KYHk7bE z36>nVkJ3v1u?5q{QIbg8)`0;PGWo!pF!k>spn^^^dke>8na9?pef)e=Cr4jHF_b+T z1H*ig3v|1oQ>2_4uv*HW&jV1gLSkZ~^1Uj9J{ypF0om-}d$~FCcNAdc(eve1U*m1M z%04BZPv!Aj>}-ssZbV(F_E_57$8lz8%x7Za6R%!@@m}uuT%A_k`NhTi7Nc#jTjd+; z{E!K?IFwyFw#Wo!XMl7ZR&%g%xPq+5#zsWUJEn7kL?4+<4j`5!$XsKFS2*kW>w%Q7 z92a4jfU~Zw7<w^g2W`Zsm+u zy-42Y#-(H1-@~*tp9-?)gMJ=B!wi&Q)L*q>AbHr$cKY<`Ot>j??n~_hzFr^&mbsU~ zzv(`Nj|S&-4^G6z~q2{NX!oCEhKAg3u|xa!f0uGZNApFGJ6tp&5iRaoZrWo=75*C)K-?L{$fuD~ z#w@wg@T_W`y6_2;C?-R@U=Q@@=N!+aHq_s^aYMxOyIlXTW#+aRX&~hnRUVv!0QMFS zPXvhxn=e&;%r_oCcu%`;-1$c(VSa~!Qip77U=i8b z*SCY+ACj8TnQAwJ7?ePxv9upNwWtLcS=C1IyV2KAdjI;E%$1lb+grl~YG5yEr8EGv zA>uyESK&GnF|z_VD4Sp5$#j+!w6W|pXe}`!nO5J!)fYW#rTpR!g8_h-F$RKl@D?(L zkh2T%oTjB}Y&v=RoO(c646<8w*&Sx3BCl^pEVfrdq?wK7M#7JB7qLd33m52FQvxVW zzFN1jv7y7KV`1+W#lHrU~ZE=r$ z?4Iq~vxtpD5Z);U*o;75<-zMm5^giFYcA4CH7WD+n&r-qFthC$0MzXqeAhwxsTKy^ zl69-jOr1jmdhyEiRJa60vrU*O=qXq(@pvrt6Oi-xwHOyBcZ#91-C#fn9rZF@`WcsB zzByQ>bK?KF`U!%^{UrEEHEeoMM6<2X%rP{=?0}?=Ti|rGj)w3>_*B z0+K^F4BZS3-#*~I_y2zLJiPaPoS8ExezEu3Ypu<gm&W zXNJyNU1pV~+u`@i5DRSvRdg!aqE3N{8>xdt5=EcTAq5l3LBy%bC-M@Hb^^$3Qh_Q^ zlk1v}PV9r5q~p?IwHgqHTw)o!sK?AJissSZUsE>&8H8k^$6;p@pB`Tb?vSf`>_K7dazmpn5Y2>ma0Oy5|F?@G&UAW2%msE=jp9i2*7o zOeF|;MP)g31(7+%YxheRR|a_Zgg1Vd@N<;A9ArGOmqmvRHS%&l0Xl}+cTW@XRp??3 ziG7?Av*OoZUrT}A-WfJ0k8F3QybFF_cn~#L8epOw>U~lhcq>`2>V12b))P^GO(+~e zvE{VB21Bj{_W}gAHBnW&VB0p z3RIez>JdFdNPrftuBrp>QnE>;;9YNRfp%+OUuZz#ADBO;Ymos_B7qDO5NNUBNE+&Z zK(kUq7i}2lt({gy?I;TcCCl$gCTdVNZ9OuK(A@;cH9K7-ur>*vea={6n+8J8yi|%E zI+L&`1IJ%IJ;$z_p{QE?h9|l4^(teY*%i4|*(>@7@`Cdmxf> z#gZFy4U=nc9tqt(-s$Tb5;6#0i`5isktCN(Z>ru`1P+7M*iR+FBAZCAiLIIOI4DyX zPPH4m>GwKVXKm%`X14XUb&*H=hKzEa4e-y*Zg@l?7nErkwJ^;83$#bz#fki!&jSuh z@#ZXdl2USJM+N(fqxG(md

      u{`&#@)rtsFjo{=7VyJiNTxKPA5D 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≠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 list[dict]: print('\n=== Knob: the prescribed exobase temperature ===') print(' Mars-mass planet, CO2 with 1% H2, F_xuv = 0.01 W m-2') out, hydrogen = [], None - for t_exo in (500.0, 750.0, 1000.0, 1500.0, 2000.0): + for t_exo in (1000.0, 1500.0, 2000.0, 3000.0, 4000.0): settings = DispatchSettings(T_exo_value=t_exo) result = dispatch(build_state('CO2 + 1% H2', 0.107, 0.53, 0.01, settings=settings)) if t_exo == 1000.0: From 69251c8ad27fef926ed1da956d1d6253a6e2218d Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 24 Aug 2026 00:18:48 +0200 Subject: [PATCH 060/113] Report the optical depth of the boil-off launch level The Parker rate is derived from a photosphere, so it only reproduces its own derivation where the supplied opacity puts unit optical depth. Nothing said whether the prescribed launch level was that place: on an inflated hydrogen envelope at 0.01 m2 kg-1 the plane-parallel depth of the level is 67, while a bound carbon dioxide planet reads 2.2. Both now travel with the rate, so a caller can see the gap on the state in front of them. The level stays prescribed rather than solved for, because the activation threshold that gates the branch is calibrated at a level of its own and solving here would put the gate and the rate on two different surfaces. --- docs/Reference/results.md | 2 +- src/zephyrus/boiloff.py | 17 ++++++++++++-- tests/test_boiloff.py | 48 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 203ef463..b6a76c9c 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -100,7 +100,7 @@ Eighteen groups on a typical call. Nothing in the dispatch control flow reads an | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | -| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. | +| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface, and the rate is being read off its own definition at the wrong place. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold that gates the branch is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index aa9b8a75..5056f016 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -118,8 +118,8 @@ def bolometric_candidate( inverse. launch : dict The photospheric working level (from - :func:`zephyrus.profiles.photospheric_level`): uses ``r``, ``mmw`` - (molecular, not atomized), and ``rho``. + :func:`zephyrus.profiles.photospheric_level`): uses ``p``, ``r``, + ``mmw`` (molecular, not atomized), and ``rho``. F_int : float Interior heat flux [W m^-2], for the luminosity cap. lambda_gate : float @@ -160,6 +160,17 @@ def bolometric_candidate( 4.0 * math.pi * R_B**2 * c_s * rho_launch * math.exp(-G * M_p / (c_s**2 * R_launch)) ) + # Optical depth of the launch level to its own opacity, in the + # plane-parallel form tau = kappa P / g. The Parker rate is derived from + # a photosphere, so this reports whether the prescribed level and the + # supplied opacity describe the same surface: tau far from 1 means they + # do not, and the rate is being evaluated off the definition it came + # from. Reporting only. The level is prescribed rather than solved for + # because the activation threshold above is calibrated at a level of its + # own, so solving here would put the gate and the rate on two surfaces. + g_launch = G * M_p / R_launch**2 + tau_launch = kappa_photo * launch['p'] / g_launch + active = lambda_gate < lambda_crit caps = [mdot_parker, mdot_bondi] mdot_lum = None @@ -182,6 +193,8 @@ def bolometric_candidate( k_tide=k_tide, active=active, R_sonic=R_B, + tau_launch=tau_launch, + p_launch=float(launch['p']), flags=flags, ) diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index e0a7136b..1b021cfa 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -201,7 +201,16 @@ def test_inflated_launch_level_clamps_with_flag(): mu = 2.3 * amu c2 = kb * (T_eq / 2**0.25) / mu r_bondi = G * M_p / (2.0 * c2) - launch = {'r': 1.2 * r_bondi, 'mmw': mu, 'rho': 1e-6} # plausible photosphere + rho_launch = 1e-6 + launch = { + 'r': 1.2 * r_bondi, + 'mmw': mu, + 'rho': rho_launch, + # The pressure of that density at the wind temperature, so the level + # is internally consistent: the branch reads it to report the level's + # own optical depth. + 'p': rho_launch * kb * (T_eq / 2**0.25) / mu, + } assert launch['r'] > r_bondi # genuinely beyond R_B rate, det = bolometric_candidate(M_p, R_p, T_eq, 0.01, launch, 1.0, 3.0, 20.0) assert det['flags'].get('bondi_inflated') is True @@ -236,3 +245,40 @@ def test_tang_timescale_diagnostic_contract(): assert fast['terminated'] is False out2 = tang_timescale_check(Me, Re, 1.0, 1e5, {'H': 2e18}) assert out2['terminated'] == out['terminated'] + + +@pytest.mark.physics_invariant +def test_launch_level_reports_its_own_optical_depth(): + """The launch level reports whether its opacity puts it at a photosphere. + + The Parker rate is derived from a photosphere, so evaluating it at a + prescribed pressure only reproduces its own derivation when that + pressure is where the supplied opacity gives unit optical depth. The + plane-parallel depth tau = kappa P / g is reported so a caller can see + the gap on the state in front of them: it is 67 on an inflated hydrogen + envelope at 0.01 m^2 kg^-1 and near unity on a bound CO2 planet, which + is the difference the number exists to expose. It is reporting only, and + the level stays prescribed because the activation threshold above it is + calibrated at a level of its own. + """ + launch = _launch(Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}) + g_launch = G * Me / launch['r'] ** 2 + _rate, det = bolometric_candidate( + Me, 1.5 * Re, 1000.0, 0.01, launch, 1.0, 5.0, 20.0, k_tide=1.0 + ) + # The identity, not a re-derivation: pressure and gravity at the level. + assert det['tau_launch'] == pytest.approx( + 0.01 * launch['p'] / g_launch, rel=1e-12, abs=0.0 + ) + assert det['p_launch'] == pytest.approx(float(launch['p']), rel=1e-12, abs=0.0) + # This level is nowhere near its own photosphere at this opacity, which + # is the finding the diagnostic makes visible rather than hiding. + assert det['tau_launch'] > 10.0 + # Linear in the opacity, so a caller can read off the opacity that would + # put the prescribed level at unit depth. + _r2, det2 = bolometric_candidate( + Me, 1.5 * Re, 1000.0, 0.1, launch, 1.0, 5.0, 20.0, k_tide=1.0 + ) + assert det2['tau_launch'] == pytest.approx(10.0 * det['tau_launch'], rel=1e-12, abs=0.0) + # Reporting only: it raises no flag and gates nothing. + assert 'tau_launch' not in det['flags'] From 9f503ff582ffddb828c834eeecc92cf67913828a Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 16:48:53 +0200 Subject: [PATCH 061/113] Say what the collisionality ladder assumes Three provenance and scope statements that were missing, none of which changes a rate. The kinetic enhancement factor on the Jeans flux was flagged only above the range it was measured over, but the branch reaches the low side, where a trace light species on a heavy background sits well below the lowest simulated Jeans parameter and the held factor understates the flux rather than overstating it; both sides now flag. Six elements have no published van der Waals radius, so their hard-sphere cross sections rest on an assumed one and now carry a class that says so instead of reporting as a Bondi value. And the switch is the neutral onset applied to a wind whose reported base ionization reaches 0.86, which is the source's own deliberate choice and, in their words, conservative: including the ion channels would move points toward hydrodynamic verdicts, so the bias has a direction and the docs now give it. The collision-integral table also records which of its rows the mixture rule can reach. --- docs/Explanations/regimes.md | 4 ++- docs/Reference/results.md | 2 +- src/zephyrus/hydrostatic.py | 13 +++++++-- src/zephyrus/knudsen.py | 55 +++++++++++++++++++++++++++++++----- tests/test_knudsen.py | 22 +++++++++++++-- 5 files changed, 83 insertions(+), 13 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index c9f8ef82..637fb821 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -93,7 +93,9 @@ A fluid wind only exists if the gas is still collisional where it goes sonic. Th $$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell}{H_\mathrm{s}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{7}$$ -where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. +where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements have no published van der Waals radius at all (Bondi prints no alkali, alkaline earth, or transition metals), so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that rung on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. + +One property of the criterion is worth stating plainly, because it is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3: kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the band is heating-geometry physics rather than tuning freedom, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index b6a76c9c..78510744 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -69,7 +69,7 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| | `hydrostatic_lower_limit` | `True` | Always set on this branch: the nonthermal channels that dominate heavy-species loss from real exospheres are not modeled, so heavy-element rates are lower limits. | Reporting only | -| `volkov_extrapolated` | `True` | A species sits above the Jeans parameter of 15 where the kinetic enhancement factor was measured, so the factor was held constant. | The rate reflects it | +| `volkov_extrapolated` | `True` | A species sits outside the Jeans-parameter range 6 to 15 over which the kinetic enhancement factor was measured, so the factor was held at the nearer endpoint. The two sides differ in cost: above 15 the factor is falling toward 1 and holding 1.4 overstates the flux slightly, while below 6 it is rising and holding 1.7 understates it, and the low side is the one a trace light species on a heavy background actually reaches. | The rate reflects it | | `exobase_not_reached` | `True` | The extended structure never reaches the level where the mean free path equals the scale height, so its top level was used as the exobase. | The rate reflects it | | `exobase_at_anchor` | `True` | The exobase landed on the profile top itself; one integration interval was kept so the supply integrals exist. | The rate reflects it | | `extension_unbound` | `True` | The extended upper structure became unbound before the integration finished. | The rate reflects it | diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index b1e95d87..9db312cc 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -82,7 +82,16 @@ def volkov_flat_factor(lam: float) -> float: Direct simulation Monte Carlo runs exceed the Jeans flux by a factor 1.7 near lambda = 6, falling to 1.4 by lambda = 15 (Volkov et al. 2011); linear between, held at the endpoint values outside, where the - caller flags the extrapolation. + caller flags the extrapolation on either side. + + The two sides are not equally safe. Above lambda = 15 the enhancement + is falling toward 1 and holding it at 1.4 overstates the flux by less + than that as the exosphere becomes more strongly bound. Below lambda = 6 + it is rising and the Jeans picture is degrading toward hydrodynamic + outflow, so holding 1.7 understates it, and this is the side the branch + actually visits: a trace light species on a heavy background reaches + lambda well below 1, which is a factor of several beyond where the + simulations were run. """ if lam <= 6.0: return 1.7 @@ -270,7 +279,7 @@ def hydrostatic_rates( lam_x = G * M_p * m_i / (kb * t_x * r_x) w_j = jeans_effusion_velocity(t_x, m_i, lam_x) c_enh = volkov_flat_factor(lam_x) - if lam_x > 15.0: + if lam_x > 15.0 or lam_x < 6.0: flags['volkov_extrapolated'] = True area = 4.0 * math.pi * r_0**2 diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py index fd1d792c..733d778c 100644 --- a/src/zephyrus/knudsen.py +++ b/src/zephyrus/knudsen.py @@ -34,6 +34,16 @@ # reduced integral to a cross section. The implementation reproduces the # measured room-temperature viscosities of N2, O2, CO, and CO2 to within # 7 percent (see the companion tests). +# +# Only part of this table is reachable through the mixture rule below, which +# is a mole-fraction average of like-pair cross sections (Chatterjee & +# Pierrehumbert Eq. 25) and therefore never asks for a cross pair. Of the +# thirteen tabulated pairs, the six cross pairs are unreachable by +# construction, and the four molecular like pairs are unreachable from a +# dispatch, which feeds the switch atomized element fractions: (N, N), +# (O, O), and (C, C) are the live rows. The rest are kept because they are +# transcribed from the source and a pair-resolved mixture rule would want +# them, not because anything reads them today. # --------------------------------------------------------------------------- # Table 3 (neutral-neutral, m = 6): rows are (c0, c1, c2) of @@ -154,7 +164,17 @@ def sigma_zk90_hydrogen(species: str, T: float) -> float: return sigma_cm2 * 1e-4 -def sigma_geometric(species: str) -> float: +# Radius assumed for an element with no tabulated van der Waals value. It is +# not a measurement of anything: Bondi (1964) prints no alkali, alkaline +# earth, or transition metals, so aluminium, phosphorus, chlorine, +# potassium, calcium, and titanium reach the geometric rung with nothing +# behind them. Species that fall back on it carry their own provenance +# class, because a cross section built on this number must not be read as +# one built on a published radius. +FALLBACK_VDW_RADIUS_A = 1.5 + + +def sigma_geometric(species: str) -> tuple[float, bool]: """Last-resort geometric hard-sphere cross section pi (2 r_vdW)^2, in m^2. Uses the Bondi (1964) van der Waals radius; for a composite molecule @@ -165,13 +185,18 @@ def sigma_geometric(species: str) -> float: atomic N), which biases the Knudsen number low and the switch toward hydrodynamic verdicts. The provenance class records which species sit on this rung so the bias stays visible. + + Returns ``(sigma [m^2], tabulated)``, where ``tabulated`` is False when + the radius came from ``FALLBACK_VDW_RADIUS_A`` rather than the published + table, so the caller can class the two apart. """ base = species.split('_')[0] if base in BONDI_VDW_RADIUS_A: - r = BONDI_VDW_RADIUS_A[base] - else: - r = max(BONDI_VDW_RADIUS_A.get(el, 1.5) for el in parse_formula(base)) - return math.pi * (2.0 * r * 1e-10) ** 2 + return math.pi * (2.0 * BONDI_VDW_RADIUS_A[base] * 1e-10) ** 2, True + radii = [BONDI_VDW_RADIUS_A.get(el) for el in parse_formula(base)] + tabulated = all(r is not None for r in radii) + r_max = max(r if r is not None else FALLBACK_VDW_RADIUS_A for r in radii) + return math.pi * (2.0 * r_max * 1e-10) ** 2, tabulated def sigma_species(species: str, T: float) -> tuple[float, str]: @@ -182,14 +207,16 @@ def sigma_species(species: str, T: float) -> tuple[float, str]: diffusion-inversion route for H and H2; the geometric Bondi-radius hard sphere as last resort. Returns ``(sigma [m^2], provenance)`` with provenance one of ``'laricchiuta'``, ``'zk90-scaled'``, - ``'geometric-vdw'``. + ``'geometric-vdw'``, or ``'geometric-assumed-radius'`` when even the van + der Waals radius was assumed rather than published. """ base = species.split('_')[0] if (base, base) in LARICCHIUTA_PAIRS: return lar_sigma_diff((base, base), T), 'laricchiuta' if base in ('H', 'H2'): return sigma_zk90_hydrogen(base, T), 'zk90-scaled' - return sigma_geometric(base), 'geometric-vdw' + sigma, tabulated = sigma_geometric(base) + return sigma, 'geometric-vdw' if tabulated else 'geometric-assumed-radius' def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: @@ -229,6 +256,20 @@ def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: # point and sustains a hydrodynamic wind; above it, the gas decouples before # reaching sonic conditions and escape is hydrostatic (Jeans-like). The # threshold's physical band is KN_BAND above. +# +# This is the neutral onset, and deliberately so: the cross sections above +# are neutral-neutral collision integrals, while the wind the switch is +# applied to can be substantially ionized (the recombination chain reports +# its base ionization fraction, which reaches 0.86 on a heavy composition). +# Chatterjee & Pierrehumbert make the same choice and state its cost: +# collisionality rises with ionization, because ion-atom charge exchange and +# atom-electron collisions carry larger cross sections, so working with the +# neutral onset is "reasonable when advection-dominated and weakly ionized" +# and, for characterizing rapid mass loss, "highly conservative". The +# direction is one-sided. Including the ion channels would shorten the mean +# free path, lower Kn_sc, and move points toward hydrodynamic verdicts, so +# every hydrostatic call this switch makes on an ionized wind is a call the +# fuller physics could overturn, and no hydrodynamic call is. # --------------------------------------------------------------------------- diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index fae6e5f4..f2474c6c 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -23,6 +23,7 @@ import pytest from zephyrus.knudsen import ( + FALLBACK_VDW_RADIUS_A, KN_BAND, effective_threshold, kn_sonic, @@ -143,13 +144,30 @@ def test_ladder_provenance_and_geometric_bias(): assert prov_n == 'laricchiuta' assert prov_h == 'zk90-scaled' assert prov_he == 'geometric-vdw' - geo = sigma_geometric('N') + geo, tabulated_n = sigma_geometric('N') + assert tabulated_n is True assert geo / lar_sigma_diff(('N', 'N'), 300.0) == pytest.approx(1.0, abs=0.25) assert 2.0 < geo / lar_sigma_diff(('N', 'N'), 1e4) < 4.0 # high-T overshoot # A composite molecule with no tabulated radius falls back to its # largest constituent element without raising. - geo_h2o = sigma_geometric('H2O') + geo_h2o, tabulated_h2o = sigma_geometric('H2O') + assert tabulated_h2o is True assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12, abs=0.0) + # An element Bondi does not tabulate reaches the rung on an assumed + # radius, and says so rather than passing for a published one. Bondi + # prints no alkali, alkaline earth, or transition metals, so this is + # every rock-forming vapour species outside the seven scaled elements. + for assumed in ('Ti', 'K', 'Ca', 'Al', 'P', 'Cl'): + sigma_a, tabulated_a = sigma_geometric(assumed) + assert tabulated_a is False, assumed + assert sigma_a == pytest.approx( + math.pi * (2.0 * FALLBACK_VDW_RADIUS_A * 1e-10) ** 2, rel=1e-12, abs=0.0 + ) + assert sigma_species(assumed, 1e4)[1] == 'geometric-assumed-radius', assumed + # A molecule inherits the assumed class from any uncovered constituent, + # so titanium dioxide cannot pass as a published radius on oxygen's. + assert sigma_species('TiO2', 1e4)[1] == 'geometric-assumed-radius' + assert sigma_species('SiO2', 1e4)[1] == 'geometric-vdw' @pytest.mark.physics_invariant From fcbb47dd8da0b9a81210e3245ce6b28cf6ef0f5c Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 16:53:32 +0200 Subject: [PATCH 062/113] Order the diffusion ladder by provenance class The pair ladder reached the Eq. (10) scaling before the measured molecular-background compilation, so an estimate built on a hard-sphere diameter ratio preempted eleven measured rows and read 1 to 26 percent below them. The ladder now takes a measured row of the published Table 2 first, then the compilation, whose rows trace to the same measured primaries, then anything estimated. The pair that separates the two orderings is hydrogen against carbon dioxide, where Table 2 carries an estimate 11.7 percent above the measured row; its test pins the measured value and asserts the estimate is excluded. Hydrogen through a carbon dioxide background is the Mars-mass case of the tutorial, whose supply-limited rate rises 0.8 percent, and the quoted outputs and the track figure follow. --- docs/Tutorials/dispatch.md | 16 ++++++++-------- docs/assets/dispatcher_track.png | Bin 258528 -> 258533 bytes src/zephyrus/diffusion.py | 27 ++++++++++++++++++++------- tests/test_diffusion.py | 21 ++++++++++++++++----- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index fa6c84b3..3869cb11 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -438,9 +438,9 @@ for t_exo in (1000.0, 2000.0, 4000.0): Output: ```text -1000.0 hydrostatic 345.3493715507801 345.3493715479417 7.746587977671953e-10 -2000.0 hydrostatic 351.51013842063026 351.3803695476915 0.03541670869293938 -4000.0 hydrostatic 1553.1885864133374 357.67085653574424 326.2824298111698 +1000.0 hydrostatic 348.0757562039205 348.0757562010821 7.746587977671953e-10 +2000.0 hydrostatic 354.3317635509398 354.20199467800103 0.03541670869293938 +4000.0 hydrostatic 1556.0942672561685 360.57653737857527 326.2824298111698 ``` The sweep starts at the profile's own top temperature, near 1000 K here, because a prescribed value below it would ask for a thermosphere that cools with height, whose exobase is more strongly bound than the level it extends from. That request is floored at the top and flagged rather than refused, since in a coupled run the profile top warms past a fixed prescription over secular time. Over the factor of four above it the bulk rate moves by a factor 4.5 while the carbon rate moves by eleven orders of magnitude. The reason is in the per-species detail: @@ -455,7 +455,7 @@ Output: ```text 0.28260377845019297 -1.450974373622763e+16 258509561614714.28 +1.450974655098389e+16 260647390967054.03 ``` At the 4000 K end of the sweep hydrogen sits at an exobase Jeans parameter of 0.28, with a Jeans flux nearly sixty times the supply diffusion can deliver through the heavy background, so its escape is set by that supply and the exobase temperature barely enters: the hydrogen column of the table above moves by 3.6% across the whole sweep. Carbon and oxygen are Jeans limited and carry the whole exponential, eleven orders of magnitude of it. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. @@ -555,10 +555,10 @@ Output: 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 False 45.0 1.62 hydrodynamic:EL 3.542e+05 0.265 False 310.1 1.4 hydrodynamic:EL 3.045e+05 0.388 True - 1138.9 0.852 hydrostatic 4.695e-02 4.81 False - 3039.5 0.495 hydrostatic 4.695e-02 6.73e+03 False - 6189.6 0.34 hydrostatic 4.695e-02 1.58e+07 False - 9439.6 0.324 hydrostatic 4.695e-02 4.83e+07 False + 1138.9 0.852 hydrostatic 4.682e-02 4.81 False + 3039.5 0.495 hydrostatic 4.682e-02 6.73e+03 False + 6189.6 0.34 hydrostatic 4.682e-02 1.58e+07 False + 9439.6 0.324 hydrostatic 4.682e-02 4.83e+07 False ``` The flux conversion is worth reading in the source: MORS returns X-ray and extreme-ultraviolet luminosities in erg s⁻¹, and the state needs W m⁻² at the planet. diff --git a/docs/assets/dispatcher_track.png b/docs/assets/dispatcher_track.png index 2f914bf568028dcc70ce4408d2db433332472667..10a26b3655c2690e796b287881fb9817ca3f0f47 100644 GIT binary patch delta 180311 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

      @; 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�c*0E-!*FhvhrEsohF@?vQ1wU2nXW; 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 delta 180602 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 z⁡blwM4S&@)^-VLc2YbRpN5u^MgI{2@ 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%0D7u;8REVq-# zz8s#gWY_w|{vJ;Bwal_aI$xcJ+L50p(d?S>aN4@Z`TKo_Vu8Lk37v=cJyQPjOvlVYL3X%eq{)@pOn&O~KCCezpu2$QGkkDw?|(0VD%PkA`Gsh_ zutgkAkTCQ8zO`s}0b;h>3ByOwS=k?6?(|EjZHxDR%}PIXRt~OkDmj?A?`?#yL?8d} zNB7uX10wr%7_5iz$8~Ra{nX&BaDhK4-e(JEEW92PT|8v!p@Ql~j z2?prR9_T}j;XeoSg&yYV*S|RGyFnlApV#3QT*x}rPC@>qX8m~gpR+&u%jGbAxFC^V zr0V~Ef?qCc=%eN0nqSGE|LeTmb(ACPLsnG(uSxUC)wB%ryJX9JdHoarSSh~yhFZ^{ zROWE=*P{8~yX!L_vrl0@__G--E>>Vtzx`!fh`&^!e_s{zg*S|#(B*$+J;Ctf9dH;J zJSIUEpC9Sn&#hCe43HpYs0gsidjV=KFr?xBcn3}iFxdfJ*{|v`-R?9gsEJ_h5`rtl zPJ`z{nf-T-ZLAuQ<%|qL=LEt)-0kfsdE`?E8{M@!m%dD~Qq|U09{d1!DYK#QMQ5YF zlhnx$Ep;8|;zkz16nkCB-~h*|x;JelOg6Vehl2TY+S>iWeNY_j3+fmQs51YZLAVWf zjj9cB5_ZQijr5LB4P=aAT}a~Kd38$hS~rriXS|)&R$EEQCgP9SIaIN-;NtxT(#{4o zdv&3(%k|Yl)ISv;UqE?UfkQEwsLD0-rDaFzaJQ=5l`GIcD8N4~5kO5NP-#J>qW$8Y zLG&@zn&sS^>_r5)ci=1;9C%g<*U9^Kw;23Q{RhOS9Zke&TXprZNDsQ zg1NUQalK3LiEu!!Fx;~MqD1I)&17Ijgh+N1;I6Ll^|Dn$Is2=UQHlbVJrD;3HdRYq z_rU(y88J%LomX~u(Yo6Dp-A}9uW~Av22}0v5-)f}lFuO@tEk{MyW-1Up|0otK25Dh z;Ik;wPxR+ngW5>8d3g#~#o*u?o--2eg7S$!%PacfrSh`s0nxd1v$bBX--Hmp`{;8e z7H)oXeytne1~`kZMlwbu+k!J|q(?9S8ShpZ%q!evUoHC*e2uRX|L$CHHmGF?6(L*t zxRU9}9w`{F2k&sfhS8W6p?vmS|MA9reeb&5wzStitF%Koj~@@J`iNLd7Y@Y5F(*KL z`s>)ncsjS7azy>y`Z$xsdL}U2k0qf{-c<_kJ$7)oTZUcnT^TboNZ2H_WKLlX)|;~8 z)K%V}8^5kagPvx$KhkCqsKV6jV-v)5Z|N$$q{zlR{o@!K_0G18SJ&36m}rE6PU-#w zea$C1rJxL7ZJOSrM~9kja`HKxIMNhkVVmC-Ska~-m%{4sGs6Xv4A3@3A9`Ldcic_a z#p?<=IoS&7fVBUQhqYnJn6K~1)YXDVd3{KZ4Ylte%{oaulH_1j;5 z1~a|-N)ApBBLG;*aLl$r?s+tRt-%ON?L*c5HoiSrD1(lQPU_)l!zfHFEq`aWMMa&I z&l{iD%DEX4{01dT%&l03=jL2t{0`R!d!S7ZbSzRI%-duo$HH;|0jozX4gBNo2cJ)P!jzoE(#W+)z>F=*+gt4g~lj_>w z{k{3jx?A^;;sB)F0^R6DO(8CmM~lKEP5;Cd_!A@i46(1^%cOMz= zii$P*Mo8!}tZPUY)J`ue`_@JDk2Hix-mfFqO!@>BwF#{hH+b(dQDNUj9R-xyrg%j#F} zamD84-Pf_MJL+Eb@3P!`))12oe$Uq5vz8f|-g{6sD4kfUAeOiT-(`hyrw`sMn*DOd z%e51bADl(+0bLEeJ7{Y|wmILj3B8B8T~rScwNAU-$U-_>u^O(;4f@x&$gCHxh!x3` z*Yv^i(ao!K11l^vaX(7j-BMV?^nN;VYw}qo;43=g667w6jRN;-v^h4+8KDj*fQol> ztU^)rv#$h}mD6tYKstMyiiKA0oUHrr3BceXc~N7JTSq&R#}@x9ncxWs?!N+{?LvSR zfuuF50Hyi4jzWLJg65?A)i%Xk!1-HNO71?|st_TZ9oRg&cq$V3#7=L5jN9j;aP}*= zd@JlH+S8G>Zdy{LYLJ4 z!Im_*f-$O-!wB&jZH1=holkxUMYsG;OSh>ia>1mJ*2KZ9mit~B=!>}>Y6`9*pW zhUD{xEPaxm^Psl_&arI=p>7Ewk2$Fd^s+Tjt-Bn%n3^YygCS6USh1(!lfKt5Ed(<+ z!!qgE*a2~pqB#MFtzAC9M!gTe=vl39 zze$dW2NV;>On4A?sM&H8BgruxcDmubXBbXv#l#b$`J znpudY)ME>1$0CdwxU)eEGkobe7t1tg)dgX-)32>8Z81m1ebx`4Y;_b0_T}pg{>Q*> z0)_Puk8X;ddsIA7#;ONxkA5>SjH|J9ID1Agw}nzD+$$Cs;B2{5JPFa$L7Gp2_!fU8 zZ>mWGdx6ng%cV&KT9vOl7!@Wr85&P{!~*#ouW7W~6N-kwGIHeB%q+~b2mShj$8*iN z0`_84QbOSO)Bf5M1e$eEj=oVz%fHTN(s|6i!h6b4XTzVk`VfZv3IuB-RZl+ww&Jb|(zwyS-vqtSY%Xu=bDPt-L4q3``0D;=&%SzOK;rk; zp?G*G2`%&d@}Y4MkcaG2l2~2&Qt6mhGivSl~BQfIR8IA%iljL)Dnw0)3J!VsN zJ?E#eX^rw>=b%$<7v6q83EfIS**$%>^Qj`>$MNj0+HZo>lhV*$hm1W}ZcR_)tnAaa zhczoN(o#Zs|22`LJ25EaI`~(o8V}FcT1_V&6tH*S0hjKnCXy?fR)?`@&DN+iR|JZ{qQ!2cwa5rN;WA)i(UYH=*^)0M(nag(aJBrZ z^~pHdc6R2}O4kLav3DEz>y)%-Cb^&W_dRP`{&O=}hCZBxoAFC^TG55C?+X@zya-Cu zF?!3IVW}hRBJoAK38B|2iacIWM0plo4x`cN3YrbF2t<+JCX>Z0uuD~9&6-;ZcC%1R z^!o#Xqx3W=U0L{V-NKqc9Tu;jC5JoFdn@$L`*vho#vB6iDc4mnlYs%N9WO~IuXK_B z_^imY+Fyvi?`$6M$P`@wVryrZ)kcKQ9Xjp}XXPA6j&>nr3wMjJ7<^Z#kkM1=T2q{9 ziBi!@&Nm4k_SX9T)emDav?8(sFEFWIIQ&(PlHYd{mXD%0Ja z!Hxf4&CQz226&5GTsYh`7l-P>R|JkJI=_@t7wL1t0AmGRAKrH--L6=8${%sg&J05Y zrkyjoEJpq zVvAD>t({*5xpph@)gg)~|8=nk2w2c?*+b5@r8DCoT>9k`}X|i1?eb zVh;B@3fvMkaaS)q0FXZXtTF5k0C-t&lyjUc)vR@(jSHR^5J;GTjxH1*EosVXMPviC z;5c>X#m#c(mGM`hQ{B=4ES7z>eLEK~FDZvj1T?{hF6ni&aP!X(u^_Dpe?%l;Nc((& zz2zdZ);?}yj=N7h%gz6Q!e7PL9co9qcJx_HQc|m8NA_d0bTXzO+*4CqI}O#M=wAGJ z02-l4$&-8Z!{rkNtlHEDML}iY%r3E8>e{Z6K%O&;NaQ*bb@AS&C2Dem5INEX8oAh> zTq#0gAKrbE9m>(tiOmP5aXjPKT$A z*gn68yg#XowaAm0q=ys44f^>z910CfdqztM8+NP4>2_En-BcmOt+HjWUe+cYkUgey z=~GscQcTGtfzBugw>mwJ%<0f^5d;_<+o-)gPd(2nW6l2ibkdP9VYk>p#a9sv7?Y#+ zk7V!M32I}_!*eB~-Th!9{AFIG2)$DaMjLnX&BQ&V_a^G$9yBO}0*1~WuUOl+Z3ZX} ze6*qH4NxiWmgwG9`G?tISij7DOk)r7q{7YD6uN$nHs;5&BR}i5eAbO_Y0b32Tjo)F z7ImHHm2k%0->qgjXZ~7RBi!EqKjYWU>a~L5dw6pF$K5b{iEVqT=|wVM&~jT4jE;Ft zG-H{l$BUD(jBSp!^K96*ZGY3JCMBf~CL<*N|GXV2p9PS=y5}!&T_yr}6uOx`dSHLbSD1znBu{Ss2rkD|qnQ-GzCo;)_ zBhGWj?8FLVk;_d@EZ?2KxXVjgOyiiZzIV1LU2!6jm#N2Dux*mVQ~&*%mXvGlo*`jL zohiHj>$Ar2{Uh(4b^i1FE7u(MjpABA9FafnOu`!=zy+k>x%fhIuu`0--^G?-SZ0fn9}_Pma!iTbKbL}o#movmm=^w05? z1wKv-6{wm+8#lEV8CjLIbWlm`*rR_w1AqPGKr!8BPWLfV7SLd8gBCU=UyHTn!h=7= z$@NWZn-%&w3feg<$FR%OBMln!WCJ(cS5wNN0`!tX{$I_c&~GsdFi-Cl z5Qc`qPgm%U#QE|1hMidXcOByy)It_Piw20kA0_FzHzaA+|C^IRzjw^`$4jqIwxB+9 zUR)eHnN+0ZJI{78nl-;glNnuWtyw9bI>biLusUQTdnSo7@@Q@G&v9c5{Hz*Gye9CT zA0{ExTAK5tPFXH4o_VJXr=7vW^LP$5dCLsxA}4$38$YltZ1is$20hE(qiEusNc4zx zrYvLRNnTN|y-I8PE!y0A`I<&=MejhiAQ~8VrTIL;h%73j5v-C3{NERz75@JF?dn^# z4nkJr)AFAY!C%aWU{FDI5=&3o#`nmr_L=!QgKN|6yrz$aL?{JvEG0_QesZl>c!sZv)lSy*WHWYv$s8u2{Q)B3 zAd3#jOWH>bK>+q*qG07TN{YIH_L%r{>^|b{xXtX$ZV@#!saFHs?!Z)1%fj;6Fgc@0 z`^-8aw>Wcw)j!Ro(QhhZp0FPu`;RV9$e%V(me~1laBqYSt&s@VuZlnj{_D)yKR<^C zkX82-wMX~ZZM)&K{Oo#uxV*2Xva%oOHT1Nch0b|4(R-G2cmKB$Vc1u>j-Vtq!#p=xnvVd2Nl?|v zQvmG#WY`8`?5v~4;9D{8JjC7nH%-FtWW=Sule@vzy*vPO>JAqSD=57K=g{LG7!Xu# z`WXl?cOcc00j6KE0>*=^`7f=FciBC;M(OULk}U+c3(7)^<1K?nHzbS=)zL zb;Za|=(0@mx#XGodF9*IN~#z1)FLAzopc}vocHux6WMs&Q*H$DmEaImV`pb~y1$PV zg}FvczJ6Qq5oWn5RgZFz-KJ{pgYv02shA~!(dKb`CawYh8YXDT`u)aDorZ-;Xs%nn z?M`Fh@UUpcHfR_Jt!0~r(nYeZt9FdHXDOUZPEM!@Jg=guBa*95>kygRAi==kbc}~b zcV}?Mk5L@O4jG-(XwvWO>S~U*QkSgR2^ONVXEdJ z9$NmWo~OjTmr_laIn~tfFy4jbII|jA++G(~)igLh9^c)CACLhw)K7^s@(~RIBUw1h z{-8o0FpJBCfdK<=Hd?aI0o|rsyFt&LmU3fyZ|QVH!=+F@C!`=KZGqM2g|p4!w8rWgMww{G6jxr2y)(o<;0YAtz^^YimZCPcQz zNytOlr><*BTbUEg$>++X^Yp1%Y@lJ*9Xd_d$(M(1HjnEn_-PCtu2$2pn+u)@DK`>& z=3UI^Zs+GeUg7>;S}Nu1y=sM2t@NK!Fj+}J!gT<{R{1x`yCmADQ>lrQHsDixxIXCc zK_yLPkxs0-pp&z+;fS^sFE78TBJav{L;sm@)SN9KS`K3}Ygy%wlqM&1GF>MuRL^(t zw|VKkwKlZ?gJ6a(&5?!4CW+agIB9m)n8tXS0Uagl?X*IK2lkck5KMx~#EBIfd<*xz z%p23@i1Y@J^|Dgx<$iq=R%zCrbvrd+Q9pQ?FCq!h-zb7!V1j?NjwL`Oq)x(4Cw$ zWDFT{@7FPeG0fJ6=2m9p7pve~Mt|f44)JLFRcV}kxjqBTwlZ?48sB$ZpL9c4)f4B_ zn^>mj*{;S-z1hbHb)=ssEG;eR{iMmk@xee+JZxqMn5u)7qS)6mlKLkmGJbx%)+Q{$ z&CR`1e~99pn+5Aq=t^Ith^;F!5t2o2$|d;6HJ;M2+sfe4nKM~(d_~yKklueeUdHtM zrqbC@C-U~MKS_(F46zYpetKT5wj%|`@!T2r`15^(r8O4D4u=V)VEJ*@jC~9q&rX9W zA=gEz8!y}}FDt7y%&MxXkv;z98kb5+fU9d^#AQY~D0mO(>4@MEhv8*20^i|-M}{Bp z!`)>Xy0Bms$i~58)r?g+&zQP_;TR1yUBr;A0@kC+3xD6p$Kz|TpRh84XEXZBuaD(e zJG>YkKH|2}Mna)vC!HJ}hhHReyw4S+)mf=QVXs7P=(_O-ft4)o6&vr-=6hhl5(ngA zjbw-|;V=kImrcw@Ip$$6OfvskL;u{|+-GmLBwx?JoT4);z;Ah9;f1R!Yvk;Y_xdA9 zhI0N#uujEK+#l-c1@fp~H>!&ao|`m<{NDzKnJ};>KfoY1anQ!wZo0YHW3F1++P-eF z=uG3M2$<3$S7dJAWPv}}& z?P$-DDW7q=4~3d}IA2Q-i$J_YhIaBtQ&Q4IKqm+iwd2>`*^hO{a#qNnMfmu%8!lY} zOcZ+MueWSYac#Stq8eKeDv*Nx`ob;ZvX%Vkvi`g)w-)ZSm_50qSbnLGje)@jzR|=o z>7I6lT$fn!4Vm-V!DPEUJGe8ZSF_mJTfm|%<3OUkkz=^tLp`t@T5KIT%CTGQBJACe zK=2U~^;V*%Uan1WBBB>vUvdTUl8H|52q=g|a393f*y1ST+}E8`_^l$HFApC+jLips zq_;8f_1o8%#fD^_y#4x>*Rv2P*IB@XFGz9!|pLk0Lw83hJyyuJ`q2*M!8w!o-)HiL(y=DwJ)Wi;x12D z+j2@RDS2i$Z{0*EYI~s_-aSlM<*{tA@|t*8bFvOge!dXx`LndvVvH}3j?Z1BGwE89 zHqhZbkhjZoH3!o*axbmetaW#>S(eG(z1#Tg6hI@UZFLHVO6SaOR+MoqKl*zQtMJG8 z^J@WkJia~KJV9jZoKi^RDYj4vPH+bNYv+3=Pfu@uC2U7eYgsP3mRJ`q=bLNRb$yew zgToz|3j<}#xpdcqxT~{tUWpY2w}es{?qFw|e%Z zf0HjPj>t7m2Kr;CrY^R?`e8g4O^mPh^pKVQ<8EQlXtMh2wM^|6c|-A1V6< zWh|?tu4yLXx6qnO#Kkaky(RILm2(nXHy^5+UnK3kFr(*_#s}NRJFWc(5dXOeX+47_ zF~KXroUwDgPh&IxH`4RJTZ?4>|Y`xcAll&k3gy4m6Pq4mDo+@hepoMT<( zVt-kc<}|t8Jj#VWCIoxnU$uJK+6rQqWddz&ZVJOps%kPylt3+3jiEQj0*Zi_vmQ}3 z@ux+NQ1`NU8JR!xLho&5i_^Jt=QLMH!Yeq-*e&xTfIVEQDJ{+Cs4brEu8@(Jue0vV zRXpA$l!T>I$42K=;Y^hfw9}ybNTM)5869Sg6{2jeU02-dJ~ZZ3G(Axe!pk%#+MQ+M4Q3d|NbIb6H4saEF2%86mLRbCHJ6r zMVPqvT|ju6-f0CA%cNUet9iz-zn|a7va-0jin`X(`Sy64zP>&iB;P%*l$BRdYH1P; z#hbjsgJ$PKvYhGVq$?I*&yP`3FUQNKXty<@zUZ6sN6y;!7j70U(DC$|Dh@-4e-!tY zm6w~1Ekz02sZ#wD>xYvM>((nB=*Ia(iN+i09!+gV(lN@91#=u1P1!_U`BrQuCvvlF zc^HoAwPrsK`-af`n`VH&xUyPtp=f^ItIhH&UJXFLs~^Plu!W0}Dg@VHrsH33s%AP~ zLUA#R-*O`G{Pvw^WbVk>A)0mPt_%&YD10+&{o4qq$+Tbl9#eIo>WJT|%PZfV215zd zKFZ|T>Zi1^*4C@uOLLStLTp%ASftydw>y@GYJ;eiI%!}wHiv^%0oRw3YjWjr&DZ^S zjrXCU3BJV(x6DXZm)Wq28EMQdsp+qos;hc>6fD(JA3f@SGSumWK$xQE0xs_b8s3e} zUbH;q;!MUJR?V|+aj&{9FaOzPY-lJbi|~WL6I<2$T@S`znG7D@Xpt|0IFd!SbhSPd zA?BdVTfCa_G2;fyw-mLEq>PA;RGa6{J9wB41P^gUMT;#lj@A=efJt9#pSp^I<6`Rx z?@!_^nmZ8_+(w3XQ7>NT5j!|s6ZFr>3vrX*>z|n;eC|J}KQnldS3!Y4O;4KNDm7t$ z`J3c-zP^4ces-7o{CwCXlEFJshNp?gfI2dDI=JWDX#x2nyhyRCrJ;PdC>kQkBdpqd zw*drUI}(n1!(arcrDZ)4InL>D!$=ay-NwGb)Vmcm0bI$qc8{h!TD0ATA7F!%o>vq(*`Fvx9vJrXSVr=M+jC{+B9~aq#ZSTVF zB5X67-Mu)4u`?&h_=-ItG^r14VmOuxF8wW36cG7wMijfsTy}B84JBi-cvAtj~bI_{e zu+ApcSm$PQ^0hBzR$2^-9yhfM(s+v_qSHGZg!m@~51bAW=!NEeIVYL{=#M=@86yjh*}FuUEOv*c68U&3`ObZQAk7r7~EEGH(C>R#}o~tQR-?yWGdpHXqpS8a36XTd1Tf@ zMGd=^;aFnE4QWak$7yuF$=5DX0**q!p~|KDqcX-J*>XJeXrxGz9xpid4RdYCEbc+o z4*V^U5SF60cW{iBI_TO}y9{$O`dswZdz%+`hp-mYY(|pxL!l@G0|$$yh@5*M-6m-t zA>^W~w{}qp0!9bZZosO+o#s!`Q}-3UdcFMmGr9V#`xm&B3O_hIOn!{i5izTpX%3yD z9K=Vo%ZCf6(RY#o0jIk)Ae?2W~c1kB)I{4N5_R= z4x4`W=M^s6Zq-)JubJtJJ1%Zsd8}w{s0MyfNA<$V`@Z5&qPkrNHA=T`L+7Zk|7j!Z z1ThB(2fP)ilaw2c6n-z$&N}&-w`Of4!wlMXTWt*|?<+d%hn$v+oFGC($h@{vFO1aY zj-O0+{JhsqV4~LC?V?`JlXLJp=RMaK*q21Tb9LJ%YhW{#hA6@c;d?n7+?R@F8M?!|6BB#*j(@e%t{xG!0!PQdo_J16^ORfZ+L{` z++1k$!US`x`tH$Yd%89((wpEk9=f0r)1XlJa}Ij#gsnDkWRY3=HqqyPR7@5}njGj> zy}5Cj-?U83d95~B_2jV<%dvrxEA+mw?eeLlyVecI#AX+ayM&?@oXufN&o77o=mVNm zpfVny4qxFFDcU|cwz!i%>J^3To)#A?7^VhC)_vMO=?rm+Sb;qnCM&GEyW8uF*iSZt zRehYF08!eAmznrh#vKtcT<{Su@#-=u(HA<3t!{Us9sR`zk1J27&(=!TD4OS{fqs5mLDE+*Iru^9$`+msmHK*LOHTKyZmfP;uA@8@m zvOHI3#+!6w`cYdQxwkjNh@B<<7M0RoE>+4qN=m-MngX%-a+zV433wMkMyg(xv93*DqJB_T)IM`-O5JmqvNF_iFu|#Uaiww`JxbK4{*j3$LIIhPsa@y zxXlbY$jI4s3rN^ZPdkrCFxm~YzM8uqc1X^S#~rC z$-dub;@N(?Q=0vREAB~1J=-Qe+hHBs8bf52xjEIevo&}($JiP~04-@9!;0w|HuVvk z?%`$-8Z%_T^mE^U16LOW-9_PwN4tEBe{Avyj?c%0#DEN5M<7(rTNVbn&39Z5Csm4u%xBtejq zir%qDWstOj93youmT@$7@(kB}sA@}AKP-VzM9k{F&iAHLDQxkSfe+y%P}KN_Rv!wx z4TaB7NPJ+Ia9)msY-4<+4#u4uQ8hOY*F|WYY*(M06jLL}bBnFCO1Z{zFuXettt_8F zE^}PWT5-+1Cmy!Ub_=R=Iy~K!JEhL_$1-(+5jZNaUL-E=9q&1Kry1_|@rcYyN!T4Ej8SYqvAx z@ykVt>7fgBb(2?MKo!qL{#5nmntHLAGm!{?1*w%K*SvXxqSks|r63O6P*Lf{j1-7p zCpg4!^eivPI$t=&uPTA83Cm%N7VagG-KnKFBE*p6E7LzW6scnCyww}ZYf;69$_m3e zt)!lWy6oe8kn z7&+e!lwq3t-XE(92Dr9hViSFAVRmx2F!IGcuqeTsIZ4CcQ>e}LfwZ{BX*8)YjDqJz7C(!&Fht0>pT9%c{N%3UXkfzH|k0mYd!y>Z<{9*gXgY^ z;Bh2yDuX;UlyK&oXtY<9`yB`aMy4S-o`PA*fp#t5Z6+YK<-8K%`($nb)_H^`{~Y0P zWI%=8c{J_9Rim~Nk3~K>mi9Z_kH;-}?QVE2u~s*&efWB5ws|u%{sTepp|?}XXGZF& zWXp8s(eC)zLp(Ym?0CqB%^v1$Vnayg9F!eY3Nh2gbq)$DkiXOVWN*s}>aYpZgFAvuK) zXVq4my2uO^0m}x@S}m)qdiRJ-_zDHlwa^PKYsCxmV12=nRIp#&QHkiA%k5;?d_Vtk zJiq1G`GU!A5w_JAkLQ=mJzI+$b_e7J2TM6&nceFnJRf@))oR6o=2dQui6YjX9(CY= zfA(Za3@gccrRDnW(U!WOw;_XG56KC3W+$w;J8gF$w@!7h>+B&O{<4YuCMT_LcE%kt zr?6TYlUQolSdQCP2IQyVL!4%FmYI>;;}f;b z85xRz9rsB>lf-Uoa=Y;^pGu=lCfgiJGVaLJX|notnr?NbxX_HhMI0J3chzs-$tYM> z2RgVA7<5k&lFrYcpN?TKrzKH*e}(N<%yk zgMU7*$?tHLrh4kNR}w_o_MgES!py8%>M{};~k{1`YGdn=qlhM*DYi3w1J_L z`^(Mee2~JM>sRMUb)fM;_r>MRvDQ~Ao?(n&2<%1$JG(m5M!U;brB)$7>?J+`o+05g zPS>zd%rnNvg?Ewq-Ya#bsiU4rnZ*Xs12SaeJPcuj-A)H zn^;E9kLMV-zdS9T3>Nu;8>SWAqaSj@_I@qah(u;xjX&sc>RLB^6iR}w z;w%^kj0%n`kQk@rhBIl?KJ{9}K`9_0;Gjk8BSM$iaSjfCv(A#_+572g0I<{sH%G=7 zilJt}Fc^Jc+f!sjsvB+m?B+8RN-)TG4-pkxnVvjQ>__G&^gFuDzQ}v#xxS-R2cC=n zvf@I?K}=Qe;cwY3(hu2IiNaN1DT6I!Y|aT?*Vo0xU%&BH@I}!@kQNE){xR7QA3OA2 zFAe4tBoCSe54bm&@rs_3Jw(V428U(3NA5174QU3PmA<<^)Iy9*Nd+&2vrUpqN>1=Z zkfX-&yFMp)kBYcOLPi{&Up`30)j)O;=jFelFnI3MZI34MCWey0_FR(~zG0hy#H$N9eVsHNVrgCxEKU7I_MUm#7GU{lj_L9nm(176YJeT{SFxif5% zP~%JJWoLMoD07gp!9!dO-F%?XBjxV?Lg#Y*X@8di?ofVPx@a?!a!>ho!?73A+A_X? zM3vsY{nb(TAKft)HFLKL%i>O=r{$c;=d8i#t_>D-q^MS18-x&HB7IE^3uOf%oYJcE z);%2jX)@{rON-#|ZE+9X@V7)qdX}aPy&b^^7t;Ott){8ip2Lb4t)5u(?bulSZ5zYl z{Tf3#zU2wz3oMtXHK9{}{wlj_+LoB+RpVa|Mu-PPn$eV0Sj%&W?fF%!W=m07LigY8LN2ED~N_QMOB@Tz~I^?%Dj=%T) zzU$k6c%2JjpB>M$;=b>-*4Yd|CG=gj;obYu3trn>4#^T)gQQYDf*Wvt9Z&xIk^u+& zwNuBu1w8VB-)%ZadBWc1tTx0-{?VUDLJIVkbx)LAPP-cw@0V!>IxY?^1{Q;{PU51X zP(wyyFe<=phVqO`b@*f4C~{yI7wcyqU4NI+yx5!HGx5j`+C**J?`}qH4dks|7Y0BC z%|Ura0dd!=bag-jY1F2{JzVRXPrkC}#)(t)o8bu0(8lbH{Q2a`yUi(VSDFXipBOu< z=iQ|e{Uw!KUc%hqqIvBW5Jc{ed{bq$w7?e39&A}DR<(jW8E9C&y3+<1GP$>1U>Zyr zd&7>2UL9?cF*qh4BWO`bcy~<&t0AG9VK#ilGQ)DWU}*o9q@}ZVtz%Ya&JZ$kdkY|Q zkG1MT;E|(81<)*L(v8WiE5czq=eIIk#^b$`zD!!kNs!sPoU@LaO^==gH&A2vbh=oB zDRO{{#F>i%*!ks^PryZ8UfFEl=y>HfV=Fkz$dXD)e`u!7UTKF?*#!QPo(5hdr4~2~ zlfhoK&Jqcw&`!wCJG%E&{Mw5loNC<@k80I#oe$6@|39FeWJ zHc9019Fc%Zy=3L(RUu;CVmH{8A3>1A5t$3?#1ZNZ0o)Y8KP+t?aJ*1n&jgz|pkkLp z(r!c`F2MWb#h?TrSLcoT>0YRO1DBoj2Z3kvE| z82N@Zbl-^xn-)Rg)yLeI@W;oVC@E2Ua((BRTvU7Nb%Io6E}!c*O62%A{X?T+Rr3q5 z^F`H|19IPMUVqRy^tl@r=jQ&41z_=^Uy&rRsa-+Sc6lC14`ZdHyBhFayjC5G=q;Zh zU^Xcq!UE{1e%vxQ z=nv2Xy#H}vv+l_5-UMMf4RxNq)xM$7S-^5jVr6*9N-bgAf!AS@ey_|k7s^QZDq@h( zl$8Dg(`>-|)1E&1jGuuhiBrq}-4l(7y^uKxEoUaJz~6n(aa9%3_|u_*oTW`@LiPpS z>|Mulh>fA8aB$exh@5v_T`G{qkIT|)_7??E3=-uAn)>WY&YZm}b%NqAMUt(7a>}H| ziNBVdH0DtRiR<8C-zf|E?nREXm#_F<4ix#FJ)0-CU(TF4i_*9Rdf0{IVxIhaIc$-~ z;DM8e%4Iw3VVuj@!*yCEBeXVUo+Opv_P!1BHdUqPO!j?(6j=I1I4kiaY`;Gni1p8J1(vM0lux>ZpA>?dm*+4 zQR<*IAieE#%gewPddP~F2Kf2$iWHb695wAv{YM7WnsJw2`*9abE_}CGxVAcSTvt~w zmls=D7>W|~HIy>~xzJL4C8_A{IB!7)T}$(VQzT|q==(@3U|89E9gMc2yjX~wCbA~Z zjd!ePFXZtz#@aXE0e#)2Sp@QSN-lnW{?L|b%Rn&!=ISK7-^mo)uHCqZEff*KxR=da z?hZQyN&)BjL#)2OW>&pt4fCO` z>9<=I>hNcm$Zr*kCCTyWT?`Sv`3FcEZt*s6UH&IygtHl2h@hpkFAl=W)HGJdLzw`xIqaC@Dfw*thyS1b+`vtwA%y(4NY@<{qT3;p2^J~)`RF=c57c` zbz_6C>daXTPA*g3GglCHmLDms)TgGp8fV{9gL$kfZ;OC zy}07$>Rea($_j)L@6Z0Wk9c}Nm6gqGoCH<*+j5Qy=+|Ca_Kpc)P;0hTUfi(1!_a!c zwdyKb!V#TimIu}Px4iL=g_wAb04L-N|7^mxrP?Xn7e~+Jw^sk z;ZD&md?B^?cpIdF!pPELf8P_3hdf_QsdIf>+k&iN&tNqacA;0s|4R4zW=dtH-(p&e z?evO4<>HZQmkM|lN?yTF!>6BgGMJ1-b$6Uf`39^g;WBSpEs}DDQ_w zGND%;`Xxq&N6HpoTvo+RT5yDugMZC_xSsCa3#=;UPEY*RT5yTFG`K7cYKS~Sn~srv zZT{Yh{oJ5ccx4E6$pbT%i~Fy#s0}<0`!p4a7UjVb)8obk-0gXVWS!Z1Kd;fY9sasw!9< zoL_T6zrrZi<7!M{D2{g zrV(%lT<-`SKO2YWaN6oEo%PVm-5?4{Y55Hzg;d$;KyRy7CK1mkJ5+*Jvp6^vJBE~k zX@YvF744H`Un%X)joh(XhPEDauTiqLsd&{f2a>JF^=GQ11;JGDXY})0DZy>wdc_8u zSjIXGQd)B7N@h)^Oh=Nvl!)LQ455aQPTc%kAVEGFHk~ zp%{*kh=_EOZ-{_}KLpfMv9krKR4lZK*C}U(EWmXjmX2K+s;a$=<+iaaA;?5)NRy$7OEy);&RAOx(xN)LM}d%yKkkvA zpVMvU%Gq8>(P3yoM2x(v2)8AwwFT8cs9BNrh& zbc#vDHg#~&neKP8ui>!m63@%g^;KU<$e!|Z5>o{UlsPIC#UnH$vTdN_oEwAep(Fru z3Nn55XU|Sk7AI6-ZUI)e=&_sho%7+uO(S4UMYnd%qAO0B(qI9X6m&BFIIaPA7fdIrV~!ERlR^6JMF|@WR+xBr@5An|Lv#x#9!L z=R{M9s=?J@N&#&GiF5MRBv7PN2(SF`KqVJ6LZCp1aWlyDrx*G_5Pq!oX}!BhA>X!n z#L)&U?hPgvMbvOU20K&u4k;HYp)L4Qe8ENvm2k+%3PfgUf#BA4aeTS|i-Qkl5V#=) zvF*4_Rm&YvYMdP&)^=SPeGI*j9G6jM8qJd;BFci79q0R?RRigfRF6e)PqG1bzGZvo zs4F}k6+pqIsooXUo{HshDJdt}1VV(L8-+qMb*YS8;u|btDBJQjY}Lt3oXw7JHXkU~R48AH;Ir&Az2N5Fw8yHMoR=$o zlsaO#tN85EA1BAqww*bWG>#J7ywTePfMRTpFp{F2-M^#TPtmv*$ z1%Yr^g0D^FCgLTdHZz){jjB-2(J)!LW`itcc<&hc%6K>S6sXVAnej6M;H;+O{3IqO zQ`>jWrgau7o3mEJe+%)ABQ_8UhzXm><*J7v<e?HLwE&Fd0ky)e zS^N;yEfwp!{CS?`3QXq#?HQ==RY7##Vog2hws0X1tt{x)fhkpy^00@?mRE9J3C)}5 z7*v zi+2KuJGh+z!LJf70kOiskYw_Z%+J1yLe`H^`o^>?HG5KyHXT&oCr(fVMGjQ-bb$o5 z2Y|DDPrTS$g-5q1*cs1c^6Pl2f^5}x77M#y&SGt^G6>*N0$}vMKA<#G8&T+VI_s%I zkfuhIOO)RnRMg0~SHG4Kw4Eyg3lTO+ae|_A04s{sz5K0sS?#MF3fjK-2Zku(14I)+ z?xIoDx&QDLyeTN7$OoLzXK2ZeJD zp46O-pX%|3Eb}Ft;VFs9Ge1TX1f92xLsnF>v>tPc?I1-DUiy}N(i;4|H{v|mGw^Qd z088SP0^Zq94Y+_d0Q8eRpbYx^EF<9gnIMnaUa2hX%Fr}Y&l14xW&oNcdhqNPs%O6Y znDoV9t#8LF9V8zo2`nIe8Fm|IMkR07zk%V27e6{pFk%V?d+lTEFgtjkseF$WLI1Mo zMYV1_=E%;>UJf?(LGc%XhEaeoaEnt|DySQ}E`0Z2YH+{dGo9srwB6W@H10`LnA0pR zE#K1N0@1o3T{pfBcQoyZmn}y&NYVAHYHKx7y#**cOou-uZG(&-^Txk^joyi$A5}Dq z;2c#!yKR^D1nQqG*?;?Oe|uzA!ML%TVcVkr7Hr@vv&8M4G%KtnDnmlYCZQ8R6hT6% zQm9HP7s;z26N2R%vgNx9#AOHgAVt3!70lDiVCEAe3RUn#rqU$J$bwQ)kJ1Dm;!(kiFJJzy60fD+m4y)p97!eT{j-!Na)|S;@bSrW<>WYW z>5M#JotvG_gSZ0^yzOz68il`yN#iiGhX;yC*sdj}vIemw&;tJ6P+L1-0y)1mci7er zleDz-7hjRvy9@MKLASE2k^yGpAr}2^Ki&iEn*d4Qv>v1j=r&GQNz3$JpG^gFe`RUO zx}g-Ri)2wrKE$~NzHn`oqbkPOw*d-mHAn$Uxg2P#`FN!uEkVN>(e&okz`DlR*h(vT%=8Fogk0?cY&CkX4`iZ-JH!CgU+ zN{wDLdYn524buB_^inqF#Xuk>&mt_W)vop_I4bHEzmpU7#=6Qg#khtLmMqh*^tAhX z+b516Z<+n_+Yclp->ipmexPE6r5J**zG>f; zo>j6U2LlJ@@*bU?Sh#|4a_XVpe`BwkP9q%#{KEdhza8EMi5lha(SxK2ReYXNOCQU3 zJYPaxvu%{o!9PdfMZOR{&@DZ>wwPiRHW46*?0=^WFfh1>p7@@pK{M+8(BqjEJ{f7Av3GOwSQ@=?l6Mrt#>^~% z$i~LQ{Bx6)pfvgV<778`Cz~T<=Yv%-&xf`t)lI)c)(mD;Oi$w1^O#79y)m6tIHCd( zmCOp--M2b)KLv)Y%nUgV2jYYZeaJ2q`d#3X^`ql!>J~_9403dZGB`|kx(bqxnDq=q z#|Q}-w#G!Jtd88$_E=1W{wUxa=UeQ96VmX>Y=YMx zj#q5SLaj^7J~+uc?M29Q@%3pu8@BQNwdM%!8wzyGAge>CQwm2O7m zv|U(g9dtMWl*mxsOHA`fXx^{Ii|O@i5mHg`G6 zzPdCOTvd>k?%w^Ad^IitX$}(@I5pc=9xdD}2v8&#@vpx+b-u4Hzi<$IsxM!^tf0=^mp7jI%m(<_yKM1}{v)S&Wg7p7kQeD)oIakgL7E z%kvn(m$X&j3?ay5TA%5wv^U>~DlXRYM_?PQm!#r0Xa z@iJF|!s7~orDbJn6XO99puP5d0F9HKknJcS@eJDH{z+bjsb_SmDRxO^Zky9>@s-|p z2RaVl`U%#^j5*`)*Hj-n5&$~UcE z#|k-V&+?l$WKyF;()l02Au>gm|WJ+DZ z0-N#cp-soh>cpVcAN1LNCdg;j9i^3a8EnJqB>U~EV-!<2e5(W5{yUxd|2Z9uo5DLw zo2EBTnvY~>nYgzOdq_Ksmck9jBNgSzlvcjyIqR1^>cjUnb_&09YV%YbL)I3FE0E#B zVNLzN+k6k?vB~aSUoOy5QsXtr%T-k%EpuuyfI*5YK3@zPQ`Pa;y`5p=X$Xhr!V1Z# zCCcJ87y<=qHdSlV;Ng81y(L9!AATa6c>973f#&mcV^H+38n7^=b;ros`f=HA2RQ=% z`p!ESSLY)AmcdgOFM=Z8693PUWA-Z(ESPt%!3=-8RuABi*T4U!KJZ#eS1a_VL3o|5ERsa3GwKg zvL1@!|G2wtci7zBGY}HkhEdSmKu2 zai{MKU&6e3tjofm)GN#N9rQ593XgFb{y>PxmVWf8ZBD=r%4_K@NJbe@9QnmwJN|)J zXPVwI%Cb#MUMm>Pxq4pNs5J&3l!niHHhKlzfv_eqgaxC4p2y>=cbakgr;|M^$SyhO zbk&=Wpv+VdPKL(oz16z9x@(mIV$+2q*CQ>BSfro=y}18HU~Ej|yKC33nQlZ0L$+~GA>(g9I&T2V~GB!Q|{^+QHHgGaR&<{ z=(G?e9n4AybfLMWl~{#T{f!F)KyZ6)fndFmrCDe)c#J9BzieqY*R(S=zS1tNuh6Pu z*m;#*T=@1)#Su@DVSBn~X+I9=LB2;u*88hh@Fgl;{tMBDu{A8k@2)xLkMhkJl#$2!_|-g@PTF8?QjNHNX|NSel@t*uduUBHteHn)Ux} zRl1*!1`6}Se@ZxSNqB6v*G7oysrv8hNOy$i8m(7{>P*)j7n|)%iS4ZWa25K!+G*jl zF>ZNQ2cF`)!@j2-1Jp9Ll4!J@1uAPk4u&wr%5dizwzlt#i}F~kHOqpp?#{-fw4k)HJC(+CVK-pWWm%2rqH^!+p6# zT3r|$rUVA4vUnCcz@ELK5V4OtfX)_cm761Xg?++xkVy0G66dM-#~1lVrT*L`UP7PP z*C@Ni1@r@Wa?O%KWLTgwXXJ)Ldu^;cbmk55r6wRdn@oxU+8(?cSx&Z{nRaDzk%g&F zBfrreboKBP?8=<$pE#71MJCHf#*EkGn8BbmlevLK)26Ed;g(i&vf~xo8dn#Q+ao-& z=l&($VV!x)c!5_#L3G``AaW_Y&}8-e`c#)1n_8Bmv_<$R;tgc)(&M}LkRt!S51*Y})4=TUg=A`eM4exr*;GJHaWE7t0ECrqD_K!*h1RW2; zA|TM0R=nDwAg0hEp1|~2Uq2CV$EjVa%vrki7Qd>!zDFfC^NLE$Mty&d^{-X}X_d(P ztc?MNYI>bb-&Qj>&wMCy_hE+W!E|0!&$vUhQv|PBdPkC92v2UEDPLAtgpsY_O^ zaAj>xvGORTGS*WBnm9Zx_wopi2u$}qeOl0d>T|bMZ`>+E-wdJbc zdLeaCS$zEXaR`!M!q7sjUnJjbLok~o5iPQ6uZ?LNlUTJ=)-(iD!VdV&Z+kn_jmtW8 zHHJ-5Nv`WNf)3@gh2Me`hs#`{!E~dE-PX>INgc*%3ic*lO|tBsxPl0&=md1V$Rk}> z2sfl<;xbPacUc{1y^rpIuYNF+8B!-W-q-dQm}FfRU+4^?5N!(G#{|#hwpMgHjU1%H ztTGrf@SEviYCO2)#@U_ST!lp02z^GkF&6yw2$~o~)u1s5OmtVeO0&It-wL%WDY)m3 zdG~P&iq5chs+ks{qb#>?->wt}jR=C(#43oAWHk#d_(crAA>Sp^wTc5{T(;|Pb;U4Y zN-xCIaH~IOzjW!I-b1m}%T7ZdrdOHwcB~d*U{TMFSkG*5#g&lfx~GC=tp^@|w1k;O zfLWcheCsVZ0t&tT{e9Dc_c5LTwr zdw4d;1!$@S49<~m3_@)s7)@mt#gA0%{j}uzlxhZtF9O2*UVd$S{n;D&o|QGS0lonN zJwYsZ9)kv+V0KN_z3mOv3QrH^d}->?uI?14R@vHE=b4M*xv#E)2YTFRe50j7SQzOlX=D zw&@^RzbmuP&VH?z3-@%oBWbM(uK+)1l*b6Lv7PvCN1AsMGagTFPSyiWpX+>AD6e~O z+bv#X!PUhj4WeCWxt3ABwZaDT5x3TQ>P8T((q*Ptc85cQFVc0@B z+vEP(vnwMdUJ?$4(6WoD^Nyckb#1M!^=x_1>(RhuTZn) z2G>$xXLpU3;(kkBp5`_bWJaKkA54uge!aQa(__Gf6Xlut4Zj7kVxHst$VnnF&QQLI zx)UoaD@t17w)jEP^iL;wX%?lM(4+2#ySw`uK44_}O)XQi{p=%ds5Qk8ES6#o+54xm zFK?PQbeceRH1+up?B@|*QPR{AK(ruxD%+%ZtoS}hz_hZaNzJw?4Q9yBWN?b9L1d>Dc<>Ni zL?jv=TGejc41hCf7+irs`XWr4-JT(Y#wZ|B?Jz?A+pOThbXTs=bOo^s$!;e!*7V#1 zsL+^WO> zl8dV#P-qq2OPp+qiHAHzf5#ox0ZjXu@uJaroN&E)tu0J4PnW=o&(d2Jg8yn2J?OB{ ze3JCmbu&6gUR`Rs*eF)D?~Va{>F)9kpH*Uk_%W*R8bp)FYH~^S8#FeW8BF_lnGvG$ z_~*}063Vsx1}yPKo5K#qZjzFOP2wHl-A^z?(@YRHJ!cB9fS>CR&wR_F29{#*4GNx~ zo-@N)zL#MFaAxu9q)-&nohblJIK%=ux_|oE8C_5CZtBW7=mcNJY=OoVWC@}}gICtuEUYNvnL6iY3b7c}{< zaF$z3fK6=MZOD~D(7xB+d@d3zlt2EPmE-o3sXxAWIOwj%NUz1Yx z++_KBokB|s{8l*LC@SzEJqOX#2`zLQw)_@0659v~D5M&Fr#2z>VdJd$p=i+qG?nYB zpIUUsrCNBi4XHME+Z3zw;kh#_ghq`$VyySp*WdOS8X~Eqg&cS+Hb8{4?J|ZHXu-L) zGR_Z|)t<6~C>n--1do^YG*XFy3=IzTU&Bc5i6ZE(jYGt;G;)+jJa&RL3XEgMwa|<{ zQg1{x(lMIHuG>7toO9Zg+Yp92@tF4BgFd5nbU^u*|jXYql7b94`(V@_v=S^zzFA`U3-9bqBuouJ|K6SB*%{^!WH0DI`wl~p?!b_cuDG19+yhD0Z994Ag( zEom8nwn#j2hz>sI;>pan{C1P(;+Y;e#1X2sn`~O@u{z6l^9Xc znd>ArKdd*X!6}BeuFnq3RE9*wVP`%X5^$L5EITfQa2q?8sHkU77M`;(Y0)$QPwyz- z7#u6GqP3sv5INltQeIweI`c^-4@O5ZJ2`FA$F{;kY)tL51@r}2@J7dSy;^^>9sg)p zivMJfglw>)=9I}1JKdY8;|Xmo%vuIX5V`YKErO5_0tP$fgm6v5PeVJ1$o{glH(x+- z1-U&o$Eq~BnXbpAqxEcO1)@U@@2OGXfw;Is&wIE0%0#Iv*!iZoWZFU%eoSB8#hLCj zJ=%bG@01}+3vE(=4_KG+&ISY2Z*qpVD3v>SH zo)T1+Lp$I2K0D$xwxS!l$T8#X5)$+f9^Hu}8h4Rw=}?Yf8S0VVcD-7;@qE)R+dde( ztJ-8eH&|>3V7X)8AV~^x=#xwW>Eb>oVNjL0p!?SAlZ=9ixkjyohTUK`gWZGpI2(eU z%S2FkSt*PCEWA1P9D*3fjA0?Wu7Wxee3hW>wW&^m6-n5Vs92@lv%` zMgY%jQ)}i`y!LLlxC9 zpvPA^V5}rPb~aQ;%FC!vpN?lyN|`3UsbCcr76zR=rX=%5jO#;uid;ywZhf^Wx8r2f zMf_HWL1RARFk7INJvl<0GW-Y`NJ6c@$>Oj_f5pKIxYJMQovuxDCu_z`hTJh|nCKf6 z2&QQ@Fg6Y|Db;^-h9i72{mjV;BHY{BOqaM-`Fa6xB=ci3p;?NsdE7lba)XS)IGvGL(^ZBGbp?u zwS0WJSTu!AtHfT)H}n=h7F=?TT;%FRap?z$*$58D5%s{HR)dGDFlVmBe)t910ex)a zY{|2~C@7R+9%#Pv@)H~ivz=$x`1I}7F+-NtIf0t4CD;&%+R8zmecy_E zA9NFEmML+R;FlzX67Rr7Q=Wwxb}=y1fB|D?UxGnfHN=5WGn(Fo;kxWki|S4-_7p0_ zWS4ILctsUfV+13ykvh6ke~3S@fL)5agG-LycWPMt&rePMvJFKNo#2o02Vqg8Z`F^T zr0-l1akDK>r4KF%6$I1wzk%6rc>;Wh||is@q#?CkF;$SvAGR0kfHs5v-QIF zCkTzRSvgiyA0%UMGw2lC=0mfLXq-g&(#l55?3p>_9LHQ_53~MZ$~|Yt2{VQ{8i`M# zEP_Kt8hv@etidY9w#+KoTIwnp%BqTr@2{Dxh9G&{t-RT+LOKlrtx50-O@u}1cqjjs zm6i2xg{^K~gu`V(GPb?%bNmoFg0}#99%KEQdv5S5Ew5?nTWYquxlQyg$d7+Mpze2@E6jQ9(e`zpRjcT;%*-L&c24+z@!%K0>ZT*DD)_51R5H?u zv2Hbl)yF)3GZP+mx{k83Tr#bq zo5)M^@XUKqv<=JM0tMcH4t$cIuA-9mq?&@R)KZ1CUVQ7!vwd19(RAvI3Osi{WOcVR zn>^&(tE05&WMg<&;e2CWUS6}Q-@eZlCNni# zxBR!!W;N6F zz4P@kF^n@^89t4s%_pI3XNX@nY?x^?{`nm6eHUq$VI%_z7**!5YZfTN6T_(9K<^^% zN6um2MD%lEM7l~woo>#BF$i)1VR6syRK!|h@XkfPYWRk9>5Jw%i1X5qZ-eZKWUh8| z15lp9$3Vxo#+Zf4eFE^qqqExQCy2x^y47!!mxtWm4HyZ^fYIAvsw0`b?{WCXZT*7` zU)0x~tJWN5LODm;2rXHVWT_$0-W0lx)v9;u<@L1WiB z`eRg#9biM{Y9ETN#SMGT%Ao;5Xa;N8%8s3Sh9M<>D@U)^VPQ}pw5ix)z!Bg{!j`*s z&z}kv&l-f@}aoq^N5q(F})3~#V5&~hAu__ftMC58GIiCiNmxilhk4nPiq~Yt8_YKE0=xusy1D6lGK{D|;#!=@CmF=1sXA2Rz*TkjV<3;g z43AXD;XYhlT0+|1;}+~)JkYCt@e=J;aQI2MEmK`7m<7{+N&(u`(dhU)k#;5h8M*yJ z`O;XhYx4sGJmvP&w$XQOz5_gV?b=N~zV0O*0M+qC+u%0x_~d0)6;>e&e}l$mwYRuF z6o^jfLHj=OI`rH7*y=2T3Zzj*RLNTrIvd~!KPgF zr-QxB)@WCkx+57;gOJvpphcX?LMh2R2Y`8&Yu9?ak`9-{iA(h)=Hx!UB` zuq43Fi|qF+_BG6CvFf=G3+##`&F61ON!3gBwK!y1Vh~*F-*3jeouT)^uqV+2E{*ff zohOvEyh?r=>vQ{NgLz3~v0uLOr5!`@ zo!vJn_Ln=|B{(Fb#Sm?XZ+IEZ`bu32R!QeKc>R35yo`i;@*x6TTMF}$tqozMfvN}gCA}V?9Zjvt?liZB$^n01|dM97s`#oT4Kc( zI|b14%8o{C1RohJ<20B{-PfX?t}lh(5<4(&cFdj~f(@sVW?oJ`#dhE(2SecPoc$$y zL#KL1uG5VH3rV}z_Ua_DRnDLxh|3R)*(t0nJ^W9?nMhZ@h}M4PNcf7FJO7i_H7%q zpeWaM-wO%Nhc%x(4pYXJ@4Y|@R=YFR@jRj)HMhWU8VHRXzQ569i{X3+K>is|E$z^| zdV;}91=O{{eh%2E3@~j1EzvZze5qEnIu*|o_HE<-F>fDZc74`q44v=|on@s>rTtfl zl5oSflvCdiyAkIpY6~p~vMoin5o7pGnCYwD5DrRrq@A4%02YcBq52dYVcgF*j6MRu zeLYr|eIRT9H0``q?Mo}@p16Sgxa^~fyy-8p`MAA7mnxRrdYfT$a}}?oAR3b}2;mJ6 zx`wCwh}y~^Z}wl&?n-?uF0#|~FtP0r8 z$UE%%;>CqT*4k1jYSFFe+LSOeoDhJ*Wemd3k62hXnmysA_2ZmkYmjw6LHn6cMzIJ8 ziWBg)5OlBYRg{`!7a2;a~sJ9sDlFw!9Gm`i<;3mAKjHG zrPo!IRRUhxr2m2)X~h7&I+RooWR`(G>HD%~7x))2UjP0p7+sv-f#b@4~%vQd4gZd9>bknC+K1a%@fM<8?pK`WQROBH%ORV}z5C{l0YO#t@VB8D8(; z0bnGJBMv}i)Uww&k@Ipxt9;YVBF5pYbg&855Elv zP=l2vt2XVn7+t865ki^?6#)DDj79a<-}C+XKn-QgkA-s59hAAcx`Nn%u~;Rd@&q-) zng{@W7H2JDA!rG$i-5JZD@KK~WcTii|I!PHDkjUCG)D=@0k5j)wlUYdR0MqAK2BwV zAKD5*UnJ^t=dM958%SnRU&uNmT~P4v-Uu6KI{0#d>@vmp2d-1!0GS_GkgKI)68%Js zL8JmFh-y#oBlqt^;}H~{;Lv`j2*Dkr+uA4)Jb=ZBZZCOA-LdHZkO-af_Eu&Ww+THX z%u0baqQlnHq z?L4PCD`=wrg1WrlzG!3tWvKS|-~T>O%0tWm`@8Qn$W@o;a*O9ylMC|3{nI6pP(Yhw z-FM@6_x5;UY@?;KJ6u{zY=w2@IKXIYEdy4jOV3s8Y0bG;#VJ1G_Gs}Kv)9+ zAin-%iv8}^ad2su8|9qg)oyQ9+5m)q#6O5#3QYRVt}IQWcP%XGDFA~69p{SRy5c7E z$2UG)w6U|p-(W)GART(BI_qa;h6=!I17h3Yq+dESm2i&i&EdQlNaX5mwKTlco0^)sh6q8V9?s{_YdQD`lyb@o7tMQISE}mid!lrx^N1aQH(B|4h@-3r z^h~pK-t`NDj>Afx2NF(H#f_s{7a^DZY`@USB6CmxDn;V9ZdB&eoKwNItKVAin;Z1A1K1U!0;(Fo^Q^7wr`%2WlNZzPK)*2)#f$pw3aS^ z2YIQ;cHM>M2rfBT&<@h_kO%o)+>3+RK;lUFnMWX)?w%OA zo@PDzot0Lrb1e)K9RY*v-Q-K6p+~ki@v#|*nsL=q{L0E&(*_BcOV_bw$$VSV8Bnk^ z#cOG0M6ZGPYeraMcAc&!65yC%U4`aY`T6$szl+?R z*{46)G3kvfM@4{4@7xq%;RGhG5E>vxtg@b)#v4IcHLKW6Qn~NW@#>YYDX;}*jg#w$ zD=~||D@X6xpMU(J@9h5Q(QDVWsbmE)l42zPein#KpLm_1zC#}xWIkA+6gW88thU*B z5==bsuzTDLi$fVc!gg(B5k1#;*K$pOQFQx~r*Rd1#bhCDIm-p59Eb7&hzEQ@-vZbM zC}ywE4;IV#1kgYJyDCW*X7&V!{8=az$(?OkFr?{Xc|8an{0_r=|c9C z0L*3)6ue%k*9b%-EN)c~*UhGOEugbC!EPqWgqq+dK``~>MPOi4VJYSDFJknUIcCSoH+&kXtdaKh=3(o6!PZ^my?*D<7XKtfIFiXR-hdt2g|Z zl9J-?j<}zrr_YRw`|6(aHUR1|s(nv`5mIu0@Dj!c!|r1NX=m^)_3zV^)L@^0f>l0! z`ZVaj-bdnayC-N=m(NtIT>D7<&5{{@eu9!xN!C2m+{9#MWBGA=+$H$S2bPxpSaV0V z;^3G@Xd|VPr7Z&|^3JIyC#J!>KsX|Capl>o>8GjsRu|lurUn+v`Kyjm(WVB7(S{zQ zCNTcYYreV+{tq>rcn8WAd}OcIH&DVu3dF*8&A^QUAIMR-D?MLZnm^nWGRAS*YX?Y2l> z28ye`wUrY9FIbZYW)xAxf4AWp%j`XQ+Ub}93iH8qq$0+GK)rJHoHKmDa zm6C(d#Y^63Hfk#DU7`P>xI-W2ccb3{hawq+u>B**gt@9T^UW_aAxumut%de|C-Ba> z$#T)6J{=84{1`AicMAu*m8id5$t+$^Wc3Z3`n9@7Vbecdx!!2whdcqf) z=l`#hTl9W@j4c!GK6S908_-puqm$C&FtcWorM?qI$|bgz#JZBc51D-BMcC_jj0}SxDC@s^ceBeJEzg zR&cSNd^(hipe_OF3)`>fX#cNnCd}s&8b3-ELsh+|He{Jh!iCM7Z<+xeI}=tu{}BdD#bFkf+P=e zNZ0MO8~Qms$r8up9viI{<%H*p*GKY zR2QE!*&H#Gucq@DBC0RJ+*htVU~*r3lPnu-od&np9+0;IDWlES; zNAO7P?+;u9*#|3C`k^sA_kTYj1noyxzISwHYx(R&Mm)r}4vYN~C}Wv#szMka*SibD z2U1bNwn3w+@#v>&*n4%iM^;-!vLu;YdM^@=6fgKN-IxOXJ$DtGT6&@iTc}{(Td1~y z8sP3<;$~Rh)}UeQet%iqVY?~(76a3%Q_(~6r$g^pl;XNku}~6CtW%=a zrPjpcqP4GHZHj&_TU-`HCC$tv5lFUSsHW+J zMoD=Kstl@DKO(Z#3ehDPImI9`myID%|3aNKC< z0=`SW83TZ9bGS(Kb>VZ)V*B7-N4YbE4Yo(jAE3FyGK z&E`k80m|Jb###v4uDu36hg-P(X^w6>CL=k5-zvE!S} tuple[float, str]: prov = f'ZK23 T2 [{cls}]' _PAIR_CACHE[key] = (b1000, ZK23_EXPONENT, prov) return b1000 * (T / 1000.0) ** ZK23_EXPONENT * 100.0, prov - elif a in ALL_MASS and b in ALL_MASS: - try: - r = build_rows([a, b])[0] - _PAIR_CACHE[key] = (r.b1000, r.exponent, r.provenance) - return r.b(T) * 100.0, r.provenance - except (ValueError, KeyError): - pass + # Order by provenance class, not by convenience. A measured row of the + # published Table 2 comes first; then the molecular-background + # compilation, whose rows trace to the same measured primaries; then + # anything estimated, which is Table 2's own 'E' rows and the Eq. (10) + # scaling built on a hard-sphere diameter ratio. Reaching the scaling + # before the compilation preempted eleven measured rows and read between + # 1 and 26 percent low on them. + hit = _zk23_lookup(key) + if hit is not None and hit[1] == 'M': + b1000, cls, _src = hit + prov = f'ZK23 T2 [{cls}]' + _PAIR_CACHE[key] = (b1000, ZK23_EXPONENT, prov) + return b1000 * (T / 1000.0) ** ZK23_EXPONENT * 100.0, prov fit = MOLECULAR_BACKGROUND.get(key) or MOLECULAR_BACKGROUND.get(key[::-1]) if fit is not None: a_fit, s_fit = fit @@ -491,6 +497,13 @@ def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: prov = 'molecular-background table' _PAIR_CACHE[key] = (b1000, s_fit, prov) return b1000 * (T / 1000.0) ** s_fit * 100.0, prov + if a in ALL_MASS and b in ALL_MASS: + try: + r = build_rows([a, b])[0] + _PAIR_CACHE[key] = (r.b1000, r.exponent, r.provenance) + return r.b(T) * 100.0, r.provenance + except (ValueError, KeyError): + pass covered = substitutable() diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 51bd7ec5..91d69e0e 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -219,16 +219,27 @@ def test_bmatrix_symmetry_and_error_contract(): def test_b_pair_ladder_and_proxy_provenance(): """The pair ladder resolves each rung and records substitutions. - A printed pair (H-CO2) resolves through the library and converts to SI - (a factor 100 on cm^-1 s^-1); a molecular pair outside the library - (CO-N2) resolves through the molecular-background table; an untabulated + The ladder is ordered by provenance class, so a measured row wins over an + estimated one wherever both exist. H-CO2 is the case that separates them: + Table 2 carries it as an 'E' estimate scaled from named analog pairs, + while the molecular-background compilation carries a measured row, and + the measured value is 11.7 percent below the estimate. A pair Table 2 + measures directly (H-He, class 'M') stays on Table 2. A molecular pair + outside Table 2 (CO-N2) resolves through the compilation; an untabulated molecule (SO2) substitutes the nearest-mass covered species with the substitution named in the provenance. Cached lookups return identical values. """ b_si, prov = b_pair('H', 'CO2', 1000.0) - assert b_si == pytest.approx(6.0e19 * 100.0, rel=1e-9, abs=0.0) - assert prov.startswith('ZK23') + assert prov == 'molecular-background table' + assert b_si == pytest.approx(8.4e17 * 1000.0**0.6 * 100.0, rel=1e-9, abs=0.0) + # Discrimination: the Table 2 estimate it now outranks is a different + # number, so an ordering regression would fail here rather than pass. + assert b_si != pytest.approx(6.0e19 * 100.0, rel=0.02, abs=0.0) + assert b_si < 6.0e19 * 100.0 + # A Table 2 measured row still outranks the compilation. + _b_he, prov_he = b_pair('H', 'He', 1000.0) + assert prov_he == 'ZK23 T2 [M]' b_co, prov_co = b_pair('CO', 'N2', 1000.0) assert prov_co == 'molecular-background table' assert b_co == pytest.approx(9.28e16 * 1000.0**0.71 * 100.0, rel=1e-9, abs=0.0) From 6b52d3e0d61b696239ed2ca1016e3c61aed34e23 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 16:56:18 +0200 Subject: [PATCH 063/113] Read the band quantum in kelvin and cap its escape probability Two departures from the printed source, both now stated where they are read. The detailed-balance exponential uses the band quantum in kelvin, 959.7 K, where Johnstone print 667: that 667 is the bending-mode wavenumber in inverse centimetres, and h c times it is the same 1.325e-13 erg quantum they print two equations earlier, so the printed formula has dropped the second radiation constant of 1.4388 kelvin centimetres. The excitation rate falls by a factor 2.7 at 300 K against the printed form and 3.5 percent at the wind temperatures the thermostat selects, where the band carries a few percent of the cooling budget. And the escape probability is capped at the non-LTE ceiling of one half, which the fitted thin-column branch exceeded below a column parameter of 3.4e-4 and diverged through as the column vanished, taking the zero-column case with it as a discontinuity. The band keeps its molecular abundances, which is what a base-region coolant wants, and the docstring now says so rather than leaving it to be inferred. --- docs/Explanations/regimes.md | 2 +- docs/Validation/atomic_data.md | 2 +- src/zephyrus/atomic_data.py | 37 +++++++++++++++++++-- tests/test_atomic_data.py | 60 +++++++++++++++++++++++++++++++--- 4 files changed, 92 insertions(+), 9 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 637fb821..7eae0900 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -75,7 +75,7 @@ Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces **The wind base.** XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. -**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. +**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]; the band is a base-region coolant, evaluated on molecular abundances and on deexcitation rates measured over roughly 150 to 500 K, and it carries a few percent of the budget at the temperatures the thermostat selects against most of it at a 1000 to 3000 K base), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. **The two rate limits.** The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to diff --git a/docs/Validation/atomic_data.md b/docs/Validation/atomic_data.md index 4998f1e2..fe774034 100644 --- a/docs/Validation/atomic_data.md +++ b/docs/Validation/atomic_data.md @@ -9,7 +9,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the trans ## Notes -The CO2 15 micron band and the O fine-structure channels follow Johnstone et al. (2018, A&A 617, A107) Eqs. (34) to (38) and (41) to (43); their coronal (collision-limited) reductions and detailed-balance structure are asserted as physics invariants in the same test file. The band deexcitation coefficients are measured only over roughly 150 to 500 K, a limitation the module documents. +The CO2 15 micron band and the O fine-structure channels follow Johnstone et al. (2018, A&A 617, A107) Eqs. (34) to (38) and (41) to (43); their coronal (collision-limited) reductions and detailed-balance structure are asserted as physics invariants in the same test file. Two departures from the printed source are pinned rather than inherited. The detailed-balance exponential uses the band quantum in kelvin, $h\nu / k_\mathrm{B} = 959.7$ K, where the source prints 667: that 667 is the bending-mode wavenumber in cm$^{-1}$, and $hc$ times it is the same $1.325 \times 10^{-13}$ erg quantum the source prints two equations earlier, so the printed formula has dropped the second radiation constant of 1.4388 K cm. The excitation rate differs by a factor 2.7 at 300 K and 3.5 percent at the wind temperatures the thermostat selects. And the escape probability is capped at the non-LTE ceiling of 0.5, which the fitted thin-column branch would otherwise exceed below a column parameter of $3.4 \times 10^{-4}$ and diverge through as the column vanishes. The band deexcitation coefficients are measured only over roughly 150 to 500 K, and the band is evaluated on molecular abundances because it is a base-region coolant; both limitations the module documents. ## Anchor type diff --git a/src/zephyrus/atomic_data.py b/src/zephyrus/atomic_data.py index 2576f4cc..c9f28ed0 100644 --- a/src/zephyrus/atomic_data.py +++ b/src/zephyrus/atomic_data.py @@ -146,8 +146,22 @@ def alpha_case_b(element: str, T: float) -> float: # deexcitation rates k_d = A T^B are measured only over roughly 150 to # 500 K, and the band's real applicability ceiling is CO2 dissociation, so # it acts as a base-region coolant; both limitations travel with any use. +# +# One documented departure from the printed source. Their detailed-balance +# relation reads k_e = 2 k_d exp(-667/T_n), citing Castle et al. (2006), and +# 667 is the bending-mode wavenumber in cm^-1, not a temperature: h c times +# 667 cm^-1 is 1.325e-13 erg, which is the same 15 micron quantum they print +# two equations earlier, and in temperature units that quantum is 959.7 K, +# not 667 K. The printed formula has dropped the second radiation constant, +# 1.4388 K cm. The implementation uses the quantum, so the exponential is +# exp(-h nu / k_B T) with h nu / k_B = 959.7 K. It matters most where the +# band matters most: the excitation rate falls by a factor 7 at 150 K and +# 2.7 at 300 K against the printed form, and by only 3.5 percent at the wind +# temperatures the thermostat selects, where the band is a few percent of +# the cooling budget. # --------------------------------------------------------------------------- HNU_15UM = 1.325e-13 # erg, the 15 micron quantum +T_15UM = 959.7 # K, that quantum over the Boltzmann constant A10_CO2 = 0.46 # s^-1, Einstein coefficient of the bending mode SIGMA_CO2_15UM = 6.43e-15 # cm^2, band column parameter for the escape probability CO2_KD = { @@ -169,13 +183,30 @@ def co2_band_cooling(n_co2: float, colliders: dict, T: float, col_co2: float = 0 [cm^-3]; ``col_co2`` is the overlying CO2 column [cm^-2] for the escape probability, whose zero-column limit is the non-LTE ceiling 0.5. Excitation rates follow from detailed balance, - ``k_e = 2 k_d exp(-667 K / T)``. + ``k_e = 2 k_d exp(-h nu / k_B T)``. + + The abundances are molecular, and deliberately: this is a base-region + coolant. The band exists while CO2 does, and the deexcitation fits it + rests on were measured over roughly 150 to 500 K, so it is evaluated on + the molecular density of the level rather than on a dissociated or + ionized fraction, unlike the atomic-line and fine-structure channels + beside it. Above dissociation the band should be absent rather than + small, which this function does not enforce and the caller must not read + into it; at the wind temperatures the thermostat selects the band is a + few percent of the cooling budget, and at the 1000 to 3000 K base it is + most of it. """ sn = SIGMA_CO2_15UM * col_co2 if sn > 2.0: eps = 0.7202 * sn**-0.613 elif sn > 0.0: - eps = 0.4732 * sn**-0.0069 + # The thin-column branch of the fit rises through 0.5 below a column + # parameter of 3.4e-4 and diverges as the column vanishes, which is + # the fit leaving its range rather than physics: half the photons + # escaping is the non-LTE ceiling for this two-level band, and the + # tabulation the fit reproduces approaches it. Capping there also + # makes the zero-column case continuous with its neighbours. + eps = min(0.4732 * sn**-0.0069, 0.5) else: eps = 0.5 ke_sum = kd_sum = 0.0 @@ -184,7 +215,7 @@ def co2_band_cooling(n_co2: float, colliders: dict, T: float, col_co2: float = 0 continue a, b = CO2_KD[sp] kd = a * T**b - ke = 2.0 * kd * math.exp(-667.0 / T) + ke = 2.0 * kd * math.exp(-T_15UM / T) kd_sum += kd * n ke_sum += ke * n if ke_sum == 0.0: diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index 85c0e2af..e14655cf 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -25,12 +25,14 @@ BADNELL_N, CO2_KD, HNU_15UM, + T_15UM, THREE_LEVEL, alpha_case_b, badnell_alpha_rr, co2_band_cooling, o_finestructure_cooling, ) +from zephyrus.constants import kb_cgs pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] @@ -124,17 +126,33 @@ def test_co2_band_coronal_limit_and_detailed_balance(): In the coronal limit every collisional excitation radiates, so the full expression must reduce to ``h nu k_e n_M n_CO2`` with the excitation - rate fixed by detailed balance, ``k_e = 2 k_d exp(-667 K / T)``, - independent of the Einstein coefficient and the escape probability. - Zero colliders give exactly zero cooling (the error-contract limit). + rate fixed by detailed balance, independent of the Einstein coefficient + and the escape probability. Zero colliders give exactly zero cooling + (the error-contract limit). + + The detailed-balance exponential carries the band quantum in kelvin, + ``h nu / k_B = 959.7 K``, which the module derives rather than taking the + 667 the source prints: 667 is the bending-mode wavenumber in cm^-1, and + ``h c`` times it is the same 1.325e-13 erg quantum the source prints two + equations earlier. The test pins the derived form and excludes the + printed one, which differs by a factor 2.7 at this temperature. """ T = 300.0 n_co2, colliders = 1e6, {'O': 1e6} q = co2_band_cooling(n_co2, colliders, T) a, b = CO2_KD['O'] kd = a * T**b - ke = 2.0 * kd * math.exp(-667.0 / T) + # The quantum in kelvin is not an independent number: it follows from the + # printed quantum and the Boltzmann constant, so this recomputes it. + t_quantum = HNU_15UM / kb_cgs + assert t_quantum == pytest.approx(T_15UM, rel=1e-3, abs=0.0) + assert t_quantum == pytest.approx(1.4388 * 667.0, rel=1e-3, abs=0.0) + ke = 2.0 * kd * math.exp(-t_quantum / T) assert q == pytest.approx(HNU_15UM * ke * colliders['O'] * n_co2, rel=1e-3, abs=0.0) + # Discrimination: the wavenumber-as-temperature form is 2.7 times larger + # at 300 K, far outside the pin above. + ke_printed = 2.0 * kd * math.exp(-667.0 / T) + assert ke_printed / ke == pytest.approx(2.65, rel=0.02, abs=0.0) assert co2_band_cooling(n_co2, {}, T) == pytest.approx(0.0, abs=0.0) assert co2_band_cooling(n_co2, {'O': 0.0}, T) == pytest.approx(0.0, abs=0.0) @@ -173,3 +191,37 @@ def test_o_finestructure_positive_and_activating(): assert q300 > q150 assert o_finestructure_cooling(2e8, 300.0) / q300 == pytest.approx(2.0, rel=1e-12, abs=0.0) assert o_finestructure_cooling(0.0, 300.0) == pytest.approx(0.0, abs=0.0) + + +@pytest.mark.physics_invariant +def test_co2_escape_probability_respects_its_ceiling(): + """The escape probability never exceeds the non-LTE ceiling of 0.5. + + Half the photons escaping is the ceiling for this two-level band, and the + zero-column limit sits there. The thin-column branch of the fitted + tabulation rises through 0.5 below a column parameter of 3.4e-4 and + diverges as the column vanishes, which is the fit leaving its range and + not physics, so it is capped. Capping also makes the zero-column case + continuous with its neighbours, where before the probability jumped from + 0.573 just above zero down to 0.5 at zero. + """ + # Densities well above the critical one, so the band is in the LTE regime + # where the cooling is proportional to the escape probability. In the + # coronal limit it is independent of the probability by construction and + # this assertion would hold for any cap at all. + T, n_co2, colliders = 300.0, 1e12, {'CO2': 1e14, 'O': 1e12} + q_zero = co2_band_cooling(n_co2, colliders, T, col_co2=0.0) + # Thin columns are continuous with, and never above, the zero-column case. + for col in (1e-30, 1e-20, 1e-6, 1e2, 1e6): + q = co2_band_cooling(n_co2, colliders, T, col_co2=col) + assert q <= q_zero * (1.0 + 1e-12), col + assert q == pytest.approx(q_zero, rel=1e-9, abs=0.0), col + # Without the cap the thin-column fit reaches 0.573 at a column parameter + # of 1e-12 and diverges below it, so it would have exceeded the ceiling by + # 15 percent and more here rather than matching it. + assert 0.4732 * (6.43e-15 * 1e-6) ** -0.0069 > 0.5 + # The column dependence the band exists to carry survives the cap: a + # thick column is trapped to a ninth of the untrapped rate. + q_thick = co2_band_cooling(n_co2, colliders, T, col_co2=1e16) + assert q_thick < 0.2 * q_zero + assert q_thick == pytest.approx(0.121 * q_zero, rel=0.05, abs=0.0) From 7f29ff5665ee0de4f2937b3338b460e51fcdcaa4 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 16:57:51 +0200 Subject: [PATCH 064/113] Say what a clamped wind temperature is The thermostat's upper bracket edge was described as the place where the balance has no root, and it is not: raising the edge finds one near 1e5 K, stable against raising it further. That root is outside the model rather than inside it, since the coolants are neutral three-level systems and the gas there is fully ionized, so the edge stays where it is and is now named a validity ceiling. What follows is stated too: a clamped value is the edge and not a solution, and the sonic radius, the recombination-limited rate, and the sonic-point Knudsen number built on it inherit that. In the same round the bolometric branch flags the interior luminosity when it is the term setting the rate. The cap applies only past the activation gate, so a state crossing that threshold falls by a factor of thousands with its label unchanged, and which term won was previously left to be inferred. --- docs/Explanations/regimes.md | 2 +- docs/Reference/results.md | 3 ++- src/zephyrus/boiloff.py | 7 +++++++ src/zephyrus/thermostat.py | 32 +++++++++++++++++++++++-------- tests/test_boiloff.py | 37 ++++++++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 7eae0900..2a88b98a 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -75,7 +75,7 @@ Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces **The wind base.** XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. -**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]; the band is a base-region coolant, evaluated on molecular abundances and on deexcitation rates measured over roughly 150 to 500 K, and it carries a few percent of the budget at the temperatures the thermostat selects against most of it at a 1000 to 3000 K base), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance without a root clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. +**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]; the band is a base-region coolant, evaluated on molecular abundances and on deexcitation rates measured over roughly 150 to 500 K, and it carries a few percent of the budget at the temperatures the thermostat selects against most of it at a 1000 to 3000 K base), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance with no root inside that range clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. The upper edge is a validity ceiling rather than an absence of a root: raising it does find one, near $10^5$ K, and that root is outside the model, since the coolants are neutral three-level systems and the gas at that temperature is fully ionized. A clamped temperature is therefore the edge of the bracket and not a solution, and the sonic radius, the recombination-limited rate, and the sonic-point Knudsen number built on it inherit that. **The two rate limits.** The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 78510744..30cad6e9 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -54,7 +54,7 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| | `bondi_inflated` | `True` | The launch level sits above the Bondi radius, so the Mach number was capped at one. | The rate reflects it | -| `thermostat_clamped` | `'high'` or `'low'` | The heating against cooling balance had no root inside the bracket, so the wind temperature clamped to the nearer edge. A high clamp at a dense base is collisional quenching of the line coolants, not a failure. | The rate reflects it | +| `thermostat_clamped` | `'high'` or `'low'` | The heating against cooling balance had no root inside the bracket, so the wind temperature clamped to the nearer edge. A high clamp at a dense base is collisional quenching of the line coolants, not a failure. | The rate reflects it A clamped value is the edge of the bracket, not a solution: at the high edge the balance usually does have a root near 1e5 K, outside the model rather than inside it, because the coolants are neutral three-level systems and the gas there is fully ionized. Every quantity built on the wind temperature inherits that, including the sonic radius, the recombination-limited rate, and the sonic-point Knudsen number. | | `subcritical_sonic` | `True` | The isothermal sonic radius came out below the wind base (base Jeans parameter under 2), so it was floored at the base and the barometric factor dropped. A recombination-limited win under this flag is a floored placeholder rather than a rate. | The rate reflects it | | `caldiroli_out_of_box` | `True` | The fitted efficiency was evaluated outside the range of gravitational potential and flux it was fitted on. The value is returned as an extrapolation. | The rate reflects it | | `caldiroli_below_flux_bound` | `True` | Below the validity bound of the efficiency fit, where its formulas turn complex. | Rejected | @@ -82,6 +82,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | +| `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 5056f016..4d4b5a3e 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -181,6 +181,13 @@ def bolometric_candidate( mdot_lum = L / barrier if barrier > 0.0 else math.inf caps.append(mdot_lum) rate = min(caps) + if mdot_lum is not None and rate == mdot_lum: + # The interior luminosity is the binding term. Worth a flag rather + # than an inference from the branch being past its gate: the cap + # switches on at the gate, so a state that crosses the activation + # threshold drops discontinuously (a factor 6.7e3 on a two Earth-mass + # hydrogen envelope) while keeping the same label. + flags['luminosity_capped'] = True return rate, dict( T_wind=T_w, c_s=c_s, diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py index baf0c895..c11acf6e 100644 --- a/src/zephyrus/thermostat.py +++ b/src/zephyrus/thermostat.py @@ -51,7 +51,16 @@ # the sonic region, which no single-level evaluation captures; rates # computed with this wind temperature inherit that limitation. -T_BRACKET_HIGH = 5.0e4 # K; the lower bracket edge is the equilibrium temperature +# Upper edge of the thermostat bracket. This is a validity ceiling, not a +# statement that the balance has no root above it: raising the edge to 2e5 K +# does find one, at about 1.0e5 K on a nitrogen-oxygen base, stable against +# raising the edge further. That root is not physics. At 1e5 K the gas is +# fully ionized, the neutral three-level coolants the balance is built from +# are gone, and the line and ionization inventory the model does not carry +# would dominate. Reporting the root would be a more precise answer to a +# question the model cannot answer, so the balance stops here and says it +# stopped. The lower edge is the equilibrium temperature. +T_BRACKET_HIGH = 5.0e4 # K _ION_OF = {'C': 'C+', 'N': 'N+', 'O': 'O+'} @@ -237,13 +246,20 @@ def solve_wind_temperature( root when several exist. When no root lies inside the bracket the temperature clamps to the nearer edge with the ``clamped`` field set ('low' when cooling already wins at T_eq, 'high' when heating still - wins at 5e4 K, where the missing physics is the ionization and line - inventory beyond the modeled channels). A high clamp is the expected - outcome at dense wind bases, not only an exotic corner: electron - densities well above the forbidden-line critical densities quench the - three-level coolants collisionally, the balance loses its root, and - the wind runs hot; the ``clamped`` field is the contract by which - callers can see that happened. Returns ``(T_wind, detail)``. + wins at the upper edge). A high clamp is the expected outcome at dense + wind bases, not only an exotic corner: electron densities well above the + forbidden-line critical densities quench the three-level coolants + collisionally, the balance loses its root inside the bracket, and the + wind runs hot; the ``clamped`` field is the contract by which callers + can see that happened. + + A high clamp does not mean the balance has no root at all. It usually + has one above the bracket, near 1e5 K, and that root is outside the + model rather than inside it: the coolants are neutral three-level + systems and the gas there is fully ionized. So a clamped temperature is + the edge of the bracket and not a solution, and any quantity built on it + (the sound speed, the sonic radius, the recombination-limited rate, the + sonic-point Knudsen number) inherits that. Returns ``(T_wind, detail)``. Raises ------ diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 1b021cfa..0ecab8d3 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -282,3 +282,40 @@ def test_launch_level_reports_its_own_optical_depth(): assert det2['tau_launch'] == pytest.approx(10.0 * det['tau_launch'], rel=1e-12, abs=0.0) # Reporting only: it raises no flag and gates nothing. assert 'tau_launch' not in det['flags'] + + +@pytest.mark.physics_invariant +def test_luminosity_cap_flags_itself_when_binding(): + """The interior-luminosity cap says when it is the term setting the rate. + + The cap is absent while the activation gate is open and applies once it + closes, so a state crossing the gate drops discontinuously while keeping + the same label. The flag is the marker for that: past the gate the cap is + usually the binding term, and the drop across the threshold is a factor + of thousands rather than a rounding, so a caller stepping a track through + the gate needs to see which term won and not infer it from the label. + """ + launch = _launch(2.0 * Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}) + # Inside the gate: no cap exists, so it cannot be flagged. + rate_open, det_open = bolometric_candidate( + 2.0 * Me, 1.5 * Re, 1000.0, 0.01, launch, 1.0, 5.0, 20.0 + ) + assert det_open['active'] is True + assert det_open['mdot_luminosity'] is None + assert 'luminosity_capped' not in det_open['flags'] + # Past the gate on the same state: the cap exists and binds, and the rate + # falls to it by orders of magnitude. + rate_shut, det_shut = bolometric_candidate( + 2.0 * Me, 1.5 * Re, 1000.0, 0.01, launch, 1.0, 25.0, 20.0 + ) + assert det_shut['active'] is False + assert det_shut['flags'].get('luminosity_capped') is True + assert rate_shut == pytest.approx(det_shut['mdot_luminosity'], rel=1e-12, abs=0.0) + assert rate_shut < rate_open / 100.0 + # A large interior flux lifts the cap above the other terms, and then it + # is not the binding one and is not flagged. + rate_hot, det_hot = bolometric_candidate( + 2.0 * Me, 1.5 * Re, 1000.0, 0.01, launch, 1.0e12, 25.0, 20.0 + ) + assert det_hot['mdot_luminosity'] > rate_hot + assert 'luminosity_capped' not in det_hot['flags'] From 183718460a61ecae498116fd0d58bbf33e9c334a Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 17:42:11 +0200 Subject: [PATCH 065/113] Pin the split by identity, every flag, and the printed bands Four discrimination gaps, each verified by applying the mutation it should catch. The per-species split was asserted only through its sum, and the dispatcher renormalizes onto the bulk rate, so a permuted mapping conserved total mass while moving the wrong elements out of the planet, which is what the PROTEUS side debits reservoirs by; the dominant element is now pinned on both branches that produce a split. Eleven flag assignments could be deleted with the suite green, so a table now pins each against a state that raises it and one that must not. The printed Knudsen and activation bands were free to drift although they are reported beside every verdict as results. And the totality sweep skipped its conservation check on the quarter of draws whose rate underflows to zero, where the statement is that nothing leaves and a relative tolerance cannot make it. --- tests/test_boiloff.py | 15 ++++ tests/test_dispatcher.py | 152 ++++++++++++++++++++++++++++++++++++++ tests/test_hydrostatic.py | 38 ++++++++++ tests/test_knudsen.py | 18 +++++ 4 files changed, 223 insertions(+) diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 0ecab8d3..907f6867 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -319,3 +319,18 @@ def test_luminosity_cap_flags_itself_when_binding(): ) assert det_hot['mdot_luminosity'] > rate_hot assert 'luminosity_capped' not in det_hot['flags'] + + +@pytest.mark.reference_pinned +def test_printed_activation_band_matches_its_source(): + """The printed activation band is the literature threshold spread. + + The restricted Jeans threshold is 20 by default, which is the Owen & Wu + (2016, ApJ 817, 107) shutoff at R_p / R_B = 0.1 expressed through the mean + molecular mass, and the band 15 to 35 is the spread of the values the + literature quotes for it. Like the Knudsen band this is printed beside + every verdict as a reported width, so it is pinned rather than left free. + """ + assert LAMBDA_BAND == (15.0, 35.0) + lo, hi = LAMBDA_BAND + assert lo < 20.0 < hi # the default threshold sits inside its own band diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 1e99c938..cc15b8fa 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -135,6 +135,15 @@ def test_totality_over_random_physical_inputs(): tot = sum(res.per_species.values()) if res.mdot > 0.0: assert tot == pytest.approx(res.mdot, rel=1e-6, abs=0.0) + else: + # A zero bulk rate is still a conservation statement, and it is + # the one a relative tolerance cannot make: nothing may leave. + # Roughly a quarter of these draws land here, on states so + # strongly bound that every branch underflows, and skipping them + # left the split unchecked exactly where it is cheapest to break. + assert res.mdot == 0.0 + assert tot == 0.0 + assert all(v == 0.0 for v in res.per_species.values()) assert isinstance(res.diagnostics, dict) assert 'knudsen' in res.diagnostics seen.add(res.regime) @@ -711,3 +720,146 @@ def test_one_exobase_temperature_per_call(): assert t_top < t_base <= t_branch assert t_base > 0.5 * t_branch assert t_base != pytest.approx(t_eq, rel=0.1, abs=0.0) + + +# Each row is (flag, a state that must raise it, a state that must not). Every +# warning the result can carry belongs here: a flag nothing asserts can be +# deleted without the suite noticing, which makes it a comment rather than part +# of the contract. The negative state is what stops a flag that fires on +# everything from passing as discrimination. +FLAG_CASES = ( + ( + 'near_roche', + dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.10), + dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30), + ), + ( + 'k_tide_undefined', + dict(M_p=Me, R_p=2 * Re, T_eq=2000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=1.0, a=0.004), + dict(M_p=Me, R_p=2 * Re, T_eq=2000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=1.0, a=0.10), + ), + ( + 'roche_overflow', + dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), + ( + 'bolometric_residual', + dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), + ( + 'thermostat_clamped', + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'N2': 0.8, 'O2': 0.2}, F_xuv=700.0, a=0.0775), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), + ( + 'caldiroli_out_of_box', + dict( + M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775, + settings=DispatchSettings(efficiency_mode='caldiroli'), + ), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), + ( + 'volkov_extrapolated', + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=0.1, a=0.0775), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), + ( + 'contested_ion', + dict( + M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=6000.0), + ), + dict( + M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, a=0.2, + ), + ), + ( + 'extension_unbound', + dict( + M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=6000.0), + ), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=0.1, a=0.0775), + ), + ( + 'gate_rerouted', + dict( + M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=15000.0), + ), + dict( + M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=3000.0), + ), + ), + ( + 'base_clamp_decades', + dict(M_p=10 * Me, R_p=1.8 * Re, T_eq=800.0, comp={'CO2': 1.0}, F_xuv=1.0, a=0.5, p_top=1.0), + dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), + ), +) + + +@pytest.mark.physics_invariant +def test_every_warning_flag_has_a_state_that_raises_it_and_one_that_does_not(): + """Each flag fires on a state that warrants it and stays off otherwise. + + A flag no test asserts is a comment: it can be deleted and the suite stays + green, so nothing holds the module to raising it. Each row pins one flag + against a state that must raise it and a state that must not, and the + second half is what keeps a flag that fires on everything from passing as + a working warning. + """ + for flag, on, off in FLAG_CASES: + res_on = dispatch(_inputs(**_flag_state(on))) + assert flag in res_on.flags, f'{flag} did not fire on its positive state' + res_off = dispatch(_inputs(**_flag_state(off))) + assert flag not in res_off.flags, f'{flag} fired on its negative state' + + +def _flag_state(spec): + """Expand a FLAG_CASES row into _inputs keyword arguments.""" + kw = dict(spec) + comp = kw.pop('comp') + m_p, r_p, t_eq = kw.pop('M_p'), kw.pop('R_p'), kw.pop('T_eq') + kw['a'] = kw['a'] * AU + return dict(M_p=m_p, R_p=r_p, T_eq=t_eq, comp=comp, **kw) + + +@pytest.mark.physics_invariant +def test_dispatched_split_names_the_element_that_leaves(): + """The dispatched split is checked by identity, not only by its sum. + + The dispatcher renormalizes the per-species rates onto the bulk rate, so + a sums-to-mdot assertion cannot fail however the shares are assigned: a + permuted mapping conserves total mass while moving the wrong elements out + of the planet, which is what the PROTEUS side debits reservoirs by. Both + branches that produce a split are pinned by which element dominates. + """ + # Hydrostatic: only hydrogen is light enough to leave the Mars-mass host, + # and it carries the rate by nineteen decades over the heavy background. + static = dispatch( + _inputs( + 0.107 * Me, 0.53 * Re, 440.0, {'CO2': 0.99, 'H2': 0.01}, F_xuv=0.01, a=0.2 * AU + ) + ) + assert static.regime == 'hydrostatic' + assert set(static.per_species) == {'H', 'C', 'O'} + assert max(static.per_species, key=static.per_species.get) == 'H' + assert static.per_species['H'] > 1.0e19 * static.per_species['O'] + assert static.per_species['O'] > static.per_species['C'] # two O per C, heavier + # Hydrodynamic: a carbon dioxide wind carries oxygen over carbon, in the + # ratio the closure returns rather than one this test recomputes, but the + # ordering and the absence of hydrogen are its own statement. + wind = dispatch(_inputs(Me, Re, 1000.0, {'CO2': 1.0}, F_xuv=5.0e3, a=0.0775 * AU)) + assert wind.regime.startswith('hydrodynamic') + assert set(wind.per_species) == {'C', 'O'} + assert wind.per_species['O'] > wind.per_species['C'] + assert 1.5 < wind.per_species['O'] / wind.per_species['C'] < 4.0 + # And the sum still holds, which is the weaker claim of the two. + for res in (static, wind): + assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-9, abs=0.0) diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index a892dd2d..9351aaaa 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -24,6 +24,7 @@ import pytest from scipy.special import erfcx +from zephyrus.composition import species_mass_amu from zephyrus.constants import G, amu, kb from zephyrus.hydrostatic import ( bates_extension, @@ -423,3 +424,40 @@ def test_exobase_temperature_floors_at_the_profile_top(): # At the anchor temperature exactly, nothing is flagged. _p, det_eq = hydrostatic_rates(prof, M_MARS, t_top) assert 't_exo_floored_to_profile_top' not in det_eq['flags'] + + +@pytest.mark.physics_invariant +def test_per_element_shares_follow_the_species_that_escape(): + """The split names which element leaves, not just how much in total. + + Element rates summing to the bulk rate is a weak claim: the dispatcher + renormalizes the split onto the bulk rate, so the sum matches by + construction and a permuted mapping would conserve mass while moving the + wrong elements out of the planet. What has to hold is the identity of the + shares. On a carbon dioxide host carrying one percent hydrogen, hydrogen + is the only species light enough to escape and carries the whole rate, + twenty decades above the carbon and oxygen the heavy background supplies, + and the CO2 that does leave splits onto carbon and oxygen in + stoichiometric mass proportion. + """ + prof = _co2_hydrogen_profile(0.01) + per_el, det = hydrostatic_rates(prof, M_MARS, 1000.0) + assert set(per_el) == {'H', 'C', 'O'} + # Hydrogen carries the rate, and by twenty decades, so a permutation onto + # carbon or oxygen cannot pass as a rounding difference. + assert per_el['H'] > 1.0e19 * per_el['O'] + assert per_el['H'] > 1.0e19 * per_el['C'] + assert per_el['H'] == pytest.approx(det['per_species_rate']['H'], rel=1e-12, abs=0.0) + # Oxygen above carbon, in the ratio the CO2 formula fixes: two oxygens of + # 15.999 against one carbon of 12.011. + assert per_el['O'] / per_el['C'] == pytest.approx( + 2.0 * species_mass_amu('O') / species_mass_amu('C'), rel=1e-9, abs=0.0 + ) + rate_co2 = det['per_species_rate']['CO2'] + m_co2 = species_mass_amu('CO2') + assert per_el['C'] == pytest.approx( + rate_co2 * species_mass_amu('C') / m_co2, rel=1e-9, abs=0.0 + ) + assert per_el['O'] == pytest.approx( + rate_co2 * 2.0 * species_mass_amu('O') / m_co2, rel=1e-9, abs=0.0 + ) diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index f2474c6c..d6afe5ae 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -250,3 +250,21 @@ def test_sigma_mixture_normalizes_over_what_is_present(): # A mixture with nothing in it has no cross section to report. with pytest.raises(ValueError, match='positive mole fraction'): sigma_mixture({'CO2': 0.0, 'H2': -1e-20}, 1.0e4) + + +@pytest.mark.reference_pinned +def test_printed_knudsen_band_matches_its_source(): + """The printed switch band is the one the literature states. + + The band is not tuning freedom and not a tolerance: kinetic simulations + place the fluid-to-kinetic transition near 0.1 for heating deposited in a + sharp layer and near 1 for distributed heating (Johnson et al. 2013, ApJL + 768, L4), and Chatterjee & Pierrehumbert (2026, ApJ 998, 236) extend the + upper edge to 3 where the energy limit may survive. The dispatcher prints + the counterfactual labels at both edges beside every verdict, so the band + is a reported result and its numbers are pinned here rather than being + free to drift. + """ + assert KN_BAND == (0.1, 3.0) + lo, hi = KN_BAND + assert lo < 1.0 < hi # the default threshold sits inside its own band From a8bf9b98e9b71f2b50f8097c3a5cb5b871aa089e Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 17:49:37 +0200 Subject: [PATCH 066/113] Pin the absolute scale of six closed forms The suite pinned how these quantities vary and not how large they are, so a changed prefactor was invisible in every one: doubling the Parker rate's normalization, dropping the transonic criterion's factor of root two, doubling the collisional or the recombination-cooling coefficient, replacing the diffusion supply's harmonic mean with a minimum, dropping the area referral that quotes the effusion flux at the anchor, and deleting the geometric conversion the fitted efficiency needs all left it green. Each is now pinned against a value evaluated in the test from the published closed form and the constants, never by calling the function under test. Two of these needed a state chosen so the assertion can fail. The harmonic mean equals the smaller of its arguments to one part in 1e5 wherever the two fluxes differ by decades, so it is pinned at the exobase temperature where they cross and the mean is 0.61 of the minimum. The sonic scale height collapses to a third of the sonic radius at the isothermal index, where two wrong forms agree with it, so it is pinned at the polytropic and monatomic indices as well. --- tests/test_boiloff.py | 36 ++++++++++++++++++ tests/test_diagnostics.py | 47 +++++++++++++++++++++++ tests/test_dispatcher.py | 40 +++++++++++++++++++- tests/test_hydrostatic.py | 41 ++++++++++++++++++++ tests/test_knudsen.py | 37 +++++++++++++++++++ tests/test_thermostat.py | 78 ++++++++++++++++++++++++++++++++++++++- 6 files changed, 277 insertions(+), 2 deletions(-) diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 907f6867..eb77064b 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -334,3 +334,39 @@ def test_printed_activation_band_matches_its_source(): assert LAMBDA_BAND == (15.0, 35.0) lo, hi = LAMBDA_BAND assert lo < 20.0 < hi # the default threshold sits inside its own band + + +@pytest.mark.reference_pinned +def test_parker_rate_absolute_normalization(): + """The Parker rate's overall scale, not only its shape. + + The suite pins how the rate varies (monotone in flux, shutting off past + the Bondi radius, capped by the Bondi and luminosity terms), and those + all survive a wrong prefactor. This pins the scale: at a launch level + sitting exactly at the Bondi radius the Mach number is 1 by construction + and Owen & Wu (2016, ApJ 817, 107) Eq. (9) reduces to + ``Mdot = 4 pi G M_p / (kappa c_s)``, evaluated here from the constants + rather than by calling the function, so a changed factor fails. + + Order of magnitude against the source: at one Earth mass, an equilibrium + temperature of 1000 K, a hydrogen and helium envelope, and a photospheric + opacity of 0.01 m^2 kg^-1, this is 2.9e14 kg/s, which is 1.5e-3 Earth + masses per year, within an order of magnitude of the 1e-2 Earth masses per + year Owen & Wu quote for the onset of the phase on an inflated envelope. + """ + m_p, t_eq, kappa = Me, 1000.0, 0.01 + mu = 2.35 * amu + t_w = t_eq / 2.0**0.25 + c_s = math.sqrt(kb * t_w / mu) + r_bondi = G * m_p / (2.0 * c_s**2) + expected = 4.0 * math.pi * G * m_p / (kappa * c_s) + launch = {'r': r_bondi, 'mmw': mu, 'rho': 1e-6, 'p': 1e-6 * kb * t_w / mu} + _rate, det = bolometric_candidate(m_p, Re, t_eq, kappa, launch, 1.0, 5.0, 20.0) + assert det['mach'] == pytest.approx(1.0, abs=1e-9) + assert det['mdot_parker'] == pytest.approx(expected, rel=1e-12, abs=0.0) + # Scale guard against the published onset rate, in Earth masses per year. + per_year = det['mdot_parker'] * 3.15576e7 / Me + assert 1.0e-4 < per_year < 1.0e-1 + # Discrimination: a doubled or halved prefactor leaves that window but, + # more to the point, fails the exact pin above. + assert det['mdot_parker'] != pytest.approx(2.0 * expected, rel=0.1, abs=0.0) diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 1805336f..86f19a30 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -19,6 +19,8 @@ See ``docs/How-to/run_tests.md`` for the tier and marker conventions. """ +import math + import pytest from zephyrus.constants import G, amu, m_p @@ -223,3 +225,48 @@ def test_documentation_constants_are_complete(): assert DAYSIDE_FACTORS['recombination_limited'] == pytest.approx(0.31, rel=1e-12, abs=0.0) # The reduction factors are genuine reductions. assert all(0.0 < v < 1.0 for v in DAYSIDE_FACTORS.values()) + + +@pytest.mark.reference_pinned +def test_johnson_critical_power_absolute_normalization(): + """The transonic criterion's scale, since its whole content is a threshold. + + The diagnostic reports whether the absorbed power exceeds the critical + power, so the ratio crossing 1 is the entire statement and any error in + the normalization moves that crossing. Johnson et al. (2013, ApJL 768, L4) + Eq. (10) is ``Q_c = 4 pi r_* (gamma / (c_c sigma_c Kn_m)) + sqrt(2 U(r_*) / m) U(r_0)`` with ``c_c = sqrt(2)`` and + ``U(r) = G M m / r``, evaluated here from the constants rather than by + calling the function. The intercepted power is + ``Q_net = eps pi R_XUV^2 F_XUV``. + """ + eps, f_xuv, r_xuv = 0.15, 100.0, 1.5 * Re + mass_p, m_mean, sigma_c = 5 * Me, 16.0 * amu, 1.0e-19 + r_sonic, r_base, gamma, kn_m = 5.0 * Re, 1.6 * Re, 1.0, 1.0 + u_star = G * mass_p * m_mean / r_sonic + u_0 = G * mass_p * m_mean / r_base + q_c_expected = ( + 4.0 + * math.pi + * r_sonic + * gamma + / (math.sqrt(2.0) * sigma_c * kn_m) + * math.sqrt(2.0 * u_star / m_mean) + * u_0 + ) + q_net_expected = eps * math.pi * r_xuv**2 * f_xuv + ratio, q_net, q_c = q_net_over_qc( + eps, f_xuv, r_xuv, r_sonic, r_base, mass_p, m_mean, sigma_c, gamma, kn_m + ) + assert q_net == pytest.approx(q_net_expected, rel=1e-12, abs=0.0) + assert q_c == pytest.approx(q_c_expected, rel=1e-12, abs=0.0) + assert ratio == pytest.approx(q_net_expected / q_c_expected, rel=1e-12, abs=0.0) + # Discrimination: dropping the c_c = sqrt(2) normalization raises the + # critical power by that factor and moves the threshold with it. + assert q_c != pytest.approx(q_c_expected * math.sqrt(2.0), rel=0.01, abs=0.0) + # The Kn_m and sigma_c dependences are inverse and linear in the critical + # power, which is what lets a caller rescale the criterion. + _r2, _n2, q_c_half = q_net_over_qc( + eps, f_xuv, r_xuv, r_sonic, r_base, mass_p, m_mean, 2.0 * sigma_c, gamma, kn_m + ) + assert q_c_half == pytest.approx(0.5 * q_c_expected, rel=1e-12, abs=0.0) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index cc15b8fa..53b293fc 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -36,8 +36,9 @@ dispatch, ) from zephyrus.escape import EL_escape +from zephyrus.hydrodynamic import caldiroli_efficiency from zephyrus.planets_parameters import Me, Ms, Re -from zephyrus.profiles import isothermal_profile +from zephyrus.profiles import isothermal_profile, photospheric_level pytestmark = [pytest.mark.smoke, pytest.mark.timeout(60)] @@ -863,3 +864,40 @@ def test_dispatched_split_names_the_element_that_leaves(): # And the sum still holds, which is the weaker claim of the two. for res in (static, wind): assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-9, abs=0.0) + + +@pytest.mark.reference_pinned +def test_caldiroli_efficiency_geometry_conversion(): + """The fitted efficiency is converted to the geometry it is used in. + + Caldiroli et al. (2022) fit their efficiency against a rate written on an + ``R_p^3`` geometry, while the dispatcher's energy-limited rate is the + Erkaev form on ``R_p R_XUV^2`` (``scaling=2``). Decision 12 therefore + converts the fitted value by ``(R_p / R_XUV)^2`` before using it. The + conversion is a pure geometric factor, so nothing about the rate's shape + reveals whether it was applied: dropping it entirely left the suite green. + This pins it against the two radii the same call reports. + """ + settings = DispatchSettings(efficiency_mode='caldiroli') + inp = _inputs(Me, Re, 1000.0, {'CO2': 1.0}, F_xuv=10.0, a=0.0775 * AU, settings=settings) + res = dispatch(inp) + hy = res.diagnostics['hydrodynamic'] + raw, _flags = caldiroli_efficiency(10.0, Me, Re, hy['K_tide']) + assert raw is not None + # The XUV radius is the photospheric level the settings select, which is + # the radius the Erkaev form cubes; it is recomputed here from the same + # profile rather than read back, so the test does not depend on the + # module reporting it. + photo, _pf = photospheric_level(inp.profile, settings.P_photo) + r_xuv = photo['r'] + factor = (Re / r_xuv) ** 2 + assert hy['efficiency'] == pytest.approx(raw * factor, rel=1e-9, abs=0.0) + # Discrimination: the factor is not 1 on this state, so an unconverted + # efficiency is a different number. + assert factor != pytest.approx(1.0, rel=1e-3, abs=0.0) + assert hy['efficiency'] != pytest.approx(raw, rel=1e-3, abs=0.0) + # The XUV radius is above the planetary radius, so the conversion always + # reduces the efficiency: the fitted value refers to a larger absorbing + # area than the Erkaev geometry charges for. + assert r_xuv > Re + assert hy['efficiency'] < raw diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index 9351aaaa..f0e37185 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -461,3 +461,44 @@ def test_per_element_shares_follow_the_species_that_escape(): assert per_el['O'] == pytest.approx( rate_co2 * 2.0 * species_mass_amu('O') / m_co2, rel=1e-9, abs=0.0 ) + + +@pytest.mark.reference_pinned +def test_yelle_harmonic_mean_and_area_referral(): + """The Eq. 14 combination and the Eq. 15 area referral, at their scale. + + Yelle (2024, Icarus 416, 116099) combines the effusion flux and the + diffusion-limited supply by the harmonic mean of Eq. (14), + ``phi = phi_J phi_l / (phi_J + phi_l)``, and refers the flux from the + exobase back to the anchor radius through the ``(r_x / r_0)^2`` factor of + Eq. (15). Both are invisible on a state where the two fluxes differ by + decades, since there the harmonic mean equals the smaller one and the + referral is a fixed rescaling: a plain minimum reproduces the combination + to one part in 1e5 on the default exobase temperature. This test therefore + runs at the exobase temperature where the two fluxes cross, where the + harmonic mean is 0.61 of the minimum and a substitution cannot hide. + """ + prof = _co2_hydrogen_profile(0.01) + # 130 K puts the hydrogen effusion flux within a factor 1.6 of its supply. + _per, det = hydrostatic_rates(prof, M_MARS, 130.0) + d = det['species']['H'] + phi_j, phi_l, phi = d['phi_jeans'], d['phi_diffusion'], d['phi_per_area_r0'] + assert 0.5 < phi_j / phi_l < 3.0, 'the crossover state has drifted' + assert phi == pytest.approx(phi_j * phi_l / (phi_j + phi_l), rel=1e-12, abs=0.0) + # Discrimination: a plain minimum is 1.6 times the harmonic mean here. + assert phi < 0.75 * min(phi_j, phi_l) + # The harmonic mean is below both arguments, always, which is the property + # that makes it a supply cap rather than a blend. + assert phi < phi_j and phi < phi_l + # Area referral: the flux is quoted at the anchor, so it carries the ratio + # of the exobase and anchor areas explicitly. + r_x, r_0 = det['r_exo'], det['r_anchor'] + assert r_x > r_0 + referral = (r_x / r_0) ** 2 + assert referral > 1.05, 'the referral factor is too close to 1 to discriminate' + # Rebuild the effusion flux from the reported exobase quantities: the + # referral is the only factor between the local flux and the quoted one. + # The mixing ratio is the diffusively enriched one at the exobase, not the + # anchor value, which for a light trace species differs by decades. + local = d['volkov_C'] * d['w_jeans'] * d['X_tilde_exo'] * det['n_exo'] + assert phi_j == pytest.approx(referral * local, rel=1e-9, abs=0.0) diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index d6afe5ae..36ea0e9c 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -25,6 +25,7 @@ from zephyrus.knudsen import ( FALLBACK_VDW_RADIUS_A, KN_BAND, + SQRT2, effective_threshold, kn_sonic, lar_sigma_diff, @@ -268,3 +269,39 @@ def test_printed_knudsen_band_matches_its_source(): assert KN_BAND == (0.1, 3.0) lo, hi = KN_BAND assert lo < 1.0 < hi # the default threshold sits inside its own band + + +@pytest.mark.reference_pinned +def test_sonic_scale_height_gamma_dependence(): + """The scale height is pinned away from the degenerate isothermal case. + + At gamma = 1 the closed form of Chatterjee & Pierrehumbert (2026, ApJ + 998, 236) Eq. (17), ``H_sc = (1 + gamma) r_sc / (4 + sqrt(2) + sqrt(5 - 3 gamma))``, collapses to ``r_sc / 3`` because the numerator is + 2 and the denominator is 6, and several wrong forms agree with it there: + replacing the numerator by a constant 2, or the radical by sqrt(2), both + give r_sc / 3 at gamma = 1 and diverge from the correct form away from it. + Pinning the isothermal value alone therefore pins nothing, so the form is + evaluated at the polytropic and monatomic values as well. + """ + assert sonic_scale_height(1.0, 1.0) == pytest.approx(1.0 / 3.0, rel=1e-12, abs=0.0) + assert sonic_scale_height(1.0, 1.4) == pytest.approx(0.4558481560, rel=1e-9, abs=0.0) + assert sonic_scale_height(1.0, 5.0 / 3.0) == pytest.approx(2.0 / 3.0, rel=1e-12, abs=0.0) + # The monatomic value is where the radical vanishes, so the denominator is + # exactly 4 and the ratio is exactly (1 + 5/3)/4. + assert sonic_scale_height(1.0, 5.0 / 3.0) == pytest.approx( + (1.0 + 5.0 / 3.0) / 4.0, rel=1e-12, abs=0.0 + ) + # Discrimination against the two forms that are degenerate at gamma = 1. + for gamma in (1.4, 5.0 / 3.0): + correct = sonic_scale_height(1.0, gamma) + numerator_wrong = 2.0 / (4.0 + SQRT2 * math.sqrt(5.0 - 3.0 * gamma)) + radical_wrong = (1.0 + gamma) / (4.0 + SQRT2 * SQRT2) + assert correct != pytest.approx(numerator_wrong, rel=1e-3, abs=0.0), gamma + assert correct != pytest.approx(radical_wrong, rel=1e-3, abs=0.0), gamma + # Monotone rising in gamma over the physical range, and linear in r_sc. + heights = [sonic_scale_height(1.0, g) for g in (1.0, 1.2, 1.4, 1.6, 5.0 / 3.0)] + assert all(b > a for a, b in zip(heights[:-1], heights[1:])) + assert sonic_scale_height(3.0, 1.4) == pytest.approx( + 3.0 * sonic_scale_height(1.0, 1.4), rel=1e-12, abs=0.0 + ) diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py index 2edd93a9..33ceef06 100644 --- a/tests/test_thermostat.py +++ b/tests/test_thermostat.py @@ -22,7 +22,7 @@ import pytest -from zephyrus.atomic_data import HC_CM, LYA_BLACK, THREE_LEVEL +from zephyrus.atomic_data import HC_CM, LYA_BLACK, THREE_LEVEL, alpha_case_b from zephyrus.constants import kb_cgs from zephyrus.thermostat import ( balance_at, @@ -227,3 +227,79 @@ def test_balance_parts_sum_and_channel_toggles(): assert 'atomic_lines' not in d_no['parts'] assert d_no['q_cool'] <= d_all['q_cool'] assert r_no_atomic >= r_all + + +@pytest.mark.reference_pinned +def test_line_cooling_coronal_limit_absolute_normalization(): + """The line cooling's scale, evaluated from the rate coefficient itself. + + Far below the critical density every collisional excitation out of the + ground state radiates before it is deexcited, so the cooling reduces to + ``sum over transitions of dE k_lu n_e n_tot`` with the Maxwellian + collisional rate coefficient ``k_lu = Upsilon (8.629e-6 / (g_l sqrt(T))) + exp(-dE / k_B T)``. That is evaluated here from the level data and the + constants rather than by calling the function, so the prefactor and the + statistical weights are pinned rather than only the shape. Without this + the whole channel could be scaled by any factor with the suite green. + """ + T, n_tot = 8000.0, 1.0e6 + data = THREE_LEVEL['O'] + levels = data['levels'] + for n_e in (1.0e0, 1.0e2): + expected = 0.0 + for (lo, up), (a_ul, upsilon) in data['transitions'].items(): + if a_ul <= 0.0 or lo != 1: + continue + g_lo = levels[lo - 1][1] + de = HC_CM * (levels[up - 1][2] - levels[lo - 1][2]) * 1e7 + k_lu = upsilon * 8.629e-6 / (g_lo * math.sqrt(T)) * math.exp(-de / (kb_cgs * T)) + expected += de * k_lu * n_e * n_tot + got = three_level_cooling('O', n_tot, n_e, T) + assert got == pytest.approx(expected, rel=1e-3, abs=0.0), n_e + # Linear in the electron density in this limit, and in the total density. + q1 = three_level_cooling('O', n_tot, 1.0e0, T) + q2 = three_level_cooling('O', 2.0 * n_tot, 2.0e0, T) + assert q2 / q1 == pytest.approx(4.0, rel=1e-3, abs=0.0) + + +@pytest.mark.reference_pinned +def test_recombination_cooling_coefficient(): + """Recombination cooling removes 3/2 k_B T per recombination. + + The channel is ``Q = n_e n_+ alpha_B (3/2) k_B T``, and the 3/2 is the + mean thermal energy carried off by the recombining electron. Pinned + against a hand evaluation, since the factor is the whole content of the + term and doubling it doubled the channel with the suite green. + """ + T = 1.0e4 + # The published coefficient at 1e4 K, which the term is built on. + assert alpha_case_b('H', T) == pytest.approx(2.7e-13, rel=1e-9, abs=0.0) + # The balance's own term, rebuilt from the quantities it reports. The + # module works in cgs internally, so the number density converts from + # m^-3 at the boundary and the square of that conversion is where a + # units slip would hide. + base = _base(n_si=1.0e18, vmr={'H': 1.0}) + _r, det = balance_at(T, base, {'H': 1.0}, 1.0e2) + n_cgs = base['n'] * 1e-6 + f_plus = det['f_plus'] + expected = (f_plus * n_cgs) ** 2 * det['alpha_rec_cgs'] * 1.5 * kb_cgs * T + assert det['parts']['recombination'] == pytest.approx(expected, rel=1e-9, abs=0.0) + # Discrimination: the 3/2 is the mean energy carried off per + # recombination and is the whole content of the coefficient, so the same + # term with a 3 instead is a different number by exactly a factor two. + assert det['parts']['recombination'] != pytest.approx( + 2.0 * expected, rel=0.01, abs=0.0 + ) + # Quadratic in the electron density, not in the total density: doubling + # the gas density raises the term by less than four, because the + # ionization fraction falls as recombination speeds up. The identity + # above is what pins the coefficient; this pins that the term is built + # on the electron density and not on the neutral one. + dense = _base(n_si=2.0e18, vmr={'H': 1.0}) + _r2, det2 = balance_at(T, dense, {'H': 1.0}, 1.0e2) + ratio = det2['parts']['recombination'] / det['parts']['recombination'] + assert 1.0 < ratio < 4.0 + assert det2['f_plus'] < det['f_plus'] + n2_cgs = dense['n'] * 1e-6 + electron_ratio = (det2['f_plus'] * n2_cgs) ** 2 / (det['f_plus'] * n_cgs) ** 2 + assert ratio == pytest.approx(electron_ratio, rel=1e-6, abs=0.0) From a0a7c1cfacb384d2652812e30dbf54cccd1dc454 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 17:55:28 +0200 Subject: [PATCH 067/113] Hold the tutorial's numbers to what the code prints The page claims every printed number is the verbatim output of a snippet the reader can run, and nothing held it to that: the quoted blocks had drifted twice and were repaired by hand both times. A test now runs every snippet in order, in one namespace, as a reader would, and compares each output block character for character. It caught a real drift immediately, which is why this commit also rewrites thirteen blocks. Most of the movement is small, but the collisionality boundary of the worked carbon dioxide planet fell from 0.77 to 0.75 W m-2 and the sonic-point Knudsen number at the lowest swept flux fell by a factor 58. Both trace to reading the band quantum in kelvin: at a few hundred kelvin the carbon dioxide band carries most of the cooling, so the correction that was three percent at a nine thousand kelvin wind is a factor 2.7 there. The hysteresis demonstration moved with the boundary, since its two probe fluxes no longer bracketed it and both fresh calls had landed on the same side. The run-tests page now states why the worked example sits outside the coverage gate, which is the ecosystem convention, and what covers it instead. --- docs/How-to/run_tests.md | 13 +++ docs/Tutorials/dispatch.md | 85 ++++++++++---------- docs/assets/dispatcher_regime_sweep.png | Bin 252181 -> 253385 bytes docs/assets/dispatcher_track.png | Bin 258533 -> 258546 bytes examples/demo_dispatcher/demo_dispatcher.py | 2 +- tests/test_examples.py | 47 +++++++++++ 6 files changed, 105 insertions(+), 42 deletions(-) diff --git a/docs/How-to/run_tests.md b/docs/How-to/run_tests.md index aac1449e..62589f54 100644 --- a/docs/How-to/run_tests.md +++ b/docs/How-to/run_tests.md @@ -179,6 +179,13 @@ Two gates are declared in `pyproject.toml`: Both gates sit at the 90 % ceiling. The `tools/update_coverage_threshold.py` helper (run manually) raises `fail_under` one-way toward the ceiling and never lets it drop; `ECOSYSTEM_CEILING = 90.0` caps it, and neither gate may be manually decreased. ZEPHYRUS has no compiled dependencies, so the unit and smoke tier already covers the whole package, which is why both gates are already at the ceiling. The PR gate has a pre-flight step that fetches the base branch's `pyproject.toml` and rejects any PR that drops `[tool.coverage.report].fail_under` below `min(base, 90.0)`. + +### What the gate measures, and what it does not + +The coverage source is the package, `source = ["zephyrus"]`, so `examples/` sits outside both gates. That is the ecosystem convention rather than an omission: PROTEUS and every sibling submodule set the source to their own package, and PROTEUS's own `examples/` holds configuration files with no Python in them at all. Adding the worked example here would move the reported number by more than ten points while measuring a script rather than the library. + +The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes, character for character. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. + ## PR validation pipeline `.github/workflows/tests.yaml` runs on every push and pull request to `main`, and on manual `workflow_dispatch`. Draft PRs run only `ubuntu-latest` with Python 3.12; non-draft events run the full matrix (`ubuntu-latest`, `macos-latest` x Python 3.10, 3.11, 3.12). The step sequence: @@ -195,3 +202,9 @@ Nightly (`.github/workflows/nightly.yml`) runs the full suite, uploads coverage ## Canonical specification The repository-wide rules that every PROTEUS-ecosystem submodule follows are at [proteus-framework.org/PROTEUS/Explanations/ecosystem_testing_standard/](https://proteus-framework.org/PROTEUS/Explanations/ecosystem_testing_standard/). + +### What the gate measures, and what it does not + +The coverage source is the package, `source = ["zephyrus"]`, so `examples/` sits outside both gates. That is the ecosystem convention rather than an omission: PROTEUS and every sibling submodule set the source to their own package, and PROTEUS's own `examples/` holds configuration files with no Python in them at all. Adding the worked example here would move the reported number by more than ten points while measuring a script rather than the library. + +The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes, character for character. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 3869cb11..3065776a 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -150,13 +150,10 @@ Output: ```text hydrodynamic:EL 2347722.550685174 -{'C': 660973.0964302735, 'O': 1686749.4542549003} +{'C': 660971.2983440236, 'O': 1686751.2523411503} 0.0 {} -['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', - 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', - 'knudsen', 'lambda_gate', 'potential_screens', 'rate_floor', 'roche', - 'self_consistency', 'tang_timescale', 'thermostat'] +['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', 'knudsen', 'lambda_gate', 'potential_screens', 'rate_floor', 'roche', 'self_consistency', 'tang_timescale', 'thermostat'] ``` Five fields, and each one guarantees something. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. @@ -182,10 +179,10 @@ Output: ```text 0.01 hydrostatic 4.989e-123 4.5e+18 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} 0.0389 hydrostatic 4.989e-123 2.28e+18 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} - 0.151 hydrostatic 4.989e-123 3.06e+10 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} - 0.587 hydrostatic 4.989e-123 3.92 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} - 2.28 hydrodynamic:EL 5.356e+05 0.118 {0.1: 'hydrostatic', 3.0: 'hydrodynamic'} - 8.87 hydrodynamic:EL 2.082e+06 0.033 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} + 0.151 hydrostatic 4.989e-123 5.26e+08 {0.1: 'hydrostatic', 3.0: 'hydrostatic'} + 0.587 hydrostatic 4.989e-123 2.99 {0.1: 'hydrostatic', 3.0: 'hydrodynamic'} + 2.28 hydrodynamic:EL 5.356e+05 0.117 {0.1: 'hydrostatic', 3.0: 'hydrodynamic'} + 8.87 hydrodynamic:EL 2.082e+06 0.0329 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} 34.5 hydrodynamic:EL 8.090e+06 0.0127 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} 134 hydrodynamic:EL 3.144e+07 0.00558 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} 520 hydrodynamic:EL 1.222e+08 0.00265 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} @@ -203,12 +200,12 @@ print(boundary_flux('N2-O2', 0.01, 10.0)) Output: ```text -0.7695387060616504 +0.7456904716337459 566.3838601554727 0.10311115795045854 ``` -The first crossing is the collisionality switch. Below 0.77 W m⁻² the heating is too weak to keep the gas collisional where a wind would go sonic, so the sonic-point Knudsen number `kn_sc` exceeds 1 and escape is per-particle from the exobase. Above it a fluid wind exists and the rate is the smaller of the two hydrodynamic limits. The second crossing, at 567 W m⁻², is inside the wind: the recombination-limited rate drops below the energy-limited one and names the label. +The first crossing is the collisionality switch. Below 0.75 W m⁻² the heating is too weak to keep the gas collisional where a wind would go sonic, so the sonic-point Knudsen number `kn_sc` exceeds 1 and escape is per-particle from the exobase. Above it a fluid wind exists and the rate is the smaller of the two hydrodynamic limits. The second crossing, at 567 W m⁻², is inside the wind: the recombination-limited rate drops below the energy-limited one and names the label. The third number is that first crossing for a nitrogen and oxygen atmosphere of the same mass and radius, and it sits a factor 7.5 lower. Composition moves the boundaries, not just the rates: that planet also never reaches the recombination-limited label anywhere in the swept range. @@ -301,7 +298,7 @@ print(kn['counterfactual_labels']) Output: ```text -0.03002758706914175 1.0 +0.029975982248303154 1.0 {0.1: 'hydrodynamic', 3.0: 'hydrodynamic'} ``` @@ -318,8 +315,8 @@ print(hy['selection_mechanism'], hy['T_wind'], hy['efficiency'], hy['K_tide']) Output: ```text -2347722.550685174 11475561.253503852 -EL-selected 8430.51967382717 0.1 0.9175976086377635 +2347722.550685174 11494353.468961576 +EL-selected 8433.517741299554 0.1 0.9175976086377635 ``` Both candidates are always computed, so you can see the margin. `selection_mechanism` says which one won, and takes a third value, `RR-selected:subcritical-floor`, when the sonic radius had to be floored at the wind base. It deliberately does not say why an RR win was small: the minimum can select the recombination-limited rate either because the recombination-limited base ionization sets it or because the wind is throttled between base and sonic point, and calling the second one recombination-limited would be a category error. What separates them is `rr_chain['barometric_factor']`, the fraction of the base density reaching the sonic point, which is 0.0095 here. `T_wind` is the temperature a local heating against cooling balance returned, 8431 K here rather than the canonical $10^{4}$ K, and it feeds the sound speed, the barometric exponent, and the recombination coefficient, so it moves the crossover flux of step 3. @@ -333,7 +330,7 @@ print(result.diagnostics['johnson_q']['q_net_over_qc']) Output: ```text -10.112600626056176 +10.113448223279315 ``` The transonic energy criterion[^johnson] compares the absorbed, efficiency-degraded power against the power needed to sustain a transonic outflow. A ratio below 1 says the heating cannot drive the flow sonic no matter what a rate formula returns. At 10.1 there is an order of magnitude in hand. @@ -350,9 +347,7 @@ print(result.diagnostics['erkaev_tc_K']) Output: ```text -{'lambda_exo': 301.102296003742, 'lambda_rp': 330.8696490591677, - 'lambda_star': 303.6051987475083, - 'thresholds': 'thermally driven lambda < ~3; tidal lambda* < 3; XUV lambda* > 6'} +{'lambda_exo': 301.102296003742, 'lambda_rp': 330.8696490591677, 'lambda_star': 303.6051987475083, 'thresholds': 'thermally driven lambda < ~3; tidal lambda* < 3; XUV lambda* > 6'} 11.795855551916663 wind 4233.123936051893 @@ -370,10 +365,8 @@ print(result.diagnostics['self_consistency']) Output: ```text -{'levels_checked': 120, 'worst_kn': 0.12382483136593705, 'fluid': True, - 'truncated_at_profile_top': True} -{'evaluated': True, 't_deplete_s': 2193615254279.937, 'age_s': 3155760000000000.0, - 'inconsistent': True} +{'levels_checked': 120, 'worst_kn': 0.12382483136593705, 'fluid': True, 'truncated_at_profile_top': True} +{'evaluated': True, 't_deplete_s': 2193615254279.937, 'age_s': 3155760000000000.0, 'inconsistent': True} ``` The fluid condition has to hold everywhere below the sonic surface, not only at it, so the check walks the profile levels and reports the worst local Knudsen number, declaring the truncation at the profile top. The consistency screen is the sharp one here: at $2.3 \times 10^{6}$ kg s⁻¹ this planet empties one Earth atmosphere in 70 000 years, against the 100 Myr age supplied with the state. The state is not wrong, but it cannot have persisted, and a static grid point that fails this screen is telling you the grid, not the code, needs a second look. @@ -388,8 +381,7 @@ print(result.diagnostics['knudsen']['provenance']) Output: ```text -{'p_Pa': 0.0033116709279622522, 'p_physical_Pa': 0.0033116709279622522, - 'r_m': 6828145.239345033, 'T_K': 999.7834337004138, 'clamp_decades': None} +{'p_Pa': 0.0033116709279622522, 'p_physical_Pa': 0.0033116709279622522, 'r_m': 6828145.239345033, 'T_K': 999.7834337004138, 'clamp_decades': None} {'C': 'laricchiuta', 'O': 'laricchiuta'} ``` @@ -419,7 +411,7 @@ Output: 0.1 hydrostatic 1.0 hydrodynamic:EL 3.0 hydrodynamic:EL -(0.6118163711150405, 2.63867996005799) +(0.5862277954328179, 2.6150528403823805) ``` At 1 W m⁻² the same planet is hydrostatic under the strict edge of the criterion and a wind under the default. Across the band the boundary itself runs from 0.61 to 2.6 W m⁻², a factor of 4.3, from a criterion whose own range is a factor of 30. That number is a result, not an error bar to hide: quote a regime boundary with it. @@ -500,9 +492,9 @@ print(fitted.diagnostics['hydrodynamic']['efficiency'], sorted(fitted.flags)) Output: ```text -0.1 hydrodynamic:EL 2347722.550685174 2347722.550685174 11475561.253503852 -0.3 hydrodynamic:EL 7043167.652055521 7043167.652055521 11475561.253503852 -0.6 hydrodynamic:RR 11475561.253503852 14086335.304111041 11475561.253503852 +0.1 hydrodynamic:EL 2347722.550685174 2347722.550685174 11494353.468961576 +0.3 hydrodynamic:EL 7043167.652055521 7043167.652055521 11494353.468961576 +0.6 hydrodynamic:RR 11494353.468961576 14086335.304111041 11494353.468961576 0.7908366641614278 ['caldiroli_out_of_box'] ``` @@ -513,7 +505,7 @@ At 0.6 the energy-limited candidate overtakes the recombination-limited one and Supply the previous label and a hysteresis window opens around the threshold, so a time-stepping track cannot chatter between branches on numerical noise: ```python -for f_xuv in (0.747, 0.793): +for f_xuv in (0.72, 0.78): for previous in (None, 'hydrostatic', 'hydrodynamic:EL'): state = build_state('CO2', 1.0, 1.0, f_xuv) state.prev_regime = previous @@ -525,12 +517,12 @@ for f_xuv in (0.747, 0.793): Output: ```text -0.747 None hydrostatic 1.124 1.0 -0.747 hydrostatic hydrostatic 1.124 0.6666666666666666 -0.747 hydrodynamic:EL hydrodynamic:EL 1.124 1.5 -0.793 None hydrodynamic:EL 0.898 1.0 -0.793 hydrostatic hydrostatic 0.898 0.6666666666666666 -0.793 hydrodynamic:EL hydrodynamic:EL 0.898 1.5 +0.72 None hydrostatic 1.137 1.0 +0.72 hydrostatic hydrostatic 1.137 0.6666666666666666 +0.72 hydrodynamic:EL hydrodynamic:EL 1.137 1.5 +0.78 None hydrodynamic:EL 0.854 1.0 +0.78 hydrostatic hydrostatic 0.854 0.6666666666666666 +0.78 hydrodynamic:EL hydrodynamic:EL 0.854 1.5 ``` Inside the window the previous label wins, in both directions, and the applied threshold in the diagnostics tells you when the memory was in use. @@ -552,13 +544,24 @@ for row in rows[::6]: Output: ```text + +=== A stellar history: CO2 + 1% H2, 1 Me, 1 Re at 0.2 au === + age [Myr] F_xuv regime rate [kg/s] Kn_sc snapshot + 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 consistent + 45.0 1.62 hydrodynamic:EL 3.542e+05 0.253 consistent + 310.1 1.4 hydrodynamic:EL 3.045e+05 0.363 inconsistent + 1138.9 0.852 hydrostatic 4.682e-02 3.37 consistent + 3039.5 0.495 hydrostatic 4.682e-02 1.64e+03 consistent + 6189.6 0.34 hydrostatic 4.682e-02 1.07e+06 consistent + 9439.6 0.324 hydrostatic 4.682e-02 2.69e+06 consistent + label changes from hydrodynamic:EL to hydrostatic between 767 and 939 Myr, and the rate drops from 2.273e+05 to 4.682e-02 kg/s 1.0 58.4 hydrodynamic:EL 1.273e+07 0.00941 False - 45.0 1.62 hydrodynamic:EL 3.542e+05 0.265 False - 310.1 1.4 hydrodynamic:EL 3.045e+05 0.388 True - 1138.9 0.852 hydrostatic 4.682e-02 4.81 False - 3039.5 0.495 hydrostatic 4.682e-02 6.73e+03 False - 6189.6 0.34 hydrostatic 4.682e-02 1.58e+07 False - 9439.6 0.324 hydrostatic 4.682e-02 4.83e+07 False + 45.0 1.62 hydrodynamic:EL 3.542e+05 0.253 False + 310.1 1.4 hydrodynamic:EL 3.045e+05 0.363 True + 1138.9 0.852 hydrostatic 4.682e-02 3.37 False + 3039.5 0.495 hydrostatic 4.682e-02 1.64e+03 False + 6189.6 0.34 hydrostatic 4.682e-02 1.07e+06 False + 9439.6 0.324 hydrostatic 4.682e-02 2.69e+06 False ``` The flux conversion is worth reading in the source: MORS returns X-ray and extreme-ultraviolet luminosities in erg s⁻¹, and the state needs W m⁻² at the planet. diff --git a/docs/assets/dispatcher_regime_sweep.png b/docs/assets/dispatcher_regime_sweep.png index c7d69bdf171152e7edc85a3e7101773f28e2df21..70a24092a620172324ef28aa3c83a1cdd735626a 100644 GIT binary patch literal 253385 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

      I=Xe?_C||W%onk6ZNkP<&C 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%0Dn}~%& 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�)jpj(s^Odwza2?_=j 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 M(vMS9YlR!4OCc7M(rXOZ7$EMBAG#U`>VMHi z-NC*$G}z9c?G#9wbzGUeMtMO@U2>nhX?+~*fX#F!PdZAmf%IrxGprz>YGFWP;OR4| z_35^=As%q$Xm9D}YI0(5s6|j{$F&fK3T!KQk}>;)lY1oGYpaP0uP)s@!xF(SwqUYS zQf03g{#_CsUq*NbKFJ^reC~){0z?to7YQlJJ0^V{kTch4Fur=^$Pva7`6#x0PiKoZ z=odNYDgP*=drYB07QFpXHqAp6ugpE@{b8yL(0j_lb-DlY;2tJ13e*lM@-!TD&MO;& z=kmll%p(xLA_yCftkMa|Q2O5l+HL}%t`V!#j1W+Ugkmo9l)mYYl`mGPP5ujn7 zT85JC$od3i5$VB2hp*1{oX6jGh`1~jh%accq@Ns+*t_58cfqD;?Gkd@$s9mF`}+ijLW_(pl6Sh|EVNc? z+(5N<>o)kl_`s==9i>||S_!BZs2NV4E1)JdJ!OYGUE4aes)YRdH zL`baKfK&kiuB)?Msr!4RY@e#)x3lX&-tO_Ds(lZpl(CU*hP2>f0N*b(wMD|pT{N<_ z?*hy%Y8&YwnEiNvIbPg5?6M(rOr~TMi36gaZ1JX7S`}>l9WneC+QGa#s;v|?nCn;S zmbh|!;=f>pwQX&tBgas@1}D}dlnBvKw$^S_DJnnu2%Fw*xW3+7%Y04Pw1=!fjVub@ znw0%{&%ZyzT^U=B-rckv-F_uVKer`m5l@?Y`}S?C(KuCyb#{)P9g@0W;!8=F?Lsh! zXCbc@tRf$MBdh7vS;k3d5T?3(wfdGpbuOP}55wd*&+S(%x8VF+ZwIM@^u$KD$VB7g z5sm^8=gr)BpI&vT0IHB*ea~t5a8N}8v<1F`-tYeI_|U-iiO6-} zECRLxkXem>S3NoD z{jASe10hQwXTR)ryYHv>mqpx{Yk%s(T~MSGYDt&PXi!`j$jKQ#=oDyDPTp4zq+(W8 z6;06PcBqe5(_9!R8h*w2K)ar_O0o34>LG_FoqHLE+p+kDX72k(*B&-i9w6r6*Bj%* zxIHGk2j@txmaU$(ZeNr#;`igdG?IOVi4K~HBV{I|TQ81LyZ(swO|$gpwLn4>r`fL` zpe?aZlRI%FHA6WW*tPpS-OY=akK>2)T}})v;oSR+T^X^@>*h(G3;bh%0)a3t(f&qp z{CK~+xVJUL14T?%Z{OC2(5pXD)V;s#VTSfr?3=FNYYteoQRMr93FysI%P<}Ao9%oT zeN(4Td*cw#-SK%C&;Lp${6c;YgP*Yow5{`2&eJK=XMgn3<1|6?@f*BU`||QK0|Yzz z1_n#!B*`bQ{e3wPoM1*^cR+@e0(@F5<(7wxt*l6Qz7Tf#8! zgK64xJXYLIM-N_|W!-3`mW(e)9~Ch&{^T_M5WI0tBCxjD9Fwhez~6$N zsBu?@z*DdZ?Nh5*(DRNju-F1Ed;XSwX^_K2k=h@BJacjn-w|0n8VN*pR&ccbndb

      rjZp40~ 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

      O`XqlZ7_YVQ>gEP2LIx?YW@W$^`__ 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

      qD=qE5D^hq{GdQytdkOs^eBb5txO0~;?NI7Y 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�jai7~x{Wiul8kJAb@-rveCzdRsS1Vup@J6iEaY_6eGz+Do;}aCX>cwT(+_4! zk*RWkM%_{{JGL?fMMaDW?&wT+j=bLkRw_o1>(D!G0Z&j?d$o|NnxEH=v5ZmJ*vPcx zxPK8s_mcx$J-IG(?zbbZWgI?u(8ktQk=;XF`AAyy9rCGEWxV0SlA-Nxl*Gmv3g7l} z&3xS5ym0r=zgtsvGTv(lTBUYlObd!WOT6;~+!-3yvdohYl9;4)UH=5v25}7!sqDHf zsi6@nVAYdCU(7we2*`KOckfXuHKpP=>%Qwv*B%f?C*&4=Hbbpc&Z>-5#+2d`;^VwD zS*6u`K6*u3PO4=r1A53exkp@enzE4_Xi|L?Gm4GYp~sl@DL@0E?Nu-_O%1@;T;OZh z48q#bN|*0>pKe!78h8 z=jqSM%d2Qrx||(+QP;v7wCC!G4i$*RaM2F8V4w? zva_EMXUBy!a_tfn6co`!O%HK#^3z@N`Q!}M+`TAItsckUAH~*)WN?aeq2(EhX^9L@ ze=PZvRg+K}`vbK;fBqc0F)OK&XXDNPGnVSCBd9@yHAW9yXW?N=IvNk`!0T7Ro!a>W z=?vP!)c0|o{xj9t!>2{uznnP1Gj>WnclT9EQ`1!UNM7CY&G~#x`RI?H9+?-Ja{#AK z`@`_6rxdJqvWL;gtY$&EvvG25&E!wTMv;9p%7*A!gIF7tz0(7m%`^k+$@S^Io8$cr zdM!6$C$H}z3S}Ee)Bwz6tfSb95~m6}=UtBRzJk0@yhi+!4UTrdn+LCHcc$J}^gg|G zRit5$T(0f1j%=i`;*QXJ|>GORl~@sO~3^ z)2O~^>{i;esR}wZB+^60;JJ)Q(j%0o-tf2(evzn&`bxF?ub=A+GBXN)~RgmMI!~g+O1adpGMRtn<^{ zNQ!ak0@041!neN79-F4z@`FZ_v%v0S0Gz`S&HTA`I;+y8f|bKgMVTtzrp}YAMw2f* z-)(JC7mqE?gqM|ju6rK%s@u!Fi|ovkrm(5i15NTZH8sMniv>syj51Du1NWZhQIiVV9&@j2bocF{Vn2a}3(pXiJMAu9NBY z=@%=*h0?TLmT^&)byN&a--ta^%4x>6GEMAfqXRiZDJV6iq-uzRorR(JHOALc%CHIb zRCIJnemo_y0ZDS2`sWPlCW^{LvAIufz6#{z1Pc(5?@VxweMJ31y$Bzl?2SB)pxRIY zgXgX#LQnQp`$iNmPgTCNViOhZJAF9qSn5V;aoUsb#6#?=D*kq3)9N!_rScvZwanXe z&ES|)0)E!jdC@~>?bs$mXU&NK|3y+$xykH$`4J&E z*xNB-$JvrdrwxPKRpHq`Z``b%M0O(n!JZ&a%{zen2~q+$u_c#Uf!bw(xo>G^Q}Iv2 zmrx^ZdGy8nk6Oc|o2s*Za=d<(>M_S)+8!OrpTuZ8mhLcnd2A5~p>T^3+Gk7G_zl;Y zaOVRnJW-c+aHV7fw(x!&=1oQ3WD!q8z(9(j4urDnIOwwyGu)cee?@bbd%loNh+ zigOH?Gu;|~P2e|KS1T+orc HiYa9(WSD~|^!%k0dQEoI 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⁢f13){H&)CaA^PSM;=D?W5fx{MsR7oK*F)^$l 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

      o_e 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 delta 154936 zcmbTe2UJtr);5gCt`s{W0(KMxlqwxX1f;2eNEhi{O6ah$fl5& z0s>M(=p>IOvn@ucIo`!dC@6ux%^|~(1ihm)e*9x?(PlT;z|Ht*P>B1!C%^drBqzo-TjT! z##-p>zCp90TUcVexS-Fbup+uMB5w8Q#e35ovP^wSe8^`kYDBkRHi9m*Pbe#Xcw%7y zl%a6xm=m?>b5@b#L?$n~p}igI)~A-sYJSd#O37Q~epJ@Qn|t@Jd;A*R@7!pL3U=qY z|LE$8t{?WNEJsBGD)jNbyGdx<(&0<-?GeF`cF}?BfvRe7u-Nk3*KpTc^zM49dtdfZ z4-A~9=jQY0i1>?+?i+iIerU=vW4)nbSKoMvsylYBbVO=??e)^Qx&Z=0b|%Z$2KM%t zpgUb$qN%M(ys~cY<>eJ?KUN3`CFqL1YP&3Rn&nJ>dRzbtYH?FQedf#QVoI28aeEv> zyRI)+7ak%N1f@Ll#HiSj&u>-k9ZAusuiR@Z?Zv~*)A@E(R$YgQj=vG-oLQ7DXtr6T zu9gprS3J%+lgb=7*9ko&`58^e6t?$-7IJ86YcI>6H~W#T%{eo{9N#TPp6yLuw=30U z-ddCQz}1?2p7;?kqts6RdHdC~y4hRoqO5GNUq?3t0e=cQVSkS~_>3vomXb-MwO2O$(ZiLr_&*g=sq})3;PB z8dq|&VW|lGmB)0u^3wXavkS}6D~?AnLC2cKvT;-4Y^=fUn3AFIPdoY~HxBt%C(1I# zB#PT_MKel1zt@E4Su@LjoLj)|F77=O78d+sZu-~pkRTS%`BZd8Y$-Wcyx6D8ruM#V ze_4h+*}vMz(0g-WDyP&HBTBUUK=(m$#H&!jX{xO-aIP2~cg9?{p(^>)r(;-;<{%Fe zj?=lNQyzx7#>K~{R%jOY6>Z@C5USc}%3gSl?i9uZcFQsirE{7|XO4%6-`l%4mV@C~ zgu~liCm`=pcY7O~9)Wf#dzL~xP)gX(U1U7A)DT@OP0sM6XX%M6_>hY> z))C(*KBYEyJzA0Bx1K!cLB*C5(xtaND4 z!Dkt_A`j9wvO&s#>9z#;M@qy)^#u_DNdK;3L2rLQBP`x~BhimRC5QWox_W4xTFfy4 zsj0#cLBSUss#mPK(^?1J(UQ;VwBWNS>AX!`YJ@d0s>HZy+0hC1&Bqhhf03y>FYy%u zY4B;w6T@&u>=J2^WLGiAi(G0Whv$#zZwSmG>vOMZaNtF>^pfpQ@f8PB$df1tc4jgx zrA|i1oVv!G3Ag`niOus@V#Uvx?$BW}mPx8_#J(z-ND4yhryj%vDtWMpv%y-HqD1U{ z@N-}vX5LK2wLO*Ft*d?`1s2VvV;^$*5m!ib$=2>5%cw(pqOKeJb$aRDEy*EAk5CLk zq&CV-XM-{Jy&vUMr0IJ5Pj^5=?khz$1CF-CmD(?4WJEu`j1W%Y;_2ET zvR;P=1rIQj*5yp@$Ly#bbP4{LI3hiwb9;J=bOKD<33=pE90GormZHE zmsaAC4&7H;W5w079_KvL)GWU6@$K@;ijYUoRh8%xWL+>@bj`)WLvQXJdh-mL9(5Ew zKEs9e@c{x>?hb372c+!#bS8H!6(8PPg&gK}yi3d5_+8eDJ`S2G+-|a7K|0XUZR{H^{AgDhW%KjKqlLAO z0jBE=EZ5+Y9isI9_ZT_S=B}u9wTY{uRi(eA#hmrry?^xillYePE`Dfo#iP6Hrd>SJ zCE(zg_gdrGSmz%%W80P{e@#zUGxjB`NpUNBtQVI$_ZaQBT+6H3of7oIm)(uf*oWy( zS8a4Vz$D|sPk)i;1swvNlbPEm(EcRk1c!vh2S(Aga~RU}dvtU%)&(nvn5$6ga`HU0 zbsxQ;a$(4>G)*l!6W0x;nVC?(DoZS2%U6fV#&xq2?4lT|@)^Ix#?aE`{bW|xk=YhUA($r?7=bGh!YdVK=1R=q6HUNT8xw6!RrW_9zy#q%Q zbGf*(dQQ;KY(&p@z_h4Ri4T%2qbex5p1L7Luv=%vR_V!q{q<0@S12<#L(xiAJ+%0E zh-H-3Ovk}}NY2xTVD799SD2)iznl?2D=KZ>ryR+@Cic=`rIy*y3OK3j#-8)#{`Z2| zTk%IMYdwYO&YgrR?Fn&DZw*b@0vUc%hTzqv3Zn`&{EzYW1*yDSu?%!FBi}qp-#%uj z`tMolSV$Fr&8c{pnJ1Vfn&17A4(ZHIudnyt2WV*bx?FD@OKm<$zYpP+U0yDw?=`x< zu>zxpSw`tpc)i&oKoEK&LO**f>4)l+kdP3Lgjnd-U4VT0#axyT)>~|r<(Ejrkqo?u z43hlh$dt)!9b})Qcz@#O>-^SEa*p5cCzRg3a8z>fn{4<^VB1;tv$dd)5HhJl-fAuV zM)GHC@kfxst2T5p{8m=@3e*A1hYxF=nCPYvn<}KeO<7#ru$G7NI(2cLqjD!B!kop@ zb8`)fiI7io|7vuWV2in~cFr2j*?8|>7@(m0Kg#kK*w2_}{?$=%lH0hh>!=3aX70h& zl+RgcXL0)owsicE07h(pN3ZCK^!kK7u|KrklHwN>Zq3b|MOen$%3g!jJ zx^`w11}kOw&@~jPNo_qDfv7+eO0ll!Jjke8K;!7Xq~&EtM7Nv@RH{Q3R!>G9CkqK)WT z6SrLiTQzB-NlSlzJzM;X`!_yFuFeV^a=oQ9+mIX*-dty&q%=N$N<=JhD!5`ST~_v*D|x+*?DlxBwvct7B zt`yh3wynd(qYYBmN4&CDr8hMK!msz%1x16cZWwp4eqfn#C6FT>>pJidu~1+Pcb>Y& z%cbG)(CCqq1jHUPQDSs@xoo{FoM(ua8O6~c79z3vR=K+I@?Za>+sbnfb5 zx&i}P*;i)mCG1Lg$8zVUMo!bO7w9!su~eCsewOt3s2BHX3JNUVKKq#5s-W)*`?!FP z$Uqa*TgT}1-?@fatEze+xN3D#H;*XbvXH@hwg>jzYRA847~A{ONbZ7JOcog2_t(*y-H%Q%zA>&7D-kY@ z?q(r})Vjgw=(5LL&x`Zy{`~YDLZl79*rTo*Ox~htD7ZXto%M4Z%9lo2{+i+jf9D;% zEpblHulg-Zz!w}u8BsT@BnI`1(b3sTt^ZQzF{rHJFCq3B7q1$4nt>JH)$Hx{n2emd zZhSU`etWLl3jv`p(y#W|IU@dcXmwWsGx*~6B?J8oauVd(4paMUKjQxK-Fk|@^#TD*Z;CDI zbJjC7d!eSs9q7;Vbd(o-ZJk9s8_6s-woCZSEhARk1e(V;7eVnsC z%>Vewg9Ibl{g|qq*U<)%DQRqO?iPZo_|3A#ooREH5d*TdxdCe`xoNy|$}2P+d5Tvj z`+5IH$PY`5nrgGb->)91!xLv_3)_@^3}Vj3#qaF?kIo`rhJBwuTSe#8KdF11qn$-$ z6&|cY*E?0cWx<%HbM#j+{T=}V2j*DmMT6rzt9=#h2BMwXDSrLG3VMb;XEP^8atZ>G z#9@CiO3HB?%*7)XU1Sb#D;6gNcF=Z;%?1NzyK^N-Ctak;zU$pNgHI(GyZdQMGT~y+ z>!dsu^V6@_*HvxQA;fTN$rCOJ+kx@9RVfW`?^mXfO}oD9BOik}9{k@U5wwPG>doXB6{BuE`r=eY+p3N0b*@fr7Z@P~p4CwIfN~w3$7UKf;vP*~rO$(cg%|q0S_|Ra63nX{A(>jMb#F zRH93t)VT~AMP0EG;GHP`TbK5|Jga4+Re3Ks9Yj^W4B)g0pOJKY%_#kguK9_#?5iz@ z6}ChBWF-w&1K?A*cjg9pfugahv96QXBn^)LJsrNxuU|WuT!w0wA3pr}M12pOQ~2!^ z=iB`>`LiAY!glG)C=@Kq?%^+a+WAZ$>b5(+U52bT#tpZ4fnS`cq6Nv<1VV~)%>Ew##Wz;Ix6Bvb?gvZn0Xo_B z6ww&!ycE(Nz+zbGT+UnZ%Mt4_C8<;7mhod$p+!ijxY&a-w@L^Y*;J%fO@05u>v7Sa zse1t;I+g3?7WMv7J7A30fk`y9r2l211K!r}dx`18m5Al=UAz!3N;il-Lz+5@=Hj|O z9pwLKGISmAUuDMRur<-BQ{bNPxwrdMI*sl3)!_DN~5poRt^D)ff|+ z@b>s*wMmQdNuF4P1xK-BY?z|h(-CCRf`Mnl+++yX-vefP#r4OR1L=d^Wm8zCV;geA zYC@K}p1&52#HiWour2L$tL{l2onnuiCT{MDRgorul_Z=qtoEbt>oYF-gpTf}y!^Khar0=fksdti5eQHN&q7Z&d;rsi@fK$fg zj?IU>@Bj5ZPr18AMhHAHtp*hS?>C%262mAP$5`JTm3HEQ90&}+CmV;iU-cTl4!1yYCI1Gq@49?aVvk%lP$aC*sd_scC8j7lA6f zWp@4H(kr)*VR#y9_3hsFw1tO{@_zCFNR{22u-`eOY_ z)|wSy)WN++cmM6{-+XV&Z^IE_zjmJAe*bPi^uHY?ziqR+^D)>!X3n?F2ezHBjMYDO z=f?E*L2-U=TJiV0>F5+RG&Mh~#=zd2&NdE&WR{iPN?Zr?47&XvcEkJLE$D1tS8DUK zx??A$-!gx+i~`B!#0D7d#tnymEU9|JxnZtg>r0QI%HBI4={5I&Rd4OM-#;^bvm*(S ze@Nm4$BwBF{Kuj$bE+O`-&P8U?ix5*f6xD^%sb3c_`B_gJ%CO5`vc!ywg0jWaTovj z71o;MZD;UE<{x`~Oyn)|rR_cXKfl0SvvPdf^BsEfk1c)R73apbbcf|DSRNha4R<%q z2yb0J_U>y*NgMy9vshSse0<{j4dysQ!v5Y~p_|442HAO?HL`=!_d&=!Zry>v+FE&>9V}(i4V$n+{~lWqV9Yw zJ1+^okRZNi322vga$1QhKmEzcDbtD*ba^U3JKhHb2!*T4&B8tXK?caZu`RzM%x2})(|dpZ2&8l*BxuK`vF^ajLTzS$4db<@ia zGb?>^8F3fWU!o%@e*XNqVrIsgu*?n5$j^WHsi>MM&AcqLNAAK=efQpY;;a+j*UZfO zpERC4=olx8wZSUZ%(rnqx@m9G`Tn@eTj#d5jX*EG^cS7U8#SovOZxLmU7PDuPOyeR zNddj1beHS_y63SG34#v4IRGHdBdE7^`y9*lbZ$_&b^CTCpzx-hjhx(dZ(Eh8&(k0d z6Fst>+b2QS(PzCqz2y;pcJx)Y9Z81( z%~myhX{#8OYt=7%A_OBMpU_My?RuK<_Rk^mcuSK`ATFEL;Dr9tzF-)>50?d>vYKep z%*@OUXL)xOfWFD{A$>)b80)du2M^{Pr{CAx@iT-)jim5Cx2L!F+S!sSyTgZ;C!YUx zX*I$(ZWr$%|L0lVxCcHyJ}nVtal6=eAtTUnyDsg)P2GGLL5*u#`@2kWw zOEXbXU-BQ^%AT3&Um}T-y{GR-h{x}`a{5xGnX$3V3z>6m2KgaEAL}pIQdgMm4KgF# zLF`3q8jiR__44W68OYT^b!NTiRV1wWLfA~OPKix9qZHvlb3dc> zmt6CB_X47eib~FW1sUZrJt|*hs^s2s24g3FZS-4|Wt7J%c9rl`He?#RIvm2fXl1{c za9eEbZM8E=+uUk%&Gy(}GJ<00v3`<<3T^!AZa;y$u*R)8UT2#VY6i9TfQ6*JeEE_W zj{H?%h@XfsRQVdbzQSw)><*&RY^>&>$9QqXah-)i(Rh5KKSyV@ePwFY;Gi9xL%@u? zHOf7yO$y&)S8Z3ig%`$dz%j=&lM@pYG4&J9Vnpn6Kb$DOP=J_dw=_q?IFG%XPK_|^ ztPYV#3z6QsJNg`&8o9daHZ*7+kA$^>`JyN!6%W2`-RhvON$g}R9NP!!uIrB0cAz9y zhYkeGp^q_jC-(;+xIt_ zz-*)vURQ!aXqL%&g@^i{^@ma&z{6p)4g#<~(J6c}dSqG{;C<1hHl5z9(qDHoNhwEA zW=cUUJ-xJLjrM^@a>i!HZxWt)6P7r!ev6kZYu_(8V@I}fDI`c*0baSR6SArr@tIp| zrbwWzuSGk38kZiga`iQ*5OsaMoMaQN9yVi?5oyG+9b#lv0hEMjd{dpr25tEZEVn45*u58^)H8jrUeCrin|Efd4^~Q zTHimsLj=G=l*!Tvyty29BN_Gn$7iajns8nm{zpllEo7to!? zA?+nYE@H7_6Jenhv8z~DZrHER`kAExHG;(m+5nQ3=kR>lm!peLUVrB{zs?LJiB4Is zOtxNw6XOx{eGc{QJ!mJ$^Hh?Mih5zZ+av$8E*cRibgXv%m^ho~(7PyssTKA)l&Mm= zkMpP+3^V6SvhWeBT<^n(Z8jJazwhTDxdrj)Ho=D1rMnLERhbx@Mmmt$sD1AWRXarj zP7y7(>f^mKF9wS}wyz?Vw0_<;sJ>M-bIuL88`q6LzRh@A29c>fG*{qU(^*94YY<@} zQu)kE*DTg{<~FFz@9VYv%>zs;ft9!^ew)4nOvsWM;m0;*fQBn#zV*=Y`(BzFIwm zW%rd>pE~UdN{KEEy!A5S$r)Bw*cKBsgp2r=vWpceC)uN^vLFuc%#P%|RODLWwcMD# zvGhhd2v>Jn^YP=%cgL?-EdKoNSgxO$lhOPB2Ll~3u`r76c{BetC6BVY*Z5>;n@l}rp!;tgQ^Ax`>| zOsrmM?=7-~)J;#{YoTy!<#Yv!V3X40eT2PvRxpVQ2sD&~W z#9WDW7rv50LR74W_doqrf>G@P_j8&*gm&Y4q&yc=y-CALe3fgTd??Y)!0Wr5g(YMt z(hRrdWkrLqJk;vE&`KgLcIBRNYl@4p^ z>ZVhNSEMQPrKpmYcg&DH{yoH$&=kbnVL({W)ALBAn`j zS(1UzzFqCd*vsa+Rqr^G1+U6wU=^uzcD~Nb^~eEw_^?GM@xfKImI-Ilngg-MpTj#F z8g_GPSu^mQ%h0v2%I_XIp0VygS=@Aj4dvGZb4R^v=(S{u_a+jF8?E+y=-GM>MJ4Qx zP!T|=u?w5upT}?mlk1x+%C8S1#h=rbz_xAKKN%9yHW%QRdkB6DHtRYvWKiuuLH2^Q|g}Kee`V3|`AU??P z=$7cMN-sWbSp!&m8nj8N08V`Fb6D8)JYv4*_I|bxdYuQ~`z?A&#j|_-tYUw&2<#Cr zwff}EaT;9!P&QODyP^Jv^6Vh8spLyj`dJsmN<`yx7aZ-py^*K9$vLJi0K4o`^7+^? z9Li~*h1wd4H?E6!CzZdROs`(yt2`~>vcBMhu{{7s8tS{eD;cyZGQAGsoLJXkmGY|L zV+ZySFe8*&JbEOMX6$_B7E6WdS`;G*DNjECB2pa}9hA*i}M|Y>k?IdbXOAFZUh} z9n}5A?mp|#Ja;xk9vsY$i5PGi)kpJ)tS%UP5jib=7S<>D;O2?0R!C$xp)6W(U8gE6%@J14$wB9XlrN8SK(Dpo;Yy{Im{@&DFY$q;Wx)Y`1U%SFGSKs*lN5^ z<)$$v5F<9 zL{n(g0_k(xIyn&4Xt*LEZUP;kJS$ zPran!P^mxbox*tQDb)M~tV@!L5Xpd@Vco5$Z-3g)$8F19Y;#eT zhl7EbFW;7?tD+M0*Dh-cFcDcpcCKC4b4BBfH;t|PNIqqGoIghMwpLMO=vf^^MT~%W zF;CuF^|Z7>J-ac(Y87>BfB40Z+d<2>Z$AUjM?-d!Y8rZypp`Pn!1q4a%^Mv^A@u^W zB-F2zvWp9wWhY`kmM+COkyvil*GsL;u7KoA)onyx+_^e5MWEtf4wBL)en?PAyUyo^ zw?{~@x9tK%<9i8@*QFNSlMqmoIG-l|BuQ%Rr>yOu$=qELm)X;7uCq6gGxt%^bEa=g*ade$uICtgWrp$)DA2uAie; zq{>?dO?OPFeag%{Ms@n281J(Y*_W+v&4RJYf;z=!zFvH!v-bd8aCV( z^=XSr_U&XkZ$IrE3=Z_}tXjRkL#bd{{Hy@CVw$Cks5yu}#1>_&wTkQN?n!Q~&Aukl z?|bF3oRQ9Be4JCYBNs6{G*P)aLcL)&JDse4m_e}>I~XiF`85oUv#5i7$RxMwGf8jPpmT$Tjl=ibvEw zwcU~=t(t%TVej03R348rkJG$*q9CWF3c7IQfJN={$w=Ph`Y~i3X#galXrhM`ZG`X; zqiVm@O5W{xD@d1Ok}n3|YFQq2@$@Kq94t;E2k(Fc$0fyI(bM_v8Nf2|S?lbc#L@?lz;#gau-!?L`(~K@OJ^$(}Zuubq*<9N=j`G*R7+GRFsGN zg1as$0^tO(;Ag%LL~_O@_;dIOPQL8~Fa(|%RjCZEHy4X7H&hpo_>gJAc|`kEVNRd& z;Wu|SAiIhCASS;Xz|7bA>9SI>N#mm&z2f_$&qpYeOJkRnu9q@YcaShDjSpy8GacPI z))S{rO@pA)v{^^Wb+(alE3Jx*JOMs2VWerP4s8>-22U=0U?I8ge?_@}|Ghv3)qN^9 z$B;Vd*xc{UB++kr#2#A#^H@c$@)$$)>`q~a4j--<%1TOl1c-V3!X^z*-6bT+9OY~v z?#xI@p)I>4TT4%4XuKS#z|Hz-MpiKmyHfGm%)vl*A$~I(N(B+%_|9UmDK=_XOQ>ph zl#una`H@P~fO+J?F0ALs?xrQTBD@^})Q$xNjZxl0fbv<=8w*k#NC9MJ=qW?5M3DB+ zU}^)1Sl5w^jBEXrUs5S)X^&xS!526LEgql_J=n&Id|Q_5M5Ba{>=ayn(E#6bwpRF= z?yeo#XX1`@$hdIv@U%{Efu#jDHDwEd=tvwC2w>?>X3|RgO=OFy&)1>MP%em_rQ(N$yURJCsq{|t{TiGKhdU@r&)!S$A!&zGBT=dm` z(fWH*s^y4(uA4#+i+Ri`CzBcD5b4Cay1Fmc(wo!9IogOmF)Bg*_#mf&!c_|=D7`?& zIDs7C@dAwxVp$Q{u*D{Ka*)ZP;Ofw;zTrHZFOMf`8FqE6N#%0rKlizlSP4Kk%1T|d zkW=5a!Gg;x*roX@GW(ybofpn3XR3$4rK~PCd;$0|DcIg_>#Sde7z$gkt~!Sq!8%#|P8%Zjkz0GG{VV@N@S~HB)o& zL=8m;#g_gwm1tY6arb0D@xIbCXmzelRebJitjpj-t<6yy%TbO4TFwAIaJToGk>=4Q%jQ8hRt$Y|DMB zCJ^gNeHD%Y=bi=?UN`29dtT}24> z!a;jLu(aM<7z`ufGk{ga!O{900#fc6TOsn2JfSO~9XA$F(Ll@>IH3UC)LMU^iA}7B z|FN#Fx#!QF@-cx2lvOJh)1?c&dU|?DZj$kw2J)2zs=O0eCV`Kpp(VOSCXpAA9oxo{ zX}Yavt`wb%n16PgMHir=Rcm9-eHb|yG}z+)Z`GUT!2~)R+wLyufU@Yy~(B? z_e^JV?GR9F@3UhwsHY6LI2afkdJ|y_%saSu!Mz*(DG>%9waZ88Nt@C?JpNU;rOVT_ zccnRHAQFJ3)&v$Wyk7-GFYS2@Fy?}mT{S7BFT%D~E&cmBe8PI5GqLVd*i{?tdS1jr ziFHdq-oDbZc`ztw7m{o+JC1c~m$cDFT@0yD&dRO4L!Lu~m<|c5NRo#RTMiU*!;xF} zTKZw=t#~gf!!GML7rj?m>k+l?LC7Vu88}#fN_w16-EzLoz;YNGl$XHet)>dt6w;^P zJ6#5UbwHxDNJ*FIvYk4ge+aU_ulIt_8nJldCL)Rfj5gU8n_e3b@nl{c01=;tje$E3 zWbp)~olgeo$xm;5oicR0HUXP;?oafu2}CZADbdhR_c`-8@5jZ(u<-nM$2l!#zua_K zr7@JQbF@p5y+TNmx|o%5vrDwnz)VEMX47)M6>MRD<93)UGr2wntFfLzQ1fX8hRE9>FnSt2 zSg{f4yd#EDK(Qie_a$foyb};Ozk))NL$jNr;yXs^**qv^^%gj>6H8@0#v|8tQe21K zMb=+p+`UMlgGH9=_pSSFF}9qw&U6GaWdm*Nno?v3>H?+19-b|0*En0>dm=FteIRNu zS$7+)jeB#dltqNs%x1iBrrZdQ$Og4jbo)P_~a)csa@Ue}(` z`rhN?5CGIc(g&DtT3T=fm5d7Oix2>7`qDV42Aj}RJeSrfu#n z%<&R3?vm|Lks?H`XON7Fwv&b^jUmQ$Tb}L6sFihQNrRO^d@eew*qX-}1mZN1cFX`( z%_#lB=!xv}h02v&VbZy>C;DuxFP&~3CtEui*cr6+Pqs#f=6;`ZsSnf))4GHVzLcYb z)PbYo1|Q~vRNMfL=6`Hx2;bNkJ}6!98HDvA$8L}?wURpaz`a5qV~rr*_Gfpbv8z3c zc8ajmnC;3Foj8p^(4Pc~iic0}v^ujm*UH{`AMjpqrDmMR7;qys^!?Foxb)b;aY-Li zcYFh`$Y=KgV&U=3CnYH7`K@yMF&fVL<1pWQ(M&Gd*Np*1T6$wit;oa@ zS~g?`Rk>Z1g<y|FFBelaWYyFGa@ax2PjmR7fZ8lYD71#Mk_0&;mn^Z4#laorOX z&$;6Cl3@><5HyFh4{NLw3FN?hsO8KyajHD6`@$ktGfNAfqOOW&HuSliQLe7z;NTE~ zzrVlw2B8#15lU-*3YvseZ!MW1m+#x;@x;lTOR(Nr)}kz_Y1I#vlI;*PAU|Gk1g~0JJLWU zT1?1n^F4R2#<>su#@ZD&k*YE71wj2cR<}&Vzo^Db@tDn~McaXsuKoy5=qZLM0l@w7 zfYdp=bBQx9?D=Z#N$#p{5b5?7Of>V1bH+i>y@u*{C;|KS!JE(291e%~ruB03Yp6Vv zT7PEH=ffuvZPlEnlQNsh$!gW;%n&&wt?s#6SLF?3LZFMBkQ(Uwrao#@q{&K?sp~og z$^qe*`qs`x77I{>7zSQ|vwF@{s2CQ7$TP3sowi$l>BC#w5|(s|`79boF^_{BbecRj zC(#j>G&2*3qO>7Ebb5YcDo6wm6uEB5J}T`L@8&%%16UBF*xGZY4>LbF3=_`F?n~E; z#?lH4C__lUWhoEvzBd4#+G}YZlLK--0lRZ{p!Qs`T1AF^yX}w5MHtIIzj%)x4WN(a)x>YFn5>(_*LF1kb3d)7MbS2ogXKm=Wn;%H4dB7j z^JToNb_+WudFu@`F*Ja;59B#xZQ2MD`Afcbp=uxtc`Z~8wt29SP#0}q%kWJ|cpqU@ zo&(?2?2|0ZB!2%eO8b)H8A&URmSP|185P6LH4Ke!c+Bg?dTeNKEH}f)T-XCw%RH>` zIrTGs&?e8MPzivOS^>etXDdL7I1tl5?h>O{>Gm#nYsJuc+DP82@tAc)9SyeC)Y|GS z5!>+yBi&UO4KAI2kY|-_B?50ATo8~)amELY9Bxk=EXWAA$@-Thq5mezp1xk|+NNHe zDo0qU{?aFH@ovNJ50ZLV!@uZc(2m{)`p(1GtPc4V8!2HrBdhm)ZWwoQxhdc+Vdr{} zBsW4+@##6&;UE?cev`M1Qq$kU(5vfS6;tz6i%G?F3#=G^DYCb>w*taV>cYBPOEZg# z?p~A+4nyNLWxbJ);o8ZAgZ;^Tq#-9J$}%%Ez87tvR$k(KYjXM`(C%dJEjLr;(qbm5 zwFewti-{8Kr2soR!o(BdD6t zpUeakHOE#EH)inV8^HcYNkg|I&R4FqNylb`aAJ|jmwsg#!G;r2?sWw6yv zEyW7YZ<_pY18YYcLOG5SP+Zw6x~IotYjZE{)wC%L<{26Pu;v^G?TDTF)GGZqd-pml z*aKGuDxWy86bta$Sii-(kdb?8Z9d8vo8#mi^n#B5Iw1Zq`gZ~Vk&6{E=q!~)SbfNdO3rtxoT$H@^U#(qfG6)UVY;i?np%Zcfev|JJ#CR*a_!F z++`Ya4FN%cZ4S3Sqr_7Pxir`;Hu`$}S@2PnyMTZVDjpLa&q&EL z1EJ=42=3=AMh!(s(P79s9RB2EPn7sVQ8GZW+f-kLBPTw{GWKP`E5Fk0CaxTGXVQBA z4BX}|ZIQ$$ijW2jra-!FLIbQ%(X;w6jTUuE2ZT+;$@cIdL{$FLw)> zI8v48u&iWKujH&jcN_7MKKJK!$yiJ@wDKvodx-`Zv{yyNFYmZ)8fHz`4=Pw+^Af%- ze~gca_>A|VX#ioaG(3MdJ7_rEwJ3=y=o;#-@AjY(#UazAIJ^Dxc)?UL3|m zxsNSL4jX<_6M=%y|s%B9K)~&UA>Aqd*Ael z9XcE;ea7Wi!_ke^*isy=hZe+ynFR%1c5v!ah|gEoVGn)UwoFV;UO{s1m?4zj$AnZ? z0}WwVF|OZ%lZ*AYHbejJ9sZl`adx4+lv6VPqs63~Rx=c{)reg(E@CrZ#)a$+bnkl) z7G-#hmZu9m>HOArg5DCF_P!4TdTyG=C*M9XfyYzF9!ajuI)&#`u}%>{y{QHRRN(Nf zAY6gzV5NHiptm_XItn^ZA5n?9bz2v9Tn``62RDRYRtl%pPC&y<1Ryy9#`V3RGpV+m zD$1VqsQ2#=@n{!lunOC0fD*#X?;pSj8jl`jKTN&{^3H?H9!Sdp@ni2S29_sus=VGb zHFKXhu;-VfD4DXBoL`!fCM?++AMn=x?W$)j>Iw$MZfqto#^^z>fneSk)(5G`Wg8Ni3M zVcABX;`1RxcyAuC5BqyMzW@)4UL36!D1j_3Gh9ZzOXvBNcY_8w8nXeA(XPQYA3R9- z-2oZE@Hy2EB)VtB&6LxcKNy`pBVuPA#99hVQ`!zn=)9FxY-2M;d`57TfAJDLR3jAb znzOkk@oO7z$MYtTuH?W2r8Mh?Ut5ub2ocg;mS;aQEf$|z@tAAHQ>;{E>asXzB)%KQ zvyXAR8*+CSAVy_Ay;Cqz&zNi$Ns`Cs$kN@|4LUD4#SwG;#t9ZfPfPl<-;t=k; zKYM;)xgKwW7 zFF8?GS%p(429+t4UE4`M9sMm@aw2Ru1eQ+dcqL@g@N=6hOgrG`j#uE#j(=`tn@Zw; z_%#p{v}^PRT^|bZ5t0jJqf#u_;uIRslNQ{ zaQ6SBWnVcqcZZosd}&XF9Yfn^d{u5PcCKaJ<^=ohG6lIX%}a+v`3~bHeQ}<%aldK1 zwEo~EeaEDN@^L*4`#)m(U#0ZUB{AUrm$VCtdhxvfdd&p1I?N&90*EUOHv;K3cDxqY ztWR?_JDcSJCD;A$M~M?-$;&km?3B@_ly+FZB$0dg8x3}$qdyIJjezfJ&SNaf9%9xi zaZ~mWBemhRiTKj*9sBx!*)iykGi-E;3Yf91FSo&IprfbXi#*?MCfHp!JD}FEu&P@Z zEHa=YGpXF)J&p8+6@vEkD%Kidfu?b76SjG#Tvl5cj`IC@Y<9GHJsxy}ar* zlXc?A5lL^)r!JT2vt%Ez z0JW#0k*)ofy_vn?OX+c5dLVc(_RIXsx8JyaNNhP zDxJJ)Xs;XO()51|oF&Ek?u_J(_cV%`)Wt>e?zXIP1x?A{d>4m37wTUxmSA0uo&VD# z@RUxm82>;c;TbaK^2J}zr>>rT_w`zjOO3&~6X60~D+X6TK9za#o}r}ABI3U*O6z3% zoOXKyhe@-}H0vaF89Y~rEsRxEV!R@}+c4 ziO|LGzArUdZFTu{pky}vrGo$V675?x!$RC53j8*@e8()Nw=NL4oon$UJ80F89wv+w z=Fs8_*O-8U{Qr8E6x8ZP#rhMcKodQx^WVAl5X#II)GZWayLm+%p$^V%oZ-+tdOy^iTPr|9&1-#$GC5+tH z0+Zbv5T2R%J-+J-rxhvCwSq(=oM5S8!B+X@hgS)c<>wjZ|mXfcLbdJp?gEd>kZ+ zs|?-oYyU8qIo_oj8l(V8UmMy6`P0n&@5>kRxrW6iC0)1%D(MYnC^o6^Q=X5{Kze!_(&1#mE4Mw% zpI7>%mm=hdDclD3=r799RP6uUIT7rl@7AkaHwx$;{WDY0GjczzLXO9IUj6FdS1VPGbGG{NdMTVK zz1y<_))a7UnlSzD_CD$Dhi3Gz$ZUgGJ>Hj?~nfQl# zdf6g|5aI!FvC(o9b+%N&HwAJ0&^OI?}!lYR5@9bPoEr zZkvRW1`Yr0uQv0yn0qyY{(W&X2bkr|Z_!Z>0tMLr4+VIm?0PU@+w3pVB6@zTZH_k& zXg`n;ap*Y8NHu$BuWc1l9#AQFhg}Hf-jMZ=WdNMVA7s!G_d7 z-cV_SdvaX)&DHD+}&!2Y9ExfL#;4-OBSvPBNLl(IRA(z50!82HnAz z4|njQ`=2E2NXG%axE%o*n?)Ivd^{@VEAu;^&+h^$p;6X*EmS8JmsG8Vtm zG#+f|-#pQz5cIBLau9Sp%c|eFR6TIYk@aRuQTM7%0w-wr|Fb!C(*l57XIHWQxVeA8 zJT`G?2pZan;S_?E|L$7ed0NKs-<#uT_k2%m#{_>52Ex9*|9&EAA1Lhl_aj5Q^N+?Y z+Kqn30QgPTgrNZV3}_vOdM20Om!ZqBc5{SR8DdNQ7lqurUK`}nc&>k64XWU4)8Ofz zSgN-Sk%2+qfSG)`vOy`SXTLW0!N-&M$%do($pOo+V#s*G%lHv=v1{nokX| zJE0#=tNpg-&2zMF@thq-)9=R<-~ha$2R%Ze;WrFHvqfk4d-y;AL~^piBR(3zD<_y0fI-UFfrNla6GHDTFgxh=-uq_e z&G+8S>@OcEaQ4}C?X}ik|Gz>)LR=(So7>y51sqRAka196Y2C_fDQQf_MSROTqpW}L;!AZpIv++9bLi1uK4-Jm-JX+Ma;JgS{avW|m>h^nhVJ8J z@l}i8j^-sYFr2j=>@SSr1%~=Rr4gWje~JMLCpVHh##r7f%g%x3=TOjvZZ%X*)^poS zBABWV_xGyzPF6205i2$>PZE!6V~F=?jhlH(>{f9X+Cr`Z&tQL^B8Xh<*?Bf>xBFQk z4@2MYsVNapDqe=j5f*<+_%ZM@2Ea*`zdh+_1YqHg_6S^+0#q}nm}gRbDa~CJG4w$e z=34zt(mmaZ6>{rZuHEoSKvXX$ys;A>3m~m5C%y-Y(S6tcMfBbdYSkmOA!RgFMrz#s z&uD^|1=Ik@>Q+_uG?OXhS(j&2U{mO5pFdo1FB|F*gL$HX~Pd zT2NEHV#Bu8(hqmUUA=ja7jgwx30h=M{s6S+N@{JN>C4p=Tx|5i{sHd^^k@P#kT2>X|)dWZ#TFEnuc%&`u1{e*oAY zIMI`}G8=rWHm2jqnsST5!+Xj3m0R?Hl*#74y+k}+yg%;RrXP&3w=mQ9u=|GlvZLn| zni-{=-;NzM@@>g*t?7|P)Z9MV{f5hX5J4Kj%3{MmJrOb?OSwNKob}ibjvQTmtj%K4 zIQc#PThOLHkeAwnM3%s0>ULRx0N4uDLv7Yr`}X!sKT=9~Zn*9ly?bry1kCp`D^vom zaZ)^GcT(LQT)m%N@LiIK_pNV|hGE3~R;E}?q0w2YXLXUWVUwg;ZU$RGaPU7i08p%O zPUBfNA zA^F~(K6I$`UYEV(TH|e9qxsP{%mQgsftu>xJ0PMs#v(;OjCQ z21EmmP$g(*mK*0AW-4s(-zlsHObh;swkm~dIDZCKzf;bo`CUmhwDvg=a^gt?qgL-qhoG zi-KQR>EDCKUI|Fg^zi1`c(=v_+h8hBm$vnpk307de<@5y>%FQm{fm)V&@Zz-l+ke; z<~xIa&Henc3LCVhQ2)d$4)X>;9SNCddG#@&A?Iau^kK*tKpxj;@2;bZ&8$ejlqJEd zpI6=s@PFMhUgDVNl|dWtQ9s~PF0`DY`47k0Ns@p3bz~J{XL8ur5&qb#(at(S zNO;z_)wn?UB;aG3z3ymdv=%FASp)%*^LYdEb_pX5g;Y5V1`{wk6hntk3>?mC1q7v7h+6(cu392LQaEvg)f^bVIP? zO+jg;!Yx0TqljHDl@B0Bw}f8Z^@!H;+t$NZSygDakVrV)F|?`VBEM zZo|n6&z~X(zuiT7Xy_%KQk<%4OJPZ#y^}~Y87T%7g&qyrpM+7{`I>n%>E+M7QH2DL zp<95TDrMr^-leJ4bj^5qum7llhfZZN(s&J{@F#>J(ZBi&N@hXyYDbyKipPohRm{*U z#_g45)XLN(eAT8}X}>q)@;AQQXPgG;D4 zuV2>)lssuxHLn+S;?cw-{lWd)J+m&Q739)AholZfZRHZmXrT>*LpGx;=B9_&Uy-^> z8?r_0-8<79iG;QGTD#Vt_x`Us^1s;+=>MT35eRY@bg?~G|B8(&1QMlW&QRw(^9``A zRRG@?OUa%L07?v?FEn)h_BQP=nFmQ1C7v9}tErK(x+W$jmghUM<@a#f29S3xnmB)( zs;>EUEwztp1P^quk?~LADxb8(ty*U_oMc3Xw$w#E(tkT_f33of%40vw9lP5rl_Z~S z!2{CZIsg5o2K`=ZiwU$Abg16{w5E@3xY*Z~js0wu#(!GGJU<|3wP>Us_Gqi>Ukmck zz>^eP!KCr=iTdE)Ua?g7b}zvD^|kLmqm$&s{ygXapRBAV0)rRQGlfh!yKi)(tu1xk zTMbkmKE$p4XUxN4;4C~398;}K>kBEXT zSHqxf>6Ulxlf5T{SZrFz#54aCA>ah;__6SW{`u6)^-m3nQ+1jX;6fd+P^)8x)11W} z7-dJ^aRSzo=q}*X_*W4MgTRv)!Kkt&_#3rukpCPUv+FkMKqVz2F&$a-VG0D^6vV@14gv>Jw~4%C}W1aHCrP}Kon)P ziQ6L=7bza>f0SqTW#F8FSWR|bFPHXaMno0H;v`AC(?qx7x?-SA&3lAAdv%Ve50x1K z0#rn+|760$B49y-YtsMh0gEWI$7i5GwQ}zDa$XQ2o#27EFMwCjPvR zUN*Edt|__lk&!2l40PocsC@%Cto}X!9h$(I{_`<_U%V2K(mXm_8+HM?W9u*CbnCP0 z@{-HGXXJ}{m`;9sbp1c}EO|ODB7a}{Jc!On@Kt%M+Z$E*I#kvOzyi>@dmvHa;3$cD!9Idwl`W#rTP||yrFuv`7i++kmATt8a0NYGX z`}KRej6np`-T(al(8(qa_9Fnu5cm4^Z-Sh^7nnsjCz%%L-{lwRGXpBzjwm@FE!`i^AA+L{~vsU|MTYj`~ClO-{Swgp8enc`trY2&7b%Guev(_-!zBp z>7+>gL5{PA0QRGFDB-tyFZ_q*XTN$%Cg3~YDgl2&4rv2dkN@f=#i8@Sbrj$j`S^2x=saB*ET7c_!nFyl^)e)8=jOJer6WJp z0&CGQhwdy-af{TR!9Ab=LM+lk>Q0{@~r{ ze>=ZAc*zgnzh67en&&$jS+>sSInfA>e0yE@8oOj)!!oyn7SwE+ob!{A@^-1fhbW*N z`M=ibS|jr-fnf48v&nsDqm6I_p^_Eyz`P}GBS#t;m95K zq|2Hbo;5U{{GVk0)roK+FslJ??!-#c{}_P2(eR$i)Z@}}?0y``GB-$Px`BJPb`29( z=l?Af>$8M&pKFO8amMK||E_^OAvV^CG~pR-T%TV%XLR=5Ig5Q-S~5nNT_NIuX}X&7 zqb%hDSOkB?7I%yDChplb?z4~J0hyM<%EE>P#oJI|x4AL6!QL-W2ixH%>ONCx`q#|& zJllF1v&lnd^Q(i(+Hkrb1MM`MXX!T2u0`XEljmz>?C6m4>zlbM{olxS+bT&`>9P)N8*IGQ+bmIeI+vu?$c~CSFYR^%{=8zXY zY_j<}%UaLBrb>>De7PAOseJlYmCV=RD_uG{%G!C3YD{xc-(d|J{_(7Jc(Xy<T*W{3A)C*?P6T#A1E9&>h-TVw%u>Rsi4bn4S38&^;My|kQn}>qyR>QPXBObLG9;+ zBdqy-T8Z7S8GOg`D@P5G#wQB62PYjorBEZy-2EUh^Y2nX<`GkF`pLP6-|}Yf$OQP< zW*QOYWJ=nr&dtzC+c%84`r-x|%G%WzKS?UYPMQW69C3X6x=40-FcA3=Nav7(K>=skbA1sQ38zZ)x$5!4pjWicpTL1laFeo16 zJysAh;@q@wrg`CvYGl=I)$xbxJ9+gtIH9(Yst5kY;;1asZ~+5rR{B2Pt{%Y^{o%P? z$)@1`RcFBmF?p!E2Y^+;N?ht0-$+%FM{@No*2jKri8uYZg;;jZ0=@a~vULjCOiiJz zve2S=#%t>q;ASQpY4>X%1YpEi>BW0i-OC6{N3)h23$q$iU88NJqGWGALo6|nei^g<)7(fuiM}HrwnWLk|o&CLkNh%x?ns- zO(PnjNknnyVp)2G{mR?Sq@D7E2hs5Hwzm;r=M!H?#9{p^2`qKdyx#so@4uB9GX`?h zjlZrNS6em12-T^-JWM=`nD!b&_y>jhgSa=Z(ZJnl%fKCUZ(vQcPCq=kp!Q;63u}H9 zr?YYB=QdW0*&-}QUeE5inI8_jN(|94bQzQ0D;d+-@LWvnX3ITCdOPJX+iS+(=~Q7`k`kmDoSf%Vpl z%nI^Uy-qrr$drS}O%USMF5@1@<`n9D9zOP?ix!)u|1~E1BnfQ=Af>Tj{1tHG)_w)<3W8hN|koX1T%H^*pSvDQfDON+C*W7Rl3_y|=e zSmjuYmJP%Vo!X%m>usXx;~nImxh(9U=GaIhJec`lcAcsZnb@&Pr-^LsEQ>$7u4*a1 z0TIbax?d&WQBdNWgB15iQSEL=rWlTA6xstsreoKbNdaJ6+A;rGgHViu|;!sZ1&mh#w})!clas*C!* z!;B43xu%&;;qQn3VhrT0rvG#PgC_WpZ#(5w@7Bt8bFZk|{={X_-KySbSeP(GEpHix zjySR%Zk;W$Pc%C(WHK}{s_JiveuD^n(wE}N*D!arc6h}f5|<& zY!e*mYoN9UJZt>QU?0Nwq2z*u)MosJ)4#UOulL97li{6mWq12Rq`qjDRik0$A75>{ zZFF>-3e|U#r)yRYR*7U%M6Yz!(cxAh# zqC*xf>pQb&%%Z%51%{87<^;svC(v4|gZB)t-QxOoR|4u(IONNebspOyj}{0<}frwP4JxFP#nx$jTT%+v~#U2{%vAuo<=`}?=Mv9m;3 zOR{3k+vSJbm_1wna_Qlnr3#rqF&`*YEPa1w2FqQ_T)AmA%A&m&4qSyUyH#^$Wag#7 z?44295aI1pd=VqhrEC82LVx`DYwX+a6_4R;>0@>&pAm^Va6|5t!dr^wDJ~apF@_*x zc70-YC*a5DKIy3+h*3YlT)8G;^w^v4RyBXjeesi#VBGKpO( zBTtW}*)chES30zWrs>DYc^A0F9WyblVQG9KPNAq%u3d=LcrbkvEs9f#h`Qvy~r*H+RPGKb5_V7UFDE zICU6Ww zf=@n0J%BY7z$z)=YK@v9yHN#j;|F#$jzeJ2eTP-CC!+4s>1)KY{oO90dghZYuNCh=JYSvZwX^5&MG0UqA1SImKoRr( z`{?`yZ+)z%Z*5tVLHE7LQQ;&_Ja+c>*GbRP4m8uh!y| z)YE9%Kwz$Og5AgaphV@G<~*3iJ<~68EMdN!#U9d90k!@*cx%y z>vBipED!^k3sE7UaV||)u7%=F1z=d|lqBWAIvz-W?m@ZB(aR+YTxV<;2JPu)o-yYF zNkBgr!vRrgQv7&vqc<}vOEG(wzwkJaQcf>KQnCD**d1>bS8R3EHfzE`#=wZ7qraLI z9#BysX}XT7HLgdl@L`YO+<-1!rIyqF7d z%+)B%yC-3BXyH1l?YO##;Sk zv}2efuACpDzpHKKSlWuSvz=9ab~@&DG@I{T1cT}Ndx>W*6K7PpM=Jy_ zpVAZ8vYg6fK(mAxBc?tw9M?(PqDi8*DpN_`q6I5o*(-Ep1?@p_Exjp(DaXU0<%i|7 zPkh1Y!@>_|V*AG%(jg7@B?UWQuIcv7NsN7Bni_nY&Y#wlr5E2d)jrG~lkT|6ackB6 zWe-+`*vI8jjm0(zmZv?e^KCnjFEnm*AEOpGk|ZB;b~dz$@FASL%z75IrY~dTdnYS6 z?6n9!K*sZiL*H5I#$O$uE0<)6A+AIj*0bZ z+^`V4>MoR%W1*+tn4AB`P~Ton`sbY#c!XkY$wN~h6@c`|@y?Ak4&EQCfs`s$T!Z1(v#a-stgnCg3cXJx?g= zL-+-DzphvMGe7&01R!X=fF|hn(w2pn_RYR7nj^-Kz2Cmn(H9L`uGkpN%}PHFmlQc- zff!0!m^d7E+r8Z4%(;g75{AoFlg(@#o+FuvXh5$SkuIsGRILRO7t0nO`;AA&bd1y# zJYsavy565e76OyvQk!7tW}O`nmF>p!>rsu)72O-Z_(REyIh>EY^C?mroy#rX&_*>= zw#0l~wGzKpjFv<`KwX7-p;TX<=unN*QnvbfF6ON98I>`gAZqvt=8FAYiC2}gaU_EJZ~`WQ3b+n6f=0`l`38Nom9 zXO-PZCblWxvGUJr%|=MhmR9CHfUdWN{YCNWsimH7V{W$cwKD7TLR2q}KKp!S4Q(w2 z>-5aqMniEuiL}!drhUOr&#dWR853}#o&vf47`5{-7mgX+(_OA{1ub5}V57Fyya?-{#m zPT)*J-Q#*QEer*40iz8Z_A0u(r{0^DJX@+tbJb6*iq+hY39WLIA+wn8 zmw*Gnmwr7!x3{MRIp-#+Yohb6#}A(0J{Jk>>gzPOn_HrV1>j7AlF1TQDYb;cvd#sV zZpMhTNKeM*JsRhKZCC*eU#>o6FbGuhB(2cLAHe7sBbbjUxSTuFtb1K!=u@|aI6#eA z#in0WFLnGR4S5?Yqtb{l`)~o=BUIsiAqmxT&zQDah9;2bLYzx8f<`l9Y{fPYrKO>n z&ysH zd}7jDE0|*3MY^`QCMU+lj;=yR^1gYs6Bz0xaL5^Iaiu({3LfE0mciUa@-$IxY~7;sZxy%L+!VUErmKix79z*v;|xQ z=RaoSk1W0<%Zjc)q9TV_rxh17QUHz;C`PxCu=>MuC@1nFOAyZfgVN-s?nj!De&voz z6N)$IN3{Z%X>`Nw#9^?+r%*!UqHN2Ig#VA3lGk(Sr_B1iT$_Yrew& z_NCfs>N$mrLPUE@J@-Ca0nslRT32Sn4zX@9TWm3(87ko@_m&s}^H+KrzC8Ku@x^i~ zD$6r>-=yR^nn=LZ^o5049BAhaAA?P}CONpKpIVy3Tx1~obJ|*5+BS#v?+x??I6G*x zK(-I2Ly!9K5ILd8ie+FO2hfMEUWrr;n_ctizL6GKF#(j&1=wJFPO4mmkyEnqBgGi- zF&4cV*(!y(Jh5RC#9gHihU8uF;}=4zuf}Z36>A3jC=wYF_cKWmWvq{VM(Ug2nY(d* z+A5Kv{R!_H>TMsfW5Bh5@hnA-l^$OEaI3Zo@>m}?LV1oik2KjIKPn2HSRzkfxGhL7 zaQaek*dMFwx}2_VuK|LAoSBG*J3 z+45Gp3NFhm8jMGd2rcC`Ojb}+8GrWWv^b*?A=rpZYj13ewiV@>K{*_sQ+VPt&PQ0k zY8=+-2-U`*_3Y%tF5Uvx5?Rl$6;%oB#(NARf|3%s`x!1D>z5i5{27h+2}YTTJD~pd zF$Y`$w}J-&&*SG2XQCs7!4rH;VoZq;#-&s*AC~hn`>MzmGq|{Yo0ynkcAL^3TpWvJ z=JudTTv-)3+(}esffhMg&G;&2byI)2WNq8sZb7Vh)WiN~_@`JYTVRd&(mTp}N9MVM zKm#~q0t@4lpe8{t10cOVCAG#jAO7sC+lH~v;qJb>oFWI^zc>;#oR~c}0hG(CgKFaK zy8SHQ?dQIT-B&~=2X|d;xmTHv%~RGcmG3lnA)R$hYyjtiJaBRG(X$r30^UaP!FN%d zzO?!b4GZ-WkFlpVh|bVwTepKC z8V&E+P3qcSUZ<)&3AkS#C4_B=a1`-LwVJ68qPyt@ojsR2RGnXRTdB&Mx~9{gzFp7% z$?ExPz>fr+!ekcQ>A_)6NHby+m*j!Dx9qwTMG??17>%OQfOk zX`rp{tFH=n_C_+O2t(jhSBFZ^(4~Uz`AKeNbBWak+VzWd82q zG6iV4%AH#}IQMl|Z~R$1^v)?#u_Zbf80MY$&h2X>GiZGJcujw4>l#Mg-JoU02U!x@ zmzTF*nm61#8b0pR0(&^ABQ)Q->Kp#dVtP|fW0jLYyhq(I!f{a)f(JhB#-fbys<7F;)kJ4I zLF9wE;k4(^J@FTw%_ z@?IVWF!3Q+RxCV6mpb|8qvRX$L|R}OCa&rZ3itBcNGIk zs%r!dj@2ViZ2hHvCT~e9OcPUShcAn@N9UY^*R&2w#auv1ZF;+mjWsTeDPKSZzc*>p z?((a&99;0>#waOjti-a!K!~t0mqxc(q4<+AblT~h7rT#L{ZMexN{&hd9k`BrjBFc` zDK>3vKXs6%^x1B!GrM#<>jMVi56ar{7u8t=={{ay<@B5NMJW0dpHLRU$pinuv4YzR zs1_}Fzl>J@sT0A-A*KSi5^5X8Lm_-4A3Y8<^s%RLvp@s<-}?oF8J!T@ zTGrd;@vZi>*66u```VSIG-~mz2V(*`IJY)vlv-GnmVE+?E%Vke@w14VI6^uvA9-`L z`;te0p)>I}8S5F;pq`}NjPlla7?11eR7>mC97jToZU(kMe zV~;h3aIENM=ecHAaXi7J*}3G%j*$~H-z}w}6bTka+5^C=Z&)|tKz+cYYRFmi=y5(w z9)~<+pVTq1<5bv(&qo{4D7juQUX@f*v#$5R&|0fW&mMe1myvtm>xBI^*Wf6L<1@Wm z20st)6G!m?OWp0q?7A!nVIia`>npwB;s6xW-}Z)3(Jww#@v&2fmg+_89?rW zymNUVNQUW9p{ZOHgi(zq?Ort{1;HV5aJ33nTesKaMjl{(MnQ|GXG^#F1+n8>emMJe z(~^e#n^VaR30>xz(wDO&g4a>da7r!A-Mh;dz{6|4UZ-gyz8+asc@lJK5a?~Ka^}m0 zIl$$=qv7XB*s$Y*ZsRV{``qKYD6(ZKDw=pCHk8doiN4&P`MOaZa%l`|T=4pLvFchnh=8`MNK6SD*bQiHPEscSDm1#`sucMmV-A)iS8bDAQ1D9N+mC$e z9cP0F5ef`g%ST@c1OnBYgCd#tJ)^zq=SZXo3!$h83$7*aT9_^1^ILyEf7j}-<+1mH z#DmF7ZpQ%Cj?W4d7F0qay)On4Mu}+Za2TX2$bjHpy7T@khN=x9pJuxf?Fax2 z6Tcr?>xKCS>#rkBIlqx3Ut@(eL9FlFn!Ty$inF%UZ{O1qzk zRF}4dnsck%oEI0hJ0|e1&8l0afi*28P7H*9T~>`m#)&8iPqv!B0_fZhE>5g2!}IAb z=`1324TX{U$Z)QQ7bTldL%-OY_a);hI&fxzNzXYK9#WVl@R8~M&Vudj4S|AexHS(( z|GR-id6A35{ZLcAeAB4z@b|09vO$maHie0LTg97}O>hh@vG>H*a!=6ip!?po9TB~r zN55T|O?GYGuV2DeHyN+PZ@czUslGXR@;j8{Tg%VYf8rd?Q;H`CpN4$;xDWvESXEy= zPR|^8|?WFW{Mc_9}3`c8g$V8C+WfVogZFXV|W9Yi_6C@BGSbEFDx=sp{ z#RerJ89R5Qt1tbW(bm*KB4MwwxLJ=7mYR4)x?zo=);N^!?y@WZaPd3Wd?-={MCVA< zTrEivkQiMu=|0}T5-}K(>Dj!fM2vg!`k*lpxl9NnJGkYV8G#c)!!%XHG_vB`(zb=J zUgK4I>S`ZFs18pZ+c5{?>j;I><@2Rx#ghzB6>LEgd2U!fuLo39h zO`9L~I8MfyH@Ywtv1C(kOF+~5o5e9j!CM7z|L^T@l%l4x@Ix46T5Uz1uYX$}85h>b zt|mmR$#|P>JdH@vYc! z?;G3NG`|_{7QLTMldw=5+0C*Px0RDYTq1pFyhEC=({^-z<)#M2XHs>eqsD{aBfayb zxMC@C+1SKMDqdCXhTRvBN85H2@5^ly!38$^y+8s-O6qH!E}ksnwOY8IyQPJefFF0w z_v>&=l4!*x-UtpgDTLt#jLyLMUFxB1%)kLz757^HD{pkJv=kiVkP&XU1QMsa5cStv zO0kYp#2Z{09No!KML{AV(h^0#J+SjA&tKhJUT?#mnz$e4&13Cj83R-4&D*>AV?hpX zpmp8K>$=0)Tkw0<$F3}&@fTif2-h+$$P1$D ziz;#f@RMXiSA(dupxt$y2dib2K^IEkT^v=EfIktc7)gvKM&|6Mf$RrIaF=(*4Sna! zD?M0lW*d%PGXI(M=n?x+cCY>TdR!6Scuj~bYD5`5DuX|q%F5&dLjm-LYzxt+E1&g$ zUV#!1i#z$ZEa&<(l_h*=i+LosJY)sGtM$yxWo};G=O< znGpP|Km!aD@1#-kF;N$MU!a28^2y=ja?j;#3dSKtZPUHll!CCWne`;9t+~F>CqaJ$ z`T)dO@_j=B@|G+~NCZ)a*!gzzXXJ8wpCxv%f2JJyekW&Qw~#&6u_Itta`uaPtaQ2# z<|^UqB=BE4RdA+~K(u*hKZsR@F1#f6WZhV(v5f@@hC$}rTSk+>*JBex6Q>T$(ds1S z>4D25#A_{)cG;Xye9Z8Ziiiy3OWxJCRSI$w=Y_bmi{b*u)MwkTM_s(_Py0z)c&tB| zW>gtW zSGRJ$Li<%i*jFp_)tg{oqR1{Nf$#`8yK&giak#Z%)L1?()%1~|^^0|WR$6g`rR0Va z|7r{$5#xfU8z4G|US^i>ug=X-)9)TBJ@VLp)v?GhGPsdjG1kcCi(UWYewzyTX>&%7 zkQeQ?hjFJ9yN^kT#?CN2G*vbZ-kipV6pY@P46fqeGU32*mcb3+oPUL0+IrUB`Q@Er z|HCiuRwqBKQE&Gv_VwMV%`8<|bKH_~lE0IfE}O6Dbvt(vienN}O}t_qnJc|iyjc|+JGiWpzVOtrir;?(HJI}kr!Ma32v)2(sK(>Ti6i@Gp zakc0{wdeKv%L7L%+FMTgJFa4b;_bx|BfGO8VD7r~Tin7jX_^%6TWm@N<{?}N*vUSk zbsa+x&J?=L>ied`ZLa6XqSd#U31mJuQ0ekz^FJs2 z90TNp|6<#hkBgZjc-svR06xMLWnW#WX|vK!;1$Rsg0QSp1h3E4ggo*}BBeB|$3BG^MR(w8cJPW8`hOn?P zkK$f_$>8sKAePnf_1SYf)K6C)KkB-T-P%&9xXkdXrIj%K$qt;t~tO@mKDl80QI-9v}6MCJ_N|^ z=dJA=Pt*k-=JgiTWyKQKvf)H+(HbsVmJUt4WAR(7_Bb}1IO%nIfCyCd_gM}0QPqNcq)}D{(4!#p zMlH~TQc^))>1bIe&a4&KN##88b@S`?UG3WPxFr+**&7Hq)yardLc=@@84AO8iIkfX zCeCHIr;*0ZBxI9xjvsbWWy^h<#<9Ol#kA5*!$t-$8)tPx)GSV74#bJGWP)3duLU<# z{epsb9tXGCZjvDN{O=4b$Aa;frPzNi_F%*U4>E57Hvj%v;D@q71uyu&tizZpy?XYP zHI8cg>#<$KlaD^757XyT*-|5Gky6GTs^NvW&nR01ccCA#t%M+D*%p1ymX($Q?&2XJ z5GXo)$lY_DcNDuKCU!Z`b*J#by~ee?$Qv#j=;kIBh*Whmm@y4VQjS!|>6PI)8nD<8 zY|o?xUGO!E99!OA?e7-&Io-maiJ!g}3b1%O<7eMK8kP3Mm&UwR!rj-)FIrkk&0qAA z;%JDnY#Oz+eB-bfn5TLg2{`4Af;?75@DbYU=ajNN!5pG)8H^TXDaDlC?8N!`N)}Wyv6c&_$8TQJX1# zxi%0m#;Q>P650{g3P#Xif0wlORzmvp?pOIbC-^KMp#d1UnYh|C@a1w;?TpB+dE`bG z;Pc~F*?PEy@|l@paG&65XhJw`3AES5Y^1=vR`WhCf-}}`rEylI1RqW2=qOg3t6Wihh!D zm3M^^hM@^lqS~2{7|EkvVjK#rS)HsN>LB_jPmVoou@NWV%9RKO(losZ)~m^LQ+{y$ z$`1BK|0||bG;qV~QsUl#(%%66iz2d|H%jpez698v2;pyLwv26Rv@EM}- z8q+eel-2?&yR!`OIgp9xD?5U_Ktc81qIImaXTq+>#wR8*pHv`L9u-b}gJ*imZg5#t zn(8C+`8T$wj^}+Kw?65JgD4M{n-??Z>&C0G{-)p>)HIn#z2`lB+vnaBK$zcwi_oYQ%{f6-$;{d>wiRpWF}DrA&EB$yxX8Wd$FguPks;)@?24Zd$@x z+@vNWe^Y5d_GDUsSZD0)!+4@f+OQd(sBm_eDQ!+Hd1ZgUb;ymR8~wAd@`8@8dnuPK zH1Z>@f;1FlAxz^wt#h@Kkl$w9Jhtj{JKueLVj9OQ&=-L8*M`hN-4qsyX3F1K48O7P z)Ls`JkyXha-V&QrMUorNdpHn9^E1RJ?^9nb_{*OkyUsF|SY)|4>+YOg_v__}Cwo5| zK^kQ_rd(5u%$Rt?lukxhWJw!@P4UG(M~m2Fzg8p07G~XsXT_#R8WKBKhOLj_)LXjh z)gxLe)VdZNF`awyt`%ErD*govNu=Em1Wy7_mi;$LB1>ERO#$Z_H_4t#-$|Y5z{B4D zHR0pFmG1me-JhbFz&2#Au{sn2RG8@}-b-E<-gev=V?9!#)LaGnBeXrYRf8~`+gh(q z*jl$IHaG``GI-V25N4xV>58@z&3dYPS)cAO3|v@)O3?4jzn;H5Vct|hLz@wi+;G1hjsmnxxGf8tb3D=a2g4s;aEQz4$q2SxxVE|#k68Ih0^gec!tB^5r1xC9hrVe9tpX%Tx}LtTu89}_L7Vl?hyervK$S8W>*@TGSGdWr<@mnDV0PEUMX3{ zk^%f~P$v&xElO}yQks6JFB7v8Fx8)fBh9Y?{0@V@0F^_b)~h^)&f^E|GZ1}jz8^1 z1oLg13nE#tH&UMR*4=)U%+XxG{(5FOa`Bq5yE$}Z{df(@s!rEyoRB~&C|KS% zcaU}~KwrR>z0I>UEV`y98khHVmArc?#kjSB__KSS8w&Dpg); zo;?mrE8@_ZruP}1d?ns+HH!7sNZ6hdlhtaJRS2Qn)mlAqORYGc98b{&Y=!W@z@5QK zM}B>T(PV2|2up3>ETZ$BVj~**n{lY)aeIG2yzMY$axVa@>pkJ#bzlRLf#y zYpmS}(IX4J{bFc-K9X>6J<1HkQJp__QS|H}HT^-+fjNkpnkKNCjZf=5S{i+_Q?}Ve zJ>;z8w*~z8a?=F<#JbF)n5zQ0jY%Tl-YoT<*{dCDfo|3LunoPEMZ-3rQS6t1KF$+& z-i);(cx>q}#ij>uD>k4~&{BkbMnA^x0}PHwyLcNIH@l0mL^a}jz@(8Zx&I)rKfnlm zvwCf&FgJ1f+pp~Mv&VoG{R+rwIdQ-#+$Cx4u0FPLWYgO={!b`(5|84+mfe`S=KVa> z6c&`m-3NK}Omxn4>cLC9N2XsijO2avl4{;)$6i*K_^Xe`>f@buy*i3e;ePwz!2>lcT{q zh}>aAZYe0^2W8LMwG%wmH%&?*1SX0f&e#QpF7*PTGR^Owp4~aWR#oPI7jmTB$8rfh z$+LZQ@Tv71*4`u$>$N|?Ba@&A>OZj!a zsU&d3dQ#cqOT3F^Hh&P`1kbPftWL+xE0nPLbRc;c_otHF`=kMv9|BAd7-bBjVjlek zeh{$YYEc=Wv$Zlx-;<^m?GPPtA7obOK_1-^!CNN9ghJ9wC)9UFF2_WjwecP46)VN_ z-^_N+=sFid0!Vo~!WJ!uqq$N@ho~{FZD-k^0p_zTdztofgLDlZLSwz-=l~XPKwrM; zk;MwPsSk66O3O+b_9XbQ3~pY)cWSh~mZ}8gMkD4Qz0lc)g>eL>cx!$F27edP34%^^ zSrresZ8bHNX2SliKS1ZY$s#8GEmyZTAM>wCJmjEGojSmCc}E>s7Ie1T{(UTj)sLJ@ zKK?3UV%9@`1Rv}np|*}RT$tnvJMGLcMxpdim}2VV2>nYkjrMw_hXddM9AvxuLIv(E=L=~ z{nv-IWfI|GGK;x)Tc}EWt6}~dQ_))s-2!hDqceu8eE@&79J0FyD>hcU=^6)Z-Nv8>6V_*1FN$(r(fG zrX>zdk0*4ItJE%jl zeCZS}whvw{ap)_#{;7tSUUDoNLE0J_!l`)@2Pz)KOTL{hqTb6-36r`*_KA~SU7`+y zJr+=0TRK?_sa_vchj9M-<6~nbHc0ljHSep9!l0XQZwZfb7LTTtrtuQMWszgtV=tO5L0CC0SB; z0hYNF4Tn63-k=M&SEurdHE-UtPW1Qy5*TK1w?u(#%Y51Sd2b0;+5m6uv+^_l)1fU8 zjw;~jPQh2`qZVRyO|uPt4MzhtjXNBhl$bu`x5^=7efyn&_!n#agkr%Ch8-xOJAcPS z={t@^9!VYxP{Ji7UO1}T_i@#Vkk?8F6PPfg7YWi8Io4rw1N?`SjY5EcDZHzey|$q{ zyQt=p;b4-*KgLiKy90{cu{ia>@$j)1 z18r{l7U^UkJ9`^BZpSE<{|0s|CQ4^~EvtD}JNq`$Bd)XTU}E=$irB>N{S?pKm!;YkZ9!mBpnw;9J!uHYaqMtLuvR7 zRnKX?qYmE-7?X|XC>^_*3%OCHxM<_-=HrZ$i_;r+BW%0&(F-LmKCDk=SQS5;8pTMwR!B2S_8^6H52jis2V zt9Jg`nd&6cObPQzvufx$pZ62=6z#68*LdxBM<3>I636}?5!QqVtrIB8sfWD0yda}E zLtu$|oKVcK+lOrMBE)atT*x7`1NqYAR&WtoYFufcN^Qlth-I=juJx5euwp)=-^ z-8ioE5JuYL&v>~sz1!}N(}uJEs<P{*f8Hn=gy`Wj<8rzU@?}gf{ z_R>a}wELwn?NV4RP33JwVir>vy!S$)os^8OFDZL*Lw9tsX;!${ROZBoKB9ge7S+ac zY;zovba>4MW8b2%*U8^OCE!n(xE)%fec4>$uANKlWi6<+(TGW?n_QmM=z$dzZj7ER zQKDZcXSt{Uoq8C7wY~iN9UYyF5=SC0d$4Jf$M1JH*i|$t)xSx_y@ZzUvn?%ew1)F} z%95QVBorYt zm`Zj-_I+M$$exNATh^>2#=cBtC;KwYShBA}wy_TX=cSzQ`Cb3#DlPNQ^FHgne(w9m zfOp&o$iIBED6_-``QqlG`S(J9t(<-C78sm``snv-w`7ZhktalbOltY+v!9&4Wo!;# z$JUqdWyw$qEKg!n47@$BA(3gMJHOWOMWoc>k20^LsIz2f@s`&gFLajA4S7H1r=K4g z>pCaz1|q;JUBny)2zuUZfBll`vKwpoLoN<=s#g zU-cs$GmLq4-X)bYG0b>XYkU|9(~R1eF2JzDZ6&<|Rg&JGi~Ix;rKiKJ71t$xd| z534%&=MhMw`sqoY_NGPc`kf?{Xg0Xt=CeR?C7S7Ewq>fVit)0Ovo95T7{3EV;+q>i znx1b>*s6(qbid`{JtBYYomxLSZ$V^v?ru@1aeO!piEd(K?y-1WDP0_paUTp7v|~pG zwUk}-TlD~BfDTSI@;uVHHDw-a4EFTTdJRQ=l%;*p zHciIv&w*XkLuskfuB;PN_>nXxvE4F2K92x1_lXkc0@uGtmyR8`7mV~}~SbG+T(V(f;IMj~j*W#-; z_uOyO4FC8X{GaFIcCbV9?O{lqGC2xFf@{y+fen{(Ej}}ksju_s{J9z;#)TGIf{6i4 z!z`-W_>*+{*xk&w&eNo{Ba;e|c3x3_t@)Wj8JSW?kDdRyeWzuy!$7vWmJr$1`#mB% z!Hd$K@-|5|oUH{8AAWKiK3ATOU#|FnIcVJLhh-X0%jicyqFJx3G}9Io%=mC~btcD# zr%Zpd@MMq7Dy_8}@@@`XGK!pCVN+SW0@aM2{ftG~G1t~6q07noj;zmi$iKz~QFSkw z%_h=jYJ)PpMNT&?@sDb6%VB%r7t_^TIXp6Q9p2>S!IA`=^~D+;gP{W?$biV?;ZU|F z^4#4g5hl)}v}ZEOy{A62TmS4VbGi4;?b%&a4YjnTpJh#)l85i#$xxZy`2NAsrgYvW zSwYbEw)6=8@Jl>fqcgN5T1YZ*4#uTdX%fU^1e*KRgOBk3Si;V)se(h>CLYvl{MVnD z%&cHkZyg3|(V_V5|7%o;o$k9G>3w-#8R!p`jHqkKAV-KWg?u z#;(5uVp>qh=-$;-sm*3ORI|C;J)OaGHQtxzv7z8xY8Ap;cI8A@U_MuR*i<_C8!_w7 zNEbSrSwqesGm=`A;er;aeUwvcd>YCoPxc>{7eNl$)D-?4S}S8f(uBWO%h6aGD_O2h zo*p2+3h4bQ^T$niSf+a|9hpO=tVDA{clZJ|*O#+TVz!K@O(;j->yjT63XGL>7Qo7a zr|!yS%1a@S4j)3j5|AuldJrXWn^jC2e=C%`!x=EewZutFowvG>i2TwcDdZ1Y(bE`J zFp9#W;F!s89@N;OFNG@~zy0KVlq3JDf&H4~6=v?Arl;u*|A9Sj?Y*MU77o5VJw>`1 z%LoQ0>&I++JN0#UH7vfJ2LHhsfKWI(8=`^>?w@UPgf*A(*yk_YOWS)mW7J24%X~Od zE&)8veeIC1$6u?S?brBg7m@SxImUjc<>aK?Je~?%|3o}`Q0UtY_W|?(7vanG0d(Gl zDux3`yrT181u(5)dO!0|i~O~Z5$(lDyI#USx%z;}ch?$k0cr~W>0$VK+3Ce+wd(cw za%U6i&kvE??n}cVyQS(yPu(GM-a1161O4CJ%nLznQ4HR z{}fE2I`qiV{e7_j6+3F>g zzEuBXJ|yNGSyP-mvWza73t@hnCGGj7eec}kYrU@_h)WsdLDEdRLvIH3=5$bUC4>dO z=Sqp%+bTL8DZ7X>Mssgrqw(I=J2}!d#0qc@U$_g)J(A8BH4^x1kL;ED5cg2-+K{k2 z=fL+g7LTGLF>>tw|1>nru(A<^&LZU@@>z+StTG?VxQLYu_gU_(DI7Abnr2FF{Im=m z&*#zZ560YE^V(zsPc~iItH<=iEOO7Wd4#kQ$cf@}CFtdF`kFlF_~=Jw9iJ z)EufRnvItVJnMCvQ;F4vjQy0zJC|vln#peWw9VwlZfAL%{{KNzt&kF9*kfn&c z0uVLz=Ae96v&;3_!_;uDuO(ht22X$C4A|=l+U&&#To+VpVi4z9n$Qpx`M{M5UmujWU z1abg`G+;EXP~~+VN#>GevF~Z$gPRTHy96-(u|J`QG~Z`d96MxOwpz<#q=I4?G4o5- z)=Aqx7{D%Z;k=Ki(Ih^7TZ*HzXJaT<1;6$dPS9_JCu!v?fS^)=$7y|8Xw131HT3oV z3T*;CP4~xkT8?H?J0i0Hq|5}ADOSpqU9LnhehF0M`#UgM6`T1MQj?VSI|)9clQr+M z^qRM2tE*R@4MI7P*F>!PS^4lfxh<}wo&BlMtkYH9Pq_u@v`K&8?Yvprd@G{&p9Xd?n*~z&}^}j5Hi{@YypAB!o zBY>i#ZorSk2BeZZiJ5HP`rIy`*IoZ3<0C7BycsX?Nq%5Dv1s9(^ZYrqnI#*0^2F&y z@4W{ynr$9O`H369`|;S2PEh;lXF>l5qPI-1e->>2v}QL~eHet5{^k9dCF|d+Q&F=+*0$S94`BQr*;lrF3vf z>7h?SypZrMO&x`_;)ycBWVO|TTkrS~2zgD12e&uBVsG;D7hecx?Y)um;bLFjymt9m z;Ti^T4n=WN;yrJR$AP9C)uv15#f?>}ET)OqeU0`mO$ZC@l< zkZUl$_QayI2u0_aB=j;cpc$g0({0Y_N(?JQzP*d8*Wur>t)!BnOz)E0m-I|rQ-A9Q8O91FE%AyLSacr4rF{mPNbDR7W^=+jIB}TW zasmF{P7_iYd(IXxHF*2eY+V4Wa8`kJ1f0p0t~I&ie8cVAzDujg97efbR=q{W4w&Cx z0wkatdic3Sh255=>;tWA74mqa#x8VGUJJgcDMa&aQ_ZiZo6Dw2ga=mFc&rEoFa3V68d?j6d% z^Bq~&g86r2ODZ;}DxrGe9@hn;(Sf~lYz*Fc-L6w7PHua%VXw;XSI{X1>4n*r824DY zcp*`Zx*7Z((T7iL3%6&suk)`5CkAY5f3n&XkFcC^aZi$t{Cswg!uGrrx7p6`mv>EH zz2w$obva%;WD)9oXEc!szftMXHt+k@Rcloio6UNGe-Xc#3GQNBq?XadW!Mym%w^2Qk-Ce`>?^wf)a|#Ek2Mie1 zL;51K@2>}pM`eb9Qw#DvS%k@zD4y}Sbl%6QawKfqfAs5h*Ypm2w}zLsQf=Kd_5Xi8K?4^9$<<~nPr_v4N~@-b z)dbvaMP2Y77#p>tK*BE#7P)10?*`2l`{3j(g|}Wq7xq2|pZY(e(h0dsNXko&Dzblj z3WrlNQil7f`)@y9X-0CA%C3G|+ZGv+W9fh2BJH9O!c0JB4w%jNNVJ94kEuU|1qx1; zUsMPD9UMW{^7jJe))ka6lXejoEBRN*<6}4#qn$yEW$!58+fRBret*wXZe3%G_*`7s z6`>u{7oB~_jeaTxl)))on?J-g<_r1yBJ?hRr<;%cXEN%UDk3qAPEMo;$hO<9M7vH? z%|v9>A-mkE%;JPhY48Qkyw&t=jh-8$NZeS>&&cq$-_YBOv>W)~(e4Jg4TFO80+?1IA+qbb(CB<;fyuGvwN<4sc3L+Ex z>@1k~Mrqswm=(I<|8B+mM@@df^xdHp5_p;kaziNF9wvQO*v>ba@*k>-=w<`xg;0Wa z2!2dNs-uvT#|o~~j}@?qx=_ud`9Y9b5x24!1D1igO zL40NIHqnI5^}m}eqB|1qd*na~w9-|Pm+ZjMozngP9fR$`A*$eu=g!FGOPxMti8i>; z%j{fY`ux1G=}YOrf5$KiUGybaUoGLPR`mBHT#O!gS||AMPR`Ue0r^iYC46?VFR+## z)(o9E!p3nu8)wTthibIXl7hV&I`zGYM~Km$wbFlTvx}pSpRM!V!is$ z41Iz@ZmyMBl$ryjRat)Dk=8&%#T1>UGu@YW5d!!}c_n}8R4m+A-WyOYK|h%)9W|e8 zYv<6$q`YQNb)_xb)f78mX#}4PC_%pX@F4$+VcwBo%iWWaSG0d6p2)7%4U*2<#+K?v|GbXPxd`xnf#oaAs zq!vd?J`m9lb1E zc8EHKXD(U+V89vg7~|L-qy+d{bKhy;mfXC~E2)f8H@ZoFWVl}M1EusuWT%TI!pDVI z?l%4SLl_-6Lu=Z4(urd+yLOn8-Nrydhp`Jim6bU;JXSw6XFihJvF1QJ?6K5)1Y}r# z4>ipahnh-00q7Y#F_Ts8?HPd|o_Q5DAidzVCt~RzXx}4zee&Q{tPi$|z(4f(Zb882 zYfsf#w3lAT?YMgzfWv%T7Dh6!Z>~FYz9c5=sO!7buChp)%HHe;E>hEKn|Ozweg@*6 zBQlu)-WPnnbgmKFH`!8}#?WOl>)#0zj_pRed`>{%^U1kXQ3bTjW6P}qImxz=zNow# zCX_<09CO%FgNW0&Qa!|}fzCiKORjtZwT{lGSkD?1EsR>kd;NS4hw_jhy=|mgGZh3V znsrR(nq~YB1g67tc=3JajMmbJPUX@B$jcgU_%>P2S*z<_sP`?Mg!yJL1As0t3}%2R zuQhsBZe@@vc&lXN#`||Cc2Gin!_h{sN*v-`$jndJ!Idxc6oaxcAsj3e;K5fnm8W{j|TdgMf-jsCrsx z>ri(*#;O&K*?7C4GJ1jb3l8Q@e?Gyv2Vw&}=)pR4C!aPSd^=L(X z@JT-HNg}VNuvx46n#brJkPiMy@p*gBx0vWSkYC};9M`@XV!91LKkNh7N9^ea1dd%^ z0emU9TeINl&}&v4Ie8Pr=Db8=Mr3Xq4m291C7$|+an#}{Rm)Ubal;PzE zA(z`fXy`naxM)bKNZ5j{xHoA|Vm5YJdhJfg;*dIFJY7>=Njc!xpy*;fuK5GvIa7C< z$O^6&)H~Pm{e$6sw~aN+(TnWSKMuNrCuJ{Yoi#YIz;vmZJIvst;E-cyN^(?6@ob^` zHIoLll{FF~f77A7f#gJZvG~nTK;h-j^R?NRpoT~>6{0>Azgg0>86oa~xM=++i7uuI zc#^eEN&ew505@V|N~j@v-CM+p6xr$m01Dr`?f$Gj=WR`ln*)(eB0o3R0yG_DpUZKX&5MRPhEQR6Sd3mM$V{$dGC7j7XD#N$d@@)q8?*5w}l;m z3QbMDmN5rNaUtu?Zx=XB-~b}W_Wd-oZ_WW{3QGY->Bu|P?gF!%IzAT2lwBwml~Wy( z@O96=muv!hCD45-H+$=r54%fE%jq7RJ!<5d_BeW0??YOzw|!^+!a1gI`>9hQ0f_96 z8heUQUC@Fx`ewbq<|aEjJ11wyHe<@x*09Dw1CGTGBxV!tliv=NQ6ufP)HzC)^8gmI zXPTwi_Ba%ojw_>aB{a+~=bL^{O*JpwsDdQc#@hr&=3IxU{UwQaP?+`7vJI*m{Wwu4 zImSM{DuB5=y-){tK>u@Q;>SV&$Ei2YsTFD{n$!Kaw&VFP#ycFkf@0VF^Nh_4AeJ_^ z8x=YChf+?!#Nxbfh8f7%F{Tiv*BN&-`h2fPlgHXf7z*p*0cmNy&n%cX*A4B66K{40 z6%yNC1WAUs3PLf$I%6oRdg;Pfo&&Fbe&g3KyRo&l+*`CYP^~rP$m2l^&CU)U8jOoe zsNN4?H23d6IC{OW#6`ugYFBJ!fAJ`Ya5nnA>{09FXHieI!zwAu)b^2iY{?98NqBze z^x=UfCQPE+syQH1oS<=2bbNJ;^F`wrP~O+!bx!F7j-b{8eC^$Fh-S${r}$fPMSDL+ zkVx+WRwu&x$0M*-M6UpB#IzEM(UBGZ2I+ zYfG&5#NK5Q7im!*MYm}|ISGGOR=Y^InNpc7Et7(wAPMcUNROny=~@0!1~s6Fz#^Xp zE*{Fr=na&y(5~5J+V8O$vJxQc=OHzxD78pP)?m4~KD>ZiYK9Ee74hW5@*sFp8;ZDM za4wJIRQ8Rierxm9I<1JSXfJ8nJZlD`RAiX+$}em@Mzk-9Y`tOfjgOpY^h%*zX?A7z z?tXL@3X;l9O-=nY1}doE z)Q8+#_D;4Ys(cqb#gFJ2zUb)G?@}Bnz4j?MFC^q~lI zFx64&mVe&rK!jo2D8K7QIFs;PbuBNu)1-g@($Ar$oA@K_l6RS+oWOdFb1aDi+V+gL zZvJqqOne%*Z~U!5S*vCf;n=aGdU@`Nn~(?bMbXF_pJ8S!k+XW@uo%@DaYp3unR7hV z%<(+G=O)XJRQos_&|95-%#FP~^?|@vQDwFh$BCT&FgtBP1dve&5oLz3s&Z7tyDy@1 zXl}fN*yrOq(~a-GY~w{Lv4rR1{TdLi^`@4}DxtL56h*ee*5UWa-IRj;4lx+x;;_MxwGcsr?G z=~q3KzX*NxKY1VsRz-z$ycq^nBNjE=Gaji+ES+F?``&UOXkkE+LlI3F4mmVr;8yb$ z>iF_(&sh>MT!#MKQ1Um6h!Atj+*}yf6d##oniwJW-%~}Sm0}vBZfj{oc7@_pT|n@} zeQg8ARu~9XwDFBlKXC`MRKWG(@5v;K%wRr9bWtF;&v{v%ACY}&W~sOMRc3mD70oNb zVt<~CO1Qf;>PG>RxbjHr_g2s$tu}}cFP&=)aglScH?Enl>aU{$MXL57QWj>^O1TW| z73(&w>WpXwg;zz>t$xSP7=C^J3Q;6<^{}v2&jYluy=l)BS_I3`1rdB8>Z?Oc+}XT!53ZBSO@=aLVlG)THF=q>cRkb9~O>eF2A#l*W($NS<6 z4P2#ci@UC=Noy-8%!MI>Okzrxo3k?H%cBSlkr`09-DqV=qjAnFJyAZjEob8ftCBKK z8Bhdg+2TJZr|=l^@Ynf{^ODBfDgs$^aP}%p+wnKSvEkQ0wMxIdqVJ?^?r&YTDq_AK z?RH1W*&jnY`{E8(1bsV|L8vMA58Bc!Yi8#wNJbu@u{RDqeo*!pN=$0_z}(tNKygq$ zBW;6Hl1_VlJRT%=HjW0W6~1<(s7d%Ul*m|6B>^5-s8=j71{2QW3{8(SW|JirlVRuI zb_?c28o)Y?y2Cfah$*J}^amXI{rj$I*HD&tBrk(Ug3}qIV!J^>$eZM5F8O0+WdMi# z7TSck<4P@vmr2IhjN@mL@%Zy`{G`qlr6@RlRx4~X=1jrD1rQWSe&@fss`Do8+@`~p z2LO58t_n-IcP>u{$kjJUm~e4@Y<`7-n#Z>l{ozmjEX1+pDL?Bn>&^{AQ$(5(AB&Df z4+yx65Z;xr$DOD5CLUP2<^jFlH+Q}^|H@{nvyrfYhnR_~#t^Lh)s8pIl|)34eDW^q zi}SeChHGW&DUOQx+3bZz?%enq+#5#ajFH?Y*4dJiz z=w}NxG8;^2=9r&$EWR*Zq3*6^PKpF_g=>r#<=V0s*YouBHg?EHM!As*UP{^dir)v}wL?FDR=d)P;Ugv9ngy zjc6|b&&XbdMbq5Zr+h8yi2XM+JufI9zi>YP_5&@W;UmWj3;D?xP6k|-+Ok|4?^6Yr z(+q343V~n=!XrZ^G8{coA1Oh(f)FU9YAcZiG?S+Q95c|RcTSNb^R!mTqc$sG z5~l1c5%hGX2g^GPA+yu3A;t#Y4d0HpX$pEkOLD9I~j&m9SKkC`%&h=rq=H`#`g9Z{# zGm`uUCFkQxQ3T9nKMtkg@I73LCoV%VXj+o9S#n`iz#lRtn=7@+aOS-PX&Zv&_AHXq ztEyEUR0Fg#5g8bd^@-~k8G_Ds8;i zdck3~kN-CP8zh_J(9`So-LD{GUU^>UH33l1GlE4~L)Yb1(v~#eq_7B9bstAokeb-0 zbzN<(8D_wS4G1WBP%Metp+VOqD!$NeY;RzcnzyUdY~*BXFek2wDcjvTzp>I55*J_G z4pifY&n4olK=MRCmMgae1JyXQ*@pV>Uz}?2q6>lDQ zv;)hl+*(m-M1sD@CRAG=+>KM3=={i`DnY@=N4rmk2j_9CgigL={PcF!{$&@&LDOFav0wLv?{YP zZdkfTVr8Vz)~Fpm10WokAv>+)tgXx9VB9x2!t24&#K5|Lqzw5kUTp7Yka++}Y&`7f zEXsAHxq?65W8cODy-+b~SND!B^#98sTBx_yT9y36$A%{C)-fx%-tJ0UTUmZD?ppn< zAsT*mKk?%WXJ~bGReZ7e#Zny~?iJom(ty_gifO7gIlA+V+nu{+W+|W!XyOs+4W%?4 zMN}inDt~G^M@`*%MzqfzsiRM8`ZN|OHfjx!_4Txchp0!-^0RQo}Y^E)Q)pSt?` z#}iEk^)mHq|U9=A{N`8NKw0vuZ@yt?!7!4&ks`A425Q!tvgzSO3`WY8QZxVAKv z4C&eEewSYEaUQk-kE+-Kjjzh7@UVwnenN36BJFN7LF zW^G9gT-KpRdmA|fGoc%~B~lJ9H)!Bt&ztruoYCi_oMyyGV*-#>XD&B4x9j|zBCu%z z#V1a|Ps`vQV@?y0^qRr7>PiQd_gb_GD$A4h_jCsQvTwt7w(TZs@wiJL#3YqXo@)3E z449KzAx!!GZot1Y6$F*Of(_WgATwYpd30f5OZt;M!={A>acPRIgCnekc+r!SDuoaC zVooXLl>(9*`o`OM;$ zmV^SD$o(SWxu9JB2-xOqDm$5GU}cqgX03?^6>XIjci>Rd*5CCnhc!wL33<%Vt@9oj zpa?#4DxIJAyLdUUH1!N3*_0!H-nR~12S%d}kUkUN2>=Md*pp4E(Q~k4y&-=UisZOFt}_Is9EX;Ewzrf#OF3i zL)vD_%6?-PLDBG$F#Yu7>er*+|0G=jLDV4RXq5)T-LqK4C zGhc{_zA6=m?iqi>8?!rS&JN2}?l}qOkP)0}t^2uk$JXGPx%_h4&;0iws6gW?59m=G z4lMV*)8&vHY}h8WRGtu{Dei3+u{N`=%!T%PWD1hwB-roXL{Iyy5$>ZEZ=blPYFq`i zGQ=N4dK+4E05a+!V&QOm6!z3t1D~4Go6;>It~g4$I^j-t>qN*RaEc&`G4e`eko+XY zEkBbN`&%@jg)$XK~M3JyFN+b7d^mzw<+X;2@q7T`6K8_wy#_O;E zZ?qvC!qzOPc!s5g+P;AM1mbz;x=`-d?!iaZj1`E|AXuxY(r|Z#Pe2UZKjj>Rn29vy zi4w)>qri#yddL6l4#5sCJWu>B%Ve8)Mf1AF{y)(cotbUG2>$8NCdM_VTEEad_YAaF z=|k02mqduLx*&G;8B9(D_6cFImx`HlVste-hYJDc)dvPGM)c=9T}9qSCx*=pwWceN z_k|bfjcvI+xPk13@84JWEK!%QskQD6gHWv52m6vyn0NqG8SnasZ?rP!(a;6jRR8j) zq6>=xgbV)tx!WdJxfA4kElv*Kr7ckz1#yq!q%HN z^lchc5jl?fN^T$q&Y>?n8DH?PH_G331bD7d=*INEkolA&9Atry80*j5-p2?4Zu1oC zGQmmVL4axL`am)lg~NmTKIzVuel@$p2S*OVTX5^{;ZVTh*0=iexW`6h#-$>#q>#OJ-Ex+HcJGhABCWS zv#>dH@&l;#STq*_@HeKiTX%Y3Q^t1le0LS(!!_PeE&fiL$A5=l_xIm(lG2(SjSoH^ zcVv$YgLr)j2l@f)A@t#r$=IoGB2bg?y$&d8TlQyuZenWgiO zf$$;9J_7Ijc6;)&!S=Ro^|WE9c7hQ!vqy2U1dwgC~c8iQMf2Rx0h z9hO(*u<@}fo{IqrlzL88R<|XPEeYdai>jy~yL{naUxDHZDKr=-Ouqz-)nx>I61~mk^smjTfQBM>67}lpSlWh{4 zM_&FKDL^hhQx&sW{}7#ep$Xlct)RF`=?cyhML`OQiHQdqpy7f)T&+pI1vKCXy|cA3 z<@2%%UP!Pfk1|UKAG?(F1?K@%S+27l$gUxydKw4+ZouZ7jz+p5vMmcm(7^5zCG->f-;VbPjjM>V6met1 zax$)YWZgQM&0A{VGfZ-9-pv2;ZE>dK9L3Il@_s6un&IV~M6w6G4%^MMv%=U81|U54 z9)=JigpcLbRN@QN_keC|m0U$slWrRA)}k5`mP<@!z+8TP4Jgm2vF8NfVDYz|EDWq< z)YhtP<|RHyf)2(YovZf{kOtQ_5KQ*4$a3ySUy6guy(7RpH zF&mygR7yeP>-dG+eSIk9Panyo51IufzSRI!Q}sWr0U3E_-*K@dI$ptQRW~KxYOrxgUy2aq4$Ng$ORhEEAVHN`mRTL&*{X|H4ZX|P=it726D2GEHoHNG6@Lp+7ibwI?GF1lLzB_~P=$Mn@-y->UhT!iOq5 zrF`Fxzt9@)?#~G)6GSGAlN?JH;p@R+!17|KG&Xa&B5%&*a9^T&6&2u zRYr(-6qT)xN_Z@F5N+KgxjXy z;1$zSO?(i5k7(0=@AuMIiFb+%Vj z_@V69Cl9M)8iUI>?Y`ev9avG0myd)D`1Lqkj3ne;+S38X0@0<&9aV1);a0IU?x zCXoc%WZLFOkXumy)vH&$;mOGSOjnSiz`n8D#0#&!W|rMZ_;FTOdwL|F+pOZ}fa_QW zQP_Sw*vF1fC$p72TY?Sw9sUf?zx|bMW*WxZ0GCSz6iouS072?vefv41i+qP@x1h}) zLQIC;7RIq|3@|(5#==E*ryfBr3d()%J#4#qSvB68=ojreFL?6AiJOsbt0Ov^_b%)# zBlsCCB2v$oAEb*6-^sqwKK@g#B)<=%19bKMW~_pb3o;8fTJeo;ZS+Kosf_%CX2nx8 zZlJnJ(aTJZ>kmDlMv3J}A8JZlk_9*byeYd@Lpr5>+dQ?1@9ItrE(^P~&vH%tmY-=c zHAbg)z-LS6I{zCiHq9cl>|#O&NYi>mhD}#p6Sy_ckBp5e;-Rhbgj2*_9!;0v_h=Xd zH@L>(d~~$6K@`83^l%20o-WzJ4a)|~6Tsr%kBLcHU0`~NN0%;XlN^ZpSFdixY~sED zW?(zoN?l{M{*;t-;p3E_pC5iK`Z#dJsmDb7&hM^PN&J7?n11drv~t_`3aY|$X|-z!|BF@xs$rtnS<-2faPkk8s3h`CO^M#bpJZY(!h4x6z$V&(sfC4wv!v9t)hW)M_ky2z1AwZ&^ZVS{AH{(R zS#b@sqSp{F%n*!dtSH*51^N(rQtaR3)QsqYak>wZc=o)9`$=g5Rv;1NaDxCJ9~dn% z&+@hDf^+Es6bE`qBCNh6BxLt(p7`vMQ$PqqY~x6q9qoZZ{L!Of(G|b2OSPu-ey8{Y zP3voGl~>k4kx>Oa05au&y6}tsgHAZ3jvW}(z3n~+FB2yjEECS8=?o*9uqiGaFTAl) zFTjY_FR}+f8c=dr0lzfelCy(>+!?^clllNc)=RUM-P0=WBMM*3JauW>{UkHvCl~;# z36j|qiu3sK<=KHCL60?SMsy2gwTsE31CyUW)-_Oj#b{OcB+OpX^1!zTTtFA%&>aA_ z_TxnmIF3l`()cA-k(>CS(`6nvh{(`H>oS^1oX2p@0DmU^&S=0-B_^bS@;0b2f)6Ij z8u7qMLhW~n`H2Au@e!{+reXM0mDs%ffZ~!@jpZ|Zz2j4lu zgWC^P5AUQgK@QY7{?YCD6Lq9DK1e#V+in!lvZ)Lw2yZ&@xYw;IibdRB$!~0pvK(GC z+*&UTZ9e}r1{^2}ZR!%jGuLq?YlwC<8r*w_X+gz&JPfDUX`C7UFfWl0ZSd`GO6LzU zwG+3q|M6^HaVPAc9k4maVtuEcIcs*um3y##dn~!>!$*&086{|){00&qTGY&4(nfMi zRRb*9;>ug~iC(Avpu%3t5>Y=sBxLYH6Hc%2wo|`dOrQG{<&r!f!d7z50zR_Vrk z8VRx@qjT41hJ?-AmFU^8-js5q-o1D44TyzsmyQ8gmR#coL<1^Iwk^4-S+pNR96sp$ zHBfT!DZ92ycx!Wv8}dZRkidFz#6 z2Z^i-V?~9T$(^9fAz=-6ysjuD9v`VzQxrTP7FS?~gS`In+0ZPL|j;wX`)! z(m=!Nj$<8!*X>}Ej3Iz6*x=lr-;o3WN3_gMzHwFA# zW|R1dh^=aOpwJ_Lyfx|2TjbaQT#rJw01=s8-w2>XnYM*`4VgnBegc-%+LX z(g{d{_MUR=Y>)jy#!kB5o!2SxmFt3Vk>ANgnr*?OPSpOUx79CLZ9j{rSy6^CpAL~e3K$Dm<65+s-_ z$}HZj^8eRLPxl1Nk30Vnlaw#su+7@}6^{yh?|`;S)M7lSF1JQq$9k9TN3@7FATIFx zzfv3i6m>g)g!GOaLEAt0N>Ei3u$a#m)HlU47To7+O#sE_dlF%c7~35p9pc?iNqryVx2y1JsQ4sW10np@oO&rcYHqFBS<;AA_mV3E1{$y3u zO@~7)JVj!GT9sKg$#IWd&v((jl{eX9b^au8)a*J3rd@0-k_Sg*UD`lxX6J7%eDUD@ zH(MW_DcaIy_3Fm09?WJ$cCev$c?yv7c!wJXo+hQ;f$twD7qEc_qsKOBmhZ#DrU*x5 zSZu5)q+Id2Va=t{DO@U`e*Do>V<=1qvq|(hVDw(vh@tk#2W>3N*ov>p{X1z27B0AI zQe#_TaH*hGjrM3`gaE5LUH?0zW5C6@hxaeLhB5k=h12|NVE^YjK^pyi7W`ktxzbPkwN>9Hu zxe9Zg2_6nj;Bjab{+BDF;mT^GL0h(oy2$8f=Acv0P%a;)^FXT%qRl=EU=+0v8KD1mZJYhH(Z2 z*Clgyw+&@PsjF)H0un8JU!e47J6&^9mwzO1GCG+a#bsw}0EtgWiL3=E zH?SqV>x4J%{0mNl<3$e8R4P*pq^-#2;175$tIcK%Q4e=HO2VSwWBGs?z>T~BlQ<8H z_>%>D_Axa3fk|ZQ7bhfI{hkFVfS~k`&sYY7m}7CT>&z;XJn3@b%8l*oT5~ZkDc~cD zQ06-K%A`F-Gug)uLqPq$yv=zo3y?88G+2u$aaLZO1MY7=0V!OxlxsrT6S#X>iJ$A= z!(C|s`9gE+93VAtjy{8@(BLWq&|^lwhsQ7XxuIleLg4@sau>O^!c5)qtL`MALU^5= z8|-pT%UJBWrasv|*I{oLgBQn%$+J^?~3V00#N zmUO}A*84w(3W3X)C@|42pHY;OM>oO;fS6X3K9vGbM7jHd?P0nuz4Y#_!^T{- z(dW4D=2IMmzeSJ+J<>@yaVrk6UYz9pgWM0>KfQ4soKtj|OfjjU%)N{Re#>U%PsCXf_C3LcY_lvMX@ zA6VUYe)i**^s!@gZxVoRJf2;@`H_fn6I0RR4xE+I^jpvIu$XFE4*lsWiO9FoSHkuS z<=m%7NSqOnb(I1%jEn2CG6HYS3F5LBE?zUduE#+uF;mm@8PCMxqb$i2{C%M>sK010!fpzchhmv zhGZ7ji*LJJJdu(d)8HsZNBXEPvo2}AJ{$wJgz_UbM2^HXY51)lZ+Me3CgB-4NgBXir z)Lti!UWYMC(PB2=u}KsHks4;;tcIj#j~J~3hgLIEOzkAo$;#;=s`Id8@wNMmr0nn< z<9(Y&(ORzuhrn_+9nU-Hmi6-_3HcmqGD)eVy&kP;UtpK576isLEgd4dx2r{aul$0G zWZ&sAjpZeuY7mM!Vu3NTP*MRu2hJj?DltW}w?F##adN>{#J zV-c~$9@YZ4JWg!7S>C?uqqmUD=38~?w!KXHAzyu)wZS$oJeCV_-uwfqCEIx0fbFrl zxgIOGrz75N`Q7)gV>#`En>X!@z*UPK`Um%E|H~(yPyCss5GrAp159W82?QWdg@%ZM z6;g*+$o61jM3={6p8;F6 z4D%G3+*oMRB4B8sHo(Gy1I>Y$WXW(QW}?kN8k5%pOzC$%KfVISfdERSMG`E;8;y*> zaXB|g3-j}f-`mv9zkg`y<^_V&dB}*iMh~Plbj4&xT8{pWVsM{*+T-1vJT?a00Ob)~ zs^&NZ@Ptn64#SL-ZOKk`qdyjO&26B#!mD%c`kcl<$7~w8m?psF` zJpBk3DCxzK%`}iK^?mm4Lg`n6qcopb$^eEJn+SwT=nFj&l{Pii2%+VX-9Pl@~^7A9JTVYblPvOpvNF*2r@8iO(99 z@-|fLjd(bwM@koi`nm>4lltcX=egOz4XUn#6KgWMg7Pd32WIgWpjZJ!c)$sn!)nO8G4 zS2tptqBCnia_kbhc|!Bq7PW+28-odponUGwzH7$>;OA=bn4cx&9jujf{=*Kfb?? zcUQcJqE|4nL1X&H#yQzq36BSIBHKGkJK|ULb9Fe^61=qp@SR!R_@nehrqrJ;0I$gN}2#5UlfBD$PAeAd+A`5lV#?yDxJxdNkSvtUq1ZMTI%KJS4Z6Em}Xs1kQo znq+#b$U2HksytJPhLcJ9R#wH1n4lAO(TVr8Mu>`(kEbdX9-m3~n+mi7EHOM$OZNVB zJMr;UgX%8}K&VJJt^UDLb3Ln~aq)8+xn7SZCL(fa?X{Q?7A7MnrUi8RnHw(4zMB0Y zH-{f?Z2-#G>l$ep8QoSPvb+^~>5RCvwDYhf_b`_5`_tV;w#WdN4DP5`(RYQ|(nm}B z%3G9j`udCL3UqU59tskPd`E3lqm<_#3!_I*XrR!Gk1sK4*;2vEb>xyD=$PIU5qL_6 zmU7cmd$-(Z}be7-PZ7lH=N@noy^RjO8BoQdIL$bwBTj3^2L zd8ns~%DbnQAT=|WxbY4t4n2MU7#bTdN6HiW_W{8Ajf?;C7}lgGU19zG9-o;5tzvxt zDlh#osJQYtBy%AhrLeB92+>$W%{;0Z=M8f2SS~!R_2zu*4diYky(7_yIg&OwOPNMW znF?c<%Wb0OqO&Lv3VoS(mexTI_H3WX+jS~=S`?|@J55$1uX=Ibdb=pTT~FQ6o`nGh z33<;M@02_CM2+VfIOT(jQ#H+d^YwDIG#2|GDjx}#lY+8FM%WcHUPp4r1UeXSe zr*8L+#B9mA*n(EAoNV$od;lkYc)}($^U{aeQ7YTNLZLa6g@td5=r@sFYInya(aLu? zCR@wrhhFO)N^F*Zb+87EHU2uJ*XeP_>>Ri; zId|%hBlH9COXui-@^Bz$>1(2Ozp@`8zE|__Y0>%|@Tue%hQt&}BM@3A?P%g5Z~vX03*EUqG6 z-9t{f=^0!y4S!8v8-SgjP=gJ)1g=ckcrA2loBi$qK~N{CM(m&WoTLv951*yHJCHaK zfmI(v2k%W$g~NkhqiL&HgE&Qnz01X9Tb>Ang^#+~p0gQCAKsafr>InnT-&;;9eKrAf-`i3j{wWpWjO>73t7E%-MFP<2M zn(IA0wy<1JI@_{ZO~5hEsj8}G5rL=GbuMXd*JNIG(!Y!EMihy8DyR&$(asTdA^yIE z)l>{3LKo_4^IU$vhv%Mi#6ABNqM!HX`CPHeVhb%1nWThBykB#qygK)YoIfk1&M2^? zjz0d5DT2)8zvU~>Xq#^()h^h)qGde&_#2nN@{E?WOJ8u(6QKQ;s_>);!OvXsUc;_T z;^J%tU{mC>(eM>}`o@@XlSt%oWrYuX<>MU-D;MqVgbD2n^EP*$nozwN)f(D0q-Q_F z=!rVbOBL&(?u@sSm3av=aFx~TzJCt?<6vZfl8BYhmTKk4*L?gZ8kyUQ&>eN~)~UXL zUSp|WOD23r0TW?j6C~xZUuJaXtCn|H<;WRjbtDLB*rhh{tiX%>-_Hh~l{9pV*$G6l z@3=O7Ni6N@vJ#tOdnM2Lyqa9>+pJP`+ z*E6b?me$tX0_J5y=_IFjC@b!QFeB)k9{;$D&imE;Gf94n0J-@vppYofxtgZ)-?BDK zzJ4O1dh&>WpF1T_@3<;jz-Ou7%%Uo8ss1&=r6q!Jlg{2~4My!uw{k@GyvLF8!TdVn zu*Dpep*GIgA{HW`$1rI^qvoDmt?(t9Yja*17NhgJXmo2KnMJw@ZAd+!yazYQ9DFrm z$-us9-B_Q-yG)E;awXvXkEjR)n-GnL-5S1lOYsoL?$+Tc_ zwf73#pia5S{1^Oy%DI3Gnk3Ty42x0kP)?=jMNW zu_`^=SByI21RpyE6D9&VbQeI1I%)3+XhT=pq=eH@Fi5gn5X-1$ea^HoFp?EOM7B8M z3f}Z`)Ri+#)Em4)Jk1()qwJUF&|APu&fjQ@yoasy&Yt(wKC zdPNcoJtSOUi+9fj@~yx?Z@qQvH(~DLN7OiKW+Km^Y6}BUr5O zpYl4549Y(e@+N%o@yW_TRcN?~wBSgL%See;p#>Y2A`<+a^^Sa$pa09m!3H20W8z|C zGgDJj-`S1Dm`b^`c4>8#{thDx3&DPC&gg0T-TO~3_H}^Fy(?Lcb0h$v`4LdMlSsYK z0Br%2xSq;=Z(y);#0tB-Tqkv&0j>%TSU@qh|7j)mfnuLB`Q`O9GPg+3s%Ip@XCx1k zDeE+tr+1>2i~maFBqhynvN*){Mk{K2QXM#vTek?%l5kEsd_kj?F!s7l@lr@T;2}!# zt&cq%v$tb-R(1l0u*mQGr@2LOjlScaz?cnc08@~Bc}Wa@N{KA?=Mb(f+JepE-+Q(_ zwo{k-ZB@_#wAa6F6jYy<=V$@n+PYo&FN~90M5vay@9!_b-^(k$46Abb+8!UsNb?)Y z)^b#SLQo#Ji|&Y}lbAlUWPtk-Kv~m%(g;e3N;%_s}ACAE``>vz;t&+V|GFBF+KV5JdOq4VL)B;RKjr~OaJ?7) zW2_xz+TcJzaj_B7ghTnTnbgOv!Yv`GP0Q^P-dn2JA?Wsw^s@lQw4!Wj<+>^n<2d^c zey9b7gf*BYGnjvKtCHLLPBL)pgcec9|9nb*qlt6?yvUa|nH52pL(7rsZ3t zeN+zk@sGM1t2YDK^17uQ!J%T4S*q`UVU~G}cz3Yta`a>2G13s{!dOwfJz?Cj|Y`wqH08d@7p4jwgB(K$f(Nu%HL5_R_>l({@l=3s9lp5NMRL`#BQqluwO5fV3pvgqP zWLZb|2^vsj2&Jo<5YkPh#A=6%oX)SQxl5fu<$~$zY!(w3+sJDp;Of@{#{TBGiq;dw z>(Q;eo8b>M6dtfqr_g%BYj0n$VRPbC(Y5C4Y$1Y!M<#n5v^rC$ zg|1fu@q){>G&qpJX}sNTQ)NS=#0`i3!}V_`g>%A+A5_3s!x4VCZ?c3gJ^Cn8LrQSCU{Lz9s6|!0K^%kEtR~&dOY&o!njO|E^fM++$r13cc^fq@}Ns60MQh zu2&4Ng*4xOSzT2=Im0s=@P+j8>MHTeJ{r^mw6O?N+WnAj=BrG>?2}Wv^8i?*yYiF% zFRGAnXE+OqHmEepE&;fi;x7M9y-E=Ya?>xbL`1I-?`_*LJTd+Ui88rQPxjI zS3Q=iH0`JD9HK(?g1$pnS7pQh)_&}#B**j*H(u-wtq8%2Pb5@?M`MtI^UV?Lm~1lx zk!p_Q?5#E@n5#%q@)dPt4=dx;;cFMBtJQd%QOJo`qwO&HZf+_WF;)w^GS=!)e!FO} z%C@=X6;b&!jfrmD>DM~pmW%N%fMOa};}dyI)*NAxtxvd-a8&ff3crl?ADdh`AVW#- zbYQdQbVOP!CaRa;aTwURKuWEH~n~&-voQ;q8M+Xp5FsdVJox}2 zO1}WVUHyr33qLmg;56S3ZjbH;bWa3)@QQFlUvPvHdj$VHN54)L^PAQJ6`Ic5LA9y@ zxDhAa9;!FG=}~eHXtUzqRsqgiEU906Rd?LrS3v*R*y3E=3P8A8DbS*SD|n68PES9 zAUss{U&5Z%4Bx9l^j5w^5Zi9~Y)%gvauG!QY~vUYwpYiVQ32pp z|I7aY@<;mXeEx|JUmrTD9_h;BZ|F#n(p{lqmI8zCAO^s$f`9gQC#DVfN)RZL-d2Gp z_qI|r{>}FK256G6NU+XY=cN26r!toZyWPI3Gp_jdn3>V0&YO7oN9zw@HZ$$Xa4X*$ zKH@fwPYq=Nh*tY73by#%Gd0@jr-_Xwi(G!HtQ~_1m(Mmr2W^bbC9D&z3JVKok%s_DRAk5?%aKP>JL_uNut%DlvUUMNr(Z`gr6q}$*11k^J8@<^t% zRh{$1Va1k)962SzfbIV^Cb#!`IqVMCoNO7k@DMH=zyIWM?x)qU4-)aKADc&Csl49I z-nf1FJQLINJe$nu8O~^&0Cs7mA{S0;lMQE>YF_DVgxtknbHoTAIp?fNz@d1TNB;3w z`asZqiA4Y2@%F?EwI~;7=NOhy;I|X|Tnc}k7XrKGt15plpSV`7T%8ZdZiVzG)wi@Y zJXQ`h9``RE+@<41Gzp2qWFIS~Cgyg%amgX8uJzUOo;RkSn$E)%ph^>CIjb@HR+^>+-CYyDy! z>y(+Yb4~RKx=99|%YS!dRyO(Bo_&koU$Bo?+w2_t9Ajubbw$mZ2vz;uv%jp}eu%fg zvv%F(CZsd|`@A~GXOt-Zt*7Uq+_#tD_`8El;!as6o|8Dc6I^QZ7g)*J<$fa@+G#}5 z)+W%mX`VNpm=xa2I~vM8*7DMg$IB0yUu&P(N@C5o?-j&9`SXJ1!LN;)jT&g=g62Sl zc7Mxw@Dz5$de(A5g^J2n78BDhnV{YbBX+0NpF4BrD{;cS%60mq)!02gKA**2YZB5( zb{In()2|H?H!{Sp5y<31_OJ_Mo0vLv)u&SEJ*Z$h50;N=r+dG_dzfOb2FAf-AWSd3 zinqF5?$F~q>ONla8U{6s!~QJ&jo_uB^04D_n?%}-?z7-vjn}W;D+{|0z5cY$&~h8@ zEcVq-zU=#kPryjkPW`>1WX3KXNg-8C=xPZMi#@xly0XlCOnEI<*C6^^^VS*{AD7n^ z!pagsk?-xFgV_{)dBtt~R@X#udI2ezMwdNGBX22Ejfz-K` z?Av?}EeE)`2Hss<>q#cHI0-!+uW~CCuz9DqO?V{lpr?9LT)h4K{8EvQHj;ALv(U=E zhwH0!!p%eR!BWL&!q_niuNSbPvv{Q4HTjcWSi7M}W#}LnA^D0Un z^WSGtq-TbfpXGiR?|xN%zBuM)gPeMzygNQ8ay&kz&uucWb<7mXN`HS;cfkleWOANl zg%VOs>|{`*;n<<~IM&TWNP(k%O~;k0nM|AKZQ$bsDrsTe#wy8(v%Fv{aRr%>2mNIb7+ryZH}9HY}=Wt$}+UIwTqp%pF&fTI2 zeKmMPOvGkum$q}#QqqU-UiY;H$wv04Fng^SK7RgXO1|ULOt{Qo?LsPX`_S(nq<>#< zv}zPhQ}T`IKs=ZGx7J=8OIe6#+o};&pIncrKsU~Yl^Yiheb~vd3)^n*>^z4r+4&F{ zNH>PREy0btVnH4&T^6*#u@2p41uOS#p-sv!4NLQ~)uY$!wa#TYJbd`@vg_!5 z?3N?>iIchC?K@9!hI4?12B7yeHr}x`HO+z^#S~dc4~oi3M<*Yb_mvJT<{CDsQKc;Q zS=rjAql$V9O>~(mjyhviSgu*|?mq&)|9c}oF7DgI(jD)K<;xyZmThfq3jXWwPcIzX zC^9Y_j<=vUxYbu3mbJ$gUl3f`CgP1u{V6QV(q5Ukq^`Bbef%O2DD`u^?7g+4Gs0pd#+&9-bXqNw-Xkp8d9FX6lKDUq@pRkH0@B$%IS!t$ABIIDjsX zzJ~X38FECUts_-yK((uHKJMVAi7#@)S2>N8OpcfPMIT;O%}bp~JuV}6aU(Y8Z#X*es=J25qkm zz2ReD{gQJpeX-Ap==3JT3_4~W3fb!;h2Z{J<0|y6(vF!q*LSeeOm2Lh<9E!0cPE^R1 zR^}P`?f-WMu3^QcWyfJ&A#VOzQ1eZAC92hzIEu3hE0e862rBS5+3b@&EG|!d`_zkB z4GUC|^w67g!A|(9NB}zuAP+LIFNGJbkv4A;2zDXRqxf+jQ@91A9D^PaWoJ39T2!ER>+-VPMYir}X|DM-v4BQ%A9c$8v=^q#nUIUS! zg|I`JE4&S59gTkVzLN@JIC1`7gu1G6V(Lh!Khw-4>0Sv&z%9GepCkDEe&>Y9@1M)s zyG-ByE-LWvz5AkulBY*4+x`&5CE$DtaXT{-K-7wwH#$UWT1rM6@M>sia0Gh72ah{+ z?+y_^hZ!ip<0icVxLpw7T;RJpaenEEZMR2LPhX9u!zKEbNvpk+q93xB1u!*0DF`NMddVI=a^%B}J^LOH=FQ6a zcK#WiaJY!{e0sNti<)`fUD{9JkgBfD624m3%vJ{uLjOQ@LRWg(Lt0;CPl7R`d~JBF4f6V;`~LuXw{9Zvhrwty)mLMv;1i`%dA!(ixasFoz zLFM?hhcE9$D%{|fI4{J-&qv~Uec*ryRd4KKZP;O2(eH>%Mof}mM~{fWIprV`sV@=` z-vZZmsLsblqrYHC-SGiv67n-LGlkz6Q;GQ8h=_=?ho7|tqouVZE}jxu-q*a^Fc^5d z>W_mPaCLv5c@Dn=TXpQ^R%bm>fqmLXMoTg*!>5vynY3>|Lu6|PLOPsPW6S#hC zrAZ4bgxFF)U%I*`ZB&l1f3^ymeMClo62 zKw&rQpK>TSzOCp^0bh4Co%l$BO+%aP`-J&?A6+-w2R?Ct~wn zJ4s0c=}s!fyEmE<@g^#EX5g`4?T}?A5mXQJxDw@0D=#9qrmim4Bjd&!#y>&S%mchF zwQ_e*xG9Fwx%9F7?yoBl;}S^*^`Dgsa+OKVVP7RoM3^5df^Btf-FgWu`SMoq&o;Ax z3xU*IUl}Q5&GzDYl`r=3EI0X0hkbRs{L(B7yzitKqTZX15H!22lm&XgS z_iMhAs6~|vWq{gdz%qDXqxOj&4^b>8sXX%WCwXVu{YL0-$rvi`6?3K(2f;ebWBXBZUf%%hv>k!lKBo2GBCqIcZkq3sv-! z_o3p~i^@SkuHUw=5z17tAt~4SnfTWr*{%VEil?FuCFUsar8XUQx1`ITp$fi>@8=|p z@5aDR;lkM{!Sfp9`X#?tnPAh)OeJwTqU#DJekFdohQSkGZ$HC06{y_R)g6J@=@Q`U zuMxu|A`El8tw2R*Qt2_Gliy`9RCb%|jF^}U5Q_@z=i$G+Ee*Q45&Swjd;p;>=#Fsy zjS^P8>^B8@brrXuFc~@2CSlLyR}2<#ev@*Cu3@R_iB*by`1SCjk1yTzxY5Y%uidS; z?$F(xrrHx+qF%q=81r9S9?uS!=u(h#Z!$sFqF(yvhgZ?R;tRbzy;g(S^iu1NuyU|P{wW% zJ*I;F@3Wum^^v0j0xNYZ9#6zSE6%^O^Zxu=45W1`a2B0YQ~%NuPSKMd>`9#ON?D1> zH}Gj0%m>}pc#UW5{O(2=dUsmgZK^E0$O@hpk>K?cx9{9~yz5VOkl7A-3Q$M>x|tK77ZNaXnGf(<>DT zYAM~1tvYz{;8y<%X%V60*ZQ7+)hd+yTzKz}LjuIJ7+9f+@R>i1U)fXe(S!Z7lzCl| zG287t^~8;Uu)}lt6_$OI3B~wFmFAGyk$++jV=3Z%?qhmIzJlA#)ve_|qq75jx#7il zzr}=lk-_fCAm`oD`|Jwmp?=#SMpb){vIo6M24^@v-*vb&7fBDc^l02jj#6~b(sk4* zHvO?lzSlYy3N;wplqe;GkAh3OsF&${ZT@r^@lD47ixO-1;cJ#g?x3@hO@TkowPZc0 zXvIHxov--7Y1zj#@7?o$?A6oAb52G^=E8x!&;IXd5U^C-+?&T& znDv*DQBe8Crv&9mPSu-WGudk>3PJs#moI6GctN)F?}J(oe)0KjL~*2EOdLI(yBpJ( zm*mmJ(BYuDhg56WC5Dgf9^UU)-A0P?Eo~=WO zk=7Wm_ro3*R-nsUQrFbEHUi^ZkROgsekAKKh8~R}a6d6gvV_Zl=u1NF<-8s{Hz(=z z)AwHkhE?7iJmhwdJQemUAo-C!(aM?doz%EnMl$!wdQ;VO7gJ?*hLB^qf!4p5uVRdn zH`*;K+o!+GsxK#Zq$TpUx3_tYUPo2@?6lkVChE;o=O#Y_x^Z(p$b6SN?cwUM z@MC#eEPbRrda~zI<=fL7=?o^A9x%4uju;o@<$cSQo$1=OPiWpQJ*B=#8Q3j#}&|jB{#pKVle-4h6kZns`JKV%YP8nmpHEA>H%useLNzDupaa8O9c!x8x_^O z4e{PS?dN$7^_QoV72kQ{4BaS;dT<(hzb0B5^Mmec=y?d2&#q_dZ^(u6OkjpHNbRU2 zPne8CfV)WTN@leMMuA?5jc@=AU&)?BNV~b+&Y$&q{H|u#Sb9H06>g!d5-o`Ug0x^Lpc$h z_uR(nth5q}@6(N2-OY@hhLtAA;jm;gHc;s@(OqOiY-+W7V_S|e_ur0Xcf(U`71$+tZ%{BlL%2= zDB6$-qOj5_JE4F(yAWQ#D$@D4dHe%(@YH>RD5f6h;1PNtx+Q$v$~|X{Un+U!O^1xn z$|yv)pF4kEBWcdMKF(&QKsvv0#0G^E9ipx@+SHB}ZEkK>xQw_LV;@3K<2+Ol{|7HG zXppjJX8v%~&^4hCXEw1xAdzp|TxVkV9qC$-9h}67jRZZmBu({$wm8fUbfTc>x+7ru z1ZUAIW3v%0(_b(k&OhueBhQr}0sZBaPHW-K>EHn7mVAXDsn0&dz#wI5mz-Pgv-B{yt1^;BZ&p9;59%j3}d;9kN>Z&VnAdm4? z#Bt*_8tBFOoqOLuBk@wp>ga(7!f4A>$2SqNWrZGgCX+Jvp_RSPgjROB2x59yY7+^D z##P}>ol0+$;)@kYNGFoNU#8P_IO~9&_wso=J^>RNW${!PPanm}0P;oeG%{JOI$xjJ zAnfu#{+N;T+5EMd>@=oiG^H=fRbXErf}{FsgmE2G^ebwx3OF09VPdUh zRXAKUl8z88ch_2NyaE5%|9Pi)^VZ}@fxQ-(cdkPqgLJqu0^`!-L7T7LQ5{U0fb}4i zz&5Qyfu*Bn_j}3U@=lAEPE?Sn3IG6*QwdBuTcm05>h{g*Dj98uu6HIiE!MeUhv7s} zMkZ?QiNI**|IDZ2p9fa6d(sjR0nF)J4bJNJ_sAliol>t7v*QnAWFRnp@Oemh`$Jt7 zgchMAq}=Yfpk*XE9i^pY@8B?$huM6-v_ZRxLV}GBL_e{#t|-f3Cewq)o_3`(EyjEy z$*5b=FZrRJl}yLUYfT5NP1ZWL=IDhz)J!_M5oYsurIO`GwuQqSKkH~|d6`OMp$|Sx z{GTM0f^RD42kp}hi*~+;#;%BHQ7|o-|IKnoPwYw~+M0yxFL%@hti1C5(+m4j>J(xV zE2gUt|5Ucl&&@4Cc)_-_ifT`4er|eTPCsgZ?UmlGf^U?0^;^u4v(Kn+bxlcD)-7z) zMvjdBX7U3?o8W0oyu{W528nl5zjMcVd2oP_mv?q}<4TI%2QzKNx+g45aVom3tW0Sw z^AgZoMv2mCmA=HfvQZ0=xux zD}Dj@PzjpZKu(X4&&tZm1N+2yrAuN~bNK|PcXvgw=}{rm0KtQ(Ysn1K3SHYNrNRxr zEsozOVS}V$)_D*n>)sJhY5ZuU{upsvfsBJw`_s+n^SuXtN*^!vsul^}y*5c*9I%%9 zTt4O+xI2~z!0<+x|I-(zl{b2=l2zQC<8S-V`790Ih@L{ix|Mt~25?kWx@CuPQNfSA z0!H0#2HAOwP}+K^xPk;!^499`ZRL6&&%*r(X@B_Fj01L2IJ2rCl8W0TZh$ze*JR~M zvpm3(_9;V8^HdlSzJCc-)uwSf zpqJiDVC&5Hi8mzjxjrWbZ-l%Fv4&Kmz~v>!i8@h9>#{G1Q^F7au9TouwWlE&HK0fc zBBH&gY8Mn-9UUB&Lj^sa2A~>u+Y5C%q%r96{KF)dnpxNu)1P_`F~pyREb$S-lT5Ww zxu>oCr$a6!JzueVyIDSy?V({}UVCh#&g30zn+!}yIpH;sb2;qT<(2lb3Y?PabP$Wq zOv>Q3l1DC`t{?hJ=R^}+|LM08oA=lGpt2elo8_uw&^JshkraMO>*c|ghoy#3vluw$ zhCs1p0CC5T5bIPB3t zs~U(n+CM#3INzOuRV3A^QzsbLE17#cX36n%){gi<=I4DUL3-5BO3Bu&M^p&FgLjh9#3WGNIYi3U)RWeQBW%zChs_Xr&-s@Rb4MfuT)F z6CJHuKpF``2)M=$RwKH3uiLoy&Wro8ZCUBcL02nfY>LWlo9~1jGpADv1w*dkf>pR~ zZ!ImfZLQ_0Sdwtw-4*3PwtWBHqU=#VBx2o^lB&K3DG43X9F}sR`6o3@O->{5io0CZJg3$wlo*eu6r z$qWGQlR%+@7JE-{KvLb@yv6^1kqb}$ZoTHcH2&2#2rO5DoB6pg&ikN=Ux2DT)eyju z_)(zgFvL^a#4uSnl#t^uR^SNlPWLSV-cL98SRE)^z_p3g-NxeR$!ZOHnRn`b#Dq_x z?%Klvbg$Vss|>D`@oJBzW?X;2KB#{!9MhDwLB{iBbOii}xeW6Q=TyTdb1EvzRwf=@ z$_H(x4zb=()%;cByy2^nj(pUG%{kfu0(pegBNYF=?w`{Zo|EUwIDp{sLnrfJiz7NE ziwVfP9K^U7I#5Kh%h2y-+oOIy0j4@(_o@Nj`KqjiuTF`|?hme9v`5p1vz%Lh&6`Y1 zMW30g94OkvzJ`_by>QAv6xoiKzACemcspNn;B4fhONYi-%wat1#j&5e_ka2U!s9-e z2vo=^H%eAP<232r;Z{dp3mVEdQ2&awv@Ann$oNOw%z-cta-dEIRm0&=^=w%Rgphb6 z{iohl7zip@e5of^sGTzGJf8I$kRh;tLvT9slQB9b zKmVwa+#Phdlp*SWx2MM+wh&a97(U8+^X85Bg;Q$yDmRG~tL2J=vI@Vh%#yP?w*p9) zUmIz|iib<(34!XQM)n5CEos_txPAMM@i+_IUO+`QYf_C`5_=HG4|zDIQtebU=fRix+SbNka@`MR znSFtZT?kW?hePg)rTJ$xuSR|R_FZ1gtE&1>#FhExe`E zM$p5D&qV@uKD6@n-k6Nq^oYrjo8=EGlxXe8&|a-xLlXJd0_ zL@B2r{iXLR?7h#zp6FW1BA2&uc_}5e_mu1XhU8Vdi#AL#$X42bqz`XPgmJZWn)AfM zkwmK}B?-l*`Kzg!9{W+$0c`SR+lb?*&kWbGuU|;%dh;sc{*6!5JW^2&X20ImcXcgF z4?woBO$K&!jhnjXi!H79OG+5;8qAf3+AgvfYr`KutabeutTU3ZLMG(`cVFkGZo7@e zlt@|hr_D^(`wZDdt7L&{zg8|(;^M`N3QJji^vw?J8DZAjvW9_%tAbNUV2zPM__js_E%6&jNlqMbm_|Xx|B0xx2SIOHn{dnNZmtXQmd6`a`!~h^IVD=6Q ze_99pgHy%50iSC&p!#7pY9m{%0WdDaL>JGTqXJaR9xt`aRoNw|>o5)rw-;_N1bl%- zLmXrHpn?FBFEe6uZX$Y_yfsy+CGhpj7ht1wj~!E2H7#*XLNqlr@7=v$U*!fS+VbX} zT0hd%rIarB$lAcJ<6X2_-RMnAFvrI;qK@*`c8v5me#rU%t_v3YSQ_Io>1&r);!hI^ zO*RawVz;GzsVQY$jpzLSmCJiLmeso5GA+5;5P`I9;&`n=y{|%(`f#n6*d&UYHhv$O z_8>hlBJ?DZdoUpR@?9ab8LGJ`sI8FiQQ4ugms=>WL%P1=&Mb9t%4)VXdccoxjbADu zAt7*1$Z5DJ-#Tc^-pX@sNT&&61YJQl*U)YUxg``ZbrtH8rsR$Xfdj@FT*El<&vZ1Nv8FCz zdA*zy8iA)~Lh>INT4^G4G-{c>(VB$h<|^}n4FpoXDIyn zeQ)yx@0pELTm1vkd5(SyOLXOb5)-i)wCC=+yn?ucQeFM>MoW{@ z#Um#pbZBpOwtC{=eje;(*}r+n@tmy1Y!mCDGXge0wrPD8PP~m<^DYXc2`{DND+LlV zBVF>7--iXGVZ%yaE@l_oKPK&*S&($^QJcdpUIc(^|Kjg(=VMk*F>~R zI~ysu5{|GL_Y$oFU-$GR7AUb-2LPdbRBx?O?9jTPq+(M*ipFNBiw4~14EySAe_KnH zfvfRPm}qarLb_hLgSPUrs-)ySfmBs1Qo~kYnrU)f1N|v8;GXHB48P`A%d!zLJ>DRq=zQ`Ci52;7oG9ozFrDB)>9~>+9VFB z_P4stc8Q5V<%{6uXr#5Q#CNCjbuN=>5C05ZYallT{+JFM{L;*K<@4uG1;%PQm`J=1 z^6+3i5Bm{(a&=T_r=z32sOZ5DYWq;TePPFy1LN>09_YVC5sE6eAaZ4JwxPX#VXfYK zILWcbbp$FV*p>DHB^cgO_3Yu5l%e7ja?rSP;8j9q)VU@l;*rLJbEkQXaVo0Q7OWjW z(GTsfVt)|77{^%*`@Pt!ahUCig9Gqa@4F*BKHcAcM)_F!WH3Qw%C8H-Ic~^-Cc2 zsWk3dh6iR!ryR3|$W;HZxB4EvP<~%u6iK%vg$;$ROp4~*ODeL9I#vRSHik`IENzSa zfsTYM;LeBMT@+h^z&X9(1`n1>fi8z?hrrlU`eG(z*sm!Or@SaQ5m8Yri1NUJpHqOa z(LZ;TRxLAVmmE6Vj>|3o3cZ01omfq%3>c!d*ezNvTa{r6{1Tmjw= z(w$abw~7uxoDIk71i8ky$IH%G8L#v$C(U;m$UXS?C+$B~r(C|qf%>X$YuLiOAJGt7 zf=J2U1{%2|K|MM;dgN~wQ!ZfhG`FZqr^GDHoMhdY>hLqRXmsrr1QT8Dx??;PQSzx> zbU`e*RkTU25(CPZIfU&hr*MKm`EABwXC9tiw?tT8Rg8z9f;J5ATVtTw%7S(=l zq|7ecL>|xn^)Erf7$AE(k2hl7Z*M`*`RUQDjmgB5pt1f6?pVRcJ8z#U1PppQr<>Cb zU7W*udeL^)ymK(KI4Y*r;+fA@65YA-b7h zGQ}h~(pNh?qUSyF+{b&d)%aE!%iU@b|J|`NVy*~IJx!s4{4jJ)5JB1>G08pcWkf*J zi}fD3qWM?7Wqt&ev7$LgnL{Q|pO$sZ0{o5p=b!1{wKOz5&90hT>K9lsqC`fD^!9`# zN^F7(w!OVwU&AT?VMb=73UBWbh#zck>oR)uDC-YiahapVOLj$?4h}g3m-IY6Jyn7t zVmKg6ThXuXk}Sg0L>q*%%%sd#OGgzb?)rdC3>pH3xJ0q?wxXIEQy`rJD-jQ6+?$aA zqXkdczS7bHH@thcp@GRLbh4hp4NJsgFxUyTu+zfn0g~{)h;z>-?90dE($b1EW*(Y- z{tWb?Nnz5Z=T=s=EXxD)jDHG)s>FU_1{1kC`;R!B|0}?GHSJ~&TwLLCNoHh%g?&@* z`1&w8Sw6jImr0j>H`EFwF~jy#U?YRPrGLl4H=dEzthG2lKM&)9f_`#VO-;=z>D{TA z*jSg~DE^~I&q35!Ooa>8U71Od1!A%i+Pad4nWt948@J__<^TNgW8S%A8<~8wpU1@2 zGWEEa*f;&@1;bbj1i>-v%Y~)9U%h_qxstrSP14z9)Be~Ga^`E-fJBnkGc|n&^CkPz z9mkN@&!7JyOsArciinhe-Vn=f)Q3DG;E2auuK<`I2~1eKXxHijz}6lgZ`EpCXmsq@ zF{lqFH~FxYFU)AjLh&ge7YiChVVHOgW!o0J@|T2!)@>1Kb#q}4s~1yORV7p~W|Gs+ zy??dMdHO8XW~(q+$4?uf8pofORcw59FS}!+DrLR=Y9X$-b?XoaW4oGQHQnE&Cq1Fy z<0@Zb<95n)a0e{YP9a}jW=yN?6?gZJsPkFNx>9UGe}rgmtfpEPn^k{0kpR+>k?{4? zPT$_6bwd2P_@%h-o|w9*w(r`}8PxWW-!h>(5wALnaqK$J@VgnDI$rHYBp#hU6DcTH z(B}!ozB_##lCeT5yAK?~ZBiX80xNUHy$V zMris-JbY>xT*>*>Z@o1r;4j;p?q^9pgUhGw(aQKg{15G5+fLi4^LGOQplC^ z{(-{kcZS!f{6!<>a5|pTXyb(CS)gwxy;u!XFP4H|M?@4=y;V_CvWyfAs`7U90YS`B zKE5*=f%GNE%BQgLZcF&Fo}QjG*Ao{6#;qFpV~I(P%=*|}1o!K6m_mbg@_LIjg4)r9 zZ`vYcX6n(E6qjI;eS35f8TdUb>kj|o!>XN$B+I@_?+MOUVYAw0PiESiS|N9ACGuEY zoJ7Fue+?DhY=GnrrQY-ZhIgx=%6eK&YXjZJ`UTV}Yi3)2{8ZVO=^}t6bvcCDA5Xwq z5@Sm(o$z(pbjoUpJzEHE7uZ$D&3QxQV3Z~u&9qzlg)@nE4WewEYTT9@FIp9{H`zIx zC-HSI;dabvpuJ{d`o+zgM>NGH%k@14r?$GP)e}#1big|svsc+a|KvWM&izwf*(T6h*n`2{~$uE(|=fLT+jXTc^z7K&((rDsxsmq4An!qcR=C)!pY) zJyo2M(H!DRLQ!hVyq@~3CFP#K)E_|GUpQ2NMcyI#eyY0_k_mC|-VdCOBAe?F*t>-) z^i_%IsIfY?ux4M4ko-qSOc}CD5=Ac={a4)JdYO-Hzx|+Q^ibZ5wdW`2mqAy4`j_`w z?Wg+Z%^w>kpyO+QHP^VvgPr5F1AKWu#kR2AL#_Wh}^Er<$Aiy$Q-ARvvXAV^C03lh>G zDF}lBA`(hBC?X&w-Jz7Ubcb|EDV^V*dlh{D>pN?Cm)tvZ=FH4F`|No3vp?D^{qNT~ zH;1D};jOtmm1?=h-!m7{Pgy9W9-eEeSSl#s%w?dc_MWTNTUq-fxGCkhdcSk$mh9{p zZm(4HlXKX_^yHevu63!5oj>>B?gm$b<|h@WRZ4ok0p0Y;j+rzCQ&X=&>mwJ7w>#7k zyxy~P>n=ocFl8`D?cxXxz8=HJ$CstWV9Mm(`@MacUol9aKBENy#ZsAd&Iw4T8%Tw% znHIGfG&;|BW%FHhbMU)n^9|Ggs4m;lxGJf3bCq<2CqI8Zzso`U~w= z#KJI8p0K8wG_Clf(D;@X(ag7WB=+!0vI}|d(aT@FGdjlOay|O>>kA>bAW&L;QdNVS zvBsYUMAOvfe2H}zr}>t{?OWH=)= zD*#47XpXfvN99W!>~9wFhq(g-f_Nnd!&@$D1zk1g%(nW)oI73iyA^lNh{g;nA#QItUq6=pSsc1ShGA8GIvKp zqD}vNRQ!o1zPl#erY%8BX1pP95@G*vd-38*K61maC&xSv23MnNH9~5{82~S=;<XEO;yAf_7rBXlcxa@$j50Rp6bc%_xT(*y|`B7zR*Kxp2{mVIXD;7xv zKR4vrxP|%-TG7>fDC(3&Ql?=mm~gD$7-D>&vXZ?gz!KMO>L(>Oni>QY#OumFsW44< zr@V5sn>jP7fXRcJx+t>}crm1&NTb|Rm;-18jB=-Gar+BkYZxP*y8B+7)=zkwK& zM5ItJDj=WUj%2Plh!`imZ<{`sxt7<$!{7IaD<6EV(LTpwTu|HE9iQ~W)Gm)QkdK|P z;YGVXZHb27UQjsRf~^>D5i&Fx(7s*6u7<{H=A;J_ZBU^E)iDP26*s?Ts79Vxlyv{z z%H}Pxk=tV`NPbqhe`PE8))Y_v@#Ba~2(>11H zr^aM24is9{Da{GAhJ=J*3=Wn>OX{R5GiRtWp!H*LOR|p4z|M2MfWA>pd{H~3n+G3r z{hd{;=o4x59x>AaYika`DCh6#V<(V==Q`x?=XYlE9OjS*0R=M;;x&wvnX~?sVTVJ7 zPsw_`culBSlYH;??UL<-sTn)e)YOl8K@y<9Ivb>`pr%ZfH>t^x>;HJ?i>%ud2;9Kd zZ{sw$>s2ShAMP!JwftF+FP_fOy`tJOB&$^-Q=Oc=8*-r}630w0D}TS*tGSEq{((rq zMI~I8M;szXb;nc-CAR!g9%I>qAB5>JhXAUP#YFV#CexKG>cA>$c;CQ4pRbaHhIYer zuQ-isL79h_b$1m6x8cO67f@jUGtWxm<_i@o@s}Bl3_-twoHy~WSCS}x#Xb!5J}$O} zP>;ZyB2|i(PJq7=Oxs~p*fz+A^HkdX=o!ge1gQ2{#7*l7GW2+C6M4zN_}P}aoTV_k zYqbXbic^@1LPTxTE+tYoytUPtORFcy3_J17W`YDs(L_pYi($DcMpw|@sN^@%3la_E zN`gw!6q9&7>GXCJ?hU(JKC99q(?I$iPd&B>WFv=uaO? zwt5CG>lLyzpLCN|trV@o0jiEXInM&SxykmwPQOIWDB<32+1(fv{C0Fy&+P8t=z=y_ z5tJE+ps$bcwnVgcONs+pzAgG@uD?Qpj63IwwMa*PrIq;io7;PM6FWzoEMKM!*c;KZ zmO_@KQYWQm&(F-q*wR3<2hR;tje_PPMS}RgSx#vfEy<(hM<6Y@E>qo`X%a`LE zS1LR8GP}u!<)w*}y1GKtu&^EMaAYl1zVxey95NTj zon>V0=)IBEI~%q*9WGtXZPudVPZyyPE4ViUr>V=Y>UEWCWY*Ha88oJCHhO_j01$oDrYtW0GRoyUXG0W6CzUySsLgiZ`78YVMIGyVEcf}XzEmI0e0zSO$pEFD^)+XiX=r3LR zqMV4{4~v|~k$|%RLfo9o6VL7c^=aitzcNv7x9P@kIOS4#Q|7e?!rIHz1B!_aVf0*F zqDo0p0C4KbGkOI<)sI=s>Q`ow%`EW|6dk+0EW3Bz>2v;kZVr`?cp-wGn)j3B#ac$( z37pImhD$1ZyPE%mqIka4aVXs|Fz0f=j<$~6oAE79ZR?$|c{>DLbVZrctyBJV4m|RI zI(6MBznahTJ~MFi&tt+$8YI@e=G4;KL3`sq;O4*TMY8JOcM*b6R%dVT6E(Ah^f6Ri zX;{69%0kx(aBL-r+`5&=QaUNb`@QS_(sw%T2U9^tV*+jpeCC zSmm|4>1~dtd$%sDbKH76-={dM3_le85~gjF6yzd>aU;kRA|{oDz$7IT2xFqrMu@H5 zOt*uHvM!zzk8t#w4sv8KT(N|ZL*~9mqjxa z2de;8i``6IU(i=rf1fW6p6Xv6==2q8P|$fhlbAYd=M=a(UcY`5lGZ|53WgppBQu?y z;YOE)nTS}Z{`7{ixauZ$mqpMgv)dE5Eeuh8Sp4{~@OnEa6D~cNABmIQ&8q{h~?ELmADc0eX?Q{?(G- zC=q05EYr$hccoC8gyRNaCqtX6_J)C(K2Ck9L!T6vT9T}yoEZUX6EILQqoszo*tM{H zEn{|OU7zIa2doNDmM_%h?VTv(;>Y<9>P~v~UdF2%PgnYOgI3t-wV&((v~u+nmX(h!vv4n87~hqAREtmQoG z&A3WOL-PRHKpNYLdAC5$`;UWVz-arU7sz5*dFSc%Qork zh;`YU(;!pN`Hw2`If<9}a$qO5;c=S-Pn7Q6dk64=_}XnqYgI&c*wncPEF*6cXi2Fs z5k=aL6K^aBQ*zpT{WpI5b|q3-Fw$6P!ijD)xF&l(w4b@+cNF36Yu1X*t=$q?h+D+x zb(?ma^%Z(oP3f%i^4OfzvsqB|Xo`QWgp*vebZspG_vR#2*jbw1U%A4cIBwJ3;p&|I zarwpLXmq{~y?w161`N(Z3DCJ291-K^imEy(mUJ|z9 z3(?;DC3Ox(ex)Z?x@qTM++)B-n-s*XIeGf7#6t@%0qD0(S;SGa=oBfpaYIkG^kVvb znGQ(ZTv}gaU^r!4zTA1eau@P_W(Se7iIIJp`p?K04_*zA3D4q-cfmBm+YObZ+D@l~ z{+{0U@(|;*1Et ziA&JDKlXK;YjJacTE3Q^-q#KC)Ur*da>>AHZ423l(u5r|#x(J0Hr-qiVr|*Nk$;GK%bs z(De?#w&Fx_ij>R7Q{Pa3U0_d{f}|ly_e%ZnmZxM5(WPZn9ckLyV8cMv869lgYnF;D z%*?i);4g%+UVZf|?QP!sig~o);_voEk6q(@Yv4J(8L!MnD-UM%0@)g*rlv#!W%##b zcpv;B<%c?(+du!fG*Jt&4l)p#TWy=6yz00XBgiI60K(*MgpfM=1`ja5Kd}hvbfhi> zlVQk(c6`2}Z5M0)&m{}Bifhf8mvDQBp-92$v`4?jrPCp9x-Q@g@<(;*9Qf6jozRtz zYr+?a%?XFs5w|PwcUd6Z7=T`%$^Ss-wi89^u3$AoN8)|4|2|FzrXGFL!j!MSCH%1| zks|OT@>K3@nWO@`U@Vu6%S@sbP>&JA2al|*s-q0l&`cVIWb9jcB0r}l z!uTvonyNv%&MyP0Bu}L;WEp^i)LBpvy*Anq%xOu<@9BTb=;t<6Q1*N`+B#Afk}ZO@ zt+Khydqy*@&aU~h!G|08KbL28gfq``KoubUwX zu)m3h5h?n0K~B!~lrCF<)#5{I>q&3=@E9N}ahXed5)HEqlpzjW&v1rJG<3reDp@c; zP{`PCzwocSbhu-XLD7OAK;KLRlte|{&GVP-H0{s6Wp1+ ziOMPMDzpxvmUUp1!xjPP_@!R^#pn)Qk+&(*v+rl=85X66v&(!#2-2Retz9qPYz%k& zUKzX$pcg=d4EtM!ahbiVrg(Ixnu4!|ZhK$i+IkZZQpdKv?!W!EzfMK~q30x)&53;d zdT6E%I&?K=qt?0%7Da0DIOF!#h&?3rjTH6RgCiMgKRs;N7^CxCfa7q@^`Y0-JH$%m z`h_3Fo2T2-?{_0QI`u-Z)w-4q6B==XJ{6C$L7Q|Ww-*AVFfav(cXxMl&LnB_MLJIF zMLKsN#4rJVKK$^fON?;8;jP<+iXMhn61olT;A_`3S&s>Klny3cjH2b)>R{64yFtdy zK-D%89SEwsB9wxcGoO2#kpuh0DH0k6PEN(y-fVeDu;MhGl!bs9i{-uy#Uz~gLanDF z<(J&fl{qf&fq=H)IwV3Bbp-5f_mjlQR5uUvRR9?#JjF}pR~ar{(s2L2p^kNa;KoQs z>`vw1&y@JS$8O~d*)9z#zw=&-@UtF0aYA0@f{?`Ct;FP;J>v4z9bSO!5w1bzDJLaSE#jeZ`3bFCOCaRGut9Dol$z20n%V&6oEu z{BRoW>jvTuoqclN#EVzCb?erD2j}5o-R+JOg`fjJEdzSxNZp!KB!~VpvidiREWIJP z{p0o9)2w9>EnGshA5WdL7~to`bnjgk^F-fM!m_*SsQ*bhFYL6tL8XOYAZr{*nV$h< zJh!z3m~IYTL{~PhUHnupmud(w{-b|n+-Z<;B64686ESJLKd-4eFm8w=*Z=X2pS-Iw!2ez4T)uHHqrK3BeJP1xk5LfMf- zB{zpBZIDx}>C%1qiS)jpI(n3vQPjQtwLtQQNFm)^p;X){M{&R5;o+?}B+!LyoTI9T z{g=gR1~xW1RaMm|(v{Q=^76|o>SvVI-*)kQPLGLUtUW-NQium@% z3h?+pUBDzdNlW_Z&0;fqwJ>C63y+MQ|Q0D^s z4;?>=Bs0S+^~*9M@RKX)v>8>D&IJXnc1sCoffUp;m}7r64&nLtFIR`;h!|j1 zoP~s3tPALOx5zZ@O`>44;}1D(pqiyPghKr!Y5mh$(epo6Bw@oMxI=GL>gBOiY|i9r zx5W=$T%O{-6B-)o@)a!?nn3b*mrp%)JT1FvTWnKMm2QX|EBm60Mv9>3QwKXy(1{^hiS*C+a5voES)MDWcG8m4c@4)xTrHduN> zl=sMA3lig}cl^~GG~Y}I2gG`VDns0Mk}-R(5STnZHD{O!l?SVIk+)bm@cCJs(Y~lV zL}-00xsFSx9$WhCq6pT*iW`V)jBcKshvD({>{9sRwB&!sC`quG+Iy86z3-<-|NBgM z7(eTiQrEM*)J2VlLq}*$@eTmW6M_87XcWu~er2c%>?pAE_2v`l{gPWpkCsP@@Za=2 z>hB5K-Dx;==zyDpB0c1}17b8wZ)#Aj)a9Aoe0MCwyrCj(o%w1bw+Za23bL|jfv|W% ztltREgC?B7j=E!6T5xyt^q`vqLa3*wHwl0pz~Z~4*4Nhy$L}w}=VYrV7Jt;TTzwpl zH60HhU#wlP&omi>HJhh}>fE&?{dz#1M>FvENqYDQJ6Vg}sFF{#x+2{M>=g=`~b_vl$al6cv z9=n51Hup4g(_Lz@6Hg7cF|a9x?FSyoWShav4da$k1P~k{Au$6uaX_~NN}sZ~n!$~c z?XWId7r6?hrlxwcAR9d1xw*M{8W~JWJ6Znva^Jf)gNAFm6>Ql~`+hiKa)VolOP9++jL7EoXNI`iHAemAGtgOn*7?!DQ6qK42^+KFxoALD6iIRyuW>Z^WzB z_VfC#)pWISHfXhXO*&Irfv+Ai;YGt8FGx|)#98% zW#lvsNxtun-|8>J|8c%#{T`qq>3fANb`C_cTX{n14B2wAKk@4O^H~Ze4-kvC4`xhtrDs6GzqxmBw#j+to$hKpjv|(lMSnael(F>RuLbft=+|{4fQ7`t3xw6Exw0{`to(TMB&z*jC2u zPB53zz$)aD1PSkGMx4u6v@~{t+MV;mfc@@g;IbUTwuWZ^2IY^<`#aY}xh|jI|eByXAKKw*F$pbHrhJu34)5F#b2! zlHxY-MQ1p36>19Yu!GaeDjJWhexY`M2TJg%@c_wQ`&+V~rz*Y%P`)D(x@Ky*cAINH zocur;kzzP@`^2c_uct=GhTG+v%ZmK!xvL z{pcj%+Zd_<+)QsVU$X7EibPKhCz-Qc`N9$2z#ht9_~>WoOYzieLXJM0s*e7(rCG^jegpR#e>b_2mTAejnm1>dX6ihIDfU9| zr-C)(4YeGkew}Al1hr2-{A#A^`3U=<)RG?uh-sUU60yfZ)K;9{;qVC|vwLjH78ZICLcsG^d9648XbL8!vpKR$nsCNLC;-tFr6 z2ZEjI6Fwx?!;2(b4z6Fm6xoNNK_UjbmW2Do9i=pvx$m^Vq|W|#u_dD`wcjb*yqp$N zBtIwJU%wk2)!z=myOp_KR`HFW;gmKrr<5P{HQ{p@CViS*pezJaGS-*!dprN$%&J8= zYKAksQ?7R6JWTBnL%;`bVtb0Za_6a;PeH))0_;05O`z_|(mhDcO!JjfQFuSLoBYt@ zGA&I)629k%J3jFcieve8o+UBU%>k~0f-uf&Ijj3EO>EsJ$u)>9u%G>5M|lL#U^0`n zgt=F6F66CoAARLaKC<`F$aF5Go>+9*Ts{(M^Q9Qgex_tce`FM+q9_{9A*oLtPi!~o zOv?LmrqtQVKDb6<^Rfjnp=B1zn|7m-Pah#~LG$M>5j^Tf>NygAKl&=R@eKWAB6KhdgH%k{|C%6o(S=%K{o`7O*=< z@%q3olKt7a9Fa)wFwOtLK&G;<(54^P2Q!9OnzmExf}zU`o6$(SShVw4Gn;zutYsGq z14DbNGqG0v@$7V=^2{$_rJufl4m#><7$1;J!9plIz`imp(HdIh?H41FKh~dS>MWA$^qLh-A==GaBXVO~` z*i;3daW|>ZDz4*8DHO~TB&KTDWZKQRwc?IYBGQ0yM^Pxfb1rudZY+0r=sauBvAtVa zRgv&1;ZASPeA}1H$jqwHL{gRp;Tq(kbLw^>Ll{9+=fSqq>|oA^-^$Y}M%Cek{MV^m zeA`}`*~Wpt9>xM~k1{oP(9CmWwkyAvA*d($C5&evIZ@tpvr*Hw01BdSEYBq#nJ>8Q zE4clXJu~C7_^V)+&f&PaB!Nc2Nd0`(*!r^Ccj;!(@5^B@emaPcO*ieO`Z;VQ$#vSz zhHBu0lu=+6>Ds?FQf)r4!@*WSt_!K0p58!46vA-IKT_9em3*PwVW%zSE?x23Qu)SU zytXl*+!I0sIS19} z{9Rz1i1wLET$xo%g8ZhRwG0f6ZqM3Z`XaAdQ81B_eEfsv7Jaos7k>~TX-~h1fFnLh z=b<0u!zSI>-b|2_xT*bqo`#J|>t*0pU(#6$in&i_7u>%vQ*E~qDKP2iY=Ie^a4^sC zAcp@lY1@etzG# z`B*i@h@02m3oWW1l@1=AI>3*dBbdqX=JCQgIhqL;t}Q_0*1V zSY?sAfy~N(UHK|Dwit4`uzlScEj?cr4Uq*_5F)LOf~^b?3L`>`RsHYlQN@>lBK8C_ ziA|gOt*1{VetN7-h5Q)@=6dZp#D5Y(c!|FzP#>SG5X|c+8cpj4MPsNVE5EgKgyNo^ zoiv7BM1OchSO4QDCQ~IJ3q&Yzd&mEbh79sMi~y(3W1%h(VTAu5LhTX|`jg#;Q32hi zb{_Lx`SQWqkFr5d91I|?1+Th4g};6sb%w<_Qfb5PQU2mod#jAV+_jM&ZKMH;VoSFIdl=d;kleO0 z7D*4?MP)B?kW+zf}}2>+YX3`_|aY@xUnFRwxUdFGvA{MdoNdS z^Ln*1lB~g8*w0dKxqT#rE@(TmmZ2ll>3o{c-p-FX4<6$T5*Fq7>@mZ2YE(Oqk$@M$ zZ9i9}Mjj2&d)t`~Ck9dlI$Byaz5)j#cds+--d)P0aK7ll+h1Zp6XX3vkAOJMN<*0*b$q z;sPgIvfqyb+(`y`Y`GpOuW@sZ$ju=^Ui2h+@?--2i!KYKUJ79WT1zpwF zrc_2qyK#HDOv5*M{J~g2i;ygDR&onH82AGC(vXk`kxo^K*|qyc>^TiXG|vxr-#wv` zgWmIFhS3v?A9g2-gyUUFLawjSG(?u(nL)Te1XhBb8pAh-D69@zWs=ZxFC>&&AQ6eV z1G`-eF6(X+3{+Gle*unS3?x6?2{!wogmW~jFiE}Q1@`tS6kGgQBjV=c-j&FLm7v0< zi6S?kVq@8?scmfbZz_GKJh)M2G*}bs(+X4^%W9~@|91p>A%cOa7D9O0-*D=s;)!+Q zMOk}J38Mrj^U@pkf(s$XkNfOc1xETORYyINi*{K|k-l!1=V&+ou?wG6?t$aWzJ}PR-vE ziC#8Ke{KXROC*ANF*FQx+{(nns-UO_pnQ57$t1LNb-Lg8Q7K35#=kniYjJ zj^CrjxW?#*NV0d=gSYKO#`bGeILHEK=+Dovt8$i8jH4!4b@1TN14IZ!(5jRIW^f8= zE!J7{`{0WSp(tWaaP*ao`E3Q2b2JI2X&W{mb{?9RJBZD6K+S*RWJ(`Cp~4~VpWpp!fG&`tkzdOIz@X_) zvM_Foxq#|=ZI?LggU5~dwO&Xpc${z!CycI9&&6+Vo%!Nb)OyDM6Ir8_4+0W8i6*Wu~Ml0g^XE^{vZmdfan{~pV|UJ3kQ|L4H(U`_s5 z(f#W{S%uN9*$BYa{hy0FL;!>jH^{QL$Z6K2KL&FFCqh6$;VQZJo?M6Sd)mMzeg3Q_ ze0R|j4Z|fVrP+B_R#pBdsJE5}VP5Raa4mzt+0m_qavAA#@Gt!B&%d}9^6m^gnsC#M zUNe`k*ie=zm6q!^FJh7d6{{xC%|p5z28+DG4dJOT4`XwR-HP9VL0Z%-R(K*(gh>Zb zCg7;r0+lt@p-R>E<^~V--iR+=57qVS!!8snR2m77fm-333)vEr#j8Teij+WW@dP4I zMFDSO!D~C)mwy*&h(wYgUtPJU>MEe7zB@#Fp>h=001?i8Vllb$(eYP{R#LNtyi$mT_fUoBU5Cfceu&+r9f4ZuB=5irT?1o*=)=7p$Z=rkW zeUP=)#Tm&&vh#dnXj5^>yN%@bJ6gxI{<$cG9NZbuh}mtzC>j&3-xw%HIfz!#O7Y&N zmG6K2z?XmPH3a3)PhQ(Q%QZ#^7jLioty8&X7O19-i}+W0a{~NSIR5*auC5EkS4Vgv zU3vn9XpF3D}cgBqP>wlcN?bdJZ&M0{L=Bkp-Us$dqs*uLM{|9SDCQ%W}Eg8Fsy84 z$|T9fp3{E6e_G7pld3d?3cXcY0W;B9L3Mn3wk7M&4MO^WZ@HU8dnO?{PCatv_*)zy zhXni?`t(Un*sucR=*ho-M1T9DPYTe$-y`~uc$y?e^#{{995UeQf5h^Vq>dcGfh11+ z1{L89v)^O7(UbzW3H~0?XAn$;+dsTdg!urX5uy8?;QQaPaA8Hspa+TXH@NK7-ynW) zG=}l$x=0bAF$BIb?BAf}=cB&1svd@!=Qrt4^DO27R*(OE!0DxWEHnuRJ$C(%5T6W1 zE)B!FB#!%yD8S_*;Ldc7G4%Ab@2--@ZYl?!W8d=cPH!}wo06uAQiQw){BHC+pZ|0F zaxYU!iTwbqJCTq6Oo-m(zd@j86JFVA{s6u}%OO{=2)B@xQ(?Upg_W!$=wY~K`-F!V z)_#uP<4~q%T;MywRisFQNh3?eqGUY>t^Wzk#Ybq4{PnV2Vb!+3g zFJw>Ap=0P& z8ABmx;L!0pul?~M(#fJ}v#uXJS#eg30qU0chN6c+L$9Ck_0tP+#>5=hlzWA0&~MRm z2hh+YP#R0DYC29;7R&~PLjvdaU-$&qS};6>2C@j*v9Z!ERzMOOH0%_&tbxtg3J9+0 zL3BC(ZVGi*zd*_g;lyv``Wqm|JJjNd5MGJUU9_?)_~o;E_~KsB1cPa3BZiQ+Y2}M8 z9PpSPdWW!+t!L!J+Cu=0Ir4uF24D;>W_y4Njs);Pq%I)%@cx2~U^Lipxl_M>FG{pa z1e~Ffx&Spg@!uoeZs(iczw!t17z?4a6ZrV{p6N^|P7~KoN1%9?-s67_(9fUr5bwTd z!kDwGzJr@qef8HdD1`M~U2QFHXn)?n1{)I_2#i^*Fe%$b5tdMdL^{1eJ?C$v3MMrK zyI{NT{?#L7cuk*EFIbxYd!sKSly`vew;fJo?VbQAC7_}J-Bv@j@~f#7C~A*Da@KFd z1#SqGP}G~lk^EZ{pdd;}(?v@|k?Z!_|M$&V z=(8vQa9M^$W8uz;xi>yZliSlR@$+#68fzS)A4RY7^w(}I;B2o~XgM$27O(Cc`Clz+ zcjKDyZBegq$h>&*`xFnri-V(pwb4Nds2uG)1|M}6qw#Fuo<8W0T=;Vu#+7|M{(``sY_p`ShH&y>gcTA}gPDVAZi|T}ne}o__a*w1 zaGBDVFV8sp_5tc^U>3z0;9A1WrC5N=J>+DLO1W6aI)#2K_WUu`KwTPAq!c^y^Vcun zSTs&i%kHToCjWa682WlOyq~cmlSpq9EAWQ2nWXj|crlGve;B|b#ZB6#zqbHcLlhgg zui3}`_s0t>SK++dFSde9cMhx~rZ{C7)T7%}6tdMRYMIh9r3+zb;CV4!wL4#bcMf8S zVAUG<`f#5tA7T3~y}(v1|Aaz0a3XUDJzEUuFKVldilOwBAO7EM>q?9!n9Z@m)XkHO0yDG>_{j-EgL>L`Ba zlJy7Ut(sWd@ufO}Y1YENmMmaI)2boBSltq;hDEr@EPm_8pS`9m*lR&0F$Q-1-)k4r z?Gj=E76Exx@2s2n6}|6~I6i(1Oz=15v_;6U_&n@jT!##g``UI_ndgPDqdUj~`|(BN z1Yn;4I!{@ku7LekFS}b0m<28}h(qN0n2lpXJUkX&B+DfB#=(v0=WogbTdw9;IqU0B zTsN)GytXIo5>8ywO#6vShdYO$=j)y#{M-=1)kLeKf&QML2)Q?#E9BrO3CxumR4^*a z%7WrhTVLg@=Swysn26>hZg%tdxH%kK{A>O^js7l56(wocjigkv*MBdOL027Eq3s!J zDH}U4qL&&A=Z&CdcJ|!-Di1Q*Jz+5U?nG1P^TiR^iHcue=6?gx=Or_~fY8u5@ZJMv zqO!6o0g{M}qk67Qp154B2+{daNI>d+dCUqpz}x%&d6hjnPuNpp9Sqd<`p0t7L`&Pb zE<}sk{gl#(D1+8MRI*H7G{DLKM3=-*eH_Zr|~O?G)(}>1g%gQ;TqC>&ulP1 zsn(9*`}gVY*d$RrQY0A|B@R2wX_+Z%gxNuOr(nL>Fw1aWFg^$PxlN$-i{ox=lWm`e zPQikZA%mb#oavth;JQoP3~Ed!(L@c|l$JU?z?htA`#8B%XzJFJBa|IZ^T=eYRY$6N zd~1AE+?BLENi>lKW|K_y2|J#bLprp;7<^Y6?1+w^?Sd1K*+`sLl-PIk5ht(9?&p&NoFj_cY!+|L^M0OzymZIDYCrue zOJli09S^psA$=?k^1RwU`hL_?R0-=a$V}7>S0b@*p@+DxTusd>n!+smU6<|R$8ja= zIv*hFj?jzqT3)?rFR+#u<^011LQiWnLNHWpbFHP}GY#l*9Na#-7yk@wTeuLku9o4qa=4w6QPxH^@W>T zqMSqqaLhmw6*$4huJQE|yh0#u=WX8?55YX_;tr_(>?N6^l3x{jpV2tN?_SbKlE3C0 z8>#zSGy(o>btDa>HuPj0H*2J*UF!@v>)UxEtt4e|Hv-u2Mx4ePR&6%Dl{cBhe%}Gc z)zjFU`0Flwu2lZC&z0ydK4wJ)-1G9k~B@Ok_j1Ixu9cU z9k^MtyCY`%U{H%&14-%KZr6u&hQY0c%mK&Uv#KddY0I14!GqKNyUye1a#fgkbw(|{ z$pmi!skX98$Vg%|EX~R~rO9}0msWSFaB^UeD^|`O{Pl^#X-Jw=(tIde;~+C5!Yg5> zmK^}~x7mgLtD-f`Hotlt?YC^d3{|;XhfDEUsrl_c>&BUhD;IL5I7hPlxvw%E*e@kc zbu+i09|myOmOm=>E`mx9poZ;~lC9}*#?@S-RyDNHjCAN#EdaazNe=^(_qJWZ$1+t1Mn)Wr8}u8t4O=c1dED>5rNh`MZZnM*m)(s zSWQR}lje7MkN(?<$dzR+-tj5V$N`FqZ%`#6iH@R3{`>du=400NuWw8@XTO@je;+Y9 zN#E&hJPApyt7{j4B=#=rb(y=t{WM7U_5x*Yrpqqu9DnX@h#Pcz{|1_H({@O*)!SsC zhF`$a9s~aDCod=xZM1<_CAD;pMAL4n5{igu5nBLl*2Y|TnoV6w?o3h|`Kw*9GIpH6 z^w}v)n;AQky}3g9Z9>~QJ~VSYq3u=Xka)|0^X78jT?^gomDOH?TEUtQQS}C^NL2Mn z^7nRTYBP;TC|XOlkJJtuskbbz9EqN6InijF6b-i#P1N#_gnt#obVqikQmWP!@r{YW z-M!6q?UfF`zk-?>DcJHjyOk#R$&rH*czEZB6`Qmm?Hul9i!PY?=)qtlDf*<0pB{7L zvNP&rDJuolcRo5WDIlt(oxueNaycE_jtNo<0az=y?{TdBW7rUSAR(lwdNr=wdZ*-^1=LmjZ;$iWZ*(5U~O(hRKHQAlRAn(_tJud=T<{m5JusQ#+Q zF0<0?6^*2AWj?CQA!(A+xOZ>e-oIuv_`{w+z-V{R4$OOwX0-m!ok&zauMnbMV3YsW zt}nfsk(yfI0Wl=zOJCqpn3vi57F+Uf^CeB2=6`O~5j+50y4Yv(1BWP{GEjCFM-RnL z32hrBM6y3l7#s)2bUs_zI-&*vk`5wf)ek6_O|cbqX)57KD3;t*yd^reIP^a;qxy!< z&IdkbM}8n(U3qe9k)(`!JBIO>x$+dF{*^QH&(Osn^m3AXk;}C2LBc6wcKS)4jiouW z1VHi$PV#IufNZ}z;RDR*a$yTC90j|Ly<0ucC+rG2ts4*chC!UkHP)*$Gu4Npt7)Wb z%+92v@1GYJG)wj0b1T`k(gs#rk0Y$0sJv;K;EQBo)+%`SGY_CnE)9GB_aP}aR=#1L z2RPXEttBocpwnY(14=u}B{DE4xY~e!Pqp&vf>l#Uc;G;uoUpw_Z`PxvhYzg0ep`n#_?r~G?;Cy&a}5E-TszxU{o+rZ|ee81&#oM7bU zNLs1M;7&yC$dm1jHD+ZkmnT0@95=R+1_sya^xjz|H`da_FI+$Ik+oAC#JFxe=`_U% zYc3QJ@Y}^__T0x{zPuDd?6h_4Ki1DVN7Ts?1vH&>hz8Jv!w@Im!&}`Vt!K_Rdpp3s z>8|E@8nL*$=?fV6n<)v0`2yO-q{8(MKlUC=>bPL6$!mY|s~U5d;T3>DxZU1$X-HNp zmX?mcOLTY5jOkJBv74OBg;Rm2YzL)w#Z{#^Y&Sf&y}sN&6~Dn81|xg*iCs*mz%Y5-1CWs-KZPV^Q!Bhhwx zK*D*QzCrW5^GWz?h>oC`S_|x6sG1^R4D<^xE|6cZyj>N!4lGztqp15#`%B7Y`I1%b z$~sJfBI9n~4WAHa`+ysBN$2&CvY!}ZVj4Ajn`|x=lOM>f%7svRt~)! zl`I7Du_L!3HG~Al@YKS4k$i`Dm9UXV>}W0v{_vO}BGraJE;?K)AV`x_3(J{bFdc`& z1M$ExNZv*Uw9g!E_vGcDhEb8tZkgm(r?>0M#b&i3t|^@~ndxtHW@1i$AD_Ij9r$KI zg|&$H2H5-`lPAW?-d7)*YcNjv$~%vDBEC*knQjC`zhYQZ!~iq`hLnWq_7 zQU-g=7WpZ`3_dc7-qjEBm)-Q@A@M*~Knw6$wgja5$84W_=-BfLn2Uu6`CSZmo59B% zl}ThkYFxsv^jsp`%;=7+A^2;ml0G47)|LWiF~_xGX3YXgsCRMF*atFxNsM1`T2Qo| z{0^+)l5uhR6xjg*dcNu@8|qNW?rn|*B3;&TA_&NUX5tJf+LQB7EcHfPXX&;Z1Cx}a zm$;;day;HFCy+Xvn(h?qKrqFp<7ns@F7qUcP5?>rBeHNw+S`g&g@(`F8;r+FK@#Y= zqAN^l;o$VQbX6t|z`At(oY-un55HY0XlggX#Ut|5C3qFwpwEwJWq!9H*lurod;ds7 zm_T*x%1m0R(bB2Te>ki0TMaK5lk=@3x#{ljKP7yXz3btNKN*I+JXW>->SJDtCB4Az z=(C6UeSYtsKffN`l&Qi*(v>DNW^M!XiIIuX4_3a&?k^*unr}jGWH9-aTeXMu`R*=xN|;d zN;h-vD+4S@M(h^%@F@!ZPqpf%g4;`ZG0F3Gh08!1Pcq#sCr85WAS=uM{K|{+wGTDM z>4$6@KAJnJEAB@T4k;lw@>j_hX=?OYk6E69OAJ{M^m_#RMI_(%<>`^#HSby7m`+MN zShDjxcc8gGH1p*0_i`Bp5fPEHPJF`;j05WV&nRQ3FXBcApGOn69u5i;KU6w*eP~HPuG-QS%qwWof!N0Ol7vx z6wiHp#?fScZF8wBHHu-BUFc=Xc5gkV9sq((8-+nZcgIJ7t1p_oCl$W(OuN&%upi}n zx7|L)T{~q%LP2R&TQl7Hb>uJC!&CQfg3G^{0L_{PLGSU(!C&SPVvF$2*bydyiwMXO= zjPD5W(d&P{K^^s8I+AyKJbY*VwJ)-@NH;CC@IYYg8#NF(OL>pmT_@Xsa`d*d%dxgw zpZu35qB-z+Rzl;W75wY#Ng5~Iudpq@-yB7fHe@92 z%->Tk-06|mN4=A{b||<;H?YPiD0j1!*9g0#zy5}JtO@~Axyjc_DeiJ7)DJ_F?0x_e zEBk(R<4r-AYGgjOxre*|x>~G7UWw?0u<;`mYn16RHb=jA#g%i|tUIS)*2GFB(=~a| z@e6rr{X{&9+x>nT`v2UJfcNZrr#i(5|Mc0jDcpk&iW3peO0pfVd^}s^We~v+P*9bJ zeuncJc~3T58=iUnuk(fdZ@t5F9ovR=?+5m0i3@jNrwV!#!poB8^G-f_61eeOe)F(@ z4S+j=?Y0p|cp(9>lYg=;ARAECmRT2>h_Z$a=fPxw&D?_oX7zO5izX>*h0+kTiM4Zx zUttel*FK7yf6(*A5U{p5m%}Z_9y;zuR4Hm*c#hreyd7QuuW$TJXLS5b%UxC_8-;+u z@rGLCkJXe;D(F?n`Ro>Yi{8*D8GXnIGjMF{u;_c=*T-L)#%VYpa&z`;RR4C#{)+#o ztf26I#v)IyvXW4%x_}Y!eEJ&o`@|5WsdYYrqwbRXa5IlsF8q z?iKr5b>BTeiF&VI>z%T7wR{~lpaSm{(Si>x*d05e1ZkFO_i?j?YN>Xenka^ zucqu*Xt|WUTUrA8neNW^m5ClNau^q#^Y!Y|oCgJ#vX}jT4WSVrvt_qg0y6-|y6E z%#M;|ku2`U9n_YwG*P>TnTTR*k#$-vuVG|J+$2p(Z2e&JtHX>U8*jEJL2Q-9HVWb` zf8Kw#^7pzFqsVL6H0SFNDsFbo0O}3)`4PF^Tp=;g2tJPlWdn0yD^c<0XFB(dvGd*^ zmm}a(xVGSXkJ7Hfy0G@yYxEh%5a6Gx2!s?1$ZPlQq0AhgZm@?SJjZ}fWTDOO{ics! z=GK!G=*aAmEWG))x6-QnH)5|}^20+6mw)$Ml>Zvkl8>7L_3LU|>BhK|0NWf|wse!f zv&ikP&1OG7V_Fh1@gXwoEjP6GpSg_n*g(>_eru09cM zU4Rw@@!f!NA;#;q?Y#F##d!@DFmWGfNE>bQHPrGQQ%WLur7|a&uklAk1SB|B4ZH&u zE!VNVIpsR<>D)~qBX|-Ly7&vuIwd;;K;Oc_ z5lBu8DR;|^g-k&C_x17GSv!-u9H{zXRw!egZPYGe-|ynj-a>lh(tZTeI5DB`g?ejP zByLK8sJMeB@q;4r04i1VWauY>7Zg#HlOxDl4rU5FpOsDW&flFpsgb;AYK(iZy|&%N z-ciHZfSN^$oTWHenxN7U@Sj%ak>ve+^0T^P zz3{9n$(7`V66z?L{Mk76+m%PIqd=ldx$41Xfp*Yd%+6+5`{h)R9K=hhU!u?yxqwgzR(+JLzr_5>cB{_9A{!e>9 z67nQ)0&LdHpd_$f);r9F+60#800>Uc38Hk*`rz z?LvewdhG|Gu5r(9PCd-`8Vs?Y=}@F}UWkHfg*RXCy-bWNtEBlW8nNvA8gY+q)WDo} z{c3<`>naNonpEViL1y>T@QINJU-mXR%rsAC?`8>gD!Uzamma#kxV9_dvKXX+ zq9`COjiMqdUD7H&lyq~jzyekfkOmPLTIm=V6$An4fsqF3&Y|P~oEdb#{l5RXuH}85 zIdkHdPu%zYbh$e*VPpctgm$6!@%FL&4yu0*M?1%{kEYrq6E74pyu|&`PTJ@5tW?lS zPA)kPs`0JSvH$z(N~$!zOT65&a=nk?yyHKiy`sO~=Ous+%oXx_N4d1Ld>hM|Oha8K zMilWz=R!7REjyFi`yTilN3BuH;T@jx!QH0ZUhI`~6`2vV&h?IIHe9eqhyVp(*dC$l z)%Jl&>74R>^^(GZz6`duVF^481(?{f_I-l?{ZQPP9%*xzljsFXr1`~ zoahw1R}!7BC-tu)!arH;7w8}w;7agXzE=cPwkvPY?^(n4BrcYn^=ys-4cET>Hi>Pc!Lw&Ps0nQ3I71^(Ms-}2Xl zVB*n{-H>N4tx9{bHhX9pvD2kt?_P2j-iESfb1rFE?41~|#X`xA3Htyy@Q5MRV_<(l zOQ1e;{@?LTeHqj&6Srp4*^#O@*_!?$rfw3IS~&(7!kLCfctg6+X60hvrjhmJ${3gG zh9{a)I2`WN?th;}sS1;uBD1y_$gZiZn!eJ^p5LN3DKZs^JI)T%SehN)5dp3Esp72@ z^6R~2O0xgnyLYGR?N_%Iru|&%es&&5(7_=6{vEVXSzkj7Q9l!krHc?CbU;Nn1Qi@o zKwH#}0A`UuLSmxN*+b+mkuEdNYB#bA$NAd_59~cb-W-m>a?9$m41qv6rS}MZx0}w( z!#uNCYQ{^jJClFrO~qT79vIo;ZyVA`StIy-5m9MuZ5Y4iG;UrWYe+tg{0F-`sN<*O ztKzhaWY?Om>ZF$}4jLn+y|Nh0>z#XP)S%SE8wi#(^78V9;cRTsr=T34wwP&rVUxe( zYU$((^E_mGMS1}%62o~7%;zuHV3jRY<&c=0L3Tn#b5qJPD{UsiOal^?Hq~|2DoF|~ zGAtBxgBCPWM7@5<1y`!pr7NkakcJDYU;Yt^F0ik;VdW^@y5|;5Iu$UHK--PTLV@GU z3cJuJiOatK^``vhg1!98ss&oxF%u^qO=%11lHmt${~k1cg>)!TrqOx05TtU=uuxpc zY<+%vJ*HD;bz4>jAvvAx?MT|MZ4zDL76Xr?>!UO~zptqDS*z}xHYG8~fpbuX;D8r- zuI`KL?8GU_l3OHJgOjI}Gth_oYdGg1-c^`1U^w6w}~u>+g>X@JQh5 z9n1xdrzih&{cJxwA9tvJlJn0iXvpAd7A!Ns5fLJg_Z{-9lW!|+_2$@8_r(W=)jP?C z{~>gl<>PCj7Ic3qvArWu_J6|l=REm|j%y9+Xp0ljg*Mlwr%tH@>X_~eBwvjD2kZA2 z+hW^;;rpl2Sd3oyMAnksB<|6CZCX+AxoOV|^5cRKH0Eh0ILZ$?yCMsu)bl zy@|z1v4yT2^KgFCXd&y)_ZuQ2f$t&W1qvrBCGKp=hfXQ9-m8sR!);~_)(Cp820$fK z@Rhq#*4O_4iOU4`BrJ*#>BtYb{_2ue*s)`|UjFLInM9ZAZqM-9ek34V!Zf2bT`vhH zS~3o&3q`Q1zunNRq+t;-YoMYQ^TMK_*$h44@XEz_aDw}>{w}cE&F)HMYnqQaD0rt|I_@O&rsV-_n5EcbT)g zB*85xCPP}_?_VfeIA&Lziiq6gFeG`2#x~&6a6Xx}g9T0qp?*lRH3(t`R8T1RH_aKmp(? zEI!4?TSOL$){B##)Jd-0#@Fqq!uHtN&C9Tyxc`HNX0m&0np9``=0Zg9QX4|$J@Y0c zd?LRPt^LMYvZ}#q(5fNod{sGj_-*82$0A4H9zN!0F@8I#=vZB9ug6|nNH^~Q7?8e% zy9>cstvuIURV&nTIDAKE4`_T-U z{VNLT`wAuD)9fix&M(&<()zjZ$yuAae#(XiI&ODuee*?`4@;((EU6`}&7RYO&13na zg4m=QNis`wUl1&Vv5C6eq1L5?QsHwX0wx&jww~*#1!ur8q??3;x&K-Iyerx*7#&Ul>D=954kx^*E1=J_i zkB#~n^F`#kFR|7}NEsL)66)8keP!*RpPwfo!d>r@RZAPHgHs(EPlqOd_<&Wg9~u~d zNS;lzX^cW(+r-AwtFbk~Xvu!r05<>u`AaOCIZn5#15aCB&Ed@fOu0`J=li31#Sa5dHGXyRbq!>lHhQ`i-&q2Nt^g!2Cg+d#fSVwA^H!?R zTAZ~A>hVxXe;8Q%VKAH(`pwdBza_d0T)m)r+19*#`ZLbF*@Rlk^*xxEoEA{MWp!@8 z3e$Q)>n$EU25V|8*dpQFlibGIG$h#)(6|PFD<+e*y zRDF>8+ofIJ6Rr^m(ri#n+v9tDo@qU6l-SrGP@Vh4)nw=bC3>_*XH6!~1k2WvACTy| zmWz5(M3!b$M==>uEmi7~ETIl4xwv^cpd)2f$FmN(OW*ymk~w`EzgA%p4WdS)>B0u8 zHJi#e1OndZxitB=pK zT66NdL^|j>(^qL%sC(ij>b=@@TIWxdEO`}nMMp@WuI6+p|79q`DOn#3n*I=2MYBaq z*p5jjiKTTHq+D=c=sH>@oe6pniYdfYKv_`?Bx9JyXe#mfS4qUkY}0y#R~NtYX^kMO z=)#?n#j#sAZ!b)`-B5vmpaV%=^XM3UbJ0C23+@grX#iCmk`3_joLdWw7w_1)N!6?4 zq-OfyE4q(hFMooT(5u6Ju%Nt8|#g235k}$BTbDlr{=e;X%s+w^{fE0wh z)md|)YEKC=*R;&(d|>{Jh=?4mlnXvi5<;-KruE(0iQ+jAzQw$L9e1QsiUU-};^%!> zq}0v?o$Iwf{P$rDY~Q}(9LyQEPEH}wY)h}watpdT!%U;Cv6Jnj(7E|Pe>M7p`!Ajc zw`q~;*=PnhYnR9(me}-XHsv){RkODcbd}-+5&SgEMukg5(`%Bcs)x z_2#7kw)q$xiyVtiDNwEnhQ!iYcyi{V(F@EOvn+(QDw7 zKCChcsv6xeR5azyC-aee2_C6W_Y6IY_QVL3LPtt%tiSYHT?zfPYc(c4g1Fbg3!cd5 zU2Loperq;KwidFrfiHPd<~vOzZHq!O?~E$1Z3IX;v?UxNx=tZaWHuKnpgP59Qmd$} zwl)%udV4b>QFSTPm+5JUmrk9M;fN8(DQJZo2`MZ15AQtyicOB;WTVFW!96>zfyvFB z3>7DTuoR_xude&Mz(en|u^+AtD(joUk|vvVjvX6yjCO~LZa(cz2{q&5(+|I#*!pm< zlDNG1ac`FPh09^{N?-aIV=h{nr6bmI?y(~ySkWjHyhJ5^iNCM}pXn5QWDmuaS1+F? zyDBqz4x@ZB={7y#lWrbop+cZK1mde{f2dp5M@v9GEe(+TGicrCyAI`JXKqDH*SntW zd*Byv>E}ND0Q4AaV}BLsat{u@!r;0Ks4Q+h^6Yx#80eYP~sk``&q{YpLmimGk8Uf_uVt88DceCLdp6!a^+wNUMJoo4 zWXUN|g>qqXQ{s$`jE-WUHsfv6NH6V~GQyRDVcNaA6sM9=GU#;c_|g3A3lx7c`Fk8W zMt~5mjkj`9=Yme)9;q8#Pu({ke4+@6$M*5Jy%PJ$_I;3(mg47dQo>5DMb6XK*xG0b zj$LvXj?Q`Cof(vdppN13bFp^5w%raCANPZkQD*du=g()cT>4pRVonnWmEVQ$|J@Xj z%`P*|I_<*JZ`VNy-M@Z8b`hVT%M-Q4)SZCvj>%TYzGlpK8XFH**YnIQ8|JSq?ak|p zmSTQDA)=ct-&UU0uPpfL?gTBki-yvL?xDIKadC^?YxKFc{fVNr?%gX#QY@CDgAxCc zHXSJDnAseOs8gP0BB}+$OMn!V3?-iC9nLSy;l|R>C-UE?DuKNk3-uUTb6*@NzTV@K z4Uh{9!Qp`_wCdzF)?8HuNja$Ooa_i=i~N!kdUhx*z;!;PcQ1J�uRH#L?JBP{O=O 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 diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index d36e67e6..da4f15e0 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -500,7 +500,7 @@ def hysteresis_window(composition: str = 'CO2') -> list[dict]: """Show the previous label deciding the verdict inside the window.""" print('\n=== Evolutionary use: the hysteresis window ===') out = [] - for f_xuv in (0.747, 0.793): + for f_xuv in (0.72, 0.78): for previous in (None, 'hydrostatic', 'hydrodynamic:EL'): state = build_state(composition, 1.0, 1.0, f_xuv) state.prev_regime = previous diff --git a/tests/test_examples.py b/tests/test_examples.py index 0ebe7ef3..0fdf5ee0 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -14,8 +14,11 @@ from __future__ import annotations +import contextlib import importlib.util +import io import math +import re from pathlib import Path from unittest.mock import patch @@ -197,3 +200,47 @@ def test_dispatcher_example_track_changes_regime_as_the_star_quiets(): tail = [row['mdot'] for row in rows if row['regime'] == 'hydrostatic'] assert tail[-1] == pytest.approx(tail[0], rel=1e-12, abs=0.0) assert all(math.isfinite(row['mdot']) for row in rows) + + +TUTORIAL = Path(__file__).resolve().parents[1] / 'docs' / 'Tutorials' / 'dispatch.md' + + +def _tutorial_blocks(): + """Every python fence in the dispatcher tutorial with the output it quotes.""" + text = TUTORIAL.read_text() + pattern = re.compile(r'```python\n(.*?)```(.*?)(?=```python|\Z)', re.S) + for index, (code, after) in enumerate(pattern.findall(text), start=1): + quoted = re.search(r'```text\n(.*?)```', after, re.S) + yield index, code, (quoted.group(1).rstrip('\n') if quoted else None) + + +@pytest.mark.smoke +def test_tutorial_snippets_print_what_the_page_quotes(): + """Every tutorial snippet runs in order and prints its quoted output. + + The page states that every printed number is the verbatim output of a + snippet the reader can run, which is a claim about the documentation that + only a test can hold. The snippets share one namespace and run in the + order they appear, as a reader would execute them, and each quoted output + block must match what the preceding snippet printed, character for + character. This is the guard against the drift that has to be repaired by + hand otherwise: a coefficient change three modules away moves a number + here, and nothing else notices. + """ + namespace: dict = {} + compared = 0 + for index, code, quoted in _tutorial_blocks(): + buffer = io.StringIO() + with contextlib.redirect_stdout(buffer): + exec(compile(code, f'', 'exec'), namespace) + printed = buffer.getvalue().rstrip('\n') + if quoted is None: + continue + assert printed == quoted, ( + f'tutorial block {index} prints something other than the page quotes:\n' + f'--- page ---\n{quoted}\n--- code ---\n{printed}' + ) + compared += 1 + # Guard against the extraction silently finding nothing, which would make + # the assertions above vacuous. + assert compared >= 15, f'only {compared} tutorial output blocks were compared' From 933f8256dfa1aaf1feb5b7a59fde421e7e6524ba Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 17:56:14 +0200 Subject: [PATCH 068/113] Let the module marker set the tutorial test's tier The new test carried its own tier marker beside the module-level one, which the structure validator rejects: exactly one tier per test, and the module already declares smoke. --- tests/test_examples.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_examples.py b/tests/test_examples.py index 0fdf5ee0..e469d57a 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -214,7 +214,6 @@ def _tutorial_blocks(): yield index, code, (quoted.group(1).rstrip('\n') if quoted else None) -@pytest.mark.smoke def test_tutorial_snippets_print_what_the_page_quotes(): """Every tutorial snippet runs in order and prints its quoted output. From 13fe11fd442ada4c6ba298c863bbc1b559b8fce6 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:09:23 +0200 Subject: [PATCH 069/113] Put the repository root on the path for the tutorial test The tutorial's opening snippet imports the worked example by its path from the repository root, which is what a reader with a clone would type, and that resolves only with the root on sys.path. Whether it is there depends on how pytest was started: running it as a module puts the working directory on the path and the console script does not, so the test passed locally and failed in CI. It now prepends the root itself. --- tests/test_examples.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/test_examples.py b/tests/test_examples.py index e469d57a..5257e7ef 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -214,7 +214,7 @@ def _tutorial_blocks(): yield index, code, (quoted.group(1).rstrip('\n') if quoted else None) -def test_tutorial_snippets_print_what_the_page_quotes(): +def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): """Every tutorial snippet runs in order and prints its quoted output. The page states that every printed number is the verbatim output of a @@ -226,6 +226,14 @@ def test_tutorial_snippets_print_what_the_page_quotes(): hand otherwise: a coefficient change three modules away moves a number here, and nothing else notices. """ + # The page's first snippet imports the worked example by its path from the + # repository root, which is what a reader running from a clone would type. + # That resolves only with the root on sys.path, and whether it is there + # depends on how pytest was started: `python -m pytest` puts the working + # directory there and the console script does not, so CI and a local run + # disagreed. Prepending it here makes the test independent of the + # invocation, and monkeypatch undoes it afterwards. + monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[1])) namespace: dict = {} compared = 0 for index, code, quoted in _tutorial_blocks(): From e8665d685fca1e13d4944c4313bedce7ec7b71e3 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:17:00 +0200 Subject: [PATCH 070/113] Run the tutorial's stellar track in the tier that has its data The snippet test executed the whole page, and the page closes on a track dispatched along a real MORS stellar history, which reads the Spada grid under FWL_DATA. The unit and smoke tier does not download that grid, so the test could not pass on a fresh runner however it was invoked. That block now runs in the integration tier beside the other test that uses the real tracks, with the same character-for-character comparison, and the fast tier covers the other eighteen output blocks. The block is excluded by name rather than by whether the data happens to be present, so both tiers check the same thing on every machine, and the fast tier is verified against an empty data root. --- tests/test_examples.py | 31 ++++++++++++++++--- tests/test_tutorial_track.py | 59 ++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 tests/test_tutorial_track.py diff --git a/tests/test_examples.py b/tests/test_examples.py index 5257e7ef..bb04e3e9 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -205,13 +205,31 @@ def test_dispatcher_example_track_changes_regime_as_the_star_quiets(): TUTORIAL = Path(__file__).resolve().parents[1] / 'docs' / 'Tutorials' / 'dispatch.md' -def _tutorial_blocks(): - """Every python fence in the dispatcher tutorial with the output it quotes.""" +# The one snippet that reads the real stellar evolution tracks. Executing it +# needs the Spada grid under FWL_DATA, which the unit and smoke tier does not +# download, so this tier runs every other block and the integration tier runs +# the whole page. Excluding it by name rather than by whether the data happens +# to be present keeps the two tiers checking the same thing everywhere. +TUTORIAL_DATA_DEPENDENT = 'stellar_track(' + + +def _tutorial_blocks(skip_data_dependent=True): + """Every python fence in the dispatcher tutorial with the output it quotes. + + Yields ``(index, code, quoted_or_None)``, with ``code`` None for a block + the caller should not run. The stellar-track block is the last on the + page and nothing after it reads its results, so skipping it leaves the + shared namespace usable for every earlier block. + """ text = TUTORIAL.read_text() pattern = re.compile(r'```python\n(.*?)```(.*?)(?=```python|\Z)', re.S) for index, (code, after) in enumerate(pattern.findall(text), start=1): quoted = re.search(r'```text\n(.*?)```', after, re.S) - yield index, code, (quoted.group(1).rstrip('\n') if quoted else None) + expected = quoted.group(1).rstrip('\n') if quoted else None + if skip_data_dependent and TUTORIAL_DATA_DEPENDENT in code: + yield index, None, None + continue + yield index, code, expected def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): @@ -237,6 +255,8 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): namespace: dict = {} compared = 0 for index, code, quoted in _tutorial_blocks(): + if code is None: + continue buffer = io.StringIO() with contextlib.redirect_stdout(buffer): exec(compile(code, f'', 'exec'), namespace) @@ -249,5 +269,6 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): ) compared += 1 # Guard against the extraction silently finding nothing, which would make - # the assertions above vacuous. - assert compared >= 15, f'only {compared} tutorial output blocks were compared' + # the assertions above vacuous. Eighteen of the nineteen output blocks are + # comparable here; the stellar track is the integration tier's. + assert compared >= 17, f'only {compared} tutorial output blocks were compared' diff --git a/tests/test_tutorial_track.py b/tests/test_tutorial_track.py new file mode 100644 index 00000000..a3c06f7f --- /dev/null +++ b/tests/test_tutorial_track.py @@ -0,0 +1,59 @@ +"""Integration test for the tutorial's stellar-history section. + +The dispatcher tutorial closes on a track dispatched along a real MORS +stellar history, which reads the Spada grid under ``FWL_DATA``. The unit and +smoke tier does not download that data, so the snippet is executed here +instead, where the nightly workflow has it: the same character-for-character +comparison the smoke tier applies to the other eighteen output blocks, on the +one block it cannot run. + +The invariant under test: + +- Documentation fidelity: the page states that every printed number is the + verbatim output of a snippet the reader can run, and the track's numbers + come from the real stellar lookup rather than a mock, so only a run with the + reference data present can hold that claim for them. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +from __future__ import annotations + +import contextlib +import io +from pathlib import Path + +import pytest + +# The tests directory is not a package, so pytest puts it on the path and +# a sibling module imports by its bare name. +from test_examples import TUTORIAL_DATA_DEPENDENT, _tutorial_blocks + +pytestmark = [pytest.mark.integration, pytest.mark.timeout(300)] + + +def test_tutorial_stellar_track_prints_what_the_page_quotes(monkeypatch): + """The track snippet reproduces its quoted output on the real tracks. + + Runs the whole page in order so the track inherits the namespace the + earlier snippets build, then compares the track block's output against + the page. The smoke tier covers the other blocks; this one exists because + the stellar lookup needs reference data that tier does not fetch, and + mocking the lookup would compare against numbers the page does not quote. + """ + monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[1])) + namespace: dict = {} + compared = 0 + for index, code, quoted in _tutorial_blocks(skip_data_dependent=False): + buffer = io.StringIO() + with contextlib.redirect_stdout(buffer): + exec(compile(code, f'', 'exec'), namespace) + if quoted is None or TUTORIAL_DATA_DEPENDENT not in code: + continue + printed = buffer.getvalue().rstrip('\n') + assert printed == quoted, ( + f'tutorial block {index} prints something other than the page quotes:\n' + f'--- page ---\n{quoted}\n--- code ---\n{printed}' + ) + compared += 1 + assert compared == 1, f'expected one data-dependent block, compared {compared}' From 131cfac99e89d3b2fb76ab5296817fe9cbb5bc95 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:33:00 +0200 Subject: [PATCH 071/113] Say what the pages actually describe Twelve accuracy corrections, each checked against the code or the arithmetic. The wind-base clamp does not depend on a single profile top: the Lopez level is tens of nanobars on an Earth-mass carbon dioxide planet and below a nanobar on a low-gravity hydrogen envelope, where a profile stopping at a nanobar misses it, so both pages that promised one number now say to read the flag. The tidal setting divides the interior-luminosity cap as well as the energy-limited rate. The diagnostics API page was missing the function behind a documented group. The floor illustration said 66 grams a year where two nanograms a second gives 63. The README still described the tidal domain from before the reference radius followed the scaling. The bolometric instellation is carried and validated but no branch reads it, which the parameter table now discloses. The hysteresis flag says the window was available, not that it changed anything. The self-consistency span is 65 to 767 Myr, not 40 to 800. The boil-off label does not test whether the atmosphere is inflated past its sonic radius. And the evaluation order listed the Roche screen before the bolometric residual in both the page and the module comments, while the code runs the residual first, which matters because the radius the screen tests belongs to whichever branch actually won. The hydrostatic section also called an effusion velocity a flux, used an undefined flux symbol in the harmonic mean, and left the base density and its mean-mass convention unstated; all four are now written out. --- README.md | 2 +- docs/Explanations/regimes.md | 10 +++++----- docs/How-to/troubleshooting.md | 2 +- docs/Reference/api/diagnostics.md | 1 + docs/Reference/parameters.md | 6 +++--- docs/Reference/results.md | 4 ++-- docs/Tutorials/dispatch.md | 8 +++++--- src/zephyrus/dispatcher.py | 4 ++-- 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 4aaa5df2..9a0724ad 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Named after Zephyrus, the Greek god of the west wind and a messenger of spring. ## Escape model -Energy-limited (EL) escape: the deposited XUV power divided by the gravitational binding energy of the escaping gas, with an optional tidal enhancement `K_tide`. The XUV cross section scales as `Rp * Rxuv**2` (default) or `Rxuv**3`, and the tidal factor applies only outside the Roche lobe (`R_Hill / R_XUV > 1`). +Energy-limited (EL) escape: the deposited XUV power divided by the gravitational binding energy of the escaping gas, with an optional tidal enhancement `K_tide`. The XUV cross section scales as `Rp * Rxuv**2` (default) or `Rxuv**3`, and the tidal factor applies only outside the Roche lobe, measured from whichever radius the scaling selects: `R_Hill / Rp > 1` for the default `Rp * Rxuv**2` form and `R_Hill / Rxuv > 1` for `Rxuv**3`. ## Documentation diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 2a88b98a..5cbc4bd3 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -10,8 +10,8 @@ One call takes one planetary state and returns one verdict. The inputs are the p 2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. 4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. -5. Before the label is finalized, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. -6. The final rate is the larger of the surviving branch rate and the luminosity-capped bolometric residual, labeled by the winner. +5. The bolometric residual stays a candidate past the activation gate, capped by the interior luminosity, and takes the rate and the label if it beats whichever branch won above. +6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after the residual comparison, so the radius it tests belongs to the branch that actually won. ```mermaid flowchart TD @@ -81,7 +81,7 @@ Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces $$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{5}$$ -with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition (carrying its $T^{-0.9}$ temperature dependence) and $R_\mathrm{base}$ the base radius. An isothermal wind then carries that density to the sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ with the barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$, where $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ is the Jeans parameter at the base, giving +with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition (carrying its $T^{-0.9}$ temperature dependence), $h\nu_0$ the representative ionizing photon energy of the front the composition selects, and $R_\mathrm{base}$ the base radius. The mass density that follows is $\rho_\mathrm{base} = n_+\, \mu_+\, m_\mathrm{p}$, with $\mu_+$ the mean mass per ion of the ionized wind in atomic mass units: electrons counted among the particles and the heavies singly ionized, so the mass per particle is half the mean atomic mass and the mass per ion is the mean atomic mass itself. An isothermal wind then carries that density to the sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ with the barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$, where $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ is the Jeans parameter at the base, giving $$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ @@ -103,11 +103,11 @@ A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the win Where no wind exists, escape proceeds particle by particle from the exobase, the level where the mean free path first reaches the local scale height. All exobase quantities are evaluated on an extended upper structure: a Bates temperature profile $T(\zeta) = T_\mathrm{exo} - (T_\mathrm{exo} - T_\mathrm{top})\, e^{-\gamma_\mathrm{B} \zeta}$ integrated hydrostatically above the supplied profile top (in $\zeta = \ln(p_\mathrm{top}/p)$, shape parameter $\gamma_\mathrm{B}$; the form Yelle 2024 uses [^yelle]), with the exobase temperature $T_\mathrm{exo}$ prescribed by the caller. Extending the structure is not a refinement but a requirement: the Jeans parameter at the true exobase can differ from its photospheric value by an order of magnitude, and evaluating the escape on photospheric values biases rates toward false retention by up to three orders of magnitude (Johnson et al. 2013 [^johnson]). The prescribed $T_\mathrm{exo}$ (default 1000 K) is the branch's dominant sensitivity, because the rate depends on it exponentially; an optional estimator balances local heating against cooling at the profile top, but a conduction-free local balance is biased high by construction and is deliberately not the default. -Each species $i$ escapes with the Jeans effusion flux at the exobase (radius $R_\mathrm{exo}$, temperature $T_\mathrm{exo}$), +Each species $i$ leaves the exobase (radius $R_\mathrm{exo}$, temperature $T_\mathrm{exo}$) with the Jeans effusion velocity $$w_{\mathrm{J},i} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p} m_i}{k_\mathrm{B} T_\mathrm{exo}\, R_\mathrm{exo}} \tag{8}$$ -where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter, multiplied by the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi = \Phi_\mathrm{J}\,\Phi_\mathrm{l} / (\Phi_\mathrm{J} + \Phi_\mathrm{l})$, their Eq. 14. The dominant species supplies itself and takes the Jeans flux alone. +where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter. The effusion flux is that velocity times the species number density at the exobase, referred back to the anchor radius by the ratio of the two areas, $\Phi_{\mathrm{J},i} = (R_\mathrm{exo}/R_0)^2\, C(\lambda_i)\, w_{\mathrm{J},i}\, X_i\, n_\mathrm{exo}$ (Yelle 2024 Eq. 15), with $X_i$ the diffusively adjusted mixing ratio at the exobase and $R_0$ the profile top the structure was extended from. It carries the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi_i = \Phi_{\mathrm{J},i}\,\Phi_{\mathrm{l},i} / (\Phi_{\mathrm{J},i} + \Phi_{\mathrm{l},i})$, their Eq. 14, which lies below both of its arguments. The dominant species supplies itself and takes the Jeans flux alone. Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} R_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the non-thermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 322d0ab4..a307ff4d 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -64,7 +64,7 @@ The flux scaling will not separate them either: the base ion density follows $\s **Cause.** The profile does not extend to the pressure where XUV photons are absorbed, near a nanobar. An isothermal hydrogen envelope, in particular, becomes unbound and truncates well below that. -**What to do.** For a production profile, set the top pressure below 1 nanobar and the clamp never engages. Otherwise decide by branch: on `boiloff` the clamp is harmless, because that branch launches from the photospheric level. On a hydrodynamic verdict it is not, because the base density sets the sonic-point density and therefore the collisionality switch itself, so a clamped base moves the boundary. The `base_out_of_range = 'extend'` setting evaluates the base on the extended upper structure instead; `base_extension_truncated` means even that did not reach it. +**What to do.** The base level is $\mu g / \sigma_{\nu_0}$, so where it sits depends on the state: tens of nanobars on an Earth-mass carbon dioxide planet, and below a nanobar on a low-gravity hydrogen envelope, where a profile stopping at a nanobar still misses it. Extend the profile past the `p_physical` the diagnostics report for the state at hand rather than trusting one number for all of them. Otherwise decide by branch: on `boiloff` the clamp is harmless, because that branch launches from the photospheric level. On a hydrodynamic verdict it is not, because the base density sets the sonic-point density and therefore the collisionality switch itself, so a clamped base moves the boundary. The `base_out_of_range = 'extend'` setting evaluates the base on the extended upper structure instead; `base_extension_truncated` means even that did not reach it. ## `roche_overflow` on a state that should not be overflowing diff --git a/docs/Reference/api/diagnostics.md b/docs/Reference/api/diagnostics.md index 18e3e47f..15d4e975 100644 --- a/docs/Reference/api/diagnostics.md +++ b/docs/Reference/api/diagnostics.md @@ -9,4 +9,5 @@ - along_profile_fluid_check - self_consistency_screen - potential_screens + - rate_floor_screen show_source: true diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 909eb6bd..d2040d0b 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -98,7 +98,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | Name | Default | Options / units | Meaning | |---|---|---|---| | `base_method` | `'lopez'` | `'lopez'`, `'fixed_pressure'`, `'boreas'` | How the XUV wind base is located on the profile. The Lopez (2017) level is $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar; `'boreas'` uses the optional BOREAS solver and falls back to `'lopez'` with a flag when it is absent or does not converge. | -| `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | What happens when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Profiles reaching below 1 nanobar never engage it. | +| `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | What happens when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Whether it engages depends on the state: the Lopez base is $\mu g / \sigma_{\nu_0}$, tens of nanobars on an Earth-mass carbon dioxide planet but below a nanobar on a low-gravity hydrogen envelope, so no single profile top clears it everywhere. Read `base_clamped` rather than assuming. | | `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023). | | `P_base_fixed` | 5.0 | Pa | Base pressure for the `'fixed_pressure'` method only. | | `kn_crit` | 1.0 | $> 0$ | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | @@ -113,7 +113,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_o_finestructure` | `True` | `True`, `False` | Atomic O fine-structure cooling at 63 and 147 micron. | | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | -| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor to the energy-limited candidate. | +| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so both candidates measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | @@ -129,7 +129,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `M_p`, `R_p` | kg, m | Planet (interior) mass and radius. | | `M_star`, `a`, `e` | kg, m, dimensionless | Stellar mass, semi-major axis, eccentricity (the Hill radius is evaluated at periapsis). | | `T_eq` | K | Equilibrium temperature; the boil-off wind runs at $T_\mathrm{eq} / 2^{1/4}$. | -| `F_xuv`, `F_bol`, `F_int` | W m⁻² | XUV flux, bolometric instellation, and interior heat flux (the luminosity cap). | +| `F_xuv`, `F_bol`, `F_int` | W m⁻² | XUV flux, bolometric instellation, and interior heat flux (the luminosity cap). `F_bol` is validated and carried with the state but no branch reads it: the bolometric branch takes its temperature from `T_eq`. It is required so that a caller assembling a state cannot omit it and then find a later version silently reading zero. | | `kappa_photo` | m² kg⁻¹ | Photospheric opacity; the boil-off rate scales as its inverse. | | `profile` | not applicable | `profiles.Profile`: pressure, radius, temperature, per-species mixing ratios, and mean molecular mass per level, base to top. | | `settings` | not applicable | The `DispatchSettings` block above. | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 30cad6e9..d7f1657b 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -22,7 +22,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | Label | Physics | Rate | |---|---|---| -| `boiloff` | Bolometrically driven outflow from an atmosphere inflated beyond its own sonic radius. | Closed-form transonic Parker wind, Bondi-capped, and luminosity-capped past the activation gate. | +| `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped, and luminosity-capped past the activation gate. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | @@ -62,7 +62,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `bolometric_residual` | `True` | The luminosity-capped bolometric residual beat the XUV branch and took the label. | The rate reflects it | | `gate_rerouted` | `True` | The exobase was too hot to stay hydrostatic, so the state was routed back to the hydrodynamic rate. | The rate reflects it | | `contested_ion` | `True` | The neutral and plasma escape-temperature conventions disagree about the branch. Both rates are recorded in `diagnostics['contested_ion']`. | Reporting only | -| `hysteresis_active` | `True` | A previous regime label was supplied, so the hysteresis window was applied to the collisionality threshold. | The rate reflects it | +| `hysteresis_active` | `True` | A previous regime label was supplied, so the hysteresis window was available. It says the memory was offered, not that it changed anything: read `diagnostics['knudsen']['threshold_applied']` against `kn_crit` to see whether the window actually moved the threshold on this call. | The rate reflects it | ### The hydrostatic branch diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 3065776a..28f78456 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -220,7 +220,7 @@ Two things in that figure deserve attention. - One proton crossing the surface per year, $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate that can mean anything. Below it, report no escape. The module computes what the physics gives and leaves the convention to you, but it does hand you the comparison: `diagnostics['rate_floor']['above_floor']` is false on both of these points. - Above that floor, ask whether the rate matters, by comparing it against the inventory and the age. The diagnostics already do this: `diagnostics['self_consistency']` divides the reservoirs by the rate and compares against the age you supplied. -A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing $2 \times 10^{-9}$ kg s⁻¹ loses 66 grams a year. +A rate can clear the floor by a hundred decades and still be irrelevant. A Mars-mass planet losing $2 \times 10^{-9}$ kg s⁻¹ loses 63 grams a year. --- @@ -279,7 +279,7 @@ The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, ## Step 5: read the diagnostics -A call returns seventeen or eighteen diagnostic groups, depending on which branch ran, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns seventeen or eighteen diagnostic groups, the eighteenth appearing when a hydrodynamic branch produced the rate and its species split, or when the two escape-temperature conventions disagree, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. Every snippet in this step uses the same result: @@ -581,7 +581,9 @@ What escapes changes with the branch, which is the lower panel. In the wind phas The hydrostatic rate is flat, at $4.695 \times 10^{-2}$ kg s⁻¹ for ten billion years, because that branch has no XUV physics in it: a prescribed exobase temperature, a frozen profile, and a diffusion-limited supply that does not know about the star. The flat line is a visible reminder of what the branch does not model. It is also why hydrostatic heavy-element rates carry a lower-limit flag: the nonthermal channels that actually remove heavy species from a real exosphere are absent. -And the consistency screen fires in the middle of the track, not at the ends, which is the shaded span. Between about 40 and 800 Myr the dispatched rate would have emptied the supplied inventory faster than the star aged, so those snapshots are not compatible with their own ages. After the crossing the screen goes quiet again, but read that carefully: the state became consistent because escape effectively stopped, not because the inventory survived. +One property of this track is worth stating before you read it as a set of independent snapshots: it is not one. Each call is given the previous label, which is what a time-stepping run does and what makes the hysteresis window useful, so a label inside the window depends on the sample before it and therefore on the sampling. The crossing age quoted below is the crossing of this sampling, not a property of the planet alone; on the switch itself the window is 0.667 to 1.5 wide in the Knudsen number, so the ambiguity is confined to that band. + +And the consistency screen fires in the middle of the track, not at the ends, which is the shaded span. Between 65 and 767 Myr the dispatched rate would have emptied the supplied inventory faster than the star aged, so those snapshots are not compatible with their own ages. After the crossing the screen goes quiet again, but read that carefully: the state became consistent because escape effectively stopped, not because the inventory survived. --- diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index dd36f777..ad953781 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -443,7 +443,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: per_species = dict(hs_per_element) flags.update(hs_flags) flow_radius = hsd['r_exo'] - # Step 6: the bolometric residual stays a candidate past the gate. + # Step 5: the bolometric residual stays a candidate past the gate. if bolo_rate > rate: branch = 'boiloff' rate = bolo_rate @@ -456,7 +456,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: flags.pop(key, None) label = branch - # Step 5: the Roche screen on the active flow radius. The screen renames + # Step 6: the Roche screen on the active flow radius. The screen renames # the state and never touches the rate. Its boundary is a rate # comparison, since the branch whose flow radius gets tested is the one # that won step 6, so reporting the winning branch's own rate keeps the From 060a6674838fddd1faed03ca6be17733223f89eb Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:34:21 +0200 Subject: [PATCH 072/113] Correct five citation details MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The accent is restored on Chassefière, in the module, its tests, and two pages. The Caldiroli threshold potential is quoted on the untidal binding energy, which is the convention the screen uses and the one Salz share; the tidal factor enters the rate and not the potential the threshold is measured against. The interior-luminosity cap is their Eq. 8, the update equation that carries the minimum against the cooling luminosity, not Eq. 9, which is the period distribution of their population model. The upper edge of the Knudsen band is not Johnson's number: their simulations give 0.1 and 1, and the 3 comes from Chatterjee and Pierrehumbert arguing the energy limit may survive that far, so the band is asymmetric in what supports it and the page now says which end rests on what. And the activation parameter is written with the composition mean molecular mass where Fossati write the atomic hydrogen mass, a factor mu over m_H between the two, which is now stated where the equation is given rather than left for a reader to discover by comparing numbers. --- docs/Explanations/energy_limited.md | 2 +- docs/Explanations/fractionation.md | 4 ++-- docs/Explanations/regimes.md | 4 ++-- docs/Validation/boiloff.md | 2 +- docs/Validation/fractionation.md | 2 +- src/zephyrus/boiloff.py | 2 +- src/zephyrus/fractionation.py | 2 +- tests/test_fractionation.py | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md index f7e20539..f8e40b31 100644 --- a/docs/Explanations/energy_limited.md +++ b/docs/Explanations/energy_limited.md @@ -6,7 +6,7 @@ The physical idea is an energy budget. The stellar X-ray and extreme-ultraviolet $$\dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}}{G\,M_\mathrm{p}\,K_\mathrm{tide}} \tag{1}$$ -where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} K_\mathrm{tide} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. +where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The threshold is on the untidal specific binding energy, which is the convention the screen in the diagnostics uses and the one Salz et al. (2016) share; the tidal factor enters the rate, not the potential the threshold is quoted against. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. Two radii enter the problem, and keeping them apart matters. $R_\mathrm{p}$ is the planetary (interior) radius. $R_\mathrm{XUV}$ is the radius at which the atmosphere becomes optically thick to XUV photons; in PROTEUS it is recomputed at each time step from the atmospheric structure at a configured reference pressure, by default 20 mbar following the photosphere-type level of Baumeister et al. (2023) [^baumeister]. That level is a bookkeeping radius for the intercepting area: the XUV heating is actually deposited, and the wind launched, at the far lower pressure (of order a nanobar) where the gas first reaches unit optical depth to ionizing photons [^lopez2017]; the [escape-regime framework](regimes.md) locates that launching level on the profile when it needs it. diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index ae6303e7..eb069734 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -14,7 +14,7 @@ where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the unique partition into escaping and retained species for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate at machine precision. -The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim et al. (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefiere (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. +The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim et al. (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefière (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. ## Coefficients and their provenance @@ -54,4 +54,4 @@ The split follows the branch and not the label, which matters under `roche_overf [^odert]: Odert, P., et al. (2018). Escape and fractionation of volatiles and noble gases from Mars-sized planetary embryos and growing protoplanets. *Icarus, 307*, 327–346. -[^chassefiere]: Chassefiere, E. (1996). Hydrodynamic Escape of Oxygen from Primitive Atmospheres: Applications to the Cases of Venus and Mars. *Icarus, 124*, 537–552. +[^chassefiere]: Chassefière, E. (1996). Hydrodynamic Escape of Oxygen from Primitive Atmospheres: Applications to the Cases of Venus and Mars. *Icarus, 124*, 537–552. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 5cbc4bd3..fd84ffe3 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -51,7 +51,7 @@ A freshly formed or strongly heated planet can hold an atmosphere so distended t $$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{p}} \tag{1}$$ -the ratio of a particle's gravitational binding energy at the surface to its thermal energy, built with the mean molecular mass $\mu$ of the atmosphere at the photospheric level and the Boltzmann constant $k_\mathrm{B}$. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{p}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find at $R_\mathrm{p}/R_\mathrm{B} = 0.1$ is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. +the ratio of a particle's gravitational binding energy at the surface to its thermal energy, built with the mean molecular mass $\mu$ of the atmosphere at the photospheric level and the Boltzmann constant $k_\mathrm{B}$. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{p}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find at $R_\mathrm{p}/R_\mathrm{B} = 0.1$ is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): @@ -97,7 +97,7 @@ where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density One property of the criterion is worth stating plainly, because it is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. -A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3: kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the band is heating-geometry physics rather than tuning freedom, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. +A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3. The two ends come from different arguments. Kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the lower part of the band is heating-geometry physics rather than tuning freedom. The upper edge is not Johnson's number: Chatterjee & Pierrehumbert (2026) [^cp26] argue the energy limit may survive to a sonic Knudsen number of 1 to 3 or beyond, citing that same work, and call how far it survives an unresolved question. So the band is asymmetric in what supports it, and and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. ## Hydrostatic escape diff --git a/docs/Validation/boiloff.md b/docs/Validation/boiloff.md index 1991439b..a9cf76dd 100644 --- a/docs/Validation/boiloff.md +++ b/docs/Validation/boiloff.md @@ -10,7 +10,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the boil- ## Notes -The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 9), whose barrier carries the Erkaev tidal factor at xi = R_Hill / R_p so that the cap and the energy-limited rate it competes against measure the same barrier; the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. +The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 8), whose barrier carries the Erkaev tidal factor at xi = R_Hill / R_p so that the cap and the energy-limited rate it competes against measure the same barrier; the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. ## Anchor type diff --git a/docs/Validation/fractionation.md b/docs/Validation/fractionation.md index ca0ddbd9..6b6840a8 100644 --- a/docs/Validation/fractionation.md +++ b/docs/Validation/fractionation.md @@ -8,7 +8,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the N-spe | `tests/test_fractionation.py::test_two_majors_trace_minor_relations` | Odert et al. (2018), Icarus 307, 327, Eq. 5; Zahnle et al. (1990), Icarus 84, 502, Eqs. 35 and 36; Zahnle & Kasting (1986), Icarus 68, 462, Eq. 36 | Entrained trace minors follow the Odert relation (equal to Zahnle et al. Eq. 35) to $10^{-11}$ relative, the closure clamps exactly to zero where the printed formula goes negative, the limiting flux follows Zahnle et al. Eq. 36, and the earlier 1986 drag-deficit weighting is demonstrably NOT reproduced (the adjudication between the two printed variants). | | `tests/test_fractionation.py::test_first_entrainment_with_two_retained_heavies` | Zahnle et al. (1990), Icarus 84, 502, Eq. 42 | The first-entrainment threshold with two retained heavy backgrounds matches the printed expression and is sharp. | | `tests/test_fractionation.py::test_zk23_nontrace_ternary_relations` | Zahnle & Kasting (2023), GeCoA 361, 228, Eqs. 19 and 20 | The non-trace H-O-CO2 relations hold: Eq. 19 in closed form to machine precision and through the solver's own bisected activation threshold, Eq. 20 at every flux inside the two-species band. | -| `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefiere (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | +| `tests/test_fractionation.py::test_chassefiere_prescribed_flux_partition` | Chassefière (1996), Icarus 124, 537, Eqs. 1, 6, and 7 | The prescribed-total-flux binary partition holds to machine precision at every draw, and his crossover-mass dropout test coincides exactly with the closure's own threshold. | | `tests/test_fractionation.py::test_hunten_anchors_earth_mars_venus` | Hunten, Pepin & Walker (1987), Icarus 69, 532 (worked Earth, Mars, and Venus anchors) | The printed numerical anchors are reproduced from the threshold relation and through the solver's own activation threshold within 1%. | | `tests/test_fractionation_ensembles.py::test_binary_limit_matches_closed_form_over_random_draws` | Cherubim et al. (2024), ApJ 967, 139, Eqs. 7 to 9 | 200 random binaries match the closed-form partition on both branches to $10^{-12}$ relative, with flux continuity at the crossover and exact mass conservation. | diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 4d4b5a3e..1c2bf7be 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -37,7 +37,7 @@ # approximation on a static profile. # - Luminosity cap, applied only past the activation gate: # Mdot_E = L / (g R_p K) with L = 4 pi R_p^2 F_int (Gupta & Schlichting -# 2019, MNRAS 487, 24, their Eq. 9). Capping the residual bolometric +# 2019, MNRAS 487, 24, their Eq. 8). Capping the residual bolometric # channel by the interior luminosity sidesteps the open dispute over how # long core-powered mass loss survives after boil-off (Tang et al. 2024, # ApJ 976, 221, argue it is brief; Gupta & Schlichting argue it lasts). diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index 64e8c827..8582e534 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -42,7 +42,7 @@ # al. (2018, Icarus 307, 327, Eq. 5) and Zahnle et al. (1990, Eqs. 35, 36, # 42); the non-trace three-species relations of Zahnle & Kasting (2023, # GeCoA 361, 228, Eqs. 19-20); the prescribed-flux partition of -# Chassefiere (1996, Icarus 124, 537, Eqs. 1, 6, 7); the universal-b +# Chassefière (1996, Icarus 124, 537, Eqs. 1, 6, 7); the universal-b # closed form; and the Hunten et al. (1987) Earth, Mars, and Venus # numerical anchors. # diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index 12055f5c..ac2daf34 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -13,7 +13,7 @@ reproduced. - The non-trace three-species relations of Zahnle & Kasting (2023, Eqs. 19-20). -- The prescribed-flux partition of Chassefiere (1996, Eqs. 1, 6, 7). +- The prescribed-flux partition of Chassefière (1996, Eqs. 1, 6, 7). - The universal-b closed form and the Hunten et al. (1987) Earth, Mars, and Venus numerical anchors. - Low-flux collapse onto the lightest species and the zero-flux limit. @@ -313,7 +313,7 @@ def _activation_threshold(k, X, m, T, g0, b, lo, hi, niter=100): @pytest.mark.reference_pinned def test_chassefiere_prescribed_flux_partition(): - """The binary partition reproduces Chassefiere (1996, Eqs. 1, 6, 7). + """The binary partition reproduces Chassefière (1996, Eqs. 1, 6, 7). His crossover mass ``m_c = m_1 + kT F_1 / (b g X_1)`` evaluated at the threshold flux equals the heavy mass exactly (his dropout test and the From 9022f49cd58e289bf713a578196126f3ce355dd5 Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:37:30 +0200 Subject: [PATCH 073/113] Write what the fallback order does instead of naming it a ladder The metaphor family was the project's own coinage for the coefficient fallback order, not a code identifier and not the field's standard name, so the prose rules replace it with what it describes: 33 occurrences across four modules, three test files, and three pages. Two test names carried it and are renamed with it. The same pass takes the comma after e.g. and i.e. in three shipped docstrings, settles the prefix hyphenation on the unhyphenated form for nonthermal and deexcitation, which the branch had split down the middle, writes numbers above ten as numerals in three places, and drops a borrowed noun from a dispatcher docstring. The worked example said it writes one figure and writes two, as a PDF and a PNG each. The energy-limited API entry was rendered on two pages and is now rendered once, on the released import path, with a pointer from the module page. And the validation page for that function pointed at a docstring and an overview this branch moved. --- docs/Explanations/energy_limited.md | 2 +- docs/Explanations/limitations.md | 2 +- docs/Explanations/proteus.md | 2 +- docs/Explanations/regimes.md | 4 ++-- docs/Reference/api/hydrodynamic.md | 3 ++- docs/Tutorials/dispatch.md | 6 +++--- docs/Validation/escape.md | 6 +++--- docs/Validation/knudsen.md | 2 +- examples/demo_dispatcher/demo_dispatcher.py | 2 +- src/zephyrus/composition.py | 4 ++-- src/zephyrus/diffusion.py | 6 +++--- src/zephyrus/dispatcher.py | 2 +- src/zephyrus/hydrostatic.py | 6 +++--- src/zephyrus/knudsen.py | 10 +++++----- src/zephyrus/thermostat.py | 4 ++-- tests/test_diffusion.py | 12 ++++++------ tests/test_fractionation_ensembles.py | 2 +- tests/test_knudsen.py | 16 ++++++++-------- 18 files changed, 46 insertions(+), 45 deletions(-) diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md index f8e40b31..ff956c9a 100644 --- a/docs/Explanations/energy_limited.md +++ b/docs/Explanations/energy_limited.md @@ -37,7 +37,7 @@ Factoring the numerator gives $K_\mathrm{tide} = (\xi - 1)^2\,(2\xi + 1) / (2\xi ## When the prescription applies -The EL form is appropriate in the high-irradiation, collisional-wind regime that dominates the loss during roughly the first $10^6$ to $10^8$ years of a close-in planet's evolution [^watson][^lammer2003]. Outside it, at lower XUV flux or for a less extended atmosphere, particle-by-particle (non-thermal and Jeans) escape becomes comparable or dominant and the bulk EL prescription no longer applies. The [regime framework](regimes.md) classifies each state before choosing a rate; when using `EL_escape` alone, verify that the XUV-driven loss genuinely dominates (for scale, present-day non-thermal rates for an Earth-mass planet are of order $10^7$ to $10^8$ g s$^{-1}$; Kislyakova et al. 2014 [^kislyakova]). +The EL form is appropriate in the high-irradiation, collisional-wind regime that dominates the loss during roughly the first $10^6$ to $10^8$ years of a close-in planet's evolution [^watson][^lammer2003]. Outside it, at lower XUV flux or for a less extended atmosphere, particle-by-particle (nonthermal and Jeans) escape becomes comparable or dominant and the bulk EL prescription no longer applies. The [regime framework](regimes.md) classifies each state before choosing a rate; when using `EL_escape` alone, verify that the XUV-driven loss genuinely dominates (for scale, present-day nonthermal rates for an Earth-mass planet are of order $10^7$ to $10^8$ g s$^{-1}$; Kislyakova et al. 2014 [^kislyakova]). Bulk removal is the second assumption. When the escaping particle flux drops below the critical value needed to drag a heavy species along, the outflow fractionates: hydrogen escapes preferentially and the residual atmosphere is enriched in heavy species [^wordsworth2018][^cherubim2024]. For scale, the critical flux for water in a hydrogen background is about $1.9 \times 10^{8}$ g s$^{-1}$ (Yoshida et al. 2022 [^yoshida]). `EL_escape` removes everything in bulk; the [fractionation](fractionation.md) page describes the closure that resolves the partition when the regime framework confirms a wind. diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index fe8c1286..6a2570d0 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -21,7 +21,7 @@ The framework removes the regime-awareness limitation and carries its own, each - **The thermostat evaluates one level.** The wind temperature comes from a local balance at the wind base; the temperature structure through the sonic region is not modeled. The sensitivity propagates: the wind temperature sets the sonic-point density and therefore feeds the collisionality switch itself. - **Hydrostatic heavy-element rates are lower limits.** The nonthermal channels that dominate heavy-species loss from real exospheres (ion outflow, photochemical ejection, sputtering, charge exchange, ion pickup) are absent. Every hydrostatic result carries a flag saying so, and states where the neutral and plasma escape-temperature conventions disagree are flagged as contested with both branch rates recorded, because the unmodeled ion physics decides them. - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. -- **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section rung has a documented high-temperature bias. Each engagement is flagged or provenance-classed. +- **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. - **Overflowing states get a bound-flow rate.** The Roche screen names a state whose flow reaches the Hill sphere and reports the rate its branch computed, which is a lower limit: the tidally driven flow through the inner Lagrange point that such a planet actually drives is not modeled, and neither is the accompanying orbital evolution. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. diff --git a/docs/Explanations/proteus.md b/docs/Explanations/proteus.md index bdaa97ce..09618774 100644 --- a/docs/Explanations/proteus.md +++ b/docs/Explanations/proteus.md @@ -43,7 +43,7 @@ The PROTEUS configuration block for ZEPHYRUS lives under `[escape]` and `[escape | `escape.zephyrus.tidal` | bool | - | If `true`, include the tidal correction $K_\mathrm{tide}$ in `EL_escape`. | !!! note "`scaling=3` is hard-coded" - The PROTEUS wrapper always calls `EL_escape` with `scaling=3`, i.e. the $R_\mathrm{XUV}^3$ form. This is not exposed as a config option. Standalone users of `EL_escape` can choose `scaling=2` (the function default, $R_p R_\mathrm{XUV}^2$). + The PROTEUS wrapper always calls `EL_escape` with `scaling=3`, i.e., the $R_\mathrm{XUV}^3$ form. This is not exposed as a config option. Standalone users of `EL_escape` can choose `scaling=2` (the function default, $R_p R_\mathrm{XUV}^2$). --- diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index fd84ffe3..fc6e04a0 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -93,7 +93,7 @@ A fluid wind only exists if the gas is still collisional where it goes sonic. Th $$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell}{H_\mathrm{s}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{7}$$ -where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed ladder: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements have no published van der Waals radius at all (Bondi prints no alkali, alkaline earth, or transition metals), so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that rung on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. +where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements have no published van der Waals radius at all (Bondi prints no alkali, alkaline earth, or transition metals), so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. One property of the criterion is worth stating plainly, because it is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. @@ -109,7 +109,7 @@ $$w_{\mathrm{J},i} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter. The effusion flux is that velocity times the species number density at the exobase, referred back to the anchor radius by the ratio of the two areas, $\Phi_{\mathrm{J},i} = (R_\mathrm{exo}/R_0)^2\, C(\lambda_i)\, w_{\mathrm{J},i}\, X_i\, n_\mathrm{exo}$ (Yelle 2024 Eq. 15), with $X_i$ the diffusively adjusted mixing ratio at the exobase and $R_0$ the profile top the structure was extended from. It carries the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi_i = \Phi_{\mathrm{J},i}\,\Phi_{\mathrm{l},i} / (\Phi_{\mathrm{J},i} + \Phi_{\mathrm{l},i})$, their Eq. 14, which lies below both of its arguments. The dominant species supplies itself and takes the Jeans flux alone. -Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} R_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the non-thermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. +Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} R_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the nonthermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. ## The Roche screen and overflow diff --git a/docs/Reference/api/hydrodynamic.md b/docs/Reference/api/hydrodynamic.md index 2ec0bc5e..117d46d2 100644 --- a/docs/Reference/api/hydrodynamic.md +++ b/docs/Reference/api/hydrodynamic.md @@ -1,9 +1,10 @@ # zephyrus.hydrodynamic +The energy-limited rate `EL_escape` lives in this module and is rendered on the [`zephyrus.escape`](escape.md) page, which is the released import path for it. + ::: zephyrus.hydrodynamic options: members: - - EL_escape - hill_radius_periapsis - k_tide - el_rate diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 28f78456..12292944 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -279,7 +279,7 @@ The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, ## Step 5: read the diagnostics -A call returns seventeen or eighteen diagnostic groups, the eighteenth appearing when a hydrodynamic branch produced the rate and its species split, or when the two escape-temperature conventions disagree, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns 17 or 18 diagnostic groups, the 18th appearing when a hydrodynamic branch produced the rate and its species split, or when the two escape-temperature conventions disagree, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. Every snippet in this step uses the same result: @@ -435,7 +435,7 @@ Output: 4000.0 hydrostatic 1556.0942672561685 360.57653737857527 326.2824298111698 ``` -The sweep starts at the profile's own top temperature, near 1000 K here, because a prescribed value below it would ask for a thermosphere that cools with height, whose exobase is more strongly bound than the level it extends from. That request is floored at the top and flagged rather than refused, since in a coupled run the profile top warms past a fixed prescription over secular time. Over the factor of four above it the bulk rate moves by a factor 4.5 while the carbon rate moves by eleven orders of magnitude. The reason is in the per-species detail: +The sweep starts at the profile's own top temperature, near 1000 K here, because a prescribed value below it would ask for a thermosphere that cools with height, whose exobase is more strongly bound than the level it extends from. That request is floored at the top and flagged rather than refused, since in a coupled run the profile top warms past a fixed prescription over secular time. Over the factor of four above it the bulk rate moves by a factor 4.5 while the carbon rate moves by 11 orders of magnitude. The reason is in the per-species detail: ```python species = out.diagnostics['hydrostatic']['detail']['species'] @@ -450,7 +450,7 @@ Output: 1.450974655098389e+16 260647390967054.03 ``` -At the 4000 K end of the sweep hydrogen sits at an exobase Jeans parameter of 0.28, with a Jeans flux nearly sixty times the supply diffusion can deliver through the heavy background, so its escape is set by that supply and the exobase temperature barely enters: the hydrogen column of the table above moves by 3.6% across the whole sweep. Carbon and oxygen are Jeans limited and carry the whole exponential, eleven orders of magnitude of it. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. +At the 4000 K end of the sweep hydrogen sits at an exobase Jeans parameter of 0.28, with a Jeans flux nearly sixty times the supply diffusion can deliver through the heavy background, so its escape is set by that supply and the exobase temperature barely enters: the hydrogen column of the table above moves by 3.6% across the whole sweep. Carbon and oxygen are Jeans limited and carry the whole exponential, 11 orders of magnitude of it. One case, both halves of the harmonic mean that combines them[^yelle], and a warning against reading a bulk rate as though one mechanism produced it. ### Fractionation diff --git a/docs/Validation/escape.md b/docs/Validation/escape.md index 3f3f5442..d9575ad2 100644 --- a/docs/Validation/escape.md +++ b/docs/Validation/escape.md @@ -27,9 +27,9 @@ Analytical limit (closed-form energy-limited rate at a fixed geometry), one per ## Cross-references -- `src/zephyrus/escape.py`, `EL_escape` docstring References section: cites Watson et al. (1981), Lammer et al. (2003), Eq. 6, and Erkaev et al. (2007), Eq. 21, for the default `scaling=2` radius term; Lopez, Fortney & Miller (2012), Eq. 2, Lopez & Fortney (2013), Eq. 1, and Lehmer & Catling (2017), Eq. 1, for the `scaling=3` term; and Erkaev et al. (2007), Eq. 17, for the tidal reduction factor. -- `docs/Explanations/model.md`: user-facing overview of the energy-limited escape model and its tidal correction. +- `src/zephyrus/hydrodynamic.py`, `EL_escape` docstring References section (the function moved there with this branch; `zephyrus.escape` re-exports it and the released import path is unchanged): cites Watson et al. (1981), Lammer et al. (2003), Eq. 6, and Erkaev et al. (2007), Eq. 21, for the default `scaling=2` radius term; Lopez, Fortney & Miller (2012), Eq. 2, Lopez & Fortney (2013), Eq. 1, and Lehmer & Catling (2017), Eq. 1, for the `scaling=3` term; and Erkaev et al. (2007), Eq. 17, for the tidal reduction factor. +- `docs/Explanations/energy_limited.md`: user-facing account of the energy-limited rate, its two radius scalings, and the tidal correction, with the equations numbered. `docs/Explanations/model.md` is the hub that links to it. ## Last comparison -2026-07-10, against `src/zephyrus/escape.py` at the branch head. +2026-08-28, against `src/zephyrus/hydrodynamic.py` at the branch head. diff --git a/docs/Validation/knudsen.md b/docs/Validation/knudsen.md index ebd6b957..85f92939 100644 --- a/docs/Validation/knudsen.md +++ b/docs/Validation/knudsen.md @@ -1,6 +1,6 @@ # Validation: `src/zephyrus/knudsen.py` -This page tracks the `@pytest.mark.reference_pinned` tests that anchor the collision cross-section ladder of `zephyrus.knudsen` against laboratory data. +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the collision cross-section fallback order of `zephyrus.knudsen` against laboratory data. | Test id | Reference | Scope | |---|---|---| diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index da4f15e0..b1650ecd 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -4,7 +4,7 @@ read field by field, a flux sweep that crosses two regime boundaries, the boil-off and Roche-overflow labels, the diagnostics container, the four knobs that move a boundary, and one planet dispatched along a stellar XUV -history. Prints a table per step and writes one figure. +history. Prints a table per step and writes two figures, each as a PDF and a PNG. Every function returns its results, so the steps can be imported and reused one at a time; nothing runs on import. From the repository root: diff --git a/src/zephyrus/composition.py b/src/zephyrus/composition.py index 1cf6c74d..8dd27732 100644 --- a/src/zephyrus/composition.py +++ b/src/zephyrus/composition.py @@ -50,7 +50,7 @@ # volume and marked tentative there); Batsanov (2001) gives 2.10 to 2.27 and # Alvarez (2013) 2.51, so quantities scaled from the Mg radius carry a 36 to # 55 percent softness beyond their provenance class. Used as the last-resort -# geometric rung of the collision cross-section ladder and by the +# geometric fallback of the collision cross-section fallback order and by the # kinetic-diameter scaling rule of the binary-diffusion library. BONDI_VDW_RADIUS_A = { 'H': 1.20, @@ -84,7 +84,7 @@ def parse_formula(name: str) -> dict[str, int]: Parameters ---------- name : str - Molecular formula, e.g. ``'H2O'``, ``'CO2'``, ``'He'``. + Molecular formula, e.g., ``'H2O'``, ``'CO2'``, ``'He'``. Returns ------- diff --git a/src/zephyrus/diffusion.py b/src/zephyrus/diffusion.py index 82717e01..6ebbaf2f 100644 --- a/src/zephyrus/diffusion.py +++ b/src/zephyrus/diffusion.py @@ -95,7 +95,7 @@ def substitutable() -> tuple[str, ...]: # these pairs), and at the temperatures where rock vapor exists Na and Mg # ionize readily while these are neutral-gas coefficients. The Fe radius # spans about 20 percent across published compilations and the Mg radius is -# a flagged outlier of Bondi's own table, so those two rungs are soft beyond +# a flagged outlier of Bondi's own table, so those two fallbacks are soft beyond # their provenance class (see the notes in composition.BONDI_VDW_RADIUS_A). ROCK_FORMERS = ('Na', 'Mg', 'Si', 'Fe') @@ -447,7 +447,7 @@ def masses_g(species: list) -> np.ndarray: # --------------------------------------------------------------------------- -# The pair ladder for arbitrary (possibly molecular) species, used by the +# The pair fallback order for arbitrary (possibly molecular) species, used by the # hydrostatic branch, and Blanc's law for mixtures. # --------------------------------------------------------------------------- @@ -457,7 +457,7 @@ def masses_g(species: list) -> np.ndarray: def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: """Binary diffusion parameter b = n D for one pair, in SI [m^-1 s^-1]. - The ladder, most trusted rung first: the atomic library above (printed + The fallback order, most trusted source first: the atomic library above (printed rows, then the Eq. 10 scaling); the molecular-background table; as a last resort, the library value of the nearest-mass covered species, with the substitution recorded in the provenance string. Trailing diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index ad953781..6f9703c4 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -561,7 +561,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: def _resolve_wind_base(inputs: EscapeInputs, t_exo: float) -> tuple[dict, dict]: - """The wind-base level with the out-of-range policy applied. + """The wind-base level, and what happens when the profile cannot reach it. Locates the base by the configured method; when the physical base pressure lies above the profile top and the policy is ``'extend'``, diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index 9db312cc..34499185 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -49,7 +49,7 @@ # thermal diffusion factor alpha = -0.25 for light species (Yelle 2024, # after Banks & Kockarts), and the limiting flux is the inverse of the # resistance integral g. Binary coefficients come from the diffusion -# library ladder; Blanc's law combines pairs into the mixture value. +# library fallback order; Blanc's law combines pairs into the mixture value. # - Combination: the harmonic mean of the Jeans and diffusion-limited # fluxes, Phi = Phi_J Phi_l / (Phi_J + Phi_l) (Yelle 2024, Eq. 14), both # referred to the anchor area (their Eq. 15). The dominant species has no @@ -62,7 +62,7 @@ # temperature is unstable (their Figure 10 criterion) and callers # re-route such points to the hydrodynamic branch. # -# Hydrostatic heavy-element rates are lower limits: the non-thermal +# Hydrostatic heavy-element rates are lower limits: the nonthermal # channels (ion outflow, photochemical ejection, sputtering) that dominate # heavy-species loss in this regime are not modeled; the # ``hydrostatic_lower_limit`` flag travels with every result. @@ -248,7 +248,7 @@ def hydrostatic_rates( state, both escape temperatures, the ``dominant`` species that supplies itself without a diffusion cap, the per-species terms, coefficient provenance, and flags (including ``hydrostatic_lower_limit``, which is - always on: non-thermal loss channels are absent). + always on: nonthermal loss channels are absent). """ ext = bates_extension(profile, M_p, T_exo, gamma=gamma_bates, n_levels=n_levels) i_x, flags = find_exobase(ext, M_p) diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py index 733d778c..720d793e 100644 --- a/src/zephyrus/knudsen.py +++ b/src/zephyrus/knudsen.py @@ -136,7 +136,7 @@ def viscosity_pure(pair: tuple, mass_gmol: float, T: float) -> float: ``eta = 2.6693e-5 sqrt(M T) / (sigma^2 Omega^(2,2)*)`` poise, with the molar mass in g/mol and the collision integral in Angstrom^2 (the - standard first Chapman-Enskog approximation; see e.g. Hirschfelder, + standard first Chapman-Enskog approximation; see e.g., Hirschfelder, Curtiss & Bird 1954). Exposed as the validation route: it anchors the Laricchiuta transcription on measured viscosities. """ @@ -167,7 +167,7 @@ def sigma_zk90_hydrogen(species: str, T: float) -> float: # Radius assumed for an element with no tabulated van der Waals value. It is # not a measurement of anything: Bondi (1964) prints no alkali, alkaline # earth, or transition metals, so aluminium, phosphorus, chlorine, -# potassium, calcium, and titanium reach the geometric rung with nothing +# potassium, calcium, and titanium reach the geometric fallback with nothing # behind them. Species that fall back on it carry their own provenance # class, because a cross section built on this number must not be read as # one built on a published radius. @@ -180,11 +180,11 @@ def sigma_geometric(species: str) -> tuple[float, bool]: Uses the Bondi (1964) van der Waals radius; for a composite molecule without a tabulated radius, the largest constituent-element radius sets the scale. A hard sphere has no temperature dependence, so against the - shrinking collision integrals this rung is roughly right at room + shrinking collision integrals this fallback is roughly right at room temperature but overshoots by a factor of a few at 1e4 K (2.6 for atomic N), which biases the Knudsen number low and the switch toward hydrodynamic verdicts. The provenance class records which species sit - on this rung so the bias stays visible. + on this fallback so the bias stays visible. Returns ``(sigma [m^2], tabulated)``, where ``tabulated`` is False when the radius came from ``FALLBACK_VDW_RADIUS_A`` rather than the published @@ -202,7 +202,7 @@ def sigma_geometric(species: str) -> tuple[float, bool]: def sigma_species(species: str, T: float) -> tuple[float, str]: """Cross section for one species with its provenance class. - The ladder, most trusted rung first: the Laricchiuta et al. (2009) + The fallback order, most trusted source first: the Laricchiuta et al. (2009) like-pair collision integral where tabulated; the Zahnle et al. (1990) diffusion-inversion route for H and H2; the geometric Bondi-radius hard sphere as last resort. Returns ``(sigma [m^2], provenance)`` with diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py index c11acf6e..bc93e771 100644 --- a/src/zephyrus/thermostat.py +++ b/src/zephyrus/thermostat.py @@ -68,11 +68,11 @@ def three_level_populations(species: str, n_tot: float, n_e: float, T: float): """Steady-state level populations (n1, n2, n3) of a three-level system. - Electron-impact excitation and de-excitation plus radiative decay, with + Electron-impact excitation and deexcitation plus radiative decay, with no radiative excitation (every emitted photon escapes: cool-to-space). Rate coefficients follow the effective-collision-strength form ``k_lu = gamma (8.629e-6 / (g_l sqrt(T))) exp(-E_lu / kB T)`` with - de-excitation by detailed balance (Nakayama et al. 2022, Eqs. 13-14). + deexcitation by detailed balance (Nakayama et al. 2022, Eqs. 13-14). Densities in cm^-3. """ data = THREE_LEVEL[species] diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 91d69e0e..0c0c6981 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -2,7 +2,7 @@ Exercises the binary-diffusion library: its printed sources, the unit reading of the Sasaki & Nakazawa (1988) table, the Zahnle & Kasting (2023) -Eq. (10) scaling rule, the pair ladder, and Blanc's law. The physical +Eq. (10) scaling rule, the pair fallback order, and Blanc's law. The physical invariants under test: - Reference pins: the Sasaki & Nakazawa unit reading reproduces the @@ -216,10 +216,10 @@ def test_bmatrix_symmetry_and_error_contract(): assert masses_g(['H'])[0] == pytest.approx(1.008 * 1.66053907e-24, rel=1e-6, abs=0.0) -def test_b_pair_ladder_and_proxy_provenance(): - """The pair ladder resolves each rung and records substitutions. +def test_b_pair_fallback_order_and_proxy_provenance(): + """The pair fallback order resolves each fallback and records substitutions. - The ladder is ordered by provenance class, so a measured row wins over an + The fallback order is ordered by provenance class, so a measured row wins over an estimated one wherever both exist. H-CO2 is the case that separates them: Table 2 carries it as an 'E' estimate scaled from named analog pairs, while the molecular-background compilation carries a measured row, and @@ -294,12 +294,12 @@ def test_b_mixture_blancs_law_limits(): @pytest.mark.physics_invariant def test_every_species_a_coupled_run_can_supply_has_a_coefficient(): - """No species a PROTEUS run can supply leaves the pair ladder empty. + """No species a PROTEUS run can supply leaves the pair fallback order empty. Four species of the vapour list and one volatile carry no kinetic diameter of their own, and aluminium appears in no diffusion compilation at all, so each reaches its coefficient by substitution. - What the ladder guarantees is that the substitution exists, is finite, + What the fallback order guarantees is that the substitution exists, is finite, and is named: an unnamed substitution would let a rock vapour silently diffuse like atomic oxygen. """ diff --git a/tests/test_fractionation_ensembles.py b/tests/test_fractionation_ensembles.py index dc20846e..7dd1f6ae 100644 --- a/tests/test_fractionation_ensembles.py +++ b/tests/test_fractionation_ensembles.py @@ -150,7 +150,7 @@ def test_global_properties_across_thresholds(): Twenty random systems (up to twelve species, isotope-close pairs every third draw), each scanned over 400 fluxes spanning the full activation - ladder: mass conservation and non-negativity at every point; + fallback order: mass conservation and non-negativity at every point; componentwise monotonicity of the velocity scales in the flux; monotone growth of the active set; two-sided continuity at every bisected threshold (including non-negativity and conservation exactly there); diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index 36ea0e9c..46ede719 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -1,6 +1,6 @@ """Tests for ``src/zephyrus/knudsen.py``. -Exercises the neutral collision cross-section ladder and the sonic-point +Exercises the neutral collision cross-section fallback order and the sonic-point Knudsen switch. The physical invariants under test: - Reference pin: the Laricchiuta et al. (2009) collision integrals reproduce @@ -10,8 +10,8 @@ path over the analytic sonic-point scale height; the mixture cross section is exactly density weighted. - Monotonicity / boundedness: cross sections shrink with temperature; the - temperature-independent geometric rung overshoots the collision-integral - rung at high temperature (its documented bias); the hysteresis window + temperature-independent geometric fallback overshoots the collision-integral + fallback at high temperature (its documented bias); the hysteresis window widens or tightens the switch threshold on the correct side. - Error contract: the hydrogen route rejects non-hydrogen species. @@ -129,11 +129,11 @@ def test_hydrogen_route_pins_and_temperature_dependence(): sigma_zk90_hydrogen('He', 1e4) -def test_ladder_provenance_and_geometric_bias(): - """The ladder assigns the right rung and the hard-sphere bias shows. +def test_fallback_order_provenance_and_geometric_bias(): + """The fallback order assigns the right fallback and the hard-sphere bias shows. - N sits on the collision-integral rung, H on the hydrogen route, He (no - Laricchiuta entry, not hydrogen) on the geometric rung. A hard sphere + N sits on the collision-integral fallback, H on the hydrogen route, He (no + Laricchiuta entry, not hydrogen) on the geometric fallback. A hard sphere has no temperature dependence, so at 300 K the geometric N cross section is comparable to the collision integral, while at 1e4 K it overshoots by a factor of a few, the documented bias that pushes the @@ -154,7 +154,7 @@ def test_ladder_provenance_and_geometric_bias(): geo_h2o, tabulated_h2o = sigma_geometric('H2O') assert tabulated_h2o is True assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12, abs=0.0) - # An element Bondi does not tabulate reaches the rung on an assumed + # An element Bondi does not tabulate reaches the fallback on an assumed # radius, and says so rather than passing for a published one. Bondi # prints no alkali, alkaline earth, or transition metals, so this is # every rock-forming vapour species outside the seven scaled elements. From d788998cf574a7bfa8ef30f01bbc0c713196a98f Mon Sep 17 00:00:00 2001 From: maraattia Date: Fri, 28 Aug 2026 18:39:54 +0200 Subject: [PATCH 074/113] Put the mono family behind its own dependency guard Three corrections of the same kind as the documentation pass. The figures named Spline Sans Mono unconditionally while the colours that come with it sat behind an optional import, so without proteus-mpl matplotlib substituted a face with a warning and a reader's figures differed from the committed ones with nothing saying why; the family now falls back to a generic monospace where the package is absent. The module notes on the recombination chain still said the flux scaling separates genuine saturation from barometric suppression, which the barometric factor does and the flux exponent does not. And the Jupiter constants had been inserted into the middle of the Earth block, leaving six Earth quantities under the Jupiter heading. --- examples/demo_dispatcher/demo_dispatcher.py | 31 +++++++++++++++++---- examples/demo_earth/demo_earth.py | 6 ++-- src/zephyrus/hydrodynamic.py | 10 ++++--- src/zephyrus/planets_parameters.py | 7 +++-- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index b1650ecd..189fa3a1 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -102,6 +102,25 @@ def brand_colors() -> dict: return palette +def _mono_family() -> str: + """Monospace family for in-axes labels, or a generic fallback. + + The visual language sets Spline Sans Mono, which arrives with + proteus-mpl. Naming it unconditionally would make matplotlib substitute a + face with a warning wherever that package is absent, and the figures a + reader produced would differ from the committed ones with nothing saying + why, so the name is used only when the package that supplies it is there. + """ + try: + import proteus_mpl # noqa: F401 + except ImportError: + return 'monospace' + return 'Spline Sans Mono' + + +MONO = _mono_family() + + # Marker per label, so the figure never encodes a regime in color alone. REGIME_MARKERS = { 'boiloff': 'D', @@ -675,7 +694,7 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No ha='center', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) for _before, _after, flux in boundaries.get(composition, []): ax.axvline(flux, color=palette['rule'], linestyle='--', linewidth=1.0) @@ -686,7 +705,7 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No textcoords='offset points', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) ax.set_xscale('log') ax.set_yscale('log') @@ -700,7 +719,7 @@ def make_figure(sweeps: dict, boundaries: dict, bands: dict, outpath: str) -> No xy=(0.03, 0.14), xycoords='axes fraction', fontsize=11, - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) handles, labels = axes[0].get_legend_handles_labels() fig.legend(handles, labels, loc='upper center', ncol=3, bbox_to_anchor=(0.5, 0.11)) @@ -738,7 +757,7 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: ha='center', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) ax_rate.plot( @@ -772,7 +791,7 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: ha='right', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) elements = sorted({el for row in rows for el in row['per_species']}) @@ -801,7 +820,7 @@ def make_track_figure(rows: list[dict], outpath: str) -> None: xycoords='axes fraction', fontsize=11, color=palette['rule'], - fontfamily='Spline Sans Mono', + fontfamily=MONO, ) fig.subplots_adjust(left=0.12, right=0.98, top=0.97, bottom=0.09, hspace=0.08) fig.savefig(outpath, bbox_inches=None) diff --git a/examples/demo_earth/demo_earth.py b/examples/demo_earth/demo_earth.py index 7632a5ca..59095dd6 100644 --- a/examples/demo_earth/demo_earth.py +++ b/examples/demo_earth/demo_earth.py @@ -1,10 +1,10 @@ -import numpy as np import matplotlib.pyplot as plt import mors +import numpy as np from zephyrus.constants import * -from zephyrus.planets_parameters import * from zephyrus.escape import EL_escape +from zephyrus.planets_parameters import * ########################### Initialization ##################################### @@ -16,7 +16,7 @@ semi_major_axis = a_earth*au2m # Planetary semi-major axis [m] eccentricity = e_earth # Planetary eccentricity [dimensionless] M_planet = Me # Planetary mass [kg] -epsilon = 0.15 # Escape efficiency factor [dimensionless] +epsilon = 0.15 # Escape efficiency factor [dimensionless] R_earth = Re # Planetary radius [m] Rxuv = Re # XUV planetary radius [m] diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index c64f1f6f..b50ef6ef 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -33,10 +33,12 @@ # sqrt(F_XUV), and an isothermal Parker wind carries it to the sonic # point with the barometric factor exp(3/2 - lambda_b), the exact # isothermal value. min(EL, RR) selects RR two physically distinct ways: -# genuine recombination saturation (the sqrt(F) regime at modest -# lambda_b) and barometric suppression at large lambda_b, where the label -# "recombination limited" would be a category error; the selection -# mechanism is reported so the two are never conflated. Where the two +# genuine recombination saturation, and barometric suppression at large +# lambda_b, where the label "recombination limited" would be a category +# error. The flux scaling does not separate them, since the base ion +# density follows sqrt(F_XUV) at every lambda_b in this chain; the +# barometric factor does, and it is reported beside the rate. The +# selection diagnostic names which candidate won, not why. Where the two # candidates cross in flux is sensitive to the wind temperature: the RR # chain carries it through the sound speed, the barometric exponent, and # the recombination coefficient, so a thermostat-driven wind temperature diff --git a/src/zephyrus/planets_parameters.py b/src/zephyrus/planets_parameters.py index f968d56a..8b60e7b2 100644 --- a/src/zephyrus/planets_parameters.py +++ b/src/zephyrus/planets_parameters.py @@ -16,9 +16,6 @@ Re = 6.378e6 # Earth radius [m] Me = 5.9722e24 # Earth mass [kg] -# Jupiter parameters (IAU 2015 nominal values, Resolution B3) -Rjup = 7.1492e7 # Jupiter equatorial radius [m] -Mjup = 1.8982e27 # Jupiter mass [kg] Me_atm = 5.15e18 # Mass of the Earth atmopshere [kg] Fxuv_earth_10Myr = 14.67 # Fxuv received on Earth at t = 10 Myr -> see Fig 9. Wordsworth+18 [W m-2] Fxuv_earth_today = 4.64e-3 # Stellar flux received on Earth today [W m-2] @@ -26,6 +23,10 @@ e_earth = 0.017 # Earth eccentricity [dimensionless] a_earth = 1 # Earth semi-major axis [au] +# Jupiter parameters (IAU 2015 nominal values, Resolution B3) +Rjup = 7.1492e7 # Jupiter equatorial radius [m] +Mjup = 1.8982e27 # Jupiter mass [kg] + ######################################### TOI-561 system ######################################### # Star (Weiss+2021) From ee06bb42a30b7cac9d87ec58c21eb08ce26760a0 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 20:15:07 +0200 Subject: [PATCH 075/113] Add the Roche lobe overflow nozzle rate module The tidally driven transfer through L1 from Jackson et al. (2017), ApJ 835, 145: their Eq. 3 rate with the Eq. 10 curvature fit, the Eggleton (1983) lobe radius, and the Eq. 14 volume averaged potential, closed form throughout. At and beyond lobe contact the exponent clamps at the lobe filling boundary value, which is their Figure 5 case. Validated against their Table 2 planet rates, their Figure 5 binary curve, and the exact corotating Roche potential at a numerically solved L1 point. --- docs/Reference/api/index.md | 2 + docs/Reference/api/nozzle.md | 10 ++ docs/Validation/nozzle.md | 20 +++ mkdocs.yml | 2 + src/zephyrus/nozzle.py | 203 +++++++++++++++++++++++++++ tests/test_nozzle.py | 262 +++++++++++++++++++++++++++++++++++ 6 files changed, 499 insertions(+) create mode 100644 docs/Reference/api/nozzle.md create mode 100644 docs/Validation/nozzle.md create mode 100644 src/zephyrus/nozzle.py create mode 100644 tests/test_nozzle.py diff --git a/docs/Reference/api/index.md b/docs/Reference/api/index.md index 7cd320aa..cebee50e 100644 --- a/docs/Reference/api/index.md +++ b/docs/Reference/api/index.md @@ -8,6 +8,7 @@ This is an overview of ZEPHYRUS' API for the user's reference. If you want to un | [`zephyrus.escape`](escape.md) | `EL_escape`: energy-limited atmospheric mass-loss rate | | [`zephyrus.dispatcher`](dispatcher.md) | `dispatch`: the escape-regime dispatcher (one call, one regime, one rate) | | [`zephyrus.boiloff`](boiloff.md) | Bolometrically driven boil-off with Bondi and luminosity caps | +| [`zephyrus.nozzle`](nozzle.md) | Roche-lobe overflow: the tidally driven L1 nozzle transfer rate | | [`zephyrus.hydrodynamic`](hydrodynamic.md) | Energy-limited and radiation-recombination-limited rates | | [`zephyrus.hydrostatic`](hydrostatic.md) | Per-species Jeans escape with the diffusion-limited supply cap | | [`zephyrus.collision`](collision.md) | `mass_loss`: fractional atmospheric loss in a giant impact | @@ -43,6 +44,7 @@ src/zephyrus ├── hydrostatic.py # Jeans escape with diffusion-limited supply ├── __init__.py # Package entry point and top-level exports ├── knudsen.py # Cross sections and the Knudsen switch + ├── nozzle.py # Roche-lobe overflow through the L1 nozzle ├── planets_parameters.py # Sun, Earth, Jupiter, TOI-561 reference values ├── profiles.py # Profile container and escape working levels └── thermostat.py # Wind-temperature thermostat diff --git a/docs/Reference/api/nozzle.md b/docs/Reference/api/nozzle.md new file mode 100644 index 00000000..605fe7c6 --- /dev/null +++ b/docs/Reference/api/nozzle.md @@ -0,0 +1,10 @@ +# zephyrus.nozzle + +::: zephyrus.nozzle + options: + members: + - curvature_a + - eggleton_lobe_radius + - volume_averaged_potential + - nozzle_candidate + show_source: true diff --git a/docs/Validation/nozzle.md b/docs/Validation/nozzle.md new file mode 100644 index 00000000..408250d2 --- /dev/null +++ b/docs/Validation/nozzle.md @@ -0,0 +1,20 @@ +# Validation: `src/zephyrus/nozzle.py` + +This page tracks the `@pytest.mark.reference_pinned` tests that anchor the Roche-lobe overflow nozzle rate of `zephyrus.nozzle` against the published model. + +| Test id | Reference | Scope | +|---|---|---| +| `tests/test_nozzle.py::test_table2_planets_reproduce_published_rates` | Jackson et al. (2017), ApJ 835, 145, Table 2 (Kepler-21 b and CoRoT-24 b) with their Section 3 input prescriptions | The full closed form (their Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius) reproduces the two printed rates whose donors sit well inside their lobes, where the potential approximation is good, to 3%. | +| `tests/test_nozzle.py::test_lobe_filling_binaries_land_on_figure5` | Jackson et al. (2017) Figure 5 and Table 1 (Ritter 1988 Table A1 binaries, 0.8 solar-mass accretor) | The saturated lobe-filling limit lands on the printed solid curve at two donor masses within figure-reading tolerance, anchoring the boundary value used at and beyond lobe contact. | +| `tests/test_nozzle.py::test_curvature_equal_mass_value` | Jackson et al. (2017) Section 2.1, the printed equal-mass curvature A(1) = 8 and the small-mass-ratio expansion of the L1 position | The Eq. (10) fit returns the printed equal-mass value without fit error and carries the second-order small-q coefficient $2 \cdot 3^{2/3}$. | +| `tests/test_nozzle.py::test_potential_at_lobe_matches_numerical_l1` | The exact corotating Roche potential, L1 solved numerically on the star-planet axis | The Eq. (14) volume-averaged potential evaluated at the Eggleton lobe radius matches the exact L1 potential to better than $10^{-4}$ relative at a planetary mass ratio, and the escape barrier built from it to 0.5%. | + +## Notes + +The two near-lobe hot Jupiters of their Table 2 are deliberately not pinned: reproducing them requires the photospheric-radius distortion conversion of their Appendix, which this implementation omits as a stated convention, and the residual factor of 1.4 to 1.7 sits inside the paper's own quoted factor-of-two error from the approximate potentials. The rate is exponentially sensitive to the barrier there ($d\ln\dot{M}/d\ln r_\mathrm{ph} \approx G M_\mathrm{p}/(r_\mathrm{ph} v_\mathrm{th}^2)$, about 50 for a hot Jupiter), which is also why the two pinned planets carry a 3% tolerance: an exponent near 16 amplifies physical-constant conventions tenfold, while the transcription errors the pin exists to catch move the rate by factors of several to decades. + +## Anchor type + +Published benchmark (model rates and printed coefficients) plus an exact-geometry cross-check. + +Date of last comparison against the source: 2026-08-31. diff --git a/mkdocs.yml b/mkdocs.yml index 6a538b67..2a1f14fb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,6 +38,7 @@ nav: - Escape: Reference/api/escape.md - Dispatcher: Reference/api/dispatcher.md - Boil-off: Reference/api/boiloff.md + - Nozzle: Reference/api/nozzle.md - Hydrodynamic: Reference/api/hydrodynamic.md - Hydrostatic: Reference/api/hydrostatic.md - Collision: Reference/api/collision.md @@ -55,6 +56,7 @@ nav: - Escape: Validation/escape.md - Dispatcher: Validation/dispatcher.md - Boil-off: Validation/boiloff.md + - Nozzle: Validation/nozzle.md - Hydrodynamic: Validation/hydrodynamic.md - Hydrostatic: Validation/hydrostatic.md - Collision: Validation/collision.md diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py new file mode 100644 index 00000000..54de06ae --- /dev/null +++ b/src/zephyrus/nozzle.py @@ -0,0 +1,203 @@ +""" +!!! info "`nozzle.py`" + Roche-lobe overflow: the tidally driven nozzle flow through L1.
      + Author: Mara Attia +""" + +from __future__ import annotations + +import math + +from zephyrus.constants import G, kb + +# Provenance of the branch, all closed form, from one primary: +# +# - Rate: Jackson et al. (2017, ApJ 835, 145) Eq. (3), isothermal mass +# transfer through the inner Lagrange point from a donor with an +# extended atmosphere, in the lineage of Ritter (1988, A&A 202, 93) +# rebuilt to hold at arbitrary mass ratio, +# Mdot = e^(-1/2) rho_ph exp(-(Phi_L1 - Phi_ph)/v_th^2) v_th +# * 2 pi v_th^2 / (Omega^2 sqrt(A (A - 1))), +# with v_th = sqrt(kB T / mu) the isothermal sound speed and +# Omega^2 = G (M_d + M_a) / a^3 the orbital frequency. The three factors +# are the density at L1 (a Bernoulli integral from the photosphere, their +# Eqs. 11 to 13, source of the e^(-1/2)), the transonic speed there, and +# the elliptical nozzle area around L1 (their Eqs. 8 and 9). +# - Nozzle curvature: A(q) from their Eq. (10) fit, +# A = 4 + b1 / (b2 + q^(1/3) + q^(-1/3)), b1 = 2 * 3^(2/3), +# b2 = b1/4 - 2, symmetric under q to 1/q, accurate to 0.3% for all +# mass ratios (their Figure 2), which is the specific advance over the +# Ritter (1988) fits that hold only for donor-accretor ratios of roughly +# 0.05 to 25 and fail at planetary values. +# - Lobe radius: the Eggleton (1983, ApJ 268, 368) fit as printed in their +# Section 2.1, r_R = a 0.49 q^(2/3) / (0.6 q^(2/3) + ln(1 + q^(1/3))), +# accurate to 1% for all q. +# - Potentials: their Eq. (14) volume-averaged Roche potential, evaluated +# at the lobe radius for Phi_L1 and at the photospheric radius for +# Phi_ph. The expansion converges inside the lobe and not outside; at +# and beyond lobe contact the exponent is clamped at zero, which is the +# paper's own lobe-filling case (their Figure 5 solid curves), and the +# clamped value is a boundary value rather than a trusted rate. +# - Applicability: the overflow description holds where the isothermal +# sonic radius R_sonic = G M_d / (2 v_th^2) lies at or beyond the L1 +# distance, so that no spherical transonic wind fits inside the lobe and +# the L1 nozzle is the flow's constriction (their Section 4 and +# Figure 9). Inward of that the gas chokes at its own sonic surface +# first and the wind branches of this package are the right +# description; the candidate rate is still reported there, but the +# dispatcher does not let it compete. Without this criterion the nozzle +# area, which grows as the cube of the separation, hands a loosely +# bound envelope an unbounded rate at separations where the planet is +# nowhere near its lobe. +# - Stated limitations carried from the primary: the flow is isothermal +# (their Section 3.1 names the neglected thermal structure), the orbit +# circular and the rotation synchronous (an eccentric caller is +# evaluated at periapsis, our convention rather than theirs), and the +# rate can overestimate the transfer where the escaping gas keeps its +# orbital angular momentum and disk-stellar torque balance regulates the +# flow instead (their Eq. 24 and Figure 6); the torque-balance rate +# needs the stellar tidal dissipation and is not computed here. +# +# The temperature is the model's dominant uncertainty by the authors' own +# statement; which temperature enters v_th is the caller's +# `nozzle_temperature` setting, resolved in the dispatcher. + +_B1 = 2.0 * 3.0 ** (2.0 / 3.0) +_B2 = _B1 / 4.0 - 2.0 + + +def curvature_a(q: float) -> float: + """Dimensionless L1 curvature A(q) of Jackson et al. (2017) Eq. (10). + + ``q`` is the donor-over-accretor mass ratio. The fit is symmetric under + ``q`` to ``1/q``, equals 8 at equal masses, and tends to 4 at extreme + ratios; it reproduces the numerical root of their Eq. (7) to 0.3% for + all ``q`` (their Figure 2). + """ + if q <= 0.0 or not math.isfinite(q): + raise ValueError(f'q must be a positive finite mass ratio, got {q!r}') + return 4.0 + _B1 / (_B2 + q ** (1.0 / 3.0) + q ** (-1.0 / 3.0)) + + +def eggleton_lobe_radius(q: float, separation: float) -> float: + """Volume-equivalent Roche lobe radius of the donor, in m. + + The Eggleton (1983, ApJ 268, 368) fit as printed in Jackson et al. + (2017) Section 2.1, accurate to 1% for all mass ratios ``q`` (donor + over accretor); ``separation`` is the orbital separation [m]. + """ + q13 = q ** (1.0 / 3.0) + return separation * 0.49 * q13**2 / (0.6 * q13**2 + math.log(1.0 + q13)) + + +def volume_averaged_potential(r_v: float, M_d: float, M_a: float, separation: float) -> float: + """Volume-averaged Roche potential at volume-equivalent radius ``r_v``. + + Jackson et al. (2017) Eq. (14): the potential of the equipotential + surface enclosing the same volume as a sphere of radius ``r_v`` around + the donor ``M_d``, with accretor ``M_a`` at ``separation`` [m], in + J/kg. The expansion converges inside the donor's Roche lobe and not + outside it, and disagrees with a direct numerical evaluation by a few + percent as ``r_v`` approaches the lobe radius, which the primary + quantifies as about a factor of two in the final rate. + """ + m_t = M_d + M_a + x = r_v / separation + bracket = ( + 1.0 + + (m_t / M_d) * x**3 / 3.0 + + (4.0 / 45.0) * ((m_t**2 + 9.0 * M_a**2 + 3.0 * M_a * m_t) / M_d**2) * x**6 + ) + return ( + -(G * M_a / separation + G * M_a**2 / (2.0 * separation * m_t)) + - (G * M_d / r_v) * bracket + ) + + +def nozzle_candidate( + M_p: float, + M_star: float, + a: float, + e: float, + rho_ph: float, + r_ph: float, + T: float, + mu_kg: float, +) -> tuple[float, dict]: + """Roche-lobe overflow rate through the L1 nozzle, Jackson et al. (2017) Eq. (3). + + Parameters + ---------- + M_p, M_star : float + Donor (planet) and accretor (star) masses [kg]. + a, e : float + Semi-major axis [m] and eccentricity. The geometry is evaluated at + the periapsis separation ``a (1 - e)``, matching the Roche screen's + periapsis Hill radius; the primary treats a circular, synchronously + rotating donor, so the periapsis evaluation is this module's + convention and an upper bound on the instantaneous rate elsewhere + on the orbit. + rho_ph, r_ph : float + Density [kg m^-3] and radius [m] of the launch level. The profile + radius stands in for the volume-equivalent photospheric radius + without the primary's Appendix distortion conversion, a + few-percent radius convention worth about 1.6x in rate per percent + near lobe contact and nothing for a donor well inside its lobe. + The Bernoulli structure makes rho_ph exp(Phi_ph / v_th^2) + level-invariant along an isothermal column, so the level choice + itself largely cancels; the temperature is the sensitivity. + T, mu_kg : float + Temperature [K] and mean particle mass [kg] evaluating the + isothermal sound speed and the exponential barrier. + + Returns + ------- + (rate, detail) + The candidate rate [kg/s] and a detail dict: the sound speed, the + mass ratio and curvature, the lobe radius, both potentials and + their difference, the applied exponent, the nozzle area, and + ``saturated`` (the photospheric potential reached the L1 value, so + the exponent was clamped at zero and the rate is the lobe-filling + boundary value). + """ + a_peri = a * (1.0 - e) + v_th = math.sqrt(kb * T / mu_kg) + omega2 = G * (M_p + M_star) / a_peri**3 + q = M_p / M_star + a_curv = curvature_a(q) + r_lobe = eggleton_lobe_radius(q, a_peri) + phi_l1 = volume_averaged_potential(r_lobe, M_p, M_star, a_peri) + phi_ph = volume_averaged_potential(r_ph, M_p, M_star, a_peri) + delta_phi = phi_l1 - phi_ph + exponent = -delta_phi / v_th**2 + # The saturation test is geometric, not potential-ordered: outside the + # lobe the Eq. (14) expansion diverges downward, so a level beyond + # r_lobe reports a spuriously deep Phi_ph and a large positive barrier + # where the physical barrier is gone. At or beyond contact the + # exponential is clamped at 1 and the rate is the lobe-filling + # boundary value, a lower bound on the transfer (the density at the + # lobe itself exceeds the launch level's). + saturated = r_ph >= r_lobe or exponent >= 0.0 + if saturated: + exponent = 0.0 + area = 2.0 * math.pi * v_th**2 / (omega2 * math.sqrt(a_curv * (a_curv - 1.0))) + rate = rho_ph * math.exp(-0.5 + exponent) * v_th * area + # The Figure 9 crossover quantity: the overflow description applies + # where this sonic radius reaches the L1 distance (see module notes). + r_sonic = G * M_p / (2.0 * v_th**2) + return rate, dict( + T_K=T, + mu_kg=mu_kg, + v_th=v_th, + R_sonic=r_sonic, + q=q, + A=a_curv, + a_periapsis=a_peri, + r_lobe=r_lobe, + phi_L1=phi_l1, + phi_ph=phi_ph, + delta_phi=delta_phi, + exponent_applied=exponent, + area_m2=area, + saturated=saturated, + ) diff --git a/tests/test_nozzle.py b/tests/test_nozzle.py new file mode 100644 index 00000000..223aa9bb --- /dev/null +++ b/tests/test_nozzle.py @@ -0,0 +1,262 @@ +"""Tests for ``src/zephyrus/nozzle.py``. + +Exercises the tidally driven L1 nozzle flow of Jackson et al. (2017, +ApJ 835, 145). The physical anchors under test: + +- Reference pins: two planets of their Table 2 reproduced with their own + input prescriptions; two lobe-filling binaries of their Table 1 landing + on the Figure 5 solid curve; the equal-mass curvature A(1) = 8 their + Section 2.1 prints. +- Cross-check: the Eq. (14) volume-averaged potential evaluated at the + Eggleton lobe radius matches the exact corotating Roche potential at a + numerically solved L1 point. +- Invariants: A(q) symmetric under mass-ratio inversion and bounded in + (4, 8]; the lobe radius inside the Hill radius at planetary mass ratios; + the rate invariant under the choice of launch level along an isothermal + hydrostatic column; the exponent clamped at lobe contact, where the rate + equals the lobe-filling boundary value. +- Error contract: a non-positive mass ratio raises. + +See ``docs/How-to/run_tests.md`` for the tier and marker conventions. +""" + +import math + +import pytest + +from zephyrus.constants import G, amu, kb +from zephyrus.nozzle import ( + curvature_a, + eggleton_lobe_radius, + nozzle_candidate, + volume_averaged_potential, +) +from zephyrus.planets_parameters import Me, Ms, Re +from zephyrus.profiles import interp_at_pressure, isothermal_profile + +pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] + +AU = 1.495978707e11 # m +M_JUP = 1.8987e27 # kg, the value Jackson et al. (2017) state +R_JUP = 7.1492e7 # m, likewise +GYR = 3.15576e16 # s + + +def _jackson_photosphere(M_p, R_p, T_p, mu_kg): + """Photospheric density by their Section 3 prescription. + + ``rho_ph = tau / (kappa sqrt(2 pi R_p H))`` with the slant optical + depth tau = 0.56 (Howe & Burrows 2012) and kappa = 1e-2 cm^2/g. + """ + g = G * M_p / R_p**2 + scale_height = kb * T_p / (mu_kg * g) + kappa = 1e-3 # m^2/kg + return 0.56 / (kappa * math.sqrt(2.0 * math.pi * R_p * scale_height)) + + +@pytest.mark.reference_pinned +def test_table2_planets_reproduce_published_rates(): + """Kepler-21 b and CoRoT-24 b of Jackson et al. (2017) Table 2 within 3%. + + Both donors sit well inside their lobes, where the Eq. (14) potential + approximation is good and the photospheric-radius convention is + irrelevant, so the printed rates pin the whole formalism (Eqs. 3, 10, + 13, and 14 plus the Eggleton lobe radius). Inputs are their Table 2 + rows evaluated through their Section 3 prescriptions (mu = 1 amu above + 2000 K, 2 amu below). The 3% tolerance covers physical-constant + conventions, which the CoRoT-24 b exponent of -16 amplifies an order + of magnitude; the transcription errors this pin exists to catch move + the rate by factors of several to decades. + """ + # (Mp [MJup], Rp [RJup], Tp [K], a [au], Ms [Msun], target [kg/s], mu [amu]) + rows = [ + (0.01598, 0.146, 2411.0, 0.04272, 1.41, 2.62e12, 1.0), + (0.018, 0.33, 1112.0, 0.05600, 0.91, 2.21e8, 2.0), + ] + for mp, rp, tp, a_au, ms, target, mu_amu in rows: + m_p, r_p, m_s, a = mp * M_JUP, rp * R_JUP, ms * 1.989e30, a_au * AU + mu_kg = mu_amu * amu + rho = _jackson_photosphere(m_p, r_p, tp, mu_kg) + rate, detail = nozzle_candidate(m_p, m_s, a, 0.0, rho, r_p, tp, mu_kg) + assert not detail['saturated'] + assert math.isclose(rate, target, rel_tol=0.03, abs_tol=0.0) + + +@pytest.mark.reference_pinned +def test_lobe_filling_binaries_land_on_figure5(): + """Two Table 1 donors filling their lobes land on the Figure 5 solid curve. + + Jackson et al. (2017) Figure 5 plots the lobe-filling limit + (``Phi_ph = Phi_R``, the exponential saturated at 1) for the Ritter + (1988) Table A1 binaries with an 0.8 Msun accretor; the separation + follows from inverting the Eggleton fit at the printed photospheric + radius. The curve reads about 16 Msun/Gyr at M_d = 1.2 Msun and about + 25 at the M_d = 0.25 peak; 30% covers the figure-reading tolerance. + """ + m_a = 0.8 * 1.989e30 + r_sun = 6.957e8 + # (M_d [Msun], r_ph [Rsun], T_eff [K], mu [amu], rho_ph [kg/m^3], curve [Msun/Gyr]) + rows = [ + (1.2, 1.17, 6480.0, 1.31, 2.5e-4, 16.0), + (0.25, 0.25, 3410.0, 1.31, 1.6e-2, 25.0), + ] + for md, rph, t_eff, mu_amu, rho, curve in rows: + m_d = md * 1.989e30 + r_ph = rph * r_sun + q = m_d / m_a + a = r_ph / (eggleton_lobe_radius(q, 1.0)) + rate, detail = nozzle_candidate(m_d, m_a, a, 0.0, rho, r_ph, t_eff, mu_amu * amu) + # The lobe radius round-trips through the inverted fit to float + # precision, so the exponent is zero up to that jitter rather than + # the flag being exactly raised. + assert abs(detail['exponent_applied']) < 1e-9 + assert math.isclose(rate * GYR / 1.989e30, curve, rel_tol=0.30, abs_tol=0.0) + + +@pytest.mark.reference_pinned +def test_curvature_equal_mass_value(): + """A(1) = 8, the equal-mass value Jackson et al. (2017) print. + + At q = 1 the Eq. (10) fit's denominator collapses to b1/4, so the fit + returns their stated equal-mass curvature without fit error. At small + q the fit's leading correction is b1 q^(1/3) with b1 = 2 * 3^(2/3), + the second-order expansion of the L1 position; the in-text asymptotic + of the paper carries half this coefficient and is not the fit. + """ + assert math.isclose(curvature_a(1.0), 8.0, rel_tol=1e-12, abs_tol=0.0) + q = 1e-9 + b1 = 2.0 * 3.0 ** (2.0 / 3.0) + assert math.isclose(curvature_a(q) - 4.0, b1 * q ** (1.0 / 3.0), rel_tol=5e-3, abs_tol=0.0) + + +@pytest.mark.physics_invariant +def test_curvature_symmetric_and_bounded(): + """A(q) = A(1/q) and 4 < A <= 8 across twelve decades of mass ratio. + + The symmetry is their stated property of Eq. (10); the bounds follow + from the denominator's minimum at q = 1. + """ + for exponent in (-6.0, -3.0, -1.0, -0.3, 0.0, 0.3, 1.0, 3.0, 6.0): + q = 10.0**exponent + a_q = curvature_a(q) + assert math.isclose(a_q, curvature_a(1.0 / q), rel_tol=1e-12, abs_tol=0.0) + assert 4.0 < a_q <= 8.0 + + +@pytest.mark.physics_invariant +def test_lobe_radius_inside_hill_radius_at_planetary_ratios(): + """The Eggleton lobe radius sits inside the Hill radius for q << 1. + + The volume-equivalent lobe is smaller than the L1 distance it is the + volume average of, so the geometric Roche screen (which tests the Hill + radius) fires no earlier than lobe contact does; at small q the ratio + of the two tends to the constant 0.49 * 3^(1/3), about 0.71, which is + the limit of the Eggleton fit against the Hill radius. + """ + a = 0.05 * AU + for exponent in (-7.0, -5.0, -3.0, -2.0): + q = 10.0**exponent + r_hill = a * (q / 3.0) ** (1.0 / 3.0) + assert 0.0 < eggleton_lobe_radius(q, a) < r_hill + q = 1e-7 + r_hill = a * (q / 3.0) ** (1.0 / 3.0) + ratio = eggleton_lobe_radius(q, a) / r_hill + assert math.isclose(ratio, 0.49 * 3.0 ** (1.0 / 3.0), rel_tol=5e-3, abs_tol=0.0) + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_potential_at_lobe_matches_numerical_l1(): + """Eq. (14) at the Eggleton radius matches the exact Roche L1 potential. + + The exact corotating potential along the star-planet axis is maximized + numerically between the bodies (the L1 saddle) and compared to the + volume-averaged expansion evaluated at the Eggleton lobe radius, for a + planetary mass ratio. Jackson et al. (2017) Figure 3 claims agreement + to better than 2% away from contact; the barrier built from a deep + photospheric level moves by less than 0.5% between the two. + """ + m_d, m_a, a = 3.0 * Me, Ms, 0.07 * AU + m_t = m_d + m_a + omega2 = G * m_t / a**3 + x_cm = a * m_a / m_t + + def phi_axis(x): + return -G * m_d / x - G * m_a / (a - x) - 0.5 * omega2 * (x - x_cm) ** 2 + + lo = 0.3 * a * (m_d / (3.0 * m_a)) ** (1.0 / 3.0) + hi = 3.0 * a * (m_d / (3.0 * m_a)) ** (1.0 / 3.0) + for _ in range(200): + third = (hi - lo) / 3.0 + if phi_axis(lo + third) < phi_axis(hi - third): + lo = lo + third + else: + hi = hi - third + phi_l1_exact = phi_axis(0.5 * (lo + hi)) + + r_lobe = eggleton_lobe_radius(m_d / m_a, a) + phi_l1_eq14 = volume_averaged_potential(r_lobe, m_d, m_a, a) + assert math.isclose(phi_l1_eq14, phi_l1_exact, rel_tol=1e-4, abs_tol=0.0) + r_ph = 1.6 * 2.2 * Re + barrier_exact = phi_l1_exact - volume_averaged_potential(r_ph, m_d, m_a, a) + barrier_eq14 = phi_l1_eq14 - volume_averaged_potential(r_ph, m_d, m_a, a) + assert math.isclose(barrier_eq14, barrier_exact, rel_tol=5e-3, abs_tol=0.0) + + +@pytest.mark.physics_invariant +def test_rate_invariant_under_launch_level_choice(): + """The rate does not depend on which isothermal level launches it. + + Along an isothermal hydrostatic column, rho(r) exp(Phi(r)/v_th^2) is + constant, so the Bernoulli structure of Eq. (3) cancels the level + choice; the residual is the size of the tidal terms between the two + levels, far below 1% for a donor deep inside its lobe. + """ + m_p, r_p, t = Me, Re, 500.0 + prof = isothermal_profile(m_p, r_p, t, {'CO2': 1.0}, 1e7, 1e-3) + rates = [] + for p_level in (2000.0, 2.0): + lev = interp_at_pressure(prof, p_level) + rate, _ = nozzle_candidate( + m_p, Ms, 0.1 * AU, 0.0, lev['rho'], lev['r'], lev['T'], lev['mmw'] + ) + rates.append(rate) + assert rates[0] > 0.0 + assert math.isclose(rates[0], rates[1], rel_tol=1e-2, abs_tol=0.0) + + +@pytest.mark.physics_invariant +def test_exponent_clamps_at_lobe_contact(): + """At and beyond lobe contact the rate is the lobe-filling boundary value. + + A launch level at the lobe radius saturates the exponential at 1 + (their Figure 5 case); a level beyond it, where the Eq. (14) expansion + has diverged, returns the same clamped rate rather than an unphysical + amplification. + """ + m_p, m_s, a = 0.5 * M_JUP, 1.989e30, 0.015 * AU + rho, t, mu_kg = 1e-5, 1500.0, 2.0 * amu + r_lobe = eggleton_lobe_radius(m_p / m_s, a) + at_contact, d_contact = nozzle_candidate(m_p, m_s, a, 0.0, rho, r_lobe, t, mu_kg) + beyond, d_beyond = nozzle_candidate(m_p, m_s, a, 0.0, rho, 1.2 * r_lobe, t, mu_kg) + assert d_contact['saturated'] and d_beyond['saturated'] + assert d_contact['exponent_applied'] == 0.0 + v_th = d_contact['v_th'] + boundary_value = rho * math.exp(-0.5) * v_th * d_contact['area_m2'] + assert math.isclose(at_contact, boundary_value, rel_tol=1e-12, abs_tol=0.0) + assert math.isclose(beyond, at_contact, rel_tol=1e-12, abs_tol=0.0) + + +def test_curvature_rejects_unphysical_mass_ratio(): + """A non-positive or non-finite mass ratio raises; a valid one returns. + + Zero, negative, and non-finite ratios have no L1 geometry and must + raise rather than return a complex root or propagate a NaN. A valid + planetary ratio on the same path stays inside the fit's bounds. + """ + for bad in (0.0, -1.0, math.inf, math.nan): + with pytest.raises(ValueError, match='mass ratio'): + curvature_a(bad) + ok = curvature_a(1e-5) + assert math.isfinite(ok) + assert 4.0 < ok <= 8.0 From 676c2483440d2b77a39005d06992a03268b0830d Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 20:15:19 +0200 Subject: [PATCH 076/113] Dispatch the L1 nozzle transfer as a rate candidate The nozzle competes in the final comparison on both sides of the activation gate, wherever the overflow description applies: the isothermal sonic radius must reach the L1 distance (Jackson et al. 2017, their Figure 9 crossover), because inward of that a spherical wind chokes at its own sonic surface first, and the nozzle area grows as the cube of the separation, which otherwise hands a loosely bound envelope an unbounded rate far from its lobe. A candidate below the one proton per year floor does not compete either: this label boundary is a rate crossing, and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. A nozzle win labels roche_overflow with the transfer rate itself, continuous at the crossing; the geometric rename keeps its bound flow meaning and its rate. The subflag still reads the geometry, with a third value, nozzle, for a win whose structure sits inside the Hill sphere. The flow carries no energy cap, faithful to the primary, and the lift power is reported beside the interior and intercepted luminosities. nozzle_temperature selects the photospheric level or the thermostat wind state; eccentric wins are periapsis evaluated and flagged. --- docs/Tutorials/dispatch.md | 4 +- src/zephyrus/dispatcher.py | 125 ++++++++++++-- tests/test_dispatcher.py | 343 +++++++++++++++++++++++++++++++++---- 3 files changed, 420 insertions(+), 52 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 12292944..4021c100 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -153,7 +153,7 @@ hydrodynamic:EL {'C': 660971.2983440236, 'O': 1686751.2523411503} 0.0 {} -['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', 'knudsen', 'lambda_gate', 'potential_screens', 'rate_floor', 'roche', 'self_consistency', 'tang_timescale', 'thermostat'] +['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', 'knudsen', 'lambda_gate', 'nozzle', 'potential_screens', 'rate_floor', 'roche', 'self_consistency', 'tang_timescale', 'thermostat'] ``` Five fields, and each one guarantees something. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. @@ -271,7 +271,7 @@ roche_overflow 24622841.930601332 no_transonic ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit, because the tidally driven flow a genuinely overflowing planet drives is not modeled. +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.95), so a spherical wind chokes before the nozzle does and the candidate stands down. The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the three cases. diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 6f9703c4..4d01e6b5 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -16,6 +16,7 @@ from zephyrus import hydrodynamic as hy from zephyrus import hydrostatic as hs from zephyrus import knudsen as kn +from zephyrus import nozzle as nz from zephyrus import thermostat as th from zephyrus.composition import atomize, mean_particle_mass from zephyrus.constants import kb, m_p @@ -56,8 +57,13 @@ # renamed ``roche_overflow`` and keeps the rate its own branch # computed: the screen renames a state and never changes its rate. # Near misses raise ``near_roche``. -# 6. The final rate is the larger of the surviving branch rate and the -# bolometric residual, labeled by the winner. +# 6. The final rate is the largest of the surviving branch rate, the +# bolometric residual, and the tidally driven L1 nozzle rate +# (Jackson et al. 2017), labeled by the winner. A nozzle win labels +# ``roche_overflow`` with a real transfer rate, so that boundary is a +# rate crossing and the dispatched rate is continuous across it; the +# step 5 rename keeps its bound-flow lower-limit meaning, and +# ``diagnostics['roche']['rate_branch']`` says which reading applies. # # Diagnostics are boxed: nothing in this module branches on anything the # diagnostics container carries, and the container has no off switch. @@ -96,6 +102,7 @@ class DispatchSettings: cool_recombination: bool = True fractionate: bool = True tidal: bool = True + nozzle_temperature: str = 'photospheric' # 'photospheric' | 'wind' lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) gamma_bates: float = 0.75 # Bates profile shape parameter kzz: float = 3.0e2 # m^2/s eddy diffusion when the profile carries none @@ -116,6 +123,8 @@ def validate(self) -> None: raise ValueError("efficiency_mode must be 'fixed' or 'caldiroli'") if self.T_exo_mode not in ('prescribed', 'thermostat'): raise ValueError("T_exo_mode must be 'prescribed' or 'thermostat'") + if self.nozzle_temperature not in ('photospheric', 'wind'): + raise ValueError("nozzle_temperature must be 'photospheric' or 'wind'") if not ( self.cool_atomic or self.cool_co2_band @@ -150,7 +159,10 @@ def validate(self) -> None: # The sonic-point scale height of Chatterjee & Pierrehumbert Eq. (17) # carries sqrt(5 - 3 gamma), which leaves the reals above the monatomic # 5/3. Below 1 the polytrope is no longer a wind solution. - if self.hydrostatic_levels_min < 2 or self.hydrostatic_levels_max < self.hydrostatic_levels_min: + if ( + self.hydrostatic_levels_min < 2 + or self.hydrostatic_levels_max < self.hydrostatic_levels_min + ): raise ValueError( 'hydrostatic_levels_min must be at least 2 and no greater than ' f'hydrostatic_levels_max, got {self.hydrostatic_levels_min!r} and ' @@ -174,8 +186,8 @@ class EscapeInputs: e: float # eccentricity T_eq: float # K, equilibrium temperature F_xuv: float # W m^-2 - F_bol: float # W m^-2, bolometric instellation (carried with the state; - # not consumed by any branch in this version) + F_bol: float # W m^-2, bolometric instellation (consumed only by the + # nozzle power diagnostic; no branch rate reads it) F_int: float # W m^-2, interior heat flux (luminosity cap) kappa_photo: float # m^2 kg^-1, photospheric opacity profile: Profile @@ -346,6 +358,53 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ) diag['thermostat'] = thermo + # The tidally driven L1 nozzle candidate (Jackson et al. 2017 Eq. 3), + # computed at every point: it joins the final comparison on both sides + # of the activation gate, and its power comparison is an always-on + # diagnostic. The temperature setting decides what evaluates the sound + # speed and the barrier: the photospheric level (the primary's own + # construction, a bolometrically maintained flow) or the thermostat's + # wind state (the upper envelope their Figure 9 explores). The flow is + # uncapped, faithful to the primary, whose isothermal model has the + # radiation field maintain the temperature; the lift power reported + # beside the interior and intercepted stellar luminosities shows where + # that assumption is strained. + if st.nozzle_temperature == 'wind': + t_nozzle, mu_nozzle = t_wind, rr['mu_wind'] * m_p + else: + t_nozzle, mu_nozzle = photo['T'], photo['mmw'] + nozzle_rate, noz = nz.nozzle_candidate( + inputs.M_p, + inputs.M_star, + inputs.a, + inputs.e, + rho_ph=photo['rho'], + r_ph=photo['r'], + T=t_nozzle, + mu_kg=mu_nozzle, + ) + noz['rate_kg_s'] = nozzle_rate + noz['temperature_mode'] = st.nozzle_temperature + # The overflow description applies where the isothermal sonic radius + # reaches the L1 distance (the periapsis Hill radius to leading order + # in the mass ratio), so that no spherical transonic wind fits inside + # the lobe and the nozzle is the constriction (Jackson et al. 2017, + # their Section 4 and Figure 9). Inward of that the flow chokes at its + # own sonic surface and the wind branches are the description, so the + # candidate reports but does not compete. This edge is a criterion + # boundary like the activation gate, not a rate crossing, and the jump + # across it is a result to measure rather than hide. + nozzle_applicable = noz['R_sonic'] >= r_hill + noz['applicable'] = nozzle_applicable + noz['R_sonic_over_R_L1'] = noz['R_sonic'] / r_hill + # The power comparison: what lifting the flow to L1 costs against what + # the planet has. At saturation the barrier is gone and the lift power + # with it. + noz['power_lift_W'] = nozzle_rate * max(noz['delta_phi'], 0.0) + noz['L_int_W'] = 4.0 * math.pi * inputs.R_p**2 * inputs.F_int + noz['L_bol_intercepted_W'] = math.pi * inputs.R_p**2 * inputs.F_bol + diag['nozzle'] = noz + # Step 3: the sonic-point Knudsen switch. n_sc = rr['rho_s'] / (rr['mu_plus_wind'] * m_p) # heavy-particle density if n_sc > _TINY: @@ -454,18 +513,45 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # warnings about that candidate stop describing the result. for key in tuple(hydro_flags) + ('hydrostatic_lower_limit',): flags.pop(key, None) - label = branch + # The nozzle candidate competes last, on both sides of the activation + # gate, wherever the overflow description applies: where the + # photosphere approaches the lobe, the tidally driven transfer through + # L1 outruns every bound-flow estimate, and the label boundary it + # creates is a rate crossing, continuous by construction. A candidate + # below the one-proton-per-Julian-year floor does not compete: this + # label is a rate crossing, not a geometric verdict, and a crossing + # between two numerically empty numbers would rename the deeply bound + # corner on no physical content (the floor otherwise stays reported + # and never applied, and a geometric verdict still ignores it). + if nozzle_applicable and nozzle_rate > rate and nozzle_rate > dg.RATE_FLOOR_KG_S: + branch = 'roche_nozzle' + rate = nozzle_rate + per_species = None + flow_radius = noz['r_lobe'] + for key in tuple(hydro_flags) + ('hydrostatic_lower_limit', 'bolometric_residual'): + flags.pop(key, None) + if noz['saturated']: + # The photospheric potential reached the L1 value, so the rate + # is the lobe-filling boundary value of the model rather than + # an interior point of it. + flags['nozzle_saturated'] = True + if inputs.e > 0.0: + # The geometry is evaluated at periapsis on a model built for + # a circular orbit; elsewhere on the orbit the instantaneous + # rate is lower. + flags['nozzle_periapsis'] = True + label = 'roche_overflow' if branch == 'roche_nozzle' else branch # Step 6: the Roche screen on the active flow radius. The screen renames # the state and never touches the rate. Its boundary is a rate # comparison, since the branch whose flow radius gets tested is the one - # that won step 6, so reporting the winning branch's own rate keeps the - # dispatched rate continuous across the boundary; substituting another - # branch's formula would not. What the label means is therefore that the - # flow reaches the Roche lobe and that the rate beside it is the - # bound-flow estimate, a lower limit on what tides would do. The rate a - # tidally driven nozzle flow through L1 would carry is not implemented - # (Jackson et al. 2017, ApJ 835, 145, their Eq. 3). + # that won the final comparison, so reporting the winning branch's own + # rate keeps the dispatched rate continuous across the boundary; + # substituting another branch's formula would not. When the rename fires + # on a bound branch, the rate beside the label is the bound-flow + # estimate, a lower limit on what tides would do; when the nozzle + # candidate won above, the rate is the tidally driven transfer itself + # and the subflag reads ``nozzle``. xi_flow = r_hill / flow_radius if flow_radius > 0 else math.inf # The outer extent of the atmosphere itself, modeled plus extended, # which is what separates the two overflow geometries. It is reported @@ -492,6 +578,19 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: flags['roche_subflag'] = ( 'dynamical' if (xi_ktide <= 1.0 or r_hill <= r_atm) else 'no_transonic' ) + elif branch == 'roche_nozzle': + # The label arrived through the rate crossing rather than the + # geometric trigger. The subflag still reads the geometry: an + # atmosphere that itself reaches the lobe is dynamical overflow + # whichever candidate carries the rate; ``nozzle`` marks the + # remaining case, a photosphere close enough to the lobe for the + # L1 transfer to outrun the bound branches while the structure + # sits inside the Hill sphere. ``near_roche`` is a warning about + # the tidal inflation of a bound rate, which this rate is not. + flags['roche_overflow'] = True + flags['roche_subflag'] = ( + 'dynamical' if (xi_ktide <= 1.0 or r_hill <= r_atm) else 'nozzle' + ) elif xi_flow < 1.5: flags['near_roche'] = True diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 53b293fc..1eabfe29 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -239,24 +239,29 @@ def test_routing_roche_overflow_inside_the_hill_sphere(): def test_roche_screen_renames_without_changing_the_rate(): """Crossing the overflow boundary changes the label and not the rate. - The screen's boundary is a rate comparison: the branch whose flow - radius gets tested is the one that won the final comparison, so the two - sides of the boundary hold the same branch and the dispatched rate must - be continuous across it. Bisecting in orbital distance, which moves the - Hill radius and nothing else about the atmosphere, brackets the label - change; the rates on either side agree to machine precision and both - equal the hydrodynamic candidate. Discrimination: substituting the - Bondi-capped bolometric rate at the overflow geometry, which is what a - rate-changing screen returns, differs here by more than a decade. + The screen's boundary is a geometric criterion on the winning branch's + flow radius, so the two sides of the boundary hold the same branch and + the dispatched rate must be continuous across it. The family here is a + luminosity-capped bolometric residual whose sonic radius crosses the + Hill radius as the orbit widens, chosen because every other candidate + stays subdominant across the bracket: the XUV flux is negligible and + the nozzle candidate sits outside its applicability criterion, so the + rename is the only thing that changes. Bisecting in orbital distance + brackets the label change; the rates on either side agree to machine + precision and both equal the capped residual. Discrimination: + substituting the Bondi-capped bolometric rate at the overflow geometry, + which is what a rate-changing screen returns, is more than a decade + larger, because that form bypasses the luminosity cap. """ comp = {'H2': 0.9, 'He': 0.1} def at(a): - return dispatch(_inputs(3 * Me, 2.2 * Re, 980.0, comp, F_xuv=13.4, a=a)) + return dispatch(_inputs(3 * Me, 2.0 * Re, 1000.0, comp, F_xuv=0.1, a=a)) - lo, hi = 0.05 * AU, 0.3 * AU + lo, hi = 0.078 * AU, 0.3 * AU inner = at(lo) assert inner.regime == 'roche_overflow' + assert inner.diagnostics['nozzle']['applicable'] is False for _ in range(50): mid = 0.5 * (lo + hi) if at(mid).regime == inner.regime: @@ -265,12 +270,11 @@ def at(a): hi = mid below, above = at(lo), at(hi) assert below.regime == 'roche_overflow' - assert above.regime.startswith('hydrodynamic') + assert above.regime == 'boiloff' assert below.mdot == pytest.approx(above.mdot, rel=1e-9, abs=0.0) - hydro = below.diagnostics['hydrodynamic'] - assert below.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9, abs=0.0) - assert below.diagnostics['roche']['rate_branch'] == above.regime bolo = below.diagnostics['bolometric'] + assert below.mdot == pytest.approx(bolo['mdot_luminosity'], rel=1e-9, abs=0.0) + assert below.diagnostics['roche']['rate_branch'] == above.regime overflow_geometry_rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) assert overflow_geometry_rate > 10.0 * below.mdot @@ -319,6 +323,211 @@ def test_roche_subflag_separates_the_two_geometries(): assert roche_b['xi_ktide'] > 1.0 +def test_nozzle_win_relabels_with_the_transfer_rate(): + """A nozzle win labels ``roche_overflow`` and carries a real transfer rate. + + A puffy sub-Neptune whose photosphere sits within a few thermal units + of its lobe dispatches the Jackson et al. (2017) L1 rate: the label is + ``roche_overflow``, the branch is ``roche_nozzle``, the subflag reads + ``dynamical`` because this envelope's extended structure itself reaches + past the Hill sphere and the geometric reading takes precedence, the + split is unfractionated (the nozzle is a bulk photospheric flow, not + the closure's wind base), and ``near_roche`` stays down because it + warns about the tidal inflation of a bound rate, which this is not. + """ + res = dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) + ) + noz = res.diagnostics['nozzle'] + assert res.regime == 'roche_overflow' + assert res.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert res.flags.get('roche_subflag') == 'dynamical' + assert ( + res.diagnostics['roche']['r_atmosphere'] > res.diagnostics['roche']['R_hill_periapsis'] + ) + assert res.mdot == pytest.approx(noz['rate_kg_s'], rel=1e-12, abs=0.0) + assert noz['applicable'] is True + assert 'near_roche' not in res.flags + assert 'closure' not in res.diagnostics + assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-9, abs=0.0) + + +def test_nozzle_competes_only_inside_its_domain(): + """The nozzle candidate needs applicability and a non-empty rate to win. + + Two refusals, one per condition. A bound CO2 planet has a nozzle rate + below the one-proton-per-Julian-year floor, so a crossing against the + similarly empty hydrodynamic rate decides nothing and the verdict + stands. A residual-driven sub-Neptune at a wide orbit has a nozzle + candidate above its own dispatched rate, but the isothermal sonic + radius sits inside the L1 distance (Jackson et al. 2017, their + Figure 9), so a spherical wind chokes first, the candidate reports + without competing, and the bolometric verdict stands. + """ + empty = dispatch(_inputs(Me, Re, 700.0, {'CO2': 1.0}, F_xuv=10.0, a=0.1 * AU)) + noz = empty.diagnostics['nozzle'] + assert noz['applicable'] is True + assert 0.0 <= noz['rate_kg_s'] < empty.diagnostics['rate_floor']['floor_kg_s'] + assert empty.regime == 'hydrodynamic:EL' + + outside = dispatch( + _inputs(3 * Me, 2.0 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) + ) + noz_o = outside.diagnostics['nozzle'] + assert noz_o['applicable'] is False + assert noz_o['R_sonic_over_R_L1'] < 1.0 + assert noz_o['rate_kg_s'] > outside.mdot + assert outside.regime == 'boiloff' + + +def test_nozzle_crossing_is_continuous(): + """The dispatched rate is continuous across the nozzle rate crossing. + + Where the nozzle candidate overtakes the standing branch rate the label + changes because two rates cross, so the dispatched rate on either side + of the bisected boundary is the same number: the boundary is a rate + crossing, unlike the criterion boundaries (the activation gate, the + Knudsen switch, the applicability edge), whose jumps are results. + """ + prof_settings = DispatchSettings(T_exo_value=3000.0) + + def at(a): + return dispatch( + _inputs( + 0.107 * Me, + 0.53 * Re, + 600.0, + {'CO2': 1.0}, + F_xuv=1e-4, + a=a, + settings=prof_settings, + ) + ) + + lo, hi = 0.010 * AU, 0.014 * AU + inner = at(lo) + assert inner.regime == 'roche_overflow' + assert inner.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + # This donor's structure stays inside the Hill sphere, so the subflag + # marks the rate crossing itself rather than a geometric spill. + assert inner.flags.get('roche_subflag') == 'nozzle' + assert at(hi).regime == 'hydrostatic' + for _ in range(50): + mid = 0.5 * (lo + hi) + if at(mid).regime == inner.regime: + lo = mid + else: + hi = mid + below, above = at(lo), at(hi) + assert below.regime == 'roche_overflow' + assert above.regime == 'hydrostatic' + assert below.mdot == pytest.approx(above.mdot, rel=1e-6, abs=0.0) + + +def test_nozzle_saturation_flag_marks_lobe_contact(): + """A launch level at or beyond the lobe wins at the boundary value, flagged. + + A loose hydrogen envelope whose photospheric level sits far outside its + shrunken lobe dispatches the saturated nozzle rate with + ``nozzle_saturated`` raised; the unsaturated nozzle win of the puffy + sub-Neptune family must not raise it. + """ + saturated = dispatch( + _inputs( + 2 * Me, + 2.5 * Re, + 1500.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=13.4, + a=0.015 * AU, + p_top=1e3, + ) + ) + assert saturated.regime == 'roche_overflow' + assert saturated.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert saturated.flags.get('nozzle_saturated') is True + assert saturated.diagnostics['nozzle']['saturated'] is True + assert math.isfinite(saturated.mdot) + + unsaturated = dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) + ) + assert unsaturated.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert 'nozzle_saturated' not in unsaturated.flags + + +def test_nozzle_periapsis_flag_on_eccentric_wins_only(): + """An eccentric nozzle win says the geometry was taken at periapsis. + + The primary treats a circular, synchronously rotating donor, so the + periapsis evaluation is this module's convention and the flag makes it + visible on the result it produced; the circular win must not raise it. + """ + ecc = dispatch( + _inputs( + 3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU, e=0.3 + ) + ) + assert ecc.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert ecc.flags.get('nozzle_periapsis') is True + circ = dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) + ) + assert circ.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert 'nozzle_periapsis' not in circ.flags + + +def test_nozzle_temperature_setting_selects_and_validates(): + """The nozzle temperature setting moves the diagnostic and validates. + + The default evaluates the sound speed at the photospheric level (the + primary's construction); ``wind`` evaluates it at the thermostat's wind + state; anything else is rejected by the settings validator. + """ + state = dict(F_xuv=13.4, a=0.07 * AU) + photo = dispatch(_inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, **state)) + assert photo.diagnostics['nozzle']['temperature_mode'] == 'photospheric' + assert photo.diagnostics['nozzle']['T_K'] == pytest.approx(1000.0, rel=1e-9, abs=0.0) + wind = dispatch( + _inputs( + 3 * Me, + 2.2 * Re, + 1000.0, + {'H2': 0.9, 'He': 0.1}, + settings=DispatchSettings(nozzle_temperature='wind'), + **state, + ) + ) + assert wind.diagnostics['nozzle']['temperature_mode'] == 'wind' + assert wind.diagnostics['nozzle']['T_K'] == pytest.approx( + wind.diagnostics['hydrodynamic']['T_wind'], rel=1e-9, abs=0.0 + ) + with pytest.raises(ValueError): + DispatchSettings(nozzle_temperature='photosphere').validate() + + +def test_nozzle_power_diagnostic_reports_the_lift_cost(): + """The lift power travels beside the two luminosities on every call. + + The nozzle carries no energy cap, so the diagnostic is what shows where + the isothermal assumption is strained: the power to lift the dispatched + flow to L1, against the interior luminosity and the intercepted + instellation, present and finite whether the candidate won or lost. + """ + for res in ( + dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) + ), + dispatch(_inputs(Me, Re, 700.0, {'CO2': 1.0}, F_xuv=10.0, a=0.1 * AU)), + ): + noz = res.diagnostics['nozzle'] + for key in ('power_lift_W', 'L_int_W', 'L_bol_intercepted_W'): + assert math.isfinite(noz[key]) + assert noz[key] >= 0.0 + assert noz['L_int_W'] > 0.0 + assert noz['L_bol_intercepted_W'] > 0.0 + + def test_diagnostics_are_boxed(monkeypatch): """Sabotaging every diagnostics producer changes no dispatch outcome. @@ -547,7 +756,9 @@ def test_caldiroli_efficiency_mode_applies_and_falls_back(): ) assert weak.flags.get('caldiroli_below_flux_bound') is True assert weak.flags.get('efficiency_fallback_fixed') is True - assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx(0.1, rel=1e-12, abs=0.0) + assert weak.diagnostics['hydrodynamic']['efficiency'] == pytest.approx( + 0.1, rel=1e-12, abs=0.0 + ) def test_t_exo_thermostat_mode_estimates_and_reports_itself(): @@ -572,7 +783,10 @@ def test_t_exo_thermostat_mode_estimates_and_reports_itself(): _inputs(10 * Me, 1.8 * Re, 800.0, {'CO2': 1.0}, F_xuv=1.0, a=0.5 * AU) ) assert prescribed.diagnostics['hydrostatic']['T_exo_mode'] == 'prescribed' - assert prescribed.diagnostics['hydrostatic']['T_exo'] != res.diagnostics['hydrostatic']['T_exo'] + assert ( + prescribed.diagnostics['hydrostatic']['T_exo'] + != res.diagnostics['hydrostatic']['T_exo'] + ) assert 800.0 <= res.diagnostics['hydrostatic']['T_exo'] <= 5.0e4 if res.mdot > 0.0: assert sum(res.per_species.values()) == pytest.approx(res.mdot, rel=1e-6, abs=0.0) @@ -657,7 +871,9 @@ def test_flags_describe_the_branch_that_produced_the_rate(): diagnostics report them at every dispatch, which is what makes the scoping necessary rather than automatic. """ - hydro = dispatch(_inputs(Me, Re, 1000.0, {'N2': 0.8, 'O2': 0.2}, F_xuv=100.0, a=0.0775 * AU)) + hydro = dispatch( + _inputs(Me, Re, 1000.0, {'N2': 0.8, 'O2': 0.2}, F_xuv=100.0, a=0.0775 * AU) + ) assert hydro.regime.startswith('hydrodynamic') assert hydro.flags.get('subcritical_sonic') is True boiloff = dispatch( @@ -731,8 +947,12 @@ def test_one_exobase_temperature_per_call(): FLAG_CASES = ( ( 'near_roche', - dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.10), - dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30), + dict( + M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.10 + ), + dict( + M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30 + ), ), ( 'k_tide_undefined', @@ -741,12 +961,26 @@ def test_one_exobase_temperature_per_call(): ), ( 'roche_overflow', - dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775), + dict( + M_p=3 * Me, + R_p=2 * Re, + T_eq=1000.0, + comp={'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.0775, + ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), ( 'bolometric_residual', - dict(M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775), + dict( + M_p=3 * Me, + R_p=2 * Re, + T_eq=1000.0, + comp={'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.0775, + ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), ( @@ -757,7 +991,12 @@ def test_one_exobase_temperature_per_call(): ( 'caldiroli_out_of_box', dict( - M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775, + M_p=Me, + R_p=Re, + T_eq=1000.0, + comp={'CO2': 1.0}, + F_xuv=10.0, + a=0.0775, settings=DispatchSettings(efficiency_mode='caldiroli'), ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), @@ -770,36 +1009,68 @@ def test_one_exobase_temperature_per_call(): ( 'contested_ion', dict( - M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, - F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=6000.0), + M_p=0.107 * Me, + R_p=0.53 * Re, + T_eq=440.0, + comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, + a=0.2, + settings=DispatchSettings(T_exo_value=6000.0), ), dict( - M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, - F_xuv=0.01, a=0.2, + M_p=0.107 * Me, + R_p=0.53 * Re, + T_eq=440.0, + comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, + a=0.2, ), ), ( 'extension_unbound', dict( - M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, - F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=6000.0), + M_p=0.107 * Me, + R_p=0.53 * Re, + T_eq=440.0, + comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, + a=0.2, + settings=DispatchSettings(T_exo_value=6000.0), ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=0.1, a=0.0775), ), ( 'gate_rerouted', dict( - M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, - F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=15000.0), + M_p=0.107 * Me, + R_p=0.53 * Re, + T_eq=440.0, + comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, + a=0.2, + settings=DispatchSettings(T_exo_value=15000.0), ), dict( - M_p=0.107 * Me, R_p=0.53 * Re, T_eq=440.0, comp={'CO2': 0.99, 'H2': 0.01}, - F_xuv=0.01, a=0.2, settings=DispatchSettings(T_exo_value=3000.0), + M_p=0.107 * Me, + R_p=0.53 * Re, + T_eq=440.0, + comp={'CO2': 0.99, 'H2': 0.01}, + F_xuv=0.01, + a=0.2, + settings=DispatchSettings(T_exo_value=3000.0), ), ), ( 'base_clamp_decades', - dict(M_p=10 * Me, R_p=1.8 * Re, T_eq=800.0, comp={'CO2': 1.0}, F_xuv=1.0, a=0.5, p_top=1.0), + dict( + M_p=10 * Me, + R_p=1.8 * Re, + T_eq=800.0, + comp={'CO2': 1.0}, + F_xuv=1.0, + a=0.5, + p_top=1.0, + ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), ) @@ -844,9 +1115,7 @@ def test_dispatched_split_names_the_element_that_leaves(): # Hydrostatic: only hydrogen is light enough to leave the Mars-mass host, # and it carries the rate by nineteen decades over the heavy background. static = dispatch( - _inputs( - 0.107 * Me, 0.53 * Re, 440.0, {'CO2': 0.99, 'H2': 0.01}, F_xuv=0.01, a=0.2 * AU - ) + _inputs(0.107 * Me, 0.53 * Re, 440.0, {'CO2': 0.99, 'H2': 0.01}, F_xuv=0.01, a=0.2 * AU) ) assert static.regime == 'hydrostatic' assert set(static.per_species) == {'H', 'C', 'O'} From d12361112a9c82c20a602053ba5485a60198d667 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 20:15:28 +0200 Subject: [PATCH 077/113] Document the overflow label's two readings The regimes page derives the nozzle candidate, its applicability criterion, and the conventions it carries; the results reference separates the rate crossing reading from the geometric rename and adds the nozzle diagnostics group and the two new flags; the parameters page gains nozzle_temperature; the limitations and troubleshooting pages state what the transfer rate assumes and how to read a roche_overflow verdict, including the torque balance regulator the module deliberately does not compute. --- docs/Explanations/limitations.md | 3 ++- docs/Explanations/model.md | 4 ++-- docs/Explanations/regimes.md | 27 ++++++++++++++++++--------- docs/How-to/troubleshooting.md | 7 ++++--- docs/Reference/parameters.md | 1 + docs/Reference/results.md | 11 +++++++---- 6 files changed, 34 insertions(+), 19 deletions(-) diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index 6a2570d0..48f8e710 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,7 +23,8 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. -- **Overflowing states get a bound-flow rate.** The Roche screen names a state whose flow reaches the Hill sphere and reports the rate its branch computed, which is a lower limit: the tidally driven flow through the inner Lagrange point that such a planet actually drives is not modeled, and neither is the accompanying orbital evolution. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. +- **The overflow rate is isothermal, uncapped, and periapsis-evaluated.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two published regulators are not computed: the torque-balance rate (their Eq. 24), which can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds, making the dispatched transfer rate an upper limit in that reading, and the stability of the transfer, which couples to orbital evolution nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. +- **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. ## The impact channel (`collision.mass_loss`) diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 6d4f3a2e..50d5a428 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -15,7 +15,7 @@ Which physics carries the continuous loss depends on how tightly the atmosphere - `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). - `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). - `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. -- `roche_overflow`: the flow region reaches the planet's Hill sphere, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow. The label sits on top of whichever regime above produced the rate, which is then a lower limit, because the tidally driven flow an overflowing planet drives is not modeled. +- `roche_overflow`: either the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017) outruns every bound candidate and is dispatched as the rate, or the flow region reaches the planet's Hill sphere and the label sits on top of whichever regime produced the rate, which is then a lower limit. `diagnostics['roche']['rate_branch']` says which reading applies. The classification logic reduces to three questions, asked in a fixed order: @@ -38,7 +38,7 @@ flowchart TD class Q1,Q2,Q3 decision ``` -The figure shows the logic, not the full machinery: each branch carries its own rate physics, caps, and consistency checks, and two refinements are omitted for clarity (a thermally unstable exosphere re-routes from the hydrostatic branch back to the wind rate, and a residual bolometric rate remains in play past the boil-off gate). The [escape regimes](regimes.md) page walks every step with its equations and thresholds. +The figure shows the logic, not the full machinery: each branch carries its own rate physics, caps, and consistency checks, and three refinements are omitted for clarity (a thermally unstable exosphere re-routes from the hydrostatic branch back to the wind rate, a residual bolometric rate remains in play past the boil-off gate, and the tidally driven L1 transfer rate competes as a final candidate wherever the overflow description applies, taking the overflow label with its own rate when it wins). The [escape regimes](regimes.md) page walks every step with its equations and thresholds. The regime boundaries are not sharp lines in nature. Each threshold carries a physical band (the collisionality threshold spans a factor of 30 across heating geometries, the boil-off threshold a factor of about two across the literature), and ZEPHYRUS reports, beside every verdict, the diagnostics needed to see how close the state sat to each boundary and what the label would have been at the band edges. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index fc6e04a0..462c8e91 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -10,8 +10,8 @@ One call takes one planetary state and returns one verdict. The inputs are the p 2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. 4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. -5. The bolometric residual stays a candidate past the activation gate, capped by the interior luminosity, and takes the rate and the label if it beats whichever branch won above. -6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after the residual comparison, so the radius it tests belongs to the branch that actually won. +5. The bolometric residual stays a candidate past the activation gate, capped by the interior luminosity, and takes the rate and the label if it beats whichever branch won above. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. +6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after both comparisons, so the radius it tests belongs to the branch that actually won. ```mermaid flowchart TD @@ -25,21 +25,24 @@ flowchart TD Q2 -- no --> Q3{"Exobase hotter than half
      the escape temperature?"} Q3 -- yes --> HD Q3 -- no --> HS["HYDROSTATIC
      per-species Jeans
      + diffusion supply cap"] - BO --> Q5 + BO --> QN HD --> Q4{"Luminosity-capped residual
      larger than the branch rate?"} HS --> Q4 Q4 -- yes --> BO2["BOIL-OFF
      residual takes the label"] Q4 -- no --> KEEP["Branch label stands"] - BO2 --> Q5{"Active flow radius
      past the Hill radius?"} - KEEP --> Q5 + BO2 --> QN{"L1 nozzle applicable
      and larger than
      the standing rate?"} + KEEP --> QN + QN -- yes --> RN["ROCHE OVERFLOW
      L1 nozzle transfer rate"] + QN -- no --> Q5{"Active flow radius
      past the Hill radius?"} Q5 -- yes --> RO["ROCHE OVERFLOW
      the branch rate stands,
      as a lower limit"] Q5 -- no --> OUT(["Regime label + bulk rate
      + per-species rates
      + flags + diagnostics"]) + RN --> OUT RO --> OUT classDef regime fill:#1e6091,stroke:#0f3a5c,color:#ffffff classDef decision fill:#f4f4f4,stroke:#888888,color:#111111 classDef stage fill:#ffffff,stroke:#1e6091,color:#111111 - class BO,BO2,HD,HS,RO regime - class Q1,Q2,Q3,Q4,Q5 decision + class BO,BO2,HD,HS,RN,RO regime + class Q1,Q2,Q3,Q4,QN,Q5 decision class BOLO,BASE,HYD,KEEP stage ``` @@ -115,9 +118,11 @@ Two escape temperatures gate the branch's validity. The neutral escape temperatu Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the sonic radius on the boil-off branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is spilling over the gravitational boundary rather than escaping through a bound outflow, and the state is named `roche_overflow` for it. -The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won step 6, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. What the label means is therefore that the flow reaches the lobe and that the rate beside it is the bound-flow estimate, a lower limit on what tides would do. Nothing in this version computes the tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives; the closed form for it is Eq. (3) of Jackson et al. (2017) [^jackson17], and their own reading is worth carrying: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. +The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. -Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`. The other case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. +The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ reaches the L1 distance (their Figure 9 crossover): inward of that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction, while outward of it the gas chokes at its own sonic surface first and the wind branches are the description. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the power needed to lift the dispatched flow to L1 beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. Three conventions travel with the branch: the geometry is evaluated at periapsis (flagged on eccentric wins; the model treats a circular, synchronously rotating donor), the launch level is the photospheric level whose Bernoulli invariance makes the level choice largely cancel, and a launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. + +Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `nozzle`, marks a label won by the rate crossing while the structure sits inside the Hill sphere. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. Near misses (a flow radius above two thirds of the Hill radius, so that the Hill radius is less than 1.5 flow radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. @@ -155,6 +160,10 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 +[^ritter]: Ritter, H. (1988). Turning on and off mass transfer in cataclysmic binaries. *Astronomy & Astrophysics, 202*, 93. + +[^eggleton]: Eggleton, P. P. (1983). Approximations to the radii of Roche lobes. *The Astrophysical Journal, 268*, 368. https://doi.org/10.1086/160960 + [^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 [^cp26]: Chatterjee, R. D., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. *The Astrophysical Journal, 998*(2), 236. https://doi.org/10.3847/1538-4357/ae2ffa diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index a307ff4d..25516163 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -72,11 +72,12 @@ The flux scaling will not separate them either: the base ion density follows $\s **Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. -**What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. +**What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from; `roche_nozzle` means the L1 transfer itself was dispatched), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. -The three cases that produces: +The four cases that produces: -- Subflag `dynamical` and a rate above the floor: the atmosphere reaches its Roche lobe, the rate is the bound-flow estimate, and the real rate is higher by whatever a tidally driven flow through the inner Lagrange point would carry. Treat it as a lower limit. +- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate, not a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. +- Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index d2040d0b..f5e4e53a 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -114,6 +114,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so both candidates measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | +| `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which temperature and mean particle mass evaluate the L1 nozzle candidate's sound speed and barrier: the photospheric level (the construction of Jackson et al. 2017) or the thermostat's wind state (the upper envelope their Figure 9 explores). The temperature is that model's dominant uncertainty by its authors' own statement, so the spread across the two settings is analysis, not a module output. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index d7f1657b..340a8b20 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -26,7 +26,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | -| `roche_overflow` | The active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet. | The rate of the branch that produced it, named in `diagnostics['roche']['rate_branch']`. The screen renames a state and never changes its rate, so the rate under this label is a bound-flow estimate and a lower limit on what tides would do. | +| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate and a lower limit on what tides would do. When `rate_branch` reads `roche_nozzle`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. @@ -78,8 +78,10 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| -| `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius. The label changes; the rate is the one the branch computed. | Reporting only | -| `roche_subflag` | `'dynamical'` or `'no_transonic'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), or only the flow radius does. | Reporting only | +| `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius, or the nozzle candidate won the final comparison. The label changes; the rate is the geometric case's branch rate or the nozzle transfer rate, per `rate_branch`. | Reporting only | +| `roche_subflag` | `'dynamical'`, `'no_transonic'`, or `'nozzle'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), only the flow radius does, or neither: `nozzle` marks a label won by the rate crossing while the structure sits inside the Hill sphere. An atmosphere that spills reads `dynamical` whichever candidate carries the rate. | Reporting only | +| `nozzle_saturated` | `True` | The nozzle won with its launch level at or beyond the lobe radius, where the potential expansion has diverged and the exponential is clamped at 1. The rate is the lobe-filling boundary value of the model, a lower bound on the transfer, rather than an interior point of it. | The rate reflects it | +| `nozzle_periapsis` | `True` | The nozzle won on an eccentric orbit. The geometry was evaluated at periapsis, matching the screen's periapsis Hill radius, on a model built for a circular synchronous donor; elsewhere on the orbit the instantaneous rate is lower. | The rate reflects it | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | | `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. | Reporting only | @@ -105,7 +107,8 @@ Eighteen groups on a typical call. Nothing in the dispatch control flow reads an | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | -| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from, and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | +| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from (`roche_nozzle` when the L1 transfer won), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | +| `nozzle` | `rate_kg_s`, `applicable`, `R_sonic`, `R_sonic_over_R_L1`, `temperature_mode`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not: the rate, the applicability criterion (the candidate competes only where the isothermal sonic radius reaches the L1 distance, their Figure 9 crossover, and only above the one-proton-per-year floor), the temperature and mean mass that built the sound speed, the lobe geometry and both potentials, and the energy accounting. The flow carries no energy cap, so `power_lift_W` (the power to lift the dispatched flow to L1) against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | From e01b76d1e90a4f7afea1640cd8f044eb4335d9ab Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 23:45:50 +0200 Subject: [PATCH 078/113] Correct the diagnostic group and case counts The nozzle group brought the container to nineteen entries on a call that also carries the species closure, and to eighteen without it, so the reference page and the tutorial both understated it by one. The tutorial also sent the reader to three cases in the troubleshooting guide, which lists four. The tutorial's own printed key list already showed nineteen, so the pages disagreed with output quoted on the same page. --- docs/Reference/results.md | 2 +- docs/Tutorials/dispatch.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 340a8b20..b9bcfa36 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -96,7 +96,7 @@ Every flag describes the branch whose rate was dispatched. The hydrodynamic cand ## Diagnostics -Eighteen groups on a typical call. Nothing in the dispatch control flow reads any of them, and there is no option to switch them off: the regime boundaries carry genuine physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that. +Nineteen groups on a typical call. Nothing in the dispatch control flow reads any of them, and there is no option to switch them off: the regime boundaries carry genuine physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that. | Group | Key contents | What it answers | |---|---|---| diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 4021c100..166d3b7d 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -273,13 +273,13 @@ no_transonic The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.95), so a spherical wind chokes before the nozzle does and the candidate stands down. -The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the three cases. +The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. --- ## Step 5: read the diagnostics -A call returns 17 or 18 diagnostic groups, the 18th appearing when a hydrodynamic branch produced the rate and its species split, or when the two escape-temperature conventions disagree, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. +A call returns 18 or 19 diagnostic groups, the 19th appearing when a hydrodynamic branch produced the rate and its species split, or when the two escape-temperature conventions disagree, and none of them gates anything: the dispatch logic never reads them back, and there is no switch to turn them off. The regime boundaries carry real physical uncertainty, and reporting the translation quantities beside every verdict is how the framework handles that instead of hiding it. The [dispatch results reference](../Reference/results.md) documents every key. What follows is the order to read them in, which is the order the questions occur to you. Every snippet in this step uses the same result: From 3717e4d66d1b8d09c4c26f7ca3be133f2c660814 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 23:48:47 +0200 Subject: [PATCH 079/113] Average the L1 transfer over the orbit A secular caller integrates over many orbital periods, so the dispatched transfer is now the time average of Jackson et al. (2017) Eq. 3 over the orbit, Kepler-weighted through the eccentric anomaly and duty-cycled over the arc where the overflow description applies. That arc surrounds periapsis, because the L1 distance grows with separation while the sonic radius does not, and the criterion now uses the L1 distance itself rather than the Hill radius that stood in for it. The lift power is rebuilt from the barrier the rate applied plus the acceleration to the sonic speed, which is the heat an isothermal flow demands, so it stays finite at lobe contact instead of reading a potential the clamp had already discarded. A circular orbit is unchanged to machine precision. --- docs/Explanations/limitations.md | 2 +- docs/Explanations/regimes.md | 2 +- docs/How-to/troubleshooting.md | 2 +- docs/Reference/results.md | 5 +- docs/Tutorials/dispatch.md | 2 +- src/zephyrus/dispatcher.py | 71 ++++++---- src/zephyrus/nozzle.py | 235 ++++++++++++++++++++++++------- tests/test_dispatcher.py | 50 +++++-- tests/test_nozzle.py | 17 +++ 9 files changed, 290 insertions(+), 96 deletions(-) diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index 48f8e710..361bf3fe 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,7 +23,7 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. -- **The overflow rate is isothermal, uncapped, and periapsis-evaluated.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two published regulators are not computed: the torque-balance rate (their Eq. 24), which can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds, making the dispatched transfer rate an upper limit in that reading, and the stability of the transfer, which couples to orbital evolution nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. +- **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two published regulators are not computed: the torque-balance rate (their Eq. 24), which can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds, making the dispatched transfer rate an upper limit in that reading, and the stability of the transfer, which couples to orbital evolution nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. - **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 462c8e91..ad57af58 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -120,7 +120,7 @@ Everything above assumes the flow is bound to the planet. Before the label is fi The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. -The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ reaches the L1 distance (their Figure 9 crossover): inward of that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction, while outward of it the gas chokes at its own sonic surface first and the wind branches are the description. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the power needed to lift the dispatched flow to L1 beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. Three conventions travel with the branch: the geometry is evaluated at periapsis (flagged on eccentric wins; the model treats a circular, synchronously rotating donor), the launch level is the photospheric level whose Bernoulli invariance makes the level choice largely cancel, and a launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. +The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction; where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. The comparison is the one their Figure 9 draws, and they draw it qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening and not a rule they state. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. It is reported for the candidate rather than for the dispatched rate, and both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled: the primary treats a circular, synchronously rotating donor and has no eccentric formulation, so each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies, which is an arc around periapsis because the L1 distance grows with separation while the sonic radius does not. That is what a secular caller needs, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice largely cancel along an isothermal column and only along one. A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer, and under that clamp the rate goes as the cube of the separation, so periapsis is the poorest phase of the orbit rather than the richest. And the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `nozzle`, marks a label won by the rate crossing while the structure sits inside the Hill sphere. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 25516163..631504ba 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -76,7 +76,7 @@ The flux scaling will not separate them either: the base ion density follows $\s The four cases that produces: -- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate, not a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. +- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. - Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index b9bcfa36..8743eb9f 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -81,7 +81,8 @@ The `effect` column says whether the returned rate already reflects the flag or | `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius, or the nozzle candidate won the final comparison. The label changes; the rate is the geometric case's branch rate or the nozzle transfer rate, per `rate_branch`. | Reporting only | | `roche_subflag` | `'dynamical'`, `'no_transonic'`, or `'nozzle'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), only the flow radius does, or neither: `nozzle` marks a label won by the rate crossing while the structure sits inside the Hill sphere. An atmosphere that spills reads `dynamical` whichever candidate carries the rate. | Reporting only | | `nozzle_saturated` | `True` | The nozzle won with its launch level at or beyond the lobe radius, where the potential expansion has diverged and the exponential is clamped at 1. The rate is the lobe-filling boundary value of the model, a lower bound on the transfer, rather than an interior point of it. | The rate reflects it | -| `nozzle_periapsis` | `True` | The nozzle won on an eccentric orbit. The geometry was evaluated at periapsis, matching the screen's periapsis Hill radius, on a model built for a circular synchronous donor; elsewhere on the orbit the instantaneous rate is lower. | The rate reflects it | +| `nozzle_orbit_averaged` | `True` | The nozzle won on an eccentric orbit, so the dispatched rate is a time average over that orbit, each phase evaluated with the circular formula at its own separation. The primary has no eccentric treatment, so the quasi-static evaluation is this module's convention. Periapsis is the richest phase while the barrier is unclamped and the poorest once `nozzle_saturated` is raised, where the rate goes as the cube of the separation. | The rate reflects it | +| `nozzle_partial_orbit` | `True` | The overflow description holds only on an arc around periapsis, so the average is duty-cycled over that arc and `applicable_orbit_fraction` is below one. The rate therefore omits the wind the planet drives on the rest of the orbit, which one dispatched rate cannot also carry. | The rate reflects it | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | | `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. | Reporting only | @@ -108,7 +109,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | | `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from (`roche_nozzle` when the L1 transfer won), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | -| `nozzle` | `rate_kg_s`, `applicable`, `R_sonic`, `R_sonic_over_R_L1`, `temperature_mode`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not: the rate, the applicability criterion (the candidate competes only where the isothermal sonic radius reaches the L1 distance, their Figure 9 crossover, and only above the one-proton-per-year floor), the temperature and mean mass that built the sound speed, the lobe geometry and both potentials, and the energy accounting. The flow carries no energy cap, so `power_lift_W` (the power to lift the dispatched flow to L1) against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained. | +| `nozzle` | `rate_kg_s`, `rate_full_orbit_kg_s`, `rate_periapsis_kg_s`, `rate_apoapsis_kg_s`, `applicable`, `applicable_orbit_fraction`, `saturated_orbit_fraction`, `R_sonic`, `R_L1`, `R_sonic_over_R_L1`, `R_sonic_over_R_L1_apoapsis`, `n_phase`, `temperature_mode`, `r_launch`, `rho_launch`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `power_lift_full_orbit_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not. `rate_kg_s` is what the dispatcher competes: the orbit average duty-cycled over the arc where the overflow description applies, which is where the isothermal sonic radius reaches the L1 distance. `rate_full_orbit_kg_s` is the same average without that gate, so it stays comparable with the primary's own published rates, and the periapsis and apoapsis rates bracket the orbit. The geometry entries (the lobe radius, both potentials, the applied exponent, the nozzle area, `saturated`) are reported at periapsis, the tightest geometry of the orbit. The flow carries no energy cap, so the lift power against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained: `power_lift_W` pairs with the competed rate and `power_lift_full_orbit_W` with the unguarded one. Both are built from the barrier the rate applied plus the acceleration to the sonic speed, which is the heat an isothermal flow demands, so they stay finite and non-trivial at saturation where the barrier is gone and the acceleration is not. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 166d3b7d..3380d753 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -271,7 +271,7 @@ roche_overflow 24622841.930601332 no_transonic ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.95), so a spherical wind chokes before the nozzle does and the candidate stands down. +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s` in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 4d01e6b5..4e4e1c10 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -361,19 +361,25 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # The tidally driven L1 nozzle candidate (Jackson et al. 2017 Eq. 3), # computed at every point: it joins the final comparison on both sides # of the activation gate, and its power comparison is an always-on - # diagnostic. The temperature setting decides what evaluates the sound - # speed and the barrier: the photospheric level (the primary's own - # construction, a bolometrically maintained flow) or the thermostat's - # wind state (the upper envelope their Figure 9 explores). The flow is - # uncapped, faithful to the primary, whose isothermal model has the - # radiation field maintain the temperature; the lift power reported - # beside the interior and intercepted stellar luminosities shows where - # that assumption is strained. + # diagnostic. The temperature setting decides which state the flow is + # launched from: the photospheric level (the primary's own + # construction, a bolometrically maintained flow) or the wind base at + # the thermostat's wind state (the upper envelope their Figure 9 + # explores). Both settings launch from one level with one temperature + # and one mean mass, which is what the Bernoulli cancellation behind + # the launch-level convention requires; the wind setting rebuilds the + # launch density from the ideal gas law at the base pressure rather + # than carrying the photosphere's cold density into a hot sound speed. + # The radius is still the profile's, so the hot structure is not + # solved, only its thermodynamic state, and that is a stated limit. + # The flow is uncapped, faithful to the primary; the lift power + # reported beside the interior and intercepted stellar luminosities + # shows where that assumption is strained. if st.nozzle_temperature == 'wind': t_nozzle, mu_nozzle = t_wind, rr['mu_wind'] * m_p else: t_nozzle, mu_nozzle = photo['T'], photo['mmw'] - nozzle_rate, noz = nz.nozzle_candidate( + nozzle_full, noz = nz.nozzle_candidate( inputs.M_p, inputs.M_star, inputs.a, @@ -383,27 +389,24 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: T=t_nozzle, mu_kg=mu_nozzle, ) - noz['rate_kg_s'] = nozzle_rate - noz['temperature_mode'] = st.nozzle_temperature - # The overflow description applies where the isothermal sonic radius - # reaches the L1 distance (the periapsis Hill radius to leading order - # in the mass ratio), so that no spherical transonic wind fits inside - # the lobe and the nozzle is the constriction (Jackson et al. 2017, - # their Section 4 and Figure 9). Inward of that the flow chokes at its - # own sonic surface and the wind branches are the description, so the - # candidate reports but does not compete. This edge is a criterion + # The dispatched candidate is the average duty-cycled over the arc + # where the overflow description applies; the unguarded average is + # kept beside it so the closed form stays comparable with the + # primary's published rates. The applicability edge is a criterion # boundary like the activation gate, not a rate crossing, and the jump # across it is a result to measure rather than hide. - nozzle_applicable = noz['R_sonic'] >= r_hill - noz['applicable'] = nozzle_applicable - noz['R_sonic_over_R_L1'] = noz['R_sonic'] / r_hill - # The power comparison: what lifting the flow to L1 costs against what - # the planet has. At saturation the barrier is gone and the lift power - # with it. - noz['power_lift_W'] = nozzle_rate * max(noz['delta_phi'], 0.0) + nozzle_rate = noz['rate_applicable_kg_s'] + nozzle_applicable = noz['applicable'] + noz['rate_kg_s'] = nozzle_rate + noz['rate_full_orbit_kg_s'] = nozzle_full + noz['temperature_mode'] = st.nozzle_temperature + # The power comparison: what the isothermal flow demands against what + # the planet has. Built from the barrier the rate applied plus the + # acceleration to the sonic speed, so it stays finite and meaningful + # at saturation, where the barrier is gone and the acceleration is not. noz['L_int_W'] = 4.0 * math.pi * inputs.R_p**2 * inputs.F_int noz['L_bol_intercepted_W'] = math.pi * inputs.R_p**2 * inputs.F_bol - diag['nozzle'] = noz + diag['nozzle'] = dict(noz) # Step 3: the sonic-point Knudsen switch. n_sc = rr['rho_s'] / (rr['mu_plus_wind'] * m_p) # heavy-particle density @@ -536,10 +539,18 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # an interior point of it. flags['nozzle_saturated'] = True if inputs.e > 0.0: - # The geometry is evaluated at periapsis on a model built for - # a circular orbit; elsewhere on the orbit the instantaneous - # rate is lower. - flags['nozzle_periapsis'] = True + # The rate is a time average over the orbit, evaluated with + # the circular formula at each separation. Under saturation it + # scales as the cube of the separation, so periapsis is a + # lower bound there and an upper bound while the barrier is + # unclamped; the average is what a secular caller needs either + # way. + flags['nozzle_orbit_averaged'] = True + if noz['applicable_orbit_fraction'] < 1.0: + # The overflow description holds only on an arc around + # periapsis. The rate is duty-cycled over that arc, so it + # omits the wind the planet drives on the rest of the orbit. + flags['nozzle_partial_orbit'] = True label = 'roche_overflow' if branch == 'roche_nozzle' else branch # Step 6: the Roche screen on the active flow radius. The screen renames diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index 54de06ae..f7f65eeb 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -38,21 +38,36 @@ # and beyond lobe contact the exponent is clamped at zero, which is the # paper's own lobe-filling case (their Figure 5 solid curves), and the # clamped value is a boundary value rather than a trusted rate. +# - L1 distance: the small-mass-ratio expansion of the L1 root, checked +# against the exact stationary point of the corotating axial potential +# (see ``l1_distance``). The Hill radius is its leading order and sits +# 0.5% outside it at planetary mass ratios, 5% at q = 1e-2. # - Applicability: the overflow description holds where the isothermal # sonic radius R_sonic = G M_d / (2 v_th^2) lies at or beyond the L1 # distance, so that no spherical transonic wind fits inside the lobe and -# the L1 nozzle is the flow's constriction (their Section 4 and -# Figure 9). Inward of that the gas chokes at its own sonic surface -# first and the wind branches of this package are the right -# description; the candidate rate is still reported there, but the -# dispatcher does not let it compete. Without this criterion the nozzle -# area, which grows as the cube of the separation, hands a loosely -# bound envelope an unbounded rate at separations where the planet is -# nowhere near its lobe. +# the L1 nozzle is the flow's constriction. Where the sonic radius lies +# inside the L1 distance the gas chokes at its own sonic surface first +# and the wind branches of this package are the right description. +# Without this criterion the nozzle area, which grows as the cube of the +# separation, hands a loosely bound envelope an unbounded rate at +# separations where the planet is nowhere near its lobe. The primary +# draws the comparison qualitatively, in their Section 4 and Figure 9, +# to ask which of the two pictures a planet belongs in; making it a gate +# is this module's sharpening of it and not a rule they state. +# - Orbit average: the returned rate is the time average over the orbit, +# Kepler-weighted through the eccentric anomaly, and the detail dict +# also carries it duty-cycled over the applicable arc, which is what a +# dispatcher competes. A secular caller integrates over many orbital +# periods and needs the mass carried per unit time. Each phase is +# evaluated with the circular formula at its own separation; the primary +# has no eccentric treatment, so the quasi-static evaluation and the +# duty cycle are both ours. At e = 0 the average is the instantaneous +# rate exactly. # - Stated limitations carried from the primary: the flow is isothermal # (their Section 3.1 names the neglected thermal structure), the orbit -# circular and the rotation synchronous (an eccentric caller is -# evaluated at periapsis, our convention rather than theirs), and the +# circular and the rotation synchronous (an eccentric caller is averaged +# over its orbit as above, our convention rather than theirs, and the +# rotation is synchronous at no single phase of such an orbit), and the # rate can overestimate the transfer where the escaping gas keeps its # orbital angular momentum and disk-stellar torque balance regulates the # flow instead (their Eq. 24 and Figure 6); the torque-balance rate @@ -90,6 +105,21 @@ def eggleton_lobe_radius(q: float, separation: float) -> float: return separation * 0.49 * q13**2 / (0.6 * q13**2 + math.log(1.0 + q13)) +def l1_distance(q: float, separation: float) -> float: + """Distance from the donor's center to the inner Lagrange point, in m. + + The small-mass-ratio expansion of the L1 root, ``x_L1/a = eps - + eps^2/3 - eps^3/9`` with ``eps = (q/3)^(1/3)``, which is the Hill + radius at leading order and falls inside it beyond that. Checked + against the exact stationary point of the corotating axial potential: + the relative error is 8e-7 at ``q = 1e-5`` and 7e-4 at ``q = 1e-2``, + against 0.5% and 5.3% for the Hill radius itself. ``separation`` is + the orbital separation [m]. + """ + eps = (q / 3.0) ** (1.0 / 3.0) + return separation * (eps - eps**2 / 3.0 - eps**3 / 9.0) + + def volume_averaged_potential(r_v: float, M_d: float, M_a: float, separation: float) -> float: """Volume-averaged Roche potential at volume-equivalent radius ``r_v``. @@ -114,6 +144,59 @@ def volume_averaged_potential(r_v: float, M_d: float, M_a: float, separation: fl ) +def _phase_state( + M_p: float, + M_star: float, + sep: float, + rho_ph: float, + r_ph: float, + v_th: float, + q: float, + a_curv: float, +) -> dict: + """Rate, geometry, and heat demand at one orbital separation.""" + omega2 = G * (M_p + M_star) / sep**3 + r_lobe = eggleton_lobe_radius(q, sep) + phi_l1 = volume_averaged_potential(r_lobe, M_p, M_star, sep) + phi_ph = volume_averaged_potential(r_ph, M_p, M_star, sep) + delta_phi = phi_l1 - phi_ph + exponent = -delta_phi / v_th**2 + # The saturation test is geometric, not potential-ordered: outside the + # lobe the Eq. (14) expansion diverges downward, so a level beyond + # r_lobe reports a spuriously deep Phi_ph and a large positive barrier + # where the physical barrier is gone. At or beyond contact the + # exponential is clamped at 1 and the rate is the lobe-filling + # boundary value, a lower bound on the transfer (the density at the + # lobe itself exceeds the launch level's). + saturated = r_ph >= r_lobe or exponent >= 0.0 + if saturated: + exponent = 0.0 + area = 2.0 * math.pi * v_th**2 / (omega2 * math.sqrt(a_curv * (a_curv - 1.0))) + rate = rho_ph * math.exp(-0.5 + exponent) * v_th * area + # Heat the isothermal flow demands per unit mass, which is what the + # radiation field has to supply for the uncapped model to hold. For a + # steady flow dh + d(v^2/2) + dPhi = dq, and an isothermal ideal gas + # has dh = 0, so integrating from a launch level at rest to the + # transonic point at L1 gives the barrier the rate actually applied + # plus v_th^2/2. Built from the applied exponent, so it is the + # clamped barrier at saturation and never the divergent one; the + # acceleration term survives there and the barrier does not. + heat = max(-exponent, 0.0) * v_th**2 + 0.5 * v_th**2 + return dict( + separation=sep, + r_lobe=r_lobe, + phi_L1=phi_l1, + phi_ph=phi_ph, + delta_phi=delta_phi, + exponent_applied=exponent, + area_m2=area, + saturated=saturated, + rate=rate, + power=rate * heat, + R_L1=l1_distance(q, sep), + ) + + def nozzle_candidate( M_p: float, M_star: float, @@ -123,20 +206,20 @@ def nozzle_candidate( r_ph: float, T: float, mu_kg: float, + n_phase: int = 64, ) -> tuple[float, dict]: - """Roche-lobe overflow rate through the L1 nozzle, Jackson et al. (2017) Eq. (3). + """Orbit-averaged Roche-lobe overflow rate through the L1 nozzle. + + The rate is Jackson et al. (2017) Eq. (3) at each orbital separation, + averaged in time over the orbit and duty-cycled over the arc where the + overflow description applies. Parameters ---------- M_p, M_star : float Donor (planet) and accretor (star) masses [kg]. a, e : float - Semi-major axis [m] and eccentricity. The geometry is evaluated at - the periapsis separation ``a (1 - e)``, matching the Roche screen's - periapsis Hill radius; the primary treats a circular, synchronously - rotating donor, so the periapsis evaluation is this module's - convention and an upper bound on the instantaneous rate elsewhere - on the orbit. + Semi-major axis [m] and eccentricity. rho_ph, r_ph : float Density [kg m^-3] and radius [m] of the launch level. The profile radius stands in for the volume-equivalent photospheric radius @@ -145,59 +228,107 @@ def nozzle_candidate( near lobe contact and nothing for a donor well inside its lobe. The Bernoulli structure makes rho_ph exp(Phi_ph / v_th^2) level-invariant along an isothermal column, so the level choice - itself largely cancels; the temperature is the sensitivity. + largely cancels there; on a non-isothermal column it does not, and + the temperature is the leading sensitivity either way. T, mu_kg : float Temperature [K] and mean particle mass [kg] evaluating the isothermal sound speed and the exponential barrier. + n_phase : int + Midpoint nodes in eccentric anomaly for the orbit average. The + quadrature converges to machine precision well below the default: + measured relative change 4.3e-7 from 16 to 32 nodes and 3e-14 from + 32 to 64 at e = 0.5 on two states. At ``e = 0`` every node holds + the same value and the average is the instantaneous rate exactly. Returns ------- (rate, detail) - The candidate rate [kg/s] and a detail dict: the sound speed, the - mass ratio and curvature, the lobe radius, both potentials and - their difference, the applied exponent, the nozzle area, and - ``saturated`` (the photospheric potential reached the L1 value, so - the exponent was clamped at zero and the rate is the lobe-filling - boundary value). + The orbit-averaged Eq. (3) rate [kg/s], unguarded, so that the + closed form stays directly comparable with the primary's own + published rates, and a detail dict. The rate a caller should + compete is ``detail['rate_applicable_kg_s']``, the same average + duty-cycled over the arc where the overflow description applies. + In the detail dict, Phase-independent + entries are the sound speed, the sonic radius, the mass ratio, and + the curvature; the geometry entries (lobe radius, both potentials, + the applied exponent, the nozzle area, ``saturated``) are reported + at periapsis, which is the tightest geometry of the orbit; and the + orbit entries are the applicable and saturated orbit fractions, + the periapsis and apoapsis rates, and the averaged lift power, + which is reported both duty-cycled (pairing with the rate a caller + competes) and over the full orbit (pairing with the returned + unguarded rate). """ - a_peri = a * (1.0 - e) + if n_phase < 1: + raise ValueError(f'n_phase must be at least 1, got {n_phase!r}') v_th = math.sqrt(kb * T / mu_kg) - omega2 = G * (M_p + M_star) / a_peri**3 q = M_p / M_star a_curv = curvature_a(q) - r_lobe = eggleton_lobe_radius(q, a_peri) - phi_l1 = volume_averaged_potential(r_lobe, M_p, M_star, a_peri) - phi_ph = volume_averaged_potential(r_ph, M_p, M_star, a_peri) - delta_phi = phi_l1 - phi_ph - exponent = -delta_phi / v_th**2 - # The saturation test is geometric, not potential-ordered: outside the - # lobe the Eq. (14) expansion diverges downward, so a level beyond - # r_lobe reports a spuriously deep Phi_ph and a large positive barrier - # where the physical barrier is gone. At or beyond contact the - # exponential is clamped at 1 and the rate is the lobe-filling - # boundary value, a lower bound on the transfer (the density at the - # lobe itself exceeds the launch level's). - saturated = r_ph >= r_lobe or exponent >= 0.0 - if saturated: - exponent = 0.0 - area = 2.0 * math.pi * v_th**2 / (omega2 * math.sqrt(a_curv * (a_curv - 1.0))) - rate = rho_ph * math.exp(-0.5 + exponent) * v_th * area # The Figure 9 crossover quantity: the overflow description applies # where this sonic radius reaches the L1 distance (see module notes). r_sonic = G * M_p / (2.0 * v_th**2) - return rate, dict( + + # Orbit average. A secular caller integrates over many orbital periods, + # so what it needs is the mass carried per unit time rather than the + # instantaneous rate at one phase. The corotating Roche geometry is + # defined for a circular synchronous donor, so each phase is evaluated + # with the circular formula at that separation and the result averaged + # in time. That quasi-static reading is this module's construction and + # not the primary's, which has no eccentric treatment. Time weighting + # is Kepler's, dt proportional to (1 - e cos E) dE, and the separation + # at that anomaly carries the same factor. + w_sum = rate_sum = power_sum = duty_rate_sum = duty_power_sum = 0.0 + applicable_sum = saturated_sum = 0.0 + for i in range(n_phase): + ecc_anomaly = (i + 0.5) * 2.0 * math.pi / n_phase + w = 1.0 - e * math.cos(ecc_anomaly) + st = _phase_state(M_p, M_star, a * w, rho_ph, r_ph, v_th, q, a_curv) + w_sum += w + rate_sum += w * st['rate'] + power_sum += w * st['power'] + # The applicable arc surrounds periapsis, because the L1 distance + # grows with separation while the sonic radius does not. Off that + # arc the gas chokes at its own sonic surface first and the nozzle + # carries nothing, so the duty-cycled average is what a dispatcher + # should compete. What the duty cycle leaves out is the wind the + # planet drives on the rest of the orbit, which one dispatched + # rate cannot also carry. The returned rate is the unguarded + # Eq. (3) average, so the closed form stays comparable with the + # primary's own published rates; the gate is the caller's. + if r_sonic >= st['R_L1']: + duty_rate_sum += w * st['rate'] + duty_power_sum += w * st['power'] + applicable_sum += w + if st['saturated']: + saturated_sum += w + + peri = _phase_state(M_p, M_star, a * (1.0 - e), rho_ph, r_ph, v_th, q, a_curv) + apo = _phase_state(M_p, M_star, a * (1.0 + e), rho_ph, r_ph, v_th, q, a_curv) + return rate_sum / w_sum, dict( T_K=T, mu_kg=mu_kg, v_th=v_th, R_sonic=r_sonic, q=q, A=a_curv, - a_periapsis=a_peri, - r_lobe=r_lobe, - phi_L1=phi_l1, - phi_ph=phi_ph, - delta_phi=delta_phi, - exponent_applied=exponent, - area_m2=area, - saturated=saturated, + n_phase=n_phase, + a_periapsis=a * (1.0 - e), + r_lobe=peri['r_lobe'], + phi_L1=peri['phi_L1'], + phi_ph=peri['phi_ph'], + delta_phi=peri['delta_phi'], + exponent_applied=peri['exponent_applied'], + area_m2=peri['area_m2'], + saturated=peri['saturated'], + R_L1=peri['R_L1'], + R_sonic_over_R_L1=r_sonic / peri['R_L1'], + R_sonic_over_R_L1_apoapsis=r_sonic / apo['R_L1'], + rate_periapsis_kg_s=peri['rate'], + rate_apoapsis_kg_s=apo['rate'], + rate_applicable_kg_s=duty_rate_sum / w_sum, + applicable=applicable_sum > 0.0, + applicable_orbit_fraction=applicable_sum / w_sum, + saturated_orbit_fraction=saturated_sum / w_sum, + power_lift_W=duty_power_sum / w_sum, + power_lift_full_orbit_W=power_sum / w_sum, ) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 1eabfe29..73093448 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -376,7 +376,12 @@ def test_nozzle_competes_only_inside_its_domain(): noz_o = outside.diagnostics['nozzle'] assert noz_o['applicable'] is False assert noz_o['R_sonic_over_R_L1'] < 1.0 - assert noz_o['rate_kg_s'] > outside.mdot + # The unguarded Eq. (3) average would have won; the duty-cycled rate + # the dispatcher competes is zero, because no arc of the orbit is + # inside the overflow description. + assert noz_o['rate_full_orbit_kg_s'] > outside.mdot + assert noz_o['rate_kg_s'] == 0.0 + assert noz_o['applicable_orbit_fraction'] == 0.0 assert outside.regime == 'boiloff' @@ -456,25 +461,54 @@ def test_nozzle_saturation_flag_marks_lobe_contact(): assert 'nozzle_saturated' not in unsaturated.flags -def test_nozzle_periapsis_flag_on_eccentric_wins_only(): - """An eccentric nozzle win says the geometry was taken at periapsis. +def test_nozzle_orbit_average_on_eccentric_wins_only(): + """An eccentric nozzle win dispatches a duty-cycled orbit average. - The primary treats a circular, synchronously rotating donor, so the - periapsis evaluation is this module's convention and the flag makes it - visible on the result it produced; the circular win must not raise it. + The primary treats a circular, synchronously rotating donor, so both + the quasi-static evaluation at each separation and the duty cycle over + the arc where the overflow description applies are this module's + conventions, and the flags make them visible on the result they + produced. A circular win must raise neither, and its average must be + the instantaneous rate exactly, so the convention costs nothing where + it does not apply. """ ecc = dispatch( _inputs( 3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU, e=0.3 ) ) + noz = ecc.diagnostics['nozzle'] assert ecc.diagnostics['roche']['rate_branch'] == 'roche_nozzle' - assert ecc.flags.get('nozzle_periapsis') is True + assert ecc.flags.get('nozzle_orbit_averaged') is True + # The periapsis separation is the one the geometry is built on, and it + # is not the semi-major axis: a rate taken at ``a`` instead would sit + # 31% below the periapsis value on this state. + assert noz['a_periapsis'] == pytest.approx(0.7 * 0.07 * AU, rel=1e-12) + # The applicable arc surrounds periapsis, because the L1 distance grows + # with separation while the sonic radius does not. + assert noz['R_sonic_over_R_L1'] > 1.0 > noz['R_sonic_over_R_L1_apoapsis'] + assert 0.0 < noz['applicable_orbit_fraction'] < 1.0 + assert ecc.flags.get('nozzle_partial_orbit') is True + # Duty-cycled below the full-orbit average, which is itself below the + # periapsis rate: this donor is unsaturated, so the rate falls with + # separation and periapsis is the richest phase. + assert noz['rate_kg_s'] < noz['rate_full_orbit_kg_s'] < noz['rate_periapsis_kg_s'] + assert ecc.mdot == pytest.approx(noz['rate_kg_s'], rel=1e-12) + circ = dispatch( _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) ) + noz_c = circ.diagnostics['nozzle'] assert circ.diagnostics['roche']['rate_branch'] == 'roche_nozzle' - assert 'nozzle_periapsis' not in circ.flags + assert 'nozzle_orbit_averaged' not in circ.flags + assert 'nozzle_partial_orbit' not in circ.flags + # At most one by construction, so this is the whole-orbit claim without + # an equality against a float literal. + assert noz_c['applicable_orbit_fraction'] >= 1.0 + # Every phase of a circular orbit is the same phase, so the quadrature + # returns the instantaneous rate and the convention is free. + assert noz_c['rate_kg_s'] == pytest.approx(noz_c['rate_periapsis_kg_s'], rel=1e-12) + assert noz_c['rate_apoapsis_kg_s'] == pytest.approx(noz_c['rate_periapsis_kg_s'], rel=1e-12) def test_nozzle_temperature_setting_selects_and_validates(): diff --git a/tests/test_nozzle.py b/tests/test_nozzle.py index 223aa9bb..0cb5f624 100644 --- a/tests/test_nozzle.py +++ b/tests/test_nozzle.py @@ -260,3 +260,20 @@ def test_curvature_rejects_unphysical_mass_ratio(): ok = curvature_a(1e-5) assert math.isfinite(ok) assert 4.0 < ok <= 8.0 + + +def test_orbit_average_rejects_an_empty_quadrature(): + """A non-positive phase count raises rather than dividing by zero. + + The orbit average sums Kepler weights over ``n_phase`` midpoint nodes, + so a count below one has no weight to divide by. A single node is + legal and, on a circular orbit, exact. + """ + m_p, m_s, a = 3.0 * Me, Ms, 0.05 * AU + args = (m_p, m_s, a, 0.0, 1e-6, 2.0 * Re, 1200.0, 2.3 * amu) + for bad in (0, -1): + with pytest.raises(ValueError, match='n_phase'): + nozzle_candidate(*args, n_phase=bad) + one, _ = nozzle_candidate(*args, n_phase=1) + many, _ = nozzle_candidate(*args, n_phase=64) + assert one == pytest.approx(many, rel=1e-12) From ad2ef440dc52562509f1cbeb251ecf3f89025df8 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 23:49:40 +0200 Subject: [PATCH 080/113] Read the overflow subflag against the Roche lobe The subflag claimed to say whether the atmosphere reaches its lobe while testing it against the Hill radius, which sits about 43 percent further out, so a structure past its own lobe could still be reported as staying inside. It now tests the lobe radius, which is the critical surface, and the third value is geometric rather than named after the candidate that won: the mechanism is already carried by the rate branch. The overflow label and its subflag are assigned in one block instead of two, so the precedence rule is written once. The winning branch's flow radius is no longer replaced by the lobe radius, which had pinned the reported ratio at a constant and left the near miss warning suppressed only by clause order. --- docs/Explanations/regimes.md | 2 +- docs/How-to/troubleshooting.md | 2 +- docs/Reference/results.md | 4 +-- docs/Tutorials/dispatch.md | 4 +-- src/zephyrus/dispatcher.py | 48 +++++++++++++++++-------------- tests/test_dispatcher.py | 52 +++++++++++++++++++++++++++------- 6 files changed, 75 insertions(+), 37 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index ad57af58..a68a268a 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -122,7 +122,7 @@ The screen renames a state and never changes its rate. The reason is that the br The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction; where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. The comparison is the one their Figure 9 draws, and they draw it qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening and not a rule they state. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. It is reported for the candidate rather than for the dispatched rate, and both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled: the primary treats a circular, synchronously rotating donor and has no eccentric formulation, so each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies, which is an arc around periapsis because the L1 distance grows with separation while the sonic radius does not. That is what a secular caller needs, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice largely cancel along an isothermal column and only along one. A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer, and under that clamp the rate goes as the cube of the separation, so periapsis is the poorest phase of the orbit rather than the richest. And the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. -Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested against the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `nozzle`, marks a label won by the rate crossing while the structure sits inside the Hill sphere. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. +Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested by comparing the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, against the lobe radius in `diagnostics['nozzle']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `neither`, marks a label won by the rate crossing while neither the atmosphere nor the flow radius reaches out. The comparator for the first case is the Roche lobe itself rather than the Hill radius, since the lobe is the critical surface and sits about 0.70 of the way out to it; `r_atmosphere` and `r_lobe` are both reported so the comparison can be read. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. Near misses (a flow radius above two thirds of the Hill radius, so that the Hill radius is less than 1.5 flow radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 631504ba..2e07877c 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -76,7 +76,7 @@ The flux scaling will not separate them either: the base ion density follows $\s The four cases that produces: -- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. +- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. The subflag beside it reads `dynamical` when the atmosphere's own extent passes the lobe and `neither` when it does not, so it describes the geometry and not the mechanism. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. - Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 8743eb9f..7fa55ce2 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -79,11 +79,11 @@ The `effect` column says whether the returned rate already reflects the flag or | Flag | Value | Meaning | Effect | |---|---|---|---| | `roche_overflow` | `True` | The active flow radius reaches the periapsis Hill radius, or the nozzle candidate won the final comparison. The label changes; the rate is the geometric case's branch rate or the nozzle transfer rate, per `rate_branch`. | Reporting only | -| `roche_subflag` | `'dynamical'`, `'no_transonic'`, or `'nozzle'` | Whether the atmosphere itself reaches the lobe (its outer extent is `r_atmosphere`), only the flow radius does, or neither: `nozzle` marks a label won by the rate crossing while the structure sits inside the Hill sphere. An atmosphere that spills reads `dynamical` whichever candidate carries the rate. | Reporting only | +| `roche_subflag` | `'dynamical'`, `'no_transonic'`, or `'neither'` | The geometry under either route into the label, read against the Roche lobe rather than the Hill radius because the lobe is the critical surface and sits about 0.70 of the way out to it. `dynamical`: the atmosphere itself reaches the lobe, its outer extent being `r_atmosphere` against `r_lobe` in `diagnostics['nozzle']`. `no_transonic`: it does not, but the flow radius passes the Hill radius. `neither`: the label came from the rate crossing alone. An atmosphere that spills reads `dynamical` whichever candidate carries the rate; which candidate that was is `rate_branch`. | Reporting only | | `nozzle_saturated` | `True` | The nozzle won with its launch level at or beyond the lobe radius, where the potential expansion has diverged and the exponential is clamped at 1. The rate is the lobe-filling boundary value of the model, a lower bound on the transfer, rather than an interior point of it. | The rate reflects it | | `nozzle_orbit_averaged` | `True` | The nozzle won on an eccentric orbit, so the dispatched rate is a time average over that orbit, each phase evaluated with the circular formula at its own separation. The primary has no eccentric treatment, so the quasi-static evaluation is this module's convention. Periapsis is the richest phase while the barrier is unclamped and the poorest once `nozzle_saturated` is raised, where the rate goes as the cube of the separation. | The rate reflects it | | `nozzle_partial_orbit` | `True` | The overflow description holds only on an arc around periapsis, so the average is duty-cycled over that arc and `applicable_orbit_fraction` is below one. The rate therefore omits the wind the planet drives on the rest of the orbit, which one dispatched rate cannot also carry. | The rate reflects it | -| `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. | Reporting only | +| `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. Not raised on a state already labeled `roche_overflow`, since the warning is about the tidal inflation of a bound rate. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | | `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 3380d753..f940f20d 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -268,12 +268,12 @@ Output: ```text roche_overflow 24622841.930601332 189433055.79726917 167277833.86655325 0.8830445835470955 -no_transonic +dynamical ``` The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s` in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. -The subflag is the part worth reading. This atmosphere reaches 0.96 Hill radii, just inside the lobe, and only its sonic surface would sit outside, which is `no_transonic`; an atmosphere whose own extent passes the lobe gets `dynamical` instead. The two are far apart physically, and the same screen catches both, so compare `r_atmosphere` against `R_hill_periapsis` in the same group before you trust the label. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. +The subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.37 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `r_atmosphere` against `r_lobe` in `diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. --- diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 4e4e1c10..4d02ace0 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -530,7 +530,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: branch = 'roche_nozzle' rate = nozzle_rate per_species = None - flow_radius = noz['r_lobe'] + # ``flow_radius`` is deliberately left as the branch that lost the + # rate comparison computed it. The nozzle's own flow passes the + # lobe by construction, so substituting the lobe radius would pin + # xi_flow at the fixed lobe-to-Hill ratio and throw away the one + # geometric fact the screen still reports on this branch. The lobe + # radius travels in ``diagnostics['nozzle']['r_lobe']``. for key in tuple(hydro_flags) + ('hydrostatic_lower_limit', 'bolometric_residual'): flags.pop(key, None) if noz['saturated']: @@ -580,28 +585,29 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: r_atmosphere=r_atm, rate_branch=branch, ) - if xi_flow <= 1.0 or xi_ktide <= 1.0: + # The label has two routes in and one precedence rule, written once: + # the geometric trigger on the winning branch's flow radius, and the + # rate crossing when the nozzle candidate won above. The subflag is + # geometric under either route, so an atmosphere that spills reads + # ``dynamical`` whichever candidate carries the rate, and the + # mechanism question is answered by ``rate_branch`` instead. + # ``near_roche`` warns about the tidal inflation of a bound rate, so + # it is not raised once the state is already labeled. + if xi_flow <= 1.0 or xi_ktide <= 1.0 or branch == 'roche_nozzle': label = 'roche_overflow' flags['roche_overflow'] = True - # Dynamical overflow when the atmosphere itself reaches the lobe; - # no transonic solution when only the flow radius does, which is the - # narrow band Owen & Jackson (2012) describe. - flags['roche_subflag'] = ( - 'dynamical' if (xi_ktide <= 1.0 or r_hill <= r_atm) else 'no_transonic' - ) - elif branch == 'roche_nozzle': - # The label arrived through the rate crossing rather than the - # geometric trigger. The subflag still reads the geometry: an - # atmosphere that itself reaches the lobe is dynamical overflow - # whichever candidate carries the rate; ``nozzle`` marks the - # remaining case, a photosphere close enough to the lobe for the - # L1 transfer to outrun the bound branches while the structure - # sits inside the Hill sphere. ``near_roche`` is a warning about - # the tidal inflation of a bound rate, which this rate is not. - flags['roche_overflow'] = True - flags['roche_subflag'] = ( - 'dynamical' if (xi_ktide <= 1.0 or r_hill <= r_atm) else 'nozzle' - ) + # Dynamical overflow when the atmosphere itself reaches the Roche + # lobe, which is the critical surface and sits about 0.70 of the + # way out to the Hill radius; no transonic solution when only the + # flow radius passes the Hill radius, which is the narrow band + # Owen & Jackson (2012) describe; ``neither`` when the label came + # from the rate crossing alone. + if xi_ktide <= 1.0 or r_atm >= noz['r_lobe']: + flags['roche_subflag'] = 'dynamical' + elif xi_flow <= 1.0: + flags['roche_subflag'] = 'no_transonic' + else: + flags['roche_subflag'] = 'neither' elif xi_flow < 1.5: flags['near_roche'] = True diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 73093448..504ae001 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -308,20 +308,50 @@ def test_roche_subflag_separates_the_two_geometries(): assert roche['xi_ktide'] > 1.0 # not the trivial planet-inside-its-lobe case assert roche['r_atmosphere'] > roche['R_hill_periapsis'] - # The other subflag on the branch it naturally belongs to: an inflated - # hydrogen envelope whose Parker sonic radius passes the Hill radius - # while the atmosphere itself stays inside it. + # The second subflag: an atmosphere inside its own Roche lobe whose + # would-be sonic surface sits outside the Hill radius, which is the + # narrow band Owen & Jackson (2012) describe. The comparator is the + # lobe rather than the Hill radius, because the lobe is the critical + # surface and sits about 0.70 of the way out to the Hill radius. bound = dispatch( - _inputs(3 * Me, 2.0 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775 * AU) + _inputs( + 0.5 * Me, + 2.0 * Re, + 1000.0, + {'CO2': 1.0}, + F_xuv=1e-2, + a=0.03 * AU, + settings=DispatchSettings(T_exo_value=2000.0), + ) ) roche_b = bound.diagnostics['roche'] assert bound.regime == 'roche_overflow' assert bound.flags.get('roche_subflag') == 'no_transonic' - assert roche_b['rate_branch'] == 'boiloff' - assert roche_b['xi_flow'] <= 1.0 # the sonic surface is outside the lobe - assert roche_b['r_atmosphere'] < roche_b['R_hill_periapsis'] # the gas is not + assert roche_b['rate_branch'].startswith('hydrodynamic') + assert roche_b['xi_flow'] <= 1.0 # the sonic surface is outside the Hill radius + assert roche_b['r_atmosphere'] < bound.diagnostics['nozzle']['r_lobe'] # the gas is not assert roche_b['xi_ktide'] > 1.0 + # The third: the label won by the rate crossing alone, with neither + # the atmosphere nor the flow radius reaching out. + neither = dispatch( + _inputs( + 0.107 * Me, + 0.53 * Re, + 1000.0, + {'CO2': 1.0}, + F_xuv=1e-4, + a=0.02 * AU, + settings=DispatchSettings(T_exo_value=2000.0), + ) + ) + roche_n = neither.diagnostics['roche'] + assert neither.regime == 'roche_overflow' + assert roche_n['rate_branch'] == 'roche_nozzle' + assert neither.flags.get('roche_subflag') == 'neither' + assert roche_n['r_atmosphere'] < neither.diagnostics['nozzle']['r_lobe'] + assert roche_n['xi_flow'] > 1.0 + def test_nozzle_win_relabels_with_the_transfer_rate(): """A nozzle win labels ``roche_overflow`` and carries a real transfer rate. @@ -413,9 +443,11 @@ def at(a): inner = at(lo) assert inner.regime == 'roche_overflow' assert inner.diagnostics['roche']['rate_branch'] == 'roche_nozzle' - # This donor's structure stays inside the Hill sphere, so the subflag - # marks the rate crossing itself rather than a geometric spill. - assert inner.flags.get('roche_subflag') == 'nozzle' + # This donor's extended structure passes its own Roche lobe while + # staying inside the Hill sphere, so the geometric subflag reads + # dynamical whichever candidate carries the rate. + assert inner.flags.get('roche_subflag') == 'dynamical' + assert inner.diagnostics['roche']['r_atmosphere'] >= inner.diagnostics['nozzle']['r_lobe'] assert at(hi).regime == 'hydrostatic' for _ in range(50): mid = 0.5 * (lo + hi) From 0d75b035626bff4e753c44c123779ee0af6fe253 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 31 Aug 2026 23:50:27 +0200 Subject: [PATCH 081/113] Launch the wind-mode transfer from the wind's own column Under the wind temperature setting the launch density came from the photosphere while the sound speed evaluating the barrier came from the wind, so the two belonged to different structures and the Bernoulli cancellation behind the launch-level convention did not hold: the rate tracked whichever level was nominated, moving by nearly three decades across the plausible range. The launch level now sits on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, since pressure is continuous across the temperature transition and density is not. Across a factor of four in launch radius the rate now holds to half a percent, against a factor of eleven on the profile's colder column, and a test pins both halves. The column places the launch level and makes no claim about structure below the anchor. --- docs/Explanations/regimes.md | 2 +- docs/Reference/parameters.md | 2 +- src/zephyrus/dispatcher.py | 20 +++++++++-- src/zephyrus/nozzle.py | 18 ++++++++++ tests/test_dispatcher.py | 64 ++++++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 5 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index a68a268a..fa2fc4a3 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -120,7 +120,7 @@ Everything above assumes the flow is bound to the planet. Before the label is fi The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. -The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction; where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. The comparison is the one their Figure 9 draws, and they draw it qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening and not a rule they state. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. It is reported for the candidate rather than for the dispatched rate, and both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled: the primary treats a circular, synchronously rotating donor and has no eccentric formulation, so each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies, which is an arc around periapsis because the L1 distance grows with separation while the sonic radius does not. That is what a secular caller needs, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice largely cancel along an isothermal column and only along one. A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer, and under that clamp the rate goes as the cube of the separation, so periapsis is the poorest phase of the orbit rather than the richest. And the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. +The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction; where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. The comparison is the one their Figure 9 draws, and they draw it qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening and not a rule they state. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. It is reported for the candidate rather than for the dispatched rate, and both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled: the primary treats a circular, synchronously rotating donor and has no eccentric formulation, so each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies, which is an arc around periapsis because the L1 distance grows with separation while the sonic radius does not. That is what a secular caller needs, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice largely cancel along an isothermal column and only along one; under `nozzle_temperature = 'wind'` the level moves to the wind's own column, anchored at the wind base, so that the density and the sound speed evaluating the barrier still belong to one structure. Measured across a factor of four in launch radius, the rate holds to half a percent along that column and moves by a factor of eleven along the profile's colder one, which is the size of the inconsistency the anchor removes. A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer, and under that clamp the rate goes as the cube of the separation, so periapsis is the poorest phase of the orbit rather than the richest. And the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested by comparing the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, against the lobe radius in `diagnostics['nozzle']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `neither`, marks a label won by the rate crossing while neither the atmosphere nor the flow radius reaches out. The comparator for the first case is the Roche lobe itself rather than the Hill radius, since the lobe is the critical surface and sits about 0.70 of the way out to it; `r_atmosphere` and `r_lobe` are both reported so the comparison can be read. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index f5e4e53a..4ac94576 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -114,7 +114,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so both candidates measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | -| `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which temperature and mean particle mass evaluate the L1 nozzle candidate's sound speed and barrier: the photospheric level (the construction of Jackson et al. 2017) or the thermostat's wind state (the upper envelope their Figure 9 explores). The temperature is that model's dominant uncertainty by its authors' own statement, so the spread across the two settings is analysis, not a module output. | +| `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 4d02ace0..f64cef00 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -376,16 +376,28 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # reported beside the interior and intercepted stellar luminosities # shows where that assumption is strained. if st.nozzle_temperature == 'wind': - t_nozzle, mu_nozzle = t_wind, rr['mu_wind'] * m_p + t_nozzle = t_wind + mu_nozzle = rr['mu_wind'] * m_p + # The wind's own isothermal column, anchored at the wind base. The + # density there is the ideal-gas value at the base pressure for the + # wind's temperature and mean mass, because pressure is continuous + # across the temperature transition and density is not. The rate is + # invariant along this column, so the anchor is also the launch + # level; ``nozzle.isothermal_column_density`` is what makes that + # invariance true rather than assumed, and the column is a device + # for placing the level, not a claim about structure below the base. + r_nozzle = base['r'] + rho_nozzle = base['p'] * mu_nozzle / (kb * t_nozzle) else: t_nozzle, mu_nozzle = photo['T'], photo['mmw'] + r_nozzle, rho_nozzle = photo['r'], photo['rho'] nozzle_full, noz = nz.nozzle_candidate( inputs.M_p, inputs.M_star, inputs.a, inputs.e, - rho_ph=photo['rho'], - r_ph=photo['r'], + rho_ph=rho_nozzle, + r_ph=r_nozzle, T=t_nozzle, mu_kg=mu_nozzle, ) @@ -400,6 +412,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: noz['rate_kg_s'] = nozzle_rate noz['rate_full_orbit_kg_s'] = nozzle_full noz['temperature_mode'] = st.nozzle_temperature + noz['r_launch'] = r_nozzle + noz['rho_launch'] = rho_nozzle # The power comparison: what the isothermal flow demands against what # the planet has. Built from the barrier the rate applied plus the # acceleration to the sonic speed, so it stays finite and meaningful diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index f7f65eeb..ab69c557 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -144,6 +144,24 @@ def volume_averaged_potential(r_v: float, M_d: float, M_a: float, separation: fl ) +def isothermal_column_density( + rho_ref: float, r_ref: float, r: float, M_p: float, v_th: float +) -> float: + """Density at ``r`` on an isothermal hydrostatic column through ``r_ref``. + + ``rho(r) = rho_ref exp[(G M_p / v_th^2)(1/r - 1/r_ref)]``, the closed + solution of hydrostatic balance in a point-mass potential at constant + sound speed. This is the column the Bernoulli argument behind the + launch-level convention assumes: along it the product + ``rho exp(Phi / v_th^2)`` is constant, so the nozzle rate does not + depend on which level is called the launch level. It is a device for + placing that level consistently with the sound speed evaluating the + barrier, not a claim about the structure below the anchor, which for a + wind anchor is far hotter than the atmosphere really is there. + """ + return rho_ref * math.exp((G * M_p / v_th**2) * (1.0 / r - 1.0 / r_ref)) + + def _phase_state( M_p: float, M_star: float, diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 504ae001..3beaa06b 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -29,6 +29,7 @@ import numpy as np import pytest +from zephyrus.constants import kb from zephyrus.dispatcher import ( REGIME_LABELS, DispatchSettings, @@ -37,6 +38,7 @@ ) from zephyrus.escape import EL_escape from zephyrus.hydrodynamic import caldiroli_efficiency +from zephyrus.nozzle import isothermal_column_density, nozzle_candidate from zephyrus.planets_parameters import Me, Ms, Re from zephyrus.profiles import isothermal_profile, photospheric_level @@ -543,6 +545,68 @@ def test_nozzle_orbit_average_on_eccentric_wins_only(): assert noz_c['rate_apoapsis_kg_s'] == pytest.approx(noz_c['rate_periapsis_kg_s'], rel=1e-12) +@pytest.mark.physics_invariant +def test_wind_launch_level_cancels_along_the_wind_column(): + """In wind mode the launch level cancels along the wind's own column. + + The launch-level convention rests on the Bernoulli invariance of + ``rho exp(Phi / v_th^2)``, which holds only when the density and the + sound speed belong to one column. The wind setting launches from the + wind base at the wind's temperature, so moving the level along the + isothermal column through that anchor must leave the rate alone. The + guard matters because taking the density from the profile's own + (far colder) structure instead moves the rate by more than two decades + over the same range of levels, which is what the invariance claim + would otherwise be hiding. + + The base is placed by hand rather than by the Lopez default, which on + this planet puts the wind base at 1.29 lobe radii: outside the lobe + the exponent is clamped and the rate is the lobe-filling boundary + value, which is linear in the launch density and invariant along no + column at all. + """ + state = _inputs( + 3 * Me, + 2.2 * Re, + 1000.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=13.4, + a=0.07 * AU, + settings=DispatchSettings( + nozzle_temperature='wind', base_method='fixed_pressure', P_base_fixed=5.0 + ), + ) + noz = dispatch(state).diagnostics['nozzle'] + assert not noz['saturated'] + r_ref, rho_ref, v_th = noz['r_launch'], noz['rho_launch'], noz['v_th'] + reference = noz['rate_full_orbit_kg_s'] + + # The discriminator is the same closed form at the wrong sound speed: + # the profile's own, which is what the launch state carried before the + # column was made consistent with the barrier. + v_cold = math.sqrt(kb * state.T_eq / noz['mu_kg']) + on_column, cold_column = [], [] + for factor in (0.6, 0.8, 1.5, 2.5): + r = r_ref * factor + for bucket, speed in ((on_column, v_th), (cold_column, v_cold)): + rho = isothermal_column_density(rho_ref, r_ref, r, state.M_p, speed) + bucket.append( + nozzle_candidate( + state.M_p, + state.M_star, + state.a, + state.e, + rho, + r, + noz['T_K'], + noz['mu_kg'], + )[0] + ) + for value in on_column: + assert value == pytest.approx(reference, rel=0.01) + assert max(cold_column) / min(cold_column) > 5.0 + + def test_nozzle_temperature_setting_selects_and_validates(): """The nozzle temperature setting moves the diagnostic and validates. From aba0cd7e831c3c9a2a9397e3379908e46e36315a Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:05:12 +0200 Subject: [PATCH 082/113] Merge only the winning candidate's warnings Each candidate's flags were merged into the result as they were computed, so a dispatched rate arrived carrying warnings about branches that lost: across three thousand random states, a third of the overflow results still advertised the luminosity cap of a bolometric candidate they had beaten, and hydrostatic extension warnings survived onto rates the hydrostatic branch did not produce. Each candidate now holds its own flags and only the winner's are merged, so the flag set always describes the dispatched rate. Input hygiene stays separate, since a stale input or a clamped base is a property of the state rather than of a candidate. This replaces two hand-maintained lists of flags to discard, which had already drifted once. --- src/zephyrus/dispatcher.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index f64cef00..95491914 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -283,7 +283,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: st.lambda_crit, k_tide=k_factor, ) - flags.update(bolo['flags']) + # Each candidate's warnings are held with that candidate and merged only + # if it wins, so the flag set always describes the dispatched rate and + # never a candidate that lost. Input hygiene (stale inputs, base clamps, + # the tidal factor, hysteresis) is a property of the state rather than of + # a candidate, so it merges as it is found. + bolo_flags = dict(bolo['flags']) diag['lambda_gate'] = lam_gate diag['bolometric'] = {k: v for k, v in bolo.items() if k != 'flags'} diag['bolometric']['rate_kg_s'] = bolo_rate @@ -501,35 +506,32 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: branch = 'boiloff' rate = bolo_rate flow_radius = bolo['R_sonic'] + winner_flags = bolo_flags else: if kn_sc <= threshold: branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) - flags.update(hydro_flags) + winner_flags = hydro_flags elif unstable: branch = hydro_label rate = mdot_hydro flow_radius = max(r_xuv, rr['R_s']) flags['gate_rerouted'] = True - flags.update(hydro_flags) + winner_flags = hydro_flags else: branch = 'hydrostatic' rate = mdot_hs per_species = dict(hs_per_element) - flags.update(hs_flags) + winner_flags = hs_flags flow_radius = hsd['r_exo'] # Step 5: the bolometric residual stays a candidate past the gate. if bolo_rate > rate: branch = 'boiloff' rate = bolo_rate per_species = None - flags['bolometric_residual'] = True flow_radius = bolo['R_sonic'] - # The residual displaces whichever candidate had won, so the - # warnings about that candidate stop describing the result. - for key in tuple(hydro_flags) + ('hydrostatic_lower_limit',): - flags.pop(key, None) + winner_flags = dict(bolo_flags, bolometric_residual=True) # The nozzle candidate competes last, on both sides of the activation # gate, wherever the overflow description applies: where the # photosphere approaches the lobe, the tidally driven transfer through @@ -550,13 +552,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # xi_flow at the fixed lobe-to-Hill ratio and throw away the one # geometric fact the screen still reports on this branch. The lobe # radius travels in ``diagnostics['nozzle']['r_lobe']``. - for key in tuple(hydro_flags) + ('hydrostatic_lower_limit', 'bolometric_residual'): - flags.pop(key, None) + winner_flags = {} if noz['saturated']: # The photospheric potential reached the L1 value, so the rate # is the lobe-filling boundary value of the model rather than # an interior point of it. - flags['nozzle_saturated'] = True + winner_flags['nozzle_saturated'] = True if inputs.e > 0.0: # The rate is a time average over the orbit, evaluated with # the circular formula at each separation. Under saturation it @@ -564,12 +565,14 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # lower bound there and an upper bound while the barrier is # unclamped; the average is what a secular caller needs either # way. - flags['nozzle_orbit_averaged'] = True + winner_flags['nozzle_orbit_averaged'] = True if noz['applicable_orbit_fraction'] < 1.0: # The overflow description holds only on an arc around # periapsis. The rate is duty-cycled over that arc, so it # omits the wind the planet drives on the rest of the orbit. - flags['nozzle_partial_orbit'] = True + winner_flags['nozzle_partial_orbit'] = True + # Only the winner's warnings reach the result. + flags.update(winner_flags) label = 'roche_overflow' if branch == 'roche_nozzle' else branch # Step 6: the Roche screen on the active flow radius. The screen renames From 244c2e9bcb64eafd06f02d6f362289f2cf0ae272 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:05:46 +0200 Subject: [PATCH 083/113] Name the dispatched transfer with its own label The rate branch reported alongside an overflow verdict took a value that no exported tuple contained, so a consumer validating it against the regime labels failed silently and nothing enumerated the legal set. The transfer now reports the label itself, which puts every value back inside the regime labels: reading roche_overflow there means the L1 transfer was dispatched, and any other value under that label means the geometric screen renamed a state whose rate that branch produced. The geometric case needs no name of its own, since it ships whatever rate won before the screen and the screen is already visible in the flags. --- docs/How-to/troubleshooting.md | 4 ++-- docs/Reference/results.md | 4 ++-- src/zephyrus/dispatcher.py | 6 +++--- tests/test_dispatcher.py | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 2e07877c..65f2060f 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -72,11 +72,11 @@ The flux scaling will not separate them either: the base ion density follows $\s **Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. -**What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from; `roche_nozzle` means the L1 transfer itself was dispatched), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. +**What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from; `roche_overflow` means the L1 transfer itself was dispatched, and any other value under that label means the geometric screen renamed a state whose rate that branch produced), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. The four cases that produces: -- `rate_branch` reading `roche_nozzle`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. The subflag beside it reads `dynamical` when the atmosphere's own extent passes the lobe and `neither` when it does not, so it describes the geometry and not the mechanism. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. +- `rate_branch` reading `roche_overflow`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. The subflag beside it reads `dynamical` when the atmosphere's own extent passes the lobe and `neither` when it does not, so it describes the geometry and not the mechanism. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. - Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 7fa55ce2..8100fe78 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -26,7 +26,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | -| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate and a lower limit on what tides would do. When `rate_branch` reads `roche_nozzle`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | +| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate and a lower limit on what tides would do. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. @@ -108,7 +108,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | -| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from (`roche_nozzle` when the L1 transfer won), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | +| `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from, always one of the regime labels (`roche_overflow` itself when the L1 transfer won, and the producing branch when the screen renamed a bound state), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | | `nozzle` | `rate_kg_s`, `rate_full_orbit_kg_s`, `rate_periapsis_kg_s`, `rate_apoapsis_kg_s`, `applicable`, `applicable_orbit_fraction`, `saturated_orbit_fraction`, `R_sonic`, `R_L1`, `R_sonic_over_R_L1`, `R_sonic_over_R_L1_apoapsis`, `n_phase`, `temperature_mode`, `r_launch`, `rho_launch`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `power_lift_full_orbit_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not. `rate_kg_s` is what the dispatcher competes: the orbit average duty-cycled over the arc where the overflow description applies, which is where the isothermal sonic radius reaches the L1 distance. `rate_full_orbit_kg_s` is the same average without that gate, so it stays comparable with the primary's own published rates, and the periapsis and apoapsis rates bracket the orbit. The geometry entries (the lobe radius, both potentials, the applied exponent, the nozzle area, `saturated`) are reported at periapsis, the tightest geometry of the orbit. The flow carries no energy cap, so the lift power against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained: `power_lift_W` pairs with the competed rate and `power_lift_full_orbit_W` with the unguarded one. Both are built from the barrier the rate applied plus the acceleration to the sonic speed, which is the heat an isothermal flow demands, so they stay finite and non-trivial at saturation where the barrier is gone and the acceleration is not. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | | `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 95491914..6d45d125 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -543,7 +543,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # corner on no physical content (the floor otherwise stays reported # and never applied, and a geometric verdict still ignores it). if nozzle_applicable and nozzle_rate > rate and nozzle_rate > dg.RATE_FLOOR_KG_S: - branch = 'roche_nozzle' + branch = 'roche_overflow' rate = nozzle_rate per_species = None # ``flow_radius`` is deliberately left as the branch that lost the @@ -573,7 +573,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: winner_flags['nozzle_partial_orbit'] = True # Only the winner's warnings reach the result. flags.update(winner_flags) - label = 'roche_overflow' if branch == 'roche_nozzle' else branch + label = branch # Step 6: the Roche screen on the active flow radius. The screen renames # the state and never touches the rate. Its boundary is a rate @@ -610,7 +610,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # mechanism question is answered by ``rate_branch`` instead. # ``near_roche`` warns about the tidal inflation of a bound rate, so # it is not raised once the state is already labeled. - if xi_flow <= 1.0 or xi_ktide <= 1.0 or branch == 'roche_nozzle': + if xi_flow <= 1.0 or xi_ktide <= 1.0 or branch == 'roche_overflow': label = 'roche_overflow' flags['roche_overflow'] = True # Dynamical overflow when the atmosphere itself reaches the Roche diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 3beaa06b..335b1d37 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -349,7 +349,7 @@ def test_roche_subflag_separates_the_two_geometries(): ) roche_n = neither.diagnostics['roche'] assert neither.regime == 'roche_overflow' - assert roche_n['rate_branch'] == 'roche_nozzle' + assert roche_n['rate_branch'] == 'roche_overflow' assert neither.flags.get('roche_subflag') == 'neither' assert roche_n['r_atmosphere'] < neither.diagnostics['nozzle']['r_lobe'] assert roche_n['xi_flow'] > 1.0 @@ -360,7 +360,7 @@ def test_nozzle_win_relabels_with_the_transfer_rate(): A puffy sub-Neptune whose photosphere sits within a few thermal units of its lobe dispatches the Jackson et al. (2017) L1 rate: the label is - ``roche_overflow``, the branch is ``roche_nozzle``, the subflag reads + ``roche_overflow``, the branch is ``roche_overflow`` too, the subflag reads ``dynamical`` because this envelope's extended structure itself reaches past the Hill sphere and the geometric reading takes precedence, the split is unfractionated (the nozzle is a bulk photospheric flow, not @@ -372,7 +372,7 @@ def test_nozzle_win_relabels_with_the_transfer_rate(): ) noz = res.diagnostics['nozzle'] assert res.regime == 'roche_overflow' - assert res.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert res.diagnostics['roche']['rate_branch'] == 'roche_overflow' assert res.flags.get('roche_subflag') == 'dynamical' assert ( res.diagnostics['roche']['r_atmosphere'] > res.diagnostics['roche']['R_hill_periapsis'] @@ -444,7 +444,7 @@ def at(a): lo, hi = 0.010 * AU, 0.014 * AU inner = at(lo) assert inner.regime == 'roche_overflow' - assert inner.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert inner.diagnostics['roche']['rate_branch'] == 'roche_overflow' # This donor's extended structure passes its own Roche lobe while # staying inside the Hill sphere, so the geometric subflag reads # dynamical whichever candidate carries the rate. @@ -483,7 +483,7 @@ def test_nozzle_saturation_flag_marks_lobe_contact(): ) ) assert saturated.regime == 'roche_overflow' - assert saturated.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert saturated.diagnostics['roche']['rate_branch'] == 'roche_overflow' assert saturated.flags.get('nozzle_saturated') is True assert saturated.diagnostics['nozzle']['saturated'] is True assert math.isfinite(saturated.mdot) @@ -491,7 +491,7 @@ def test_nozzle_saturation_flag_marks_lobe_contact(): unsaturated = dispatch( _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) ) - assert unsaturated.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert unsaturated.diagnostics['roche']['rate_branch'] == 'roche_overflow' assert 'nozzle_saturated' not in unsaturated.flags @@ -512,7 +512,7 @@ def test_nozzle_orbit_average_on_eccentric_wins_only(): ) ) noz = ecc.diagnostics['nozzle'] - assert ecc.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert ecc.diagnostics['roche']['rate_branch'] == 'roche_overflow' assert ecc.flags.get('nozzle_orbit_averaged') is True # The periapsis separation is the one the geometry is built on, and it # is not the semi-major axis: a rate taken at ``a`` instead would sit @@ -533,7 +533,7 @@ def test_nozzle_orbit_average_on_eccentric_wins_only(): _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) ) noz_c = circ.diagnostics['nozzle'] - assert circ.diagnostics['roche']['rate_branch'] == 'roche_nozzle' + assert circ.diagnostics['roche']['rate_branch'] == 'roche_overflow' assert 'nozzle_orbit_averaged' not in circ.flags assert 'nozzle_partial_orbit' not in circ.flags # At most one by construction, so this is the whole-orbit claim without From 1b38d32aa0bfd70277d38185dbd7caaac43f8c09 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:06:12 +0200 Subject: [PATCH 084/113] Reject unphysical arguments on the nozzle surface The overflow module is documented public API with its own reference page, but only the mass ratio was checked, so a direct caller got a negative mass-loss rate from a negative density, a complex cube root from a negative mass ratio, and a bare division by zero from a launch level at the origin or an eccentricity of one. Every exported function now raises with a message naming the argument, in the style the mass-ratio check already used. Nothing reachable through the dispatcher changes, since the state and profile validation upstream already excluded these cases. --- src/zephyrus/nozzle.py | 41 +++++++++++++++++++++++++++++++++++++++++ tests/test_nozzle.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index ab69c557..3a1a67b7 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -81,6 +81,18 @@ _B2 = _B1 / 4.0 - 2.0 +def _positive(name: str, value: float) -> float: + """Return ``value``, or raise if it is not a positive finite number. + + The module is a public surface with its own reference page, so a caller + reaching it directly gets a message rather than a negative mass-loss + rate, a complex cube root, or a bare division by zero. + """ + if not math.isfinite(value) or value <= 0.0: + raise ValueError(f'{name} must be positive and finite, got {value!r}') + return value + + def curvature_a(q: float) -> float: """Dimensionless L1 curvature A(q) of Jackson et al. (2017) Eq. (10). @@ -101,6 +113,9 @@ def eggleton_lobe_radius(q: float, separation: float) -> float: (2017) Section 2.1, accurate to 1% for all mass ratios ``q`` (donor over accretor); ``separation`` is the orbital separation [m]. """ + if q <= 0.0 or not math.isfinite(q): + raise ValueError(f'q must be a positive finite mass ratio, got {q!r}') + _positive('separation', separation) q13 = q ** (1.0 / 3.0) return separation * 0.49 * q13**2 / (0.6 * q13**2 + math.log(1.0 + q13)) @@ -116,6 +131,9 @@ def l1_distance(q: float, separation: float) -> float: against 0.5% and 5.3% for the Hill radius itself. ``separation`` is the orbital separation [m]. """ + if q <= 0.0 or not math.isfinite(q): + raise ValueError(f'q must be a positive finite mass ratio, got {q!r}') + _positive('separation', separation) eps = (q / 3.0) ** (1.0 / 3.0) return separation * (eps - eps**2 / 3.0 - eps**3 / 9.0) @@ -131,6 +149,10 @@ def volume_averaged_potential(r_v: float, M_d: float, M_a: float, separation: fl percent as ``r_v`` approaches the lobe radius, which the primary quantifies as about a factor of two in the final rate. """ + _positive('r_v', r_v) + _positive('M_d', M_d) + _positive('M_a', M_a) + _positive('separation', separation) m_t = M_d + M_a x = r_v / separation bracket = ( @@ -159,6 +181,12 @@ def isothermal_column_density( barrier, not a claim about the structure below the anchor, which for a wind anchor is far hotter than the atmosphere really is there. """ + _positive('r', r) + _positive('r_ref', r_ref) + _positive('M_p', M_p) + _positive('v_th', v_th) + if not math.isfinite(rho_ref) or rho_ref < 0.0: + raise ValueError(f'rho_ref must be non-negative and finite, got {rho_ref!r}') return rho_ref * math.exp((G * M_p / v_th**2) * (1.0 / r - 1.0 / r_ref)) @@ -279,6 +307,19 @@ def nozzle_candidate( """ if n_phase < 1: raise ValueError(f'n_phase must be at least 1, got {n_phase!r}') + for name, value in ( + ('M_p', M_p), + ('M_star', M_star), + ('a', a), + ('r_ph', r_ph), + ('T', T), + ('mu_kg', mu_kg), + ): + _positive(name, value) + if not math.isfinite(rho_ph) or rho_ph < 0.0: + raise ValueError(f'rho_ph must be non-negative and finite, got {rho_ph!r}') + if not math.isfinite(e) or not 0.0 <= e < 1.0: + raise ValueError(f'e must satisfy 0 <= e < 1, got {e!r}') v_th = math.sqrt(kb * T / mu_kg) q = M_p / M_star a_curv = curvature_a(q) diff --git a/tests/test_nozzle.py b/tests/test_nozzle.py index 0cb5f624..af3d28fd 100644 --- a/tests/test_nozzle.py +++ b/tests/test_nozzle.py @@ -28,6 +28,7 @@ from zephyrus.nozzle import ( curvature_a, eggleton_lobe_radius, + isothermal_column_density, nozzle_candidate, volume_averaged_potential, ) @@ -262,6 +263,42 @@ def test_curvature_rejects_unphysical_mass_ratio(): assert 4.0 < ok <= 8.0 +def test_public_surface_rejects_unphysical_arguments(): + """Every exported function raises on unphysical input, not silently. + + The module is documented public API, so a direct caller must not get a + negative mass-loss rate from a negative density, a complex cube root + from a negative mass ratio, or a bare division by zero from a launch + level at the origin. Each case below returned one of those before the + guards existed. + """ + m_p, m_s, a = 3.0 * Me, Ms, 0.05 * AU + ok = dict( + M_p=m_p, M_star=m_s, a=a, e=0.0, rho_ph=1e-6, r_ph=2.0 * Re, T=1200.0, mu_kg=2.3 * amu + ) + for bad, match in ( + (dict(rho_ph=-1.0), 'rho_ph'), + (dict(e=1.5), 'e must satisfy'), + (dict(e=-0.1), 'e must satisfy'), + (dict(T=-100.0), 'T'), + (dict(r_ph=0.0), 'r_ph'), + (dict(M_p=math.inf), 'M_p'), + ): + with pytest.raises(ValueError, match=match): + nozzle_candidate(**{**ok, **bad}) + for bad in (0.0, -1.0, math.nan): + with pytest.raises(ValueError, match='mass ratio'): + eggleton_lobe_radius(bad, a) + with pytest.raises(ValueError, match='r_v'): + volume_averaged_potential(-1.0, m_p, m_s, a) + with pytest.raises(ValueError, match='r'): + isothermal_column_density(1e-6, 1e7, 0.0, m_p, 1e4) + # A valid call on the same path still returns a positive finite rate. + rate, _ = nozzle_candidate(**ok) + assert math.isfinite(rate) + assert rate > 0.0 + + def test_orbit_average_rejects_an_empty_quadrature(): """A non-positive phase count raises rather than dividing by zero. From 76a676538143f7e1935164a4a756c52c75badc48 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:13:24 +0200 Subject: [PATCH 085/113] Measure the launch level as a width off an isothermal column The transfer rate is invariant to the launch level only along a column whose sound speed matches the density it carries, and every dispatcher fixture was isothermal at the equilibrium temperature, so no test could see that cancellation fail or tell a profile temperature from an equilibrium one. A fixture with a temperature rising through the column now measures the residual: a factor 2.4 across three decades of launch level, against 1.14 on the isothermal control. Three gaps close with it: the flow radius reported on an overflow win is pinned as the wind's rather than the lobe's, the bulk split on that branch is pinned against the Jeans split its rival would have produced, and the boxedness check gains an overflow state. The unreachable second clause of the saturation test is gone, since the potential rises monotonically to the lobe at every mass ratio and the exponent can only reach zero where the geometry already has. --- src/zephyrus/nozzle.py | 18 +++-- tests/test_dispatcher.py | 150 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 159 insertions(+), 9 deletions(-) diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index 3a1a67b7..0c1aa880 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -207,14 +207,18 @@ def _phase_state( phi_ph = volume_averaged_potential(r_ph, M_p, M_star, sep) delta_phi = phi_l1 - phi_ph exponent = -delta_phi / v_th**2 - # The saturation test is geometric, not potential-ordered: outside the - # lobe the Eq. (14) expansion diverges downward, so a level beyond - # r_lobe reports a spuriously deep Phi_ph and a large positive barrier - # where the physical barrier is gone. At or beyond contact the + # The saturation test is geometric rather than potential-ordered: + # outside the lobe the Eq. (14) expansion diverges downward, so a level + # beyond r_lobe reports a spuriously deep Phi_ph and a large positive + # barrier where the physical barrier is gone. At or beyond contact the # exponential is clamped at 1 and the rate is the lobe-filling - # boundary value, a lower bound on the transfer (the density at the - # lobe itself exceeds the launch level's). - saturated = r_ph >= r_lobe or exponent >= 0.0 + # boundary value, a lower bound on the transfer, since the density at + # the lobe itself exceeds the launch level's. Testing the exponent as + # well would add nothing: the Eq. (14) potential rises monotonically + # from the center to the lobe at every mass ratio from 1e-7 to 1, so + # the barrier is strictly positive at every interior level and the + # exponent reaches zero only where the geometry already has. + saturated = r_ph >= r_lobe if saturated: exponent = 0.0 area = 2.0 * math.pi * v_th**2 / (omega2 * math.sqrt(a_curv * (a_curv - 1.0))) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 335b1d37..c1f933c7 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -29,7 +29,8 @@ import numpy as np import pytest -from zephyrus.constants import kb +from zephyrus.composition import species_mass_amu +from zephyrus.constants import G, amu, kb from zephyrus.dispatcher import ( REGIME_LABELS, DispatchSettings, @@ -40,7 +41,7 @@ from zephyrus.hydrodynamic import caldiroli_efficiency from zephyrus.nozzle import isothermal_column_density, nozzle_candidate from zephyrus.planets_parameters import Me, Ms, Re -from zephyrus.profiles import isothermal_profile, photospheric_level +from zephyrus.profiles import Profile, isothermal_profile, photospheric_level pytestmark = [pytest.mark.smoke, pytest.mark.timeout(60)] @@ -78,6 +79,40 @@ def _inputs(M_p, R_p, T_eq, comp, F_xuv, a=0.1 * AU, e=0.0, p_surf=1e7, p_top=1e return EscapeInputs(**defaults) +def _inverted_profile(M_p, R_p, T_base, T_top, comp, p_surf=1e7, p_top=1e-5, n=160): + """Hydrostatic profile whose temperature rises with altitude. + + The isothermal builder makes the profile temperature identical to + ``T_eq`` at every level, so no test on it can tell a profile + temperature from an equilibrium one, and no test on it can see the + launch-level cancellation fail. This integrates the same hydrostatic + relation on a temperature that ramps linearly in log pressure, which is + the shape a real upper atmosphere has and the shape that breaks the + isothermal Bernoulli argument. + """ + tot = sum(comp.values()) + mu = sum(x * species_mass_amu(sp) for sp, x in comp.items()) / tot * amu + lnp = np.linspace(math.log(p_surf), math.log(p_top), n) + frac = (lnp - lnp[0]) / (lnp[-1] - lnp[0]) + T = T_base + (T_top - T_base) * frac + r = np.empty(n) + r[0] = R_p + last = n - 1 + for i in range(n - 1): + H = kb * T[i] * r[i] ** 2 / (G * M_p * mu) + r[i + 1] = r[i] - H * (lnp[i + 1] - lnp[i]) + if G * M_p * mu / (kb * T[i + 1] * r[i + 1]) < 2.2: + # The same boundedness stop the isothermal builder uses: past + # it the scale height grows faster than the radius and the + # integration runs away instead of describing an atmosphere. + last = i + break + lnp, r, T = lnp[: last + 1], r[: last + 1], T[: last + 1] + n = last + 1 + vmr = {sp: np.full(n, x / tot) for sp, x in comp.items()} + return Profile(p=np.exp(lnp), r=r, T=T, vmr=vmr, mmw=np.full(n, mu), kzz=None) + + def _random_inputs(rng): """One random draw over masses, radii, temperatures, and compositions.""" M_p = rng.uniform(0.5, 20.0) * Me @@ -678,6 +713,9 @@ def test_diagnostics_are_boxed(monkeypatch): 'boiloff': _inputs( Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU ), + 'roche_overflow': _inputs( + 3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU + ), } reference = {k: dispatch(v) for k, v in states.items()} for expected, res in zip(states, reference.values()): @@ -1233,6 +1271,114 @@ def _flag_state(spec): @pytest.mark.physics_invariant +@pytest.mark.physics_invariant +def test_launch_level_is_a_width_on_a_realistic_column(): + """Off an isothermal column the launch level is a width, not a cancellation. + + The transfer rate is invariant to the launch level only along a column + whose sound speed matches the density that column carries. Real + profiles are not isothermal, so the cancellation leaves a residual, and + the residual is reported rather than assumed small. The isothermal + control is the contrast: the same sweep on the builder every other test + uses moves the rate by a few percent, while a modest inversion moves it + by a factor. + """ + comp = {'H2': 0.9, 'He': 0.1} + inverted = _inverted_profile(3 * Me, 2.2 * Re, 1000.0, 1600.0, comp) + # The profile is warmer than the equilibrium temperature everywhere + # above its base, so a rate reading T_eq instead of the profile is + # detectable here and is not on an isothermal fixture. + assert inverted.T[-1] > inverted.T[0] + spreads = {} + for label, profile in (('inverted', inverted), ('isothermal', None)): + rates = [] + for p_photo in (2.0e4, 2.0e3, 2.0e2, 2.0e1): + extra = {'profile': profile} if profile is not None else {} + state = _inputs( + 3 * Me, + 2.2 * Re, + 1000.0, + comp, + F_xuv=13.4, + a=0.07 * AU, + settings=DispatchSettings(P_photo=p_photo), + **extra, + ) + rates.append(dispatch(state).diagnostics['nozzle']['rate_full_orbit_kg_s']) + spreads[label] = max(rates) / min(rates) + assert spreads['isothermal'] < 1.2 + assert spreads['inverted'] > 2.0 + noz = dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, comp, F_xuv=13.4, a=0.07 * AU, profile=inverted) + ).diagnostics['nozzle'] + assert noz['T_K'] > 1000.0 # the profile's photospheric level, not T_eq + + +def test_nozzle_win_keeps_the_losing_branch_flow_radius(): + """A nozzle win reports the wind's flow radius, not the lobe radius. + + The lobe radius is a fixed fraction of the Hill radius at every + planetary mass ratio, so substituting it would pin the reported ratio + at a constant and discard the one geometric fact the screen still + carries on this branch. The lobe radius has its own key. + """ + res = dispatch( + _inputs(3 * Me, 2.2 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=13.4, a=0.07 * AU) + ) + roche, noz = res.diagnostics['roche'], res.diagnostics['nozzle'] + assert roche['rate_branch'] == 'roche_overflow' + assert roche['flow_radius'] != pytest.approx(noz['r_lobe'], rel=1e-6) + assert roche['xi_flow'] == pytest.approx( + roche['R_hill_periapsis'] / roche['flow_radius'], rel=1e-12 + ) + # The constant the substitution would have produced, for contrast. + assert roche['R_hill_periapsis'] / noz['r_lobe'] == pytest.approx(1.418, rel=0.01) + + +def test_nozzle_win_splits_by_reservoir_not_by_the_losing_branch(): + """A nozzle win carries a bulk split, not the split its rival computed. + + The transfer is a bulk flow through L1 with no per-species physics, so + the elements leave in their reservoir proportions. The state below is + the discriminator: its hydrostatic rival gives hydrogen the entire + flux by Jeans selection, so inheriting that split instead of replacing + it would be visible as hydrogen dominating a carbon dioxide planet. + """ + settings = DispatchSettings(T_exo_value=2000.0) + won = dispatch( + _inputs( + 0.107 * Me, + 0.53 * Re, + 600.0, + {'CO2': 0.99, 'H2': 0.01}, + F_xuv=1e-4, + a=0.008 * AU, + settings=settings, + ) + ) + assert won.diagnostics['roche']['rate_branch'] == 'roche_overflow' + total = sum(won.per_species.values()) + assert total == pytest.approx(won.mdot, rel=1e-12) + shares = {k: v / total for k, v in won.per_species.items()} + assert shares['O'] > shares['C'] > shares['H'] + assert shares['H'] < 1e-2 + # The same composition on the branch the nozzle displaced, for contrast. + rival = dispatch( + _inputs( + 0.107 * Me, + 0.53 * Re, + 600.0, + {'CO2': 0.99, 'H2': 0.01}, + F_xuv=1e-4, + a=0.2 * AU, + settings=settings, + ) + ) + assert rival.regime == 'hydrostatic' + rival_total = sum(rival.per_species.values()) + assert rival.per_species['H'] / rival_total > 0.99 + + def test_dispatched_split_names_the_element_that_leaves(): """The dispatched split is checked by identity, not only by its sum. From 61d13851e0e1e6331ef1a2b190d00a8851f73899 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:15:56 +0200 Subject: [PATCH 086/113] State what the Table 2 anchor covers The validation page described Jackson et al.'s Table 2 as six rows with two near-lobe hot Jupiters left unpinned, and quoted a residual of 1.4 to 1.7 that only exists after a radius conversion this implementation deliberately omits. The table lists twenty-one objects, seventeen of which this implementation does not reproduce, by factors running to 3.9e6 and rising monotonically with launch depth. The pin now covers every row whose launch level sits below 0.4 lobe radii, four instead of two, at the depth where the potential approximation holds, and the page states the two causes of the shortfall: the omitted radius conversion, which needs 2.2 to 5.2 percent in radius against an exponential sensitivity of 9.7 to 276, and the assumed masses the candidate rows carry. Three quoted figures are corrected: the agreement against the total potential is dominated by a constant that cancels, the Figure 5 anchor asserts at 30 percent and exercises no barrier, and the curvature row no longer cites the paper's own printed asymptotic, which carries half the coefficient the fit uses. --- docs/Validation/nozzle.md | 25 ++++++++++++++++----- tests/test_nozzle.py | 46 ++++++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/docs/Validation/nozzle.md b/docs/Validation/nozzle.md index 408250d2..65edba0d 100644 --- a/docs/Validation/nozzle.md +++ b/docs/Validation/nozzle.md @@ -4,17 +4,30 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the Roche | Test id | Reference | Scope | |---|---|---| -| `tests/test_nozzle.py::test_table2_planets_reproduce_published_rates` | Jackson et al. (2017), ApJ 835, 145, Table 2 (Kepler-21 b and CoRoT-24 b) with their Section 3 input prescriptions | The full closed form (their Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius) reproduces the two printed rates whose donors sit well inside their lobes, where the potential approximation is good, to 3%. | -| `tests/test_nozzle.py::test_lobe_filling_binaries_land_on_figure5` | Jackson et al. (2017) Figure 5 and Table 1 (Ritter 1988 Table A1 binaries, 0.8 solar-mass accretor) | The saturated lobe-filling limit lands on the printed solid curve at two donor masses within figure-reading tolerance, anchoring the boundary value used at and beyond lobe contact. | -| `tests/test_nozzle.py::test_curvature_equal_mass_value` | Jackson et al. (2017) Section 2.1, the printed equal-mass curvature A(1) = 8 and the small-mass-ratio expansion of the L1 position | The Eq. (10) fit returns the printed equal-mass value without fit error and carries the second-order small-q coefficient $2 \cdot 3^{2/3}$. | -| `tests/test_nozzle.py::test_potential_at_lobe_matches_numerical_l1` | The exact corotating Roche potential, L1 solved numerically on the star-planet axis | The Eq. (14) volume-averaged potential evaluated at the Eggleton lobe radius matches the exact L1 potential to better than $10^{-4}$ relative at a planetary mass ratio, and the escape barrier built from it to 0.5%. | +| `tests/test_nozzle.py::test_table2_deep_launch_planets_reproduce_published_rates` | Jackson et al. (2017), ApJ 835, 145, Table 2 (Kepler-21 b, CoRoT-24 b, WASP-47 e, 55 Cnc e) with their Section 3 input prescriptions | The full closed form (their Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius) reproduces the four printed rates whose launch level sits below 0.4 Roche lobe radii, to 0.4, 2.1, 3.5, and 5.0 percent, asserted at 6 percent. | +| `tests/test_nozzle.py::test_lobe_filling_binaries_land_on_figure5` | Jackson et al. (2017) Figure 5 and Table 1 (Ritter 1988 Table A1 binaries, 0.8 solar-mass accretor) | The saturated lobe-filling limit lands 4.1 and 8.0 percent below values read off the printed solid curve at two donor masses, asserted at 30 percent to cover the figure read. This anchors the prefactor of the boundary value used at and beyond lobe contact; the barrier is switched off by construction there and is not exercised. | +| `tests/test_nozzle.py::test_curvature_equal_mass_value` | Jackson et al. (2017) Eq. (10) with $b_1 = 2 \cdot 3^{2/3}$, and the printed equal-mass value A(1) = 8 | The fit returns the printed equal-mass value without fit error and carries the second-order small-$q$ coefficient $2 \cdot 3^{2/3}$, which the exact root of their Eq. (7) confirms. | +| `tests/test_nozzle.py::test_potential_at_lobe_matches_numerical_l1` | The exact corotating Roche potential, L1 solved numerically on the star-planet axis | The escape barrier built from the Eq. (14) volume-averaged potential at the Eggleton lobe radius agrees with the exact one to 0.17 percent at a planetary mass ratio and a deep launch level, asserted at 0.5 percent. | ## Notes -The two near-lobe hot Jupiters of their Table 2 are deliberately not pinned: reproducing them requires the photospheric-radius distortion conversion of their Appendix, which this implementation omits as a stated convention, and the residual factor of 1.4 to 1.7 sits inside the paper's own quoted factor-of-two error from the approximate potentials. The rate is exponentially sensitive to the barrier there ($d\ln\dot{M}/d\ln r_\mathrm{ph} \approx G M_\mathrm{p}/(r_\mathrm{ph} v_\mathrm{th}^2)$, about 50 for a hot Jupiter), which is also why the two pinned planets carry a 3% tolerance: an exponent near 16 amplifies physical-constant conventions tenfold, while the transcription errors the pin exists to catch move the rate by factors of several to decades. +**What the Table 2 pin covers, and what it does not.** Their Table 2 lists twenty-one objects. Four are pinned, and they are every row whose launch level sits below 0.4 Roche lobe radii. The other seventeen are not reproduced by this implementation, running from a factor 1.04 to 3.9e6 below the published rates, and the shortfall is monotone in launch depth rather than scattered. Two effects account for it, neither of which is a transcription question: + +- The photospheric radius convention. Their Appendix converts a measured transit radius to the volume-equivalent radius of the distorted equipotential, and this implementation omits that conversion because its input is a one-dimensional profile radius rather than an observed one. The rate is exponential in the launch radius, with $\mathrm{d}\ln\dot{M}/\mathrm{d}\ln r_\mathrm{ph} = G M_\mathrm{p}/(r_\mathrm{ph} v_\mathrm{th}^2)$ running from 9.7 to 276 across their table, so the shift needed to close each gap is only 2.2 to 5.2 percent in radius. On the four confirmed near-lobe hot Jupiters that requirement matches the 2.6 to 3.7 percent the conversion produces, and their published post-conversion residuals of 1.43 to 1.69 are consistent with it. +- Assumed masses. Their six Kepler candidate rows carry $M_\mathrm{p} = 1\,M_\mathrm{Jup}$ by assumption rather than measurement, and need 3.8 to 5.2 percent in radius, which no radius conversion supplies. PTFO8-8695 is a third case: the paper states they assumed it just fills its lobe, so their density sits at the lobe radius rather than at the planet radius. + +Replacing the Eq. (14) potential with the exact numerically solved L1 potential moves five of the twenty-one rows inside a factor of two to seven, so the potential approximation is a minor part of the shortfall and the radius convention is the dominant one. + +**Where the potential approximation holds.** The 0.17 percent barrier agreement above is measured at a launch level of 0.21 lobe radii. Holding that depth, the agreement stays under 0.5 percent across every mass ratio from $10^{-7}$ to $10^{-2}$. Holding the mass ratio and varying the depth instead, it passes 0.5 percent near 0.42 lobe radii and reaches 16 percent at 0.95, which is why the Table 2 pin stops where it does. A quantity worth not quoting: the same comparison expressed against the total potential agrees to $4 \times 10^{-6}$, but the star's constant term is 99.94 percent of that total and cancels in the barrier, so a tolerance on it constrains the part Eq. (14) actually computes only to about 16 percent of itself. + +**A correction to the primary, recorded where it is used.** Their Section 2.1 prints the small-mass-ratio asymptotic $A \approx 4 + 3 (M_\mathrm{d}/3M_\mathrm{a})^{1/3}$, whose coefficient is $3^{2/3}$. The Eq. (10) fit uses $b_1 = 2 \cdot 3^{2/3}$, twice that. Solving their Eq. (7) at the exact numerical L1 root gives $(A-4)/q^{1/3} \to 4.1602 = 2 \cdot 3^{2/3}$ as $q \to 0$, so the fit is right and the printed in-text asymptotic understates the coefficient by half. The implementation follows the fit. + +**A caveat on the Figure 5 anchor.** Its two states are constructed by inverting the Eggleton fit at the printed launch radius, which places them on the saturation boundary by construction: perturbing the separation by 0.1 percent drops the rate by factors of 71 and 2786. The 30 percent window is therefore slack on the prefactor (density, sound speed, nozzle area) and tests the barrier not at all. One of the two rows returns `saturated = False`, because the round-trip lands the launch level one unit in the last place inside the lobe; the rate agrees with the boundary value to three parts in $10^{12}$ either way. + +**A radius convention the tolerance does not cover.** The pinned rows use the equatorial Jupiter radius, 7.1492e7 m. Switching to the volumetric mean, 6.9911e7 m, moves CoRoT-24 b from 0.979 to 0.631 of the published rate. The convention is stated here rather than absorbed into the tolerance. ## Anchor type Published benchmark (model rates and printed coefficients) plus an exact-geometry cross-check. -Date of last comparison against the source: 2026-08-31. +Date of last comparison against the source: 2026-09-01. diff --git a/tests/test_nozzle.py b/tests/test_nozzle.py index af3d28fd..e15e6cdd 100644 --- a/tests/test_nozzle.py +++ b/tests/test_nozzle.py @@ -3,8 +3,8 @@ Exercises the tidally driven L1 nozzle flow of Jackson et al. (2017, ApJ 835, 145). The physical anchors under test: -- Reference pins: two planets of their Table 2 reproduced with their own - input prescriptions; two lobe-filling binaries of their Table 1 landing +- Reference pins: the four Table 2 planets whose launch level sits below + 0.4 lobe radii, reproduced with their own input prescriptions; two lobe-filling binaries of their Table 1 landing on the Figure 5 solid curve; the equal-mass curvature A(1) = 8 their Section 2.1 prints. - Cross-check: the Eq. (14) volume-averaged potential evaluated at the @@ -29,6 +29,7 @@ curvature_a, eggleton_lobe_radius, isothermal_column_density, + l1_distance, nozzle_candidate, volume_averaged_potential, ) @@ -56,23 +57,32 @@ def _jackson_photosphere(M_p, R_p, T_p, mu_kg): @pytest.mark.reference_pinned -def test_table2_planets_reproduce_published_rates(): - """Kepler-21 b and CoRoT-24 b of Jackson et al. (2017) Table 2 within 3%. - - Both donors sit well inside their lobes, where the Eq. (14) potential - approximation is good and the photospheric-radius convention is - irrelevant, so the printed rates pin the whole formalism (Eqs. 3, 10, - 13, and 14 plus the Eggleton lobe radius). Inputs are their Table 2 - rows evaluated through their Section 3 prescriptions (mu = 1 amu above - 2000 K, 2 amu below). The 3% tolerance covers physical-constant - conventions, which the CoRoT-24 b exponent of -16 amplifies an order - of magnitude; the transcription errors this pin exists to catch move - the rate by factors of several to decades. +def test_table2_deep_launch_planets_reproduce_published_rates(): + """Four Table 2 planets of Jackson et al. (2017) reproduce within 6%. + + Their Table 2 lists twenty-one objects. The four pinned here are every + one whose launch level sits below 0.4 Roche lobe radii, which is where + the Eq. (14) potential approximation is good and the photospheric + radius convention is irrelevant, so the printed rates pin the whole + formalism (Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius). + Above that depth two effects the implementation does not carry take + over, as the accompanying validation page records, so the remaining + seventeen rows are outside what this pin can claim. + + Inputs are their Table 2 rows through their Section 3 prescriptions + (mu = 1 amu above 2000 K, 2 amu below). Achieved deviations run 0.4%, + 2.1%, 3.5%, and 5.0%, rising with launch depth as expected; the 6% + tolerance covers those and the physical-constant conventions that an + exponent of order 10 to 16 amplifies, while the transcription errors + this pin exists to catch move the rate by factors of several to + decades. """ # (Mp [MJup], Rp [RJup], Tp [K], a [au], Ms [Msun], target [kg/s], mu [amu]) rows = [ (0.01598, 0.146, 2411.0, 0.04272, 1.41, 2.62e12, 1.0), (0.018, 0.33, 1112.0, 0.05600, 0.91, 2.21e8, 2.0), + (0.02863, 0.162, 2618.0, 0.01730, 1.11, 6.32e10, 1.0), + (0.02542, 0.17, 2325.0, 0.01544, 0.91, 1.31e11, 1.0), ] for mp, rp, tp, a_au, ms, target, mu_amu in rows: m_p, r_p, m_s, a = mp * M_JUP, rp * R_JUP, ms * 1.989e30, a_au * AU @@ -80,7 +90,9 @@ def test_table2_planets_reproduce_published_rates(): rho = _jackson_photosphere(m_p, r_p, tp, mu_kg) rate, detail = nozzle_candidate(m_p, m_s, a, 0.0, rho, r_p, tp, mu_kg) assert not detail['saturated'] - assert math.isclose(rate, target, rel_tol=0.03, abs_tol=0.0) + # Every pinned row is inside the depth where the approximation holds. + assert r_p / detail['r_lobe'] < 0.4 + assert math.isclose(rate, target, rel_tol=0.06, abs_tol=0.0) @pytest.mark.reference_pinned @@ -289,8 +301,12 @@ def test_public_surface_rejects_unphysical_arguments(): for bad in (0.0, -1.0, math.nan): with pytest.raises(ValueError, match='mass ratio'): eggleton_lobe_radius(bad, a) + with pytest.raises(ValueError, match='mass ratio'): + l1_distance(-1.0, a) with pytest.raises(ValueError, match='r_v'): volume_averaged_potential(-1.0, m_p, m_s, a) + with pytest.raises(ValueError, match='rho_ref'): + isothermal_column_density(-1.0, 1e7, 2e7, m_p, 1e4) with pytest.raises(ValueError, match='r'): isothermal_column_density(1e-6, 1e7, 0.0, m_p, 1e4) # A valid call on the same path still returns a positive finite rate. From b946ed06a92c8f8d3f58f2a300310a1a06ebf2a8 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:19:05 +0200 Subject: [PATCH 087/113] Correct what the overflow pages claim about the primary Four statements did not survive a check against Jackson et al. (2017). The isothermal flow was described as one the radiation field maintains, where their Section 3 names the neglected heating and cooling balance and calls isothermality an important limitation. The bound-flow rate under a geometric rename was called a lower limit on the tidal transfer without qualification, which has the wrong sign wherever the nozzle candidate was applicable and lost, since the module's own estimate of that transfer is then the smaller number. The fractionation page still said the overflow label never changes the rate. And the rate floor was quoted under three different names for one constant. The regimes page also splits into six paragraphs from one of nearly eight hundred words, and states the floor's reach: it marks what is distinguishable from zero in floating point, so about one overflow win in twenty is dispatched below 1e-20 kg per second, and the depletion screen rather than the floor is what says whether a rate matters. --- docs/Explanations/fractionation.md | 2 +- docs/Explanations/limitations.md | 4 ++-- docs/Explanations/regimes.md | 12 +++++++++++- docs/How-to/troubleshooting.md | 1 + docs/Reference/results.md | 2 +- src/zephyrus/diagnostics.py | 2 +- src/zephyrus/dispatcher.py | 21 ++++++++++++--------- src/zephyrus/nozzle.py | 3 ++- 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index eb069734..387bfe38 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -30,7 +30,7 @@ The closure evaluates at the XUV wind base on the atomized composition (molecule | `boiloff` | Reservoir mass fractions (no fractionation: the flow is fast and bulk) | | `hydrostatic` | Natively per-species: each species carries its own Jeans flux and supply cap (see [escape regimes](regimes.md)) | -The split follows the branch and not the label, which matters under `roche_overflow`: that label renames a state without changing its rate, so the split is whatever the branch named in `diagnostics['roche']['rate_branch']` would have produced. +The split follows the branch and not the label, which matters under `roche_overflow`, where two readings meet. When the geometric screen renamed a bound state, the label left the rate alone and the split is whatever the branch named in `diagnostics['roche']['rate_branch']` produced. When that field reads `roche_overflow` itself, the tidally driven transfer through L1 was dispatched: it is a bulk flow with no per-species physics, so the elements leave in their reservoir proportions and no closure runs. --- diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index 361bf3fe..df1338df 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,8 +23,8 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. -- **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two published regulators are not computed: the torque-balance rate (their Eq. 24), which can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds, making the dispatched transfer rate an upper limit in that reading, and the stability of the transfer, which couples to orbital evolution nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. -- **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. +- **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two things the primary computes and this module does not: the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds. Under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. +- **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. That is a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, the module's own estimate of that transfer is `diagnostics['nozzle']['rate_kg_s']` and it is below the dispatched rate. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. ## The impact channel (`collision.mass_loss`) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index fa2fc4a3..f2e5db7a 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -120,7 +120,17 @@ Everything above assumes the flow is bound to the planet. Before the label is fi The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. -The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design: Roche-lobe overflow and evaporative escape are not two processes but one unbound hydrodynamic outflow, differing in whether the photosphere nearly coincides with the lobe. The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction; where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. The comparison is the one their Figure 9 draws, and they draw it qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening and not a rule they state. A candidate below the one-proton-per-year floor does not compete either, because this label boundary is a rate crossing and a crossing between two numerically empty numbers would rename the deeply bound corner on no content. When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction; the applicability edge, by contrast, is a criterion boundary like the activation gate, and the jump across it is a result to measure, not an artifact to hide. The flow carries no energy cap, faithful to the primary, whose isothermal treatment has the radiation field maintain the temperature; the diagnostics report the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where that assumption shows its strain. It is reported for the candidate rather than for the dispatched rate, and both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled: the primary treats a circular, synchronously rotating donor and has no eccentric formulation, so each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies, which is an arc around periapsis because the L1 distance grows with separation while the sonic radius does not. That is what a secular caller needs, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice largely cancel along an isothermal column and only along one; under `nozzle_temperature = 'wind'` the level moves to the wind's own column, anchored at the wind base, so that the density and the sound speed evaluating the barrier still belong to one structure. Measured across a factor of four in launch radius, the rate holds to half a percent along that column and moves by a factor of eleven along the profile's colder one, which is the size of the inconsistency the anchor removes. A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer, and under that clamp the rate goes as the cube of the separation, so periapsis is the poorest phase of the orbit rather than the richest. And the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. Two published regulators are deliberately not computed: the torque-balance rate (their Eq. 24), which needs the stellar tidal dissipation and can be orders of magnitude below the nozzle rate where disk-stellar torque balance holds, so the dispatched transfer rate is an upper limit in that reading; and the stability of the transfer itself, which couples to orbital evolution the module does not model. +The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design. Roche-lobe overflow and evaporative escape are one unbound hydrodynamic outflow seen at two separations. What separates them is whether the photosphere nearly coincides with the lobe. + +The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction. Where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. Their Figure 9 draws the same comparison qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening rather than a rule they state. A candidate below the one-proton-per-Julian-year floor does not compete either, since a crossing between two numerically empty numbers would rename the deeply bound corner on no content. That guard is loose: the constant marks what is distinguishable from zero in floating point, so the label remains reachable at rates far below anything that could matter over a planet's lifetime, and `diagnostics['rate_floor']` beside the depletion screen is how a consumer tells. + +When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction. The applicability edge is a criterion boundary like the activation gate, and the jump across it is a result to measure rather than an artifact to hide. The flow carries no energy cap, faithful to the primary, which assumes isothermality and states that assumption as an important limitation rather than a justified one: their Section 3 names the radiative heating and cooling balance along the outflow as the physics they neglect. What the diagnostics report instead is the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where the assumption shows its strain. That figure describes the candidate rather than the dispatched rate, and comes both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. + +Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled, since the primary treats a circular, synchronously rotating donor and has no eccentric formulation: each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies. That arc surrounds periapsis, because the L1 distance grows with separation while the sonic radius does not. A secular caller needs the average, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice cancel along an isothermal column and only along one. Under `nozzle_temperature = 'wind'` the level moves to the wind's own column, anchored at the wind base, so that the density and the sound speed evaluating the barrier still belong to one structure; measured across a factor of four in launch radius the rate holds to half a percent along that column and moves by a factor of eleven along the profile's colder one. On a profile that is neither, which is what a coupled run supplies, the residual is a width rather than a cancellation, measured at a factor of 2.4 across three decades of launch level on a mildly inverted column against 1.14 on an isothermal one. + +A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer. Under that clamp the rate goes as the cube of the separation, so periapsis becomes the poorest phase of the orbit rather than the richest. The fourth convention is the launch radius: the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which their own input chain needs because it starts from a measured transit radius and this one does not. It is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. + +Two things the primary computes and this module does not. The first is the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds; under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested by comparing the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, against the lobe radius in `diagnostics['nozzle']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `neither`, marks a label won by the rate crossing while neither the atmosphere nor the flow radius reaches out. The comparator for the first case is the Roche lobe itself rather than the Hill radius, since the lobe is the critical surface and sits about 0.70 of the way out to it; `r_atmosphere` and `r_lobe` are both reported so the comparison can be read. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 65f2060f..3ffd3c4e 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -80,6 +80,7 @@ The four cases that produces: - Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. +- A rate above the floor but far below anything that matters. The floor marks what is distinguishable from zero in floating point, one proton per Julian year, which is many decades below a rate that could change an atmosphere. Around one nozzle win in twenty is dispatched below 1e-20 kg s⁻¹, which clears the floor and means nothing physically. Read `diagnostics['self_consistency']` beside it: what settles whether a rate matters is the depletion timescale against the age you passed in, not the floor. Points whose flow radius exceeds two thirds of the Hill radius raise `near_roche` instead of the label, and the tidal factor is steep there, so a rate from that region carries the tidal correction's sensitivity with it. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 8100fe78..f7d93f66 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -26,7 +26,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | -| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate and a lower limit on what tides would do. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | +| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate, and a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, `diagnostics['nozzle']['rate_kg_s']` is below the dispatched rate. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index dbf0c795..2c95dd62 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -193,7 +193,7 @@ def self_consistency_screen(reservoirs: dict | None, mdot: float, age: float | N def rate_floor_screen(mdot: float) -> dict: - """Numerical-content screen: the rate against one proton per year. + """Numerical-content screen: the rate against one proton per Julian year. A strongly bound heavy atmosphere returns rates many decades below anything with physical content, and a regime label attached to such a diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 6d45d125..9f12be81 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -537,11 +537,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # photosphere approaches the lobe, the tidally driven transfer through # L1 outruns every bound-flow estimate, and the label boundary it # creates is a rate crossing, continuous by construction. A candidate - # below the one-proton-per-Julian-year floor does not compete: this - # label is a rate crossing, not a geometric verdict, and a crossing - # between two numerically empty numbers would rename the deeply bound - # corner on no physical content (the floor otherwise stays reported - # and never applied, and a geometric verdict still ignores it). + # below the one-proton-per-Julian-year floor does not compete: the + # label here turns entirely on which of two numbers is larger, and + # between two numerically empty numbers that decides nothing, so it + # would rename the deeply bound corner on no physical content. The + # floor otherwise stays reported and never applied, and a geometric + # verdict still ignores it. if nozzle_applicable and nozzle_rate > rate and nozzle_rate > dg.RATE_FLOOR_KG_S: branch = 'roche_overflow' rate = nozzle_rate @@ -582,8 +583,10 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # rate keeps the dispatched rate continuous across the boundary; # substituting another branch's formula would not. When the rename fires # on a bound branch, the rate beside the label is the bound-flow - # estimate, a lower limit on what tides would do; when the nozzle - # candidate won above, the rate is the tidally driven transfer itself + # estimate, and a lower limit on the tidal transfer only where the + # nozzle candidate sat outside its criterion; where it was applicable + # and lost, the candidate rate is below the dispatched one. When the + # nozzle won above, the rate is the tidally driven transfer itself # and the subflag reads ``nozzle``. xi_flow = r_hill / flow_radius if flow_radius > 0 else math.inf # The outer extent of the atmosphere itself, modeled plus extended, @@ -604,7 +607,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ) # The label has two routes in and one precedence rule, written once: # the geometric trigger on the winning branch's flow radius, and the - # rate crossing when the nozzle candidate won above. The subflag is + # crossing of two rates when the nozzle candidate won above. The subflag is # geometric under either route, so an atmosphere that spills reads # ``dynamical`` whichever candidate carries the rate, and the # mechanism question is answered by ``rate_branch`` instead. @@ -618,7 +621,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # way out to the Hill radius; no transonic solution when only the # flow radius passes the Hill radius, which is the narrow band # Owen & Jackson (2012) describe; ``neither`` when the label came - # from the rate crossing alone. + # from that crossing alone. if xi_ktide <= 1.0 or r_atm >= noz['r_lobe']: flags['roche_subflag'] = 'dynamical' elif xi_flow <= 1.0: diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index 0c1aa880..be37559e 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -64,7 +64,8 @@ # duty cycle are both ours. At e = 0 the average is the instantaneous # rate exactly. # - Stated limitations carried from the primary: the flow is isothermal -# (their Section 3.1 names the neglected thermal structure), the orbit +# (their Section 3 names the neglected heating and cooling balance and +# calls the approximation an important limitation), the orbit # circular and the rotation synchronous (an eccentric caller is averaged # over its orbit as above, our convention rather than theirs, and the # rotation is synchronous at no single phase of such an orbit), and the From e16416cc838a93495b0b57b5ba2fb332b0d39412 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 2 Sep 2026 17:26:29 +0200 Subject: [PATCH 088/113] Date the overflow validation comparison correctly The page recorded its last comparison against the source one day early. --- docs/Validation/nozzle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Validation/nozzle.md b/docs/Validation/nozzle.md index 65edba0d..cf467c4c 100644 --- a/docs/Validation/nozzle.md +++ b/docs/Validation/nozzle.md @@ -30,4 +30,4 @@ Replacing the Eq. (14) potential with the exact numerically solved L1 potential Published benchmark (model rates and printed coefficients) plus an exact-geometry cross-check. -Date of last comparison against the source: 2026-09-01. +Date of last comparison against the source: 2026-09-02. From e8d4ba68369594b1b3ca2ed681c6c91da7104d9e Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 3 Sep 2026 13:22:38 +0200 Subject: [PATCH 089/113] Make the post-gate bolometric residual opt-in Past the activation gate the luminosity-capped bolometric candidate is still computed and reported, but it now competes for the dispatched rate only under the new `residual` setting, whose default `off` leaves the XUV or hydrostatic verdict standing. In the window just past the gate the closed-form Parker and Bondi rates have not yet shut off, so the candidate there is the interior-luminosity cap itself, the core-powered rate whose persistence Tang et al. (2024) dispute, and it outran the XUV rate at interior fluxes near a watt per square meter on a three Earth-mass hydrogen envelope, enough to strip a one percent envelope in a few hundred million years. The bolometric diagnostics gain `residual_mode` and `competes` so a reported candidate can be told apart from a losing one. The tests whose families were built on a residual win admit it explicitly, the overflow flag case moves to a nozzle win under the defaults, and the tutorial's overflow example admits the residual and states what the default returns instead. --- docs/Tutorials/dispatch.md | 9 +-- src/zephyrus/dispatcher.py | 41 ++++++++++--- tests/test_dispatcher.py | 122 +++++++++++++++++++++++++++++++------ 3 files changed, 139 insertions(+), 33 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index f940f20d..04fe6f1c 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -121,7 +121,7 @@ In a coupled run the atmosphere module supplies the profile. Standalone, `isothe - The top pressure, $10^{-5}$ Pa or 0.1 nanobar. The XUV wind launches near a nanobar, so a profile that stops deeper than that cannot reach its own wind base and the base clamps to the profile top instead, flagged. Setting the top below a nanobar keeps the clamp out of the way. - The photospheric opacity, 0.01 m² kg⁻¹ or about 0.1 cm² g⁻¹. The boil-off rate scales as its inverse, so it matters whenever the boil-off branch is in play. - The orbit, 0.0775 au around a solar-luminosity star, which puts the equilibrium temperature at 1000 K. Deriving $T_\mathrm{eq}$ and $F_\mathrm{bol}$ from the orbit rather than setting all three by hand keeps the state self-consistent. -- The interior heat flux, 1 W m⁻². It sets the luminosity cap on the boil-off residual and nothing else, so it only matters near that branch. +- The interior heat flux, 1 W m⁻². It sets the luminosity cap on the bolometric residual past the boil-off gate and nothing else. That residual is reported on every call and competes for the rate only when the `residual` setting admits it, so with the defaults this number reaches the diagnostics and never the rate. The optional fields are worth setting even when you do not need them: `age` and `reservoirs` are what let the diagnostics tell you whether a rate is consistent with the state having survived, which is step 5. @@ -252,10 +252,11 @@ At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lam The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Note what is absent: the hydrodynamic candidates were computed on this state too, and one of them raised a subcritical-sonic caution, but the dispatched rate is the bolometric one and the flags describe the branch that produced it. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. -Push the same envelope to three Earth masses and two Earth radii and the flow stops being bound to the planet at all: +Push the same envelope to three Earth masses and two Earth radii. It has contracted past the activation gate, so by default the bolometric candidate is reported and does not compete, and the XUV wind takes the rate. Admit the luminosity-capped residual through the `residual` setting, and the flow of the winning branch stops being bound to the planet at all: ```python -puffy = dispatch(build_state('H/He', 3.0, 2.0, 0.1)) +admitted = DispatchSettings(residual='luminosity_capped') +puffy = dispatch(build_state('H/He', 3.0, 2.0, 0.1, settings=admitted)) roche = puffy.diagnostics['roche'] print(puffy.regime, puffy.mdot) @@ -271,7 +272,7 @@ roche_overflow 24622841.930601332 dynamical ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s` in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. With the default setting the same state returns `hydrodynamic:EL` at $1.4 \times 10^{5}$ kg s⁻¹: the wind's flow radius reaches 0.83 of the Hill radius, inside the lobe, so the screen stays quiet and only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false. Whether that residual is physical is the disputed question the [escape regimes](../Explanations/regimes.md) page states, which is why admitting it is a choice you make and not a default you inherit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s` in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. The subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.37 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `r_atmosphere` against `r_lobe` in `diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 9f12be81..593f408b 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -32,11 +32,18 @@ # 1. The bolometrically driven candidate is computed at every call. When # the restricted Jeans parameter sits below its threshold the atmosphere # is inflated enough to boil off and that candidate is the rate -# (Owen & Wu 2016); past the threshold the same machinery survives as a -# luminosity-capped residual (Gupta & Schlichting 2019) that can still -# win the final comparison. XUV-driven escape needs a base to launch -# from, and a bolometrically boiling atmosphere has not built one yet, -# which is why this test precedes everything (Owen & Schlichting 2024). +# (Owen & Wu 2016). Past the threshold the same machinery is still +# evaluated and reported as a luminosity-capped residual (Gupta & +# Schlichting 2019), but it competes in the final comparison only when +# the ``residual`` setting admits it. The default leaves it out: whether +# a bolometric wind outlives the envelope's contraction is disputed +# (Tang et al. 2024 find it negligible once boil-off is initialized +# self-consistently), and the isothermal closed forms are least reliable +# on contracted planets (Misener et al. 2025), so the contested rate is +# a reported candidate rather than a dispatched one. XUV-driven escape +# needs a base to launch from, and a bolometrically boiling atmosphere +# has not built one yet, which is why this test precedes everything +# (Owen & Schlichting 2024). # 2. The hydrodynamic candidate: the wind base is located by the # configured method, the thermostat sets the wind temperature by local # heating-cooling balance, and the candidate is min(EL, RR) with the @@ -58,8 +65,8 @@ # computed: the screen renames a state and never changes its rate. # Near misses raise ``near_roche``. # 6. The final rate is the largest of the surviving branch rate, the -# bolometric residual, and the tidally driven L1 nozzle rate -# (Jackson et al. 2017), labeled by the winner. A nozzle win labels +# bolometric residual where the setting admits it, and the tidally +# driven L1 nozzle rate (Jackson et al. 2017), labeled by the winner. A nozzle win labels # ``roche_overflow`` with a real transfer rate, so that boundary is a # rate crossing and the dispatched rate is continuous across it; the # step 5 rename keeps its bound-flow lower-limit meaning, and @@ -103,6 +110,7 @@ class DispatchSettings: fractionate: bool = True tidal: bool = True nozzle_temperature: str = 'photospheric' # 'photospheric' | 'wind' + residual: str = 'off' # 'off' | 'luminosity_capped'; the post-gate bolometric candidate lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) gamma_bates: float = 0.75 # Bates profile shape parameter kzz: float = 3.0e2 # m^2/s eddy diffusion when the profile carries none @@ -125,6 +133,8 @@ def validate(self) -> None: raise ValueError("T_exo_mode must be 'prescribed' or 'thermostat'") if self.nozzle_temperature not in ('photospheric', 'wind'): raise ValueError("nozzle_temperature must be 'photospheric' or 'wind'") + if self.residual not in ('off', 'luminosity_capped'): + raise ValueError("residual must be 'off' or 'luminosity_capped'") if not ( self.cool_atomic or self.cool_co2_band @@ -292,6 +302,14 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['lambda_gate'] = lam_gate diag['bolometric'] = {k: v for k, v in bolo.items() if k != 'flags'} diag['bolometric']['rate_kg_s'] = bolo_rate + # Whether the candidate takes part in the final comparison on this call: + # always while the activation gate is open, past it only when the setting + # admits the residual. Reported so that a consumer reading the candidate + # rate beside a different verdict can tell a candidate that lost from one + # that was never a contender. + residual_admitted = st.residual == 'luminosity_capped' + diag['bolometric']['residual_mode'] = st.residual + diag['bolometric']['competes'] = bool(lam_gate < st.lambda_crit or residual_admitted) # Step 2: hydrodynamic candidate (always computed; it is cheap). channels = dict( @@ -525,8 +543,13 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: per_species = dict(hs_per_element) winner_flags = hs_flags flow_radius = hsd['r_exo'] - # Step 5: the bolometric residual stays a candidate past the gate. - if bolo_rate > rate: + # Step 5: the bolometric residual competes past the gate only when + # the setting admits it. Off by default. In the window just past the + # gate the closed-form Parker and Bondi rates have not shut off yet, + # so the candidate there is the interior-luminosity cap itself, the + # core-powered rate whose persistence is disputed, and it outruns the + # XUV rate at interior fluxes of about a watt per square meter. + if residual_admitted and bolo_rate > rate: branch = 'boiloff' rate = bolo_rate per_species = None diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index c1f933c7..70ea1168 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -283,17 +283,24 @@ def test_roche_screen_renames_without_changing_the_rate(): Hill radius as the orbit widens, chosen because every other candidate stays subdominant across the bracket: the XUV flux is negligible and the nozzle candidate sits outside its applicability criterion, so the - rename is the only thing that changes. Bisecting in orbital distance - brackets the label change; the rates on either side agree to machine - precision and both equal the capped residual. Discrimination: - substituting the Bondi-capped bolometric rate at the overflow geometry, - which is what a rate-changing screen returns, is more than a decade - larger, because that form bypasses the luminosity cap. + rename is the only thing that changes. The residual is admitted through + the ``residual`` setting, since by default it is reported and does not + compete; what the family needs is a bound branch whose flow radius is + a sonic radius large enough to cross the Hill sphere, and the residual + is the one that has it. Bisecting in orbital distance brackets the + label change; the rates on either side agree to machine precision and + both equal the capped residual. Discrimination: substituting the + Bondi-capped bolometric rate at the overflow geometry, which is what a + rate-changing screen returns, is more than a decade larger, because + that form bypasses the luminosity cap. """ comp = {'H2': 0.9, 'He': 0.1} + admitted = DispatchSettings(residual='luminosity_capped') def at(a): - return dispatch(_inputs(3 * Me, 2.0 * Re, 1000.0, comp, F_xuv=0.1, a=a)) + return dispatch( + _inputs(3 * Me, 2.0 * Re, 1000.0, comp, F_xuv=0.1, a=a, settings=admitted) + ) lo, hi = 0.078 * AU, 0.3 * AU inner = at(lo) @@ -425,11 +432,12 @@ def test_nozzle_competes_only_inside_its_domain(): Two refusals, one per condition. A bound CO2 planet has a nozzle rate below the one-proton-per-Julian-year floor, so a crossing against the similarly empty hydrodynamic rate decides nothing and the verdict - stands. A residual-driven sub-Neptune at a wide orbit has a nozzle - candidate above its own dispatched rate, but the isothermal sonic - radius sits inside the L1 distance (Jackson et al. 2017, their - Figure 9), so a spherical wind chokes first, the candidate reports - without competing, and the bolometric verdict stands. + stands. A residual-driven sub-Neptune at a wide orbit, with the + residual admitted through its setting, has a nozzle candidate above + its own dispatched rate, but the isothermal sonic radius sits inside + the L1 distance (Jackson et al. 2017, their Figure 9), so a spherical + wind chokes first, the candidate reports without competing, and the + bolometric verdict stands. """ empty = dispatch(_inputs(Me, Re, 700.0, {'CO2': 1.0}, F_xuv=10.0, a=0.1 * AU)) noz = empty.diagnostics['nozzle'] @@ -438,7 +446,15 @@ def test_nozzle_competes_only_inside_its_domain(): assert empty.regime == 'hydrodynamic:EL' outside = dispatch( - _inputs(3 * Me, 2.0 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) + _inputs( + 3 * Me, + 2.0 * Re, + 1000.0, + {'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.12 * AU, + settings=DispatchSettings(residual='luminosity_capped'), + ) ) noz_o = outside.diagnostics['nozzle'] assert noz_o['applicable'] is False @@ -671,6 +687,64 @@ def test_nozzle_temperature_setting_selects_and_validates(): DispatchSettings(nozzle_temperature='photosphere').validate() +@pytest.mark.physics_invariant +def test_residual_setting_admits_the_post_gate_candidate(): + """The bolometric residual competes past the gate only when admitted. + + Past the activation gate the bolometric candidate is still evaluated + and reported, but by default it is not a contender: on a contracted + three Earth-mass hydrogen envelope at a wide orbit the luminosity-capped + candidate sits nearly two decades above the XUV rate, and the default + dispatches the XUV rate with ``competes`` false and no + ``bolometric_residual`` flag. Admitting it through the setting + dispatches the candidate under the ``boiloff`` label with that flag and + ``luminosity_capped`` raised, so the two modes differ by the same two + decades, which is the discrimination. Two invariants hold across the + switch: the admitted rate is never below the default one, since the + final comparison then ranges over a superset of the candidates, and + below the gate the two modes agree to machine precision, because the + candidate is the rate there either way. An unknown mode string is + rejected by the settings validator with a message naming the knob. + """ + admitted = DispatchSettings(residual='luminosity_capped') + past = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) + off = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, **past)) + on = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, settings=admitted, **past)) + assert off.diagnostics['lambda_gate'] > 20.0 + bolo_off = off.diagnostics['bolometric'] + assert off.regime == 'hydrodynamic:EL' + assert 'bolometric_residual' not in off.flags + assert 'luminosity_capped' not in off.flags + assert bolo_off['residual_mode'] == 'off' + assert bolo_off['competes'] is False + # The candidate is reported in full even though it did not compete, and + # it is the luminosity cap that would have won by nearly two decades. + assert bolo_off['rate_kg_s'] == pytest.approx( + bolo_off['mdot_luminosity'], rel=1e-12, abs=0.0 + ) + assert bolo_off['rate_kg_s'] > 10.0 * off.mdot + bolo_on = on.diagnostics['bolometric'] + assert on.regime == 'boiloff' + assert on.flags.get('bolometric_residual') is True + assert on.flags.get('luminosity_capped') is True + assert bolo_on['residual_mode'] == 'luminosity_capped' + assert bolo_on['competes'] is True + assert on.mdot == pytest.approx(bolo_off['rate_kg_s'], rel=1e-12, abs=0.0) + assert on.mdot >= off.mdot + # Below the gate the candidate is the rate under either mode, so the + # setting changes nothing there and no residual flag is raised. + below = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU) + b_off = dispatch(_inputs(Me, 1.5 * Re, 1000.0, **below)) + b_on = dispatch(_inputs(Me, 1.5 * Re, 1000.0, settings=admitted, **below)) + assert b_off.regime == 'boiloff' + assert b_on.regime == 'boiloff' + assert b_off.diagnostics['bolometric']['competes'] is True + assert b_on.mdot == pytest.approx(b_off.mdot, rel=1e-12, abs=0.0) + assert 'bolometric_residual' not in b_on.flags + with pytest.raises(ValueError, match='residual'): + DispatchSettings(residual='on').validate() + + def test_nozzle_power_diagnostic_reports_the_lift_cost(): """The lift power travels beside the two luminosities on every call. @@ -1014,12 +1088,14 @@ def test_stale_input_and_boreas_fallback_flags(monkeypatch): def test_settings_option_raises_cover_every_knob(): """Every enumerated settings knob rejects an unknown value. - The four option strings each raise with a message naming the knob, so - a typo in a configuration surfaces at validation rather than as a - silent default. The default settings validate silently. + Each option string raises with a message naming the knob, so a typo in + a configuration surfaces at validation rather than as a silent default. + The default settings validate silently. """ with pytest.raises(ValueError, match='base_out_of_range'): DispatchSettings(base_out_of_range='nonsense').validate() + with pytest.raises(ValueError, match='residual'): + DispatchSettings(residual='nonsense').validate() with pytest.raises(ValueError, match='gate'): DispatchSettings(gate='nonsense').validate() with pytest.raises(ValueError, match='efficiency_mode'): @@ -1116,7 +1192,12 @@ def test_one_exobase_temperature_per_call(): ( 'near_roche', dict( - M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.10 + M_p=3 * Me, + R_p=2 * Re, + T_eq=1000.0, + comp={'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.0775, ), dict( M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30 @@ -1131,11 +1212,11 @@ def test_one_exobase_temperature_per_call(): 'roche_overflow', dict( M_p=3 * Me, - R_p=2 * Re, + R_p=2.2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, - F_xuv=0.1, - a=0.0775, + F_xuv=13.4, + a=0.07, ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), @@ -1148,6 +1229,7 @@ def test_one_exobase_temperature_per_call(): comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775, + settings=DispatchSettings(residual='luminosity_capped'), ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), From 1494d8c5379224b8f5ff923307418221a8a03416 Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 3 Sep 2026 13:24:44 +0200 Subject: [PATCH 090/113] Document the opt-in bolometric residual The regimes page states the dispute the residual sits on and the side the default takes: Gupta & Schlichting (2019) keep a bolometric wind fed by the cooling interior alive for gigayears, Tang et al. (2024) find it removes at most a tenth of a percent of the envelope once boil-off is initialized self-consistently, and the luminosity cap does not make the difference small, since just past the gate the residual is the cap itself and exceeds the XUV rate by more than a decade at interior fluxes of a few watts per square meter. The evaluation order, the flowchart, and the paragraph that previously claimed the two readings differ by little now say what the setting does instead. The results and parameter references gain the `residual` knob, the two new bolometric diagnostics, and the qualification that the residual flags are reachable only when it is admitted; the model overview and the troubleshooting guide follow. --- docs/Explanations/model.md | 2 +- docs/Explanations/regimes.md | 10 +++++----- docs/How-to/troubleshooting.md | 2 +- docs/Reference/parameters.md | 1 + docs/Reference/results.md | 8 ++++---- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 50d5a428..056cefe7 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -38,7 +38,7 @@ flowchart TD class Q1,Q2,Q3 decision ``` -The figure shows the logic, not the full machinery: each branch carries its own rate physics, caps, and consistency checks, and three refinements are omitted for clarity (a thermally unstable exosphere re-routes from the hydrostatic branch back to the wind rate, a residual bolometric rate remains in play past the boil-off gate, and the tidally driven L1 transfer rate competes as a final candidate wherever the overflow description applies, taking the overflow label with its own rate when it wins). The [escape regimes](regimes.md) page walks every step with its equations and thresholds. +The figure shows the logic, not the full machinery: each branch carries its own rate physics, caps, and consistency checks, and three refinements are omitted for clarity (a thermally unstable exosphere re-routes from the hydrostatic branch back to the wind rate, a residual bolometric rate can be admitted past the boil-off gate by a setting, and the tidally driven L1 transfer rate competes as a final candidate wherever the overflow description applies, taking the overflow label with its own rate when it wins). The [escape regimes](regimes.md) page walks every step with its equations and thresholds. The regime boundaries are not sharp lines in nature. Each threshold carries a physical band (the collisionality threshold spans a factor of 30 across heating geometries, the boil-off threshold a factor of about two across the literature), and ZEPHYRUS reports, beside every verdict, the diagnostics needed to see how close the state sat to each boundary and what the label would have been at the band edges. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index f2e5db7a..8880c2d7 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -10,7 +10,7 @@ One call takes one planetary state and returns one verdict. The inputs are the p 2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. 4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. -5. The bolometric residual stays a candidate past the activation gate, capped by the interior luminosity, and takes the rate and the label if it beats whichever branch won above. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. +5. Past the activation gate the bolometric candidate is still computed, capped by the interior luminosity, and reported as the residual. It competes for the rate and the label only when the `residual` setting admits it, and by default it does not. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. 6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after both comparisons, so the radius it tests belongs to the branch that actually won. ```mermaid @@ -26,7 +26,7 @@ flowchart TD Q3 -- yes --> HD Q3 -- no --> HS["HYDROSTATIC
      per-species Jeans
      + diffusion supply cap"] BO --> QN - HD --> Q4{"Luminosity-capped residual
      larger than the branch rate?"} + HD --> Q4{"Residual admitted by the setting
      and larger than the branch rate?"} HS --> Q4 Q4 -- yes --> BO2["BOIL-OFF
      residual takes the label"] Q4 -- no --> KEEP["Branch label stands"] @@ -46,7 +46,7 @@ flowchart TD class BOLO,BASE,HYD,KEEP stage ``` -Every branch below is one box of that figure, and the two refinements the [model overview](model.md) leaves out of its own flowchart are the diamonds `Q3` and `Q4`: a thermally unstable exosphere returns to the wind rate, and the bolometric residual stays in the comparison past the activation gate. +Every branch below is one box of that figure, and the two refinements the [model overview](model.md) leaves out of its own flowchart are the diamonds `Q3` and `Q4`: a thermally unstable exosphere returns to the wind rate, and the bolometric residual enters the comparison past the activation gate when the setting admits it. ## Boil-off @@ -68,9 +68,9 @@ with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lam $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ -with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that compete in step 6 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, and it stays a candidate: step 6 of the evaluation order compares it against the XUV-driven rate and the larger one takes both the rate and the label. +with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that can compete in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. -Whether that residual lasts is disputed, and the framework declines to adjudicate. Tang et al. (2024) find core-powered mass loss ends early, once the envelope has contracted [^tang]; Gupta & Schlichting find it continues for gigayears [^gs19]. The luminosity cap is what makes the disagreement affordable: it holds the residual to the interior heat budget, which is small once the planet has cooled, so a run that keeps the branch alive and a run that switches it off differ by little. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion without the code having taken a side. +Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting find that a bolometric wind fed by the cooling interior persists for gigayears at the rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. The luminosity cap does not make that disagreement small here. In the window just past the gate the Parker and Bondi rates of Eqs. (2) and (3) have not shut off yet, so the residual is Eq. (4) itself: on a three Earth-mass hydrogen envelope with an interior flux of a few watts per square meter it exceeds the XUV rate by more than a decade and would strip a one percent envelope in a few hundred million years, and the closed forms shut off on their own only once the Jeans parameter passes about 30. The default therefore reports the candidate and does not dispatch it, which follows Tang et al.; a run that wants the Gupta & Schlichting reading sets `residual = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. ## The hydrodynamic wind diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 3ffd3c4e..6fdd0c6a 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -70,7 +70,7 @@ The flux scaling will not separate them either: the base ion density follows $\s **Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. -**Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. +**Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, which it can do only where `residual = 'luminosity_capped'` admits it, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. **What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from; `roche_overflow` means the L1 transfer itself was dispatched, and any other value under that label means the geometric screen renamed a state whose rate that branch produced), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 4ac94576..7dbf1d5e 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -115,6 +115,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so both candidates measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | | `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | +| `residual` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default because just past the gate that candidate is the luminosity cap itself and exceeds the XUV rate at interior fluxes near a watt per square meter; the [escape regimes](../Explanations/regimes.md) page states the dispute and the measured consequence. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index f7d93f66..c36f2c1f 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -22,7 +22,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | Label | Physics | Rate | |---|---|---| -| `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped, and luminosity-capped past the activation gate. | +| `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped; past the activation gate the same machinery is luminosity-capped and dispatched only when the `residual` setting admits it. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | @@ -59,7 +59,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `caldiroli_out_of_box` | `True` | The fitted efficiency was evaluated outside the range of gravitational potential and flux it was fitted on. The value is returned as an extrapolation. | The rate reflects it | | `caldiroli_below_flux_bound` | `True` | Below the validity bound of the efficiency fit, where its formulas turn complex. | Rejected | | `efficiency_fallback_fixed` | `True` | The fitted efficiency was unavailable, so the fixed setting was used. | The rate reflects it | -| `bolometric_residual` | `True` | The luminosity-capped bolometric residual beat the XUV branch and took the label. | The rate reflects it | +| `bolometric_residual` | `True` | The luminosity-capped bolometric residual, admitted by `residual = 'luminosity_capped'`, beat the branch that won above and took the label. Never raised under the default setting, which reports the candidate without dispatching it. | The rate reflects it | | `gate_rerouted` | `True` | The exobase was too hot to stay hydrostatic, so the state was routed back to the hydrodynamic rate. | The rate reflects it | | `contested_ion` | `True` | The neutral and plasma escape-temperature conventions disagree about the branch. Both rates are recorded in `diagnostics['contested_ion']`. | Reporting only | | `hysteresis_active` | `True` | A previous regime label was supplied, so the hysteresis window was available. It says the memory was offered, not that it changed anything: read `diagnostics['knudsen']['threshold_applied']` against `kn_crit` to see whether the window actually moved the threshold on this call. | The rate reflects it | @@ -85,7 +85,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `nozzle_partial_orbit` | `True` | The overflow description holds only on an arc around periapsis, so the average is duty-cycled over that arc and `applicable_orbit_fraction` is below one. The rate therefore omits the wind the planet drives on the rest of the orbit, which one dispatched rate cannot also carry. | The rate reflects it | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. Not raised on a state already labeled `roche_overflow`, since the warning is about the tidal inflation of a bound rate. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | -| `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. | Reporting only | +| `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. Reachable only when the residual is admitted, since the cap applies past the gate and only an admitted residual is dispatched there. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. @@ -104,7 +104,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | -| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, and whether the branch was active. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface, and the rate is being read off its own definition at the wrong place. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold that gates the branch is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | +| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `residual_mode`, `competes`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, whether the branch was active, and whether the candidate took part in the final comparison. `residual_mode` echoes the setting, and `competes` is true while the activation gate is open and, past it, only when the residual is admitted, so a candidate rate above the dispatched one beside `competes` false was never a contender rather than a loser. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface, and the rate is being read off its own definition at the wrong place. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold that gates the branch is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | From 9e7b12841e50990ec1781365ff6b2fb9ce97912c Mon Sep 17 00:00:00 2001 From: maraattia Date: Thu, 3 Sep 2026 13:24:52 +0200 Subject: [PATCH 091/113] State the Bondi cap's temperature convention The Bondi-limited cap is evaluated at the same wind temperature as the Parker rate, T_eq / 2^(1/4), where Gupta & Schlichting (2020) write their Eq. (10) at T_eq; Misener et al. (2025) recommend the cooler value for that same isothermal form, so the cap follows the correction rather than the original. The module header and the regimes page now say so, give the factor between the two conventions, which grows exponentially with the launch-level Jeans parameter and reaches about 30 at the shutoff, and state why it seldom reaches the dispatched rate: the cap and the Parker rate describe one isothermal wind, sitting a constant factor of about e^(3/2) apart at a launch level of unit optical depth, and on the default launch level, which is optically thick to the supplied opacity on an inflated hydrogen envelope, the cap does not bind at all. The reported launch-level optical depth is what tells the two cases apart. --- docs/Explanations/regimes.md | 2 +- src/zephyrus/boiloff.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 8880c2d7..daab5b4b 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -64,7 +64,7 @@ where $\mathcal{M}$ is the Mach number at the launch level (the photospheric lev $$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(-\frac{G M_\mathrm{p}}{c_\mathrm{s}^2 R_\mathrm{launch}}\right) \tag{3}$$ -with $\rho_\mathrm{launch}$ the mass density at the launch level. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, +with $\rho_\mathrm{launch}$ the mass density at the launch level. The cap is evaluated at the same wind temperature as Eq. (2). Gupta & Schlichting write Eq. (3) at $T_\mathrm{eq}$, and Misener et al. (2025) recommend $T_\mathrm{eq}/2^{1/4}$ for that same isothermal form [^misener], so the cap follows the correction rather than the original; the two conventions differ by $2^{-3/8} \exp[\Lambda_\mathrm{launch}(2^{1/4} - 1)]$, with $\Lambda_\mathrm{launch}$ the Jeans parameter at the launch level, a factor near 30 at the shutoff. The choice seldom reaches the rate, because Eqs. (2) and (3) describe one isothermal wind: at a launch level of unit optical depth the cap sits a constant factor of about $e^{3/2}$ below the Parker rate, and on a launch level optically thick to the supplied opacity, which the default 20 mbar level is on an inflated hydrogen envelope, the cap sits above the Parker rate and does not bind. `tau_launch` in the diagnostics says which case a state is in. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 1c2bf7be..e82a254a 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -34,7 +34,19 @@ # Mdot_B = 4 pi R_B^2 c_s rho_launch exp(-G M_p / (c_s^2 R_launch)), # sonic-point area with the launch-level density; the launch level is # identified with the radiative-convective boundary, a documented -# approximation on a static profile. +# approximation on a static profile. The cap is evaluated at the same +# wind temperature as the Parker rate. Gupta & Schlichting write it at +# T_eq; Misener et al. (2025) recommend T_eq / 2^(1/4) for this same +# isothermal form, so the cap follows the correction rather than the +# original, and the two conventions differ by +# 2^(-3/8) exp(Lambda_launch (2^(1/4) - 1)), with Lambda_launch the Jeans +# parameter at the launch level, a factor near 30 at the shutoff. The +# cap and the Parker rate describe one isothermal wind: at a launch +# level of unit optical depth the cap sits a constant factor of about +# e^(3/2) below the Parker rate (e^2 with the level at the sonic +# radius), and on a level optically thick to the supplied opacity it +# sits above the Parker rate and does not bind, which tau_launch +# reports. # - Luminosity cap, applied only past the activation gate: # Mdot_E = L / (g R_p K) with L = 4 pi R_p^2 F_int (Gupta & Schlichting # 2019, MNRAS 487, 24, their Eq. 8). Capping the residual bolometric From 65e543ff0cd2422b2e867d1d3f4270c9d4906b52 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:38:30 +0200 Subject: [PATCH 092/113] Let the boil-off candidate own its diagnostics The setting that admits the post-gate bolometric residual is renamed residual_mode, matching the diagnostics key it already fed and the other string options. The candidate now builds its whole diagnostics group: the activation state, whether it competes under the residual mode, the minimum over the caps in force, and binding_cap, which names the cap that set that minimum on every call. The dispatcher reads active and competes instead of repeating the gate comparison. The results reference defines each key, including the Bondi radius entry, and a test holds the live key set to the documented one. The header now numbers the final comparison before the Roche screen, as the code runs, and the tidal factor on the luminosity cap is justified by the comparison an admitted residual makes, rather than one the default removes. --- docs/Explanations/regimes.md | 6 +-- docs/How-to/troubleshooting.md | 2 +- docs/Reference/parameters.md | 4 +- docs/Reference/results.md | 11 +++--- docs/Tutorials/dispatch.md | 6 +-- src/zephyrus/boiloff.py | 50 ++++++++++++++++--------- src/zephyrus/dispatcher.py | 67 +++++++++++++--------------------- tests/test_boiloff.py | 40 ++++++++++++++++++++ tests/test_dispatcher.py | 40 +++++++++++++++----- 9 files changed, 145 insertions(+), 81 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index daab5b4b..3a557f58 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -10,7 +10,7 @@ One call takes one planetary state and returns one verdict. The inputs are the p 2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. 4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. -5. Past the activation gate the bolometric candidate is still computed, capped by the interior luminosity, and reported as the residual. It competes for the rate and the label only when the `residual` setting admits it, and by default it does not. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. +5. Past the activation gate the bolometric candidate is still computed, capped by the interior luminosity, and reported as the residual. It competes for the rate and the label only when the `residual_mode` setting admits it, and by default it does not. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. 6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after both comparisons, so the radius it tests belongs to the branch that actually won. ```mermaid @@ -68,9 +68,9 @@ with $\rho_\mathrm{launch}$ the mass density at the launch level. The cap is eva $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ -with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that can compete in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. +with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that can compete in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual_mode` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. -Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting find that a bolometric wind fed by the cooling interior persists for gigayears at the rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. The luminosity cap does not make that disagreement small here. In the window just past the gate the Parker and Bondi rates of Eqs. (2) and (3) have not shut off yet, so the residual is Eq. (4) itself: on a three Earth-mass hydrogen envelope with an interior flux of a few watts per square meter it exceeds the XUV rate by more than a decade and would strip a one percent envelope in a few hundred million years, and the closed forms shut off on their own only once the Jeans parameter passes about 30. The default therefore reports the candidate and does not dispatch it, which follows Tang et al.; a run that wants the Gupta & Schlichting reading sets `residual = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. +Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting find that a bolometric wind fed by the cooling interior persists for gigayears at the rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. The luminosity cap does not make that disagreement small here. In the window just past the gate the Parker and Bondi rates of Eqs. (2) and (3) have not shut off yet, so the residual is Eq. (4) itself: on a three Earth-mass hydrogen envelope with an interior flux of a few watts per square meter it exceeds the XUV rate by more than a decade and would strip a one percent envelope in a few hundred million years, and the closed forms shut off on their own only once the Jeans parameter passes about 30. The default therefore reports the candidate and does not dispatch it, which follows Tang et al.; a run that wants the Gupta & Schlichting reading sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. ## The hydrodynamic wind diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 6fdd0c6a..6cbdc324 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -70,7 +70,7 @@ The flux scaling will not separate them either: the base ion density follows $\s **Symptom.** The overflow label on a small or quiescent planet, sometimes at a rate that is negligible in absolute terms, and sometimes flipping to another label under a small change in an input or a setting. -**Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, which it can do only where `residual = 'luminosity_capped'` admits it, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. +**Cause.** The label reports a geometry, not a rate. The screen tests the flow radius of the branch that won the rate comparison, and when the bolometric residual wins, which it can do only where `residual_mode = 'luminosity_capped'` admits it, that radius is its sonic radius $R_\mathrm{B} = \Lambda R_\mathrm{p} 2^{1/4} / 2$, which grows with the Jeans parameter. A tightly bound heavy atmosphere therefore puts it several Hill radii out while the atmosphere itself sits deep inside, which is the opposite of overflowing. The flipping under a small change is the other half: the label boundary is a comparison between two rate candidates, so wherever the two are within a few percent of each other, a small input change moves the label. The rate does not move with it, because the screen never changes the rate. **What to do.** Read four things: `diagnostics['roche']['rate_branch']` (which branch the rate came from; `roche_overflow` means the L1 transfer itself was dispatched, and any other value under that label means the geometric screen renamed a state whose rate that branch produced), `r_atmosphere` against `R_hill_periapsis` in the same group (does the atmosphere itself reach the lobe, which is what `roche_subflag` reports as `dynamical`), `diagnostics['rate_floor']['above_floor']` (is the rate a number at all), and `flags['bolometric_residual']`. diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 7dbf1d5e..845557ec 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -113,9 +113,9 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_o_finestructure` | `True` | `True`, `False` | Atomic O fine-structure cooling at 63 and 147 micron. | | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | -| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so both candidates measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | +| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | | `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | -| `residual` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default because just past the gate that candidate is the luminosity cap itself and exceeds the XUV rate at interior fluxes near a watt per square meter; the [escape regimes](../Explanations/regimes.md) page states the dispute and the measured consequence. | +| `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default because just past the gate that candidate is the luminosity cap itself and exceeds the XUV rate at interior fluxes near a watt per square meter; the [escape regimes](../Explanations/regimes.md) page states the dispute and the measured consequence. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index c36f2c1f..a92da561 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -22,7 +22,7 @@ Every physically posed state returns a result. A `ValueError` means the state or | Label | Physics | Rate | |---|---|---| -| `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped; past the activation gate the same machinery is luminosity-capped and dispatched only when the `residual` setting admits it. | +| `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped; past the activation gate the same machinery is luminosity-capped and dispatched only when the `residual_mode` setting admits it. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | @@ -59,7 +59,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `caldiroli_out_of_box` | `True` | The fitted efficiency was evaluated outside the range of gravitational potential and flux it was fitted on. The value is returned as an extrapolation. | The rate reflects it | | `caldiroli_below_flux_bound` | `True` | Below the validity bound of the efficiency fit, where its formulas turn complex. | Rejected | | `efficiency_fallback_fixed` | `True` | The fitted efficiency was unavailable, so the fixed setting was used. | The rate reflects it | -| `bolometric_residual` | `True` | The luminosity-capped bolometric residual, admitted by `residual = 'luminosity_capped'`, beat the branch that won above and took the label. Never raised under the default setting, which reports the candidate without dispatching it. | The rate reflects it | +| `bolometric_residual` | `True` | The luminosity-capped bolometric residual, admitted by `residual_mode = 'luminosity_capped'`, beat the branch that won above and took the label. Never raised under the default setting, which reports the candidate without dispatching it. | The rate reflects it | | `gate_rerouted` | `True` | The exobase was too hot to stay hydrostatic, so the state was routed back to the hydrodynamic rate. | The rate reflects it | | `contested_ion` | `True` | The neutral and plasma escape-temperature conventions disagree about the branch. Both rates are recorded in `diagnostics['contested_ion']`. | Reporting only | | `hysteresis_active` | `True` | A previous regime label was supplied, so the hysteresis window was available. It says the memory was offered, not that it changed anything: read `diagnostics['knudsen']['threshold_applied']` against `kn_crit` to see whether the window actually moved the threshold on this call. | The rate reflects it | @@ -85,14 +85,15 @@ The `effect` column says whether the returned rate already reflects the flag or | `nozzle_partial_orbit` | `True` | The overflow description holds only on an arc around periapsis, so the average is duty-cycled over that arc and `applicable_orbit_fraction` is below one. The rate therefore omits the wind the planet drives on the rest of the orbit, which one dispatched rate cannot also carry. | The rate reflects it | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. Not raised on a state already labeled `roche_overflow`, since the warning is about the tidal inflation of a bound rate. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | -| `luminosity_capped` | `True` | The interior luminosity is the term setting the bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label; this flag is how you see which term won. Reachable only when the residual is admitted, since the cap applies past the gate and only an admitted residual is dispatched there. | Reporting only | +| `luminosity_capped` | `True` | The interior luminosity is the term setting the dispatched bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label. Raised only when an admitted residual wins, since only then is the capped rate dispatched; `diagnostics['bolometric']['binding_cap']` names the binding term on every call. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | -Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | | `rock_former_bij` | list | Rock-forming species (Na, Mg, Si, Fe) are present in the closure, whose binary-diffusion coefficients for them sit in the widest provenance class. | Reporting only | | `stale_input` | `True` | The caller passed `atm_converged=False`, so the profile is from a non-converged atmosphere solve. | Reporting only | +Every flag describes the branch whose rate was dispatched. The hydrodynamic candidates are computed on every call, because the diagnostics report them at every dispatch, so their cautions (`subcritical_sonic`, `thermostat_clamped`, `efficiency_fallback_fixed`, and the fitted-efficiency guards) appear only when a hydrodynamic branch won, and the bolometric residual clears them again when it displaces that winner. What the losing candidate did is in `diagnostics['hydrodynamic']` either way. + --- ## Diagnostics @@ -104,7 +105,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | | `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | -| `bolometric` | `T_wind`, `c_s`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `k_tide`, `active`, `residual_mode`, `competes`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full: each cap separately, the tidal factor the luminosity cap divided by, whether the branch was active, and whether the candidate took part in the final comparison. `residual_mode` echoes the setting, and `competes` is true while the activation gate is open and, past it, only when the residual is admitted, so a candidate rate above the dispatched one beside `competes` false was never a contender rather than a loser. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface, and the rate is being read off its own definition at the wrong place. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold that gates the branch is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | +| `bolometric` | `T_wind`, `c_s`, `R_B`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `binding_cap`, `k_tide`, `active`, `competes`, `residual_mode`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full, whether or not it was dispatched. `active` is true when the activation gate is open, that is, when the restricted Jeans parameter sits below `lambda_crit`. `competes` is true when the candidate took part in the final comparison: always while `active`, and past the gate only when `residual_mode` admits it, so a candidate rate above the dispatched one beside `competes` false was never a contender rather than a loser. Neither says the branch was dispatched; the label does. `rate_kg_s` is the minimum over the caps in force: the Parker rate and the Bondi cap while the gate is open, and past it also the interior-luminosity cap `mdot_luminosity`, so past the gate it is the core-powered rate whether or not it competes. `binding_cap` names which of `'parker'`, `'bondi'`, or `'luminosity'` set it; `mdot_parker` and `mdot_bondi` answer the uncapped question. `R_B` is the Bondi radius at the wind temperature, which is the sonic radius `R_sonic` of the isothermal wind. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | | `thermostat` | heating and cooling terms, `clamped` | How the wind temperature was reached, channel by channel. | | `closure` | `active_set`, `retained`, `inv_H_bar_cgs`, `mass_conservation_rel`, `b_provenance` | How the fractionation closure partitioned a wind, present only where a hydrodynamic branch produced the rate and fractionation is on, including under the `roche_overflow` label when that branch won. `inv_H_bar_cgs` is the inverse of the density scale height every escaping gas shares, in cm⁻¹, which the closure solves for alongside the drifts. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 04fe6f1c..f6377920 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -121,7 +121,7 @@ In a coupled run the atmosphere module supplies the profile. Standalone, `isothe - The top pressure, $10^{-5}$ Pa or 0.1 nanobar. The XUV wind launches near a nanobar, so a profile that stops deeper than that cannot reach its own wind base and the base clamps to the profile top instead, flagged. Setting the top below a nanobar keeps the clamp out of the way. - The photospheric opacity, 0.01 m² kg⁻¹ or about 0.1 cm² g⁻¹. The boil-off rate scales as its inverse, so it matters whenever the boil-off branch is in play. - The orbit, 0.0775 au around a solar-luminosity star, which puts the equilibrium temperature at 1000 K. Deriving $T_\mathrm{eq}$ and $F_\mathrm{bol}$ from the orbit rather than setting all three by hand keeps the state self-consistent. -- The interior heat flux, 1 W m⁻². It sets the luminosity cap on the bolometric residual past the boil-off gate and nothing else. That residual is reported on every call and competes for the rate only when the `residual` setting admits it, so with the defaults this number reaches the diagnostics and never the rate. +- The interior heat flux, 1 W m⁻². It sets the luminosity cap on the bolometric residual past the boil-off gate and nothing else. That residual is reported on every call and competes for the rate only when the `residual_mode` setting admits it, so with the defaults this number reaches the diagnostics and never the rate. The optional fields are worth setting even when you do not need them: `age` and `reservoirs` are what let the diagnostics tell you whether a rate is consistent with the state having survived, which is step 5. @@ -252,10 +252,10 @@ At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lam The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Note what is absent: the hydrodynamic candidates were computed on this state too, and one of them raised a subcritical-sonic caution, but the dispatched rate is the bolometric one and the flags describe the branch that produced it. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. -Push the same envelope to three Earth masses and two Earth radii. It has contracted past the activation gate, so by default the bolometric candidate is reported and does not compete, and the XUV wind takes the rate. Admit the luminosity-capped residual through the `residual` setting, and the flow of the winning branch stops being bound to the planet at all: +Push the same envelope to three Earth masses and two Earth radii. It has contracted past the activation gate, so by default the bolometric candidate is reported and does not compete, and the XUV wind takes the rate. Admit the luminosity-capped residual through the `residual_mode` setting, and the flow of the winning branch stops being bound to the planet at all: ```python -admitted = DispatchSettings(residual='luminosity_capped') +admitted = DispatchSettings(residual_mode='luminosity_capped') puffy = dispatch(build_state('H/He', 3.0, 2.0, 0.1, settings=admitted)) roche = puffy.diagnostics['roche'] diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index e82a254a..5bb5f097 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -49,15 +49,14 @@ # reports. # - Luminosity cap, applied only past the activation gate: # Mdot_E = L / (g R_p K) with L = 4 pi R_p^2 F_int (Gupta & Schlichting -# 2019, MNRAS 487, 24, their Eq. 8). Capping the residual bolometric -# channel by the interior luminosity sidesteps the open dispute over how -# long core-powered mass loss survives after boil-off (Tang et al. 2024, -# ApJ 976, 221, argue it is brief; Gupta & Schlichting argue it lasts). -# The barrier the luminosity has to lift the gas over carries the tidal +# 2019, MNRAS 487, 24, their Eq. 8). Whether a bolometric wind persists +# at this rate after boil-off is disputed (Tang et al. 2024, ApJ 976, +# 221, find it negligible), which is why the dispatcher reports it and +# admits it to the rate only on request. The barrier carries the tidal # reduction K(xi) of Erkaev et al. (2007, A&A 472, 329, their Eq. 17), -# xi = R_Hill/R_p, so the cap and the energy-limited rate it competes -# against measure the same barrier from the same reference radius; K = 1 -# recovers the untidal form and is what a caller with tides off gets. +# xi = R_Hill/R_p, the one the energy-limited rate divides by, so an +# admitted residual and the XUV rate it competes with measure the same +# barrier; K = 1 is the untidal form. # - Termination diagnostic: the Tang et al. (2024) Eq. (8) timescale # comparison, run as a diagnostic beside the rate's own exponential # shutoff, never as a gate. @@ -110,6 +109,7 @@ def bolometric_candidate( lambda_gate: float, lambda_crit: float, k_tide: float = 1.0, + residual_mode: str = 'off', ) -> tuple[float, dict]: """The bolometrically driven candidate mass-loss rate, in kg/s. @@ -144,16 +144,27 @@ def bolometric_candidate( only term that measures a barrier. The default of 1 is the untidal form; a non-positive value means the barrier has vanished and the cap is dropped. + residual_mode : str + ``'off'`` or ``'luminosity_capped'``: whether the candidate competes + for the dispatched rate past the activation gate. It changes only + the reported ``competes``, never the rate. Returns ------- (rate, detail) - The candidate rate [kg/s] and a detail dict carrying the wind - temperature, sound speed, Bondi radius, Mach number, each cap, the - tidal factor the cap used, the activation state, and flags - (``bondi_inflated`` when the launch level sits above the Bondi - radius). + The candidate rate [kg/s], the minimum over the caps in force, and + a detail dict carrying the wind state, each cap, ``binding_cap`` + (which of them set the rate), the activation state ``active``, + whether the candidate ``competes``, and flags (``bondi_inflated`` + when the launch level sits above the Bondi radius). + + Raises + ------ + ValueError + If ``residual_mode`` is not a supported value. """ + if residual_mode not in ('off', 'luminosity_capped'): + raise ValueError("residual_mode must be 'off' or 'luminosity_capped'") T_w = T_eq / 2.0**0.25 mu = launch['mmw'] c_s = math.sqrt(kb * T_w / mu) @@ -184,16 +195,17 @@ def bolometric_candidate( tau_launch = kappa_photo * launch['p'] / g_launch active = lambda_gate < lambda_crit - caps = [mdot_parker, mdot_bondi] + caps = {'parker': mdot_parker, 'bondi': mdot_bondi} mdot_lum = None if not active: L = 4.0 * math.pi * R_p**2 * F_int g = G * M_p / R_p**2 barrier = g * R_p * k_tide # J/kg to lift gas out, tides included mdot_lum = L / barrier if barrier > 0.0 else math.inf - caps.append(mdot_lum) - rate = min(caps) - if mdot_lum is not None and rate == mdot_lum: + caps['luminosity'] = mdot_lum + binding_cap = min(caps, key=caps.get) + rate = caps[binding_cap] + if binding_cap == 'luminosity': # The interior luminosity is the binding term. Worth a flag rather # than an inference from the branch being past its gate: the cap # switches on at the gate, so a state that crosses the activation @@ -211,6 +223,10 @@ def bolometric_candidate( mdot_luminosity=mdot_lum, k_tide=k_tide, active=active, + competes=active or residual_mode == 'luminosity_capped', + residual_mode=residual_mode, + binding_cap=binding_cap, + rate_kg_s=rate, R_sonic=R_B, tau_launch=tau_launch, p_launch=float(launch['p']), diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 593f408b..4b2d945c 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -29,21 +29,14 @@ # it, flags, and a diagnostics container. Exceptions are reserved for # malformed input. The fixed evaluation order: # -# 1. The bolometrically driven candidate is computed at every call. When -# the restricted Jeans parameter sits below its threshold the atmosphere -# is inflated enough to boil off and that candidate is the rate -# (Owen & Wu 2016). Past the threshold the same machinery is still -# evaluated and reported as a luminosity-capped residual (Gupta & -# Schlichting 2019), but it competes in the final comparison only when -# the ``residual`` setting admits it. The default leaves it out: whether -# a bolometric wind outlives the envelope's contraction is disputed -# (Tang et al. 2024 find it negligible once boil-off is initialized -# self-consistently), and the isothermal closed forms are least reliable -# on contracted planets (Misener et al. 2025), so the contested rate is -# a reported candidate rather than a dispatched one. XUV-driven escape -# needs a base to launch from, and a bolometrically boiling atmosphere -# has not built one yet, which is why this test precedes everything -# (Owen & Schlichting 2024). +# 1. The bolometrically driven candidate is computed at every call. Below +# the restricted Jeans parameter threshold the atmosphere boils off and +# that candidate is the rate (Owen & Wu 2016). Past it the same +# machinery is reported as a luminosity-capped residual (Gupta & +# Schlichting 2019) and competes only when ``residual_mode`` admits it, +# off by default because its persistence is disputed (Tang et al. 2024). +# The test comes first because a boiling atmosphere has not yet built +# the base an XUV wind launches from (Owen & Schlichting 2024). # 2. The hydrodynamic candidate: the wind base is located by the # configured method, the thermostat sets the wind temperature by local # heating-cooling balance, and the candidate is min(EL, RR) with the @@ -58,19 +51,19 @@ # escape-temperature gate re-routes thermally unstable exospheres back # to the hydrodynamic rate; points where the neutral and plasma gate # conventions disagree are flagged contested with both rates recorded. -# 5. The Roche screen, per branch, tests the active flow radius (sonic -# radius, max(R_XUV, R_s), or exobase radius) against the periapsis -# Hill radius before the label is finalized. An overflowing point is -# renamed ``roche_overflow`` and keeps the rate its own branch -# computed: the screen renames a state and never changes its rate. -# Near misses raise ``near_roche``. -# 6. The final rate is the largest of the surviving branch rate, the +# 5. The final rate is the largest of the surviving branch rate, the # bolometric residual where the setting admits it, and the tidally -# driven L1 nozzle rate (Jackson et al. 2017), labeled by the winner. A nozzle win labels -# ``roche_overflow`` with a real transfer rate, so that boundary is a -# rate crossing and the dispatched rate is continuous across it; the -# step 5 rename keeps its bound-flow lower-limit meaning, and -# ``diagnostics['roche']['rate_branch']`` says which reading applies. +# driven L1 nozzle rate (Jackson et al. 2017), labeled by the winner. +# A nozzle win labels ``roche_overflow`` with a real transfer rate, so +# that boundary is a rate crossing and the dispatched rate is +# continuous across it. +# 6. The Roche screen tests the winning branch's flow radius (sonic +# radius, max(R_XUV, R_s), or exobase radius) against the periapsis +# Hill radius. An overflowing point is renamed ``roche_overflow`` and +# keeps the rate its own branch computed, a bound-flow lower limit: +# the screen renames a state and never changes its rate. Near misses +# raise ``near_roche``, and ``diagnostics['roche']['rate_branch']`` +# says which of the two readings of the label applies. # # Diagnostics are boxed: nothing in this module branches on anything the # diagnostics container carries, and the container has no off switch. @@ -110,7 +103,7 @@ class DispatchSettings: fractionate: bool = True tidal: bool = True nozzle_temperature: str = 'photospheric' # 'photospheric' | 'wind' - residual: str = 'off' # 'off' | 'luminosity_capped'; the post-gate bolometric candidate + residual_mode: str = 'off' # 'off' | 'luminosity_capped' lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) gamma_bates: float = 0.75 # Bates profile shape parameter kzz: float = 3.0e2 # m^2/s eddy diffusion when the profile carries none @@ -133,8 +126,8 @@ def validate(self) -> None: raise ValueError("T_exo_mode must be 'prescribed' or 'thermostat'") if self.nozzle_temperature not in ('photospheric', 'wind'): raise ValueError("nozzle_temperature must be 'photospheric' or 'wind'") - if self.residual not in ('off', 'luminosity_capped'): - raise ValueError("residual must be 'off' or 'luminosity_capped'") + if self.residual_mode not in ('off', 'luminosity_capped'): + raise ValueError("residual_mode must be 'off' or 'luminosity_capped'") if not ( self.cool_atomic or self.cool_co2_band @@ -292,6 +285,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: lam_gate, st.lambda_crit, k_tide=k_factor, + residual_mode=st.residual_mode, ) # Each candidate's warnings are held with that candidate and merged only # if it wins, so the flag set always describes the dispatched rate and @@ -301,15 +295,6 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: bolo_flags = dict(bolo['flags']) diag['lambda_gate'] = lam_gate diag['bolometric'] = {k: v for k, v in bolo.items() if k != 'flags'} - diag['bolometric']['rate_kg_s'] = bolo_rate - # Whether the candidate takes part in the final comparison on this call: - # always while the activation gate is open, past it only when the setting - # admits the residual. Reported so that a consumer reading the candidate - # rate beside a different verdict can tell a candidate that lost from one - # that was never a contender. - residual_admitted = st.residual == 'luminosity_capped' - diag['bolometric']['residual_mode'] = st.residual - diag['bolometric']['competes'] = bool(lam_gate < st.lambda_crit or residual_admitted) # Step 2: hydrodynamic candidate (always computed; it is cheap). channels = dict( @@ -520,7 +505,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # can overwrite it. The two are the same on every state whose flow stays # inside the Hill sphere. per_species = None - if lam_gate < st.lambda_crit: + if bolo['active']: branch = 'boiloff' rate = bolo_rate flow_radius = bolo['R_sonic'] @@ -549,7 +534,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # so the candidate there is the interior-luminosity cap itself, the # core-powered rate whose persistence is disputed, and it outruns the # XUV rate at interior fluxes of about a watt per square meter. - if residual_admitted and bolo_rate > rate: + if bolo['competes'] and bolo_rate > rate: branch = 'boiloff' rate = bolo_rate per_species = None diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index eb77064b..483a3856 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -134,6 +134,46 @@ def test_luminosity_cap_applies_only_past_the_gate(): assert rate_b <= rate_a * (1 + 1e-12) +@pytest.mark.physics_invariant +def test_candidate_names_its_binding_cap_and_whether_it_competes(): + """The candidate reports which cap set its rate and whether it competes. + + ``binding_cap`` must name the smallest of the caps in force, so the rate + equals that cap and no other cap lies below it. A small interior flux + past the gate makes the luminosity cap bind (7.4e4 kg/s against a Parker + rate of 1.8e13 kg/s), and an interior flux nine decades larger releases + it, which discriminates a name read off the minimum from one fixed by + the gate state. ``competes`` follows the gate + while it is open and the residual mode past it, and never touches the + rate. An unknown mode is rejected with a message naming it. + """ + M_p, R_p, T_eq = 3 * Me, 3 * Re, 1000.0 + launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) + names = {'parker': 'mdot_parker', 'bondi': 'mdot_bondi', 'luminosity': 'mdot_luminosity'} + args = (M_p, R_p, T_eq, 0.01, launch) + for f_int, lam in ((1.0e-3, 30.0), (1.0e6, 30.0), (1.0e-3, 10.0)): + rate, det = bolometric_candidate(*args, f_int, lambda_gate=lam, lambda_crit=20.0) + in_force = [det[k] for k in names.values() if det[k] is not None] + assert rate == pytest.approx(det[names[det['binding_cap']]], rel=1e-15, abs=0.0) + assert all(rate <= cap for cap in in_force) + assert det['rate_kg_s'] == rate + _, low = bolometric_candidate(*args, 1.0e-3, lambda_gate=30.0, lambda_crit=20.0) + _, high = bolometric_candidate(*args, 1.0e6, lambda_gate=30.0, lambda_crit=20.0) + assert low['binding_cap'] == 'luminosity' + assert high['binding_cap'] != 'luminosity' + rate_off, off = bolometric_candidate(*args, 1.0, lambda_gate=30.0, lambda_crit=20.0) + rate_on, on = bolometric_candidate( + *args, 1.0, lambda_gate=30.0, lambda_crit=20.0, residual_mode='luminosity_capped' + ) + _, open_gate = bolometric_candidate(*args, 1.0, lambda_gate=10.0, lambda_crit=20.0) + assert off['competes'] is False + assert on['competes'] is True + assert open_gate['competes'] is True + assert rate_on == rate_off + with pytest.raises(ValueError, match='residual_mode'): + bolometric_candidate(*args, 1.0, 30.0, 20.0, residual_mode='on') + + @pytest.mark.reference_pinned @pytest.mark.physics_invariant def test_luminosity_cap_carries_the_tidal_barrier_reduction(): diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 70ea1168..9e07747a 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -25,6 +25,7 @@ """ import math +import re import numpy as np import pytest @@ -284,7 +285,7 @@ def test_roche_screen_renames_without_changing_the_rate(): stays subdominant across the bracket: the XUV flux is negligible and the nozzle candidate sits outside its applicability criterion, so the rename is the only thing that changes. The residual is admitted through - the ``residual`` setting, since by default it is reported and does not + the ``residual_mode`` setting, since by default it is reported and does not compete; what the family needs is a bound branch whose flow radius is a sonic radius large enough to cross the Hill sphere, and the residual is the one that has it. Bisecting in orbital distance brackets the @@ -295,7 +296,7 @@ def test_roche_screen_renames_without_changing_the_rate(): that form bypasses the luminosity cap. """ comp = {'H2': 0.9, 'He': 0.1} - admitted = DispatchSettings(residual='luminosity_capped') + admitted = DispatchSettings(residual_mode='luminosity_capped') def at(a): return dispatch( @@ -453,7 +454,7 @@ def test_nozzle_competes_only_inside_its_domain(): {'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU, - settings=DispatchSettings(residual='luminosity_capped'), + settings=DispatchSettings(residual_mode='luminosity_capped'), ) ) noz_o = outside.diagnostics['nozzle'] @@ -706,7 +707,7 @@ def test_residual_setting_admits_the_post_gate_candidate(): candidate is the rate there either way. An unknown mode string is rejected by the settings validator with a message naming the knob. """ - admitted = DispatchSettings(residual='luminosity_capped') + admitted = DispatchSettings(residual_mode='luminosity_capped') past = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) off = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, **past)) on = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, settings=admitted, **past)) @@ -741,8 +742,29 @@ def test_residual_setting_admits_the_post_gate_candidate(): assert b_off.diagnostics['bolometric']['competes'] is True assert b_on.mdot == pytest.approx(b_off.mdot, rel=1e-12, abs=0.0) assert 'bolometric_residual' not in b_on.flags - with pytest.raises(ValueError, match='residual'): - DispatchSettings(residual='on').validate() + with pytest.raises(ValueError, match='residual_mode'): + DispatchSettings(residual_mode='on').validate() + + +def test_bolometric_diagnostics_keys_match_the_results_page(): + """The bolometric diagnostics group carries the keys the reference lists. + + The group is built by one producer and documented in one table row, and + the two had drifted before. Parse the key list from the row in + ``docs/Reference/results.md`` and compare it with the live keys on a + state past the gate and one below it, so a key added or dropped on either + side fails here. + """ + from pathlib import Path + + page = Path(__file__).resolve().parents[1] / 'docs' / 'Reference' / 'results.md' + row = next(line for line in page.read_text().splitlines() if line.startswith('| `bolometric` |')) + documented = set(re.findall(r'`([A-Za-z_]+)`', row.split('|')[2])) + assert len(documented) >= 15 + past = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU)) + below = dispatch(_inputs(Me, 1.5 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU)) + for result in (past, below): + assert set(result.diagnostics['bolometric']) == documented def test_nozzle_power_diagnostic_reports_the_lift_cost(): @@ -1094,8 +1116,8 @@ def test_settings_option_raises_cover_every_knob(): """ with pytest.raises(ValueError, match='base_out_of_range'): DispatchSettings(base_out_of_range='nonsense').validate() - with pytest.raises(ValueError, match='residual'): - DispatchSettings(residual='nonsense').validate() + with pytest.raises(ValueError, match='residual_mode'): + DispatchSettings(residual_mode='nonsense').validate() with pytest.raises(ValueError, match='gate'): DispatchSettings(gate='nonsense').validate() with pytest.raises(ValueError, match='efficiency_mode'): @@ -1229,7 +1251,7 @@ def test_one_exobase_temperature_per_call(): comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775, - settings=DispatchSettings(residual='luminosity_capped'), + settings=DispatchSettings(residual_mode='luminosity_capped'), ), dict(M_p=Me, R_p=Re, T_eq=1000.0, comp={'CO2': 1.0}, F_xuv=10.0, a=0.0775), ), From c8a5f06875120268af0f750e6d38c88e495c254a Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:38:36 +0200 Subject: [PATCH 093/113] Quote the default dispatch from a tutorial snippet The tutorial's comparison between the admitted residual and the default settings quoted its rates, the flow-radius ratio, and the nozzle numbers in running prose, outside the snippets whose printed output the tutorial test compares character by character. A snippet now dispatches the same state with the defaults and prints those values, so a change anywhere in the chain that moves them fails the test. --- docs/Tutorials/dispatch.md | 26 ++++++++++++++++++++++++-- tests/test_examples.py | 4 ++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index f6377920..b0df4c56 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -272,9 +272,31 @@ roche_overflow 24622841.930601332 dynamical ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. With the default setting the same state returns `hydrodynamic:EL` at $1.4 \times 10^{5}$ kg s⁻¹: the wind's flow radius reaches 0.83 of the Hill radius, inside the lobe, so the screen stays quiet and only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false. Whether that residual is physical is the disputed question the [escape regimes](../Explanations/regimes.md) page states, which is why admitting it is a choice you make and not a default you inherit. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s` in `diagnostics['nozzle']`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. Whether that residual is physical is the disputed question the [escape regimes](../Explanations/regimes.md) page states, which is why admitting it is a choice you make and not a default you inherit. Dispatch the same state with the defaults to see what the choice costs: -The subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.37 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `r_atmosphere` against `r_lobe` in `diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. +```python +default = dispatch(build_state('H/He', 3.0, 2.0, 0.1)) +bolo = default.diagnostics['bolometric'] +noz = default.diagnostics['nozzle'] + +print(default.regime, default.mdot, 'near_roche' in default.flags) +print(1.0 / default.diagnostics['roche']['xi_flow']) +print(bolo['competes'], bolo['binding_cap'], bolo['rate_kg_s']) +print(noz['rate_full_orbit_kg_s'], noz['R_sonic_over_R_L1'], noz['rate_kg_s']) +``` + +Output: + +```text +hydrodynamic:EL 140144.18462008185 True +0.828069627286013 +False luminosity 24622841.930601332 +54416919476.24317 0.9568936320693068 0.0 +``` + +The XUV wind takes the rate at $1.4 \times 10^{5}$ kg s⁻¹. Its flow radius reaches 0.83 of the Hill radius, inside the lobe, so the screen stays quiet and only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false; `binding_cap` says the interior luminosity is what sets it. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. + +Back on the admitted state, the subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.37 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `puffy.diagnostics['roche']['r_atmosphere']` against `r_lobe` in `puffy.diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. --- diff --git a/tests/test_examples.py b/tests/test_examples.py index bb04e3e9..da0c9045 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -269,6 +269,6 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): ) compared += 1 # Guard against the extraction silently finding nothing, which would make - # the assertions above vacuous. Eighteen of the nineteen output blocks are + # the assertions above vacuous. Nineteen of the twenty output blocks are # comparable here; the stellar track is the integration tier's. - assert compared >= 17, f'only {compared} tutorial output blocks were compared' + assert compared >= 19, f'only {compared} tutorial output blocks were compared' From 7677070df7eccf5dcb6f94049aa8c30e82521968 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:59:34 +0200 Subject: [PATCH 094/113] Anchor the boil-off branch on its launch level The activation gate now evaluates the restricted Jeans parameter at the launch level's radius, the photospheric surface its Owen and Wu threshold is calibrated on, instead of at R_p, which in a coupled call is the interior radius. Evaluated there, the gate closed while the Parker wind was still running (R_launch/R_B of 0.145 on a 3 Earth-mass hydrogen and helium envelope, against the 0.1 shutoff), so under the default a contracted state dropped to the XUV rate by up to 5.5e5; at the launch level the gate sits at 0.087 and the jump is 6.5e2 at an XUV flux of 0.1 W m^-2. The Bondi cap takes Misener et al. (2025) Eq. (10) in full at the wind temperature they recommend, which carries the factor e^2 that the Gupta and Schlichting (2020) form drops; against the Parker rate it is tau_launch (T_wind/T_launch) exp(1/2 - Mach^2/2), pinned by a new reference test, so it binds only on an optically thin launch level. The Tang termination check now reads the bolometric candidate rather than the dispatched rate, so its verdict no longer changes with the residual mode, and non-finite fluxes are rejected, since min() silently dropped a NaN luminosity cap. Tests that relied on a state past the old gate move to 1.7 Earth radii, and the regimes page restates the dispute with the numbers the new gate gives. --- docs/Explanations/regimes.md | 14 +++---- docs/Reference/parameters.md | 2 +- docs/Reference/results.md | 4 +- docs/Tutorials/dispatch.md | 26 ++++++------ docs/Validation/boiloff.md | 5 ++- src/zephyrus/boiloff.py | 50 ++++++++++------------ src/zephyrus/dispatcher.py | 25 +++++------ tests/test_boiloff.py | 46 ++++++++++++++++++++ tests/test_dispatcher.py | 81 +++++++++++++++++++++++++++++++++--- 9 files changed, 183 insertions(+), 70 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 3a557f58..e7e2e39c 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -52,25 +52,25 @@ Every branch below is one box of that figure, and the two refinements the [model A freshly formed or strongly heated planet can hold an atmosphere so distended that its outer layers sit beyond the sonic point of a thermal wind: the gas then flows out on the planet's own thermal energy alone. The activation criterion is the restricted Jeans parameter [^fossati] -$$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{p}} \tag{1}$$ +$$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{launch}} \tag{1}$$ -the ratio of a particle's gravitational binding energy at the surface to its thermal energy, built with the mean molecular mass $\mu$ of the atmosphere at the photospheric level and the Boltzmann constant $k_\mathrm{B}$. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{p}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find at $R_\mathrm{p}/R_\mathrm{B} = 0.1$ is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. +the ratio of a particle's gravitational binding energy to its thermal energy, evaluated at the photospheric launch level (radius $R_\mathrm{launch}$, the 20 mbar level by default) with the mean molecular mass $\mu$ of the atmosphere there and the Boltzmann constant $k_\mathrm{B}$. The launch level is the surface the threshold below is calibrated on. In a coupled run $R_\mathrm{p}$ is the interior radius, which on an inflated envelope sits well below the photosphere, and a parameter built there would close the gate while the Parker wind is still running. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{launch}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find with the photosphere at a tenth of the Bondi radius is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): $$\dot{M}_\mathrm{P} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{s}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \quad x = \frac{R_\mathrm{launch}}{R_\mathrm{B}} \tag{2}$$ -where $\mathcal{M}$ is the Mach number at the launch level (the photospheric level, radius $R_\mathrm{launch}$), $W_0$ is the principal branch of the Lambert function, and $\kappa$ is the photospheric opacity, which the rate scales inversely with. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; for small $x$ the rate shuts off exponentially, which is the physical end of boil-off. The rate is capped by the Bondi-limited supply of Gupta & Schlichting (2020) [^gs20], +where $\mathcal{M}$ is the Mach number at the launch level (the photospheric level, radius $R_\mathrm{launch}$), $W_0$ is the principal branch of the Lambert function, and $\kappa$ is the photospheric opacity, which the rate scales inversely with. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; for small $x$ the rate shuts off exponentially, which is the physical end of boil-off. The rate is capped by the Bondi-limited supply, in the form of Misener et al. (2025) Eq. (10) [^misener], -$$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(-\frac{G M_\mathrm{p}}{c_\mathrm{s}^2 R_\mathrm{launch}}\right) \tag{3}$$ +$$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(2 - \frac{2 R_\mathrm{B}}{R_\mathrm{launch}}\right) \tag{3}$$ -with $\rho_\mathrm{launch}$ the mass density at the launch level. The cap is evaluated at the same wind temperature as Eq. (2). Gupta & Schlichting write Eq. (3) at $T_\mathrm{eq}$, and Misener et al. (2025) recommend $T_\mathrm{eq}/2^{1/4}$ for that same isothermal form [^misener], so the cap follows the correction rather than the original; the two conventions differ by $2^{-3/8} \exp[\Lambda_\mathrm{launch}(2^{1/4} - 1)]$, with $\Lambda_\mathrm{launch}$ the Jeans parameter at the launch level, a factor near 30 at the shutoff. The choice seldom reaches the rate, because Eqs. (2) and (3) describe one isothermal wind: at a launch level of unit optical depth the cap sits a constant factor of about $e^{3/2}$ below the Parker rate, and on a launch level optically thick to the supplied opacity, which the default 20 mbar level is on an inflated hydrogen envelope, the cap sits above the Parker rate and does not bind. `tau_launch` in the diagnostics says which case a state is in. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, +with $\rho_\mathrm{launch}$ the mass density at the launch level, carried hydrostatically to the sonic point, and evaluated at the same wind temperature as Eq. (2), which is the temperature Misener et al. recommend for it. Gupta & Schlichting (2020) write the cap without the factor $e^2$ and at $T_\mathrm{eq}$ [^gs20]; their form is larger than Eq. (3) by $e^{-2}\, 2^{-3/8} \exp[\Lambda (2^{1/4} - 1)]$ with $\Lambda$ from Eq. (1), a factor of 4.6 at the gate. Against the Parker rate the cap is $\tau_\mathrm{launch} (T_\mathrm{w} / T_\mathrm{launch}) \exp(1/2 - \mathcal{M}^2/2)$, with $T_\mathrm{w}$ the wind temperature, $T_\mathrm{launch}$ the profile temperature at the launch level, and $\tau_\mathrm{launch} = \kappa P / g$ that level's optical depth to the supplied opacity. The cap therefore binds only on a launch level optically thin to that opacity, below an optical depth of about 0.6 on a level at the wind temperature. `tau_launch` and `binding_cap` in the diagnostics say which case a state is in. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ -with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and the two rates that can compete in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual_mode` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. +with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and an admitted residual and the XUV rate it competes with in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual_mode` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. -Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting find that a bolometric wind fed by the cooling interior persists for gigayears at the rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. The luminosity cap does not make that disagreement small here. In the window just past the gate the Parker and Bondi rates of Eqs. (2) and (3) have not shut off yet, so the residual is Eq. (4) itself: on a three Earth-mass hydrogen envelope with an interior flux of a few watts per square meter it exceeds the XUV rate by more than a decade and would strip a one percent envelope in a few hundred million years, and the closed forms shut off on their own only once the Jeans parameter passes about 30. The default therefore reports the candidate and does not dispatch it, which follows Tang et al.; a run that wants the Gupta & Schlichting reading sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. +Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting (2019) find that a bolometric wind fed by the cooling interior persists for gigayears, at the smaller of the Bondi-limited rate and the cooling-luminosity rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. Here the dispute is confined to a narrow band past the gate. On a three Earth-mass hydrogen envelope at 0.1 au under an XUV flux of 10 W m⁻², the candidate past the gate is set by the Parker rate of Eq. (2) almost everywhere, since the closed form is still shutting off; it exceeds the XUV rate only while $\Lambda$ stays below about 21 to 23 (lower for a cooler envelope), by up to a factor of 7 at the points sampled between 1000 and 1500 K, and has fallen to 2 to 7 percent of it at $\Lambda = 25$. The default reports the candidate and does not dispatch it, which follows Tang et al. and makes the gate a jump in the dispatched rate: a factor of 6.5 on a three Earth-mass hydrogen and helium envelope at 1000 K under that XUV flux, and 650 under 0.1 W m⁻², where the XUV rate is small. A run that wants the rate continuous across the gate sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed on the candidate and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. ## The hydrodynamic wind diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 845557ec..ccdea216 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -115,7 +115,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | | `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | -| `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default because just past the gate that candidate is the luminosity cap itself and exceeds the XUV rate at interior fluxes near a watt per square meter; the [escape regimes](../Explanations/regimes.md) page states the dispute and the measured consequence. | +| `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default, following Tang et al.; the price is a jump in the dispatched rate at the activation gate, measured on the [escape regimes](../Explanations/regimes.md) page together with the dispute and the band past the gate where the candidate would win. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index a92da561..1bc51f69 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -85,7 +85,7 @@ The `effect` column says whether the returned rate already reflects the flag or | `nozzle_partial_orbit` | `True` | The overflow description holds only on an arc around periapsis, so the average is duty-cycled over that arc and `applicable_orbit_fraction` is below one. The rate therefore omits the wind the planet drives on the rest of the orbit, which one dispatched rate cannot also carry. | The rate reflects it | | `near_roche` | `True` | The Hill radius is less than 1.5 flow radii, that is, the flow reaches beyond two thirds of the way to the lobe. The tidal factor is steep there; read `diagnostics['roche']['tidal_inflation']` for how much of the rate it is setting. Not raised on a state already labeled `roche_overflow`, since the warning is about the tidal inflation of a bound rate. | Reporting only | | `t_exo_floored_to_profile_top` | `True` | The prescribed exobase temperature was below the profile's top level, which would build a thermosphere that cools with height and an exobase more strongly bound than its own anchor. The temperature floors at the anchor. In a coupled run the profile top can warm past a fixed prescription over secular time, so this is reported rather than raised. | Reporting only | -| `luminosity_capped` | `True` | The interior luminosity is the term setting the dispatched bolometric rate. The cap applies only once the activation gate has closed, so a state crossing that threshold drops discontinuously, by a factor of thousands, while keeping the same label. Raised only when an admitted residual wins, since only then is the capped rate dispatched; `diagnostics['bolometric']['binding_cap']` names the binding term on every call. | Reporting only | +| `luminosity_capped` | `True` | The interior luminosity is the term setting the dispatched bolometric rate. The cap applies only once the activation gate has closed. Raised only when an admitted residual wins, since only then is the capped rate dispatched; `diagnostics['bolometric']['binding_cap']` names the binding term on every call. | Reporting only | | `k_tide_undefined` | `True` | The Hill radius is inside the planetary radius, so the tidal barrier is gone and the factor has no value. The rates are computed without the tidal reduction, which is the smaller reading, and the Roche screen relabels the state. | Reporting only | | `split_from_base_composition` | `True` | The per-species split used the atomized wind-base composition because no reservoirs were supplied. | The split reflects it | @@ -116,7 +116,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | | `erkaev_tc_K` | float | The tidally corrected critical exobase temperature above which the thermosphere blows off. | | `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | -| `tang_timescale` | boil-off termination timescales | A consistency check on the bolometric rate's own exponential shutoff. | +| `tang_timescale` | `evaluated`, `t_mdot_s`, `t_cool_s`, `terminated` | The Tang et al. (2024) termination check on the bolometric candidate, whichever rate was dispatched, so its verdict does not change with `residual_mode`. | | `self_consistency` | `evaluated`, `t_deplete_s`, `age_s`, `inconsistent` | Whether the dispatched rate would have destroyed the supplied inventory within the supplied age. Reports `evaluated: False` without an age or reservoirs. | | `rate_floor` | `floor_kg_s`, `above_floor` | Whether the dispatched rate has any numerical content, against one proton per Julian year. Reporting only: the module never applies the floor. | | `base_level` | `p_Pa`, `p_physical_Pa`, `r_m`, `T_K`, `clamp_decades` | Where the wind was launched, and the pressure the base method asked for before any clamp. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index b0df4c56..e9eabdfd 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -243,20 +243,20 @@ Output: ```text boiloff 134848975815225.14 -11.10021097177663 +2.8857972759204777 (15.0, 35.0) ['base_clamp_decades', 'base_clamped'] ``` -At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 11.10$, well below the threshold of 20, and the rate is $1.3 \times 10^{14}$ kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. +At one Earth mass and 1.5 Earth radii with a hydrogen and helium envelope, $\Lambda = 2.89$, far below the threshold of 20. The parameter is evaluated at the launch level, the photospheric surface its threshold is calibrated on, which on an envelope this inflated sits nearly four planetary radii out, and the rate is $1.3 \times 10^{14}$ kg s⁻¹ at every flux in the sweep. That planet is not long-lived, which is the point: boil-off is the regime of the first few million years. The clamp flags are expected here, and harmless: an isothermal hydrogen envelope becomes unbound before it reaches a nanobar, so the profile stops early and the wind base clamps to its top. The boil-off branch launches from the photospheric level, not the wind base, so the clamp does not touch the rate. Note what is absent: the hydrodynamic candidates were computed on this state too, and one of them raised a subcritical-sonic caution, but the dispatched rate is the bolometric one and the flags describe the branch that produced it. Flags tell you what happened; deciding whether it matters is your job, and the [troubleshooting guide](../How-to/troubleshooting.md) is a shortcut for the common cases. -Push the same envelope to three Earth masses and two Earth radii. It has contracted past the activation gate, so by default the bolometric candidate is reported and does not compete, and the XUV wind takes the rate. Admit the luminosity-capped residual through the `residual_mode` setting, and the flow of the winning branch stops being bound to the planet at all: +Push the same envelope to three Earth masses and 1.7 Earth radii. It has contracted just past the activation gate, so by default the bolometric candidate is reported and does not compete, and the XUV wind takes the rate. Admit the residual through the `residual_mode` setting, and the flow of the winning branch stops being bound to the planet at all: ```python admitted = DispatchSettings(residual_mode='luminosity_capped') -puffy = dispatch(build_state('H/He', 3.0, 2.0, 0.1, settings=admitted)) +puffy = dispatch(build_state('H/He', 3.0, 1.7, 0.1, settings=admitted)) roche = puffy.diagnostics['roche'] print(puffy.regime, puffy.mdot) @@ -267,15 +267,15 @@ print(puffy.flags['roche_subflag']) Output: ```text -roche_overflow 24622841.930601332 +roche_overflow 8968244.133873517 189433055.79726917 167277833.86655325 0.8830445835470955 dynamical ``` -The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the luminosity-capped bolometric residual at $2.5 \times 10^{7}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. Whether that residual is physical is the disputed question the [escape regimes](../Explanations/regimes.md) page states, which is why admitting it is a choice you make and not a default you inherit. Dispatch the same state with the defaults to see what the choice costs: +The flow radius of the winning branch now exceeds the Hill radius, so the atmosphere spills over the gravitational boundary instead of escaping through a bound outflow, and the label says so. The rate is unchanged by the label: the screen renames a state and never recomputes its rate, so what you get is whatever the winning branch produced, here the bolometric residual at $9.0 \times 10^{6}$ kg s⁻¹ named in `diagnostics['roche']['rate_branch']`. Read it as a lower limit. Whether that residual is physical is the disputed question the [escape regimes](../Explanations/regimes.md) page states, which is why admitting it is a choice you make and not a default you inherit. Dispatch the same state with the defaults to see what the choice costs: ```python -default = dispatch(build_state('H/He', 3.0, 2.0, 0.1)) +default = dispatch(build_state('H/He', 3.0, 1.7, 0.1)) bolo = default.diagnostics['bolometric'] noz = default.diagnostics['nozzle'] @@ -288,15 +288,15 @@ print(noz['rate_full_orbit_kg_s'], noz['R_sonic_over_R_L1'], noz['rate_kg_s']) Output: ```text -hydrodynamic:EL 140144.18462008185 True -0.828069627286013 -False luminosity 24622841.930601332 -54416919476.24317 0.9568936320693068 0.0 +hydrodynamic:EL 73002.71859264988 True +0.817259936490472 +False parker 8968244.133873517 +674942040.3533882 0.9568936320693068 0.0 ``` -The XUV wind takes the rate at $1.4 \times 10^{5}$ kg s⁻¹. Its flow radius reaches 0.83 of the Hill radius, inside the lobe, so the screen stays quiet and only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false; `binding_cap` says the interior luminosity is what sets it. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $5.4 \times 10^{10}$ kg s⁻¹ as `rate_full_orbit_kg_s`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. +The XUV wind takes the rate at $7.3 \times 10^{4}$ kg s⁻¹. Its flow radius reaches 0.82 of the Hill radius, inside the lobe, so the screen stays quiet and of the overflow flags only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false. `binding_cap` says the Parker rate itself sets it: this close to the gate the closed-form wind has not yet shut off below the interior-luminosity cap, which here sits higher, at $1.5 \times 10^{7}$ kg s⁻¹. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $6.7 \times 10^{8}$ kg s⁻¹ as `rate_full_orbit_kg_s`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. -Back on the admitted state, the subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.37 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `puffy.diagnostics['roche']['r_atmosphere']` against `r_lobe` in `puffy.diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. +Back on the admitted state, the subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.36 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `puffy.diagnostics['roche']['r_atmosphere']` against `r_lobe` in `puffy.diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. --- diff --git a/docs/Validation/boiloff.md b/docs/Validation/boiloff.md index a9cf76dd..f4dbe749 100644 --- a/docs/Validation/boiloff.md +++ b/docs/Validation/boiloff.md @@ -6,14 +6,15 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the boil- |---|---|---| | `tests/test_boiloff.py::test_parker_mach_sonic_limit_and_shutoff` | Owen & Wu (2016), ApJ 817, 107 (isothermal transonic Parker wind, Lambert-W form) | The photospheric Mach number is 1 identically with the launch level at the Bondi radius (the analytical sonic-point limit), falls monotonically as the level retreats inward, and has collapsed by more than six decades at their published shutoff R_p/R_B = 0.1. | | `tests/test_boiloff.py::test_lambda_equals_two_bondi_radii_over_rp` | Fossati et al. (2017), A&A 598, A90 (restricted Jeans parameter); Owen & Wu (2016), ApJ 817, 107 | The identity Lambda = 2 R_B / R_p holds for every mean molecular mass, which is what makes the Owen & Wu shutoff equal to Lambda = 20 for every composition; the literature band 15 to 35 brackets the default threshold. | +| `tests/test_boiloff.py::test_bondi_cap_is_misener_eq10_at_the_wind_temperature` | Misener et al. (2025), ApJ 980, 152, Eq. 10; Gupta & Schlichting (2020), MNRAS 493, 792, Eq. 10 | The Bondi cap equals the closed form at the wind temperature T_eq / 2^(1/4) on a hydrostatic launch level, differs from the same form at T_eq by 2^(-3/8) exp(Lambda_launch (2^(1/4) - 1)), and stands to the Parker rate as tau_launch (T_wind / T_launch) exp(1/2 - Mach^2 / 2), so it binds on an optically thin launch level and not on a thick one. | | `tests/test_boiloff.py::test_luminosity_cap_carries_the_tidal_barrier_reduction` | Erkaev et al. (2007), A&A 472, 329, Eq. 17 and Table 1 | The luminosity cap divides by the tidally reduced escape barrier, so it rises by the enhancement factor 1 / K, whose value at xi = 3 is the 1.92 printed in their Table 1; K = 1 reproduces the untidal cap identically. | ## Notes -The Bondi cap follows Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 8), whose barrier carries the Erkaev tidal factor at xi = R_Hill / R_p so that the cap and the energy-limited rate it competes against measure the same barrier; the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. +The Bondi cap follows Misener et al. (2025, ApJ 980, 152, Eq. 10) at their recommended wind temperature, which carries a factor e^2 the Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) original lacks, and the luminosity cap Gupta & Schlichting (2019, MNRAS 487, 24, Eq. 8), whose barrier carries the Erkaev tidal factor at xi = R_Hill / R_p so that an admitted residual and the energy-limited rate it competes against measure the same barrier; the cap ordering and the gate semantics are asserted as physics invariants in the same file. The Tang et al. (2024, ApJ 976, 221, Eq. 8) timescale comparison runs as a diagnostic only. ## Anchor type Analytical limit plus published benchmark (the printed shutoff). -Date of last comparison against the sources: 2026-08-22. +Date of last comparison against the sources: 2026-09-28. diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 5bb5f097..17e1cfdb 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -24,29 +24,24 @@ # - Wind temperature: T_eq / 2^(1/4), the explicit recommendation of # Misener et al. (2025, ApJ 980, 152) for the isothermal formulas. # - Activation: the restricted Jeans parameter -# Lambda = G M_p mu / (kB T_eq R_p) (Fossati et al. 2017, A&A 598, A90), -# built with the composition mean molecular mass. For isothermal gas -# Lambda = 2 R_B / R_p identically, so the Owen & Wu shutoff at -# R_p/R_B = 0.1 is Lambda = 20 for every composition; the transfer of -# that hydrogen-calibrated shutoff to other envelopes is an assumption -# the activation band (15 to 35 across the literature) makes visible. -# - Bondi cap: Gupta & Schlichting (2020, MNRAS 493, 792, their Eq. 10), -# Mdot_B = 4 pi R_B^2 c_s rho_launch exp(-G M_p / (c_s^2 R_launch)), -# sonic-point area with the launch-level density; the launch level is -# identified with the radiative-convective boundary, a documented -# approximation on a static profile. The cap is evaluated at the same -# wind temperature as the Parker rate. Gupta & Schlichting write it at -# T_eq; Misener et al. (2025) recommend T_eq / 2^(1/4) for this same -# isothermal form, so the cap follows the correction rather than the -# original, and the two conventions differ by -# 2^(-3/8) exp(Lambda_launch (2^(1/4) - 1)), with Lambda_launch the Jeans -# parameter at the launch level, a factor near 30 at the shutoff. The -# cap and the Parker rate describe one isothermal wind: at a launch -# level of unit optical depth the cap sits a constant factor of about -# e^(3/2) below the Parker rate (e^2 with the level at the sonic -# radius), and on a level optically thick to the supplied opacity it -# sits above the Parker rate and does not bind, which tau_launch -# reports. +# Lambda = G M_p mu / (kB T_eq r) (Fossati et al. 2017, A&A 598, A90), +# evaluated at the launch level r with the composition mean molecular +# mass there, the photospheric surface its calibration refers to. For +# isothermal gas Lambda = 2 R_B / r identically, so the Owen & Wu +# shutoff at r/R_B = 0.1 is Lambda = 20 for every composition; the +# transfer of that hydrogen-calibrated shutoff to other envelopes is an +# assumption the activation band (15 to 35 across the literature) makes +# visible. +# - Bondi cap: Misener et al. (2025, their Eq. 10), +# Mdot_B = 4 pi R_B^2 c_s rho_launch exp(2 - 2 R_B / R_launch), the +# isothermal hydrostatic density carried from the launch level to the +# sonic point, at the wind temperature they recommend for it. The +# Gupta & Schlichting (2020, MNRAS 493, 792, Eq. 10) original drops the +# e^2 and runs at T_eq. The launch level stands in for the +# radiative-convective boundary. Against the Parker rate the cap is +# tau_launch (T_wind / T_launch) exp(1/2 - Mach^2 / 2), so it binds only +# on a launch level optically thin to the supplied opacity, which +# tau_launch reports. # - Luminosity cap, applied only past the activation gate: # Mdot_E = L / (g R_p K) with L = 4 pi R_p^2 F_int (Gupta & Schlichting # 2019, MNRAS 487, 24, their Eq. 8). Whether a bolometric wind persists @@ -67,9 +62,10 @@ def lambda_restricted(M_p: float, R_p: float, T_eq: float, mu_kg: float) -> float: """Restricted Jeans parameter Lambda = G M_p mu / (kB T_eq R_p). - Dimensionless; built with the composition mean molecular mass ``mu_kg`` - [kg] at the launch level (Fossati et al. 2017). For isothermal gas this - equals ``2 R_B / R_p`` with the Bondi radius at ``T_eq``. + Dimensionless (Fossati et al. 2017). ``R_p`` [m] is the radius of the + level it is evaluated at and ``mu_kg`` [kg] the mean molecular mass + there; the dispatcher passes the launch level for both. For isothermal + gas this equals ``2 R_B / R_p`` with the Bondi radius at ``T_eq``. """ return G * M_p * mu_kg / (kb * T_eq * R_p) @@ -180,7 +176,7 @@ def bolometric_candidate( rho_launch = launch['rho'] mdot_bondi = ( - 4.0 * math.pi * R_B**2 * c_s * rho_launch * math.exp(-G * M_p / (c_s**2 * R_launch)) + 4.0 * math.pi * R_B**2 * c_s * rho_launch * math.exp(2.0 - 2.0 * R_B / R_launch) ) # Optical depth of the launch level to its own opacity, in the diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 4b2d945c..2fb1ffbb 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -204,10 +204,11 @@ class EscapeInputs: def validate(self) -> None: """Raise ``ValueError`` on a malformed physical state.""" for name in ('M_p', 'R_p', 'M_star', 'a', 'T_eq', 'F_bol', 'F_int', 'kappa_photo'): - if getattr(self, name) <= 0: - raise ValueError(f'{name} must be positive') - if self.F_xuv < 0: - raise ValueError('F_xuv must be >= 0') + value = getattr(self, name) + if not math.isfinite(value) or value <= 0: + raise ValueError(f'{name} must be positive and finite, got {value!r}') + if not math.isfinite(self.F_xuv) or self.F_xuv < 0: + raise ValueError(f'F_xuv must be finite and >= 0, got {self.F_xuv!r}') if not (0.0 <= self.e < 1.0): raise ValueError('e must be in [0, 1)') self.settings.validate() @@ -274,7 +275,9 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: k_factor = 1.0 # Step 1: bolometric candidate, computed at every point. - lam_gate = bl.lambda_restricted(inputs.M_p, inputs.R_p, inputs.T_eq, photo['mmw']) + # At the launch level, the photospheric surface the threshold is + # calibrated on; R_p is the interior radius in a coupled call. + lam_gate = bl.lambda_restricted(inputs.M_p, photo['r'], inputs.T_eq, photo['mmw']) bolo_rate, bolo = bl.bolometric_candidate( inputs.M_p, inputs.R_p, @@ -528,12 +531,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: per_species = dict(hs_per_element) winner_flags = hs_flags flow_radius = hsd['r_exo'] - # Step 5: the bolometric residual competes past the gate only when - # the setting admits it. Off by default. In the window just past the - # gate the closed-form Parker and Bondi rates have not shut off yet, - # so the candidate there is the interior-luminosity cap itself, the - # core-powered rate whose persistence is disputed, and it outruns the - # XUV rate at interior fluxes of about a watt per square meter. + # Step 5: past the gate the bolometric residual competes only when + # ``residual_mode`` admits it, since its persistence is disputed. if bolo['competes'] and bolo_rate > rate: branch = 'boiloff' rate = bolo_rate @@ -679,8 +678,10 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['fluid_check'] = dg.along_profile_fluid_check( inputs.profile, inputs.M_p, rr['R_s'], st.kn_crit ) + # The check is on the bolometric candidate, not the dispatched rate, so + # its verdict does not change with whether the residual was admitted. diag['tang_timescale'] = bl.tang_timescale_check( - inputs.M_p, inputs.R_p, inputs.F_int, rate, inputs.reservoirs + inputs.M_p, inputs.R_p, inputs.F_int, bolo_rate, inputs.reservoirs ) diag['self_consistency'] = dg.self_consistency_screen(inputs.reservoirs, rate, inputs.age) diag['rate_floor'] = dg.rate_floor_screen(rate) diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 483a3856..a0e03538 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -134,6 +134,49 @@ def test_luminosity_cap_applies_only_past_the_gate(): assert rate_b <= rate_a * (1 + 1e-12) +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_bondi_cap_is_misener_eq10_at_the_wind_temperature(): + """The Bondi cap is Misener et al. (2025) Eq. (10) at ``T_eq / 2^(1/4)``. + + Pinned against ``4 pi R_s^2 c_s rho_launch exp(2 - 2 R_s / R_launch)`` + built from the constants at the wind temperature, on a hydrostatic + launch level. Discrimination: the same form at ``T_eq`` differs by + ``2^(-3/8) exp(Lambda_launch (2^(1/4) - 1))``, a factor near 8 here, and + the Gupta & Schlichting (2020) prefactor without the ``e^2`` by 7.4. The + ratio to the Parker rate is ``tau_launch (T_wind / T_launch) + exp(1/2 - Mach^2 / 2)`` on levels two decades apart in optical depth, + so the cap binds only on a launch level optically thin to the opacity. + """ + M_p, R_p, T_eq = 3 * Me, 1.5 * Re, 1000.0 + T_w = T_eq / 2**0.25 + for p_launch in (20.0, 2000.0): + launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}, p=p_launch) + _, det = bolometric_candidate(M_p, R_p, T_eq, 0.01, launch, 1.0, 10.0, 20.0) + mu, r_l = launch['mmw'], launch['r'] + c_s = math.sqrt(kb * T_w / mu) + r_s = G * M_p / (2.0 * c_s**2) + expected = 4.0 * math.pi * r_s**2 * c_s * launch['rho'] * math.exp(2.0 - 2.0 * r_s / r_l) + assert det['mdot_bondi'] == pytest.approx(expected, rel=1e-12, abs=0.0) + c_eq = math.sqrt(kb * T_eq / mu) + r_eq = G * M_p / (2.0 * c_eq**2) + at_teq = 4.0 * math.pi * r_eq**2 * c_eq * launch['rho'] * math.exp(2.0 - 2.0 * r_eq / r_l) + lam_launch = G * M_p * mu / (kb * T_eq * r_l) + assert at_teq / expected == pytest.approx( + 2.0**-0.375 * math.exp(lam_launch * (2.0**0.25 - 1.0)), rel=1e-12, abs=0.0 + ) + assert at_teq / expected > 2.0 + ratio = det['mdot_bondi'] / det['mdot_parker'] + predicted = det['tau_launch'] * (T_w / T_eq) * math.exp(0.5 - det['mach'] ** 2 / 2.0) + assert ratio == pytest.approx(predicted, rel=1e-12, abs=0.0) + thin = _launch(M_p, R_p, T_eq, {'H2': 1.0}, p=20.0) + thick = _launch(M_p, R_p, T_eq, {'H2': 1.0}, p=2000.0) + _, d_thin = bolometric_candidate(M_p, R_p, T_eq, 0.01, thin, 1.0, 10.0, 20.0) + _, d_thick = bolometric_candidate(M_p, R_p, T_eq, 0.01, thick, 1.0, 10.0, 20.0) + assert d_thin['tau_launch'] < 0.1 and d_thin['binding_cap'] == 'bondi' + assert d_thick['tau_launch'] > 1.0 and d_thick['binding_cap'] == 'parker' + + @pytest.mark.physics_invariant def test_candidate_names_its_binding_cap_and_whether_it_competes(): """The candidate reports which cap set its rate and whether it competes. @@ -257,6 +300,9 @@ def test_inflated_launch_level_clamps_with_flag(): assert det['mach'] == pytest.approx(1.0, abs=1e-9) assert math.isfinite(rate) assert rate > 0.0 + # The dilute hand-built level is optically thin, so the Bondi cap binds. + assert det['binding_cap'] == 'bondi' + assert rate == pytest.approx(det['mdot_bondi'], rel=1e-15, abs=0.0) def test_tang_timescale_diagnostic_contract(): diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 9e07747a..2c962c8d 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -300,7 +300,7 @@ def test_roche_screen_renames_without_changing_the_rate(): def at(a): return dispatch( - _inputs(3 * Me, 2.0 * Re, 1000.0, comp, F_xuv=0.1, a=a, settings=admitted) + _inputs(3 * Me, 1.7 * Re, 1000.0, comp, F_xuv=0.1, a=a, F_int=0.05, settings=admitted) ) lo, hi = 0.078 * AU, 0.3 * AU @@ -709,8 +709,8 @@ def test_residual_setting_admits_the_post_gate_candidate(): """ admitted = DispatchSettings(residual_mode='luminosity_capped') past = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) - off = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, **past)) - on = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, settings=admitted, **past)) + off = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, **past)) + on = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, settings=admitted, **past)) assert off.diagnostics['lambda_gate'] > 20.0 bolo_off = off.diagnostics['bolometric'] assert off.regime == 'hydrodynamic:EL' @@ -740,12 +740,81 @@ def test_residual_setting_admits_the_post_gate_candidate(): assert b_off.regime == 'boiloff' assert b_on.regime == 'boiloff' assert b_off.diagnostics['bolometric']['competes'] is True + assert b_on.diagnostics['bolometric']['competes'] is True + assert b_on.diagnostics['bolometric']['residual_mode'] == 'luminosity_capped' assert b_on.mdot == pytest.approx(b_off.mdot, rel=1e-12, abs=0.0) assert 'bolometric_residual' not in b_on.flags with pytest.raises(ValueError, match='residual_mode'): DispatchSettings(residual_mode='on').validate() +def test_activation_gate_boundary_and_the_candidate_it_reports(): + """At the threshold itself the gate is closed, and the check is on the candidate. + + The activation test is a strict inequality, so a state whose own + ``lambda_gate`` is set as ``lambda_crit`` is past the gate: not boil-off, + not active, and not competing under the default. The Tang timescale + diagnostic describes the bolometric candidate, so on a state past the + gate it is identical whether or not the residual is admitted, although + the dispatched rate differs by two decades between the two modes. + """ + comp = {'H2': 0.9, 'He': 0.1} + envelope = {'H': 0.01 * 3 * Me * 0.75, 'He': 0.01 * 3 * Me * 0.25} + state = dict(comp=comp, F_xuv=0.1, a=0.12 * AU, reservoirs=envelope) + probe = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, **state)) + at = DispatchSettings(lambda_crit=probe.diagnostics['lambda_gate']) + edge = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, settings=at, **state)) + assert edge.regime != 'boiloff' + assert edge.diagnostics['bolometric']['active'] is False + assert edge.diagnostics['bolometric']['competes'] is False + admitted = DispatchSettings(residual_mode='luminosity_capped') + on = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, settings=admitted, **state)) + assert on.mdot > 10.0 * probe.mdot + assert probe.diagnostics['tang_timescale']['evaluated'] is True + assert on.diagnostics['tang_timescale'] == probe.diagnostics['tang_timescale'] + + +def test_roche_rename_keeps_the_rate_under_the_default_settings(): + """The geometric rename leaves the rate continuous with the defaults. + + An inflated one Earth-mass envelope boils off with its sonic radius + near the Hill radius, and bisecting in orbital distance brackets the + point where the screen renames it. The nozzle stays outside its + criterion on both sides, so the rename is the only thing that changes, + and the rates either side agree to machine precision. + """ + comp = {'H2': 0.9, 'He': 0.1} + + def at(a): + return dispatch(_inputs(Me, 1.5 * Re, 1000.0, comp, F_xuv=10.0, a=a)) + + lo, hi = 0.030 * AU, 0.045 * AU + assert at(lo).regime == 'roche_overflow' + assert at(hi).regime == 'boiloff' + for _ in range(50): + mid = 0.5 * (lo + hi) + if at(mid).regime == 'roche_overflow': + lo = mid + else: + hi = mid + below, above = at(lo), at(hi) + assert below.diagnostics['nozzle']['applicable'] is False + assert below.diagnostics['roche']['rate_branch'] == 'boiloff' + assert below.mdot == pytest.approx(above.mdot, rel=1e-9, abs=0.0) + + +def test_non_finite_fluxes_are_rejected(): + """A NaN or infinite flux raises rather than silently dropping a cap. + + ``min`` never selects a NaN, so a NaN interior flux would remove the + luminosity cap from the candidate without any error. + """ + for name, bad in (('F_int', math.nan), ('F_int', math.inf), ('F_xuv', math.nan)): + kw = {name: bad} + with pytest.raises(ValueError, match=name): + dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, {'H2': 1.0}, **{'F_xuv': 0.1, **kw})) + + def test_bolometric_diagnostics_keys_match_the_results_page(): """The bolometric diagnostics group carries the keys the reference lists. @@ -1215,14 +1284,14 @@ def test_one_exobase_temperature_per_call(): 'near_roche', dict( M_p=3 * Me, - R_p=2 * Re, + R_p=1.7 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.0775, ), dict( - M_p=3 * Me, R_p=2 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30 + M_p=3 * Me, R_p=1.7 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30 ), ), ( @@ -1246,7 +1315,7 @@ def test_one_exobase_temperature_per_call(): 'bolometric_residual', dict( M_p=3 * Me, - R_p=2 * Re, + R_p=1.7 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, From ebf347b34c1bba93cf0504569726687115b715c3 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:59:40 +0200 Subject: [PATCH 095/113] Admit the residual in the example's overflow case The example announced a puffy envelope filling its Hill sphere, but with the residual off by default that state dispatches a bound XUV wind, so the overflow case now admits the residual explicitly and a test holds both extreme cases to their labels. --- examples/demo_dispatcher/demo_dispatcher.py | 16 +++++++++++----- tests/test_examples.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index 189fa3a1..a0427f38 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -288,15 +288,21 @@ def report_sweep(composition: str, rows: list[dict]) -> list[tuple]: def extreme_labels() -> list[dict]: - """The boil-off and Roche-overflow labels, one call each.""" + """The boil-off and Roche-overflow labels, one call each. + + The overflow case admits the post-gate bolometric residual, whose sonic + radius is the flow that crosses the Hill radius; with the default + settings the same state is a bound XUV wind. + """ print('\n=== The other two labels ===') out = [] + admitted = DispatchSettings(residual_mode='luminosity_capped') cases = [ - ('boil-off: an inflated hydrogen envelope', 'H/He', 1.0, 1.5, 10.0), - ('overflow: a puffy envelope filling its Hill sphere', 'H/He', 3.0, 2.0, 0.1), + ('boil-off: an inflated hydrogen envelope', 'H/He', 1.0, 1.5, 10.0, None), + ('overflow: a puffy envelope, residual admitted', 'H/He', 3.0, 2.0, 0.1, admitted), ] - for note, composition, m_earth, r_earth, f_xuv in cases: - result = dispatch(build_state(composition, m_earth, r_earth, f_xuv)) + for note, composition, m_earth, r_earth, f_xuv, settings in cases: + result = dispatch(build_state(composition, m_earth, r_earth, f_xuv, settings=settings)) diagnostics = result.diagnostics print(f' {note}') print( diff --git a/tests/test_examples.py b/tests/test_examples.py index da0c9045..ff69ad73 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -150,6 +150,20 @@ def test_dispatcher_example_boundary_bisection_brackets_a_label_change(): assert at_kn3 < flux < at_kn0p1 +def test_dispatcher_example_reaches_the_two_extreme_labels(): + """The example's boil-off and overflow cases return those labels. + + The overflow case admits the post-gate residual, since with the default + settings the same state is a bound XUV wind and the example would + announce a label it does not produce. + """ + example = _load_example() + with contextlib.redirect_stdout(io.StringIO()): + rows = example.extreme_labels() + assert [row['regime'] for row in rows] == ['boiloff', 'roche_overflow'] + assert all(math.isfinite(row['mdot']) and row['mdot'] > 0.0 for row in rows) + + def test_dispatcher_example_rejects_a_malformed_state(): """A malformed state raises, and returns nothing. From 3bc9684ff8772a48b308c97675a601d5663f1f07 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:59:40 +0200 Subject: [PATCH 096/113] Say what the RR separator is instead of its history The troubleshooting entry on the recombination-limited label now states why a base Jeans parameter threshold cannot separate the two readings instead of narrating a retired split, and a cited title carries the hyphen ADS prints rather than an en-dash. --- docs/Explanations/energy_limited.md | 2 +- docs/How-to/troubleshooting.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md index ff956c9a..feda914d 100644 --- a/docs/Explanations/energy_limited.md +++ b/docs/Explanations/energy_limited.md @@ -69,4 +69,4 @@ Bulk removal is the second assumption. When the escaping particle flux drops bel [^cherubim2024]: Cherubim, C., Wordsworth, R., Hu, R., & Shkolnik, E. (2024). Strong Fractionation of Deuterium and Helium in Sub-Neptune Atmospheres along the Radius Valley. *The Astrophysical Journal, 967*(2), 139. https://doi.org/10.3847/1538-4357/ad3e77 -[^yoshida]: Yoshida, T., Terada, N., Ikoma, M., & Kuramoto, K. (2022). Less Effective Hydrodynamic Escape of H$_2$–H$_2$O Atmospheres on Terrestrial Planets Orbiting Pre-main-sequence M Dwarfs. *The Astrophysical Journal, 934*(2), 137. https://doi.org/10.3847/1538-4357/ac7be7 +[^yoshida]: Yoshida, T., Terada, N., Ikoma, M., & Kuramoto, K. (2022). Less Effective Hydrodynamic Escape of H$_2$-H$_2$O Atmospheres on Terrestrial Planets Orbiting Pre-main-sequence M Dwarfs. *The Astrophysical Journal, 934*(2), 137. https://doi.org/10.3847/1538-4357/ac7be7 diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 6cbdc324..5fcb4d97 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -54,7 +54,7 @@ Physically, a state in that corner is not an XUV wind launched at an ionization **What to do.** Read `diagnostics['hydrodynamic']['rr_chain']['barometric_factor']`, which is $e^{3/2 - \lambda_\mathrm{b}}$, the fraction of the base density that survives to the sonic point. Near 1 the sonic-point density is the base density and the rate is set by the recombination-limited base ionization, which is the mechanism the label names. Several decades below 1 the rate is small mostly because the isothermal wind cannot carry material that far, and attributing the smallness to recombination misplaces it. -Do not expect `selection_mechanism` to answer this. It reports which candidate won, `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and nothing about why. An earlier version split RR wins on the base Jeans parameter; that split was retired because the number behind it had no source and it placed the canonical recombination-limited case of the literature, near $\lambda_\mathrm{b} = 5.5$, on the suppression side. +Do not expect `selection_mechanism` to answer this. It reports which candidate won, `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and nothing about why. A threshold on the base Jeans parameter cannot make that separation either: the canonical recombination-limited case of the literature sits near $\lambda_\mathrm{b} = 5.5$, where a fixed cut would have to be chosen with no published basis. The flux scaling will not separate them either: the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain, so a fitted exponent sits near 1/2 whichever case holds, departing from it only where the thermostat is still moving the wind temperature quickly with flux. Use the factor, and do not describe a strongly suppressed point as recombination limited in text or in a figure legend. From 79bcca185ce67e61da99f1071d652ab2c37983bc Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:50:30 +0200 Subject: [PATCH 097/113] Cap inline comments in the physics data modules Inline comments in the diffusion, atomic-data, nozzle, and Knudsen modules now state only the reason a line is the way it is, in three lines or fewer, and the module headers and docstrings across the supporting modules keep their equation and citation provenance without the narrative. The b_pair docstring now lists the lookup order the code follows, a measured table row before the molecular-background table. No code changes. --- src/zephyrus/atomic_data.py | 96 +++++------------ src/zephyrus/composition.py | 28 ++--- src/zephyrus/diagnostics.py | 39 +++---- src/zephyrus/diffusion.py | 132 ++++++++--------------- src/zephyrus/fractionation.py | 56 ++++------ src/zephyrus/knudsen.py | 113 ++++++-------------- src/zephyrus/nozzle.py | 195 +++++++++++----------------------- src/zephyrus/thermostat.py | 70 +++++------- 8 files changed, 240 insertions(+), 489 deletions(-) diff --git a/src/zephyrus/atomic_data.py b/src/zephyrus/atomic_data.py index c9f28ed0..b6fd92df 100644 --- a/src/zephyrus/atomic_data.py +++ b/src/zephyrus/atomic_data.py @@ -14,19 +14,13 @@ # hc in J cm: converts a wavenumber in cm^-1 to an energy in J. HC_CM = h_planck * C_LIGHT * 100.0 -# --------------------------------------------------------------------------- # Three-level systems for atomic line cooling: levels 1 to 3 of each species # from Nakayama, Ikoma & Terada (2022, ApJ 937, 72), Appendix C Tables 2 to # 5. levels: (term, statistical weight g, excitation energy [cm^-1]); # transitions keyed (lower, upper) with 1-based indices: # (Einstein A [s^-1], effective collision strength at 1e4 K). -# Two transcription notes against the printed tables: the O+ row prints the -# neutral-O configuration and term labels next to statistical weights 4, 10, -# and 6, which belong to the O+ ground system, so the level set is entered -# as 4S-2D-2P with the printed weights; and the printed N 2->9 collision -# strength is malformed in the original, but level 9 lies outside the -# three-level subset carried here. -# --------------------------------------------------------------------------- +# The printed O+ row carries neutral-O term labels beside the O+ weights 4, +# 10, and 6, so its level set is entered as 4S-2D-2P with those weights. THREE_LEVEL = { 'H': { 'levels': [('1s2S', 2, 0.0), ('2s2S', 2, 82258.96), ('2p2P', 6, 82259.17)], @@ -82,20 +76,12 @@ }, } -# --------------------------------------------------------------------------- # Radiative recombination: the Badnell (2006, ApJS 167, 334) fit, # alpha_RR = A / [ sqrt(T/T0) (1 + sqrt(T/T0))^(1-B') (1 + sqrt(T/T1))^(1+B') ], # B' = B + C exp(-T2/T), -# implemented from the original Eqs. (1)-(2). The nitrogen coefficients below -# are read off Badnell's own table, the row Z = 7, N = 6. Chatterjee & -# Pierrehumbert (2026, ApJ 998, 236) quote the same row in their Eq. 35, but -# their printed equation garbles the Badnell form (it renders the product as -# a sum, repeats one exponent on both factors, and inverts the exponential to -# exp(-T/T2)) and their T2 reads 6.379e4 against the 6.739e4 of the table, so -# the original is the source for both the form and the numbers. The printed -# variant disagrees by more than a factor 2 at 1e4 K (asserted in the -# companion tests so the discrepancy stays visible). -# --------------------------------------------------------------------------- +# from the original Eqs. (1)-(2), with the nitrogen row Z = 7, N = 6 of +# Badnell's table. Chatterjee & Pierrehumbert (2026, ApJ 998, 236) Eq. 35 +# misprints both the form and T2 (6.379e4 for 6.739e4); neither is used. # (T0, T1, T2 [K], A [cm^3/s], B, C) for nitrogen. BADNELL_N = (9.467e-2, 2.954e6, 6.739e4, 6.387e-10, 0.7308, 0.2440) @@ -109,11 +95,9 @@ def badnell_alpha_rr(T: float, coeffs: tuple = BADNELL_N) -> float: return A / (s0 * (1.0 + s0) ** (1.0 - bp) * (1.0 + s1) ** (1.0 + bp)) -# Case B recombination coefficients at 1e4 K, cm^3 s^-1: hydrogen from -# Murray-Clay et al. (2009, ApJ 693, 23, their Eq. 7); the heavies as case A -# totals minus the ground-state partial from the AMDPP radiative -# recombination archive, as compiled for the radiation-recombination module -# of Malina Ovesen. +# Case B at 1e4 K, cm^3 s^-1: H from Murray-Clay et al. (2009, ApJ 693, 23) +# Eq. (7); heavies as AMDPP case A totals minus the ground-state partial, +# as compiled for Malina Ovesen's radiation-recombination module. CASE_B_1E4K = { 'H': 2.7e-13, 'He': 4.37e-13 - 1.56e-13, @@ -140,26 +124,9 @@ def alpha_case_b(element: str, T: float) -> float: return a0 * (T / 1.0e4) ** -0.9 -# --------------------------------------------------------------------------- -# CO2 15 micron band cooling: Johnstone et al. (2018, A&A 617, A107), -# Eqs. (34)-(38) with their Table 1 collider coefficients, cgs. The -# deexcitation rates k_d = A T^B are measured only over roughly 150 to -# 500 K, and the band's real applicability ceiling is CO2 dissociation, so -# it acts as a base-region coolant; both limitations travel with any use. -# -# One documented departure from the printed source. Their detailed-balance -# relation reads k_e = 2 k_d exp(-667/T_n), citing Castle et al. (2006), and -# 667 is the bending-mode wavenumber in cm^-1, not a temperature: h c times -# 667 cm^-1 is 1.325e-13 erg, which is the same 15 micron quantum they print -# two equations earlier, and in temperature units that quantum is 959.7 K, -# not 667 K. The printed formula has dropped the second radiation constant, -# 1.4388 K cm. The implementation uses the quantum, so the exponential is -# exp(-h nu / k_B T) with h nu / k_B = 959.7 K. It matters most where the -# band matters most: the excitation rate falls by a factor 7 at 150 K and -# 2.7 at 300 K against the printed form, and by only 3.5 percent at the wind -# temperatures the thermostat selects, where the band is a few percent of -# the cooling budget. -# --------------------------------------------------------------------------- +# CO2 15 micron band: Johnstone et al. (2018, A&A 617, A107) Eqs. (34)-(38), +# Table 1 colliders, cgs. Their exp(-667/T_n) takes the 667 cm^-1 wavenumber +# for a temperature; detailed balance here uses h nu / k_B = 959.7 K. HNU_15UM = 1.325e-13 # erg, the 15 micron quantum T_15UM = 959.7 # K, that quantum over the Boltzmann constant A10_CO2 = 0.46 # s^-1, Einstein coefficient of the bending mode @@ -185,27 +152,18 @@ def co2_band_cooling(n_co2: float, colliders: dict, T: float, col_co2: float = 0 Excitation rates follow from detailed balance, ``k_e = 2 k_d exp(-h nu / k_B T)``. - The abundances are molecular, and deliberately: this is a base-region - coolant. The band exists while CO2 does, and the deexcitation fits it - rests on were measured over roughly 150 to 500 K, so it is evaluated on - the molecular density of the level rather than on a dissociated or - ionized fraction, unlike the atomic-line and fine-structure channels - beside it. Above dissociation the band should be absent rather than - small, which this function does not enforce and the caller must not read - into it; at the wind temperatures the thermostat selects the band is a - few percent of the cooling budget, and at the 1000 to 3000 K base it is - most of it. + The abundances are molecular because this is a base-region coolant, on + deexcitation fits measured over roughly 150 to 500 K. Above CO2 + dissociation the band should be absent rather than small, which this + function does not enforce. """ sn = SIGMA_CO2_15UM * col_co2 if sn > 2.0: eps = 0.7202 * sn**-0.613 elif sn > 0.0: - # The thin-column branch of the fit rises through 0.5 below a column - # parameter of 3.4e-4 and diverges as the column vanishes, which is - # the fit leaving its range rather than physics: half the photons - # escaping is the non-LTE ceiling for this two-level band, and the - # tabulation the fit reproduces approaches it. Capping there also - # makes the zero-column case continuous with its neighbours. + # The fit rises through 0.5 below sn = 3.4e-4 and diverges; half the + # photons escaping is the non-LTE ceiling of this two-level band, + # and capping there keeps the zero-column case continuous. eps = min(0.4732 * sn**-0.0069, 0.5) else: eps = 0.5 @@ -236,14 +194,9 @@ def o_finestructure_cooling(n_o: float, T: float) -> float: return q63 + q147 -# --------------------------------------------------------------------------- -# Monochromatic photoionization front constants. Hydrogen front: -# Murray-Clay et al. (2009), sigma_nu0 = 6e-18 (h nu0 / 13.6 eV)^-3 cm^2 at -# a representative photon energy of 20 eV. Nitrogen-like front for -# hydrogen-poor winds: mean photon energy 33.6 eV and cross section -# 1e-17 cm^2 (Chatterjee & Pierrehumbert 2026), with the N I ionization -# potential from NIST. -# --------------------------------------------------------------------------- +# Monochromatic front constants: hydrogen after Murray-Clay et al. (2009), +# sigma_nu0 = 6e-18 (h nu0 / 13.6 eV)^-3 cm^2 at 20 eV; the nitrogen-like +# front of Chatterjee & Pierrehumbert (2026), N I potential from NIST. EV_ERG = 1.602176634e-12 HNU0_H_EV = 20.0 E_ION_H_EV = 13.6 @@ -252,8 +205,7 @@ def o_finestructure_cooling(n_o: float, T: float) -> float: E_ION_N_EV = 14.53 SIGMA_NU_N = 1.0e-17 # cm^2 -# Black (1981) Lyman-alpha cooling constants as printed by Murray-Clay et -# al. (2009, their Eq. 6): Lambda = 7.5e-19 n_e n_H exp(-118348 K / T) -# erg cm^3 s^-1. A cross-check constant, not a separate channel: the H -# three-level system above carries Lyman-alpha itself. +# Black (1981) Lyman-alpha cooling as printed by Murray-Clay et al. (2009) +# Eq. (6), 7.5e-19 n_e n_H exp(-118348 K / T) in cgs: a cross-check +# constant only, as the H three-level system above carries Lyman-alpha. LYA_BLACK = (7.5e-19, 118348.0) diff --git a/src/zephyrus/composition.py b/src/zephyrus/composition.py index 8dd27732..ce830bc2 100644 --- a/src/zephyrus/composition.py +++ b/src/zephyrus/composition.py @@ -10,15 +10,11 @@ from zephyrus.constants import amu -# Element masses in atomic mass units. Reactive elements carry the standard -# atomic weights (IUPAC/CIAAW). Neon and argon carry the escape-relevant -# isotope masses (20Ne and 36Ar) rather than the terrestrial elemental -# averages: a primordial or solar-composition inventory is dominated by those -# isotopes, and the binary diffusion coefficients printed by Zahnle & Kasting -# (1986, Icarus 68, 462; 2023, GeCoA 361, 228) are for them. Terrestrial Ar is -# 40Ar-dominated (radiogenic), an 11 percent mass difference. Kr and Xe carry -# the standard atomic weights, which sit within 0.1 and 1.1 percent of the -# 84Kr and 130Xe isotopes those compilations tabulate. +# Element masses in atomic mass units: the standard atomic weights +# (IUPAC/CIAAW), except neon and argon, which carry the 20Ne and 36Ar masses +# of a primordial or solar-composition inventory, the isotopes the binary +# diffusion coefficients of Zahnle & Kasting (1986, Icarus 68, 462; 2023, +# GeCoA 361, 228) are printed for. ELEMENT_AMU = { 'H': 1.008, 'He': 4.0026, @@ -43,15 +39,11 @@ } # Van der Waals radii in Angstrom, from Bondi (1964, J. Phys. Chem. 68, 441), -# Tables I and XIV as printed, except Fe: Bondi prints no transition metals, -# so the iron radius is Alvarez (2013, Dalton Trans. 42, 8617), with published -# values spanning roughly 2.0 to 2.44 Angstrom across compilations. The Mg -# value is a flagged outlier of Bondi's own table (derived from the critical -# volume and marked tentative there); Batsanov (2001) gives 2.10 to 2.27 and -# Alvarez (2013) 2.51, so quantities scaled from the Mg radius carry a 36 to -# 55 percent softness beyond their provenance class. Used as the last-resort -# geometric fallback of the collision cross-section fallback order and by the -# kinetic-diameter scaling rule of the binary-diffusion library. +# Tables I and XIV as printed, except Fe, from Alvarez (2013, Dalton Trans. +# 42, 8617). Mg and Fe are the soft entries: Bondi marks the Mg value +# tentative, and published Fe radii span roughly 2.0 to 2.44 Angstrom. Used +# by the geometric cross-section fallback and the kinetic-diameter scaling +# of the binary-diffusion library. BONDI_VDW_RADIUS_A = { 'H': 1.20, 'He': 1.40, diff --git a/src/zephyrus/diagnostics.py b/src/zephyrus/diagnostics.py index 2c95dd62..86d347ac 100644 --- a/src/zephyrus/diagnostics.py +++ b/src/zephyrus/diagnostics.py @@ -15,13 +15,10 @@ from zephyrus.knudsen import mean_free_path, sigma_mixture from zephyrus.planets_parameters import Mjup, Rjup -# Everything in this module is reporting: the quantities let a reader -# translate a regime verdict into the criteria other escape taxonomies use, -# and quantify how close each call sat to its boundaries. Nothing here is -# read back by the dispatch control flow, and the container has no off -# switch: the regime boundaries carry genuine physical uncertainty, and -# printing the translation quantities beside every verdict is the -# mitigation. +# Everything in this module is reporting: quantities that translate a +# regime verdict into other taxonomies' criteria and show how close each +# call sat to its boundaries. Nothing here is read back by the dispatch +# control flow, and the container has no off switch. # Murray-Clay et al. (2009) fit their numerical models with flux exponents # 0.6 (radiation-recombination limited) and 0.9 (energy limited); the @@ -39,18 +36,11 @@ # Threshold gravitational potentials, log10(-phi) in cgs (erg/g), with # phi = -G M_p / R_p, the convention both sources use. The Caldiroli et al. -# (2022) band marks where the evaporation efficiency collapses. The second -# screen separates wind-forming from hydrostatic thermospheres and is -# Salz et al. (2016, A&A 585, L2), whose photoionization hydrodynamics -# simulations find the energy-limited concept valid below 13.11, because -# the radiative input is efficiently spent driving the wind, and stable -# thermospheres above about 13.6, because the whole input is re-emitted in -# hydrogen Lyman alpha (above roughly 1.1 R_p) and free-free emission -# (below it). Between the two the wind weakens as the heating efficiency -# falls. Their grid is hydrogen-dominated thermospheres of hot gas planets, -# from super-Earth-sized to massive hot Jupiters, so the screen is out of -# its own scope on a heavy secondary atmosphere and is reported, never -# applied. +# (2022) band marks where the evaporation efficiency collapses. Salz et al. +# (2016, A&A 585, L2) find energy-limited escape valid below 13.11 and +# hydrodynamically stable thermospheres above about 13.6; their grid is +# hydrogen-dominated, so on a heavy secondary atmosphere the screen is out +# of its own scope and is reported, never applied. CALDIROLI_THRESHOLD_LOG_PHI = (12.9, 13.2) SALZ_SCREEN_LOG_PHI = (13.11, 13.6) @@ -195,13 +185,10 @@ def self_consistency_screen(reservoirs: dict | None, mdot: float, age: float | N def rate_floor_screen(mdot: float) -> dict: """Numerical-content screen: the rate against one proton per Julian year. - A strongly bound heavy atmosphere returns rates many decades below - anything with physical content, and a regime label attached to such a - rate is decided by the ordering of two meaningless numbers. One proton - crossing the surface per Julian year is the smallest rate worth - reading. Reporting only: the module never applies the floor, because - what counts as negligible belongs to the caller, and clearing the floor - does not make a rate matter (for that, use + A regime label attached to a rate below the floor is decided by the + ordering of two numerically empty numbers. Reporting only: the module + never applies the floor, because what counts as negligible belongs to + the caller, and clearing it does not make a rate matter (for that, use :func:`self_consistency_screen`). """ return {'floor_kg_s': RATE_FLOOR_KG_S, 'above_floor': mdot > RATE_FLOOR_KG_S} diff --git a/src/zephyrus/diffusion.py b/src/zephyrus/diffusion.py index 6ebbaf2f..e3485522 100644 --- a/src/zephyrus/diffusion.py +++ b/src/zephyrus/diffusion.py @@ -33,12 +33,9 @@ } ALL_MASS = dict(ELEMENT_AMU, **MOLECULE_AMU) -# --------------------------------------------------------------------------- -# Kinetic diameters, pm. -# --------------------------------------------------------------------------- -# Printed by Zahnle & Kasting (2023, GeCoA 361, 228) in the last row of their -# Table 2; the standard published kinetic diameters for the molecules, with -# the atoms H and O assigned the value of the neighboring noble gas. +# Kinetic diameters in pm, printed by Zahnle & Kasting (2023, GeCoA 361, +# 228) in the last row of their Table 2; the atoms H and O take the value +# of the neighboring noble gas. D_ZK23 = { 'H2': 289.0, 'He': 260.0, @@ -53,17 +50,13 @@ 'D': 265.0, 'O': 275.0, } -# Kr and Xe from the same standard compilation. Consistency check: the van -# der Waals scaling rule below independently gives 365 and 391 pm against -# these 360 and 396, agreeing to 1.4 percent. +# Kr and Xe: the standard published kinetic diameters. D_STANDARD_EXTRA = {'Kr': 360.0, 'Xe': 396.0} -# Elements with no printed kinetic diameter anywhere (C, N, S, and the rock -# formers) get one by scaling the printed atomic-O entry with the ratio of -# Bondi (1964) van der Waals radii. Taking the atomic diameter to be the van -# der Waals size has published precedent in exactly this application (Ito & -# Ikoma 2021, MNRAS 502, 750, their Eq. 36). The rule is checkable: applied -# to He, Ne, and Ar it reproduces the printed diameters to 3 percent. +# Elements with no printed kinetic diameter (C, N, S, and the rock formers) +# scale the atomic-O entry by the ratio of Bondi (1964) van der Waals +# radii, taking the atomic diameter as the van der Waals size as Ito & +# Ikoma (2021, MNRAS 502, 750) do in their Eq. (36). _VDW_SCALED = ('C', 'N', 'S', 'Na', 'Mg', 'Si', 'Fe') @@ -89,23 +82,14 @@ def substitutable() -> tuple[str, ...]: return tuple(sorted((s for s in ALL_MASS if s in diam), key=lambda s: ALL_MASS[s])) -# Rock-forming species carry two standing warnings that no coefficient -# improves away: every pair involving Na, Mg, Si, or Fe is a scaling on an -# estimated diameter (no measured coefficient exists in any compilation for -# these pairs), and at the temperatures where rock vapor exists Na and Mg -# ionize readily while these are neutral-gas coefficients. The Fe radius -# spans about 20 percent across published compilations and the Mg radius is -# a flagged outlier of Bondi's own table, so those two fallbacks are soft beyond -# their provenance class (see the notes in composition.BONDI_VDW_RADIUS_A). +# Every pair with Na, Mg, Si, or Fe is a scaling on an estimated diameter +# with no measured coefficient anywhere, and Na and Mg ionize where rock +# vapor exists; the fractionation closure flags results that use them. ROCK_FORMERS = ('Na', 'Mg', 'Si', 'Fe') -# --------------------------------------------------------------------------- -# Source 1: Zahnle & Kasting (2023, GeCoA 361, 228) Table 2. -# (i, j): (b at 1000 K in cm^-1 s^-1, class, source column as printed). -# Classes: 'M' traces to Marrero & Mason (1972) measurements; 'E' is the -# authors' own scaling estimate from the named analog pairs. All rows carry -# the fitted exponent 0.75. -# --------------------------------------------------------------------------- +# Zahnle & Kasting (2023, GeCoA 361, 228) Table 2, (i, j): (b at 1000 K in +# cm^-1 s^-1, class, source column as printed). 'M' traces to Marrero & +# Mason (1972) measurements; 'E' is the authors' scaling estimate. ZK23_EXPONENT = 0.75 ZK23_TABLE2 = { ('H', 'H'): (1.3e20, 'E', 'H-H2, H2-D2, H2-Ne'), @@ -127,10 +111,8 @@ def substitutable() -> tuple[str, ...]: ('O', 'Ne'): (3.0e19, 'E', 'O-He, O-Ar, H2-Ne'), ('O', 'Ar'): (1.8e19, 'M', 'Marrero and Mason (1972)'), ('O', 'N2'): (2.0e19, 'E', 'CH4-N2, air-H2O, O-O2'), - # Printed as 4.3e20; entered as 4.3e19. The printed value sits a full - # decade above the H2-D2 anchor its own source column names, while - # 4.3e19 is consistent with it and with the neighboring D rows, so the - # printed exponent is treated as a typographical error. + # Printed as 4.3e20, a decade above the H2-D2 anchor its own source + # column names and the neighboring D rows; entered as 4.3e19. ('CO2', 'D'): (4.3e19, 'E', 'b11, H2-D2 [printed 4.3e20, misprint]'), ('CO2', 'He'): (3.56e19, 'M', 'Marrero and Mason (1972)'), ('CO2', 'Ne'): (1.62e19, 'M', 'Marrero and Mason (1972)'), @@ -138,17 +120,9 @@ def substitutable() -> tuple[str, ...]: ('CO2', 'N2'): (1.04e19, 'M', 'Marrero and Mason (1972)'), } -# --------------------------------------------------------------------------- -# Source 2: Sasaki & Nakazawa (1988, EPSL 89, 323) Table 1, which tabulates -# f_ij = P D_ij for the noble gases against H2 and He at 100, 1000, and -# 10000 K, based on Marrero & Mason (1972). Their Eq. (6) is D_ij = f_ij/P = -# f_ij/(n kB T), so b = n D = f/(kB T), and reading f in SI units -# (Pa m^2 s^-1) gives b [cm^-1 s^-1] = f/(kB T)/100. That unit reading is -# verified, not assumed: it reproduces five in-H2 entries of Zahnle & Kasting -# (1986) Table I (He, Ne, Ar, Kr, Xe) to between 0.02 and 3 percent, two -# independent compilations both citing Marrero & Mason; no other unit choice -# comes within two orders of magnitude (see the companion tests). -# --------------------------------------------------------------------------- +# Sasaki & Nakazawa (1988, EPSL 89, 323) Table 1, after Marrero & Mason +# (1972): f_ij = P D_ij against H2 and He, so by their Eq. (6) b = f/(kB T), +# with f read in Pa m^2 s^-1, the unit reading the companion tests verify. SN88_TABLE1 = { ('He', 'H2'): {100: 2.4, 1000: 1.3e2, 10000: 7.6e3}, ('Ne', 'H2'): {100: 1.7, 1000: 9.4e1, 10000: 5.1e3}, @@ -180,11 +154,9 @@ def sn88_fit(species: str, partner: str, t_lo: float = 1000, t_hi: float = 10000 return b_lo / t_lo**s, s -# --------------------------------------------------------------------------- -# Cross-check set: Zahnle & Kasting (1986, Icarus 68, 462) Table I, b = A T^s -# in cm^-1 s^-1. Not a source of library rows; six pairs appear both here and -# in the 2023 compilation, and their agreement bounds the transcriptions. -# --------------------------------------------------------------------------- +# Zahnle & Kasting (1986, Icarus 68, 462) Table I, b = A T^s in cm^-1 s^-1: +# a cross-check set, not a source of library rows; the six pairs it shares +# with the 2023 compilation bound the transcriptions. ZK86_TABLE1 = { ('He', 'H2'): (5.23e17, 0.75), ('He', 'H'): (1.04e18, 0.732), @@ -221,13 +193,9 @@ def b_zk86(species: str, partner: str, T: float) -> float: return a * T**s -# --------------------------------------------------------------------------- -# Minor species in molecular backgrounds: fits b = A T^s in cm^-1 s^-1 -# carried as tabulated by the diffusion-limited escape branch (compiled by -# Viesturs Strelcs); individual rows trace to the standard compilations of -# measured binary diffusion coefficients (Marrero & Mason 1972; Zahnle & -# Kasting 1986). Keys are unordered pairs. -# --------------------------------------------------------------------------- +# Minor species in molecular backgrounds, b = A T^s in cm^-1 s^-1, compiled +# by Viesturs Strelcs for the diffusion-limited branch from Marrero & Mason +# (1972) and Zahnle & Kasting (1986). Keys are unordered pairs. MOLECULAR_BACKGROUND = { ('H', 'O2'): (4.75e17, 0.711), ('H', 'O'): (5.7e17, 0.708), @@ -254,18 +222,11 @@ def b_zk86(species: str, partner: str, T: float) -> float: ('He', 'N2'): (2.94e17, 0.718), } -# --------------------------------------------------------------------------- # The scaling rule and the library assembly. -# --------------------------------------------------------------------------- - -# One fractional 1-sigma width per provenance class. 'measured': the 2023 and -# 1986 compilations agree to 0.2 to 4 percent on their shared measured rows; -# 10 percent is deliberately wider and is not a published figure. -# 'estimated': Zahnle & Kasting (1986) demonstrate a 30 percent perturbation -# for their estimated class and state most of their coefficients are -# estimates. 'scaled': the same operation the 2023 authors perform, whose -# in-sample error is of that size. 'scaled*': as 'scaled' plus an estimated -# kinetic diameter on at least one species. + +# Fractional 1-sigma width per provenance class. 'measured' is a margin set +# wider than the 0.2 to 4 percent the two compilations agree to, not a +# published figure; 30 percent is the ZK86 estimated-class perturbation. SIGMA_CLASS = {'measured': 0.10, 'estimated': 0.30, 'scaled': 0.30, 'scaled*': 0.30} CLASS_OF_ZK23 = {'M': 'measured', 'E': 'estimated'} @@ -446,10 +407,8 @@ def masses_g(species: list) -> np.ndarray: return np.array([ALL_MASS[s] for s in species]) * AMU_G -# --------------------------------------------------------------------------- -# The pair fallback order for arbitrary (possibly molecular) species, used by the -# hydrostatic branch, and Blanc's law for mixtures. -# --------------------------------------------------------------------------- +# The pair fallback order for arbitrary, possibly molecular, species (used +# by the hydrostatic branch), and Blanc's law for mixtures. _PAIR_CACHE: dict = {} @@ -457,11 +416,13 @@ def masses_g(species: list) -> np.ndarray: def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: """Binary diffusion parameter b = n D for one pair, in SI [m^-1 s^-1]. - The fallback order, most trusted source first: the atomic library above (printed - rows, then the Eq. 10 scaling); the molecular-background table; as a - last resort, the library value of the nearest-mass covered species, - with the substitution recorded in the provenance string. Trailing - state annotations in species names are stripped. + The fallback order, most trusted source first: a measured Zahnle & + Kasting (2023) Table 2 row; the molecular-background table; the rest + of the atomic library (estimated Table 2 rows, the Sasaki & Nakazawa + rows, then the Eq. 10 scaling); as a last resort, the library value of + the nearest-mass covered species, with the substitution recorded in + the provenance string. Trailing state annotations in species names are + stripped. Returns ``(b [m^-1 s^-1], provenance string)``. """ @@ -477,13 +438,9 @@ def b_pair(sp_i: str, sp_j: str, T: float) -> tuple[float, str]: prov = f'ZK23 T2 [{cls}]' _PAIR_CACHE[key] = (b1000, ZK23_EXPONENT, prov) return b1000 * (T / 1000.0) ** ZK23_EXPONENT * 100.0, prov - # Order by provenance class, not by convenience. A measured row of the - # published Table 2 comes first; then the molecular-background - # compilation, whose rows trace to the same measured primaries; then - # anything estimated, which is Table 2's own 'E' rows and the Eq. (10) - # scaling built on a hard-sphere diameter ratio. Reaching the scaling - # before the compilation preempted eleven measured rows and read between - # 1 and 26 percent low on them. + # Order by provenance class: a measured Table 2 row, then the background + # compilation (same measured primaries), then anything estimated, so the + # Eq. (10) scaling never preempts a measured row. hit = _zk23_lookup(key) if hit is not None and hit[1] == 'M': b1000, cls, _src = hit @@ -516,10 +473,9 @@ def _proxy(sp, exclude=()): pa, pb = _proxy(a), _proxy(b) if pa == pb: - # Two distinct species must not collapse onto one substitute, or the - # reduced mass of the pair stops resembling the target's. Take the - # next-nearest substitute instead. A genuine self-pair keeps any - # distinct partner, since it has no second mass to represent. + # Distinct species must not collapse onto one substitute, or the + # pair's reduced mass stops resembling the target's; a genuine + # self-pair takes any distinct partner, having no second mass. pb = _proxy(b, exclude=(pa,)) if a != b else ('O' if pa != 'O' else 'N') r = build_rows([pa, pb])[0] prov = f'proxy {a}->{pa}, {b}->{pb} [{r.provenance}]' diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index 8582e534..d1faf29d 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -15,41 +15,32 @@ from zephyrus.diffusion import ROCK_FORMERS, bmatrix, build_rows, masses_g # The closure generalizes the two-species fractionation of Hunten, Pepin & -# Walker (1987, Icarus 69, 532) to N species escaping simultaneously -# through mutual binary diffusion, the constant-composition closure of the -# subsonic multispecies wind system of Zahnle et al. (1990, Icarus 84, -# 502), with active-set dropout: at a given total mass flux the heavy -# species partition into an escaping (active) set and a retained set, and -# the retained species exert drag without escaping. The solved system, per -# active species j (w_j = Phi_j / X_j the species velocity scale): +# Walker (1987, Icarus 69, 532) to N species escaping through mutual binary +# diffusion, the constant-composition closure of the subsonic multispecies +# wind of Zahnle et al. (1990, Icarus 84, 502), with active-set dropout: +# retained species exert drag without escaping. Per active species j, with +# w_j = Phi_j / X_j: # # sum_{i active} X_i (w_i - w_j) / b_ij # - w_j sum_{k retained} X_k / b_jk = m_j g0 / kT - 1/Hbar, # -# plus the mass constraint sum_j m_j X_j Phi_j... i.e. -# sum_{j active} m_j X_j w_j = phi, where Hbar is the one density scale -# height every escaping gas shares, so 1/Hbar is the Lagrange multiplier -# of the mass constraint and is solved for alongside the drifts. The -# Karush-Kuhn-Tucker conditions select the active set: active species have -# strictly positive w, and retained species satisfy the retention -# inequality (the drift the escaping gas would impose on them does not -# exceed their gravitational settling). +# with the mass constraint sum_{j active} m_j X_j w_j = phi, whose Lagrange +# multiplier is 1/Hbar, Hbar the density scale height every escaping gas +# shares. The Karush-Kuhn-Tucker conditions select the active set: active +# species have w > 0, and retained species satisfy the retention inequality +# (the drift imposed on them does not exceed their gravitational settling). # -# Exact reductions verified in the companion test suite: the two-species -# limit of Hunten et al. (1987) in the form of Cherubim et al. -# (2024, ApJ 967, 139, Eqs. 7-9); the three-species deuterium system of Gu -# & Chen (2023, Eqs. 4, 8, 9, 12); the trace-minor relations of Odert et -# al. (2018, Icarus 307, 327, Eq. 5) and Zahnle et al. (1990, Eqs. 35, 36, -# 42); the non-trace three-species relations of Zahnle & Kasting (2023, -# GeCoA 361, 228, Eqs. 19-20); the prescribed-flux partition of -# Chassefière (1996, Icarus 124, 537, Eqs. 1, 6, 7); the universal-b -# closed form; and the Hunten et al. (1987) Earth, Mars, and Venus -# numerical anchors. +# Reductions the companion tests verify: Hunten et al. (1987) two-species, +# in the form of Cherubim et al. (2024, ApJ 967, 139, Eqs. 7-9); Gu & Chen +# (2023, Eqs. 4, 8, 9, 12); Odert et al. (2018, Icarus 307, 327, Eq. 5) and +# Zahnle et al. (1990, Eqs. 35, 36, 42); Zahnle & Kasting (2023, GeCoA 361, +# 228, Eqs. 19-20); Chassefière (1996, Icarus 124, 537, Eqs. 1, 6, 7); the +# universal-b closed form; and the Hunten et al. (1987) Earth, Mars, and +# Venus anchors. # -# Solver units are cgs (the convention of the source literature and the -# diffusion library): phi in g cm^-2 s^-1, m in g, g0 in cm s^-2, b in -# cm^-1 s^-1, fluxes in cm^-2 s^-1. The public per-species interface -# converts from and to SI at the boundary. +# Solver units are cgs: phi in g cm^-2 s^-1, m in g, g0 in cm s^-2, b in +# cm^-1 s^-1, fluxes in cm^-2 s^-1. The per-species interface converts at +# the SI boundary. def _validate_inputs(phi, X, m, T, g0, b): @@ -74,10 +65,9 @@ def solve_fixed_active(phi, X, m, T, g0, b, active): Unknowns: ``w_j`` for j in ``active`` and the inverse ``1/Hbar`` of the shared density scale height. Returns ``(w_full, inv_h_bar)`` with - ``w = 0`` for retained species. The single-active case is solved analytically; the general - case with two-sided diagonal equilibration, which controls the spread - of roughly 25 decades the matrix entries can span between light-species - drag terms and heavy-species mass terms. + ``w = 0`` for retained species. The single-active case is solved + analytically, the general case with two-sided diagonal equilibration, + which controls the roughly 25 decades the matrix entries can span. """ kT = kb_cgs * T act = sorted(active) diff --git a/src/zephyrus/knudsen.py b/src/zephyrus/knudsen.py index 720d793e..dd7805f2 100644 --- a/src/zephyrus/knudsen.py +++ b/src/zephyrus/knudsen.py @@ -13,38 +13,21 @@ SQRT2 = math.sqrt(2.0) -# Diagnostic band on the switch threshold: the transition Knudsen number is -# heating-geometry physics, not a free parameter. Direct simulation Monte -# Carlo runs place it near 0.1 for a sharp heating layer and near 1 for -# distributed heating (Johnson et al. 2013, ApJL 768, L4); the upper edge -# extends the band to 3. Printed alongside every switch verdict, never -# configurable. +# Diagnostic band on the switch threshold, which is heating-geometry +# physics: near 0.1 for a sharp heating layer and near 1 for distributed +# heating (Johnson et al. 2013, ApJL 768, L4), extended to 3. Printed +# alongside every switch verdict, never configurable. KN_BAND = (0.1, 3.0) -# --------------------------------------------------------------------------- -# Rung 1: Laricchiuta et al. (2009, Eur. Phys. J. D 54, 607) phenomenological -# collision integrals. Their Eq. (2) is a double-sigmoid fit to the reduced -# collision integral in x = ln(kT/eps0), Eq. (3) gives the fit coefficients -# a_i as polynomials in the pair parameter beta (coefficients below from -# their electronic-appendix Table 3, neutral-neutral case, m = 6), and -# Eq. (4) sets the dimensional scale sigma^2 = (x0 r_e)^2 with -# x0 = xi1 beta^xi2 (their Table 4). The pair parameters (beta, eps0 in meV, -# r_e in Angstrom) are their Table 5. The momentum-transfer cross section is -# sigma_diff = pi sigma^2 Omega^(1,1)*, with the factor pi converting the -# reduced integral to a cross section. The implementation reproduces the -# measured room-temperature viscosities of N2, O2, CO, and CO2 to within -# 7 percent (see the companion tests). -# -# Only part of this table is reachable through the mixture rule below, which -# is a mole-fraction average of like-pair cross sections (Chatterjee & -# Pierrehumbert Eq. 25) and therefore never asks for a cross pair. Of the -# thirteen tabulated pairs, the six cross pairs are unreachable by -# construction, and the four molecular like pairs are unreachable from a -# dispatch, which feeds the switch atomized element fractions: (N, N), -# (O, O), and (C, C) are the live rows. The rest are kept because they are -# transcribed from the source and a pair-resolved mixture rule would want -# them, not because anything reads them today. -# --------------------------------------------------------------------------- +# Laricchiuta et al. (2009, Eur. Phys. J. D 54, 607) phenomenological +# collision integrals: their Eq. (2) double-sigmoid fit in x = ln(kT/eps0), +# Eq. (3) coefficients a_i polynomial in the pair parameter beta (their +# electronic-appendix Table 3, neutral-neutral case, m = 6), and Eq. (4) +# scale sigma^2 = (x0 r_e)^2 with x0 = xi1 beta^xi2 (their Table 4); pair +# parameters (beta, eps0 in meV, r_e in Angstrom) from their Table 5. The +# momentum-transfer cross section is sigma_diff = pi sigma^2 Omega^(1,1)*. +# The like-pair mixture rule below reads only (N, N), (O, O), and (C, C) +# from a dispatch; the other rows serve direct callers. # Table 3 (neutral-neutral, m = 6): rows are (c0, c1, c2) of # a_i(beta) = c0 + c1 beta + c2 beta^2, for i = 1..7. @@ -88,17 +71,11 @@ ('N2', 'CO2'): (7.90, 14.772, 3.986), } -# --------------------------------------------------------------------------- -# Rung 2: hydrogen, which Laricchiuta et al. do not tabulate. Zahnle et al. -# (1990, Icarus 84, 502) Eq. (30) inverts the binary diffusion parameter -# into a collision cross section, sigma_c = (3 sqrt(pi) / (16 b11)) -# sqrt(2 k T / mu11) in cgs, with mu11 = m/2 the like-pair reduced mass. -# The H2-H2 self-diffusion parameter b11 = 4.96e17 T^0.75 cm^-1 s^-1 is -# recovered from the in-H2 column of Zahnle & Kasting (1986, Icarus 68, 462) -# Table I, and the H-H value scales it by 1.91, the mean of that table's -# printed in-H over in-H2 column ratios. The route gives sigma(H-H) = -# 6.4e-20 m^2 at 1e4 K with a T^-0.25 dependence by construction. -# --------------------------------------------------------------------------- +# Hydrogen, which Laricchiuta et al. do not tabulate: Zahnle et al. (1990, +# Icarus 84, 502) Eq. (30) inverts the diffusion parameter b11 into a cross +# section. The H2-H2 b11 is recovered from the in-H2 column of Zahnle & +# Kasting (1986, Icarus 68, 462) Table I, and H-H scales it by 1.91, the +# mean of that table's in-H over in-H2 column ratios. _B11_H2H2 = 4.96e17 # cm^-1 s^-1 prefactor of b11 = 4.96e17 T^0.75 _H_COLUMN_SCALE = 1.91 # ZK86 Table I in-H2 -> in-H column scaling _M_H2_G = 2.016 * 1.66053907e-24 # g @@ -164,13 +141,9 @@ def sigma_zk90_hydrogen(species: str, T: float) -> float: return sigma_cm2 * 1e-4 -# Radius assumed for an element with no tabulated van der Waals value. It is -# not a measurement of anything: Bondi (1964) prints no alkali, alkaline -# earth, or transition metals, so aluminium, phosphorus, chlorine, -# potassium, calcium, and titanium reach the geometric fallback with nothing -# behind them. Species that fall back on it carry their own provenance -# class, because a cross section built on this number must not be read as -# one built on a published radius. +# Assumed, not measured, radius for elements absent from the van der Waals +# table (Al, P, Cl, K, Ca, Ti); species on it get their own provenance +# class so the cross section is never read as built on a published radius. FALLBACK_VDW_RADIUS_A = 1.5 @@ -181,10 +154,9 @@ def sigma_geometric(species: str) -> tuple[float, bool]: without a tabulated radius, the largest constituent-element radius sets the scale. A hard sphere has no temperature dependence, so against the shrinking collision integrals this fallback is roughly right at room - temperature but overshoots by a factor of a few at 1e4 K (2.6 for - atomic N), which biases the Knudsen number low and the switch toward - hydrodynamic verdicts. The provenance class records which species sit - on this fallback so the bias stays visible. + temperature but overshoots by a factor of a few at 1e4 K, which biases + the Knudsen number low and the switch toward hydrodynamic verdicts. The + provenance class records which species sit on this fallback. Returns ``(sigma [m^2], tabulated)``, where ``tabulated`` is False when the radius came from ``FALLBACK_VDW_RADIUS_A`` rather than the published @@ -243,34 +215,9 @@ def sigma_mixture(vmr: dict[str, float], T: float) -> tuple[float, dict]: return sig, prov -# --------------------------------------------------------------------------- -# The sonic-point Knudsen switch. Chatterjee & Pierrehumbert (2026, -# ApJ 998, 236) build the sonic-point Knudsen number from the Maxwell -# mean free path 1/(sqrt(2) sigma n) against the analytic sonic-point -# density scale height of their Eq. (17), -# H_sc = (1 + gamma) r_sc / (4 + sqrt(2) sqrt(5 - 3 gamma)), -# giving their Eq. (18) -# Kn_sc = (4 + sqrt(2) sqrt(5 - 3 gamma)) -# / (sqrt(2) (1 + gamma) sigma_C n_sc r_sc). -# A flow with Kn_sc at or below the threshold is collisional at its sonic -# point and sustains a hydrodynamic wind; above it, the gas decouples before -# reaching sonic conditions and escape is hydrostatic (Jeans-like). The -# threshold's physical band is KN_BAND above. -# -# This is the neutral onset, and deliberately so: the cross sections above -# are neutral-neutral collision integrals, while the wind the switch is -# applied to can be substantially ionized (the recombination chain reports -# its base ionization fraction, which reaches 0.86 on a heavy composition). -# Chatterjee & Pierrehumbert make the same choice and state its cost: -# collisionality rises with ionization, because ion-atom charge exchange and -# atom-electron collisions carry larger cross sections, so working with the -# neutral onset is "reasonable when advection-dominated and weakly ionized" -# and, for characterizing rapid mass loss, "highly conservative". The -# direction is one-sided. Including the ion channels would shorten the mean -# free path, lower Kn_sc, and move points toward hydrodynamic verdicts, so -# every hydrostatic call this switch makes on an ionized wind is a call the -# fuller physics could overturn, and no hydrodynamic call is. -# --------------------------------------------------------------------------- +# The sonic-point Knudsen switch of Chatterjee & Pierrehumbert (2026, ApJ +# 998, 236): the Maxwell mean free path against the analytic sonic-point +# scale height, their Eqs. (17) and (18), on neutral cross sections. def mean_free_path(sigma: float, n: float) -> float: @@ -293,6 +240,12 @@ def kn_sonic( composition, ``T_sc`` the temperature the cross sections are evaluated at [K], and ``gamma`` the polytropic index (1 for an isothermal wind). Returns ``(Kn_sc, sigma_C [m^2], provenance dict)``. + + At or below the threshold the sonic point is collisional and the wind + hydrodynamic; above it escape is hydrostatic. The cross sections are + neutral-neutral, the source's own onset, and ion channels would lower + ``Kn_sc``, so a hydrostatic verdict on an ionized wind is the side + fuller physics could overturn. """ sigma, prov = sigma_mixture(vmr, T_sc) kn = (4.0 + SQRT2 * math.sqrt(5.0 - 3.0 * gamma)) / ( diff --git a/src/zephyrus/nozzle.py b/src/zephyrus/nozzle.py index be37559e..1fd5930c 100644 --- a/src/zephyrus/nozzle.py +++ b/src/zephyrus/nozzle.py @@ -10,73 +10,43 @@ from zephyrus.constants import G, kb -# Provenance of the branch, all closed form, from one primary: +# Provenance of the branch, all closed form, from Jackson et al. (2017, +# ApJ 835, 145): # -# - Rate: Jackson et al. (2017, ApJ 835, 145) Eq. (3), isothermal mass -# transfer through the inner Lagrange point from a donor with an -# extended atmosphere, in the lineage of Ritter (1988, A&A 202, 93) -# rebuilt to hold at arbitrary mass ratio, +# - Rate: their Eq. (3), isothermal transfer through the inner Lagrange +# point in the lineage of Ritter (1988, A&A 202, 93), # Mdot = e^(-1/2) rho_ph exp(-(Phi_L1 - Phi_ph)/v_th^2) v_th # * 2 pi v_th^2 / (Omega^2 sqrt(A (A - 1))), # with v_th = sqrt(kB T / mu) the isothermal sound speed and -# Omega^2 = G (M_d + M_a) / a^3 the orbital frequency. The three factors -# are the density at L1 (a Bernoulli integral from the photosphere, their -# Eqs. 11 to 13, source of the e^(-1/2)), the transonic speed there, and -# the elliptical nozzle area around L1 (their Eqs. 8 and 9). +# Omega^2 = G (M_d + M_a) / a^3. The factors are the density at L1 +# (their Eqs. 11 to 13, source of the e^(-1/2)), the transonic speed +# there, and the elliptical nozzle area around L1 (their Eqs. 8 and 9). # - Nozzle curvature: A(q) from their Eq. (10) fit, # A = 4 + b1 / (b2 + q^(1/3) + q^(-1/3)), b1 = 2 * 3^(2/3), -# b2 = b1/4 - 2, symmetric under q to 1/q, accurate to 0.3% for all -# mass ratios (their Figure 2), which is the specific advance over the -# Ritter (1988) fits that hold only for donor-accretor ratios of roughly -# 0.05 to 25 and fail at planetary values. +# b2 = b1/4 - 2, accurate to 0.3% for all mass ratios (their Figure 2). # - Lobe radius: the Eggleton (1983, ApJ 268, 368) fit as printed in their -# Section 2.1, r_R = a 0.49 q^(2/3) / (0.6 q^(2/3) + ln(1 + q^(1/3))), -# accurate to 1% for all q. -# - Potentials: their Eq. (14) volume-averaged Roche potential, evaluated -# at the lobe radius for Phi_L1 and at the photospheric radius for -# Phi_ph. The expansion converges inside the lobe and not outside; at -# and beyond lobe contact the exponent is clamped at zero, which is the -# paper's own lobe-filling case (their Figure 5 solid curves), and the -# clamped value is a boundary value rather than a trusted rate. -# - L1 distance: the small-mass-ratio expansion of the L1 root, checked -# against the exact stationary point of the corotating axial potential -# (see ``l1_distance``). The Hill radius is its leading order and sits -# 0.5% outside it at planetary mass ratios, 5% at q = 1e-2. -# - Applicability: the overflow description holds where the isothermal -# sonic radius R_sonic = G M_d / (2 v_th^2) lies at or beyond the L1 -# distance, so that no spherical transonic wind fits inside the lobe and -# the L1 nozzle is the flow's constriction. Where the sonic radius lies -# inside the L1 distance the gas chokes at its own sonic surface first -# and the wind branches of this package are the right description. -# Without this criterion the nozzle area, which grows as the cube of the -# separation, hands a loosely bound envelope an unbounded rate at -# separations where the planet is nowhere near its lobe. The primary -# draws the comparison qualitatively, in their Section 4 and Figure 9, -# to ask which of the two pictures a planet belongs in; making it a gate -# is this module's sharpening of it and not a rule they state. -# - Orbit average: the returned rate is the time average over the orbit, -# Kepler-weighted through the eccentric anomaly, and the detail dict -# also carries it duty-cycled over the applicable arc, which is what a -# dispatcher competes. A secular caller integrates over many orbital -# periods and needs the mass carried per unit time. Each phase is -# evaluated with the circular formula at its own separation; the primary -# has no eccentric treatment, so the quasi-static evaluation and the -# duty cycle are both ours. At e = 0 the average is the instantaneous -# rate exactly. -# - Stated limitations carried from the primary: the flow is isothermal -# (their Section 3 names the neglected heating and cooling balance and -# calls the approximation an important limitation), the orbit -# circular and the rotation synchronous (an eccentric caller is averaged -# over its orbit as above, our convention rather than theirs, and the -# rotation is synchronous at no single phase of such an orbit), and the -# rate can overestimate the transfer where the escaping gas keeps its -# orbital angular momentum and disk-stellar torque balance regulates the -# flow instead (their Eq. 24 and Figure 6); the torque-balance rate -# needs the stellar tidal dissipation and is not computed here. +# Section 2.1, r_R = a 0.49 q^(2/3) / (0.6 q^(2/3) + ln(1 + q^(1/3))). +# - Potentials: their Eq. (14) volume-averaged Roche potential, at the lobe +# radius for Phi_L1 and at the launch radius for Phi_ph. The expansion +# converges only inside the lobe, so at and beyond contact the exponent +# is clamped at zero, their lobe-filling case (Figure 5 solid curves). +# - L1 distance: the small-mass-ratio expansion of the L1 root (see +# ``l1_distance``). +# - Applicability: the nozzle is the flow's constriction where the +# isothermal sonic radius G M_d / (2 v_th^2) reaches the L1 distance; +# short of it the gas chokes at its own sonic surface first and the wind +# branches apply. The comparison is their Section 4 and Figure 9; making +# it a gate is this module's, not a rule they state. +# - Orbit average: the rate is the Kepler-weighted time average over the +# orbit, each phase evaluated with the circular formula at its own +# separation; the primary has no eccentric treatment. +# - Limitations carried from the primary: isothermal flow (their Section +# 3), a circular synchronous orbit, and no disk-stellar torque balance +# (their Eq. 24 and Figure 6), whose regulation can make this rate an +# overestimate. # # The temperature is the model's dominant uncertainty by the authors' own -# statement; which temperature enters v_th is the caller's -# `nozzle_temperature` setting, resolved in the dispatcher. +# statement; the caller's `nozzle_temperature` setting chooses it. _B1 = 2.0 * 3.0 ** (2.0 / 3.0) _B2 = _B1 / 4.0 - 2.0 @@ -126,11 +96,9 @@ def l1_distance(q: float, separation: float) -> float: The small-mass-ratio expansion of the L1 root, ``x_L1/a = eps - eps^2/3 - eps^3/9`` with ``eps = (q/3)^(1/3)``, which is the Hill - radius at leading order and falls inside it beyond that. Checked - against the exact stationary point of the corotating axial potential: - the relative error is 8e-7 at ``q = 1e-5`` and 7e-4 at ``q = 1e-2``, - against 0.5% and 5.3% for the Hill radius itself. ``separation`` is - the orbital separation [m]. + radius at leading order and falls inside it beyond that, checked + against the exact stationary point of the corotating axial potential. + ``separation`` is the orbital separation [m]. """ if q <= 0.0 or not math.isfinite(q): raise ValueError(f'q must be a positive finite mass ratio, got {q!r}') @@ -177,10 +145,9 @@ def isothermal_column_density( sound speed. This is the column the Bernoulli argument behind the launch-level convention assumes: along it the product ``rho exp(Phi / v_th^2)`` is constant, so the nozzle rate does not - depend on which level is called the launch level. It is a device for - placing that level consistently with the sound speed evaluating the - barrier, not a claim about the structure below the anchor, which for a - wind anchor is far hotter than the atmosphere really is there. + depend on which level is called the launch level. It places that level + consistently with the sound speed evaluating the barrier and makes no + claim about the structure below the anchor. """ _positive('r', r) _positive('r_ref', r_ref) @@ -208,30 +175,17 @@ def _phase_state( phi_ph = volume_averaged_potential(r_ph, M_p, M_star, sep) delta_phi = phi_l1 - phi_ph exponent = -delta_phi / v_th**2 - # The saturation test is geometric rather than potential-ordered: - # outside the lobe the Eq. (14) expansion diverges downward, so a level - # beyond r_lobe reports a spuriously deep Phi_ph and a large positive - # barrier where the physical barrier is gone. At or beyond contact the - # exponential is clamped at 1 and the rate is the lobe-filling - # boundary value, a lower bound on the transfer, since the density at - # the lobe itself exceeds the launch level's. Testing the exponent as - # well would add nothing: the Eq. (14) potential rises monotonically - # from the center to the lobe at every mass ratio from 1e-7 to 1, so - # the barrier is strictly positive at every interior level and the - # exponent reaches zero only where the geometry already has. + # Saturation is tested on geometry, not on the barrier: outside the lobe + # the Eq. (14) expansion diverges downward and reports a spurious + # barrier. The clamped lobe-filling rate is a lower bound on transfer. saturated = r_ph >= r_lobe if saturated: exponent = 0.0 area = 2.0 * math.pi * v_th**2 / (omega2 * math.sqrt(a_curv * (a_curv - 1.0))) rate = rho_ph * math.exp(-0.5 + exponent) * v_th * area - # Heat the isothermal flow demands per unit mass, which is what the - # radiation field has to supply for the uncapped model to hold. For a - # steady flow dh + d(v^2/2) + dPhi = dq, and an isothermal ideal gas - # has dh = 0, so integrating from a launch level at rest to the - # transonic point at L1 gives the barrier the rate actually applied - # plus v_th^2/2. Built from the applied exponent, so it is the - # clamped barrier at saturation and never the divergent one; the - # acceleration term survives there and the barrier does not. + # Heat per unit mass an isothermal (dh = 0) steady flow needs from rest + # to sonic at L1: the applied barrier plus v_th^2/2. Built from the + # applied exponent, so saturation never reports the divergent barrier. heat = max(-exponent, 0.0) * v_th**2 + 0.5 * v_th**2 return dict( separation=sep, @@ -274,41 +228,32 @@ def nozzle_candidate( rho_ph, r_ph : float Density [kg m^-3] and radius [m] of the launch level. The profile radius stands in for the volume-equivalent photospheric radius - without the primary's Appendix distortion conversion, a - few-percent radius convention worth about 1.6x in rate per percent - near lobe contact and nothing for a donor well inside its lobe. - The Bernoulli structure makes rho_ph exp(Phi_ph / v_th^2) - level-invariant along an isothermal column, so the level choice - largely cancels there; on a non-isothermal column it does not, and - the temperature is the leading sensitivity either way. + without the primary's Appendix distortion conversion. Along an + isothermal column rho_ph exp(Phi_ph / v_th^2) is level-invariant, + so the level choice cancels there and not on a non-isothermal one. T, mu_kg : float Temperature [K] and mean particle mass [kg] evaluating the isothermal sound speed and the exponential barrier. n_phase : int - Midpoint nodes in eccentric anomaly for the orbit average. The - quadrature converges to machine precision well below the default: - measured relative change 4.3e-7 from 16 to 32 nodes and 3e-14 from - 32 to 64 at e = 0.5 on two states. At ``e = 0`` every node holds - the same value and the average is the instantaneous rate exactly. + Midpoint nodes in eccentric anomaly for the orbit average; the + quadrature is converged well below the default. At ``e = 0`` every + node holds the same value and the average is the instantaneous rate. Returns ------- (rate, detail) - The orbit-averaged Eq. (3) rate [kg/s], unguarded, so that the - closed form stays directly comparable with the primary's own - published rates, and a detail dict. The rate a caller should - compete is ``detail['rate_applicable_kg_s']``, the same average - duty-cycled over the arc where the overflow description applies. - In the detail dict, Phase-independent - entries are the sound speed, the sonic radius, the mass ratio, and - the curvature; the geometry entries (lobe radius, both potentials, - the applied exponent, the nozzle area, ``saturated``) are reported - at periapsis, which is the tightest geometry of the orbit; and the - orbit entries are the applicable and saturated orbit fractions, - the periapsis and apoapsis rates, and the averaged lift power, - which is reported both duty-cycled (pairing with the rate a caller - competes) and over the full orbit (pairing with the returned - unguarded rate). + The orbit-averaged Eq. (3) rate [kg/s], unguarded so that it stays + comparable with the primary's published rates, and a detail dict. + The rate a caller should compete is + ``detail['rate_applicable_kg_s']``, the same average duty-cycled + over the arc where the overflow description applies. The detail + dict holds the phase-independent sound speed, sonic radius, mass + ratio, and curvature; the geometry (lobe radius, both potentials, + the applied exponent, the nozzle area, ``saturated``) at periapsis; + the applicable and saturated orbit fractions; the periapsis and + apoapsis rates; and the lift power, duty-cycled + (``power_lift_W``) and over the full orbit + (``power_lift_full_orbit_W``). """ if n_phase < 1: raise ValueError(f'n_phase must be at least 1, got {n_phase!r}') @@ -332,15 +277,9 @@ def nozzle_candidate( # where this sonic radius reaches the L1 distance (see module notes). r_sonic = G * M_p / (2.0 * v_th**2) - # Orbit average. A secular caller integrates over many orbital periods, - # so what it needs is the mass carried per unit time rather than the - # instantaneous rate at one phase. The corotating Roche geometry is - # defined for a circular synchronous donor, so each phase is evaluated - # with the circular formula at that separation and the result averaged - # in time. That quasi-static reading is this module's construction and - # not the primary's, which has no eccentric treatment. Time weighting - # is Kepler's, dt proportional to (1 - e cos E) dE, and the separation - # at that anomaly carries the same factor. + # A secular caller needs mass per unit time, so each phase takes the + # circular formula at its separation a (1 - e cos E), time-weighted by + # Kepler's dt proportional to (1 - e cos E) dE. w_sum = rate_sum = power_sum = duty_rate_sum = duty_power_sum = 0.0 applicable_sum = saturated_sum = 0.0 for i in range(n_phase): @@ -350,15 +289,9 @@ def nozzle_candidate( w_sum += w rate_sum += w * st['rate'] power_sum += w * st['power'] - # The applicable arc surrounds periapsis, because the L1 distance - # grows with separation while the sonic radius does not. Off that - # arc the gas chokes at its own sonic surface first and the nozzle - # carries nothing, so the duty-cycled average is what a dispatcher - # should compete. What the duty cycle leaves out is the wind the - # planet drives on the rest of the orbit, which one dispatched - # rate cannot also carry. The returned rate is the unguarded - # Eq. (3) average, so the closed form stays comparable with the - # primary's own published rates; the gate is the caller's. + # Off the applicable arc, which surrounds periapsis because the L1 + # distance grows with separation, the gas chokes at its own sonic + # surface first and the nozzle carries nothing. if r_sonic >= st['R_L1']: duty_rate_sum += w * st['rate'] duty_power_sum += w * st['power'] diff --git a/src/zephyrus/thermostat.py b/src/zephyrus/thermostat.py index bc93e771..6f3978f5 100644 --- a/src/zephyrus/thermostat.py +++ b/src/zephyrus/thermostat.py @@ -28,38 +28,30 @@ from zephyrus.constants import kb_cgs # The thermostat sets the hydrodynamic wind temperature by a local balance -# of photoionization heating against radiative cooling, evaluated at the -# wind-base level (all rates cgs internally): +# of photoionization heating against radiative cooling at the wind-base +# level (all rates cgs internally): # # - Atomic lines: three-level statistical equilibrium for H, C, C+, N, N+, -# O, and O+ under electron impact with cool-to-space losses, the -# machinery of Chatterjee & Pierrehumbert (2026, ApJ 998, 236, -# their Eqs. 26-30) on the Nakayama et al. (2022) level data; the H -# system carries Lyman-alpha. +# O, and O+ under electron impact, cool-to-space, after Chatterjee & +# Pierrehumbert (2026, ApJ 998, 236, their Eqs. 26-30) on the Nakayama +# et al. (2022) level data; the H system carries Lyman-alpha. # - The CO2 15 micron band and the atomic O fine structure (Johnstone et -# al. 2018; see atomic_data for their stated validity limits). -# - Recombination cooling: the continuum part only, Q_RR = n_e n_+ -# alpha_RR(T) (3/2) kB T (Chatterjee & Pierrehumbert 2026, Section 5.2); -# the exact free-bound emission integral of Tucker & Gould (1966) is not -# implemented and this form is the stated stand-in. +# al. 2018; see atomic_data for their validity limits). +# - Recombination cooling, continuum part only, Q_RR = n_e n_+ alpha_RR(T) +# (3/2) kB T (Chatterjee & Pierrehumbert 2026, Section 5.2), standing in +# for the free-bound emission integral of Tucker & Gould (1966). # - Heating: monochromatic-front photoionization, Q = n_0 sigma -# (F_XUV / h nu) (h nu - E_ion), with the small thermal correction of -# order kB T_e against the excess energy dropped. The local ionization -# fraction comes from photoionization-recombination balance. +# (F_XUV / h nu) (h nu - E_ion), without the order kB T_e thermal +# correction; the ionization fraction comes from +# photoionization-recombination balance. # -# The blind spot of a local balance is the temperature structure through -# the sonic region, which no single-level evaluation captures; rates -# computed with this wind temperature inherit that limitation. - -# Upper edge of the thermostat bracket. This is a validity ceiling, not a -# statement that the balance has no root above it: raising the edge to 2e5 K -# does find one, at about 1.0e5 K on a nitrogen-oxygen base, stable against -# raising the edge further. That root is not physics. At 1e5 K the gas is -# fully ionized, the neutral three-level coolants the balance is built from -# are gone, and the line and ionization inventory the model does not carry -# would dominate. Reporting the root would be a more precise answer to a -# question the model cannot answer, so the balance stops here and says it -# stopped. The lower edge is the equilibrium temperature. +# A local balance misses the temperature structure through the sonic +# region, and rates computed with this wind temperature inherit that. + +# Upper edge of the thermostat bracket, a validity ceiling: the balance can +# have a root near 1e5 K above it, but there the gas is fully ionized and +# the neutral three-level coolants it is built from are gone. The lower +# edge is the equilibrium temperature. T_BRACKET_HIGH = 5.0e4 # K _ION_OF = {'C': 'C+', 'N': 'N+', 'O': 'O+'} @@ -246,20 +238,16 @@ def solve_wind_temperature( root when several exist. When no root lies inside the bracket the temperature clamps to the nearer edge with the ``clamped`` field set ('low' when cooling already wins at T_eq, 'high' when heating still - wins at the upper edge). A high clamp is the expected outcome at dense - wind bases, not only an exotic corner: electron densities well above the - forbidden-line critical densities quench the three-level coolants - collisionally, the balance loses its root inside the bracket, and the - wind runs hot; the ``clamped`` field is the contract by which callers - can see that happened. - - A high clamp does not mean the balance has no root at all. It usually - has one above the bracket, near 1e5 K, and that root is outside the - model rather than inside it: the coolants are neutral three-level - systems and the gas there is fully ionized. So a clamped temperature is - the edge of the bracket and not a solution, and any quantity built on it - (the sound speed, the sonic radius, the recombination-limited rate, the - sonic-point Knudsen number) inherits that. Returns ``(T_wind, detail)``. + wins at the upper edge). A high clamp is expected at dense wind bases, + where electron densities above the forbidden-line critical densities + quench the three-level coolants collisionally and the wind runs hot. + + A clamped temperature is the edge of the bracket and not a solution: + the balance usually has a root near 1e5 K, outside the model since its + coolants are neutral and the gas there is fully ionized, and every + quantity built on the clamped value (the sound speed, the sonic radius, + the recombination-limited rate, the sonic-point Knudsen number) + inherits that. Returns ``(T_wind, detail)``. Raises ------ From a9d662d47e4655bac8a708a249bab15415b9b686 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:47:30 +0200 Subject: [PATCH 098/113] Cap inline comments in the escape branches Inline comments in the dispatcher, boil-off, hydrodynamic, hydrostatic, and profile modules now state the reason for the code in at most three lines. The derivations, measured factors, and caveats they carried are on the regimes, limitations, results, and validation pages. The dispatcher, hydrodynamic, and hydrostatic headers and several docstrings are shorter too, and they keep the numbered evaluation order and every citation that anchors a formula. No code changes. --- src/zephyrus/boiloff.py | 18 +-- src/zephyrus/dispatcher.py | 231 +++++++++++------------------------ src/zephyrus/hydrodynamic.py | 94 +++++--------- src/zephyrus/hydrostatic.py | 77 ++++-------- src/zephyrus/profiles.py | 23 ++-- 5 files changed, 139 insertions(+), 304 deletions(-) diff --git a/src/zephyrus/boiloff.py b/src/zephyrus/boiloff.py index 17e1cfdb..03b98096 100644 --- a/src/zephyrus/boiloff.py +++ b/src/zephyrus/boiloff.py @@ -179,14 +179,9 @@ def bolometric_candidate( 4.0 * math.pi * R_B**2 * c_s * rho_launch * math.exp(2.0 - 2.0 * R_B / R_launch) ) - # Optical depth of the launch level to its own opacity, in the - # plane-parallel form tau = kappa P / g. The Parker rate is derived from - # a photosphere, so this reports whether the prescribed level and the - # supplied opacity describe the same surface: tau far from 1 means they - # do not, and the rate is being evaluated off the definition it came - # from. Reporting only. The level is prescribed rather than solved for - # because the activation threshold above is calibrated at a level of its - # own, so solving here would put the gate and the rate on two surfaces. + # Plane-parallel optical depth of the launch level, reported only: tau + # far from 1 means the prescribed level and the opacity do not describe + # the photosphere the Parker rate assumes. g_launch = G * M_p / R_launch**2 tau_launch = kappa_photo * launch['p'] / g_launch @@ -202,11 +197,8 @@ def bolometric_candidate( binding_cap = min(caps, key=caps.get) rate = caps[binding_cap] if binding_cap == 'luminosity': - # The interior luminosity is the binding term. Worth a flag rather - # than an inference from the branch being past its gate: the cap - # switches on at the gate, so a state that crosses the activation - # threshold drops discontinuously (a factor 6.7e3 on a two Earth-mass - # hydrogen envelope) while keeping the same label. + # Flagged because the cap switches on at the gate, so a state crossing + # the threshold drops discontinuously while keeping the same label. flags['luminosity_capped'] = True return rate, dict( T_wind=T_w, diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 2fb1ffbb..05bebbcf 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -24,49 +24,37 @@ from zephyrus.profiles import Profile, photospheric_level, wind_base_level # The dispatcher assembles the escape branches of this package into one -# total prescription: every physically posed input state returns exactly -# one regime label, one bulk mass-loss rate, per-species rates summing to -# it, flags, and a diagnostics container. Exceptions are reserved for +# total prescription: every physically posed input state returns one +# regime label, one bulk mass-loss rate, per-species rates summing to it, +# flags, and a diagnostics container. Exceptions are reserved for # malformed input. The fixed evaluation order: # -# 1. The bolometrically driven candidate is computed at every call. Below -# the restricted Jeans parameter threshold the atmosphere boils off and -# that candidate is the rate (Owen & Wu 2016). Past it the same -# machinery is reported as a luminosity-capped residual (Gupta & -# Schlichting 2019) and competes only when ``residual_mode`` admits it, -# off by default because its persistence is disputed (Tang et al. 2024). -# The test comes first because a boiling atmosphere has not yet built -# the base an XUV wind launches from (Owen & Schlichting 2024). -# 2. The hydrodynamic candidate: the wind base is located by the -# configured method, the thermostat sets the wind temperature by local -# heating-cooling balance, and the candidate is min(EL, RR) with the -# winner naming the sub-label. -# 3. The sonic-point Knudsen switch decides whether that wind is -# collisional enough to exist. It lives on the hydrodynamic branch -# only, never above the boil-off test. A confirmed hydrodynamic label -# applies the fractionation closure; otherwise the point re-routes to -# the hydrostatic branch. -# 4. The hydrostatic branch evaluates per-species Jeans escape with the +# 1. The bolometric candidate is computed at every call. Below the +# restricted Jeans parameter threshold the atmosphere boils off and +# that candidate is the rate (Owen & Wu 2016); past it the same +# machinery is a luminosity-capped residual (Gupta & Schlichting 2019), +# competing only when ``residual_mode`` admits it, off by default since +# its persistence is disputed (Tang et al. 2024). The test comes first +# because a boiling atmosphere has not yet built the base an XUV wind +# launches from (Owen & Schlichting 2024). +# 2. The hydrodynamic candidate: wind base by the configured method, wind +# temperature from the thermostat, rate min(EL, RR) with the winner +# naming the sub-label. +# 3. The sonic-point Knudsen switch, on the hydrodynamic branch only, +# confirms the wind or re-routes the point to the hydrostatic branch. +# 4. The hydrostatic branch: per-species Jeans escape with the # diffusion-limited supply on the extended upper structure. Its # escape-temperature gate re-routes thermally unstable exospheres back -# to the hydrodynamic rate; points where the neutral and plasma gate -# conventions disagree are flagged contested with both rates recorded. +# to the hydrodynamic rate and flags contested gate conventions. # 5. The final rate is the largest of the surviving branch rate, the -# bolometric residual where the setting admits it, and the tidally -# driven L1 nozzle rate (Jackson et al. 2017), labeled by the winner. -# A nozzle win labels ``roche_overflow`` with a real transfer rate, so -# that boundary is a rate crossing and the dispatched rate is -# continuous across it. -# 6. The Roche screen tests the winning branch's flow radius (sonic -# radius, max(R_XUV, R_s), or exobase radius) against the periapsis -# Hill radius. An overflowing point is renamed ``roche_overflow`` and -# keeps the rate its own branch computed, a bound-flow lower limit: -# the screen renames a state and never changes its rate. Near misses -# raise ``near_roche``, and ``diagnostics['roche']['rate_branch']`` -# says which of the two readings of the label applies. +# admitted bolometric residual, and the L1 nozzle rate (Jackson et al. +# 2017), labeled by the winner. +# 6. The Roche screen tests the winning branch's flow radius against the +# periapsis Hill radius and renames an overflowing state +# ``roche_overflow`` without changing its rate. # # Diagnostics are boxed: nothing in this module branches on anything the -# diagnostics container carries, and the container has no off switch. +# diagnostics container carries. REGIME_LABELS = ( 'boiloff', @@ -135,9 +123,8 @@ def validate(self) -> None: or self.cool_recombination ): raise ValueError('all cooling channels disabled; at least one must stay on') - # Numeric bounds. Outside them the closed forms leave their domains, - # and what a caller saw was a bare math domain error from inside the - # branch or, worse, a silently different regime label. + # Numeric bounds. Outside them the closed forms leave their domains + # and fail with a bare math error or a silently different label. for name, value in ( ('P_photo', self.P_photo), ('P_base_fixed', self.P_base_fixed), @@ -159,9 +146,6 @@ def validate(self) -> None: raise ValueError( f'efficiency is a fraction of the deposited power, got {self.efficiency!r}' ) - # The sonic-point scale height of Chatterjee & Pierrehumbert Eq. (17) - # carries sqrt(5 - 3 gamma), which leaves the reals above the monatomic - # 5/3. Below 1 the polytrope is no longer a wind solution. if ( self.hydrostatic_levels_min < 2 or self.hydrostatic_levels_max < self.hydrostatic_levels_min @@ -171,6 +155,9 @@ def validate(self) -> None: f'hydrostatic_levels_max, got {self.hydrostatic_levels_min!r} and ' f'{self.hydrostatic_levels_max!r}' ) + # The sonic-point scale height of Chatterjee & Pierrehumbert Eq. (17) + # carries sqrt(5 - 3 gamma), which leaves the reals above the monatomic + # 5/3. Below 1 the polytrope is no longer a wind solution. if not 1.0 <= self.gamma_wind <= 5.0 / 3.0: raise ValueError( 'gamma_wind must lie in [1, 5/3], the domain of the sonic-point ' @@ -257,15 +244,9 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # branches that measure one: the energy-limited rate and the # luminosity cap on the bolometric residual. xi_ktide = r_hill / inputs.R_p - # The tidal factor has a double root at xi = 1 and the rates divide by it, - # so it inflates them steeply as the lobe closes: 83-fold at xi = 1.1 and - # 6.7e5-fold at xi = 1.001. At and below the root the barrier is gone and - # the factor is undefined, so the rates are computed without it, which is - # the smaller of the two readings. Such a state is already relabeled by the - # Roche screen below; the flag says the reduction was dropped rather than - # applied, and the inflation the factor is contributing is reported beside - # the rate at every geometry so that a rate set by the divergence rather - # than by the physics is visible as such. + # The factor has a double root at xi = 1 and the rates divide by it. At + # and below the root the barrier is gone, so the rates are computed + # without it (the smaller reading) and the Roche screen relabels the state. if st.tidal and xi_ktide <= 1.0: k_factor = 1.0 flags['k_tide_undefined'] = True @@ -290,11 +271,9 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: k_tide=k_factor, residual_mode=st.residual_mode, ) - # Each candidate's warnings are held with that candidate and merged only - # if it wins, so the flag set always describes the dispatched rate and - # never a candidate that lost. Input hygiene (stale inputs, base clamps, - # the tidal factor, hysteresis) is a property of the state rather than of - # a candidate, so it merges as it is found. + # Candidate warnings are merged only if that candidate wins, so the flags + # describe the dispatched rate; input-hygiene flags describe the state + # and merge as they are found. bolo_flags = dict(bolo['flags']) diag['lambda_gate'] = lam_gate diag['bolometric'] = {k: v for k, v in bolo.items() if k != 'flags'} @@ -306,10 +285,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: cool_o_finestructure=st.cool_o_finestructure, cool_recombination=st.cool_recombination, ) - # The exobase temperature is resolved once and used by both the upper - # structure the hydrostatic branch stands on and, under the extend - # policy, the one the wind base is re-evaluated on. Resolving it twice - # built those two structures at two different temperatures. + # Resolved once so the hydrostatic upper structure and the extended wind + # base are built at the same exobase temperature. t_exo = _resolve_t_exo(inputs, channels) base, f = _resolve_wind_base(inputs, t_exo) flags.update(f) @@ -317,12 +294,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: t_wind, thermo = th.solve_wind_temperature( inputs.T_eq, base, elements, inputs.F_xuv, **channels ) - # Warnings about the hydrodynamic candidates are held aside and merged - # only if one of them wins the route. A warning about the wind - # temperature or the sonic radius describes a rate that a bolometric or - # hydrostatic verdict did not dispatch, and the flags dictionary is read - # as a warning set about the result. What the losing candidate did is - # still in diag['hydrodynamic']. + # Held aside and merged only if a hydrodynamic candidate wins; a losing + # candidate's record stays in diag['hydrodynamic']. hydro_flags: dict = {} if thermo.get('clamped'): hydro_flags['thermostat_clamped'] = thermo['clamped'] @@ -369,34 +342,15 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ) diag['thermostat'] = thermo - # The tidally driven L1 nozzle candidate (Jackson et al. 2017 Eq. 3), - # computed at every point: it joins the final comparison on both sides - # of the activation gate, and its power comparison is an always-on - # diagnostic. The temperature setting decides which state the flow is - # launched from: the photospheric level (the primary's own - # construction, a bolometrically maintained flow) or the wind base at - # the thermostat's wind state (the upper envelope their Figure 9 - # explores). Both settings launch from one level with one temperature - # and one mean mass, which is what the Bernoulli cancellation behind - # the launch-level convention requires; the wind setting rebuilds the - # launch density from the ideal gas law at the base pressure rather - # than carrying the photosphere's cold density into a hot sound speed. - # The radius is still the profile's, so the hot structure is not - # solved, only its thermodynamic state, and that is a stated limit. - # The flow is uncapped, faithful to the primary; the lift power - # reported beside the interior and intercepted stellar luminosities - # shows where that assumption is strained. + # The L1 nozzle candidate (Jackson et al. 2017 Eq. 3). Either setting + # launches from one level with one temperature and one mean mass, which + # the Bernoulli invariance of the rate along an isothermal column needs. if st.nozzle_temperature == 'wind': t_nozzle = t_wind mu_nozzle = rr['mu_wind'] * m_p - # The wind's own isothermal column, anchored at the wind base. The - # density there is the ideal-gas value at the base pressure for the - # wind's temperature and mean mass, because pressure is continuous - # across the temperature transition and density is not. The rate is - # invariant along this column, so the anchor is also the launch - # level; ``nozzle.isothermal_column_density`` is what makes that - # invariance true rather than assumed, and the column is a device - # for placing the level, not a claim about structure below the base. + # Ideal-gas density at the base pressure for the wind's state, since + # pressure is continuous across the temperature transition and + # density is not. r_nozzle = base['r'] rho_nozzle = base['p'] * mu_nozzle / (kb * t_nozzle) else: @@ -412,12 +366,9 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: T=t_nozzle, mu_kg=mu_nozzle, ) - # The dispatched candidate is the average duty-cycled over the arc - # where the overflow description applies; the unguarded average is - # kept beside it so the closed form stays comparable with the - # primary's published rates. The applicability edge is a criterion - # boundary like the activation gate, not a rate crossing, and the jump - # across it is a result to measure rather than hide. + # The competed rate is duty-cycled over the arc where overflow applies; + # the unguarded average is kept so the closed form stays comparable + # with the primary's published rates. nozzle_rate = noz['rate_applicable_kg_s'] nozzle_applicable = noz['applicable'] noz['rate_kg_s'] = nozzle_rate @@ -425,10 +376,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: noz['temperature_mode'] = st.nozzle_temperature noz['r_launch'] = r_nozzle noz['rho_launch'] = rho_nozzle - # The power comparison: what the isothermal flow demands against what - # the planet has. Built from the barrier the rate applied plus the - # acceleration to the sonic speed, so it stays finite and meaningful - # at saturation, where the barrier is gone and the acceleration is not. + # The uncapped flow's lift power is reported against what the planet + # has, to show where the isothermal assumption is strained. noz['L_int_W'] = 4.0 * math.pi * inputs.R_p**2 * inputs.F_int noz['L_bol_intercepted_W'] = math.pi * inputs.R_p**2 * inputs.F_bol diag['nozzle'] = dict(noz) @@ -504,9 +453,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: ) # Route. ``branch`` names the physics that produced the rate and decides - # the split; ``label`` is what the caller reads back and the Roche screen - # can overwrite it. The two are the same on every state whose flow stays - # inside the Hill sphere. + # the split; ``label`` is what the caller reads, and the Roche screen + # may overwrite it. per_species = None if bolo['active']: branch = 'boiloff' @@ -539,27 +487,16 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: per_species = None flow_radius = bolo['R_sonic'] winner_flags = dict(bolo_flags, bolometric_residual=True) - # The nozzle candidate competes last, on both sides of the activation - # gate, wherever the overflow description applies: where the - # photosphere approaches the lobe, the tidally driven transfer through - # L1 outruns every bound-flow estimate, and the label boundary it - # creates is a rate crossing, continuous by construction. A candidate - # below the one-proton-per-Julian-year floor does not compete: the - # label here turns entirely on which of two numbers is larger, and - # between two numerically empty numbers that decides nothing, so it - # would rename the deeply bound corner on no physical content. The - # floor otherwise stays reported and never applied, and a geometric - # verdict still ignores it. + # The nozzle competes last, on both sides of the gate. Below the rate + # floor it stands down, since a label decided by comparing two + # numerically empty rates would rename the bound corner on no content. if nozzle_applicable and nozzle_rate > rate and nozzle_rate > dg.RATE_FLOOR_KG_S: branch = 'roche_overflow' rate = nozzle_rate per_species = None - # ``flow_radius`` is deliberately left as the branch that lost the - # rate comparison computed it. The nozzle's own flow passes the - # lobe by construction, so substituting the lobe radius would pin - # xi_flow at the fixed lobe-to-Hill ratio and throw away the one - # geometric fact the screen still reports on this branch. The lobe - # radius travels in ``diagnostics['nozzle']['r_lobe']``. + # ``flow_radius`` keeps the losing branch's value: the lobe radius + # would pin xi_flow at the fixed lobe-to-Hill ratio. The lobe radius + # travels in ``diagnostics['nozzle']['r_lobe']``. winner_flags = {} if noz['saturated']: # The photospheric potential reached the L1 value, so the rate @@ -567,12 +504,9 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: # an interior point of it. winner_flags['nozzle_saturated'] = True if inputs.e > 0.0: - # The rate is a time average over the orbit, evaluated with - # the circular formula at each separation. Under saturation it - # scales as the cube of the separation, so periapsis is a - # lower bound there and an upper bound while the barrier is - # unclamped; the average is what a secular caller needs either - # way. + # A time average of the circular formula over the orbit, since + # periapsis bounds the rate from opposite sides with and without + # saturation; the average is what a secular caller needs. winner_flags['nozzle_orbit_averaged'] = True if noz['applicable_orbit_fraction'] < 1.0: # The overflow description holds only on an arc around @@ -583,24 +517,13 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: flags.update(winner_flags) label = branch - # Step 6: the Roche screen on the active flow radius. The screen renames - # the state and never touches the rate. Its boundary is a rate - # comparison, since the branch whose flow radius gets tested is the one - # that won the final comparison, so reporting the winning branch's own - # rate keeps the dispatched rate continuous across the boundary; - # substituting another branch's formula would not. When the rename fires - # on a bound branch, the rate beside the label is the bound-flow - # estimate, and a lower limit on the tidal transfer only where the - # nozzle candidate sat outside its criterion; where it was applicable - # and lost, the candidate rate is below the dispatched one. When the - # nozzle won above, the rate is the tidally driven transfer itself - # and the subflag reads ``nozzle``. + # Step 6: the Roche screen renames the state and never touches the rate, + # which keeps the dispatched rate continuous across the label boundary, + # since the tested flow radius belongs to the branch that won the rate. xi_flow = r_hill / flow_radius if flow_radius > 0 else math.inf - # The outer extent of the atmosphere itself, modeled plus extended, - # which is what separates the two overflow geometries. It is reported - # and used for that separation, and deliberately not used to trigger - # the screen: what the screen asks is whether the escaping flow stays - # bound, and widening its trigger would move the label boundary itself. + # The atmosphere's outer extent separates the two overflow geometries + # but does not trigger the screen, which asks whether the escaping flow + # stays bound; triggering on it would move the label boundary. r_atm = max(float(inputs.profile.r[-1]), hsd['r_exo']) diag['roche'] = dict( R_hill_periapsis=r_hill, @@ -612,23 +535,15 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: r_atmosphere=r_atm, rate_branch=branch, ) - # The label has two routes in and one precedence rule, written once: - # the geometric trigger on the winning branch's flow radius, and the - # crossing of two rates when the nozzle candidate won above. The subflag is - # geometric under either route, so an atmosphere that spills reads - # ``dynamical`` whichever candidate carries the rate, and the - # mechanism question is answered by ``rate_branch`` instead. - # ``near_roche`` warns about the tidal inflation of a bound rate, so - # it is not raised once the state is already labeled. + # Two routes into the label, geometric or a nozzle win, with a geometric + # subflag under either; ``near_roche`` warns about a bound rate's tidal + # inflation, so it is not raised on a labeled state. if xi_flow <= 1.0 or xi_ktide <= 1.0 or branch == 'roche_overflow': label = 'roche_overflow' flags['roche_overflow'] = True - # Dynamical overflow when the atmosphere itself reaches the Roche - # lobe, which is the critical surface and sits about 0.70 of the - # way out to the Hill radius; no transonic solution when only the - # flow radius passes the Hill radius, which is the narrow band - # Owen & Jackson (2012) describe; ``neither`` when the label came - # from that crossing alone. + # Owen & Jackson (2012): dynamical when the atmosphere reaches the + # Roche lobe (the critical surface), no transonic solution when only + # the flow radius passes the Hill radius, else the rate crossing alone. if xi_ktide <= 1.0 or r_atm >= noz['r_lobe']: flags['roche_subflag'] = 'dynamical' elif xi_flow <= 1.0: diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index b50ef6ef..3703c72c 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -32,29 +32,16 @@ # equilibrium at the wind base sets the base ion density proportional to # sqrt(F_XUV), and an isothermal Parker wind carries it to the sonic # point with the barometric factor exp(3/2 - lambda_b), the exact -# isothermal value. min(EL, RR) selects RR two physically distinct ways: -# genuine recombination saturation, and barometric suppression at large -# lambda_b, where the label "recombination limited" would be a category -# error. The flux scaling does not separate them, since the base ion -# density follows sqrt(F_XUV) at every lambda_b in this chain; the -# barometric factor does, and it is reported beside the rate. The -# selection diagnostic names which candidate won, not why. Where the two -# candidates cross in flux is sensitive to the wind temperature: the RR -# chain carries it through the sound speed, the barometric exponent, and -# the recombination coefficient, so a thermostat-driven wind temperature -# can move the EL/RR crossover by an order of magnitude against the -# canonical fixed 1e4 K evaluation. +# isothermal value, reported beside the rate because it separates +# recombination saturation from barometric suppression. # - Efficiency: fixed, or the Caldiroli et al. (2022, A&A 663, A122, # Appendix A.1) fit, defined against their R_p^3 geometry and therefore # converted by (R_p/R_XUV)^2 before use in the Erkaev form. # -# EL_escape is the released standalone entry point for the energy-limited -# rate (scaling selection, tidal branch, and input validation in one -# self-contained function); el_rate is the bare kernel the regime dispatch -# assembles with its own tidal factor. The two are kept as separate code -# paths on purpose, so the cross-implementation test between them guards -# the scaling and tidal plumbing. zephyrus.escape re-exports EL_escape for -# compatibility with the released import path. +# EL_escape is the released standalone entry point; el_rate is the bare +# kernel the dispatcher assembles with its own tidal factor. They stay +# separate code paths so a cross-implementation test guards the plumbing. +# zephyrus.escape re-exports EL_escape for the released import path. RHO_UNIT_CGS = 1e-3 # kg m^-3 -> g cm^-3 FLUX_UNIT_CGS = 1e3 # W m^-2 -> erg s^-1 cm^-2 @@ -71,12 +58,9 @@ def k_tide(xi: float) -> float: The factor is ``(xi - 1)^2 (2 xi + 1) / (2 xi^3)``, which has a double root at ``xi = 1`` and rises toward 1 as ``xi`` grows. The energy-limited rate divides by it, so the rate diverges as the atmosphere approaches its - Roche lobe: the factor is 1.5e-6 at xi = 1.001 and 1.2e-2 at xi = 1.1, - inflating the rate 6.7e5-fold and 83-fold. At and below the root the - polynomial turns back upward and returns values above 1, which would - reduce the rate rather than raise it, so the domain is enforced rather - than extrapolated: a caller at xi <= 1 has a planet filling its lobe and - needs the overflow machinery, not this factor. + Roche lobe. Below the root the polynomial returns values that would + reduce the rate, so ``xi <= 1`` raises ``ValueError``: such a planet + fills its lobe and needs the overflow treatment. """ if not xi > 1.0: raise ValueError( @@ -147,12 +131,9 @@ def EL_escape( ``tidal_contribution`` is True. epsilon : float Escape efficiency factor (dimensionless). Typical literature - range is $0.1 < \epsilon < 0.6$, but hydrodynamic simulations - find the effective efficiency falls far below that band for - strongly bound planets: above a threshold gravitational - potential, $\log_{10}(G M_p K_\mathrm{tide}/R_p) \approx 12.9$ - to $13.2$ in cgs units (erg g$^{-1}$), it drops to of order - $10^{-2}$ for compact hot Jupiters (Caldiroli et al. 2022). + range is $0.1 < \epsilon < 0.6$; for strongly bound planets + hydrodynamic simulations find much lower values (Caldiroli et + al. 2022). Rp : float Planetary radius [m]. Used as a linear factor when ``scaling=2``. @@ -160,10 +141,8 @@ def EL_escape( Planetary radius at which the atmosphere becomes optically thick to XUV radiation [m]. In PROTEUS this level is placed at a fixed pressure, by default 20 mbar following Baumeister et - al. (2023); that is an optical-photosphere-type level, distinct - from the roughly nanobar level where the XUV heating is - actually deposited and the wind is launched (Lopez 2017, - $P_\mathrm{base} = \mu m_\mathrm{H} g / \sigma_{\nu_0}$). + al. (2023), distinct from the roughly nanobar wind base of + Lopez (2017). Fxuv : float XUV flux received by the planet from the host star, in W m$^{-2}$. @@ -241,12 +220,9 @@ def EL_escape( # Tidal contribution if tidal_contribution: - # ksi is the ratio of the periapsis Hill radius to the radius the - # scaling selects. K_tide = (ksi-1)^2 (2 ksi + 1) / (2 ksi^3) is - # non-negative for all ksi > 0 with a double root at ksi = 1, so the - # energy-limited rate (which divides by K_tide) diverges as ksi -> 1 - # and is only valid for ksi > 1, where the atmosphere sits inside the - # Roche lobe. + # ksi = Rhill/R on the radius the scaling selects. K_tide has a double + # root at ksi = 1 and the rate divides by it, so only ksi > 1, inside + # the Roche lobe, is valid. Rhill = a * (1 - e) * (Mp / (3 * Ms)) ** (1 / 3) ksi = Rhill / R_tide if ksi <= 1: @@ -310,15 +286,10 @@ def wind_mean_masses(element_fractions: dict) -> tuple[float, float]: the particles, the mean mass per particle is half the mean atomic mass and the mean mass per ion is the mean atomic mass itself. - Two conventions to keep straight. The returned values are in atomic mass - units, and the call sites multiply by the proton mass where Lopez writes - the hydrogen atom mass; the three candidate units span 0.36 percent on - the sound speed, and the proton mass sits 0.04 percent from Lopez's own. - And Lopez's printed pairs are not both reachable: the rule makes the - per-ion mass exactly twice the per-particle mass, so the printed steam - pair (3, 6) is recovered while the printed H/He pair (0.62, 1.3) is - internally inconsistent by 4.6 percent, 1.3 halving to 0.65. The rule - follows the per-ion value and the tests pin that reading. + Call sites multiply by the proton mass where Lopez writes the hydrogen + atom mass. The rule recovers Lopez's printed steam pair (3, 6); the + printed H/He pair (0.62, 1.3) is internally inconsistent, and the rule + follows its per-ion value. """ mbar = sum(x * ELEMENT_AMU[el] for el, x in element_fractions.items()) return mbar / 2.0, mbar @@ -363,10 +334,7 @@ def rr_chain( lambda_b = G * M_p / (R_base * c_s**2) # The photon energy and the cross section belong to one front and must - # be taken from the same one. Taking the energy from the composition and - # the cross section from hydrogen put a nitrogen-like wind on a section - # 5.3 times too small, which raised its neutral base density by that - # factor and understated the reported base ionization fraction. + # be taken from the same one. x_h = element_fractions.get('H', 0.0) hydrogen_front = x_h >= 0.5 hnu0 = (HNU0_H_EV if hydrogen_front else HNU_I_N_EV) * ev2joule @@ -375,9 +343,8 @@ def rr_chain( # Composition-weighted case B coefficient, cm^3/s -> m^3/s. alpha_b = sum(x * alpha_case_b(el, T_wind) for el, x in element_fractions.items()) * 1e-6 - # Base ion density from photoionization-recombination balance with the - # neutral density at unit optical depth over a scale height substituted, - # so the photoionization cross section cancels: + # Photoionization-recombination balance with the unit-optical-depth + # neutral density substituted, so the cross section cancels: # n_+^2 = F G M / (h nu0 alpha_B c_s^2 R_base^2). n_plus_base = ( math.sqrt(F_xuv * G * M_p / (hnu0 * alpha_b * c_s**2 * R_base**2)) if F_xuv > 0 else 0.0 @@ -423,15 +390,10 @@ def selection_mechanism(rr: dict, el_won: bool) -> str: :func:`rr_chain`, where the returned value is a floored one rather than a transonic wind). - Why an RR win came out small is a separate question, and this string - does not answer it. The quantity that does is the barometric factor - ``exp(3/2 - lambda_b)`` returned beside the rate: near 1 the - sonic-point density is the base density and the recombination-limited - base ionization sets the rate, while several decades below 1 the rate - is small mostly because the isothermal wind cannot carry material - from the base to the sonic point, which has nothing to do with - recombination. The flux scaling cannot separate the two, because the - base ion density follows sqrt(F_XUV) at every ``lambda_b`` here. + Why an RR win came out small is answered by the barometric factor + ``exp(3/2 - lambda_b)`` returned beside the rate, not by this string: + near 1 the recombination-limited base ionization sets the rate, and + decades below 1 the wind cannot carry material to the sonic point. """ if el_won: return 'EL-selected' diff --git a/src/zephyrus/hydrostatic.py b/src/zephyrus/hydrostatic.py index 34499185..de59a3ef 100644 --- a/src/zephyrus/hydrostatic.py +++ b/src/zephyrus/hydrostatic.py @@ -24,12 +24,9 @@ # T(zeta) = T_exo - (T_exo - T_top) exp(-gamma zeta), in the form Yelle # (2024, Icarus 416, 116099, their Eq. 19) uses, anchored at the topmost # supplied profile level and integrated hydrostatically in -# zeta = ln(p_top/p). Composition and mean mass are frozen at the anchor -# on the extension. Evaluating the exobase quantities on this extended, -# inflated structure rather than on photospheric values is essential: -# the exobase Jeans parameter can differ from the photospheric one by an -# order of magnitude, and using the latter biases rates toward false -# retention by up to three decades (Johnson et al. 2013, ApJL 768, L4). +# zeta = ln(p_top/p), with composition and mean mass frozen at the +# anchor. The exobase quantities are read on this inflated structure, +# never on photospheric values (Johnson et al. 2013, ApJL 768, L4). # - Exobase: the first level where the Maxwell mean free path # 1/(sqrt(2) sigma n) reaches the local scale height (the convention of # Volkov et al. 2011), with the mixture cross section of the Knudsen @@ -39,10 +36,8 @@ # Eq. 20), multiplied by the flat kinetic enhancement C(lambda) measured # in direct simulation Monte Carlo runs: about 1.7 at lambda = 6 falling # to about 1.4 at lambda = 15 (Volkov et al. 2011, ApJL 729, L24). Their -# companion bulk-velocity correction is deliberately not applied on top: -# the two express the same departure from equilibrium and applying both -# double-counts. Beyond lambda = 15 the factor is held at 1.4, a flagged -# extrapolation. +# bulk-velocity correction is not applied on top, since it expresses the +# same departure from equilibrium. # - Diffusion-limited supply: Yelle (2024) Eqs. (9)-(11) discretized on the # extension: the modified mixing ratio X-tilde grows by the exponential # of the integrated (1 - m-tilde/m_bar) D/(D + K) factor, with the @@ -59,21 +54,16 @@ # value because the ambipolar field shares the ion's binding with the # electron (Chatterjee & Pierrehumbert 2026, ApJ 998, 236, their # Eq. 34); a hydrostatic exobase hotter than half the gating escape -# temperature is unstable (their Figure 10 criterion) and callers -# re-route such points to the hydrodynamic branch. +# temperature is unstable (their Figure 10 criterion). # -# Hydrostatic heavy-element rates are lower limits: the nonthermal -# channels (ion outflow, photochemical ejection, sputtering) that dominate -# heavy-species loss in this regime are not modeled; the -# ``hydrostatic_lower_limit`` flag travels with every result. +# Hydrostatic heavy-element rates are lower limits, since nonthermal +# channels are not modeled; ``hydrostatic_lower_limit`` travels with every +# result. ALPHA_THERMAL = -0.25 # thermal diffusion factor (Yelle 2024, after Banks & Kockarts) -# Rates below one proton mass per Julian year are numerical artifacts on any -# planetary reservoir; species whose supply-free Jeans rate already sits below -# that floor skip the diffusion integrals, since their harmonic-mean rate -# could only be smaller. The constant itself is defined once, in diagnostics, -# which is where it is reported from. +# Species whose supply-free Jeans rate is below the rate floor skip the +# diffusion integrals, since their harmonic-mean rate could only be smaller. def volkov_flat_factor(lam: float) -> float: @@ -82,16 +72,9 @@ def volkov_flat_factor(lam: float) -> float: Direct simulation Monte Carlo runs exceed the Jeans flux by a factor 1.7 near lambda = 6, falling to 1.4 by lambda = 15 (Volkov et al. 2011); linear between, held at the endpoint values outside, where the - caller flags the extrapolation on either side. - - The two sides are not equally safe. Above lambda = 15 the enhancement - is falling toward 1 and holding it at 1.4 overstates the flux by less - than that as the exosphere becomes more strongly bound. Below lambda = 6 - it is rising and the Jeans picture is degrading toward hydrodynamic - outflow, so holding 1.7 understates it, and this is the side the branch - actually visits: a trace light species on a heavy background reaches - lambda well below 1, which is a factor of several beyond where the - simulations were run. + caller flags the extrapolation on either side. Below lambda = 6 the + held value likely understates the flux, and trace light species on a + heavy background reach that side. """ if lam <= 6.0: return 1.7 @@ -130,21 +113,14 @@ def bates_extension( r0 = float(profile.r[-1]) t_top = float(profile.T[-1]) mu = float(profile.mmw[-1]) - # The extension is the inflated thermosphere the exobase quantities must - # be read from, so it cannot be colder at the top than the level it - # extends from: that builds a falling temperature profile whose exobase - # is more strongly bound than its anchor, which inverts the construction. - # A prescribed exobase temperature is a stand-in for physics the branch - # does not solve, and in a coupled run the profile top warms over secular - # time and can pass it, so the temperature floors at the anchor and the - # call is flagged rather than raising and stopping the run. + # An exobase colder than the anchor would bind the exobase more strongly + # than its anchor, inverting the construction. Floored and flagged, not + # raised, since a coupled run's profile top can warm past the prescription. floored = T_exo < t_top if floored: T_exo = t_top - # Every species present at the anchor is carried, however thin. A trace - # light species can dominate the exospheric loss while sitting many - # decades below the bulk, so a lower cut on the mixing ratio would - # delete the rate rather than a rounding error. + # Every species at the anchor is carried, however thin: a trace light + # species can dominate the exospheric loss. vmr = { sp: float(np.asarray(v)[-1]) for sp, v in profile.vmr.items() @@ -239,10 +215,9 @@ def hydrostatic_rates( the harmonic mean could only be smaller, and the cost of the integrals dominates the branch on many-species profiles. - ``n_levels`` sets the quadrature resolution of the supply integrals. - They are first-order accurate in the log-pressure step, so the error - halves as the count doubles; ``hydrostatic_rates_refined`` drives that - refinement to a target instead of trusting one grid. + ``n_levels`` sets the quadrature resolution of the supply integrals, + which are first-order accurate in the log-pressure step; + ``hydrostatic_rates_refined`` refines it to a target. Returns ``(per_element, detail)``; the detail dict carries the exobase state, both escape temperatures, the ``dominant`` species that supplies @@ -380,10 +355,10 @@ def hydrostatic_rates_refined( """Hydrostatic rates refined until the quadrature stops moving them. The supply integrals are first-order accurate in the log-pressure step, - so the change between a grid and its refinement estimates what is left - to converge, and a single fixed count says nothing about its own error. - The resolution doubles from ``n_levels_min`` until the relative change - in the bulk rate falls below ``rtol`` or ``n_levels_max`` is reached. + so the change between a grid and its refinement estimates the remaining + error. The resolution doubles from ``n_levels_min`` until the relative + change in the bulk rate falls below ``rtol`` or ``n_levels_max`` is + reached. The finest grid's rates are returned, never an extrapolation. The detail dict gains a ``convergence`` entry recording the levels used, diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index 06564aaf..3beb6c90 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -59,12 +59,9 @@ def validate(self) -> None: temperature is unconstrained beyond positivity. Every mixing-ratio array must share the level count, be finite, and be non-negative. - Finiteness is checked before the sign comparisons, because a - comparison against NaN is false and a NaN would otherwise pass every - positivity test and surface far downstream as an error naming some - unrelated quantity. Mixing ratios below zero by less than - ``VMR_NOISE_FLOOR`` are solver noise and pass; the consumers ignore - non-positive weights and renormalize over the rest. + Finiteness is checked before the sign comparisons, since a NaN passes + every comparison. Mixing ratios below zero by less than + ``VMR_NOISE_FLOOR`` are solver noise and pass. """ p, r, T, mmw = map(np.asarray, (self.p, self.r, self.T, self.mmw)) if not (len(p) == len(r) == len(T) == len(mmw)): @@ -143,9 +140,7 @@ def isothermal_profile( H = kb * T * r[i] ** 2 / (G * M_p * mu) r[i + 1] = r[i] - H * (lnp[i + 1] - lnp[i]) if G * M_p * mu / (kb * T * r[i + 1]) < 2.2: - # Stop at the last level that is still bound. Keeping the level - # that failed the test would put the profile's top exactly where - # the guard exists to exclude, and the top level is what the + # Stop at the last level still bound: the top level is what the # exobase anchor reads. last = i break @@ -358,10 +353,8 @@ def _boreas_base_pressure(profile: Profile, M_p: float, scalars: dict | None) -> r_xuv = float(result['RXUV']) * 1e-2 # cm -> m p_xuv, covered = pressure_at_radius(profile, r_xuv) if not covered: - # The solver placed its XUV radius outside the modeled column. - # Reporting the clamped endpoint would make the caller's clamp - # test compare a value against itself, so the pressure carries - # the extrapolation and the caller flags the distance. + # Outside the modeled column, return the extrapolated pressure so + # the caller's clamp test can see and flag the distance. p_xuv = _isothermal_pressure_beyond_top(profile, M_p, r_xuv) return p_xuv except Exception: @@ -374,9 +367,7 @@ def _isothermal_pressure_beyond_top(profile: Profile, M_p: float, r: float) -> f Integrating ``d ln p = -(G M mu / k T) d(1/r)`` at the top temperature and composition gives ``p(r) = p_top exp(-lambda_top (1 - r_top / r))``, which tends to ``p_top exp(-lambda_top)`` far out rather than falling - without bound. A constant scale height would instead extrapolate - exponentially in radius and put a level a few planetary radii up tens of - decades below anything physical. + without bound as a constant scale height would. """ r_top = float(profile.r[-1]) lam_top = G * M_p * float(profile.mmw[-1]) / (kb * float(profile.T[-1]) * r_top) From 5144a151a48d9143956f6a46140eb119ec550e8f Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 15:47:58 +0200 Subject: [PATCH 099/113] Cap inline comments in the tests at three lines Inline comment blocks in the test files keep the reason an input or an assertion is the way it is and drop the narrative around it. Test docstrings keep the physical invariant and the discrimination statement and lose history and process wording, and the Roche-overflow routing docstring now describes the rename-only screen it tests. No test logic changes. --- tests/test_atomic_data.py | 31 ++--- tests/test_boiloff.py | 54 +++------ tests/test_diffusion.py | 31 ++--- tests/test_dispatcher.py | 222 ++++++++++++++--------------------- tests/test_escape.py | 4 +- tests/test_examples.py | 36 ++---- tests/test_hydrodynamic.py | 52 ++++---- tests/test_hydrostatic.py | 89 ++++++-------- tests/test_knudsen.py | 43 +++---- tests/test_nozzle.py | 32 ++--- tests/test_profiles.py | 23 ++-- tests/test_thermostat.py | 29 ++--- tests/test_tutorial_track.py | 11 +- 13 files changed, 253 insertions(+), 404 deletions(-) diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index e14655cf..a7c1df93 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -91,10 +91,8 @@ def test_badnell_fit_magnitude_slope_and_misprint_guard(): + (1.0 + math.sqrt(T / t1)) ** expo ) assert garbled / a4 > 2.0 - # Transcription pin: the six coefficients are the Z = 7, N = 6 row of - # Badnell's table, not the copy in the secondary that garbles the form. - # T2 is the digit-transposition trap, printed 6.739e4 and once carried - # here as 6.379e4, so it is pinned exactly rather than through a rate. + # Transcription pin: the Z = 7, N = 6 row of Badnell's table. T2 is + # pinned exactly because 6.739e4 transposes easily to 6.379e4. assert (t0, t1, t2) == (9.467e-2, 2.954e6, 6.739e4) assert (a_fit, b_fit, c_fit) == (6.387e-10, 0.7308, 0.2440) transposed = (t0, t1, 6.379e4, a_fit, b_fit, c_fit) @@ -131,11 +129,9 @@ def test_co2_band_coronal_limit_and_detailed_balance(): (the error-contract limit). The detailed-balance exponential carries the band quantum in kelvin, - ``h nu / k_B = 959.7 K``, which the module derives rather than taking the - 667 the source prints: 667 is the bending-mode wavenumber in cm^-1, and - ``h c`` times it is the same 1.325e-13 erg quantum the source prints two - equations earlier. The test pins the derived form and excludes the - printed one, which differs by a factor 2.7 at this temperature. + ``h nu / k_B = 959.7 K``, derived from the 1.325e-13 erg quantum. The + source's printed 667 is the wavenumber in cm^-1, and using it as a + temperature differs by a factor 2.7 here, which the test excludes. """ T = 300.0 n_co2, colliders = 1e6, {'O': 1e6} @@ -198,17 +194,14 @@ def test_co2_escape_probability_respects_its_ceiling(): """The escape probability never exceeds the non-LTE ceiling of 0.5. Half the photons escaping is the ceiling for this two-level band, and the - zero-column limit sits there. The thin-column branch of the fitted - tabulation rises through 0.5 below a column parameter of 3.4e-4 and - diverges as the column vanishes, which is the fit leaving its range and - not physics, so it is capped. Capping also makes the zero-column case - continuous with its neighbours, where before the probability jumped from - 0.573 just above zero down to 0.5 at zero. + zero-column limit sits there. The fitted thin-column branch rises through + 0.5 below a column parameter of 3.4e-4 and diverges, which is the fit + leaving its range, so it is capped and thin columns stay continuous with + the zero-column case and never above it. """ - # Densities well above the critical one, so the band is in the LTE regime - # where the cooling is proportional to the escape probability. In the - # coronal limit it is independent of the probability by construction and - # this assertion would hold for any cap at all. + # Densities well above critical put the band in the LTE regime, where + # cooling scales with the escape probability; in the coronal limit any + # cap at all would pass. T, n_co2, colliders = 300.0, 1e12, {'CO2': 1e14, 'O': 1e12} q_zero = co2_band_cooling(n_co2, colliders, T, col_co2=0.0) # Thin columns are continuous with, and never above, the zero-column case. diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index a0e03538..2af873a4 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -181,14 +181,12 @@ def test_bondi_cap_is_misener_eq10_at_the_wind_temperature(): def test_candidate_names_its_binding_cap_and_whether_it_competes(): """The candidate reports which cap set its rate and whether it competes. - ``binding_cap`` must name the smallest of the caps in force, so the rate - equals that cap and no other cap lies below it. A small interior flux - past the gate makes the luminosity cap bind (7.4e4 kg/s against a Parker - rate of 1.8e13 kg/s), and an interior flux nine decades larger releases - it, which discriminates a name read off the minimum from one fixed by - the gate state. ``competes`` follows the gate - while it is open and the residual mode past it, and never touches the - rate. An unknown mode is rejected with a message naming it. + ``binding_cap`` must name the smallest cap in force, so the rate equals + it and no other cap lies below. Past the gate a small interior flux makes + the luminosity cap bind and one nine decades larger releases it, which + separates a name read off the minimum from one fixed by the gate state. + ``competes`` follows the gate while it is open and the residual mode past + it, and never touches the rate. An unknown mode raises, naming it. """ M_p, R_p, T_eq = 3 * Me, 3 * Re, 1000.0 launch = _launch(M_p, R_p, T_eq, {'H2': 1.0}) @@ -337,15 +335,10 @@ def test_tang_timescale_diagnostic_contract(): def test_launch_level_reports_its_own_optical_depth(): """The launch level reports whether its opacity puts it at a photosphere. - The Parker rate is derived from a photosphere, so evaluating it at a - prescribed pressure only reproduces its own derivation when that - pressure is where the supplied opacity gives unit optical depth. The - plane-parallel depth tau = kappa P / g is reported so a caller can see - the gap on the state in front of them: it is 67 on an inflated hydrogen - envelope at 0.01 m^2 kg^-1 and near unity on a bound CO2 planet, which - is the difference the number exists to expose. It is reporting only, and - the level stays prescribed because the activation threshold above it is - calibrated at a level of its own. + The Parker rate assumes a launch at unit optical depth, so the + plane-parallel depth ``tau = kappa P / g`` of the prescribed level is + reported. Discrimination: it is far above unity on an inflated hydrogen + envelope and near unity on a bound CO2 planet. It is reporting only. """ launch = _launch(Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}) g_launch = G * Me / launch['r'] ** 2 @@ -375,11 +368,8 @@ def test_luminosity_cap_flags_itself_when_binding(): """The interior-luminosity cap says when it is the term setting the rate. The cap is absent while the activation gate is open and applies once it - closes, so a state crossing the gate drops discontinuously while keeping - the same label. The flag is the marker for that: past the gate the cap is - usually the binding term, and the drop across the threshold is a factor - of thousands rather than a rounding, so a caller stepping a track through - the gate needs to see which term won and not infer it from the label. + closes, so a state crossing the gate can drop by a large factor under + the same label. The flag tells the caller which term set the rate. """ launch = _launch(2.0 * Me, 1.5 * Re, 1000.0, {'H2': 0.9, 'He': 0.1}) # Inside the gate: no cap exists, so it cannot be flagged. @@ -426,19 +416,13 @@ def test_printed_activation_band_matches_its_source(): def test_parker_rate_absolute_normalization(): """The Parker rate's overall scale, not only its shape. - The suite pins how the rate varies (monotone in flux, shutting off past - the Bondi radius, capped by the Bondi and luminosity terms), and those - all survive a wrong prefactor. This pins the scale: at a launch level - sitting exactly at the Bondi radius the Mach number is 1 by construction - and Owen & Wu (2016, ApJ 817, 107) Eq. (9) reduces to - ``Mdot = 4 pi G M_p / (kappa c_s)``, evaluated here from the constants - rather than by calling the function, so a changed factor fails. - - Order of magnitude against the source: at one Earth mass, an equilibrium - temperature of 1000 K, a hydrogen and helium envelope, and a photospheric - opacity of 0.01 m^2 kg^-1, this is 2.9e14 kg/s, which is 1.5e-3 Earth - masses per year, within an order of magnitude of the 1e-2 Earth masses per - year Owen & Wu quote for the onset of the phase on an inflated envelope. + The shape tests all survive a wrong prefactor, so this pins the scale. + With the launch level at the Bondi radius the Mach number is 1 and Owen + & Wu (2016, ApJ 817, 107) Eq. (9) reduces to + ``Mdot = 4 pi G M_p / (kappa c_s)``, evaluated from the constants rather + than by calling the function, so a changed factor fails. The result at + one Earth mass and 1000 K is within an order of magnitude of the onset + rate Owen & Wu quote. """ m_p, t_eq, kappa = Me, 1000.0, 0.01 mu = 2.35 * amu diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 0c0c6981..2ec7b02b 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -219,16 +219,12 @@ def test_bmatrix_symmetry_and_error_contract(): def test_b_pair_fallback_order_and_proxy_provenance(): """The pair fallback order resolves each fallback and records substitutions. - The fallback order is ordered by provenance class, so a measured row wins over an - estimated one wherever both exist. H-CO2 is the case that separates them: - Table 2 carries it as an 'E' estimate scaled from named analog pairs, - while the molecular-background compilation carries a measured row, and - the measured value is 11.7 percent below the estimate. A pair Table 2 - measures directly (H-He, class 'M') stays on Table 2. A molecular pair - outside Table 2 (CO-N2) resolves through the compilation; an untabulated - molecule (SO2) substitutes the nearest-mass covered species with the - substitution named in the provenance. Cached lookups return identical - values. + Sources are ordered by provenance class, so a measured row wins over an + estimated one. H-CO2 separates the orderings: Table 2 carries an 'E' + estimate and the molecular-background compilation a measured row 11.7 + percent below it. H-He (class 'M') stays on Table 2; CO-N2 resolves + through the compilation; SO2 substitutes the nearest-mass covered + species, named in the provenance. Cached lookups return identical values. """ b_si, prov = b_pair('H', 'CO2', 1000.0) assert prov == 'molecular-background table' @@ -275,9 +271,8 @@ def test_b_mixture_blancs_law_limits(): # The species and element sets a PROTEUS run can hand the escape module, -# transcribed from ``src/proteus/utils/constants.py`` (``gas_list`` and -# ``element_list``). Copied rather than imported: ZEPHYRUS does not depend on -# PROTEUS, and the direction of that dependency must stay one way. +# copied from ``proteus.utils.constants`` (``gas_list``, ``element_list``) +# rather than imported, because ZEPHYRUS must not depend on PROTEUS. PROTEUS_GAS_LIST = ( 'H2O', 'CO2', 'O2', 'H2', 'CH4', 'CO', 'N2', 'NH3', 'S2', 'SO2', 'H2S', 'He', 'Ne', 'Ar', 'Kr', 'Xe', @@ -296,12 +291,10 @@ def test_b_mixture_blancs_law_limits(): def test_every_species_a_coupled_run_can_supply_has_a_coefficient(): """No species a PROTEUS run can supply leaves the pair fallback order empty. - Four species of the vapour list and one volatile carry no kinetic - diameter of their own, and aluminium appears in no diffusion - compilation at all, so each reaches its coefficient by substitution. - What the fallback order guarantees is that the substitution exists, is finite, - and is named: an unnamed substitution would let a rock vapour silently - diffuse like atomic oxygen. + Several vapour species carry no kinetic diameter and aluminium appears + in no compilation, so each reaches its coefficient by substitution. The + substitution must exist, be finite, and be named, so that no rock vapour + silently diffuses like atomic oxygen. """ for sp in PROTEUS_GAS_LIST + PROTEUS_ELEMENT_LIST + CHEMISTRY_EXTRAS: for background in ('CO2', 'H2', 'O', 'N2'): diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 2c962c8d..c251c32d 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -83,13 +83,10 @@ def _inputs(M_p, R_p, T_eq, comp, F_xuv, a=0.1 * AU, e=0.0, p_surf=1e7, p_top=1e def _inverted_profile(M_p, R_p, T_base, T_top, comp, p_surf=1e7, p_top=1e-5, n=160): """Hydrostatic profile whose temperature rises with altitude. - The isothermal builder makes the profile temperature identical to - ``T_eq`` at every level, so no test on it can tell a profile - temperature from an equilibrium one, and no test on it can see the - launch-level cancellation fail. This integrates the same hydrostatic - relation on a temperature that ramps linearly in log pressure, which is - the shape a real upper atmosphere has and the shape that breaks the - isothermal Bernoulli argument. + On the isothermal builder the profile temperature equals ``T_eq`` + everywhere, so no test can tell the two apart or see the launch-level + cancellation fail. This ramps the temperature linearly in log pressure, + which breaks the isothermal Bernoulli argument as a real column does. """ tot = sum(comp.values()) mu = sum(x * species_mass_amu(sp) for sp, x in comp.items()) / tot * amu @@ -153,11 +150,9 @@ def test_totality_over_random_physical_inputs(): """Every physically posed input returns one consistent, finite result. 200 random draws across compositions, masses, radii, fluxes (including - exactly zero), eccentricities, and profile depths: exactly one known - label, a finite non-negative bulk rate, finite non-negative per-species - rates summing to the bulk rate, and a populated diagnostics container, - with no exception anywhere. This is the conservation and boundedness - contract of the whole dispatcher. + zero), eccentricities, and profile depths: one known label, a finite + non-negative bulk rate, per-species rates summing to it, and a populated + diagnostics container. This is the conservation and boundedness contract. """ rng = np.random.default_rng(42) n_ok = 0 @@ -175,11 +170,9 @@ def test_totality_over_random_physical_inputs(): if res.mdot > 0.0: assert tot == pytest.approx(res.mdot, rel=1e-6, abs=0.0) else: - # A zero bulk rate is still a conservation statement, and it is - # the one a relative tolerance cannot make: nothing may leave. - # Roughly a quarter of these draws land here, on states so - # strongly bound that every branch underflows, and skipping them - # left the split unchecked exactly where it is cheapest to break. + # A zero bulk rate is still a conservation statement: nothing may + # leave. About a quarter of the draws underflow on every branch, + # so skipping them would leave the split unchecked. assert res.mdot == 0.0 assert tot == 0.0 assert all(v == 0.0 for v in res.per_species.values()) @@ -262,8 +255,7 @@ def test_routing_roche_overflow_inside_the_hill_sphere(): At 0.003 au the periapsis Hill radius of a 5 Earth-mass planet drops below its own radius: the label is ``roche_overflow`` with the - dynamical subflag, and the rate comes from the Bondi-capped bolometric - machinery at the overflow geometry (finite and non-negative). + dynamical subflag, and the rate is finite and non-negative. """ inp = _inputs(5 * Me, 1.5 * Re, 1500.0, {'H2': 1.0}, F_xuv=100.0, a=0.003 * AU) res = dispatch(inp) @@ -277,23 +269,16 @@ def test_routing_roche_overflow_inside_the_hill_sphere(): def test_roche_screen_renames_without_changing_the_rate(): """Crossing the overflow boundary changes the label and not the rate. - The screen's boundary is a geometric criterion on the winning branch's - flow radius, so the two sides of the boundary hold the same branch and - the dispatched rate must be continuous across it. The family here is a - luminosity-capped bolometric residual whose sonic radius crosses the - Hill radius as the orbit widens, chosen because every other candidate - stays subdominant across the bracket: the XUV flux is negligible and - the nozzle candidate sits outside its applicability criterion, so the - rename is the only thing that changes. The residual is admitted through - the ``residual_mode`` setting, since by default it is reported and does not - compete; what the family needs is a bound branch whose flow radius is - a sonic radius large enough to cross the Hill sphere, and the residual - is the one that has it. Bisecting in orbital distance brackets the - label change; the rates on either side agree to machine precision and - both equal the capped residual. Discrimination: substituting the - Bondi-capped bolometric rate at the overflow geometry, which is what a - rate-changing screen returns, is more than a decade larger, because - that form bypasses the luminosity cap. + The screen tests the winning branch's flow radius, so both sides of the + boundary hold the same branch and the rate must be continuous. The + family is a luminosity-capped bolometric residual (admitted through + ``residual_mode``) whose sonic radius crosses the Hill radius as the + orbit widens, with the XUV rate negligible and the nozzle inapplicable, + so the rename is the only change. Bisecting in orbital distance, the + rates on either side agree to machine precision and equal the capped + residual. Discrimination: the Bondi-capped rate at the overflow + geometry, which a rate-changing screen would return, bypasses the + luminosity cap and is more than a decade larger. """ comp = {'H2': 0.9, 'He': 0.1} admitted = DispatchSettings(residual_mode='luminosity_capped') @@ -353,11 +338,9 @@ def test_roche_subflag_separates_the_two_geometries(): assert roche['xi_ktide'] > 1.0 # not the trivial planet-inside-its-lobe case assert roche['r_atmosphere'] > roche['R_hill_periapsis'] - # The second subflag: an atmosphere inside its own Roche lobe whose - # would-be sonic surface sits outside the Hill radius, which is the - # narrow band Owen & Jackson (2012) describe. The comparator is the - # lobe rather than the Hill radius, because the lobe is the critical - # surface and sits about 0.70 of the way out to the Hill radius. + # Second subflag: inside its Roche lobe, sonic surface past the Hill + # radius, the narrow band of Owen & Jackson (2012). The lobe is the + # comparator because it, not the Hill radius, is the critical surface. bound = dispatch( _inputs( 0.5 * Me, @@ -601,21 +584,15 @@ def test_nozzle_orbit_average_on_eccentric_wins_only(): def test_wind_launch_level_cancels_along_the_wind_column(): """In wind mode the launch level cancels along the wind's own column. - The launch-level convention rests on the Bernoulli invariance of - ``rho exp(Phi / v_th^2)``, which holds only when the density and the - sound speed belong to one column. The wind setting launches from the - wind base at the wind's temperature, so moving the level along the - isothermal column through that anchor must leave the rate alone. The - guard matters because taking the density from the profile's own - (far colder) structure instead moves the rate by more than two decades - over the same range of levels, which is what the invariance claim - would otherwise be hiding. - - The base is placed by hand rather than by the Lopez default, which on - this planet puts the wind base at 1.29 lobe radii: outside the lobe - the exponent is clamped and the rate is the lobe-filling boundary - value, which is linear in the launch density and invariant along no - column at all. + The Bernoulli invariance of ``rho exp(Phi / v_th^2)`` holds only when + density and sound speed belong to one column. The wind setting launches + from the wind base at the wind's temperature, so moving the level along + that isothermal column must leave the rate alone. Discrimination: taking + the density from the profile's far colder structure moves the rate by + more than two decades over the same levels. + + The base is placed by hand because the Lopez default puts it outside the + lobe on this planet, where the clamped rate is invariant along no column. """ state = _inputs( 3 * Me, @@ -633,9 +610,8 @@ def test_wind_launch_level_cancels_along_the_wind_column(): r_ref, rho_ref, v_th = noz['r_launch'], noz['rho_launch'], noz['v_th'] reference = noz['rate_full_orbit_kg_s'] - # The discriminator is the same closed form at the wrong sound speed: - # the profile's own, which is what the launch state carried before the - # column was made consistent with the barrier. + # The discriminator is the same closed form at the wrong sound speed, + # the profile's own, which is inconsistent with the wind's column. v_cold = math.sqrt(kb * state.T_eq / noz['mu_kg']) on_column, cold_column = [], [] for factor in (0.6, 0.8, 1.5, 2.5): @@ -692,20 +668,15 @@ def test_nozzle_temperature_setting_selects_and_validates(): def test_residual_setting_admits_the_post_gate_candidate(): """The bolometric residual competes past the gate only when admitted. - Past the activation gate the bolometric candidate is still evaluated - and reported, but by default it is not a contender: on a contracted - three Earth-mass hydrogen envelope at a wide orbit the luminosity-capped - candidate sits nearly two decades above the XUV rate, and the default - dispatches the XUV rate with ``competes`` false and no - ``bolometric_residual`` flag. Admitting it through the setting - dispatches the candidate under the ``boiloff`` label with that flag and - ``luminosity_capped`` raised, so the two modes differ by the same two - decades, which is the discrimination. Two invariants hold across the - switch: the admitted rate is never below the default one, since the - final comparison then ranges over a superset of the candidates, and - below the gate the two modes agree to machine precision, because the - candidate is the rate there either way. An unknown mode string is - rejected by the settings validator with a message naming the knob. + Past the activation gate the candidate is reported but, by default, + does not compete: on a contracted 3 Earth-mass hydrogen envelope the + luminosity cap sits nearly two decades above the XUV rate, which the + default dispatches with ``competes`` false. Admitted, the candidate + dispatches as ``boiloff`` with ``bolometric_residual`` and + ``luminosity_capped`` raised, so the modes differ by those two decades + (the discrimination). Invariants: the admitted rate is never below the + default, since it ranges over a superset of candidates, and below the + gate the modes agree to machine precision. An unknown mode raises. """ admitted = DispatchSettings(residual_mode='luminosity_capped') past = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) @@ -818,11 +789,9 @@ def test_non_finite_fluxes_are_rejected(): def test_bolometric_diagnostics_keys_match_the_results_page(): """The bolometric diagnostics group carries the keys the reference lists. - The group is built by one producer and documented in one table row, and - the two had drifted before. Parse the key list from the row in - ``docs/Reference/results.md`` and compare it with the live keys on a - state past the gate and one below it, so a key added or dropped on either - side fails here. + The key list parsed from the row in ``docs/Reference/results.md`` must + match the live keys on a state past the gate and one below it, so a key + added or dropped on either side fails here. """ from pathlib import Path @@ -861,13 +830,11 @@ def test_nozzle_power_diagnostic_reports_the_lift_cost(): def test_diagnostics_are_boxed(monkeypatch): """Sabotaging every diagnostics producer changes no dispatch outcome. - The container is reporting only: no control flow reads it back. The test - proves it by replacing every diagnostics-side producer with a stub - returning garbage of the right shape and asserting the regime, the bulk - rate, and every per-species rate are unchanged. It runs on one state per - branch, each dispatching a rate of order unity or above, because a state - whose rate sits near the denormal floor would compare equal to anything - under any absolute tolerance and the assertion would not discriminate. + The container is reporting only: with every diagnostics-side producer + stubbed to return garbage of the right shape, the regime, bulk rate, and + per-species rates are unchanged. One state per branch, each with a rate + of order unity or above, since a rate near the denormal floor would + compare equal to anything and not discriminate. """ states = { 'hydrostatic': _inputs( @@ -935,8 +902,7 @@ def test_base_out_of_range_extend_mode(): decades); the extend policy evaluates the base on the extended upper structure instead, replacing the clamp flag with ``base_extended`` and placing the base at a lower pressure than the profile top. Either way - the diagnostics report the pressure the base method asked for before - any clamp, which is the only place that quantity is available. + the diagnostics report the pressure the base method requested. """ inp_clamp = _inputs(5 * Me, 1.5 * Re, 800.0, {'N2': 1.0}, F_xuv=1.0, p_top=1e-2) res_clamp = dispatch(inp_clamp) @@ -1099,10 +1065,8 @@ def test_t_exo_thermostat_mode_estimates_and_reports_itself(): On the bound CO2 case the estimator returns a temperature inside the thermostat bracket (above the equilibrium temperature, below the upper - bracket edge), the diagnostics record which mode produced it, and the - dispatch completes with a consistent per-species sum. The mode is a - property of the call and not a warning about it, so it belongs in the - diagnostics and not in the flags dictionary. + bracket edge), the diagnostics (not the flags, since the mode is not a + warning) record which mode produced it, and the per-species sum holds. """ settings = DispatchSettings(T_exo_mode='thermostat') res = dispatch( @@ -1199,12 +1163,10 @@ def test_settings_option_raises_cover_every_knob(): def test_flags_describe_the_branch_that_produced_the_rate(): """A warning never survives onto a verdict its rate did not come from. - The flags dictionary is read as a warning set about the returned result, - so a caution about the wind temperature or the sonic radius must not ride - along on a bolometric or hydrostatic verdict, whose rate those quantities - did not set. The hydrodynamic candidates are always computed, because the - diagnostics report them at every dispatch, which is what makes the - scoping necessary rather than automatic. + A caution about the wind temperature or the sonic radius must not ride + along on a bolometric or hydrostatic verdict, whose rate those did not + set. The hydrodynamic candidates are computed at every dispatch, so the + scoping has to be enforced rather than falling out automatically. """ hydro = dispatch( _inputs(Me, Re, 1000.0, {'N2': 0.8, 'O2': 0.2}, F_xuv=100.0, a=0.0775 * AU) @@ -1236,13 +1198,10 @@ def test_flags_describe_the_branch_that_produced_the_rate(): def test_one_exobase_temperature_per_call(): """The base extension and the branch stand on one upper structure. - Under the extend policy the wind base is re-evaluated on a Bates - extension, and the hydrostatic branch stands on one too. Both must be - built at the same exobase temperature: resolving it twice, once from the - settings and once from the equilibrium temperature, gave one call two - thermospheres, and under the thermostat they differed by an order of - magnitude in temperature, which sets the base density the wind rate is - built from. + Under the extend policy the wind base sits on a Bates extension, and + the hydrostatic branch stands on one too; both must use the same + exobase temperature. The thermostat moves it well off the equilibrium + temperature, so a base built at ``T_eq`` instead is discriminated. """ m_p, r_p, t_eq = 10 * Me, 1.8 * Re, 800.0 # A profile whose top lies above the Lopez base, so the policy engages. @@ -1267,18 +1226,16 @@ def test_one_exobase_temperature_per_call(): # The thermostat must have moved off the equilibrium temperature, or the # test cannot tell the two resolutions apart. assert t_branch > 5.0 * t_eq - # The base sits on the same extension: between the anchor and the exobase, - # and nowhere near the equilibrium temperature the old path used. + # The base sits on the same extension: between the anchor and the + # exobase, and far from the equilibrium temperature. assert t_top < t_base <= t_branch assert t_base > 0.5 * t_branch assert t_base != pytest.approx(t_eq, rel=0.1, abs=0.0) -# Each row is (flag, a state that must raise it, a state that must not). Every -# warning the result can carry belongs here: a flag nothing asserts can be -# deleted without the suite noticing, which makes it a comment rather than part -# of the contract. The negative state is what stops a flag that fires on -# everything from passing as discrimination. +# Each row is (flag, a state that must raise it, a state that must not). +# Every warning the result can carry belongs here, so none goes unasserted; +# the negative state stops a flag that fires on everything from passing. FLAG_CASES = ( ( 'near_roche', @@ -1421,11 +1378,9 @@ def test_one_exobase_temperature_per_call(): def test_every_warning_flag_has_a_state_that_raises_it_and_one_that_does_not(): """Each flag fires on a state that warrants it and stays off otherwise. - A flag no test asserts is a comment: it can be deleted and the suite stays - green, so nothing holds the module to raising it. Each row pins one flag - against a state that must raise it and a state that must not, and the - second half is what keeps a flag that fires on everything from passing as - a working warning. + Each row pins one flag against a state that must raise it and a state + that must not; the negative state keeps a flag that fires on everything + from passing as a working warning. """ for flag, on, off in FLAG_CASES: res_on = dispatch(_inputs(**_flag_state(on))) @@ -1449,12 +1404,10 @@ def test_launch_level_is_a_width_on_a_realistic_column(): """Off an isothermal column the launch level is a width, not a cancellation. The transfer rate is invariant to the launch level only along a column - whose sound speed matches the density that column carries. Real - profiles are not isothermal, so the cancellation leaves a residual, and - the residual is reported rather than assumed small. The isothermal - control is the contrast: the same sweep on the builder every other test - uses moves the rate by a few percent, while a modest inversion moves it - by a factor. + whose sound speed matches its density, so a real, non-isothermal profile + leaves a residual that is reported. Discrimination: the same sweep moves + the rate by a few percent on the isothermal builder and by a factor on + a modest inversion. """ comp = {'H2': 0.9, 'He': 0.1} inverted = _inverted_profile(3 * Me, 2.2 * Re, 1000.0, 1600.0, comp) @@ -1555,11 +1508,9 @@ def test_nozzle_win_splits_by_reservoir_not_by_the_losing_branch(): def test_dispatched_split_names_the_element_that_leaves(): """The dispatched split is checked by identity, not only by its sum. - The dispatcher renormalizes the per-species rates onto the bulk rate, so - a sums-to-mdot assertion cannot fail however the shares are assigned: a - permuted mapping conserves total mass while moving the wrong elements out - of the planet, which is what the PROTEUS side debits reservoirs by. Both - branches that produce a split are pinned by which element dominates. + The per-species rates are renormalized onto the bulk rate, so a sum + check passes for a permuted mapping that removes the wrong elements. + Both branches that produce a split are pinned by which element dominates. """ # Hydrostatic: only hydrogen is light enough to leave the Mars-mass host, # and it carries the rate by nineteen decades over the heavy background. @@ -1588,13 +1539,12 @@ def test_dispatched_split_names_the_element_that_leaves(): def test_caldiroli_efficiency_geometry_conversion(): """The fitted efficiency is converted to the geometry it is used in. - Caldiroli et al. (2022) fit their efficiency against a rate written on an + Caldiroli et al. (2022) define their efficiency against a rate on an ``R_p^3`` geometry, while the dispatcher's energy-limited rate is the - Erkaev form on ``R_p R_XUV^2`` (``scaling=2``). Decision 12 therefore - converts the fitted value by ``(R_p / R_XUV)^2`` before using it. The - conversion is a pure geometric factor, so nothing about the rate's shape - reveals whether it was applied: dropping it entirely left the suite green. - This pins it against the two radii the same call reports. + Erkaev form on ``R_p R_XUV^2`` (``scaling=2``), so the fitted value must + be converted by ``(R_p / R_XUV)^2``. The factor is purely geometric and + leaves the rate's shape unchanged, so it is pinned against the two radii + the call reports, on a state where the factor differs from 1. """ settings = DispatchSettings(efficiency_mode='caldiroli') inp = _inputs(Me, Re, 1000.0, {'CO2': 1.0}, F_xuv=10.0, a=0.0775 * AU, settings=settings) @@ -1602,10 +1552,8 @@ def test_caldiroli_efficiency_geometry_conversion(): hy = res.diagnostics['hydrodynamic'] raw, _flags = caldiroli_efficiency(10.0, Me, Re, hy['K_tide']) assert raw is not None - # The XUV radius is the photospheric level the settings select, which is - # the radius the Erkaev form cubes; it is recomputed here from the same - # profile rather than read back, so the test does not depend on the - # module reporting it. + # The XUV radius of the Erkaev geometry, recomputed from the profile so + # the test does not depend on the module reporting it. photo, _pf = photospheric_level(inp.profile, settings.P_photo) r_xuv = photo['r'] factor = (Re / r_xuv) ** 2 diff --git a/tests/test_escape.py b/tests/test_escape.py index 7feb9ca8..dae73c92 100644 --- a/tests/test_escape.py +++ b/tests/test_escape.py @@ -196,8 +196,8 @@ def test_el_escape_tidal_correction_increases_escape(): the denominator, the tidal rate exceeds the no-tidal rate. The enhancement ``1 / K_tide`` is pinned, and the no-tidal value is the discrimination guard: a dropped ``K_tide`` would collapse the ratio to 1, and the - superseded ``Rhill / Rxuv`` convention for ``scaling=2`` would give 1.60 - instead of the pinned 1.46, so a convention regression also fails. + ``Rhill / Rxuv`` convention, wrong for ``scaling=2``, would give 1.60 + instead of the pinned 1.46. """ a = 0.02 * au2m # close-in so K_tide is well below 1 no_tidal = EL_escape(False, a, 0.0, Me, Ms, EPSILON, RP, RXUV, FXUV, scaling=2) diff --git a/tests/test_examples.py b/tests/test_examples.py index ff69ad73..eb5d4cf6 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -140,10 +140,9 @@ def test_dispatcher_example_boundary_bisection_brackets_a_label_change(): # The boundary lies strictly inside the bracket it was given, so a # bisection that fell back to an endpoint fails here. assert 0.1 < flux < 10.0 - # The band edges come back in threshold order, 3 first then 0.1. The - # stricter threshold (0.1) demands a denser sonic point, so it needs - # more flux to call a wind: the band is ordered, not just wide. A - # swapped or shared threshold would collapse this to equality. + # Band edges come back in threshold order, 3 then 0.1: the stricter 0.1 + # needs a denser sonic point and so more flux. A swapped or shared + # threshold would collapse this to equality. at_kn3, at_kn0p1 = example.boundary_band('CO2') assert at_kn0p1 > at_kn3 assert at_kn0p1 / at_kn3 > 1.5 @@ -219,11 +218,9 @@ def test_dispatcher_example_track_changes_regime_as_the_star_quiets(): TUTORIAL = Path(__file__).resolve().parents[1] / 'docs' / 'Tutorials' / 'dispatch.md' -# The one snippet that reads the real stellar evolution tracks. Executing it -# needs the Spada grid under FWL_DATA, which the unit and smoke tier does not -# download, so this tier runs every other block and the integration tier runs -# the whole page. Excluding it by name rather than by whether the data happens -# to be present keeps the two tiers checking the same thing everywhere. +# The one snippet that reads the Spada tracks, which this tier does not +# download; the integration tier runs the whole page. Excluding it by name, +# not by data presence, keeps each tier checking the same thing everywhere. TUTORIAL_DATA_DEPENDENT = 'stellar_track(' @@ -250,21 +247,14 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): """Every tutorial snippet runs in order and prints its quoted output. The page states that every printed number is the verbatim output of a - snippet the reader can run, which is a claim about the documentation that - only a test can hold. The snippets share one namespace and run in the - order they appear, as a reader would execute them, and each quoted output - block must match what the preceding snippet printed, character for - character. This is the guard against the drift that has to be repaired by - hand otherwise: a coefficient change three modules away moves a number - here, and nothing else notices. + runnable snippet. The snippets share one namespace and run in page order, + and each quoted output block must match what the preceding snippet + printed, character for character, so a coefficient change anywhere in + the package that moves a quoted number fails here. """ - # The page's first snippet imports the worked example by its path from the - # repository root, which is what a reader running from a clone would type. - # That resolves only with the root on sys.path, and whether it is there - # depends on how pytest was started: `python -m pytest` puts the working - # directory there and the console script does not, so CI and a local run - # disagreed. Prepending it here makes the test independent of the - # invocation, and monkeypatch undoes it afterwards. + # The first snippet imports the example by its repository-root path, + # which needs the root on sys.path; `python -m pytest` adds it and the + # console script does not, so it is prepended here and undone after. monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[1])) namespace: dict = {} compared = 0 diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index 3884dcb9..fb832ec7 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -49,11 +49,9 @@ (5.9, 1.34), ] -# Spot evaluations of the Caldiroli et al. (2022) Appendix A.1 fit across -# its validity box at K = 1: (log10 phi [cgs], F_XUV/rho_p [cgs], eta). -# The eta values were evaluated from the published fitting formulas at -# transcription time, independently of this implementation, so a later -# transcription error in either place breaks the agreement. +# Spot evaluations of the Caldiroli et al. (2022) Appendix A.1 fit at K = 1, +# (log10 phi [cgs], F_XUV/rho_p [cgs], eta), evaluated from the published +# formulas independently of this implementation. CALDIROLI_SPOTS = [ (12.20, 1e3, 8.8e-1), (12.20, 1e6, 1.5e-1), @@ -76,10 +74,8 @@ def test_erkaev_table1_enhancement_factors(): for xi, inv_k in ERKAEV_TABLE1: assert 1.0 / k_tide(xi) == pytest.approx(inv_k, rel=0.011, abs=0.0), xi assert 0.0 < k_tide(xi) < 1.0 - # The factor is defined only above its double root. Below it the same - # polynomial turns back upward and exceeds 1, which would reduce the - # energy-limited rate where the tide is strongest, so the domain is - # enforced rather than extrapolated. + # Defined only above the double root: below it the polynomial exceeds 1 + # and would cut the rate where the tide is strongest, so it raises. for outside in (1.0, 0.5, 0.0, -2.0): with pytest.raises(ValueError, match='xi > 1'): k_tide(outside) @@ -127,13 +123,11 @@ def test_wind_mean_masses_against_lopez_pairs(): Lopez (2017) prints (mu_wind, mu_plus) = (0.62, 1.3) for a 90/10 H/He wind and (3, 6) for steam (fully dissociated 2:1 H:O), in atomic mass - units. The rule counts electrons and singly ionizes the heavies, which - makes the per-ion mass exactly twice the per-particle mass, so the steam - pair is recovered on both entries while the H/He pair cannot be: 1.3 - halves to 0.65, not to the printed 0.62, a 4.6 percent inconsistency in - the source. The rule follows the per-ion value, which is the entry both - printed pairs agree with, and this test pins that reading rather than - widening a tolerance until both fit. + units. The rule counts electrons and singly ionizes the heavies, so the + per-ion mass is exactly twice the per-particle mass: the steam pair is + recovered on both entries, while the H/He pair is internally + inconsistent in the source (1.3 halves to 0.65, not 0.62). The test pins + the per-ion reading rather than widening a tolerance until both fit. """ mu_w, mu_i = wind_mean_masses({'H': 0.9, 'He': 0.1}) assert mu_i == pytest.approx(1.3, rel=0.01, abs=0.0) @@ -177,8 +171,7 @@ def test_rr_barometric_factor_separates_the_two_rr_regimes(): material that far. A loosely bound hydrogen wind keeps a factor of order unity, so its rate is the recombination-limited base ionization. The selection string reports which candidate won and nothing more: - both supercritical cases read ``RR-selected``, which is what retiring - the old base-Jeans-parameter split means. + both supercritical cases read ``RR-selected``. """ rr = rr_chain(10.0 * Me, 10.0, 2.0 * Re, 1.0e4, {'C': 1.0 / 3.0, 'O': 2.0 / 3.0}) assert rr['subcritical'] is False @@ -192,14 +185,13 @@ def test_rr_barometric_factor_separates_the_two_rr_regimes(): rr_h = rr_chain(0.7 * Mjup, 5.0, 2.0 * Rjup, 1.0e4, {'H': 1.0}) assert not rr_h['subcritical'] # Loosely bound: the factor is of order unity, two decades above the - # heavy case, which is the separation the label used to assert. + # heavy case, so the factor separates the two RR readings. assert 2.0 < rr_h['lambda_b'] < 4.0 assert rr_h['barometric_factor'] > 1.0e2 * rr['barometric_factor'] assert 0.1 < rr_h['barometric_factor'] <= 1.0 - # The string keeps three outcomes and no threshold: both of these are - # supercritical RR wins, so a split on lambda_b would have separated - # them and this assertion is what forbids one coming back. + # The string has three outcomes and no threshold: both are supercritical + # RR wins, so any split on lambda_b would label them differently. assert selection_mechanism(rr, el_won=False) == 'RR-selected' assert selection_mechanism(rr_h, el_won=False) == 'RR-selected' assert selection_mechanism(rr, el_won=True) == 'EL-selected' @@ -274,13 +266,11 @@ def test_front_constants_come_from_one_front(): """The photon energy and its cross section belong to the same front. The chain picks a monochromatic ionizing front by composition, and both - constants of that front have to follow the choice. Taking the energy from - the composition while leaving the cross section at hydrogen's put a - nitrogen-like wind on a section 5.3 times too small, so its neutral base - density came out 5.3 times too high and the reported base ionization - fraction was understated by a third. The neutral density scales as the - inverse of the section, which is what pins the direction here; the rate - is built on the ion density and is untouched either way. + constants of that front must follow the choice. The neutral base density + scales as the inverse of the section, so the hydrogen-to-nitrogen density + ratio must equal the section ratio of 5.3; a section left at hydrogen's + would make it unity. The rate is built on the ion density and is + untouched either way. """ hydrogen = rr_chain(5 * Me, 100.0, 1.5 * Re, 1.0e4, {'H': 1.0}) nitrogen = rr_chain(5 * Me, 100.0, 1.5 * Re, 1.0e4, {'N': 1.0}) @@ -297,8 +287,8 @@ def test_front_constants_come_from_one_front(): # Discrimination: leaving the section at hydrogen's would make the ratio # unity, which the assertion above excludes. assert measured > 5.0 - # The base ionization fraction is a fraction, and the heavy wind's is - # not the understated value the mismatched section produced. + # The base ionization fraction is a fraction, and the heavy wind's stays + # high, which a hydrogen section on this front would understate. for chain in (hydrogen, nitrogen): assert 0.0 <= chain['f_plus_base'] <= 1.0 assert nitrogen['f_plus_base'] > 0.8 diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index f0e37185..de9f4ca6 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -81,17 +81,14 @@ def c_lambda(lam): def test_volkov_flat_factor_against_published_correction(): """The source's flat factor is distinct from the published Eq. (9). - Two anchors in one test, both against Volkov et al. (2011). First, the - test-local Eq. (9) oracle is certified against the paper: it reduces to - unity at zero bulk velocity, and its leading correction is linear in - the speed ratio with the printed c(lambda) table (tolerance 6e-4, the - float wobble the published table itself carries at large lambda). - Second, the source's ``volkov_flat_factor`` carries the measured shape - (1.7 at lambda = 6 to 1.4 at lambda = 15, held at the endpoints as the - flagged extrapolation) and falls with lambda while the certified - Eq. (9) correction rises with it: opposite slopes, so the two - corrections are different quantities and applying both to the branch - would double-count. + Two anchors against Volkov et al. (2011). The test-local Eq. (9) oracle + reduces to unity at zero bulk velocity and its leading correction is + linear in the speed ratio with the printed c(lambda) table (tolerance + 6e-4, the precision of the published table at large lambda). The + source's ``volkov_flat_factor`` (1.7 at lambda = 6 to 1.4 at lambda = + 15, held at the endpoints) falls with lambda while the Eq. (9) + correction rises: opposite slopes, so the two are different quantities + and applying both would double-count. """ for lam, c_ref in VOLKOV_C_TABLE.items(): assert c_lambda(lam) == pytest.approx(c_ref, rel=6e-4, abs=0.0), lam @@ -158,17 +155,11 @@ def test_yelle_figure1_mars_hydrogen_flux(): On their fully specified Mars model the hydrogen escape flux is diffusion limited above about 200 K exobase temperature, with a plateau - at 2.4e8 cm^-2 s^-1. The 40 percent tolerance is deliberate and its - direction understood: the binary H-CO2 coefficient source their - calculation used is not pinned in the paper, the tabulated coefficient - here is smaller, and this implementation sits systematically below the - anchor (measured plateau 1.70e8, a ratio of 0.71 against the 0.60 - floor), so a future coefficient revision in either direction moves - this pin and should be re-tuned consciously rather than by widening - the tolerance. The transition to Jeans-limited escape below about - 150 K shows as a collapse; the 100 K point sits on the exponential - edge, so it is checked as a regime (an order below the plateau), not - as a value. + at 2.4e8 cm^-2 s^-1. The 40 percent tolerance covers a known offset: + the paper does not pin its H-CO2 coefficient source, the tabulated one + here is smaller, and the plateau sits below the anchor. Below about + 150 K the flux collapses to Jeans-limited escape; the 100 K point is on + the exponential edge, so it is checked as a regime, not a value. """ f100, _ = _mars_h_flux(100.0) f200, _ = _mars_h_flux(200.0) @@ -360,13 +351,12 @@ def test_trace_species_survive_into_the_exobase_anchor(): def test_supply_quadrature_refines_to_its_target(): """The supply integrals are refined until they stop moving the rate. - The integrals are first-order accurate in the log-pressure step, so the - change between a grid and its refinement estimates what is left to - converge, and one fixed count cannot report its own error. Doubling from - a coarse start must therefore drive the change below the target and say - so, the refined answer must be the finest grid's rather than an + The integrals are first-order in the log-pressure step, so the change + between a grid and its refinement estimates the remaining error. + Doubling from a coarse start must drive the change below the target and + say so, the answer must be the finest grid's rather than an extrapolation, and a ceiling reached without meeting the target must be - reported rather than passed off as converged. + reported as such. """ prof = _co2_hydrogen_profile(0.01) per, det = hydrostatic_rates_refined(prof, M_MARS, 1000.0, rtol=1e-2) @@ -396,14 +386,11 @@ def test_supply_quadrature_refines_to_its_target(): def test_exobase_temperature_floors_at_the_profile_top(): """A prescribed exobase temperature never builds a falling thermosphere. - The extension is the inflated structure the exobase quantities must be - read from, so it cannot end colder than the level it extends from: that - puts the exobase more strongly bound than its own anchor, inverting the - construction and biasing the branch toward retention. The prescribed - temperature is a stand-in for physics the branch does not solve, and in a - coupled run the profile top warms over secular time and can pass it, so - the value floors at the anchor and the call is flagged rather than - raising and stopping the run. + An extension colder than its anchor puts the exobase more strongly + bound than the anchor, inverting the construction and biasing the + branch toward retention. A coupled run's profile top can warm past the + prescribed value, so the value floors at the anchor, flagged, rather + than raising. """ prof = _co2_hydrogen_profile(0.01) t_top = float(prof.T[-1]) @@ -430,15 +417,11 @@ def test_exobase_temperature_floors_at_the_profile_top(): def test_per_element_shares_follow_the_species_that_escape(): """The split names which element leaves, not just how much in total. - Element rates summing to the bulk rate is a weak claim: the dispatcher - renormalizes the split onto the bulk rate, so the sum matches by - construction and a permuted mapping would conserve mass while moving the - wrong elements out of the planet. What has to hold is the identity of the - shares. On a carbon dioxide host carrying one percent hydrogen, hydrogen - is the only species light enough to escape and carries the whole rate, - twenty decades above the carbon and oxygen the heavy background supplies, - and the CO2 that does leave splits onto carbon and oxygen in - stoichiometric mass proportion. + The split is renormalized onto the bulk rate, so a sum check passes for + a permuted mapping; what must hold is the identity of the shares. On a + CO2 host with one percent hydrogen, hydrogen carries the whole rate, + decades above carbon and oxygen, and the CO2 that leaves splits onto + carbon and oxygen in stoichiometric mass proportion. """ prof = _co2_hydrogen_profile(0.01) per_el, det = hydrostatic_rates(prof, M_MARS, 1000.0) @@ -471,12 +454,9 @@ def test_yelle_harmonic_mean_and_area_referral(): diffusion-limited supply by the harmonic mean of Eq. (14), ``phi = phi_J phi_l / (phi_J + phi_l)``, and refers the flux from the exobase back to the anchor radius through the ``(r_x / r_0)^2`` factor of - Eq. (15). Both are invisible on a state where the two fluxes differ by - decades, since there the harmonic mean equals the smaller one and the - referral is a fixed rescaling: a plain minimum reproduces the combination - to one part in 1e5 on the default exobase temperature. This test therefore - runs at the exobase temperature where the two fluxes cross, where the - harmonic mean is 0.61 of the minimum and a substitution cannot hide. + Eq. (15). Where the fluxes differ by decades a plain minimum reproduces + the harmonic mean, so the test runs at the exobase temperature where the + two cross and the harmonic mean is well below the minimum. """ prof = _co2_hydrogen_profile(0.01) # 130 K puts the hydrogen effusion flux within a factor 1.6 of its supply. @@ -496,9 +476,8 @@ def test_yelle_harmonic_mean_and_area_referral(): assert r_x > r_0 referral = (r_x / r_0) ** 2 assert referral > 1.05, 'the referral factor is too close to 1 to discriminate' - # Rebuild the effusion flux from the reported exobase quantities: the - # referral is the only factor between the local flux and the quoted one. - # The mixing ratio is the diffusively enriched one at the exobase, not the - # anchor value, which for a light trace species differs by decades. + # Rebuild the effusion flux from the reported exobase quantities; the + # referral is the only factor between local and quoted flux, and the + # mixing ratio is the diffusively enriched exobase value. local = d['volkov_C'] * d['w_jeans'] * d['X_tilde_exo'] * det['n_exo'] assert phi_j == pytest.approx(referral * local, rel=1e-9, abs=0.0) diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index 46ede719..daa41efe 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -40,10 +40,9 @@ pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] -# Momentum-transfer cross sections [m^2] evaluated from the transcribed -# Laricchiuta et al. (2009) fit at transcription time and validated then -# against the measured viscosities below. They serve as transcription -# regression pins: a typo in any Table 3/4/5 coefficient moves them. +# Momentum-transfer cross sections [m^2] from the Laricchiuta et al. (2009) +# fit, validated against the measured viscosities below; a typo in any +# Table 3/4/5 coefficient moves them. PINNED_SIGMA = { ('N', 'N'): { 300: 2.56e-19, @@ -79,10 +78,10 @@ def test_laricchiuta_cross_sections_match_transcription_pins(): """Every tabulated pair reproduces its pinned cross section at every T. - The pins were evaluated from the published fit when the coefficient - tables were transcribed, so any later coefficient corruption fails - here. The temperature trend is the physical guard: collision integrals - of these attractive-well pairs shrink monotonically with temperature. + The pins were evaluated from the published fit, so a corrupted + coefficient fails here. The physical guard is the temperature trend: + collision integrals of these attractive-well pairs shrink with + temperature. """ for pair, vals in PINNED_SIGMA.items(): for T, ref in vals.items(): @@ -154,10 +153,9 @@ def test_fallback_order_provenance_and_geometric_bias(): geo_h2o, tabulated_h2o = sigma_geometric('H2O') assert tabulated_h2o is True assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12, abs=0.0) - # An element Bondi does not tabulate reaches the fallback on an assumed - # radius, and says so rather than passing for a published one. Bondi - # prints no alkali, alkaline earth, or transition metals, so this is - # every rock-forming vapour species outside the seven scaled elements. + # Elements Bondi does not tabulate (alkali, alkaline earth, transition + # metals) reach the fallback on an assumed radius, and say so rather + # than passing for a published one. for assumed in ('Ti', 'K', 'Ca', 'Al', 'P', 'Cl'): sigma_a, tabulated_a = sigma_geometric(assumed) assert tabulated_a is False, assumed @@ -257,14 +255,11 @@ def test_sigma_mixture_normalizes_over_what_is_present(): def test_printed_knudsen_band_matches_its_source(): """The printed switch band is the one the literature states. - The band is not tuning freedom and not a tolerance: kinetic simulations - place the fluid-to-kinetic transition near 0.1 for heating deposited in a - sharp layer and near 1 for distributed heating (Johnson et al. 2013, ApJL - 768, L4), and Chatterjee & Pierrehumbert (2026, ApJ 998, 236) extend the - upper edge to 3 where the energy limit may survive. The dispatcher prints - the counterfactual labels at both edges beside every verdict, so the band - is a reported result and its numbers are pinned here rather than being - free to drift. + Kinetic simulations place the fluid-to-kinetic transition near 0.1 for + heating in a sharp layer and near 1 for distributed heating (Johnson et + al. 2013, ApJL 768, L4), and Chatterjee & Pierrehumbert (2026, ApJ 998, + 236) extend the upper edge to 3. The band is printed beside every + verdict as a reported result, so its numbers are pinned. """ assert KN_BAND == (0.1, 3.0) lo, hi = KN_BAND @@ -278,11 +273,9 @@ def test_sonic_scale_height_gamma_dependence(): At gamma = 1 the closed form of Chatterjee & Pierrehumbert (2026, ApJ 998, 236) Eq. (17), ``H_sc = (1 + gamma) r_sc / (4 + sqrt(2) sqrt(5 - 3 gamma))``, collapses to ``r_sc / 3`` because the numerator is - 2 and the denominator is 6, and several wrong forms agree with it there: - replacing the numerator by a constant 2, or the radical by sqrt(2), both - give r_sc / 3 at gamma = 1 and diverge from the correct form away from it. - Pinning the isothermal value alone therefore pins nothing, so the form is - evaluated at the polytropic and monatomic values as well. + 2 and the denominator is 6. A constant numerator of 2, or sqrt(2) for the + radical, also gives r_sc / 3 there, so the form is pinned at the + polytropic and monatomic values as well. """ assert sonic_scale_height(1.0, 1.0) == pytest.approx(1.0 / 3.0, rel=1e-12, abs=0.0) assert sonic_scale_height(1.0, 1.4) == pytest.approx(0.4558481560, rel=1e-9, abs=0.0) diff --git a/tests/test_nozzle.py b/tests/test_nozzle.py index e15e6cdd..c5e800c3 100644 --- a/tests/test_nozzle.py +++ b/tests/test_nozzle.py @@ -4,9 +4,9 @@ ApJ 835, 145). The physical anchors under test: - Reference pins: the four Table 2 planets whose launch level sits below - 0.4 lobe radii, reproduced with their own input prescriptions; two lobe-filling binaries of their Table 1 landing - on the Figure 5 solid curve; the equal-mass curvature A(1) = 8 their - Section 2.1 prints. + 0.4 lobe radii, reproduced with their own input prescriptions; two + lobe-filling binaries of their Table 1 landing on the Figure 5 solid + curve; the equal-mass curvature A(1) = 8 their Section 2.1 prints. - Cross-check: the Eq. (14) volume-averaged potential evaluated at the Eggleton lobe radius matches the exact corotating Roche potential at a numerically solved L1 point. @@ -60,22 +60,17 @@ def _jackson_photosphere(M_p, R_p, T_p, mu_kg): def test_table2_deep_launch_planets_reproduce_published_rates(): """Four Table 2 planets of Jackson et al. (2017) reproduce within 6%. - Their Table 2 lists twenty-one objects. The four pinned here are every - one whose launch level sits below 0.4 Roche lobe radii, which is where - the Eq. (14) potential approximation is good and the photospheric - radius convention is irrelevant, so the printed rates pin the whole - formalism (Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius). - Above that depth two effects the implementation does not carry take - over, as the accompanying validation page records, so the remaining - seventeen rows are outside what this pin can claim. + The four pinned rows of their twenty-one are every one whose launch + level sits below 0.4 Roche lobe radii, where the Eq. (14) potential is + accurate and the photospheric radius convention is irrelevant, so the + printed rates pin Eqs. 3, 10, 13, and 14 plus the Eggleton lobe radius. + The remaining rows are outside what this pin can claim (see the + validation page). Inputs are their Table 2 rows through their Section 3 prescriptions - (mu = 1 amu above 2000 K, 2 amu below). Achieved deviations run 0.4%, - 2.1%, 3.5%, and 5.0%, rising with launch depth as expected; the 6% - tolerance covers those and the physical-constant conventions that an - exponent of order 10 to 16 amplifies, while the transcription errors - this pin exists to catch move the rate by factors of several to - decades. + (mu = 1 amu above 2000 K, 2 amu below). The 6% tolerance covers the + physical-constant conventions an exponent of order 10 to 16 amplifies, + while a transcription error moves the rate by factors of several. """ # (Mp [MJup], Rp [RJup], Tp [K], a [au], Ms [Msun], target [kg/s], mu [amu]) rows = [ @@ -281,8 +276,7 @@ def test_public_surface_rejects_unphysical_arguments(): The module is documented public API, so a direct caller must not get a negative mass-loss rate from a negative density, a complex cube root from a negative mass ratio, or a bare division by zero from a launch - level at the origin. Each case below returned one of those before the - guards existed. + level at the origin. """ m_p, m_s, a = 3.0 * Me, Ms, 0.05 * AU ok = dict( diff --git a/tests/test_profiles.py b/tests/test_profiles.py index 9a03f6fa..49127fdd 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -204,11 +204,9 @@ def test_lopez_base_pressure_is_the_nanobar_level(): level for 20 eV photons near a nanobar for their fiducial hot Jupiter (0.7 Jupiter masses, 1.4 Jupiter radii, atomic-hydrogen thermosphere), and Lopez (2017, MNRAS 472, 245) builds the wind-base prescription - ``P_base = mu g / sigma_nu0`` on the same level. Both papers quote the - scale, not a precise value, so the pin is the order of magnitude: the - computed pressure must land within a factor of a few of 1e-4 Pa (one - nanobar). Sign and scale guards: strictly positive and far below the - 20 mbar photospheric level. + ``P_base = mu g / sigma_nu0`` on the same level. Both quote the scale, + so the pin is a factor of a few around 1e-4 Pa (one nanobar). Sign and + scale guards: strictly positive and far below the 20 mbar level. """ g = G * (0.7 * Mjup) / (1.4 * Rjup) ** 2 p_base = lopez_base_pressure(1.008 * amu, g) @@ -344,10 +342,8 @@ def compute_mass_loss_parameters(self, m, r, t): lev_f, flags_f = wind_base_level(prof, 5 * Me, method='boreas', boreas_scalars=scalars) assert flags_f.get('base_method_fallback') == 'lopez' - # A solver radius above the modeled column must reach the clamp branch. - # Interpolation alone clamps silently, which would hand the caller the - # top pressure as though it had been solved for and leave the clamp test - # comparing a value against itself, so the flag could never fire. + # A solver radius above the modeled column must reach the clamp branch; + # interpolation alone clamps silently, so the flag could never fire. class HighMassLoss(FakeMassLoss): def compute_mass_loss_parameters(self, m, r, t): return [{'regime': 'HD', 'RXUV': 3.0 * float(prof.r[-1]) * 1e2}] @@ -372,12 +368,9 @@ def test_validate_rejects_non_finite_and_negative_entries(): """A non-finite or negative entry is caught here, not far downstream. A comparison against NaN is false, so a positivity test alone passes a - NaN through, and it then surfaces wherever the value is first combined - with something else, under a message naming an unrelated quantity. Every - array is therefore checked for finiteness before its sign. Mixing ratios - slightly below zero are solver noise and pass, because a chemistry solver - can return one where a species is absent and a coupled run must not die - on it; a genuinely negative mole fraction is rejected. + NaN through; every array is checked for finiteness before its sign. + Mixing ratios slightly below zero are chemistry-solver noise where a + species is absent and pass; a genuinely negative mole fraction raises. """ n = 5 base = dict( diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py index 33ceef06..90dbf108 100644 --- a/tests/test_thermostat.py +++ b/tests/test_thermostat.py @@ -96,9 +96,8 @@ def test_hydrogen_system_brackets_the_black_lyalpha_rate(): Murray-Clay et al. (2009, Eq. 6) print the Black rate ``7.5e-19 n_e n_H exp(-118348 K / T)`` erg cm^-3 s^-1. The three-level system uses effective collision strengths frozen at 1e4 K and carries no cascades, - while the Black fit carries both, so the two agree only at order unity - (the measured ratio runs from about 0.5 at 1e4 K to 0.3 at 3e4 K). The - bracket catches transcription errors, in the constant and in the + while the Black fit carries both, so the two agree only at order unity. + The bracket catches transcription errors in the constant and in the exponential activation, and nothing finer. """ pref, tscale = LYA_BLACK @@ -237,10 +236,9 @@ def test_line_cooling_coronal_limit_absolute_normalization(): ground state radiates before it is deexcited, so the cooling reduces to ``sum over transitions of dE k_lu n_e n_tot`` with the Maxwellian collisional rate coefficient ``k_lu = Upsilon (8.629e-6 / (g_l sqrt(T))) - exp(-dE / k_B T)``. That is evaluated here from the level data and the - constants rather than by calling the function, so the prefactor and the - statistical weights are pinned rather than only the shape. Without this - the whole channel could be scaled by any factor with the suite green. + exp(-dE / k_B T)``, evaluated here from the level data and the + constants rather than by calling the function. The shape tests are blind + to an overall factor, so this pins the prefactor and the weights. """ T, n_tot = 8000.0, 1.0e6 data = THREE_LEVEL['O'] @@ -269,15 +267,14 @@ def test_recombination_cooling_coefficient(): The channel is ``Q = n_e n_+ alpha_B (3/2) k_B T``, and the 3/2 is the mean thermal energy carried off by the recombining electron. Pinned against a hand evaluation, since the factor is the whole content of the - term and doubling it doubled the channel with the suite green. + term; a doubled factor is excluded explicitly. """ T = 1.0e4 # The published coefficient at 1e4 K, which the term is built on. assert alpha_case_b('H', T) == pytest.approx(2.7e-13, rel=1e-9, abs=0.0) - # The balance's own term, rebuilt from the quantities it reports. The - # module works in cgs internally, so the number density converts from - # m^-3 at the boundary and the square of that conversion is where a - # units slip would hide. + # The balance's own term, rebuilt from what it reports. The module works + # in cgs, so the m^-3 to cm^-3 conversion enters squared, which is where + # a units slip would hide. base = _base(n_si=1.0e18, vmr={'H': 1.0}) _r, det = balance_at(T, base, {'H': 1.0}, 1.0e2) n_cgs = base['n'] * 1e-6 @@ -290,11 +287,9 @@ def test_recombination_cooling_coefficient(): assert det['parts']['recombination'] != pytest.approx( 2.0 * expected, rel=0.01, abs=0.0 ) - # Quadratic in the electron density, not in the total density: doubling - # the gas density raises the term by less than four, because the - # ionization fraction falls as recombination speeds up. The identity - # above is what pins the coefficient; this pins that the term is built - # on the electron density and not on the neutral one. + # Quadratic in the electron density, not the total: doubling the gas + # density raises the term by less than four because the ionization + # fraction falls, which pins that the term is built on electrons. dense = _base(n_si=2.0e18, vmr={'H': 1.0}) _r2, det2 = balance_at(T, dense, {'H': 1.0}, 1.0e2) ratio = det2['parts']['recombination'] / det['parts']['recombination'] diff --git a/tests/test_tutorial_track.py b/tests/test_tutorial_track.py index a3c06f7f..3fff3951 100644 --- a/tests/test_tutorial_track.py +++ b/tests/test_tutorial_track.py @@ -2,10 +2,8 @@ The dispatcher tutorial closes on a track dispatched along a real MORS stellar history, which reads the Spada grid under ``FWL_DATA``. The unit and -smoke tier does not download that data, so the snippet is executed here -instead, where the nightly workflow has it: the same character-for-character -comparison the smoke tier applies to the other eighteen output blocks, on the -one block it cannot run. +smoke tier does not download that data, so this block's verbatim +comparison runs here, where the nightly workflow has it. The invariant under test: @@ -37,9 +35,8 @@ def test_tutorial_stellar_track_prints_what_the_page_quotes(monkeypatch): Runs the whole page in order so the track inherits the namespace the earlier snippets build, then compares the track block's output against - the page. The smoke tier covers the other blocks; this one exists because - the stellar lookup needs reference data that tier does not fetch, and - mocking the lookup would compare against numbers the page does not quote. + the page. Mocking the lookup would compare against numbers the page does + not quote. """ monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[1])) namespace: dict = {} From 77afc4f6fc9e0334794acbc4290f5006d06cd0f2 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:00:19 +0200 Subject: [PATCH 100/113] Quote the residual gap at its retargeted state The retargeted past-gate state puts the luminosity cap a factor of 102 above the XUV rate, so the test's docstring and comment say two decades rather than nearly two. --- tests/test_dispatcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index c251c32d..a901c92c 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -670,7 +670,7 @@ def test_residual_setting_admits_the_post_gate_candidate(): Past the activation gate the candidate is reported but, by default, does not compete: on a contracted 3 Earth-mass hydrogen envelope the - luminosity cap sits nearly two decades above the XUV rate, which the + luminosity cap sits two decades above the XUV rate, which the default dispatches with ``competes`` false. Admitted, the candidate dispatches as ``boiloff`` with ``bolometric_residual`` and ``luminosity_capped`` raised, so the modes differ by those two decades @@ -690,7 +690,7 @@ def test_residual_setting_admits_the_post_gate_candidate(): assert bolo_off['residual_mode'] == 'off' assert bolo_off['competes'] is False # The candidate is reported in full even though it did not compete, and - # it is the luminosity cap that would have won by nearly two decades. + # it is the luminosity cap that would have won by two decades. assert bolo_off['rate_kg_s'] == pytest.approx( bolo_off['mdot_luminosity'], rel=1e-12, abs=0.0 ) From c28a5d2397424aca10275259e5338fe4f488c715 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:01:14 +0200 Subject: [PATCH 101/113] Format the modules and tests the branch adds The files this branch creates now pass ruff format; the three existing modules it edits keep their current layout so the diff stays on the lines it changes. --- src/zephyrus/hydrodynamic.py | 4 +-- src/zephyrus/profiles.py | 4 ++- tests/test_atomic_data.py | 4 ++- tests/test_boiloff.py | 20 +++++++----- tests/test_diagnostics.py | 12 ++++--- tests/test_diffusion.py | 61 ++++++++++++++++++++++++++++++++---- tests/test_dispatcher.py | 23 +++++++++++--- tests/test_hydrodynamic.py | 8 +++-- tests/test_hydrostatic.py | 8 +++-- tests/test_knudsen.py | 4 ++- tests/test_profiles.py | 16 ++++------ tests/test_thermostat.py | 4 +-- 12 files changed, 121 insertions(+), 47 deletions(-) diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index 3703c72c..c5bbb5a6 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -63,9 +63,7 @@ def k_tide(xi: float) -> float: fills its lobe and needs the overflow treatment. """ if not xi > 1.0: - raise ValueError( - f'k_tide is defined for xi > 1 and has a double root at 1, got {xi!r}' - ) + raise ValueError(f'k_tide is defined for xi > 1 and has a double root at 1, got {xi!r}') return 1.0 - 3.0 / (2.0 * xi) + 1.0 / (2.0 * xi**3) diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index 3beb6c90..e2611ad4 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -84,7 +84,9 @@ def validate(self) -> None: if np.any(arr < -VMR_NOISE_FLOOR): raise ValueError(f'vmr[{sp}] is negative beyond solver noise') if self.vmr: - total = sum(np.clip(np.asarray(x, dtype=float), 0.0, None) for x in self.vmr.values()) + total = sum( + np.clip(np.asarray(x, dtype=float), 0.0, None) for x in self.vmr.values() + ) if np.any(np.asarray(total) <= 0.0): raise ValueError('every level needs at least one species present') diff --git a/tests/test_atomic_data.py b/tests/test_atomic_data.py index a7c1df93..0f425565 100644 --- a/tests/test_atomic_data.py +++ b/tests/test_atomic_data.py @@ -112,7 +112,9 @@ def test_case_b_coefficients_and_temperature_scaling(): for el in ('H', 'He', 'C', 'N', 'O'): ratio = alpha_case_b(el, 2.0e4) / alpha_case_b(el, 1.0e4) assert ratio == pytest.approx(2.0**-0.9, rel=1e-12, abs=0.0) - assert alpha_case_b('Xe', 8000.0) == pytest.approx(alpha_case_b('O', 8000.0), rel=1e-12, abs=0.0) + assert alpha_case_b('Xe', 8000.0) == pytest.approx( + alpha_case_b('O', 8000.0), rel=1e-12, abs=0.0 + ) # Scale guard: all case B values live in the 1e-13 decade at 1e4 K. for el in ('He', 'C', 'N', 'O'): assert 5e-14 < alpha_case_b(el, 1.0e4) < 5e-13 diff --git a/tests/test_boiloff.py b/tests/test_boiloff.py index 2af873a4..8192cea1 100644 --- a/tests/test_boiloff.py +++ b/tests/test_boiloff.py @@ -156,11 +156,15 @@ def test_bondi_cap_is_misener_eq10_at_the_wind_temperature(): mu, r_l = launch['mmw'], launch['r'] c_s = math.sqrt(kb * T_w / mu) r_s = G * M_p / (2.0 * c_s**2) - expected = 4.0 * math.pi * r_s**2 * c_s * launch['rho'] * math.exp(2.0 - 2.0 * r_s / r_l) + expected = ( + 4.0 * math.pi * r_s**2 * c_s * launch['rho'] * math.exp(2.0 - 2.0 * r_s / r_l) + ) assert det['mdot_bondi'] == pytest.approx(expected, rel=1e-12, abs=0.0) c_eq = math.sqrt(kb * T_eq / mu) r_eq = G * M_p / (2.0 * c_eq**2) - at_teq = 4.0 * math.pi * r_eq**2 * c_eq * launch['rho'] * math.exp(2.0 - 2.0 * r_eq / r_l) + at_teq = ( + 4.0 * math.pi * r_eq**2 * c_eq * launch['rho'] * math.exp(2.0 - 2.0 * r_eq / r_l) + ) lam_launch = G * M_p * mu / (kb * T_eq * r_l) assert at_teq / expected == pytest.approx( 2.0**-0.375 * math.exp(lam_launch * (2.0**0.25 - 1.0)), rel=1e-12, abs=0.0 @@ -240,13 +244,15 @@ def test_luminosity_cap_carries_the_tidal_barrier_reduction(): assert det_flat['k_tide'] == pytest.approx(1.0) assert det_tidal['mdot_luminosity'] > det_flat['mdot_luminosity'] assert det_tidal['mdot_luminosity'] / det_flat['mdot_luminosity'] == pytest.approx( - 1.92, rel=0.01 - , abs=0.0) + 1.92, rel=0.01, abs=0.0 + ) # K = 1 is the untidal form, and the cap still bounds the rate. _rate_one, det_one = bolometric_candidate( *args, lambda_gate=30.0, lambda_crit=20.0, k_tide=1.0 ) - assert det_one['mdot_luminosity'] == pytest.approx(det_flat['mdot_luminosity'], rel=1e-12, abs=0.0) + assert det_one['mdot_luminosity'] == pytest.approx( + det_flat['mdot_luminosity'], rel=1e-12, abs=0.0 + ) assert _rate_tidal <= det_tidal['mdot_luminosity'] * (1 + 1e-12) @@ -346,9 +352,7 @@ def test_launch_level_reports_its_own_optical_depth(): Me, 1.5 * Re, 1000.0, 0.01, launch, 1.0, 5.0, 20.0, k_tide=1.0 ) # The identity, not a re-derivation: pressure and gravity at the level. - assert det['tau_launch'] == pytest.approx( - 0.01 * launch['p'] / g_launch, rel=1e-12, abs=0.0 - ) + assert det['tau_launch'] == pytest.approx(0.01 * launch['p'] / g_launch, rel=1e-12, abs=0.0) assert det['p_launch'] == pytest.approx(float(launch['p']), rel=1e-12, abs=0.0) # This level is nowhere near its own photosphere at this opacity, which # is the finding the diagnostic makes visible rather than hiding. diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 86f19a30..c99dfd1f 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -123,8 +123,8 @@ def test_erkaev_critical_temperature_normalization(): assert erkaev_tc(Mjup, Rjup, 3.0 * Rjup, 2.5 * Rjup) == pytest.approx(0.0, abs=0.0) # Mass scaling is linear: twice the mass doubles the barrier. assert erkaev_tc(2 * Mjup, Rjup, 1.0 * Rjup, 1e3 * Rjup) == pytest.approx( - 2 * t_far, rel=1e-2 - , abs=0.0) + 2 * t_far, rel=1e-2, abs=0.0 + ) def test_along_profile_fluid_check_reports_truncation(): @@ -219,8 +219,12 @@ def test_documentation_constants_are_complete(): """ assert MURRAY_CLAY_EXPONENTS['RR_numerical'] == pytest.approx(0.6, rel=1e-12, abs=0.0) assert MURRAY_CLAY_EXPONENTS['EL_numerical'] == pytest.approx(0.9, rel=1e-12, abs=0.0) - assert MURRAY_CLAY_EXPONENTS['RR_analytic_inherited'] == pytest.approx(0.5, rel=1e-12, abs=0.0) - assert MURRAY_CLAY_EXPONENTS['EL_analytic_inherited'] == pytest.approx(1.0, rel=1e-12, abs=0.0) + assert MURRAY_CLAY_EXPONENTS['RR_analytic_inherited'] == pytest.approx( + 0.5, rel=1e-12, abs=0.0 + ) + assert MURRAY_CLAY_EXPONENTS['EL_analytic_inherited'] == pytest.approx( + 1.0, rel=1e-12, abs=0.0 + ) assert DAYSIDE_FACTORS['energy_limited'] == pytest.approx(0.26, rel=1e-12, abs=0.0) assert DAYSIDE_FACTORS['recombination_limited'] == pytest.approx(0.31, rel=1e-12, abs=0.0) # The reduction factors are genuine reductions. diff --git a/tests/test_diffusion.py b/tests/test_diffusion.py index 2ec7b02b..68835573 100644 --- a/tests/test_diffusion.py +++ b/tests/test_diffusion.py @@ -274,14 +274,63 @@ def test_b_mixture_blancs_law_limits(): # copied from ``proteus.utils.constants`` (``gas_list``, ``element_list``) # rather than imported, because ZEPHYRUS must not depend on PROTEUS. PROTEUS_GAS_LIST = ( - 'H2O', 'CO2', 'O2', 'H2', 'CH4', 'CO', 'N2', 'NH3', 'S2', 'SO2', 'H2S', - 'He', 'Ne', 'Ar', 'Kr', 'Xe', - 'SiO', 'SiO2', 'Si', 'Na', 'K', 'Ti', 'TiO', 'TiO2', 'Mg', 'MgO', 'Al', - 'HAlO2', 'SiH', 'SiH4', 'Fe', 'FeO', 'FeO2H2', 'CaO', 'NaOH', 'Ca', 'KOH', + 'H2O', + 'CO2', + 'O2', + 'H2', + 'CH4', + 'CO', + 'N2', + 'NH3', + 'S2', + 'SO2', + 'H2S', + 'He', + 'Ne', + 'Ar', + 'Kr', + 'Xe', + 'SiO', + 'SiO2', + 'Si', + 'Na', + 'K', + 'Ti', + 'TiO', + 'TiO2', + 'Mg', + 'MgO', + 'Al', + 'HAlO2', + 'SiH', + 'SiH4', + 'Fe', + 'FeO', + 'FeO2H2', + 'CaO', + 'NaOH', + 'Ca', + 'KOH', ) PROTEUS_ELEMENT_LIST = ( - 'H', 'O', 'C', 'N', 'S', 'Si', 'Mg', 'Fe', 'Na', 'Al', 'Ti', 'Ca', 'K', - 'He', 'Ne', 'Ar', 'Kr', 'Xe', + 'H', + 'O', + 'C', + 'N', + 'S', + 'Si', + 'Mg', + 'Fe', + 'Na', + 'Al', + 'Ti', + 'Ca', + 'K', + 'He', + 'Ne', + 'Ar', + 'Kr', + 'Xe', ) # Products an atmospheric chemistry network emits that are in neither list. CHEMISTRY_EXTRAS = ('NO', 'O3', 'C2H6', 'SO', 'PH3', 'HCN', 'OH') diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index a901c92c..92c11da0 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -285,7 +285,9 @@ def test_roche_screen_renames_without_changing_the_rate(): def at(a): return dispatch( - _inputs(3 * Me, 1.7 * Re, 1000.0, comp, F_xuv=0.1, a=a, F_int=0.05, settings=admitted) + _inputs( + 3 * Me, 1.7 * Re, 1000.0, comp, F_xuv=0.1, a=a, F_int=0.05, settings=admitted + ) ) lo, hi = 0.078 * AU, 0.3 * AU @@ -796,11 +798,17 @@ def test_bolometric_diagnostics_keys_match_the_results_page(): from pathlib import Path page = Path(__file__).resolve().parents[1] / 'docs' / 'Reference' / 'results.md' - row = next(line for line in page.read_text().splitlines() if line.startswith('| `bolometric` |')) + row = next( + line for line in page.read_text().splitlines() if line.startswith('| `bolometric` |') + ) documented = set(re.findall(r'`([A-Za-z_]+)`', row.split('|')[2])) assert len(documented) >= 15 - past = dispatch(_inputs(3 * Me, 2 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU)) - below = dispatch(_inputs(Me, 1.5 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU)) + past = dispatch( + _inputs(3 * Me, 2 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.12 * AU) + ) + below = dispatch( + _inputs(Me, 1.5 * Re, 1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=10.0, a=0.0775 * AU) + ) for result in (past, below): assert set(result.diagnostics['bolometric']) == documented @@ -1248,7 +1256,12 @@ def test_one_exobase_temperature_per_call(): a=0.0775, ), dict( - M_p=3 * Me, R_p=1.7 * Re, T_eq=1000.0, comp={'H2': 0.9, 'He': 0.1}, F_xuv=0.1, a=0.30 + M_p=3 * Me, + R_p=1.7 * Re, + T_eq=1000.0, + comp={'H2': 0.9, 'He': 0.1}, + F_xuv=0.1, + a=0.30, ), ), ( diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index fb832ec7..fb31ae63 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -175,12 +175,16 @@ def test_rr_barometric_factor_separates_the_two_rr_regimes(): """ rr = rr_chain(10.0 * Me, 10.0, 2.0 * Re, 1.0e4, {'C': 1.0 / 3.0, 'O': 2.0 / 3.0}) assert rr['subcritical'] is False - assert rr['barometric_factor'] == pytest.approx(math.exp(1.5 - rr['lambda_b']), rel=1e-12, abs=0.0) + assert rr['barometric_factor'] == pytest.approx( + math.exp(1.5 - rr['lambda_b']), rel=1e-12, abs=0.0 + ) # Strongly bound: several decades of suppression, so the sonic-point # density is far below the base density. assert rr['lambda_b'] > 4.0 assert rr['barometric_factor'] < 1.0e-2 - assert rr['rho_s'] == pytest.approx(rr['rho_base'] * rr['barometric_factor'], rel=1e-12, abs=0.0) + assert rr['rho_s'] == pytest.approx( + rr['rho_base'] * rr['barometric_factor'], rel=1e-12, abs=0.0 + ) rr_h = rr_chain(0.7 * Mjup, 5.0, 2.0 * Rjup, 1.0e4, {'H': 1.0}) assert not rr_h['subcritical'] diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index de9f4ca6..1ea478d5 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -186,7 +186,9 @@ def test_escape_temperature_identities_and_gate(): _per, det = hydrostatic_rates(prof, M_MARS, 300.0) m = det['m_bar'] r = det['r_exo'] - assert det['T_esc_neutral'] == pytest.approx(G * M_MARS * m / (2 * kb * r), rel=1e-12, abs=0.0) + assert det['T_esc_neutral'] == pytest.approx( + G * M_MARS * m / (2 * kb * r), rel=1e-12, abs=0.0 + ) assert det['T_esc_plasma'] == pytest.approx(det['T_esc_neutral'] / 2.0, rel=1e-12, abs=0.0) det2 = dict(det, T_esc_neutral=500.0, T_esc_plasma=250.0) # Gate thresholds: neutral at 250 K, plasma at 125 K exobase temperature. @@ -220,8 +222,8 @@ def test_element_mapping_conserves_mass_and_dominant_bypass(): # The CO2 mass rate splits onto C and O in stoichiometric proportion. rate_co2 = det['per_species_rate']['CO2'] assert per_el['C'] + per_el['O'] + per_el['H'] == pytest.approx( - rate_co2 + det['per_species_rate']['H'], rel=1e-9 - , abs=0.0) + rate_co2 + det['per_species_rate']['H'], rel=1e-9, abs=0.0 + ) def test_extension_truncates_when_unbound_and_flags(): diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index daa41efe..9f90b92c 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -181,7 +181,9 @@ def test_kn_sonic_equals_mfp_over_scale_height(): vmr = {'N': 1.0} n, r, T = 1e14, 1e7, 8000.0 kn, sigma, prov = kn_sonic(n, r, vmr, T, gamma=1.0) - assert kn == pytest.approx(mean_free_path(sigma, n) / sonic_scale_height(r, 1.0), rel=1e-12, abs=0.0) + assert kn == pytest.approx( + mean_free_path(sigma, n) / sonic_scale_height(r, 1.0), rel=1e-12, abs=0.0 + ) assert prov == {'N': 'laricchiuta'} # Rarefied edge: eight decades less dense means eight decades larger Kn. kn_thin, _, _ = kn_sonic(n * 1e-8, r, vmr, T) diff --git a/tests/test_profiles.py b/tests/test_profiles.py index 49127fdd..a42eb7d2 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -216,7 +216,9 @@ def test_lopez_base_pressure_is_the_nanobar_level(): # Scale guard: eighty decades of headroom is a unit slip, five is right. assert p_base < 2000.0 * 1e-4 # Linearity in gravity: doubling g doubles the base pressure. - assert lopez_base_pressure(1.008 * amu, 2 * g) == pytest.approx(2 * p_base, rel=1e-12, abs=0.0) + assert lopez_base_pressure(1.008 * amu, 2 * g) == pytest.approx( + 2 * p_base, rel=1e-12, abs=0.0 + ) # The proton-mass convention differs from the atomic-weight convention # by under a percent; both stay inside the pinned band. assert lopez_base_pressure(m_p, g) == pytest.approx(p_base, rel=0.01, abs=0.0) @@ -357,9 +359,7 @@ def compute_mass_loss_parameters(self, m, r, t): # The extrapolation is the isothermal solution, which saturates rather # than falling without bound: the reported distance cannot exceed the # top-level Jeans parameter in decades. - lam_top = ( - G * 5 * Me * float(prof.mmw[-1]) / (kb * float(prof.T[-1]) * float(prof.r[-1])) - ) + lam_top = G * 5 * Me * float(prof.mmw[-1]) / (kb * float(prof.T[-1]) * float(prof.r[-1])) assert flags_h['base_clamp_decades'] <= lam_top / math.log(10.0) + 1e-9 @@ -394,12 +394,8 @@ def test_validate_rejects_non_finite_and_negative_entries(): with pytest.raises(ValueError, match='non-finite'): Profile(**{**base, 'vmr': {'CO2': np.array([1.0, 1.0, np.nan, 1.0, 1.0])}}).validate() with pytest.raises(ValueError, match='negative beyond solver noise'): - Profile( - **{**base, 'vmr': {'CO2': np.full(n, 1.5), 'H2': np.full(n, -0.5)}} - ).validate() + Profile(**{**base, 'vmr': {'CO2': np.full(n, 1.5), 'H2': np.full(n, -0.5)}}).validate() with pytest.raises(ValueError, match='at least one species'): Profile(**{**base, 'vmr': {'CO2': np.zeros(n), 'H2': np.zeros(n)}}).validate() # Solver noise passes, and the consumers ignore it. - Profile( - **{**base, 'vmr': {'CO2': np.full(n, 1.0), 'H2': np.full(n, -1e-16)}} - ).validate() + Profile(**{**base, 'vmr': {'CO2': np.full(n, 1.0), 'H2': np.full(n, -1e-16)}}).validate() diff --git a/tests/test_thermostat.py b/tests/test_thermostat.py index 90dbf108..08038cb8 100644 --- a/tests/test_thermostat.py +++ b/tests/test_thermostat.py @@ -284,9 +284,7 @@ def test_recombination_cooling_coefficient(): # Discrimination: the 3/2 is the mean energy carried off per # recombination and is the whole content of the coefficient, so the same # term with a 3 instead is a different number by exactly a factor two. - assert det['parts']['recombination'] != pytest.approx( - 2.0 * expected, rel=0.01, abs=0.0 - ) + assert det['parts']['recombination'] != pytest.approx(2.0 * expected, rel=0.01, abs=0.0) # Quadratic in the electron density, not the total: doubling the gas # density raises the term by less than four because the ionization # fraction falls, which pins that the term is built on electrons. From 986452020fdd615fead0065659c9b636cd5b4a88 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:15:44 +0200 Subject: [PATCH 102/113] Cap the XUV wind at the photon count The hydrodynamic candidate is now min(EL, RR, PL), where PL is the photon-limited rate of Owen and Alvarez (2016) Eq. (10) generalized from pure hydrogen: at most one particle, of the wind's mean mass per ion, leaves per intercepted ionizing photon at the front energy the recombination chain already uses. It is evaluated on the energy-limited rate's own disk, so the two share one photon budget and cross at the efficiency G M_p K m_ion / (e_ion R_p), which the diagnostics report; on shallow wells that threshold sits below the default efficiency (0.034 for a one Earth-mass hydrogen and helium envelope), and the new label hydrodynamic:PL names a win. The photon_limit setting removes the cap and recovers min(EL, RR). Tests pin the closed form and the crossover, continuity of the dispatched rate across it, and the cap on every XUV wind of the random-state sweep; the docs state that the count is an estimate that real flows can exceed. --- docs/Explanations/fractionation.md | 2 +- docs/Explanations/limitations.md | 1 + docs/Explanations/model.md | 7 +-- docs/Explanations/regimes.md | 6 ++- docs/Reference/parameters.md | 1 + docs/Reference/results.md | 7 +-- docs/Tutorials/dispatch.md | 16 +++--- docs/Validation/hydrodynamic.md | 5 +- examples/demo_dispatcher/demo_dispatcher.py | 2 + src/zephyrus/dispatcher.py | 21 ++++++-- src/zephyrus/hydrodynamic.py | 36 ++++++++++++-- tests/test_dispatcher.py | 54 +++++++++++++++++++-- tests/test_hydrodynamic.py | 46 ++++++++++++++++-- 13 files changed, 167 insertions(+), 37 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index 387bfe38..73f71403 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -26,7 +26,7 @@ The closure evaluates at the XUV wind base on the atomized composition (molecule | Branch that produced the rate | Per-species split | |---|---| -| `hydrodynamic:EL`, `hydrodynamic:RR` | The N-species closure at the wind base (this page); with fractionation disabled, reservoir mass fractions | +| `hydrodynamic:EL`, `hydrodynamic:RR`, `hydrodynamic:PL` | The N-species closure at the wind base (this page); with fractionation disabled, reservoir mass fractions | | `boiloff` | Reservoir mass fractions (no fractionation: the flow is fast and bulk) | | `hydrostatic` | Natively per-species: each species carries its own Jeans flux and supply cap (see [escape regimes](regimes.md)) | diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index df1338df..c7fc9ea0 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,6 +23,7 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. +- **The photon-limited cap is an estimate, not a bound.** The count behind it, one particle per intercepted ionizing photon (Owen & Alvarez 2016, Eq. 10), limits primary ionizations rather than mass loss: neutrals heated by collisions escape too, and X-ray photoelectrons ionize more than once, so a real flow can exceed it. The source never simulates the regime, and the one three-dimensional plane-parallel calculation with numbers to compare sits 1.3 to 2.4 times above the count (Debrecht et al. 2019, MNRAS 483, 1481). Where the cap binds the rate may therefore be low by a factor of that order. It also scales inversely with the photon energy per ionization, taken as the front energy (20 eV for a hydrogen front), and the plausible range of 13.6 to 40 eV spans a factor of 2.9. `photon_limit = False` recovers the uncapped rate for comparison. - **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two things the primary computes and this module does not: the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds. Under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. - **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. That is a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, the module's own estimate of that transfer is `diagnostics['nozzle']['rate_kg_s']` and it is below the dispatched rate. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 056cefe7..86978b31 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -7,13 +7,14 @@ Mass loss happens through two physically distinct channels, and ZEPHYRUS models 1. Continuous thermal escape: the steady outflow or evaporation of the upper atmosphere, driven by stellar irradiation and by the planet's own heat. This is one framework with several regimes, described below. 2. Impact-driven erosion: the impulsive removal of atmosphere by a single giant collision during accretion, a separate channel with its own prescription (see [giant impacts](impacts.md)). -## The continuous channel: one framework, five regimes +## The continuous channel: one framework, six regimes -Which physics carries the continuous loss depends on how tightly the atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are. Applying a prescription outside its regime gives rates that are wrong by orders of magnitude, so ZEPHYRUS classifies each atmospheric state before choosing a rate. Every state receives one of five regime labels: +Which physics carries the continuous loss depends on how tightly the atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are. Applying a prescription outside its regime gives rates that are wrong by orders of magnitude, so ZEPHYRUS classifies each atmospheric state before choosing a rate. Every state receives one of six regime labels: - `boiloff`: the atmosphere is so weakly bound that it flows out on the planet's own thermal energy, before stellar XUV heating matters. Typical of young, hot, hydrogen-rich planets fresh out of the nebula. - `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). - `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). +- `hydrodynamic:PL`: the same fluid wind in a well shallow enough that each ionizing photon carries more energy than lifting one particle costs, so the rate is set by the number of photons rather than their energy (the photon-limited rate of Owen & Alvarez 2016 wins). - `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. - `roche_overflow`: either the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017) outruns every bound candidate and is dispatched as the rate, or the flow region reaches the planet's Hill sphere and the label sits on top of whichever regime produced the rate, which is then a lower limit. `diagnostics['roche']['rate_branch']` says which reading applies. @@ -24,7 +25,7 @@ flowchart TD IN(["Planet state + atmosphere profile"]) --> Q1{"Is the atmosphere inflated
      beyond its sonic radius?
      (Jeans parameter below threshold)"} Q1 -- yes --> BO["BOIL-OFF
      bolometric wind"] Q1 -- no --> Q2{"Is an XUV wind collisional
      at its sonic point?
      (Knudsen number below threshold)"} - Q2 -- yes --> HD["HYDRODYNAMIC WIND
      label EL or RR,
      whichever rate is smaller"] + Q2 -- yes --> HD["HYDRODYNAMIC WIND
      label EL, RR, or PL,
      whichever rate is smallest"] Q2 -- no --> HS["HYDROSTATIC
      per-species Jeans escape"] BO --> Q3{"Does the flow reach
      the Hill sphere?"} HD --> Q3 diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index e7e2e39c..d708aaa7 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -21,7 +21,7 @@ flowchart TD Q1 -- no --> BASE["Wind base on the profile
      + thermostat wind temperature"] BASE --> HYD["Candidates:
      energy limited, recombination limited"] HYD --> Q2{"Sonic-point Knudsen
      below threshold?"} - Q2 -- yes --> HD["HYDRODYNAMIC
      min of the two, winner names
      EL or RR + fractionation"] + Q2 -- yes --> HD["HYDRODYNAMIC
      min of the three, winner names
      EL, RR, or PL + fractionation"] Q2 -- no --> Q3{"Exobase hotter than half
      the escape temperature?"} Q3 -- yes --> HD Q3 -- no --> HS["HYDROSTATIC
      per-species Jeans
      + diffusion supply cap"] @@ -88,7 +88,7 @@ with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition $$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ -The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR})$ and the winner names the sub-label, `hydrodynamic:EL` or `hydrodynamic:RR`. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow, each intercepted ionizing photon ionizes one particle, which the flow carries off, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the cap. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch @@ -203,3 +203,5 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^salz]: Salz, M., Schneider, P. C., Czesla, S., & Schmitt, J. H. M. M. (2016). Energy-limited escape revised. The transition from strong planetary winds to stable thermospheres. *Astronomy & Astrophysics, 585*, L2. https://doi.org/10.1051/0004-6361/201527042 [^oj12]: Owen, J. E., & Jackson, A. P. (2012). Planetary evaporation by UV and X-ray radiation: basic hydrodynamics. *Monthly Notices of the Royal Astronomical Society, 425*(4), 2931. https://doi.org/10.1111/j.1365-2966.2012.21481.x + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index ccdea216..98e84257 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -114,6 +114,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | +| `photon_limit` | `True` | `True`, `False` | Cap the XUV wind at one particle per intercepted ionizing photon, the photon-limited rate of Owen & Alvarez (2016) Eq. (10), on the energy-limited rate's disk. It binds where the efficiency exceeds `efficiency_photon_limit`, on shallow wells. `False` restores min(EL, RR), which is what most energy-limited codes in the literature compute. | | `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | | `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default, following Tang et al.; the price is a jump in the dispatched rate at the activation gate, measured on the [escape regimes](../Explanations/regimes.md) page together with the dispute and the band past the gate where the candidate would win. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 1bc51f69..a133fc51 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -10,7 +10,7 @@ The [parameter reference](parameters.md) documents what goes into `zephyrus.disp | Field | Type | What it guarantees | |---|---|---| -| `regime` | str | One of the five labels below. Always set. | +| `regime` | str | One of the six labels below. Always set. | | `mdot` | float | Bulk mass-loss rate in kg s⁻¹, finite and non-negative. | | `per_species` | dict | Element symbol to rate in kg s⁻¹, non-negative, summing to `mdot` at machine precision. | | `flags` | dict | Everything that clamped, fell back, or was screened. Empty when there is nothing to report. | @@ -18,13 +18,14 @@ The [parameter reference](parameters.md) documents what goes into `zephyrus.disp Every physically posed state returns a result. A `ValueError` means the state or the settings are malformed, not that the physics failed: a non-positive mass, radius, stellar mass, orbital distance, equilibrium temperature, bolometric flux, interior flux, or opacity, a negative XUV flux, an eccentricity outside $[0, 1)$, a profile whose pressure does not decrease or whose radius does not increase with index, fewer than three profile levels, mixing-ratio arrays of the wrong length, an unsupported option string, or all four cooling channels disabled at once. -## The five labels +## The six labels | Label | Physics | Rate | |---|---|---| | `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped; past the activation gate the same machinery is luminosity-capped and dispatched only when the `residual_mode` setting admits it. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | +| `hydrodynamic:PL` | The same wind in a shallow well, where one particle per intercepted ionizing photon is fewer than the energy budget would lift. | The photon-limited rate of Owen & Alvarez (2016) Eq. (10); binds when the efficiency exceeds `efficiency_photon_limit`. An estimate rather than a bound, and possibly low where it binds (see the limitations page). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | | `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate, and a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, `diagnostics['nozzle']['rate_kg_s']` is below the dispatched rate. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | @@ -103,7 +104,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | Group | Key contents | What it answers | |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | -| `hydrodynamic` | `mdot_el`, `mdot_rr`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | Both wind candidates, which one won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | +| `hydrodynamic` | `mdot_el`, `mdot_rr`, `mdot_pl`, `photon_limit`, `efficiency_photon_limit`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | The three wind candidates (the photon-limited one infinite when `photon_limit` is off), the efficiency above which the photon count binds, which candidate won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `PL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | | `bolometric` | `T_wind`, `c_s`, `R_B`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `binding_cap`, `k_tide`, `active`, `competes`, `residual_mode`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full, whether or not it was dispatched. `active` is true when the activation gate is open, that is, when the restricted Jeans parameter sits below `lambda_crit`. `competes` is true when the candidate took part in the final comparison: always while `active`, and past the gate only when `residual_mode` admits it, so a candidate rate above the dispatched one beside `competes` false was never a contender rather than a loser. Neither says the branch was dispatched; the label does. `rate_kg_s` is the minimum over the caps in force: the Parker rate and the Bondi cap while the gate is open, and past it also the interior-luminosity cap `mdot_luminosity`, so past the gate it is the core-powered rate whether or not it competes. `binding_cap` names which of `'parker'`, `'bondi'`, or `'luminosity'` set it; `mdot_parker` and `mdot_bondi` answer the uncapped question. `R_B` is the Bondi radius at the wind temperature, which is the sonic radius `R_sonic` of the isothermal wind. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index e9eabdfd..5907bdc1 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -156,7 +156,7 @@ hydrodynamic:EL ['base_level', 'bolometric', 'closure', 'documentation', 'erkaev_tc_K', 'fluid_check', 'guo_triple', 'hydrodynamic', 'hydrostatic', 'johnson_q', 'knudsen', 'lambda_gate', 'nozzle', 'potential_screens', 'rate_floor', 'roche', 'self_consistency', 'tang_timescale', 'thermostat'] ``` -Five fields, and each one guarantees something. `regime` is one of five labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. +Five fields, and each one guarantees something. `regime` is one of six labels. `mdot` is a non-negative bulk rate in kg s⁻¹, here $2.35 \times 10^{6}$ kg s⁻¹, or $7.4 \times 10^{13}$ kg yr⁻¹. `per_species` gives element rates that sum to `mdot` at machine precision, which is what a coupled run relies on when it debits element inventories, and which is worth asserting in your own code. `flags` records every clamp, fallback, and screen that fired; an empty dictionary means nothing needed reporting. `diagnostics` is the container of step 5. Every physically posed state returns a result. Exceptions are reserved for malformed input, so a `ValueError` from `dispatch` means the state itself is wrong (a negative mass, an eccentricity of 1, a profile whose pressure does not decrease outward), not that the physics failed. @@ -288,13 +288,13 @@ print(noz['rate_full_orbit_kg_s'], noz['R_sonic_over_R_L1'], noz['rate_kg_s']) Output: ```text -hydrodynamic:EL 73002.71859264988 True +hydrodynamic:PL 44230.50499473552 True 0.817259936490472 False parker 8968244.133873517 674942040.3533882 0.9568936320693068 0.0 ``` -The XUV wind takes the rate at $7.3 \times 10^{4}$ kg s⁻¹. Its flow radius reaches 0.82 of the Hill radius, inside the lobe, so the screen stays quiet and of the overflow flags only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false. `binding_cap` says the Parker rate itself sets it: this close to the gate the closed-form wind has not yet shut off below the interior-luminosity cap, which here sits higher, at $1.5 \times 10^{7}$ kg s⁻¹. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $6.7 \times 10^{8}$ kg s⁻¹ as `rate_full_orbit_kg_s`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. +The XUV wind takes the rate at $4.4 \times 10^{4}$ kg s⁻¹, set by the photon count. Its flow radius reaches 0.82 of the Hill radius, inside the lobe, so the screen stays quiet and of the overflow flags only `near_roche` is raised, while the candidate that would have taken the rate two decades higher still sits in `diagnostics['bolometric']` with `competes` false. `binding_cap` says the Parker rate itself sets it: this close to the gate the closed-form wind has not yet shut off below the interior-luminosity cap, which here sits higher, at $1.5 \times 10^{7}$ kg s⁻¹. The tidally driven transfer through the inner Lagrange point is computed on every call and reports $6.7 \times 10^{8}$ kg s⁻¹ as `rate_full_orbit_kg_s`, but it competes only where the overflow description applies, and here the isothermal sonic radius sits just inside the L1 distance (`R_sonic_over_R_L1` reads 0.96), so a spherical wind chokes before the nozzle does and the candidate stands down: `rate_kg_s`, the rate the dispatcher actually competes, is zero. Back on the admitted state, the subflag is the part worth reading, and it is read against the Roche lobe rather than the Hill radius, because the lobe is the critical surface and sits about 0.70 of the way out to it. This atmosphere reaches 0.96 Hill radii, which is 1.36 lobe radii, so its own extent is past the lobe and the subflag is `dynamical`. Compare `puffy.diagnostics['roche']['r_atmosphere']` against `r_lobe` in `puffy.diagnostics['nozzle']` to see it. The other value, `no_transonic`, is the narrower case where the atmosphere stays inside its lobe and only the would-be sonic surface sits outside the Hill radius, and `neither` marks a state that carries the label on the rate crossing alone. On a tightly bound heavy atmosphere the label can fire on geometry alone with no rate behind it; the [troubleshooting guide](../How-to/troubleshooting.md) walks the four cases. @@ -498,7 +498,7 @@ A 3% shift, with the lighter element enriched, which is the right size for a wel ### The efficiency -Sweeping the energy-limited efficiency across its literature range moves the rate linearly and can move the sub-label: +Sweeping the energy-limited efficiency across its literature range moves the rate linearly until a cap takes over, and can move the sub-label: ```python for eps in (0.1, 0.3, 0.6): @@ -516,12 +516,12 @@ Output: ```text 0.1 hydrodynamic:EL 2347722.550685174 2347722.550685174 11494353.468961576 -0.3 hydrodynamic:EL 7043167.652055521 7043167.652055521 11494353.468961576 -0.6 hydrodynamic:RR 11494353.468961576 14086335.304111041 11494353.468961576 +0.3 hydrodynamic:PL 6136531.331966522 7043167.652055521 11494353.468961576 +0.6 hydrodynamic:PL 6136531.331966522 14086335.304111041 11494353.468961576 0.7908366641614278 ['caldiroli_out_of_box'] ``` -At 0.6 the energy-limited candidate overtakes the recombination-limited one and the label changes without the physics of the wind changing at all: the minimum switched hands, nothing else. The fitted-efficiency option returns 0.791 for this planet with `caldiroli_out_of_box` raised, because a one Earth-mass planet sits below the gravitational potential range the fit was made on[^caldiroli]. That is the guard working. Take the flag seriously rather than the number. +From 0.3 the photon count binds. Lifting one particle out of a one Earth-mass well costs about a quarter of an ionizing photon's energy, so above an efficiency of 0.26 (`efficiency_photon_limit` in the diagnostics) more energy per photon cannot remove more gas, and the rate stops at $6.1 \times 10^{6}$ kg s⁻¹ while the energy-limited candidate keeps growing[^owenalvarez]. The label changes without the physics of the wind changing at all: the minimum switched hands, nothing else. With `photon_limit = False` the rate would keep rising until the recombination-limited candidate took over at 0.6. The fitted-efficiency option returns 0.791 for this planet with `caldiroli_out_of_box` raised, because a one Earth-mass planet sits below the gravitational potential range the fit was made on[^caldiroli]. That is the guard working. Take the flag seriously rather than the number. ### One more, for evolutionary use @@ -633,3 +633,5 @@ And the consistency screen fires in the middle of the track, not at the ends, wh [^yelle]: Yelle, R. V. (2024). Diffusion limited escape of hydrogen from Mars. *Icarus, 416*, 116099. [^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 diff --git a/docs/Validation/hydrodynamic.md b/docs/Validation/hydrodynamic.md index 79854e94..6bc1408d 100644 --- a/docs/Validation/hydrodynamic.md +++ b/docs/Validation/hydrodynamic.md @@ -8,6 +8,7 @@ This page tracks the `@pytest.mark.reference_pinned` tests that anchor the hydro | `tests/test_hydrodynamic.py::test_caldiroli_fit_spot_values_and_flux_guard` | Caldiroli et al. (2022), A&A 663, A122, Appendix A.1 | Six spot evaluations across the validity box reproduce the fitted efficiency to 5% across three decades of collapse, and the complex-valued region below F_XUV/rho_p = $10^{2}$ (cgs) is rejected with a flag rather than evaluated. | | `tests/test_hydrodynamic.py::test_wind_mean_masses_against_lopez_pairs` | Lopez (2017), MNRAS 472, 245 (printed wind mean-mass pairs) | The generalized ionized-wind rule reproduces the printed steam pair (3, 6) in atomic mass units and the per-ion entry 1.3 of the printed H/He pair. The per-particle entry 0.62 of that pair is not reachable: the rule makes the per-ion mass exactly twice the per-particle mass, so 1.3 halves to 0.65, and the 4.6 percent gap is an inconsistency between the two printed entries rather than an error in the rule. The test pins 0.65 and asserts 0.62 is excluded, so a future tolerance cannot absorb the difference. | | `tests/test_hydrodynamic.py::test_murray_clay_fiducial_hot_jupiter_anchors` | Murray-Clay et al. (2009), ApJ 693, 23 (fiducial hot Jupiter) | The chain reproduces their base Jeans parameter 5.49 (5%), places the sonic point at lambda_b/2 planetary radii inside their stated 2 to 4, and lands their printed sonic-point Knudsen numbers ($10^{-4}$ and $10^{-5}$ at 450 and $5 \times 10^{5}$ erg cm^-2 s^-1) within a factor 3 using their Coulomb cross section. | +| `tests/test_hydrodynamic.py::test_photon_limited_rate_and_its_crossover_with_el` | Owen & Alvarez (2016), ApJ 816, 34, Eq. 10 (analytical limit) | The photon-limited rate is one particle per intercepted ionizing photon, linear in the flux and free of the planet mass, and on the energy-limited rate's own disk it crosses the energy-limited rate at the efficiency G M_p K m_ion / (e_ion R_p), on asymmetric inputs that move the crossover under a swapped radius or a missing tidal factor. | ## Notes @@ -15,6 +16,6 @@ Murray-Clay et al. fit their numerical models with flux exponents 0.6 (radiation ## Anchor type -Published benchmarks (printed tables, fits, and worked values). +Published benchmarks (printed tables, fits, and worked values) and one analytical limit (the photon-limited crossover). -Date of last comparison against the sources: 2026-08-20. +Date of last comparison against the sources: 2026-09-28. diff --git a/examples/demo_dispatcher/demo_dispatcher.py b/examples/demo_dispatcher/demo_dispatcher.py index a0427f38..225280f8 100644 --- a/examples/demo_dispatcher/demo_dispatcher.py +++ b/examples/demo_dispatcher/demo_dispatcher.py @@ -78,6 +78,7 @@ def brand_colors() -> dict: 'boiloff': '#E23D28', # the one hot mark on the figure 'hydrodynamic:EL': '#1B6FA8', 'hydrodynamic:RR': '#4FA3D9', + 'hydrodynamic:PL': '#0E4A73', 'hydrostatic': '#7A8894', 'roche_overflow': '#593E74', 'solar': '#C8860F', @@ -126,6 +127,7 @@ def _mono_family() -> str: 'boiloff': 'D', 'hydrodynamic:EL': 'o', 'hydrodynamic:RR': 's', + 'hydrodynamic:PL': 'v', 'hydrostatic': '^', 'roche_overflow': 'X', } diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index 05bebbcf..aa553d92 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -19,7 +19,7 @@ from zephyrus import nozzle as nz from zephyrus import thermostat as th from zephyrus.composition import atomize, mean_particle_mass -from zephyrus.constants import kb, m_p +from zephyrus.constants import G, ev2joule, kb, m_p from zephyrus.fractionation import closure_per_species, unfractionated_split from zephyrus.profiles import Profile, photospheric_level, wind_base_level @@ -60,6 +60,7 @@ 'boiloff', 'hydrodynamic:EL', 'hydrodynamic:RR', + 'hydrodynamic:PL', 'hydrostatic', 'roche_overflow', ) @@ -90,6 +91,7 @@ class DispatchSettings: cool_recombination: bool = True fractionate: bool = True tidal: bool = True + photon_limit: bool = True # cap the XUV wind at one particle per photon nozzle_temperature: str = 'photospheric' # 'photospheric' | 'wind' residual_mode: str = 'off' # 'off' | 'luminosity_capped' lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) @@ -314,16 +316,25 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: hydro_flags['efficiency_fallback_fixed'] = True mdot_el = hy.el_rate(eps, inputs.F_xuv, inputs.R_p, r_xuv, inputs.M_p, k_factor) mdot_rr = rr['mdot_rr'] - el_won = mdot_el <= mdot_rr - mdot_hydro = min(mdot_el, mdot_rr) - hydro_label = 'hydrodynamic:EL' if el_won else 'hydrodynamic:RR' + # One particle per intercepted front photon, on the EL disk so the two + # share one photon budget (Owen & Alvarez 2016, Eq. 10). + e_ion = rr['hnu0_eV'] * ev2joule + m_ion = rr['mu_plus_wind'] * m_p + mdot_pl = hy.pl_rate(inputs.F_xuv, r_xuv, e_ion, m_ion) if st.photon_limit else math.inf + candidates = {'EL': mdot_el, 'RR': mdot_rr, 'PL': mdot_pl} + winner = min(candidates, key=candidates.get) + mdot_hydro = candidates[winner] + hydro_label = f'hydrodynamic:{winner}' diag['hydrodynamic'] = dict( mdot_el=mdot_el, mdot_rr=mdot_rr, + mdot_pl=mdot_pl, + photon_limit=st.photon_limit, + efficiency_photon_limit=G * inputs.M_p * k_factor * m_ion / (e_ion * inputs.R_p), efficiency=eps, K_tide=k_factor, T_wind=t_wind, - selection_mechanism=hy.selection_mechanism(rr, el_won), + selection_mechanism=hy.selection_mechanism(rr, winner), rr_chain={ k: rr[k] for k in ( diff --git a/src/zephyrus/hydrodynamic.py b/src/zephyrus/hydrodynamic.py index c5bbb5a6..03c66c86 100644 --- a/src/zephyrus/hydrodynamic.py +++ b/src/zephyrus/hydrodynamic.py @@ -72,6 +72,29 @@ def el_rate(eps: float, F_xuv: float, R_p: float, R_xuv: float, M_p: float, K: f return eps * math.pi * F_xuv * R_p * R_xuv**2 / (G * M_p * K) +def pl_rate(F_xuv: float, R_abs: float, e_ion_J: float, m_ion_kg: float) -> float: + """Photon-limited rate pi R_abs^2 (F_xuv / e_ion) m_ion, in kg/s. + + Owen & Alvarez (2016, ApJ 816, 34, Eq. 10) generalized from pure + hydrogen: at most one particle of mass ``m_ion_kg`` [kg] leaves per + ionizing photon of energy ``e_ion_J`` [J] intercepted by the disk of + radius ``R_abs`` [m]. Evaluated on the energy-limited rate's own disk, + the cap binds exactly when the efficiency exceeds + ``G M_p K m_ion / (e_ion R_p)``. + + Raises + ------ + ValueError + If ``e_ion_J`` or ``m_ion_kg`` is not positive, or ``F_xuv`` or + ``R_abs`` is negative. + """ + if not (e_ion_J > 0.0 and m_ion_kg > 0.0): + raise ValueError('pl_rate needs a positive photon energy and particle mass') + if F_xuv < 0.0 or R_abs < 0.0: + raise ValueError('pl_rate needs a non-negative flux and radius') + return math.pi * R_abs**2 * F_xuv / e_ion_J * m_ion_kg + + def EL_escape( tidal_contribution: bool, a: float, @@ -379,10 +402,11 @@ def rr_chain( ) -def selection_mechanism(rr: dict, el_won: bool) -> str: - """Which candidate min(EL, RR) selected; diagnostic only. +def selection_mechanism(rr: dict, winner: str) -> str: + """Which candidate min(EL, RR, PL) selected; diagnostic only. - Three outcomes: the energy-limited rate won, the + ``winner`` is ``'EL'``, ``'RR'``, or ``'PL'``. Four outcomes: the + energy-limited rate won, the photon-limited cap won, the recombination-limited rate won, or it won with the sonic radius floored at the wind base (the subcritical configuration of :func:`rr_chain`, where the returned value is a floored one rather @@ -393,8 +417,10 @@ def selection_mechanism(rr: dict, el_won: bool) -> str: near 1 the recombination-limited base ionization sets the rate, and decades below 1 the wind cannot carry material to the sonic point. """ - if el_won: - return 'EL-selected' + if winner not in ('EL', 'RR', 'PL'): + raise ValueError(f"winner must be 'EL', 'RR', or 'PL', got {winner!r}") + if winner != 'RR': + return f'{winner}-selected' if rr['subcritical']: return 'RR-selected:subcritical-floor' return 'RR-selected' diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 92c11da0..de04d2b7 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -178,6 +178,9 @@ def test_totality_over_random_physical_inputs(): assert all(v == 0.0 for v in res.per_species.values()) assert isinstance(res.diagnostics, dict) assert 'knudsen' in res.diagnostics + if res.regime.startswith('hydrodynamic'): + # The photon count caps every XUV wind the dispatcher returns. + assert res.mdot <= res.diagnostics['hydrodynamic']['mdot_pl'] * (1 + 1e-12) seen.add(res.regime) n_ok += 1 # The sweep must genuinely exercise more than one branch. @@ -226,7 +229,7 @@ def test_routing_hydrodynamic_and_el_candidate_matches_el_escape(): ``EL_escape`` evaluated with the same efficiency, radii, flux, and tidal factor (the cross-implementation pin tying the dispatcher to the package's public energy-limited contract). The label carries the - min(EL, RR) winner as its sub-label. + min(EL, RR, PL) winner as its sub-label. """ inp = _inputs(5 * Me, 1.8 * Re, 1100.0, {'H2': 0.9, 'He': 0.1}, F_xuv=200.0, a=0.05 * AU) res = dispatch(inp) @@ -237,8 +240,9 @@ def test_routing_hydrodynamic_and_el_candidate_matches_el_escape(): r_xuv = _photo_radius(inp) ref = EL_escape(True, inp.a, inp.e, inp.M_p, inp.M_star, eps, inp.R_p, r_xuv, inp.F_xuv, 2) assert hydro['mdot_el'] == pytest.approx(ref, rel=1e-9, abs=0.0) - assert res.mdot == pytest.approx(min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-9, abs=0.0) - winner = 'EL' if hydro['mdot_el'] <= hydro['mdot_rr'] else 'RR' + rates = {'EL': hydro['mdot_el'], 'RR': hydro['mdot_rr'], 'PL': hydro['mdot_pl']} + winner = min(rates, key=rates.get) + assert res.mdot == pytest.approx(rates[winner], rel=1e-9, abs=0.0) assert res.regime == f'hydrodynamic:{winner}' @@ -250,6 +254,48 @@ def _photo_radius(inp): return lev['r'] +def test_photon_limit_caps_the_wind_at_its_efficiency_threshold(): + """The photon cap takes over from EL where the efficiency passes eps_PL. + + On one shared disk the photon-limited and energy-limited rates cross at + ``eps_PL = G M_p K m_ion / (e_ion R_p)``, which the diagnostics report. + Bisecting the efficiency on a two Earth-mass hydrogen and helium wind + brackets the label change from ``hydrodynamic:EL`` to + ``hydrodynamic:PL`` at that value, with the dispatched rate continuous + across it; above it the rate stops growing with the efficiency. With + ``photon_limit`` off the label is never PL and the rate is min(EL, RR). + """ + comp = {'H2': 0.9, 'He': 0.1} + + def at(eps, **kw): + st = DispatchSettings(efficiency=eps, **kw) + return dispatch( + _inputs(2 * Me, 1.3 * Re, 600.0, comp, F_xuv=1.0, a=0.1 * AU, settings=st) + ) + + lo, hi = 0.01, 0.6 + assert at(lo).regime == 'hydrodynamic:EL' + assert at(hi).regime == 'hydrodynamic:PL' + for _ in range(50): + mid = 0.5 * (lo + hi) + if at(mid).regime == 'hydrodynamic:EL': + lo = mid + else: + hi = mid + below, above = at(lo), at(hi) + eps_pl = below.diagnostics['hydrodynamic']['efficiency_photon_limit'] + assert lo == pytest.approx(eps_pl, rel=1e-9, abs=0.0) + assert below.mdot == pytest.approx(above.mdot, rel=1e-9, abs=0.0) + assert at(0.6).mdot == pytest.approx(at(0.3).mdot, rel=1e-12, abs=0.0) + off = at(0.6, photon_limit=False) + hydro = off.diagnostics['hydrodynamic'] + assert off.regime in ('hydrodynamic:EL', 'hydrodynamic:RR') + assert off.mdot == pytest.approx( + min(hydro['mdot_el'], hydro['mdot_rr']), rel=1e-12, abs=0.0 + ) + assert off.mdot > 1.5 * at(0.6).mdot + + def test_routing_roche_overflow_inside_the_hill_sphere(): """A planet whose Hill sphere sits inside its radius overflows, flagged. @@ -686,7 +732,7 @@ def test_residual_setting_admits_the_post_gate_candidate(): on = dispatch(_inputs(3 * Me, 1.7 * Re, 1000.0, settings=admitted, **past)) assert off.diagnostics['lambda_gate'] > 20.0 bolo_off = off.diagnostics['bolometric'] - assert off.regime == 'hydrodynamic:EL' + assert off.regime.startswith('hydrodynamic') assert 'bolometric_residual' not in off.flags assert 'luminosity_capped' not in off.flags assert bolo_off['residual_mode'] == 'off' diff --git a/tests/test_hydrodynamic.py b/tests/test_hydrodynamic.py index fb31ae63..1f8a73b1 100644 --- a/tests/test_hydrodynamic.py +++ b/tests/test_hydrodynamic.py @@ -23,12 +23,13 @@ import pytest from zephyrus.atomic_data import SIGMA_NU0_H, SIGMA_NU_N -from zephyrus.constants import G, m_p +from zephyrus.constants import G, ev2joule, m_p from zephyrus.hydrodynamic import ( caldiroli_efficiency, el_rate, hill_radius_periapsis, k_tide, + pl_rate, rr_chain, selection_mechanism, wind_mean_masses, @@ -158,7 +159,7 @@ def test_rr_subcritical_floor_semantics(): assert rr['R_s_calc'] < 1.0 * Re assert rr['rho_s'] == pytest.approx(rr['rho_base'], rel=1e-12, abs=0.0) assert rr['barometric_factor'] == pytest.approx(1.0, rel=1e-12, abs=0.0) - assert selection_mechanism(rr, el_won=False) == 'RR-selected:subcritical-floor' + assert selection_mechanism(rr, 'RR') == 'RR-selected:subcritical-floor' @pytest.mark.physics_invariant @@ -196,9 +197,10 @@ def test_rr_barometric_factor_separates_the_two_rr_regimes(): # The string has three outcomes and no threshold: both are supercritical # RR wins, so any split on lambda_b would label them differently. - assert selection_mechanism(rr, el_won=False) == 'RR-selected' - assert selection_mechanism(rr_h, el_won=False) == 'RR-selected' - assert selection_mechanism(rr, el_won=True) == 'EL-selected' + assert selection_mechanism(rr, 'RR') == 'RR-selected' + assert selection_mechanism(rr_h, 'RR') == 'RR-selected' + assert selection_mechanism(rr, 'EL') == 'EL-selected' + assert selection_mechanism(rr, 'PL') == 'PL-selected' @pytest.mark.physics_invariant @@ -296,3 +298,37 @@ def test_front_constants_come_from_one_front(): for chain in (hydrogen, nitrogen): assert 0.0 <= chain['f_plus_base'] <= 1.0 assert nitrogen['f_plus_base'] > 0.8 + + +@pytest.mark.reference_pinned +@pytest.mark.physics_invariant +def test_photon_limited_rate_and_its_crossover_with_el(): + """Owen & Alvarez (2016) Eq. (10), and where it meets the energy limit. + + For pure hydrogen at 20 eV per photon the rate is one hydrogen mass per + intercepted photon, ``pi R^2 m_H F / e_ion``, pinned against that closed + form. On the energy-limited rate's own disk the ratio EL/PL is + ``eps e_ion R_p / (G M_p K m_ion)``, free of the absorbing radius, so + the two cross at one efficiency; the test evaluates both kernels either + side of it on asymmetric inputs (a 3 Earth-mass, 1.4 Earth-radius + planet, K = 0.8, a disk at 1.3 R_p) so a swapped radius or a missing + tidal factor moves the crossover. The rate is linear in the flux and + independent of planet mass, and invalid inputs raise. + """ + F, e_ion, m_ion = 3.7, 20.0 * ev2joule, 1.00794 * 1.66053906660e-27 + M_p, R_p, K = 3 * Me, 1.4 * Re, 0.8 + R_abs = 1.3 * R_p + pl = pl_rate(F, R_abs, e_ion, m_ion) + assert pl == pytest.approx(math.pi * R_abs**2 * F / e_ion * m_ion, rel=1e-15, abs=0.0) + assert pl_rate(2 * F, R_abs, e_ion, m_ion) == pytest.approx(2 * pl, rel=1e-15, abs=0.0) + eps_pl = G * M_p * K * m_ion / (e_ion * R_p) + for factor, el_smaller in ((0.9, True), (1.1, False)): + el = el_rate(factor * eps_pl, F, R_p, R_abs, M_p, K) + assert (el < pl) is el_smaller + assert el_rate(eps_pl, F, R_p, R_abs, M_p, K) == pytest.approx(pl, rel=1e-12, abs=0.0) + with pytest.raises(ValueError): + pl_rate(F, R_abs, 0.0, m_ion) + with pytest.raises(ValueError): + pl_rate(-1.0, R_abs, e_ion, m_ion) + with pytest.raises(ValueError): + selection_mechanism({'subcritical': False}, 'XX') From af9d78fbec4bd54433efbd5aa8f40dfbffe14fac Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:29:36 +0200 Subject: [PATCH 103/113] Check boil-off termination on the uncapped wind The Tang termination check now reads the closed-form wind, the smaller of the Parker rate and the Bondi cap, rather than the bolometric candidate: past the gate that candidate can be the luminosity cap L/(g R_p K), and the check's cooling time is set by the same L, so it returned the tidal factor instead of a verdict on the wind and flipped with the tidal setting. A test toggles tides on a luminosity-capped state. The regimes page now prints the gate jump measured at the gate itself (5.2 at an XUV flux of 10 W m^-2 and 518 at 0.1 on a three Earth-mass hydrogen and helium envelope at 1000 K) and the gate's position in the wind-temperature x, states the photon count as conditional on every escaping particle being ionized once, and the limitations page records that the cap sits on the energy-limited disk rather than the paper's unit optical depth surface and that its mass per ionization counts hydrogen-front helium as ionized, 5 percent low at a helium mixing ratio of 0.1. The remaining two-candidate and five-regime wording is brought to three and six. --- docs/Explanations/limitations.md | 2 +- docs/Explanations/model.md | 2 +- docs/Explanations/regimes.md | 6 +++--- docs/Reference/results.md | 4 ++-- docs/Validation/dispatcher.md | 2 +- docs/index.md | 2 +- src/zephyrus/dispatcher.py | 12 +++++++----- tests/test_dispatcher.py | 13 ++++++++++--- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index c7fc9ea0..f6cf1231 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -23,7 +23,7 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. -- **The photon-limited cap is an estimate, not a bound.** The count behind it, one particle per intercepted ionizing photon (Owen & Alvarez 2016, Eq. 10), limits primary ionizations rather than mass loss: neutrals heated by collisions escape too, and X-ray photoelectrons ionize more than once, so a real flow can exceed it. The source never simulates the regime, and the one three-dimensional plane-parallel calculation with numbers to compare sits 1.3 to 2.4 times above the count (Debrecht et al. 2019, MNRAS 483, 1481). Where the cap binds the rate may therefore be low by a factor of that order. It also scales inversely with the photon energy per ionization, taken as the front energy (20 eV for a hydrogen front), and the plausible range of 13.6 to 40 eV spans a factor of 2.9. `photon_limit = False` recovers the uncapped rate for comparison. +- **The photon-limited cap is an estimate, not a bound.** The count behind it, one particle per intercepted ionizing photon (Owen & Alvarez 2016, Eq. 10), limits primary ionizations rather than mass loss: neutrals heated by collisions escape too, and X-ray photoelectrons ionize more than once, so a real flow can exceed it. The source never simulates the regime, and the one three-dimensional plane-parallel calculation with numbers to compare sits 1.3 to 2.4 times above the count taken on the wind-base disk (Debrecht et al. 2019, MNRAS 483, 1481). Here the count uses the energy-limited rate's 20 mbar disk instead, so that the two share one photon budget; the wind base can sit several times further out (1.04 to 9 times in radius on the states tested), so on this disk the cap sits below the paper's own Eq. (10) by the square of that ratio, a factor the energy-limited rate shares. Where the cap binds the rate may therefore be low. The mass per ionization is the wind's mean atomic mass per ion, which on a hydrogen front counts helium as ionized although 20 eV photons do not ionize it; the count per photon is then 5 percent low at a helium mixing ratio of 0.1 and about 9 percent at solar abundance, a convention the recombination-limited base density shares. It also scales inversely with the photon energy per ionization, taken as the front energy (20 eV for a hydrogen front), and the plausible range of 13.6 to 40 eV spans a factor of 2.9. `photon_limit = False` recovers the uncapped rate for comparison. - **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two things the primary computes and this module does not: the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds. Under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. - **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. That is a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, the module's own estimate of that transfer is `diagnostics['nozzle']['rate_kg_s']` and it is below the dispatched rate. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 86978b31..129f65e3 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -14,7 +14,7 @@ Which physics carries the continuous loss depends on how tightly the atmosphere - `boiloff`: the atmosphere is so weakly bound that it flows out on the planet's own thermal energy, before stellar XUV heating matters. Typical of young, hot, hydrogen-rich planets fresh out of the nebula. - `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). - `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). -- `hydrodynamic:PL`: the same fluid wind in a well shallow enough that each ionizing photon carries more energy than lifting one particle costs, so the rate is set by the number of photons rather than their energy (the photon-limited rate of Owen & Alvarez 2016 wins). +- `hydrodynamic:PL`: the same fluid wind in a well shallow enough that the heating share of each ionizing photon's energy exceeds the work to lift one particle out, so the rate is set by the number of photons rather than their energy (the photon-limited rate of Owen & Alvarez 2016 wins). - `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. - `roche_overflow`: either the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017) outruns every bound candidate and is dispatched as the rate, or the flow region reaches the planet's Hill sphere and the label sits on top of whichever regime produced the rate, which is then a lower limit. `diagnostics['roche']['rate_branch']` says which reading applies. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index d708aaa7..fb88f7ec 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -54,7 +54,7 @@ A freshly formed or strongly heated planet can hold an atmosphere so distended t $$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{launch}} \tag{1}$$ -the ratio of a particle's gravitational binding energy to its thermal energy, evaluated at the photospheric launch level (radius $R_\mathrm{launch}$, the 20 mbar level by default) with the mean molecular mass $\mu$ of the atmosphere there and the Boltzmann constant $k_\mathrm{B}$. The launch level is the surface the threshold below is calibrated on. In a coupled run $R_\mathrm{p}$ is the interior radius, which on an inflated envelope sits well below the photosphere, and a parameter built there would close the gate while the Parker wind is still running. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas $\Lambda = 2 R_\mathrm{B} / R_\mathrm{launch}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at isothermal sound speed $c_\mathrm{s}$, so the shutoff Owen & Wu (2016) find with the photosphere at a tenth of the Bondi radius is $\Lambda = 20$ for every composition [^owenwu]. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. +the ratio of a particle's gravitational binding energy to its thermal energy, evaluated at the photospheric launch level (radius $R_\mathrm{launch}$, the 20 mbar level by default) with the mean molecular mass $\mu$ of the atmosphere there and the Boltzmann constant $k_\mathrm{B}$. The launch level is the surface the threshold below is calibrated on. In a coupled run $R_\mathrm{p}$ is the interior radius, which on an inflated envelope sits well below the photosphere, and a parameter built there would close the gate while the Parker wind is still running. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas at $T_\mathrm{eq}$, $\Lambda = 2 R_\mathrm{B} / R_\mathrm{launch}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at the isothermal sound speed $c_\mathrm{s}$ of that temperature, so the shutoff Owen & Wu (2016) find with the photosphere at a tenth of the Bondi radius is $\Lambda = 20$ for every composition [^owenwu]. Eqs. (2) and (3) below run at the cooler wind temperature, whose Bondi radius is larger by $2^{1/4}$, so in their $x$ the gate sits at $x = 2^{3/4} / 20 = 0.084$. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): @@ -70,7 +70,7 @@ $$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\ with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and an admitted residual and the XUV rate it competes with in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual_mode` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. -Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting (2019) find that a bolometric wind fed by the cooling interior persists for gigayears, at the smaller of the Bondi-limited rate and the cooling-luminosity rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. Here the dispute is confined to a narrow band past the gate. On a three Earth-mass hydrogen envelope at 0.1 au under an XUV flux of 10 W m⁻², the candidate past the gate is set by the Parker rate of Eq. (2) almost everywhere, since the closed form is still shutting off; it exceeds the XUV rate only while $\Lambda$ stays below about 21 to 23 (lower for a cooler envelope), by up to a factor of 7 at the points sampled between 1000 and 1500 K, and has fallen to 2 to 7 percent of it at $\Lambda = 25$. The default reports the candidate and does not dispatch it, which follows Tang et al. and makes the gate a jump in the dispatched rate: a factor of 6.5 on a three Earth-mass hydrogen and helium envelope at 1000 K under that XUV flux, and 650 under 0.1 W m⁻², where the XUV rate is small. A run that wants the rate continuous across the gate sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed on the candidate and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. +Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting (2019) find that a bolometric wind fed by the cooling interior persists for gigayears, at the smaller of the Bondi-limited rate and the cooling-luminosity rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. Here the dispute is confined to a narrow band past the gate. On a three Earth-mass hydrogen envelope at 0.1 au under an XUV flux of 10 W m⁻², the candidate past the gate is set by the Parker rate of Eq. (2) almost everywhere, since the closed form is still shutting off; it exceeds the XUV rate only while $\Lambda$ stays below about 21 to 23 (lower for a cooler envelope), by up to a factor of about 9 just past the gate between 1000 and 1500 K, and has fallen to 3 to 7 percent of it at $\Lambda = 25$. The default reports the candidate and does not dispatch it, which follows Tang et al. and makes the gate a jump in the dispatched rate. Measured at the gate itself on a three Earth-mass hydrogen and helium envelope at 1000 K and 0.0775 au, it is a factor of 5.2 under that XUV flux and 518 under 0.1 W m⁻², where the XUV rate is small (3.0 and 303 with `photon_limit = False`). A run that wants the rate continuous across the gate sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed on the closed-form wind before the luminosity cap, since that cap and their cooling time are set by the same luminosity, and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. ## The hydrodynamic wind @@ -88,7 +88,7 @@ with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition $$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ -The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow, each intercepted ionizing photon ionizes one particle, which the flow carries off, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the cap. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow and every escaping particle is ionized once, each intercepted ionizing photon removes one particle, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the cap. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch diff --git a/docs/Reference/results.md b/docs/Reference/results.md index a133fc51..b6702fd8 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -113,11 +113,11 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from, always one of the regime labels (`roche_overflow` itself when the L1 transfer won, and the producing branch when the screen renamed a bound state), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | | `nozzle` | `rate_kg_s`, `rate_full_orbit_kg_s`, `rate_periapsis_kg_s`, `rate_apoapsis_kg_s`, `applicable`, `applicable_orbit_fraction`, `saturated_orbit_fraction`, `R_sonic`, `R_L1`, `R_sonic_over_R_L1`, `R_sonic_over_R_L1_apoapsis`, `n_phase`, `temperature_mode`, `r_launch`, `rho_launch`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `power_lift_full_orbit_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not. `rate_kg_s` is what the dispatcher competes: the orbit average duty-cycled over the arc where the overflow description applies, which is where the isothermal sonic radius reaches the L1 distance. `rate_full_orbit_kg_s` is the same average without that gate, so it stays comparable with the primary's own published rates, and the periapsis and apoapsis rates bracket the orbit. The geometry entries (the lobe radius, both potentials, the applied exponent, the nozzle area, `saturated`) are reported at periapsis, the tightest geometry of the orbit. The flow carries no energy cap, so the lift power against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained: `power_lift_W` pairs with the competed rate and `power_lift_full_orbit_W` with the unguarded one. Both are built from the barrier the rate applied plus the acceleration to the sonic speed, which is the heat an isothermal flow demands, so they stay finite and non-trivial at saturation where the barrier is gone and the acceleration is not. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | -| `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy. | +| `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy of Guo (2024). `lambda_rp` is taken at `R_p`, so it differs from `lambda_gate`, which is taken at the launch level, by the ratio of the launch radius to `R_p`. | | `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | | `erkaev_tc_K` | float | The tidally corrected critical exobase temperature above which the thermosphere blows off. | | `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | -| `tang_timescale` | `evaluated`, `t_mdot_s`, `t_cool_s`, `terminated` | The Tang et al. (2024) termination check on the bolometric candidate, whichever rate was dispatched, so its verdict does not change with `residual_mode`. | +| `tang_timescale` | `evaluated`, `t_mdot_s`, `t_cool_s`, `terminated` | The Tang et al. (2024) termination check on the closed-form bolometric wind, the smaller of `mdot_parker` and `mdot_bondi`, before the luminosity cap and whichever rate was dispatched, so its verdict changes neither with `residual_mode` nor with `tidal`. | | `self_consistency` | `evaluated`, `t_deplete_s`, `age_s`, `inconsistent` | Whether the dispatched rate would have destroyed the supplied inventory within the supplied age. Reports `evaluated: False` without an age or reservoirs. | | `rate_floor` | `floor_kg_s`, `above_floor` | Whether the dispatched rate has any numerical content, against one proton per Julian year. Reporting only: the module never applies the floor. | | `base_level` | `p_Pa`, `p_physical_Pa`, `r_m`, `T_K`, `clamp_decades` | Where the wind was launched, and the pressure the base method asked for before any clamp. | diff --git a/docs/Validation/dispatcher.md b/docs/Validation/dispatcher.md index b39f70e8..aa82e89f 100644 --- a/docs/Validation/dispatcher.md +++ b/docs/Validation/dispatcher.md @@ -4,7 +4,7 @@ This page tracks the `@pytest.mark.reference_pinned` test that anchors the assem | Test id | Reference | Scope | |---|---|---| -| `tests/test_dispatcher.py::test_routing_hydrodynamic_and_el_candidate_matches_el_escape` | Cross-implementation check against `zephyrus.escape.EL_escape` (Erkaev et al. 2007 form, scaling = 2) | The dispatcher's energy-limited candidate equals the released public entry point evaluated with the same efficiency, radii, flux, and tidal factor to $10^{-9}$ relative, and the dispatched rate is the min(EL, RR) winner named by the sub-label. | +| `tests/test_dispatcher.py::test_routing_hydrodynamic_and_el_candidate_matches_el_escape` | Cross-implementation check against `zephyrus.escape.EL_escape` (Erkaev et al. 2007 form, scaling = 2) | The dispatcher's energy-limited candidate equals the released public entry point evaluated with the same efficiency, radii, flux, and tidal factor to $10^{-9}$ relative, and the dispatched rate is the min(EL, RR, PL) winner named by the sub-label. | ## Notes diff --git a/docs/index.md b/docs/index.md index 771d960a..f55f3e49 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,7 +6,7 @@ [![Unit Tests](https://img.shields.io/github/actions/workflow/status/FormingWorlds/ZEPHYRUS/tests.yaml?branch=main&label=Unit%20Tests)](https://github.com/FormingWorlds/ZEPHYRUS/actions/workflows/tests.yaml) [![Integration Tests](https://img.shields.io/github/actions/workflow/status/FormingWorlds/ZEPHYRUS/nightly.yml?branch=main&label=Integration%20Tests)](https://github.com/FormingWorlds/ZEPHYRUS/actions/workflows/nightly.yml) -**ZEPHYRUS** is the atmospheric escape module of the [PROTEUS](https://proteus-framework.org/PROTEUS) coupled atmosphere-interior evolution framework. Named after the Greek god of the west wind and messenger of spring, it models the atmospheric mass loss of rocky and sub-Neptune exoplanets through two channels: continuous thermal escape, classified into five regimes (boil-off, energy-limited and recombination-limited winds, hydrostatic Jeans escape, and Roche-lobe overflow) with per-species fractionation, and impulsive erosion by giant impacts during accretion. The energy-limited rate is the default prescription consumed by PROTEUS; the full regime framework is available standalone. Start with [the ZEPHYRUS model](Explanations/model.md) for the complete picture. +**ZEPHYRUS** is the atmospheric escape module of the [PROTEUS](https://proteus-framework.org/PROTEUS) coupled atmosphere-interior evolution framework. Named after the Greek god of the west wind and messenger of spring, it models the atmospheric mass loss of rocky and sub-Neptune exoplanets through two channels: continuous thermal escape, classified into six regimes (boil-off, energy-limited, recombination-limited, and photon-limited winds, hydrostatic Jeans escape, and Roche-lobe overflow) with per-species fractionation, and impulsive erosion by giant impacts during accretion. The energy-limited rate is the default prescription consumed by PROTEUS; the full regime framework is available standalone. Start with [the ZEPHYRUS model](Explanations/model.md) for the complete picture. ![ZEPHYRUS banner](assets/ZEPHYRUS_logo_white.png#only-light) ![ZEPHYRUS banner](assets/ZEPHYRUS_logo_black.png#only-dark) diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index aa553d92..db88fabb 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -38,8 +38,8 @@ # because a boiling atmosphere has not yet built the base an XUV wind # launches from (Owen & Schlichting 2024). # 2. The hydrodynamic candidate: wind base by the configured method, wind -# temperature from the thermostat, rate min(EL, RR) with the winner -# naming the sub-label. +# temperature from the thermostat, rate min(EL, RR, PL) with the +# winner naming the sub-label. # 3. The sonic-point Knudsen switch, on the hydrodynamic branch only, # confirms the wind or re-routes the point to the hydrostatic branch. # 4. The hydrostatic branch: per-species Jeans escape with the @@ -604,10 +604,12 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: diag['fluid_check'] = dg.along_profile_fluid_check( inputs.profile, inputs.M_p, rr['R_s'], st.kn_crit ) - # The check is on the bolometric candidate, not the dispatched rate, so - # its verdict does not change with whether the residual was admitted. + # On the closed-form wind before the luminosity cap: that cap is L/(g R_p K) + # and the check's cooling time is set by the same L, so testing it against + # itself would return K rather than a verdict on the wind. + wind_rate = min(bolo['mdot_parker'], bolo['mdot_bondi']) diag['tang_timescale'] = bl.tang_timescale_check( - inputs.M_p, inputs.R_p, inputs.F_int, bolo_rate, inputs.reservoirs + inputs.M_p, inputs.R_p, inputs.F_int, wind_rate, inputs.reservoirs ) diag['self_consistency'] = dg.self_consistency_screen(inputs.reservoirs, rate, inputs.age) diag['rate_floor'] = dg.rate_floor_screen(rate) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index de04d2b7..45fefae2 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -773,9 +773,9 @@ def test_activation_gate_boundary_and_the_candidate_it_reports(): The activation test is a strict inequality, so a state whose own ``lambda_gate`` is set as ``lambda_crit`` is past the gate: not boil-off, not active, and not competing under the default. The Tang timescale - diagnostic describes the bolometric candidate, so on a state past the - gate it is identical whether or not the residual is admitted, although - the dispatched rate differs by two decades between the two modes. + diagnostic reads the closed-form wind before the luminosity cap, so on a + luminosity-capped state past the gate it is identical whether or not the + residual is admitted and whether or not tides divide the cap. """ comp = {'H2': 0.9, 'He': 0.1} envelope = {'H': 0.01 * 3 * Me * 0.75, 'He': 0.01 * 3 * Me * 0.25} @@ -791,6 +791,13 @@ def test_activation_gate_boundary_and_the_candidate_it_reports(): assert on.mdot > 10.0 * probe.mdot assert probe.diagnostics['tang_timescale']['evaluated'] is True assert on.diagnostics['tang_timescale'] == probe.diagnostics['tang_timescale'] + # The check reads the closed-form wind, not the luminosity cap, so the + # tidal factor that divides only the cap cannot move its verdict. + flat = dispatch( + _inputs(3 * Me, 1.7 * Re, 1000.0, settings=DispatchSettings(tidal=False), **state) + ) + assert probe.diagnostics['bolometric']['binding_cap'] == 'luminosity' + assert flat.diagnostics['tang_timescale'] == probe.diagnostics['tang_timescale'] def test_roche_rename_keeps_the_rate_under_the_default_settings(): From ad40af08ff36bb30139e3118a355daeddfe27024 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:42:53 +0200 Subject: [PATCH 104/113] State which van der Waals radii Bondi omits The regimes page and two docstrings said Bondi (1964) prints no alkali, alkaline-earth, or transition-metal radii, which the package's own Na and Mg entries contradict. Mantina et al. (2009) state that Bondi recommended radii for 28 of the 44 main-group elements and list the 16 he omitted, which include aluminium and calcium but not phosphorus, chlorine, or potassium. The text now says the six elements that reach the assumed-radius fallback are missing from the package's table, of which only aluminium and calcium are missing from Bondi. --- docs/Explanations/regimes.md | 4 +++- src/zephyrus/diffusion.py | 9 +++++---- tests/test_knudsen.py | 5 ++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index fb88f7ec..c4c020be 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -96,7 +96,7 @@ A fluid wind only exists if the gas is still collisional where it goes sonic. Th $$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell}{H_\mathrm{s}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{7}$$ -where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements have no published van der Waals radius at all (Bondi prints no alkali, alkaline earth, or transition metals), so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. +where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements carry no radius in the package's table, so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. For two of them the gap is in the source: Bondi (1964) gives no radius for aluminium or calcium, among the 16 of 44 main-group elements he left out, which Mantina et al. (2009) later supplied on his scale [^mantina]. Phosphorus, chlorine, and potassium are main-group elements Bondi does tabulate, and titanium is a transition metal; the table simply does not carry them yet. One property of the criterion is worth stating plainly, because it is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. @@ -205,3 +205,5 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^oj12]: Owen, J. E., & Jackson, A. P. (2012). Planetary evaporation by UV and X-ray radiation: basic hydrodynamics. *Monthly Notices of the Royal Astronomical Society, 425*(4), 2931. https://doi.org/10.1111/j.1365-2966.2012.21481.x [^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 + +[^mantina]: Mantina, M., Chamberlin, A. C., Valero, R., Cramer, C. J., & Truhlar, D. G. (2009). Consistent van der Waals Radii for the Whole Main Group. *The Journal of Physical Chemistry A, 113*(19), 5806-5812. https://doi.org/10.1021/jp8111556 diff --git a/src/zephyrus/diffusion.py b/src/zephyrus/diffusion.py index e3485522..b73895ea 100644 --- a/src/zephyrus/diffusion.py +++ b/src/zephyrus/diffusion.py @@ -73,10 +73,11 @@ def substitutable() -> tuple[str, ...]: """Species eligible to stand in for an uncovered one, lightest first. Both scaling rules need a mass and a kinetic diameter, so a species can - only be substituted for by one that carries both. Bondi (1964) prints no - van der Waals radius for aluminium, potassium, calcium, or titanium and - the kinetic-diameter rule therefore reaches none of them, which is why - the substitution set is smaller than the mass table. + only be substituted for by one that carries both. The radius table + carries none for aluminium, potassium, calcium, or titanium (Bondi 1964 + gives none for aluminium or calcium), so the kinetic-diameter rule + reaches none of them and the substitution set is smaller than the mass + table. """ diam = diameters() return tuple(sorted((s for s in ALL_MASS if s in diam), key=lambda s: ALL_MASS[s])) diff --git a/tests/test_knudsen.py b/tests/test_knudsen.py index 9f90b92c..738bd21a 100644 --- a/tests/test_knudsen.py +++ b/tests/test_knudsen.py @@ -153,9 +153,8 @@ def test_fallback_order_provenance_and_geometric_bias(): geo_h2o, tabulated_h2o = sigma_geometric('H2O') assert tabulated_h2o is True assert geo_h2o == pytest.approx(math.pi * (2.0 * 1.52e-10) ** 2, rel=1e-12, abs=0.0) - # Elements Bondi does not tabulate (alkali, alkaline earth, transition - # metals) reach the fallback on an assumed radius, and say so rather - # than passing for a published one. + # Elements the package's radius table does not carry reach the fallback + # on an assumed radius, and say so rather than passing for a published one. for assumed in ('Ti', 'K', 'Ca', 'Al', 'P', 'Cl'): sigma_a, tabulated_a = sigma_geometric(assumed) assert tabulated_a is False, assumed From 3e8a10c10a264cecd6d17fd1b0f28bf65c5b41e0 Mon Sep 17 00:00:00 2001 From: maraattia Date: Mon, 28 Sep 2026 16:42:53 +0200 Subject: [PATCH 105/113] Add a switch for the recombination-limited candidate recombination_limit, default true, removes the recombination-limited rate from the XUV wind's minimum, so the wind is min(EL, PL), or the energy-limited rate alone together with photon_limit off; it mirrors the photon-limit switch for comparisons with codes that carry fewer limits. The chain is still evaluated, since the sonic-point Knudsen switch reads its sonic density, so the collisionality verdict does not move with the setting. A test holds the RR-limited carbon dioxide case to its energy-limited rate with the switch off and the Knudsen number unchanged. --- docs/Explanations/regimes.md | 2 +- docs/Reference/parameters.md | 1 + docs/Reference/results.md | 2 +- src/zephyrus/dispatcher.py | 5 +++- tests/test_dispatcher.py | 46 ++++++++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index c4c020be..965ceca3 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -88,7 +88,7 @@ with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition $$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ -The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow and every escaping particle is ionized once, each intercepted ionizing photon removes one particle, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the cap. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow and every escaping particle is ionized once, each intercepted ionizing photon removes one particle, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the photon cap and `recombination_limit = False` the recombination-limited candidate, the latter leaving the chain evaluated because the collisionality switch below reads its sonic point. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 98e84257..db4ed9f3 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -115,6 +115,7 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | | `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | | `photon_limit` | `True` | `True`, `False` | Cap the XUV wind at one particle per intercepted ionizing photon, the photon-limited rate of Owen & Alvarez (2016) Eq. (10), on the energy-limited rate's disk. It binds where the efficiency exceeds `efficiency_photon_limit`, on shallow wells. `False` restores min(EL, RR), which is what most energy-limited codes in the literature compute. | +| `recombination_limit` | `True` | `True`, `False` | Admit the recombination-limited rate of Murray-Clay et al. (2009) as a candidate for the XUV wind. `False` leaves min(EL, PL), or the energy-limited rate alone together with `photon_limit = False`. The chain is still evaluated either way, because the sonic-point Knudsen switch reads its sonic density, so the collisionality verdict does not change with this setting. | | `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | | `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default, following Tang et al.; the price is a jump in the dispatched rate at the activation gate, measured on the [escape regimes](../Explanations/regimes.md) page together with the dispute and the band past the gate where the candidate would win. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | diff --git a/docs/Reference/results.md b/docs/Reference/results.md index b6702fd8..21bcfb61 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -104,7 +104,7 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | Group | Key contents | What it answers | |---|---|---| | `knudsen` | `kn_sc`, `threshold_applied`, `sigma_c`, `provenance`, `counterfactual_labels` | Which side of the collisionality switch the state fell on, how close it sat, what the label would have been at both edges of the criterion band, and where the cross sections came from. | -| `hydrodynamic` | `mdot_el`, `mdot_rr`, `mdot_pl`, `photon_limit`, `efficiency_photon_limit`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | The three wind candidates (the photon-limited one infinite when `photon_limit` is off), the efficiency above which the photon count binds, which candidate won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `PL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | +| `hydrodynamic` | `mdot_el`, `mdot_rr`, `mdot_pl`, `photon_limit`, `recombination_limit`, `efficiency_photon_limit`, `efficiency`, `K_tide`, `T_wind`, `selection_mechanism`, `rr_chain` | The three wind candidates (the photon-limited or recombination-limited one infinite when its setting is off), the efficiency above which the photon count binds, which candidate won, the temperature the thermostat returned, and the full recombination-limited chain (sound speed, sonic radius, base Jeans parameter, densities, barometric factor). `selection_mechanism` is one of `EL-selected`, `PL-selected`, `RR-selected`, or `RR-selected:subcritical-floor`, and says which candidate won, not why it was small; the barometric factor is what answers that. | | `hydrostatic` | `rate_kg_s`, `convergence`, `T_exo`, `T_exo_mode`, `r_exo`, `f_plus_exo`, `T_esc_neutral`, `T_esc_plasma`, `gate`, `gate_unstable`, `detail` | The exobase state, both escape temperatures with the local ionization fraction, which convention gated the branch, the `detail['dominant']` species that supplies itself without a diffusion cap, and per-species Jeans and diffusion fluxes in `detail['species']`. The `convergence` entry records the quadrature levels the supply integrals ended on, the last relative change in the bulk rate and the worst one across the species, and whether the target was met; a call that hits the ceiling first reports `converged` false and the rate it reached. | | `bolometric` | `T_wind`, `c_s`, `R_B`, `R_sonic`, `x`, `mach`, `mdot_parker`, `mdot_bondi`, `mdot_luminosity`, `binding_cap`, `k_tide`, `active`, `competes`, `residual_mode`, `p_launch`, `tau_launch`, `rate_kg_s` | The bolometric candidate in full, whether or not it was dispatched. `active` is true when the activation gate is open, that is, when the restricted Jeans parameter sits below `lambda_crit`. `competes` is true when the candidate took part in the final comparison: always while `active`, and past the gate only when `residual_mode` admits it, so a candidate rate above the dispatched one beside `competes` false was never a contender rather than a loser. Neither says the branch was dispatched; the label does. `rate_kg_s` is the minimum over the caps in force: the Parker rate and the Bondi cap while the gate is open, and past it also the interior-luminosity cap `mdot_luminosity`, so past the gate it is the core-powered rate whether or not it competes. `binding_cap` names which of `'parker'`, `'bondi'`, or `'luminosity'` set it; `mdot_parker` and `mdot_bondi` answer the uncapped question. `R_B` is the Bondi radius at the wind temperature, which is the sonic radius `R_sonic` of the isothermal wind. `tau_launch` is the plane-parallel optical depth $\kappa P / g$ of the launch level to the opacity you supplied. The Parker rate is derived from a photosphere, so a `tau_launch` far from 1 says the prescribed level and the opacity do not describe the same surface. It is reporting only, and the level stays prescribed rather than solved for because the activation threshold is calibrated at a level of its own; solving here would put the gate and the rate on two different surfaces. | | `lambda_gate` | float | The restricted Jeans parameter that decides boil-off activation. | diff --git a/src/zephyrus/dispatcher.py b/src/zephyrus/dispatcher.py index db88fabb..936d12fb 100644 --- a/src/zephyrus/dispatcher.py +++ b/src/zephyrus/dispatcher.py @@ -92,6 +92,7 @@ class DispatchSettings: fractionate: bool = True tidal: bool = True photon_limit: bool = True # cap the XUV wind at one particle per photon + recombination_limit: bool = True # admit the recombination-limited rate nozzle_temperature: str = 'photospheric' # 'photospheric' | 'wind' residual_mode: str = 'off' # 'off' | 'luminosity_capped' lambda_crit: float = 20.0 # boil-off activation threshold (band 15 to 35) @@ -315,7 +316,8 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: else: hydro_flags['efficiency_fallback_fixed'] = True mdot_el = hy.el_rate(eps, inputs.F_xuv, inputs.R_p, r_xuv, inputs.M_p, k_factor) - mdot_rr = rr['mdot_rr'] + # Off, the chain is still evaluated: its sonic point feeds the Knudsen switch. + mdot_rr = rr['mdot_rr'] if st.recombination_limit else math.inf # One particle per intercepted front photon, on the EL disk so the two # share one photon budget (Owen & Alvarez 2016, Eq. 10). e_ion = rr['hnu0_eV'] * ev2joule @@ -330,6 +332,7 @@ def dispatch(inputs: EscapeInputs) -> EscapeResult: mdot_rr=mdot_rr, mdot_pl=mdot_pl, photon_limit=st.photon_limit, + recombination_limit=st.recombination_limit, efficiency_photon_limit=G * inputs.M_p * k_factor * m_ion / (e_ion * inputs.R_p), efficiency=eps, K_tide=k_factor, diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py index 45fefae2..db6e4131 100644 --- a/tests/test_dispatcher.py +++ b/tests/test_dispatcher.py @@ -296,6 +296,52 @@ def at(eps, **kw): assert off.mdot > 1.5 * at(0.6).mdot +def test_recombination_limit_removes_the_rr_candidate_only(): + """With ``recombination_limit`` off the wind is min(EL, PL), and nothing else moves. + + A one Earth-mass carbon dioxide atmosphere under 1e4 W m^-2 is + recombination-limited by default, at a quarter of its energy-limited + rate. Switching the candidate off returns that energy-limited rate and + label, while the sonic-point Knudsen number, which the chain still + supplies, is unchanged. On a five Earth-mass hydrogen and helium wind + that is photon-limited, removing RR leaves the verdict alone and + removing both caps returns the energy-limited rate. + """ + co2 = dict(comp={'CO2': 1.0}, F_xuv=1.0e4, a=0.05 * AU) + on = dispatch(_inputs(Me, Re, 1000.0, **co2)) + off = dispatch( + _inputs(Me, Re, 1000.0, settings=DispatchSettings(recombination_limit=False), **co2) + ) + assert on.regime == 'hydrodynamic:RR' + assert off.regime == 'hydrodynamic:EL' + assert off.mdot == pytest.approx( + on.diagnostics['hydrodynamic']['mdot_el'], rel=1e-12, abs=0.0 + ) + assert off.mdot > 3.0 * on.mdot + assert off.diagnostics['hydrodynamic']['mdot_rr'] == math.inf + assert off.diagnostics['knudsen']['kn_sc'] == on.diagnostics['knudsen']['kn_sc'] + hhe = dict(comp={'H2': 0.9, 'He': 0.1}, F_xuv=1.0e4, a=0.05 * AU) + pl = dispatch(_inputs(5 * Me, 1.8 * Re, 1100.0, **hhe)) + no_rr = dispatch( + _inputs( + 5 * Me, + 1.8 * Re, + 1100.0, + settings=DispatchSettings(recombination_limit=False), + **hhe, + ) + ) + neither = DispatchSettings(recombination_limit=False, photon_limit=False) + bare = dispatch(_inputs(5 * Me, 1.8 * Re, 1100.0, settings=neither, **hhe)) + assert pl.regime == 'hydrodynamic:PL' + assert no_rr.regime == 'hydrodynamic:PL' + assert no_rr.mdot == pytest.approx(pl.mdot, rel=1e-12, abs=0.0) + assert bare.regime == 'hydrodynamic:EL' + assert bare.mdot == pytest.approx( + pl.diagnostics['hydrodynamic']['mdot_el'], rel=1e-12, abs=0.0 + ) + + def test_routing_roche_overflow_inside_the_hill_sphere(): """A planet whose Hill sphere sits inside its radius overflows, flagged. From 1cdd6b72e81d6fec105a7c11888a2a9432057394 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 12:20:29 +0200 Subject: [PATCH 106/113] Show the three wind limits in the tutorial A new tutorial step dispatches the one Earth-mass carbon dioxide planet at two efficiencies and two XUV fluxes, so the energy-limited, photon-limited, and recombination-limited rates each win once: the efficiency decides between the two rates linear in the flux, and the recombination-limited rate takes over at high flux. It prints the selection string and the barometric factor so the recombination-limited win reads as a transonic wind set mostly by suppression between base and sonic point, and it says why a hydrogen planet shallow enough to be photon-limited cannot show a transonic recombination-limited wind. --- docs/Tutorials/dispatch.md | 27 +++++++++++++++++++++++++++ tests/test_examples.py | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/Tutorials/dispatch.md b/docs/Tutorials/dispatch.md index 5907bdc1..e33fb2c1 100644 --- a/docs/Tutorials/dispatch.md +++ b/docs/Tutorials/dispatch.md @@ -523,6 +523,33 @@ Output: From 0.3 the photon count binds. Lifting one particle out of a one Earth-mass well costs about a quarter of an ionizing photon's energy, so above an efficiency of 0.26 (`efficiency_photon_limit` in the diagnostics) more energy per photon cannot remove more gas, and the rate stops at $6.1 \times 10^{6}$ kg s⁻¹ while the energy-limited candidate keeps growing[^owenalvarez]. The label changes without the physics of the wind changing at all: the minimum switched hands, nothing else. With `photon_limit = False` the rate would keep rising until the recombination-limited candidate took over at 0.6. The fitted-efficiency option returns 0.791 for this planet with `caldiroli_out_of_box` raised, because a one Earth-mass planet sits below the gravitational potential range the fit was made on[^caldiroli]. That is the guard working. Take the flag seriously rather than the number. +### Three limits on one wind + +The wind rate is the smallest of three limits, and each responds to a different quantity. The energy-limited and photon-limited rates are both linear in the XUV flux, so which of the two is smaller depends only on the efficiency, against the threshold `efficiency_photon_limit` above which a photon's heating share outweighs the work to lift one particle. The recombination-limited rate grows more slowly with flux, so it takes over when the flux is high. The one Earth-mass carbon dioxide planet of the efficiency sweep shows all three: + +```python +for eps in (0.1, 0.3): + for f_xuv in (10.0, 1e3): + out = dispatch(build_state('CO2', 1.0, 1.0, f_xuv, + settings=DispatchSettings(efficiency=eps))) + hy = out.diagnostics['hydrodynamic'] + print(eps, f_xuv, out.regime, hy['mdot_el'], hy['mdot_rr'], hy['mdot_pl']) +print(hy['efficiency_photon_limit'], hy['selection_mechanism'], + hy['rr_chain']['barometric_factor']) +``` + +Output: + +```text +0.1 10.0 hydrodynamic:EL 2347722.550685174 11494353.468961576 6136531.331966522 +0.1 1000.0 hydrodynamic:RR 234772255.0685174 179061996.4805105 613653133.1966523 +0.3 10.0 hydrodynamic:PL 7043167.652055521 11494353.468961576 6136531.331966522 +0.3 1000.0 hydrodynamic:RR 704316765.2055521 179061996.4805105 613653133.1966523 +0.2613823055955057 RR-selected 0.01746566961540077 +``` + +At 10 W m⁻² and the default efficiency the energy-limited rate is the smallest, at $2.3 \times 10^{6}$ kg s⁻¹. Raise the efficiency to 0.3, past the threshold of 0.26, and the energy-limited rate overtakes the photon count, so the label becomes `hydrodynamic:PL` at $6.1 \times 10^{6}$ kg s⁻¹, the same at any higher efficiency. A hundredfold rise in flux multiplies both of those by a hundred but the recombination-limited rate only by about 16, since recombination returns part of the absorbed energy, so at $10^{3}$ W m⁻² the recombination-limited rate wins at either efficiency, at $1.8 \times 10^{8}$ kg s⁻¹, and the efficiency no longer matters. The last line says how to read that win: `RR-selected` is a transonic wind, not the floored subcritical case, and a barometric factor of 0.017 says only 1.7 percent of the wind-base density survives to the sonic point, so here the rate is set more by the wind's struggle to reach the sonic point than by recombination saturation at the base (the [escape regimes](../Explanations/regimes.md) page separates the two readings). A hydrogen planet does not show all three limits as cleanly: a wind near $10^{4}$ K on a well shallow enough for the photon count to bind has its sonic point inside the wind base, so its recombination-limited wins are the floored value. `photon_limit = False` and `recombination_limit = False` remove the two caps, which is how the rates compare against a code that carries only the energy limit. + ### One more, for evolutionary use Supply the previous label and a hysteresis window opens around the threshold, so a time-stepping track cannot chatter between branches on numerical noise: diff --git a/tests/test_examples.py b/tests/test_examples.py index eb5d4cf6..2ff5a4b0 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -273,6 +273,6 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): ) compared += 1 # Guard against the extraction silently finding nothing, which would make - # the assertions above vacuous. Nineteen of the twenty output blocks are + # the assertions above vacuous. Twenty of the twenty-one output blocks are # comparable here; the stellar track is the integration tier's. - assert compared >= 19, f'only {compared} tutorial output blocks were compared' + assert compared >= 20, f'only {compared} tutorial output blocks were compared' From e67841621bc46f83258180e6612b26ed86f352d2 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 12:30:11 +0200 Subject: [PATCH 107/113] Give the closure's solution algorithm on the fractionation page The fractionation page now states how the closure is solved as the code runs it: the linear system on a fixed escaping set with every entry defined, the mass-flux row that closes it, the retention inequality, the drop-then-readmit active-set iteration with its tolerances, pass limit, and degenerate cases, the per-element outputs, a flowchart, and a worked three-species example whose printed output the code reproduces. The mass constraint is corrected to the sum of m_j X_j w_j, the flux variable is defined as a number flux per unit mole fraction, and the places where the implementation departs from the published closures are listed. The closure paper is cited from its arXiv record, Attia and Lichtenberg (2026), arXiv:2608.30106. --- docs/Explanations/fractionation.md | 144 ++++++++++++++++++++++++++++- docs/Explanations/model.md | 4 +- 2 files changed, 141 insertions(+), 7 deletions(-) diff --git a/docs/Explanations/fractionation.md b/docs/Explanations/fractionation.md index 73f71403..f81f2967 100644 --- a/docs/Explanations/fractionation.md +++ b/docs/Explanations/fractionation.md @@ -1,6 +1,6 @@ # Fractionation -A hydrodynamic wind does not carry every species equally. Light species stream out; heavier ones are dragged along through collisions, lag the flow, and below a species-specific threshold flux they stop escaping altogether while continuing to exert drag on everything that still escapes. Over time this fractionates the atmosphere, enriching it in heavy species, which is one of the main observable signatures escape leaves behind. When the [regime framework](regimes.md) confirms a hydrodynamic wind, ZEPHYRUS partitions the bulk rate over species with a simultaneous N-species closure (Attia & Lichtenberg 2026, in prep. [^attia]); this page describes what the closure solves, where its coefficients come from, and which regimes it applies to. +A hydrodynamic wind does not carry every species equally. Light species stream out; heavier ones are dragged along through collisions, lag the flow, and below a species-specific threshold flux they stop escaping altogether while continuing to exert drag on everything that still escapes. Over time this fractionates the atmosphere, enriching it in heavy species, which is one of the main observable signatures escape leaves behind. When the [regime framework](regimes.md) confirms a hydrodynamic wind, ZEPHYRUS partitions the bulk rate over species with a simultaneous N-species closure (Attia & Lichtenberg 2026 [^attia]); this page describes what the closure solves, where its coefficients come from, which regimes it applies to, and the algorithm the code runs to solve it. ## The problem and the closure @@ -10,11 +10,13 @@ The solved system couples the species drift velocities. For each escaping specie $$\sum_{i\,\mathrm{escaping}} \frac{X_i\,(w_i - w_j)}{b_{ij}} \;-\; w_j \sum_{k\,\mathrm{retained}} \frac{X_k}{b_{jk}} \;=\; \frac{m_j\, g}{k_\mathrm{B} T} - \frac{1}{\bar{H}} \tag{1}$$ -where $X_i$ is the mole fraction of species $i$, $w_i$ its escape velocity scale (the number flux is $\Phi_i = X_i w_i$), $b_{ij}$ the binary diffusion parameter of the pair, $m_j$ the particle mass, $g$ the gravity at the wind base, $T$ the wind temperature, and $\bar{H}$ the one density scale height that every escaping gas shares, itself an unknown of the solve rather than an input. The system closes with the mass constraint that the per-species fluxes carry the bulk rate the regime framework dispatched, $\sum_j m_j X_j \Phi_j = \phi$. +where $X_i$ is the mole fraction of species $i$, $w_i$ its drift variable, the number flux the species would carry at unit mole fraction (its number flux is $\Phi_i = X_i w_i$, so $w_i$ is the total number density times the species' bulk velocity at the base), $b_{ij}$ the binary diffusion parameter of the pair, $m_j$ the particle mass, $g$ the gravity at the wind base, $T$ the wind temperature, and $\bar{H}$ the one density scale height that every escaping gas shares, itself an unknown of the solve rather than an input. Retained species carry $w_k = 0$ and appear only through the second sum on the left. The system closes with the mass constraint that the per-species fluxes carry the bulk mass flux $\phi$ the regime framework dispatched, -Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the unique partition into escaping and retained species for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate at machine precision. +$$\sum_{j\,\mathrm{escaping}} m_j \Phi_j \;=\; \sum_{j\,\mathrm{escaping}} m_j X_j w_j \;=\; \phi. \tag{2}$$ -The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim et al. (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefière (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026, in prep.) [^attia]. +Which species escape is part of the solution, not an input. A heavy species whose settling under gravity beats the drag the outflow can exert on it drops out of the escaping set and moves to the retained set, where it still appears in the drag sums of Eq. (1). The solver finds the partition into escaping and retained species (on the randomized ensembles of the test suite, enumerating every candidate set finds no other) for which every escaping species has a positive flux and every retained species genuinely cannot be lifted; each heavy species therefore has a threshold bulk flux at which it starts to escape, and below the lowest threshold only the lightest species leaves. The returned per-species rates are non-negative and sum to the bulk rate to rounding precision; [solving the closure](#solving-the-closure) below gives the algorithm step by step. + +The closure reproduces, as exact special cases, the published treatments it generalizes: the two-species crossover of Hunten et al. (1987) in the form of Cherubim et al. (2024) [^cherubim], the three-species deuterium system of Gu & Chen (2023) [^guchen], the trace-minor relations of Odert et al. (2018) [^odert] and Zahnle et al. (1990), the non-trace three-species relations of Zahnle & Kasting (2023) [^zk23], and the prescribed-flux partition of Chassefière (1996) [^chassefiere], along with the worked Earth, Mars, and Venus numbers of Hunten et al. (1987). The test suite asserts every one of these reductions, and the general formulation is the subject of Attia & Lichtenberg (2026) [^attia]. ## Coefficients and their provenance @@ -32,9 +34,141 @@ The closure evaluates at the XUV wind base on the atomized composition (molecule The split follows the branch and not the label, which matters under `roche_overflow`, where two readings meet. When the geometric screen renamed a bound state, the label left the rate alone and the split is whatever the branch named in `diagnostics['roche']['rate_branch']` produced. When that field reads `roche_overflow` itself, the tidally driven transfer through L1 was dispatched: it is a bulk flow with no per-species physics, so the elements leave in their reservoir proportions and no closure runs. +## Solving the closure + +`solve_closure` in `zephyrus.fractionation` solves Eqs. (1) and (2) for a given composition and bulk flux, `solve_fixed_active` solves them on one fixed partition into escaping and retained species, and `closure_per_species` wraps both for the dispatcher. The solver works in cgs units: $\phi$ in g cm$^{-2}$ s$^{-1}$, $m_i$ in g, $g$ in cm s$^{-2}$, $b_{ij}$ in cm$^{-1}$ s$^{-1}$, and $k_\mathrm{B} T$ in erg, so that $w_i$ and $\Phi_i$ come out in cm$^{-2}$ s$^{-1}$ and $\bar{H}^{-1}$ in cm$^{-1}$. + +**Inputs and units.** The dispatcher calls `closure_per_species` when a hydrodynamic branch produced the rate, the `fractionate` setting is on, and the rate is positive. It passes the bulk rate $\dot{M}$ (kg s$^{-1}$), the atomized element mole fractions at the wind base, the wind temperature $T$, the planet mass $M_\mathrm{p}$, and the wind-base radius $R_\mathrm{base}$. The wrapper orders the $N$ species by atomic mass, lightest first, renormalizes the mole fractions to $\sum_i X_i = 1$, takes the particle masses $m_i$ from the shared mass table, and evaluates every pair's diffusion parameter at the wind temperature as $b_{ij}(T) = b_{ij}(1000\ \mathrm{K})\,(T / 1000\ \mathrm{K})^{0.75}$, with the 1000 K value from the source order of [coefficients and their provenance](#coefficients-and-their-provenance) and the same exponent for every pair. It then converts the base gravity and the bulk rate to per-area quantities over the full sphere, + +$$g = \frac{G M_\mathrm{p}}{R_\mathrm{base}^2}, \qquad \phi = \frac{\dot{M}}{4\pi R_\mathrm{base}^2}. \tag{3}$$ + +**The linear system on a fixed partition.** Write $\mathcal{A}$ for the escaping (active) set, with $n = |\mathcal{A}|$ members $a_1 < a_2 < \dots < a_n$ in mass order, $\mathcal{R}$ for the retained set, and $\beta_j \equiv m_j g / (k_\mathrm{B} T)$ for the inverse scale height species $j$ would have on its own. The unknowns are the $n$ drift variables of the escaping species and $\bar{H}^{-1}$; retained species have $w_k = 0$ by definition. `solve_fixed_active` assembles Eq. (1) for every escaping species, with $\bar{H}^{-1}$ moved to the left side, and Eq. (2) into one linear system of size $n + 1$, + +$$\begin{pmatrix} L_{11} & \cdots & L_{1n} & 1\\ \vdots & \ddots & \vdots & \vdots\\ L_{n1} & \cdots & L_{nn} & 1\\ m_{a_1} X_{a_1} & \cdots & m_{a_n} X_{a_n} & 0 \end{pmatrix} \begin{pmatrix} w_{a_1}\\ \vdots\\ w_{a_n}\\ \bar{H}^{-1} \end{pmatrix} \;=\; \begin{pmatrix} \beta_{a_1}\\ \vdots\\ \beta_{a_n}\\ \phi \end{pmatrix}, \tag{4}$$ + +with the drag block + +$$L_{pq} = \frac{X_{a_q}}{b_{a_p a_q}} \quad (p \neq q), \qquad L_{pp} = -\sum_{q \neq p} \frac{X_{a_q}}{b_{a_p a_q}} \;-\; \sum_{k \in \mathcal{R}} \frac{X_k}{b_{a_p k}}. \tag{5}$$ + +Row $p$ of Eq. (4) is Eq. (1) for species $a_p$, and the last row is Eq. (2). The retained species enter only through the second sum in $L_{pp}$: they are a static background that drags on every escaping species. The entries of Eq. (4) span more than 20 orders of magnitude (drag coefficients $X/b$ of $10^{-21}$ cm s or less, unit entries in the last column, and products $m X$ near $10^{-24}$ g in the last row), so the matrix is equilibrated on both sides before the solve. With $\mathsf{M}$ the matrix of Eq. (4), $\mathbf{y}$ its right side, $\mathsf{D}_\mathrm{r}$ the diagonal matrix of the inverse row maxima of $|\mathsf{M}|$, and $\mathsf{D}_\mathrm{c}$ the diagonal matrix of the inverse column maxima of $|\mathsf{D}_\mathrm{r} \mathsf{M}|$, the code solves $(\mathsf{D}_\mathrm{r} \mathsf{M} \mathsf{D}_\mathrm{c})\,\mathbf{z} = \mathsf{D}_\mathrm{r}\,\mathbf{y}$ by LU factorization with partial pivoting (`numpy.linalg.solve`) and returns the unknowns as $\mathsf{D}_\mathrm{c}\,\mathbf{z}$. With a single escaping species $j$ the system has a closed-form solution, which the code uses in place of the matrix, + +$$w_j = \frac{\phi}{m_j X_j}, \qquad \bar{H}^{-1} = \beta_j + w_j \sum_{k \in \mathcal{R}} \frac{X_k}{b_{jk}}. \tag{6}$$ + +**The retention inequality.** A retained species $k$ has zero drift, and at the base its density falls with the gradient $d \ln n_k / dr = -\beta_k + \sum_{i \in \mathcal{A}} X_i w_i / b_{ik}$: the drag of the wind supports part of its weight, which is the drag-augmented scale height of Hunten et al. (1987). Staying behind is consistent only if this gradient is at least as steep as the $-\bar{H}^{-1}$ that the escaping gas shares, since otherwise the species' mole fraction would grow with height and the wind would sweep it up. The code evaluates the residual + +$$R_k = \sum_{i \in \mathcal{A}} \frac{X_i w_i}{b_{ik}} \;-\; \left(\beta_k - \bar{H}^{-1}\right), \qquad k \in \mathcal{R}, \tag{7}$$ + +and retention requires $R_k \le 0$. A partition is the solution when both conditions hold at once: $w_j \ge 0$ for every escaping species and $R_k \le 0$ for every retained one. For two species with the lighter one escaping, $R_2 \le 0$ reduces to $m_2 \ge m_\mathrm{c}$, with $m_\mathrm{c} = m_1 + k_\mathrm{B} T\,\Phi_1 / (b_{12}\, g\, X_1)$ the crossover mass of Hunten et al. (1987). + +**The iteration.** `solve_closure` runs the following steps. + +1. Validate the inputs: $\phi \ge 0$; $X_i \ge 0$ with $|\sum_i X_i - 1| \le 10^{-6}$; $m_i > 0$, $T > 0$, and $g > 0$; every off-diagonal $b_{ij}$ finite and positive; and $b$ symmetric entry by entry. Any failure raises `ValueError`. The diagonal of $b$ is ignored (the coefficient library fills it with infinity). +2. If $\phi = 0$, return zero fluxes, an empty escaping set, and $\bar{H}^{-1} = \min_j \beta_j$, the limit of the solution as $\phi \to 0^+$, where only the lightest species escapes. +3. Start with every species escaping, $\mathcal{A} = \{1, \dots, N\}$, and fix two tolerances: $\varepsilon_w = 10^{-12}\, \phi / \min_i m_i$ for drifts and $\varepsilon_k = 10^{-12}\, \beta_k$ for the residual of species $k$. +4. Solve Eq. (4), or Eq. (6) when $\mathcal{A}$ has one member, for $w$ and $\bar{H}^{-1}$. +5. Drop: if any escaping species has $w_j < -\varepsilon_w$, move all such species to $\mathcal{R}$ at once and return to step 4. If this empties $\mathcal{A}$, raise `RuntimeError`. +6. Re-admit: evaluate Eq. (7) for every retained species. If any has $R_k > \varepsilon_k$, move the one with the largest residual, and only that one, back to $\mathcal{A}$ and return to step 4. +7. Accept: set every escaping drift to $\max(w_j, 0)$, which zeroes negative values smaller in magnitude than $\varepsilon_w$, and return $\Phi_j = X_j w_j$ for escaping species and $\Phi_k = 0$ for retained ones. + +Steps 4 to 6 run at most $4N + 8$ times, after which the solver raises `RuntimeError`. Dropping comes before re-admitting, so the residuals of step 6 are only evaluated on a partition whose drifts are all non-negative. Re-admitting a single species per pass, the worst violator, is there to stop the iteration alternating between two labelings of a species that sits at its threshold, where escaping with zero flux and retained with zero residual describe the same state. The code runs no uniqueness check of its own; the test suite enumerates every candidate partition of random systems of three to five species and finds a single one satisfying both conditions, the partition the solver returns. + +```mermaid +flowchart TD + IN(["Bulk flux, composition,
      masses, T, g, b"]) --> Z{"Is the bulk
      flux zero?"} + Z -- yes --> ZERO(["Zero fluxes,
      nothing escapes"]) + Z -- no --> INIT["Start with every
      species escaping"] + INIT --> SOLVE["Solve Eq. (4),
      or Eq. (6) for one species"] + SOLVE --> NEG{"Any escaping drift
      negative beyond
      tolerance?"} + NEG -- yes --> DROP["Retain all of them"] + DROP --> SOLVE + NEG -- no --> RES{"Any retained species
      with a positive
      residual, Eq. (7)?"} + RES -- yes --> ADD["Re-admit the one with
      the largest residual"] + ADD --> SOLVE + RES -- no --> OUT(["Clamp drifts at zero,
      return the fluxes"]) + classDef regime fill:#1e6091,stroke:#0f3a5c,color:#ffffff + classDef decision fill:#f4f4f4,stroke:#888888,color:#111111 + classDef stage fill:#ffffff,stroke:#1e6091,color:#111111 + class ZERO,OUT regime + class Z,NEG,RES decision + class INIT,SOLVE,DROP,ADD stage +``` + +**Degenerate cases.** Zero flux is handled in step 2; the dispatcher never reaches it, since it calls the closure only on a positive rate. One escaping species is solved by Eq. (6), with no matrix. A species at its own threshold can be returned inside the escaping set with zero flux, and a species with zero mole fraction carries no flux and exerts no drag, so it can end in either set; in both cases the flux, not membership of the escaping set, is the verdict. An emptied escaping set or an exhausted iteration raises `RuntimeError`, and the test suite reaches neither. + +**Outputs.** `solve_closure` returns the number fluxes $\Phi_i$ and, on request, $\bar{H}^{-1}$ and the escaping set. `closure_per_species` converts them to per-element mass rates over the full sphere, + +$$\dot{M}_i = 4\pi R_\mathrm{base}^2\, m_i\, \Phi_i, \tag{8}$$ + +in kg s$^{-1}$, and returns them with a diagnostics dictionary, stored as `diagnostics['closure']` in the dispatcher output: `active_set` and `retained` (the two sets, by element), `inv_H_bar_cgs` ($\bar{H}^{-1}$ in cm$^{-1}$), `mass_conservation_rel` (the relative residual $|\sum_i \dot{M}_i - \dot{M}| / \dot{M}$), and `b_provenance` (the source and uncertainty class of every pair). The `rock_former_bij` flag is raised when Na, Mg, Si, or Fe is present. The mass residual is reported and not acted on: no flag or exception depends on it. A further helper, `first_threshold`, returns the bulk flux at which the first heavy species starts to escape. It follows from Eqs. (6) and (7) with only the lightest species $\ell$ escaping and $R_k = 0$, + +$$\phi^{*}_{1} = \min_{k \neq \ell}\; \frac{m_\ell X_\ell\, (\beta_k - \beta_\ell)}{X_\ell / b_{\ell k} + \sum_{k' \neq \ell} X_{k'} / b_{\ell k'}}, \tag{9}$$ + +and the dispatcher does not call it. + +**A worked example.** A wind of atomic hydrogen, helium, and oxygen at 8000 K, launched from a base at two Earth radii on a five Earth-mass planet: + +```python +import math + +import numpy as np + +from zephyrus.constants import G, kb_cgs +from zephyrus.diffusion import bmatrix, masses_g +from zephyrus.fractionation import closure_per_species, first_threshold +from zephyrus.planets_parameters import Me, Re + +composition = {'H': 0.85, 'He': 0.10, 'O': 0.05} +T, M_p, R_base = 8000.0, 5 * Me, 2 * Re + +species = list(composition) +X = np.array([composition[s] for s in species]) +m = masses_g(species) +g = G * M_p / R_base**2 * 1e2 # cm s^-2 +area = 4 * math.pi * (R_base * 1e2) ** 2 # cm^2 +phi_1 = first_threshold(X, m, T, g, bmatrix(species, T)) +print(f'first threshold {phi_1 * area * 1e-3:.3e} kg/s') +print(f'mbar g / kT {np.sum(X * m) * g / (kb_cgs * T):.4e} cm^-1') + +for mdot in (2.0e5, 1.0e6): + rates, diag, flags = closure_per_species(mdot, composition, T, M_p, R_base) + print(f'mdot = {mdot:.1e} kg/s') + print(' escaping', diag['active_set'], ' retained', diag['retained']) + print(' rates ', {el: f'{r:.3e}' for el, r in rates.items()}) + print(f" 1/Hbar {diag['inv_H_bar_cgs']:.4e} cm^-1") + print(f" residual {diag['mass_conservation_rel']:.1e}") +``` + +Output: + +```text +first threshold 1.175e+05 kg/s +mbar g / kT 3.7879e-09 cm^-1 +mdot = 2.0e+05 kg/s + escaping ['H', 'He'] retained ['O'] + rates {'H': '1.745e+05', 'He': '2.552e+04', 'O': '0.000e+00'} + 1/Hbar 3.0980e-09 cm^-1 + residual 1.5e-16 +mdot = 1.0e+06 kg/s + escaping ['H', 'He', 'O'] retained [] + rates {'H': '5.729e+05', 'He': '2.085e+05', 'O': '2.186e+05'} + 1/Hbar 3.7879e-09 cm^-1 + residual 0.0e+00 +``` + +Helium starts to escape at $1.175 \times 10^{5}$ kg s$^{-1}$. At $2 \times 10^{5}$ kg s$^{-1}$ oxygen is still retained and hydrogen carries 87% of the mass loss; at $10^{6}$ kg s$^{-1}$ all three escape. With every species escaping, weighting Eq. (1) by $X_j$ and summing cancels the drag terms pairwise, because $b$ is symmetric, and leaves $\bar{H}^{-1} = \bar{m} g / (k_\mathrm{B} T)$ with $\bar{m} = \sum_j X_j m_j$; the solver's multiplier at $10^{6}$ kg s$^{-1}$ matches that independent value to the printed digits. With oxygen retained, part of the wind's momentum goes into holding it up, and $\bar{H}^{-1}$ falls below the mean-mass value. + +**Where the code departs from the published closures.** The system solved is that of Zahnle et al. (1990) in the subsonic, constant-composition limit; it shares their isothermal and neutral-gas assumptions and, like them, neglects thermal diffusion. The departures, from their treatment and from the two-species limit of Hunten et al. (1987), are these. + +- **Prescribed total flux.** Hunten et al. (1987) prescribe the hydrogen flux and Zahnle et al. (1990) the flux of their species 1, and both compute what the heavy species do. Here the bulk mass flux is prescribed by the regime framework, Eq. (2), and every species' flux, the lightest included, is an output, so each entrained heavy species is charged against the budget the light species would otherwise carry. The prescribed-total construction is that of Chassefière (1996), for two species. +- **No designated primary, solved simultaneously.** Zahnle et al. (1990) write the multispecies system for any number of species but solve it only in truncations: at most two major species, minor species as passive test particles with no back-reaction and no coupling to each other, and the limiting flux through two retained heavies only through an approximate harmonic mean (their Eq. 43). The code solves for all $N$ drift variables at once, every pair coupled, with hydrogen given no special role. +- **Pair-specific coefficients, no crossover mass.** Hunten et al. (1987) use one diffusion parameter for every pair, which gives every heavy species the same crossover mass. Here each pair has its own $b_{ij}$, so no single crossover mass exists (as Zahnle et al. 1990 note), and the retention inequality of Eq. (7) replaces the crossover-mass test, reducing to it for two species. +- **A hard zero below threshold.** A retained species carries zero flux. The continuous forms of Zahnle & Kasting (1986, their Eqs. 14 and 16) and of Zahnle et al. (1990, their Eq. 39) keep a small nonzero escape rate at and just below a species' threshold flux, so the code underestimates the fluxes of species close to their thresholds. Hunten et al. (1987) have the same sharp threshold. +- **One level, no radial integration.** The closure is algebra at the wind base. Zahnle et al. (1990) integrate the minor species' composition with height (their Eqs. 37 to 39) and solve the limiting-flux problem as a transonic wind; under constant composition every term of Eq. (1) scales with the same power of radius for co-escaping species, so one level suffices for them, while retained species enter only through their mole fractions at the base. +- **Atoms, not molecules.** Zahnle et al. (1990) work with molecular H$_2$, CO$_2$, and N$_2$; the closure runs on the atomized composition at the wind base (see [where it applies](#where-it-applies)). + --- -[^attia]: Attia, M., & Lichtenberg, T. (2026). In preparation. +[^attia]: Attia, M., & Lichtenberg, T. (2026). Atmospheric escape fractionates secondary but not primary atmospheres. *arXiv e-prints*, arXiv:2608.30106. https://doi.org/10.48550/arXiv.2608.30106 [^hunten]: Hunten, D. M., Pepin, R. O., & Walker, J. C. G. (1987). Mass Fractionation in Hydrodynamic Escape. *Icarus, 69*, 532–549. diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 129f65e3..69c8f179 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -49,7 +49,7 @@ The energy-limited (EL) rate is the default prescription: it is what PROTEUS con The full classification framework is available as the standalone entry point `zephyrus.dispatch`, which takes one planetary state (scalars plus an atmosphere profile) and returns the regime label, the bulk rate, per-species rates that sum to it, flags, and the diagnostics container. Its coupling into PROTEUS is planned as a follow-up to the current energy-limited wiring; until then, coupled runs use the EL default and standalone studies can use either entry point. -Whichever regime sets the bulk rate, the loss is also partitioned over chemical species. Confirmed hydrodynamic winds fractionate: heavy species lag the outflow through diffusive drag and can drop out of it entirely, which the N-species closure of the [fractionation](fractionation.md) page resolves (Attia & Lichtenberg 2026, in prep. [^attia]). The other regimes split the rate by reservoir mass fractions, and the hydrostatic regime is natively per-species. +Whichever regime sets the bulk rate, the loss is also partitioned over chemical species. Confirmed hydrodynamic winds fractionate: heavy species lag the outflow through diffusive drag and can drop out of it entirely, which the N-species closure of the [fractionation](fractionation.md) page resolves (Attia & Lichtenberg 2026 [^attia]). The other regimes split the rate by reservoir mass fractions, and the hydrostatic regime is natively per-species. ## The impact channel @@ -69,6 +69,6 @@ A giant collision removes part of the target's atmosphere in a single event, on --- -[^attia]: Attia, M., & Lichtenberg, T. (2026). In preparation. +[^attia]: Attia, M., & Lichtenberg, T. (2026). Atmospheric escape fractionates secondary but not primary atmospheres. *arXiv e-prints*, arXiv:2608.30106. https://doi.org/10.48550/arXiv.2608.30106 [^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb From f07affc48b66eb35ada1430edbfd5dc1f6c167bd Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 12:33:43 +0200 Subject: [PATCH 108/113] Write every escape rate out on the regimes page The escape regimes page is now a stand-alone Methods section in which every rate the dispatcher can compute or dispatch is a numbered equation, written as the code computes it with each symbol defined: the tidal factor, the boil-off activation parameter, Parker rate, Bondi cap, luminosity cap, and bolometric candidate, the energy-limited, recombination-limited, and photon-limited rates with their crossover efficiency and minimum, the sonic-point Knudsen number, the hydrostatic Jeans, diffusion-limited, and combined per-species fluxes with the bulk rate and the escape temperatures that gate it, the L1 transfer rate with its lobe, potentials, applicability criterion, and orbit average, and the dispatched rate as the maximum over surviving candidates before the Roche screen. Where the code departs from a published form, the page says how. The flowchart names all three wind limits, and the label count is six. --- docs/Explanations/regimes.md | 283 ++++++++++++++++++++++++++++------- 1 file changed, 229 insertions(+), 54 deletions(-) diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 965ceca3..37446efc 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -1,17 +1,28 @@ # Escape regimes -This page defines the escape-regime framework behind `zephyrus.dispatch`: the quantities it evaluates, the order it evaluates them in, and the rate physics of every branch. The [model overview](model.md) gives the short version with a flowchart; here every threshold and equation is spelled out. The [energy-limited escape](energy_limited.md) and [fractionation](fractionation.md) pages define the two pieces that have their own pages. +This page is the Methods description of `zephyrus.dispatch`: the quantities it evaluates, the order it evaluates them in, and every mass-loss rate it can compute or dispatch, written as the code computes it. The [model overview](model.md) gives the short version with a simpler flowchart. The [fractionation](fractionation.md) page defines the closure that partitions a hydrodynamic rate over species, and the [energy-limited escape](energy_limited.md) page describes the released standalone entry point `EL_escape`, whose physics the dispatcher reuses in the form given in Eq. (11) below. -One call takes one planetary state and returns one verdict. The inputs are the planet mass $M_\mathrm{p}$ and interior radius $R_\mathrm{p}$, the stellar mass $M_\star$, the orbit ($a$, $e$), the equilibrium temperature $T_\mathrm{eq}$, the XUV and interior heat fluxes $F_\mathrm{XUV}$ and $F_\mathrm{int}$, the photospheric opacity $\kappa$, and an atmosphere profile (pressure, radius, temperature, composition, and mean molecular mass per level, from the base to the top of the modeled atmosphere). The output is one of the five regime labels, a bulk mass-loss rate, per-species rates that sum to it, flags recording every clamp and fallback, and a diagnostics container that reports how close the state sat to each boundary. Every physically posed input returns a result; exceptions are reserved for malformed input. +One call takes one planetary state and returns one verdict. The inputs are the planet mass $M_\mathrm{p}$ and interior radius $R_\mathrm{p}$, the stellar mass $M_\star$, the orbit (semi-major axis $a$, eccentricity $e$), the equilibrium temperature $T_\mathrm{eq}$, the XUV flux at the planet $F_\mathrm{XUV}$, the interior heat flux $F_\mathrm{int}$, the bolometric instellation $F_\mathrm{bol}$, the photospheric opacity $\kappa$, and an atmosphere profile (pressure, radius, temperature, species mixing ratios, and mean molecular mass per level, from the base to the top of the modeled atmosphere). The output is one of six regime labels (`boiloff`, `hydrodynamic:EL`, `hydrodynamic:RR`, `hydrodynamic:PL`, `hydrostatic`, `roche_overflow`), a bulk mass-loss rate $\dot{M}$, per-species rates that sum to it, flags recording every clamp and fallback, and a diagnostics container reporting how close the state sat to each boundary. Every physically posed input returns a result; exceptions are reserved for malformed input. + +## Notation + +Every rate is a mass-loss rate in kg s⁻¹, written $\dot{M}_\mathrm{X}$ with an upright label naming its physics: $\dot{M}_\mathrm{P}$ (Parker wind), $\dot{M}_\mathrm{B}$ (Bondi cap), $\dot{M}_\mathrm{E}$ (luminosity cap), $\dot{M}_\mathrm{bol}$ (the bolometric candidate), $\dot{M}_\mathrm{EL}$, $\dot{M}_\mathrm{RR}$, and $\dot{M}_\mathrm{PL}$ (energy-limited, radiation-recombination-limited, and photon-limited), $\dot{M}_\mathrm{hyd}$ (the hydrodynamic candidate), $\dot{M}_\mathrm{hs}$ (the hydrostatic rate), and $\dot{M}_\mathrm{L1}$ (the transfer through the inner Lagrange point). Radii are capitalized. Quantities at the sonic point of the XUV wind carry the subscript s (the nozzle's isothermal sonic radius is $R_\mathrm{s,L1}$), the bolometric wind's sonic (Bondi) quantities carry B, and per-species quantities carry the index $i$ (atomized elements the index $j$). $G$ is the gravitational constant, $k_\mathrm{B}$ the Boltzmann constant, and $m_\mathrm{p}$ the proton mass. Units are SI throughout; mean masses written $\mu$ with a level subscript are in kg per particle, while the wind mean masses $\mu_\mathrm{w}$ and $\mu_+$ are in atomic mass units and are multiplied by $m_\mathrm{p}$ where they enter a formula. + +Four levels of the atmosphere recur. + +- **The photospheric working level** sits at pressure $P_\mathrm{ph}$ (the setting `P_photo`, default 2000 Pa, that is, 20 mbar, the photosphere-type level of Baumeister et al. 2023 [^baumeister]), with radius $R_\mathrm{ph}$, temperature $T_\mathrm{ph}$, mass density $\rho_\mathrm{ph}$, and mean molecular mass $\mu_\mathrm{ph}$, all interpolated linearly in log pressure on the profile (clamped to the nearest end level, flagged `photo_clamped`, when the profile does not span $P_\mathrm{ph}$). This one level is the XUV-absorbing radius of the energy-limited and photon-limited rates, the surface the boil-off activation parameter is evaluated on, the launch level of the Parker wind, and the default launch level of the L1 nozzle. Their published calibrations refer to different surfaces, so sharing one level is a simplification of the model rather than a property of the physics. +- **The wind base**, radius $R_\mathrm{base}$, where the XUV heating is deposited and the hydrodynamic wind is launched (Eq. 9). +- **The profile top**, pressure $P_\mathrm{top}$, radius $R_0$, and temperature $T_\mathrm{top}$, from which the hydrostatic branch extends the structure upward. +- **The exobase**, radius $R_\mathrm{exo}$, located on that extension (Eq. 22). ## The evaluation order -1. The bolometric (boil-off) candidate is computed at every call. If the restricted Jeans parameter sits below its threshold, the atmosphere is boiling off and that candidate is the rate; XUV-driven escape needs a stable base to launch from, and a bolometrically boiling atmosphere has not built one yet, which is why this test precedes everything else [^owensch]. -2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smaller of the energy-limited and radiation-recombination-limited rates, with the winner naming the sub-label. +1. The bolometric (boil-off) candidate is computed at every call. If the restricted Jeans parameter sits below its threshold, the atmosphere is boiling off and that candidate is the rate. XUV-driven escape needs a stable base to launch from, and a bolometrically boiling atmosphere has not built one yet, which is why this test precedes everything else [^owensch]. +2. Otherwise the hydrodynamic candidate is assembled: the wind base is located on the profile, a thermostat sets the wind temperature, and the candidate is the smallest of the energy-limited, radiation-recombination-limited, and photon-limited rates, with the winner naming the sub-label. 3. The sonic-point Knudsen number decides whether that wind is collisional enough to exist. If it is, the hydrodynamic label stands and the [fractionation closure](fractionation.md) partitions the rate over species; if not, the state re-routes to the hydrostatic branch. -4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure. Its stability gate can send a thermally unstable exosphere back to the hydrodynamic rate. +4. The hydrostatic branch evaluates per-species Jeans escape on an extended upper structure, capped by the diffusive supply of each species. Its escape-temperature gate sends a thermally unstable exosphere back to the hydrodynamic rate. 5. Past the activation gate the bolometric candidate is still computed, capped by the interior luminosity, and reported as the residual. It competes for the rate and the label only when the `residual_mode` setting admits it, and by default it does not. The tidally driven transfer through the L1 nozzle [^jackson17] competes last, on both sides of the gate, wherever the overflow description applies; a nozzle win labels the state `roche_overflow` and dispatches the transfer rate itself. -6. Last, the Roche screen tests the active flow radius against the Hill sphere; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after both comparisons, so the radius it tests belongs to the branch that actually won. +6. Last, the Roche screen tests the flow radius of the winning branch against the Hill radius; an overflowing state is renamed `roche_overflow` and keeps the rate its own branch computed. The screen runs after both comparisons, so the radius it tests belongs to the branch that won. ```mermaid flowchart TD @@ -19,21 +30,21 @@ flowchart TD BOLO --> Q1{"Lambda below
      threshold?"} Q1 -- yes --> BO["BOIL-OFF
      uncapped bolometric rate"] Q1 -- no --> BASE["Wind base on the profile
      + thermostat wind temperature"] - BASE --> HYD["Candidates:
      energy limited, recombination limited"] + BASE --> HYD["Candidates: energy limited,
      recombination limited,
      photon limited"] HYD --> Q2{"Sonic-point Knudsen
      below threshold?"} - Q2 -- yes --> HD["HYDRODYNAMIC
      min of the three, winner names
      EL, RR, or PL + fractionation"] + Q2 -- yes --> HD["HYDRODYNAMIC
      min of the enabled limits, winner
      names EL, RR, or PL + fractionation"] Q2 -- no --> Q3{"Exobase hotter than half
      the escape temperature?"} Q3 -- yes --> HD Q3 -- no --> HS["HYDROSTATIC
      per-species Jeans
      + diffusion supply cap"] BO --> QN HD --> Q4{"Residual admitted by the setting
      and larger than the branch rate?"} HS --> Q4 - Q4 -- yes --> BO2["BOIL-OFF
      residual takes the label"] + Q4 -- yes --> BO2["BOIL-OFF
      luminosity-capped residual
      takes the label"] Q4 -- no --> KEEP["Branch label stands"] BO2 --> QN{"L1 nozzle applicable
      and larger than
      the standing rate?"} KEEP --> QN QN -- yes --> RN["ROCHE OVERFLOW
      L1 nozzle transfer rate"] - QN -- no --> Q5{"Active flow radius
      past the Hill radius?"} + QN -- no --> Q5{"Flow radius
      past the Hill radius?"} Q5 -- yes --> RO["ROCHE OVERFLOW
      the branch rate stands,
      as a lower limit"] Q5 -- no --> OUT(["Regime label + bulk rate
      + per-species rates
      + flags + diagnostics"]) RN --> OUT @@ -46,108 +57,272 @@ flowchart TD class BOLO,BASE,HYD,KEEP stage ``` -Every branch below is one box of that figure, and the two refinements the [model overview](model.md) leaves out of its own flowchart are the diamonds `Q3` and `Q4`: a thermally unstable exosphere returns to the wind rate, and the bolometric residual enters the comparison past the activation gate when the setting admits it. +Every section below is one box of that figure. The two refinements the [model overview](model.md) leaves out of its own flowchart are the diamonds `Q3` and `Q4`: a thermally unstable exosphere returns to the wind rate, and the bolometric residual enters the comparison past the activation gate when the setting admits it. + +## Tidal geometry + +Three of the rates below measure a potential barrier, and a close-in planet's barrier is lowered by the star's tidal field. Both the barrier reduction and the Roche screen are built on the Hill radius at periapsis, + +$$R_\mathrm{Hill} \;=\; a\,(1 - e)\left(\frac{M_\mathrm{p}}{3\,M_\star}\right)^{1/3} \tag{1}$$ + +and the barrier reduction is the factor of Erkaev et al. (2007), their Eq. (17) [^erkaev], + +$$K(\xi) \;=\; 1 - \frac{3}{2\xi} + \frac{1}{2\xi^3} \;=\; \frac{(\xi - 1)^2\,(2\xi + 1)}{2\xi^3}, \qquad \xi = \frac{R_\mathrm{Hill}}{R_\mathrm{p}} \tag{2}$$ + +with $\xi$ measured from the interior radius $R_\mathrm{p}$, the radius that appears linearly in the energy-limited rate of Eq. (11) and therefore the one the barrier refers to (the convention of Erkaev et al., whose $\xi$ is the Roche-lobe distance over the planetary radius). $K$ lies in $(0, 1)$ for $\xi > 1$ and rises toward 1 far inside the Hill sphere; the rates divide by it, so tides enhance escape. At $\xi \le 1$ the barrier is gone: the rates are then computed with $K = 1$, flagged `k_tide_undefined`, and the Roche screen relabels the state. Setting `tidal = False` gives $K = 1$ everywhere. + +## Boil-off and the bolometric candidate -## Boil-off +A freshly formed or strongly heated planet can hold an atmosphere so distended that its outer layers approach the sonic point of a thermal wind; the gas then flows out on the planet's own thermal energy, with the stellar continuum keeping it near isothermal, before XUV heating matters. The activation criterion is the restricted Jeans parameter [^fossati] -A freshly formed or strongly heated planet can hold an atmosphere so distended that its outer layers sit beyond the sonic point of a thermal wind: the gas then flows out on the planet's own thermal energy alone. The activation criterion is the restricted Jeans parameter [^fossati] +$$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu_\mathrm{ph}}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{ph}} \tag{3}$$ -$$\Lambda \;=\; \frac{G\,M_\mathrm{p}\,\mu}{k_\mathrm{B}\,T_\mathrm{eq}\,R_\mathrm{launch}} \tag{1}$$ +the ratio of a particle's gravitational binding energy to its thermal energy, evaluated at the photospheric working level with the mean molecular mass there. The photospheric level is the surface the threshold below is calibrated on. In a coupled run $R_\mathrm{p}$ is the interior radius, which on an inflated envelope sits well below the photosphere, and a parameter built there would close the gate while the Parker wind is still running. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu_\mathrm{ph}$, so their $\Lambda$ and this one differ by $\mu_\mathrm{ph} / m_\mathrm{H}$, and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it makes the identity below hold, and therefore makes the threshold one number for every composition instead of one per composition. For isothermal gas at $T_\mathrm{eq}$, $\Lambda = 2 R_\mathrm{B}' / R_\mathrm{ph}$ identically, where $R_\mathrm{B}' = G M_\mathrm{p} \mu_\mathrm{ph} / (2 k_\mathrm{B} T_\mathrm{eq})$ is the Bondi radius at that temperature, so the shutoff Owen & Wu (2016) find with the photosphere at a tenth of the Bondi radius is $\Lambda = 20$ for every composition [^owenwu]. That threshold $\Lambda_\mathrm{c}$ (`lambda_crit`) is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. -the ratio of a particle's gravitational binding energy to its thermal energy, evaluated at the photospheric launch level (radius $R_\mathrm{launch}$, the 20 mbar level by default) with the mean molecular mass $\mu$ of the atmosphere there and the Boltzmann constant $k_\mathrm{B}$. The launch level is the surface the threshold below is calibrated on. In a coupled run $R_\mathrm{p}$ is the interior radius, which on an inflated envelope sits well below the photosphere, and a parameter built there would close the gate while the Parker wind is still running. One convention differs from the source: Fossati et al. write their parameter with the atomic hydrogen mass in place of $\mu$, so their $\Lambda$ and this one differ by $\mu / m_\mathrm{H}$ and their numbers cannot be compared with these without that conversion. The composition mean mass is used here because it is what makes the identity below hold, and therefore what makes the threshold one number for every composition instead of one per composition. For isothermal gas at $T_\mathrm{eq}$, $\Lambda = 2 R_\mathrm{B} / R_\mathrm{launch}$ identically, where $R_\mathrm{B} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ is the sonic (Bondi) radius at the isothermal sound speed $c_\mathrm{s}$ of that temperature, so the shutoff Owen & Wu (2016) find with the photosphere at a tenth of the Bondi radius is $\Lambda = 20$ for every composition [^owenwu]. Eqs. (2) and (3) below run at the cooler wind temperature, whose Bondi radius is larger by $2^{1/4}$, so in their $x$ the gate sits at $x = 2^{3/4} / 20 = 0.084$. That threshold is the default, with the literature spread of 15 to 35 reported as its band; its calibration on hydrogen-rich envelopes is an assumption the diagnostics keep visible. +The wind itself runs at the temperature Misener et al. (2025) recommend for the isothermal formulas [^misener], cooler than $T_\mathrm{eq}$, which sets its sound speed and sonic radius: -While $\Lambda < 20$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), evaluated at wind temperature $T_\mathrm{eq}/2^{1/4}$ (the recommendation of Misener et al. 2025 for the isothermal formulas [^misener]): +$$T_\mathrm{B} = \frac{T_\mathrm{eq}}{2^{1/4}}, \qquad c_\mathrm{B} = \sqrt{\frac{k_\mathrm{B} T_\mathrm{B}}{\mu_\mathrm{ph}}}, \qquad R_\mathrm{B} = \frac{G M_\mathrm{p}}{2\,c_\mathrm{B}^2} \tag{4}$$ -$$\dot{M}_\mathrm{P} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{s}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \quad x = \frac{R_\mathrm{launch}}{R_\mathrm{B}} \tag{2}$$ +$R_\mathrm{B}$ is larger than $R_\mathrm{B}'$ by $2^{1/4}$, so in the variable $x = R_\mathrm{ph}/R_\mathrm{B}$ of the rates below the gate sits at $x = 2^{3/4} / 20 = 0.084$. While $\Lambda < \Lambda_\mathrm{c}$ the state is labeled `boiloff` and the rate is the closed-form transonic Parker wind of Owen & Wu (2016), their Eq. (6), with the photospheric Mach number in the exact Lambert-function form of their Eq. (7) [^owenwu]: -where $\mathcal{M}$ is the Mach number at the launch level (the photospheric level, radius $R_\mathrm{launch}$), $W_0$ is the principal branch of the Lambert function, and $\kappa$ is the photospheric opacity, which the rate scales inversely with. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; for small $x$ the rate shuts off exponentially, which is the physical end of boil-off. The rate is capped by the Bondi-limited supply, in the form of Misener et al. (2025) Eq. (10) [^misener], +$$\dot{M}_\mathrm{P} \;=\; \frac{4\pi\,G\,M_\mathrm{p}\,\mathcal{M}}{\kappa\,c_\mathrm{B}}, \qquad \mathcal{M} = \sqrt{-W_0\!\left(-x^{-4}\,e^{\,3 - 4/x}\right)}, \qquad x = \frac{R_\mathrm{ph}}{R_\mathrm{B}} \tag{5}$$ -$$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{s}\, \rho_\mathrm{launch}\, \exp\!\left(2 - \frac{2 R_\mathrm{B}}{R_\mathrm{launch}}\right) \tag{3}$$ +where $\mathcal{M}$ is the Mach number at the launch level and $W_0$ the principal branch of the Lambert function. The rate is $4\pi R_\mathrm{ph}^2 \rho u$ at a launch level of unit optical depth, where the pressure is $g/\kappa$, which is why it scales as $1/\kappa$. At $x = 1$ the launch level is sonic and $\mathcal{M} = 1$; a launch level outside the Bondi radius is clamped to $x = 1$ and flagged `bondi_inflated`. For small $x$ the Mach number, and with it the rate, shuts off exponentially, which is the physical end of boil-off. The exact form is used rather than their small-$x$ asymptote, which absorbs an order-unity prefactor. -with $\rho_\mathrm{launch}$ the mass density at the launch level, carried hydrostatically to the sonic point, and evaluated at the same wind temperature as Eq. (2), which is the temperature Misener et al. recommend for it. Gupta & Schlichting (2020) write the cap without the factor $e^2$ and at $T_\mathrm{eq}$ [^gs20]; their form is larger than Eq. (3) by $e^{-2}\, 2^{-3/8} \exp[\Lambda (2^{1/4} - 1)]$ with $\Lambda$ from Eq. (1), a factor of 4.6 at the gate. Against the Parker rate the cap is $\tau_\mathrm{launch} (T_\mathrm{w} / T_\mathrm{launch}) \exp(1/2 - \mathcal{M}^2/2)$, with $T_\mathrm{w}$ the wind temperature, $T_\mathrm{launch}$ the profile temperature at the launch level, and $\tau_\mathrm{launch} = \kappa P / g$ that level's optical depth to the supplied opacity. The cap therefore binds only on a launch level optically thin to that opacity, below an optical depth of about 0.6 on a level at the wind temperature. `tau_launch` and `binding_cap` in the diagnostics say which case a state is in. Past the $\Lambda$ gate the same capping machinery survives, with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies, +The rate is capped by the Bondi-limited supply, in the form of Misener et al. (2025), their Eq. (10) [^misener]: -$$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int} \tag{4}$$ +$$\dot{M}_\mathrm{B} \;=\; 4\pi R_\mathrm{B}^2\, c_\mathrm{B}\, \rho_\mathrm{ph}\, \exp\!\left(2 - \frac{2 R_\mathrm{B}}{R_\mathrm{ph}}\right) \tag{6}$$ -with $g$ the surface gravity and $K$ the tidal reduction factor of Erkaev et al. (2007) [^erkaev] evaluated at $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ [^gs19]. The denominator is the work per unit mass needed to lift gas out of the potential well, which is the same quantity the energy-limited rate on the [energy-limited page](energy_limited.md) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and an admitted residual and the XUV rate it competes with in step 5 measure one barrier between them. Setting `tidal = False` returns $K = 1$ and the untidal form. The rate that survives the gate is therefore $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B}, \dot{M}_\mathrm{E})$, reported in `diagnostics['bolometric']` on every call as the residual. Whether it also competes is the `residual_mode` setting. Under `'luminosity_capped'` step 5 of the evaluation order compares it against the rate of the branch that won above and the larger one takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. +the launch density carried hydrostatically to the sonic point and multiplied by the sonic speed over the sonic sphere, at the same wind temperature as Eq. (5), which is the temperature Misener et al. recommend for it. The launch level stands in for their radiative-convective boundary. Gupta & Schlichting (2020), their Eq. (10), write the cap without the factor $e^2$ and at $T_\mathrm{eq}$ [^gs20]; their form is larger than Eq. (6) by $e^{-2}\, 2^{-3/8} \exp[\Lambda (2^{1/4} - 1)]$, a factor of 4.6 at the gate. Against the Parker rate the cap is $\dot{M}_\mathrm{B} / \dot{M}_\mathrm{P} = \tau_\mathrm{ph} (T_\mathrm{B} / T_\mathrm{ph}) \exp(1/2 - \mathcal{M}^2/2)$, with $\tau_\mathrm{ph} = \kappa P_\mathrm{ph} R_\mathrm{ph}^2 / (G M_\mathrm{p})$ the plane-parallel optical depth of the launch level to the supplied opacity. The cap therefore binds only on a launch level optically thin to that opacity, below an optical depth of about 0.6 on a level at the wind temperature. `tau_launch` and `binding_cap` in `diagnostics['bolometric']` say which case a state is in. -Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting (2019) find that a bolometric wind fed by the cooling interior persists for gigayears, at the smaller of the Bondi-limited rate and the cooling-luminosity rate of Eq. (4) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. Here the dispute is confined to a narrow band past the gate. On a three Earth-mass hydrogen envelope at 0.1 au under an XUV flux of 10 W m⁻², the candidate past the gate is set by the Parker rate of Eq. (2) almost everywhere, since the closed form is still shutting off; it exceeds the XUV rate only while $\Lambda$ stays below about 21 to 23 (lower for a cooler envelope), by up to a factor of about 9 just past the gate between 1000 and 1500 K, and has fallen to 3 to 7 percent of it at $\Lambda = 25$. The default reports the candidate and does not dispatch it, which follows Tang et al. and makes the gate a jump in the dispatched rate. Measured at the gate itself on a three Earth-mass hydrogen and helium envelope at 1000 K and 0.0775 au, it is a factor of 5.2 under that XUV flux and 518 under 0.1 W m⁻², where the XUV rate is small (3.0 and 303 with `photon_limit = False`). A run that wants the rate continuous across the gate sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. Their termination timescale is computed on the closed-form wind before the luminosity cap, since that cap and their cooling time are set by the same luminosity, and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. +Past the gate the same machinery survives with one cap added: the atmosphere has contracted, so the outflow can no longer draw on the envelope's own inflation and is limited by the heat the interior supplies. Dividing the interior luminosity by the work per unit mass needed to lift gas out of the well gives the cap of Gupta & Schlichting (2019), the cooling-luminosity term of their Eq. (8) [^gs19]: + +$$\dot{M}_\mathrm{E} \;=\; \frac{L_\mathrm{int}}{g_\mathrm{p}\,R_\mathrm{p}\,K}, \qquad L_\mathrm{int} = 4\pi R_\mathrm{p}^2 F_\mathrm{int}, \qquad g_\mathrm{p} = \frac{G M_\mathrm{p}}{R_\mathrm{p}^2} \tag{7}$$ + +with $K$ from Eq. (2). The denominator is the same barrier the energy-limited rate of Eq. (11) divides by, measured from the same radius: a planet close to filling its Roche lobe has a shallower barrier, so the same interior heat lifts more gas, and an admitted residual and the XUV rate it competes with measure one barrier between them. The bolometric candidate is the minimum over the caps in force, + +$$\dot{M}_\mathrm{bol} \;=\; \begin{cases} \min\left(\dot{M}_\mathrm{P},\ \dot{M}_\mathrm{B}\right), & \Lambda < \Lambda_\mathrm{c} \\ \min\left(\dot{M}_\mathrm{P},\ \dot{M}_\mathrm{B},\ \dot{M}_\mathrm{E}\right), & \Lambda \ge \Lambda_\mathrm{c} \end{cases} \tag{8}$$ + +reported in `diagnostics['bolometric']` on every call; past the gate it is the residual. Whether the residual also competes is the `residual_mode` setting. Under `'luminosity_capped'` it enters the final comparison of Eq. (38) and the larger rate takes both the rate and the label; under the default `'off'` it is reported and the branch verdict stands, and `competes` in the same diagnostics group says which happened. + +Whether that residual is physical is disputed, and the default takes the side that dispatches less. Gupta & Schlichting (2019) find that a bolometric wind fed by the cooling interior persists for gigayears, at the smaller of the Bondi-limited rate and the cooling-luminosity rate of Eq. (7) [^gs19]. Tang et al. (2024) find that once boil-off is initialized self-consistently the same wind removes at most a tenth of a percent of the envelope over gigayears, and diagnose the persistent rate as an artifact of coupling the wind to the core luminosity, of a missing wind energy-loss term, and of pre-boil-off initial conditions [^tang]. Here the dispute is confined to a narrow band past the gate. On a three Earth-mass hydrogen envelope at 0.1 au under an XUV flux of 10 W m⁻², the candidate past the gate is set by the Parker rate of Eq. (5) almost everywhere, since the closed form is still shutting off; it exceeds the XUV rate only while $\Lambda$ stays below about 21 to 23 (lower for a cooler envelope), by up to a factor of about 9 just past the gate between 1000 and 1500 K, and has fallen to 3 to 7% of it at $\Lambda = 25$. The default reports the candidate and does not dispatch it, which follows Tang et al. and makes the gate a jump in the dispatched rate. Measured at the gate itself on a three Earth-mass hydrogen and helium envelope at 1000 K and 0.0775 au, it is a factor of 5.2 under that XUV flux and 518 under 0.1 W m⁻², where the XUV rate is small (3.0 and 303 with `photon_limit = False`). A run that wants the rate continuous across the gate sets `residual_mode = 'luminosity_capped'`, and the two runs differ by the candidate rate the diagnostics print either way. The termination timescale of Tang et al. (their Eq. 8) is computed on the closed-form wind $\min(\dot{M}_\mathrm{P}, \dot{M}_\mathrm{B})$ before the luminosity cap, since that cap and their cooling time are set by the same luminosity, and reported beside the rate, never used as a gate, so the reader can see how long the branch would survive under their criterion whichever setting is in force. ## The hydrodynamic wind -Past the boil-off gate, stellar XUV heating can drive a fluid wind. Three pieces are assembled. +Past the boil-off gate, stellar XUV heating can drive a fluid wind. Its rate is the smallest of three limits built on one wind base and one wind temperature. + +**The wind base.** XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, which over one scale height is the pressure level of Lopez (2017) [^lopez2017], + +$$P_\mathrm{base} \;=\; \frac{\mu_\mathrm{base}\, g_\mathrm{base}}{\sigma_{\nu_0,\mathrm{H}}}, \qquad g_\mathrm{base} = \frac{G M_\mathrm{p}}{R_\mathrm{base}^2} \tag{9}$$ + +about a nanobar, with $\mu_\mathrm{base}$ the profile's mean molecular mass at that level and $\sigma_{\nu_0,\mathrm{H}} = 6 \times 10^{-18} (h\nu_0 / 13.6\ \mathrm{eV})^{-3}$ cm² the hydrogen photoionization cross section of Murray-Clay et al. (2009) at their representative photon energy $h\nu_0 = 20$ eV [^mc09], used for every composition, including those whose thermostat below runs on the nitrogen-like front. Because $\mu_\mathrm{base}$ and $R_\mathrm{base}$ depend on the level the pressure selects, the base is found by fixed-point iteration on the profile. When the profile top is deeper than $P_\mathrm{base}$, the level clamps to the profile top with the clamp distance in pressure decades recorded (`base_clamped`), or, under `base_out_of_range = 'extend'`, is evaluated on the extended upper structure of Eq. (21) (`base_extended`). `base_method` offers a fixed pressure or the BOREAS solver's XUV radius in place of Eq. (9). + +**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base density $n_\mathrm{base}$ and the atomized base composition (element mole fractions $y_j$). Heating follows the monochromatic-front approximation, and the wind temperature $T_\mathrm{w}$ is the root of + +$$(1 - f_+)\, n_\mathrm{base}\, \sigma_{\nu_0}\, \frac{F_\mathrm{XUV}}{h\nu_0}\, \left(h\nu_0 - E_\mathrm{ion}\right) \;=\; Q_\mathrm{lines} + Q_{\mathrm{CO_2}} + Q_\mathrm{O} + \tfrac{3}{2}\, k_\mathrm{B} T_\mathrm{w}\, \alpha_\mathrm{rec}(T_\mathrm{w})\, f_+^2\, n_\mathrm{base}^2 \tag{10}$$ + +where the left side is the photoionization heating rate per unit volume, each ionization leaving $h\nu_0 - E_\mathrm{ion}$ in the gas, with $h\nu_0$ the front's photon energy and $E_\mathrm{ion}$ its ionization potential, $\sigma_{\nu_0}$ its photoionization cross section, and $f_+$ the ionization fraction from local photoionization-recombination balance, $f_+^2 / (1 - f_+) = \sigma_{\nu_0} F_\mathrm{XUV} / (h\nu_0\, \alpha_\mathrm{rec}\, n_\mathrm{base})$. The front follows the composition: the hydrogen front ($h\nu_0 = 20$ eV, $E_\mathrm{ion} = 13.6$ eV, $\sigma_{\nu_0} = \sigma_{\nu_0,\mathrm{H}}$) when the atomized hydrogen fraction is one half or more, the nitrogen-like front of Chatterjee & Pierrehumbert (2026) ($h\nu_0 = 33.6$ eV, $E_\mathrm{ion} = 14.53$ eV, $\sigma_{\nu_0} = 10^{-17}$ cm²) otherwise [^cp26]. Four cooling channels stand on the right. $Q_\mathrm{lines}$ is atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium under electron impact, every emitted photon escaping (the machinery of Chatterjee & Pierrehumbert 2026, their Eqs. 26 to 30, on the atomic data of Nakayama et al. 2022 [^nakayama]; the hydrogen system carries Lyman alpha). $Q_{\mathrm{CO_2}}$ is the CO$_2$ 15 micron band and $Q_\mathrm{O}$ the atomic oxygen fine structure at 63 and 147 micron (Johnstone et al. 2018 [^johnstone]); the band is a base-region coolant, evaluated on molecular abundances and on deexcitation rates measured over roughly 150 to 500 K, and it carries a few percent of the budget at the temperatures the thermostat selects against most of it at a 1000 to 3000 K base. The last term is the continuum part of recombination cooling, with $\alpha_\mathrm{rec}$ the radiative recombination fit of Badnell (2006) for nitrogen-dominated gas [^badnell] and the composition-weighted case B coefficient of Eq. (13) otherwise. Each channel has its own setting (`cool_atomic`, `cool_co2_band`, `cool_o_finestructure`, `cool_recombination`), and at least one must stay on. -**The wind base.** XUV photons deposit their energy where the atmosphere first reaches unit optical depth to them, at the pressure level $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, with $\sigma_{\nu_0}$ the photoionization cross section at the representative photon energy (the level Lopez 2017 builds the wind on, about a nanobar [^lopez2017]; the cross section follows Murray-Clay et al. 2009 [^mc09]). The base is located on the supplied profile by fixed-point iteration; when the profile is too shallow to reach it, the level clamps to the profile top with the clamp distance recorded, or is evaluated on the extended upper structure (the `extend` option), and either way the choice is flagged. +The balance is scanned upward from $T_\mathrm{eq}$ to $5 \times 10^4$ K and the first downward crossing of heating through cooling is taken, which selects the lowest stable root. A balance with no root inside that range clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. The upper edge is a validity ceiling rather than an absence of a root: raising it does find one, near $10^5$ K, and that root is outside the model, since the coolants are neutral three-level systems and the gas at that temperature is fully ionized. A clamped temperature is therefore the edge of the bracket and not a solution, and the sonic radius, the recombination-limited rate, and the sonic-point Knudsen number built on it inherit that. A local balance also misses the temperature structure through the sonic region, which every rate built on $T_\mathrm{w}$ shares. -**The wind temperature.** Rather than assuming the canonical $10^4$ K, a thermostat balances local photoionization heating against radiative cooling at the base. Heating follows the monochromatic-front approximation, $Q_\mathrm{heat} = n_0\, \sigma\, (F_\mathrm{XUV}/h\nu)\,(h\nu - E_\mathrm{ion})$, with $n_0$ the neutral density, $h\nu$ the representative photon energy, and $E_\mathrm{ion}$ the ionization potential. Four cooling channels oppose it: atomic line cooling by H, C, C$^+$, N, N$^+$, O, and O$^+$ in three-level statistical equilibrium (the machinery of Chatterjee & Pierrehumbert 2026 [^cp26] on the atomic data of Nakayama et al. 2022 [^nakayama]), the CO$_2$ 15 micron band and the atomic oxygen fine structure (Johnstone et al. 2018 [^johnstone]; the band is a base-region coolant, evaluated on molecular abundances and on deexcitation rates measured over roughly 150 to 500 K, and it carries a few percent of the budget at the temperatures the thermostat selects against most of it at a 1000 to 3000 K base), and recombination cooling (with the radiative recombination fit of Badnell 2006 [^badnell]). The balance is bracketed between $T_\mathrm{eq}$ and $5 \times 10^4$ K; a balance with no root inside that range clamps to the nearer edge, flagged. A high clamp is the expected outcome at dense bases, where electron densities far above the forbidden-line critical densities quench the line coolants collisionally and the wind runs hot. The upper edge is a validity ceiling rather than an absence of a root: raising it does find one, near $10^5$ K, and that root is outside the model, since the coolants are neutral three-level systems and the gas at that temperature is fully ionized. A clamped temperature is therefore the edge of the bracket and not a solution, and the sonic radius, the recombination-limited rate, and the sonic-point Knudsen number built on it inherit that. +**The energy-limited rate.** If a fraction $\epsilon$ of the intercepted XUV power goes into lifting gas out of the tidally reduced well, the rate follows from dividing that power by the escape energy per unit mass. The dispatcher uses the form of Erkaev et al. (2007), their Eq. (21) [^erkaev], which is `scaling=2` of `EL_escape`: -**The two rate limits.** The energy-limited rate is Eq. (1) of the [energy-limited page](energy_limited.md) in the Erkaev form (`scaling=2`, $\xi = R_\mathrm{Hill}/R_\mathrm{p}$), with the efficiency either fixed or taken from the fitted efficiency of Caldiroli et al. (2022) converted to that geometry [^caldiroli]. The radiation-recombination-limited (RR) rate follows the analytic chain of Murray-Clay et al. (2009) [^mc09]: at high flux the base ionization reaches equilibrium between photoionization and recombination, which fixes the base ion density to +$$\dot{M}_\mathrm{EL} \;=\; \frac{\epsilon\,\pi\,F_\mathrm{XUV}\,R_\mathrm{p}\,R_\mathrm{XUV}^2}{G\,M_\mathrm{p}\,K(\xi)}, \qquad R_\mathrm{XUV} = R_\mathrm{ph} \tag{11}$$ -$$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{5}$$ +with $K$ and $\xi = R_\mathrm{Hill}/R_\mathrm{p}$ from Eq. (2). The absorbing disk $\pi R_\mathrm{XUV}^2$ is taken at the photospheric working level and the barrier $G M_\mathrm{p} K / R_\mathrm{p}$ at the interior radius; the factor $\pi$ encodes full-surface redistribution of the intercepted power, not a dayside cross section. The efficiency $\epsilon$ is the setting `efficiency` (default 0.1) or, under `efficiency_mode = 'caldiroli'`, the fitted evaporation efficiency $\eta$ of Caldiroli et al. (2022, their Appendix A.1) [^caldiroli], which is defined against an $R_\mathrm{p}^3$ geometry and therefore converted to $\epsilon = \eta\, (R_\mathrm{p}/R_\mathrm{XUV})^2$ before use; below the fit's flux bound the fixed efficiency is used instead, flagged. -with $\alpha_\mathrm{B}$ the case B recombination coefficient of the composition (carrying its $T^{-0.9}$ temperature dependence), $h\nu_0$ the representative ionizing photon energy of the front the composition selects, and $R_\mathrm{base}$ the base radius. The mass density that follows is $\rho_\mathrm{base} = n_+\, \mu_+\, m_\mathrm{p}$, with $\mu_+$ the mean mass per ion of the ionized wind in atomic mass units: electrons counted among the particles and the heavies singly ionized, so the mass per particle is half the mean atomic mass and the mass per ion is the mean atomic mass itself. An isothermal wind then carries that density to the sonic radius $R_\mathrm{s} = G M_\mathrm{p} / (2 c_\mathrm{s}^2)$ with the barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$, where $\lambda_\mathrm{b} = G M_\mathrm{p} / (R_\mathrm{base} c_\mathrm{s}^2)$ is the Jeans parameter at the base, giving +**The radiation-recombination-limited rate.** At high flux the energy absorbed at the base is spent ionizing and re-radiated on recombination, so the base ionization, not the energy budget, sets the rate. The chain is the analytic one of Murray-Clay et al. (2009), their Section 3.2 [^mc09], generalized to any atomized composition with the mean-mass rule of Lopez (2017) [^lopez2017]: with hydrogen fully ionized, the heavier atoms singly ionized, and the electrons counted among the particles, the wind's mean mass per particle and per ion are -$$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = \rho_\mathrm{base}\, e^{\,3/2 - \lambda_\mathrm{b}} \tag{6}$$ +$$\mu_+ = \sum_j y_j A_j, \qquad \mu_\mathrm{w} = \frac{\mu_+}{2}, \qquad c_\mathrm{s} = \sqrt{\frac{k_\mathrm{B} T_\mathrm{w}}{\mu_\mathrm{w} m_\mathrm{p}}}, \qquad R_\mathrm{s} = \frac{G M_\mathrm{p}}{2 c_\mathrm{s}^2}, \qquad \lambda_\mathrm{b} = \frac{G M_\mathrm{p}}{R_\mathrm{base}\, c_\mathrm{s}^2} \tag{12}$$ -The energy in Eq. (5) has been spent ionizing and is re-radiated on recombination, which is why this limit can undercut the energy-limited one. A third limit counts photons rather than energy. Where recombination is slow and every escaping particle is ionized once, each intercepted ionizing photon removes one particle, so no more particles leave per second than photons arrive: $\dot{M}_\mathrm{PL} = \pi R_\mathrm{XUV}^2\, (F_\mathrm{XUV}/h\nu_0)\, \mu_+ m_\mathrm{p}$, Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy and the mass per ion of Eq. (5). It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio, $\epsilon\, h\nu_0 R_\mathrm{p} / (G M_\mathrm{p} K \mu_+ m_\mathrm{p})$, is free of the absorbing radius: the cap binds when the efficiency exceeds $\epsilon_\mathrm{PL} = G M_\mathrm{p} K \mu_+ m_\mathrm{p} / (h\nu_0 R_\mathrm{p})$, the fraction of a photon's energy that lifting one particle out of the well costs, which `efficiency_photon_limit` in the diagnostics reports. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The candidate is $\min(\dot{M}_\mathrm{EL}, \dot{M}_\mathrm{RR}, \dot{M}_\mathrm{PL})$ and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`; `photon_limit = False` removes the photon cap and `recombination_limit = False` the recombination-limited candidate, the latter leaving the chain evaluated because the collisionality switch below reads its sonic point. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. One caution travels with the label: the minimum selects RR through two physically different mechanisms, the recombination-limited base ionization of Eq. (5) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (6), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. When the computed sonic radius falls below the base, the sonic radius is floored at the base with the base density (no barometric factor below the base) and the state is flagged subcritical. The crossover flux between the two sub-labels is sensitive to the wind temperature the thermostat returns, which enters the RR chain through the sound speed, the barometric exponent, and the recombination coefficient. +with $A_j$ the atomic mass of element $j$ in atomic mass units, $c_\mathrm{s}$ the isothermal sound speed of the wind, $R_\mathrm{s}$ its sonic radius, and $\lambda_\mathrm{b}$ the Jeans parameter at the base. The code multiplies by the proton mass where Lopez writes the hydrogen atom mass. The recombination coefficient is the mole-fraction-weighted case B set, + +$$\alpha_\mathrm{B}(T_\mathrm{w}) \;=\; \sum_j y_j\, \alpha_{\mathrm{B},j}(10^4\ \mathrm{K}) \left(\frac{T_\mathrm{w}}{10^4\ \mathrm{K}}\right)^{-0.9} \tag{13}$$ + +with hydrogen's $2.7 \times 10^{-13}$ cm³ s⁻¹ and its $T^{-0.9}$ scaling from Murray-Clay et al. (2009) Eq. (7) [^mc09] and archival values at $10^4$ K for He, C, N, and O, which carry hydrogen's exponent as an approximation (other elements take oxygen's value). Balancing photoionization of the unit-optical-depth neutral column against recombination eliminates the cross section and fixes the base ion density, + +$$n_+ \;=\; \sqrt{\frac{F_\mathrm{XUV}\, G M_\mathrm{p}}{h\nu_0\, \alpha_\mathrm{B}\, c_\mathrm{s}^2\, R_\mathrm{base}^2}} \tag{14}$$ + +with $h\nu_0$ the front energy of Eq. (10). An isothermal Parker wind then carries the base mass density $\rho_\mathrm{base} = n_+\, \mu_+\, m_\mathrm{p}$ to the sonic point, and the rate is the sonic mass flux over the sonic sphere: + +$$\dot{M}_\mathrm{RR} \;=\; 4\pi\, \rho_\mathrm{s}\, c_\mathrm{s}\, R_\mathrm{s}^2, \qquad \rho_\mathrm{s} = n_+\, \mu_+\, m_\mathrm{p}\; e^{\,3/2 - \lambda_\mathrm{b}} \tag{15}$$ + +The barometric factor $e^{\,3/2 - \lambda_\mathrm{b}}$ is the exact isothermal Bernoulli value, including the kinetic energy at the sonic point; the analytic estimate of Murray-Clay et al. omits that term and carries $e^{\,2 - \lambda_\mathrm{b}}$. When the computed sonic radius falls below the base, $R_\mathrm{s}$ is floored at $R_\mathrm{base}$ with $\rho_\mathrm{s} = \rho_\mathrm{base}$ (no barometric factor below the base) and the state is flagged `subcritical_sonic`. The chain inherits the analytic flux exponent of 0.5, where the numerical models of Murray-Clay et al. give 0.6. + +**The photon-limited rate.** A third limit counts photons rather than energy. Where recombination is slow and every escaping particle is ionized once, each intercepted ionizing photon removes at most one particle, so no more particles leave per second than photons arrive. This is Eq. (10) of Owen & Alvarez (2016) generalized from pure hydrogen [^owenalvarez], with the photon energy of Eq. (10) and the mass per ion of Eq. (12): + +$$\dot{M}_\mathrm{PL} \;=\; \pi R_\mathrm{XUV}^2\, \frac{F_\mathrm{XUV}}{h\nu_0}\, \mu_+ m_\mathrm{p} \tag{16}$$ + +It is evaluated on the energy-limited rate's own disk, so the two describe one photon budget and their ratio $\dot{M}_\mathrm{EL} / \dot{M}_\mathrm{PL} = \epsilon / \epsilon_\mathrm{PL}$ is free of the absorbing radius, with + +$$\epsilon_\mathrm{PL} \;=\; \frac{G M_\mathrm{p}\, K\, \mu_+ m_\mathrm{p}}{h\nu_0\, R_\mathrm{p}} \tag{17}$$ + +the fraction of a photon's energy that lifting one particle out of the well costs, reported as `efficiency_photon_limit`. The cap binds when the efficiency exceeds it. The fraction is small on shallow wells: 0.034 for a one Earth-mass, 1.05 Earth-radius hydrogen and helium envelope and 0.055 at two Earth masses and 1.3 Earth radii, so at the default efficiency of 0.1 both winds are photon-limited, while a one Earth-mass carbon dioxide atmosphere reaches it at 0.26. The [limitations](limitations.md) page states why the count is an estimate rather than a bound. + +**The hydrodynamic candidate.** The three limits combine as + +$$\dot{M}_\mathrm{hyd} \;=\; \min\left(\dot{M}_\mathrm{EL},\ \dot{M}_\mathrm{RR},\ \dot{M}_\mathrm{PL}\right) \tag{18}$$ + +and the winner names the sub-label, `hydrodynamic:EL`, `hydrodynamic:RR`, or `hydrodynamic:PL`. `photon_limit = False` removes $\dot{M}_\mathrm{PL}$ from the minimum and `recombination_limit = False` removes $\dot{M}_\mathrm{RR}$; with both off the wind is the energy-limited rate alone, the configuration most of the literature computes. The recombination chain is still evaluated when its candidate is off, because the collisionality switch below reads its sonic point, so the switch's verdict does not move with that setting. + +One caution travels with the RR label: the minimum selects it through two physically different mechanisms, the recombination-limited base ionization of Eq. (14) setting the rate, or plain barometric suppression at large $\lambda_\mathrm{b}$, where calling the result recombination-limited would be a category error. The quantity that separates them is the barometric factor of Eq. (15), reported beside every rate: near 1 the sonic-point density is the base density and the label means what it says, while several decades below 1 the rate is small because the wind cannot carry material to the sonic point. The flux scaling does not separate them, since the base ion density follows $\sqrt{F_\mathrm{XUV}}$ at every $\lambda_\mathrm{b}$ in this chain. The crossover flux between the sub-labels is sensitive to the wind temperature the thermostat returns, which enters the chain through the sound speed, the barometric exponent, and the recombination coefficient. ## The collisionality switch -A fluid wind only exists if the gas is still collisional where it goes sonic. The switch compares the mean free path against the density scale height at the sonic point, following the construction of Chatterjee & Pierrehumbert (2026), their Eqs. 17 and 18 [^cp26]: +A fluid wind exists only if the gas is still collisional where it goes sonic. The switch compares the mean free path against the density scale height at the sonic point of Eq. (12), following Chatterjee & Pierrehumbert (2026), their Eqs. (17) and (18) [^cp26]: + +$$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell_\mathrm{s}}{H_\mathrm{s}}, \qquad \ell_\mathrm{s} = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}}, \qquad n_\mathrm{s} = \frac{\rho_\mathrm{s}}{\mu_+ m_\mathrm{p}} \tag{19}$$ -$$\mathrm{Kn}_\mathrm{s} \;=\; \frac{\ell}{H_\mathrm{s}}, \qquad \ell = \frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n_\mathrm{s}}, \qquad H_\mathrm{s} = \frac{(1+\gamma)\, R_\mathrm{s}}{4 + \sqrt{2}\sqrt{5 - 3\gamma}} \tag{7}$$ +where $\ell_\mathrm{s}$ is the Maxwell mean free path, $n_\mathrm{s}$ the heavy-particle density at the sonic point from Eq. (15), $\gamma$ the polytropic index (`gamma_wind`, 1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the atomized mixture at $T_\mathrm{w}$, their Eq. (25), -where $\ell$ is the Maxwell mean free path, $n_\mathrm{s}$ the particle density at the sonic point (taken from the isothermal wind of Eq. 6), $\gamma$ the polytropic index (1 for an isothermal wind), and $\sigma_\mathrm{C}$ the density-weighted collision cross section of the mixture. Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist (Laricchiuta et al. 2009 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990 [^z90] on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements carry no radius in the package's table, so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. For two of them the gap is in the source: Bondi (1964) gives no radius for aluminium or calcium, among the 16 of 44 main-group elements he left out, which Mantina et al. (2009) later supplied on his scale [^mantina]. Phosphorus, chlorine, and potassium are main-group elements Bondi does tabulate, and titanium is a transition metal; the table simply does not carry them yet. +$$\sigma_\mathrm{C} \;=\; \sum_j y_j\, \sigma_j(T_\mathrm{w}) \tag{20}$$ -One property of the criterion is worth stating plainly, because it is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. +Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist, as the momentum-transfer cross section $\pi \sigma^2 \Omega^{(1,1)*}$ (Laricchiuta et al. 2009, their Eqs. 2 to 4 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990, their Eq. 30 [^z90], on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements carry no radius in the package's table, so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. For two of them the gap is in the source: Bondi (1964) gives no radius for aluminium or calcium, among the 16 of 44 main-group elements missing from that table, which Mantina et al. (2009) later supplied on the same scale [^mantina]. Phosphorus, chlorine, and potassium are main-group elements Bondi does tabulate, and titanium is a transition metal; the table does not carry them yet. -A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3. The two ends come from different arguments. Kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the lower part of the band is heating-geometry physics rather than tuning freedom. The upper edge is not Johnson's number: Chatterjee & Pierrehumbert (2026) [^cp26] argue the energy limit may survive to a sonic Knudsen number of 1 to 3 or beyond, citing that same work, and call how far it survives an unresolved question. So the band is asymmetric in what supports it, and and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window (factor 1.5) around the threshold so a time-stepping track cannot chatter between branches on numerical noise. +One property of the criterion is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. + +A state with $\mathrm{Kn}_\mathrm{s}$ at or below the threshold $\mathrm{Kn}_\mathrm{c}$ (`kn_crit`) sustains the wind and keeps the hydrodynamic label; above it, the gas decouples before reaching sonic conditions and the state re-routes to the hydrostatic branch. The default threshold is 1, and its physical band is 0.1 to 3. The two ends come from different arguments. Kinetic simulations place the transition near 0.1 when the heating is deposited in a sharp layer and near 1 when it is distributed (Johnson et al. 2013 [^johnson]), so the lower part of the band is heating-geometry physics rather than tuning freedom. The upper edge is not Johnson's number: Chatterjee & Pierrehumbert (2026) [^cp26] argue the energy limit may survive to a sonic Knudsen number of 1 to 3 or beyond, citing that same work, and call how far it survives an unresolved question. The band is therefore asymmetric in what supports it, and the diagnostics report the counterfactual labels at both band edges beside every verdict. For evolutionary use, a supplied previous regime label activates a hysteresis window: the threshold becomes $h\,\mathrm{Kn}_\mathrm{c}$ while leaving a hydrodynamic state and $\mathrm{Kn}_\mathrm{c}/h$ while leaving a hydrostatic one, with $h$ = `kn_hysteresis` (default 1.5), so a time-stepping track cannot chatter between branches on numerical noise. ## Hydrostatic escape -Where no wind exists, escape proceeds particle by particle from the exobase, the level where the mean free path first reaches the local scale height. All exobase quantities are evaluated on an extended upper structure: a Bates temperature profile $T(\zeta) = T_\mathrm{exo} - (T_\mathrm{exo} - T_\mathrm{top})\, e^{-\gamma_\mathrm{B} \zeta}$ integrated hydrostatically above the supplied profile top (in $\zeta = \ln(p_\mathrm{top}/p)$, shape parameter $\gamma_\mathrm{B}$; the form Yelle 2024 uses [^yelle]), with the exobase temperature $T_\mathrm{exo}$ prescribed by the caller. Extending the structure is not a refinement but a requirement: the Jeans parameter at the true exobase can differ from its photospheric value by an order of magnitude, and evaluating the escape on photospheric values biases rates toward false retention by up to three orders of magnitude (Johnson et al. 2013 [^johnson]). The prescribed $T_\mathrm{exo}$ (default 1000 K) is the branch's dominant sensitivity, because the rate depends on it exponentially; an optional estimator balances local heating against cooling at the profile top, but a conduction-free local balance is biased high by construction and is deliberately not the default. +Where no wind exists, escape proceeds particle by particle from the exobase, the level where the mean free path first reaches the local scale height, and each species escapes at the smaller of two bottlenecks: how fast it effuses from the exobase and how fast diffusion resupplies it from below. + +**The upper structure.** All exobase quantities are evaluated on an extended upper structure built above the profile top, with composition and mean molecular mass $\mu_0$ frozen at their values there. The temperature follows the Bates profile in the form Yelle (2024) uses, their Eq. (19) [^yelle], and the radius follows from hydrostatic balance, both in the log-pressure coordinate $\zeta = \ln(P_\mathrm{top}/P)$: + +$$T(\zeta) \;=\; T_\infty - \left(T_\infty - T_\mathrm{top}\right) e^{-\gamma_\mathrm{B} \zeta}, \qquad \frac{\mathrm{d}r}{\mathrm{d}\zeta} = \frac{k_\mathrm{B}\, T\, r^2}{G M_\mathrm{p}\, \mu_0}, \qquad n = \frac{P_\mathrm{top}\, e^{-\zeta}}{k_\mathrm{B} T} \tag{21}$$ + +with $r(0) = R_0$, the shape parameter $\gamma_\mathrm{B}$ (`gamma_bates`, default 0.75), and the exospheric temperature $T_\infty$ that the profile approaches (`T_exo_value`, default 1000 K). The integration stops, flagged `extension_unbound`, where the local Jeans parameter falls below 2, since the structure is unbound beyond that point. The exobase is the first level of this structure where + +$$\frac{1}{\sqrt{2}\,\sigma_\mathrm{C}\, n} \;\ge\; \frac{k_\mathrm{B}\, T\, r^2}{G M_\mathrm{p}\, \mu_0} \tag{22}$$ -Each species $i$ leaves the exobase (radius $R_\mathrm{exo}$, temperature $T_\mathrm{exo}$) with the Jeans effusion velocity +with $\sigma_\mathrm{C}$ the mixture cross section of Eq. (20), taken over the anchor species at the local temperature, which defines $R_\mathrm{exo}$, $n_\mathrm{exo}$, and $T_\mathrm{exo} = T(R_\mathrm{exo})$. Extending the structure is a requirement and not a refinement: the Jeans parameter at the true exobase can differ from its photospheric value by an order of magnitude, and evaluating the escape on photospheric values biases rates toward false retention by up to three orders of magnitude (Johnson et al. 2013 [^johnson]). The prescribed $T_\infty$ is the branch's dominant sensitivity, because the rate depends on it exponentially. A value below $T_\mathrm{top}$ would build a thermosphere cooling with height, whose exobase is more strongly bound than its anchor, so it floors at $T_\mathrm{top}$, flagged. An optional estimator (`T_exo_mode = 'thermostat'`) solves the balance of Eq. (10) at the profile top instead, but a conduction-free local balance is biased high by construction and is deliberately not the default. -$$w_{\mathrm{J},i} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p} m_i}{k_\mathrm{B} T_\mathrm{exo}\, R_\mathrm{exo}} \tag{8}$$ +**Jeans effusion.** Each species $i$, of particle mass $m_i$, leaves the exobase with the Jeans effusion velocity of Yelle (2024), their Eqs. (20) and (21) [^yelle], -where $m_i$ is the particle mass and $\lambda_i$ the species Jeans parameter. The effusion flux is that velocity times the species number density at the exobase, referred back to the anchor radius by the ratio of the two areas, $\Phi_{\mathrm{J},i} = (R_\mathrm{exo}/R_0)^2\, C(\lambda_i)\, w_{\mathrm{J},i}\, X_i\, n_\mathrm{exo}$ (Yelle 2024 Eq. 15), with $X_i$ the diffusively adjusted mixing ratio at the exobase and $R_0$ the profile top the structure was extended from. It carries the kinetic enhancement factor $C(\lambda)$ that direct simulation Monte Carlo runs find above the equilibrium Jeans flux: about 1.7 at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]), held constant beyond 15 as a flagged extrapolation. The escape of a minor species is additionally capped by how fast diffusion can resupply it through the background gas: the diffusion-limited flux $\Phi_\mathrm{l}$ follows the formulation of Yelle (2024) [^yelle] on binary diffusion coefficients that each carry a provenance class, and the two limits combine as the harmonic mean, $\Phi_i = \Phi_{\mathrm{J},i}\,\Phi_{\mathrm{l},i} / (\Phi_{\mathrm{J},i} + \Phi_{\mathrm{l},i})$, their Eq. 14, which lies below both of its arguments. The dominant species supplies itself and takes the Jeans flux alone. +$$w_{\mathrm{J},i} \;=\; \sqrt{\frac{k_\mathrm{B} T_\mathrm{exo}}{2\pi m_i}}\,(1 + \lambda_i)\, e^{-\lambda_i}, \qquad \lambda_i = \frac{G M_\mathrm{p}\, m_i}{k_\mathrm{B}\, T_\mathrm{exo}\, R_\mathrm{exo}} \tag{23}$$ -Two escape temperatures gate the branch's validity. The neutral escape temperature $T_\mathrm{esc} = G M_\mathrm{p} m / (2 k_\mathrm{B} R_\mathrm{exo})$ marks where thermal energy rivals binding energy; the plasma escape temperature is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase hotter than half the gating escape temperature cannot remain hydrostatic, and such states re-route to the hydrodynamic rate. Both temperatures are always computed; states where the two conventions disagree are flagged as contested, with both branch rates recorded, because the ion physics that would decide them is not modeled in this version. For the same reason, hydrostatic heavy-element rates are lower limits (the nonthermal channels that dominate heavy-species loss from real exospheres are absent), and every hydrostatic result carries a flag saying so. +where $\lambda_i$ is the species Jeans parameter. Direct simulation Monte Carlo runs find the actual escape rate above the equilibrium Jeans rate, because collisions above the exobase and a non-Maxwellian exobase distribution feed the escaping tail: about 1.7 times at $\lambda = 6$, falling to about 1.4 at $\lambda = 15$ (Volkov et al. 2011 [^volkova][^volkovb]). The code interpolates that factor linearly, -## The Roche screen and overflow +$$C(\lambda) \;=\; \begin{cases} 1.7, & \lambda \le 6 \\ 1.7 - 0.3\,(\lambda - 6)/9, & 6 < \lambda < 15 \\ 1.4, & \lambda \ge 15 \end{cases} \tag{24}$$ -Everything above assumes the flow is bound to the planet. Before the label is finalized, the active flow radius of the winning branch (the sonic radius on the boil-off branch, the larger of the XUV and sonic radii on the hydrodynamic branch, the exobase radius on the hydrostatic branch) is tested against the periapsis Hill radius of Eq. (3) on the [energy-limited page](energy_limited.md). A flow that reaches the Hill sphere is spilling over the gravitational boundary rather than escaping through a bound outflow, and the state is named `roche_overflow` for it. +holding the endpoint values outside the simulated range as a flagged extrapolation (`volkov_extrapolated`); below $\lambda = 6$ the held value likely understates the flux, and trace light species on a heavy background reach that side. The effusion flux, referred to the anchor sphere of radius $R_0$ (Yelle 2024, their Eq. 15), is -The screen renames a state and never changes its rate. The reason is that the branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. +$$\tilde{\Phi}_{\mathrm{J},i} \;=\; \left(\frac{R_\mathrm{exo}}{R_0}\right)^2 C(\lambda_i)\; w_{\mathrm{J},i}\; \tilde{X}_i(\zeta_\mathrm{exo})\; n_\mathrm{exo} \tag{25}$$ -The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is itself a candidate in the final comparison, from Eq. (3) of Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios: an isothermal Bernoulli flow from the photosphere to L1, an exponential barrier between the photospheric and L1 potentials from their volume-averaged Roche potential (their Eq. 14) evaluated at the Eggleton (1983) lobe radius [^eggleton], and the elliptical nozzle area that the potential's curvature at L1 admits. Their own reading is what motivates the design. Roche-lobe overflow and evaporative escape are one unbound hydrodynamic outflow seen at two separations. What separates them is whether the photosphere nearly coincides with the lobe. +with $\tilde{X}_i(\zeta_\mathrm{exo})$ the diffusive-equilibrium mole fraction at the exobase from Eq. (26). -The candidate is computed at every call and competes wherever the overflow description applies, which is where the isothermal sonic radius $G M_\mathrm{p} / (2 v_\mathrm{th}^2)$ sits at or beyond the L1 distance, so that no spherical transonic wind fits inside the lobe and the nozzle is the flow's constriction. Where that sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. Their Figure 9 draws the same comparison qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening rather than a rule they state. A candidate below the one-proton-per-Julian-year floor does not compete either, since a crossing between two numerically empty numbers would rename the deeply bound corner on no content. That guard is loose: the constant marks what is distinguishable from zero in floating point, so the label remains reachable at rates far below anything that could matter over a planet's lifetime, and `diagnostics['rate_floor']` beside the depletion screen is how a consumer tells. +**Diffusive supply.** Below the exobase each species diffuses through the frozen background with molecular diffusion coefficient $D_i = b_i / n$ and eddy diffusion coefficient $K_{zz}$ (the profile's top value, or `kzz`, default 300 m² s⁻¹). The mixture diffusion parameter follows Blanc's law, $b_i = (1 - X_i) / \sum_{k \ne i} (X_k / b_{ik})$, over binary parameters $b_{ik}$ that each carry a provenance class, and thermal diffusion enters through an effective mass, Yelle (2024) Eq. (4), with the thermal diffusion factor $\alpha_\mathrm{T} = -0.25$ that Yelle adopts for light species. The zero-flux mole fraction, their Eq. (9), is -When the nozzle wins, the label is `roche_overflow`, the rate is the transfer rate itself, and the boundary against the losing branch is continuous by construction. The applicability edge is a criterion boundary like the activation gate, and the jump across it is a result to measure rather than an artifact to hide. The flow carries no energy cap, faithful to the primary, which assumes isothermality and states that assumption as an important limitation rather than a justified one: their Section 3 names the radiative heating and cooling balance along the outflow as the physics they neglect. What the diagnostics report instead is the heat the flow demands, the barrier the rate applied plus the acceleration to the sonic speed, beside the interior luminosity and the intercepted instellation, which is where the assumption shows its strain. That figure describes the candidate rather than the dispatched rate, and comes both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. +$$\tilde{X}_i(\zeta) \;=\; X_i(0)\, \exp\!\left[\int_0^{\zeta} \left(1 - \frac{\tilde{m}_i}{\mu_0}\right) \frac{D_i}{D_i + K_{zz}}\, \mathrm{d}\zeta'\right], \qquad \tilde{m}_i = m_i + \alpha_\mathrm{T}\, \mu_0\, \frac{\mathrm{d}\ln T}{\mathrm{d}\zeta} \tag{26}$$ -Four conventions travel with the branch. An eccentric orbit is averaged rather than sampled, since the primary treats a circular, synchronously rotating donor and has no eccentric formulation: each phase is evaluated with the circular formula at its own separation and the result averaged in time, duty-cycled over the arc where the overflow description applies. That arc surrounds periapsis, because the L1 distance grows with separation while the sonic radius does not. A secular caller needs the average, and it omits the wind the planet drives on the rest of the orbit; both flags say so. The launch level is the photospheric level, whose Bernoulli invariance makes the level choice cancel along an isothermal column and only along one. Under `nozzle_temperature = 'wind'` the level moves to the wind's own column, anchored at the wind base, so that the density and the sound speed evaluating the barrier still belong to one structure; measured across a factor of four in launch radius the rate holds to half a percent along that column and moves by a factor of eleven along the profile's colder one. On a profile that is neither, which is what a coupled run supplies, the residual is a width rather than a cancellation, measured at a factor of 2.4 across three decades of launch level on a mildly inverted column against 1.14 on an isothermal one. +with $X_i(0)$ the species mole fraction at the profile top, and the limiting flux of their Eqs. (10) and (11), the largest flux diffusion can deliver to the exobase, is -A launch level at or beyond the lobe clamps the exponential at its lobe-filling boundary value, flagged `nozzle_saturated`, a lower bound on the transfer. Under that clamp the rate goes as the cube of the separation, so periapsis becomes the poorest phase of the orbit rather than the richest. The fourth convention is the launch radius: the profile radius stands in for the volume-equivalent photospheric radius without the primary's Appendix distortion conversion, which their own input chain needs because it starts from a measured transit radius and this one does not. It is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. +$$\Phi_{\mathrm{l},i} \;=\; \left[\int_0^{\zeta_\mathrm{exo}} \frac{k_\mathrm{B}\, T\, R_0^2}{G M_\mathrm{p}\, \mu_0\, \tilde{X}_i\, n\, (D_i + K_{zz})}\, \mathrm{d}\zeta\right]^{-1} \tag{27}$$ -Two things the primary computes and this module does not. The first is the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds; under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. +Both integrals are first order in the log-pressure step, so the quadrature grid is doubled from `hydrostatic_levels_min` until the bulk rate changes by less than `hydrostatic_rtol` (default 1%) or `hydrostatic_levels_max` is reached, and the levels used and the last change travel in the diagnostics; the finest grid's values are returned, never an extrapolation. -Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested by comparing the outer extent of the modeled and extended structure, reported as `r_atmosphere` in `diagnostics['roche']`, against the lobe radius in `diagnostics['nozzle']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `neither`, marks a label won by the rate crossing while neither the atmosphere nor the flow radius reaches out. The comparator for the first case is the Roche lobe itself rather than the Hill radius, since the lobe is the critical surface and sits about 0.70 of the way out to it; `r_atmosphere` and `r_lobe` are both reported so the comparison can be read. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. +**The combined rate.** The two bottlenecks combine by the harmonic mean of Yelle (2024), their Eq. (14) [^yelle], which lies below both of its arguments and tends to the smaller one: -Near misses (a flow radius above two thirds of the Hill radius, so that the Hill radius is less than 1.5 flow radii) raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. +$$\Phi_i \;=\; \frac{\tilde{\Phi}_{\mathrm{J},i}\; \Phi_{\mathrm{l},i}}{\tilde{\Phi}_{\mathrm{J},i} + \Phi_{\mathrm{l},i}} \tag{28}$$ + +The most abundant species at the anchor supplies itself: it takes $\tilde{X}_i = X_i(0)$ and the Jeans flux alone, $\Phi_i = \tilde{\Phi}_{\mathrm{J},i}$. So does any species whose supply-free rate already falls below the one-proton-per-Julian-year floor, since the harmonic mean could only be smaller. Every flux is per unit area of the anchor sphere, so the hydrostatic rate is + +$$\dot{M}_\mathrm{hs} \;=\; \sum_i 4\pi R_0^2\, m_i\, \Phi_i \tag{29}$$ + +with each species rate mapped onto elements by the mass fractions of its formula. Hydrostatic heavy-element rates are lower limits, since the nonthermal channels that dominate heavy-species loss from real exospheres (ion pickup, photochemical escape, sputtering) are absent, and every hydrostatic result carries the `hydrostatic_lower_limit` flag. + +**The escape-temperature gate.** Two escape temperatures decide whether the exobase can stay hydrostatic at all: + +$$T_\mathrm{esc} \;=\; \frac{G M_\mathrm{p}\, \mu_0}{2\, k_\mathrm{B}\, R_\mathrm{exo}}, \qquad T_\mathrm{esc,+} = \frac{T_\mathrm{esc}}{2} \tag{30}$$ + +The neutral escape temperature $T_\mathrm{esc}$ marks where thermal energy rivals binding energy; the plasma escape temperature $T_\mathrm{esc,+}$ is half of it, because in an ionized exosphere the ambipolar electric field shares each ion's binding energy with its electron (Chatterjee & Pierrehumbert 2026, their Eq. 34 [^cp26]). An exobase with $T_\mathrm{exo}$ above half the gating escape temperature is unstable by their Figure 10 criterion, and such states re-route to the hydrodynamic rate of Eq. (18), flagged `gate_rerouted`. The setting `gate` chooses the neutral (default) or the plasma temperature. Both are always computed, together with the local ionization fraction at the exobase; states where the two conventions disagree are flagged `contested_ion`, with both branch rates recorded, because the ion physics that would decide them is not modeled. + +## Tidal transfer through L1 + +The tidally driven flow through the inner Lagrange point that a genuinely overflowing planet drives is a candidate in the final comparison, from Jackson et al. (2017) [^jackson17], in the mass-transfer lineage of Ritter (1988) [^ritter] rebuilt to hold at planetary mass ratios. Their reading motivates the design: Roche-lobe overflow and evaporative escape are one unbound hydrodynamic outflow seen at two separations, and what separates them is whether the photosphere nearly coincides with the lobe. + +The flow is isothermal at the launch level's temperature $T_\mathrm{launch}$ and mean particle mass $\mu_\mathrm{launch}$. Under the default `nozzle_temperature = 'photospheric'` the launch level is the photospheric working level, $(R_\mathrm{launch}, \rho_\mathrm{launch}, T_\mathrm{launch}, \mu_\mathrm{launch}) = (R_\mathrm{ph}, \rho_\mathrm{ph}, T_\mathrm{ph}, \mu_\mathrm{ph})$, the construction of the primary; under `'wind'` it is the wind base at the wind's own temperature and mean mass, $(R_\mathrm{base},\ P_\mathrm{base}\, \mu_\mathrm{w} m_\mathrm{p} / (k_\mathrm{B} T_\mathrm{w}),\ T_\mathrm{w},\ \mu_\mathrm{w} m_\mathrm{p})$. At an orbital separation $d$, with mass ratio $q = M_\mathrm{p}/M_\star$, + +$$v_\mathrm{th} = \sqrt{\frac{k_\mathrm{B} T_\mathrm{launch}}{\mu_\mathrm{launch}}}, \qquad \Omega^2 = \frac{G (M_\mathrm{p} + M_\star)}{d^3}, \qquad A(q) = 4 + \frac{b_1}{b_2 + q^{1/3} + q^{-1/3}} \tag{31}$$ + +where $v_\mathrm{th}$ is the isothermal sound speed, $\Omega$ the orbital frequency, and $A$ the dimensionless curvature of the potential at L1 in the fit of their Eq. (10), with $b_1 = 2 \cdot 3^{2/3}$ and $b_2 = b_1/4 - 2$, accurate to 0.3% for all mass ratios. The lobe is the Eggleton (1983) volume-equivalent radius as printed in their Section 2.1 [^eggleton], + +$$R_\mathrm{lobe} \;=\; d\, \frac{0.49\, q^{2/3}}{0.6\, q^{2/3} + \ln(1 + q^{1/3})} \tag{32}$$ + +and the barrier is taken between two values of their volume-averaged Roche potential, their Eq. (14), written $\Psi$ here to keep it apart from the fluxes above (they write $\Phi$): + +$$\Psi(r) \;=\; -\left(\frac{G M_\star}{d} + \frac{G M_\star^2}{2 d (M_\mathrm{p} + M_\star)}\right) - \frac{G M_\mathrm{p}}{r}\left[1 + \frac{M_\mathrm{p} + M_\star}{3 M_\mathrm{p}} \left(\frac{r}{d}\right)^3 + \frac{4}{45}\, \frac{(M_\mathrm{p} + M_\star)^2 + 9 M_\star^2 + 3 M_\star (M_\mathrm{p} + M_\star)}{M_\mathrm{p}^2} \left(\frac{r}{d}\right)^6\right] \tag{33}$$ + +the potential of the equipotential enclosing the volume of a sphere of radius $r$, with $\Psi_\mathrm{L1} = \Psi(R_\mathrm{lobe})$ and $\Psi_\mathrm{launch} = \Psi(R_\mathrm{launch})$. A Bernoulli integral from the launch level, where the flow is slow, to L1, where it is sonic, gives the density at L1 (their Eqs. 11 to 13, the source of the factor $e^{-1/2}$), and the gas crosses the elliptical nozzle that the curvature at L1 admits (their Eqs. 8 and 9) at the sound speed. The transfer rate is their Eq. (3): + +$$\dot{M}_\mathrm{L1}(d) \;=\; e^{-1/2}\, \rho_\mathrm{launch}\, \exp\!\left(-\frac{\Psi_\mathrm{L1} - \Psi_\mathrm{launch}}{v_\mathrm{th}^2}\right) v_\mathrm{th}\; \frac{2\pi\, v_\mathrm{th}^2}{\Omega^2 \sqrt{A (A - 1)}} \tag{34}$$ + +The expansion behind Eq. (33) converges only inside the lobe, and diverges downward outside it, so saturation is tested on geometry: a launch level at or beyond the lobe, $R_\mathrm{launch} \ge R_\mathrm{lobe}$, sets the exponential to 1, their lobe-filling case (their Figure 5), flagged `nozzle_saturated`, a lower bound on the transfer. Under that clamp the rate goes as the cube of the separation. + +**Where the description applies.** The nozzle is the flow's constriction only where the isothermal sonic radius of the launch gas reaches L1, so that no spherical transonic wind fits inside the lobe: + +$$R_\mathrm{s,L1} = \frac{G M_\mathrm{p}}{2\, v_\mathrm{th}^2} \;\ge\; R_\mathrm{L1}, \qquad R_\mathrm{L1} = d\left(\varepsilon - \frac{\varepsilon^2}{3} - \frac{\varepsilon^3}{9}\right), \qquad \varepsilon = \left(\frac{q}{3}\right)^{1/3} \tag{35}$$ + +with $R_\mathrm{L1}$ the small-mass-ratio expansion of the L1 distance, which is the Hill radius at leading order and falls inside it beyond. Where the sonic radius sits inside the L1 distance the gas chokes at its own sonic surface first and the wind branches are the description. Their Figure 9 draws the same comparison qualitatively, to ask which of the two pictures a given planet belongs in; turning it into a hard gate on the candidate is this module's sharpening rather than a rule they state. + +**The orbit average.** The primary treats a circular, synchronously rotating donor and has no eccentric formulation. Each orbital phase is therefore evaluated with the circular formula at its own separation $d(E) = a (1 - e \cos E)$, $E$ being the eccentric anomaly, and the result is averaged in time, with Kepler's $\mathrm{d}t \propto (1 - e \cos E)\, \mathrm{d}E$, over the arc where Eq. (35) holds: + +$$\langle \dot{M}_\mathrm{L1} \rangle \;=\; \frac{\sum_k (1 - e \cos E_k)\; \chi_k\; \dot{M}_\mathrm{L1}\!\left(d(E_k)\right)}{\sum_k (1 - e \cos E_k)}, \qquad E_k = \frac{2\pi (k + 1/2)}{64} \tag{36}$$ + +with $\chi_k = 1$ on the phases that satisfy Eq. (35) and 0 elsewhere, over 64 midpoint nodes. On a circular orbit every node holds the same value and the average is the instantaneous rate. The applicable arc surrounds periapsis, because the L1 distance grows with separation while the sonic radius does not; the duty-cycled average omits the wind the planet drives on the rest of the orbit, and the flags `nozzle_orbit_averaged` and `nozzle_partial_orbit` say so. The average without $\chi_k$ is kept in the diagnostics so the closed form stays comparable with the primary's published rates. + +**Conventions and omissions.** The flow carries no energy cap, faithful to the primary, which assumes isothermality and states that assumption as an important limitation rather than a justified one: their Section 3 names the radiative heating and cooling balance along the outflow as the physics they neglect. What the diagnostics report instead is the heat the flow demands, $\dot{M}_\mathrm{L1} [\max(\Psi_\mathrm{L1} - \Psi_\mathrm{launch}, 0) + v_\mathrm{th}^2/2]$ with the barrier as applied, beside the interior luminosity $L_\mathrm{int}$ and the intercepted instellation $\pi R_\mathrm{p}^2 F_\mathrm{bol}$, which is where the assumption shows its strain. That figure describes the candidate rather than the dispatched rate, and comes both duty-cycled and over the full orbit, so a state where the candidate lost still says what the transfer would have cost. The launch level is the photospheric level, whose Bernoulli invariance ($\rho\, e^{\Psi / v_\mathrm{th}^2}$ is constant along an isothermal hydrostatic column) makes the level choice cancel along such a column and only along one. Under `nozzle_temperature = 'wind'` the level moves to the wind's own column, anchored at the wind base, so that the density and the sound speed evaluating the barrier still belong to one structure; measured across a factor of four in launch radius the rate holds to half a percent along that column and moves by a factor of eleven along the profile's colder one. On a profile that is neither, which is what a coupled run supplies, the residual is a width rather than a cancellation, measured at a factor of 2.4 across three decades of launch level on a mildly inverted column against 1.14 on an isothermal one. The launch radius is the profile radius standing in for the volume-equivalent photospheric radius, without the primary's Appendix distortion conversion, which their own input chain needs because it starts from a measured transit radius and this one does not. It is worth about 1.6x in rate per percent of radius near contact and nothing well inside the lobe. The temperature evaluating the sound speed and the barrier is the model's dominant uncertainty by its authors' own statement, and the `nozzle_temperature` setting chooses it. + +Two things the primary computes and this module does not. The first is the torque-balance transfer rate of their Eq. (24), which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds; under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. + +## The dispatched rate + +The branch rate follows from the gate, the switch, and the escape-temperature gate: + +$$\dot{M}_\mathrm{branch} \;=\; \begin{cases} \dot{M}_\mathrm{bol}, & \Lambda < \Lambda_\mathrm{c} \\ \dot{M}_\mathrm{hyd}, & \Lambda \ge \Lambda_\mathrm{c}\ \text{and}\ \left(\mathrm{Kn}_\mathrm{s} \le \mathrm{Kn}_\mathrm{c}\ \text{or}\ T_\mathrm{exo} > T_\mathrm{esc,gate}/2\right) \\ \dot{M}_\mathrm{hs}, & \text{otherwise} \end{cases} \tag{37}$$ + +with $\dot{M}_\mathrm{bol}$ from Eq. (8), $\dot{M}_\mathrm{hyd}$ from Eq. (18), $\dot{M}_\mathrm{hs}$ from Eq. (29), and $T_\mathrm{esc,gate}$ the escape temperature of Eq. (30) the `gate` setting selects. The dispatched rate is the largest of the candidates that survive: + +$$\dot{M} \;=\; \max\left(\dot{M}_\mathrm{branch},\ \chi_\mathrm{res}\, \dot{M}_\mathrm{bol},\ \chi_\mathrm{L1}\, \langle \dot{M}_\mathrm{L1} \rangle\right) \tag{38}$$ + +where $\chi_\mathrm{res} = 1$ only past the gate under `residual_mode = 'luminosity_capped'`, and $\chi_\mathrm{L1} = 1$ only where Eq. (35) holds on some part of the orbit and the averaged transfer rate exceeds the one-proton-per-Julian-year floor $\dot{M}_\mathrm{floor} = m_\mathrm{p} / (1\ \mathrm{yr})$; each is 0 otherwise. Taking the maximum makes each comparison a rate crossing: the dispatched rate is continuous where one candidate overtakes another, and the label follows the candidate that carries the rate. A residual win takes the label `boiloff` with the flag `bolometric_residual`; a nozzle win takes `roche_overflow` with the transfer rate itself. + +The floor guard on the nozzle exists because a crossing between two numerically empty numbers would rename the deeply bound corner on no content. It is loose: the constant marks what is distinguishable from zero in floating point, so the label remains reachable at rates far below anything that could matter over a planet's lifetime. `diagnostics['rate_floor']` reports the floor and whether the dispatched rate cleared it, and the depletion screen beside it is how a consumer tells whether a rate matters; the floor is never applied to a dispatched rate. The applicability edge of Eq. (35) is a criterion boundary like the activation gate, and the jump across it is a result to measure rather than an artifact to hide. + +The switches summarize as follows. `photon_limit` and `recombination_limit` remove a term from the minimum of Eq. (18) and nothing else; `residual_mode` sets $\chi_\mathrm{res}$ in Eq. (38) and never changes $\dot{M}_\mathrm{bol}$ itself; `nozzle_temperature` chooses the launch level of Eqs. (31) to (34); `tidal = False` sets $K = 1$ in Eqs. (7), (11), and (17). + +## The Roche screen + +Everything above except the nozzle assumes the flow is bound to the planet. Before the label is finalized, the flow radius of the branch that produced the rate is tested against the periapsis Hill radius of Eq. (1): + +$$\xi_\mathrm{flow} \;=\; \frac{R_\mathrm{Hill}}{R_\mathrm{flow}}, \qquad R_\mathrm{flow} = \begin{cases} R_\mathrm{B}, & \text{bolometric rate (boil-off or residual)} \\ \max\left(R_\mathrm{XUV},\ R_\mathrm{s}\right), & \text{hydrodynamic rate} \\ R_\mathrm{exo}, & \text{hydrostatic rate} \end{cases} \tag{39}$$ + +A state with $\xi_\mathrm{flow} \le 1$, or with $\xi \le 1$ in Eq. (2), is spilling over the gravitational boundary rather than escaping through a bound outflow, and it is named `roche_overflow`. When the nozzle wins, $R_\mathrm{flow}$ keeps the value of the branch it beat. + +The screen renames a state and never changes its rate. The branch whose flow radius gets tested is the one that won the final comparison, so the two sides of the screen's boundary hold the same branch; reporting that branch's own rate keeps the dispatched rate continuous across the boundary, while substituting a different branch's formula would make it jump by orders of magnitude at a line the physics puts nowhere in particular. When the rename fires on a bound branch, the label means the flow reaches the lobe and the rate beside it is the bound-flow estimate, a lower limit on what tides would do. `diagnostics['roche']['rate_branch']` names the branch that produced the rate, so the two readings of the label stay apart. + +Owen & Jackson (2012) separate two geometries inside that corner [^oj12], and a subflag says which one fired. Dynamical overflow is the atmosphere itself reaching the lobe, tested by comparing the outer extent of the modeled and extended structure, the larger of the profile top radius and $R_\mathrm{exo}$, reported as `r_atmosphere` in `diagnostics['roche']`, against the periapsis lobe radius of Eq. (32) in `diagnostics['nozzle']`, and it takes precedence whichever candidate carries the rate. The second case is an atmosphere inside its lobe whose sonic surface would have to sit outside it, so no transonic solution exists; they describe it as a narrow band and hypothesize a subsonic wind out to the lobe. A third subflag value, `neither`, marks a label won by the rate crossing while neither the atmosphere nor the flow radius reaches out. The comparator for the first case is the Roche lobe itself rather than the Hill radius, since the lobe is the critical surface and sits about 0.70 of the way out to it; `r_atmosphere` and `r_lobe` are both reported so the comparison can be read. The distinction is worth reading before a label is trusted, because the flow radius tested on the bolometric branch is a sonic radius that grows with the Jeans parameter: a tightly bound heavy atmosphere can push it several Hill radii out while the atmosphere itself sits deep inside, at a rate with no numerical content. `r_atmosphere` and `diagnostics['rate_floor']` are what separate that case from a real one. + +Near misses, $\xi_\mathrm{flow} < 1.5$ on a state the screen did not rename, raise a `near_roche` flag, because the tidal factor inflates the energy-limited rate steeply there; the flag reports, and never modifies, the rate. + +## The per-species split + +The per-species rates follow the branch that produced the rate, not the label. A hydrodynamic rate is partitioned by the [fractionation closure](fractionation.md) at the wind temperature and base radius, unless `fractionate = False`. The hydrostatic branch carries its own per-species rates from Eq. (29). A bolometric, nozzle, or unfractionated hydrodynamic rate is split over elements in proportion to the supplied reservoir masses, or, when none are supplied, to the mass fractions of the atomized wind-base composition, flagged `split_from_base_composition`. A state the Roche screen renamed keeps the split of its branch, so a wind relabeled `roche_overflow` keeps its fractionation. The per-species rates sum to $\dot{M}$ in every case. ## Boundaries are bands -Every threshold above carries a stated physical width, and the framework reports the width instead of hiding it behind a sharp switch. Beside every verdict, the diagnostics container carries: the counterfactual labels at the Knudsen band edges 0.1 and 3; the boil-off activation band 15 to 35; the transonic energy criterion of Johnson et al. (2013) [^johnson] (can the absorbed power drive the flow sonic at all); the Jeans-parameter triple of Guo (2024) [^guo], which translates the verdict into that taxonomy; both escape temperatures with the local ionization fraction; the tidally corrected critical exobase temperature of Erkaev et al. (2007) [^erkaev]; the fluid condition checked level by level below the sonic radius, after Owen & Jackson (2012) [^oj12]; the threshold-potential screens (the efficiency-collapse band of Caldiroli et al. 2022 [^caldiroli], and the wind-versus-thermosphere screen of Salz et al. 2016 [^salz], whose simulations find energy-limited escape valid below $\log_{10}(-\Phi_\mathrm{G}) = 13.11$ erg g$^{-1}$ and hydrodynamically stable thermospheres above about 13.6, where hydrogen Lyman alpha and free-free emission re-radiate the entire energy input; that grid is hydrogen-dominated, so on a heavy secondary atmosphere the screen is out of its own scope and is reported rather than applied); the boil-off termination timescales of Tang et al. (2024) [^tang]; a snapshot self-consistency screen (would the dispatched rate have destroyed the atmosphere within the system age); and the coefficient provenance class of every species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. +Every threshold above carries a stated physical width, and the framework reports the width instead of hiding it behind a sharp switch. Beside every verdict, the diagnostics container carries: the counterfactual labels at the Knudsen band edges 0.1 and 3; the boil-off activation band 15 to 35; the transonic energy criterion of Johnson et al. (2013), their Eq. (10) [^johnson], the absorbed power $\epsilon \pi R_\mathrm{XUV}^2 F_\mathrm{XUV}$ against the critical power needed to drive the flow sonic at all; the Jeans-parameter triple of Guo (2024) [^guo], which translates the verdict into that taxonomy; both escape temperatures with the local ionization fraction; the tidally corrected critical exobase temperature of Erkaev et al. (2007) [^erkaev]; the fluid condition checked level by level below the sonic radius, after Owen & Jackson (2012) [^oj12]; the threshold-potential screens on $\Phi_\mathrm{G} = -G M_\mathrm{p}/R_\mathrm{p}$ (the efficiency-collapse band of Caldiroli et al. 2022 [^caldiroli], and the wind-versus-thermosphere screen of Salz et al. 2016 [^salz], whose simulations find energy-limited escape valid below $\log_{10}(-\Phi_\mathrm{G}) = 13.11$ erg g$^{-1}$ and hydrodynamically stable thermospheres above about 13.6, where hydrogen Lyman alpha and free-free emission re-radiate the entire energy input; that grid is hydrogen-dominated, so on a heavy secondary atmosphere the screen is out of its own scope and is reported rather than applied); the boil-off termination timescales of Tang et al. (2024) [^tang]; a snapshot self-consistency screen (would the dispatched rate have emptied the supplied reservoirs within the system age); and the coefficient provenance class of every species. The container is reporting only: nothing in the dispatch control flow reads it, and it has no off switch. ## Configuration -All knobs, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. Every field of the result, every flag, and every diagnostics group is tabulated in the [dispatch results reference](../Reference/results.md). The assumptions that remain on every result, whatever the knobs, are collected on the [limitations page](limitations.md). +All settings, their defaults, and their meanings are tabulated in the [parameter reference](../Reference/parameters.md); the defaults are the documented reference choices used throughout this page. Every field of the result, every flag, and every diagnostics group is tabulated in the [dispatch results reference](../Reference/results.md). The assumptions that remain on every result, whatever the settings, are collected on the [limitations page](limitations.md). For the framework in use rather than in principle, the [dispatcher tutorial](../Tutorials/dispatch.md) crosses two of the boundaries above on one planet, measures how far one of them moves across the width of its own criterion, and dispatches an atmosphere along a stellar history; the [troubleshooting guide](../How-to/troubleshooting.md) starts from a flag or an unexpected verdict instead. --- +[^baumeister]: Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & Noack, L. (2023). Redox state and interior structure control on the long-term habitability of stagnant-lid planets. *Astronomy & Astrophysics, 675*, A122. https://doi.org/10.1051/0004-6361/202245791 + [^owenwu]: Owen, J. E., & Wu, Y. (2016). Atmospheres of low-mass planets: the "boil-off". *The Astrophysical Journal, 817*(2), 107. [^owensch]: Owen, J. E., & Schlichting, H. E. (2024). Mapping out the parameter space for photoevaporation and core-powered mass-loss. *Monthly Notices of the Royal Astronomical Society, 528*(2), 1615–1629. From e4017923ae58e24dd67a23cf0f979acb3b6fb687 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 13:43:44 +0200 Subject: [PATCH 109/113] Give every docs page that names a paper its reference Every paper named in the prose of an explanation, reference, or how-to page now has an entry in that page's footnote bibliography, with its marker at first mention. The model overview cites the primary behind each regime label (the boil-off wind and its activation parameter, the energy-limited, recombination-limited, and photon-limited rates, the kinetic Jeans enhancement and the diffusion-limited supply, the collisionality switch, and the L1 transfer and overflow geometries), and it counts three hydrodynamic limits rather than two. The parameter and result references, the test and troubleshooting guides, and the limitations page gain bibliographies. Entries are copied from pages that already carried them or taken from their ADS records. --- docs/Explanations/energy_limited.md | 4 +- docs/Explanations/limitations.md | 16 ++++++-- docs/Explanations/model.md | 38 +++++++++++++++---- docs/Explanations/regimes.md | 6 ++- docs/How-to/run_tests.md | 14 +++++-- docs/How-to/troubleshooting.md | 6 ++- docs/Reference/parameters.md | 58 +++++++++++++++++++++++------ docs/Reference/results.md | 24 +++++++++--- 8 files changed, 132 insertions(+), 34 deletions(-) diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md index feda914d..a44d3d6d 100644 --- a/docs/Explanations/energy_limited.md +++ b/docs/Explanations/energy_limited.md @@ -6,7 +6,7 @@ The physical idea is an energy budget. The stellar X-ray and extreme-ultraviolet $$\dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}}{G\,M_\mathrm{p}\,K_\mathrm{tide}} \tag{1}$$ -where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The threshold is on the untidal specific binding energy, which is the convention the screen in the diagnostics uses and the one Salz et al. (2016) share; the tidal factor enters the rate, not the potential the threshold is quoted against. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. +where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The threshold is on the untidal specific binding energy, which is the convention the screen in the diagnostics uses and the one Salz et al. (2016) [^salz] share; the tidal factor enters the rate, not the potential the threshold is quoted against. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. Two radii enter the problem, and keeping them apart matters. $R_\mathrm{p}$ is the planetary (interior) radius. $R_\mathrm{XUV}$ is the radius at which the atmosphere becomes optically thick to XUV photons; in PROTEUS it is recomputed at each time step from the atmospheric structure at a configured reference pressure, by default 20 mbar following the photosphere-type level of Baumeister et al. (2023) [^baumeister]. That level is a bookkeeping radius for the intercepting area: the XUV heating is actually deposited, and the wind launched, at the far lower pressure (of order a nanobar) where the gas first reaches unit optical depth to ionizing photons [^lopez2017]; the [escape-regime framework](regimes.md) locates that launching level on the profile when it needs it. @@ -59,6 +59,8 @@ Bulk removal is the second assumption. When the escaping particle flux drops bel [^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 +[^salz]: Salz, M., Schneider, P. C., Czesla, S., & Schmitt, J. H. M. M. (2016). Energy-limited escape revised. The transition from strong planetary winds to stable thermospheres. *Astronomy & Astrophysics, 585*, L2. https://doi.org/10.1051/0004-6361/201527042 + [^luger]: Luger, R., & Barnes, R. (2015). Extreme water loss and abiotic O$_2$ buildup on planets throughout the habitable zones of M dwarfs. *Astrobiology, 15*(2), 119–143. https://doi.org/10.1089/ast.2014.1231 [^moore]: Moore, K., Cowan, N. B., & Boukaré, C.-É. (2023). The role of magma oceans in maintaining surface water on rocky planets orbiting M-dwarfs. *Monthly Notices of the Royal Astronomical Society, 526*(4), 6235–6249. https://doi.org/10.1093/mnras/stad3138 diff --git a/docs/Explanations/limitations.md b/docs/Explanations/limitations.md index f6cf1231..1ec6a6e3 100644 --- a/docs/Explanations/limitations.md +++ b/docs/Explanations/limitations.md @@ -9,7 +9,7 @@ Every prescription in ZEPHYRUS is a deliberate simplification of a richer physic The released entry point applies one prescription unconditionally, so every limitation of that prescription passes through to coupled PROTEUS runs until the regime framework is wired in: - **No regime awareness.** `EL_escape` returns an energy-limited rate whether or not the state sustains a collisional XUV wind. Outside that regime (weak XUV flux, compact atmosphere, boil-off conditions, Roche-filling geometries) the returned rate can be wrong by orders of magnitude in either direction. The [regime framework](regimes.md) classifies the state first; `EL_escape` does not. -- **Radiative cooling is not accounted for.** Line emission, molecular bands, and recombination divert absorbed XUV power away from driving the outflow, which is why the effective efficiency collapses for strongly bound planets (of order $10^{-2}$ above the threshold potential of Caldiroli et al. 2022; see the [energy-limited page](energy_limited.md)). `EL_escape` treats the efficiency $\epsilon$ as a constant input, so $\epsilon = 1$ is a nonphysical upper limit and even canonical values overestimate the loss for compact planets. The regime framework improves on this two ways (a radiatively cooled wind temperature, and the radiation-recombination cap), but its energy-limited efficiency remains an input as well. +- **Radiative cooling is not accounted for.** Line emission, molecular bands, and recombination divert absorbed XUV power away from driving the outflow, which is why the effective efficiency collapses for strongly bound planets (of order $10^{-2}$ above the threshold potential of Caldiroli et al. 2022 [^caldiroli]; see the [energy-limited page](energy_limited.md)). `EL_escape` treats the efficiency $\epsilon$ as a constant input, so $\epsilon = 1$ is a nonphysical upper limit and even canonical values overestimate the loss for compact planets. The regime framework improves on this two ways (a radiatively cooled wind temperature, and the radiation-recombination cap), but its energy-limited efficiency remains an input as well. - **Bulk removal.** The rate is split over species by reservoir mass fractions, with no preferential loss of light species. The [fractionation closure](fractionation.md) resolves the partition when the regime framework confirms a wind; `EL_escape` alone cannot. For close-in planets where fractionation matters, bulk-removal rates are a lower bound on how fast the atmospheric mean molecular weight grows. - **$\epsilon$ is constant in time.** The efficiency in reality evolves with mass, radius, and flux; fixed-$\epsilon$ histories can overestimate late-time loss. The fitted-efficiency option of the regime framework captures the potential dependence, not a separate time dependence. @@ -23,8 +23,8 @@ The framework removes the regime-awareness limitation and carries its own, each - **Thresholds are calibrated elsewhere.** The boil-off activation threshold is calibrated on hydrogen-rich envelopes and transferred to other compositions through the mean molecular mass; the collisionality threshold carries a factor-30 physical band from the heating geometry. Both bands are reported beside every verdict rather than hidden, but a band is not a resolution. - **Known extrapolations are held, flagged.** The kinetic enhancement on the Jeans flux is measured up to a Jeans parameter of 15 and held constant beyond; the CO$_2$ band's deexcitation rates are measured over roughly 150 to 500 K; the geometric cross-section fallback has a documented high-temperature bias. Each engagement is flagged or provenance-classed. - **The switch inherits the base-pressure choice.** The sonic-point density scales with the wind-base density, so the base-method setting moves where the switch fires; the setting exposes that dependence rather than resolving it. -- **The photon-limited cap is an estimate, not a bound.** The count behind it, one particle per intercepted ionizing photon (Owen & Alvarez 2016, Eq. 10), limits primary ionizations rather than mass loss: neutrals heated by collisions escape too, and X-ray photoelectrons ionize more than once, so a real flow can exceed it. The source never simulates the regime, and the one three-dimensional plane-parallel calculation with numbers to compare sits 1.3 to 2.4 times above the count taken on the wind-base disk (Debrecht et al. 2019, MNRAS 483, 1481). Here the count uses the energy-limited rate's 20 mbar disk instead, so that the two share one photon budget; the wind base can sit several times further out (1.04 to 9 times in radius on the states tested), so on this disk the cap sits below the paper's own Eq. (10) by the square of that ratio, a factor the energy-limited rate shares. Where the cap binds the rate may therefore be low. The mass per ionization is the wind's mean atomic mass per ion, which on a hydrogen front counts helium as ionized although 20 eV photons do not ionize it; the count per photon is then 5 percent low at a helium mixing ratio of 0.1 and about 9 percent at solar abundance, a convention the recombination-limited base density shares. It also scales inversely with the photon energy per ionization, taken as the front energy (20 eV for a hydrogen front), and the plausible range of 13.6 to 40 eV spans a factor of 2.9. `photon_limit = False` recovers the uncapped rate for comparison. -- **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two things the primary computes and this module does not: the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds. Under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. +- **The photon-limited cap is an estimate, not a bound.** The count behind it, one particle per intercepted ionizing photon (Owen & Alvarez 2016, Eq. 10 [^owenalvarez]), limits primary ionizations rather than mass loss: neutrals heated by collisions escape too, and X-ray photoelectrons ionize more than once, so a real flow can exceed it. The source never simulates the regime, and the one three-dimensional plane-parallel calculation with numbers to compare sits 1.3 to 2.4 times above the count taken on the wind-base disk (Debrecht et al. 2019, MNRAS 483, 1481 [^debrecht]). Here the count uses the energy-limited rate's 20 mbar disk instead, so that the two share one photon budget; the wind base can sit several times further out (1.04 to 9 times in radius on the states tested), so on this disk the cap sits below the paper's own Eq. (10) by the square of that ratio, a factor the energy-limited rate shares. Where the cap binds the rate may therefore be low. The mass per ionization is the wind's mean atomic mass per ion, which on a hydrogen front counts helium as ionized although 20 eV photons do not ionize it; the count per photon is then 5 percent low at a helium mixing ratio of 0.1 and about 9 percent at solar abundance, a convention the recombination-limited base density shares. It also scales inversely with the photon energy per ionization, taken as the front energy (20 eV for a hydrogen front), and the plausible range of 13.6 to 40 eV spans a factor of 2.9. `photon_limit = False` recovers the uncapped rate for comparison. +- **The overflow rate is isothermal, uncapped, and orbit-averaged by our own convention.** The L1 nozzle candidate (Jackson et al. 2017, their Eq. 3 [^jackson17]) assumes an isothermal flow from the photosphere to L1 on a circular, synchronously rotating orbit, and its authors name the temperature choice as the dominant uncertainty; the `nozzle_temperature` setting exposes it. The flow carries no energy cap, faithful to the primary, and the diagnostics report the lift power beside the interior and intercepted stellar luminosities so a consumer can see where the isothermal assumption is strained. Two things the primary computes and this module does not: the torque-balance transfer rate of their Eq. 24, which needs the stellar tidal dissipation and can sit orders of magnitude below the nozzle rate where disk-stellar torque balance holds. Under that reading the dispatched transfer rate is an upper limit. The second is whether the transfer is stable, which couples to orbital evolution that nothing in this package models. The volume-averaged potentials carry a few-percent error near the lobe that the primary quantifies as about a factor of two in the rate, and the photospheric-radius distortion conversion of their Appendix is omitted as a stated convention. An eccentric orbit has no treatment in the primary at all: this module evaluates the circular formula at each separation and averages in time, duty-cycled over the arc where the overflow description applies, so an eccentric result omits the wind the planet drives on the rest of the orbit and inherits a Roche geometry that is synchronous at no single phase. The applicability criterion itself is a sharpening of a comparison the primary draws qualitatively, and the dispatched rate jumps across it, by a measured factor of about 4e3 on one family. - **A geometric rename still reports a bound-flow rate.** Where the Roche screen fires on a bound branch (the nozzle candidate losing or outside its applicability criterion), the reported rate is that branch's own, a lower limit on what tides would do. That is a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, the module's own estimate of that transfer is `diagnostics['nozzle']['rate_kg_s']` and it is below the dispatched rate. The subflag and the reported extent of the atmosphere separate the geometry that genuinely overflows from an atmosphere sitting deep inside its lobe with only its sonic surface outside. - **Impacts are not dispatched.** The giant-impact channel has a reserved label but is invoked directly by the caller, outside the continuous classification. @@ -53,3 +53,13 @@ The XUV flux $F_\mathrm{XUV}$ entering every XUV-driven rate carries large intri - Avoid $\epsilon > 0.3$ for rocky planets without a specific reason; $\epsilon \approx 0.15$ is the conservative baseline, and for strongly bound planets consider the fitted-efficiency option of the regime framework. - For close-in planets around M dwarfs, where fractionation is expected, bulk-removal rates bound the growth of the atmospheric mean molecular weight from below; use the regime framework with fractionation on when the composition history matters. - Treat single-prescription mass-loss histories as scenario calculations rather than predictions: the regime diagnostics reported beside every framework verdict are the tool for judging how sensitive a given history is to the boundary placements. + +--- + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 + +[^debrecht]: Debrecht, A., Carroll-Nellenback, J., Frank, A., McCann, J., Murray-Clay, R., & Blackman, E. G. (2019). Photoevaporative flows from exoplanet atmospheres: a 3D radiative hydrodynamic parameter study. *Monthly Notices of the Royal Astronomical Society, 483*(2), 1481–1495. https://doi.org/10.1093/mnras/sty3212 + +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 diff --git a/docs/Explanations/model.md b/docs/Explanations/model.md index 69c8f179..f1c20e40 100644 --- a/docs/Explanations/model.md +++ b/docs/Explanations/model.md @@ -11,12 +11,12 @@ Mass loss happens through two physically distinct channels, and ZEPHYRUS models Which physics carries the continuous loss depends on how tightly the atmosphere is bound, how strongly it is irradiated, and how collisional its outer layers are. Applying a prescription outside its regime gives rates that are wrong by orders of magnitude, so ZEPHYRUS classifies each atmospheric state before choosing a rate. Every state receives one of six regime labels: -- `boiloff`: the atmosphere is so weakly bound that it flows out on the planet's own thermal energy, before stellar XUV heating matters. Typical of young, hot, hydrogen-rich planets fresh out of the nebula. -- `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (the energy-limited rate is the smaller of the two hydrodynamic limits here). -- `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate wins). -- `hydrodynamic:PL`: the same fluid wind in a well shallow enough that the heating share of each ionizing photon's energy exceeds the work to lift one particle out, so the rate is set by the number of photons rather than their energy (the photon-limited rate of Owen & Alvarez 2016 wins). -- `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape), species by species, capped by how fast diffusion can resupply each species. -- `roche_overflow`: either the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017) outruns every bound candidate and is dispatched as the rate, or the flow region reaches the planet's Hill sphere and the label sits on top of whichever regime produced the rate, which is then a lower limit. `diagnostics['roche']['rate_branch']` says which reading applies. +- `boiloff`: the atmosphere is so weakly bound that it flows out on the planet's own thermal energy, before stellar XUV heating matters. Typical of young, hot, hydrogen-rich planets fresh out of the nebula. The rate is the isothermal Parker wind of Owen & Wu (2016) [^owenwu] at the wind temperature of Misener et al. (2025) [^misener], and the state is recognized by the restricted Jeans parameter of Fossati et al. (2017) [^fossati]. +- `hydrodynamic:EL`: a fluid wind driven by stellar XUV heating, with the rate set by the energy budget (Watson et al. 1981 [^watson], in the tidally corrected form of Erkaev et al. 2007 [^erkaev]); the energy-limited rate is the smallest of the three hydrodynamic limits here. +- `hydrodynamic:RR`: the same fluid wind, but the rate is capped below the energy limit because radiative recombination re-emits part of the absorbed energy (the radiation-recombination-limited rate of Murray-Clay et al. 2009 [^mc09] wins). +- `hydrodynamic:PL`: the same fluid wind in a well shallow enough that the heating share of each ionizing photon's energy exceeds the work to lift one particle out, so the rate is set by the number of photons rather than their energy (the photon-limited rate of Owen & Alvarez 2016 [^owenalvarez] wins). +- `hydrostatic`: the gas is too rarefied to sustain a fluid wind, and escape proceeds particle by particle from the exosphere (Jeans escape, with the kinetic enhancement of Volkov et al. 2011 [^volkovb]), species by species, capped by how fast diffusion can resupply each species (Yelle 2024 [^yelle]). Whether the wind is collisional enough to exist is decided by the sonic-point Knudsen number of Chatterjee & Pierrehumbert (2026) [^cp26]. +- `roche_overflow`: either the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017 [^jackson17]) outruns every bound candidate and is dispatched as the rate, or the flow region reaches the planet's Hill sphere and the label sits on top of whichever regime produced the rate, which is then a lower limit (the overflow geometries of Owen & Jackson 2012 [^oj12]). `diagnostics['roche']['rate_branch']` says which reading applies. The classification logic reduces to three questions, asked in a fixed order: @@ -45,7 +45,7 @@ The regime boundaries are not sharp lines in nature. Each threshold carries a ph ## The default prescription and the full framework -The energy-limited (EL) rate is the default prescription: it is what PROTEUS consumes at each time step today, through the released entry point `zephyrus.escape.EL_escape`, and the [energy-limited escape](energy_limited.md) page defines it in full. It is not an independent channel: within the framework it is one of the two hydrodynamic limits, valid when the atmosphere sustains a collisional XUV-driven wind, which is the regime that dominates the loss during the first 10 to 100 million years of a close-in planet's life. +The energy-limited (EL) rate is the default prescription: it is what PROTEUS consumes at each time step today, through the released entry point `zephyrus.escape.EL_escape`, and the [energy-limited escape](energy_limited.md) page defines it in full. It is not an independent channel: within the framework it is one of the three hydrodynamic limits, valid when the atmosphere sustains a collisional XUV-driven wind, which is the regime that dominates the loss during the first 10 to 100 million years of a close-in planet's life. The full classification framework is available as the standalone entry point `zephyrus.dispatch`, which takes one planetary state (scalars plus an atmosphere profile) and returns the regime label, the bulk rate, per-species rates that sum to it, flags, and the diagnostics container. Its coupling into PROTEUS is planned as a follow-up to the current energy-limited wiring; until then, coupled runs use the EL default and standalone studies can use either entry point. @@ -69,6 +69,30 @@ A giant collision removes part of the target's atmosphere in a single event, on --- +[^owenwu]: Owen, J. E., & Wu, Y. (2016). Atmospheres of low-mass planets: the "boil-off". *The Astrophysical Journal, 817*(2), 107. + +[^misener]: Misener, W., et al. (2025). Blowin' in the Nonisothermal Wind: Core-powered Mass Loss with Hydrodynamic Radiative Transfer. *The Astrophysical Journal, 980*(1), 152. + +[^fossati]: Fossati, L., et al. (2017). Aeronomical constraints to the minimum mass and maximum radius of hot low-mass planets. *Astronomy & Astrophysics, 598*, A90. + +[^watson]: Watson, A. J., Donahue, T. M., & Walker, J. C. G. (1981). The dynamics of a rapidly escaping atmosphere: applications to the evolution of Earth and Venus. *Icarus, 48*(2), 150–166. https://doi.org/10.1016/0019-1035(81)90101-9 + +[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 + +[^mc09]: Murray-Clay, R. A., Chiang, E. I., & Murray, N. (2009). Atmospheric Escape From Hot Jupiters. *The Astrophysical Journal, 693*(1), 23–42. https://doi.org/10.1088/0004-637X/693/1/23 + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 + +[^volkovb]: Volkov, A. N., Tucker, O. J., Erwin, J. T., & Johnson, R. E. (2011). Kinetic simulations of thermal escape from a single component atmosphere. *Physics of Fluids, 23*(6), 066601. https://doi.org/10.1063/1.3592253 + +[^yelle]: Yelle, R. V. (2024). Diffusion limited escape of hydrogen from Mars. *Icarus, 416*, 116099. + +[^cp26]: Chatterjee, R. D., & Pierrehumbert, R. T. (2026). Novel Physics of Escaping Secondary Atmospheres May Shape the Cosmic Shoreline. *The Astrophysical Journal, 998*(2), 236. https://doi.org/10.3847/1538-4357/ae2ffa + +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 + +[^oj12]: Owen, J. E., & Jackson, A. P. (2012). Planetary evaporation by UV and X-ray radiation: basic hydrodynamics. *Monthly Notices of the Royal Astronomical Society, 425*(4), 2931. https://doi.org/10.1111/j.1365-2966.2012.21481.x + [^attia]: Attia, M., & Lichtenberg, T. (2026). Atmospheric escape fractionates secondary but not primary atmospheres. *arXiv e-prints*, arXiv:2608.30106. https://doi.org/10.48550/arXiv.2608.30106 [^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index 37446efc..b68c2b6a 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -177,7 +177,7 @@ where $\ell_\mathrm{s}$ is the Maxwell mean free path, $n_\mathrm{s}$ the heavy- $$\sigma_\mathrm{C} \;=\; \sum_j y_j\, \sigma_j(T_\mathrm{w}) \tag{20}$$ -Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist, as the momentum-transfer cross section $\pi \sigma^2 \Omega^{(1,1)*}$ (Laricchiuta et al. 2009, their Eqs. 2 to 4 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990, their Eq. 30 [^z90], on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements carry no radius in the package's table, so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. For two of them the gap is in the source: Bondi (1964) gives no radius for aluminium or calcium, among the 16 of 44 main-group elements missing from that table, which Mantina et al. (2009) later supplied on the same scale [^mantina]. Phosphorus, chlorine, and potassium are main-group elements Bondi does tabulate, and titanium is a transition metal; the table does not carry them yet. +Cross sections come from a provenance-classed fallback order: tabulated collision integrals where they exist, as the momentum-transfer cross section $\pi \sigma^2 \Omega^{(1,1)*}$ (Laricchiuta et al. 2009, their Eqs. 2 to 4 [^laricchiuta], validated against measured viscosities), a diffusion-coefficient inversion for hydrogen (Zahnle et al. 1990, their Eq. 30 [^z90], on the compilation of Zahnle & Kasting 1986 [^zk86]), and a geometric hard sphere as last resort, whose bias is documented and flagged. Six elements carry no radius in the package's table, so aluminium, phosphorus, chlorine, potassium, calcium, and titanium reach that fallback on an assumed radius; those carry a provenance class of their own so an assumed number cannot be read as a published one. For two of them the gap is in the source: Bondi (1964) [^bondi] gives no radius for aluminium or calcium, among the 16 of 44 main-group elements missing from that table, which Mantina et al. (2009) later supplied on the same scale [^mantina]. Phosphorus, chlorine, and potassium are main-group elements Bondi does tabulate, and titanium is a transition metal; the table does not carry them yet. One property of the criterion is one-sided. The cross sections are neutral-neutral, while the wind can be substantially ionized: the recombination chain reports base ionization fractions reaching 0.86 on heavy compositions. This is the neutral onset, and Chatterjee & Pierrehumbert make the same choice deliberately, noting that collisionality rises with ionization because ion-atom charge exchange and atom-electron collisions carry larger cross sections; they call the neutral criterion reasonable when the flow is advection-dominated and weakly ionized, and highly conservative for characterizing rapid mass loss. Including the ion channels would shorten the mean free path and lower $\mathrm{Kn}_\mathrm{s}$, moving points toward hydrodynamic verdicts, so every hydrostatic call the switch makes on an ionized wind is one the fuller physics could overturn, and no hydrodynamic call is. @@ -381,4 +381,6 @@ For the framework in use rather than in principle, the [dispatcher tutorial](../ [^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 -[^mantina]: Mantina, M., Chamberlin, A. C., Valero, R., Cramer, C. J., & Truhlar, D. G. (2009). Consistent van der Waals Radii for the Whole Main Group. *The Journal of Physical Chemistry A, 113*(19), 5806-5812. https://doi.org/10.1021/jp8111556 +[^mantina]: Mantina, M., Chamberlin, A. C., Valero, R., Cramer, C. J., & Truhlar, D. G. (2009). Consistent van der Waals Radii for the Whole Main Group. *The Journal of Physical Chemistry A, 113*(19), 5806–5812. https://doi.org/10.1021/jp8111556 + +[^bondi]: Bondi, A. (1964). van der Waals Volumes and Radii. *The Journal of Physical Chemistry, 68*(3), 441–451. https://doi.org/10.1021/j100785a001 diff --git a/docs/How-to/run_tests.md b/docs/How-to/run_tests.md index 4653b5e9..9ddba283 100644 --- a/docs/How-to/run_tests.md +++ b/docs/How-to/run_tests.md @@ -73,9 +73,9 @@ Tests that pin behaviour against an external anchor are tagged `@pytest.mark.ref | Source | Anchor | Test | |---|---|---| -| `escape.py` | Erkaev et al. (2007), A&A 472:329, Eq. 21: closed-form energy-limited rate for the default `scaling=2` radius term | `tests/test_escape.py::test_el_escape_scaling2_matches_erkaev2007_closed_form` | -| `escape.py` | Lehmer & Catling (2017), ApJ 845:130, Eq. 1: closed-form rate for the `scaling=3` radius term | `tests/test_escape.py::test_el_escape_scaling3_matches_lehmer_catling_closed_form` | -| `collision.py` | Kegerreis et al. (2020), ApJL 901:L31, Eq. 1: closed-form erosion fraction for identical twin bodies | `tests/test_collision.py::test_scaling_law_pins_the_kegerreis_closed_form` | +| `escape.py` | Erkaev et al. (2007) [^erkaev], A&A 472:329, Eq. 21: closed-form energy-limited rate for the default `scaling=2` radius term | `tests/test_escape.py::test_el_escape_scaling2_matches_erkaev2007_closed_form` | +| `escape.py` | Lehmer & Catling (2017) [^lehmer], ApJ 845:130, Eq. 1: closed-form rate for the `scaling=3` radius term | `tests/test_escape.py::test_el_escape_scaling3_matches_lehmer_catling_closed_form` | +| `collision.py` | Kegerreis et al. (2020) [^kegerreis], ApJL 901:L31, Eq. 1: closed-form erosion fraction for identical twin bodies | `tests/test_collision.py::test_scaling_law_pins_the_kegerreis_closed_form` | | `collision.py` | Kegerreis et al. (2020), ApJL 901:L31, Tables 1 and 2: simulated loss fractions of the SPH suite | `tests/test_collision.py::test_scaling_law_reproduces_kegerreis_table2_simulations` | The marker is not the same thing as physical correctness: a reference-pinned test certifies that this implementation reproduces that anchor; it does not certify that the anchor is the right physics for every planetary regime. @@ -208,3 +208,11 @@ The repository-wide rules that every PROTEUS-ecosystem submodule follows are at The coverage source is the package, `source = ["zephyrus"]`, so `examples/` sits outside both gates. That is the ecosystem convention rather than an omission: PROTEUS and every sibling submodule set the source to their own package, and PROTEUS's own `examples/` holds configuration files with no Python in them at all. Adding the worked example here would move the reported number by more than ten points while measuring a script rather than the library. The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes, character for character. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. + +--- + +[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 + +[^lehmer]: Lehmer, O. R., & Catling, D. C. (2017). Rocky worlds limited to 1.8 Earth radii by atmospheric escape during a star's extreme UV saturation. *The Astrophysical Journal, 845*(2), 130. + +[^kegerreis]: Kegerreis, J. A., Eke, V. R., Catling, D. C., Massey, R. J., Teodoro, L. F. A., & Zahnle, K. J. (2020). Atmospheric Erosion by Giant Impacts onto Terrestrial Planets: A Scaling Law for any Speed, Angle, Mass, and Density. *The Astrophysical Journal Letters, 901*(2), L31. https://doi.org/10.3847/2041-8213/abb5fb diff --git a/docs/How-to/troubleshooting.md b/docs/How-to/troubleshooting.md index 5fcb4d97..87336acf 100644 --- a/docs/How-to/troubleshooting.md +++ b/docs/How-to/troubleshooting.md @@ -76,7 +76,7 @@ The flux scaling will not separate them either: the base ion density follows $\s The four cases that produces: -- `rate_branch` reading `roche_overflow`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. The subflag beside it reads `dynamical` when the atmosphere's own extent passes the lobe and `neither` when it does not, so it describes the geometry and not the mechanism. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. +- `rate_branch` reading `roche_overflow`: the rate is the tidally driven transfer through the inner Lagrange point (Jackson et al. 2017 [^jackson17]), dispatched because it beat every bound candidate inside its applicability criterion. It is a real transfer rate rather than a rename; `diagnostics['nozzle']` carries the barrier, the saturation state, and the lift power against the available luminosities. The subflag beside it reads `dynamical` when the atmosphere's own extent passes the lobe and `neither` when it does not, so it describes the geometry and not the mechanism. On an eccentric orbit the rate is an orbit average duty-cycled over the arc where the description applies; read `applicable_orbit_fraction`, and treat a value below one as a rate that omits the wind driven on the rest of the orbit. - Subflag `dynamical` on a bound branch and a rate above the floor: the atmosphere reaches its Roche lobe while the nozzle candidate lost or sat outside its criterion, the rate is the bound-flow estimate, and the real rate is higher by whatever the tidal flow would carry. Treat it as a lower limit. - Subflag `no_transonic` with `r_atmosphere` well inside the Hill radius: only the would-be sonic surface passes the lobe. On a heavy bound atmosphere this is the tightly-bound case above, not an overflow; the [regimes page](../Explanations/regimes.md) explains why the two look alike to the screen. - `above_floor` false: the label is decided by the ordering of two rates with no numerical content. Report no escape and treat the geometry as a note. @@ -129,3 +129,7 @@ Points whose flow radius exceeds two thirds of the Hill radius raise `near_roche ## When none of the above applies Print the whole container for the offending call and read it in the order the [tutorial](../Tutorials/dispatch.md) uses: which branch and how close, what set the rate, whether the heating could drive a flow at all, how the verdict translates into other taxonomies, and whether the snapshot is self-consistent. If the verdict still looks wrong after that, the input state is the next suspect: check the profile spans the pressures the branches need, that the composition is what you meant, and that every scalar is in SI. + +--- + +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index db4ed9f3..8f50b93d 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -57,9 +57,11 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `e_earth` | none | $0.017$ | dimensionless | | `a_earth` | none | $1$ | au | -`Fxuv_earth_10Myr` is taken from Fig. 9 of Wordsworth et al. (2018). +`Fxuv_earth_10Myr` is taken from Fig. 9 of Wordsworth et al. (2018) [^wordsworth2018]. -### Jupiter (IAU 2015 nominal values) +### Jupiter + +From the IAU 2015 nominal values (Prša et al. 2016 [^prsa]). | Name | Symbol | Value | Units | |---|---|---|---| @@ -70,7 +72,9 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For ## TOI-561 reference values (`planets_parameters.py`) -### TOI-561 (star, Weiss et al. 2021) +### TOI-561 (star) + +From Weiss et al. (2021) [^weiss]. | Name | Value | Errorbar | Units | |---|---|---|---| @@ -80,7 +84,9 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For | `age_TOI561` | $10 \times 10^{9}$ | $3 \times 10^{9}$ | yr | -### TOI-561 b (planet, Brinkman et al. 2023) +### TOI-561 b (planet) + +From Brinkman et al. (2023) [^brinkman]. | Name | Value | Errorbar | Units | |---|---|---|---| @@ -97,15 +103,15 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | Name | Default | Options / units | Meaning | |---|---|---|---| -| `base_method` | `'lopez'` | `'lopez'`, `'fixed_pressure'`, `'boreas'` | How the XUV wind base is located on the profile. The Lopez (2017) level is $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar; `'boreas'` uses the optional BOREAS solver and falls back to `'lopez'` with a flag when it is absent or does not converge. | +| `base_method` | `'lopez'` | `'lopez'`, `'fixed_pressure'`, `'boreas'` | How the XUV wind base is located on the profile. The Lopez (2017) [^lopez2017] level is $P_\mathrm{base} = \mu g / \sigma_{\nu_0}$, about a nanobar; `'boreas'` uses the optional BOREAS solver and falls back to `'lopez'` with a flag when it is absent or does not converge. | | `base_out_of_range` | `'clamp'` | `'clamp'`, `'extend'` | What happens when the profile top is deeper than the physical base level: clamp to the top level (flagged, distance recorded) or evaluate the base on the extended upper structure. Whether it engages depends on the state: the Lopez base is $\mu g / \sigma_{\nu_0}$, tens of nanobars on an Earth-mass carbon dioxide planet but below a nanobar on a low-gravity hydrogen envelope, so no single profile top clears it everywhere. Read `base_clamped` rather than assuming. | -| `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023). | +| `P_photo` | 2000 | Pa | Photospheric-type level for the energy-limited geometric factor (20 mbar, after Baumeister et al. 2023 [^baumeister]). | | `P_base_fixed` | 5.0 | Pa | Base pressure for the `'fixed_pressure'` method only. | | `kn_crit` | 1.0 | $> 0$ | Sonic-point Knudsen threshold of the fluid-to-kinetic switch; the physical band 0.1 to 3 is a diagnostic constant, not a knob. | | `kn_hysteresis` | 1.5 | $\geq 1$ (1 disables the window) | Hysteresis window factor around `kn_crit`, consumed only when a previous regime label is supplied. | | `gate` | `'neutral'` | `'neutral'`, `'plasma'` | Which escape temperature gates the hydrostatic branch; both are always computed and disagreements are flagged as contested. | | `efficiency` | 0.1 | $0 < \epsilon \leq 1$ | Energy-limited heating efficiency $\epsilon$. | -| `efficiency_mode` | `'fixed'` | `'fixed'`, `'caldiroli'` | Fixed $\epsilon$, or the Caldiroli et al. (2022) fitted efficiency converted to the Erkaev geometry, with a guarded fallback below its validity bound. | +| `efficiency_mode` | `'fixed'` | `'fixed'`, `'caldiroli'` | Fixed $\epsilon$, or the Caldiroli et al. (2022) [^caldiroli] fitted efficiency converted to the Erkaev geometry, with a guarded fallback below its validity bound. | | `T_exo_mode` | `'prescribed'` | `'prescribed'`, `'thermostat'` | Exobase temperature source. The prescribed value is the hydrostatic branch's dominant sensitivity; the thermostat estimator is biased high by construction. | | `T_exo_value` | 1000 | K | The prescribed exobase temperature. | | `cool_atomic` | `True` | `True`, `False` | Atomic line cooling (H, C, C+, N, N+, O, O+) in the wind thermostat. | @@ -113,11 +119,11 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `cool_o_finestructure` | `True` | `True`, `False` | Atomic O fine-structure cooling at 63 and 147 micron. | | `cool_recombination` | `True` | `True`, `False` | Recombination (continuum) cooling. Disabling all four channels at once is rejected. | | `fractionate` | `True` | `True`, `False` | Apply the N-species closure on confirmed hydrodynamic verdicts; otherwise split by reservoir mass fractions. | -| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | -| `photon_limit` | `True` | `True`, `False` | Cap the XUV wind at one particle per intercepted ionizing photon, the photon-limited rate of Owen & Alvarez (2016) Eq. (10), on the energy-limited rate's disk. It binds where the efficiency exceeds `efficiency_photon_limit`, on shallow wells. `False` restores min(EL, RR), which is what most energy-limited codes in the literature compute. | -| `recombination_limit` | `True` | `True`, `False` | Admit the recombination-limited rate of Murray-Clay et al. (2009) as a candidate for the XUV wind. `False` leaves min(EL, PL), or the energy-limited rate alone together with `photon_limit = False`. The chain is still evaluated either way, because the sonic-point Knudsen switch reads its sonic density, so the collisionality verdict does not change with this setting. | -| `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | -| `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) whose persistence Tang et al. (2024) dispute. Off by default, following Tang et al.; the price is a jump in the dispatched rate at the activation gate, measured on the [escape regimes](../Explanations/regimes.md) page together with the dispute and the band past the gate where the candidate would win. | +| `tidal` | `True` | `True`, `False` | Apply the Erkaev et al. (2007) [^erkaev] tidal factor. It divides the energy-limited rate and the interior-luminosity cap alike, so that when the residual is admitted (`residual_mode`) the two candidates it compares measure one barrier; `False` sets $K_\mathrm{tide} = 1$ in both. | +| `photon_limit` | `True` | `True`, `False` | Cap the XUV wind at one particle per intercepted ionizing photon, the photon-limited rate of Owen & Alvarez (2016) [^owenalvarez] Eq. (10), on the energy-limited rate's disk. It binds where the efficiency exceeds `efficiency_photon_limit`, on shallow wells. `False` restores min(EL, RR), which is what most energy-limited codes in the literature compute. | +| `recombination_limit` | `True` | `True`, `False` | Admit the recombination-limited rate of Murray-Clay et al. (2009) [^mc09] as a candidate for the XUV wind. `False` leaves min(EL, PL), or the energy-limited rate alone together with `photon_limit = False`. The chain is still evaluated either way, because the sonic-point Knudsen switch reads its sonic density, so the collisionality verdict does not change with this setting. | +| `nozzle_temperature` | `'photospheric'` | `'photospheric'`, `'wind'` | Which level the L1 nozzle candidate is launched from: the photospheric level at the profile's own temperature (the construction of Jackson et al. 2017 [^jackson17]) or the wind base at the thermostat's wind temperature and mean mass (the upper envelope their Figure 9 explores). Both settings take the density, temperature, and mean mass from one level, which is what the Bernoulli cancellation behind the launch-level convention requires; the wind setting places the launch level on the wind's own isothermal column, anchored at the wind base with the ideal-gas density there for the wind's temperature and mean mass, rather than carrying a cold density into a hot sound speed. That column is a device for placing the level consistently with the sound speed evaluating the barrier, not a claim about structure below the anchor, which is far hotter than the atmosphere really is there. Where the anchor itself sits is a separate and physical question, and `base_method` moves it: the two are worth keeping apart, because the level convention cancels and the anchor does not. One consequence to watch under the `lopez` default: on an inflated envelope the wind base can sit outside the planet's Roche lobe, measured at 1.29 lobe radii on a 3 Earth-mass, 2.2 Earth-radius H/He case, in which case the exponent is clamped and the candidate reports the lobe-filling boundary value with `nozzle_saturated` raised. The temperature is the model's dominant uncertainty by its authors' own statement, and it also moves the applicability criterion through the sonic radius, so the setting can decide whether the branch competes at all; the spread across the two settings is analysis, not a module output. | +| `residual_mode` | `'off'` | `'off'`, `'luminosity_capped'` | Whether the bolometric candidate competes for the rate past the activation gate. It is computed and reported on every call either way. `'luminosity_capped'` admits it, capped by the interior luminosity, which is the core-powered rate of Gupta & Schlichting (2019) [^gs19] whose persistence Tang et al. (2024) [^tang] dispute. Off by default, following Tang et al.; the price is a jump in the dispatched rate at the activation gate, measured on the [escape regimes](../Explanations/regimes.md) page together with the dispute and the band past the gate where the candidate would win. | | `lambda_crit` | 20.0 | $> 0$ | Boil-off activation threshold on the restricted Jeans parameter (literature band 15 to 35). | | `gamma_bates` | 0.75 | $> 0$ | Shape parameter of the Bates temperature profile of the extended upper structure. | | `kzz` | 300 | m² s⁻¹ | Eddy diffusion coefficient when the profile carries no `kzz` column. | @@ -141,3 +147,31 @@ The knobs of the [escape-regime framework](../Explanations/regimes.md). Every de | `atm_converged` | not applicable | Optional data-quality flag, surfaced as `stale_input`. | | `age`, `reservoirs` | s, kg | Optional; consumed only by the snapshot self-consistency screen and the unfractionated split. | | `dt` | s | Optional; carried for the caller's supply cap, never used by the dispatcher itself. | + +--- + +[^wordsworth2018]: Wordsworth, R. D., Schaefer, L. K., & Fischer, R. A. (2018). Redox evolution via gravitational differentiation on low-mass planets: implications for abiotic oxygen, water loss, and habitability. *The Astronomical Journal, 155*(5), 195. https://doi.org/10.3847/1538-3881/aab608 + +[^prsa]: Prša, A., Harmanec, P., Torres, G., et al. (2016). Nominal Values for Selected Solar and Planetary Quantities: IAU 2015 Resolution B3. *The Astronomical Journal, 152*(2), 41. https://doi.org/10.3847/0004-6256/152/2/41 + +[^weiss]: Weiss, L. M., Dai, F., Huber, D., et al. (2021). The TESS-Keck Survey. II. An Ultra-short-period Rocky Planet and Its Siblings Transiting the Galactic Thick-disk Star TOI-561. *The Astronomical Journal, 161*(2), 56. https://doi.org/10.3847/1538-3881/abd409 + +[^brinkman]: Brinkman, C. L., Weiss, L. M., Dai, F., et al. (2023). TOI-561 b: A Low-density Ultra-short-period "Rocky" Planet around a Metal-poor Star. *The Astronomical Journal, 165*(3), 88. https://doi.org/10.3847/1538-3881/acad83 + +[^lopez2017]: Lopez, E. D. (2017). Born dry in the photoevaporation desert: Kepler's ultra-short-period planets formed water-poor. *Monthly Notices of the Royal Astronomical Society, 472*(1), 245–253. + +[^baumeister]: Baumeister, P., Tosi, N., Brachmann, C., Grenfell, J. L., & Noack, L. (2023). Redox state and interior structure control on the long-term habitability of stagnant-lid planets. *Astronomy & Astrophysics, 675*, A122. https://doi.org/10.1051/0004-6361/202245791 + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 + +[^mc09]: Murray-Clay, R. A., Chiang, E. I., & Murray, N. (2009). Atmospheric Escape From Hot Jupiters. *The Astrophysical Journal, 693*(1), 23–42. https://doi.org/10.1088/0004-637X/693/1/23 + +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 + +[^gs19]: Gupta, A., & Schlichting, H. E. (2019). Sculpting the valley in the radius distribution of small exoplanets as a by-product of planet formation: the core-powered mass-loss mechanism. *Monthly Notices of the Royal Astronomical Society, 487*(1), 24–33. + +[^tang]: Tang, Y., et al. (2024). Assessing Core-powered Mass Loss in the Context of Early Boil-off: Minimal Long-lived Mass Loss for the Sub-Neptune Population. *The Astrophysical Journal, 976*(2), 221. diff --git a/docs/Reference/results.md b/docs/Reference/results.md index 21bcfb61..8057f69f 100644 --- a/docs/Reference/results.md +++ b/docs/Reference/results.md @@ -25,9 +25,9 @@ Every physically posed state returns a result. A `ValueError` means the state or | `boiloff` | Bolometrically driven outflow from an atmosphere too weakly bound to hold itself, which the restricted Jeans parameter tests. The launch level can sit inside or outside the sonic radius; when it is outside, the Mach number is clamped to 1 and `bondi_inflated` says so. | Closed-form transonic Parker wind, Bondi-capped; past the activation gate the same machinery is luminosity-capped and dispatched only when the `residual_mode` setting admits it. | | `hydrodynamic:EL` | A collisional XUV-driven wind whose rate is set by the energy budget. | The smaller of the two hydrodynamic limits, the energy-limited one winning. | | `hydrodynamic:RR` | The same wind, with the recombination-limited rate winning the minimum. | Read `rr_chain['barometric_factor']` to see whether the rate is set by the recombination-limited base ionization (factor near 1) or by the wind failing to reach the sonic point (factor decades below 1). | -| `hydrodynamic:PL` | The same wind in a shallow well, where one particle per intercepted ionizing photon is fewer than the energy budget would lift. | The photon-limited rate of Owen & Alvarez (2016) Eq. (10); binds when the efficiency exceeds `efficiency_photon_limit`. An estimate rather than a bound, and possibly low where it binds (see the limitations page). | +| `hydrodynamic:PL` | The same wind in a shallow well, where one particle per intercepted ionizing photon is fewer than the energy budget would lift. | The photon-limited rate of Owen & Alvarez (2016) [^owenalvarez] Eq. (10); binds when the efficiency exceeds `efficiency_photon_limit`. An estimate rather than a bound, and possibly low where it binds (see the limitations page). | | `hydrostatic` | Too rarefied for a wind; per-species Jeans escape from the exobase, capped by diffusive resupply. | Natively per-species; heavy-element rates are lower limits. | -| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate, and a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, `diagnostics['nozzle']['rate_kg_s']` is below the dispatched rate. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | +| `roche_overflow` | Either the active flow radius reaches the periapsis Hill radius, so the flow is not bound to the planet, or the tidally driven transfer through L1 outruns every bound candidate. | Two readings, separated by `diagnostics['roche']['rate_branch']`. When the geometric screen renamed a bound branch, the rate is that branch's own, a bound-flow estimate, and a lower limit on the tidal transfer only where the nozzle candidate sat outside its applicability criterion; where it was applicable and lost, `diagnostics['nozzle']['rate_kg_s']` is below the dispatched rate. When `rate_branch` reads `roche_overflow`, the rate is the L1 transfer rate of Jackson et al. (2017) [^jackson17] itself, dispatched because it won the final comparison; that boundary is a rate crossing, so the dispatched rate is continuous across it. | A sixth label, `impact`, is reserved for the [giant-impact channel](../Explanations/impacts.md), which the caller invokes directly rather than through the dispatcher. @@ -113,11 +113,11 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an | `roche` | `R_hill_periapsis`, `flow_radius`, `xi_flow`, `xi_ktide`, `k_tide`, `tidal_inflation`, `r_atmosphere`, `rate_branch` | The overflow screen in full: which radius was tested and against what, how far the atmosphere itself reaches, which branch the rate came from, always one of the regime labels (`roche_overflow` itself when the L1 transfer won, and the producing branch when the screen renamed a bound state), and the tidal factor with the factor by which it is raising the rate. A large `tidal_inflation` means the rate is set by the divergence of the factor at the lobe rather than by the heating. | | `nozzle` | `rate_kg_s`, `rate_full_orbit_kg_s`, `rate_periapsis_kg_s`, `rate_apoapsis_kg_s`, `applicable`, `applicable_orbit_fraction`, `saturated_orbit_fraction`, `R_sonic`, `R_L1`, `R_sonic_over_R_L1`, `R_sonic_over_R_L1_apoapsis`, `n_phase`, `temperature_mode`, `r_launch`, `rho_launch`, `T_K`, `mu_kg`, `v_th`, `q`, `A`, `a_periapsis`, `r_lobe`, `phi_L1`, `phi_ph`, `delta_phi`, `exponent_applied`, `area_m2`, `saturated`, `power_lift_W`, `power_lift_full_orbit_W`, `L_int_W`, `L_bol_intercepted_W` | The Jackson et al. (2017) L1 transfer candidate at every call, whether it won or not. `rate_kg_s` is what the dispatcher competes: the orbit average duty-cycled over the arc where the overflow description applies, which is where the isothermal sonic radius reaches the L1 distance. `rate_full_orbit_kg_s` is the same average without that gate, so it stays comparable with the primary's own published rates, and the periapsis and apoapsis rates bracket the orbit. The geometry entries (the lobe radius, both potentials, the applied exponent, the nozzle area, `saturated`) are reported at periapsis, the tightest geometry of the orbit. The flow carries no energy cap, so the lift power against `L_int_W` and `L_bol_intercepted_W` is what shows where the isothermal assumption is strained: `power_lift_W` pairs with the competed rate and `power_lift_full_orbit_W` with the unguarded one. Both are built from the barrier the rate applied plus the acceleration to the sonic speed, which is the heat an isothermal flow demands, so they stay finite and non-trivial at saturation where the barrier is gone and the acceleration is not. | | `johnson_q` | `q_net_over_qc`, `q_net_W`, `q_c_W` | Whether the absorbed power can drive a transonic outflow at all, independently of any rate formula. | -| `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy of Guo (2024). `lambda_rp` is taken at `R_p`, so it differs from `lambda_gate`, which is taken at the launch level, by the ratio of the launch radius to `R_p`. | -| `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) and against the wind-versus-thermosphere thresholds of Salz et al. (2016), 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | +| `guo_triple` | `lambda_exo`, `lambda_rp`, `lambda_star`, `thresholds` | The verdict translated into the Jeans-parameter taxonomy of Guo (2024) [^guo]. `lambda_rp` is taken at `R_p`, so it differs from `lambda_gate`, which is taken at the launch level, by the ratio of the launch radius to `R_p`. | +| `potential_screens` | `log_minus_phi_cgs`, `caldiroli_threshold`, `above_caldiroli`, `salz_screen`, `salz_verdict`, `salz_attribution` | The verdict translated into threshold-potential taxonomies: the specific binding energy in erg g⁻¹ against the efficiency-collapse band of Caldiroli et al. (2022) [^caldiroli] and against the wind-versus-thermosphere thresholds of Salz et al. (2016) [^salz], 13.11 and 13.6. The Salz simulations are hydrogen-dominated, which the reported attribution states, so treat the verdict as out of scope on a heavy secondary atmosphere. | | `erkaev_tc_K` | float | The tidally corrected critical exobase temperature above which the thermosphere blows off. | | `fluid_check` | `levels_checked`, `worst_kn`, `fluid`, `truncated_at_profile_top` | Whether the fluid condition holds everywhere below the sonic surface, not only at it, with the truncation declared. | -| `tang_timescale` | `evaluated`, `t_mdot_s`, `t_cool_s`, `terminated` | The Tang et al. (2024) termination check on the closed-form bolometric wind, the smaller of `mdot_parker` and `mdot_bondi`, before the luminosity cap and whichever rate was dispatched, so its verdict changes neither with `residual_mode` nor with `tidal`. | +| `tang_timescale` | `evaluated`, `t_mdot_s`, `t_cool_s`, `terminated` | The Tang et al. (2024) [^tang] termination check on the closed-form bolometric wind, the smaller of `mdot_parker` and `mdot_bondi`, before the luminosity cap and whichever rate was dispatched, so its verdict changes neither with `residual_mode` nor with `tidal`. | | `self_consistency` | `evaluated`, `t_deplete_s`, `age_s`, `inconsistent` | Whether the dispatched rate would have destroyed the supplied inventory within the supplied age. Reports `evaluated: False` without an age or reservoirs. | | `rate_floor` | `floor_kg_s`, `above_floor` | Whether the dispatched rate has any numerical content, against one proton per Julian year. Reporting only: the module never applies the floor. | | `base_level` | `p_Pa`, `p_physical_Pa`, `r_m`, `T_K`, `clamp_decades` | Where the wind was launched, and the pressure the base method asked for before any clamp. | @@ -131,3 +131,17 @@ Nineteen groups on a typical call. Nothing in the dispatch control flow reads an **A rate floor.** The framework computes what the physics gives it, including rates like $10^{-123}$ kg s⁻¹ from a strongly bound heavy atmosphere. One proton crossing the planet's surface per year, about $5.3 \times 10^{-35}$ kg s⁻¹, is the smallest rate with physical content; below that, report no escape. The convention belongs to the caller, and the module does not apply it, but it does report it: `diagnostics['rate_floor']` carries the number and whether this call cleared it, so a caller need not keep its own copy. Read it before trusting a regime label on a slow state, because a label decided by the ordering of two rates far below the floor is decided by nothing. **A relevance test, separately.** Clearing the floor does not make a rate matter: a hundred decades above it can still be grams per year. Use `diagnostics['self_consistency']`, which divides the supplied inventory by the dispatched rate and compares against the supplied age, as the yardstick for whether a rate is worth carrying. + +--- + +[^owenalvarez]: Owen, J. E., & Alvarez, M. A. (2016). UV Driven Evaporation of Close-in Planets: Energy-limited, Recombination-limited, and Photon-limited Flows. *The Astrophysical Journal, 816*(1), 34. https://doi.org/10.3847/0004-637X/816/1/34 + +[^jackson17]: Jackson, B., Arras, P., Penev, K., Peacock, S., & Marchant, P. (2017). A new model of Roche lobe overflow for short-period gaseous planets and binary stars. *The Astrophysical Journal, 835*(2), 145. https://doi.org/10.3847/1538-4357/835/2/145 + +[^guo]: Guo, J. H. (2024). Characterization of the regimes of hydrodynamic escape from low-mass exoplanets. *Nature Astronomy, 8*, 920. https://doi.org/10.1038/s41550-024-02269-w + +[^caldiroli]: Caldiroli, A., Haardt, F., Gallo, E., Spinelli, R., Malsky, I., & Rauscher, E. (2022). Irradiation-driven escape of primordial planetary atmospheres II. Evaporation efficiency of sub-Neptunes through hot Jupiters. *Astronomy & Astrophysics, 663*, A122. https://doi.org/10.1051/0004-6361/202142763 + +[^salz]: Salz, M., Schneider, P. C., Czesla, S., & Schmitt, J. H. M. M. (2016). Energy-limited escape revised. The transition from strong planetary winds to stable thermospheres. *Astronomy & Astrophysics, 585*, L2. https://doi.org/10.1051/0004-6361/201527042 + +[^tang]: Tang, Y., et al. (2024). Assessing Core-powered Mass Loss in the Context of Early Boil-off: Minimal Long-lived Mass Loss for the Sub-Neptune Population. *The Astrophysical Journal, 976*(2), 221. From 0d6fc3635f7bf13f6656b8b918896d51db513936 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 14:12:05 +0200 Subject: [PATCH 110/113] Reject non-finite closure inputs and non-positive radii The fractionation solver now rejects a NaN or infinite flux, temperature, gravity, mole fraction, or mass before its sign checks, since a NaN passes every comparison and the solver otherwise returned non-finite fluxes. The profile validator rejects radii at or below zero, which strictly increasing radii did not exclude and which every consumer divides by. Tests cover each case and fail when either check is removed. --- src/zephyrus/fractionation.py | 4 ++++ src/zephyrus/profiles.py | 4 ++-- tests/test_fractionation.py | 17 ++++++++++++++--- tests/test_profiles.py | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/zephyrus/fractionation.py b/src/zephyrus/fractionation.py index d1faf29d..1ff9d871 100644 --- a/src/zephyrus/fractionation.py +++ b/src/zephyrus/fractionation.py @@ -46,6 +46,10 @@ def _validate_inputs(phi, X, m, T, g0, b): X, m, b = np.asarray(X, float), np.asarray(m, float), np.asarray(b, float) n = len(X) + if not all(np.isfinite(v) for v in (phi, T, g0)) or not ( + np.all(np.isfinite(X)) and np.all(np.isfinite(m)) + ): + raise ValueError('phi, X, m, T, g0 must be finite') if phi < 0: raise ValueError('phi must be >= 0') if np.any(X < 0) or abs(X.sum() - 1.0) > 1e-6: diff --git a/src/zephyrus/profiles.py b/src/zephyrus/profiles.py index e2611ad4..130bf111 100644 --- a/src/zephyrus/profiles.py +++ b/src/zephyrus/profiles.py @@ -73,8 +73,8 @@ def validate(self) -> None: raise ValueError(f'{name} carries a non-finite value') if not (np.all(np.diff(p) < 0) and np.all(np.diff(r) > 0)): raise ValueError('p must decrease and r increase strictly with index') - if np.any(p <= 0) or np.any(T <= 0) or np.any(mmw <= 0): - raise ValueError('p, T, mmw must be positive') + if np.any(p <= 0) or np.any(r <= 0) or np.any(T <= 0) or np.any(mmw <= 0): + raise ValueError('p, r, T, mmw must be positive') for sp, x in self.vmr.items(): arr = np.asarray(x, dtype=float) if len(arr) != len(p): diff --git a/tests/test_fractionation.py b/tests/test_fractionation.py index ac2daf34..a83bac77 100644 --- a/tests/test_fractionation.py +++ b/tests/test_fractionation.py @@ -47,9 +47,11 @@ def test_input_validation_error_contract(): """Malformed solver inputs raise; a valid call on the same path returns. - Negative flux, mole fractions off unit sum, non-positive masses, and an - asymmetric coefficient matrix are not physically posed inputs and must - raise ``ValueError`` rather than return a partial solution. + Negative flux, mole fractions off unit sum, non-positive masses, an + asymmetric coefficient matrix, and non-finite scalars or arrays are not + physically posed inputs and must raise ``ValueError`` rather than return + a partial solution; a NaN passes every sign comparison, so finiteness is + checked first. """ m = np.array([1.0, 16.0]) * AMU_G X = np.array([0.8, 0.2]) @@ -63,6 +65,15 @@ def test_input_validation_error_contract(): b_asym = np.array([[np.inf, 1e19], [2e19, np.inf]]) with pytest.raises(ValueError, match='symmetric'): solve_closure(1e-10, X, m, 400.0, 980.0, b_asym) + for args in ( + (np.nan, X, m, 400.0, 980.0), + (1e-10, np.array([0.8, np.nan]), m, 400.0, 980.0), + (1e-10, X, np.array([1.0, np.inf]) * AMU_G, 400.0, 980.0), + (1e-10, X, m, np.nan, 980.0), + (1e-10, X, m, 400.0, np.inf), + ): + with pytest.raises(ValueError, match='finite'): + solve_closure(*args, b) flux = solve_closure(1e-10, X, m, 400.0, 980.0, b) assert np.all(flux >= 0.0) diff --git a/tests/test_profiles.py b/tests/test_profiles.py index a42eb7d2..dc9d8379 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -371,6 +371,8 @@ def test_validate_rejects_non_finite_and_negative_entries(): NaN through; every array is checked for finiteness before its sign. Mixing ratios slightly below zero are chemistry-solver noise where a species is absent and pass; a genuinely negative mole fraction raises. + A radius at or below zero raises even when the radii increase, since + every consumer divides by r or r squared. """ n = 5 base = dict( @@ -388,6 +390,7 @@ def test_validate_rejects_non_finite_and_negative_entries(): ('mmw', np.array([7.3e-26] * 2 + [np.nan] + [7.3e-26] * 2), 'mmw carries a non-finite'), ('p', np.array([1e7, 1e3, np.nan, 1e-1, 1e-5]), 'p carries a non-finite'), ('r', np.array([6.4e6, 6.8e6, np.inf, 7.6e6, 8.0e6]), 'r carries a non-finite'), + ('r', np.array([-1.0e6, 0.0, 1.0e6, 2.0e6, 3.0e6]), 'p, r, T, mmw must be positive'), ): with pytest.raises(ValueError, match=match): Profile(**{**base, field: bad}).validate() From 2a8187a415f673816e2730c78f906ef49ca550cf Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 14:12:05 +0200 Subject: [PATCH 111/113] Correct four documentation statements The energy-limited page says the efficiency range is enforced by the dispatcher's settings and not by EL_escape, which evaluates any efficiency it is given. The Jupiter radius is described as the IAU 2015 nominal value and the mass as an adopted value, in the source, its test, and the parameter reference, and a test comment no longer calls the Mars mass nominal. The regimes page states the two places the rate floor enters the module, the nozzle guard and the hydrostatic supply shortcut, and that neither applies it to the dispatched rate. A section duplicated in the testing guide is removed. --- docs/Explanations/energy_limited.md | 2 +- docs/Explanations/regimes.md | 2 +- docs/How-to/run_tests.md | 6 ------ docs/Reference/parameters.md | 2 +- src/zephyrus/planets_parameters.py | 2 +- tests/test_hydrostatic.py | 2 +- tests/test_planets_parameters.py | 5 +++-- 7 files changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/Explanations/energy_limited.md b/docs/Explanations/energy_limited.md index a44d3d6d..87d5612c 100644 --- a/docs/Explanations/energy_limited.md +++ b/docs/Explanations/energy_limited.md @@ -6,7 +6,7 @@ The physical idea is an energy budget. The stellar X-ray and extreme-ultraviolet $$\dot{M}_\mathrm{EL} = \frac{\epsilon\,\pi\,R^3\,F_\mathrm{XUV}}{G\,M_\mathrm{p}\,K_\mathrm{tide}} \tag{1}$$ -where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3, and ZEPHYRUS accepts any $\epsilon \in (0, 1]$; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The threshold is on the untidal specific binding energy, which is the convention the screen in the diagnostics uses and the one Salz et al. (2016) [^salz] share; the tidal factor enters the rate, not the potential the threshold is quoted against. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. +where $\epsilon$ is the escape efficiency (the fraction of intercepted XUV power converted into work against gravity), $R^3$ is the radius term selected below, $F_\mathrm{XUV}$ is the XUV flux received at the planet's orbit (supplied by [MORS](https://proteus-framework.org/MORS) in coupled runs), $G$ is the gravitational constant, $M_\mathrm{p}$ is the planetary mass, and $K_\mathrm{tide}$ is the tidal correction of Eq. (2). Canonical efficiencies for rocky planets lie between 0.1 and 0.3; the dispatcher's settings accept any $\epsilon \in (0, 1]$ and reject values outside it, while `EL_escape` evaluates the formula for whatever efficiency it is given; hydrodynamic simulations find that for strongly bound planets the effective efficiency collapses far below the canonical band, reaching of order $10^{-2}$ above a threshold gravitational potential near $\log_{10}(G M_\mathrm{p} / R_\mathrm{p}) \approx 12.9$ to $13.2$ in cgs units [^caldiroli]. The threshold is on the untidal specific binding energy, which is the convention the screen in the diagnostics uses and the one Salz et al. (2016) [^salz] share; the tidal factor enters the rate, not the potential the threshold is quoted against. The regime framework offers that fitted efficiency as an option; the entry point itself treats $\epsilon$ as an input. Two radii enter the problem, and keeping them apart matters. $R_\mathrm{p}$ is the planetary (interior) radius. $R_\mathrm{XUV}$ is the radius at which the atmosphere becomes optically thick to XUV photons; in PROTEUS it is recomputed at each time step from the atmospheric structure at a configured reference pressure, by default 20 mbar following the photosphere-type level of Baumeister et al. (2023) [^baumeister]. That level is a bookkeeping radius for the intercepting area: the XUV heating is actually deposited, and the wind launched, at the far lower pressure (of order a nanobar) where the gas first reaches unit optical depth to ionizing photons [^lopez2017]; the [escape-regime framework](regimes.md) locates that launching level on the profile when it needs it. diff --git a/docs/Explanations/regimes.md b/docs/Explanations/regimes.md index b68c2b6a..42d3a0ee 100644 --- a/docs/Explanations/regimes.md +++ b/docs/Explanations/regimes.md @@ -287,7 +287,7 @@ $$\dot{M} \;=\; \max\left(\dot{M}_\mathrm{branch},\ \chi_\mathrm{res}\, \dot{M}_ where $\chi_\mathrm{res} = 1$ only past the gate under `residual_mode = 'luminosity_capped'`, and $\chi_\mathrm{L1} = 1$ only where Eq. (35) holds on some part of the orbit and the averaged transfer rate exceeds the one-proton-per-Julian-year floor $\dot{M}_\mathrm{floor} = m_\mathrm{p} / (1\ \mathrm{yr})$; each is 0 otherwise. Taking the maximum makes each comparison a rate crossing: the dispatched rate is continuous where one candidate overtakes another, and the label follows the candidate that carries the rate. A residual win takes the label `boiloff` with the flag `bolometric_residual`; a nozzle win takes `roche_overflow` with the transfer rate itself. -The floor guard on the nozzle exists because a crossing between two numerically empty numbers would rename the deeply bound corner on no content. It is loose: the constant marks what is distinguishable from zero in floating point, so the label remains reachable at rates far below anything that could matter over a planet's lifetime. `diagnostics['rate_floor']` reports the floor and whether the dispatched rate cleared it, and the depletion screen beside it is how a consumer tells whether a rate matters; the floor is never applied to a dispatched rate. The applicability edge of Eq. (35) is a criterion boundary like the activation gate, and the jump across it is a result to measure rather than an artifact to hide. +The floor guard on the nozzle exists because a crossing between two numerically empty numbers would rename the deeply bound corner on no content. The floor enters the module in exactly two places and is never applied to the dispatched rate. One is this guard, whose effect is confined to rates below the floor: an applicable nozzle rate that exceeds the bound branch's rate but not the floor leaves the verdict with a bound branch whose rate is smaller still. The other is a shortcut in the hydrostatic branch: a species whose supply-free Jeans rate is already below the floor skips its diffusion-supply integral and returns that Jeans rate, an upper bound on the harmonic mean of Eq. (28), marked `pruned` in the per-species detail. It is loose: the constant marks what is distinguishable from zero in floating point, so the label remains reachable at rates far below anything that could matter over a planet's lifetime. `diagnostics['rate_floor']` reports the floor and whether the dispatched rate cleared it, and the depletion screen beside it is how a consumer tells whether a rate matters; the floor is never applied to a dispatched rate. The applicability edge of Eq. (35) is a criterion boundary like the activation gate, and the jump across it is a result to measure rather than an artifact to hide. The switches summarize as follows. `photon_limit` and `recombination_limit` remove a term from the minimum of Eq. (18) and nothing else; `residual_mode` sets $\chi_\mathrm{res}$ in Eq. (38) and never changes $\dot{M}_\mathrm{bol}$ itself; `nozzle_temperature` chooses the launch level of Eqs. (31) to (34); `tidal = False` sets $K = 1$ in Eqs. (7), (11), and (17). diff --git a/docs/How-to/run_tests.md b/docs/How-to/run_tests.md index 9ddba283..95a1ee15 100644 --- a/docs/How-to/run_tests.md +++ b/docs/How-to/run_tests.md @@ -203,12 +203,6 @@ Nightly (`.github/workflows/nightly.yml`) runs the full suite, uploads coverage The repository-wide rules that every PROTEUS-ecosystem submodule follows are at [proteus-framework.org/PROTEUS/Explanations/ecosystem_testing_standard/](https://proteus-framework.org/PROTEUS/Explanations/ecosystem_testing_standard/). -### What the gate measures, and what it does not - -The coverage source is the package, `source = ["zephyrus"]`, so `examples/` sits outside both gates. That is the ecosystem convention rather than an omission: PROTEUS and every sibling submodule set the source to their own package, and PROTEUS's own `examples/` holds configuration files with no Python in them at all. Adding the worked example here would move the reported number by more than ten points while measuring a script rather than the library. - -The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes, character for character. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. - --- [^erkaev]: Erkaev, N. V., Kulikov, Y. N., Lammer, H., et al. (2007). Roche lobe effects on the atmospheric loss from "Hot Jupiters". *Astronomy & Astrophysics, 472*(1), 329–334. https://doi.org/10.1051/0004-6361:20066929 diff --git a/docs/Reference/parameters.md b/docs/Reference/parameters.md index 8f50b93d..3dfa4d8f 100644 --- a/docs/Reference/parameters.md +++ b/docs/Reference/parameters.md @@ -61,7 +61,7 @@ This is a reference page for all parameters and constants used in ZEPHYRUS. For ### Jupiter -From the IAU 2015 nominal values (Prša et al. 2016 [^prsa]). +The radius is the IAU 2015 nominal equatorial radius (Prša et al. 2016 [^prsa]); the mass is an adopted value, not a nominal constant. | Name | Symbol | Value | Units | |---|---|---|---| diff --git a/src/zephyrus/planets_parameters.py b/src/zephyrus/planets_parameters.py index 8b60e7b2..77af31db 100644 --- a/src/zephyrus/planets_parameters.py +++ b/src/zephyrus/planets_parameters.py @@ -23,7 +23,7 @@ e_earth = 0.017 # Earth eccentricity [dimensionless] a_earth = 1 # Earth semi-major axis [au] -# Jupiter parameters (IAU 2015 nominal values, Resolution B3) +# Jupiter: radius is the IAU 2015 Resolution B3 nominal value; the mass is an adopted value Rjup = 7.1492e7 # Jupiter equatorial radius [m] Mjup = 1.8982e27 # Jupiter mass [kg] diff --git a/tests/test_hydrostatic.py b/tests/test_hydrostatic.py index 1ea478d5..6233738c 100644 --- a/tests/test_hydrostatic.py +++ b/tests/test_hydrostatic.py @@ -39,7 +39,7 @@ pytestmark = [pytest.mark.unit, pytest.mark.timeout(30)] -M_MARS = 6.4171e23 # kg (IAU nominal) +M_MARS = 6.4171e23 # kg, adopted value R_MARS = 3.3895e6 # m diff --git a/tests/test_planets_parameters.py b/tests/test_planets_parameters.py index 6ac6a12a..af6b13ff 100644 --- a/tests/test_planets_parameters.py +++ b/tests/test_planets_parameters.py @@ -118,9 +118,10 @@ def test_toi561b_planet_scaled_from_earth_values(): def test_jupiter_nominal_values_recover_gas_giant_density(): - """Jupiter mass and radius are the IAU nominal values with a giant density. + """Jupiter's mass and radius give a gas-giant density. - ``Mjup`` and ``Rjup`` are the IAU 2015 Resolution B3 nominal values. The + ``Rjup`` is the IAU 2015 Resolution B3 nominal equatorial radius and + ``Mjup`` an adopted mass. The mean density they imply, about ``1.24 g cm-3``, is the discrimination guard: a cm-vs-m slip in the radius moves it by six decades, and swapping in the Earth values moves it above ``5 g cm-3``. The mass ratio to Earth From 8a450081edd24d85db597842ba7fd34bf8d2a8e5 Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 14:16:02 +0200 Subject: [PATCH 112/113] Compare tutorial floats to rounding, not to the last digit The tutorial tests compared each quoted output with what the snippet printed character for character, which failed on macOS where one per-species rate differed from Linux in its sixteenth significant digit. The comparison now requires the text between numbers to match exactly and each float to agree to a relative 1e-12, far above a last-place difference and far below any change a coefficient makes; a test holds the helper to accepting the macOS digits and rejecting a 1e-9 change, a changed label, and a dropped number. --- docs/How-to/run_tests.md | 2 +- tests/test_examples.py | 37 +++++++++++++++++++++++++++++++++--- tests/test_tutorial_track.py | 4 ++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/docs/How-to/run_tests.md b/docs/How-to/run_tests.md index 95a1ee15..cde95f06 100644 --- a/docs/How-to/run_tests.md +++ b/docs/How-to/run_tests.md @@ -184,7 +184,7 @@ Both gates sit at the 90 % ceiling. The `tools/update_coverage_threshold.py` hel The coverage source is the package, `source = ["zephyrus"]`, so `examples/` sits outside both gates. That is the ecosystem convention rather than an omission: PROTEUS and every sibling submodule set the source to their own package, and PROTEUS's own `examples/` holds configuration files with no Python in them at all. Adding the worked example here would move the reported number by more than ten points while measuring a script rather than the library. -The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes, character for character. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. +The example is held to account a different way. `tests/test_examples.py` drives its functions for their behaviour, and one test in it runs every Python snippet in the dispatcher tutorial in order and compares what the snippet prints against what the page quotes: the text exactly, and every float to a relative 1e-12, which absorbs last-place differences between platforms' floating-point libraries and nothing a physics change could produce. That is what holds the documentation's claim that every printed number is the verbatim output of a snippet a reader can run: a coefficient change three modules away moves a number on that page, and without the test nothing notices. ## PR validation pipeline diff --git a/tests/test_examples.py b/tests/test_examples.py index 2ff5a4b0..937549c6 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -243,14 +243,45 @@ def _tutorial_blocks(skip_data_dependent=True): yield index, code, expected +_FLOAT = re.compile(r'-?\d+\.\d+(?:[eE][-+]?\d+)?|-?\d+[eE][-+]?\d+') + + +def _same_output(printed, quoted, rel=1e-12): + """Whether printed output matches the quoted text up to float rounding. + + Text between numbers must match exactly; each float may differ by + ``rel``, far above the last-place differences between platforms' + floating-point libraries and far below any change a coefficient makes. + """ + if _FLOAT.sub('#', printed) != _FLOAT.sub('#', quoted): + return False + pairs = zip(_FLOAT.findall(printed), _FLOAT.findall(quoted), strict=True) + return all(math.isclose(float(a), float(b), rel_tol=rel, abs_tol=0.0) for a, b in pairs) + + +def test_output_comparison_allows_only_float_rounding(): + """The tutorial comparison accepts a last-place difference and nothing more. + + A one-unit change in the sixteenth significant digit (the macOS and Linux + difference that motivated it) passes; a relative change of 1e-9, a changed + label, and a dropped number each fail. + """ + page = "hydrodynamic:EL 660971.2983440236 {'C': 1.5e-3}" + assert _same_output("hydrodynamic:EL 660971.2983440235 {'C': 1.5e-3}", page) + assert not _same_output("hydrodynamic:EL 660971.2989 {'C': 1.5e-3}", page) + assert not _same_output("hydrodynamic:RR 660971.2983440236 {'C': 1.5e-3}", page) + assert not _same_output("hydrodynamic:EL 660971.2983440236 {'C': }", page) + + def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): """Every tutorial snippet runs in order and prints its quoted output. The page states that every printed number is the verbatim output of a runnable snippet. The snippets share one namespace and run in page order, and each quoted output block must match what the preceding snippet - printed, character for character, so a coefficient change anywhere in - the package that moves a quoted number fails here. + printed: text exactly, floats to a relative 1e-12, so a coefficient change + anywhere in the package that moves a quoted number fails here while a + last-place difference between platforms does not. """ # The first snippet imports the example by its repository-root path, # which needs the root on sys.path; `python -m pytest` adds it and the @@ -267,7 +298,7 @@ def test_tutorial_snippets_print_what_the_page_quotes(monkeypatch): printed = buffer.getvalue().rstrip('\n') if quoted is None: continue - assert printed == quoted, ( + assert _same_output(printed, quoted), ( f'tutorial block {index} prints something other than the page quotes:\n' f'--- page ---\n{quoted}\n--- code ---\n{printed}' ) diff --git a/tests/test_tutorial_track.py b/tests/test_tutorial_track.py index 3fff3951..3af3be33 100644 --- a/tests/test_tutorial_track.py +++ b/tests/test_tutorial_track.py @@ -25,7 +25,7 @@ # The tests directory is not a package, so pytest puts it on the path and # a sibling module imports by its bare name. -from test_examples import TUTORIAL_DATA_DEPENDENT, _tutorial_blocks +from test_examples import TUTORIAL_DATA_DEPENDENT, _same_output, _tutorial_blocks pytestmark = [pytest.mark.integration, pytest.mark.timeout(300)] @@ -48,7 +48,7 @@ def test_tutorial_stellar_track_prints_what_the_page_quotes(monkeypatch): if quoted is None or TUTORIAL_DATA_DEPENDENT not in code: continue printed = buffer.getvalue().rstrip('\n') - assert printed == quoted, ( + assert _same_output(printed, quoted), ( f'tutorial block {index} prints something other than the page quotes:\n' f'--- page ---\n{quoted}\n--- code ---\n{printed}' ) From de8f783464f40b42731500800e666d3c03a1d04e Mon Sep 17 00:00:00 2001 From: maraattia Date: Wed, 30 Sep 2026 14:23:52 +0200 Subject: [PATCH 113/113] Run code scanning again on the tutorial test fix The Python code-scanning job on the previous commit completed its analysis but failed while uploading the results, which leaves the pull request without a Python analysis; the default setup cannot be re-run, so this commit, which changes no file, starts it again.

    O`XqlZ7_YVQ>gEP2LIx?YW@W$^`__ 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