Go to the previous, next section.
Dimensions for a netCDF file are defined when it is created, while the
netCDF file is in define mode. Additional dimensions may be added
later by reentering define mode. A netCDF dimension has a name and a
size. At most one dimension in a netCDF file can
have the NC_UNLIMITED
size, which means a variable using this
dimension can grow to any length (like a record number in a file).
There is a suggested limit (currently 32) to the number of dimensions
that can be defined in a single netCDF file. The limit is the value of
the predefined macro MAX_NC_DIMS
(MAXNCDIM for FORTRAN). The
purpose of the limit is to make writing generic applications simpler.
They need only provide an array of
MAX_NC_DIMS
dimensions to handle any netCDF file. The
implementation of the netCDF library does not enforce this advisory
maximium, so it is possible to use more dimensions, if necessary; just
don't expect generic applications or netCDF utilities to be able to
handle the resulting netCDF files.
Ordinarily, the name and size of a dimension are fixed when the dimension is first defined. The name may be changed later, but the size of a dimension cannot be changed without copying the netCDF to a new netCDF with a redefined dimension size.
Dimension sizes in the C interface are type long
rather than type
int
to make it possible to access all the data in a netCDF file
on a platform that only supports a 16-bit int
data types, for
example MSDOS. If dimension sizes were type int
instead, it
would not be possible to access data from variables with a dimension
size greater than a 16-bit int
can accommodate.
Operations supported on dimensions are:
The function ncdimdef
(or NCDDEF
for FORTRAN) adds a new
dimension to an open netCDF file in define mode. It returns a dimension
ID, given the netCDF ID, the dimension name, and the dimension size. At
most one unlimited size dimension, called the record dimension,
may be defined for each netCDF file.
In case of an error, ncdimdef
returns -1; NCDDEF
returns a
nonzero value in rcode
. Possible causes of errors include:
int ncdimdef(int ncid, const char* name, long size);
ncid
ncopen
or nccreate
.
name
size
long
) or the predefined constant NC_UNLIMITED
.
Here is an example using ncdimdef
to create a dimension named
lat
of size 18 and a record dimension named rec
in a new
netCDF file named `foo.nc':
#include "netcdf.h" ... int ncid, latid, recid; ... ncid = nccreate("foo.nc", NC_NOCLOBBER); ... latid = ncdimdef(ncid, "lat", 18L); recid = ncdimdef(ncid, "rec", NC_UNLIMITED);
INTEGER FUNCTION NCDDEF (INTEGER NCID, + CHARACTER*(*) DIMNAM, + INTEGER DIMSIZ, + INTEGER RCODE)
NCID
NCOPN
or NCCRE
.
DIMNAM
DIMSIZ
NCUNLIM
.
RCODE
Here is an example using NCDDEF
to create a dimension named
lat
of size 18 and a record dimension named rec
in a new
netCDF file named `foo.nc':
INCLUDE 'netcdf.inc' ... INTEGER NCID, RCODE, LATID, RECID ... NCID = NCCRE('foo.nc', NCNOCLOB, RCODE) ... LATID = NCDDEF(NCID, 'lat', 18, RCODE) RECID = NCDDEF(NCID, 'rec', NCUNLIM, RCODE)
ncdimid
(or NCDID
for FORTRAN) returns the ID
of a netCDF dimension, given the name of the dimension. If ndims
is the number of dimensions defined for a netCDF file, each dimension
has an ID between 0
and ndims-1
(or 1
and
ndims
for FORTRAN).
In case of an error, ncdimid
returns -1; NCDID
returns a
nonzero value in rcode
. Possible causes of errors include:
int ncdimid(int ncid, const char* name);
ncid
ncopen
or nccreate
.
name
Here is an example using ncdimid
to determine the dimension ID of
a dimension named lat
, assumed to have been defined previously in
an existing netCDF file named `foo.nc':
#include "netcdf.h" ... int ncid, latid; ... ncid = ncopen("foo.nc", NC_NOWRITE); /* open for reading */ ... latid = ncdimid(ncid, "lat");
INTEGER FUNCTION NCDID (INTEGER NCID, + CHARACTER*(*) DIMNAME, + INTEGER RCODE)
NCID
NCOPN
or NCCRE
.
DIMNAME
RCODE
Here is an example using NCDID
to determine the dimension ID of
a dimension named lat
, assumed to have been defined previously in
an existing netCDF file named `foo.nc':
INCLUDE 'netcdf.inc' ... INTEGER NCID, RCODE, LATID ... NCID = NCOPN('foo.nc', NCNOWRIT, RCODE) ... LATID = NCDID(NCID, 'lat', RCODE)
The function ncdiminq
(or NCDINQ
for FORTRAN) returns the
name and size of a dimension, given its ID. The size for the
unlimited dimension, if any, is the maximum value used so far in
writing data for that dimension (which is the same as the current
maximum record number).
In case of an error, ncdiminq
returns -1; NCDINQ
returns a
nonzero value in rcode
. Possible causes of errors include:
int ncdiminq(int ncid, int dimid, char* name, long* size);
ncid
ncopen
or nccreate
.
dimid
ncdimid
or
ncdimdef
.
name
MAX_NC_NAME
.
If the name parameter is given as `(char *) 0', no name will be
returned so no space needs to be allocated.
size
Here is an example using ncdiminq
to determine the size of a
dimension named lat
, and the name and current maximum size of the
unlimited (or record) dimension for an existing netCDF file named
`foo.nc':
#include "netcdf.h" ... int ncid, latid, ndims, nvars, ngatts, recid; long latsize, recs; char recname[MAX_NC_NAME]; ... ncid = ncopen("foo.nc", NC_NOWRITE); /* open for reading */ ... latid = ncdimid(ncid, "lat"); /* get lat size, but don't get name, since we already know it */ ncdiminq(ncid, latid, (char *) 0, &latsize); /* get ID of record dimension (among other things) */ ncinquire(ncid, &ndims, &nvars, &ngatts, &recid); /* get record dimension name and current size */ ncdiminq(ncid, recid, recname, &recs);
SUBROUTINE NCDINQ (INTEGER NCID, INTEGER DIMID, + CHARACTER*(*) DIMNAM, INTEGER DIMSIZ, + INTEGER RCODE)
NCID
NCOPN
or NCCRE
.
DIMID
NCDID
or NCDDEF
.
DIMNAM
MAXNCNAM
.
DIMSIZ
RCODE
Here is an example using NCDINQ
to determine the size of a
dimension named lat
, and the name and current maximum size of the
unlimited (or record) dimension for an existing netCDF file named
`foo.nc':
INCLUDE 'netcdf.inc' ... INTEGER NCID, RCODE, LATID, LATSIZ INTEGER NDIMS, NVARS, NGATTS, RECID, NRECS * 31 in following statement is parameter MAXNCNAM CHARACTER*31 LATNAM, RECNAM ... NCID = NCOPN('foo.nc', NCNOWRIT, RCODE) ... LATID = NCDID(NCID, 'lat', RCODE) * get lat name and size, (even though we already know name) CALL NCDINQ(NCID, LATID, LATNAM, LATSIZ, RCODE) * get ID of record dimension (among other things) CALL NCINQ(NCID, NDIMS, NVARS, NGATTS, RECID, RCODE) * get record dimension name and current size CALL NCDINQ(NCID, RECID, RECNAME, NRECS, RCODE)
The function ncdimrename
(or NCDREN
for FORTRAN) renames
an existing dimension in a netCDF file open for writing. If the new name is
longer than the old name, the netCDF must be in define mode. You cannot
rename a dimension to have the same name as another dimension.
In case of an error, ncdimrename
returns -1; NCDREN
returns a
nonzero value in rcode
. Possible causes of errors include:
int ncdimrename(int ncid, int dimid, const char* name);
ncid
ncopen
or nccreate
.
dimid
ncdimid
or ncdimdef
.
name
Here is an example using ncdimrename
to rename the dimension
lat
to latitude
in an existing netCDF file named `foo.nc':
#include "netcdf.h" ... int ncid, latid; ... ncid = ncopen("foo.nc", NC_WRITE); /* open for writing */ ... ncredef(ncid); /* put in define mode to rename dimension */ latid = ncdimid(ncid, "lat"); ncdimrename(ncid, latid, "latitude"); ncendef(ncid); /* leave define mode */
SUBROUTINE NCDREN (INTEGER NCID, INTEGER DIMID, + CHARACTER*(*) DIMNAME, INTEGER RCODE)
NCID
NCOPN
or NCCRE
.
DIMID
NCDID
or
NCDDEF
.
DIMNAM
RCODE
Here is an example using NCDREN
to rename the dimension
"lat" to "latitude" in an existing netCDF file named `foo.nc':
INCLUDE 'netcdf.inc' ... INTEGER NCID, RCODE, LATID ... NCID = NCOPN('foo.nc', NCWRITE, RCODE) ... * put in define mode to rename dimension CALL NCREDF(NCID, RCODE) LATID = NCDID(NCID, 'lat', RCODE) CALL NCDREN(NCID, LATID, 'latitude', RCODE) * leave define mode CALL NCENDF(NCID, RCODE)
Go to the previous, next section.