Introduction

Overview

Metadata is data that describes other data.

In IMPROVER this takes the form of attributes either within a netCDF file or within an in-memory Iris cube.

The principles applied to the metadata within IMPROVER are:

  • Conformance to the CF Metadata Conventions, building on this where necessary

  • Clear purpose, with just enough metadata to describe the data sufficiently

  • Nothing misleading or unnecessarily restrictive for wide usage

  • (Ideally) support for referencing more detailed external documentation

Looking at an example

The easiest way to explain the IMPROVER metadata from a user perspective is to dive straight in and look at an actual example. For this purpose, we will consider gridded probabilities for a 12-hour maximum temperature exceeding a range of thresholds on an extended UK domain generated from Met Office model data.

There are two common views of the metadata:

  • How the ncdump utility would display the netCDF file metadata

  • How iris would display the cube

We will mainly focus on the file view here as the default output provides a fuller view (although iris can be used to fully explore the metadata).

Full ncdump of netCDF file metadata

Using the command ncdump -v threshold filename will yield the following output for our sample file.

 1netcdf 20221222T1200Z-B20221220T0015Z-temperature_at_screen_level_max-PT12H {
 2dimensions:
 3    threshold = 79 ;
 4    projection_y_coordinate = 970 ;
 5    projection_x_coordinate = 1042 ;
 6    bnds = 2 ;
 7variables:
 8    float probability_of_air_temperature_above_threshold(threshold, projection_y_coordinate, projection_x_coordinate) ;
 9        probability_of_air_temperature_above_threshold:least_significant_digit = 3LL ;
10        probability_of_air_temperature_above_threshold:long_name = "probability_of_air_temperature_above_threshold" ;
11        probability_of_air_temperature_above_threshold:units = "1" ;
12        probability_of_air_temperature_above_threshold:cell_methods = "time: maximum (comment: of air_temperature)" ;
13        probability_of_air_temperature_above_threshold:grid_mapping = "lambert_azimuthal_equal_area"
14        probability_of_air_temperature_above_threshold:coordinates = "blend_time forecast_period forecast_reference_time height time" ;
15    int lambert_azimuthal_equal_area ;
16        lambert_azimuthal_equal_area:grid_mapping_name = "lambert_azimuthal_equal_area" ;
17        lambert_azimuthal_equal_area:longitude_of_prime_meridian = 0. ;
18        lambert_azimuthal_equal_area:semi_major_axis = 6378137. ;
19        lambert_azimuthal_equal_area:semi_minor_axis = 6356752.31414036 ;
20        lambert_azimuthal_equal_area:longitude_of_projection_origin = -2.5 ;
21        lambert_azimuthal_equal_area:latitude_of_projection_origin = 54.9 ;
22        lambert_azimuthal_equal_area:false_easting = 0. ;
23        lambert_azimuthal_equal_area:false_northing = 0. ;
24    float threshold(threshold) ;
25        threshold:units = "K" ;
26        threshold:standard_name = "air_temperature" ;
27        threshold:spp__relative_to_threshold = "greater_than_or_equal_to" ;
28    float projection_y_coordinate(projection_y_coordinate) ;
29        projection_y_coordinate:axis = "Y" ;
30        projection_y_coordinate:bounds = "projection_y_coordinate_bnds" ;
31        projection_y_coordinate:units = "m" ;
32        projection_y_coordinate:standard_name = "projection_y_coordinate" ;
33    float projection_y_coordinate_bnds(projection_y_coordinate, bnds) ;
34    float projection_x_coordinate(projection_x_coordinate) ;
35        projection_x_coordinate:axis = "X" ;
36        projection_x_coordinate:bounds = "projection_x_coordinate_bnds" ;
37        projection_x_coordinate:units = "m" ;
38        projection_x_coordinate:standard_name = "projection_x_coordinate" ;
39    float projection_x_coordinate_bnds(projection_x_coordinate, bnds) ;
40    int64 blend_time ;
41        blend_time:units = "seconds since 1970-01-01 00:00:00" ;
42        blend_time:long_name = "blend_time" ;
43        blend_time:calendar = "gregorian" ;
44    int forecast_period ;
45        forecast_period:bounds = "forecast_period_bnds" ;
46        forecast_period:units = "seconds" ;
47        forecast_period:standard_name = "forecast_period" ;
48        forecast_period:deprecation_message = "forecast_period will be removed in future and should not be used" ;
49    int forecast_period_bnds(bnds) ;
50    int64 forecast_reference_time ;
51        forecast_reference_time:units = "seconds since 1970-01-01 00:00:00" ;
52        forecast_reference_time:standard_name = "forecast_reference_time" ;
53        forecast_reference_time:calendar = "gregorian" ;
54        forecast_reference_time:deprecation_message = "forecast_reference_time will be removed in future and should not be used" ;
55    float height ;
56        height:units = "m" ;
57        height:standard_name = "height" ;
58        height:positive = "up" ;
59    int64 time ;
60        time:bounds = "time_bnds" ;
61        time:units = "seconds since 1970-01-01 00:00:00" ;
62        time:standard_name = "time" ;
63        time:calendar = "gregorian" ;
64    int64 time_bnds(bnds) ;
65
66// global attributes:
67        :institution = "Met Office" ;
68        :mosg__model_configuration = "gl_ens uk_ens" ;
69        :mosg__model_run = "gl_ens:20221219T0600Z:0.006\ngl_ens:20221219T1200Z:0.006\nuk_ens:20221219T1600Z:0.165\nuk_ens:20221219T1700Z:0.165\nuk_ens:20221219T1800Z:0.165\nuk_ens:20221219T1900Z:0.165\nuk_ens:20221219T2000Z:0.165\nuk_ens:20221219T2100Z:0.165" ;
70        :source = "IMPROVER" ;
71        :title = "IMPROVER Post-Processed Multi-Model Blend on UK 2 km Standard Grid" ;
72        :Conventions = "CF-1.7" ;
73
74data:
75 threshold = 213.15, 218.15, 223.15, 228.15, 233.15, 238.15, 243.15, 248.15, 
76    253.15, 254.15, 255.15, 256.15, 257.15, 258.15, 259.15, 260.15, 261.15, 
77    262.15, 263.15, 264.15, 265.15, 266.15, 267.15, 268.15, 269.15, 270.15, 
78    271.15, 272.15, 273.15, 274.15, 275.15, 276.15, 277.15, 278.15, 279.15, 
79    280.15, 281.15, 282.15, 283.15, 284.15, 285.15, 286.15, 287.15, 288.15, 
80    289.15, 290.15, 291.15, 292.15, 293.15, 294.15, 295.15, 296.15, 297.15, 
81    298.15, 299.15, 300.15, 301.15, 302.15, 303.15, 304.15, 305.15, 306.15, 
82    307.15, 308.15, 309.15, 310.15, 311.15, 312.15, 313.15, 314.15, 315.15, 
83    316.15, 317.15, 318.15, 319.15, 320.15, 321.15, 322.15, 323.15 ;
84}

