Spectral Filtering Accuracy
PyStormTracker supports multiple backends for spherical harmonic transforms (SHT) used in spectral filtering and kinematic derivative calculations. The choice of engine can be controlled via the sht_engine parameter in the Python API.
Methodology
Accuracy is evaluated using Root Mean Square Error (RMSE), Relative Error, and Pearson Correlation Coefficient for ERA5 Mean Sea Level Pressure (MSL) and Wind (U/V) data.
Two spatial resolutions are tested:
2.5°x2.5°: A low-resolution grid (73x144) where T42 truncation (requiring ~85 latitudes) results in aliasing.
0.25°x0.25°: A high-resolution grid (721x1440) where T42 truncation is alias-free.
SHT Engines
1. ducc0 (Default)
ducc0 is the standard backend for PyStormTracker. It is a high-performance C++ library that provides excellent multi-frame performance and bit-wise parity with modern SHT implementations.
Pros: Extremely fast, robust, and handles aliased coarse grids gracefully. No external C dependencies (self-contained).
Cons: Slightly less accurate than specialized legacy libraries like SHTns on specific high-resolution scalar fields.
2. SHTns (Legacy Reference)
SHTns was the primary backend in earlier versions. While no longer the default, its performance metrics serve as a high-precision benchmark for scalar filtering.
Pros: Exceptional accuracy on high-resolution alias-free grids for scalar fields.
Cons: Slower than
ducc0for multi-frame workloads. Requires complex external C compilation. Significant numerical discrepancy (~10⁻⁶ RMSE) in kinematic derivative calculations compared toSpherepack(NCL).
Accuracy & Performance Metrics
Spectral Filtering (MSL)
Cross-Engine Accuracy (vs NCL Reference)
Resolution: 2.5°x2.5° (ERA5) Note: Higher error in this resolution is primarily due to aliasing on the coarse grid.
Engine |
Truncation |
RMSE (Pa) |
Rel. Error |
Correlation |
Time (s) |
|---|---|---|---|---|---|
SHTns |
T5-42 |
0.45711949 |
6.40e-04 |
0.999999897272 |
0.0350 |
ducc0 |
T5-42 |
0.05266872 |
7.37e-05 |
0.999999998663 |
0.0030 |
SHTns |
T0-42 |
0.45729944 |
4.53e-06 |
0.999999918845 |
0.0009 |
ducc0 |
T0-42 |
0.05369308 |
5.31e-07 |
0.999999998880 |
0.0019 |
Resolution: 0.25°x0.25° (ERA5) Note: This resolution satisfies the sampling theorem for T42, resulting in near-perfect parity.
Engine |
Truncation |
RMSE (Pa) |
Rel. Error |
Correlation |
Time (s) |
|---|---|---|---|---|---|
SHTns |
T5-42 |
0.00003643 |
5.16e-08 |
1.000000000000 |
0.0665 |
ducc0 |
T5-42 |
0.01276583 |
1.81e-05 |
0.999999999928 |
0.0041 |
SHTns |
T0-42 |
0.00486497 |
4.81e-08 |
0.999999999994 |
0.0141 |
ducc0 |
T0-42 |
0.02114745 |
2.09e-07 |
0.999999999831 |
0.0038 |
Kinematic Derivatives (Vorticity & Divergence)
Evaluated on 0.25°x0.25° ERA5 grid. Comparison against NCL uv2vrdvF reference.
Engine |
Variable |
RMSE (s⁻¹) |
Correlation |
Time (s) |
|---|---|---|---|---|
SHTns |
Vorticity |
9.05e-06 |
0.9899 |
0.1017 |
ducc0 |
Vorticity |
1.74e-14 |
1.0000 |
0.0576 |
Impact of Polar Optimization (SHTns)
For high-resolution grids (0.25°), disabling the polar optimization threshold (polar_opt=0.0) ensures maximum precision. A comparison with the default setting (1e-10) shows:
Accuracy: RMSE difference is negligible (~10⁻¹⁵ Pa).
Performance: The default setting is approximately 1.25% faster.
Disabling the optimization is recommended for cases where strict bit-wise parity with double-precision ground truth is required.
Summary
For standard storm tracking applications, all engines are scientifically equivalent. ducc0 is the recommended default for its balance of speed, robustness, and ease of installation. It also provides the highest parity with legacy Spherepack references for kinematics. SHTns (with polar_opt=0.0) remains a high-precision benchmark for scalar fields, though it was passed over as the primary engine due to its numerical discrepancies in derivative calculations compared to standard meteorological tools.