awips2/nativeLib/rary.ohd.util/inc/g2libc_inc/grib2.h
2017-04-21 18:33:55 -06:00

239 lines
12 KiB
C

#ifndef _grib2_H
#define _grib2_H
#include<stdio.h>
#define G2_VERSION "g2clib-1.0"
/* . . . .
* PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-10-25
*
* Each element of structure gribfield is defined as:
*
* gribfield gfld;
*
* gfld->version = GRIB edition number ( currently 2 )
* gfld->discipline = Message Discipline ( see Code Table 0.0 )
* gfld->idsect = Contains the entries in the Identification
* Section ( Section 1 )
* This element is a pointer to an array
* that holds the data.
* gfld->idsect[0] = Identification of originating Centre
* ( see Common Code Table C-1 )
* 7 - US National Weather Service
* gfld->idsect[1] = Identification of originating Sub-centre
* gfld->idsect[2] = GRIB Master Tables Version Number
* ( see Code Table 1.0 )
* 0 - Experimental
* 1 - Initial operational version number
* gfld->idsect[3] = GRIB Local Tables Version Number
* ( see Code Table 1.1 )
* 0 - Local tables not used
* 1-254 - Number of local tables version used
* gfld->idsect[4] = Significance of Reference Time (Code Table 1.2)
* 0 - Analysis
* 1 - Start of forecast
* 2 - Verifying time of forecast
* 3 - Observation time
* gfld->idsect[5] = Year ( 4 digits )
* gfld->idsect[6] = Month
* gfld->idsect[7) = Day
* gfld->idsect[8] = Hour
* gfld->idsect[9] = Minute
* gfld->idsect[10] = Second
* gfld->idsect[11] = Production status of processed data
* ( see Code Table 1.3 )
* 0 - Operational products
* 1 - Operational test products
* 2 - Research products
* 3 - Re-analysis products
* gfld->idsect[12] = Type of processed data ( see Code Table 1.4 )
* 0 - Analysis products
* 1 - Forecast products
* 2 - Analysis and forecast products
* 3 - Control forecast products
* 4 - Perturbed forecast products
* 5 - Control and perturbed forecast products
* 6 - Processed satellite observations
* 7 - Processed radar observations
* gfld->idsectlen = Number of elements in gfld->idsect[].
* gfld->local = Pointer to character array containing contents
* of Local Section 2, if included
* gfld->locallen = length of array gfld->local[]
* gfld->ifldnum = field number within GRIB message
* gfld->griddef = Source of grid definition (see Code Table 3.0)
* 0 - Specified in Code table 3.1
* 1 - Predetermined grid Defined by originating centre
* gfld->ngrdpts = Number of grid points in the defined grid.
* gfld->numoct_opt = Number of octets needed for each
* additional grid points definition.
* Used to define number of
* points in each row ( or column ) for
* non-regular grids.
* = 0, if using regular grid.
* gfld->interp_opt = Interpretation of list for optional points
* definition. (Code Table 3.11)
* gfld->igdtnum = Grid Definition Template Number (Code Table 3.1)
* gfld->igdtmpl = Contains the data values for the specified Grid
* Definition Template ( NN=gfld->igdtnum ). Each
* element of this integer array contains an entry (in
* the order specified) of Grid Defintion Template 3.NN
* This element is a pointer to an array
* that holds the data.
* gfld->igdtlen = Number of elements in gfld->igdtmpl[]. i.e. number of
* entries in Grid Defintion Template 3.NN
* ( NN=gfld->igdtnum ).
* gfld->list_opt = (Used if gfld->numoct_opt .ne. 0) This array
* contains the number of grid points contained in
* each row ( or column ). (part of Section 3)
* This element is a pointer to an array
* that holds the data. This pointer is nullified
* if gfld->numoct_opt=0.
* gfld->num_opt = (Used if gfld->numoct_opt .ne. 0) The number of entries
* in array ideflist. i.e. number of rows ( or columns )
* for which optional grid points are defined. This value
* is set to zero, if gfld->numoct_opt=0.
* gfdl->ipdtnum = Product Definition Template Number (see Code Table 4.0)
* gfld->ipdtmpl = Contains the data values for the specified Product
* Definition Template ( N=gfdl->ipdtnum ). Each element
* of this integer array contains an entry (in the
* order specified) of Product Defintion Template 4.N.
* This element is a pointer to an array
* that holds the data.
* gfld->ipdtlen = Number of elements in gfld->ipdtmpl[]. i.e. number of
* entries in Product Defintion Template 4.N
* ( N=gfdl->ipdtnum ).
* gfld->coord_list = Real array containing floating point values
* intended to document the vertical discretisation
* associated to model data on hybrid coordinate
* vertical levels. (part of Section 4)
* This element is a pointer to an array
* that holds the data.
* gfld->num_coord = number of values in array gfld->coord_list[].
* gfld->ndpts = Number of data points unpacked and returned.
* gfld->idrtnum = Data Representation Template Number
* ( see Code Table 5.0)
* gfld->idrtmpl = Contains the data values for the specified Data
* Representation Template ( N=gfld->idrtnum ). Each
* element of this integer array contains an entry
* (in the order specified) of Product Defintion
* Template 5.N.
* This element is a pointer to an array
* that holds the data.
* gfld->idrtlen = Number of elements in gfld->idrtmpl[]. i.e. number
* of entries in Data Representation Template 5.N
* ( N=gfld->idrtnum ).
* gfld->unpacked = logical value indicating whether the bitmap and
* data values were unpacked. If false,
* gfld->bmap and gfld->fld pointers are nullified.
* gfld->expanded = Logical value indicating whether the data field
* was expanded to the grid in the case where a
* bit-map is present. If true, the data points in
* gfld->fld match the grid points and zeros were
* inserted at grid points where data was bit-mapped
* out. If false, the data values in gfld->fld were
* not expanded to the grid and are just a consecutive
* array of data points corresponding to each value of
* "1" in gfld->bmap.
* gfld->ibmap = Bitmap indicator ( see Code Table 6.0 )
* 0 = bitmap applies and is included in Section 6.
* 1-253 = Predefined bitmap applies
* 254 = Previously defined bitmap applies to this field
* 255 = Bit map does not apply to this product.
* gfld->bmap = integer array containing decoded bitmap,
* if gfld->ibmap=0 or gfld->ibap=254. Otherwise nullified.
* This element is a pointer to an array
* that holds the data.
* gfld->fld = Array of gfld->ndpts unpacked data points.
* This element is a pointer to an array
* that holds the data.
*/
#ifdef __64BIT__
typedef int g2int;
typedef unsigned int g2intu;
#else
typedef long g2int;
typedef unsigned long g2intu;
#endif
typedef float g2float;
struct template {
g2int type; /* 3=Grid Defintion Template */
/* 4=Product Defintion Template */
/* 5=Data Representation Template */
g2int num; /* template number */
g2int maplen; /* number of entries in the static part of the
* template */
g2int *map; /* num of octets of each entry in the static part
* of the template */
g2int needext; /* indicates whether or not the template needs
* to be extended */
g2int extlen; /* number of entries in the template extension */
g2int *ext; /* num of octets of each entry in the extension part of
* of the template */
};
typedef struct template template;
struct gribfield {
g2int version,discipline;
g2int *idsect;
g2int idsectlen;
unsigned char *local;
g2int locallen;
g2int ifldnum;
g2int griddef,ngrdpts;
g2int numoct_opt,interp_opt,num_opt;
g2int *list_opt;
g2int igdtnum,igdtlen;
g2int *igdtmpl;
g2int ipdtnum,ipdtlen;
g2int *ipdtmpl;
g2int num_coord;
g2float *coord_list;
g2int ndpts,idrtnum,idrtlen;
g2int *idrtmpl;
g2int unpacked;
g2int expanded;
g2int ibmap;
g2int *bmap;
g2float *fld;
};
typedef struct gribfield gribfield;
/* Prototypes for unpacking API */
void seekgb(FILE *,g2int ,g2int ,g2int *,g2int *);
g2int g2_info(unsigned char *,g2int *,g2int *,g2int *,g2int *);
g2int g2_getfld(unsigned char *,g2int ,g2int ,g2int ,gribfield **);
void g2_free(gribfield *);
/* Prototypes for packing API */
g2int g2_create(unsigned char *,g2int *,g2int *);
g2int g2_addlocal(unsigned char *,unsigned char *,g2int );
g2int g2_addgrid(unsigned char *,g2int *,g2int *,g2int *,g2int );
g2int g2_addfield(unsigned char *,g2int ,g2int *,
g2float *,g2int ,g2int ,g2int *,
g2float *,g2int ,g2int ,g2int *);
g2int g2_gribend(unsigned char *);
/* Prototypes for supporting routines */
extern double int_power(double, g2int );
extern void mkieee(g2float *,g2int *,g2int);
void rdieee(g2int *,g2float *,g2int );
extern template *getpdstemplate(g2int);
extern template *extpdstemplate(g2int,g2int *);
extern template *getdrstemplate(g2int);
extern template *extdrstemplate(g2int,g2int *);
extern template *getgridtemplate(g2int);
extern template *extgridtemplate(g2int,g2int *);
extern void simpack(g2float *,g2int,g2int *,unsigned char *,g2int *);
extern void compack(g2float *,g2int,g2int,g2int *,unsigned char *,g2int *);
void gbit(unsigned char *,g2int *,g2int ,g2int );
void sbit(unsigned char *,g2int *,g2int ,g2int );
void gbits(unsigned char *,g2int *,g2int ,g2int ,g2int ,g2int );
void sbits(unsigned char *,g2int *,g2int ,g2int ,g2int ,g2int );
#endif /* _grib2_H */