Contrail Forecast Data

This document species the data contract for contrail forecast data. This data is intended to be served by the interface defined in the sibling specification Forecast API.

Format

Data is designed to be stored in either a netCDF4 or zarr format. This document assumes data is stored in a netCDF4 format.

Domain

Forecast must be globally valid for the same forecast_reference_time.

Global Attributes

  • forecast_reference_time (str): The forecast reference time is the “data time”, i.e. the time at which the meteorological model was executed for a given set of forecast times. Reported in ISO 8601 "YYYY-MM-DDTHH:MM:SSZ" e.g. "2024-10-07T01:00:00Z".

  • (optional) aircraft_class (str): Aircraft class for forecast. One of ["low_e", "default", "high_e"], where suffix _e references emissions.[1]

  • (optional) model (str): A descriptor of the model used in generating the contrails variable.

Additional attributes, in addition to the required and suggested ones above, may be added at the author’s discretion.

Dimensions

  • longitude (float32): np.arange(-180, 180, 0.25), EPSG:4326

  • latitude (float32): np.arange(-90, 90, 0.25), EPSG:4326

  • flight_level (int16 or int32): [270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440], hectofeet [2]

  • time (int32 or int64): CF compatible time coordinates. Must have units and calendar variable attributes. e.g.

    units: hours since 2022-12-12
    calendar: proleptic_gregorian
    

In general we use xarray to encode times directly from np.datetime64 to CF compatible format. See xarray Time Units for more information.

Variables

  • contrails (float32): (longitude, latitude, flight_level, time) Continuous contrail forcing index values from [0 - 4] [3]

    • Attributes:

      • units: “”

      • long_name: Contrail forcing index

      • valid_min: 0 (NB: Could be extended in the future to -4 to support cooling contrails)

      • valid_max: 4

Example

Example scaling translates ef_per_m [4] to contrails index via:

ds["contrails"] = ds["ef_per_m"].clip(min=1e7, max=1e9)
ds["contrails"] = ((ds["contrails"] - 1e7) / (1e9 - 1e7)) * 4

Test

  • [ ] Establish a few tests for substantially equivalent data distributions

    • Histogram comparisons

  • [ ] Share 1 day of input data per quarter for validation exercise

Implementation

  • [ ] Add example (or two) of cost function implementation

References

Changelog