Skip to content

ArWen 2.8.1

Choose a tag to compare

@FahrenheitResearch FahrenheitResearch released this 01 Oct 23:36
· 18 commits to main since this release

ArWen 2.8.1 is a feature and fix release that adds WRF's urban physics, starts forecasts while their source data is still posting, and runs physics faster with byte-identical output.

New

  • sf_urban_physics = 1, 2 or 3 runs WRF's single-layer urban canopy (under Noah or Noah-MP), its multi-layer BEP model (with YSU or MYJ; under YSU the surface drag outside the city is applied once, where WRF applies it twice), or BEP with its building energy model. The high-resolution land cover keeps its urban classes (Local Climate Zones or NLCD), and under the single-layer canopy a grid whose first level sits inside the canopy is refused when the config loads. Off by default.
  • sf_surface_mosaic = 1 runs Noah's mosaic land-use tiles in each cell, matching WRF v4.7.1 apart from three WRF defects it does not copy; mosaic_urban_canopy = "every_tile" also runs the urban canopy in the town tiles of mostly rural cells. Off by default.
  • The UW moist-turbulence boundary layer (bl_pbl_physics = 9) runs on the card and imports from WRF namelists.
  • [shared] zadvect_implicit = 1 runs WRF's implicit-explicit vertical advection with its w_crit_cfl, matching WRF v4.7.1 on column checks apart from two corrected boundary terms that keep a steep ridge from going NaN. Off by default; answers change.
  • [shared] adaptive_nest_lattice = true picks the adaptive root step with the fewest nest cell-steps: 6% faster on a three-domain 250 m tree; answers change. Off by default.
  • A domain's terrain can stay unsmoothed or take any WPS GEOGRID.TBL smoother (gpuwm domain --terrain-smoothing), and smooth_precision = "wps-float32" makes the default smoothing match geogrid.exe exactly.
  • WRF namelists with history_begin, history_end, smooth_cg_topo, topo_shading or slope_rad import and run, and an import names every unsupported key at once.
  • Physics runs faster with byte-identical output. Per call: legacy RRTMG 7x, RUC 7 to 22x, Noah-MP 5.8x, MYNN 4.5x, NSSL 1.9 to 3.1x, P3 1.5 to 2.2x, RTE-RRTMGP 1.6x, Thompson 1.3 to 1.6x, Morrison 1.2 to 1.5x, and Milbrandt-Yau, KF, New Tiedtke, Shin-Hong and GF 1.1 to 1.5x.
  • Source decoding uses every core: a 48 h HRRR decode on 24 cores took 140 s instead of 480 s, with prepared arrays unchanged. --preprocess-workers sets the count.
  • More forecasts start before all their inputs are ready, with identical output: gpuwm go on a GFS single domain forecasts from a cycle's first posted hours, a GFS tree prepares as its leads post, and a single native hrrr domain and trees from native hrrr, hrrr-prs, other mapped sources and GFS, storm-following ones included, prepare the start and nests first and then one boundary interval at a time, the forecast waiting for any interval not yet ready.
  • gpuwm fetch takes each lead as soon as a host has it and exits 75 for a lead past its late time. latest needs only a cycle's first leads (--whole-cycle keeps the old rule), --readiness says whether a run can start, gpuwm go --cycle names the cycle, and gpuwm sources shows each source's posting shape and lateness budget.
  • gpuwm run --preprocess-backend pins where a config run's root prepares, so runs compared on a busy card share one preparation.

