/* Initialize iteration for a variable. Just a wrapper for * nc_blkio_init() that makes the netCDF calls needed to initialize * lower-level iterator. */ int nc_get_iter(Symbol* vsym, size_t bufsize, /* size in bytes of memory buffer */ nciter_t *iterp /* returned opaque iteration state */) { int stat = NC_NOERR; Symbol* vartype; size_t value_size; /* size in bytes of each variable element */ int ndims; /* number of dimensions for variable */ size_t dimsizes[NC_MAX_VAR_DIMS]; /* variable dimension sizes */ long long nvalues = 1; int dim; memset((void*)iterp,0,sizeof(nciter_t)); /* make sure it is initialized */ stat = nciter_ndims(vsym, &ndims); CHECK(stat, nciter_ndims); stat = nciter_dimlens(vsym,dimsizes); CHECK(stat, nciter_dimlens); /* compute total # elements */ nvalues=1; for(dim = 0; dim < ndims; dim++) { nvalues *= dimsizes[dim]; } stat = nciter_vartype(vsym, &vartype); CHECK(stat, nciter_vartype); stat = nciter_valuesize(vartype,&value_size); CHECK(stat, nciter_valuesize); stat = nc_blkio_init(bufsize, value_size, ndims, dimsizes, iterp); CHECK(stat, nc_blkio_init); iterp->to_get = 0; return stat; }
/* Initialize iteration for a variable. Just a wrapper for * nc_blkio_init() that makes the netCDF calls needed to initialize * lower-level iterator. */ int nc_get_iter(int ncid, int varid, size_t bufsize, /* size in bytes of memory buffer */ nciter_t **iterpp /* returned opaque iteration state */) { int stat = NC_NOERR; nciter_t *iterp; nc_type vartype; size_t value_size = 0; /* size in bytes of each variable element */ int ndims; /* number of dimensions for variable */ int *dimids; long long nvalues = 1; int dim; int chunked = 0; /* Caller should free this by calling nc_free_iter(iterp) */ iterp = (nciter_t *) emalloc(sizeof(nciter_t)); memset((void*)iterp,0,sizeof(nciter_t)); /* make sure it is initialized */ NC_CHECK(nc_inq_varndims(ncid, varid, &ndims)); dimids = (int *) emalloc((ndims + 1) * sizeof(int)); iterp->dimsizes = (size_t *) emalloc((ndims + 1) * sizeof(size_t)); iterp->chunksizes = (size_t *) emalloc((ndims + 1) * sizeof(size_t)); NC_CHECK(nc_inq_vardimid (ncid, varid, dimids)); for(dim = 0; dim < ndims; dim++) { size_t len; NC_CHECK(nc_inq_dimlen(ncid, dimids[dim], &len)); nvalues *= len; iterp->dimsizes[dim] = len; } NC_CHECK(nc_inq_vartype(ncid, varid, &vartype)); NC_CHECK(inq_value_size(ncid, vartype, &value_size)); #ifdef USE_NETCDF4 { int contig = 1; if(ndims > 0) { NC_CHECK(nc_inq_var_chunking(ncid, varid, &contig, NULL)); } if(contig == 0) { /* chunked */ NC_CHECK(nc_inq_var_chunking(ncid, varid, &contig, iterp->chunksizes)); chunked = 1; } } #endif /* USE_NETCDF4 */ NC_CHECK(nc_blkio_init(bufsize, value_size, ndims, chunked, iterp)); iterp->to_get = 0; free(dimids); *iterpp = iterp; return stat; }
/* Initialize iteration for a variable. Just a wrapper for * nc_blkio_init() that makes the netCDF calls needed to initialize * lower-level iterator. */ int nc_get_iter(Symbol* vsym, size_t bufsize, /* size in bytes of memory buffer */ nciter_t *iterp /* returned opaque iteration state */) { int stat = NC_NOERR; Symbol* vartype; size_t value_size; /* size in bytes of each variable element */ int ndims; /* number of dimensions for variable */ size_t dimsizes[NC_MAX_VAR_DIMS]; /* variable dimension sizes */ size_t chunksizes[NC_MAX_VAR_DIMS]; /* corresponding chunk sizes */ long long nvalues = 1; int dim; int chunked = 0; memset((void*)iterp,0,sizeof(nciter_t)); /* make sure it is initialized */ stat = nciter_ndims(vsym, &ndims); CHECK(stat, nciter_ndims); stat = nciter_dimlens(vsym,dimsizes); /* compute total # elements */ nvalues=1; for(dim = 0; dim < ndims; dim++) { nvalues *= dimsizes[dim]; } stat = nciter_vartype(vsym, &vartype); CHECK(stat, nciter_vartype); stat = nciter_valuesize(vartype,&value_size); CHECK(stat, nciter_valuesize); #ifdef USE_NETCDF4 #ifdef DOCHUNK { int contig = 1; if(ndims > 0) { stat = nc_inq_var_chunking(ncid, varid, &contig, NULL); CHECK(stat, nc_inq_var_chunking); } if(contig == 0) { /* chunked */ stat = nc_inq_var_chunking(ncid, varid, &contig, chunksizes); CHECK(stat, nc_inq_var_chunking); chunked = 1; } } #else chunked = 0; #endif #endif /* USE_NETCDF4 */ stat = nc_blkio_init(bufsize, value_size, ndims, dimsizes, chunked, chunksizes, iterp); CHECK(stat, nc_blkio_init); iterp->to_get = 0; return stat; }