Add 80m wind, temperature, and pressure to NOAA GFS#748
Conversation
Adds wind_u_80m, wind_v_80m, temperature_80m, and pressure_80m to the shared GFS data-variable config, so both noaa-gfs-forecast and noaa-gfs-analysis gain the 80m level. Template metadata only; backfill is a separate follow-up. Also exempts 80t/80sp and their long names from the ECMWF parameter compliance check (ECMWF has no 80m level), matching the existing 80u/80v HRRR exemption. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ZY5VagHhMYq9D6WXVXxvq
Verification on canonical Python 3.14 toolchainRe-verified on real 3.14.6 (
No corrections needed — the branch is correct as-is.
|
Adding the four 80m variables changes the analysis operational job split (25 vars into 3 jobs) and the expected forecast data var list. Claude-Session: https://claude.ai/code/session_01HX6W8Ru3TvKaUBgQFCUgAZ
What & why
Adds four near-surface 80 metre variables to the shared NOAA GFS data-variable config (
NoaaGfsCommonTemplateConfig.get_data_vars):wind_u_80m,wind_v_80m(U/V wind components)temperature_80mpressure_80mBecause the config is shared, both
noaa-gfs-forecastandnoaa-gfs-analysisgain the 80m level (in-sync by design). The 80m wind/temperature fields are requested for a customer wind-energy use case (hub-height winds), with temperature and pressure alongside for density/power-curve corrections.Details
DataVarmirrors its nearest existing sibling, changing only the level-specific fields:temperature_80m←temperature_2m,pressure_80m←pressure_surface,wind_u_80m/wind_v_80m←wind_u_100m/wind_v_100m. Sameencoding, dims, chunks, and shards as siblings.pressure_80muses the generic-height CFstandard_name="air_pressure"(notsurface_air_pressure). Temperature staysdegree_Celsius(GDAL performs the K→C conversion on read), matchingtemperature_2m.keep_mantissa_bits: wind = 6, temperature = 7, pressure = 10 — matching the equivalent existing variables.80t/80spand their long names fromdatasets_cf_compliance_test.py's ECMWF-parameter-database check. ECMWF has no 80m level, so these have no param-DB entry; this mirrors the pre-existing80u/80vHRRR exemption. Without it the repo's own CF compliance test fails.Source availability verified
Confirmed against a live GFS GRIB index (
gfs.t00z.pgrb2.0p25) and the first archived init time (gfs.20210501/00 f002):UGRD/VGRD/TMP/PRESat80 m above groundare all present. NOAA byte-range matching keys offgrib_element+grib_index_level+ lead-time (notindex_position, which only orders downloads), so these will match correctly.Verification
Verified on the canonical Python 3.14.6 toolchain:
update-templatefor both datasets produces zero diff vs. the checked-in metadata;ruff/ty check/pytest(259 passed) all pass; and an end-to-end decode of real GFS GRIB produced physically sensible values (temperature_80m ≈ −58..41 °C, pressure_80m ≈ 48.8–104.8 kPa, winds ≈ ±35 m/s, no all-NaN). See the verification comment below.Scope
Template metadata only. Post-merge work — history backfill, validation, and catalog docs — is tracked in #751.
Merge-order note: #748 and #749 both add the
80t/80spCF exemption and will conflict; whichever merges second must drop the duplicate lines.🤖 Generated with Claude Code
https://claude.ai/code/session_015ZY5VagHhMYq9D6WXVXxvq