From cedeba224c98ce84d846795ab383a65651045331 Mon Sep 17 00:00:00 2001 From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de> Date: Wed, 23 Oct 2024 11:36:15 +0200 Subject: [PATCH] cdf_scan_vars_attr: replaced call to cdf_inq_var() --- src/stream_cdf_i.c | 92 ++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c index 94bb5237c..66070b1f0 100644 --- a/src/stream_cdf_i.c +++ b/src/stream_cdf_i.c @@ -535,10 +535,10 @@ cdf_time_dimid(int fileID, int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvar if (ncvars[varid].ndims == 1) { int dimid0 = CDI_UNDEFID; - for (int dimid = 0; dimid < ndims; ++dimid) - if (ncdims[dimid].dimid == ncvar->dimids[0]) + for (int gdimid = 0; gdimid < ndims; ++gdimid) + if (ncdims[gdimid].dimid == ncvar->dimids[0]) { - dimid0 = dimid; + dimid0 = gdimid; break; } @@ -568,9 +568,9 @@ cdf_time_dimid(int fileID, int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvar static void init_ncdims(int ndims, ncdim_t *ncdims) { - for (int dimid = 0; dimid < ndims; dimid++) + for (int gdimid = 0; gdimid < ndims; gdimid++) { - ncdim_t *ncdim = &ncdims[dimid]; + ncdim_t *ncdim = &ncdims[gdimid]; ncdim->dimid = CDI_UNDEFID; ncdim->ncvarid = CDI_UNDEFID; ncdim->dimtype = CDI_UNDEFID; @@ -1202,39 +1202,27 @@ set_vars_chunks(int ncid, int ncvarid, int nvdims, ncvar_t *ncvar) #endif static void -cdf_vars_read_info(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int format) +read_vars_info(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int format) { - int nvdims, nvatts; - nc_type xtype; - char name[CDI_MAX_NAME]; - for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; - int ncid = ncvar->ncid; - int *dimidsp = ncvar->dimids; + cdf_inq_var(ncvar->ncid, varid, ncvar->name, &ncvar->xtype, &ncvar->ndims, ncvar->dimids, &ncvar->nattsNC); - cdf_inq_var(ncid, varid, name, &xtype, &nvdims, dimidsp, &nvatts); - - for (int i = 0; i < nvdims; ++i) - for (int dimid = 0; dimid < ndims; ++dimid) - if (ncdims[dimid].dimid == dimidsp[i]) + for (int vdimid = 0; vdimid < ncvar->ndims; ++vdimid) + for (int gdimid = 0; gdimid < ndims; ++gdimid) + if (ncdims[gdimid].dimid == ncvar->dimids[vdimid]) { - dimidsp[i] = dimid; + ncvar->dimids[vdimid] = gdimid; break; } - strcpy(ncvar->name, name); - - for (int dimid = 0; dimid < nvdims; dimid++) ncvar->dimtypes[dimid] = -1; - ncvar->xtype = xtype; - ncvar->ndims = nvdims; - ncvar->nattsNC = nvatts; + for (int vdimid = 0; vdimid < ncvar->ndims; vdimid++) ncvar->dimtypes[vdimid] = -1; #ifdef HAVE_NETCDF4 if (format == NC_FORMAT_NETCDF4_CLASSIC || format == NC_FORMAT_NETCDF4) { - set_vars_chunks(ncid, varid, nvdims, ncvar); + set_vars_chunks(ncvar->ncid, varid, ncvar->ndims, ncvar); } #endif } @@ -1281,11 +1269,6 @@ cdf_scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int m char *checked_vars[max_check_vars]; for (int i = 0; i < max_check_vars; ++i) checked_vars[i] = NULL; - char name[CDI_MAX_NAME]; - int nvatts; - nc_type atttype; - nc_type xtype; - size_t attlen; char attname[CDI_MAX_NAME]; char attstring[8192]; @@ -1293,11 +1276,10 @@ cdf_scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int m { ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; + const char *name = ncvar->name; int nvdims = ncvar->ndims; - int *dimidsp = ncvar->dimids; - - // read nvatts - cdf_inq_var(ncid, ncvarid, name, &xtype, &nvdims, dimidsp, &nvatts); + nc_type xtype = ncvar->xtype; + int nvatts = ncvar->nattsNC; if (ncvar->natts == 0 && nvatts > 0) ncvar->atts = (int *) Malloc((size_t) nvatts * sizeof(int)); @@ -1305,6 +1287,8 @@ cdf_scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int m { int nc_cell_id = CDI_UNDEFID; + nc_type atttype; + size_t attlen; cdf_inq_attname(ncid, ncvarid, iatt, attname); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); @@ -1523,7 +1507,7 @@ cdf_scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int m { cdf_set_var(ncvar, CoordVar); cdf_set_dim(ncvar, 0, Z_AXIS); - ncdims[ncvar->dimids[0]].dimtype = Z_AXIS; + if (ncvar->dimids[0] < ndims) ncdims[ncvar->dimids[0]].dimtype = Z_AXIS; } else if (nvdims == 0) { @@ -4455,13 +4439,13 @@ set_ncdim_ids(int fileID, int ndims, ncdim_t *ncdims) { if (ndims) { - int ncdimid = 0; - for (int dimid = 0; dimid < NC_MAX_DIMS; ++dimid) + int gdimid = 0; + for (int i = 0; i < NC_MAX_DIMS; ++i) { - if (nc_inq_dimlen(fileID, dimid, NULL) == NC_NOERR) + if (nc_inq_dimlen(fileID, i, NULL) == NC_NOERR) { - ncdims[ncdimid++].dimid = dimid; - if (ncdimid == ndims) break; + ncdims[gdimid++].dimid = i; + if (gdimid == ndims) break; } } } @@ -4470,10 +4454,10 @@ set_ncdim_ids(int fileID, int ndims, ncdim_t *ncdims) static void read_ncdims(int fileID, int ndims, ncdim_t *ncdims) { - for (int dimid = 0; dimid < ndims; dimid++) + for (int gdimid = 0; gdimid < ndims; gdimid++) { - cdf_inq_dimlen(fileID, ncdims[dimid].dimid, &ncdims[dimid].len); - cdf_inq_dimname(fileID, ncdims[dimid].dimid, ncdims[dimid].name); + cdf_inq_dimlen(fileID, ncdims[gdimid].dimid, &ncdims[gdimid].len); + cdf_inq_dimname(fileID, ncdims[gdimid].dimid, ncdims[gdimid].name); } } @@ -4499,16 +4483,16 @@ check_ncgroups(int fileID) static void find_coordinates_vars(int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvars) { - for (int dimid = 0; dimid < ndims; dimid++) + for (int gdimid = 0; gdimid < ndims; gdimid++) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; - if (ncvar->ndims == 1 && dimid == ncvar->dimids[0] && ncdims[dimid].ncvarid == CDI_UNDEFID) + if (ncvar->ndims == 1 && gdimid == ncvar->dimids[0] && ncdims[gdimid].ncvarid == CDI_UNDEFID) { - if (str_is_equal(ncvar->name, ncdims[dimid].name)) + if (str_is_equal(ncvar->name, ncdims[gdimid].name)) { - ncdims[dimid].ncvarid = varid; + ncdims[gdimid].ncvarid = varid; ncvar->varStatus = CoordVar; } } @@ -4556,13 +4540,7 @@ cdfInqContents(stream_t *streamptr) cdf_inq(fileID, &ndims, &nvars, &ngatts, &unlimdimid); if (CDI_Debug) Message("root: ndims %d, nvars %d, ngatts %d", ndims, nvars, ngatts); - /* - if ( ndims == 0 ) - { - Warning("No dimensions found!"); - return CDI_EUFSTRUCT; - } - */ + // alloc ncdims ncdim_t *ncdims = ndims ? (ncdim_t *) Malloc((size_t) ndims * sizeof(ncdim_t)) : NULL; init_ncdims(ndims, ncdims); @@ -4585,7 +4563,7 @@ cdfInqContents(stream_t *streamptr) ncvar_t *ncvars = (ncvar_t *) Malloc((size_t) nvars * sizeof(ncvar_t)); init_ncvars(nvars, ncvars, fileID); - cdf_vars_read_info(nvars, ncvars, ndims, ncdims, format); + read_vars_info(nvars, ncvars, ndims, ncdims, format); find_coordinates_vars(ndims, ncdims, nvars, ncvars); // scan global attributes @@ -4610,9 +4588,9 @@ cdfInqContents(stream_t *streamptr) if (CDI_Debug) Message("Time dimid = %d", streamptr->basetime.ncdimid); // set T_AXIS dimtype - for (int ncdimid = 0; ncdimid < ndims; ncdimid++) + for (int gdimid = 0; gdimid < ndims; gdimid++) { - if (timedimid == ncdimid) ncdims[ncdimid].dimtype = T_AXIS; + if (timedimid == gdimid) ncdims[gdimid].dimtype = T_AXIS; } stream_set_ncdims(streamptr, ndims, ncdims); -- GitLab