Skip to main content

Rust-powered MetPy-compatible calculation layer with optional GPU acceleration

Project description

metrust

MetPy-compatible calculation layer, powered by Rust.

150/150 metpy.calc functions implemented natively, plus 36 extras. Often faster on real-world workflows. Verified against MetPy on SounderPy, MetPy Cookbook examples, and synthetic global grids.

# The only change: swap the import
from metrust.calc import cape_cin, potential_temperature, vorticity
from metrust.units import units

Installation

pip install metrust

Optional GPU acceleration for supported calculations:

pip install "metrust[gpu]"

For plotting, xarray accessor, or Level2File (forwarded to MetPy):

pip install metrust metpy

What It Does

metrust implements every function in metpy.calc with a Rust backend compiled via PyO3. The Python API now matches MetPy's public metpy.calc signatures and is designed for MetPy-compatible units, return types, and runtime behavior on the shared calculation surface:

import numpy as np
from metrust.calc import (
    cape_cin, parcel_profile, bunkers_storm_motion,
    storm_relative_helicity, significant_tornado_parameter,
    vorticity, divergence, advection,
)
from metrust.units import units

# Sounding analysis (same API as MetPy)
p = np.array([1000, 925, 850, 700, 500, 300]) * units.hPa
T = np.array([25, 20, 15, 5, -15, -40]) * units.degC
Td = np.array([20, 15, 10, -5, -25, -50]) * units.degC

prof = parcel_profile(p, T[0], Td[0])
cape, cin = cape_cin(p, T, Td, prof)  # MetPy parcel_profile form works

# Grid kinematics with xarray (dx/dy inferred from lat/lon coords)
vort = vorticity(u_xarray, v_xarray)  # spherical metric corrections included
div = divergence(u_xarray, v_xarray)

Optional GPU Backend

Current users do not need to change anything. metrust stays on the Rust CPU backend by default.

When met-cu is installed, you can opt in explicitly:

import metrust.calc as mcalc

mcalc.set_backend("gpu")
theta = mcalc.potential_temperature(pressure, temperature)

with mcalc.use_backend("cpu"):
    theta_cpu = mcalc.potential_temperature(pressure, temperature)

The GPU backend currently targets the overlap where met-cu is already strong and verified:

  • potential_temperature
  • equivalent_potential_temperature
  • dewpoint
  • vorticity
  • frontogenesis
  • q_vector
  • compute_cape_cin
  • compute_srh
  • compute_shear
  • compute_pw
  • composite_reflectivity_from_hydrometeors

Eligible dispatch currently focuses on scalar thermo plus uniform 2-D Cartesian grid workloads. Latitude/longitude-derived spacing, map-scale corrections, and other projection-aware cases fall back to the Rust CPU backend.

metrust still returns the same Pint/NumPy-facing API surface. Unsupported cases automatically stay on the Rust CPU path.

Speed

Benchmarked on real-world workflows (v0.3.3, validated by Codex against MetPy):

Workflow Speedup Notes
MetPy Cookbook sounding analysis 6.0x Full severe weather stack
MetPy Cookbook 500 hPa grid 6.1x Vorticity, smoothing, advection
MetPy Cookbook Q-vectors 6.1x Q-vector divergence
SounderPy compute-heavy subset 29.7x Thermo + wind + severe params
MetPy isentropic example 2.3x Isentropic interpolation + Montgomery
Vorticity/divergence (global grid) 2.3x Spherical corrections on 721x1440

Current replay-harness snapshot from benches/bench_workflows.py on Windows 11 / Python 3.13.7: sounding 2.16x, grid diagnostics 8.53x, xarray workflow 1.46x.

Three-Way Benchmark: MetPy vs Rust vs CUDA

Real HRRR model output (40 isobaric levels, 1059 × 1799 grid, ~1.9 M points). RTX 5090, python tests/benchmark_gpu.py.

Scalar Thermodynamics (2D: 1059×1799)

Function MetPy Rust CUDA Rust/MetPy CUDA/Rust
potential_temperature ★ 11.2 ms 13.0 ms 7.9 ms 0.9x 1.6x
equiv_potential_temperature ★ 303.1 ms 16.5 ms 9.1 ms 18x 1.8x
dewpoint ★ 33.6 ms 10.8 ms 8.8 ms 3.1x 1.2x
saturation_vapor_pressure 66.7 ms 8.2 ms 8.1x
saturation_mixing_ratio 78.6 ms 13.7 ms 5.7x
dewpoint_from_rh 110.3 ms 7.6 ms 14x
rh_from_dewpoint 138.7 ms 10.9 ms 13x
virtual_temperature 31.1 ms 19.7 ms 1.6x
mixing_ratio 11.6 ms 8.5 ms 1.4x
wet_bulb_temperature >10 min 26.9 ms

