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 modeluk
= high-resolution UK domain modelnc
= (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. Thecomment: 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 suitablestandard_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 uniqueforecast_reference_time
, and forecasts valid at different times may have a differentblend_time
, so at bestforecast_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-standardlong_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 isdown
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
, asair_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
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}