18 int ncopts = (NC_FATAL | NC_VERBOSE) ;
21 #if SIZEOF_LONG == SIZEOF_SIZE_T
28 # define A_DECL(name, type, ndims, rhs) \
29 const type *const name = ((const type *)(rhs))
33 # define A_INIT(lhs, type, ndims, rhs)
47 nvdims(
int ncid,
int varid)
53 nc_advise(
"ncvdims", status,
"ncid %d", ncid);
61 static void* nvmalloc(off_t size) {
69 #define NDIMS_DECL const int ndims = nvdims(ncid, varid); \
72 # define A_DECL(name, type, ndims, rhs) \
73 type *const name = (type*) nvmalloc((ndims) * sizeof(type))
79 # define A_FREE(name) \
82 # define A_INIT(lhs, type, ndims, rhs) \
84 if((off_t)ndims >= 0) { \
85 const long *lp = rhs; \
87 type *const end = lhs + ndims; \
90 *tp++ = (type) *lp++; \
95 if ((off_t)ndims < 0) {nc_advise("nvdims",NC_EMAXDIMS,"ndims %d",ndims); return -1;}
100 typedef signed char schar;
107 numrecvars(
int ncid,
int* nrecvarsp,
int *recvarids)
117 status = nc_inq_nvars(ncid, &nvars);
125 if (recdimid == -1) {
130 for (varid = 0; varid < nvars; varid++) {
137 if (ndims > 0 && dimids[0] == recdimid) {
138 if (recvarids != NULL)
139 recvarids[nrecvars] = varid;
143 *nrecvarsp = nrecvars;
153 ncrecsize(
int ncid,
int varid,
size_t *recsizep)
176 if (ndims == 0 || dimids[0] != recdimid) {
179 size = nctypelen(type);
180 for (
id = 1;
id < ndims;
id++) {
187 *recsizep = (size_t)size;
197 dimsizes(
int ncid,
int varid,
size_t *sizes)
210 if (ndims == 0 || sizes == NULL)
212 for (
id = 0;
id < ndims;
id++) {
242 status = nc_inq_nvars(ncid, &nvars);
253 status = numrecvars(ncid, &nrvars, rvarids);
257 if (nrecvarsp != NULL)
258 *nrecvarsp = (size_t)nrvars;
260 if (recvarids != NULL)
261 for (varid = 0; varid < nrvars; varid++)
262 recvarids[varid] = rvarids[varid];
264 if (recsizes != NULL)
265 for (varid = 0; varid < nrvars; varid++) {
267 status = ncrecsize(ncid, rvarids[varid], &rsize);
270 recsizes[varid] = rsize;
295 status = numrecvars(ncid, &nrvars, rvarids);
303 for (varid = 1; varid < nrvars; varid++)
306 for (varid = 0; varid < nrvars; varid++) {
307 if (datap[varid] != NULL) {
308 status = dimsizes(ncid, rvarids[varid], edges);
313 status =
nc_put_vara(ncid, rvarids[varid], start, edges, datap[varid]);
341 status = numrecvars(ncid, &nrvars, rvarids);
349 for (varid = 1; varid < nrvars; varid++)
352 for (varid = 0; varid < nrvars; varid++) {
353 if (datap[varid] != NULL) {
354 status = dimsizes(ncid, rvarids[varid], edges);
358 status =
nc_get_vara(ncid, rvarids[varid], start, edges, datap[varid]);
369 nc_advise(
const char *routine_name,
int err,
const char *fmt,...)
378 if( ncopts & NC_VERBOSE )
380 (void) fprintf(stderr,
"%s: ", routine_name);
382 (void) vfprintf(stderr,fmt,args);
386 (void) fprintf(stderr,
": %s",
389 (void) fputc(
'\n',stderr);
390 (void) fflush(stderr);
393 if( (ncopts & NC_FATAL) && err !=
NC_NOERR )
402 nccreate(
const char* path,
int cmode)
405 const int status =
nc_create(path, cmode, &ncid);
408 nc_advise(
"nccreate", status,
"filename \"%s\"", path);
416 ncopen(
const char *path,
int mode)
419 const int status =
nc_open(path, mode, &ncid);
422 nc_advise(
"ncopen", status,
"filename \"%s\"", path);
435 nc_advise(
"ncredef", status,
"ncid %d", ncid);
448 nc_advise(
"ncendef", status,
"ncid %d", ncid);
461 nc_advise(
"ncclose", status,
"ncid %d", ncid);
479 const int status =
nc_inq(ncid, &nd, &nv, &na, recdim);
483 nc_advise(
"ncinquire", status,
"ncid %d", ncid);
504 const int status =
nc_sync(ncid);
507 nc_advise(
"ncsync", status,
"ncid %d", ncid);
518 const int status = nc_abort(ncid);
521 nc_advise(
"ncabort", status,
"ncid %d", ncid);
539 nc_advise(
"ncdimdef", status,
"ncid %d", ncid);
542 status =
nc_def_dim(ncid, name, (
size_t)length, &dimid);
545 nc_advise(
"ncdimdef", status,
"ncid %d", ncid);
553 ncdimid(
int ncid,
const char* name)
559 nc_advise(
"ncdimid", status,
"ncid %d", ncid);
575 const int status =
nc_inq_dim(ncid, dimid, name, &ll);
579 nc_advise(
"ncdiminq", status,
"ncid %d", ncid);
601 nc_advise(
"ncdimrename", status,
"ncid %d", ncid);
618 const int status =
nc_def_var(ncid, name, datatype, ndims, dim, &varid);
621 nc_advise(
"ncvardef", status,
"ncid %d", ncid);
638 nc_advise(
"ncvarid", status,
"ncid %d", ncid);
657 const int status =
nc_inq_var(ncid, varid, name, datatype,
662 nc_advise(
"ncvarinq", status,
"ncid %d", ncid);
686 A_DECL(coordp,
size_t, (
size_t)ndims, index);
687 A_INIT(coordp,
size_t, (
size_t)ndims, index);
689 const int status =
nc_put_var1(ncid, varid, coordp, value);
693 nc_advise(
"ncvarput1", status,
"ncid %d", ncid);
710 A_DECL(coordp,
size_t, ndims, index);
711 A_INIT(coordp,
size_t, ndims, index);
713 const int status =
nc_get_var1(ncid, varid, coordp, value);
717 nc_advise(
"ncdimid", status,
"ncid %d", ncid);
735 A_DECL(stp,
size_t, ndims, start);
736 A_DECL(cntp,
size_t, ndims, count);
737 A_INIT(stp,
size_t, ndims, start);
738 A_INIT(cntp,
size_t, ndims, count);
740 const int status =
nc_put_vara(ncid, varid, stp, cntp, value);
745 nc_advise(
"ncvarput", status,
"ncid %d", ncid);
763 A_DECL(stp,
size_t, ndims, start);
764 A_DECL(cntp,
size_t, ndims, count);
765 A_INIT(stp,
size_t, ndims, start);
766 A_INIT(cntp,
size_t, ndims, count);
768 const int status =
nc_get_vara(ncid, varid, stp, cntp, value);
773 nc_advise(
"ncvarget", status,
"ncid %d; varid %d", ncid, varid);
792 return ncvarput(ncid, varid, start, count, value);
797 A_DECL(stp,
size_t, ndims, start);
798 A_DECL(cntp,
size_t, ndims, count);
799 A_DECL(strdp, ptrdiff_t, ndims, stride);
800 A_INIT(stp,
size_t, ndims, start);
801 A_INIT(cntp,
size_t, ndims, count);
802 A_INIT(strdp, ptrdiff_t, ndims, stride);
804 const int status =
nc_put_vars(ncid, varid, stp, cntp, strdp, value);
810 nc_advise(
"ncvarputs", status,
"ncid %d", ncid);
830 return ncvarget(ncid, varid, start, count, value);
834 A_DECL(stp,
size_t, ndims, start);
835 A_DECL(cntp,
size_t, ndims, count);
836 A_DECL(strdp, ptrdiff_t, ndims, stride);
837 A_INIT(stp,
size_t, ndims, start);
838 A_INIT(cntp,
size_t, ndims, count);
839 A_INIT(strdp, ptrdiff_t, ndims, stride);
841 const int status =
nc_get_vars(ncid, varid, stp, cntp, strdp, value);
847 nc_advise(
"ncvargets", status,
"ncid %d", ncid);
868 return ncvarputs(ncid, varid, start, count, stride, value);
872 A_DECL(stp,
size_t, ndims, start);
873 A_DECL(cntp,
size_t, ndims, count);
874 A_DECL(strdp, ptrdiff_t, ndims, stride);
875 A_DECL(imp, ptrdiff_t, ndims, map);
876 A_INIT(stp,
size_t, ndims, start);
877 A_INIT(cntp,
size_t, ndims, count);
878 A_INIT(strdp, ptrdiff_t, ndims, stride);
879 A_INIT(imp, ptrdiff_t, ndims, map);
882 stp, cntp, strdp, imp, value);
889 nc_advise(
"ncvarputg", status,
"ncid %d", ncid);
910 return ncvargets(ncid, varid, start, count, stride, value);
914 A_DECL(stp,
size_t, ndims, start);
915 A_DECL(cntp,
size_t, ndims, count);
916 A_DECL(strdp, ptrdiff_t, ndims, stride);
917 A_DECL(imp, ptrdiff_t, ndims, map);
918 A_INIT(stp,
size_t, ndims, start);
919 A_INIT(cntp,
size_t, ndims, count);
920 A_INIT(strdp, ptrdiff_t, ndims, stride);
921 A_INIT(imp, ptrdiff_t, ndims, map);
924 stp, cntp, strdp, imp, value);
931 nc_advise(
"ncvargetg", status,
"ncid %d", ncid);
950 nc_advise(
"ncvarrename", status,
"ncid %d", ncid);
967 const int status =
nc_put_att(ncid, varid, name, datatype, len, value);
970 nc_advise(
"ncattput", status,
"ncid %d", ncid);
987 const int status =
nc_inq_att(ncid, varid, name, datatype, &ll);
990 nc_advise(
"ncattinq", status,
991 "ncid %d; varid %d; attname \"%s\"",
1012 const int status =
nc_get_att(ncid, varid, name, value);
1015 nc_advise(
"ncattget", status,
"ncid %d", ncid);
1031 const int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
1034 nc_advise(
"ncattcopy", status,
"%s", name);
1052 nc_advise(
"ncattname", status,
"ncid %d", ncid);
1067 const int status =
nc_rename_att(ncid, varid, name, newname);
1070 nc_advise(
"ncattrename", status,
"ncid %d", ncid);
1084 const int status =
nc_del_att(ncid, varid, name);
1087 nc_advise(
"ncattdel", status,
"ncid %d", ncid);
1104 const int status =
nc_set_fill(ncid, fillmode, &oldmode);
1107 nc_advise(
"ncsetfill", status,
"ncid %d", ncid);
1130 status = nc_inq_rec(ncid, &nrv, recvarids, rs);
1133 nc_advise(
"ncrecinq", status,
"ncid %d", ncid);
1134 if(rs != NULL) free(rs);
1138 if(nrecvars != NULL)
1139 *nrecvars = (int) nrv;
1141 if(recsizes != NULL)
1144 for(ii = 0; ii < nrv; ii++)
1146 recsizes[ii] = (long) rs[ii];
1150 if(rs != NULL) free(rs);
1163 const int status = nc_get_rec(ncid, (
size_t)recnum, datap);
1166 nc_advise(
"ncrecget", status,
"ncid %d", ncid);
1180 const int status = nc_put_rec(ncid, (
size_t)recnum, datap);
1183 nc_advise(
"ncrecput", status,
"ncid %d", ncid);
EXTERNL int nc_rename_att(int ncid, int varid, const char *name, const char *newname)
Rename an attribute.
#define MAX_NC_DIMS
Backward compatible alias.
#define NC_ENOMEM
Memory allocation (malloc) failure.
EXTERNL int nc_inq_vardimid(int ncid, int varid, int *dimidsp)
Learn the dimension IDs associated with a variable.
EXTERNL int nc_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp)
Return information about a netCDF attribute.
EXTERNL int nc_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int *dimidsp, int *varidp)
Define a new variable.
EXTERNL int nc_def_dim(int ncid, const char *name, size_t len, int *idp)
Define a new dimension.
EXTERNL int nc_redef(int ncid)
Put open netcdf dataset into define mode.
EXTERNL int nc_rename_dim(int ncid, int dimid, const char *name)
Rename a dimension.
Main header file for the C API.
EXTERNL int nc_put_vara(int ncid, int varid, const size_t *startp, const size_t *countp, const void *op)
Write an array of values to a variable.
EXTERNL int nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp)
Find the name and length of a dimension.
EXTERNL int nc_inq_varndims(int ncid, int varid, int *ndimsp)
Learn how many dimensions are associated with a variable.
EXTERNL int nc_put_varm(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const void *op)
Write a mapped array of values to a variable.
EXTERNL int nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp)
Inquire about a file or group.
EXTERNL int nc_get_varm(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, void *ip)
Read a mapped array from a variable.
int nc_type
The nc_type type is just an int.
EXTERNL int nc_put_vars(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const void *op)
Write a strided array of values to a variable.
#define NC_EDIMSIZE
Invalid dimension size.
#define MAX_NC_VARS
Backward compatible alias.
EXTERNL int nc_rename_var(int ncid, int varid, const char *name)
Rename a variable.
EXTERNL int nc_del_att(int ncid, int varid, const char *name)
Delete an attribute.
EXTERNL int nc_close(int ncid)
Close an open netCDF dataset.
EXTERNL int nc_inq_dimlen(int ncid, int dimid, size_t *lenp)
Find the length of a dimension.
EXTERNL int nc_get_att(int ncid, int varid, const char *name, void *ip)
Get an attribute of any type.
EXTERNL int nc_get_var1(int ncid, int varid, const size_t *indexp, void *ip)
Read a single datum from a variable.
EXTERNL int nc_put_var1(int ncid, int varid, const size_t *indexp, const void *op)
Write one datum.
EXTERNL int nc_set_fill(int ncid, int fillmode, int *old_modep)
Change the fill-value mode to improve write performance.
EXTERNL int nc_inq_vartype(int ncid, int varid, nc_type *xtypep)
Learn the type of a variable.
EXTERNL int nc_put_att(int ncid, int varid, const char *name, nc_type xtype, size_t len, const void *op)
Write an attribute.
#define NC_ISSYSERR(err)
The netcdf version 3 functions all return integer error status.
EXTERNL int nc_inq_varid(int ncid, const char *name, int *varidp)
Find the ID of a variable, from the name.
EXTERNL int nc_inq_dimid(int ncid, const char *name, int *idp)
Find the ID of a dimension from the name.
EXTERNL int nc_get_vars(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, void *ip)
Read a strided array from a variable.
EXTERNL int nc_inq_unlimdim(int ncid, int *unlimdimidp)
Find the ID of the unlimited dimension.
#define NC_MAX_VARS
Maximum for classic library.
EXTERNL int nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp)
Learn about a variable.
#define NC_NOERR
No Error.
EXTERNL int nc_open(const char *path, int mode, int *ncidp)
Open an existing netCDF file.
EXTERNL int nc_enddef(int ncid)
Leave define mode.
EXTERNL const char * nc_strerror(int ncerr)
Given an error number, return an error message.
EXTERNL int nc_sync(int ncid)
Synchronize an open netcdf dataset to disk.
EXTERNL int nc_get_vara(int ncid, int varid, const size_t *startp, const size_t *countp, void *ip)
Read an array of values from a variable.
EXTERNL int nc_create(const char *path, int cmode, int *ncidp)
Create a new netCDF file.
EXTERNL int nc_inq_attname(int ncid, int varid, int attnum, char *name)
Find the name of an attribute.