Repository navigation
Releases: recastsystems/woof
Release list
Recast WOOF 1.0.3
Recast WOOF 1.0.3
WOOF runs the operational HRRR configuration: its static file, its
Thompson, MYNN, RUC, surface-layer and radiation forms, its fixed 20 s
clock and fifth-order vertical advection, from woof import-namelist on
an HRRR namelist or from the shipped HRRR recipes. Ensembles, simulated
radar volumes and verification against observations join the forecast
doors. Isobaric heights, RUC soil water and legacy RRTMG longwave are
corrected. Forecast answers change.
Requires Python 3.11 or newer. Native tools ship for Linux x86_64
(manylinux_2_28). GPU forecasts need an NVIDIA card:
recast-woof[gpu] (CUDA 12) for regional and global forecasts,
recast-woof[gpu-cu13] (CUDA 13) for hex forecasts.
pip install --upgrade "recast-woof[gpu]"
woof fetch-tables
woof doctor
woof fetch-geog
woof fetch-geog --static-source hrrr-conus-v4
RECIPES=$(python -c "import configs, pathlib; print(pathlib.Path(list(configs.__path__)[0], 'recipes'))")
woof go "$RECIPES/hrrr_configuration_cut.toml" --dry-run
New
- HRRR configuration recipes ship in the installed package's
configs/recipes/
folder:hrrr_configuration_cut.toml(a 401 x 301 3 km cut, started from
native RAP columns),hrrr_configuration_clock.toml,
conus_hrrr_configuration.tomlandhrrr_v4_gsd41.toml. Run one by its
installed path:
RECIPES=$(python -c "import configs, pathlib; print(pathlib.Path(list(configs.__path__)[0], 'recipes'))")
thenwoof fetch-geogandwoof fetch-geog --static-source hrrr-conus-v4
(once; the operational static file is 1.1 GB) and
woof go "$RECIPES/hrrr_configuration_cut.toml". Each recipe ships the
WPS namelist its staged route reads beside it. They select the
operational branch forms below explicitly; generic configurations keep
the WRF v4.6.1 defaults. woof import-nameliston a supportedhrrr_wrf.nlselects the HRRR
physics forms: GSD v4.1 MYNN, the operational Thompson, MYNN surface
layer, RUC irrigation, snow, ground-vapour cold start and logarithmic
2 m diagnostic, prescribed monthly leaf area and albedo, legacy RRTMG
with the operational cloud form, aerosol optics 3, shortwave
interpolation 1, sun-angle land albedo (alb_sol = 1), the sixth-order
filter, microphysics zero-out and upper wind limiter of that branch, and
fifth-order vertical advection. An adaptive clock whose start, minimum
and maximum are equal (HRRR v4: 20/20/20) imports as a fixed step with
terrain_clock = "pinned"and the acoustic substep count WRF derives
for it (6 for HRRR's grid at 20 s, where its namelist spells 4). The
import report lists each substitution. The namelist importer also
accepts 43 inert&time_controloutput-stream settings it refused.[static] sourceselects a published static file. HRRR configurations
take the pinned operational CONUS static file by default, on its native
grid and contained cuts; soil, land use, terrain, monthly vegetation,
lakes and drag fields keep the source values, and analyzed vegetation
fraction comes from the initialization GRIB.terrain_clock = "pinned"runstime_stepandtime_step_sound
exactly as written whenuse_adaptive_time_step = false. The terrain
clock and steep-ground substep rule still report what they would have
done, as advice in their receipts, and apply nothing."measured"
stays the default.- New physics selectors, each off or at the WRF v4.6.1 form by default:
bl_mynn_version = "gsd_41"(the operational RAP/HRRR MYNN boundary
layer, with dew and frost water, mixing length 2, subgrid stratus and
shallow cumulus, and an optional mass-flux plume population),
thompson_version = "wrf_39_noaa"with its own lookup tables, fetched
once from pinned public source with hash checks,
mynn_sfclay_variant = "gsl_wrf39",fractional_seaice = 1,
ruc_qvg_cold_start = "air",ruc_2m_diagnostic = "log_profile",
ruc_irrigation = "wrf_45",ruc_snow = "wrf_45",alb_sol = 1,
diff_6th_form,diff_6th_factor2,mp_zero_out,
upper_wind_limiter_form, and advection ordersv_sca_adv_order,
v_mom_adv_orderandh_mom_adv_order(defaults 3, 3 and 5).
bl_mynn_version = "gsd_41"lowered daytime 2 m dewpoint bias against
the operational model on a 3 km cut from +0.93/+0.95 K to +0.69/+0.85 K
at f01/f02. The GSD v4.1 MYNN port is partial. rap-nativefetches and prepares RAP's 13 km hybrid-level columns.
hrrr-nativesupplies a native hybrid analysis, with the same cycle's
pressure product supplying the soil column.woof prep --initial-inputs JSONstarts a domain from a separate analysis while every lateral frame
comes from the boundary source.use_rap_aero_icbc = truetakes
aerosol number initial and boundary values from the analysis. HRRR
plans stage the monthly aerosol climatology in the shared cache before
forcing transfer, with exact size and SHA-256 checks; dry runs report
it as pending.- A domain that is its source's own Lambert grid (for
hrrr-prsand
hrrr-native, the full 1799 x 1059 HRRR grid) prepares untrimmed, each
point copying its own source cell. It was refused before. - MYNN supports WRF mixing length 2 and
scalar_pblmix = 1. RUC mosaic
land use and soil (mosaic_lu,mosaic_soil) and WRF's CLM lake model
(sf_lake_physics = 1) run, off by default.
zadvect_implicit_variant = "wrf_legacy"selects the older WRF
implicit vertical-advection split. - Ensembles:
woof ensemble CONFIG --members N(alsowoof goand
woof runwith--members N, or[ensemble] members = N) runs N
members, each from its own source trajectory: the source's operational
ensemble (gefsforgfs,aigefsforaigfs,ecmwf-ensfor
ecmwf-open-data),--recipe time-lagged, or multi-model members from
--trajectories FILE. A source with no ensemble and no recipe is
refused before any download, because copies of one forecast have no
spread. The run draws mean, spread, minimum, maximum, threshold
probabilities, paintball and postage-stamp maps as members finish.
Members of matching physics and forcing advance as one batch per card,
with every product byte-identical to members run one at a time. Packed
members can carry a parent and its nest. An interrupted streamed nested
forecast or ensemble continues from its last checkpoint. Random
perturbations (SPPT, SKEBS, SPP and related switches) are refused at
every door, because their spread has not been calibrated against
observations.woof fetch --source ecmwf-ensfetches ECMWF open-data
ENS members p01 to p50 and--source rrfs-ensthe five public RRFS
members, which preparation refuses because their files carry no soil. [simulated_radar]writes native radar volumes (Level II and CfRadial 1
by default; CfRadial 2 and ODIM optional) and PPI loops while a forecast
runs, off by default.woof simulated-radarreplays saved histories;
--describeand--estimatereport support, memory and output size.
PPIs draw ZDR, CC and KDP when the volume carries them. Radar colours
follow the AWIPS reflectivity table and a green-red velocity table;
[simulated_radar] color_tables = "classic",woof render --radar-colors classicorRUSTWX_RADAR_COLORS=classicrestores the
earlier colours byte for byte.- A finished forecast is verified against observations by default:
station dots and scorecards, and MRMS reflectivity and hourly rain
panels, scored and drawn in Rust. The run waits at most 2 seconds for
it; downloads and scoring continue in the background, andwoof verify-visuals RUN_DIRECTORYruns it on demand. A verification failure
never changes a forecast's result;WOOF_VERIFY_VISUALS=0turns it off.
A regional rain scorer adds Rust hourly rain, echo and fractions skill
score kernels with a native MRMS decoder. - Comparison sheets draw MRMS and RRFS as reference panels, in a stated
order. Maps and sections name the model WOOF for files WOOF wrote. - Multi-card
[devices]forecasts step their slabs at once under a
free-threaded Python 3.14 (python3.14t);woofre-executes once with
PYTHON_GIL=0on such a build. Full HRRR physics on the 1797 x 1057 x
50 grid: 4 x RTX PRO 6000 130.0 s per forecast hour against 333.8
before, 8 x RTX 5090 83.8 s. Histories are byte-identical across 2, 4
and 8 cards and both interpreters. woof fetch --source 20crv3-cfreads the 20th Century Reanalysis v3
ensemble mean (1836 to 2015), so a forecast can start from a historical
date.[physics_params](orWOOF_PHYSICS_PARAMS) applies a named set of
physics parameter values, recorded in the run's identity. Default runs
are unchanged.- Generated adaptive nests declare a maximum step growth of 5 percent,
andwoof checknames a nest whose growth is above 5 (WRF's own nest
value, 51, ended a nested forecast with a non-finite vertical velocity).
Fixed
- Isobaric heights no longer read high: each pressure-level height had
paired a layer's mean height with its mid-level pressure (500 hPa read
5.3 m high on a 3 km frame). The fix reaches height charts, pressure
planes, soundings, post-processed files, ML export, the moving-nest
tracker and GNSS-RO data assimilation. Answers change for every
isobaric and sounding height product. - RUC soil water no longer refills a dry top level at the WRF v4.6.1
rate.ruc_soilpropdefaults to"wrf_45", the operational RAP and
HRRR form; in one cycle 2 m dewpoint bias against stations went from
+1.16/+1.59 K to +0.92/+1.22 K at f01/f02."wrf_461"reproduces the
earlier output. RUC also runs its water branch on lake cells when the
lake model is off. Answers change for every RUC run. - Legacy RRTMG longwave applies each stratospheric optical-depth
correction once; parallel bands had raced on shared outputs. Legacy
RRTMG shortwave follows WRF on columns with no layer above the
troposphere switch, where it had read stale memory. An...
Recast WOOF 1.0.2
Recast WOOF 1.0.2
WRF-fidelity fixes correct moisture pressure terms, edge vertical velocity,
diffusion and map factors, and the 2 m humidity cap. Forecast answers change.
Requires Python 3.11 or newer. Native tools ship for Linux x86_64
(manylinux_2_28). GPU forecasts need an NVIDIA card:
recast-woof[gpu] (CUDA 12) for regional and global forecasts,
recast-woof[gpu-cu13] (CUDA 13) for hex forecasts.
pip install --upgrade "recast-woof[gpu]"
woof fetch-tables
woof doctor
New
[devices]in a single-domain or tree config, orwoof go --devices N,
splits a forecast across cards, with per-card memory checks and an
execution receipt.domainsselects split grids, defaulting to all;
split nests take forcing each parent step and return two-way feedback
to split parents.woof sim --devices Nor--devices-tablesets a
prepared forecast's split without changing its configuration.
woof check CONFIG --devices Nprices every card, grid and pinned host
store, exiting 2 for an unknown VRAM budget. Frames reach the host while
the model steps on. Split parents over resident nests, moving nests and
late-starting split grids are refused. Split grids refuse Noah mosaic
and slope radiation (slope_rad = 1) before allocation, naming the
missing state; resident grids retain both. Splitting is off by default.woof run-planstarts GFS and native HRRR single domains and trees from
the first posted hours, aswoof godoes. Both start singlehrrr-prs,
rap,rrfs,icon-euandgem-gdpsdomains the same way. A[tiles]
root, includingwoof cyclone-setuptrees, waits at each boundary seam,
instead of for the whole cycle. Output is unchanged. An earlier forecast
failure keeps its own error beside any later input timeout.WOOF_FETCH_POLICY=awspins sources with an AWS host to that host without
NOMADS fall-through; sources with no AWS host retain their usual host.
latestselects the newest cycle whose first hours are on AWS;
--whole-cycleretains the whole-cycle rule. Forecasts still stream from
their first posted hours. Unset, fetching is unchanged.woof fetch
probes hosts refusing HEAD with a one-byte GET.woof import-namelistacceptsdomain_wizard,mod_levs,plotfmtand
bare30sgeography, and fills 17 of 33 formerly required keys from WRF
and WPS defaults. Unknown sections are refused by name.diff_opt = 1runs WRF's coordinate-surface horizontal diffusion with
km_opt2 or 4 and eithermix_full_fieldssetting, including restarts
and streamed forecasts. It is off by default (diff_opt = 2).topo_windruns under YSU, excluding BEP and BEP+BEM;
gwd_opt = 1or3runs KIM or GSL gravity-wave drag under every PBL
scheme. GPU column checks match WRF 4.7.1 bit for bit. Static preparation
adds orographic statistics from WPS geography, and namelist imports keep
both keys. Orographic statistics are byte-identical on Linux and Windows.
A streamed[tiles]domain stops at its first drag call.
Both options are off by default.woof ml-exportconverts regional histories, converted hex frames,
global tapes or their ZIPs into one Zarr store per domain. It offers
WeatherBench 2's 13 pressure levels, ERA5's 37 or model levels, ERA5
and WeatherBench 2 names and units, earth-relative winds, a
below_groundmask over ERA5's below-ground fill, an optional regular
latitude-longitude grid and a ZIP that opens in place. Levels above the
model top are omitted and listed.xarray.open_zarrworks with
zarr-python 2.18 and 3. On Windows, ZIP history files with WRF's colon
filenames unpack with underscores; seedocs/ml-export.md.- GPU preparation rotates winds, interpolates vertically and builds the
Thompson cold start with the CPU route's arithmetic, matching its
prepared arrays. Forecasts prepared on the card change. A full HRRR
forcing preparation took 154 s instead of 640 s. - Acoustic, advection, horizontal diffusion and per-step glue kernels move
less memory, with byte-identical output. The horizontal diffusion change
alone reduced an hour of an 800 x 600 x 50 forecast from 95.7 to 88.4 s
on an RTX 5090.
Fixed
- Legacy RRTMG longwave radiation keeps the correct spacing above the
model top. A pressure guard had compressed valid layers, changing their
temperatures and heating. Forecast answers change. woof go --cycleaccepts an exact match to a prepared bundle,
checkpoint or declared forcing's actual initial time, recording a no-op.
Conflicting or unreadable input times remain refused. Forcing fetched by
the run is checked after acquisition and before preparation.- Every shipped profile and configuration leaving
moist_cqunset applies
WRF's moisture correction to pressure terms, including passive vapour
with microphysics off. Dry states bypass it; an explicit setting wins.
Unmatched configurations had omitted it, and WSM6 and Kessler profiles
had disabled it. Forecast answers change. - The dynamical core corrects vertical-velocity damping and float32
rounding, geopotential tendencies at open and specified outer rows,
vertical advection at an open model top, mapped open-boundary map
factors, and diffusion's sixth-order filtering, boundary deformation,
outer-row TKE and prescribed surface heat flux. Routine output words
are checked against compiled WRF 4.7.1. Forecast answers change. - Surface vertical velocity at open and specified edges uses WRF's
clamped terrain slope. Copying the interior slope outward had doubled
its terrain-following term there. Periodic domains and interior cells
are unchanged; edge answers change. - Land points cap 2 m humidity at 1.05 times the lowest model level's
vapour after the surface schemes, as WRF's surface driver does.
Answers change for 2 m humidity. - WRF
wrfinputstarts initialize unfrozen Noah soil liquid water from
soil moisture and terrain-following vertical wind from surface flow,
instead of retaining zeros. First-hour latent heat flux RMSE against WRF
fell from 239 to 0.4 W/m2 on a 3 km comparison. Withusemonalboff,
Noah keeps WRF's seasonal background albedo instead of the file's monthly
albedo. Answers change for these forecasts. woof downscalechildren of saved runs, including--point, build
terrain, land use and soil at their own spacing, using Copernicus GLO-30
terrain at 1 km or finer. Parent states and every boundary frame are
blended and rebalanced as WRF'sndowndoes, within a few float32
epsilons of compiled WRF 4.7.1 on column checks. A WPS_GEOG tree is
required (woof fetch-geogor--geog-root); a missing tree is refused.
--parent-terrainretains the old route, and[static]records the
choice. Answers change for these children.- Downscaled children and DA nests take steep-terrain acoustic substeps
and theepssmfloor from their own terrain, keeping automatic parent
choices. Lower explicitepssmvalues are refused. Answers change when
the child's terrain needs the rule and the parent's terrain did not. - Adaptive steps land on history, radiation, cumulus, surface and
boundary-layer times; history intervals need only be whole seconds.
Prepared forecasts honor adaptive history alarms and delayed domains
start on time. Answers change where those times fell between steps. - Disk estimates count each domain's physics fields,
history_varsand
output window. Trimmed runs that fit start; insufficient space is
refused before starting. - BEP+BEM workspace estimates count urban columns, including forecasts
starting while their source posts, keeping a forecast that fits on the
card. Configuration checks explain their upper bound. - A resident nest under a streamed or split parent restores from the
shared scratch arena without aKeyError. - Streamed final-state digests use the resident forecast's model time.
Fractional adaptive steps no longer leave identical forecasts with
different digests through a 0.27 ms time difference after 3 h. - Resident, streamed and out-of-core checkpoint writers record the run
configuration alike. Checkpoints of the same state no longer differ in
their header. - CPU-only validation and SASE resource accounting work without CuPy.
Windows numerical receipts resolve their own paths.
Available since 1.0.1
sf_urban_physics = 1runs single-layer urban canopy under Noah or
Noah-MP;2runs BEP with YSU or MYJ;3adds BEP's building energy
model. Local Climate Zones and NLCD urban classes are retained. A
single-layer canopy above the first model level is refused. Urban
physics is off by default; BEP under YSU applies nonurban drag once.sf_surface_mosaic = 1runs Noah land-use tiles per cell. With the
single-layer canopy,mosaic_urban_canopy = "every_tile"also treats
town tiles in mostly rural cells. Mosaic is off by default.- The UW moist-turbulence PBL (
bl_pbl_physics = 9) runs on the GPU and
imports from WRF namelists.[shared] zadvect_implicit = 1runs
implicit-explicit vertical advection withw_crit_cfl, including the
two corrected boundary terms. Implicit advection is off by default;
answers change. - Terrain accepts WPS GEOGRID.TBL smoothers or no smoothing through
woof domain --terrain-smoothing, domain static settings or GEOGRID.TBL
import.smooth_precision = "wps-float32"or
--terrain-smoothing-precisionmatches defaultgeogrid.exesmoothing;
float64 remains the default. - WRF namelists retain
history_begin,history_end,smooth_cg_topo,
topo_shadingandslope_rad, and imports name all unsupported keys
together. Restarts can change history windows where cadence can change.
WUDAPT Local Climate Zones import with their urban land cover. - Byte-identical physics speedups remain included: 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...
Recast WOOF 1.0.1
Recast WOOF 1.0.1
Requires Python 3.11 or newer. The native tools ship for Linux x86_64 (manylinux_2_28). GPU forecasts need an NVIDIA card: recast-woof[gpu] (CUDA 12) for the regional and global models, recast-woof[gpu-cu13] (CUDA 13) for the hex model.
pip install --upgrade "recast-woof[gpu]"
woof fetch-tables
woof doctor
New
- WRF's urban physics:
sf_urban_physics = 1,2or3runs the single-layer urban canopy (under Noah or Noah-MP), the 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 = 1runs 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.- WUDAPT Local Climate Zones (
geog_data_res = 'cglc_modis_lcz',num_land_cat = 61) import from WRF namelists as that land cover with the urban canopy on, not MODIS. - The UW moist-turbulence boundary layer (
bl_pbl_physics = 9) runs on the card and imports from WRF namelists. [shared] zadvect_implicit = 1runs WRF's implicit-explicit vertical advection with itsw_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.- A domain's terrain can stay unsmoothed or take any WPS GEOGRID.TBL smoother (
woof domain --terrain-smoothing), andsmooth_precision = "wps-float32"makes the default smoothing matchgeogrid.exeexactly. - WRF namelists with
history_begin,history_end,smooth_cg_topo,topo_shadingorslope_radimport and run, namelist imports read several keys on one line and element or section assignments, and an import names every unsupported key at once. - More physics runs faster with byte-identical output. Per call: Noah-MP 5.8x, NSSL 1.9 to 3.1x, P3 1.5 to 2.2x and Thompson 1.3 to 1.6x, beside the radiation, MYNN and RUC gains above.
- Faster physics with byte-identical output: legacy RRTMG radiation is about 7x faster per call and RTE-RRTMGP 1.6x (RTX PRO 4500), MYNN about 4.5x (RTX 5090), and RUC land surface 7 to 22x faster per call.
- The dycore step and nest forcing make fewer launches and host waits.
[shared] adaptive_nest_lattice = truepicks the adaptive outer time step with the fewest nest cell-steps (6% faster on a three-domain 250 m tree). Opt-in: answers change.- Sources are fetched as they post:
woof fetchtakes each forecast time once a host has it,--cycle latestneeds only the first times, a time past its late limit exits 75,--whole-cyclekeeps the old rule and--readinesssays whether a run can start.woof sourcesshows each source's posting schedule. - Domain trees from HRRR pressure levels, mapped sources and GFS prepare their start time and nests first, then one boundary interval at a time, and the forecast starts on that head. Output is identical to waiting for the whole preparation.
- The source decode uses every core (
woof prep --preprocess-workerssets the count): a 48 h HRRR decode on 24 cores took 140 s instead of 480. - For domains clear of the source's longitude seam, GEM GDPS and the other latitude/longitude sources decode only the window their domains read: a 6 h GDPS preparation took 32 s and 1.5 GB instead of 175 s and 12 GB.
Fixed
-
Adaptive nested runs shorten the parent step when a child divide would break the substep bound, where a nested forecast could stop with exit 2.
-
A forecast too big for the card is refused before anything is allocated, naming the memory needed and free.
-
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.
-
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. -
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.
-
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 nest no longer gets stronger sixth-order damping than its parent.
-
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.
-
Source-posting routes load on Python 3.11: their immutable provider mapping is created through a dataclass default factory.
-
Global and hex maps and cross-section headers name WOOF Global and WOOF Hex where they said WRF.
-
With
hypsometric_opt = 2, whichwoof domainwrites, a CPU-prepared state no longer differs in the last bits on AVX-512 machines (the 1.0.0 known issue). The default hybrid coordinate and the preparation's exp, log and pow are the same on every machine too. -
Under the adaptive clock, the steep-terrain cap on
max_time_stepcomes from three-hour adaptive runs: a 2.25 km ridge under 20 to 30 m/s crest winds keeps 30 s. -
--cycle latestwaits each publisher's measured delay and no longer skips posted cycles of seven sources. ECMWF's slow-down answer is retried for up to 10 minutes. -
AIFS and GEM GDPS forecasts that start after f000 prepare: the land mask and terrain come from the cycle's f000.
-
A storm-following nest's 1 h rain draws at the hours it moved.
-
A nest that starts after the forecast draws, live and through
woof render. -
A forecast waiting for a boundary interval says so on its heartbeat and events, and
woof gono longer stops it after 120 s. -
Two card preparations of the same inputs publish identical prepared caches.
-
Clear sky under the first cloud-cover level draws nothing, so the map shows through.
-
The global model's quickstart configurations name the
woofcommands that fetch its analysis and run it. -
woof global pins, the Level-3 pin table and the hex model's contract texts name WOOF (the 1.0.0 known issue). They carry new ids (global pins v3, Level-3 pins v2, hex adapter contract v3) and no arithmetic moved: a global checkpoint, export or receipt written by 1.0.0 still resumes and validates, and 1.0.0 hex receipts still read as the same contracts. -
A global receipt's
librariesblock records therecast-woofversion; 1.0.0 receipts recorded onlyrecast-woof-data. -
Global lakes and coastal water points start from the analysis's water temperatures. Starting them at the temperature of nearby hot land could exhaust their surface reservoir and stop the forecast; one stopped forecast held a lake at 48 C.
-
Global convective rain on the maps, and the rain the land surface receives, is the rain that left the atmosphere. The convective scheme reported about 1.8 times that amount over the first day. In one four-day T255 forecast, the global rain total fell from 1.43 to 1.06 times the CMORPH satellite estimate, and the land total from 1.45 to 1.05 times the CPC gauge estimate.
-
Global lakes follow their own heat budget and can cool when the analysis starts them too warm. In one five-day T255 forecast, the lake-temperature RMSE over lake columns covered by OISST fell from 1.37 to 1.11 K; Lake Superior fell from 1.49 to 0.66 K.
Recast WOOF 1.0.0
Requires Python 3.11 or newer. The native tools ship for Linux x86_64 (manylinux_2_28). GPU forecasts need an NVIDIA card: recast-woof[gpu] (CUDA 12) for the regional and global models, recast-woof[gpu-cu13] (CUDA 13) for the hex model.
pip install "recast-woof[gpu]"
woof fetch-tables
woof doctor
New
- One install carries the regional model (
woof), the hex model (woof hex, preview) and the global model (woof global, preview) under one version. - The Python package and the command are
woof, the table companion isrecast-woof-data, and settings are spelledWOOF_*. Settings spelledGPUWM_*keep working. - Plots take the shape of their domain: square and tall domains fill the picture, the header runs the full width, the colour bar matches the map's length, wind barbs are larger and place names are drawn on every domain.
woof render --diff A_RUN B_RUNdraws any product as run A minus run B on a zero-centred colour bar, frame by frame. Runs on different grids or times are refused by name.woof hexruns on any NVIDIA GPU with compute capability 7.5 or newer and a CUDA 13 runtime. Each receipt records whether the card's architecture is anchored (sm_86, sm_89 and sm_120 are), andwoof hex doctornames the card and its status.- The global model reads its trace-gas and ozone climatology from a shipped table. Its forecasts are unchanged, bit for bit.
Fixed
- HRRR, ICON-D2 and mapped sources that declare cloud water, rain, ice, snow and graupel bring them in through the domain's edges, instead of water vapour alone.
- Snow-covered land whose analysed top soil is more than 30 K colder than the snow surface starts with its soil rebuilt from the skin temperature. On a 2017 Idaho case the first-3-hour 2 m temperature bias at snow-covered stations went from -2.5 K to -0.2 K.
- A nest on its parent's vertical levels gets the same pressure correction as the outer domain.
- A forecast, a spawned or late-starting nest, or a tiling too large for the card is refused before anything is allocated, naming what it needs and what the card has, instead of a CUDA out-of-memory error part-way through. Every memory check counts the cloud and precipitation edge tables.
- A domain finer than 1 km with no physics named runs Thompson with MYNN and RUC, in
woof domainandwoof local-da. A RUC suite is refused up front on a source whose soil RUC cannot start from. - A forecast with nests that names its physics suite runs from every source, and a nest no longer gets stronger sixth-order damping than its parent.
- Under the adaptive clock, a 3 km domain over steep, high ground under a strong crest-level wind has its
max_time_stepcapped where a longer step was measured to fail. - A state prepared on the CPU, the Python map projections and the global model's level weights no longer depend on NumPy's AVX-512 math.
simulated_ir_satellitefrom a wrfout shows the model's cloud tops, and the 10 m wind maximum pictures use the stored maximum when a history carries it.woof renderreads each frame once. Every picture is byte-identical.- A configuration with a
[perturbation]block prepares from every source, not only GFS. woof hex: the hour-0 2 m humidity and surface pressure are real,woof hex renderreads the renderer's current catalog rows,woof hex doctorreports a bridge that is not executable, and receipts name the machine by a salted digest.woof global doctorexits 0 on a correct install. The global model's six observation decoders ship in the bridge bundle, which now carries 34 programs and libraries, and the doctor grades every Rust door against this release's own pins.woof fetch-tablesdownloads the two large Thompson tables from this release, andwoof fetch-geogdownloads the geography from NCAR's own server by default (--source hftakes a byte-for-byte mirror).woof warm-kernels --all-profileswarms all 28 physics suites and names any that fail, instead of stopping at the first.
Known issues
Each is fixed in 1.0.1, for the reason it names.
- A configuration with
hypsometric_opt = 2, whichwoof domainwrites, still takes NumPy's float32log1pwhen it is prepared on the CPU, so on a machine with AVX-512 its preparedal,altandpcan differ from another machine's in the last bits. The fix is made in the engine and ships in 1.0.1: it changes prepared bytes, and 1.0.0's forecasts were proved on the engine before it, so it goes in with the next engine re-point and its proofs. - Two kinds of identity text still print the engine's earlier name: the pin table
woof global pinsprints, and the contract textswoof hex forecast --preflightprints. Their bytes are hashed into every global pin and every hex receipt, so a changed word changes every digest, and a global checkpoint written before would stop resuming. They keep their bytes in 1.0.0 and are reworded in 1.0.1.