static inline int inventorizeStream(struct streamMapping *streamMap, int numStreamIDs, int *sizeStreamMap_, int streamID, int headerIdx) { int sizeStreamMap = *sizeStreamMap_; if (numStreamIDs < sizeStreamMap) ; else { streamMap = xrealloc(streamMap, (size_t)(sizeStreamMap *= 2) * sizeof (streamMap[0])); *sizeStreamMap_ = sizeStreamMap; } streamMap[numStreamIDs].streamID = streamID; streamMap[numStreamIDs].firstHeaderIdx = headerIdx; streamMap[numStreamIDs].lastHeaderIdx = headerIdx; streamMap[numStreamIDs].numVars = -1; int filetype = streamInqFiletype(streamID); streamMap[numStreamIDs].filetype = filetype; if (filetype == FILETYPE_NC || filetype == FILETYPE_NC2 || filetype == FILETYPE_NC4) { int vlistID = streamInqVlist(streamID); int nvars = vlistNvars(vlistID); streamMap[numStreamIDs].numVars = nvars; streamMap[numStreamIDs].varMap = xmalloc(sizeof (streamMap[numStreamIDs].varMap[0]) * (size_t)nvars); for (int i = 0; i < nvars; ++i) streamMap[numStreamIDs].varMap[i] = -1; } return numStreamIDs + 1; }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mxArray *pDataArray; int i, nVariables = -1; int nFields; int T; mwSize dims[4]; int streamID, vlistID, nVars; bool useGRIB; char buf[MEXCDI_STR_LEN]; /* ==================================================================*/ /* Call CDI_VARLIST */ /* ==================================================================*/ cdi_varlist(1, plhs, nrhs, prhs); streamID = OpenCDIStream(prhs[0]); useGRIB = streamInqFiletype(streamID) == FILETYPE_GRB; /* Get the variable list of the dataset */ vlistID = streamInqVlist(streamID); /* get number of variables */ nVariables = mxGetNumberOfElements(plhs[0]); /* ==================================================================*/ /* ALLOCATING ALL MEMORY FOR FIELD /* ==================================================================*/ getTimeSize(NULL, streamID, &T ); /* Notice: T is the same for all variables */ for (i=0; i<nVariables; i++) { DEBUG_DISPLAY("allocating %d/%d\n", i+1, nVariables); /* get size of data to read */ dims[0] = (mwSize)mxGetNumberOfElements(mxGetField(plhs[0], i, FIELD_LON)); dims[1] = (mwSize)mxGetNumberOfElements(mxGetField(plhs[0], i, FIELD_LAT)); dims[2] = (mwSize)mxGetNumberOfElements(mxGetField(plhs[0], i, FIELD_LEVELS)); dims[3] = (mwSize)mxGetNumberOfElements(mxGetField(plhs[0], i, FIELD_DATES)); /* allocate memory for MATLAB matrix*/ allocateField(useGRIB, vlistID, (int)mxGetScalar(mxGetField(plhs[0], i, FIELD_VARID)), streamID, T, dims, &pDataArray); DEBUG_DISPLAY("setting %d/%d\n", i+1, nVariables); mxSetField(plhs[0], (mwIndex)i, FIELD_DATA, pDataArray); } /* ==================================================================*/ /* CALL CDI_READFIELD FOR EACH VARIABLE */ /* ==================================================================*/ for (i=0; i<nVariables; i++) { /* Prepare data for CDI_READFIELD */ mxArray *plhsTmp[1]; const mxArray *prhsTmp[3]; /* Filename, nametable */ prhsTmp[0] = prhs[0]; if (nrhs == 2) prhsTmp[1] = prhs[1]; /* if nametable */ else prhsTmp[1] = NULL; /* Varname: plhs[0] holds thee output from cdi_readmeta */ prhsTmp[2] = mxGetField(plhs[0], i, FIELD_VARCODE); /* pass previously allocated data as left-hand-side argument to cdi_readfield*/ plhsTmp[0] = mxGetField(plhs[0], i, FIELD_DATA); /* Call CDI_READFIELD */ read1var(1, plhsTmp, 3, prhsTmp); } /* remove the fields used only internally */ mxRemoveField(plhs[0], mxGetFieldNumber(plhs[0], FIELD_VARCODE)); mxRemoveField(plhs[0], mxGetFieldNumber(plhs[0], FIELD_VARID)); streamClose(streamID); }
static void filedes(int streamID) { int filetype; printf("\n"); filetype = streamInqFiletype(streamID); switch ( filetype ) { case FILETYPE_GRB: printf(" GRIB data\n"); break; case FILETYPE_GRB2: printf(" GRIB2 data\n"); break; case FILETYPE_NC: printf(" netCDF data\n"); break; case FILETYPE_NC2: printf(" netCDF2 data\n"); break; case FILETYPE_NC4: printf(" netCDF4 data\n"); break; case FILETYPE_NC4C: printf(" netCDF4 classic data\n"); break; case FILETYPE_SRV: printf(" SERVICE data\n"); switch ( streamInqByteorder(streamID) ) { case CDI_BIGENDIAN: printf(" byteorder is BIGENDIAN\n"); break; case CDI_LITTLEENDIAN: printf(" byteorder is LITTLEENDIAN\n"); break; default: printf(" byteorder %d undefined\n", streamInqByteorder(streamID)); break; } break; case FILETYPE_EXT: printf(" EXTRA data\n"); switch ( streamInqByteorder(streamID) ) { case CDI_BIGENDIAN: printf(" byteorder is BIGENDIAN\n"); break; case CDI_LITTLEENDIAN: printf(" byteorder is LITTLEENDIAN\n"); break; default: printf(" byteorder %d undefined\n", streamInqByteorder(streamID)); break; } break; case FILETYPE_IEG: printf(" IEG data\n"); switch ( streamInqByteorder(streamID) ) { case CDI_BIGENDIAN: printf(" byteorder is BIGENDIAN\n"); break; case CDI_LITTLEENDIAN: printf(" byteorder is LITTLEENDIAN\n"); break; default: printf(" byteorder %d undefined\n", streamInqByteorder(streamID)); break; } break; default: printf(" unsupported filetype %d\n" , filetype); break; } printf("\n"); }
int main() { char fname[] = "test.grb"; int filetype = FILETYPE_GRB; enum { nlat = 18, nlon = 2*nlat, }; double *data = NULL; int nlevel; int varID; int streamID1, streamID2; int gridID, zaxisID; int nrecs, nvars; int tsID; int levelID; int vlistID, taxisID; int nmiss; size_t datasize = (size_t)nlon * (size_t)nlat; data = (double *)xmalloc(datasize * sizeof (double)); memset(data, 0, datasize * sizeof (double)); gridID = gridCreate(GRID_GAUSSIAN, (int)datasize); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); vlistID = vlistCreate(); vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE); taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); streamID1 = streamOpenWrite(fname, filetype); if ( streamID1 < 0 ) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID1)); return (-1); } streamDefVlist(streamID1, vlistID); (void) streamDefTimestep(streamID1, 0); streamWriteVar(streamID1, 0, data, 0); return (0); vlistID = streamInqVlist(streamID1); filetype = streamInqFiletype(streamID1); streamID2 = streamOpenWrite(fname, filetype); if ( streamID2 < 0 ) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID2)); return (-1); } streamDefVlist(streamID2, vlistID); nvars = vlistNvars(vlistID); for ( varID = 0; varID < nvars; varID++ ) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); size_t gridsize = (size_t)gridInqSize(gridID); size_t nlevel = (size_t)zaxisInqSize(zaxisID); if ( gridsize*nlevel > datasize ) datasize = gridsize*nlevel; } data = (double *)xrealloc(data, datasize*sizeof(double)); memset(data, 0, datasize*sizeof(double)); taxisID = vlistInqTaxis(vlistID); tsID = 0; while ( (nrecs = streamInqTimestep(streamID1, tsID)) ) { /* int vdate = */taxisInqVdate(taxisID); /* int vtime = */taxisInqVtime(taxisID); streamDefTimestep(streamID2, tsID); for ( varID = 0; varID < nvars; varID++ ) { streamReadVar(streamID1, varID, data, &nmiss); /* int code = */vlistInqVarCode(vlistID, varID); gridID = vlistInqVarGrid(vlistID, varID); zaxisID = vlistInqVarZaxis(vlistID, varID); /* int gridtype = */gridInqType(gridID); /* int gridsize = */gridInqSize(gridID); nlevel = zaxisInqSize(zaxisID); /* double missval = */vlistInqVarMissval(vlistID, varID); for ( levelID = 0; levelID < nlevel; levelID++ ) { /* int level = (int) */ zaxisInqLevel(zaxisID, levelID); /* int offset = gridsize*levelID; */ } streamWriteVar(streamID2, varID, data, nmiss); } tsID++; } free(data); streamClose(streamID2); streamClose(streamID1); return (0); }