Version: dev

ParticleCollectionEfficiency

Slinn (1983) semi-empirical collision (collection) efficiency E between a falling raindrop and an aerosol particle, the kernel of below-cloud particle scavenging (Eqs. 20.53-20.54, Seinfeld & Pandis, 2006). E is the sum of three collection mechanisms — Brownian diffusion (E_diff, important for sub-0.1 µm particles), interception (E_int), and inertial impaction (E_imp, important for super-µm particles, switched on only when the Stokes number exceeds the critical Stokes number S* of Eq. 20.54) — and is clamped to a maximum of 1. The competition between the diffusion and impaction mechanisms produces the Greenfield gap: a collection-efficiency minimum at accumulation-mode (~0.1-1 µm) particle sizes. Migrated from AtmosphericDeposition.jl@e4468c79 src/seinfeld_pandis_2006_ch20.jl:365 (`ParticleCollectionEfficiency` @component). The upstream component carries the single equation E ~ slinn_collection_efficiency(D_p, U_t, d_p, ρ_p, T); the helper function and its sub-helpers (particle_diffusivity, particle_relaxation_time, particle_terminal_velocity) are decomposed here into 18 named intermediate algebraic states (Re, D_diff, Sc, τ, St, S_star, E_diff, E_int, E_imp, ...) mirroring the helper's local variables, so each equation maps to one source line. Observed-only: all 18 equations are algebraic — the five raindrop/aerosol/thermodynamic inputs and six physical constants are parameters, and Re through E are the algebraic outputs.

.esm schema
1.0.0
Source
components/atmospheric_deposition/sp06_ch20/particle_collection_eff.esm

Description

Slinn (1983) semi-empirical collision (collection) efficiency E between a falling raindrop and an aerosol particle, the kernel of below-cloud particle scavenging (Eqs. 20.53-20.54, Seinfeld & Pandis, 2006). E is the sum of three collection mechanisms — Brownian diffusion (E_diff, important for sub-0.1 µm particles), interception (E_int), and inertial impaction (E_imp, important for super-µm particles, switched on only when the Stokes number exceeds the critical Stokes number S* of Eq. 20.54) — and is clamped to a maximum of 1. The competition between the diffusion and impaction mechanisms produces the Greenfield gap: a collection-efficiency minimum at accumulation-mode (~0.1-1 µm) particle sizes. Migrated from AtmosphericDeposition.jl@e4468c79 src/seinfeld_pandis_2006_ch20.jl:365 (ParticleCollectionEfficiency @component). The upstream component carries the single equation E ~ slinn_collection_efficiency(D_p, U_t, d_p, ρ_p, T); the helper function and its sub-helpers (particle_diffusivity, particle_relaxation_time, particle_terminal_velocity) are decomposed here into 18 named intermediate algebraic states (Re, D_diff, Sc, τ, St, S_star, E_diff, E_int, E_imp, …) mirroring the helper’s local variables, so each equation maps to one source line. Observed-only: all 18 equations are algebraic — the five raindrop/aerosol/thermodynamic inputs and six physical constants are parameters, and Re through E are the algebraic outputs.

Reference

_source_ref: AtmosphericDeposition.jl@e4468c79c8dd4aae88646cd16d6bcf290874742c:src/seinfeld_pandis_2006_ch20.jl:365 Upstream ParticleCollectionEfficiency is an MTK @component with D_p, U_t, d_p, ρ_p, T as input @parameters and a single output @variable E(t), related by one equation E ~ slinn_collection_efficiency(D_p, U_t, d_p, ρ_p, T) — the Slinn (1983) semi-empirical raindrop-aerosol collision (collection) efficiency, Seinfeld & Pandis (2006) Eqs. 20.53-20.54. It returns System(eqs, t, vars, params; name) with no subsystems, so it is a flat algebraic model.

Decomposition: the upstream slinn_collection_efficiency is a module-level helper function whose result is one large symbolic expression. Inlining it verbatim into a single equation AST would duplicate the Re / Sc / St / S_star / stokes_diff / safe_ratio subexpressions many times over (Re alone is referenced ~6 times, stokes_diff ~5), producing a several-hundred-node tree that is not reviewable. Instead the helper’s named local variables are migrated as 18 intermediate algebraic states — one equation each, in the helper’s own evaluation order — so every .esm equation maps to exactly one source line and the migration is line-checkable. This is mathematically identical to the single upstream equation (the intermediates are common-subexpression names); after mtkcompile all 18 reduce to observed quantities and E is the same function of the five inputs as upstream. The three module-level sub-helpers particle_diffusivity (Stokes-Einstein, src line 290), particle_relaxation_time (src line 268) and particle_terminal_velocity (src line 278) are inlined into the D_diff, τ and u_t_particle equations respectively. This extends the sibling air_refreshing.esm / cloud_ice_uptake.esm convention of inlining upstream helper functions, with named intermediates because this component’s single helper is far larger than those siblings'.

The six module-level @constants (μ_air_sp, ρ_air_sp, μ_w_sp, ρ_w_sp, g_sp, kB_sp) migrate as fixed-default type: parameter entries holding their upstream numeric values (Seinfeld & Pandis 2006; μ_air from Table A.7), per the rig convention for translating MTK @constants (matches cloud_ice_uptake.esm). The upstream cbrt(Sc) cube root in the Brownian term is re-expressed as Sc^(1/3) with the ^ op, since the spec §4.2 elementary-function set has no cbrt; Sc (a Schmidt number) is always strictly positive so the two are numerically equivalent. Julia’s pi is inlined as the float64 literal 3.141592653589793. The upstream 1//12 and 2//3 exact rationals are kept as integer-literal / nodes. The component has no ifelse nodes: the upstream final clamp ifelse(E_total > 1, 1, E_total) is migrated as min(1, E_total) — the identical upper clamp and the spec §4.2-preferred AST encoding of a limiter — and the upstream impaction term ifelse(stokes_diff ≤ 0, zero(safe_ratio), safe_ratiosqrt(safe_ratio)) is migrated as safe_ratiosqrt(safe_ratio) directly, because safe_ratio = max(0, stokes_diff)/(max(0, stokes_diff) + 2/3) is already exactly 0 whenever stokes_diff ≤ 0 (the max(0, ·) numerator), so both ifelse branches are bit-identical and the conditional is provably dead code. Eliding it is numerically exact and keeps the model free of Piecewise: a Max reachable from a Piecewise condition trips a sympy lambdify-printer path (simplify_logic substitutes every free symbol with 0, and the resulting 0/0 in the zeroed Reynolds/Stokes expressions reaches Max as a NaN). The max(0, ·) in safe_ratio is retained — it keeps the sqrt argument non-negative, the upstream author’s own stated reason for the max (‘avoid negative base in power’). system_kind is left unset (zero differential states — no D operator), consistent with the observed-only siblings air_refreshing.esm / atmospheric_thermo.esm / total_molar_conc.esm.

