Unidata - To provide the data services, tools, and cyberinfrastructure leadership that advance Earth system science, enhance educational opportunities, and broaden participation. Unidata
         
  advanced  
 

CF Conventions for Point Data (proposed)

Draft 3/18/2008

Section 5 of CF 1.1 Conventions explains how to specify Coordinate Systems in a netCDF/CF file, and in particular the use of auxilary coordinate variables. This proposal extends that framework to specify how to create the following types of datasets:

  1. Point Data : one or more parameters measured at one point in time and space
  2. Time series of Station Data : a time-series of data points all at the same location, with varying time
  3. Trajectory Data : a set of data points along a 1D curve in time and space.
  4. Profile Data : a set of data points along a vertical line.
  5. Station Profile Data: a time-series of profiles at a named location.
  6. Section Profile Data: a collection of profiles which originate along a trajectory.

1. Point Data

To represent data at scattered, unconnected points, both data and coordinates use the same, single dimension. The coordinates attribute is used on the data variables to unambiguously identify the time, lat, lon and height auxilary coordinate variables.

dimensions:
  obs = UNLIMITED ;


variables:
  double time(obs) ;
    time:long_name = "time of measurement" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(obs) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(obs) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  float alt(obs) ;
    alt:long_name = "altitude above MSL" ;
    alt:units = "m";
    alt:positive = "up";

  float humidity(obs) ;
    humidity:long_name = "specific humidity" ;
    humidity:coordinates = "time lat lon alt" ;
  float temp(obs) ;
    temp:long_name = "temperature" ;
    temp:units = "Celsius" ;
    temp:coordinates = "time lat lon alt" ;

attributes:
  :CF_datatype = "point";

In this example, the humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(i), lon(i), and optionally alt(i). The obs dimension may use the unlimited dimension or not. If the time coordinate is ordered, the obs dimension may be named time (making time a coordinate variable rather than an auxiliary variable).

2. Time series of Station Data

Point data may be taken at a set of named locations called stations. The set of observations at a particular station, if ordered by time, is a time series, and the file contains a collection of time series of station data.

2.1 Multidimensional representation

When the number of observations at each station is the same, one can use the multidimensional representation.

dimensions:
  station = UNLIMITED ;
  obs = 13 ;


variables:
  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  float alt(station) ;
    alt:long_name = "altitude above MSL" ;
    alt:units = "m" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "any kind of station info" ;

  double time(station, obs) ;
    time:long_name = "time of measurement" ;
    time:units = "days since 1970-01-01 00:00:00" ;
    time:missing_value = -999.9;
  float humidity(station, obs) ;
    humidity:long_name = "specific humidity" ;
    humidity:coordinates = "time lat lon alt" ;
    humidity:_FillValue = -999.9;
  float temp(station, obs) ;
    temp:long_name = "temperature" ;
    temp:units = "Celsius" ;
    temp:coordinates = "time lat lon alt" ;
    temp:_FillValue = -999.9;


attributes:
  :CF_datatype = "station";

The humidity(s,i) and temp(s,i) data are associated with the coordinate values time(s,i), lat(s), lon(s), and optionally alt(s). The station dimension may be the unlimited dimension or not. All variables that have station as their single dimension are considered to be station information.

The time coordinate may use a missing value, which indicates that data is missing for that station and obs index. This allows one to have a variable number of observations at different stations, at the cost of some wasted space. The data variables may also use missing data values.

2.2 Parent index representation

When the number of observations at each station vary, one can use the parent index representation. Each observation has a parent index variable which contains an index into the station dimension, to identify which station the observation belongs to. The parent index variable is identified by having a standard name attribute of parent_index.

dimensions:
  station = 23 ;
  obs = UNLIMITED ;


variables:

  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  float alt(station) ;
    alt:long_name = "altitude above MSL" ;
    alt:units = "m" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "some kind of station info" ;

  int station_index(obs) ;
    station_index:long_name = "index of station " ;
    station_index:standard_name = "parent_index" ;
  double time(obs) ;
    time:long_name = "time of measurement" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float humidity(obs) ;
    humidity:long_name = "specific humidity" ;
    humidity:coordinates = "time lat lon alt" ;
    humidity:_FillValue = -999.9;
  float temp(obs) ;
    temp:long_name = "temperature" ;
    temp:units = "Celsius" ;
    temp:coordinates = "time lat lon alt" ;
    temp:_FillValue = -999.9;

