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

Re: 20040126:bug in gribtonc



On Mon, 26 Jan 2004, Unidata Support wrote:

>
> ------- Forwarded Message
>
> >To: "'address@hidden'" <address@hidden>
> >From: "Hanson, Kurt" <address@hidden>
> >Subject: bug in gribtonc?
> >Organization: UCAR/Unidata
> >Keywords: 200401261539.i0QFdEp2018354
>
> This message is in MIME format. Since your mail reader does not understand
> this format, some or all of this message may not be legible.
>
> ------_=_NextPart_001_01C3E422.880DC290
> Content-Type: text/plain;
>       charset="windows-1252"
>
> Hello --
>
> The following concerns the gribtonc utility, as contained in version 3.0.1
> of the decoders package.
>
> The getrec(...) function in recs.c contains the following block:
>       /* get dimension and value of valtime_offset */
>       dimvaloffsetsid = nuwg_getdim(ncid, DIM_VALOFFSETS );
>       if (ncdiminq(ncid, dimvaloffsetsid, (char *)0, &dimvaloffsets) ==
> -1) {
>           uerror("%s: can't get dimvaloffsets", nc->ncname);
>           nerrs++;
>       }
>
> Also, nuwg.h contains these definitions:
>     DIM_VALOFFSETS,           /* number of offsets times in this model */
>     VAR_VALOFFSET,            /* valid time offset for humans */
>
> And nuwg.c contains a function nuwg_name(...) which returns "valtime_offset"
> for both DIM_VALOFFSETS and VAR_VALOFFSET.
>
> What's surprising to me is that there is code for considering the notion of
> "valid time offsets" as a dimension and also code for considering it a
> variable. Is this appropriate? In my experience, I've seen it only as a
> variable, but my experience is far from comprehensive! If it does appear as
> a dimension in certain contexts, could you provide an example?

Kurt,

The problem is that I never really had a chance to make an official
decoders release that explains your concerns. Everything you mention has
been done to make the data monotonically increasing in the netCDF file. To
make that happen, I had to enter the valtime_offsets into the cdl so
gribtonc would know where to enter the data in the file. For the eta
model, the

valtime_offset = 6, 12, 18, 24, 30, 36, 42, 48, 54, 60 ;

In the old gribtonc/cdls the data was packed into the file as it appeared
on the datastream, many times the 24 hr data came in before the 12 hr data
so that's the order it was in the file.  Now, the code looks for the
valtime_offset to figure out where to place the data. I'm attaching the
eta.cdl as an working example. Actually it's been used at Unidata for the
last couple of months.  Also, you might note the inclusion of a new
variable called:

        char   forecasttime(record, time_len) ; // derived from valtime
               forecasttime:long_name = "forecast date and time" ;
               // units YYYY-MM-DD hh:mm:ssZ  (ISO 8601)

I'm planning on making a decoders release with the new cdls to match the
new code very soon, hopefully this week.

Robb...




