Version: dev

WetScavengingLimitations

Combined air refreshing and cloud ice uptake limitations on wet scavenging from Luo & Yu (2023). This component unifies the two novel parameterizations of the paper into a single algebraic system: (1) the air refreshing limitation (Section 2.1, Eqs. 2/5/10/11), which reduces the wet-scavenging removal rate R_A when subgrid cloud-free (rain-free) air mixes into cloudy (rainy) air slower than the model time step; and (2) the cloud ice uptake limitation (Section 2.2, Eqs. 12-15), which limits the cold-cloud rainout efficiency F_I by the rate R_U at which water-soluble aerosols are captured by ice crystals -- the HNO3 ice uptake rate of Jacob (2000), with the temperature-dependent uptake efficiency gamma of Hudson et al. (2002). Migrated from AtmosphericDeposition.jl@e4468c79 src/luo2023.jl:326 (`WetScavengingLimitations` @component). The upstream component is a flat MTK System that inlines the equations of both AirRefreshingLimitation and CloudIceUptakeLimitation -- it does not `couple` them -- so this migration is the union of air_refreshing.esm (esm-1i3m) and cloud_ice_uptake.esm (esm-3hh9): 13 input parameters, 9 module constants, and 7 algebraic state variables (Kᵢ, τ_A, R_A, gamma, R_U, R_AU, F_I) fixed by 7 explicit equations. Observed-only: every equation is algebraic, so the 7 outputs are the algebraic solution while the ice/turbulence/grid/temperature inputs and module constants are parameters.

.esm schema
1.0.0
Source
components/atmospheric_deposition/luo2023/wet_scavenging.esm

Description

Combined air refreshing and cloud ice uptake limitations on wet scavenging from Luo & Yu (2023). This component unifies the two novel parameterizations of the paper into a single algebraic system: (1) the air refreshing limitation (Section 2.1, Eqs. 2/5/10/11), which reduces the wet-scavenging removal rate R_A when subgrid cloud-free (rain-free) air mixes into cloudy (rainy) air slower than the model time step; and (2) the cloud ice uptake limitation (Section 2.2, Eqs. 12-15), which limits the cold-cloud rainout efficiency F_I by the rate R_U at which water-soluble aerosols are captured by ice crystals – the HNO3 ice uptake rate of Jacob (2000), with the temperature-dependent uptake efficiency gamma of Hudson et al. (2002). Migrated from AtmosphericDeposition.jl@e4468c79 src/luo2023.jl:326 (WetScavengingLimitations @component). The upstream component is a flat MTK System that inlines the equations of both AirRefreshingLimitation and CloudIceUptakeLimitation – it does not couple them – so this migration is the union of air_refreshing.esm (esm-1i3m) and cloud_ice_uptake.esm (esm-3hh9): 13 input parameters, 9 module constants, and 7 algebraic state variables (Kᵢ, τ_A, R_A, gamma, R_U, R_AU, F_I) fixed by 7 explicit equations. Observed-only: every equation is algebraic, so the 7 outputs are the algebraic solution while the ice/turbulence/grid/temperature inputs and module constants are parameters.

Reference

_source_ref: AtmosphericDeposition.jl@e4468c79c8dd4aae88646cd16d6bcf290874742c:src/luo2023.jl:326 Upstream WetScavengingLimitations is an MTK @component that returns a flat System(eqs, t; name) – it inlines the equations of both AirRefreshingLimitation (luo2023.jl:210) and CloudIceUptakeLimitation (luo2023.jl:260) directly rather than composing them as subsystems. It does NOT call couple/compose; the coupling.couple entry in the migration-tracker features column for this row does not reflect the source (the source defines a single flat system, and the only couple calls in AtmosphericDeposition.jl are in connector_test.jl on unrelated SuperFast/DryDeposition/WetDeposition components). This migration therefore reproduces the flat system: it is the union of the sibling air_refreshing.esm (esm-1i3m) and cloud_ice_uptake.esm (esm-3hh9) migrations – 13 input @parameters (f, Rᵢ, TKE, Δx, Δy, Δz, Δt, N_I, S_I, r_ice, D_g, M, T), 9 module-level @constants, and 7 output @variables (Kᵢ, τ_A, R_A, γ, R_U, R_AU, F_I) related by 7 algebraic equations.

The 7 equations inline the upstream module-level helper functions verbatim, in the upstream source order, which is already a valid topological order (Kᵢ before τ_A; τ_A before R_A; γ before R_U; R_U and Kᵢ before R_AU; R_AU before F_I):

  • Kᵢ ~ sqrt(2/3*TKE) * (1/(sqrt(f)*Δx) + 1/(sqrt(f)Δy) + 1/Δz) (Eq. 11, cloudy_air_refreshing_rate, with the Eq. 10 turbulence velocity sqrt(2/3TKE) inlined)
  • τ_A ~ (1 - f)/(f*Kᵢ) (Eq. 5, grid_refreshing_time)
  • R_A ~ 1/(1/(f*Rᵢ) + τ_A) (Eq. 2, air_refreshing_limited_rate)
  • γ ~ γ_base + γ_delta*max(zero_dimless, min(one_dimless, (T_upper_luo - T)/(T_upper_luo - T_lower_luo))) (Eq. 15, hno3_uptake_efficiency; Hudson et al. 2002)
  • R_U ~ N_IS_I / (r_ice/D_g + kinetic_prefactor_sisqrt(M/M_ref)/(γ*sqrt(T/T_ref))) (Eq. 14, cloud_ice_uptake_rate; Jacob 2000)
  • R_AU ~ fR_UKᵢ / (Kᵢ + (1-f)*R_U) (Eq. 13, air_refreshing_limited_ice_uptake_rate)
  • F_I ~ 1 - exp(-R_AU*Δt) (Eq. 12, cold_cloud_rainout_efficiency) The rational 2/3 inside the turbulence-velocity square root is kept exact as a division of integer literals, mirroring the upstream 2 // 3; all other integer literals (the 1s in the reciprocals and the 1 - f / 1 - exp terms) likewise mirror the upstream Int literals.

