diff --git a/src/cdf_read.c b/src/cdf_read.c index a4c55bf0e8ccaaed2e3659075745a102e77ef6bf..e786713859e0f0804d119120191d654cc669bdad 100644 --- a/src/cdf_read.c +++ b/src/cdf_read.c @@ -24,8 +24,9 @@ cdfReadGridTraj(stream_t *streamptr, int gridID) int fileID = streamptr->fileID; int gridindex = vlistGridIndex(vlistID, gridID); - int ncLonId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X]; - int ncLatId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + int ncLonId = cdfGrid->ncIdVec[CDF_VARID_X]; + int ncLatId = cdfGrid->ncIdVec[CDF_VARID_Y]; int tsID = streamptr->curTsID; size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; @@ -47,6 +48,7 @@ cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENS int zaxisID = vlistInqVarZaxis(vlistID, varID); int timetype = vlistInqVarTimetype(vlistID, varID); int gridindex = vlistGridIndex(vlistID, gridID); + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; int xid = CDI_UNDEFID, yid = CDI_UNDEFID; @@ -56,11 +58,11 @@ cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENS } else { - xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X]; - yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]; + xid = cdfGrid->ncIdVec[CDF_DIMID_X]; + yid = cdfGrid->ncIdVec[CDF_DIMID_Y]; } int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - int zid = streamptr->zaxisID[zaxisindex]; + int zid = streamptr->cdfInfo.zaxisIdVec[zaxisindex]; int ndims = 0; #define addDimension(startCoord, length) \ @@ -376,7 +378,7 @@ cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4]) int vlistID = streamptr->vlistID; int gridId = vlistInqVarGrid(vlistID, varId); int gridindex = vlistGridIndex(vlistID, gridId); - const int *ncIDs = streamptr->ncgrid[gridindex].ncIDs; + const int *ncIDs = streamptr->cdfInfo.cdfGridVec[gridindex].ncIdVec; switch (gridInqType(gridId)) { @@ -395,15 +397,16 @@ cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4]) int zaxisID = vlistInqVarZaxis(vlistID, varId); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - (*outDimIds)[2] = streamptr->zaxisID[zaxisindex]; + (*outDimIds)[2] = streamptr->cdfInfo.zaxisIdVec[zaxisindex]; } static size_t stream_inq_dimlen(stream_t *streamptr, int dimid) { - int ndims = streamptr->ncNumDims; - int *ncdimid = streamptr->ncDimID; - size_t *ncdimlen = streamptr->ncDimLen; + const CdfInfo *cdfInfo = &(streamptr->cdfInfo); + int ndims = cdfInfo->ncNumDims; + const int *ncdimid = cdfInfo->ncDimIdVec; + const size_t *ncdimlen = cdfInfo->ncDimLenVec; for (int i = 0; i < ndims; ++i) { if (dimid == ncdimid[i]) return ncdimlen[i]; @@ -490,8 +493,8 @@ cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelI if (skipdim == 1) addDimension(0, 1); int gridindex = vlistGridIndex(vlistID, gridId); - const ncgrid_t *ncGrid = &streamptr->ncgrid[gridindex]; - bool readPart = (ncGrid->gridID == gridId && ncGrid->start != -1 && ncGrid->count != -1); + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + bool readPart = (cdfGrid->gridID == gridId && cdfGrid->start != -1 && cdfGrid->count != -1); for (int id = 0; id < 4; ++id) { @@ -503,7 +506,7 @@ cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelI case 2: case 4: if (readPart && curDimId == dimIds[0]) - addDimension((size_t) ncGrid->start, (size_t) ncGrid->count); + addDimension((size_t) cdfGrid->start, (size_t) cdfGrid->count); else addDimension(0, stream_inq_dimlen(streamptr, curDimId)); break; diff --git a/src/cdf_write.c b/src/cdf_write.c index 1e73c949e05de87536b0ae001f9e45fcaa4d1463..709a6b07e8ed0e59dac22ff8ed1a073326369f31 100644 --- a/src/cdf_write.c +++ b/src/cdf_write.c @@ -73,9 +73,10 @@ cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block) static nc_type cdfTypeComplexFloat(stream_t *streamptr) { - if (streamptr->nc_complex_float_id == CDI_UNDEFID) + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (cdfInfo->complexFloatId == CDI_UNDEFID) { - typedef struct complex_float + typedef struct { float r, i; } complex_float; @@ -88,18 +89,19 @@ cdfTypeComplexFloat(stream_t *streamptr) if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_float, i), NC_FLOAT); if (status != NC_NOERR) Error("%s", nc_strerror(status)); - streamptr->nc_complex_float_id = nc_complex_id; + cdfInfo->complexFloatId = nc_complex_id; } - return (nc_type) streamptr->nc_complex_float_id; + return (nc_type) cdfInfo->complexFloatId; } static nc_type cdfTypeComplexDouble(stream_t *streamptr) { - if (streamptr->nc_complex_double_id == CDI_UNDEFID) + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (cdfInfo->complexDoubleId == CDI_UNDEFID) { - typedef struct complex_double + typedef struct { double r, i; } complex_double; @@ -112,10 +114,10 @@ cdfTypeComplexDouble(stream_t *streamptr) if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_double, i), NC_DOUBLE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); - streamptr->nc_complex_double_id = nc_complex_id; + cdfInfo->complexDoubleId = nc_complex_id; } - return (nc_type) streamptr->nc_complex_double_id; + return (nc_type) cdfInfo->complexDoubleId; } #endif @@ -414,7 +416,7 @@ nc_grid_index(stream_t *streamptr, int gridID) int vlistID = streamptr->vlistID; int ngrids = vlistNumGrids(vlistID); for (index = 0; index < ngrids; ++index) - if (streamptr->ncgrid[index].gridID == gridID) break; + if (streamptr->cdfInfo.cdfGridVec[index].gridID == gridID) break; assert(index < ngrids); @@ -577,9 +579,10 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g if (numLPE > 0) cdf_put_att_int(fileID, ncvarID, "CDI_grid_num_LPE", NC_INT, 1, &numLPE); } + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); if (gridtype == GRID_GAUSSIAN_REDUCED) { - int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; + int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y]; if (ncyvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; @@ -589,7 +592,7 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g cdf_put_att_text(fileID, ncvarID, "CDI_grid_latitudes", len, name); } - int ncrpvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_RP]; + int ncrpvarID = cdfGrid->ncIdVec[CDF_VARID_RP]; if (ncrpvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; @@ -613,25 +616,25 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g } else if (gridtype == GRID_LONLAT && xid == CDI_UNDEFID && yid == CDI_UNDEFID && gridsize == 1) { - int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X]; - int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; + int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X]; + int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { /* - int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X]; - int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; + int ncxvarID = ncgrid->ncIDs[CDF_VARID_X]; + int ncyvarID = ncgrid->ncIDs[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); */ } else if (gridtype == GRID_UNSTRUCTURED || gridtype == GRID_CURVILINEAR) { - int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X]; - int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; - int ncavarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_A]; + int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X]; + int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y]; + int ncavarID = cdfGrid->ncIdVec[CDF_VARID_A]; // CMOR order: coordinates = "lat lon" if (CDI_Coordinates_Lon_Lat) { @@ -671,12 +674,12 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g { if (gridInqXIsc(gridID)) { - int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X]; + int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X]; cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridInqYIsc(gridID)) { - int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y]; + int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); } } @@ -950,14 +953,15 @@ cdfDefVar(stream_t *streamptr, int varID) SizeType gridsize = gridInqSize(gridID); int gridtype = gridInqType(gridID); int gridindex = nc_grid_index(streamptr, gridID); - int xid = (gridtype != GRID_TRAJECTORY) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X] : CDI_UNDEFID; - int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y] - : CDI_UNDEFID; + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + int xid = (gridtype != GRID_TRAJECTORY) ? cdfGrid->ncIdVec[CDF_DIMID_X] : CDI_UNDEFID; + int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? cdfGrid->ncIdVec[CDF_DIMID_Y] : CDI_UNDEFID; int zaxisID = vlistInqVarZaxis(vlistID, varID); int zaxistype = zaxisInqType(zaxisID); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - int zid = streamptr->zaxisID[zaxisindex]; + int zid = cdfInfo->zaxisIdVec[zaxisindex]; int dimorder[3]; // ZYX/321 and ZXY/312 vlistInqVarDimorder(vlistID, varID, dimorder); @@ -1062,7 +1066,7 @@ cdfDefVar(stream_t *streamptr, int varID) } bool zaxisIsScalar = (zid == CDI_UNDEFID) ? (zaxisInqScalar(zaxisID) > 0) : false; - int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->nczvarID[zaxisindex] : CDI_UNDEFID; + int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->cdfInfo.ncZvarIdVec[zaxisindex] : CDI_UNDEFID; cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, (size_t) gridsize, axis, iax); @@ -1129,8 +1133,9 @@ static void cdfWriteGridTraj(stream_t *streamptr, int gridID) { int gridindex = nc_grid_index(streamptr, gridID); - int lonID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X]; - int latID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]; + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + int lonID = cdfGrid->ncIdVec[CDF_DIMID_X]; + int latID = cdfGrid->ncIdVec[CDF_DIMID_Y]; size_t index = (size_t) streamptr->curTsID; double xlon = gridInqXval(gridID, 0); @@ -1375,13 +1380,14 @@ cdfGetXYZid(stream_t *streamptr, int gridID, int zaxisID, int *xid, int *yid, in else { int gridindex = nc_grid_index(streamptr, gridID); - *xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X]; - if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]; + const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + *xid = cdfGrid->ncIdVec[CDF_DIMID_X]; + if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = cdfGrid->ncIdVec[CDF_DIMID_Y]; } int vlistID = streamptr->vlistID; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - *zid = streamptr->zaxisID[zaxisindex]; + *zid = streamptr->cdfInfo.zaxisIdVec[zaxisindex]; } static void diff --git a/src/cdi_int.h b/src/cdi_int.h index e39998429b72e7a52371d5540775cb4e817ffb5f..93d1381205ec1f215ed71906a79da7fd2f64495b 100644 --- a/src/cdi_int.h +++ b/src/cdi_int.h @@ -259,16 +259,31 @@ enum cdfIDIdx CDF_VARID_Y, CDF_VARID_RP, // reducedPoints CDF_VARID_A, - CDF_SIZE_ncIDs, + CDF_SIZE_NCID, }; typedef struct { - int ncIDs[CDF_SIZE_ncIDs]; + int ncIdVec[CDF_SIZE_NCID]; int gridID; long start; long count; -} ncgrid_t; +} CdfGrid; + +typedef struct +{ + int complexFloatId; + int complexDoubleId; + CdfGrid cdfGridVec[MAX_GRIDS_PS]; + int zaxisIdVec[MAX_ZAXES_PS]; // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs + int ncZvarIdVec[MAX_ZAXES_PS]; + int ncDimIdVec[MAX_DIMS_PS]; + size_t ncDimLenVec[MAX_DIMS_PS]; + int ncNumDims; + size_t chunkSizeTdim; + size_t chunkSizeZdim; + VCT vct; +} CdfInfo; #endif typedef struct @@ -299,17 +314,7 @@ typedef struct int ncmode; int vlistID; #ifdef HAVE_LIBNETCDF - int nc_complex_float_id; - int nc_complex_double_id; - ncgrid_t ncgrid[MAX_GRIDS_PS]; - int zaxisID[MAX_ZAXES_PS]; // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs - int nczvarID[MAX_ZAXES_PS]; - int ncNumDims; - int ncDimID[MAX_DIMS_PS]; - size_t ncDimLen[MAX_DIMS_PS]; - VCT vct; - size_t chunkSizeTdim; - size_t chunkSizeZdim; + CdfInfo cdfInfo; #endif long maxGlobalRecs; int globalatts; diff --git a/src/stream.c b/src/stream.c index 646219c5ca1021c47ba461e553e429fc726b3d5c..0ad1151050767fe2f473688dc6d26c8948b57d8d 100644 --- a/src/stream.c +++ b/src/stream.c @@ -251,9 +251,10 @@ streamDefNumWorker(int streamID, int numWorker) if (streamptr->maxGlobalRecs == -1) xabort("Internal error: number of timesteps missing!"); if (streamptr->maxGlobalRecs == 1) numWorker = 0; if (numWorker > streamptr->maxGlobalRecs) numWorker = (int) streamptr->maxGlobalRecs; - if (streamptr->chunkSizeTdim > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars; - if (streamptr->chunkSizeZdim > 1) numWorker = 0; - if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", streamptr->chunkSizeTdim, streamptr->chunkSizeZdim); + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (cdfInfo->chunkSizeTdim > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars; + if (cdfInfo->chunkSizeZdim > 1) numWorker = 0; + if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", cdfInfo->chunkSizeTdim, cdfInfo->chunkSizeZdim); } #endif else @@ -1076,31 +1077,32 @@ streamDefaultValue(stream_t *streamptr) basetimeInit(&streamptr->basetime); #ifdef HAVE_LIBNETCDF - streamptr->nc_complex_float_id = CDI_UNDEFID; - streamptr->nc_complex_double_id = CDI_UNDEFID; + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + cdfInfo->complexFloatId = CDI_UNDEFID; + cdfInfo->complexDoubleId = CDI_UNDEFID; - for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->zaxisID[i] = CDI_UNDEFID; - for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->nczvarID[i] = CDI_UNDEFID; + for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->zaxisIdVec[i] = CDI_UNDEFID; + for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->ncZvarIdVec[i] = CDI_UNDEFID; for (int i = 0; i < MAX_GRIDS_PS; i++) { - streamptr->ncgrid[i].start = CDI_UNDEFID; - streamptr->ncgrid[i].count = CDI_UNDEFID; - streamptr->ncgrid[i].gridID = CDI_UNDEFID; - for (size_t j = 0; j < CDF_SIZE_ncIDs; ++j) streamptr->ncgrid[i].ncIDs[j] = CDI_UNDEFID; + cdfInfo->cdfGridVec[i].start = CDI_UNDEFID; + cdfInfo->cdfGridVec[i].count = CDI_UNDEFID; + cdfInfo->cdfGridVec[i].gridID = CDI_UNDEFID; + for (size_t j = 0; j < CDF_SIZE_NCID; ++j) cdfInfo->cdfGridVec[i].ncIdVec[j] = CDI_UNDEFID; } - streamptr->ncNumDims = 0; - for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimID[i] = CDI_UNDEFID; - for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimLen[i] = 0; + cdfInfo->ncNumDims = 0; + for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimIdVec[i] = CDI_UNDEFID; + for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimLenVec[i] = 0; - streamptr->vct.ilev = 0; - streamptr->vct.mlev = 0; - streamptr->vct.ilevID = CDI_UNDEFID; - streamptr->vct.mlevID = CDI_UNDEFID; + cdfInfo->chunkSizeTdim = 0; + cdfInfo->chunkSizeZdim = 0; - streamptr->chunkSizeTdim = 0; - streamptr->chunkSizeZdim = 0; + cdfInfo->vct.ilev = 0; + cdfInfo->vct.mlev = 0; + cdfInfo->vct.ilevID = CDI_UNDEFID; + cdfInfo->vct.mlevID = CDI_UNDEFID; #endif streamptr->maxGlobalRecs = CDI_UNDEFID; diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c index 7c3255c2fd9a89db4acb6fc8b23af9a418449ab9..ca2ffdfa361353179cfb2267f97b47cc1223be71 100644 --- a/src/stream_cdf_i.c +++ b/src/stream_cdf_i.c @@ -344,7 +344,8 @@ cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned) else if (xtype == NC_UINT64) datatype = CDI_DATATYPE_FLT64; else { - if (xtype != streamptr->nc_complex_float_id && xtype != streamptr->nc_complex_double_id) + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (xtype != cdfInfo->complexFloatId && xtype != cdfInfo->complexDoubleId) { bool isUserDefinedType = false; #ifdef NC_FIRSTUSERTYPEID @@ -363,14 +364,14 @@ cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned) nc_inq_compound_field(fileID, xtype, 1, NULL, NULL, &field_type2, &field_dims2, NULL); if (field_type1 == field_type2 && field_dims1 == 0 && field_dims2 == 0) { - if (field_type1 == NC_FLOAT) streamptr->nc_complex_float_id = xtype; - else if (field_type1 == NC_DOUBLE) streamptr->nc_complex_double_id = xtype; + if (field_type1 == NC_FLOAT) cdfInfo->complexFloatId = xtype; + else if (field_type1 == NC_DOUBLE) cdfInfo->complexDoubleId = xtype; } } } } - if (xtype == streamptr->nc_complex_float_id ) datatype = CDI_DATATYPE_CPX32; - else if (xtype == streamptr->nc_complex_double_id) datatype = CDI_DATATYPE_CPX64; + if (xtype == cdfInfo->complexFloatId ) datatype = CDI_DATATYPE_CPX32; + else if (xtype == cdfInfo->complexDoubleId) datatype = CDI_DATATYPE_CPX64; } #endif // clang-format on @@ -1643,6 +1644,7 @@ scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int model static void cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars) { + CdfInfo *cdfInfo = &(streamptr->cdfInfo); for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; @@ -1657,8 +1659,8 @@ cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars) { int dimType = ncvar->dimtypes[i]; // clang-format off - if (dimType == T_AXIS && chunkSize > streamptr->chunkSizeTdim) streamptr->chunkSizeTdim = chunkSize; - else if (dimType == Z_AXIS && chunkSize > streamptr->chunkSizeZdim) streamptr->chunkSizeZdim = chunkSize; + if (dimType == T_AXIS && chunkSize > cdfInfo->chunkSizeTdim) cdfInfo->chunkSizeTdim = chunkSize; + else if (dimType == Z_AXIS && chunkSize > cdfInfo->chunkSizeZdim) cdfInfo->chunkSizeZdim = chunkSize; // clang-format on } } @@ -2117,7 +2119,7 @@ cdf_load_vals(size_t size, int ndims, int varid, ncvar_t *ncvar, double **gridva { if (CDI_Netcdf_Lazy_Grid_Load) { - *valsGet = (struct xyValGet){ + *valsGet = (struct xyValGet) { .scalefactor = ncvar->scalefactor, .addoffset = ncvar->addoffset, .start = { start[0], start[1], start[2] }, @@ -2983,7 +2985,7 @@ destroy_grid(struct cdfLazyGrid *lazyGrid, grid_t *grid) } static int -cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, +cdf_define_all_grids(stream_t *streamptr, CdfGrid *ncgrid, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, GridInfo *gridInfo) { for (int ncvarid = 0; ncvarid < nvars; ++ncvarid) @@ -3157,14 +3159,14 @@ cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t ncgrid[gridindex].gridID = gridID; if (grid->type == GRID_TRAJECTORY) { - ncgrid[gridindex].ncIDs[CDF_VARID_X] = xvarid; - ncgrid[gridindex].ncIDs[CDF_VARID_Y] = yvarid; + ncgrid[gridindex].ncIdVec[CDF_VARID_X] = xvarid; + ncgrid[gridindex].ncIdVec[CDF_VARID_Y] = yvarid; } else { - if (xdimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_X] = ncdims[xdimid].dimid; - if (ydimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_Y] = ncdims[ydimid].dimid; - if (ncvar->isCubeSphere) ncgrid[gridindex].ncIDs[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid; + if (xdimid != CDI_UNDEFID) ncgrid[gridindex].ncIdVec[CDF_DIMID_X] = ncdims[xdimid].dimid; + if (ydimid != CDI_UNDEFID) ncgrid[gridindex].ncIdVec[CDF_DIMID_Y] = ncdims[ydimid].dimid; + if (ncvar->isCubeSphere) ncgrid[gridindex].ncIdVec[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid; } if (xdimid == CDI_UNDEFID && ydimid == CDI_UNDEFID && grid->size == 1) gridDefHasDims(gridID, CoordVar); @@ -3263,12 +3265,12 @@ cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvar if (ncvars[zvarid].xtype == NC_FLOAT) zdatatype = CDI_DATATYPE_FLT32; else if (ncvars[zvarid].xtype == NC_INT) zdatatype = CDI_DATATYPE_INT32; else if (ncvars[zvarid].xtype == NC_SHORT) zdatatype = CDI_DATATYPE_INT16; - // clang-format on - // don't change the name !!! - /* - if ((len = strlen(pname)) > 2) - if (pname[len-2] == '_' && isdigit((int) pname[len-1])) pname[len-2] = 0; - */ + // clang-format on + // don't change the name !!! + /* + if ((len = strlen(pname)) > 2) + if (pname[len-2] == '_' && isdigit((int) pname[len-1])) pname[len-2] = 0; + */ #ifndef USE_MPI if (zaxisType == ZAXIS_CHAR && ncvars[zvarid].ndims == 2) { @@ -3389,7 +3391,7 @@ cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvar } int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - streamptr->zaxisID[zaxisindex] = zdimid >= 0 ? ncdims[zdimid].dimid : zdimid; + streamptr->cdfInfo.zaxisIdVec[zaxisindex] = zdimid >= 0 ? ncdims[zdimid].dimid : zdimid; if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid, ncvar->name); @@ -3671,11 +3673,12 @@ cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, i Message("varID = %d gridID = %d zaxisID = %d", varID, vlistInqVarGrid(vlistID, varID), vlistInqVarZaxis(vlistID, varID)); int gridindex = vlistGridIndex(vlistID, gridID); - int xdimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X]; - int ydimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]; + const CdfGrid *ncGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]); + int xdimid = ncGrid->ncIdVec[CDF_DIMID_X]; + int ydimid = ncGrid->ncIdVec[CDF_DIMID_Y]; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); - int zdimid = streamptr->zaxisID[zaxisindex]; + int zdimid = streamptr->cdfInfo.zaxisIdVec[zaxisindex]; int ndims = ncvar->ndims; static const int ipow10[4] = { 1, 10, 100, 1000 }; @@ -4449,9 +4452,10 @@ static void stream_set_ncdims(stream_t *streamptr, int ndims, ncdim_t *ncdims) { int n = (ndims > MAX_DIMS_PS) ? MAX_DIMS_PS : ndims; - streamptr->ncNumDims = n; - for (int i = 0; i < n; i++) streamptr->ncDimID[i] = ncdims[i].dimid; - for (int i = 0; i < n; i++) streamptr->ncDimLen[i] = ncdims[i].len; + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + cdfInfo->ncNumDims = n; + for (int i = 0; i < n; i++) cdfInfo->ncDimIdVec[i] = ncdims[i].dimid; + for (int i = 0; i < n; i++) cdfInfo->ncDimLenVec[i] = ncdims[i].len; } static void @@ -4726,7 +4730,7 @@ cdfInqContents(stream_t *streamptr) // define all grids gridInfo.timedimid = timedimid; - int status = cdf_define_all_grids(streamptr, streamptr->ncgrid, vlistID, ncdims, nvars, ncvars, &gridInfo); + int status = cdf_define_all_grids(streamptr, streamptr->cdfInfo.cdfGridVec, vlistID, ncdims, nvars, ncvars, &gridInfo); if (status < 0) return status; // define all zaxes diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c index 196eba54bb1df566857742d6503b3f2f8165ce3a..22b50d769565f4d2ea0835c8de64e5b12c7400df 100644 --- a/src/stream_cdf_o.c +++ b/src/stream_cdf_o.c @@ -49,17 +49,17 @@ static void cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex) { int dimID; - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; for (int index = 0; index < gridIndex; ++index) { - if (ncgrid[index].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) + if (cdfGridVec[index].ncIdVec[CDF_DIMID_X] != CDI_UNDEFID) { - int gridID0 = ncgrid[index].gridID; + int gridID0 = cdfGridVec[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_SPECTRAL || gridtype0 == GRID_FOURIER) { - dimID = ncgrid[index].ncIDs[CDF_DIMID_X]; + dimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X]; goto dimIDEstablished; } } @@ -87,8 +87,8 @@ cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex) } dimIDEstablished: - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID; } struct idSearch @@ -98,22 +98,22 @@ struct idSearch }; static inline struct idSearch -cdfSearchIDBySize(size_t startIdx, size_t numIDs, const ncgrid_t ncgrid[/*numIDs*/], int ncIDType, int searchType, +cdfSearchIDBySize(size_t startIdx, size_t numIDs, const CdfGrid cdfGridVec[/*numIDs*/], int ncIDType, int searchType, SizeType searchSize, int (*typeInq)(int id), SizeType (*sizeInq)(int id)) { int numNonMatching = 0, foundID = CDI_UNDEFID; size_t foundIdx = SIZE_MAX; for (size_t index = startIdx; index < numIDs; index++) { - if (ncgrid[index].ncIDs[ncIDType] != CDI_UNDEFID) + if (cdfGridVec[index].ncIdVec[ncIDType] != CDI_UNDEFID) { - int id0 = ncgrid[index].gridID, id0Type = typeInq(id0); + int id0 = cdfGridVec[index].gridID, id0Type = typeInq(id0); if (id0Type == searchType) { SizeType size0 = sizeInq(id0); if (searchSize == size0) { - foundID = ncgrid[index].ncIDs[ncIDType]; + foundID = cdfGridVec[index].ncIdVec[ncIDType]; foundIdx = index; break; } @@ -133,12 +133,12 @@ cdfGridInqHalfSize(int gridID) static void cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, size_t maxlen, int gridRefType) { - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; SizeType dimlen = gridInqSize(gridID) / 2; struct idSearch search - = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize); + = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize); int dimID = search.foundID; int iz = search.numNonMatching; @@ -164,8 +164,8 @@ cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, siz } } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = dimID; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_Y] = dimID; } static void @@ -256,12 +256,12 @@ static void cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cdfDefGridAxisInqs *inqs) { nc_type xtype = grid_inq_xtype(gridID); - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridVec; SizeType dimlen = inqs->axisSize(gridID); if (dimlen != 1) Error("%c size isn't 1 for %s grid!", inqs->axisSym, gridNamePtr(gridInqType(gridID))); - int ncvarid = ncgrid[gridIndex].ncIDs[inqs->dimIdx]; + int ncvarid = ncgrid[gridIndex].ncIdVec[inqs->dimIdx]; if (ncvarid == CDI_UNDEFID) { int dimNcID = streamptr->basetime.ncvarid; @@ -290,7 +290,7 @@ cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cd ncgrid[gridIndex].gridID = gridID; // var ID for trajectory !!! - ncgrid[gridIndex].ncIDs[inqs->dimIdx] = ncvarid; + ncgrid[gridIndex].ncIdVec[inqs->dimIdx] = ncvarid; } static void @@ -559,7 +559,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool SizeType dimlen = gridAxisInq->axisSize(gridID); nc_type xtype = grid_inq_xtype(gridID); - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; bool hasVals = gridInqPropPresence(gridID, gridAxisInq->valsQueryKey); char dimname[CDI_MAX_NAME + 3]; @@ -569,7 +569,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool for (int index = 0; index < gridIndex; ++index) { - int gridID0 = ncgrid[index].gridID; + int gridID0 = cdfGridVec[index].gridID; assert(gridID0 != CDI_UNDEFID); int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_GAUSSIAN || gridtype0 == GRID_LONLAT || gridtype0 == GRID_PROJECTION || gridtype0 == GRID_GENERIC) @@ -586,7 +586,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool if (IS_EQUAL(inqVal(gridID0, 0), inqVal(gridID, 0)) && IS_EQUAL(inqVal(gridID0, dimlen - 1), inqVal(gridID, dimlen - 1))) { - dimID = ncgrid[index].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y]; + dimID = cdfGridVec[index].ncIdVec[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y]; break; } } @@ -691,11 +691,11 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool streamptr->ncmode = 2; } - if (ndims == 0 || addVarToGrid) ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid; + if (ndims == 0 || addVarToGrid) cdfGridVec[gridIndex].ncIdVec[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid; } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; return delayed; } @@ -938,7 +938,7 @@ cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t static struct cdfPostDefActionList * cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex) { - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; SizeType dimlen = gridInqSize(gridID); SizeType xdimlen = gridInqXsize(gridID); @@ -951,20 +951,20 @@ cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex) do { struct idSearch search - = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize); + = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { - int gridID0 = ncgrid[index].gridID; + int gridID0 = cdfGridVec[index].gridID; if (IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { - xdimID = ncgrid[index].ncIDs[CDF_DIMID_X]; - ydimID = ncgrid[index].ncIDs[CDF_DIMID_Y]; - ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X]; - ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y]; + xdimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X]; + ydimID = cdfGridVec[index].ncIdVec[CDF_DIMID_Y]; + ncxvarid = cdfGridVec[index].ncIdVec[CDF_VARID_X]; + ncyvarid = cdfGridVec[index].ncIdVec[CDF_VARID_Y]; break; } ofs = search.foundIdx; @@ -987,19 +987,19 @@ cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex) delayed = createdIDs.delayed; } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = xdimID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = ydimID; - ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid; - ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid; - ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = xdimID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_Y] = ydimID; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_X] = ncxvarid; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_Y] = ncyvarid; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_A] = ncavarid; return delayed; } static struct cdfPostDefActionList * cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex) { - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; SizeType dimlen = gridInqSize(gridID); @@ -1009,21 +1009,21 @@ cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex) size_t ofs = 0; do { - struct idSearch search - = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, gridInqType, gridInqSize); + struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, + gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { - int gridID0 = ncgrid[index].gridID; + int gridID0 = cdfGridVec[index].gridID; if (gridInqNvertex(gridID0) == gridInqNvertex(gridID) && IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { - dimID = ncgrid[index].ncIDs[CDF_DIMID_X]; - ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X]; - ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y]; - ncavarid = ncgrid[index].ncIDs[CDF_VARID_A]; + dimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X]; + ncxvarid = cdfGridVec[index].ncIdVec[CDF_VARID_X]; + ncyvarid = cdfGridVec[index].ncIdVec[CDF_VARID_Y]; + ncavarid = cdfGridVec[index].ncIdVec[CDF_VARID_A]; break; } ofs = search.foundIdx; @@ -1045,11 +1045,11 @@ cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex) delayed = createdIDs.delayed; } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID; - ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid; - ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid; - ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_X] = ncxvarid; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_Y] = ncyvarid; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_A] = ncavarid; return delayed; } @@ -1075,10 +1075,10 @@ cdf_def_vct_echam(stream_t *streamptr, int zaxisID) if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; - - if (streamptr->vct.ilev > 0) + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (cdfInfo->vct.ilev > 0) { - if (streamptr->vct.ilev != ilev) Error("More than one VCT for each file unsupported!"); + if (cdfInfo->vct.ilev != ilev) Error("More than one VCT for each file unsupported!"); return delayed; } @@ -1104,10 +1104,10 @@ cdf_def_vct_echam(stream_t *streamptr, int zaxisID) cdf_def_var(fileID, "hybm", NC_DOUBLE, 1, &ncdimid, &hybmid); } - streamptr->vct.ilev = ilev; - streamptr->vct.mlev = mlev; - streamptr->vct.mlevID = ncdimid; - streamptr->vct.ilevID = ncdimid2; + cdfInfo->vct.ilev = ilev; + cdfInfo->vct.mlev = mlev; + cdfInfo->vct.mlevID = ncdimid; + cdfInfo->vct.ilevID = ncdimid2; { static const char lname_n[] = "long_name", units_n[] = "units", lname_v_ai[] = "hybrid A coefficient at layer interfaces", @@ -1177,10 +1177,10 @@ cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; - - if (streamptr->vct.ilev > 0) + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (cdfInfo->vct.ilev > 0) { - if (streamptr->vct.ilev != ilev) Error("more than one VCT for each file unsupported!"); + if (cdfInfo->vct.ilev != ilev) Error("more than one VCT for each file unsupported!"); return delayed; } @@ -1195,10 +1195,10 @@ cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int int dimIDs[2] = { nclevID, ncbndsID }; - streamptr->vct.mlev = mlev; - streamptr->vct.ilev = ilev; - streamptr->vct.mlevID = nclevID; - streamptr->vct.ilevID = nclevID; + cdfInfo->vct.mlev = mlev; + cdfInfo->vct.ilev = ilev; + cdfInfo->vct.mlevID = nclevID; + cdfInfo->vct.ilevID = nclevID; int hyamid, hybmid; cdf_def_var(fileID, (p0status == 0) ? "a" : "ap", NC_DOUBLE, 1, dimIDs, &hyamid); @@ -1350,7 +1350,8 @@ cdf_def_zaxis_hybrid_echam(stream_t *streamptr, int type, int *ncvaridp, int zax Free(delayedVct); } - if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID; + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdVec[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; if (switchNCMode) { @@ -1550,7 +1551,8 @@ cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisI Free(delayedVct); } - if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID; + CdfInfo *cdfInfo = &(streamptr->cdfInfo); + if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdVec[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; free(buffer); return delayed; @@ -1646,7 +1648,7 @@ cdfDefZaxisChar(stream_t *streamptr, int zaxisID, char *axisname, int *dimID, si cdf_put_att_text(fileID, ncvarID, "axis", 1, "Z"); cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarID); - streamptr->nczvarID[zaxisindex] = ncvarID; + streamptr->cdfInfo.ncZvarIdVec[zaxisindex] = ncvarID; cdf_enddef(fileID, streamptr->self); // Write Stringvalues @@ -1827,10 +1829,10 @@ cdfDefZaxis(stream_t *streamptr, int zaxisID) streamptr->ncmode = 2; } - if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->nczvarID[zaxisindex] = ncvarid; + if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->cdfInfo.ncZvarIdVec[zaxisindex] = ncvarid; } - if (dimID != CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = dimID; + if (dimID != CDI_UNDEFID) streamptr->cdfInfo.zaxisIdVec[zaxisindex] = dimID; return delayed; } @@ -1881,18 +1883,18 @@ cdf_def_mapping(stream_t *streamptr, int gridID) static void cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, int strlen) { - if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; + if (cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] != CDI_UNDEFID) return; bool isXaxis = (cdiAxisID == CDI_XAXIS); SizeType dimlen = isXaxis ? gridInqXsize(gridID) : gridInqYsize(gridID); - ncgrid_t *ncgrid = streamptr->ncgrid; // Check for all grids up to gridIndex whether it already is defined for (int index = 0; index < gridIndex; index++) { - int gridID0 = ncgrid[index].gridID; + int gridID0 = cdfGridVec[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_CHARXY) { @@ -1957,9 +1959,9 @@ cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, i (void) nc_put_vara_text(fileID, ncaxisid, start, count, cvals[i]); } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; - ncgrid[gridIndex].ncIDs[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; + cdfGridVec[gridIndex].ncIdVec[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid; streamptr->ncmode = 2; } @@ -1968,15 +1970,15 @@ cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, i static void cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex) { - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; - ncgrid[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].gridID = gridID; { SizeType dimlen = gridInqSize(gridID); - struct idSearch search - = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); + struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, + gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; @@ -2004,14 +2006,14 @@ cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex) } } - ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID; } { SizeType dimlen = gridInqYsize(gridID); - struct idSearch search - = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); + struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, + gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; @@ -2038,17 +2040,17 @@ cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex) cdf_put_var_int(fileID, ncvarid, reducedPoints); Free(reducedPoints); - ncgrid[gridIndex].ncIDs[CDF_VARID_RP] = ncvarid; + cdfGridVec[gridIndex].ncIdVec[CDF_VARID_RP] = ncvarid; } - ncgrid[gridIndex].ncIDs[CDF_DIMID_RP] = dimID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_RP] = dimID; } } static void cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex) { - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec; int dimID = CDI_UNDEFID; SizeType dimlen = gridInqSize(gridID); @@ -2056,14 +2058,14 @@ cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex) if (gridInqYsize(gridID) == 0) { struct idSearch search - = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize); + = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } if (gridInqXsize(gridID) == 0) { struct idSearch search - = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize); + = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } @@ -2096,8 +2098,8 @@ cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex) } } - ncgrid[gridIndex].gridID = gridID; - ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID; + cdfGridVec[gridIndex].gridID = gridID; + cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID; } static struct cdfPostDefActionList * @@ -2105,7 +2107,8 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex) { struct cdfPostDefActionList *delayed = NULL; - if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return delayed; + CdfGrid *ncgrid = &(streamptr->cdfInfo.cdfGridVec[gridIndex]); + if (ncgrid->ncIdVec[CDF_DIMID_X] != CDI_UNDEFID) return delayed; int gridtype = gridInqType(gridID); SizeType size = gridInqSize(gridID); @@ -2114,7 +2117,7 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex) if (CDI_Reduce_Dim && size == 1) // no grid information { - streamptr->ncgrid[gridIndex].gridID = gridID; + ncgrid->gridID = gridID; return delayed; } @@ -2151,7 +2154,7 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex) if (size == 1 && xsize == 0 && ysize == 0) { // no grid information - streamptr->ncgrid[gridIndex].gridID = gridID; + ncgrid->gridID = gridID; } else { @@ -2248,11 +2251,11 @@ cdfDefCoordinateVars(stream_t *streamptr) struct cdfPostDefActionList *delayed = NULL; - ncgrid_t *ncgrid = streamptr->ncgrid; + CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridVec; for (int index = 0; index < 2 * ngrids; ++index) { ncgrid[index].gridID = CDI_UNDEFID; - for (size_t i = 0; i < CDF_SIZE_ncIDs; ++i) ncgrid[index].ncIDs[i] = CDI_UNDEFID; + for (size_t i = 0; i < CDF_SIZE_NCID; ++i) ncgrid[index].ncIdVec[i] = CDI_UNDEFID; } for (int index = 0; index < ngrids; ++index) @@ -2281,7 +2284,7 @@ cdfDefCoordinateVars(stream_t *streamptr) for (int index = 0; index < nzaxis; ++index) { int zaxisID = vlistZaxis(vlistID, index); - if (streamptr->zaxisID[index] == CDI_UNDEFID) + if (streamptr->cdfInfo.zaxisIdVec[index] == CDI_UNDEFID) { struct cdfPostDefActionList *zaxisdelayed = cdfDefZaxis(streamptr, zaxisID); delayed = cdfPostDefActionConcat(delayed, zaxisdelayed);