Repository navigation
Releases: FahrenheitResearch/gpuwm-hex
Release list
gpuwm-hex 0.4.11
gpuwm-hex 0.4.11. Requires gpuwm>=2.9.11,<2.10.
New:
hrrrv5on the 96 -> 3 km zoom globe:gpuwm-hex mesh-plan --global-mesh ... --run --geog ROOT --forecast-arg=--physics-suite=hrrrv5builds NOAA's RRFS start state and the GSL drag statistics itself.--forecast-arg=--physics=config_convection_scheme=cu_grell_freitas_liadds NOAA GSL's scale-aware Grell-Freitas on the GPU as the labelled variant "hrrrv5 + storm scheme", so the coarse cells keep their convective rain (hrrrv5 itself has no cumulus scheme); it fades out on the 3 km cells.gpuwm-hex forecast|global --wind-farms uswtdb|PATHruns Fitch wind-farm drag and turbine TKE inside MYNN on globes and zoom globes, with per-turbine and per-farm power and hub wind in history (opt-in).hrrrv5on any region:gpuwm-hex countryandgpuwm-hex regionalwith--forecast-arg=--physics-suite=hrrrv5start from NOAA's RRFS init (case 7 on the region, case 9 boundaries) from GFS or IFS, on a circle, an ellipse (--ellipse) or a drawn outline (--shape, Shape row or GeoJSON), on one card or several (--samehost-devices 0,1,2,3).
Changed:
- A static built for hrrrv5 reads ERA5's deep-soil temperature (
soiltemp_era5_1deg) instead of NOAA's ISLSCP-Isoiltemp_1deg, whose licence is unclear: about 2 K warmer over land on average (docs/rrfs-init.md).--deep-soil-temperature islscp-iselects NOAA's by name. NOAA's own conus3km static is unchanged. - Simulated radar during a hex forecast reads its radar columns from each committed state, and its backpressure waits follow the radar consumer's real progress, so radar keeps pace with the run.
- Hex products keep pace with a fast forecast: live frames are drawn side by side and converted once, a zoom globe's whole-globe view and its context view are converted at their pictures' pixels (no context tiles unless asked), and the frame cache leaves 10 % of its disk free. A whole globe finer than its picture is drawn on the picture's grid, so its renderer's memory no longer grows with the mesh.
- A zoom globe's
export --window globalis a stack, each region at the detail the model has there (the sphere at the outer spacing, a lat-lon box per ring, the core on its own box with the usual coordinates), andexport --followwrites it beside the forecast.gpuwm-hex regionaldraws each frame as it lands. - Storm-following regions on the MPAS-physics route move about four times faster: the forecast process stays on the card across moves, prepares the next region while the current one runs and hands the state over in memory (about 45 s to about 11 s per move on one RTX 5090). Output is unchanged;
--no-residentkeeps one process per segment.
Fixed:
- GFS starts on the Noah land model (the MPAS-physics default) from cycles after 2026-10-28 no longer stop at init ('soil contract does not cover this analysis date'): the cold-soil contract is keyed on the GFS analysis itself (its model, soil layers and land model, read off the donor file) instead of an end date, so an unchanged GFS keeps the soil remap.
- No case the cold-soil remap cannot serve stops an init any more: a GFS start from a later forecast hour (init-source, regions and moving cases), a land model other than Noah (the ArWen route's Noah-MP, RUC), a missing or late donor, a cycle before GFS v16, a GFS analysis from another land setup, an all-water region and the rest start from the source's interpolated soil, as before 0.4.10, and the init's log and receipt say why.
--soil-remap onrefuses instead. - A limited-area region started from GFS (country and region doors, hourly boundaries) no longer stops at its first boundary hour ('this cold-soil donor row is analysis-only'): only the run's start takes GFS's cold-soil donor, as the regional door already did.
- RRFS v2
hrrrv5forecasts take--stream-input invariant=FILE: a registered input stream the run binds is read once at the start instead of being refused as inactive. - RRFS v2
hrrrv5history draws maps again: its aerosol optical depth (aod550) declares CF units '1', so the converter no longer refuses it. gpuwm-hex country --forecast-arg=--physics-suite=hrrrv5no longer dies as its forecast starts (KeyError 'nscat'), from GFS or IFS.- A physics-resource cache that lost RRFS or MPAS tables (a cleaned disk) fetches them again instead of failing on a missing table file.
- Map titles name the view and the spacing its picture shows ('Core zoom 1-4.1 km', 'Whole globe 1-129 km') instead of the whole mesh's range;
--view-label VIEW=TEXTpasses a caller's own words. - RRFS Grell-Freitas-Li (
cu_grell_freitas_li) runs on the GPU-resident route with no native library: it no longer stops at start ('init_convection for GFL / Tiedtke schemes has no ported path'), at its first step ('cached extent conflict for diag_physics.vcpool') or on its momentum carriers ('sub3d_rucuten_p is not allocated'), and its columns run in wide launches instead of 64 at a time.
engine-bridges-v0.4.11
Pinned assets for gpuwm-hex 0.4.11: rw_ensbatch, rw_igra2, rw_mpas_convert, rw_mpas_geometry, rw_mpas_lbc, rw_mpas_mesh, rw_mpas_rrfs_connectivity, rw_mpas_rrfs_damping, rw_mpas_rrfs_deformation, rw_mpas_static, rw_mpas_stream, rw_s2s, rw_sfc_series, rw_wrfbatch, asset-release-NOTICE.txt, SHA256SUMS.
gpuwm-hex 0.4.10
gpuwm-hex 0.4.10. Requires gpuwm>=2.9.10,<2.10.
New:
- RRFS-MPAS
hrrrv5runs with no native library: its physics runs GPU-resident on the ported fork framework, and its history and diagnostics are written byrw_mpas_streamwith the fork's stream contract. gpuwm-hex init --physics-suite hrrrv5(and every RRFS-MPAS suite) makes the initial condition and hourly boundaries the way RRFS does from GFS: the RRFS fork's init_atmosphere ported to Rust, with RUC's nine soil levels, the L60 grid, TEMPO aerosols, the fork static and the GSL drag statistics. Equal to the fork's own init on every stored value (docs/rrfs-init.md).hrrrv5runs the MPAS commit NOAA's RRFS v2 runs (RRFSx/MPAS-Model 44c0849): a 6 h x1.2562 forecast in strict numerics writes every history and diagnostics word equal to native 44c0849.--physics-pin-set rrfskeeps the previous pin.- RRFS
hrrrv5runs NSSL two-moment microphysics (mp_nssl2m) on the GPU; a 3 km step costs about 1.17x the TEMPO default. - RRFS-SD smoke and dust run on the GPU on the default 44c0849 pin; a 3 km step with real fires costs about 1.12x the same run without smoke.
- RRFS at 3 km steps faster: TEMPO microphysics (176 -> 143 ms of a 3 km step) and the limited-area dycore's stencils and acoustic solve (about 12 % of the step), with every word unchanged in strict numerics.
- The RRFS init engines (
rw_mpas_init_v831,rw_mpas_gsl_oro), which gpuwm 2.9.10 ships in its release bundle rather than its wheel, are staged automatically the first time an RRFS init needs them. - Optional Icechunk output stores native forecast history as atomic Zarr v3 snapshots, locally or on S3 (
--output-format netcdf,icechunkon every forecast door; needs gpuwm 2.9.10, whose writer is fetched on first use).
Changed:
- MPAS-physics history and diagnostics files are written lossless-compressed (NetCDF-4, the same values in a fraction of the disk), compressed on every core by the engine's
rw_mpas_stream. Init, restart and boundary files keep their native format.GPUWM_HISTORY_COMPRESSION=nonewrites them as before. - Regional GFS cold starts (zoom globe, limited area, storm-following) default to correct numerics with the
hrrr-like-aerosolprofile: aerosol-aware Thompson withnwfa2dinitialisation, the corrected MYNN cloud merge, cold-start aerosol emissions, soil moisture mapped by relative wetness and the land carry. Forecasts on those runs change; the step costs about 1.03x the plain suite's. - A hex region driven by a global source (GFS, IFS, GEFS) takes its boundaries from every lead the source posts (GFS hourly, IFS and GEFS 3-hourly) instead of every 6 h, can start at any posted lead, and
--boundary-interval-hourspicks a coarser step. Boundary files are written in parallel. - GEFS member inits and boundaries download only the records the init reads, about 34 MB instead of 106-118 MB per member and lead.
Fixed:
- A local-time-stepping run on MPAS physics records every class step, the coordinator's work between them and the loop's own measured rate in
native-runtime-timings.json; it used to hold only the class that finished last, so most of each step was unlabelled. - A local-time-stepping profile run (
GPUWM_HEX_LTS_DEVICE_SPANS=1) records each class step's device time. The default receipt's per-class rows are host wall, which on one card includes the device work queued ahead of a class, and the receipt now says so. - The zoom-globe receipt (
global-vr-receipt.json) names the physics mode the forecast ran. A run that named a suite but no mode ran correct mode, and the receipt said exact. - A hex run on MPAS-A physics started from HRRR (or any first guess that carries hydrometeors) starts from its cloud, rain, ice, snow and graupel and HRRR's own numbers, as the hrrrv5 route does, instead of from no condensate (no echo at hour zero);
gpuwm-hex init --first-guess-hydrometeors no, and strict numerics, keep MPAS-A v8.4.2 case 7's dry start. Needs gpuwm 2.9.10'srw_mpas_init; an older engine is a named gap. - A hex run started from GFS also starts from GFS's own cloud, rain, ice, snow and graupel (the GFS rows now decode them), instead of from no condensate.
- The hour-zero radar maps of the MPAS-A suites (Thompson microphysics) show the reflectivity of the starting state instead of nothing.
- So does the hour-zero radar map of a mesoscale_reference run (WSM6 microphysics).
- Map subtitles no longer cut a long
--model-labelmid-word: it ends on a whole word with '...', and--labelnames only the files. - Limited-area runs with many tracers on few cards no longer crash in their first step: NOAA's conus3km RRFS domain now runs on 4 x 96 GB cards, with less device memory per card.
- Multi-card runs (same-host rank processes, such as RRFS
hrrrv5on several cards) no longer recompile their GPU kernels in every rank process before the first step: each rank uses the forecast process's warm kernel cache, so step 1 on 4 ranks went from 11.5 s to 2.2 s, with every word unchanged. - Multi-card limited-area runs read only their own rows of each boundary file: every rank process used to read each boundary file whole (13.3 GB a boundary hour on NOAA's conus3km) to keep its share. Each now gathers its rows from the shared page cache, with about 13x less kernel time and a fraction of the host memory per rank, and every word unchanged. Each rank's receipt also splits its CPU time into start-up, first step and stepping, with the kernel time per thread.
- DA cycles on the RRFS hrrrv5 suite accept their own soil state: soil moisture under the RUC land model is bounded by RUC's porosity, not Noah's.
- An MPAS-suite forecast refuses an RRFS init made by another fork pin's producer than its own route's, and the refusal names both ways to fix it.
country --polygongives a drawn region the grown halving ladder, so--fine-dx-mis the spacing it gets, and a large drawn region keeps every side of its grown bands.- Hex starts from HRRR: 10 m wind and 2 m humidity are filled on regional boxes west of Greenwich; HRRR's own cloud, rain and ice numbers and its RUC soil nodes reach the start; the HRRR crop stops at HRRR's edge instead of refusing.
- Hex starts from HRRR with no whole HRRR file on disk download the records their decoder reads (cloud, rain and ice numbers, 2 m humidity and the analysed aerosols) instead of failing at the intermediate stage.
- On the RRFS suites the first history frame carries reflectivity (
refl10cm, its column maximum and the 1 km level) from TEMPO's own operator instead of zeros; the exact mode keeps native MPAS's zero. On a multi-card run it is formed in column slabs (1.3 GB on rank 0's card at any mesh size; it was 8 GB on NOAA's conus3km), not from a whole copy of the global start state beside the first step. - A regional run on the
hrrr-like-aerosoldefault fits a 24 GB card (RTX 4090) where it fits: admission prices it from a measured run on that card instead of refusing it. gpuwm-hex regionalruns RRFShrrrv5end to end (--forecast-arg=--physics-suite=hrrrv5): RUC initial and boundary files, the resolved namelist staged, GSL drag statistics on any mesh, and no uncomputed or empty fields in the default streams; an initial file whose land soil came out at 0 K is refused by name.- Same-host rank processes exchange halos with one socket header per field set instead of one per round, and check the round order in shared memory (output unchanged).
- Region and nest triggers on updraft (
wmax), CAPE (mucape) and 2-5 km updraft helicity (uh25) arm and fire on both physics routes; they were refused at arm, so only reflectivity triggers worked. - Same-host rank processes no longer each hold the whole shared mesh or a second, unused copy of the TEMPO lookup tables, so multi-card runs on large meshes use much less host memory.
- The forecast process of a multi-card run (same-host rank processes) releases the global initial state and the other ranks' inputs once every rank's inputs are cut, instead of holding them for the whole run. Each rank's launch receipt now records its own peak host memory (
max_rss_mib); it used to show the forecast process's memory at launch. GPUWM_HEX_EXCHANGE_TIMING=1records the same-host halo timings on the MPAS physics route too, for rank threads and rank processes; unset, nothing changes.- MPAS physics forecasts no longer wait for the card at the end of every dynamics step: the step check is read at most one step later, before any output, so the host queues the next step while the card works. Output is unchanged.
- An RRFS
hrrrv5run resumed with--restart-fromcontinues the straight run word for word in correct mode, on one card, and on same-host ranks on global meshes. - MPAS-physics runs on same-host rank processes (RRFS
hrrrv5on several cards, global meshes) no longer crash at their first--checkpoint-hourscheckpoint, and each rank now writes its own share of the checkpoint beside the step loop instead of rank 0 gathering and hashing the whole state while every card waits.--restart-fromreads both the sharded and the one-file checkpoints. - A multi-card run whose rank process dies (killed, or out of memory) now stops within seconds with that rank's failure named, instead of hanging until an outer timeout: the other rank processes are stopped at once, and a forecast process that does not stop by itself within 10 s exits with code 1.
- MPAS-physics history files open in netCDF-C again (ncdump, netCDF4-python, xarray, ncview, NCL): the lossless writer no longer puts an empty
_Netcdf4Coordinatesattribute on scalar variables such asisice_lu, which netCDF-C refused with "NetCDF: HDF error". Every value in the file is unchanged. - Limited-area runs on one card on the MPAS physics route (RRFS hrrrv5) take the DA hand-offs: JEDI backgrounds and analyses, checkpoints and restarts with lateral boundaries, and IAU; a restart or an unchanged analysis continues the forecast word for word.
...
kernel-packs-v0.4.10
Pinned kernel packs for gpuwm-hex 0.4.10 (CUDA 12.9, 13.0, 13.2 and 13.4 NVRTC; ArWen and MPAS physics kernels): kernel-pack-cuda12.json, kernel-pack-cuda13.0.json, kernel-pack-cuda13.2.json, kernel-pack-cuda13.json, asset-release-NOTICE.txt, SHA256SUMS.
engine-bridges-v0.4.10
Pinned assets for gpuwm-hex 0.4.10: rw_ensbatch, rw_igra2, rw_mpas_convert, rw_mpas_geometry, rw_mpas_lbc, rw_mpas_mesh, rw_mpas_rrfs_connectivity, rw_mpas_rrfs_damping, rw_mpas_rrfs_deformation, rw_mpas_static, rw_mpas_stream, rw_s2s, rw_sfc_series, rw_wrfbatch, asset-release-NOTICE.txt, SHA256SUMS.
gpuwm-hex 0.4.9
gpuwm-hex 0.4.9. Requires gpuwm>=2.9.7,<2.10.
Fixed
- The s2s door wires its ocean on the MPAS-physics route: a prescribed surface series updates SST and sea ice, and the default prognostic ocean runs MPAS's mixed layer on the GPU.
- Storm rosters on the MPAS-physics route run SPPT and SKEB with local time stepping.
- Plain hex on MPAS physics no longer stops with non-finite columns after weeks: MYNN's lowest-layer pressure thickness can no longer be zero (correct mode). A checkpoint resumes under a changed timestep or a changed correction set.
- Automatic members per card prices MPAS-physics members on their own measured memory, so 30 km globes no longer run out of GPU memory.
- A mid-window start (delayed start) writes the whole initial_time stamp.
- The MPAS-physics pool decode runs on every core, and forecasts use the reader their wheel carries.
- Zoom globes rotate a stored template mesh instead of generating one, and fetch the start source beside the mesh and static.
- Hex init holds its thread pools to the container's CPU quota, and the main thread no longer spins a core waiting on the card.
- Storm-following moves keep one ocean-ice owner, and moved sea points take the role of their carried ice.
- MPAS-route runs keep far less host memory: device views use the framework's own storage.
- Thompson microphysics caps its column workspace at 1.5 GiB per call (
GPUWM_HEX_THOMPSON_WORKSPACE_MIB), so large ranks no longer run a 32 GB card out of memory at the first microphysics step. Output is unchanged. - A bare local-time-stepping run on a refined mesh moves its default step onto the class clock, and two LTS blocks on one card no longer race on a spec upload.
- The observation scorer runs with no card visible, so card leases can be released when the forecast ends.
- MPAS-physics steps do their per-step host bookkeeping off the step thread: a storm-following local-time-stepping run goes from 43.1 to 29.5 s per model hour on one card. Output is unchanged.
- One-card local time stepping shares one work arena across its classes and runs the limiter one species per pass, so a 48/3 km storm-following run fits a 32 GB card.
- A global member that does not fit one card runs over several cards on the same host, and the next pipelined member's host memory is priced per rank.
- The MPAS-physics route applies
--acoustic-substeps,--time-integration-orderand--monotonic. - A bare local-time-stepping run picks its step for the mesh's real coarsest class, so a 96 -> 3 km zoom globe steps 15 s instead of 12.5 s.
- The zoom globe's products pass keeps the column stores the live loop already wrote instead of rewriting them on one core.
- A stalled source download is retried on a new connection after 10 s instead of waiting 300 s.
- Local time stepping picks the fastest class plan for the mesh and runs the plain fixed step where that is faster; on a 96 -> 3 km zoom globe a bare LTS request now runs about 1.2x faster than the fixed step on MPAS physics.
- MPAS-physics local time stepping deposits and assembles its history frames off the class step threads, so the classes no longer wait 1-2 s at every frame.
- MPAS-physics start-up and history output no longer wait on one core: the pool decode, init reads, region preparation and frame encoding run in parallel (a 30 km member over 4 cards starts in 85 s instead of 112 s; output unchanged).
- Zoom-globe, global, regional and country runs give their card back to a card queue when the forecast ends and draw their products on the CPU.
- Local time stepping runs its rate classes on the faster dycore kernels (about 1.2x faster on a 3 km zoom globe).
- A storm-following move no longer stops the run when a member reused from disk is ready but unsafe for the storm, and a case with no safe radius is refused when it is loaded.
- Packaging links the pinned netCDF for every helper, and two exit-drop tests no longer race.
- Kernel packs (
kernel-packs-v0.4.9) carry the corrected MYNN kernel, so a new box does not compile it on first use.
kernel-packs-v0.4.9
Pinned kernel packs for gpuwm-hex 0.4.9 (CUDA 12.9, 13.0 and 13.4 NVRTC; ArWen and MPAS physics kernels): kernel-pack-cuda12.json, kernel-pack-cuda13.0.json, kernel-pack-cuda13.json, asset-release-NOTICE.txt, SHA256SUMS.
gpuwm-hex 0.4.8
gpuwm-hex 0.4.8. Requires gpuwm>=2.9.7,<2.10.
Fixed
- A global ensemble retries a member stage that fails once, and a member that still fails is recorded as missing while the other members finish.
- MPAS-physics runs that update SST, sea ice, greenness and deep soil from a surface series keep that update on the GPU instead of asking for the native MPAS library.
- A test now guards the Grell-Freitas scratch fix from 0.4.6: no GF output may read a workspace word before writing it.
gpuwm-hex 0.4.7
gpuwm-hex 0.4.7. Requires gpuwm>=2.9.7,<2.10.
Fixed
- Storm-following runs no longer refuse a move with "FP32 moving integral cannot meet its conservation tolerance".
- A cycle that is not posted yet is refused naming every address tried (NOAA first) and when it posts; archives that lag are skipped for younger cycles.
- A start file without a 2 m analysis (IFS starts) takes its 2 m fields from the first physics call, so ensemble products no longer fail with "history q2 is not finite".
- A run's exit no longer waits on an idle kernel-compile worker that ignored the stop signal.
gpuwm-hex 0.4.6
gpuwm-hex 0.4.6. Requires gpuwm>=2.9.7,<2.10.
New
- MPAS physics is the default on every door: a run that names no physics runs MPAS-A's
convection_permittingsuite on the GPU. ArWen physics is one flag away:--physics-suite arwen_mpas_column(--physics-row arwenonglobal). - The cycle door takes an MPAS physics forecast as its coarse and parent stream.
- Local time stepping runs on two or more cards with MPAS physics.
- Kernel packs carry the MPAS physics kernels, so a new box starts MPAS physics runs without compiling them.
- Storm- and setup-following runs start from a premade mesh rotated to the storm (
moving templatebuilds one), and the static builder maps geography to global meshes about twice as fast, with identical output.
Fixed
- Storm-following and other MPAS physics runs no longer stop with a non-finite state after a few hours.
- MPAS physics runs with local time stepping no longer fail at the first step on a new box.
- Local time stepping on two or more cards gives the same results as one card, on both physics routes.
forecast --receiptwrites its receipt on the MPAS physics route.