Grid Kinematics (2D: 1059×1799)

Function MetPy Rust CUDA Rust/MetPy CUDA/Rust
vorticity ★ 98.3 ms 92.8 ms 9.3 ms 1.1x 10x
divergence 96.1 ms 91.2 ms 1.1x
frontogenesis ★ 733.0 ms 339.4 ms 12.2 ms 2.2x 28x
q_vector ★ 390.3 ms 310.1 ms 10.8 ms 1.3x 29x
advection 161.8 ms 87.7 ms 1.8x

1D Sounding (40 levels, single column)

Function MetPy Rust Rust/MetPy
parcel_profile 5.5 ms 0.074 ms 74x
cape_cin 1.4 ms 0.254 ms 5.4x
lcl 0.118 ms 0.065 ms 1.8x
lfc 6.7 ms 0.107 ms 62x
el 6.6 ms 0.112 ms 59x
precipitable_water 2.1 ms 0.057 ms 36x

Grid Composites (3D: 40×1059×1799 → 2D) — MetPy has no grid equivalents

Function Rust CUDA CUDA/Rust
compute_cape_cin ★ 2.96 s 674.5 ms 4.4x
compute_srh ★ 223.5 ms 135.8 ms 1.6x
compute_shear ★ 190.4 ms 166.5 ms 1.1x
compute_pw ★ 191.6 ms 107.9 ms 1.8x
composite_refl_hydrometeors ★ 154.2 ms 232.2 ms 0.7x

Summary

MetPy Rust CUDA
Scalar thermo (×10) 785 ms 136 ms 26 ms
Grid kinematics (×5) 1.48 s 921 ms 32 ms
1D sounding (×6) 22 ms 0.67 ms
Grid composites (×5) 3.72 s 1.32 s
★ GPU-eligible total 4.50 s 1.37 s (3.3x)

★ = dispatches to CUDA when set_backend("gpu"). All other functions stay on Rust CPU regardless of backend setting.

Array Throughput

1M elements, 32-core Ryzen, rayon parallel:

Function Time Throughput
potential_temperature 1.8 ms 550 M/s
wet_bulb_temperature 7.3 ms 137 M/s
wind_speed 1.5 ms 660 M/s

Numerical Parity

Verified on the MetPy OUN 2011-05-22 12Z test sounding:

Metric Difference from MetPy
CAPE +4.0 J/kg
MUCAPE +7.6 J/kg
SRH (0-1 km) +0.3 m^2/s^2
Critical angle +0.2 deg
Bunkers RM +0.02 m/s
STP +0.01
Montgomery streamfunction corr 1.0000
Isentropic pressure 7e-13 hPa diff
Vorticity (global lat/lon) corr 1.0000

Uses MetPy-exact physical constants (Rd, Cp, Lv, epsilon), MetPy's CAPE integration formula (g * dTv/Tv * dz), pressure-weighted Bunkers algorithm, Newton solver for isentropic interpolation, and spherical metric tensor corrections for lat/lon grid kinematics.

Coverage

  • 150/150 metpy.calc functions (100% coverage)
  • 36 extras not in MetPy (grid composites, fire weather indices, etc.)
  • 28 Rust array bindings with rayon parallelism and GIL release
  • Pint application registry shared with MetPy (no cross-registry errors)
  • xarray support with coordinate inference and shape preservation

What's Not Native

These forward to MetPy when installed:

  • metrust.plots (matplotlib-based plotting)
  • metrust.xarray (xarray accessor)
  • metrust.io.Level2File (NEXRAD Level II)

Core metrust.calc stays native Rust by default with no required MetPy dependency. The shared calc surface now stays on native metrust implementations even when MetPy is installed. The optional met-cu backend is an explicit accelerator, not a requirement.

End-to-end replay benchmarks for sounding, grid, and xarray workflows live in benches/bench_workflows.py and the published docs page workflow-benchmarks.md.

Examples

See examples/ for complete drop-in demos:

  • cookbook_sounding.py — MetPy Cookbook sounding analysis
  • cookbook_500hpa_grid.py — MetPy Cookbook 500 hPa vorticity advection
  • sounderpy_dropin.py — SounderPy-style full sounding pipeline

Testing

cargo test --workspace          # 1,186 Rust tests
python -m pytest tests/ -q      # 30 Python tests (including MetPy compatibility regression)

