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);
59 #define NDIMS_DECL const size_t ndims = nvdims(ncid, varid);
61 # define A_DECL(name, type, ndims, rhs) \
62 ALLOC_ONSTACK(name, type, ndims)
64 # define A_FREE(name) \
67 # define A_INIT(lhs, type, ndims, rhs) \
69 const long *lp = rhs; \
71 type *const end = lhs + ndims; \
74 *tp++ = (type) *lp++; \
81 typedef signed char schar;
88 numrecvars(
int ncid,
int *nrecvarsp,
int *recvarids)
98 status = nc_inq_nvars(ncid, &nvars);
106 if (recdimid == -1) {
111 for (varid = 0; varid < nvars; varid++) {
118 if (ndims > 0 && dimids[0] == recdimid) {
119 if (recvarids != NULL)
120 recvarids[nrecvars] = varid;
124 *nrecvarsp = nrecvars;
134 ncrecsize(
int ncid,
int varid,
size_t *recsizep)
157 if (ndims == 0 || dimids[0] != recdimid) {
160 size = nctypelen(type);
161 for (
id = 1;
id < ndims;
id++) {
178 dimsizes(
int ncid,
int varid,
size_t *sizes)
191 if (ndims == 0 || sizes == NULL)
193 for (
id = 0;
id < ndims;
id++) {
223 status = nc_inq_nvars(ncid, &nvars);
235 status = numrecvars(ncid, &nrvars, rvarids);
239 if (nrecvarsp != NULL)
241 if (recvarids != NULL)
242 for (varid = 0; varid < nrvars; varid++)
243 recvarids[varid] = rvarids[varid];
245 if (recsizes != NULL)
246 for (varid = 0; varid < nrvars; varid++) {
248 status = ncrecsize(ncid, rvarids[varid], &rsize);
251 recsizes[varid] = rsize;
276 status = numrecvars(ncid, &nrvars, rvarids);
284 for (varid = 1; varid < nrvars; varid++)
287 for (varid = 0; varid < nrvars; varid++) {
288 if (datap[varid] != NULL) {
289 status = dimsizes(ncid, rvarids[varid], edges);
294 status =
nc_put_vara(ncid, rvarids[varid], start, edges, datap[varid]);
322 status = numrecvars(ncid, &nrvars, rvarids);
330 for (varid = 1; varid < nrvars; varid++)
333 for (varid = 0; varid < nrvars; varid++) {
334 if (datap[varid] != NULL) {
335 status = dimsizes(ncid, rvarids[varid], edges);
339 status =
nc_get_vara(ncid, rvarids[varid], start, edges, datap[varid]);
350 nc_advise(
const char *routine_name,
int err,
const char *fmt,...)
359 if( ncopts & NC_VERBOSE )
361 (void) fprintf(stderr,
"%s: ", routine_name);
363 (void) vfprintf(stderr,fmt,args);
367 (void) fprintf(stderr,
": %s",
370 (void) fputc(
'\n',stderr);
371 (void) fflush(stderr);
374 if( (ncopts & NC_FATAL) && err !=
NC_NOERR )
383 nccreate(
const char* path,
int cmode)
386 const int status =
nc_create(path, cmode, &ncid);
389 nc_advise(
"nccreate", status,
"filename \"%s\"", path);
397 ncopen(
const char *path,
int mode)
400 const int status =
nc_open(path, mode, &ncid);
403 nc_advise(
"ncopen", status,
"filename \"%s\"", path);
416 nc_advise(
"ncredef", status,
"ncid %d", ncid);
429 nc_advise(
"ncendef", status,
"ncid %d", ncid);
442 nc_advise(
"ncclose", status,
"ncid %d", ncid);
460 const int status =
nc_inq(ncid, &nd, &nv, &na, recdim);
464 nc_advise(
"ncinquire", status,
"ncid %d", ncid);
485 const int status =
nc_sync(ncid);
488 nc_advise(
"ncsync", status,
"ncid %d", ncid);
499 const int status = nc_abort(ncid);
502 nc_advise(
"ncabort", status,
"ncid %d", ncid);
520 nc_advise(
"ncdimdef", status,
"ncid %d", ncid);
523 status =
nc_def_dim(ncid, name, (
size_t)length, &dimid);
526 nc_advise(
"ncdimdef", status,
"ncid %d", ncid);
534 ncdimid(
int ncid,
const char* name)
540 nc_advise(
"ncdimid", status,
"ncid %d", ncid);
556 const int status =
nc_inq_dim(ncid, dimid, name, &ll);
560 nc_advise(
"ncdiminq", status,
"ncid %d", ncid);
582 nc_advise(
"ncdimrename", status,
"ncid %d", ncid);
599 const int status =
nc_def_var(ncid, name, datatype, ndims, dim, &varid);
602 nc_advise(
"ncvardef", status,
"ncid %d", ncid);
619 nc_advise(
"ncvarid", status,
"ncid %d", ncid);
638 const int status =
nc_inq_var(ncid, varid, name, datatype,
643 nc_advise(
"ncvarinq", status,
"ncid %d", ncid);
667 A_DECL(coordp,
size_t, ndims, index);
668 A_INIT(coordp,
size_t, ndims, index);
670 const int status =
nc_put_var1(ncid, varid, coordp, value);
674 nc_advise(
"ncvarput1", status,
"ncid %d", ncid);
691 A_DECL(coordp,
size_t, ndims, index);
692 A_INIT(coordp,
size_t, ndims, index);
694 const int status =
nc_get_var1(ncid, varid, coordp, value);
698 nc_advise(
"ncdimid", status,
"ncid %d", ncid);
716 A_DECL(stp,
size_t, ndims, start);
717 A_DECL(cntp,
size_t, ndims, count);
718 A_INIT(stp,
size_t, ndims, start);
719 A_INIT(cntp,
size_t, ndims, count);
721 const int status =
nc_put_vara(ncid, varid, stp, cntp, value);
726 nc_advise(
"ncvarput", status,
"ncid %d", ncid);
744 A_DECL(stp,
size_t, ndims, start);
745 A_DECL(cntp,
size_t, ndims, count);
746 A_INIT(stp,
size_t, ndims, start);
747 A_INIT(cntp,
size_t, ndims, count);
749 const int status =
nc_get_vara(ncid, varid, stp, cntp, value);
754 nc_advise(
"ncvarget", status,
"ncid %d; varid %d", ncid, varid);
773 return ncvarput(ncid, varid, start, count, value);
777 A_DECL(stp,
size_t, ndims, start);
778 A_DECL(cntp,
size_t, ndims, count);
779 A_DECL(strdp, ptrdiff_t, ndims, stride);
780 A_INIT(stp,
size_t, ndims, start);
781 A_INIT(cntp,
size_t, ndims, count);
782 A_INIT(strdp, ptrdiff_t, ndims, stride);
784 const int status =
nc_put_vars(ncid, varid, stp, cntp, strdp, value);
790 nc_advise(
"ncvarputs", status,
"ncid %d", ncid);
810 return ncvarget(ncid, varid, start, count, value);
814 A_DECL(stp,
size_t, ndims, start);
815 A_DECL(cntp,
size_t, ndims, count);
816 A_DECL(strdp, ptrdiff_t, ndims, stride);
817 A_INIT(stp,
size_t, ndims, start);
818 A_INIT(cntp,
size_t, ndims, count);
819 A_INIT(strdp, ptrdiff_t, ndims, stride);
821 const int status =
nc_get_vars(ncid, varid, stp, cntp, strdp, value);
827 nc_advise(
"ncvargets", status,
"ncid %d", ncid);
848 return ncvarputs(ncid, varid, start, count, stride, value);
852 A_DECL(stp,
size_t, ndims, start);
853 A_DECL(cntp,
size_t, ndims, count);
854 A_DECL(strdp, ptrdiff_t, ndims, stride);
855 A_DECL(imp, ptrdiff_t, ndims, map);
856 A_INIT(stp,
size_t, ndims, start);
857 A_INIT(cntp,
size_t, ndims, count);
858 A_INIT(strdp, ptrdiff_t, ndims, stride);
859 A_INIT(imp, ptrdiff_t, ndims, map);
862 stp, cntp, strdp, imp, value);
869 nc_advise(
"ncvarputg", status,
"ncid %d", ncid);
890 return ncvargets(ncid, varid, start, count, stride, value);
894 A_DECL(stp,
size_t, ndims, start);
895 A_DECL(cntp,
size_t, ndims, count);
896 A_DECL(strdp, ptrdiff_t, ndims, stride);
897 A_DECL(imp, ptrdiff_t, ndims, map);
898 A_INIT(stp,
size_t, ndims, start);
899 A_INIT(cntp,
size_t, ndims, count);
900 A_INIT(strdp, ptrdiff_t, ndims, stride);
901 A_INIT(imp, ptrdiff_t, ndims, map);
904 stp, cntp, strdp, imp, value);
911 nc_advise(
"ncvargetg", status,
"ncid %d", ncid);
930 nc_advise(
"ncvarrename", status,
"ncid %d", ncid);
947 const int status =
nc_put_att(ncid, varid, name, datatype, len, value);
950 nc_advise(
"ncattput", status,
"ncid %d", ncid);
967 const int status =
nc_inq_att(ncid, varid, name, datatype, &ll);
970 nc_advise(
"ncattinq", status,
971 "ncid %d; varid %d; attname \"%s\"",
992 const int status =
nc_get_att(ncid, varid, name, value);
995 nc_advise(
"ncattget", status,
"ncid %d", ncid);
1011 const int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
1014 nc_advise(
"ncattcopy", status,
"%s", name);
1032 nc_advise(
"ncattname", status,
"ncid %d", ncid);
1047 const int status =
nc_rename_att(ncid, varid, name, newname);
1050 nc_advise(
"ncattrename", status,
"ncid %d", ncid);
1064 const int status =
nc_del_att(ncid, varid, name);
1067 nc_advise(
"ncattdel", status,
"ncid %d", ncid);
1084 const int status =
nc_set_fill(ncid, fillmode, &oldmode);
1087 nc_advise(
"ncsetfill", status,
"ncid %d", ncid);
1104 const int status = nc_inq_rec(ncid, &nrv, recvarids, rs);
1107 nc_advise(
"ncrecinq", status,
"ncid %d", ncid);
1111 if(nrecvars != NULL)
1112 *nrecvars = (int) nrv;
1114 if(recsizes != NULL)
1117 for(ii = 0; ii < nrv; ii++)
1119 recsizes[ii] = (long) rs[ii];
1134 const int status = nc_get_rec(ncid, (
size_t)recnum, datap);
1137 nc_advise(
"ncrecget", status,
"ncid %d", ncid);
1151 const int status = nc_put_rec(ncid, (
size_t)recnum, datap);
1154 nc_advise(
"ncrecput", status,
"ncid %d", ncid);