attributes:
  :CF_datatype = "station";

The humidity(i) and temp(i) data are associated with the coordinate values time(i), lat(s), lon(s), and optionally alt(s), where s = station_index(i). Again, all variables that have station as their only dimension are considered to be information about that station. The obs dimension may use the unlimited dimension or not.

2.3 Parent/child linked list representation

When the number of observations at each station vary, and one wants fast access to all the observations for a station, one can use the parent/child linked list representation. Each station has a variable that holds the index of the first observation that belongs to it, identified by having a standard name attribute of child_index. In addition to the parent index variable holding the index of its parent station, each observation has a variable that holds the index of the next observation for the same station, identified by having a standard name attribute of next_index. The child index values are thus a linked list for each station.

dimensions:
  station = 23 ;
  obs = UNLIMITED ;


variables:

  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  float alt(station) ;
    alt:long_name = "altitude above MSL" ;
    alt:units = "m" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "some kind of station info" ;
  int first_obs(station) ;
    first_obs:long_name = "index of observation" ;
    first_obs:standard_name = "child_index" ;

  int station_index(obs) ;
    station_index:long_name = "index of station " ;
    station_index:standard_name = "parent_index" ;
  int next_obs(obs) ;
    next_obs:long_name = "index of next observation " ;
    next_obs:standard_name = "next_index" ;
  double time(obs) ;
    time:long_name = "time of measurement" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float humidity(obs) ;
    humidity:long_name = "specific humidity" ;
    humidity:coordinates = "time lat lon alt" ;
    humidity:_FillValue = -999.9;
  float temp(obs) ;
    temp:long_name = "temperature" ;
    temp:units = "Celsius" ;
    temp:coordinates = "time lat lon alt" ;
    temp:_FillValue = -999.9;

attributes:
  :CF_datatype = "station";

3. Trajectory Data

Point data may be taken along a flight path or ship path, constituting a trajectory. When a single trajectory is stored in a file, the representation is straightforward:

dimensions:
  time = 1000 ;


variables:
  double time(time) ;
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(time) ;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(time) ;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;
  float z(time) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  float O3(time) ;
    O3:long_name = "ozone concentration" ;
    O3:units = "1e-9" ;
    O3:coordinates = "time lon lat z" ;

  float NO3(time) ;
    NO3:long_name = "NO3 concentration" ;
    NO3:units = "1e-9" ;
    NO3:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "trajectory";

The NO3(n) and O3(n) data is associated with the coordinate values time(n), z(n), lat(n), and lon(n). The time coordinate should be ordered, so it is appropriate to use a coordinate variable for time. The time dimension may be unlimited or not.

3.1 Multidimensional representation

When storing multiple trajectories in the same file, and the number of observations in each trajectory is the same, one can use the multidimensional representation.

dimensions:
  obs = 1000 ;
  trajectory = 77 ;


