Notation — symbols & sign conventions
NOTATION — symbols & sign conventions
Linked from every chapter. If the printed equation and the code disagree, the code is wrong. Fix conventions here first.
Coordinates & operators
| Symbol | Meaning |
|---|---|
| eastward, northward, upward | |
| velocity | |
| horizontal Laplacian (spectral: ) | |
| horizontal Jacobian |
Rotation & stratification
| Symbol | Meaning | Convention |
|---|---|---|
| Coriolis parameter | (increases northward) | |
| planetary rotation rate | ||
| buoyancy freq. squared | stable | |
| buoyancy |
Dynamical fields
| Symbol | Meaning | Sign |
|---|---|---|
| streamfunction | ||
| relative vorticity | ; invert with invert_laplacian(zeta_hat) | |
| potential vorticity | Ertel / QG per chapter |
Streamfunction sign. We use and . In vorticity-form notebooks solve (so
psi_hat = grid.invert_laplacian(zeta_hat)). Keep this consistent across all notebooks.
Geostrophic, hydrostatic & thermal-wind balance
| Symbol | Meaning | Convention |
|---|---|---|
| kinematic pressure, | ||
| geostrophic velocity | ||
| hydrostatic balance | ||
| thermal wind | vertical shear from the horizontal buoyancy gradient |
Geostrophic balance is . has exactly the streamfunction form above with — geostrophic flow always has a streamfunction, and is it.
gfdlib.balanceworks in a single cross-section with a closed-form frontal buoyancy field (no discretization):buoyancy_fieldand its exact -derivativedbdy_frontal, andthermal_wind_u, the exact vertical integral of the thermal-wind relation. The buoyancy front’s sign reverses at (an idealized tropopause), so has an extremum there at every — the geostrophic jet core sits where the meridional buoyancy gradient changes sign.
PV inversion & staircases (barotropic, - or -plane)
| Symbol | Meaning | Convention |
|---|---|---|
| (absolute) potential vorticity | material conservation: |
The invertibility principle. Given everywhere, a balance condition (, i.e. nondivergent flow), and boundary conditions (here: periodic), — and hence — is uniquely determined:
psi_hat = grid.invert_laplacian(zeta_hat)with .gfdlib.pv.gaussian_blobplaces a periodic-safe PV anomaly at a point;gfdlib.pv.staircase_pvbuilds an idealized alternating-band PV staircase (a smoothed square wave in ). Inverting a staircase shows the jet cores ( extrema) sit exactly at the sharp PV risers between bands, not within the well-mixed plateaus — verified numerically (local at each jet core is 20 the domain-mean ).
Barotropic instability (Rayleigh-Kuo)
| Symbol | Meaning | Convention |
|---|---|---|
| basic-state zonal flow | channel, rigid walls | |
| complex phase speed of a normal mode | unstable iff |
Rayleigh-Kuo equation: — derived independently in this repo (not copied from a text) and checked against the classical form at (Drazin & Reid). A necessary condition for instability is that changes sign somewhere in the domain (Rayleigh’s inflection-point criterion, generalized to a -plane by Kuo).
gfdlib.instability.growth_ratesolves this as a generalized eigenvalue problem , rewritten (no SciPy needed) and diagonalized with plainnumpy.linalg.eigvals. Verified: a profile with no inflection point gives exactly zero growth at every tested; the classical shear layer’s growth rate peaks at , matching the published value (Michalke 1964, ) to within grid resolution.gfdlib.instability.double_shear_layerbuilds the periodic nonlinear initial condition; its evolution reusesspectral.Gridandtimestep.ifrk4_stepunchanged from ch18.
Shallow water (linearized, beta-plane)
| Symbol | Meaning | Convention |
|---|---|---|
| mean layer depth | ||
| free-surface height anomaly | positive = raised surface | |
| gravity-wave speed | ||
| Rossby deformation radius | length scale |
Nondimensionalized by (length), (time), (height, so , ), with , :
Linear PV anomaly (with from the same
) obeys : exactly conserved pointwise on
the -plane (). gfdlib.shallowwater.potential_vorticity
computes it; gfdlib.shallowwater.invert_pv inverts
for the geostrophically balanced height field carrying that PV.
Single-layer QG (barotropic PV + deformation-radius stretching)
| Symbol | Meaning | Convention |
|---|---|---|
| quasi-geostrophic PV ( nondim to 1) | material conservation: |
QGPV inversion reuses the shallow-water Helmholtz solve. With nondimensionalized to 1, is the same operator as the shallow-water PV inversion above —
gfdlib.shallowwater. invert_pvcomputes from the QGPV anomaly directly; no separate QG inversion primitive exists or is needed. The linear Rossby-wave part of the evolution operator changes accordingly:gfdlib.qg.dispersion_omegagives , bounded by (attained at ) — unlike the unbounded barotropic relation in ch18, the deformation radius screens the lowest wavenumbers. An isolated vortex (gfdlib.pv.gaussian_blob) on this operator sheds a trailing Rossby-wave wake and drifts westward — verified numerically.
Baroclinic instability (Eady; 2-layer/Phillips)
| Symbol | Meaning | Convention |
|---|---|---|
| Eady nondimensional horizontal wavenumber | growth rate | |
| layer coupling (“stretching”) parameter, 2-layer model | ||
| upper/lower layer mean flow | drives the instability | |
| bottom Ekman drag coefficient | acts on layer 2’s relative vorticity only |
Both growth-rate problems are solved as small eigenvalue problems derived here, not copied from a closed-form formula.
gfdlib. baroclinic.eady_growth_ratematches the boundary-value problem’s interior solution to the linearized thermal boundary condition at ; verified against the published benchmark (, , cutoff ; Vallis/Pedlosky) to within grid resolution.gfdlib.baroclinic.invert_2layeris the 2-layer QGPV Helmholtz solve (closed-form inverse);rhs_2layeris spectral-space, for use as the nonlinear RHS ingfdlib.timestep.ifrk4_stepwith hyperviscosity as the (scalar, both-layers-identical) linear operator — the mean-flow and terms stay in the nonlinear part since they couple the two layers ( per wavenumber, not a scalar). Cross-checked against an independently-derived linear eigenvalue: a small-amplitude single-wavenumber perturbation’s measured growth rate converges to the predicted value to once the mode purifies (a coincidental choice of parameters that placed an integer wavenumber exactly at the marginal-stability cutoff was caught and avoided during this check).A fixed mean shear with no drag is an unlimited energy source. Nonlinearly,
rhs_2layerwithout Ekman drag () was found to grow without bound regardless of how much hyperviscosity was added — energy conservation was verified exact for the pure nonlinear (Jacobian) terms in isolation, so the runaway traced to the mean-flow/ terms having no saturating mechanism, not a sign error. Adding bottom drag on the lower layer’s relative vorticity (r>0, the standard ingredient in Phillips’ original 1954 model) produces the expected life cycle — exponential growth, a peak, decay, and equilibration — confirmed by a multi-hundred-time-unit run at the notebook’s actual resolution.Barotropic/baroclinic mode decomposition (ch. 10). , decouple the two-layer PV equations EXACTLY: summing/differencing , cancels the terms in the sum and doubles them in the difference, giving (exactly ch. 7/18’s barotropic PV, no at all) and (exactly ch. 8’s single-layer QGPV, with deformation parameter ).
gfdlib.baroclinic. to_modes/from_modesimplement the (trivial, linear) change of variables;pv_2layeris the forward operator (exact inverse ofinvert_2layer). Verified directly, not just asserted from the algebra:to_modesapplied topv_2layer’s output matches the two decoupled single-layer operators to . The decoupling holds only for the LINEAR operator — the Jacobian nonlinearity inrhs_2layerstill couples the two modes, which is exactly what ch. 10’s notebook demonstrates (a disturbance seeded purely in measurably leaks barotropic KE through nonlinear self-advection alone).
Symmetric, inertial & Kelvin-Helmholtz instability (survey)
| Symbol | Meaning | Convention |
|---|---|---|
| cross-front Rossby number | = absolute vertical vorticity | |
| gradient Richardson number | thermal-wind shear (symmetric); imposed shear (KH) | |
| Hazel (1972) profile’s bulk/minimum Richardson number | , |
Symmetric & inertial instability: one Ertel-PV sign criterion. For a zonal thermal-wind front,
gfdlib.symmetricderives (not looks up) the Ertel PV and shows the front is unstable to slantwise (symmetric) displacements iff , i.e. . Two independently-checkable limits confirm the sign convention: at the marginal curve reduces to the textbook value ; for (absolute vorticity changes sign) the front is unconditionally unstable at every — pure inertial instability, no stratification dependence.gfdlib.symmetric.classifylabels any point stable / symmetric / inertial / gravitational () for the Ri-Ro stability map.Kelvin-Helmholtz: the Taylor-Goldstein equation, and a real numerical pitfall caught along the way.
gfdlib.instability. taylor_goldstein_growth_ratesolves as a natively linear generalized eigenvalue problem (keeping the buoyancy perturbation as an independent unknown rather than eliminating it via division by , which gives a mathematically equivalent but quadratic-in- pencil). At this reduces exactly (to ) togfdlib.instability.growth_rate— a strong internal cross-check, not an external one. For the classic Hazel (1972) profile, growth was initially found NOT to vanish cleanly above the rigorous Miles-Howard threshold — a hard theorem violation is impossible, so this was root-caused, not dismissed: the spurious growth scaled with grid spacing alone (matched across different and domain sizes gave matched spurious magnitude) and shrank as , confirming genuine 2nd-order truncation error — worst exactly at the delicate point, where the equation’s critical-layer indicial roots coalesce, a classically hard point for finite differences (professional codes use spectral methods here). Fixed by tightening the domain/resolution and applying a documented noise floor calibrated to this investigation (_TG_NOISE_FLOOR); the resulting curve decreases smoothly and reaches zero by , correctly reproducing the theorem’s qualitative Ri cutoff (not a knife-edge at exactly , an honest limitation of a simple solver on this classically delicate problem).gfdlib.instability.hazel_profilebuilds for this test case.
Rossby-wave ray tracing (sphere, WKB)
| Symbol | Meaning | Convention |
|---|---|---|
| longitude, latitude | ||
| zonal/meridional wavenumber indices, conjugate to | physical wavenumbers | |
| background solid-body rotation rate (added to ) |
Great circles are a theorem here, not a plotting choice. For a background flow , both and the meridional gradient of absolute vorticity scale by — the same factor — so the stationary wavenumber is independent of latitude, and Hamilton’s ray equations (
gfdlib.rossby.ray_rhs, via central differences ofdispersion_omega— deliberately not hand-derived symbolically) integrate to exact great circles:great_circle_deviationchecks this directly (fit the plane through the ray’s first two sampled points on the unit sphere, then check every later point lies in it) and finds deviations at the level, i.e. floating-point roundoff, not approximation error.
Rayleigh-Benard convection (vertical – channel)
| Symbol | Meaning | Convention |
|---|---|---|
| channel streamfunction | ||
| vorticity | ; same sign as the horizontal case above | |
| temperature deviation from the linear conduction profile | ||
| critical Rayleigh number (free-slip, both boundaries) | onset at |
A genuine bug to avoid re-introducing. With , vorticity is — the same sign as the horizontal streamfunction convention above, not . Getting this backward flips the sign of the buoyancy-vorticity feedback and the instability never grows at any : verified numerically (see ch14 PR) that the wrong sign gives pure decay for all , while the correct sign reproduces subcritical decay () and supercritical growth into finite-amplitude convection () as expected.
gfdlib.convection.ChannelGrid(periodic , Dirichlet ) andrhs_boussinesqimplement the corrected convention;lorenz_rhsis the truncation, sharinggfdlib.timestep.rk4with every other chapter.
Buoyancy-driven overturning (abyssal recipes; horizontal convection)
| Symbol | Meaning | Convention |
|---|---|---|
| upwelling velocity (Munk’s abyssal-recipe balance) | positive = upward | |
| diapycnal diffusivity | boundary-layer thickness | |
| differential surface heating | , warm at , cool at |
Munk’s (1966) abyssal recipe is solved exactly (
gfdlib.overturning. abyssal_profile): a linear 2nd-order ODE with constant coefficients, general solution , with fixed by the two BCs via anumpy.linalg.solve. Large sweeps the bottom value through most of the water column, compressing the transition to the surface value into a thin layer near — the real ocean’s near-uniform abyssal temperature capped by a thin thermocline; verified numerically, not just plotted, against both this limit and the pure-diffusion (linear) profile.The overturning cell reuses ch14’s Boussinesq machinery unchanged.
gfdlib.overturning.rhs_overturninghas the exact same structure asconvection.rhs_boussinesq, but replaces the fixed background- stratification advection term (, uniform bottom heating) with an explicit, horizontally-varying heating field (gfdlib.overturning.surface_heating) — warm at one end of the (periodic) domain, cool at the other, concentrated near the surface. This is Rossby’s (1965) “horizontal convection” mechanism: differential heating along a boundary organizes into a single overturning cell (rising at the heated column, sinking at the cooled one) rather than the many small convective rolls of uniform bottom heating — verified directly, not just asserted: the vertical velocity comes out positive under the heated column and negative under the cooled one in every run tested.
Internal gravity waves (vertical – plane)
| Symbol | Meaning | Convention |
|---|---|---|
| vertical-plane streamfunction | ||
| as above, but in the plane | ||
| wavevector angle from vertical | ; equals the energy beam’s angle from horizontal |
A different than the horizontal chapters. This sign convention is for a vertical plane and is unrelated to the horizontal streamfunction above — the two never appear in the same notebook.
gfdlib.internalwavesreusesspectral.Gridwith its -axis standing in for ;dispersion_omega/beam_anglegive and ;step_leapfrogintegrates the equation and accepts a -dependent directly (no assumption of constant stratification). Nondimensionalized by a reference buoyancy frequency (time) and the domain width (length): .
Eddy transport & mixing (passive tracer in 2D turbulence)
| Symbol | Meaning | Convention |
|---|---|---|
| imposed mean tracer gradient | , periodic | |
| effective (eddy) diffusivity | domain average; = down-gradient |
The mean-gradient trick. A passive tracer with an unbounded mean gradient is handled the same way ch16/ch18 handle a mean shear or : split into an imposed linear part and a periodic perturbation , so
gfdlib.mixing.rhs_coupledcan evolve on the same doubly- periodicspectral.Gridas the vorticity that stirs it, with the mean gradient appearing as an ordinary source term (the tracer is passive: it’s advected by, but does not feed back on, the vorticity).is intrinsically -independent — verified, not assumed. The equation is linear in , so for a fixed flow realization and must be exactly independent of . Checked numerically: two runs on the identical vorticity history with differing by a factor of 2 give agreeing to machine precision (relative difference ), and a control run with the velocity field identically zero gives exactly (no possible eddy flux without a flow). For freely- decaying 2D turbulence, comes out positive (down-gradient) and of the same order as a mixing-length estimate (domain scale) — a real emergent result of the simulation, not tuned to match.
Wind-driven circulation (Stommel; Munk)
| Symbol | Meaning | Convention |
|---|---|---|
| Stommel nondimensional bottom-drag parameter | boundary layer width | |
| Munk nondimensional lateral-friction parameter | boundary layer width | |
| west-east profile, | always; too for Munk (no-slip) |
A genuinely new domain shape. Every earlier chapter’s domain was doubly-periodic or a channel with two boundaries; this is the first bounded rectangular basin, four walls.
gfdlib.circulationsolves the Stommel and Munk gyre problems two independent ways: an exact analytic solution (separating reduces the PDE to a linear ODE for with constant coefficients, solved via its characteristic polynomial’s roots — quadratic formula for Stommel,numpy.rootsfor Munk’s quartic — and a smallnumpy.linalg.solvefor the boundary constants), and a general 2D finite-difference direct solve (Kronecker- sum operators,numpy.linalg.solve, no SciPy) that works for arbitrary forcing, cross-validated against the analytic solution with clean 2nd-order convergence (gfdlibtests).Munk’s biharmonic operator is handled by keeping as an independent field (the same pattern as ch16/17/19’s coupled states) rather than a hand-derived 4th-order stencil, closed with Thom’s (1933) wall-vorticity formula (derived by Taylor-expanding from a wall) for no-slip on the east/west walls, with free-slip (, no correction needed) on the north/south walls — the standard textbook simplification that keeps the problem separable.
A real bug, caught by a convergence test, not an eyeball check. An earlier version enforced no-slip on all four walls (matching physical intuition, but not the separable-solution assumption). It disagreed with the exact analytic solution by a stubborn — but critically, that error did not shrink with grid refinement at any boundary-layer width tested (0.08 to 0.4), immediately distinguishing a genuine discretization error (which must vanish as ) from a boundary-condition mismatch (which does not). The fix — free-slip on north/south, matching the classical Pedlosky/Vallis treatment — restored clean 2nd-order convergence.
Kinematics: strain, vorticity & the Okubo-Weiss parameter
| Symbol | Meaning | Convention |
|---|---|---|
| normal strain | ||
| shear strain | ||
| Okubo-Weiss parameter | vorticity-dominated, strain-dominated |
A steady strain + smooth vortex, differentiated by finite differences, not by hand.
gfdlib.kinematics.velocity_fieldis a Lamb-Oseen-like vortex superposed on uniform strain (both individually divergence-free);okubo_weissgets from central differences of that velocity field, the same safety patterngfdlib.rossbyuses for its ray equations (correctness then rests only onvelocity_fielditself, not on a hand-differentiated closed form for the smoothed vortex profile). Verified against two independently-derivable limits: with the flow is exactly linear strain, so central differences are exact (W=4\alpha^2to floating-point precision, any ); at the vortex center with the flow is locally solid-body rotation with zero strain, so with from the vortex’s small- Taylor expansion.
Inertial oscillations & the Taylor-Proudman limit
| Symbol | Meaning | Convention |
|---|---|---|
| complex velocity | on an unforced -plane | |
| inertial period |
Taylor-Proudman is not a separate solver — it is in Ch. 5’s thermal wind.
gfdlib.rotationhandles only the inertial-oscillation half (inertial_rhsfor RK4 integration,inertial_trajectoryfor the closed-form circle , radius , period ); the Taylor-Proudman half of ch03 reusesgfdlib.balance.thermal_wind_udirectly with the buoyancy contrast swept to zero, since requires no new code, only a new reading of code that already existed. Verified: the numerically RK4-integrated trajectory matchesinertial_trajectoryto ; the closed-form trajectory’s radius and speed are exactly constant (a genuine circle) to ; the thermal-wind shear range is exactly linear in (inherited directly fromthermal_wind_u’s own linearity — no fitting).
Vertical normal modes (Sturm-Liouville, rigid lid)
| Symbol | Meaning | Convention |
|---|---|---|
| -th vertical mode shape | ; normalized | |
| -th mode speed | the -th deformation radius |
The equation is — no in the eigenvalue problem itself. Derived from scratch (separate the linear hydrostatic equations in , track ’s structure through continuity, tie it back to through the buoyancy equation) and checked twice: for constant , , solves it exactly by direct substitution (no anywhere), and mode (const) is trivially a solution with — the CONTINUOUS analog of
gfdlib.baroclinic’s barotropic mode, no deformation-radius constraint at all.A real, instructive bug: equal-weight ghost points broke matrix symmetry. A first implementation of
gfdlib.stratification. vertical_modesused naive ghost-point differencing for the Neumann BCs; it gave eigenvalues that LOOKED nearly correct (within 0.3% of the constant- benchmark) but mode SHAPES that were badly, visibly wrong once plotted (values 100x too large in the interior) — because the boundary row’s coefficient came out exactly double its neighboring interior row’s reference to it, making the matrix asymmetric andnumpy.linalg.eighinvalid on it (silently:eighdoesn’t check symmetry, it just uses the lower/upper triangle and returns garbage for the rest). Fixed with the standard finite-VOLUME treatment (half-cell control volumes at the two boundaries) symmetrized via a diagonal congruence transform before callingeigh— verified: mode shapes now match the exact constant- cosines to , not just the eigenvalues to a few tenths of a percent. The lesson generalizes: for any self-adjoint eigenvalue problem, checking eigenVALUES against a benchmark is not sufficient — check eigenVECTORS too.
Wave-mean-flow interaction (Stokes drift; Rossby critical layers)
| Symbol | Meaning | Convention |
|---|---|---|
| Stokes drift of | positive = with phase propagation | |
| critical layer | , the Doppler-shifted phase speed |
Stokes drift is not a separate force — it’s evaluating at the parcel’s true position instead of its mean one.
gfdlib.wavemean. stokes_driftis derived from scratch in three lines (displacement , then ) and verified two ways: against direct RK4 particle advection inwave_velocity(Ch. 1’s machinery, now genuinely time-dependent) sampled stroboscopically once per period, and by sign (positive for same sign — with phase propagation, matching the classical surface-wave result).Rossby-wave critical layers extend ch. 9’s ray tracing to a Doppler-shifted medium.
gfdlib.wavemean.rossby_shear_dispersionadds a background shear to the barotropic dispersion relation;ray_rhs_shearis its EXACT symbolic ray-equation derivative (safe to hand-differentiate here, unlike ch. 9’s central-difference approach, since the formula is simple). Verified directly by integration, not just asserted from the algebra: stays conserved along the ray to even as and both change substantially; the ray approaches but never crosses the analytically-predicted critical layer (linear-shear case), with and the meridional group velocity as it does — the mathematical signature of a genuine singularity in linear ray theory, not a numerical artifact.
Point vortices (Kirchhoff Hamiltonian system)
| Symbol | Meaning | Convention |
|---|---|---|
| circulation of vortex | signed | |
| interaction Hamiltonian | , | |
| , , | Noether charges of translation & rotation |
Positions are the conjugate pair — phase space is physical space.
gfdlib.vorteximplements the mutual Biot-Savart RHS, the Hamiltonian and invariants, the symplectic implicit-midpoint step (step_midpoint, fixed-point iteration — leapfrog is unavailable because Kirchhoff’s is non-separable) and a same-order non-symplectic control (step_heun). Verified against exact solutions: co-rotating pair period to and dipole speed to (both derived by hand, not fitted). The chapter’s punchline is a measured fact, not an assertion: over a 20,000-step chaotic 4-vortex run at the same , Heun’s energy error drifts secularly to while midpoint’s stays bounded at (tests enforce a 30x separation). Finer structure verified too: linear invariants are conserved to machine precision by EVERY Runge-Kutta method, while the quadratic drifts under RK4 () but is exact under implicit midpoint (a Gauss method) up to the fixed-point iteration tolerance — at 12 sweeps, measured.
Wave activity & non-acceleration (barotropic)
| Symbol | Meaning | Convention |
|---|---|---|
| small-amplitude pseudomomentum density | = deviation from zonal mean; | |
| non-acceleration | conservative, small-amplitude waves; pointwise in |
The theorem is three one-line derivations chained (linearized PV conservation ; the Taylor identity ; the zonal-mean momentum equation ) — see ch. 23.
gfdlib.wavemean.wave_activitycomputes from a vorticity snapshot; requires bounded away from zero (design experiments with ). Verified against the FULL nonlinear solver, not the linear theory it comes from: a small packet on shear produces and each that cancel to of themselves, pointwise in (0.5% measured at , ; the residual is the expected correction, and switching on hyperviscosity breaks the cancellation for the stated physical reason — dissipation destroys pseudomomentum without repaying the mean flow).
Slow manifold & balanced initialization (shallow water)
| Symbol | Meaning | Convention |
|---|---|---|
| horizontal divergence | slow (geostrophic) mode: ; IG waves are made of it | |
| balance fraction of initial winds |
RMS divergence meters the distance from the slow manifold.
gfdlib.shallowwater.divergenceis the one-line spectral diagnostic; verified against an analytic case to and exactly zero (to ) on a geostrophically balanced state. Ch. 24’s measured facts: a fully balanced initialization holds RMS at machine zero for the whole run (the linear slow subspace is exactly invariant on the -plane); partial balance rings with amplitude exactly (measured: gives precisely half the ringing — linearity, not coincidence); and pointwise PV drift is at machine precision in every run regardless of — balance is entirely about not exciting the fast modes; the slow (PV) content was never at risk.
Dimensionless numbers
| Number | Definition | Regime |
|---|---|---|
| Rossby | rotation-dominated | |
| Burger | balance vs. wave scale | |
| Ekman | friction vs. rotation | |
| Froude | stratification | |
| Rayleigh | convective onset | |
| Reynolds | inertia vs. viscosity | |
| Richardson | shear stability |
gfdlib.scalingturns the table above into testable functions (rossby_number,ekman_number,froude_number,reynolds_number,burger_number,deformation_radius,coriolis_parameter) plus a coarse three-regionclassify_regime(Ro, Bu)used by ch04’s regime map: unbalanced; () QG-baroclinic (Ch. 16 territory); () QG-barotropic (Taylor-Proudman-like, Ch. 3/18 territory). A pedagogical simplification of the classical Ro-Bu regime diagram — real transitions are smooth, not the sharp lines drawn on the map — but the two boundaries (, ) are exactly the numbers' own definitions, not fitted thresholds.