Skip to content

Releases: recastsystems/woof

Recast WOOF 1.0.3

Choose a tag to compare

@FahrenheitResearch FahrenheitResearch released this 07 Oct 00:24

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.toml and hrrr_v4_gsd41.toml. Run one by its
    installed path:
    RECIPES=$(python -c "import configs, pathlib; print(pathlib.Path(list(configs.__path__)[0], 'recipes'))")
    then woof fetch-geog and woof 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-namelist on a supported hrrr_wrf.nl selects 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_control output-stream settings it refused.
  • [static] source selects 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" runs time_step and time_step_sound
    exactly as written when use_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 orders v_sca_adv_order,
    v_mom_adv_order and h_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-native fetches and prepares RAP's 13 km hybrid-level columns.
    hrrr-native supplies a native hybrid analysis, with the same cycle's
    pressure product supplying the soil column. woof prep --initial-inputs JSON starts a domain from a separate analysis while every lateral frame
    comes from the boundary source. use_rap_aero_icbc = true takes
    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-prs and
    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 (also woof go and
    woof run with --members N, or [ensemble] members = N) runs N
    members, each from its own source trajectory: the source's operational
    ensemble (gefs for gfs, aigefs for aigfs, ecmwf-ens for
    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-ens fetches ECMWF open-data
    ENS members p01 to p50 and --source rrfs-ens the 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-radar replays saved histories;
    --describe and --estimate report 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 classic or RUSTWX_RADAR_COLORS=classic restores 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, and woof verify-visuals RUN_DIRECTORY runs it on demand. A verification failure
    never changes a forecast's result; WOOF_VERIFY_VISUALS=0 turns 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); woof re-executes once with
    PYTHON_GIL=0 on 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-cf reads the 20th Century Reanalysis v3
    ensemble mean (1836 to 2015), so a forecast can start from a historical
    date.
  • [physics_params] (or WOOF_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,
    and woof check names 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_soilprop defaults 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...
Read more

Recast WOOF 1.0.2

Choose a tag to compare

@FahrenheitResearch FahrenheitResearch released this 03 Oct 05:53

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, or woof go --devices N,
    splits a forecast across cards, with per-card memory checks and an
    execution receipt. domains selects split grids, defaulting to all;
    split nests take forcing each parent step and return two-way feedback
    to split parents. woof sim --devices N or --devices-table sets a
    prepared forecast's split without changing its configuration.
    woof check CONFIG --devices N prices 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-plan starts GFS and native HRRR single domains and trees from
    the first posted hours, as woof go does. Both start single hrrr-prs,
    rap, rrfs, icon-eu and gem-gdps domains the same way. A [tiles]
    root, including woof cyclone-setup trees, 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=aws pins sources with an AWS host to that host without
    NOMADS fall-through; sources with no AWS host retain their usual host.
    latest selects the newest cycle whose first hours are on AWS;
    --whole-cycle retains 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-namelist accepts domain_wizard, mod_levs, plotfmt and
    bare 30s geography, and fills 17 of 33 formerly required keys from WRF
    and WPS defaults. Unknown sections are refused by name.
  • diff_opt = 1 runs WRF's coordinate-surface horizontal diffusion with
    km_opt 2 or 4 and either mix_full_fields setting, including restarts
    and streamed forecasts. It is off by default (diff_opt = 2).
  • topo_wind runs under YSU, excluding BEP and BEP+BEM;
    gwd_opt = 1 or 3 runs 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-export converts 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_ground mask 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_zarr works with
    zarr-python 2.18 and 3. On Windows, ZIP history files with WRF's colon
    filenames unpack with underscores; see docs/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 --cycle accepts 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_cq unset 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 wrfinput starts 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. With usemonalb off,
    Noah keeps WRF's seasonal background albedo instead of the file's monthly
    albedo. Answers change for these forecasts.
  • woof downscale children 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's ndown does, within a few float32
    epsilons of compiled WRF 4.7.1 on column checks. A WPS_GEOG tree is
    required (woof fetch-geog or --geog-root); a missing tree is refused.
    --parent-terrain retains the old route, and [static] records the
    choice. Answers change for these children.
  • Downscaled children and DA nests take steep-terrain acoustic substeps
    and the epssm floor from their own terrain, keeping automatic parent
    choices. Lower explicit epssm values 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_vars and
    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 a KeyError.
  • 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 = 1 runs single-layer urban canopy under Noah or
    Noah-MP; 2 runs BEP with YSU or MYJ; 3 adds 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 = 1 runs 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 = 1 runs
    implicit-explicit vertical advection with w_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-precision matches default geogrid.exe smoothing;
    float64 remains the default.
  • WRF namelists retain history_begin, history_end, smooth_cg_topo,
    topo_shading and slope_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...
Read more

Recast WOOF 1.0.1

Choose a tag to compare

@FahrenheitResearch FahrenheitResearch released this 01 Oct 23:41

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, 2 or 3 runs 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 = 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.
  • 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 = 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.
  • A domain's terrain can stay unsmoothed or take any WPS GEOGRID.TBL smoother (woof 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, 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 = true picks 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 fetch takes each forecast time once a host has it, --cycle latest needs only the first times, a time past its late limit exits 75, --whole-cycle keeps the old rule and --readiness says whether a run can start. woof sources shows 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-workers sets 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, which woof domain writes, 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_step comes from three-hour adaptive runs: a 2.25 km ridge under 20 to 30 m/s crest winds keeps 30 s.

  • --cycle latest waits 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 go no 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 woof commands 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 libraries block records the recast-woof version; 1.0.0 receipts recorded only recast-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

Choose a tag to compare

@FahrenheitResearch FahrenheitResearch released this 30 Sep 02:06

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 is recast-woof-data, and settings are spelled WOOF_*. Settings spelled GPUWM_* 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_RUN draws 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 hex runs 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), and woof hex doctor names 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 domain and woof 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_step capped 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_satellite from 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 render reads 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 render reads the renderer's current catalog rows, woof hex doctor reports a bridge that is not executable, and receipts name the machine by a salted digest.
  • woof global doctor exits 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-tables downloads the two large Thompson tables from this release, and woof fetch-geog downloads the geography from NCAR's own server by default (--source hf takes a byte-for-byte mirror).
  • woof warm-kernels --all-profiles warms 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, which woof domain writes, still takes NumPy's float32 log1p when it is prepared on the CPU, so on a machine with AVX-512 its prepared al, alt and p can 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 pins prints, and the contract texts woof hex forecast --preflight prints. 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.