gribgetpds.c

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

C
363
字号
#include <stdio.h>#include "grib.h"extern int debug;	/* for DPRINT */void gbyte (char *inchar, unsigned long *iout, unsigned long *iskip, 		unsigned long nbits);int gribgetpds(char *curr_ptr, PDS_INPUT *pds)/*  IDENTIFICATION:       gribgetpds - decode the Product Definition Section PDS    REVISION/MODIFICATION HISTORY:       03/07/94 written by Mugur Georgescu CSC, Monterey CA       02/01/96 modified by Steve Lowe SAIC, Monterey CA       06/18/96 modified by Alice Nakajima SAIC, Monterey CA   RESTRICTIONS: NONE  LANGUAGE: ANSI C  INCLUDED FILES:*//*** =======================================================================* A.  FUNCTION  gribgetpds()*     PURPOSE:  decodes the Product Definition Section from the GRIB *               format and store its info in the PDS structure.*     INPUT:*     char *curr_ptr;    pointer to first octet of PDS*     PDS_INPUT *pds;    pointer to empty PDS structure* *     RETURN CODE:*     0>  Always,  PDS info stored in Pds structure;* =======================================================================*/{char *in = curr_ptr;      /* pointer to the message */long skip=0;              /* bits to be skipped */unsigned long something;  /* value extracted from message */int sign;                 /* sign + or - */extern void hdr_print(); DPRINT ("Entering gribgetpds()\n");/** A.1       FUNCTION gbyte !3-byte PDS length*/ gbyte(in,&something,&skip,24);  DPRINT ("pds->uslength\n"); pds->uslength = (unsigned short) something;       /*** A.2       FUNCTION gbyte !parameter table version*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usParm_tbl\n"); pds->usParm_tbl = (unsigned short) something;     /*** A.3       FUNCTION gbyte !center identification*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usCenter_id\n"); pds->usCenter_id = (unsigned short) something;    /*** A.4       FUNCTION gbyte !generating process id*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usProc_id\n"); pds->usProc_id = (unsigned short) something;      /*** A.5       FUNCTION gbyte !grid identification*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usGrid_id\n"); pds->usGrid_id = (unsigned short) something;      /*** A.6       FUNCTION gbyte !flag of GDS, BMS presence*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usGds_bms_id\n"); pds->usGds_bms_id = (unsigned short) something;   /*** A.7       FUNCTION gbyte !parameter indicator and units */ gbyte(in,&something,&skip,8);  DPRINT ("pds->usParm_id\n"); pds->usParm_id = (unsigned short) something;      /*** A.8       FUNCTION gbyte !level type indicator*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usLevel_id\n"); pds->usLevel_id = (unsigned short) something;   /* switch on Level_id to determine if level or layer *//*** A.9       SWITCH (level_id)*/ switch(pds->usLevel_id)    {    case 101: /* layer between two isobaric surfaces */    case 104: /* layer between two specified altitudes */    case 106: /* layer between two specified height levels above ground */    case 108: /* layer between two sigma levels */    case 110: /* layer between two hybrid levels */    case 112: /* layer between two depths below land surface */    case 114: /* layer between two isentropic levels */    case 121: /* layer between two isobaric surfaces (high precision) */    case 128: /* layer between two sigma levels (high precision) */    case 141: /* layer between two isobaric surfaces (mixed precision) *//**              layer:*                 FUNCTION gbyte !top of layer*                 FUNCTION gbyte !bottom of layer*/       gbyte(in,&something,&skip,8);       DPRINT ("pds->usHeight1\n");       pds->usHeight1 = (unsigned short) something;  /* top layer */       gbyte(in,&something,&skip,8);       DPRINT ("pds->usHeight2\n");       pds->usHeight2 = (unsigned short) something;  /* bottom layer */       break;    default:  /* all others (levels) *//**              default:  !assume a level*                 FUNCTION gbyte !level value*                 SET Height2 to ZERO*/       gbyte(in,&something,&skip,16);      DPRINT ("pds->usHeight1\n");       pds->usHeight1 = (unsigned short) something;       pds->usHeight2 = 0;                       break;    }/** A.9       ENDSWITCH*//*** A.10      FUNCTION gbyte !year of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usYear\n"); pds->usYear = (unsigned short) something;   /*** A.11      FUNCTION gbyte !month of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usMonth\n"); pds->usMonth = (unsigned short) something;   /*** A.12      FUNCTION gbyte !day of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usDay\n"); pds->usDay = (unsigned short) something;      /*** A.13      FUNCTION gbyte !hour of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usHour\n"); pds->usHour = (unsigned short) something;      /*** A.14      FUNCTION gbyte !minute of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usMinute\n"); pds->usMinute = (unsigned short) something;     /*** A.15      FUNCTION gbyte !forecast time unit*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usFcst_unit_id\n"); pds->usFcst_unit_id = (unsigned short) something;/*** A.16      FUNCTION gbyte !forecast period 1*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usP1\n"); pds->usP1 = (unsigned short) something;         /*** A.17      FUNCTION gbyte !forecast period 2*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usP2\n"); pds->usP2 = (unsigned short) something;          /*** A.18      FUNCTION gbyte !time range indicator*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usTime_range\n"); pds->usTime_range = (unsigned short) something;   /*** A.19      FUNCTION gbyte !#included in average*/ gbyte(in,&something,&skip,16);  DPRINT ("pds->usTime_range_avg\n"); pds->usTime_range_avg = (unsigned short) something;/*** A.20      FUNCTION gbyte !#missing from average*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usTime_range_mis\n"); pds->usTime_range_mis = (unsigned short) something;/*** A.21      FUNCTION gbyte !century of Reference Data/Time*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usCentury\n"); pds->usCentury = (unsigned short) something;  /*** A.22      FUNCTION gbyte !reserved field*/ gbyte(in,&something,&skip,8);  DPRINT ("pds->usZero\n"); pds->usZero = (unsigned short) something;      /*** A.23      FUNCTION gbyte !decimal scale factor*/ gbyte(in,&something,&skip,16);       DPRINT ("Sign & pds->sDec_sc_fctr\n"); sign = (int)(something >> 15) & 1;                /* sign bit*/ pds->sDec_sc_fctr = (short) (something) & 32767;  /* Decimal sclfctr D */ if(sign)                                          /* negative Dec. sclfctr*/    pds->sDec_sc_fctr = - pds->sDec_sc_fctr;       /* multiply by -1 *//* ** A.24      IF (more than 40 bytes in PDS) THEN*              INCREMENT #bits to &skip !skip reserved octets 29-40*              FUNCTION gbyte !originating sub-center*           ENDIF*/ if(pds->uslength > 40){    skip += 96;                                      gbyte(in,&something,&skip,8);    DPRINT ("pds->usCenter_sub\n");    pds->usCenter_sub = (unsigned short) something; }/** * A.25      IF (NRL/MRY GRIB extensions) THEN*/ if((pds->usCenter_sub==99)||(pds->usCenter_id==128)||(pds->usCenter_id==129)) {/*** A.25.1       IF (more than 41 bytes in PDS) THEN*                 FUNCTION gbyte !seconds of Reference Data/Time*              ENDIF*/    if(pds->uslength >= 42){      gbyte(in,&something,&skip,8);      DPRINT ("pds->usSecond\n");      pds->usSecond = (unsigned short) something;      }/*** A.25.2       IF (more than 43 bytes in PDS) THEN*                 FUNCTION gbyte !Tracking ID*              ENDIF*/    if(pds->uslength >= 44){      gbyte(in,&something,&skip,16);      DPRINT ("pds->usTrack_num\n");      pds->usTrack_num = (unsigned short) something;    }/*** A.25.3       IF (more than 44 bytes in PDS) THEN*                 IF (it's a Sub-Table) THEN*                     FUNCTION gbyte ! Parameter Sub-table entry*                 ENDIF*              ENDIF*/    if(pds->uslength >= 45){      if (pds->usParm_id > 249)	{          gbyte(in,&something,&skip,8);          DPRINT ("pds->usParm_sub\n");          pds->usParm_sub = (unsigned short) something;  	}      else skip += 8;    }/*** A.25.4       IF (more than 45 bytes in PDS) THEN*                 FUNCTION gbyte ! Local table version number*              ENDIF*/    if(pds->uslength >= 46){      gbyte(in,&something,&skip,8);      DPRINT ("pds->usSub_tbl\n");      pds->usSub_tbl = (unsigned short) something;        }/** A.25      ENDIF   !NRL/MRY extensions*/  }/** A.26      HEADER debug print*/  hdr_print ("Product Description Section", curr_ptr, pds->uslength);  DPRINT ("Exiting gribgetpds() with no errors, status=0\n");/** * A.27      RETURN 0  !success*/return(0);} /** END OF FUNCTION***/

⌨️ 快捷键说明

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