Full iris listing of cube metadata

Using the python command print(cube) will yield the following output for our sample file.

 1probability_of_air_temperature_above_threshold / (1) (air_temperature: 79; projection_y_coordinate: 970; projection_x_coordinate: 1042)
 2    Dimension coordinates:
 3        air_temperature             x                            -                             -
 4        projection_y_coordinate     -                            x                             -
 5        projection_x_coordinate     -                            -                             x
 6    Scalar coordinates:
 7        blend_time                  2022-12-20 00:15:00
 8        forecast_period             215100 seconds, bound=(171900, 215100) seconds
 9        forecast_reference_time     2022-12-20 00:15:00
10        height                      1.5 m
11        time                        2022-12-22 12:00:00, bound=(2022-12-22 00:00:00, 2022-12-22 12:00:00)
12    Cell methods:
13        maximum                     time (of air_temperature)
14    Attributes:
15        Conventions                 'CF-1.7'
16        institution                 'Met Office'
17        least_significant_digit     3
18        mosg__model_configuration   'gl_ens uk_ens'
19        mosg__model_run             'gl_ens:20221219T0600Z:0.006\ngl_ens:20221219T1200Z:0.006\nuk_ens:2022...
20        source                      'IMPROVER'
21        title                       'IMPROVER Post-Processed Multi-Model Blend on UK 2 km Standard Grid'

Global attributes

These provide the general information about the file contents (although they actually appear at the end of the ncdump output).

// global attributes:
        :institution = "Met Office" ;
        :mosg__model_configuration = "gl_ens uk_ens" ;
        :mosg__model_run = "gl_ens:20221219T0600Z:0.006\ngl_ens:20221219T1200Z:0.006\nuk_ens:20221219T1600Z:0.165\nuk_ens:20221219T1700Z:0.165\nuk_ens:20221219T1800Z:0.165\nuk_ens:20221219T1900Z:0.165\nuk_ens:20221219T2000Z:0.165\nuk_ens:20221219T2100Z:0.165" ;
        :source = "IMPROVER" ;
        :title = "IMPROVER Post-Processed Multi-Model Blend on UK 2 km Standard Grid" ;
        :Conventions = "CF-1.7" ;

The four highlighted attributes are part of the CF Metadata Conventions:

Conventions

Indicates conformance to version of the CF Metadata Conventions (determined by the version of iris, used to write the data).

institution

Where the original data was produced.

source

Method of production of the original data. For the model data feeding into this in this example, this will be “Met Office Unified Model”, but as IMPROVER applies significant processing to multiple inputs, the output of IMPROVER can be considered as original data.

title

Succinct description of what is in the file. A specific model is specified where data is from a single model and no significant post-processing has been applied.

The other two attributes are specific to IMPROVER, which is why they are prefixed by mosg__. This is intended to indicate a MOSG (Met Office standard grid) namespace to show that they are separate from the CF Metadata Conventions attributes.

mosg__model_configuration

This provides a space separated list of model identifiers denoting which sources have contributed to the blend. The naming is fairly arbitary, but at the Met Office we have chosen to indicate the models in a coded form:

  • gl = global model

  • uk = high-resolution UK domain model

  • nc = (extrapolation-based) nowcast

with a secondary component indicating whether the source is deterministic (det) or an ensemble (ens).

For example, uk_ens indicates our UK ensemble model, MOGREPS-UK.

mosg__model_run

This attribute extends the information provided by mosg__model_configuration, to detail the contribution of specific model runs (also known as cycles) to the blend. This is represented as a list of new line (\n) separated composite entries of the form:

model identifier:cycle time in format yyyymmddTHHMMZ:weight

Although Met Office examples are provided above, these are configurable. For example, the mosg__model_configuration attribute is named in the CLI calls by specifying the model_id_attr argument. Likewise the mosg__model_run attribute is set using the record_run_attr argument.

Dimensions

These do what the name suggests and provide the name and extent of the dimensions for the variable arrays. In this example, three of these are the dimensions of coordinate variables and the last is a more general dimension.

dimensions:
    threshold = 79 ;
    projection_y_coordinate = 970 ;
    projection_x_coordinate = 1042 ;
    bnds = 2 ;
projection_y_coordinate

Number of points in the horizontal y-direction

projection_x_coordinate

Number of points in the horizontal x-direction.

threshold

Number of probability thresholds for the probabilities.

bnds

Used to dimension variables that require an upper and lower bound (e.g. gridded data grid square boundaries, and time step boundaries used to indicate statistical processing preiods for maximum and minimum temperatures and precipitation accumulations).

Conventionally, the coordinate variables are given the same name as their dimensions, so, in the file metadata you will see the declaration for the threshold variable is threshold(threshold). However, slightly confusingly, when the dimension appears in the iris cube metadata (see file snippet below), the actual dimension name (which is stored in the iris cube as var_name=”threshold”) in the first and third lines is replaced by the standard_name (air_temperature) of the coordinate variable associated with this dimension (also threshold).

