This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
James, Attached is a patched decode_grib2.c for GEMPAK 5.11.4 to be placed in $NAWIPS/unidata/ldmbridge/dcgrib2/ to build after copying the file: cd $NAWIPS/unidata/ldmbridge/dcgrib2/ make all make install This update fixes a grib2->gempak grid decoding conflict assigning ensemble extensions to parameter names. Michael James Unidata Support Staff > Hi Michael, > > I haven't received any response in nearly a week. So, I'm resending an > email I sent out last Wednesday(in the event you've been so busy that my > original email got lost in the shuffle). > -------------------------------------------------------------------------- > > > Since I already missed the 12Z ensemble run, I ran dcgrib2 manually with > a random ensemble file(ftp-ed from NCEP server). As you suggested, I > included ENSEXT into the command: > > dcgrib2 -c 090819/1200 -v 2 -e ENSEXT=0 -e > gec00.t12z.pgrb2af30 > > When I run gdinfo, I see the following(just looking at 500 mb level but > similar for other levels): > > NUM TIME1 TIME2 LEVL1 LEVL2 VCORD PARM > 27 090819/1200F030 500 PRES HGHTC002 > 28 090819/1200F030 500 PRES TMPKC002 > 29 090819/1200F030 500 PRES RELHC002 > 30 090819/1200F030 500 PRES URELC002 > 31 090819/1200F030 500 PRES VRELC002 > > If I run ENSEXT=1, I see this: > > NUM TIME1 TIME2 LEVL1 LEVL2 VCORD PARM > 27 090819/1200F030 500 PRES > HGHTC002C002 > 28 090819/1200F030 500 PRES > TMPKC002C002 > 29 090819/1200F030 500 PRES > RELHC002C002 > 30 090819/1200F030 500 PRES > URELC002C002 > 31 090819/1200F030 500 PRES > VRELC002C002 > > I also ran it pointing to the 5.11.1 tables, but no change occurred. I > don't think the 5.11.4 tables are at fault. When I ran dcgrib2 from > 5.11.1, the parameter names didn't include the ensemble member name even > when pointing to the 5.11.4 tables(ENSEXT=1 will append ensemble name, > however). So, am I using the wrong syntax? Do you get the proper result > with your dcgrib2(5.11.4)? It's also my interpretation that grib2 data > will default with no extension name if ENSEXT is not set(which it isn't > in my pqact for this data...using template found in > $NAWIPS/ldm/etc/templates/pqact.gempak_decoders.in). > > On a happier note, the problem with gempak not recording the GVCORD name > "HYBL" was my fault for using an old Sun workstation(version 5.10.2 when > "HYBL" wasn't a vertical coordinate option). > > James > > ---------------------------------------------- > James Murakami > Staff Meteorologist/Student Affairs > Department of Atmospheric and Oceanic Sciences > University of California, Los Angeles > 405 Hilgard Ave. > Los Angeles, CA 90095-1565 > > > e-mail: address@hidden > telephone: 310-825-2418 > Fax: 310-206-5219 > ---------------------------------------------- > > > > Unidata GEMPAK Support wrote: > > Hi James, > > > > You're going to want to check that ENSEXT is not set to 1 in your > > pqact.gempak entries for ensemble grids. > > > > >From the dcgrib2 man page, > > > > http://www.unidata.ucar.edu/cgi-bin/gempak/manual/decoders_index?dcgrib2 > > > > ENSEXT : Environmental variable for adding ensemble extensions to parameter > > names > > If ENSEXT is not set, use of PDSEXT parameter name extensions > > defaults > > to yes for grib1 and no for grib2. If ENSEXT is set, and equal > > to 1, > > then the extension will be added to parameter names. If ENSEXT > > is > > set, and not equal to 1, the PDS extension will not be added to > > parameter > > names. > > > > > > That should do it, let me know if you have further questions. > > > > Michael James > > Unidata User Support > > > > > > > > > >> Hi, > >> > >> I installed the latest GEMPAK(5.11.4) last week, and I noticed some > >> problems. For this email, I'm addressing a problem with how dcgrib2 > >> decodes GFS ensemble and RUC data(via the CONDUIT feed). What I see is > >> dcgrib2 labeling ensemble parameters with the run variation name. > >> That is, if one looks at temperature data, dcgrib2 produces labels of > >> TMPKP001, TMPKP002, ...TMPKP20(TMPKC002 for the control run) for any > >> given level. The prior version(5.11.1) just used the label, TMPK > >> regardless of ensemble member(this is the preferred labeling). Also, for > >> RUC data, there is no VCORD name given for ones that should be labeled > >> "HYBL"(using gdinfo program to view all this). Again, the previous > >> version did not omit this. > >> > >> Since I didn't see any mention of the above in the support email > >> archive, I'm assuming that my GEMPAK didn't compile quite > >> right(functional but with flaws). It was installed on a computer with > >> OS Mandriva 2008(a derivative of Redhat, I'm told). I've attached the > >> make.out using g77(got a similar result compiling with gfortran). I > >> compressed the file as it's rather large(2 megabytes). There were no > >> "fatal" errors, but many warnings show up. However, I should tell you > >> that for the previous version, a lot of similar warning messages > >> occurred too. 5.11.1 continues to be our operational version for > >> now(I've not encountered any relevant problems with usage). > >> > >> I'd appreciate your input on what I can do to correct some of these > >> warning statements(if they are relevant for a correctly functional > >> GEMPAK package). It's possible that another problem related to how NMAP2 > >> works might then be corrected(then, I won't need to send a separate > >> email for this problem). > >> > >> James > >> > >> -- > >> ---------------------------------------------- > >> James Murakami > >> Staff Meteorologist/Student Affairs > >> Department of Atmospheric and Oceanic Sciences > >> University of California, Los Angeles > >> 405 Hilgard Ave. > >> Los Angeles, CA 90095-1565 > >> > >> > >> e-mail: address@hidden > >> telephone: 310-825-2418 > >> Fax: 310-206-5219 > >> ---------------------------------------------- > >> > >> > >> > >> > >> > > > > > > Ticket Details > > =================== > > Ticket ID: SKK-738821 > > Department: Support GEMPAK > > Priority: Normal > > Status: Open > > > > > > > > Ticket Details =================== Ticket ID: SKK-738821 Department: Support GEMPAK Priority: Normal Status: Open
#include "gb2def.h"
#include "dccmn.h" /* for ivrblv global variable */
#include "gbcmn.h" /* for gds global variable */
#include "dcgrib.h"
extern int ensext;
extern int pkmeth; /* pkmeth = MDGRB2 defaults to GRIB2 storage, MDGDEC uses
old method */
void
decode_grib2 (unsigned char *cgrib, int lenbul,
char *gemfil, char *filnam, int maxgrd)
/************************************************************************
* void decode_grib2 ( cgrib, lenbul, gemfil, filnam, naxgrd) *
* unsigned char *cgrib Input grib product *
* int lenbul length of input product *
* char *gemfil User specified output file name *
* char *filnam final output filename *
* int maxgrd Maximum number of grids in new file *
* *
* Error Codes *
* Log: *
* Chiz/Unidata 12/03 Created *
* James/Unidata 9/09 Accounted for prmext *
*************************************************************************/
{
int numgrds = maxgrd;
int i, n, ilen1, ilen2, prmext, ier, iret;
int iflno;
g2int unpack = 0, expand = 0;
g2int listsec0[3], listsec1[13], numlocal;
Gribmsg curr_g2;
Geminfo curr_gem;
char vcoord[20], errstr[133], gdattm[2][DTTMSZ], extstr[20];
int ighdr[LLGDHD];
int gdflag = 255, iprec;
static int tblinit = 0;
static char errgrp[] = "DECODE_GRIB2";
static int replace = 1;
static char g2tables[5][LLMXLN] = { 0 }, *tbllist[5];
curr_g2.cgrib2 = cgrib;
curr_g2.mlength = lenbul;
curr_g2.gfld = NULL;
curr_g2.field_tot = 0;
if (!tblinit)
{
for (i = 0; i < 5; i++)
tbllist[i] = g2tables[i];
tblinit = !0;
}
if ((ier =
g2_info (curr_g2.cgrib2, listsec0, listsec1, &(curr_g2.field_tot),
&numlocal)) != 0)
{
dc_wclg (0, errgrp, ier, "g2_info failed", &iret);
return;
}
for (n = 0; n < curr_g2.field_tot; n++)
{
ier = g2_getfld (curr_g2.cgrib2, n + 1, unpack, expand, &curr_g2.gfld);
/* initialize strings in geminfo structure */
memset ( curr_gem.cproj, 0, sizeof(curr_gem.cproj));
memset ( curr_gem.parm, 0, sizeof(curr_gem.parm));
memset ( curr_gem.gdattm1, 0, sizeof(curr_gem.gdattm1));
memset ( curr_gem.gdattm2, 0, sizeof(curr_gem.gdattm2));
gb2_2gem (&curr_g2, &curr_gem, tbllist, ensext, &ier);
/* make sure the times are null terminated, since the routine above
strncpy's 1 more character than the fortran routine provides */
curr_gem.gdattm1[DTTMSZ-1] = '\0';
curr_gem.gdattm2[DTTMSZ-1] = '\0';
if (ivrblv >= 4)
gb2_diag (curr_g2.gfld, gdflag);
/* TODO: Convert these to GEMPAK weather codes and store as grid data */
if (ivrblv >= 3)
{
if ( ( numlocal > 0 ) && ( curr_g2.gfld->locallen > 0 ) && (
curr_g2.gfld->local != NULL ) )
{
int i2vers = (int)curr_g2.gfld->local[0];
int i2grp = gb_btoi ( curr_g2.gfld->local,1,2,0);
int i2val = gb_btoi ( curr_g2.gfld->local,3,4,0);
int i2ref = gb_btoi ( curr_g2.gfld->local,7,4,0);
int i2scale = gb_btoi ( curr_g2.gfld->local,11,2,0);
int i2bits = (int)curr_g2.gfld->local[13];
int i2type = (int)curr_g2.gfld->local[14];
g2int *i2out;
printf("Local Section2 used [length= %d]\n",curr_g2.gfld->locallen);
printf("check curr_g2.gfld->idsect[3] %d\n",curr_g2.gfld->idsect[3]);
printf("check type %d\n",i2type);
printf("section2 local %d %d %d\n",i2vers,i2grp,i2val);
if(i2type == 1)
{ /* simple packing using integers */
i2out = (g2int *)malloc(i2val*(sizeof(int)));
gbits ( curr_g2.gfld->local, i2out, (g2int)(15*8), (g2int)i2bits,
(g2int)0, (g2int)i2val);
for(i=0;i<i2val;i++)
{
if ( i2out[i] == 0 )
printf("\n");
else
printf("%c",i2out[i]);
}
printf("\n");
free(i2out);
}
}
}
if (ier != 0)
{
sprintf (errstr, "Could not determine parameter name %d %d %d %d
[%d]\0",
curr_g2.gfld->discipline, curr_g2.gfld->ipdtmpl[0],
curr_g2.gfld->ipdtmpl[1],curr_g2.gfld->ipdtnum,
curr_gem.vcord);
dc_wclg (0, errgrp, ier, errstr, &iret);
g2_free (curr_g2.gfld);
curr_g2.gfld = NULL;
continue;
}
if (curr_g2.gfld->griddef == 0) /* note... the center defined grid
number is not provided */
pds.grid_id = decode_g2gnum (curr_g2.gfld);
else
pds.grid_id = curr_g2.gfld->griddef;
pds.center = curr_g2.gfld->idsect[0];
pds.izero = curr_g2.gfld->idsect[1];
pds.process = curr_g2.gfld->ipdtmpl[4];
gds.kx = curr_g2.kx;
gds.ky = curr_g2.ky;
cst_rmbl ( curr_gem.gdattm1, gdattm[0], &i, &iret );
cst_rmbl ( curr_gem.gdattm2, gdattm[1], &i, &iret );
dcflnam2 (gemfil, filnam, &numgrds, curr_g2.gfld, gdattm[0], gdattm[1],
&ier);
if (ier == 0)
{
memset (ighdr, 0, sizeof (ighdr));
dcogfil2 (filnam, &iflno, numgrds, curr_gem);
if ( pkmeth == MDGRB2 )
{
gb2_wgem(curr_g2, curr_gem, n + 1, iflno, replace,
ighdr, &ier);
/* method for storing necessary portion of GRIB2 product (Chiz)
* sections 3,4,5,6,7. Write template arrays for sect 3,4.
* Determine location to start of section 5, and length through
section 7.
* Write length of data to GEMPAK grid file.
* Can be read through g2_unpack#.c routines.
*/
}
else
{
if (FGSIZ < (curr_g2.kx * curr_g2.ky))
{
FGRID =
(float *) realloc (FGRID,
(curr_g2.kx * curr_g2.ky) *
sizeof (float));
if ( FGRID == NULL ) {
sprintf (errstr, "Reallocating grid for %d points [nx %d ny %d]
failed\0",
curr_g2.kx * curr_g2.ky, curr_g2.kx, curr_g2.ky);
dc_wclg (3, errgrp, 0, errstr, &iret);
g2_free (curr_g2.gfld);
curr_g2.gfld = NULL;
FGSIZ = 0;
return;
}
FGSIZ = curr_g2.kx * curr_g2.ky;
}
/*
* Unpack GRIB2 grid
*/
gb2_grid (&curr_g2, curr_gem.iuscal, curr_gem.rmsval,
&iprec, FGRID, &iret);
/* Check JPEG & PNG missing values -- not needed currently --
if ((curr_g2.gfld->idrtnum == 40000)
|| (curr_g2.gfld->idrtnum == 40)
|| (curr_g2.gfld->idrtnum == 41)
|| (curr_g2.gfld->idrtnum == 40010))
dcmisjpg (curr_g2, FGRID);*/
/*
* write grid out to gempak file.
*/
/*gd_wpgd (&iflno, FGRID, &curr_g2.kx, &curr_g2.ky, ighdr,
(char *)gdattm, curr_gem.level,
&curr_gem.vcord, curr_gem.parm, &replace,
&pkmeth, &iprec, &ier, DTTMSZ, 12);*/
cgd_wpgd (&iflno, FGRID, &curr_g2.kx, &curr_g2.ky, ighdr,
curr_gem.gdattm1, curr_gem.gdattm2,
&curr_gem.level[0], &curr_gem.level[1],
&curr_gem.vcord, curr_gem.parm, &replace,
&pkmeth, &iprec, &ier );
}
lv_ccrd (&curr_gem.vcord, vcoord, &iret, sizeof (vcoord) - 1);
vcoord[sizeof (vcoord) - 1] = '\0';
cst_rmbl ( vcoord, vcoord, &i, &iret );
curr_gem.parm[sizeof(curr_gem.parm)-1] = '\0';
cst_rmbl( curr_gem.parm, curr_gem.parm, &i, &iret);
sprintf (errstr, "%s [%s] %d:%d %s %d %d\0", curr_gem.parm,
gdattm[0], curr_gem.level[0], curr_gem.level[1],
vcoord, curr_g2.kx, curr_g2.ky);
if (ier != 0)
dc_wclg (0, errgrp, ier, errstr, &iret);
else
dc_wclg (1, errgrp, ier, errstr, &iret);
}
else
{
sprintf (errstr, "decode_g2gds failed\0");
dc_wclg (0, errgrp, ier, errstr, &iret);
}
g2_free (curr_g2.gfld);
curr_g2.gfld = NULL;
}
if (ivrblv >= 2)
{
sprintf (errstr, "numfields %d numlocal %d\0", curr_g2.field_tot,
numlocal);
dc_wclg (2, errgrp, ier, errstr, &iret);
}
}