...
NetCDF can be used to handle a great number of scientific data types. Metview uses NetCDF as an internal format for representing data units which can't be conveniently represented by GRIB, BUFR or geopoints, for example, to handle data arrays representing cross-sections and cross-sectional averages, vertical profiles, Hovmøller matrices, etc. Such NetCDF data files can then be imported by other NetCDF conversant software if users so wish.
Metview provides a set of NetCDF handling macro functions, allowing users to apply a number of functions and operators to NetCDF data - see NetCDF Functions.
How operators and functions work on NetCDF
NetCDF files can contain a wide variety of data. They can contain a number of data units, e.g. a set of cross section plots, a set of 2D geographical grids, a set of time series or vertical profiles, etc. Each component of a set is stored in the netCDF file as a separate netcdf variable . The handling of and computations with netCDF files are based on the concept of current variable.
Code Block | ||
---|---|---|
| ||
setcurrent(netcdf1, 6) # use the 6th variable in this netCDF file setcurrent(netcdf2, 2) # use the 2nd variable in this netCDF file netcdf3 = netcdf1 op netcdf2 out = function(netcdf1, ...) |
Working with multi-variable NetCDF files
Users can list the variables held in a netcdf variable by means of the function variables()
:
var_list = variables(netcdf)
setcurrent(netcdf, n)
The two functions above provide the basic framework to operate on multi-variable netcdf files.
Example 1 : To operate on a netcdf file which you want to overwrite with the new results
Code Block | ||
---|---|---|
| ||
# Derive a cross section of temperature data in a netcdf variable (...) # derive the list of netcdf variables var_list = variables(temp_xs) # loop over variables and subtract scalar for i = 1 to count(var_list) do setcurrent(temp_xs, i) temp_xs = temp_xs - 273.15 # acts on current variable only end for |
...
Example 2 : To operate on two netcdf files, assigning the result to a third netcdf, you should create the output netcdf first by a simple copying of one of the input netcdfs :
Code Block | ||
---|---|---|
| ||
# Derive cross sections of temperature forecast and analysis # in two netcdf variables, tfc_xs and tan_xs.... (...) # derive the list of netcdf variables var_list = variables(tfc_xs) # create output netcdf diff_xs = tfc_xs # loop over variables and create fc-an difference cross-section for i = 1 to count(var_list) do setcurrent(tan_xs, i) setcurrent(tfc_xs, i) setcurrent(diff_xs, i) diff_xs = tfc_xs - tan_xs end for |
Extracting NetCDF values
val_list = values(netcdf)
which returns a vector with all the values for the current variable.You can then use the Vector functions to manipulate the data. This technique could even be used to create a new Geopoints variable with the netCDF data, or to insert the values into a GRIB field.
An alternative method for accessing individual values is to the use the function value()
:
val = value(netcdf, n)
which returns the nth value from the current netcdf variable.