170 lines
5.9 KiB
C
170 lines
5.9 KiB
C
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <memory.h>
|
||
|
#include <string.h>
|
||
|
#include "grib2.h"
|
||
|
|
||
|
g2int simunpack(unsigned char *,g2int *, g2int,g2float *);
|
||
|
int comunpack(unsigned char *,g2int,g2int,g2int *,g2int,g2float *);
|
||
|
g2int specunpack(unsigned char *,g2int *,g2int,g2int,g2int, g2int, g2float *);
|
||
|
#ifdef USE_PNG
|
||
|
g2int pngunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
|
||
|
#endif /* USE_PNG */
|
||
|
#ifdef USE_JPEG2000
|
||
|
g2int jpcunpack(unsigned char *,g2int,g2int *,g2int, g2float *);
|
||
|
#endif /* USE_JPEG2000 */
|
||
|
|
||
|
g2int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,g2int *igdstmpl,
|
||
|
g2int idrsnum,g2int *idrstmpl,g2int ndpts,g2float **fld)
|
||
|
//$$$ SUBPROGRAM DOCUMENTATION BLOCK
|
||
|
// . . . .
|
||
|
// SUBPROGRAM: g2_unpack7
|
||
|
// PRGMMR: Gilbert ORG: W/NP11 DATE: 2002-10-31
|
||
|
//
|
||
|
// ABSTRACT: This subroutine unpacks Section 7 (Data Section)
|
||
|
// as defined in GRIB Edition 2.
|
||
|
//
|
||
|
// PROGRAM HISTORY LOG:
|
||
|
// 2002-10-31 Gilbert
|
||
|
// 2002-12-20 Gilbert - Added GDT info to arguments
|
||
|
// and added 5.51 processing.
|
||
|
// 2003-08-29 Gilbert - Added support for new templates using
|
||
|
// PNG and JPEG2000 algorithms/templates.
|
||
|
// 2004-11-29 Gilbert - JPEG2000 now allowed to use WMO Template no. 5.40
|
||
|
// PNG now allowed to use WMO Template no. 5.41
|
||
|
// 2004-12-16 Taylor - Added check on comunpack return code.
|
||
|
// 2008-12-23 Wesley - Initialize Number of data points unpacked
|
||
|
// 2014-07-29 vkorolev - Added processing Template no. 5.4
|
||
|
//
|
||
|
// USAGE: int g2_unpack7(unsigned char *cgrib,g2int *iofst,g2int igdsnum,
|
||
|
// g2int *igdstmpl, g2int idrsnum,
|
||
|
// g2int *idrstmpl, g2int ndpts,g2float **fld)
|
||
|
// INPUT ARGUMENTS:
|
||
|
// cgrib - char array containing Section 7 of the GRIB2 message
|
||
|
// iofst - Bit offset of the beginning of Section 7 in cgrib.
|
||
|
// igdsnum - Grid Definition Template Number ( see Code Table 3.0)
|
||
|
// ( Only used for DRS Template 5.51 )
|
||
|
// igdstmpl - Pointer to an integer array containing the data values for
|
||
|
// the specified Grid Definition
|
||
|
// Template ( N=igdsnum ). Each element of this integer
|
||
|
// array contains an entry (in the order specified) of Grid
|
||
|
// Definition Template 3.N
|
||
|
// ( Only used for DRS Template 5.51 )
|
||
|
// idrsnum - Data Representation Template Number ( see Code Table 5.0)
|
||
|
// idrstmpl - Pointer to an integer array containing the data values for
|
||
|
// the specified Data Representation
|
||
|
// Template ( N=idrsnum ). Each element of this integer
|
||
|
// array contains an entry (in the order specified) of Data
|
||
|
// Representation Template 5.N
|
||
|
// ndpts - Number of data points unpacked and returned.
|
||
|
//
|
||
|
// OUTPUT ARGUMENTS:
|
||
|
// iofst - Bit offset at the end of Section 7, returned.
|
||
|
// fld - Pointer to a float array containing the unpacked data field.
|
||
|
//
|
||
|
// RETURN VALUES:
|
||
|
// ierr - Error return code.
|
||
|
// 0 = no error
|
||
|
// 2 = Not section 7
|
||
|
// 4 = Unrecognized Data Representation Template
|
||
|
// 5 = need one of GDT 3.50 through 3.53 to decode DRT 5.51
|
||
|
// 6 = memory allocation error
|
||
|
// 7 = corrupt section 7.
|
||
|
//
|
||
|
// REMARKS: None
|
||
|
//
|
||
|
// ATTRIBUTES:
|
||
|
// LANGUAGE: C
|
||
|
// MACHINE:
|
||
|
//
|
||
|
//$$$//
|
||
|
{
|
||
|
g2int ierr,isecnum;
|
||
|
g2int ipos,lensec;
|
||
|
g2float *lfld;
|
||
|
g2int *ifld;
|
||
|
|
||
|
|
||
|
|
||
|
ierr=0;
|
||
|
*fld=0; //NULL
|
||
|
|
||
|
gbit(cgrib,&lensec,*iofst,32); // Get Length of Section
|
||
|
*iofst=*iofst+32;
|
||
|
gbit(cgrib,&isecnum,*iofst,8); // Get Section Number
|
||
|
*iofst=*iofst+8;
|
||
|
|
||
|
if ( isecnum != 7 ) {
|
||
|
ierr=2;
|
||
|
//fprintf(stderr,"g2_unpack7: Not Section 7 data.\n");
|
||
|
return(ierr);
|
||
|
}
|
||
|
|
||
|
ipos=(*iofst/8);
|
||
|
lfld=(g2float *)calloc(ndpts ? ndpts : 1,sizeof(g2float));
|
||
|
|
||
|
if (lfld == 0) {
|
||
|
ierr=6;
|
||
|
return(ierr);
|
||
|
}
|
||
|
else {
|
||
|
*fld=lfld;
|
||
|
}
|
||
|
|
||
|
if (idrsnum == 0)
|
||
|
simunpack(cgrib+ipos,idrstmpl,ndpts,lfld);
|
||
|
else if (idrsnum == 2 || idrsnum == 3) {
|
||
|
if (comunpack(cgrib+ipos,lensec,idrsnum,idrstmpl,ndpts,lfld) != 0) {
|
||
|
return 7;
|
||
|
}
|
||
|
}
|
||
|
else if(idrsnum == 4) {
|
||
|
ifld=(g2int *)calloc(ndpts ? ndpts : 1, sizeof(g2int));
|
||
|
if(ifld != 0){
|
||
|
gbits(cgrib+ipos,ifld,0,32,0,ndpts);
|
||
|
rdieee(ifld,*fld,ndpts);
|
||
|
free(ifld);
|
||
|
}
|
||
|
else {
|
||
|
ierr=6;
|
||
|
return(ierr);
|
||
|
}
|
||
|
}
|
||
|
else if (idrsnum == 50) { // Spectral Simple
|
||
|
simunpack(cgrib+ipos,idrstmpl,ndpts-1,lfld+1);
|
||
|
rdieee(idrstmpl+4,lfld+0,1);
|
||
|
}
|
||
|
else if (idrsnum == 51) // Spectral complex
|
||
|
if ( igdsnum>=50 && igdsnum <=53 )
|
||
|
specunpack(cgrib+ipos,idrstmpl,ndpts,igdstmpl[0],igdstmpl[2],igdstmpl[2],lfld);
|
||
|
else {
|
||
|
fprintf(stderr,"g2_unpack7: Cannot use GDT 3.%d to unpack Data Section 5.51.\n",(int)igdsnum);
|
||
|
ierr=5;
|
||
|
if ( lfld != 0 ) free(lfld);
|
||
|
*fld=0; //NULL
|
||
|
return(ierr);
|
||
|
}
|
||
|
#ifdef USE_JPEG2000
|
||
|
else if (idrsnum == 40 || idrsnum == 40000) {
|
||
|
jpcunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
|
||
|
}
|
||
|
#endif /* USE_JPEG2000 */
|
||
|
#ifdef USE_PNG
|
||
|
else if (idrsnum == 41 || idrsnum == 40010) {
|
||
|
pngunpack(cgrib+ipos,lensec-5,idrstmpl,ndpts,lfld);
|
||
|
}
|
||
|
#endif /* USE_PNG */
|
||
|
else {
|
||
|
fprintf(stderr,"g2_unpack7: Data Representation Template 5.%d not yet implemented.\n",(int)idrsnum);
|
||
|
ierr=4;
|
||
|
if ( lfld != 0 ) free(lfld);
|
||
|
*fld=0; //NULL
|
||
|
return(ierr);
|
||
|
}
|
||
|
|
||
|
*iofst=*iofst+(8*lensec);
|
||
|
|
||
|
return(ierr); // End of Section 7 processing
|
||
|
|
||
|
}
|