Fixed

  • A forecast too big for the card is refused before anything is allocated, naming the memory needed and free, by single-domain gpuwm run, gpuwm downscale, the prepared and tree runners and the cache, wrfinput and idealized loaders as by gpuwm go. A gpuwm run tree with no [tiles] is checked before downloading, and a late or mid-run nest before it is built, instead of ending in a CUDA out-of-memory error. --no-memory-gate skips the check.
  • Memory estimates are corrected: headroom is counted once with a measured 1.13x margin; a gpuwm run preparation on the card is priced at 1.25x its arrays, not 1.20x (a 12 km ERA5 run on an RTX 5070 Ti reserved 3.91 GB against 3.85 GB); New forecast and the assistant price MYNN's workspace from the selected card; a DA cycle counts each analysis and its cuFFT work areas, now released after each draw.
  • gpuwm cycle --parent-kind mpas-cuda refuses a hex mesh that cannot fit the card before the first leg, naming both numbers, and gpuwm cyclone-setup --nest-budget-gib near the memory floor no longer refuses the nest the command keeps without the flag.
  • Sources that publish cloud water, rain, ice, snow and graupel at every forcing time (hrrr, hrrr-prs, icon-d2, a custom source mapping) bring them in through the outer edges, not water vapour alone: a three-hour HRRR mountain winter case held 26.9 million tonnes of snow after two hours instead of 12.8 million (HRRR's analysis: 34.6 million). Memory checks count the new edge tables, 80 MB of card and 160 MB of host memory per forcing interval on HRRR's 3 km grid. GFS is byte-identical, and an older prepared forecast runs on its old edges and says so.
  • A snow-covered land column whose top soil sits more than 30 K below its skin is rebuilt from skin to deep soil, keeping its moisture: in one winter case the 2 m temperature error over the first 3 h at 13 snowy ASOS stations fell from 3.76 K to 1.65 K. A current HRRR analysis prepares byte for byte as before.
  • A nest on its parent's levels keeps its float64 base state: surface geopotential error fell from 2.2e-4 m to 2.3e-13 m on a 12 and 3 km HRRR tree.
  • A domain finer than 1 km with no physics named runs Thompson, MYNN and RUC, the suite that kept coastal fog, not the source's YSU and Noah, unless the source's soil cannot start RUC, and below 500 m the step stays fixed; New forecast, the physics catalog, gpuwm domain and gpuwm local-da agree. Name the suite to keep a 2.8.0 sub-km file's YSU and Noah.
  • gpuwm domain refuses a RUC suite before the download when the source's soil cannot start it (GEM GDPS), and a nested --source hrrr domain runs RUC on its nine soil layers.
  • A nest from gpuwm domain or a DA cycle's nested forecast no longer gets stronger sixth-order damping than its parent.
  • A stock WRF export with no physics named writes its prepared schemes into wrfinput and wrfbdy, not WSM6 and Dudhia.
  • A nested forecast that names its suite runs from every source; outside GFS and ERA5 it was refused after preparation ("cu_physics selected 0 expected 1").
  • WDM6 no longer drives water vapour below zero, which stopped two convective forecasts at step 4; answers change.
  • Blackwell cards (RTX 50 series, RTX PRO) divide by constants exactly as IEEE arithmetic requires: answers change, and steps take about 2% longer.
  • Adaptive nested runs shorten the parent step when a child divide would break the substep bound, and gpuwm downscale --point from an adaptive parent gives the child its own fixed step of 5 s per km.
  • The adaptive clock caps max_time_step over steep high ground under strong crest winds only where measured runs stopped, and a default epssm takes the measured floor there; a lower chosen value is refused.
  • A chained forecast waiting for a boundary says so, with model time, on its heartbeat, run page and My forecasts, and gpuwm go's watchdog no longer stops it after 120 s. A checkpoint written before preparation finishes no longer stops the run, and a resume from it matches. A chained single-domain forecast keeps its sealed preparation's long step.
  • A [tiles] tree whose late nest streams runs past the nest's start without holding two copies of it, and a pinned [tiles] tiling no longer loads the tile planner.
  • A GFS storm-following plan from New forecast or a storm's page runs under gpuwm run-plan instead of being refused.
  • --cycle latest no longer skips posted cycles of seven sources; ECMWF's 503 SlowDown is retried for up to 10 minutes, ARCO ERA5 follows its store's end, and IFS past f144 and GEFS past f240 fetch 6-hourly.
  • An AIFS forecast starting past f000 prepares, fetching the f000 land mask and terrain, and a GEM GDPS window past f000 fetches its statics from f000.
  • hrrr-prs, rap, rrfs, icon-d2 and the other route table sources take any --cadence their publisher posts and preparation takes (hrrr-prs 2 h, aigefs 12 h), where it was refused.
  • A native hrrr configuration with no namelists beside it runs, and native hrrr roots take their terrain smoothing.
  • A domain tree with a [perturbation] block prepares from hrrr-prs, native hrrr, the other mapped sources and ERA5, not only GFS, and gpuwm research create makes warm-bubble scenarios from any source.
  • Runs of one mapped-source download in sibling folders share one prepared cache, two CUDA preparations of the same inputs publish identical caches, and preparations from 2.8.0 on are no longer refused over registry wording or unrelated scheme changes; a refusal names the change.
  • A GRIB2 mapped-source decode fits its threads to free memory or a systemd or batch limit.
  • When domains stay clear of a global source's longitude seam, its pressure levels are staged only where they read: a 6 h GEM GDPS preparation took 32 s and 1.5 GB instead of 175 s and 12 GB.
  • gpuwm run --wrfinput accepts a USE_THETA_M=1 pair whose real.exe rounds moist theta differently.
  • Namelist imports read several keys on one line and element or section assignments, and WUDAPT Local Climate Zones (geog_data_res = 'cglc_modis_lcz', num_land_cat = 61) import as that land cover with the urban canopy on, not MODIS; the import report says its [static.highres] block also replaces terrain and soil.
  • The simulated IR satellite shows cloud tops: absorption meant per gram was applied per kilogram, so most cloud showed the ground's temperature. The median cloud top on a 3 km Thompson run moved from 306 K to 243 K, matching WRF-Python to 2e-5 K. Snow no longer counts as cloud ice, and a file without cloud ice draws.
  • A nest starting after the forecast draws, live and in gpuwm render, where every frame was refused ("conflicting WRF references").
  • A storm-following nest's 1 h rain draws at the hours it moved (only 4 of 12 hours were drawn), and ground it moves onto starts from the parent's rain total.
  • The 10 m wind maximum draws WRF's stored WSPD10MAX when a history has it, and is otherwise titled as the largest hourly snapshot.
  • Hex and global maps name their model where they said WRF; rw_mpas_convert --model-label sets it.
  • gpuwm render imports each frame once: nine windows over a 37-frame run took 25.7 CPU seconds instead of 98.9, pictures byte-identical.
  • Results no longer change on Linux machines where NumPy 2.5 uses AVX-512 math: preparation, map projections, Thompson and RUC values and the default hybrid coordinate take the same math on every machine.
  • The standalone rw-wps package installs cleanly, Python 3.11 included, and reads its own version beside another gpuwm.
  • gpuwm warm-kernels --all-profiles warms all 28 shipped suites; a failing suite is named with its remedy and the pass goes on.
  • gpuwm go with GPUWM_NO_LOCAL_GPU set says to unset it, and no longer warns on every prepared run about a preparation phase with no stage.
  • The renderer's time-axis test files no longer carry a machine path, and the fetch route table's posting measurements no longer name the machine that watched.

Local data assimilation stays experimental and its ordinary desktop entry point stays hidden. Advanced users enable it with gpuwm tui --enable-local-da.

Known limits: the web GUI is a preview and the desktop app remains the full way to run ArWen; a single-domain preparation still refuses a [perturbation] block.

The verification records identify completed artifact and startup checks, the short GPU forecast, and retained component evidence. They do not establish general forecast skill or whole-model parity.

Installation and usage | Full changelog