probability_of_air_temperature_above_threshold / (1) (air_temperature: 79; projection_y_coordinate: 970; projection_x_coordinate: 1042)
    Dimension coordinates:
        air_temperature             x                            -                             -
        projection_y_coordinate     -                            x                             -
        projection_x_coordinate     -                            -                             x

Another dimension that will also be seen is:

percentile

Number of percentiles in files holding percentile values rather then probabilities

Variables

Main probability variable

In this example, the main variable is probability_of_air_temperature_above_threshold, which represents the probability of the 12-hour maximum temperature exceeding a set of thresholds. It has 3 dimensions and 5 attributes that describe the meteorological quantity and its relationship to other variables in the metadata.

    float probability_of_air_temperature_above_threshold(threshold, projection_y_coordinate, projection_x_coordinate) ;
        probability_of_air_temperature_above_threshold:least_significant_digit = 3LL ;
        probability_of_air_temperature_above_threshold:long_name = "probability_of_air_temperature_above_threshold" ;
        probability_of_air_temperature_above_threshold:units = "1" ;
        probability_of_air_temperature_above_threshold:cell_methods = "time: maximum (comment: of air_temperature)" ;
        probability_of_air_temperature_above_threshold:grid_mapping = "lambert_azimuthal_equal_area"
        probability_of_air_temperature_above_threshold:coordinates = "blend_time forecast_period forecast_reference_time height time" ;

The variable attributes are:

least_significant_digit

Specifies the precision that is maintained when ‘bit-shaving’ is applied to provide improved file compression. The example value of 3LL indicated that a precision of 3 decimal places is preserved, i.e. values precise to the nearest 0.001 (actually implemented as the power of 2 nearest 0.001).

long_name

A descriptive name that is not governed by CF. If a CF Standard Name exists for the quantity, it will be present and the long_name will usually be omitted (one of these two should always be present).

units

the units of measurement for the quantity. These will always be SI units. In this example the unit is 1 as the variable is a probability rather than a temperature.

cell_methods

Used to describe the statistical processing applied to the quantity that usually changes the interpretation of the data. time: maximum indicates the maximum over the period of the time bounds. The comment: of air_temperature in brackets is to clarify that the maximum is not of the probability, but of the underlying quantity, which is the temperature in this example. Cell methods are covered in more detail in the Statistical Processing

grid_mapping

Although in this case, the name of the projection used, this is actually only a label pointing to a separate grid mapping variable, which more fully describes the map projection.

coordinates

This lists the scalar coordinates, i.e. those that do not appear as dimensions of the main variable.

Coordinate variables

In this example, there 8 coordinate variables. Three that appear as dimensions on the variable and 5 scalar coordinates listed in the coordinates attribute (both highlighted in the code snippet below)

    float probability_of_air_temperature_above_threshold(threshold, projection_y_coordinate, projection_x_coordinate) ;
        probability_of_air_temperature_above_threshold:least_significant_digit = 3LL ;
        probability_of_air_temperature_above_threshold:long_name = "probability_of_air_temperature_above_threshold" ;
        probability_of_air_temperature_above_threshold:units = "1" ;
        probability_of_air_temperature_above_threshold:cell_methods = "time: maximum (comment: of air_temperature)" ;
        probability_of_air_temperature_above_threshold:grid_mapping = "lambert_azimuthal_equal_area"
        probability_of_air_temperature_above_threshold:coordinates = "blend_time forecast_period forecast_reference_time height time" ;

In summary these are:

  • threshold

  • projection_y_coordinate

  • projection_x_coordinate

  • blend_time

  • forecast_period

  • forecast_reference_time

  • height

  • time

Warning

forecast_period and forecast_reference_time are deprecated and will be dropped in the future. There more discussion on this in the sections below.

Probability threshold coordinate variable

As the main variable in this example is a probability of exceeding a threshold, a further dimensional coordinate variable is required to allow the data to be fully interpreted. This holds the set of thresholds for the probabilities, which in this case are a set of 12-hour maximum temperature values. Both, these are shown in the code snippets below

    float threshold(threshold) ;
        threshold:units = "K" ;
        threshold:standard_name = "air_temperature" ;
        threshold:spp__relative_to_threshold = "greater_than_or_equal_to" ;

data:
 threshold = 213.15, 218.15, 223.15, 228.15, 233.15, 238.15, 243.15, 248.15, 
    253.15, 254.15, 255.15, 256.15, 257.15, 258.15, 259.15, 260.15, 261.15, 
    262.15, 263.15, 264.15, 265.15, 266.15, 267.15, 268.15, 269.15, 270.15, 
    271.15, 272.15, 273.15, 274.15, 275.15, 276.15, 277.15, 278.15, 279.15, 
    280.15, 281.15, 282.15, 283.15, 284.15, 285.15, 286.15, 287.15, 288.15, 
    289.15, 290.15, 291.15, 292.15, 293.15, 294.15, 295.15, 296.15, 297.15, 
    298.15, 299.15, 300.15, 301.15, 302.15, 303.15, 304.15, 305.15, 306.15, 
    307.15, 308.15, 309.15, 310.15, 311.15, 312.15, 313.15, 314.15, 315.15, 
    316.15, 317.15, 318.15, 319.15, 320.15, 321.15, 322.15, 323.15 ;

The variable attributes are:

units

The units of measure for the quantity, these will always be SI units.

standard_name

A descriptive name, in this case it is a CF Standard Name from the governed list of names, but may instead be a long_name if there is no suitable standard_name. This represents the quantity for which the probabilities are specified, in this example, air_temperature.

ssp__relative_to_threshold

This attributes is specific to IMPROVER, which is why they are prefixed by spp__. This is intended to indicates a SPP (statistical post-processing) namespace to show that it is seperate from the CF Metadata Conventions attributes. It is used to indicate the nature of the threshold inequality, and takes one of the four values:

  • greater_than

  • greater_than_or_equal_to

  • less_than

  • less_than_or_equal_to