The 9 upstream module-level @constants (T_upper_luo, T_lower_luo, γ_base, γ_delta, zero_dimless, one_dimless, kinetic_prefactor_si, M_ref, T_ref) are migrated as fixed-default type: parameter entries holding their evaluated numeric values, per the rig convention for translating MTK @constants (matches the sibling cloud_ice_uptake.esm migration). zero_dimless = 0.0 and one_dimless = 1.0 are the dimensionless 0/1 the Eq. 15 max/min clamp uses; they are kept as parameters rather than inlined as literals so the equation tree mirrors the upstream hno3_uptake_efficiency helper exactly. M_ref = 1.0 kg/mol and T_ref = 1.0 K non-dimensionalize M and T before the square roots (the upstream device for avoiding fractional unit powers); since both equal 1.0 they leave the numeric result unchanged but the structure is preserved.

The 13 input @parameters carry no defaults upstream (they are driven by a parent system); standalone defaults are assigned here for a representative cold-cloud GEOS-Chem-grid scenario, identical to the cloud_ice_uptake.esm sibling for every shared parameter (f=0.25, TKE=1.5 m^2/s^2, Δx=Δy=200 km, Δz=1 km, Δt=600 s, N_I=1e6 m^-3, S_I=1e-8 m^2, r_ice=1e-4 m, D_g=1e-5 m^2/s, M=0.063 kg/mol HNO3, T=210 K) plus Rᵢ=0.001 s^-1 from the air_refreshing.esm sibling. Because the combined defaults coincide with the cloud_ice_uptake.esm defaults on every cloud-ice parameter, and no cloud-ice output depends on Rᵢ, the cloud-ice test anchors (γ/R_U/Kᵢ/R_AU/F_I) carry over from cloud_ice_uptake.esm unchanged; the air-refreshing tests each pin all six air-refreshing parameters (f, Rᵢ, TKE, Δx, Δy, Δz) explicitly, so the Kᵢ/τ_A/R_A anchors carry over from air_refreshing.esm unchanged.

system_kind is left unset (zero differential states – no D operator), consistent with the observed-only siblings air_refreshing.esm / cloud_ice_uptake.esm.

Tolerance rationale (model-level rel=1e-9, abs=1e-12): observed-only algebraic system (no ODE integration). The 7 equations form a triangular chain of +, -, *, /, sqrt, exp, max, min on float64, evaluated by topological substitution; round-off is ~1e-15 per op, so rel=1e-9 leaves comfortable headroom across the value range (γ ~ 3e-3 to 7e-3, rates ~ 1e-9 to 1e1 s^-1). abs=1e-12 gates the rainout_weak_uptake F_I ~ 1.2e-7 floor case, where a pure relative tolerance would be sub-ULP._

Parameters

NameUnitsDefaultDescription
f10.25Cloud or rainfall fraction (dimensionless)
Rᵢs^-10.001In-cloud or under-rain removing rate
TKEm^2/s^21.5Turbulence kinetic energy
Δxm200000.0Grid spacing in x direction
Δym200000.0Grid spacing in y direction
Δzm1000.0Grid spacing in z direction
Δts600.0Time step
N_Im^-31000000.0Ice crystal number concentration
S_Im^21e-08Ice crystal surface area
r_icem0.0001Ice crystal radius
D_gm^2/s1e-05Gas-phase diffusion coefficient
Mkg/mol0.063Molar mass (default: HNO3, 0.063 kg/mol)
TK210.0Temperature
T_upper_luoK220.0Upper temperature threshold for gamma (Eq. 15)
T_lower_luoK209.0Lower temperature threshold for gamma (Eq. 15)
γ_base10.003Base uptake efficiency (Eq. 15) (dimensionless)
γ_delta10.004Temperature-dependent uptake coefficient (Eq. 15) (dimensionless)
zero_dimless10.0Zero (dimensionless) – lower clamp of the Eq. 15 max/min
one_dimless11.0One (dimensionless) – upper clamp of the Eq. 15 max/min
kinetic_prefactor_sis/m0.86933051443Kinetic theory prefactor 4sqrt(pi/(8R)) for ice uptake in SI (Eq. 14), R = 8.314 J/(molK)
M_refkg/mol1.0Reference molar mass for non-dimensionalization of the square root
T_refK1.0Reference temperature for non-dimensionalization of the square root

Observed

NameUnitsDefaultDescription
Kᵢs^-1Cloudy/rainy air refreshing rate (Eq. 11)
τ_AsGrid refreshing time (Eq. 5)
R_As^-1Air refreshing limited removal rate (Eq. 2)
γ1Uptake efficiency of HNO3 on ice (Eq. 15) (dimensionless)
R_Us^-1Cloud ice uptake rate (Eq. 14)
R_AUs^-1Air refreshing limited cloud ice uptake rate (Eq. 13)
F_I1Cold cloud rainout efficiency (Eq. 12) (dimensionless)

Observed expressions

$$ Kᵢ = \sqrt{\frac{2}{3} \cdot TKE} \cdot \left(\frac{1}{\sqrt{f} \cdot Δx} + \frac{1}{\sqrt{f} \cdot Δy} + \frac{1}{Δz}\right) $$

Cloudy/rainy air refreshing rate (Eq. 11)

$$ τ_{A} = \frac{1 - f}{f \cdot Kᵢ} $$

Grid refreshing time (Eq. 5)

$$ R_{A} = \frac{1}{\frac{1}{f \cdot Rᵢ} + τ_{A}} $$

Air refreshing limited removal rate (Eq. 2)

$$ γ = γ_{base} + γ_{delta} \cdot \mathrm{max}\left(zero_{dimless}, \mathrm{min}\left(one_{dimless}, \frac{T_{upper\,luo} - T}{T_{upper\,luo} - T_{lower\,luo}}\right)\right) $$

Uptake efficiency of HNO3 on ice (Eq. 15) (dimensionless)

$$ R_{U} = \frac{N_{I} \cdot S_{I}}{\frac{r_{ice}}{D_{g}} + \frac{kinetic_{prefactor\,si} \cdot \sqrt{\frac{M}{M_{ref}}}}{γ \cdot \sqrt{\frac{T}{T_{ref}}}}} $$

Cloud ice uptake rate (Eq. 14)

$$ R_{AU} = \frac{f \cdot R_{U} \cdot Kᵢ}{Kᵢ + \left(1 - f\right) \cdot R_{U}} $$

Air refreshing limited cloud ice uptake rate (Eq. 13)

$$ F_{I} = 1 - e^{-R_{AU} \cdot Δt} $$

