NOAA North American Regional Reanalysis (NARR)
Kyle Messier, with assistance from GitHub Copilot
2026-05-20
Source:vignettes/narr_workflow.Rmd
narr_workflow.RmdThis article demonstrates a compact workflow for NOAA NARR data.
This vignette runs its live workflow when rendered locally. The heavy
download, processing, extraction, and plotting chunks are skipped
automatically on CI, CRAN checks, and pkgdown builds; set
AMADEUS_RUN_VIGNETTES=true to force live execution in those
environments.
Each workflow uses two small example surfaces:
example_points_sf, a set of real Triangle-region AQS
monitoring locations derived from
tests/testdata/aqs/aqs_daily_88101_triangle.csv, for point
extraction; and the packaged Durham County Uber H3 resolution-8 hexagons
at
system.file("extdata", "data_files", "durham_h3_res8.rds", package = "amadeus")
for polygon extraction.
Available inputs and data availability
download_data(dataset_name = "narr", ...) expects NARR
variable abbreviations.
- Temporal resolution: daily meteorology from the NOAA PSL NARR Dailies archive.
- Year input: use a single year (for example,
2020) or a start/end pair such asc(2020, 2022); the wrapper supports years from 1979 through the current calendar year. - Major constraints:
- Pressure-level variables (
air,hgt,omega,shum,tke,uwnd,vwnd) always download all 29 pressure levels from 1000 to 100 hPa. - Subsurface variables (
soill,soilw,tsoil) include all 4 soil layers. - Variables that are only available in the raw merged GRIB archive are not supported by this wrapper.
- Pressure-level variables (
Monolevel variables
| variable | description |
|---|---|
| acpcp | Convective precipitation |
| air.2m | Air temperature at 2 m |
| air.sfc | Air temperature at surface |
| albedo | Surface albedo |
| apcp | Total accumulated precipitation |
| bgrun | Baseflow-groundwater runoff |
| bmixl.hl1 | Blackadar mixing length scale at hybrid level 1 |
| cape | Convective available potential energy |
| ccond | Canopy conductance |
| cdcon | Convective cloud cover |
| cdlyr | Non-convective cloud cover |
| cfrzr | Categorical freezing rain |
| cicep | Categorical ice pellets |
| cin | Convective inhibition |
| cnwat | Plant canopy surface water |
| crain | Categorical rain |
| csnow | Categorical snow |
| dlwrf | Downward longwave radiation flux |
| dpt.2m | Dew point temperature at 2 m |
| dswrf | Downward shortwave radiation flux |
| evap | Evaporation |
| gflux | Ground heat flux |
| hcdc | High cloud cover |
| hgt.tropo | Geopotential height at tropopause |
| hlcy | Storm relative helicity |
| hpbl | Planetary boundary layer height |
| lcdc | Low cloud cover |
| lftx4 | Best (4-layer) lifted index |
| lhtfl | Latent heat net flux |
| mcdc | Mid-cloud cover |
| mconv.hl1 | Horizontal moisture divergence at hybrid level 1 |
| mslet | Mean sea level pressure (ETA model reduction) |
| mstav | Moisture availability |
| pevap | Potential evaporation |
| pottmp.hl1 | Potential temperature at hybrid level 1 |
| pottmp.sfc | Potential temperature at surface |
| prate | Precipitation rate |
| pres.sfc | Surface pressure |
| pres.tropo | Pressure at tropopause |
| prmsl | Pressure reduced to mean sea level |
| pr_wtr | Precipitable water |
| rcq | Specific humidity tendency from all physics |
| rcs | Snowfall water equivalent tendency |
| rcsol | Solar radiative heating rates |
| rct | Temperature tendency from all physics |
| rhum.2m | Relative humidity at 2 m |
| shtfl | Sensible heat net flux |
| shum.2m | Specific humidity at 2 m |
| snod | Snow depth |
| snohf | Snow phase-change heat flux |
| snom | Snow melt |
| snowc | Snow cover |
| soilm | Soil moisture content (0-200 cm layer) |
| ssrun | Storm surface runoff |
| tcdc | Total cloud cover |
| tke.hl1 | Turbulent kinetic energy at hybrid level 1 |
| ulwrf.ntat | Upward longwave radiation flux at nominal top of atmosphere |
| ulwrf.sfc | Upward longwave radiation flux at surface |
| ustm | U-component of storm motion |
| uswrf.ntat | Upward shortwave radiation flux at nominal top of atmosphere |
| uswrf.sfc | Upward shortwave radiation flux at surface |
| uwnd.10m | U-component of wind at 10 m |
| veg | Vegetation fraction |
| vis | Visibility |
| vstm | V-component of storm motion |
| vvel.hl1 | Vertical velocity at hybrid level 1 |
| vwnd.10m | V-component of wind at 10 m |
| vwsh.tropo | Vertical wind shear at tropopause |
| wcconv | Convective wetting of vegetation canopy |
| wcinc | Wetting of vegetation canopy |
| wcuflx | U-component of convective canopy moisture flux |
| wcvflx | V-component of convective canopy moisture flux |
| weasd | Water-equivalent accumulated snow depth |
| wvconv | Convective column moisture convergence |
| wvinc | Column moisture increase |
| wvuflx | U-component of vertically-integrated moisture flux |
| wvvflx | V-component of vertically-integrated moisture flux |
Download representative requests
directory_to_save <- file.path(tempdir(), "narr_workflow")
download_data(
dataset_name = "narr",
variables = c("dpt.2m", "air.2m"),
year = 2020,
directory_to_save = directory_to_save,
acknowledgement = TRUE
)Process one workflow-ready data product
processed_data <- process_covariates(
covariate = "narr",
variable = "air.2m",
date = c("2020-01-01", "2020-01-10"),
path = file.path(directory_to_save, "air.2m")
)Calculate covariates at points
hex_values <- calculate_covariates(
covariate = "narr",
from = processed_data,
locs = durham_hex,
locs_id = "h3_id",
radius = 0,
fun = "mean",
geom = "sf"
)
print(hex_values)Visualize the data and point outputs
usa <- sf::st_as_sf(maps::map("usa", plot = FALSE, fill = TRUE))
bb <- sf::st_bbox(usa)
# Project first layer to WGS84 and convert to data frame for safe ggplot2 rendering
lyr1 <- terra::project(processed_data[[1]], "EPSG:4326")
lyr1_df <- as.data.frame(lyr1, xy = TRUE)
names(lyr1_df)[3] <- "value"
ggplot2::ggplot() +
ggplot2::geom_raster(
data = lyr1_df,
ggplot2::aes(x = x, y = y, fill = value)
) +
ggplot2::geom_sf(data = usa, fill = NA, color = "grey80", linewidth = 0.3) +
ggplot2::scale_fill_viridis_c(option = "C", na.value = "white") +
ggplot2::coord_sf(xlim = bb[c(1, 3)], ylim = bb[c(2, 4)], expand = FALSE) +
ggplot2::labs(x = NULL, y = NULL, fill = "air temp at 2m (K)") +
ggplot2::theme_minimal()We plot the NARR 2m air temperature at the Uber H3 hexagons. NARR is fairly coarse spatial resolution at ~32sq-km, so we don’t see much spatial variability, but the facets show the daily trend
ggplot2::ggplot() +
ggplot2::geom_sf(data = hex_values, ggplot2::aes(fill = air.2m_0)) +
ggplot2::scale_fill_viridis_c() +
ggplot2::facet_wrap(~time)