>
> If it is a bug, and should always be considered a variable, it seems the
> following could replace the block quoted above in recs.c:
>
>         int valoffsets_dim_count;
>         int valoffsets_dims[MAX_VAR_DIMS];
>
>         // Get the dimensions of the VALOFFSET variable
>         int status = ncvarinq(ncid,
>                               nuwg_getvar(ncid, VAR_VALOFFSET),
>                               (char *)0,
>                               (nc_type *)0,
>                               &valoffsets_dim_count,
>                               valoffsets_dims,
>                               (int *)0);
>         if (status == -1)
>         {
>             uerror("%s: can't get dimensions of variable '%s' (status: %d)",
>                    nc->ncname,
>                    nuwg_name(VAR_VALOFFSET),
>                    status);
>             nerrs++;
>             return -1;
>         }
>         else if (valoffsets_dim_count > 1)
>         {
>             uerror("%s: variable '%s' has %d dimensions but 1 is expected",
>                    nc->ncname,
>                    nuwg_name(VAR_VALOFFSET),
>                    valoffsets_dim_count);
>             nerrs++;
>             return -1;
>         }
>
>         // Get the size of the VALOFFSET variable
>         dimvaloffsets = valoffsets_dims[0];
>
> and, for completeness, DIM_VALOFFSETS could be eliminated from nuwg.h and
> nuwg.c.
>
> However, if whether the valid time offsets is a dimension or variable
> depends on context, then it seems we'd need code to handle both
> possibilities.
>
> What do you think?
>
> Thanks --
>
> Kurt Hanson
> Scientific Software Engineer
> WSI Corporation
> 400 Minuteman Rd.
> Andover, MA 01810
>
>
> ------_=_NextPart_001_01C3E422.880DC290
> Content-Type: text/html;
>       charset="windows-1252"
> Content-Transfer-Encoding: quoted-printable
>
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
> <HTML>
> <HEAD>
> <META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
> charset=3Dwindows-1252">
> <META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
> 5.5.2653.12">
> <TITLE>bug in gribtonc?</TITLE>
> </HEAD>
> <BODY>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">Hello --</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">The following concerns the gribtonc =
> utility, as contained in version 3.0.1 of the decoders package.</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">The getrec(...) function in recs.c =
> contains the following block:</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">/* get dimension and value of valtime_offset =
> */</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">dimvaloffsetsid =3D nuwg_getdim(ncid, =
> DIM_VALOFFSETS );</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">if (ncdiminq(ncid, dimvaloffsetsid, (char *)0, =
> &amp;dimvaloffsets) =3D=3D -1) {</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">&nbsp;&nbsp;&nbsp; uerror(&quot;%s: can't get =
> dimvaloffsets&quot;, nc-&gt;ncname);</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">&nbsp;&nbsp;&nbsp; nerrs++;</FONT>
> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT SIZE=3D2 =
> FACE=3D"Courier New">}</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">Also, nuwg.h contains these =
> definitions:</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier New">&nbsp;&nbsp;&nbsp; =
> DIM_VALOFFSETS,&nbsp;&nbsp;&nbsp;&nbsp; =
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* number of offsets times =
> in this model */</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier New">&nbsp;&nbsp;&nbsp; =
> VAR_VALOFFSET,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* valid time offset for =
> humans */</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">And nuwg.c contains a function =
> nuwg_name(...) which returns &quot;valtime_offset&quot; for both =
> DIM_VALOFFSETS and VAR_VALOFFSET.</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">What's surprising to me is that there =
> is code for considering the notion of &quot;valid time offsets&quot; as =
> a dimension and also code for considering it a variable. Is this =
> appropriate? In my experience, I've seen it only as a variable, but my =
> experience is far from comprehensive! If it does appear as a dimension =
> in certain contexts, could you provide an example?</FONT></P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">If it is a bug, and should always be =
> considered a variable, it seems the following could replace the block =
> quoted above in recs.c:</FONT></P>
>
> <P><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int =
> valoffsets_dim_count;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int =
> valoffsets_dims[MAX_VAR_DIMS];</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the dimensions =
> of the VALOFFSET variable</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status =3D =
> ncvarinq(ncid,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nuwg_getvar(ncid, =
> VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (char *)0,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nc_type *)0,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;valoffsets_dim_count,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valoffsets_dims,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (int *)0);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (status =3D=3D =
> -1)</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> uerror(&quot;%s: can't get dimensions of variable '%s' (status: =
> %d)&quot;,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nc-&gt;ncname,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> nuwg_name(VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> nerrs++;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> return -1;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if =
> (valoffsets_dim_count &gt; 1)</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> uerror(&quot;%s: variable '%s' has %d dimensions but 1 is =
> expected&quot;,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nc-&gt;ncname,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> nuwg_name(VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
> nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valoffsets_dim_count);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> nerrs++;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
> return -1;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the size of the =
> VALOFFSET variable</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dimvaloffsets =3D =
> valoffsets_dims[0];</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">and, for completeness, DIM_VALOFFSETS =
> could be eliminated from nuwg.h and nuwg.c.</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">However, if whether the valid time =
> offsets is a dimension or variable depends on context, then it seems =
> we'd need code to handle both possibilities.</FONT></P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">What do you think?</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">Thanks --</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">Kurt Hanson</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Arial">Scientific Software Engineer</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Arial">WSI Corporation</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Arial">400 Minuteman Rd.</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Arial">Andover, MA 01810</FONT>
> </P>
>
> </BODY>
> </HTML>
> ------_=_NextPart_001_01C3E422.880DC290--
>
> NOTE: All email exchanges with Unidata User Support are recorded in the
> Unidata inquiry tracking system and then made publically available
> through the web.  If you do not want to have your interactions made
> available in this way, you must let us know in each email you send to us.
> --
>
> ------- End of Forwarded Message
>
>

===============================================================================
Robb Kambic                                Unidata Program Center
Software Engineer III                      Univ. Corp for Atmospheric Research
address@hidden             WWW: http://www.unidata.ucar.edu/
===============================================================================
netcdf eta{        // Early Terrain Analysis model 48km and 80km 

dimensions:
        record = UNLIMITED ;   // (reference time, forecast time)
        x = 93 ;
        y = 65 ;
        level = 19 ;           // isobaric levels
        lpdg = 6 ;             // layer between levels at specif. pressure 
diffs from ground
        fhg = 2 ;              // fixed height above ground
        lfhg = 1 ;             // layer between 2 height levels above ground
        time_len = 21 ;        // string length for datetime strings
        valtime_offset = 10 ;  // number of offset times
        nmodels = 1 ;          // number of models
        ngrids = 1 ;           // number of grids
        nav = 1 ;              // for navigation
        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, time_len) ; // derived from reftime
               datetime:long_name = "reference date and time" ;
               // units YYYY-MM-DD hh:mm:ssZ  (ISO 8601)

        double valtime_offset(valtime_offset) ; // valtime - reftime
               valtime_offset:long_name = "hours from reference time" ;
               valtime_offset:units = "hours" ;

        char   forecasttime(record, time_len) ; // derived from valtime
               forecasttime:long_name = "forecast date and time" ;
               // units YYYY-MM-DD hh:mm:ssZ  (ISO 8601)

        float  level(level) ;
               level:long_name = "isobaric level" ;
               level: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 layer between levels at 
specif. pressure diffs from ground " ;
               lpdg_bot:units = "hPa" ;

        float  lpdg_top(lpdg) ;
               lpdg_top:long_name = "top level of layer between levels at 
specif. pressure diffs from ground " ;
               lpdg_top:units = "hPa" ;

        float  fhg(fhg) ;
               fhg:long_name = "fixed height above ground" ;
               fhg:units = "meters" ;

        :lfhg = "lfhg_bot, lfhg_top" ; // ("lfhg_bot, lfhg_top") uniquely
                                       // determines lfhg

        float  lfhg_bot(lfhg) ;
               lfhg_bot:long_name = "bottom level of layer between 2 height 
levels above ground " ;
               lfhg_bot:units = "hm" ;

        float  lfhg_top(lfhg) ;
               lfhg_top:long_name = "top level of layer between 2 height levels 
above ground " ;
               lfhg_top:units = "hm" ;


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

        // 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, ngrids) ;
               grid_number:long_name = "GRIB-1 catalogued grid numbers" ;
               grid_number:_FillValue = -9999 ;

        char   x_dim(nav, nav_len) ;
               x_dim:long_name = "x dimension name" ;

        char   y_dim(nav, nav_len) ;
               y_dim:long_name = "y dimension name" ;

        long   Nx(nav) ;
               Nx:long_name = "number of points along x-axis" ;

        long   Ny(nav) ;
               Ny:long_name =  "number of points along y-axis" ;

        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  Lov(nav) ;
               Lov:long_name = "orientation of the grid" ;
               Lov:units = "degrees_east" ;

        float  Dx(nav) ;
               Dx:long_name = "x-direction grid length" ;
               Dx:units = "km" ;

        float  Dy(nav) ;
               Dy:long_name = "y-direction grid length" ;
               Dy:units = "km" ;

        byte   ProjFlag(nav) ;
               ProjFlag:long_name = "projection center flag" ;

        float  Latin1(nav) ;
               Latin1:long_name = "first intersecting latitude" ;
               Latin1:units = "degrees_north" ;

        float  Latin2(nav) ;
               Latin2:long_name = "second intersecting latitude" ;
               Latin2:units = "degrees_north" ;

        float  SpLat(nav) ;
               SpLat:long_name = "latitude of the southern pole" ;
               SpLat:units = "degrees_north" ;

        float  SpLon(nav) ;
               SpLon:long_name = "longitude of the southern pole" ;
               SpLon:units = "degrees_east" ;

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

        // end of navigation variables

        float  omega(record,level,y,x) ;
               omega:long_name = "Pressure vertical velocity at isobaric 
levels" ;
               omega:standard_name = "omega" ;
               omega:units = "Pa/s" ;
               omega:GRIB_parameter_number = 39 ;
               omega:GRIB_level_flag = 100 ;
               omega:_FillValue = -9999.f ;
               omega:navigation = "nav" ;

        float  Z(record,level,y,x) ;
               Z:long_name = "Geopotential height at isobaric levels" ;
               Z:standard_name = "geopotential_height" ;
               Z:units = "gp m" ;
               Z:GRIB_parameter_number = 7 ;
               Z:GRIB_level_flag = 100 ;
               Z:_FillValue = -9999.f ;
               Z:navigation = "nav" ;

        float  Z_sfc(y,x) ;
               Z_sfc:long_name = "Geopotential height at surface of the earth" ;
               Z_sfc:standard_name = "geopotential_height" ;
               Z_sfc:units = "gp m" ;
               Z_sfc:GRIB_parameter_number = 7 ;
               Z_sfc:GRIB_level_flag = 1 ;
               Z_sfc:_FillValue = -9999.f ;
               Z_sfc:navigation = "nav" ;

        float  v(record,level,y,x) ;
               v:long_name = "v-component of wind at isobaric levels" ;
               v:standard_name = "northward_wind" ;
               v:units = "m/s" ;
               v:GRIB_parameter_number = 34 ;
               v:GRIB_level_flag = 100 ;
               v:_FillValue = -9999.f ;
               v:navigation = "nav" ;

        float  v_fhg(record,fhg,y,x) ;
               v_fhg:long_name = "v-component of wind at fixed height above 
ground" ;
               v_fhg:standard_name = "northward_wind" ;
               v_fhg:units = "m/s" ;
               v_fhg:GRIB_parameter_number = 34 ;
               v_fhg:GRIB_level_flag = 105 ;
               v_fhg:_FillValue = -9999.f ;
               v_fhg:navigation = "nav" ;

        float  v_lpdg(record,lpdg,y,x) ;
               v_lpdg:long_name = "v-component of wind at layer between levels 
at specif. pressure diffs from ground" ;
               v_lpdg:standard_name = "northward_wind" ;
               v_lpdg:units = "m/s" ;
               v_lpdg:GRIB_parameter_number = 34 ;
               v_lpdg:GRIB_level_flag = 116 ;
               v_lpdg:_FillValue = -9999.f ;
               v_lpdg:navigation = "nav" ;

        float  T(record,level,y,x) ;
               T:long_name = "Temperature at isobaric levels" ;
               T:standard_name = "air_temperature" ;
               T:units = "degK" ;
               T:GRIB_parameter_number = 11 ;
               T:GRIB_level_flag = 100 ;
               T:_FillValue = -9999.f ;
               T:navigation = "nav" ;

        float  T_fhg(record,fhg,y,x) ;
               T_fhg:long_name = "Temperature at fixed height above ground" ;
               T_fhg:standard_name = "air_temperature" ;
               T_fhg:units = "degK" ;
               T_fhg:GRIB_parameter_number = 11 ;
               T_fhg:GRIB_level_flag = 105 ;
               T_fhg:_FillValue = -9999.f ;
               T_fhg:navigation = "nav" ;

        float  T_lpdg(record,lpdg,y,x) ;
               T_lpdg:long_name = "Temperature at layer between levels at 
specif. pressure diffs from ground" ;
               T_lpdg:standard_name = "air_temperature" ;
               T_lpdg:units = "degK" ;
               T_lpdg:GRIB_parameter_number = 11 ;
               T_lpdg:GRIB_level_flag = 116 ;
               T_lpdg:_FillValue = -9999.f ;
               T_lpdg:navigation = "nav" ;

        float  u(record,level,y,x) ;
               u:long_name = "u-component of wind at isobaric levels" ;
               u:standard_name = "eastward_wind" ;
               u:units = "m/s" ;
               u:GRIB_parameter_number = 33 ;
               u:GRIB_level_flag = 100 ;
               u:_FillValue = -9999.f ;
               u:navigation = "nav" ;

        float  u_fhg(record,fhg,y,x) ;
               u_fhg:long_name = "u-component of wind at fixed height above 
ground" ;
               u_fhg:standard_name = "eastward_wind" ;
               u_fhg:units = "m/s" ;
               u_fhg:GRIB_parameter_number = 33 ;
               u_fhg:GRIB_level_flag = 105 ;
               u_fhg:_FillValue = -9999.f ;
               u_fhg:navigation = "nav" ;

        float  u_lpdg(record,lpdg,y,x) ;
               u_lpdg:long_name = "u-component of wind at layer between levels 
at specif. pressure diffs from ground" ;
               u_lpdg:standard_name = "eastward_wind" ;
               u_lpdg:units = "m/s" ;
               u_lpdg:GRIB_parameter_number = 33 ;
               u_lpdg:GRIB_level_flag = 116 ;
               u_lpdg:_FillValue = -9999.f ;
               u_lpdg:navigation = "nav" ;

        float  RH(record,level,y,x) ;
               RH:long_name = "Relative humidity at isobaric levels" ;
               RH:standard_name = "relative_humidity" ;
               RH:units = "percent" ;
               RH:GRIB_parameter_number = 52 ;
               RH:GRIB_level_flag = 100 ;
               RH:_FillValue = -9999.f ;
               RH:navigation = "nav" ;

        float  RH_fhg(record,fhg,y,x) ;
               RH_fhg:long_name = "Relative humidity at fixed height above 
ground" ;
               RH_fhg:standard_name = "relative_humidity" ;
               RH_fhg:units = "percent" ;
               RH_fhg:GRIB_parameter_number = 52 ;
               RH_fhg:GRIB_level_flag = 105 ;
               RH_fhg:_FillValue = -9999.f ;
               RH_fhg:navigation = "nav" ;

        float  RH_lpdg(record,lpdg,y,x) ;
               RH_lpdg:long_name = "Relative humidity at layer between levels 
at specif. pressure diffs from ground" ;
               RH_lpdg:standard_name = "relative_humidity" ;
               RH_lpdg:units = "percent" ;
               RH_lpdg:GRIB_parameter_number = 52 ;
               RH_lpdg:GRIB_level_flag = 116 ;
               RH_lpdg:_FillValue = -9999.f ;
               RH_lpdg:navigation = "nav" ;

        float  P_sfc(record,y,x) ;
               P_sfc:long_name = "Pressure at surface of the earth" ;
               P_sfc:standard_name = "air_pressure" ;
               P_sfc:units = "Pa" ;
               P_sfc:GRIB_parameter_number = 1 ;
               P_sfc:GRIB_level_flag = 1 ;
               P_sfc:_FillValue = -9999.f ;
               P_sfc:navigation = "nav" ;

        float  PRECIP(record,y,x) ;
               PRECIP:long_name = "Total precipitation at surface of the earth" 
;
               PRECIP:standard_name = "precipitation_amount" ;
               PRECIP:units = "kg/m2" ;
               PRECIP:GRIB_parameter_number = 61 ;
               PRECIP:GRIB_level_flag = 1 ;
               PRECIP:_FillValue = -9999.f ;
               PRECIP:navigation = "nav" ;

        float  precip_cn(record,y,x) ;
               precip_cn:long_name = "Convective precipitation at surface of 
the earth" ;
               precip_cn:standard_name = "convective_precipitation_amount" ;
               precip_cn:units = "kg/m2" ;
               precip_cn:GRIB_parameter_number = 63 ;
               precip_cn:GRIB_level_flag = 1 ;
               precip_cn:_FillValue = -9999.f ;
               precip_cn:navigation = "nav" ;

        float  Psl_et(record,y,x) ;
               Psl_et:long_name = "Mean sea level pressure (ETA model 
reduction) at mean sea level" ;
               Psl_et:standard_name = "-" ;
               Psl_et:units = "Pa" ;
               Psl_et:GRIB_parameter_number = 130 ;
               Psl_et:GRIB_level_flag = 102 ;
               Psl_et:_FillValue = -9999.f ;
               Psl_et:navigation = "nav" ;

        float  absvor(record,level,y,x) ;
               absvor:long_name = "Absolute vorticity at isobaric levels" ;
               absvor:standard_name = "atmosphere_absolute_vorticity" ;
               absvor:units = "1/s" ;
               absvor:GRIB_parameter_number = 41 ;
               absvor:GRIB_level_flag = 100 ;
               absvor:_FillValue = -9999.f ;
               absvor:navigation = "nav" ;

        float  pli_lpdg(record,lpdg,y,x) ;
               pli_lpdg:long_name = "Parcel lifted index (to 500 hPa) at layer 
between levels at specif. pressure diffs from ground" ;
               pli_lpdg:standard_name = "-" ;
               pli_lpdg:units = "K" ;
               pli_lpdg:GRIB_parameter_number = 24 ;
               pli_lpdg:GRIB_level_flag = 116 ;
               pli_lpdg:_FillValue = -9999.f ;
               pli_lpdg:navigation = "nav" ;

        float  LI4_lpdg(record,lpdg,y,x) ;
               LI4_lpdg:long_name = "Best (4 layer) lifted index at layer 
between levels at specif. pressure diffs from ground" ;
               LI4_lpdg:standard_name = "-" ;
               LI4_lpdg:units = "degK" ;
               LI4_lpdg:GRIB_parameter_number = 132 ;
               LI4_lpdg:GRIB_level_flag = 116 ;
               LI4_lpdg:_FillValue = -9999.f ;
               LI4_lpdg:navigation = "nav" ;

        float  pr_water_atm(record,y,x) ;
               pr_water_atm:long_name = "Precipitable water at entire 
atmosphere considered as a single layer" ;
               pr_water_atm:standard_name = "atmosphere_water_vapour_content" ;
               pr_water_atm:units = "kg/m2" ;
               pr_water_atm:GRIB_parameter_number = 54 ;
               pr_water_atm:GRIB_level_flag = 200 ;
               pr_water_atm:_FillValue = -9999.f ;
               pr_water_atm:navigation = "nav" ;

        float  cape_sfc(record,y,x) ;
               cape_sfc:long_name = "Convective available potential energy at 
surface of the earth" ;
               cape_sfc:standard_name = "-" ;
               cape_sfc:units = "J/kg" ;
               cape_sfc:GRIB_parameter_number = 157 ;
               cape_sfc:GRIB_level_flag = 1 ;
               cape_sfc:_FillValue = -9999.f ;
               cape_sfc:navigation = "nav" ;

        float  cape_lpdg(record,lpdg,y,x) ;
               cape_lpdg:long_name = "Convective available potential energy at 
layer between levels at specif. pressure diffs from ground" ;
               cape_lpdg:standard_name = "-" ;
               cape_lpdg:units = "J/kg" ;
               cape_lpdg:GRIB_parameter_number = 157 ;
               cape_lpdg:GRIB_level_flag = 116 ;
               cape_lpdg:_FillValue = -9999.f ;
               cape_lpdg:navigation = "nav" ;

        float  cin_lpdg(record,lpdg,y,x) ;
               cin_lpdg:long_name = "Convective inhibition at layer between 
levels at specif. pressure diffs from ground" ;
               cin_lpdg:standard_name = "-" ;
               cin_lpdg:units = "J/kg" ;
               cin_lpdg:GRIB_parameter_number = 156 ;
               cin_lpdg:GRIB_level_flag = 116 ;
               cin_lpdg:_FillValue = -9999.f ;
               cin_lpdg:navigation = "nav" ;

        float  cin_sfc(record,y,x) ;
               cin_sfc:long_name = "Convective inhibition at surface of the 
earth" ;
               cin_sfc:standard_name = "-" ;
               cin_sfc:units = "J/kg" ;
               cin_sfc:GRIB_parameter_number = 156 ;
               cin_sfc:GRIB_level_flag = 1 ;
               cin_sfc:_FillValue = -9999.f ;
               cin_sfc:navigation = "nav" ;

        float  helc_lfhg(record,lfhg,y,x) ;
               helc_lfhg:long_name = "Storm relative helicity at layer between 
2 height levels above ground" ;
               helc_lfhg:standard_name = "-" ;
               helc_lfhg:units = "m2/s2" ;
               helc_lfhg:GRIB_parameter_number = 190 ;
               helc_lfhg:GRIB_level_flag = 106 ;
               helc_lfhg:_FillValue = -9999.f ;
               helc_lfhg:navigation = "nav" ;


// global attributes
               :history = "2003-03-28 11:00:39 - created by gribtocdl" ; 
               :title = " Early Terrain Analysis model 48km and 80km" ;
               :Conventions = "NUWG" ;
               :GRIB_reference = "Office Note 388 GRIB" ;
               :GRIB_URL = "http://www.nco.ncep.noaa.gov/pmb/docs/on388/"; ;
               :version = 0.0 ;

data:

 level = 1000.0, 950.0, 900.0, 850.0, 800.0, 750.0, 700.0, 650.0, 600.0, 550.0, 
      500.0, 450.0, 400.0, 350.0, 300.0, 250.0, 200.0, 150.0, 100.0 ;
 lpdg_bot = 0.0, 0.0, 30.0, 60.0, 90.0, 120.0 ;
 lpdg_top = 30.0, 180.0, 60.0, 90.0, 120.0, 150.0 ;
 fhg = 2.0, 10.0 ;
 lfhg_bot = 0.0 ;
 lfhg_top = 30.0 ;
 model_id = 84 ;
 valtime_offset = 6, 12, 18, 24, 30, 36, 42, 48, 54, 60 ;


 // Navigation
 nav_model = "GRIB1" ;
 grid_type_code = 3 ;
 grid_type = "Lambert conformal projection" ;
 grid_name = "grid 211: Regional CONUS" ;
 grid_center = 7 ;
 grid_number = 211 ;
 x_dim = "x" ;
 y_dim = "y" ;
 Nx = 93 ;
 Ny = 65 ;
 La1 = 12.190000 ;
 Lo1 = -133.459000 ;
 Lov = -95.000000 ;
 Dx = 81271.000000 ;
 Dy = 81271.000000 ;
 Latin1 = 25.000000 ;
 Latin2 = 25.000000 ;
 SpLat = 0.000000 ;
 SpLon = 0.000000 ;
 // Pole in proj. plane = North ;
 ProjFlag = 0 ;
 ResCompFlag = 8 ;

}