Documentation

Full docs at fahrenheitresearch.github.io/metrust-py, including:

  • API reference for all 186 functions
  • Beginner tutorials (Weather 101, soundings, grids, recipes)
  • Migration guide from MetPy
  • Performance benchmarks

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

metrust-0.4.4.tar.gz (1.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

metrust-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

metrust-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

metrust-0.4.4-cp312-cp312-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12Windows x86-64

metrust-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

metrust-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

metrust-0.4.4-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

metrust-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

metrust-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

metrust-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

metrust-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

metrust-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

Details for the file metrust-0.4.4.tar.gz.

File metadata

  • Download URL: metrust-0.4.4.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for metrust-0.4.4.tar.gz
Algorithm Hash digest
SHA256 12382963219f07ce06b4c4f02b9631afe0f401fd109a7113b913510e25f73b88
MD5 71fb2bcebaa81008cca832606164ab8a
BLAKE2b-256 071e83d8ba0b400ea1d0eaacc97d9691810617042f9287101c9f67f09a7703ac

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 832fd27b3fb1c61976d5f426ee94751731ef1a1cde30929b0f6288abafadd4ff
MD5 464ca801b96828ce0474466c0973ba17
BLAKE2b-256 1b7b2ad9879a394746281629677d40ad045d34d36d86add99a33a8cd89d1d55f

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f88492a99e028319191ed9afaa6cf929c57274cdea8504300b7183c344de9b44
MD5 79473c9310840e68ed3bdd88263007d6
BLAKE2b-256 9f3fca33c803a294e81d6ad286948caa363846912850b0229aee0abc0f61cb00

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: metrust-0.4.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for metrust-0.4.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6f3c9c9e1d5c904b558c17e19ca848de11fafc9b4d0f69bcbedba4dec587f14a
MD5 3d00a606e9406207471d874c68f91969
BLAKE2b-256 e758f337e237617b2c0d46fc4ec036b90de5e70e79649a1795bbb50befd31a4f

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 94330480f4295ada20b1db66cc5fc58df96bf663d07930b56372040cb5a8092a
MD5 78724ead81b21b961c1a2d7842eff1d0
BLAKE2b-256 19bd07d76c34a4dbb51a95256774729fa3d89f7796b124adc7dedfaad4bb1be8

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d230496e636365acda65dd1c584189c7fec4eba8a158e337228205dd2c867cfd
MD5 6a7e8c191d83cb9014ebae744b9a22a8
BLAKE2b-256 1c98b9566a76317cd16c38f2843332abc14056c49fea2b349cda3a42fbf5d05d

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 78b4f7c8c003f0a724c106b7e24a8b0a8ec7698aea8f43872fd565add5eccd70
MD5 881ccd1abf46d4a954a605d7a6b62fae
BLAKE2b-256 e8d47ed279d46dd5918bfd20125f16e2ed94b625af7b469d7c75d79d81436a00

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d590f63255c42e6bed25bef57f39a5eaebb1409d6bc439409376e1c54a7932df
MD5 8846df94a3c10a3aaf6c8ff551ac44c3
BLAKE2b-256 1d8c8f77edf075edecb172859538e5e8212193773efd5227725fcc929c53dfb7

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4bf851895afb56c98a820f54f164fead8bf03a869e1dc4ff19fb47ad29508e23
MD5 cc0fbd0279f500a7caddb11d2b76e4a5
BLAKE2b-256 a2b344e6e4f6ebba6ebd420277ad8ec6b5ebd7241725478cd2fca65a0315526e

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f7d83b9d3402ab3a9770608cf283c2822a8788e0207808a840305a1844434b45
MD5 9d7ea7cdfb07392715a3042cde2731d2
BLAKE2b-256 02d6a41c595dd6872a9ecaeaff9ae8e03b8c8ae60d9ad1eac599f4993b69f41b

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e0e413654ba3e34a5a169c18b0b19674f57fcd23812c572a662b273515964edb
MD5 88bcfc5dbac89c26f5828ba5464311e5
BLAKE2b-256 63799a7f494b2d6efb514ea2500d727faacd84d82eddaa9a76df4b3954e121a1

See more details on using hashes here.

File details

Details for the file metrust-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for metrust-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 25035768651c8111f430eb7b17465666d5b9f3d783350fa1f7a76dae3f732930
MD5 b4ff4bba66adb9403072d963db3eaa9c
BLAKE2b-256 c198d04942f3b38c7cfe2ba6d49203d0ff882f09063028fe089bb9283c159594

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page