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) ;