The five input parameters carry their upstream @parameter defaults (D_p = 1e-3 m, U_t = 4 m/s, d_p = 1e-6 m, ρ_p = 1000 kg/m^3, T = 298 K). Upstream provides three relevant test items: Slinn Collection Efficiency (Eq. 20.53) exercises the helper at small / medium / large aerosol diameters with inequality assertions (E_small > 1e-4, E_small > E_medium, all E ≤ 1); Critical Stokes Number (Eq. 20.54) checks the S* formula; and the helper-function items pin particle_relaxation_time ≈ 3.23e-6 s, particle_terminal_velocity ≈ 3.17e-5 m/s and particle_diffusivity ≈ 2.54e-11 m^2/s at d_p = 1e-6 m, ρ_p = 1000 kg/m^3, T = 298 K. The inline tests here pin exact values: default_parameters uses the component defaults (which coincide with the upstream helper-test inputs) and asserts τ, u_t_particle and D_diff against those upstream reference values plus the full chain; aitken_mode_aerosol / accumulation_mode_aerosol / coarse_mode_aerosol reproduce the upstream Slinn Collection Efficiency small / medium / large cases (D_p = 2e-3 m, U_t = 6.5 m/s, d_p ∈ {1e-8, 1e-6, 1e-5} m) and confirm E_small > E_medium and the Greenfield-gap minimum at accumulation-mode size; coarse_mode_aerosol and dense_coarse_aerosol exercise the St > S* inertial-impaction branch and the sqrt(ρ_w/ρ_p) density correction; cold_temperature exercises the temperature dependence of the Brownian term; efficiency_clamp drives E_total > 1 so the Eq. 20.53 maximum-of-1 clamp fires (E pinned to 1.0).

Tolerance rationale (model-level rel=1e-6, abs=1e-12): observed-only algebraic system (no ODE integration). The 18 equations form a triangular chain of +, -, *, /, ^, sqrt, log, max and min on float64; round-off is ~1e-16 per op, so rel=1e-6 leaves ample headroom across the tested ranges (Re ~ 1e2, Sc ~ 5e3 to 3e7, E ~ 1e-4 to 1). abs=1e-12 gates the exact-zero intermediates (safe_ratio, E_imp_unscaled, E_imp) in the no-impaction cases, where a pure relative tolerance would be degenerate._

Parameters

NameUnitsDefaultDescription
D_pm0.001Raindrop diameter
U_tm/s4.0Terminal velocity of the raindrop
d_pm1e-06Aerosol particle diameter
ρ_pkg/m^31000.0Aerosol particle density
TK298.0Temperature
μ_air_spkg/(m*s)1.72e-05Dynamic viscosity of air (Table A.7, Seinfeld & Pandis 2006)
ρ_air_spkg/m^31.225Air density at standard conditions (Seinfeld & Pandis 2006)
μ_w_spkg/(m*s)0.001Dynamic viscosity of water
ρ_w_spkg/m^31000.0Water density
g_spm/s^29.81Gravitational acceleration
kB_spkg*m^2/(s^2*K)1.3806488e-23Boltzmann constant

Observed

NameUnitsDefaultDescription
Re1Raindrop Reynolds number based on drop radius, Re = D_pU_tρ_air/(2*μ_air) (dimensionless)
D_diffm^2/sBrownian diffusivity of the aerosol particle (Stokes-Einstein relation)
Sc1Particle Schmidt number, Sc = μ_air/(ρ_air*D_diff) (dimensionless)
τsParticle relaxation time in the Stokes drag regime, τ = ρ_pd_p^2/(18μ_air)
u_t_particlem/sParticle Stokes settling (terminal) velocity, u_t = τ*g
St1Stokes number of the aerosol particle relative to the raindrop, St = 2τ(U_t - u_t)/D_p (dimensionless)
φ1Aerosol-to-raindrop diameter ratio, φ = d_p/D_p (dimensionless)
ω1Water-to-air dynamic viscosity ratio, ω = μ_w/μ_air (dimensionless)
S_star1Critical Stokes number (Eq. 20.54) (dimensionless)
E_diff1Brownian diffusion term of the collection efficiency (Eq. 20.53, first line) (dimensionless)
E_int1Interception term of the collection efficiency (Eq. 20.53, second line) (dimensionless)
stokes_diff1Stokes-number excess over the critical Stokes number, St - S* (dimensionless)
safe_ratio1Clamped impaction ratio max(0, St-S*)/(max(0, St-S*) + 2/3) (dimensionless)
density_scaling1Particle-density correction factor sqrt(ρ_w/ρ_p) for the impaction term (dimensionless)
E_imp_unscaled1Inertial impaction term before the density correction; zero when St ≤ S* (dimensionless)
E_imp1Inertial impaction term of the collection efficiency (Eq. 20.53, third line) (dimensionless)
E_total1Sum of the three collection-efficiency terms before clamping (dimensionless)
E1Collection efficiency between a raindrop and an aerosol particle (Eq. 20.53), clamped to a maximum of 1 (dimensionless)

Observed expressions

$$ Re = \frac{D_{p} \cdot U_{t} \cdot ρ_{air\,sp}}{2 \cdot μ_{air\,sp}} $$

Raindrop Reynolds number based on drop radius, Re = D_pU_tρ_air/(2*μ_air) (dimensionless)

$$ D_{diff} = \frac{kB_{sp} \cdot T}{3 \cdot 3.141592653589793 \cdot μ_{air\,sp} \cdot d_{p}} $$

Brownian diffusivity of the aerosol particle (Stokes-Einstein relation)

$$ Sc = \frac{μ_{air\,sp}}{ρ_{air\,sp} \cdot D_{diff}} $$

Particle Schmidt number, Sc = μ_air/(ρ_air*D_diff) (dimensionless)

$$ τ = \frac{ρ_{p} \cdot d_{p}^{2}}{18 \cdot μ_{air\,sp}} $$

Particle relaxation time in the Stokes drag regime, τ = ρ_pd_p^2/(18μ_air)

$$ u_{t\,particle} = τ \cdot g_{sp} $$