Cold cloud rainout efficiency (Eq. 12) (dimensionless)

Analyses

air_refreshing_rate_vs_turbulence

Air refreshing limited removal rate R_A as a function of turbulence kinetic energy on the GEOS-Chem-like 200 km / 1 km grid at the component defaults (f = 0.25, Rᵢ = 1e-3 s^-1). As TKE grows the subgrid air mixing strengthens and R_A rises toward the standard well-mixed rate f*Rᵢ; as TKE shrinks the air refreshing limitation suppresses R_A.

Time span: 0.0 → 1.0

Swept over: TKE

Air refreshing limited removal rate R_A as a function of turbulence kinetic energy (log-spaced).

rainout_efficiency_vs_turbulence

Cold-cloud rainout efficiency F_I as a function of turbulence kinetic energy TKE (log-spaced sweep over four decades) at the default cold-cloud scenario. Illustrates the air-refreshing limitation central to Luo & Yu (2023): weak turbulence throttles the cloudy-air refreshing rate Kᵢ and suppresses F_I, while strong turbulence relaxes the Eq. 13 limit and raises F_I.

Time span: 0.0 → 1.0

Swept over: TKE

Cold cloud rainout efficiency F_I as a function of turbulence kinetic energy (log-spaced).

uptake_efficiency_vs_temperature

HNO3-on-ice uptake efficiency γ as a function of temperature (Eq. 15, Hudson et al. 2002). Reproduces the HNO3 Uptake Efficiency on Ice figure of the AtmosphericDeposition.jl luo2023 documentation: γ is flat at 0.003 for T >= 220 K, ramps linearly up to 0.007 across 220-209 K, and is flat at 0.007 for T <= 209 K.

Time span: 0.0 → 1.0

Swept over: T

Uptake efficiency γ as a function of temperature T (Eq. 15).

rainout_efficiency_vs_timestep

Cold-cloud rainout efficiency F_I as a function of the model time step Δt (Eq. 12). Reproduces the Cold Cloud Rainout Efficiency figure of the luo2023 documentation: F_I = 1 - exp(-R_AU*Δt) rises monotonically from near zero toward saturation as the time step lengthens, at the default cold-cloud R_AU.

Time span: 0.0 → 1.0

Swept over: Δt

Cold cloud rainout efficiency F_I as a function of time step Δt (Eq. 12).

rainout_over_temperature_and_turbulence

Two-dimensional sweep of the cold-cloud rainout efficiency F_I over temperature T (200-240 K, spanning the cold γ plateau, the linear ramp, and the warm plateau) and turbulence kinetic energy TKE (log-spaced, weak to strong mixing). Surfaces the joint control of the temperature-dependent ice uptake efficiency and the turbulence-driven air refreshing rate on cold-cloud scavenging.

Time span: 0.0 → 1.0

Swept over: T, TKE

Cold cloud rainout efficiency F_I as a function of temperature T and turbulence kinetic energy TKE.

Raw .esm