variables:

  char trajectory(trajectory, name_strlen) ;
    trajectory:long_name = "trajectory name" ;
  int trajectory_info(trajectory) ;
    trajectory_name:long_name = "some kind of trajectory info" 

  double time(trajectory, obs) ;
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(trajectory, obs) ;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(trajectory, obs) ;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;
  float z(trajectory, obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  float O3(trajectory, obs) ;
    O3:long_name = "ozone concentration" ;
    O3:units = "1e-9" ;
    O3:coordinates = "time lon lat z" ;

  float NO3(trajectory, obs) ;
    NO3:long_name = "NO3 concentration" ;
    NO3:units = "1e-9" ;
    NO3:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "trajectory";

The NO3(t,i) and O3(t,i) data are associated with the coordinate values time(t,i), lat(t,i), lon(t,i), and alt(t,i). The trajectory dimension may be the unlimited dimension or not. All variables that have trajectory as their only dimension are considered to be information about that trajectory.

The time coordinate may use a missing value, which indicates that data is missing for that trajectory and obs index. This allows one to have a variable number of observations for different trajectories, at the cost of some wasted space. The data variables may also use missing data values.

3.2 Parent index representation

When the number of observations for each trajectory varies, one can use the parent index representation. Each observation has a parent index variable which contains an index into the trajectories, to identify which trajectory the observation belongs to. The parent index variable is identified by having a standard name attribute of parent_index.

dimensions:
  obs = UNLIMITED ;
  trajectory = 77 ;


variables:

  char trajectory(trajectory, name_strlen) ;
    trajectory:long_name = "trajectory name" ;
  int trajectory_info(trajectory) ;
    trajectory_name:long_name = "some kind of trajectory info" ;

  int trajectory_index(obs) ;
    trajectory_index:long_name = "index of trajectory " ;
    trajectory_index:standard_name = "parent_index" ;
  double time(obs) ;
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(obs) ;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(obs) ;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;
  float z(obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  float O3(obs) ;
    O3:long_name = "ozone concentration" ;
    O3:units = "1e-9" ;
    O3:coordinates = "time lon lat z" ;

  float NO3(obs) ;
    NO3:long_name = "NO3 concentration" ;
    NO3:units = "1e-9" ;
    NO3:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "trajectory";

The O3(i) and NO3(i) data are associated with the coordinate values time(i), lat(i), lon(i), and alt(i). All observations for one trajectory will have the same trajectory index value, and should be time ordered. All variables that have trajectory as their single dimension are considered to be information about that trajectory. The obs dimension may use the unlimited dimension or not.

3.3 Parent/child linked list representation

When the number of observations for each trajectory varies, and one wants fast access to all the observations for a trajectory, one can use the parent/child linked list representation. Each trajectory has a variable that holds the index of the first observation that belongs to it, identified by having a standard name attribute of child_index. In addition to the parent index variable holding the index of its parent trajectory, each observation has a variable that holds the index of the next observation for the same trajectory, identified by having a standard name attribute of next_index. The child index values are thus a linked list for each trajectory.

dimensions:
  obs = UNLIMITED ;
  trajectory = 77 ;


variables:
  char trajectory(trajectory, name_strlen) ;
    trajectory:long_name = "station name" ;
  int trajectory_info(trajectory) ;
    trajectory_name:long_name = "some kind of trajectory info" ;
  int first_obs(trajectory) ;
    first_obs:long_name = "index of observation" ;
    first_obs:standard_name = "child_index" ;

  int trajectory_index(obs) ;
    trajectory_index:long_name = "index of trajectory " ;
    trajectory_index:standard_name = "parent_index" ;
  int next_obs(obs) ;
    next_obs:long_name = "index of next observation " ;
    next_obs:standard_name = "next_index" ;
  double time(obs) ;
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(obs) ;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(obs) ;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;
  float z(obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  float O3(obs) ;
    O3:long_name = "ozone concentration" ;
    O3:units = "1e-9" ;
    O3:coordinates = "time lon lat z" ;

  float NO3(obs) ;
    NO3:long_name = "NO3 concentration" ;
    NO3:units = "1e-9" ;
    NO3:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "trajectory";

4. Profile Data

A series of point observations along a vertical line, like an atmospheric or ocean sounding, is called a profile. When a single profile is stored in a file, the representation is straightforward:

dimensions:
  z = 42 ;


variables:
  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  double time;
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;

  float pressure(z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile";

The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time, z(i), lat, and lon. The z coordinate must be ordered. The time coordinate may depend on z also, eg may be time(z).

4.1 Multidimensional representation

When storing multiple profiles in the same file, and the vertical levels in each profile are the same, one can use the multidimensional representation:

dimensions:
  z = 42 ;
  profile = 142 ;


variables:
  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  double time(profile);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(profile);
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(profile);
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;

  float pressure(profile, z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(profile, z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(profile, z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile";

The pressure(p,i), temperature(p,i), and humidity(p,i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p). If the vertical coordinates differ for each profile, but the number of levels are the same, one can use z(profile, z), but the z coordinate must be ordered for each profile.

The profile dimension may be the unlimited dimension or not. All variables that have profile as their only dimension are considered to be profile information.

The time coordinate may depend on z also, eg time(p,z). The time coordinate may use a missing value, which indicates that data is missing for that profile and obs index. This allows one to have a variable number of observations for different profiles, at the cost of some wasted space. The data variables may also use missing data values.

4.2 Parent index and parent/child linked list representation

When the number of observations for each profile varies, one can use the parent index representation by adding the profile_index variable to the observations, or use the parent/child linked list representation by adding the profile_index, next_child variable to the observations and the first_child variable to the profiles.

dimensions:
  obs = UNLIMITED ;
  profiles = 142 ;


variables:

  double time(profile);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(profile);
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(profile);
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ; 
  int first_child(profile) ;
    first_child:long_name = "index of observation" ;
    first_child:standard_name = "child_index" ;

  int profile_index(obs) ;
    profile_index:long_name = "index of trajectory " ;
    profile_index:standard_name = "parent_index" ;

  int next_child(obs) ;
    next_child:long_name = "index of next observation " ;
    next_child:standard_name = "next_index" ;

  float z(obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ;

  float pressure(obs) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(obs) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(obs) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile";

The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p=profile_index(i). The time coordinate may depend on z also, eg time(p,z).

5. Station Profile Data

When profiles are taken at a set of stations, one gets a time series of profiles at each station. If there is only one station in a file, and the vertical levels are the same for each profile, one can use a multidimensional representation, actually a variant of case 4.1:

dimensions:
  z = 42 ;
  time = UNLIMITED ;


variables:
  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  double time(time);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon;
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat;
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;

  float pressure(time, z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(time, z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(time, z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile time series";

The pressure(i,j), temperature(i,j), and humidity(i,j) data is associated with the coordinate values time(i), z(j), lat, and lon.

5.1 Multidimensional representation

When storing multiple time series of profiles in the same file, if there are the same number of time points and vertical levels for every profile, one can use the multidimensional representation.

dimensions:
  station = 22 ;
  time = 30 ;
  z = 42 ;


variables:
  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "some kind of station info" ;

  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  double time(station, time) ;
    time:long_name = "time of measurement" ;
    time:units = "days since 1970-01-01 00:00:00" ;
    time:missing_value = -999.9;

  float pressure(station, time, z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(station, time, z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(station, time, z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile time series";

The pressure(s,p,i), temperature(s,p,i), and humidity(s,p,i) data is associated with the coordinate values time(s,p), z(i), lat(s), and lon(s).

5.2 Linked time series, multidimensional profiles

When the number of observations for each profile is fixed, but the number of time points for each station varies, one can use linked lists to connect the profiles to the stations, and use a multidimensional representation for the profiles.

dimensions:
  station = 22 ;
  profile = UNLIMITED ;
  z = 42 ;


variables:
  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "some kind of station info" ;
  int first_profile(station) ;
    first_profile:long_name = "index of profile" ;
    first_profile:standard_name = "child_index" ;

  int station_index(profile) ;
    station_index:long_name = "index of station " ;
    station_index:standard_name = "parent_index" ;
  double time(profile);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ; 
  int next_profile( profile) ;
    next_profile:long_name = "index of next profile for this station " ;
    next_profile:standard_name = "next_index" ;

  float pressure(profile, z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(profile, z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(profile, z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile time series";

The pressure(p,i), temperature(p,i), and humidity(p,i) data are associated with the coordinate values time(p), z(i), lat(s), and lon(s), where s = station_index(p).

5.3 Linked time series, linked profiles

When the number of observations for each profile varies, and the number of time points for each station varies, one can use linked lists to connect the profiles to the stations, and another list to connect observations to the profiles.

dimensions:
  obs = UNLIMITED ;
  station = 142 ;


variables:
  float lon(station) ;
    lon:long_name = "station longitude";
    lon:units = "degrees_east";
  float lat(station) ;
    lat:long_name = "station latitude" ;
    lat:units = "degrees_north" ;
  float alt(station) ;
    alt:long_name = "altitude above MSL" ;
    alt:units = "m" ;
  char station_name(station, name_strlen) ;
    station_name:long_name = "station name" ;
  int station_info(station) ;
    station_name:long_name = "some kind of station info" ;
  int first_profile(station) ;
    first_profile:long_name = "index of profile" ;
    first_profile:standard_name = "child_index" ;

  int station_index(profile) ;
    station_index:long_name = "index of station " ;
    station_index:standard_name = "parent_index" ;
  double time(profile);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ; 
  int next_profile(profile) ;
    next_profile:long_name = "index of next profile for this station " ;
    next_profile:standard_name = "next_index" ;
  int first_obs(profile) ;
    first_obs:long_name = "index of observation" ;
    first_obs:standard_name = "child_index" ;

  int profile_index(obs) ;
    profile_index:long_name = "index of profile " ;
    profile_index:standard_name = "parent_index" ;

  int next_child(obs) ;
    next_child:long_name = "index of next observation " ;
    next_child:standard_name = "next_index" ;

  float z(obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ;

  float pressure(obs) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(obs) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(obs) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile timeseries";

The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(s), and lon(s), where p = profile_index(i), and s = station_index(p).


6. Section Profile Data

When profiles are taken along a trajectory, one gets a time series of profiles called a section.

6.1 Multidimensional representation

If the vertical levels are the same for each profile, one can use a multidimensional representation:

dimensions:
  z = 42 ;
  time = UNLIMITED ;


variables:
  float z(z) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ; 

  double time(time);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(time);
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(time);
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;

  float pressure(time, z) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(time, z) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(time, z) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile section";

The pressure(i,j), temperature(i,j), and humidity(i,j) data is associated with the coordinate values time(i), z(j), lat(i), and lon(i).

6.2 Parent index and parent/child linked list representation

When the vertical levels vary across profiles, one can use linked lists to connect the observations to the profiles:

dimensions:
  obs = UNLIMITED ;
  profile = 123 ;


variables:


  double time(profile);
    time:long_name = "time" ;
    time:units = "days since 1970-01-01 00:00:00" ;
  float lon(profile);
    lon:long_name = "longitude" ;
    lon:units = "degrees_east" ;
  float lat(profile);
    lat:long_name = "latitude" ;
    lat:units = "degrees_north" ;
  int first_child(profile) ;
    first_child:long_name = "index of observation" ;
    first_child:standard_name = "child_index" ;

  int profile_index(obs) ;
    trajectory_index:long_name = "index of profile " ;
    trajectory_index:standard_name = "parent_index" ;

  int next_child(obs) ;
    next_child:long_name = "index of next observation " ;
    next_child:standard_name = "next_index" ;

  float z(obs) ;
    z:long_name = "height above mean sea level" ;
    z:units = "km" ;
    z:positive = "up" ;

  float pressure(obs) ;
    pressure:long_name = "pressure level" ;
    pressure:units = "hPa" ;
    pressure:coordinates = "time lon lat z" ;

  float temperature(obs) ;
    temperature:long_name = "temperacture" ;
    temperature:units = "Celsius" ;
    temperature:coordinates = "time lon lat z" ;

  float humidity(obs) ;
    temperature:long_name = "reletive humidity" ;
    temperature:units = "%" ;
    temperature:coordinates = "time lon lat z" ;

attributes:
  :CF_datatype = "profile section";

The pressure(i), temperature(i), and humidity(i) data is associated with the coordinate values time(p), z(i), lat(p), and lon(p), where p = profile_index(i).

 

 

 
 
  Contact Us     Site Map     Search     Terms and Conditions     Privacy Policy     Participation Policy
 
National Science Foundation (NSF) UCAR Office of Programs University Corporation for Atmospheric Research (UCAR)   Unidata is a member of the UCAR Office of Programs, is managed by the University Corporation for Atmospheric Research, and is sponsored by the National Science Foundation.
P.O. Box 3000     Boulder, CO 80307-3000 USA     Tel: 303-497-8643     Fax: 303-497-8690