Particle Stokes settling (terminal) velocity, u_t = τ*g

$$ St = \frac{2 \cdot τ \cdot \left(U_{t} - u_{t\,particle}\right)}{D_{p}} $$

Stokes number of the aerosol particle relative to the raindrop, St = 2τ(U_t - u_t)/D_p (dimensionless)

$$ φ = \frac{d_{p}}{D_{p}} $$

Aerosol-to-raindrop diameter ratio, φ = d_p/D_p (dimensionless)

$$ ω = \frac{μ_{w\,sp}}{μ_{air\,sp}} $$

Water-to-air dynamic viscosity ratio, ω = μ_w/μ_air (dimensionless)

$$ S_{star} = \frac{1.2 + \frac{1}{12} \cdot \ln\left(1 + Re\right)}{1 + \ln\left(1 + Re\right)} $$

Critical Stokes number (Eq. 20.54) (dimensionless)

$$ E_{diff} = \frac{4}{Re \cdot Sc} \cdot \left(1 + 0.4 \cdot \sqrt{Re} \cdot Sc^{\frac{1}{3}} + 0.16 \cdot \sqrt{Re} \cdot \sqrt{Sc}\right) $$

Brownian diffusion term of the collection efficiency (Eq. 20.53, first line) (dimensionless)

$$ E_{int} = 4 \cdot φ \cdot \left(\frac{1}{ω} + \left(1 + 2 \cdot \sqrt{Re}\right) \cdot φ\right) $$

Interception term of the collection efficiency (Eq. 20.53, second line) (dimensionless)

$$ stokes_{diff} = St - S_{star} $$

Stokes-number excess over the critical Stokes number, St - S* (dimensionless)

$$ safe_{ratio} = \frac{\mathrm{max}\left(0, stokes_{diff}\right)}{\mathrm{max}\left(0, stokes_{diff}\right) + \frac{2}{3}} $$

Clamped impaction ratio max(0, St-S*)/(max(0, St-S*) + 2/3) (dimensionless)

$$ density_{scaling} = \sqrt{\frac{ρ_{w\,sp}}{ρ_{p}}} $$

Particle-density correction factor sqrt(ρ_w/ρ_p) for the impaction term (dimensionless)

$$ E_{imp\,unscaled} = safe_{ratio} \cdot \sqrt{safe_{ratio}} $$

Inertial impaction term before the density correction; zero when St ≤ S* (dimensionless)

$$ E_{imp} = E_{imp\,unscaled} \cdot density_{scaling} $$

Inertial impaction term of the collection efficiency (Eq. 20.53, third line) (dimensionless)

$$ E_{total} = E_{diff} + E_{int} + E_{imp} $$

Sum of the three collection-efficiency terms before clamping (dimensionless)

$$ E = \mathrm{min}\left(1, E_{total}\right) $$

Collection efficiency between a raindrop and an aerosol particle (Eq. 20.53), clamped to a maximum of 1 (dimensionless)

Analyses

collection_efficiency_vs_aerosol_size

Slinn (1983) collection efficiency and its three mechanisms as a function of aerosol particle diameter, for a 2 mm raindrop falling at 6.5 m/s. This reproduces the canonical below-cloud scavenging figure (Seinfeld & Pandis 2006, Fig. 20.13): Brownian diffusion dominates for d_p below ~0.1 µm, inertial impaction dominates above ~1 µm, and the two leave a minimum — the Greenfield gap — at accumulation-mode sizes.

Time span: 0.0 → 1.0

Swept over: d_p

Total collection efficiency E as a function of aerosol particle diameter (log-spaced).

Brownian diffusion term E_diff as a function of aerosol particle diameter.

Interception term E_int as a function of aerosol particle diameter.

Inertial impaction term E_imp as a function of aerosol particle diameter.

collection_efficiency_vs_raindrop_size

Collection efficiency of a 1 µm accumulation-mode aerosol as a function of raindrop diameter, at a fixed fall speed U_t = 6.5 m/s. Smaller raindrops are more efficient collectors per drop (the interception and Brownian terms scale inversely with raindrop size), so E falls as the raindrop diameter grows.

Time span: 0.0 → 1.0

Swept over: D_p

Collection efficiency E as a function of raindrop diameter (log-spaced) for a 1 µm aerosol.

efficiency_over_aerosol_and_raindrop_size

Two-dimensional sweep of the collection efficiency E over aerosol particle diameter (10 nm to 100 µm, log-spaced) and raindrop diameter (0.2 mm to 5 mm, log-spaced) at a fixed fall speed U_t = 6.5 m/s. Surfaces the joint control of particle and raindrop size on below-cloud particle scavenging efficiency.

Time span: 0.0 → 1.0

Swept over: d_p, D_p

Collection efficiency E as a function of aerosol particle diameter and raindrop diameter.

Raw .esm