Raw .esm JSON (this component)
{
  "reference": {
    "notes": "source_ref: AtmosphericDeposition.jl@e4468c79c8dd4aae88646cd16d6bcf290874742c:src/luo2023.jl:326\nUpstream `WetScavengingLimitations` is an MTK `@component` that returns a flat `System(eqs, t; name)` -- it inlines the equations of both `AirRefreshingLimitation` (luo2023.jl:210) and `CloudIceUptakeLimitation` (luo2023.jl:260) directly rather than composing them as subsystems. It does NOT call `couple`/`compose`; the `coupling.couple` entry in the migration-tracker `features` column for this row does not reflect the source (the source defines a single flat system, and the only `couple` calls in AtmosphericDeposition.jl are in connector_test.jl on unrelated SuperFast/DryDeposition/WetDeposition components). This migration therefore reproduces the flat system: it is the union of the sibling air_refreshing.esm (esm-1i3m) and cloud_ice_uptake.esm (esm-3hh9) migrations -- 13 input `@parameters` (f, Rᵢ, TKE, Δx, Δy, Δz, Δt, N_I, S_I, r_ice, D_g, M, T), 9 module-level `@constants`, and 7 output `@variables` (Kᵢ, τ_A, R_A, γ, R_U, R_AU, F_I) related by 7 algebraic equations.\n\nThe 7 equations inline the upstream module-level helper functions verbatim, in the upstream source order, which is already a valid topological order (Kᵢ before τ_A; τ_A before R_A; γ before R_U; R_U and Kᵢ before R_AU; R_AU before F_I):\n  - Kᵢ ~ sqrt(2/3*TKE) * (1/(sqrt(f)*Δx) + 1/(sqrt(f)*Δy) + 1/Δz)                              (Eq. 11, cloudy_air_refreshing_rate, with the Eq. 10 turbulence velocity sqrt(2/3*TKE) inlined)\n  - τ_A ~ (1 - f)/(f*Kᵢ)                                                                        (Eq. 5, grid_refreshing_time)\n  - R_A ~ 1/(1/(f*Rᵢ) + τ_A)                                                                    (Eq. 2, air_refreshing_limited_rate)\n  - γ ~ γ_base + γ_delta*max(zero_dimless, min(one_dimless, (T_upper_luo - T)/(T_upper_luo - T_lower_luo)))   (Eq. 15, hno3_uptake_efficiency; Hudson et al. 2002)\n  - R_U ~ N_I*S_I / (r_ice/D_g + kinetic_prefactor_si*sqrt(M/M_ref)/(γ*sqrt(T/T_ref)))           (Eq. 14, cloud_ice_uptake_rate; Jacob 2000)\n  - R_AU ~ f*R_U*Kᵢ / (Kᵢ + (1-f)*R_U)                                                          (Eq. 13, air_refreshing_limited_ice_uptake_rate)\n  - F_I ~ 1 - exp(-R_AU*Δt)                                                                     (Eq. 12, cold_cloud_rainout_efficiency)\nThe rational 2/3 inside the turbulence-velocity square root is kept exact as a division of integer literals, mirroring the upstream `2 // 3`; all other integer literals (the `1`s in the reciprocals and the `1 - f` / `1 - exp` terms) likewise mirror the upstream `Int` literals.\n\nThe 9 upstream module-level `@constants` (T_upper_luo, T_lower_luo, γ_base, γ_delta, zero_dimless, one_dimless, kinetic_prefactor_si, M_ref, T_ref) are migrated as fixed-default `type: parameter` entries holding their evaluated numeric values, per the rig convention for translating MTK `@constants` (matches the sibling cloud_ice_uptake.esm migration). zero_dimless = 0.0 and one_dimless = 1.0 are the dimensionless 0/1 the Eq. 15 max/min clamp uses; they are kept as parameters rather than inlined as literals so the equation tree mirrors the upstream `hno3_uptake_efficiency` helper exactly. M_ref = 1.0 kg/mol and T_ref = 1.0 K non-dimensionalize M and T before the square roots (the upstream device for avoiding fractional unit powers); since both equal 1.0 they leave the numeric result unchanged but the structure is preserved.\n\nThe 13 input `@parameters` carry no defaults upstream (they are driven by a parent system); standalone defaults are assigned here for a representative cold-cloud GEOS-Chem-grid scenario, identical to the cloud_ice_uptake.esm sibling for every shared parameter (f=0.25, TKE=1.5 m^2/s^2, Δx=Δy=200 km, Δz=1 km, Δt=600 s, N_I=1e6 m^-3, S_I=1e-8 m^2, r_ice=1e-4 m, D_g=1e-5 m^2/s, M=0.063 kg/mol HNO3, T=210 K) plus Rᵢ=0.001 s^-1 from the air_refreshing.esm sibling. Because the combined defaults coincide with the cloud_ice_uptake.esm defaults on every cloud-ice parameter, and no cloud-ice output depends on Rᵢ, the cloud-ice test anchors (γ/R_U/Kᵢ/R_AU/F_I) carry over from cloud_ice_uptake.esm unchanged; the air-refreshing tests each pin all six air-refreshing parameters (f, Rᵢ, TKE, Δx, Δy, Δz) explicitly, so the Kᵢ/τ_A/R_A anchors carry over from air_refreshing.esm unchanged.\n\n`system_kind` is left unset (zero differential states -- no D operator), consistent with the observed-only siblings air_refreshing.esm / cloud_ice_uptake.esm.\n\nTolerance rationale (model-level rel=1e-9, abs=1e-12): observed-only algebraic system (no ODE integration). The 7 equations form a triangular chain of +, -, *, /, sqrt, exp, max, min on float64, evaluated by topological substitution; round-off is ~1e-15 per op, so rel=1e-9 leaves comfortable headroom across the value range (γ ~ 3e-3 to 7e-3, rates ~ 1e-9 to 1e1 s^-1). abs=1e-12 gates the rainout_weak_uptake F_I ~ 1.2e-7 floor case, where a pure relative tolerance would be sub-ULP."
  },
  "tolerance": {
    "rel": 1e-09,
    "abs": 1e-12
  },
  "variables": {
    "f": {
      "type": "parameter",
      "units": "1",
      "default": 0.25,
      "description": "Cloud or rainfall fraction (dimensionless)"
    },
    "Rᵢ": {
      "type": "parameter",
      "units": "s^-1",
      "default": 0.001,
      "description": "In-cloud or under-rain removing rate"
    },
    "TKE": {
      "type": "parameter",
      "units": "m^2/s^2",
      "default": 1.5,
      "description": "Turbulence kinetic energy"
    },
    "Δx": {
      "type": "parameter",
      "units": "m",
      "default": 200000.0,
      "description": "Grid spacing in x direction"
    },
    "Δy": {
      "type": "parameter",
      "units": "m",
      "default": 200000.0,
      "description": "Grid spacing in y direction"
    },
    "Δz": {
      "type": "parameter",
      "units": "m",
      "default": 1000.0,
      "description": "Grid spacing in z direction"
    },
    "Δt": {
      "type": "parameter",
      "units": "s",
      "default": 600.0,
      "description": "Time step"
    },
    "N_I": {
      "type": "parameter",
      "units": "m^-3",
      "default": 1000000.0,
      "description": "Ice crystal number concentration"
    },
    "S_I": {
      "type": "parameter",
      "units": "m^2",
      "default": 1e-08,
      "description": "Ice crystal surface area"
    },
    "r_ice": {
      "type": "parameter",
      "units": "m",
      "default": 0.0001,
      "description": "Ice crystal radius"
    },
    "D_g": {
      "type": "parameter",
      "units": "m^2/s",
      "default": 1e-05,
      "description": "Gas-phase diffusion coefficient"
    },
    "M": {
      "type": "parameter",
      "units": "kg/mol",
      "default": 0.063,
      "description": "Molar mass (default: HNO3, 0.063 kg/mol)"
    },
    "T": {
      "type": "parameter",
      "units": "K",
      "default": 210.0,
      "description": "Temperature"
    },
    "T_upper_luo": {
      "type": "parameter",
      "units": "K",
      "default": 220.0,
      "description": "Upper temperature threshold for gamma (Eq. 15)"
    },
    "T_lower_luo": {
      "type": "parameter",
      "units": "K",
      "default": 209.0,
      "description": "Lower temperature threshold for gamma (Eq. 15)"
    },
    "γ_base": {
      "type": "parameter",
      "units": "1",
      "default": 0.003,
      "description": "Base uptake efficiency (Eq. 15) (dimensionless)"
    },
    "γ_delta": {
      "type": "parameter",
      "units": "1",
      "default": 0.004,
      "description": "Temperature-dependent uptake coefficient (Eq. 15) (dimensionless)"
    },
    "zero_dimless": {
      "type": "parameter",
      "units": "1",
      "default": 0.0,
      "description": "Zero (dimensionless) -- lower clamp of the Eq. 15 max/min"
    },
    "one_dimless": {
      "type": "parameter",
      "units": "1",
      "default": 1.0,
      "description": "One (dimensionless) -- upper clamp of the Eq. 15 max/min"
    },
    "kinetic_prefactor_si": {
      "type": "parameter",
      "units": "s/m",
      "default": 0.86933051443,
      "description": "Kinetic theory prefactor 4*sqrt(pi/(8R)) for ice uptake in SI (Eq. 14), R = 8.314 J/(mol*K)"
    },
    "M_ref": {
      "type": "parameter",
      "units": "kg/mol",
      "default": 1.0,
      "description": "Reference molar mass for non-dimensionalization of the square root"
    },
    "T_ref": {
      "type": "parameter",
      "units": "K",
      "default": 1.0,
      "description": "Reference temperature for non-dimensionalization of the square root"
    },
    "Kᵢ": {
      "type": "unknown",
      "units": "s^-1",
      "description": "Cloudy/rainy air refreshing rate (Eq. 11)"
    },
    "τ_A": {
      "type": "unknown",
      "units": "s",
      "description": "Grid refreshing time (Eq. 5)"
    },
    "R_A": {
      "type": "unknown",
      "units": "s^-1",
      "description": "Air refreshing limited removal rate (Eq. 2)"
    },
    "γ": {
      "type": "unknown",
      "units": "1",
      "description": "Uptake efficiency of HNO3 on ice (Eq. 15) (dimensionless)"
    },
    "R_U": {
      "type": "unknown",
      "units": "s^-1",
      "description": "Cloud ice uptake rate (Eq. 14)"
    },
    "R_AU": {
      "type": "unknown",
      "units": "s^-1",
      "description": "Air refreshing limited cloud ice uptake rate (Eq. 13)"
    },
    "F_I": {
      "type": "unknown",
      "units": "1",
      "description": "Cold cloud rainout efficiency (Eq. 12) (dimensionless)"
    }
  },
  "equations": [
    {
      "_comment": "Eq. 11 - Cloudy/rainy air refreshing rate: Kᵢ = sqrt(2/3*TKE) * [1/(sqrt(f)*Δx) + 1/(sqrt(f)*Δy) + 1/Δz]. The sqrt(2/3*TKE) factor is the isotropic turbulence velocity (Eq. 10, after Stull 1988 / Pinto 1998).",
      "lhs": "Kᵢ",
      "rhs": {
        "op": "*",
        "args": [
          {
            "op": "sqrt",
            "args": [
              {
                "op": "*",
                "args": [
                  {
                    "op": "/",
                    "args": [
                      2,
                      3
                    ]
                  },
                  "TKE"
                ]
              }
            ]
          },
          {
            "op": "+",
            "args": [
              {
                "op": "/",
                "args": [
                  1,
                  {
                    "op": "*",
                    "args": [
                      {
                        "op": "sqrt",
                        "args": [
                          "f"
                        ]
                      },
                      "Δx"
                    ]
                  }
                ]
              },
              {
                "op": "/",
                "args": [
                  1,
                  {
                    "op": "*",
                    "args": [
                      {
                        "op": "sqrt",
                        "args": [
                          "f"
                        ]
                      },
                      "Δy"
                    ]
                  }
                ]
              },
              {
                "op": "/",
                "args": [
                  1,
                  "Δz"
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 5 - Grid refreshing time: τ_A = (1 - f)/(f*Kᵢ).",
      "lhs": "τ_A",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "-",
            "args": [
              1,
              "f"
            ]
          },
          {
            "op": "*",
            "args": [
              "f",
              "Kᵢ"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 2 - Air refreshing limited removal rate: R_A = 1/(1/(f*Rᵢ) + τ_A). As τ_A -> 0 (strong mixing) R_A -> f*Rᵢ; as τ_A -> infinity (no mixing) R_A -> 0.",
      "lhs": "R_A",
      "rhs": {
        "op": "/",
        "args": [
          1,
          {
            "op": "+",
            "args": [
              {
                "op": "/",
                "args": [
                  1,
                  {
                    "op": "*",
                    "args": [
                      "f",
                      "Rᵢ"
                    ]
                  }
                ]
              },
              "τ_A"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 15 - HNO3-on-ice uptake efficiency (Hudson et al. 2002): γ = γ_base + γ_delta*max(0, min(1, (T_upper_luo - T)/(T_upper_luo - T_lower_luo))). γ = 0.003 for T >= 220 K and γ = 0.007 for T <= 209 K, ramping linearly between.",
      "lhs": "γ",
      "rhs": {
        "op": "+",
        "args": [
          "γ_base",
          {
            "op": "*",
            "args": [
              "γ_delta",
              {
                "op": "max",
                "args": [
                  "zero_dimless",
                  {
                    "op": "min",
                    "args": [
                      "one_dimless",
                      {
                        "op": "/",
                        "args": [
                          {
                            "op": "-",
                            "args": [
                              "T_upper_luo",
                              "T"
                            ]
                          },
                          {
                            "op": "-",
                            "args": [
                              "T_upper_luo",
                              "T_lower_luo"
                            ]
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 14 - Cloud ice uptake rate (Jacob 2000): R_U = N_I*S_I / (r_ice/D_g + kinetic_prefactor_si*sqrt(M/M_ref)/(γ*sqrt(T/T_ref))). M and T are non-dimensionalized by M_ref/T_ref before the square roots to avoid fractional unit powers.",
      "lhs": "R_U",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              "N_I",
              "S_I"
            ]
          },
          {
            "op": "+",
            "args": [
              {
                "op": "/",
                "args": [
                  "r_ice",
                  "D_g"
                ]
              },
              {
                "op": "/",
                "args": [
                  {
                    "op": "*",
                    "args": [
                      "kinetic_prefactor_si",
                      {
                        "op": "sqrt",
                        "args": [
                          {
                            "op": "/",
                            "args": [
                              "M",
                              "M_ref"
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "op": "*",
                    "args": [
                      "γ",
                      {
                        "op": "sqrt",
                        "args": [
                          {
                            "op": "/",
                            "args": [
                              "T",
                              "T_ref"
                            ]
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 13 - Air refreshing limited cloud ice uptake rate: R_AU = f*R_U*Kᵢ / (Kᵢ + (1-f)*R_U) -- the Eq. 2 refreshing-limit structure applied to the ice uptake rate R_U.",
      "lhs": "R_AU",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              {
                "op": "*",
                "args": [
                  "f",
                  "R_U"
                ]
              },
              "Kᵢ"
            ]
          },
          {
            "op": "+",
            "args": [
              "Kᵢ",
              {
                "op": "*",
                "args": [
                  {
                    "op": "-",
                    "args": [
                      1,
                      "f"
                    ]
                  },
                  "R_U"
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Eq. 12 - Cold cloud rainout efficiency: F_I = 1 - exp(-R_AU*Δt). F_I is the fraction of water-soluble aerosols removed via cloud-ice uptake over a time step.",
      "lhs": "F_I",
      "rhs": {
        "op": "-",
        "args": [
          1,
          {
            "op": "exp",
            "args": [
              {
                "op": "-",
                "args": [
                  {
                    "op": "*",
                    "args": [
                      "R_AU",
                      "Δt"
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  ],
  "tests": [
    {
      "id": "default_scenario",
      "description": "Default representative cold-cloud GEOS-Chem-grid scenario at the component defaults (f = 0.25, Rᵢ = 1e-3 s^-1, TKE = 1.5 m^2/s^2, 200 km x 1 km grid, Δt = 600 s, HNO3 ice uptake at T = 210 K). Pins all seven outputs and re-checks R_A, γ, F_I at t = 1 to confirm the algebraic system is time-invariant. The air-refreshing outputs (Kᵢ/τ_A/R_A) reproduce the air_refreshing.esm `eq11_reference` anchor (which used the same f/Rᵢ/TKE/grid), and the cloud-ice outputs (γ/R_U/Kᵢ/R_AU/F_I) reproduce the cloud_ice_uptake.esm `default_cold_cloud` anchor.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.00102
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 2941.176470588235
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 0.00014406779661016949
        },
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.006636363636363636
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0008150689881718272
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 0.00012740904195932977
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.07359652878399103
        },
        {
          "variable": "R_A",
          "time": 1.0,
          "expected": 0.00014406779661016949
        },
        {
          "variable": "γ",
          "time": 1.0,
          "expected": 0.006636363636363636
        },
        {
          "variable": "F_I",
          "time": 1.0,
          "expected": 0.07359652878399103
        }
      ]
    },
    {
      "id": "geoschem_default",
      "description": "Air refreshing limitation at a representative GEOS-Chem case (air_refreshing.esm `geoschem_default` anchor): f = 0.3, Rᵢ = 1e-3 s^-1, TKE = 1 m^2/s^2 on the 200 km / 1 km grid. R_A is roughly half of f*Rᵢ -- the regime where the air refreshing limitation matters most.",
      "parameter_overrides": {
        "f": 0.3,
        "Rᵢ": 0.001,
        "TKE": 1.0,
        "Δx": 200000.0,
        "Δy": 200000.0,
        "Δz": 1000.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.0008314037007777247
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 2806.498613309816
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 0.0001628709073294316
        }
      ]
    },
    {
      "id": "strong_mixing",
      "description": "Strong-mixing limit of the air refreshing limitation (Luo & Yu 2023 limiting-behavior test): a very large TKE = 1000 m^2/s^2 on a fine 50 km / 500 m grid drives the grid refreshing time τ_A toward zero, so R_A approaches the standard well-mixed rate f*Rᵢ = 3e-4 s^-1 (here within ~1.3%).",
      "parameter_overrides": {
        "f": 0.3,
        "Rᵢ": 0.001,
        "TKE": 1000.0,
        "Δx": 50000.0,
        "Δy": 50000.0,
        "Δz": 500.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.05352539603259635
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 43.59301390151994
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 0.0002961272758639925
        }
      ]
    },
    {
      "id": "weak_mixing",
      "description": "Weak-mixing limit of the air refreshing limitation (Luo & Yu 2023 limiting-behavior test): a near-zero TKE = 1e-6 m^2/s^2 on a coarse 200 km grid makes τ_A enormous, so R_A collapses to far below f*Rᵢ (R_A/(f*Rᵢ) ~ 0.0012).",
      "parameter_overrides": {
        "f": 0.3,
        "Rᵢ": 0.001,
        "TKE": 1e-06,
        "Δx": 200000.0,
        "Δy": 200000.0,
        "Δz": 1000.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 8.314037007777246e-07
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 2806498.613309816
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 3.558931704775726e-07
        }
      ]
    },
    {
      "id": "full_cloud_coverage",
      "description": "Full-cloud-coverage limit of the air refreshing limitation (Luo & Yu 2023 limiting-behavior test): as f -> 1 the grid refreshing time τ_A = (1-f)/(f*Kᵢ) -> 0, so R_A -> Rᵢ. At f = 0.999, R_A = 9.978e-4 s^-1, within ~0.2% of Rᵢ = 1e-3 s^-1.",
      "parameter_overrides": {
        "f": 0.999,
        "Rᵢ": 0.001,
        "TKE": 1.0,
        "Δx": 200000.0,
        "Δy": 200000.0,
        "Δz": 1000.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.000824665632284324
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 1.2138265035105547
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 0.000997790067115624
        }
      ]
    },
    {
      "id": "fine_grid",
      "description": "High-resolution grid case for the air refreshing limitation: a fine 10 km horizontal / 200 m vertical grid with f = 0.5, Rᵢ = 2e-3 s^-1, TKE = 0.5 m^2/s^2. Exercises a non-default Rᵢ and small grid spacings; R_A is ~75% of f*Rᵢ.",
      "parameter_overrides": {
        "f": 0.5,
        "Rᵢ": 0.002,
        "TKE": 0.5,
        "Δx": 10000.0,
        "Δy": 10000.0,
        "Δz": 200.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.0030500506621336737
        },
        {
          "variable": "τ_A",
          "time": 0.0,
          "expected": 327.8634064722212
        },
        {
          "variable": "R_A",
          "time": 0.0,
          "expected": 0.0007530895083981064
        }
      ]
    },
    {
      "id": "gamma_warm_plateau",
      "description": "Eq. 15 warm plateau: at T = 250 K (well above the 220 K upper threshold) the max/min clamp saturates at 0 and γ = γ_base = 0.003 -- the minimum HNO3-on-ice uptake efficiency (upstream luo2023_test.jl `Eq. 15` T = 250 K case). R_U, R_AU, F_I follow from the warm-temperature γ.",
      "parameter_overrides": {
        "T": 250.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.003
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0006849284717434525
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 0.00011387962151763193
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.06604570151675793
        }
      ]
    },
    {
      "id": "gamma_warm_threshold",
      "description": "Eq. 15 upper-threshold boundary: at exactly T = 220 K the ramp argument (220 - T)/(220 - 209) = 0, so γ = γ_base = 0.003. Verifies the warm endpoint of the linear ramp (upstream luo2023_test.jl `Eq. 15` T >= 220 K branch).",
      "parameter_overrides": {
        "T": 220.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.003
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.000670974977179463
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.06517474310875937
        }
      ]
    },
    {
      "id": "gamma_cold_plateau",
      "description": "Eq. 15 cold plateau: at T = 200 K (well below the 209 K lower threshold) the ramp argument exceeds 1, the min clamp saturates at 1, and γ = γ_base + γ_delta = 0.007 -- the maximum HNO3-on-ice uptake efficiency (upstream luo2023_test.jl `Eq. 15` T = 200 K case).",
      "parameter_overrides": {
        "T": 200.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.007
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0008193930573499208
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.07383095076384805
        }
      ]
    },
    {
      "id": "gamma_cold_threshold",
      "description": "Eq. 15 lower-threshold boundary: at exactly T = 209 K the ramp argument (220 - T)/(220 - 209) = 1, so γ = γ_base + γ_delta = 0.007. Verifies the cold endpoint of the linear ramp (upstream luo2023_test.jl `Eq. 15` T <= 209 K branch).",
      "parameter_overrides": {
        "T": 209.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.007
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0008226271801153912
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.07400563743093802
        }
      ]
    },
    {
      "id": "gamma_linear_midpoint",
      "description": "Eq. 15 linear-ramp midpoint: at T = 214.5 K the ramp argument (220 - T)/(220 - 209) = 0.5, so γ = γ_base + 0.5*γ_delta = 0.005 (upstream luo2023_test.jl `Eq. 15` T = 214.5 K case). This is the consistent operating point of the upstream Eq. 14 unit test, which used an artificial γ = 0.005.",
      "parameter_overrides": {
        "T": 214.5
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.005
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0007704342363922707
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.07111749961196356
        }
      ]
    },
    {
      "id": "gamma_lower_quarter",
      "description": "Eq. 15 linear ramp at the lower quarter point: T = 217.25 K gives (220 - T)/(220 - 209) = 0.25, so γ = γ_base + 0.25*γ_delta = 0.004. Exercises the interior of the linear ramp between the warm threshold and the midpoint.",
      "parameter_overrides": {
        "T": 217.25
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.004
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0007298754433942737
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.06876691836830806
        }
      ]
    },
    {
      "id": "gamma_upper_quarter",
      "description": "Eq. 15 linear ramp at the upper quarter point: T = 211.75 K gives (220 - T)/(220 - 209) = 0.75, so γ = γ_base + 0.75*γ_delta = 0.006. Exercises the interior of the linear ramp between the midpoint and the cold threshold.",
      "parameter_overrides": {
        "T": 211.75
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "γ",
          "time": 0.0,
          "expected": 0.006
        },
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0008000544348260321
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.0727747849032423
        }
      ]
    },
    {
      "id": "high_turbulence",
      "description": "Strong turbulent mixing: TKE = 100 m^2/s^2 raises the cloudy-air refreshing rate Kᵢ by a factor sqrt(100/1.5) ~ 8.16 relative to the default. The faster air refreshing relaxes the Eq. 13 limit, so the air-refreshing limited ice uptake rate R_AU and the rainout efficiency F_I both rise.",
      "parameter_overrides": {
        "TKE": 100.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.008328265125462805
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 0.00018983331995663392
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.10765280669856891
        }
      ]
    },
    {
      "id": "weak_turbulence",
      "description": "Weak turbulent mixing: TKE = 0.01 m^2/s^2 lowers the cloudy-air refreshing rate Kᵢ to sqrt(0.01/1.5) ~ 0.082 of the default. Slow air refreshing tightens the Eq. 13 limit, strongly suppressing the rainout efficiency F_I -- the central effect the Luo & Yu (2023) parameterization captures.",
      "parameter_overrides": {
        "TKE": 0.01
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 8.328265125462806e-05
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 2.443227454961941e-05
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.014552439366250502
        }
      ]
    },
    {
      "id": "rainout_saturation",
      "description": "Strong-uptake saturation limit: abundant ice surface (N_I = 1e8 m^-3, S_I = 1e-6 m^2) drives a large R_U, strong turbulence (TKE = 100 m^2/s^2) lifts Kᵢ, and a long time step (Δt = 3600 s) lets the Eq. 12 exponential saturate, so F_I approaches 1 (complete cold-cloud rainout). Mirrors the upstream luo2023_test.jl `F_I limits` large-R_AU*Δt branch.",
      "parameter_overrides": {
        "N_I": 100000000.0,
        "S_I": 1e-06,
        "TKE": 100.0,
        "Δt": 3600.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 8.150689881718272
        },
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.008328265125462805
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 0.002772311427858336
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.9999536978027082
        }
      ]
    },
    {
      "id": "rainout_weak_uptake",
      "description": "Weak-uptake floor limit: sparse ice surface (N_I = 1e3 m^-3, S_I = 1e-10 m^2) gives a vanishingly small R_U and a short time step (Δt = 60 s) keeps R_AU*Δt tiny, so F_I -> 0 (negligible cold-cloud rainout). Mirrors the upstream luo2023_test.jl `F_I limits` small-R_AU*Δt branch; the abs=1e-12 tolerance gates this ~1.2e-7 floor value.",
      "parameter_overrides": {
        "N_I": 1000.0,
        "S_I": 1e-10,
        "Δt": 60.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 8.150689881718273e-09
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 2.037660258417178e-09
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 1.2225960799305824e-07
        }
      ]
    },
    {
      "id": "heavy_species",
      "description": "Molar-mass dependence of the Eq. 14 kinetic term: a heavier species (M = 0.098 kg/mol, e.g. sulfuric acid) increases the kinetic resistance kinetic_prefactor_si*sqrt(M/M_ref)/(γ*sqrt(T/T_ref)), lowering the uptake rate R_U relative to the HNO3 default (M = 0.063). Confirms the sqrt(M/M_ref) factor is wired in.",
      "parameter_overrides": {
        "M": 0.098
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0007794344280142675
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 0.0001238681130184578
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.07162623921120326
        }
      ]
    },
    {
      "id": "large_ice_crystals",
      "description": "Diffusion-limited regime of Eq. 14: larger ice crystals (r_ice = 1e-3 m) with D_g = 2e-5 m^2/s make the gas-phase diffusion resistance r_ice/D_g = 50 s/m dominate over the kinetic term, sharply reducing the uptake rate R_U and hence F_I. Confirms the r_ice/D_g diffusion term is wired in.",
      "parameter_overrides": {
        "r_ice": 0.001,
        "D_g": 2e-05
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "R_U",
          "time": 0.0,
          "expected": 0.0001913183552482547
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 4.193094252017475e-05
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.02484472622685796
        }
      ]
    },
    {
      "id": "coarse_grid",
      "description": "Grid-resolution dependence of Eq. 11: doubling the horizontal grid spacing (Δx = Δy = 400 km) and vertical spacing (Δz = 2000 m) halves the cloudy-air refreshing rate Kᵢ to 5.1e-4 s^-1, tightening the Eq. 13 air-refreshing limit and reducing F_I. Coarser GCM grids experience stronger refreshing limitation.",
      "parameter_overrides": {
        "Δx": 400000.0,
        "Δy": 400000.0,
        "Δz": 2000.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Kᵢ",
          "time": 0.0,
          "expected": 0.00051
        },
        {
          "variable": "R_AU",
          "time": 0.0,
          "expected": 9.267915332699406e-05
        },
        {
          "variable": "F_I",
          "time": 0.0,
          "expected": 0.05408965958524958
        }
      ]
    }
  ],
  "analyses": [
    {
      "id": "air_refreshing_rate_vs_turbulence",
      "description": "Air refreshing limited removal rate R_A as a function of turbulence kinetic energy on the GEOS-Chem-like 200 km / 1 km grid at the component defaults (f = 0.25, Rᵢ = 1e-3 s^-1). As TKE grows the subgrid air mixing strengthens and R_A rises toward the standard well-mixed rate f*Rᵢ; as TKE shrinks the air refreshing limitation suppresses R_A.",
      "initial_state": {},
      "parameters": {},
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "TKE",
            "range": {
              "start": 0.01,
              "stop": 100.0,
              "count": 41,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "r_a_vs_tke",
          "type": "line",
          "description": "Air refreshing limited removal rate R_A as a function of turbulence kinetic energy (log-spaced).",
          "x": {
            "variable": "TKE",
            "label": "Turbulence kinetic energy (m^2/s^2)"
          },
          "y": {
            "variable": "R_A",
            "label": "Air refreshing limited removal rate (s^-1)"
          }
        }
      ]
    },
    {
      "id": "rainout_efficiency_vs_turbulence",
      "description": "Cold-cloud rainout efficiency F_I as a function of turbulence kinetic energy TKE (log-spaced sweep over four decades) at the default cold-cloud scenario. Illustrates the air-refreshing limitation central to Luo & Yu (2023): weak turbulence throttles the cloudy-air refreshing rate Kᵢ and suppresses F_I, while strong turbulence relaxes the Eq. 13 limit and raises F_I.",
      "initial_state": {},
      "parameters": {},
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "TKE",
            "range": {
              "start": 0.01,
              "stop": 100.0,
              "count": 41,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "f_i_vs_tke",
          "type": "line",
          "description": "Cold cloud rainout efficiency F_I as a function of turbulence kinetic energy (log-spaced).",
          "x": {
            "variable": "TKE",
            "label": "Turbulence kinetic energy (m^2/s^2)"
          },
          "y": {
            "variable": "F_I",
            "label": "Cold cloud rainout efficiency F_I (dimensionless)"
          }
        }
      ]
    },
    {
      "id": "uptake_efficiency_vs_temperature",
      "description": "HNO3-on-ice uptake efficiency γ as a function of temperature (Eq. 15, Hudson et al. 2002). Reproduces the `HNO3 Uptake Efficiency on Ice` figure of the AtmosphericDeposition.jl luo2023 documentation: γ is flat at 0.003 for T >= 220 K, ramps linearly up to 0.007 across 220-209 K, and is flat at 0.007 for T <= 209 K.",
      "initial_state": {},
      "parameters": {},
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "T",
            "range": {
              "start": 190.0,
              "stop": 240.0,
              "count": 51,
              "scale": "linear"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "gamma_vs_T",
          "type": "line",
          "description": "Uptake efficiency γ as a function of temperature T (Eq. 15).",
          "x": {
            "variable": "T",
            "label": "Temperature (K)"
          },
          "y": {
            "variable": "γ",
            "label": "HNO3 uptake efficiency γ (dimensionless)"
          }
        }
      ]
    },
    {
      "id": "rainout_efficiency_vs_timestep",
      "description": "Cold-cloud rainout efficiency F_I as a function of the model time step Δt (Eq. 12). Reproduces the `Cold Cloud Rainout Efficiency` figure of the luo2023 documentation: F_I = 1 - exp(-R_AU*Δt) rises monotonically from near zero toward saturation as the time step lengthens, at the default cold-cloud R_AU.",
      "initial_state": {},
      "parameters": {},
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "Δt",
            "range": {
              "start": 60.0,
              "stop": 3600.0,
              "count": 31,
              "scale": "linear"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "f_i_vs_dt",
          "type": "line",
          "description": "Cold cloud rainout efficiency F_I as a function of time step Δt (Eq. 12).",
          "x": {
            "variable": "Δt",
            "label": "Time step Δt (s)"
          },
          "y": {
            "variable": "F_I",
            "label": "Cold cloud rainout efficiency F_I (dimensionless)"
          }
        }
      ]
    },
    {
      "id": "rainout_over_temperature_and_turbulence",
      "description": "Two-dimensional sweep of the cold-cloud rainout efficiency F_I over temperature T (200-240 K, spanning the cold γ plateau, the linear ramp, and the warm plateau) and turbulence kinetic energy TKE (log-spaced, weak to strong mixing). Surfaces the joint control of the temperature-dependent ice uptake efficiency and the turbulence-driven air refreshing rate on cold-cloud scavenging.",
      "initial_state": {},
      "parameters": {},
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "T",
            "range": {
              "start": 200.0,
              "stop": 240.0,
              "count": 15,
              "scale": "linear"
            }
          },
          {
            "parameter": "TKE",
            "range": {
              "start": 0.01,
              "stop": 100.0,
              "count": 15,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "f_i_heatmap",
          "type": "heatmap",
          "description": "Cold cloud rainout efficiency F_I as a function of temperature T and turbulence kinetic energy TKE.",
          "x": {
            "variable": "T",
            "label": "Temperature (K)"
          },
          "y": {
            "variable": "TKE",
            "label": "Turbulence kinetic energy (m^2/s^2)"
          },
          "value": {
            "variable": "F_I",
            "reduce": "final"
          }
        }
      ]
    }
  ]
}