Meteorological data

Surface FootNet and Column FootNet require different meteorological inputs as shown in the figure below. These meteorological inputs are required at the time of measurement, 6 hours, 12 hours, 18 hours and 24 hours before the measurement was made. We append these meteorological inputs together in the above order and provide to the FootNet models.

Which meteorology product to use?

  • For this work, we used High Resolution Rapid Refresh (HRRR) meteorology which is available at 3 km resolution.
    • We regrid this meteorology to 1km resolution before using with FootNet.
    • Note: The original HRRR data format does not support efficient data loading in Python. We converted the required met fields into NetCDF4 format for efficient data loading (See code).
  • We recommend using a high spatial resolution (1 - 5km) meteorological product for best results.
  • Recommended temporal resolution is 6 hours.
  • What if available meteorological data is coarser than recommended?
    • We have also evaluated FootNet on Global Forecast System (GFS) data and found it to be effective on the GFS dataset as well.
  • It is also possible to use other data products such as WRF, ERA-5 etc.
Meteorology inputs
Schematic of the UNet++ architecture used in FootNet v3. Input features include meteorological fields, Gaussian plumes, and spatial context features. The model outputs the predicted footprint sensitivity for a given pseudo-observation. All meteorological inputs include fields from 0hr, 6hr, 12hr, and 24hr before the receptor time.

Input for Surface FootNet (in order)

  • Gaussian Plume with U10 and V10 at time of measurement (input channel count: 1)
  • U10, V10, PBL Height, Surface Pressure (input channel count: 20)
    • Order: time of measurement, 6 hours, 12 hours, 18 hours and 24 hours before measurement
    • Scaling factors (in order): [10, 10, 0.001, 0.001]
  • Linear distance of pixels from receptor (input channel count: 1)
  • Exponential distance of pixels from receptor (input channel count: 1)
  • Binary spatial mask based on Gaussian plume network (input channel count: 1)
  • Total input channels: 24

Meteorology for Surface FootNet from HRRR lite files — check out the complete code on GitHub

from getSurfaceMeteorology import SurfaceMeteorology

# Meteorology data & path
hr3lon_full = np.load('../data/HRRR_lon_lat.npz')['lon']
hr3lat_full = np.load('../data/HRRR_lon_lat.npz')['lat']
hr3lon_full = (hr3lon_full+180)%360-180  # convert from 0~360 to -180~180
HRRR_DIR = 'PATH'
trimsize = 150

# Defining spatial domain
lats = np.arange(30.384, 33.717, 1/120)
lons = np.arange(-96.323, -92.990, 1/120)

# Defining receptor
timestamp1 = datetime.datetime(2021, 10, 20, 16)
receptor_lon1 = -94.657
receptor_lat1 = 32.618

# Getting surface meteorology
timelist = [timestamp1]
input_met = SurfaceMeteorology(timelist, lons, lats, trimsize, hr3lat_full, hr3lon_full, HRRR_DIR, backhours=[0, 6, 12, 18, 24])

Input for Column FootNet (in order)

  • Gaussian Plume with U10 and V10 at time of measurement (input channel count: 1)
  • U10, V10, PBL Height, Surface Pressure, U850, V850, U500, V500, T850 (input channel count: 45)
    • Order: time of measurement, 6 hours, 12 hours, 18 hours and 24 hours before measurement
    • Scaling factors (in order): [10, 10, 0.001, 0.001, 1, 1, 1, 1, 0.01]
  • Linear distance of pixels from receptor (input channel count: 1)
  • Exponential distance of pixels from receptor (input channel count: 1)
  • Binary spatial mask based on Gaussian plume network (input channel count: 1)
  • Total input channels: 49

Meteorology for Column FootNet from HRRR lite files — check out the complete code on GitHub

from getColumnMeteorology import ColumnMeteorology

# Meteorology data & path
hr3lon_full = np.load('../data/HRRR_lon_lat.npz')['lon']
hr3lat_full = np.load('../data/HRRR_lon_lat.npz')['lat']
hr3lon_full = (hr3lon_full+180)%360-180  # convert from 0~360 to -180~180
HRRR_DIR = 'PATH'
trimsize = 150

# Defining spatial domain
lats = np.arange(43.002, 46.335, 1/120)
lons = np.arange(-87.390, -84.058, 1/120)

# Defining receptor
timestamp1 = datetime.datetime(2021, 7, 27, 6)
receptor_lon1 = -86.253
receptor_lat1 = 44.314

# Getting surface meteorology
timelist = [timestamp1]
input_met = ColumnMeteorology(timelist, lons, lats, trimsize, hr3lat_full, hr3lon_full, HRRR_DIR, backhours=[0, 6, 12, 18, 24])