Add 80m wind, temperature, and pressure to NOAA GEFS#749
Conversation
Adds wind_u_80m, wind_v_80m, temperature_80m, and pressure_80m to the shared GEFS data-variable config (from the 0.5 degree b file, like the existing 100m wind), so noaa-gefs-forecast-35-day and noaa-gefs-analysis gain the 80m level. The 0.25 degree 10-day-spatial dataset excludes b-file variables by design and is unaffected. Template metadata only; backfill is a separate follow-up. 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.
|
The 80 m above ground level is not present in the GEFS v12 reforecast archive (2000-2019), so the reforecast integration test must exclude the new 80m variables. Claude-Session: https://claude.ai/code/session_01HX6W8Ru3TvKaUBgQFCUgAZ
What
Adds four near-surface data variables at the 80 metre level to the shared NOAA GEFS data-variable config (
src/reformatters/noaa/gefs/common_gefs_template_config.py):wind_u_80m,wind_v_80m(80 m U/V wind component)temperature_80m(80 m temperature)pressure_80m(80 m pressure)All four come from the GEFS 0.5° "b" file (
pgrb2b.0p50,gefs_file_type="b") — the same file type as the existingwind_u_100m/wind_v_100m.Affected datasets (template metadata regenerated):
_S_FILE_TYPES(0.25° s-files) and so excludesgefs_file_type="b"variables by design (just like the existing 100m wind). Its template is unchanged.Why
Customer wind-energy use case: 80 m is a common wind-turbine hub height, so U/V wind plus temperature and pressure at that level support hub-height wind and air-density calculations.
Source verification
Source availability was verified against a live GEFS GRIB index:
UGRD,VGRD,TMP, andPRESat80 m above groundare all present in the 0.5° b file. NOAA byte-range matching keys offgrib_element+grib_index_level(+ lead-time string), which the new configs set to match the live index. The 80m read/regrid path is the same b-file path already exercised in production by the existing 100m wind.Metadata mirrors existing equivalents: wind mirrors
wind_u_100m/wind_v_100m, temperature mirrorstemperature_2m(K→°C conversion happens automatically on read), pressure mirrorspressure_surfacebut uses the generic-height CFstandard_name="air_pressure"(notsurface_air_pressure).keep_mantissa_bits: wind 6, temperature 7, pressure 10 (matching the dataset'spressure_surface).CF-compliance exemptions
tests/common/datasets_cf_compliance_test.pyvalidateslong_name/short_nameagainst the ECMWF parameter database. ECMWF has 80m U/V wind (80u/80v, already exempt for HRRR) but no 80m temperature or 80m pressure parameter, so80t/80spand their long names were added to the existingECMWF_SHORTNAME_EXEMPT/ECMWF_LONGNAME_EXEMPTsets — the test's designed mechanism for quantities without an ECMWF entry. Without this the compliance test fails.Verification
Verified on the canonical Python 3.14.6 toolchain:
update-templatefor all three GEFS datasets produces zero diff vs. the checked-in metadata (spatial-dev unchanged, confirming the b-file filter);ruff/ty check/pytest(259 passed) all pass; and a decode of real GEFS GRIB produced physically sensible values. See the verification comment below.Scope
Template metadata only. Post-merge work — history backfill, validation (incl. a K→°C sanity check on the b-file temperature), and catalog docs — is tracked in #752.
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