Go to the previous, next section.
The function ncvarputg
(or NCVPTG
or NCVPGC
for
FORTRAN) writes a generalized hyperslab of values into a netCDF variable
of an open
netCDF file. The generalized hyperslab is specified by giving a corner,
a vector of edge lengths, a stride vector, and an index mapping vector.
No assumptions are made about the ordering or size of the dimensions of the
data array.
The netCDF file must be in data mode.
In case of an error, ncvarputg
returns -1; NCVPTG
and
NCVPGC
return a
nonzero value in rcode
. Possible causes of errors include:
int ncvarputg(int ncid, int varid, const long start[], const long count[], const long stride[], const long imap[], const void *values);
ncid
ncopen
or nccreate
.
varid
ncvardef
or
ncvarid
.
start
(0, 0, ..., 0)
. The
size of start
must be the same as the number of dimensions of the
specified variable. The elements of start
must correspond to the
variable's dimensions in order. Hence, if the variable is a record
variable, the first index would correspond to the starting record number
for writing the data values.
count
count
as
(1, 1, ..., 1)
. The size of count
is the number of
dimensions of the specified variable. The elements of count
correspond to the variable's dimensions. Hence, if the variable is a
record variable, the first element of count
corresponds to a
count of the number of records to write.
stride
NULL
stride argument obtains the default behavior in which
adjacent values are accessed along each dimension.
imap
value
argument to a particular datum is given by the
inner product of the index mapping vector with the coordinates of
the datum.
(The inner product of two vectors [x0, x1, ..., xn] and
[y0, y1, ..., yn] is just x0*y0 + x1*y1 + ... + xn*yn.)
The vector may contain negative values if the
value
argument is appropriately specified.
A NULL
argument obtains the default behavior in
which the memory-resident values are assumed to have the same structure as the
associated netCDF variable.
value
void *
because it can point to data of any of the basic netCDF
types. The data should be of the appropriate type for the netCDF
variable. Warning: neither the compiler nor the netCDF software
can detect whether the wrong type of data is used.
Here is an example using ncvarputg
to add or change every other value
in each dimension
of the variable named rh
to 0.5
in an existing netCDF file
named `foo.nc'.
Values are taken, using the same dimensional strides, from points
in a 3-dimensional array of
structures whose dimensions are the reverse of the netCDF variable.
For simplicity in this example, we assume that we
know that rh
is dimensioned with time
, lat
, and
lon
, and that there are three time
values, five lat
values, and ten lon
values.
#include "netcdf.h" ... #define TIMES 3 #define LATS 5 #define LONS 10 int ncid; /* netCDF ID */ int rh_id; /* variable ID */ static long start[] = {0, 0, 0}; /* start at first value */ static long count[] = {TIMES, LATS, LONS}; static long stride[] = {2, 2, 2}; /* every other value */ long imap[3]; /* set to reverse of variable */ struct datum { int dummy; /* to illustrate mapping vector */ double rh_val; /* actual value to be written */ } data[LONS][LATS][TIMES]; /* reversed array to hold values. */ int itime, ilat, ilon; ... ncid = ncopen("foo.nc", NC_WRITE); ... rh_id = ncvarid (ncid, "rh"); ... for (ilon = 0; ilon < LONS; ilon += stride[2]) for (ilat = 0; ilat < LATS; ilat += stride[1]) for (itime = 0; itime < TIMES; itime += stride[0]) data[ilon][ilat][itime].rh_val = 0.5; /* access every `stride' in-memory value using reversed dimensions */ imap[0] = stride[2]*sizeof(struct datum); imap[1] = stride[1]*(1+(LONS-1)/stride[0])*imap[0]; imap[2] = stride[0]*(1+(LATS-1)/stride[1])*imap[1]; /* write generalized hyperslab of values into netCDF variable */ ncvarputg(ncid, rh_id, start, count, stride, imap, (void*)&data[0][0][0].rh_val);
SUBROUTINE NCVPTG (INTEGER NCID, INTEGER VARID, + INTEGER START(*), INTEGER COUNT(*), + INTEGER STRIDE(*), INTEGER IMAP(*), + type VALUES, INTEGER RCODE) SUBROUTINE NCVPGC (INTEGER NCID, INTEGER VARID, + INTEGER START(*), INTEGER COUNT(*), + INTEGER STRIDE(*), INTEGER IMAP(*), + CHARACTER*(*) STRING, INTEGER RCODE)
There are two FORTRAN subroutines, NCVPTG
and NCVPGC
, for
writing a generalized hyperslab of values into a netCDF variable.
The first writes
numeric values into a variable of numeric type, and the second
writes character values into a variable of character type.
NCID
NCOPN
or NCCRE
.
VARID
NCVDEF
or
NCVID
.
START
(1, 1, ..., 1)
. The
size of START
must be the same as the number of dimensions of the
specified variable. The elements of START
must correspond to the
variable's dimensions in order. Hence, if the variable is a record
variable, the last index would correspond to the starting record number
for writing the data values.
COUNT
COUNT
as
(1, 1, ..., 1)
. The size of COUNT
is the number of
dimensions of the specified variable. The elements of COUNT
correspond to the variable's dimensions. Hence, if the variable is a
record variable, the last element of COUNT
corresponds to a
count of the number of records to write.
STRIDE
0
.
The size of the vector shall be at least the number of dimensions of the
associated
netCDF variable and its elements shall correspond, in order, to the
variable's dimensions.
A value of 1 accesses adjacent values of the netCDF variable
in the corresponding dimension;
a value of 2 accesses every other value of the netCDF variable in the
corresponding dimension; and so on.
An 0
argument obtains the default behavior in which
adjacent values are accessed along each dimension.
IMAP
0
.
The offset, in bytes, from the memory location pointed to by the value
argument to a particular datum is given by the
inner product of the index mapping vector with the (origin-0) coordinates of
the datum.
(The inner product of two vectors [x1, x2, ..., xn] and
[y1, y2, ..., yn] is just x1*y1 + x2*y2 + ... + xn*yn.)
The vector may contain negative values if the
value
argument is appropriately specified.
A 0
argument obtains the default behavior in
which the memory-resident values are assumed to have the same structure as the
associated netCDF variable.
VALUES
NCVPTG
, the block of data values to be written. The order in
which the data will be written from the specified hyperslab is with the
first dimension of the generalized hyperslab varying fastest (like the
ordinary FORTRAN convention).
The data may be of a type corresponding to any of the netCDF types
NCSHORT
, NCLONG
, NCFLOAT
, or NCDOUBLE
, but
must be appropriate for the type of the netCDF variable.
Warning: neither the compiler nor the netCDF software can detect
whether the wrong type of data is used.
STRING
NCVPGC
, the characters to be written. The order in which the
characters will be written to the netCDF variable
is with the
first dimension
of the generalized hyperslab
varying fastest (like the FORTRAN convention).
The data
may be of a type corresponding to the netCDF types NCCHAR
or
NCBYTE
.
RCODE
Here is an example using NCVPTG
to add or change every other
value in each dimension
of the variable named rh
to 0.5
in an existing
netCDF file named `foo.nc'.
Values are taken, using the same dimensional strides, from a 2-parameter
array whose dimensions
are the reverse of the netCDF variable.
For simplicity in this example, we
assume that we know that rh
is dimensioned with lon
,
lat
, and time
, and that there are ten lon
values, five
lat
values, and three time
values.
INCLUDE 'netcdf.inc' ... PARAMETER (NDIMS=3) ! number of dimensions PARAMETER (TIMES=3, LATS=5, LONS=10) ! dimension sizes INTEGER NCID, RCODE INTEGER RHID ! variable ID INTEGER START(NDIMS), COUNT(NDIMS), + STRIDE(NDIMS), IMAP(NDIMS) ! generalized hyperslab DOUBLE DATA(2, TIMES, LATS, LONS) ! rh is second parameter DATA START /1, 1, 1/ ! start at first value DATA COUNT /LONS, LATS, TIMES/ DATA STRIDE /2, 2, 2/ ... NCID = NCOPN ('foo.nc', NCWRITE, RCODE) ... RHID = NCVID (NCID, 'rh', RCODE) ! get ID DO 10 ILON = 1, LONGS, STRIDE(1) DO 10 ILAT = 1, LATS, STRIDE(2) DO 10 ITIME = 1, TIMES, STRIDE(3) DATA(2, ITIME, ILAT, ILON) = 0.5 10 CONTINUE IMAP(3) = 8*2*2 ! every other point of vector of 2-doubles IMAP(2) = IMAP(3)*(1+(TIMES-1)/STRIDE(3))*2 IMAP(1) = IMAP(2)*(1+(LATS-1)/STRIDE(2))*2 CALL NCVPTG (NCID, RHID, START, COUNT, STRIDE, IMAP, + DATA(2,1,1,1), RCODE)
Go to the previous, next section.