[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 20040126:bug in gribtonc
- Subject: Re: 20040126:bug in gribtonc
- Date: Mon, 26 Jan 2004 10:24:43 -0700 (MST)
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> <FONT SIZE=3D2 =
> FACE=3D"Courier New">/* get dimension and value of valtime_offset =
> */</FONT>
> <BR> <FONT SIZE=3D2 =
> FACE=3D"Courier New">dimvaloffsetsid =3D nuwg_getdim(ncid, =
> DIM_VALOFFSETS );</FONT>
> <BR> <FONT SIZE=3D2 =
> FACE=3D"Courier New">if (ncdiminq(ncid, dimvaloffsetsid, (char *)0, =
> &dimvaloffsets) =3D=3D -1) {</FONT>
> <BR> <FONT SIZE=3D2 =
> FACE=3D"Courier New"> uerror("%s: can't get =
> dimvaloffsets", nc->ncname);</FONT>
> <BR> <FONT SIZE=3D2 =
> FACE=3D"Courier New"> nerrs++;</FONT>
> <BR> <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"> =
> DIM_VALOFFSETS, =
> /* number of offsets times =
> in this model */</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier New"> =
> VAR_VALOFFSET, =
> /* valid time offset for =
> humans */</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Arial">And nuwg.c contains a function =
> nuwg_name(...) which returns "valtime_offset" 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 "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?</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"> int =
> valoffsets_dim_count;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> int =
> valoffsets_dims[MAX_VAR_DIMS];</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Courier =
> New"> // Get the dimensions =
> of the VALOFFSET variable</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> int status =3D =
> ncvarinq(ncid,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; nuwg_getvar(ncid, =
> VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; (char *)0,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; (nc_type *)0,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; &valoffsets_dim_count,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; valoffsets_dims,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; &=
> nbsp; (int *)0);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> if (status =3D=3D =
> -1)</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> {</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> uerror("%s: can't get dimensions of variable '%s' (status: =
> %d)",</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; nc->ncname,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; =
> nuwg_name(VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; status);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> nerrs++;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> return -1;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> }</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> else if =
> (valoffsets_dim_count > 1)</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> {</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> uerror("%s: variable '%s' has %d dimensions but 1 is =
> expected",</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; nc->ncname,</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; =
> nuwg_name(VAR_VALOFFSET),</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> &=
> nbsp; valoffsets_dim_count);</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> nerrs++;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> =
> return -1;</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> }</FONT>
> </P>
>
> <P><FONT SIZE=3D2 FACE=3D"Courier =
> New"> // Get the size of the =
> VALOFFSET variable</FONT>
> <BR><FONT SIZE=3D2 FACE=3D"Courier =
> New"> 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 ;
}