Time coordinate variables

At present, most parameters have two time coordinate variables, time and blend_time, with a further variable providing the bounds of the time step for parameters where this information is required.

    int64 blend_time ;
        blend_time:units = "seconds since 1970-01-01 00:00:00" ;
        blend_time:long_name = "blend_time" ;
        blend_time:calendar = "gregorian" ;
    int64 time ;
        time:bounds = "time_bnds" ;
        time:units = "seconds since 1970-01-01 00:00:00" ;
        time:standard_name = "time" ;
        time:calendar = "gregorian" ;
    int64 time_bnds(bnds) ;
time

The time at which the parameter value is valid.

blend_time

Has been added to indicate when the data was processed (blended) to generate this forecast, and can be used to indicate how ‘fresh’ the data is. (For the Met Office continually updating dataset, the blend_time will not be the same for all validity times, as forecasts in the near future are updated more frequently).

time_bnds

Describes the start and end points of the time step (for the maximum temperature example here, it would represent a 12-hour period). In IMPROVER (as is standard practice for meteorological parameters), the time is at the end of the time step defined by these bounds.

There are two further time coordinate variables which a have been deprecated and will be removed in the future:

forecast_reference_time

This is also a CF Standard Name, and used to represent the nominal data time or start time of a model forecast run. However, as IMPROVER generates a blend from multiple sources with different start times, there is no unique data time, so the use of blend_time is more appropriate.

forecast_period

This usually represent the interval between the forecast_reference_time and the validity time (time), but as stated above, there is no unique forecast_reference_time, and forecasts valid at different times may have a different blend_time, so at best forecast_period is unhelpful, at worst it is confusing.

The time coordinate variables share a common set of attributes:

standard_name / long_name

A descriptive name, either from the CF Standard Name list (e.g. time) or a non-standard long_name (e.g. blend_time)

units

Units of measure for the quantity. As these are usually in seconds relative to midnight on 1st January 1970, so usually some formatting is required to be human-readable.

calendar

Indicates that a Gregorian (standard) calendar is used.

bounds

Pointer to the variable defining the start and end of the time period, if present.

Horizontal coordinate variables

Two horizontal coordinate variables, here projection_y_coordinate and projection_x_coordinate (but would be latitude and longitude for an equirectangular projection grid, such as the Met Office global domain), provide the coordinates of the grid points at the centre of the grid cell, with two further variables defining the cell bounds.

    float projection_y_coordinate(projection_y_coordinate) ;
        projection_y_coordinate:axis = "Y" ;
        projection_y_coordinate:bounds = "projection_y_coordinate_bnds" ;
        projection_y_coordinate:units = "m" ;
        projection_y_coordinate:standard_name = "projection_y_coordinate" ;
    float projection_y_coordinate_bnds(projection_y_coordinate, bnds) ;
    float projection_x_coordinate(projection_x_coordinate) ;
        projection_x_coordinate:axis = "X" ;
        projection_x_coordinate:bounds = "projection_x_coordinate_bnds" ;
        projection_x_coordinate:units = "m" ;
        projection_x_coordinate:standard_name = "projection_x_coordinate" ;
    float projection_x_coordinate_bnds(projection_x_coordinate, bnds) ;

The horizontal coordinates variables share a common set of attributes:

standard_name

A descriptive name from the CF Standard Name list.

units

The units of measure for the quantity, these will always be SI units, with the exception that degrees are used in preference to radians

axis

Indicates whether the coordinate should be regarded as an “X” or “Y” Cartesian coordinate.

bounds

Pointer to the variable defining the edges of the grid cells

Vertical coordinate variable

Some parameters also have a vertical scalar coordinate, height (in the example here, it is 1.5 m representing screen level):

    float height ;
        height:units = "m" ;
        height:standard_name = "height" ;
        height:positive = "up" ;

It’s attributes are:

standard_name

A descriptive name, either from the CF Standard Name list.

units

The units of measure for the quantity, these will always be SI units.

positive

Indicates the direction in which values of the vertical coordinate increase, i.e. where the vertical coordinate is pressure, the positive attribute is down

Grid mapping variable

This describes the grid map projection. The example here is for the Lambert azimuthal equal area (LAEA) grid used by the Met Office for the UK domain, but a Latitude-Longitude (strictly, equirectangular) projection is usually used for the global domain. The set of attributes will vary depending on map projection, so to get the exact meanings, it is best to look at “Appendix F: Grid Mappings” in the CF Metadata Conventions

    int lambert_azimuthal_equal_area ;
        lambert_azimuthal_equal_area:grid_mapping_name = "lambert_azimuthal_equal_area" ;
        lambert_azimuthal_equal_area:longitude_of_prime_meridian = 0. ;
        lambert_azimuthal_equal_area:semi_major_axis = 6378137. ;
        lambert_azimuthal_equal_area:semi_minor_axis = 6356752.31414036 ;
        lambert_azimuthal_equal_area:longitude_of_projection_origin = -2.5 ;
        lambert_azimuthal_equal_area:latitude_of_projection_origin = 54.9 ;
        lambert_azimuthal_equal_area:false_easting = 0. ;
        lambert_azimuthal_equal_area:false_northing = 0. ;

Other forms of IMPROVER data

Percentiles

The example explored so far in the document describes the metadata for probabilities of exceeding a threshold, but IMPROVER can also generate forecasts as a set of percentiles, for which the metadata will differ slightly. These difference are described below, but the full ncdump listing is shown in an appendix.

Dimensions

The threshold dimension is replaced by percentile dimension

dimensions:
    percentile = 13 ;
    projection_y_coordinate = 970 ;
    projection_x_coordinate = 1042 ;
    bnds = 2 ;
percentile

The dimension for the coordinate describing the percentile values.

Main percentile variable