Raw .esm JSON (this component)
{
  "reference": {
    "notes": "source_ref: AtmosphericDeposition.jl@e4468c79c8dd4aae88646cd16d6bcf290874742c:src/seinfeld_pandis_2006_ch20.jl:365\nUpstream `ParticleCollectionEfficiency` is an MTK `@component` with D_p, U_t, d_p, ρ_p, T as input `@parameters` and a single output `@variable` E(t), related by one equation E ~ slinn_collection_efficiency(D_p, U_t, d_p, ρ_p, T) — the Slinn (1983) semi-empirical raindrop-aerosol collision (collection) efficiency, Seinfeld & Pandis (2006) Eqs. 20.53-20.54. It returns `System(eqs, t, vars, params; name)` with no subsystems, so it is a flat algebraic model.\n\nDecomposition: the upstream `slinn_collection_efficiency` is a module-level helper function whose result is one large symbolic expression. Inlining it verbatim into a single equation AST would duplicate the Re / Sc / St / S_star / stokes_diff / safe_ratio subexpressions many times over (Re alone is referenced ~6 times, stokes_diff ~5), producing a several-hundred-node tree that is not reviewable. Instead the helper's named local variables are migrated as 18 intermediate algebraic states — one equation each, in the helper's own evaluation order — so every .esm equation maps to exactly one source line and the migration is line-checkable. This is mathematically identical to the single upstream equation (the intermediates are common-subexpression names); after `mtkcompile` all 18 reduce to observed quantities and E is the same function of the five inputs as upstream. The three module-level sub-helpers `particle_diffusivity` (Stokes-Einstein, src line 290), `particle_relaxation_time` (src line 268) and `particle_terminal_velocity` (src line 278) are inlined into the D_diff, τ and u_t_particle equations respectively. This extends the sibling air_refreshing.esm / cloud_ice_uptake.esm convention of inlining upstream helper functions, with named intermediates because this component's single helper is far larger than those siblings'.\n\nThe six module-level `@constants` (μ_air_sp, ρ_air_sp, μ_w_sp, ρ_w_sp, g_sp, kB_sp) migrate as fixed-default `type: parameter` entries holding their upstream numeric values (Seinfeld & Pandis 2006; μ_air from Table A.7), per the rig convention for translating MTK `@constants` (matches cloud_ice_uptake.esm). The upstream `cbrt(Sc)` cube root in the Brownian term is re-expressed as Sc^(1/3) with the `^` op, since the spec §4.2 elementary-function set has no `cbrt`; Sc (a Schmidt number) is always strictly positive so the two are numerically equivalent. Julia's `pi` is inlined as the float64 literal 3.141592653589793. The upstream `1//12` and `2//3` exact rationals are kept as integer-literal `/` nodes. The component has no `ifelse` nodes: the upstream final clamp ifelse(E_total > 1, 1, E_total) is migrated as min(1, E_total) — the identical upper clamp and the spec §4.2-preferred AST encoding of a limiter — and the upstream impaction term ifelse(stokes_diff ≤ 0, zero(safe_ratio), safe_ratio*sqrt(safe_ratio)) is migrated as safe_ratio*sqrt(safe_ratio) directly, because safe_ratio = max(0, stokes_diff)/(max(0, stokes_diff) + 2/3) is already exactly 0 whenever stokes_diff ≤ 0 (the max(0, ·) numerator), so both ifelse branches are bit-identical and the conditional is provably dead code. Eliding it is numerically exact and keeps the model free of `Piecewise`: a `Max` reachable from a `Piecewise` condition trips a sympy lambdify-printer path (`simplify_logic` substitutes every free symbol with 0, and the resulting 0/0 in the zeroed Reynolds/Stokes expressions reaches `Max` as a NaN). The max(0, ·) in safe_ratio is retained — it keeps the sqrt argument non-negative, the upstream author's own stated reason for the max ('avoid negative base in power'). `system_kind` is left unset (zero differential states — no D operator), consistent with the observed-only siblings air_refreshing.esm / atmospheric_thermo.esm / total_molar_conc.esm.\n\nThe five input parameters carry their upstream `@parameter` defaults (D_p = 1e-3 m, U_t = 4 m/s, d_p = 1e-6 m, ρ_p = 1000 kg/m^3, T = 298 K). Upstream provides three relevant test items: `Slinn Collection Efficiency (Eq. 20.53)` exercises the helper at small / medium / large aerosol diameters with inequality assertions (E_small > 1e-4, E_small > E_medium, all E ≤ 1); `Critical Stokes Number (Eq. 20.54)` checks the S* formula; and the helper-function items pin particle_relaxation_time ≈ 3.23e-6 s, particle_terminal_velocity ≈ 3.17e-5 m/s and particle_diffusivity ≈ 2.54e-11 m^2/s at d_p = 1e-6 m, ρ_p = 1000 kg/m^3, T = 298 K. The inline tests here pin exact values: default_parameters uses the component defaults (which coincide with the upstream helper-test inputs) and asserts τ, u_t_particle and D_diff against those upstream reference values plus the full chain; aitken_mode_aerosol / accumulation_mode_aerosol / coarse_mode_aerosol reproduce the upstream `Slinn Collection Efficiency` small / medium / large cases (D_p = 2e-3 m, U_t = 6.5 m/s, d_p ∈ {1e-8, 1e-6, 1e-5} m) and confirm E_small > E_medium and the Greenfield-gap minimum at accumulation-mode size; coarse_mode_aerosol and dense_coarse_aerosol exercise the St > S* inertial-impaction branch and the sqrt(ρ_w/ρ_p) density correction; cold_temperature exercises the temperature dependence of the Brownian term; efficiency_clamp drives E_total > 1 so the Eq. 20.53 maximum-of-1 clamp fires (E pinned to 1.0).\n\nTolerance rationale (model-level rel=1e-6, abs=1e-12): observed-only algebraic system (no ODE integration). The 18 equations form a triangular chain of +, -, *, /, ^, sqrt, log, max and min on float64; round-off is ~1e-16 per op, so rel=1e-6 leaves ample headroom across the tested ranges (Re ~ 1e2, Sc ~ 5e3 to 3e7, E ~ 1e-4 to 1). abs=1e-12 gates the exact-zero intermediates (safe_ratio, E_imp_unscaled, E_imp) in the no-impaction cases, where a pure relative tolerance would be degenerate."
  },
  "tolerance": {
    "rel": 1e-06,
    "abs": 1e-12
  },
  "variables": {
    "D_p": {
      "type": "parameter",
      "units": "m",
      "default": 0.001,
      "description": "Raindrop diameter"
    },
    "U_t": {
      "type": "parameter",
      "units": "m/s",
      "default": 4.0,
      "description": "Terminal velocity of the raindrop"
    },
    "d_p": {
      "type": "parameter",
      "units": "m",
      "default": 1e-06,
      "description": "Aerosol particle diameter"
    },
    "ρ_p": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 1000.0,
      "description": "Aerosol particle density"
    },
    "T": {
      "type": "parameter",
      "units": "K",
      "default": 298.0,
      "description": "Temperature"
    },
    "μ_air_sp": {
      "type": "parameter",
      "units": "kg/(m*s)",
      "default": 1.72e-05,
      "description": "Dynamic viscosity of air (Table A.7, Seinfeld & Pandis 2006)"
    },
    "ρ_air_sp": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 1.225,
      "description": "Air density at standard conditions (Seinfeld & Pandis 2006)"
    },
    "μ_w_sp": {
      "type": "parameter",
      "units": "kg/(m*s)",
      "default": 0.001,
      "description": "Dynamic viscosity of water"
    },
    "ρ_w_sp": {
      "type": "parameter",
      "units": "kg/m^3",
      "default": 1000.0,
      "description": "Water density"
    },
    "g_sp": {
      "type": "parameter",
      "units": "m/s^2",
      "default": 9.81,
      "description": "Gravitational acceleration"
    },
    "kB_sp": {
      "type": "parameter",
      "units": "kg*m^2/(s^2*K)",
      "default": 1.3806488e-23,
      "description": "Boltzmann constant"
    },
    "Re": {
      "type": "unknown",
      "units": "1",
      "description": "Raindrop Reynolds number based on drop radius, Re = D_p*U_t*ρ_air/(2*μ_air) (dimensionless)"
    },
    "D_diff": {
      "type": "unknown",
      "units": "m^2/s",
      "description": "Brownian diffusivity of the aerosol particle (Stokes-Einstein relation)"
    },
    "Sc": {
      "type": "unknown",
      "units": "1",
      "description": "Particle Schmidt number, Sc = μ_air/(ρ_air*D_diff) (dimensionless)"
    },
    "τ": {
      "type": "unknown",
      "units": "s",
      "description": "Particle relaxation time in the Stokes drag regime, τ = ρ_p*d_p^2/(18*μ_air)"
    },
    "u_t_particle": {
      "type": "unknown",
      "units": "m/s",
      "description": "Particle Stokes settling (terminal) velocity, u_t = τ*g"
    },
    "St": {
      "type": "unknown",
      "units": "1",
      "description": "Stokes number of the aerosol particle relative to the raindrop, St = 2*τ*(U_t - u_t)/D_p (dimensionless)"
    },
    "φ": {
      "type": "unknown",
      "units": "1",
      "description": "Aerosol-to-raindrop diameter ratio, φ = d_p/D_p (dimensionless)"
    },
    "ω": {
      "type": "unknown",
      "units": "1",
      "description": "Water-to-air dynamic viscosity ratio, ω = μ_w/μ_air (dimensionless)"
    },
    "S_star": {
      "type": "unknown",
      "units": "1",
      "description": "Critical Stokes number (Eq. 20.54) (dimensionless)"
    },
    "E_diff": {
      "type": "unknown",
      "units": "1",
      "description": "Brownian diffusion term of the collection efficiency (Eq. 20.53, first line) (dimensionless)"
    },
    "E_int": {
      "type": "unknown",
      "units": "1",
      "description": "Interception term of the collection efficiency (Eq. 20.53, second line) (dimensionless)"
    },
    "stokes_diff": {
      "type": "unknown",
      "units": "1",
      "description": "Stokes-number excess over the critical Stokes number, St - S* (dimensionless)"
    },
    "safe_ratio": {
      "type": "unknown",
      "units": "1",
      "description": "Clamped impaction ratio max(0, St-S*)/(max(0, St-S*) + 2/3) (dimensionless)"
    },
    "density_scaling": {
      "type": "unknown",
      "units": "1",
      "description": "Particle-density correction factor sqrt(ρ_w/ρ_p) for the impaction term (dimensionless)"
    },
    "E_imp_unscaled": {
      "type": "unknown",
      "units": "1",
      "description": "Inertial impaction term before the density correction; zero when St ≤ S* (dimensionless)"
    },
    "E_imp": {
      "type": "unknown",
      "units": "1",
      "description": "Inertial impaction term of the collection efficiency (Eq. 20.53, third line) (dimensionless)"
    },
    "E_total": {
      "type": "unknown",
      "units": "1",
      "description": "Sum of the three collection-efficiency terms before clamping (dimensionless)"
    },
    "E": {
      "type": "unknown",
      "units": "1",
      "description": "Collection efficiency between a raindrop and an aerosol particle (Eq. 20.53), clamped to a maximum of 1 (dimensionless)"
    }
  },
  "equations": [
    {
      "_comment": "Reynolds number based on drop radius (slinn_collection_efficiency, src line 310): Re = D_p*U_t*ρ_air/(2*μ_air)",
      "lhs": "Re",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              "D_p",
              "U_t",
              "ρ_air_sp"
            ]
          },
          {
            "op": "*",
            "args": [
              2,
              "μ_air_sp"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Brownian diffusivity of the aerosol particle via Stokes-Einstein (particle_diffusivity, src line 291): D_diff = k_B*T/(3*pi*μ_air*d_p)",
      "lhs": "D_diff",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              "kB_sp",
              "T"
            ]
          },
          {
            "op": "*",
            "args": [
              3,
              3.141592653589793,
              "μ_air_sp",
              "d_p"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Particle Schmidt number (slinn_collection_efficiency, src line 314): Sc = μ_air/(ρ_air*D_diff)",
      "lhs": "Sc",
      "rhs": {
        "op": "/",
        "args": [
          "μ_air_sp",
          {
            "op": "*",
            "args": [
              "ρ_air_sp",
              "D_diff"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Particle relaxation time in the Stokes drag regime (particle_relaxation_time, src line 269): τ = ρ_p*d_p^2/(18*μ_air)",
      "lhs": "τ",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              "ρ_p",
              {
                "op": "^",
                "args": [
                  "d_p",
                  2
                ]
              }
            ]
          },
          {
            "op": "*",
            "args": [
              18,
              "μ_air_sp"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Particle Stokes settling velocity (particle_terminal_velocity, src line 280): u_t = τ*g",
      "lhs": "u_t_particle",
      "rhs": {
        "op": "*",
        "args": [
          "τ",
          "g_sp"
        ]
      }
    },
    {
      "_comment": "Stokes number of the aerosol particle relative to the raindrop (slinn_collection_efficiency, src line 319): St = 2*τ*(U_t - u_t)/D_p",
      "lhs": "St",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              2,
              "τ",
              {
                "op": "-",
                "args": [
                  "U_t",
                  "u_t_particle"
                ]
              }
            ]
          },
          "D_p"
        ]
      }
    },
    {
      "_comment": "Aerosol-to-raindrop diameter ratio (slinn_collection_efficiency, src line 322): φ = d_p/D_p",
      "lhs": "φ",
      "rhs": {
        "op": "/",
        "args": [
          "d_p",
          "D_p"
        ]
      }
    },
    {
      "_comment": "Water-to-air dynamic viscosity ratio (slinn_collection_efficiency, src line 325): ω = μ_w/μ_air",
      "lhs": "ω",
      "rhs": {
        "op": "/",
        "args": [
          "μ_w_sp",
          "μ_air_sp"
        ]
      }
    },
    {
      "_comment": "Critical Stokes number (Eq. 20.54; slinn_collection_efficiency, src line 328): S* = (1.2 + (1/12)*log(1+Re))/(1 + log(1+Re))",
      "lhs": "S_star",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "+",
            "args": [
              1.2,
              {
                "op": "*",
                "args": [
                  {
                    "op": "/",
                    "args": [
                      1,
                      12
                    ]
                  },
                  {
                    "op": "log",
                    "args": [
                      {
                        "op": "+",
                        "args": [
                          1,
                          "Re"
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "op": "+",
            "args": [
              1,
              {
                "op": "log",
                "args": [
                  {
                    "op": "+",
                    "args": [
                      1,
                      "Re"
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Brownian diffusion term of the collection efficiency (Eq. 20.53, first line; slinn_collection_efficiency, src line 331): E_diff = (4/(Re*Sc))*(1 + 0.4*sqrt(Re)*Sc^(1/3) + 0.16*sqrt(Re)*sqrt(Sc)). The upstream cbrt(Sc) is re-expressed as Sc^(1/3) (no cbrt op in spec §4.2); Sc > 0 always, so the two are equivalent.",
      "lhs": "E_diff",
      "rhs": {
        "op": "*",
        "args": [
          {
            "op": "/",
            "args": [
              4,
              {
                "op": "*",
                "args": [
                  "Re",
                  "Sc"
                ]
              }
            ]
          },
          {
            "op": "+",
            "args": [
              1,
              {
                "op": "*",
                "args": [
                  0.4,
                  {
                    "op": "sqrt",
                    "args": [
                      "Re"
                    ]
                  },
                  {
                    "op": "^",
                    "args": [
                      "Sc",
                      {
                        "op": "/",
                        "args": [
                          1,
                          3
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "op": "*",
                "args": [
                  0.16,
                  {
                    "op": "sqrt",
                    "args": [
                      "Re"
                    ]
                  },
                  {
                    "op": "sqrt",
                    "args": [
                      "Sc"
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Interception term of the collection efficiency (Eq. 20.53, second line; slinn_collection_efficiency, src line 334): E_int = 4*φ*(1/ω + (1 + 2*sqrt(Re))*φ)",
      "lhs": "E_int",
      "rhs": {
        "op": "*",
        "args": [
          4,
          "φ",
          {
            "op": "+",
            "args": [
              {
                "op": "/",
                "args": [
                  1,
                  "ω"
                ]
              },
              {
                "op": "*",
                "args": [
                  {
                    "op": "+",
                    "args": [
                      1,
                      {
                        "op": "*",
                        "args": [
                          2,
                          {
                            "op": "sqrt",
                            "args": [
                              "Re"
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  "φ"
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Stokes-number excess over the critical Stokes number (slinn_collection_efficiency, src line 342): stokes_diff = St - S*",
      "lhs": "stokes_diff",
      "rhs": {
        "op": "-",
        "args": [
          "St",
          "S_star"
        ]
      }
    },
    {
      "_comment": "Clamped impaction ratio (slinn_collection_efficiency, src line 344): max(0, St-S*)/(max(0, St-S*) + 2/3). The max(0, ·) keeps safe_ratio non-negative so the downstream sqrt(safe_ratio) in E_imp_unscaled is real-valued, and makes safe_ratio exactly 0 when St ≤ S*.",
      "lhs": "safe_ratio",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "max",
            "args": [
              0,
              "stokes_diff"
            ]
          },
          {
            "op": "+",
            "args": [
              {
                "op": "max",
                "args": [
                  0,
                  "stokes_diff"
                ]
              },
              {
                "op": "/",
                "args": [
                  2,
                  3
                ]
              }
            ]
          }
        ]
      }
    },
    {
      "_comment": "Particle-density correction factor for the impaction term (slinn_collection_efficiency, src line 345; Seinfeld & Pandis p. 950): density_scaling = sqrt(ρ_w/ρ_p)",
      "lhs": "density_scaling",
      "rhs": {
        "op": "sqrt",
        "args": [
          {
            "op": "/",
            "args": [
              "ρ_w_sp",
              "ρ_p"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Inertial impaction term before the density correction (slinn_collection_efficiency, src line 347): safe_ratio*sqrt(safe_ratio) = safe_ratio^(3/2). Upstream wraps this in ifelse(St-S* ≤ 0, 0, safe_ratio*sqrt(safe_ratio)) so the term is zero when St ≤ S* (impaction requires sufficient inertia; Seinfeld & Pandis p. 950); the ifelse is omitted because safe_ratio = max(0, St-S*)/(max(0, St-S*) + 2/3) is already exactly 0 when St-S* ≤ 0, so both ifelse branches are bit-identical.",
      "lhs": "E_imp_unscaled",
      "rhs": {
        "op": "*",
        "args": [
          "safe_ratio",
          {
            "op": "sqrt",
            "args": [
              "safe_ratio"
            ]
          }
        ]
      }
    },
    {
      "_comment": "Inertial impaction term of the collection efficiency (Eq. 20.53, third line; slinn_collection_efficiency, src line 351): E_imp = E_imp_unscaled*density_scaling",
      "lhs": "E_imp",
      "rhs": {
        "op": "*",
        "args": [
          "E_imp_unscaled",
          "density_scaling"
        ]
      }
    },
    {
      "_comment": "Sum of the three collection-efficiency mechanisms before clamping (slinn_collection_efficiency, src line 353): E_total = E_diff + E_int + E_imp",
      "lhs": "E_total",
      "rhs": {
        "op": "+",
        "args": [
          "E_diff",
          "E_int",
          "E_imp"
        ]
      }
    },
    {
      "_comment": "Collection efficiency clamped to a maximum of 1 (Eq. 20.53; slinn_collection_efficiency, src line 355): E = min(1, E_total). Upstream writes ifelse(E_total > 1, 1, E_total); min(1, E_total) is the identical upper clamp and the spec §4.2-preferred AST encoding of a clamp/limiter.",
      "lhs": "E",
      "rhs": {
        "op": "min",
        "args": [
          1,
          "E_total"
        ]
      }
    }
  ],
  "tests": [
    {
      "id": "default_parameters",
      "description": "Component defaults (D_p = 1 mm raindrop, U_t = 4 m/s, d_p = 1 µm accumulation-mode aerosol, ρ_p = 1000 kg/m^3, T = 298 K). These inputs coincide with the upstream helper-function test inputs, so τ, u_t_particle, and D_diff are pinned against the upstream reference values (particle_relaxation_time ≈ 3.23e-6 s, particle_terminal_velocity ≈ 3.17e-5 m/s, particle_diffusivity ≈ 2.54e-11 m^2/s). The Stokes number St ≈ 0.026 falls below the critical S* ≈ 0.27, so the impaction term is off and E is the sum of the small Brownian and interception terms. The system is algebraic, so E is re-asserted at t = 1 to confirm time-invariance.",
      "parameter_overrides": {
        "D_p": 0.001,
        "U_t": 4.0,
        "d_p": 1e-06,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Re",
          "time": 0.0,
          "expected": 142.4418604651163
        },
        {
          "variable": "D_diff",
          "time": 0.0,
          "expected": 2.5380484572007868e-11
        },
        {
          "variable": "Sc",
          "time": 0.0,
          "expected": 553213.0912116716
        },
        {
          "variable": "τ",
          "time": 0.0,
          "expected": 3.2299741602067182e-06
        },
        {
          "variable": "u_t_particle",
          "time": 0.0,
          "expected": 3.168604651162791e-05
        },
        {
          "variable": "St",
          "time": 0.0,
          "expected": 0.025839588591430804
        },
        {
          "variable": "φ",
          "time": 0.0,
          "expected": 0.001
        },
        {
          "variable": "ω",
          "time": 0.0,
          "expected": 58.13953488372093
        },
        {
          "variable": "S_star",
          "time": 0.0,
          "expected": 0.2705072867967095
        },
        {
          "variable": "E_diff",
          "time": 0.0,
          "expected": 9.204065626656528e-05
        },
        {
          "variable": "E_int",
          "time": 0.0,
          "expected": 0.0001682792075258663
        },
        {
          "variable": "E_imp",
          "time": 0.0,
          "expected": 0.0
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.0002603198637924316
        },
        {
          "variable": "E",
          "time": 1.0,
          "expected": 0.0002603198637924316
        }
      ]
    },
    {
      "id": "aitken_mode_aerosol",
      "description": "Small Aitken-mode aerosol (d_p = 10 nm) collected by a 2 mm raindrop falling at 6.5 m/s — the upstream `Slinn Collection Efficiency` small-particle case. Brownian diffusion dominates (E_diff ≫ E_int); the Stokes number is far below S* so the impaction term is zero. This is the high-efficiency small-particle end of the Slinn curve, with E larger than the accumulation-mode case (upstream assertion E_small > E_medium).",
      "parameter_overrides": {
        "D_p": 0.002,
        "U_t": 6.5,
        "d_p": 1e-08,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "Re",
          "time": 0.0,
          "expected": 462.9360465116279
        },
        {
          "variable": "E_diff",
          "time": 0.0,
          "expected": 0.000639219579960086
        },
        {
          "variable": "E_int",
          "time": 0.0,
          "expected": 3.4840318973093977e-07
        },
        {
          "variable": "E_imp",
          "time": 0.0,
          "expected": 0.0
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.0006395679831498169
        }
      ]
    },
    {
      "id": "accumulation_mode_aerosol",
      "description": "Accumulation-mode aerosol (d_p = 1 µm) collected by a 2 mm raindrop falling at 6.5 m/s — the upstream `Slinn Collection Efficiency` medium-particle case. This is the Greenfield gap: Brownian diffusion has weakened and inertial impaction has not yet switched on, so the collection efficiency E is at its minimum — smaller than both the aitken_mode_aerosol and coarse_mode_aerosol cases at the same raindrop.",
      "parameter_overrides": {
        "D_p": 0.002,
        "U_t": 6.5,
        "d_p": 1e-06,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "E_diff",
          "time": 0.0,
          "expected": 5.104243173195447e-05
        },
        {
          "variable": "E_int",
          "time": 0.0,
          "expected": 7.843189730939726e-05
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.00012947432904135173
        }
      ]
    },
    {
      "id": "coarse_mode_aerosol",
      "description": "Coarse-mode aerosol (d_p = 10 µm) collected by a 2 mm raindrop falling at 6.5 m/s — the upstream `Slinn Collection Efficiency` large-particle case. The Stokes number St ≈ 2.1 now exceeds the critical S* ≈ 0.24, so the inertial impaction term switches on (stokes_diff > 0) and dominates E. With ρ_p = ρ_w the density correction sqrt(ρ_w/ρ_p) = 1, so E_imp = E_imp_unscaled.",
      "parameter_overrides": {
        "D_p": 0.002,
        "U_t": 6.5,
        "d_p": 1e-05,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "St",
          "time": 0.0,
          "expected": 2.0984597530196507
        },
        {
          "variable": "S_star",
          "time": 0.0,
          "expected": 0.23973477328922943
        },
        {
          "variable": "stokes_diff",
          "time": 0.0,
          "expected": 1.8587249797304213
        },
        {
          "variable": "safe_ratio",
          "time": 0.0,
          "expected": 0.7360145434797082
        },
        {
          "variable": "density_scaling",
          "time": 0.0,
          "expected": 1.0
        },
        {
          "variable": "E_imp_unscaled",
          "time": 0.0,
          "expected": 0.6314363712214995
        },
        {
          "variable": "E_imp",
          "time": 0.0,
          "expected": 0.6314363712214995
        },
        {
          "variable": "E_int",
          "time": 0.0,
          "expected": 0.004747189730939727
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.636198586474696
        }
      ]
    },
    {
      "id": "dense_coarse_aerosol",
      "description": "Dense coarse-mode aerosol (d_p = 10 µm, ρ_p = 2000 kg/m^3 — roughly mineral dust) collected by a 2 mm raindrop at 6.5 m/s. The doubled density doubles the relaxation time τ and hence the Stokes number relative to coarse_mode_aerosol, raising the unscaled impaction term, but the density correction sqrt(ρ_w/ρ_p) = sqrt(0.5) ≈ 0.707 scales the impaction term back down — exercising the ρ_p ≠ ρ_w branch of the density correction.",
      "parameter_overrides": {
        "D_p": 0.002,
        "U_t": 6.5,
        "d_p": 1e-05,
        "ρ_p": 2000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "τ",
          "time": 0.0,
          "expected": 0.0006459948320413437
        },
        {
          "variable": "St",
          "time": 0.0,
          "expected": 4.194872603809867
        },
        {
          "variable": "stokes_diff",
          "time": 0.0,
          "expected": 3.9551378305206377
        },
        {
          "variable": "safe_ratio",
          "time": 0.0,
          "expected": 0.8557561949943185
        },
        {
          "variable": "density_scaling",
          "time": 0.0,
          "expected": 0.7071067811865476
        },
        {
          "variable": "E_imp_unscaled",
          "time": 0.0,
          "expected": 0.7916351650323278
        },
        {
          "variable": "E_imp",
          "time": 0.0,
          "expected": 0.5597705934200907
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.5645328086732871
        }
      ]
    },
    {
      "id": "cold_temperature",
      "description": "Component defaults but at a cold T = 273 K. Brownian diffusivity scales linearly with temperature (Stokes-Einstein), so the colder column has a smaller D_diff and a larger Schmidt number Sc than the 298 K default_parameters case, which lowers the Brownian diffusion term E_diff. The interception and impaction terms are temperature-independent.",
      "parameter_overrides": {
        "D_p": 0.001,
        "U_t": 4.0,
        "d_p": 1e-06,
        "ρ_p": 1000.0,
        "T": 273.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "D_diff",
          "time": 0.0,
          "expected": 2.3251249289121297e-11
        },
        {
          "variable": "Sc",
          "time": 0.0,
          "expected": 603873.6306999201
        },
        {
          "variable": "E_diff",
          "time": 0.0,
          "expected": 8.78172093972164e-05
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 0.0002560964169230827
        }
      ]
    },
    {
      "id": "efficiency_clamp",
      "description": "Large light aerosol (d_p = 50 µm, ρ_p = 500 kg/m^3) collected by a 2 mm raindrop at 6.5 m/s. The large relaxation time gives a Stokes number St ≈ 26, and the density correction sqrt(ρ_w/ρ_p) = sqrt(2) ≈ 1.414 amplifies the impaction term so that the unclamped sum E_total ≈ 1.47 exceeds 1. The Eq. 20.53 maximum-of-1 clamp therefore fires and E is pinned to exactly 1.0 — exercising the E_total > 1 branch.",
      "parameter_overrides": {
        "D_p": 0.002,
        "U_t": 6.5,
        "d_p": 5e-05,
        "ρ_p": 500.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "E_imp",
          "time": 0.0,
          "expected": 1.3612050562639566
        },
        {
          "variable": "E_total",
          "time": 0.0,
          "expected": 1.4730112686254653
        },
        {
          "variable": "E",
          "time": 0.0,
          "expected": 1.0
        }
      ]
    }
  ],
  "analyses": [
    {
      "id": "collection_efficiency_vs_aerosol_size",
      "description": "Slinn (1983) collection efficiency and its three mechanisms as a function of aerosol particle diameter, for a 2 mm raindrop falling at 6.5 m/s. This reproduces the canonical below-cloud scavenging figure (Seinfeld & Pandis 2006, Fig. 20.13): Brownian diffusion dominates for d_p below ~0.1 µm, inertial impaction dominates above ~1 µm, and the two leave a minimum — the Greenfield gap — at accumulation-mode sizes.",
      "initial_state": {},
      "parameters": {
        "D_p": 0.002,
        "U_t": 6.5,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "d_p",
            "range": {
              "start": 1e-08,
              "stop": 0.0001,
              "count": 49,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "E_vs_dp",
          "type": "line",
          "description": "Total collection efficiency E as a function of aerosol particle diameter (log-spaced).",
          "x": {
            "variable": "d_p",
            "label": "Aerosol particle diameter (m)"
          },
          "y": {
            "variable": "E",
            "label": "Collection efficiency (dimensionless)"
          }
        },
        {
          "id": "E_diff_vs_dp",
          "type": "line",
          "description": "Brownian diffusion term E_diff as a function of aerosol particle diameter.",
          "x": {
            "variable": "d_p",
            "label": "Aerosol particle diameter (m)"
          },
          "y": {
            "variable": "E_diff",
            "label": "Brownian diffusion term (dimensionless)"
          }
        },
        {
          "id": "E_int_vs_dp",
          "type": "line",
          "description": "Interception term E_int as a function of aerosol particle diameter.",
          "x": {
            "variable": "d_p",
            "label": "Aerosol particle diameter (m)"
          },
          "y": {
            "variable": "E_int",
            "label": "Interception term (dimensionless)"
          }
        },
        {
          "id": "E_imp_vs_dp",
          "type": "line",
          "description": "Inertial impaction term E_imp as a function of aerosol particle diameter.",
          "x": {
            "variable": "d_p",
            "label": "Aerosol particle diameter (m)"
          },
          "y": {
            "variable": "E_imp",
            "label": "Inertial impaction term (dimensionless)"
          }
        }
      ]
    },
    {
      "id": "collection_efficiency_vs_raindrop_size",
      "description": "Collection efficiency of a 1 µm accumulation-mode aerosol as a function of raindrop diameter, at a fixed fall speed U_t = 6.5 m/s. Smaller raindrops are more efficient collectors per drop (the interception and Brownian terms scale inversely with raindrop size), so E falls as the raindrop diameter grows.",
      "initial_state": {},
      "parameters": {
        "U_t": 6.5,
        "d_p": 1e-06,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "D_p",
            "range": {
              "start": 0.0002,
              "stop": 0.005,
              "count": 25,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "E_vs_Dp",
          "type": "line",
          "description": "Collection efficiency E as a function of raindrop diameter (log-spaced) for a 1 µm aerosol.",
          "x": {
            "variable": "D_p",
            "label": "Raindrop diameter (m)"
          },
          "y": {
            "variable": "E",
            "label": "Collection efficiency (dimensionless)"
          }
        }
      ]
    },
    {
      "id": "efficiency_over_aerosol_and_raindrop_size",
      "description": "Two-dimensional sweep of the collection efficiency E over aerosol particle diameter (10 nm to 100 µm, log-spaced) and raindrop diameter (0.2 mm to 5 mm, log-spaced) at a fixed fall speed U_t = 6.5 m/s. Surfaces the joint control of particle and raindrop size on below-cloud particle scavenging efficiency.",
      "initial_state": {},
      "parameters": {
        "U_t": 6.5,
        "ρ_p": 1000.0,
        "T": 298.0
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameter_sweep": {
        "type": "cartesian",
        "dimensions": [
          {
            "parameter": "d_p",
            "range": {
              "start": 1e-08,
              "stop": 0.0001,
              "count": 15,
              "scale": "log"
            }
          },
          {
            "parameter": "D_p",
            "range": {
              "start": 0.0002,
              "stop": 0.005,
              "count": 15,
              "scale": "log"
            }
          }
        ]
      },
      "plots": [
        {
          "id": "E_heatmap",
          "type": "heatmap",
          "description": "Collection efficiency E as a function of aerosol particle diameter and raindrop diameter.",
          "x": {
            "variable": "d_p",
            "label": "Aerosol particle diameter (m)"
          },
          "y": {
            "variable": "D_p",
            "label": "Raindrop diameter (m)"
          },
          "value": {
            "variable": "E",
            "reduce": "final"
          }
        }
      ]
    }
  ]
}