For some calculations, information is needed about the size, shape or location of the cells that cannot be deduced from the coordinates and bounds without special knowledge that a generic application cannot be expected to have. For instance, in computing the mean of several cell values, it is often appropriate to "weight" the values by area. When computing an area-mean each grid cell value is multiplied by the grid-cell area before summing, and then the sum is divided by the sum of the grid-cell areas. Area weights may also be needed to map data from one grid to another in such a way as to preserve the area mean of the field. The preservation of area-mean values while regridding may be essential, for example, when calculating surface heat fluxes in an atmospheric model with a grid that differs from the ocean model grid to which it is coupled.
In many cases the areas can be calculated from the cell bounds, but
there are exceptions. Consider, for example, a spherical geodesic grid
composed of contiguous, roughly hexagonal cells. The vertices of the cells
can be stored in the variable identified by the bounds
attribute, but the cell perimeter is not uniquely defined by its vertices
(because the vertices could, for example, be connected by straight lines,
or, on a sphere, by lines following a great circle, or, in general, in
some other way). Thus, given the cell vertices alone, it is generally
impossible to calculate the area of a grid cell. This is why it may be
necessary to store the grid-cell areas in addition to the cell
vertices.
In other cases, the grid cell-volume might be needed and might not be easily calculated from the coordinate information. In ocean models, for example, it is not uncommon to find "partial" grid cells at the bottom of the ocean. In this case, rather than (or in addition to) indicating grid cell area, it may be necessary to indicate volume.
To indicate extra information about the spatial properties of a
variable's grid cells, a cell_measures
attribute may be
defined for a variable. This is a string attribute comprising a list of
blank-separated pairs of words of the form "measure:
name
". For the moment, "area
" and
"volume
" are the only defined measures, but others may
be supported in future. The "name" is the name of the variable containing
the measure values, which we refer to as a "measure variable". The
dimensions of the measure variable should be the same as or a subset of
the dimensions of the variable to which they are related, but their order
is not restricted. In the case of area, for example, the field itself
might be a function of longitude, latitude, and time, but the variable
containing the area values would only include longitude and latitude
dimensions (and the dimension order could be reversed, although this is
not recommended). The variable must have a units
attribute and may have other attributes such as a
standard_name
.
For rectangular longitude-latitude grids, the area of grid cells can
be calculated from the bounds: the area of a cell is proportional to the
product of the difference in the longitude bounds of the cell and the
difference between the sine of each latitude bound of the cell. In this
case supplying grid-cell areas via the cell_measures
attribute is unnecessary because it may be assumed that applications can
perform this calculation, using their own value for the radius of the
Earth.
Example 7.3. Cell areas for a spherical geodesic grid
dimensions: cell = 2562 ; // number of grid cells time = 12 ; nv = 6 ; // maximum number of cell vertices variables: float PS(time,cell) ; PS:units = "Pa" ; PS:coordinates = "lon lat" ; PS:cell_measures = "area: cell_area" ; float lon(cell) ; lon:long_name = "longitude" ; lon:units = "degrees_east" ; lon:bounds="lon_vertices" ; float lat(cell) ; lat:long_name = "latitude" ; lat:units = "degrees_north" ; lat:bounds="lat_vertices" ; float time(time) ; time:long_name = "time" ; time:units = "days since 1979-01-01 0:0:0" ; float cell_area(cell) ; cell_area:long_name = "area of grid cell" ; cell_area:standard_name="area"; cell_area:units = "m2" float lon_vertices(cell,nv) ; float lat_vertices(cell,nv) ;