In the example here, the main variable is a 12 hour maximum temperature, but representing the Nth percentile of the temperature forecast probability distribution at each point.

    float air_temperature(percentile, projection_y_coordinate, projection_x_coordinate) ;
        air_temperature:least_significant_digit = 2LL ;
        air_temperature:standard_name = "air_temperature" ;
        air_temperature:units = "K" ;
        air_temperature:cell_methods = "time: maximum" ;
        air_temperature:grid_mapping = "lambert_azimuthal_equal_area" ;
        air_temperature:coordinates = "blend_time forecast_period forecast_reference_time height time" ;

The variable attributes are the same as the probability example previously described in detail, except:

standard_name

Can be used rather than a long_name, as air_temperature exists as a descriptive name in the CF Standard Name list.

cell_methods

Used to describe statistical post-processing applied to the quantity. Cell methods no longer require the additional non-standardized part, (comment: of air_temperature), as they now refer to the main variable that is a maximum temperature over 12 hours.

Percentile coordinate variable

As the main variable provides the air temperature at a set of percentiles, a further dimensional coordinate variable is required to allow the data to be fully interpreted. This holds the set of percentile values.

    float percentile(percentile) ;
        percentile:units = "%" ;
        percentile:long_name = "percentile" ;

data:
 percentile = 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 85, 90, 95 ;

The variable attributes are:

long_name

percentile which is used for all IMPROVER percentile variables. It is not in the CF Standard Name list.

units

The units here are a percentage.

Spot data

Broadly, the spot data parallels the form of the gridded data, both probabilities and percentiles are produced, but there are some notable differences because of the nature of the data. These difference are described below, but the full ncdump listing is shown in an appendix.

Global attributes

Only the title is different for the spot data.

// global attributes:
        :institution = "Met Office" ;
        :mosg__model_configuration = "gl_ens uk_ens" ;
        :mosg__model_run = "gl_ens:20221219T1200Z:0.006\ngl_ens:20221219T1800Z:0.006\nuk_ens:20221219T2200Z:0.165\nuk_ens:20221219T2300Z:0.165\nuk_ens:20221220T0000Z:0.165\nuk_ens:20221220T0100Z:0.165\nuk_ens:20221220T0200Z:0.165\nuk_ens:20221220T0300Z:0.165" ;
        :source = "IMPROVER" ;
        :title = "IMPROVER Post-Processed Multi-Model Blend UK Spot Values" ;
        :Conventions = "CF-1.7" ;

Dimensions

The dimensions for the horizontal coordinate variables have been replaced by a dimension for an index coordinate for the sites, and a dimension for the WMO identifier string length has been added.

dimensions:
    percentile = 19 ;
    spot_index = 14532 ;
    bnds = 2 ;
    string8 = 8 ;
    string5 = 5 ;
spot_index

The dimension for the index for the set of sites.

string5 / string8

Constants used to dimension the character length of the string variable holding zero padded WMO identifier and Met Office identifiers, respectively.

Variables

The majority of variables are the same for both gridded data and spot data. Only the differences will be discussed here. The variable attributes are common to the gridded data, so these will not be discussed.

    int spot_index(spot_index) ;
        spot_index:units = "1" ;
        spot_index:long_name = "spot_index" ;
    float altitude(spot_index) ;
        altitude:units = "m" ;
        altitude:standard_name = "altitude" ;
    float latitude(spot_index) ;
        latitude:units = "degrees_north" ;
        latitude:standard_name = "latitude" ;
    float longitude(spot_index) ;
        longitude:units = "degrees_east" ;
        longitude:standard_name = "longitude" ;
    char met_office_site_id(spot_index, string8) ;
        met_office_site_id:long_name = "met_office_site_id" ;
    char wmo_id(spot_index, string5) ;
        wmo_id:long_name = "wmo_id" ;
spot_index

An arbitrary integer index for the sites.

altitude

Height of site above sea level.

latitude, longitude

Site positions are only provided in latitude and longitude, regardless of the projection used for the corresponding grid. These can be considered as relative the WGS84 or the World Geodetic System 1984 datum, although this is not explicit in the metadata.

met_office_site_id

This is an 8-character string, zero-padded ID number used by the Met Office to label all sites. The name is user configurable, such that it can be changed for different institutions / indices.

wmo_id

For WMO sites, this is a 5-character string, zero-padded ID number. The non-WMO sites are set to the string “None” as iris cannot save NaN.

Special parameters

Weather code

At present, a single weather code is offered, which is derived from the full set of probabilistic data. For this reason, some of the metadata are slightly different. These difference are described below, but the full ncdump listing is shown in an appendix.

As this is deterministic, there is no dimension and coordinate variable for threshold or percentile.

There are two new coordinate variables.

        weather_code:weather_code = 0LL, 1LL, 2LL, 3LL, 4LL, 5LL, 6LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, 13LL, 14LL, 15LL, 16LL, 17LL, 18LL, 19LL, 20LL, 21LL, 22LL, 23LL, 24LL, 25LL, 26LL, 27LL, 28LL, 29LL, 30LL ;
        weather_code:weather_code_meaning = "Clear_Night Sunny_Day Partly_Cloudy_Night Partly_Cloudy_Day Dust Mist Fog Cloudy Overcast Light_Shower_Night Light_Shower_Day Drizzle Light_Rain Heavy_Shower_Night Heavy_Shower_Day Heavy_Rain Sleet_Shower_Night Sleet_Shower_Day Sleet Hail_Shower_Night Hail_Shower_Day Hail Light_Snow_Shower_Night Light_Snow_Shower_Day Light_Snow Heavy_Snow_Shower_Night Heavy_Snow_Shower_Day Heavy_Snow Thunder_Shower_Night Thunder_Shower_Day Thunder" ;
weather_code

Is the integer code used to represent the weather type in the main variable data.

weather_code_meaning

Provides corresponding short descriptions of each weather type in the weather_code list.

Wind direction

