[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Sample GFS 1x1 deg cdl (fwd)





===============================================================================
Robb Kambic                                Unidata Program Center
Software Engineer III                      Univ. Corp for Atmospheric Research
address@hidden             WWW: http://www.unidata.ucar.edu/
===============================================================================

---------- Forwarded message ----------
Date: Fri, 23 Jan 2004 10:33:25 -0700
From: Jim Cowie <address@hidden>
To: address@hidden
Subject: Sample GFS 1x1 deg cdl


Brian,

I've attached a sample CDL for the NCEP GFS 1x1 deg grid (AKA grid 3)
which we get off the NCEP ftp server. I don't know if it will work with
what comes through AWIPS but it is a start. I also have CDLs for the
GFS 2.5x2.5 grid (grid 2) and the Eta 211 grid if you want them.

The gfs_003.cdl has most or all of the fields defined but many commented
out since we don't use them. Also note that though we use gribtonc, we
had to make a few changes to it to handle some of the time averaged
or time accumulated variables better. gribtonc doesn't handle these
very well. (We're hoping that the new gribtonc, currently under
development at Unidata, will.)

Hope this is usefull to you,

-jim

--
Jim Cowie
NCAR/RAP
address@hidden
303-497-2831
----------------------------------------------------------------------

HOETH, BRIAN R. (JSC-ZS) (LM) wrote:
Hello,

I would be interested in seeing the wrf249.cdl file also.  For that matter,
I would like to see any cdl files that people have created in their
experiences with using gribtonc, other than the default cdl files that come
with the package.  I am especially interested in finding out if anyone has
tried creating AWIPS displayable netCDF files for GFS 1x1 degree data using
gribtonc.

Example GFS 1x1 degree data from today can be found at:
ftp://tgftp.nws.noaa.gov/SL.us008001/ST.opnl/MT.avn_CY.00/RD.20040123/PT.gri
d_DF.gr1/

Thanks,
Brian Hoeth
Spaceflight Meteorology Group
Johnson Space Center, Houston, TX
Office:  281-483-3246
Operations:  281-483-1051


-----Original Message-----
From: address@hidden
[mailto:address@hidden]On Behalf Of Robb Kambic
Sent: Thursday, January 22, 2004 5:53 PM
To: Rorik Peterson
Cc: address@hidden; decoders
Subject: Re: confusion with record dimension using gribtonc


On Thu, 22 Jan 2004, Rorik Peterson wrote:


I have been having some problems with the record dimension when
decoding  Alaska-region GRIB data obtained via ftp from NCEP at:

ftp://ftpprd.ncep.noaa.gov/pub/emc/mmb/mmbpll/alaska10.t00z/

The GRIB files available here are updated daily, each one corresponding
to a forecast time (0-48 hours).  I sequentially process them with
'gribtonc' into a single netCDF file

[/user2/ldm/AWIPS]$ perl -e 'foreach(glob "A*"){ `gribtonc wrf249.cdl
out.nc < $_`;}

However, I always have a complete record of missing data somewhere in
the middle.  Using today's data, I narrowed it down to when I added the
15-hour forecast file; at which point two records were added instead of
one, and the last one was completely empty.

Here I decode just one GRIB file:
[/user2/ldm/AWIPS]> rm out.nc;gribtonc wrf249.cdl out.nc < AWPREG15.tm00

Then dump the pertient information of what is in there
[/user2/ldm/AWIPS]$ ncdump -v valtime_offset out.nc | egrep "record =
UNLIMITED|valtime_offset ="
       record = UNLIMITED ; // (2 currently)
valtime_offset = 15, 15 ;

and then look at the data
[/user2/ldm/AWIPS]$ ncks -H -v u -d x,100,100 -d y,100,100 -d level,4,4
out.nc
level[4]=500

record[0] level[4]=500 y[100]=986.789 x[100]=986.789 u[540324]=2.17085
record[1] level[4]=500 y[100]=986.789 x[100]=986.789 u[1673253]=-9999

x[100]=986.789

y[100]=986.789


Rorik,

You already narrowed the problem down to either a bad data product or an
error in gribtonc.  First test would be to run gribtonc with the -v and
-l - flags, ie gribtonc -v -l -  .....    Hopefully this should shed some
light on the error. Next test would be to use gribdump to check if there
is an unusual header in the grib products.  In my recent work, I've found
a wrong header on only one product in a group of 2000 files. The
projection was wrong on the product.  ie gribdump -h <gribfile>

Can you send me the wrf249.cdl file you are using so I can use it.

I downloaded the AWPREG15.tm00 file and will let you know the results.

Robb...


You can trust me that the entire second record is full of -9999, which
is missing_value.  Is this a problem with the GRIB data, or gribtonc?
All the GRIB files are the same size, more or less, so I don't know
where the second set of (missing) data is coming from.  Any insight in
what to look at next is appreciated.

rorik





============================================================================
===
Robb Kambic                                Unidata Program Center
Software Engineer III                      Univ. Corp for Atmospheric
Research
address@hidden             WWW: http://www.unidata.ucar.edu/
============================================================================
===
netcdf gfs_003 {

dimensions:

        record = UNLIMITED ;    // (reference time, forecast time)
//      level = 26 ;            // isobaric levels
        level = 19 ;            // isobaric levels
        o3level = 6 ;           // isobaric levels for o3mr
        gpt5level = 1;          // isobaric level for 5-wave gp height
        zalevel = 2;            // isobaric level for geopotential height 
anomoly
        lat = 181 ;             // latitude
        lon = 360 ;             // longitude
        lpdg = 1 ;              // boundary layer levels RH, u, v, T, q
        lpdg2 = 1 ;             // boundary layer levels for cin, cape
        lbls = 2 ;              // layers below surface
        ls = 4 ;                // layer between sigma levels
        fh = 3;                 // fixed height levels
        fhg2m = 1 ;             // fixed height (2m) above ground level
        fhg10m = 1 ;            // fixed height (10m) above ground level
        sigma = 1 ;             // sigma level
        datetime_len = 21 ;     // string length for datetime strings
        nmodels = 2 ;           // GFS models
        accum = 2 ;             // time range for accumulations
        nav = 1 ;               // For navigation.  Variables that use
                                // this dimension define a mapping between
                                // (lat, lon) indices and (lat, lon) coords.

        nav_len = 100 ;         // max string length for navigation strings

variables:

        double  reftime(record) ;       // reference time of the model
                reftime:long_name = "reference time" ;
                reftime:units = "hours since 1992-1-1" ;

        double  valtime(record) ;       // forecast time ("valid" time)
                valtime:long_name = "valid time" ;
                valtime:units = "hours since 1992-1-1" ;

        :record = "reftime, valtime" ;  // "dimension attribute" -- means
                                        // (reftime, valtime) uniquely
                                        // determine record

        char    datetime(record, datetime_len) ; // derived from reftime
                datetime:long_name = "reference date and time" ;
                // units YYYY-MM-DD hh:mm:ssZ  (ISO 8601)

        float   valtime_offset(record) ; // derived as valtime-reftime
                valtime_offset:long_name = "hours from reference time" ;
                valtime_offset:units = "hours" ;

        float   level(level) ;
                level:long_name = "level" ;
                level:units = "hectopascals" ;

        float   o3level(o3level) ;
                o3level:long_name = "o3level" ;
                o3level:units = "hectopascals" ;

        float   gpt5level(gpt5level) ;
                gpt5level:long_name = "gpt5level" ;
                gpt5level:units = "hectopascals" ;

        float   zalevel(zalevel) ;
                zalevel:long_name = "zalevel" ;
                zalevel:units = "hectopascals" ;

        :lpdg = "lpdg_bot, lpdg_top" ; // (lpdg_bot, lpdg_top) uniquely
                                       // determines lpdg
                
        float   lpdg_bot(lpdg) ;
                lpdg_bot:long_name = "bottom level of boundary layer between 2 
levels at specified pressure differences from ground to levels" ;
                lpdg_bot:units = "hectopascals" ;
                
        float   lpdg_top(lpdg) ;
                lpdg_top:long_name = "top level of boundary layer between 2 
levels at specified pressure differences from ground to levels" ;
                lpdg_top:units = "hectopascals" ;

        :lpdg2 = "lpdg2_bot, lpdg2_top" ; // (lpdg_bot, lpdg_top) uniquely
                                       // determines lpdg
                
        float   lpdg2_bot(lpdg2) ;
                lpdg2_bot:long_name = "bottom level of boundary layer between 2 
levels at specified pressure differences from ground to levels" ;
                lpdg2_bot:units = "hectopascals" ;
                
        float   lpdg2_top(lpdg2) ;
                lpdg2_top:long_name = "top level of boundary layer between 2 
levels at specified pressure differences from ground to levels" ;
                lpdg2_top:units = "hectopascals" ;

        :lbls = "lbls_top, lbls_bot" ; // (lbls_top, lbls_bot) uniquely
                                       // determines lbls
                
        float   lbls_top(lbls) ;
                lbls_top:long_name = "top level of layer below surface from 
ground to level" ;
                lbls_top:units = "cm" ;

        float   lbls_bot(lbls) ;
                lbls_bot:long_name = "bottom level of layer below surface from 
ground to level" ;
                lbls_bot:units = "cm" ;
                
        :ls = "ls_bot, ls_top" ; // (ls_bot, ls_top) uniquely
                                       // determines ls
                
        float   ls_bot(ls) ;
                ls_bot:long_name = "bottom level of layer between 2 sigma 
levels" ;
                ls_bot:units = "" ;
                
        float   ls_top(ls) ;
                ls_top:long_name = "top level of layer between 2 sigma levels" ;
                ls_top:units = "" ;

        float   fh(fh) ;                 // fixed height level
                fh:long_name = "fixed height level" ;
                fh:units = "meters" ;

        float   fhg2m(fhg2m) ;           // 2m above ground
                fhg2m:long_name = "fixed height above ground" ;
                fhg2m:units = "meters" ;

        float   fhg10m(fhg10m) ;                 // 10m above ground
                fhg10m:long_name = "fixed height above ground" ;
                fhg10m:units = "meters" ;

        float   sigma(sigma) ;           // sigma level 
                sigma:long_name = "sigma level" ;
                sigma:units = "" ;       // dimensionless

        long    model_id(nmodels) ;
                model_id:long_name = "generating process ID number" ;

        // The following lat and lon coordinate variables are redundant,
        // since the navigation variables provide the necessary information.
        // The extra information is included here for human readability.

        float   lat(lat) ;
                lat:long_name = "latitude" ;
                lat:units = "degrees_north" ;

        float   lon(lon) ;
                lon:long_name = "longitude" ;
                lon:units = "degrees_east" ;

        // navigation variables all use nav dimension

        char    nav_model(nav, nav_len) ;        // navigation parameterization
                nav_model:long_name = "navigation model name" ;

        int     grid_type_code(nav) ;
                grid_type_code:long_name = "GRIB-1 GDS data representation 
type" ;

        char    grid_type(nav, nav_len) ;
                grid_type:long_name = "GRIB-1 grid type" ;

        char    grid_name(nav, nav_len) ;
                grid_name:long_name = "grid name" ;

        int     grid_center(nav) ;
                grid_center:long_name = "GRIB-1 originating center ID" ;

        int     grid_number(nav) ;
                grid_number:long_name = "GRIB-1 catalogued grid numbers" ;
                grid_number:_FillValue = -9999 ;

        char    i_dim(nav, nav_len) ;
                i_dim:long_name = "longitude dimension name" ;

        char    j_dim(nav, nav_len) ;
                j_dim:long_name = "latitude dimension name" ;

        int     Ni(nav) ;
                Ni:long_name = "number of points along a latitude circle" ;

        int     Nj(nav) ;
                Nj:long_name =  "number of points along a longitude circle" ;

        float   La1(nav) ;
                La1:long_name = "latitude of first grid point" ;
                La1:units = "degrees_north" ;

        float   Lo1(nav) ;
                Lo1:long_name = "longitude of first grid point" ;
                Lo1:units = "degrees_east" ;

        float   La2(nav) ;
                La2:long_name = "latitude of last grid point" ;
                La2:units = "degrees_north" ;

        float   Lo2(nav) ;
                Lo2:long_name = "longitude of last grid point" ;
                Lo2:units = "degrees_east" ;

        float   Di(nav) ;
                Di:long_name = "Longitudinal direction increment" ;
                Di:units = "degrees" ;

        float   Dj(nav) ;
                Dj:long_name = "Latitudinal direction increment" ;
                Dj:units = "degrees" ;

        byte    ResCompFlag(nav) ;
                ResCompFlag:long_name = "resolution and component flags" ;

        // end of navigation variables


        // Start of grid variables


//      float   absvor(record, level, lat, lon) ;
//              absvor:long_name = "absolute vorticity" ;
//              absvor:units = "1/s" ;
//              absvor:_FillValue = -9999.f ;
//              absvor:navigation = "nav" ;

        float   albedo_sfc(record, lat, lon) ;
                albedo_sfc:long_name = "albedo at surface" ;
                albedo_sfc:units = "percent" ;
                albedo_sfc:_FillValue = -9999.f ;
                albedo_sfc:navigation = "nav" ;

        float   cape_lpdg(record, lpdg2, lat, lon) ;
                cape_lpdg:long_name = "convective available potential energy in 
boundary layer" ;
                cape_lpdg:units = "J/kg" ;
                cape_lpdg:_FillValue = -9999.f ;
                cape_lpdg:navigation = "nav" ;

//      float   cape_sfc(record, lat, lon) ;
//              cape_sfc:long_name = "convective available potential energy at 
surface" ;
//              cape_sfc:units = "J/kg" ;
//              cape_sfc:_FillValue = -9999.f ;
//              cape_sfc:navigation = "nav" ;

        float   cfrzrn(record, lat, lon) ;
                cfrzrn:long_name = "categorical freezing rain" ;
                cfrzrn:units = "bit" ;
                cfrzrn:_FillValue = -9999.f ;
                cfrzrn:navigation = "nav" ;

        float   cicepl(record, lat, lon) ;
                cicepl:long_name = "categorical ice pellets" ;
                cicepl:units = "bit" ;
                cicepl:_FillValue = -9999.f ;
                cicepl:navigation = "nav" ;

        float   cin_lpdg(record, lpdg2, lat, lon) ;
                cin_lpdg:long_name = "convective inhibition in boundary layer" ;
                cin_lpdg:units = "J/kg" ;
                cin_lpdg:_FillValue = -9999.f ;
                cin_lpdg:navigation = "nav" ;

//      float   cin_sfc(record, lat, lon) ;
//              cin_sfc:long_name = "convective inhibition at surface" ;
//              cin_sfc:units = "J/kg" ;
//              cin_sfc:_FillValue = -9999.f ;
//              cin_sfc:navigation = "nav" ;

//      float   cloud_wat_atm(record, lat, lon) ;
//              cloud_wat_atm:long_name = "cloud water entire atmosphere" ;
//              cloud_wat_atm:units = "kg/m2" ;
//              cloud_wat_atm:_FillValue = -9999.f ;
//              cloud_wat_atm:navigation = "nav" ;

//      float   clwmr(record, level, lat, lon) ;
//              clwmr:long_name = "cloud water mixing ratio" ;
//              clwmr:units = "kg/kg" ;
//              clwmr:_FillValue = -9999.f ;
//              clwmr:navigation = "nav" ;

//      float   cprat(record, lat, lon) ;
//              cprat:long_name = "convective precipitation rate" ;
//              cprat:units = "kg/m2/s" ;
//              cprat:_FillValue = -9999.f ;
//              cprat:navigation = "nav" ;

        float   crain(record, lat, lon) ;
                crain:long_name = "categorical rain" ;
                crain:units = "bit" ;
                crain:_FillValue = -9999.f ;
                crain:navigation = "nav" ;

        float   csnow(record, lat, lon) ;
                csnow:long_name = "categorical snow" ;
                csnow:units = "bit" ;
                csnow:_FillValue = -9999.f ;
                csnow:navigation = "nav" ;

//      float   cwork_atm(record, lat, lon) ;
//              cwork_atm:long_name = "cloud workfunction" ;
//              cwork_atm:units = "J/kg" ;
//              cwork_atm:_FillValue = -9999.f ;
//              cwork_atm:navigation = "nav" ;

        float   dlwrf_sfc(record, lat, lon) ;
                dlwrf_sfc:long_name = "downward long wave radiation flux at 
surface" ;
                dlwrf_sfc:units = "W/m2" ;
                dlwrf_sfc:_FillValue = -9999.f ;
                dlwrf_sfc:navigation = "nav" ;

        float   dswrf_sfc(record, lat, lon) ;
                dswrf_sfc:long_name = "downward short wave radiation flux at 
surface" ;
                dswrf_sfc:units = "W/m2" ;
                dswrf_sfc:_FillValue = -9999.f ;
                dswrf_sfc:navigation = "nav" ;

        float   gflux(record, lat, lon) ;
                gflux:long_name = "ground heat flux" ;
                gflux:units = "W/m2" ;
                gflux:_FillValue = -9999.f ;
                gflux:navigation = "nav" ;

//      float   gpt_hgt5(record, gpt5level, lat, lon) ;
//              gpt_hgt5:long_name = "5-wave geopotential height" ;
//              gpt_hgt5:units = "gp m" ;
//              gpt_hgt5:_FillValue = -9999.f ;
//              gpt_hgt5:navigation = "nav" ;

//      float   gpt_hgt5_anom(record, gpt5level, lat, lon) ;
//              gpt_hgt5_anom:long_name = "5-wave geopotential height anomoly" ;
//              gpt_hgt5_anom:units = "gp m" ;
//              gpt_hgt5_anom:_FillValue = -9999.f ;
//              gpt_hgt5_anom:navigation = "nav" ;

        float   hpbl_sfc(record, lat, lon) ;
                hpbl_sfc:long_name = "planetary boundary layer height" ;
                hpbl_sfc:units = "m" ;
                hpbl_sfc:_FillValue = -9999.f ;
                hpbl_sfc:navigation = "nav" ;

//      float   ice_conc(record, lat, lon) ;
//              ice_conc:long_name = "ice cover" ;
//              ice_conc:units = "bit" ;
//              ice_conc:_FillValue = -9999.f ;
//              ice_conc:navigation = "nav" ;

        float   lat_ht_sfc(record, lat, lon) ;
                lat_ht_sfc:long_name = "surface latent heat net flux" ;
                lat_ht_sfc:units = "W/m2" ;
                lat_ht_sfc:_FillValue = -9999.f ;
                lat_ht_sfc:navigation = "nav" ;

//      float   land_mask_sfc(lat, lon) ;
//              land_mask_sfc:long_name = "land cover" ;
//              land_mask_sfc:units = "bit" ;
//              land_mask_sfc:_FillValue = -9999.f ;
//              land_mask_sfc:navigation = "nav" ;

//      float   LI(record, lat, lon) ;
//              LI:long_name = "surface lifted index" ;
//              LI:units = "degK" ;
//              LI:_FillValue = -9999.f ;
//              LI:navigation = "nav" ;

        float   LI4_sfc(record, lat, lon) ;
                LI4_sfc:long_name = "best (4 layer) lifted index" ;
                LI4_sfc:units = "degK" ;
                LI4_sfc:_FillValue = -9999.f ;
                LI4_sfc:navigation = "nav" ;

        float   N_atm(record, lat, lon) ;
                N_atm:long_name = "total cloud cover entire atmosphere" ;
                N_atm:units = "percent" ;
                N_atm:_FillValue = -9999.f ;
                N_atm:navigation = "nav" ;

//      float   N_bcy(record, lat, lon) ;
//              N_bcy:long_name = "total cloud cover at boundary layer cloud 
layer" ;
//              N_bcy:units = "percent" ;
//              N_bcy:_FillValue = -9999.f ;
//              N_bcy:navigation = "nav" ;

//      float   N_ccy(record, lat, lon) ;
//              N_ccy:long_name = "total cloud cover at convective cloud layer" 
;
//              N_ccy:units = "percent" ;
//              N_ccy:_FillValue = -9999.f ;
//              N_ccy:navigation = "nav" ;

        float   N_hcy(record, lat, lon) ;
                N_hcy:long_name = "total cloud cover at high cloud layer" ;
                N_hcy:units = "percent" ;
                N_hcy:_FillValue = -9999.f ;
                N_hcy:navigation = "nav" ;

        float   N_lcy(record, lat, lon) ;
                N_lcy:long_name = "total cloud cover at low cloud layer" ;
                N_lcy:units = "percent" ;
                N_lcy:_FillValue = -9999.f ;
                N_lcy:navigation = "nav" ;

        float   N_mcy(record, lat, lon) ;
                N_mcy:long_name = "total cloud cover at middle cloud layer" ;
                N_mcy:units = "percent" ;
                N_mcy:_FillValue = -9999.f ;
                N_mcy:navigation = "nav" ;

        float   omega(record, level, lat, lon) ;
                omega:long_name = "pressure vertical velocity" ;
                omega:units = "Pa/s" ;
                omega:_FillValue = -9999.f ;
                omega:navigation = "nav" ;

//      float   omega_sigma(record, sigma, lat, lon) ;
//              omega_sigma:long_name = "pressure vertical velocity at sigma 
level" ;
//              omega_sigma:units = "Pa/s" ;
//              omega_sigma:_FillValue = -9999.f ;
//              omega_sigma:navigation = "nav" ;

//      float   o3mr(record, o3level, lat, lon) ;
//              o3mr:long_name = "ozone mixing ratio" ;
//              o3mr:units = "kg/kg" ;
//              o3mr:_FillValue = -9999.f ;
//              o3mr:navigation = "nav" ;

//      float   P_ccbl(record, lat, lon) ;
//              P_ccbl:long_name = "pressure at convective cloud bottom level" ;
//              P_ccbl:units = "Pa" ;
//              P_ccbl:_FillValue = -9999.f ;
//              P_ccbl:navigation = "nav" ;

//      float   P_cctl(record, lat, lon) ;
//              P_cctl:long_name = "pressure at convective cloud top level" ;
//              P_cctl:units = "Pa" ;
//              P_cctl:_FillValue = -9999.f ;
//              P_cctl:navigation = "nav" ;

//      float   P_hcbl(record, lat, lon) ;
//              P_hcbl:long_name = "pressure at high cloud base level" ;
//              P_hcbl:units = "Pa" ;
//              P_hcbl:_FillValue = -9999.f ;
//              P_hcbl:navigation = "nav" ;

//      float   P_hctl(record, lat, lon) ;
//              P_hctl:long_name = "pressure at high cloud top level" ;
//              P_hctl:units = "Pa" ;
//              P_hctl:_FillValue = -9999.f ;
//              P_hctl:navigation = "nav" ;

//      float   P_lcbl(record, lat, lon) ;
//              P_lcbl:long_name = "pressure at low cloud base level" ;
//              P_lcbl:units = "Pa" ;
//              P_lcbl:_FillValue = -9999.f ;
//              P_lcbl:navigation = "nav" ;

//      float   P_lctl(record, lat, lon) ;
//              P_lctl:long_name = "pressure at low cloud top level" ;
//              P_lctl:units = "Pa" ;
//              P_lctl:_FillValue = -9999.f ;
//              P_lctl:navigation = "nav" ;

//      float   P_maxwind(record, lat, lon) ;
//              P_maxwind:long_name = "pressure at max wind level" ;
//              P_maxwind:units = "Pa" ;
//              P_maxwind:_FillValue = -9999.f ;
//              P_maxwind:navigation = "nav" ;

//      float   P_mcbl(record, lat, lon) ;
//              P_mcbl:long_name = "pressure at medium cloud base level" ;
//              P_mcbl:units = "Pa" ;
//              P_mcbl:_FillValue = -9999.f ;
//              P_mcbl:navigation = "nav" ;

//      float   P_mctl(record, lat, lon) ;
//              P_mctl:long_name = "pressure at medium cloud top level" ;
//              P_mctl:units = "Pa" ;
//              P_mctl:_FillValue = -9999.f ;
//              P_mctl:navigation = "nav" ;

//      float   P_msl(record, lat, lon) ;
//              P_msl:long_name = "pressure reduced to MSL" ;
//              P_msl:units = "Pa" ;
//              P_msl:_FillValue = -9999.f ;
//              P_msl:navigation = "nav" ;

        float   P_sfc(record, lat, lon) ;
                P_sfc:long_name = "pressure at surface" ;
                P_sfc:units = "Pa" ;
                P_sfc:_FillValue = -9999.f ;
                P_sfc:navigation = "nav" ;

//      float   P_trop(record, lat, lon) ;
//              P_trop:long_name = "pressure at tropopause" ;
//              P_trop:units = "Pa" ;
//              P_trop:_FillValue = -9999.f ;
//              P_trop:navigation = "nav" ;

//      float   pevpr_sfc(record, lat, lon) ;
//              pevpr_sfc:long_name = "potential evaporation rate" ;
//              pevpr_sfc:units = "W/m2" ;
//              pevpr_sfc:_FillValue = -9999.f ;
//              pevpr_sfc:navigation = "nav" ;

        float   pr_water_atm(record, lat, lon) ;
                pr_water_atm:long_name = "precipitable water entire atmosphere" 
;
                pr_water_atm:units = "kg/m2" ;
                pr_water_atm:_FillValue = -9999.f ;
                pr_water_atm:navigation = "nav" ;

        float   precip_cn3(record, lat, lon) ;
                precip_cn3:long_name = "convective precipitation over 
accumulation interval" ;
                precip_cn3:units = "kg/m2" ;
                precip_cn3:_FillValue = -9999.f ;
                precip_cn3:navigation = "nav" ;

        float   precip_cn6(record, lat, lon) ;
                precip_cn6:long_name = "convective precipitation over 
accumulation interval" ;
                precip_cn6:units = "kg/m2" ;
                precip_cn6:_FillValue = -9999.f ;
                precip_cn6:navigation = "nav" ;

//      float   precip_cn3_accum_times(record, accum) ;
//              precip_cn3_accum_times:long_name = "convective precipitation 
over accumulation interval" ;
//              precip_cn3_accum_times:units = "hours" ;
//              precip_cn3_accum_times:_FillValue = -9999.f ;

//      float   precip_cn6_accum_times(record, accum) ;
//              precip_cn6_accum_times:long_name = "convective precipitation 
over accumulation interval" ;
//              precip_cn6_accum_times:units = "hours" ;
//              precip_cn6_accum_times:_FillValue = -9999.f ;

        // This next variable is here to satisfy regCalc. It will be empty.
        float   precip_cn12(record, lat, lon) ;
                precip_cn12:long_name = "convective precipitation over 
accumulation interval" ;
                precip_cn12:units = "kg/m2" ;
                precip_cn12:_FillValue = -9999.f ;
                precip_cn12:navigation = "nav" ;

//      float   precip_rt(record, lat, lon) ;
//              precip_rt:long_name = "precipitation rate" ;
//              precip_rt:units = "kg/m2/s" ;
//              precip_rt:_FillValue = -9999.f ;
//              precip_rt:navigation = "nav" ;

        float   PRECIP3(record, lat, lon) ;
                PRECIP3:long_name = "total precipitation over accumulation 
interval" ;
                PRECIP3:units = "kg/m2" ;
                PRECIP3:_FillValue = -9999.f ;
                PRECIP3:navigation = "nav" ;

        float   PRECIP6(record, lat, lon) ;
                PRECIP6:long_name = "total precipitation over accumulation 
interval" ;
                PRECIP6:units = "kg/m2" ;
                PRECIP6:_FillValue = -9999.f ;
                PRECIP6:navigation = "nav" ;

//      float   PRECIP3_accum_times(record, accum) ;
//              PRECIP3_accum_times:long_name = "precipitation accumulation 
interval" ;
//              PRECIP3_accum_times:units = "hours" ;
//              PRECIP3_accum_times:_FillValue = -9999.f ;

//      float   PRECIP6_accum_times(record, accum) ;
//              PRECIP6_accum_times:long_name = "precipitation accumulation 
interval" ;
//              PRECIP6_accum_times:units = "hours" ;
//              PRECIP6_accum_times:_FillValue = -9999.f ;

        // This next variable is here to satisfy regCalc. It will be empty.
        float   PRECIP12(record, lat, lon) ;
                PRECIP12:long_name = "total precipitation over accumulation 
interval" ;
                PRECIP12:units = "kg/m2" ;
                PRECIP12:_FillValue = -9999.f ;
                PRECIP12:navigation = "nav" ;

        float   RH(record, level, lat, lon) ;
                RH:long_name = "relative humidity" ;
                RH:units = "percent" ;
                RH:_FillValue = -9999.f ;
                RH:navigation = "nav" ;

        float   RH_atm(record, lat, lon) ;
                RH_atm:long_name = "relative humidity entire atmosphere" ;
                RH_atm:units = "percent" ;
                RH_atm:_FillValue = -9999.f ;
                RH_atm:navigation = "nav" ;

        float   RH_fhg(record, fhg2m, lat, lon) ;
                RH_fhg:long_name = "relative humidity at fixed height above 
ground" ;
                RH_fhg:units = "percent" ;
                RH_fhg:_FillValue = -9999.f ;
                RH_fhg:navigation = "nav" ;

//      float   RH_frzlvl(record, lat, lon) ;
//              RH_frzlvl:long_name = "relative humidity at freezing level" ;
//              RH_frzlvl:units = "percent" ;
//              RH_frzlvl:_FillValue = -9999.f ;
//              RH_frzlvl:navigation = "nav" ;

//      float   RH_htfl(record, lat, lon) ;
//              RH_htfl:long_name = "relative humidity at highest tropospheric 
freezing level" ;
//              RH_htfl:units = "percent" ;
//              RH_htfl:_FillValue = -9999.f ;
//              RH_htfl:navigation = "nav" ;

//      float   RH_lpdg(record, lpdg, lat, lon) ;
//              RH_lpdg:long_name = "relative humidity in boundary layer" ;
//              RH_lpdg:units = "percent" ;
//              RH_lpdg:_FillValue = -9999.f ;
//              RH_lpdg:navigation = "nav" ;

//      float   RH_ls(record, ls, lat, lon) ;
//              RH_ls:long_name = "relative humidity in layer" ;
//              RH_ls:units = "percent" ;
//              RH_ls:_FillValue = -9999.f ;
//              RH_ls:navigation = "nav" ;

        float   RH_sigma(record, sigma, lat, lon) ;
                RH_sigma:long_name = "relative humidity at sigma level" ;
                RH_sigma:units = "percent" ;
                RH_sigma:_FillValue = -9999.f ;
                RH_sigma:navigation = "nav" ;

        float   sen_ht_sfc(record, lat, lon) ;
                sen_ht_sfc:long_name = "surface sensible heat net flux" ;
                sen_ht_sfc:units = "W/m2" ;
                sen_ht_sfc:_FillValue = -9999.f ;
                sen_ht_sfc:navigation = "nav" ;

        float   snow_wat(record, lat, lon) ;
                snow_wat:long_name = "water equivalent of accumulated snow 
depth" ;
                snow_wat:units = "kg/m2" ;
                snow_wat:_FillValue = -9999.f ;
                snow_wat:navigation = "nav" ;

        float   soilw_lbls(record, lbls, lat, lon) ;
                soilw_lbls:long_name = "volumetric soil moisture content" ;
                soilw_lbls:units = "percent/hundred" ;
                soilw_lbls:_FillValue = -9999.f ;
                soilw_lbls:navigation = "nav" ;

//      float   spec_hum_fhg(record, fhg2m, lat, lon) ;
//              spec_hum_fhg:long_name = "specific humidity at fixed height 
above ground" ;
//              spec_hum_fhg:units = "kg/kg" ;
//              spec_hum_fhg:_FillValue = -9999.f ;
//              spec_hum_fhg:navigation = "nav" ;

//      float   spec_hum_lpdg(record, lpdg, lat, lon) ;
//              spec_hum_lpdg:long_name = "specific humidity in boundary layer" 
;
//              spec_hum_lpdg:units = "kg/kg" ;
//              spec_hum_lpdg:_FillValue = -9999.f ;
//              spec_hum_lpdg:navigation = "nav" ;

        float   T(record, level, lat, lon) ;
                T:long_name = "temperature" ;
                T:units = "degK" ;
                T:_FillValue = -9999.f ;
                T:navigation = "nav" ;

//      float   T_fh(record, fh, lat, lon) ;
//              T_fh:long_name = "temperature at fixed height level" ;
//              T_fh:units = "degK" ;
//              T_fh:_FillValue = -9999.f ;
//              T_fh:navigation = "nav" ;

        float   T_fhg(record, fhg2m, lat, lon) ;
                T_fhg:long_name = "temperature at fixed height above ground" ;
                T_fhg:units = "degK" ;
                T_fhg:_FillValue = -9999.f ;
                T_fhg:navigation = "nav" ;

//      float   T_hctl(record, lat, lon) ;
//              T_hctl:long_name = "temperature at high cloud top level" ;
//              T_hctl:units = "degK" ;
//              T_hctl:_FillValue = -9999.f ;
//              T_hctl:navigation = "nav" ;

        float   T_lbls(record, lbls, lat, lon) ;
                T_lbls:long_name = "temperature in layer below surface" ;
                T_lbls:units = "degK" ;
                T_lbls:_FillValue = -9999.f ;
                T_lbls:navigation = "nav" ;

//      float   T_lctl(record, lat, lon) ;
//              T_lctl:long_name = "temperature at low cloud top level" ;
//              T_lctl:units = "degK" ;
//              T_lctl:_FillValue = -9999.f ;
//              T_lctl:navigation = "nav" ;

//      float   T_lpdg(record, lpdg, lat, lon) ;
//              T_lpdg:long_name = "temperature in boundary layer" ;
//              T_lpdg:units = "degK" ;
//              T_lpdg:_FillValue = -9999.f ;
//              T_lpdg:navigation = "nav" ;

//      float   T_maxwind(record, lat, lon) ;
//              T_maxwind:long_name = "temperature at max wind level" ;
//              T_maxwind:units = "degK" ;
//              T_maxwind:_FillValue = -9999.f ;
//              T_maxwind:navigation = "nav" ;

//      float   T_mctl(record, lat, lon) ;
//              T_mctl:long_name = "temperature at medium cloud top level" ;
//              T_mctl:units = "degK" ;
//              T_mctl:_FillValue = -9999.f ;
//              T_mctl:navigation = "nav" ;

//      float   T_sfc(record, lat, lon) ;
//              T_sfc:long_name = "temperature at surface" ;
//              T_sfc:units = "degK" ;
//              T_sfc:_FillValue = -9999.f ;
//              T_sfc:navigation = "nav" ;

        float   T_sigma(record, sigma, lat, lon) ;
                T_sigma:long_name = "temperature at sigma level" ;
                T_sigma:units = "degK" ;
                T_sigma:_FillValue = -9999.f ;
                T_sigma:navigation = "nav" ;

//      float   T_trop(record, lat, lon) ;
//              T_trop:long_name = "temperature at tropopause" ;
//              T_trop:units = "degK" ;
//              T_trop:_FillValue = -9999.f ;
//              T_trop:navigation = "nav" ;

//      float   theta_sigma(record, sigma, lat, lon) ;
//              theta_sigma:long_name = "potential temperature at sigma level" ;
//              theta_sigma:units = "degK" ;
//              theta_sigma:_FillValue = -9999.f ;
//              theta_sigma:navigation = "nav" ;

        float   Tmax_fhg(record, fhg2m, lat, lon) ;
                Tmax_fhg:long_name = "max temp at fixed height above ground" ;
                Tmax_fhg:units = "degK" ;
                Tmax_fhg:_FillValue = -9999.f ;
                Tmax_fhg:navigation = "nav" ;

        float   Tmin_fhg(record, fhg2m, lat, lon) ;
                Tmin_fhg:long_name = "min temp at fixed height above ground" ;
                Tmin_fhg:units = "degK" ;
                Tmin_fhg:_FillValue = -9999.f ;
                Tmin_fhg:navigation = "nav" ;

//      float   totoz_atm(record, lat, lon) ;
//              totoz_atm:long_name = "total ozone in atmosphere" ;
//              totoz_atm:units = "Dobson" ;
//              totoz_atm:_FillValue = -9999.f ;
//              totoz_atm:navigation = "nav" ;

        float   u(record, level, lat, lon) ;
                u:long_name = "u-component of wind" ;
                u:units = "meters/second" ;
                u:_FillValue = -9999.f ;
                u:navigation = "nav" ;

//      float   u_fh(record, fh, lat, lon) ;
//              u_fh:long_name = "u-component of wind at fixed height" ;
//              u_fh:units = "meters/second" ;
//              u_fh:_FillValue = -9999.f ;
//              u_fh:navigation = "nav" ;

        float   u_fhg(record, fhg10m, lat, lon) ;
                u_fhg:long_name = "u-component of wind at fixed height above 
ground" ;
                u_fhg:units = "meters/second" ;
                u_fhg:_FillValue = -9999.f ;
                u_fhg:navigation = "nav" ;

//      float   u_flx_sfc(record, lat, lon) ;
//              u_flx_sfc:long_name = "u-component of momentum flux at surface" 
;
//              u_flx_sfc:units = "N/m2" ;
//              u_flx_sfc:_FillValue = -9999.f ;
//              u_flx_sfc:navigation = "nav" ;

//      float   u_gwd_sfc(record, lat, lon) ;
//              u_gwd_sfc:long_name = "u-component of gravity wave stress flux 
at surface" ;
//              u_gwd_sfc:units = "N/m2" ;
//              u_gwd_sfc:_FillValue = -9999.f ;
//              u_gwd_sfc:navigation = "nav" ;

//      float   u_lpdg(record, lpdg, lat, lon) ;
//              u_lpdg:long_name = "u-component of wind in boundary layer" ;
//              u_lpdg:units = "meters/second" ;
//              u_lpdg:_FillValue = -9999.f ;
//              u_lpdg:navigation = "nav" ;

//      float   u_maxwind(record, lat, lon) ;
//              u_maxwind:long_name = "u-component of wind at max wind" ;
//              u_maxwind:units = "meters/second" ;
//              u_maxwind:_FillValue = -9999.f ;
//              u_maxwind:navigation = "nav" ;

        float   u_sigma(record, sigma, lat, lon) ;
                u_sigma:long_name = "u-component of wind at sigma level" ;
                u_sigma:units = "meters/second" ;
                u_sigma:_FillValue = -9999.f ;
                u_sigma:navigation = "nav" ;

//      float   u_trop(record, lat, lon) ;
//              u_trop:long_name = "u-component of wind at tropopause" ;
//              u_trop:units = "meters/second" ;
//              u_trop:_FillValue = -9999.f ;
//              u_trop:navigation = "nav" ;

        float   ulwrf_sfc(record, lat, lon) ;
                ulwrf_sfc:long_name = "upward long wave radiation flux at 
surface" ;
                ulwrf_sfc:units = "W/m2" ;
                ulwrf_sfc:_FillValue = -9999.f ;
                ulwrf_sfc:navigation = "nav" ;

//      float   ulwrf_topa(record, lat, lon) ;
//              ulwrf_topa:long_name = "upward long wave radiation flux at top 
of atmosphere" ;
//              ulwrf_topa:units = "W/m2" ;
//              ulwrf_topa:_FillValue = -9999.f ;
//              ulwrf_topa:navigation = "nav" ;

        float   uswrf_sfc(record, lat, lon) ;
                uswrf_sfc:long_name = "upward short wave radiation flux at 
surface" ;
                uswrf_sfc:units = "W/m2" ;
                uswrf_sfc:_FillValue = -9999.f ;
                uswrf_sfc:navigation = "nav" ;

//      float   uswrf_topa(record, lat, lon) ;
//              uswrf_topa:long_name = "upward short wave radiation flux at top 
of atmosphere" ;
//              uswrf_topa:units = "W/m2" ;
//              uswrf_topa:_FillValue = -9999.f ;
//              uswrf_topa:navigation = "nav" ;

        float   v(record, level, lat, lon) ;
                v:long_name = "v-component of wind" ;
                v:units = "meters/second" ;
                v:_FillValue = -9999.f ;
                v:navigation = "nav" ;

//      float   v_fh(record, fh, lat, lon) ;
//              v_fh:long_name = "v-component of wind at fixed height" ;
//              v_fh:units = "meters/second" ;
//              v_fh:_FillValue = -9999.f ;
//              v_fh:navigation = "nav" ;

        float   v_fhg(record, fhg10m, lat, lon) ;
                v_fhg:long_name = "v-component of wind at fixed height above 
ground" ;
                v_fhg:units = "meters/second" ;
                v_fhg:_FillValue = -9999.f ;
                v_fhg:navigation = "nav" ;

//      float   v_flx_sfc(record, lat, lon) ;
//              v_flx_sfc:long_name = "v-component of momentum flux at surface" 
;
//              v_flx_sfc:units = "N/m2" ;
//              v_flx_sfc:_FillValue = -9999.f ;
//              v_flx_sfc:navigation = "nav" ;

//      float   v_gwd_sfc(record, lat, lon) ;
//              v_gwd_sfc:long_name = "v-component of gravity wave stress flux 
at surface" ;
//              v_gwd_sfc:units = "N/m2" ;
//              v_gwd_sfc:_FillValue = -9999.f ;
//              v_gwd_sfc:navigation = "nav" ;

//      float   v_lpdg(record, lpdg, lat, lon) ;
//              v_lpdg:long_name = "v-component of wind in boundary layer" ;
//              v_lpdg:units = "meters/second" ;
//              v_lpdg:_FillValue = -9999.f ;
//              v_lpdg:navigation = "nav" ;

//      float   v_maxwind(record, lat, lon) ;
//              v_maxwind:long_name = "v-component of wind at max wind" ;
//              v_maxwind:units = "meters/second" ;
//              v_maxwind:_FillValue = -9999.f ;
//              v_maxwind:navigation = "nav" ;

        float   v_sigma(record, sigma, lat, lon) ;
                v_sigma:long_name = "v-component of wind at sigma level" ;
                v_sigma:units = "meters/second" ;
                v_sigma:_FillValue = -9999.f ;
                v_sigma:navigation = "nav" ;

//      float   v_trop(record, lat, lon) ;
//              v_trop:long_name = "v-component of wind at tropopause" ;
//              v_trop:units = "meters/second" ;
//              v_trop:_FillValue = -9999.f ;
//              v_trop:navigation = "nav" ;

//      float   vert_sshr_trop(record, lat, lon) ;
//              vert_sshr_trop:long_name = "vertical speed sheer at tropopause" 
;
//              vert_sshr_trop:units = "1/s" ;
//              vert_sshr_trop:_FillValue = -9999.f ;
//              vert_sshr_trop:navigation = "nav" ;

//      float   watr3(record, lat, lon) ;
//              watr3:long_name = "water runoff" ;
//              watr3:units = "kg/m2" ;
//              watr3:_FillValue = -9999.f ;
//              watr3:navigation = "nav" ;

//      float   watr6(record, lat, lon) ;
//              watr6:long_name = "water runoff" ;
//              watr6:units = "kg/m2" ;
//              watr6:_FillValue = -9999.f ;
//              watr6:navigation = "nav" ;

        float   Z(record, level, lat, lon) ;
                Z:long_name = "geopotential height" ;
                Z:units = "gp m" ;
                Z:_FillValue = -9999.f ;
                Z:navigation = "nav" ;

//      float   Z_frzlvl(record, lat, lon) ;
//              Z_frzlvl:long_name = "geopotential height at freezing level" ;
//              Z_frzlvl:units = "gp m" ;
//              Z_frzlvl:_FillValue = -9999.f ;
//              Z_frzlvl:navigation = "nav" ;

//      float   Z_htfl(record, lat, lon) ;
//              Z_htfl:long_name = "geopotential height at highest tropospheric 
freezing level" ;
//              Z_htfl:units = "gp m" ;
//              Z_htfl:_FillValue = -9999.f ;
//              Z_htfl:navigation = "nav" ;

//      float   Z_maxwind(record, lat, lon) ;
//              Z_maxwind:long_name = "geopotential height at max wind level" ;
//              Z_maxwind:units = "gp m" ;
//              Z_maxwind:_FillValue = -9999.f ;
//              Z_maxwind:navigation = "nav" ;

        float   Z_sfc(lat, lon) ;
                Z_sfc:long_name = "geopotential height at surface" ;
                Z_sfc:units = "gp m" ;
                Z_sfc:_FillValue = -9999.f ;
                Z_sfc:navigation = "nav" ;

//      float   Z_trop(record, lat, lon) ;
//              Z_trop:long_name = "geopotential height at tropopause" ;
//              Z_trop:units = "gp m" ;
//              Z_trop:_FillValue = -9999.f ;
//              Z_trop:navigation = "nav" ;

//      float   Zdev(record, zalevel, lat, lon) ;
//              Zdev:long_name = "geopotential height anomoly" ;
//              Zdev:units = "gp m" ;
//              Zdev:_FillValue = -9999.f ;
//              Zdev:navigation = "nav" ;


// global attributes:
                :history = "created by gribtonc" ;
                :title = "NMC Global Product Set" ;
                :Conventions = "NUWG" ;
                :version = 0.0 ;                // still just a draft

data:

// level = 1000, 975, 950, 925, 900, 850, 800, 750, 700, 650, 600, 550, 500,
//       450, 400, 350, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10;
 level = 1000, 975, 950, 925, 900, 850, 800, 750, 700, 650, 600, 550, 500,
         450, 400, 350, 300, 250, 200;
 o3level = 100, 70, 50, 30, 20, 10;
 gpt5level = 500;
 zalevel = 1000, 500;
 lpdg_bot =  0;
 lpdg_top = 30;
 lpdg2_bot =   0 ;
 lpdg2_top = 180 ;
 lbls_top =  0, 10 ;
 lbls_bot = 10, 200 ;
 ls_top = .44, .72, .44, .33 ;
 ls_bot = 1, .94, .72, 1;
 fh = 1829, 2743, 3658 ;
 fhg2m = 2 ;
 fhg10m = 10 ;
 sigma = 0.9950 ;
 model_id = 81, 96 ;

 // Navigation
 nav_model = "GRIB1" ;
 grid_type_code = 0 ;
 grid_type  = "Latitude/Longitude" ;
 grid_name = "Global 1 x 1 degree grid" ;
 grid_center = 7 ;   // NCEP
 grid_number = 3 ;
 i_dim = "lon" ;
 j_dim = "lat" ;
 Ni = 360 ;
 Nj = 181 ;
 La1 = -90.0 ;
 Lo1 = 0.0 ;
 La2 = 90.0 ;
 Lo2 = -1.0 ;
 Di = 1.0 ;
 Dj = 1.0 ;
 ResCompFlag = 128 ;


 lon =    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
          10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
          20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
          30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
          40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
          50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
          60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
          70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
          80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
          90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
         100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
         110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
         120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
         130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
         140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
         150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
         160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
         170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
         180, -179, -178, -177, -176, -175, -174, -173, -172, -171,
        -170, -169, -168, -167, -166, -165, -164, -163, -162, -161,
        -160, -159, -158, -157, -156, -155, -154, -153, -152, -151,
        -150, -149, -148, -147, -146, -145, -144, -143, -142, -141,
        -140, -139, -138, -137, -136, -135, -134, -133, -132, -131,
        -130, -129, -128, -127, -126, -125, -124, -123, -122, -121,
        -120, -119, -118, -117, -116, -115, -114, -113, -112, -111,
        -110, -109, -108, -107, -106, -105, -104, -103, -102, -101,
        -100, -99, -98, -97, -96, -95, -94, -93, -92, -91,
         -90, -89, -88, -87, -86, -85, -84, -83, -82, -81,
         -80, -79, -78, -77, -76, -75, -74, -73, -72, -71,
         -70, -69, -68, -67, -66, -65, -64, -63, -62, -61,
         -60, -59, -58, -57, -56, -55, -54, -53, -52, -51,
         -50, -49, -48, -47, -46, -45, -44, -43, -42, -41,
         -40, -39, -38, -37, -36, -35, -34, -33, -32, -31,
         -30, -29, -28, -27, -26, -25, -24, -23, -22, -21,
         -20, -19, -18, -17, -16, -15, -14, -13, -12, -11,
         -10, -9, -8, -7, -6, -5, -4, -3, -2, -1;


 lat =  -90, -89, -88, -87, -86, -85, -84, -83, -82, -81,
        -80, -79, -78, -77, -76, -75, -74, -73, -72, -71,
        -70, -69, -68, -67, -66, -65, -64, -63, -62, -61,
        -60, -59, -58, -57, -56, -55, -54, -53, -52, -51,
        -50, -49, -48, -47, -46, -45, -44, -43, -42, -41,
        -40, -39, -38, -37, -36, -35, -34, -33, -32, -31,
        -30, -29, -28, -27, -26, -25, -24, -23, -22, -21,
        -20, -19, -18, -17, -16, -15, -14, -13, -12, -11,
        -10, -9, -8, -7, -6, -5, -4, -3, -2, -1,
          0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
         10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
         20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
         30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
         40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
         50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
         60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
         70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
         80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
         90 ;


}