示例#1
0
文件: pio_server.c 项目: AZed/cdo
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;
}
示例#2
0
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);
}
示例#3
0
文件: Filedes.c 项目: AZed/cdo
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");
}
示例#4
0
文件: test_grib.c 项目: AZed/cdo
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);
}