readgrib.c

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 115 行

C
115
字号
#include "readmessage.h"int debug=0;void mexFunction( int nlhs, mxArray *plhs[], 		  int nrhs, const mxArray *prhs[] )     {     	char *InFile;    unsigned short *DumStr;	double *A,*offset;    float *y=NULL;    long m,n,i,eof,j,chLon,NumMes,flag,num;   	MessageStruct Mess;	if (nrhs != 2) { 		mexErrMsgTxt("Two input arguments required.");     } else if (nlhs > 4) {		mexErrMsgTxt("Too many output arguments.");     }         DumStr = (unsigned short *)mxGetPr(prhs[0]);     offset = mxGetPr(prhs[1]);    chLon=mxGetN(prhs[0]);	NumMes=mxGetM(prhs[1]);	InFile=(char *)malloc(sizeof(char)*(chLon+1));	for(i=0;i<chLon;i++) InFile[i]=(char)DumStr[i];		InFile[chLon]='\0';    num=(int)offset[0];	eof=readgrib(InFile,&num,&y,&m,&n,&flag,&Mess);    free(InFile);  	plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL); 	A = mxGetPr(plhs[0]);	for(i=0;i<m;i++)		for(j=0;j<n;j++)			A[i+j*m]=(double)y[i*n+j];	if (nlhs > 1)		plhs[1] = AssignMessToMatlab(Mess);	if (nlhs > 2){		plhs[2] = mxCreateDoubleMatrix(1, 1, mxREAL);		offset=mxGetPr(plhs[2]);		offset[0]=(double)num;	}	if (nlhs > 3){		plhs[3] = mxCreateDoubleMatrix(1, 1, mxREAL);		offset=mxGetPr(plhs[3]);		offset[0]=(double)eof;	}		if(y!=NULL) free(y);	return;    }int readgrib(char *InFile,int *offset,float **grib_data,int *m,int *n,int *scan,MessageStruct *Mess){	int nReturn;	int 		msg_length;	char 		*curr_ptr=NULL;				if (nReturn=grib_seek(InFile, &curr_ptr, offset, &msg_length)){		if(nReturn==3) return 1;	}		init_struct(&Mess->pds,&Mess->gds,&Mess->bms,&Mess->bdsHead);	if (nReturn = gribdec1(curr_ptr,&Mess->pds,&Mess->gds,&Mess->bdsHead,&Mess->bms,&grib_data[0]))	{		prt_err(nReturn);  /* Print error code and message */		printf("error=%d----->%d\n",nReturn,Mess->gds.head.usData_type);#ifdef MATLAB_MEX_FILE		mexErrMsgTxt("error on MEX-FILE READGRIB\n\n");#else 		exit(0);#endif	}	switch(Mess->gds.head.usData_type){     case 0:    /* Lat/Lon Grid */     case 4:    /* Gaussian Latitude/Longitude grid */     case 10:   /* Rotated Lat/Lon */     case 14:   /* Rotated Gaussian */     case 20:   /* Stretched Lat/Lon */     case 24:   /* Stretched Gaussian */     case 30:   /* Stretched and Rotated Lat/Lon */     case 34:   /* Stretched and Rotated Gaussian */       *n = Mess->gds.llg.usNi;	   *m = Mess->gds.llg.usNj;       *scan=(int)Mess->gds.llg.usScan_mode;	   break;     case 1:  /* Mercator Grid */       *n = Mess->gds.merc.cols;	   *m = Mess->gds.merc.rows;        *scan=(int)Mess->gds.merc.usScan_mode;       break;     case 3:  /* Lambert Conformal */     case 8:  /* Albers equal-area */     case 13: /* Oblique Lambert Conformal */       *n = Mess->gds.lam.iNx;	   *m = Mess->gds.lam.iNy;        *scan=(int)Mess->gds.lam.usScan_mode;       break;     case 5:  /* Polar Stereographic */       *n = Mess->gds.pol.usNx; 	   *m = Mess->gds.pol.usNy;        *scan=(int)Mess->gds.pol.usScan_mode;       break;     	}		if(curr_ptr!=NULL){free(curr_ptr);}	return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?