At present, probabilities and percentiles are not offered for wind direction, just a single set of deterministic values, which are a mean across realizations (ensemble members) from a single model. For this reason, some of the metadata are slightly different from the nearest equivalent percentiles. These difference are described below, but the full ncdump listing is shown in an appendix.

Note

In future, we expect to at least be able to generate percentiles of wind direction.

The global attribute mosg__model_configuration is always a single model (for the Met Office uk_ens or gl_ens)

For gridded data only, the title only identifies the single model used (for the Met Office, this would be either Post-processed MOGREPS-UK Model Forecast on UK 2 km Standard Grid or Post-processed MOGREPS-G Model Forecast on UK 2 km Standard Grid), rather than referring to the IMPROVER Blend (although the spot data is still labelled as IMPROVER, as a site extraction has taken place).

As this is a mean, there is no dimension and coordinate variable for threshold or percentile.

The main variable has a cell_methods attribute, set to realization: mean.

At present there is no blend_time coordinate variable. For now an idea of the time at which the data was generated can be obtained from the forecast_reference_time

References

CF Metadata Conventions

CF Standard Name

Appendices

Full ncdump of netCDF file metadata for gridded percentiles

Using the command ncdump -v percentile filename will yield the following output for our sample file.

 1netcdf 20221222T1800Z-B20221220T0615Z-temperature_at_screen_level_max-PT12H {
 2dimensions:
 3    percentile = 13 ;
 4    projection_y_coordinate = 970 ;
 5    projection_x_coordinate = 1042 ;
 6    bnds = 2 ;
 7variables:
 8    float air_temperature(percentile, projection_y_coordinate, projection_x_coordinate) ;
 9        air_temperature:least_significant_digit = 2LL ;
10        air_temperature:standard_name = "air_temperature" ;
11        air_temperature:units = "K" ;
12        air_temperature:cell_methods = "time: maximum" ;
13        air_temperature:grid_mapping = "lambert_azimuthal_equal_area" ;
14        air_temperature:coordinates = "blend_time forecast_period forecast_reference_time height time" ;
15    int lambert_azimuthal_equal_area ;
16        lambert_azimuthal_equal_area:grid_mapping_name = "lambert_azimuthal_equal_area" ;
17        lambert_azimuthal_equal_area:longitude_of_prime_meridian = 0. ;
18        lambert_azimuthal_equal_area:semi_major_axis = 6378137. ;
19        lambert_azimuthal_equal_area:semi_minor_axis = 6356752.31414036 ;
20        lambert_azimuthal_equal_area:longitude_of_projection_origin = -2.5 ;
21        lambert_azimuthal_equal_area:latitude_of_projection_origin = 54.9 ;
22        lambert_azimuthal_equal_area:false_easting = 0. ;
23        lambert_azimuthal_equal_area:false_northing = 0. ;
24    float percentile(percentile) ;
25        percentile:units = "%" ;
26        percentile:long_name = "percentile" ;
27    float projection_y_coordinate(projection_y_coordinate) ;
28        projection_y_coordinate:axis = "Y" ;
29        projection_y_coordinate:bounds = "projection_y_coordinate_bnds" ;
30        projection_y_coordinate:units = "m" ;
31        projection_y_coordinate:standard_name = "projection_y_coordinate" ;
32    float projection_y_coordinate_bnds(projection_y_coordinate, bnds) ;
33    float projection_x_coordinate(projection_x_coordinate) ;
34        projection_x_coordinate:axis = "X" ;
35        projection_x_coordinate:bounds = "projection_x_coordinate_bnds" ;
36        projection_x_coordinate:units = "m" ;
37        projection_x_coordinate:standard_name = "projection_x_coordinate" ;
38    float projection_x_coordinate_bnds(projection_x_coordinate, bnds) ;
39    int64 blend_time ;
40        blend_time:units = "seconds since 1970-01-01 00:00:00" ;
41        blend_time:long_name = "blend_time" ;
42        blend_time:calendar = "gregorian" ;
43    int forecast_period ;
44        forecast_period:bounds = "forecast_period_bnds" ;
45        forecast_period:units = "seconds" ;
46        forecast_period:standard_name = "forecast_period" ;
47        forecast_period:deprecation_message = "forecast_period will be removed in future and should not be used" ;
48    int forecast_period_bnds(bnds) ;
49    int64 forecast_reference_time ;
50        forecast_reference_time:units = "seconds since 1970-01-01 00:00:00" ;
51        forecast_reference_time:standard_name = "forecast_reference_time" ;
52        forecast_reference_time:calendar = "gregorian" ;
53        forecast_reference_time:deprecation_message = "forecast_reference_time will be removed in future and should not be used" ;
54    float height ;
55        height:units = "m" ;
56        height:standard_name = "height" ;
57        height:positive = "up" ;
58    int64 time ;
59        time:bounds = "time_bnds" ;
60        time:units = "seconds since 1970-01-01 00:00:00" ;
61        time:standard_name = "time" ;
62        time:calendar = "gregorian" ;
63    int64 time_bnds(bnds) ;
64
65// global attributes:
66        :institution = "Met Office" ;
67        :mosg__model_configuration = "gl_ens uk_ens" ;
68        :mosg__model_run = "gl_ens:20221219T1200Z:0.006\ngl_ens:20221219T1800Z:0.006\nuk_ens:20221219T2200Z:0.165\nuk_ens:20221219T2300Z:0.165\nuk_ens:20221220T0000Z:0.165\nuk_ens:20221220T0100Z:0.165\nuk_ens:20221220T0200Z:0.165\nuk_ens:20221220T0300Z:0.165" ;
69        :source = "IMPROVER" ;
70        :title = "IMPROVER Post-Processed Multi-Model Blend on UK 2 km Standard Grid" ;
71        :Conventions = "CF-1.7" ;
72
73data:
74 percentile = 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 85, 90, 95 ;
75}

Full ncdump of netCDF file metadata for spot percentiles

Using the command ncdump -v percentile filename will yield the following output for our sample file.

 1netcdf 20221222T1800Z-B20221220T0615Z-temperature_at_screen_level_max-PT12H {
 2dimensions:
 3    percentile = 19 ;
 4    spot_index = 14532 ;
 5    bnds = 2 ;
 6    string8 = 8 ;
 7    string5 = 5 ;
 8variables:
 9    float air_temperature(percentile, spot_index) ;
10        air_temperature:least_significant_digit = 2LL ;
11        air_temperature:standard_name = "air_temperature" ;
12        air_temperature:units = "K" ;
13        air_temperature:cell_methods = "time: maximum" ;
14        air_temperature:coordinates = "altitude blend_time forecast_period forecast_reference_time height latitude longitude met_office_site_id time wmo_id" ;
15    float percentile(percentile) ;
16        percentile:units = "%" ;
17        percentile:long_name = "percentile" ;
18    int spot_index(spot_index) ;
19        spot_index:units = "1" ;
20        spot_index:long_name = "spot_index" ;
21    float altitude(spot_index) ;
22        altitude:units = "m" ;
23        altitude:standard_name = "altitude" ;
24    int64 blend_time ;
25        blend_time:units = "seconds since 1970-01-01 00:00:00" ;
26        blend_time:long_name = "blend_time" ;
27        blend_time:calendar = "gregorian" ;
28    int forecast_period ;
29        forecast_period:bounds = "forecast_period_bnds" ;
30        forecast_period:units = "seconds" ;
31        forecast_period:standard_name = "forecast_period" ;
32        forecast_period:deprecation_message = "forecast_period will be removed in future and should not be used" ;
33    int forecast_period_bnds(bnds) ;
34    int64 forecast_reference_time ;
35        forecast_reference_time:units = "seconds since 1970-01-01 00:00:00" ;
36        forecast_reference_time:standard_name = "forecast_reference_time" ;
37        forecast_reference_time:calendar = "gregorian" ;
38        forecast_reference_time:deprecation_message = "forecast_reference_time will be removed in future and should not be used" ;
39    float height ;
40        height:units = "m" ;
41        height:standard_name = "height" ;
42        height:positive = "up" ;
43    float latitude(spot_index) ;
44        latitude:units = "degrees_north" ;
45        latitude:standard_name = "latitude" ;
46    float longitude(spot_index) ;
47        longitude:units = "degrees_east" ;
48        longitude:standard_name = "longitude" ;
49    char met_office_site_id(spot_index, string8) ;
50        met_office_site_id:long_name = "met_office_site_id" ;
51    int64 time ;
52        time:bounds = "time_bnds" ;
53        time:units = "seconds since 1970-01-01 00:00:00" ;
54        time:standard_name = "time" ;
55        time:calendar = "gregorian" ;
56    int64 time_bnds(bnds) ;
57    char wmo_id(spot_index, string5) ;
58        wmo_id:long_name = "wmo_id" ;
59
60// global attributes:
61        :institution = "Met Office" ;
62        :mosg__model_configuration = "gl_ens uk_ens" ;
63        :mosg__model_run = "gl_ens:20221219T1200Z:0.006\ngl_ens:20221219T1800Z:0.006\nuk_ens:20221219T2200Z:0.165\nuk_ens:20221219T2300Z:0.165\nuk_ens:20221220T0000Z:0.165\nuk_ens:20221220T0100Z:0.165\nuk_ens:20221220T0200Z:0.165\nuk_ens:20221220T0300Z:0.165" ;
64        :source = "IMPROVER" ;
65        :title = "IMPROVER Post-Processed Multi-Model Blend UK Spot Values" ;
66        :Conventions = "CF-1.7" ;
67
68data:
69 percentile = 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80,
70    85, 90, 95 ;
71}

Full ncdump of netCDF file metadata for spot weather codes

Using the command ncdump -h filename will yield the following output for our sample file.

 1netcdf 20221220T0800Z-B20221220T0615Z-weather_symbols-PT01H {
 2dimensions:
 3    spot_index = 14532 ;
 4    bnds = 2 ;
 5    string8 = 8 ;
 6    string5 = 5 ;
 7variables:
 8    int weather_code(spot_index) ;
 9        weather_code:long_name = "weather_code" ;
10        weather_code:units = "1" ;
11        weather_code:weather_code = 0LL, 1LL, 2LL, 3LL, 4LL, 5LL, 6LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, 13LL, 14LL, 15LL, 16LL, 17LL, 18LL, 19LL, 20LL, 21LL, 22LL, 23LL, 24LL, 25LL, 26LL, 27LL, 28LL, 29LL, 30LL ;
12        weather_code:weather_code_meaning = "Clear_Night Sunny_Day Partly_Cloudy_Night Partly_Cloudy_Day Dust Mist Fog Cloudy Overcast Light_Shower_Night Light_Shower_Day Drizzle Light_Rain Heavy_Shower_Night Heavy_Shower_Day Heavy_Rain Sleet_Shower_Night Sleet_Shower_Day Sleet Hail_Shower_Night Hail_Shower_Day Hail Light_Snow_Shower_Night Light_Snow_Shower_Day Light_Snow Heavy_Snow_Shower_Night Heavy_Snow_Shower_Day Heavy_Snow Thunder_Shower_Night Thunder_Shower_Day Thunder" ;
13        weather_code:coordinates = "altitude blend_time forecast_period forecast_reference_time latitude longitude met_office_site_id time wmo_id" ;
14    int spot_index(spot_index) ;
15        spot_index:units = "1" ;
16        spot_index:long_name = "spot_index" ;
17    float altitude(spot_index) ;
18        altitude:units = "m" ;
19        altitude:standard_name = "altitude" ;
20    int64 blend_time ;
21        blend_time:units = "seconds since 1970-01-01 00:00:00" ;
22        blend_time:long_name = "blend_time" ;
23        blend_time:calendar = "gregorian" ;
24    int forecast_period ;
25        forecast_period:bounds = "forecast_period_bnds" ;
26        forecast_period:units = "seconds" ;
27        forecast_period:standard_name = "forecast_period" ;
28        forecast_period:deprecation_message = "forecast_period will be removed in future and should not be used" ;
29    int forecast_period_bnds(bnds) ;
30    int64 forecast_reference_time ;
31        forecast_reference_time:units = "seconds since 1970-01-01 00:00:00" ;
32        forecast_reference_time:standard_name = "forecast_reference_time" ;
33        forecast_reference_time:calendar = "gregorian" ;
34        forecast_reference_time:deprecation_message = "forecast_reference_time will be removed in future and should not be used" ;
35    float latitude(spot_index) ;
36        latitude:units = "degrees_north" ;
37        latitude:standard_name = "latitude" ;
38    float longitude(spot_index) ;
39        longitude:units = "degrees_east" ;
40        longitude:standard_name = "longitude" ;
41    char met_office_site_id(spot_index, string8) ;
42        met_office_site_id:long_name = "met_office_site_id" ;
43    int64 time ;
44        time:bounds = "time_bnds" ;
45        time:units = "seconds since 1970-01-01 00:00:00" ;
46        time:standard_name = "time" ;
47        time:calendar = "gregorian" ;
48    int64 time_bnds(bnds) ;
49    char wmo_id(spot_index, string5) ;
50        wmo_id:long_name = "wmo_id" ;
51
52// global attributes:
53        :institution = "Met Office" ;
54        :mosg__model_configuration = "nc_det uk_det uk_ens" ;
55        :mosg__model_run = "nc_det:20221220T0600Z:\nuk_det:20221220T0100Z:\nuk_det:20221220T0200Z:\nuk_det:20221220T0300Z:\nuk_det:20221220T0400Z:\nuk_ens:20221219T2100Z:\nuk_ens:20221219T2200Z:\nuk_ens:20221219T2300Z:\nuk_ens:20221220T0000Z:\nuk_ens:20221220T0100Z:\nuk_ens:20221220T0200Z:\nuk_ens:20221220T0300Z:" ;
56        :source = "IMPROVER"  ;
57        :title = "IMPROVER Post-Processed Multi-Model Blend UK Spot Values"  ;
58        :Conventions = "CF-1.7" ;
59}

Full ncdump of netCDF file metadata for wind direction

Using the command ncdump -h filename will yield the following output for our sample file.

 1netcdf 20221228T0000Z-B20221220T0615Z-wind_direction_at_10m {
 2dimensions:
 3    projection_y_coordinate = 970 ;
 4    projection_x_coordinate = 1042 ;
 5    bnds = 2 ;
 6variables:
 7    float wind_from_direction(projection_y_coordinate, projection_x_coordinate) ;
 8        wind_from_direction:standard_name = "wind_from_direction" ;
 9        wind_from_direction:long_name = "wind_direction_adjusted_by_model_surface_scheme" ;
10        wind_from_direction:units = "degrees" ;
11        wind_from_direction:cell_methods = "realization: mean" ;
12        wind_from_direction:grid_mapping = "lambert_azimuthal_equal_area" ;
13        wind_from_direction:coordinates = "forecast_period forecast_reference_time height time" ;
14    int lambert_azimuthal_equal_area ;
15        lambert_azimuthal_equal_area:grid_mapping_name = "lambert_azimuthal_equal_area" ;
16        lambert_azimuthal_equal_area:longitude_of_prime_meridian = 0. ;
17        lambert_azimuthal_equal_area:semi_major_axis = 6378137. ;
18        lambert_azimuthal_equal_area:semi_minor_axis = 6356752.31414036 ;
19        lambert_azimuthal_equal_area:longitude_of_projection_origin = -2.5 ;
20        lambert_azimuthal_equal_area:latitude_of_projection_origin = 54.9 ;
21        lambert_azimuthal_equal_area:false_easting = 0. ;
22        lambert_azimuthal_equal_area:false_northing = 0. ;
23    float projection_y_coordinate(projection_y_coordinate) ;
24        projection_y_coordinate:axis = "Y" ;
25        projection_y_coordinate:bounds = "projection_y_coordinate_bnds" ;
26        projection_y_coordinate:units = "m" ;
27        projection_y_coordinate:standard_name = "projection_y_coordinate" ;
28    float projection_y_coordinate_bnds(projection_y_coordinate, bnds) ;
29    float projection_x_coordinate(projection_x_coordinate) ;
30        projection_x_coordinate:axis = "X" ;
31        projection_x_coordinate:bounds = "projection_x_coordinate_bnds" ;
32        projection_x_coordinate:units = "m" ;
33        projection_x_coordinate:standard_name = "projection_x_coordinate" ;
34    float projection_x_coordinate_bnds(projection_x_coordinate, bnds) ;
35    int forecast_period ;
36        forecast_period:units = "seconds" ;
37        forecast_period:standard_name = "forecast_period" ;
38    int64 forecast_reference_time ;
39        forecast_reference_time:units = "seconds since 1970-01-01 00:00:00" ;
40        forecast_reference_time:standard_name = "forecast_reference_time" ;
41        forecast_reference_time:calendar = "gregorian" ;
42    float height ;
43        height:units = "m" ;
44        height:standard_name = "height" ;
45        height:positive = "up" ;
46    int64 time ;
47        time:units = "seconds since 1970-01-01 00:00:00" ;
48        time:standard_name = "time" ;
49        time:calendar = "gregorian" ;
50
51// global attributes:
52        :history = "2022-12-20T05:59:03Z: StaGE Decoupler" ;
53        :institution = "Met Office" ;
54        :mosg__model_configuration = "gl_ens" ;
55        :source = "Met Office Unified Model" ;
56        :title = "Post-Processed MOGREPS-G Forecast on UK 2 km Standard Grid" ;
57        :Conventions = "CF-1.7" ;
58}