      PROGRAM GRDEMO
      IMPLICIT NONE
C     GRDEMO - Bemutat¢ program a GRIBEX haszn lat hoz

C     Kiolvassa a GRIB messageban t rolt adatokat, k‚perny‹re ¡ratja
C     szekci¢nk‚nt, a "hasznos adatokat" az output.dat f jlba ¡ratja ki

C     A WMO GRIB k¢dol si defin¡ci¢ alapj n mûk”dik
C     A WMO Publication No. 9, Volume B katal¢gust bl zatot haszn lja
C     a GRIB f jlban l‚v‹ adatok azonos¡t s ra


      INTEGER JPACK, JPBYTES
      PARAMETER (JPACK=280000)
      PARAMETER (JPBYTES=4)
C                        `---> A b jtok sz ma INTEGER

C     Skal r argumentek a GRIBEX h¡v shoz

      INTEGER KSEC0(2)
      INTEGER KSEC1(1024)
      INTEGER KSEC2(1024)
      INTEGER KSEC3(2)
      INTEGER KSEC4(512)

C     Val¢s argumentek a GRIBEX h¡v shoz

      REAL PSEC2(512)
      REAL PSEC3(2)
      REAL PSEC4(JPACK*5)

C     A GRIB produktumot t rol¢ vektor:

      INTEGER KGRIB
      DIMENSION KGRIB(JPACK)
C
      INTEGER FILE, JCOUNT, NUMERR, KLENG, LENOUT
      INTEGER KLENP, KRET, KWORD, LOOP
      OPEN (10,file='output.dat',form='formatted',access='sequential')

C     Bemen‹ GRIB file megnyit sa
C                         ----> <----
      CALL PBOPEN( FILE, 'output.grib', 'r', KRET)
      IF( KRET.NE.0 ) THEN
        WRITE (*, *) 'GRDEMO: Return code from PBOPEN = ',KRET
        CALL PBCLOSE(FILE, KRET)
        STOP 'Fault in PBOPEN'
      ENDIF

C     A GRIB f jlban lev‹ rekordok sz m t t rolja:

      NUMERR = 0
      JCOUNT = 0
C
   50 CONTINUE

C       A rekordsz m n”vel‚se:

        JCOUNT = JCOUNT + 1

C       A Grib-k¢dolt mez‹t a KGRIB-be olvassa

        KLENG = JPACK*JPBYTES
        CALL PBGRIB( FILE, KGRIB, KLENG, LENOUT, KRET )
        IF( KRET.LT.0 ) THEN
          IF( KRET.EQ.-1 ) THEN
            WRITE  (*, *) 'GRDEMO: End of file.'
            WRITE(*,*) 'GRDEMO: Number of products =',(JCOUNT-1)
            CALL PBCLOSE(FILE, KRET)
            WRITE (*,*) 'GRDEMO: Number of decoding errors = ',NUMERR
            STOP 'EOF'
          ELSE
            WRITE (*, *) 'GRDEMO: Return code from PBGRIB = ',KRET
            WRITE (*, *) 'GRDEMO: after ', JCOUNT,' products.'
            CALL PBCLOSE(FILE, KRET)
            STOP 'Fault in PBGRIB'
          ENDIF
        ENDIF
        WRITE (*, *) 'GRDEMO: Return length from PBGRIB = ',LENOUT

C       A 'GRIB messgage'-k kit”m”r¡t‚se (dek¢dol sa)

        KLENG = (LENOUT+JPBYTES-1)/JPBYTES
        KLENP = JPACK*5
        KRET = 1
        CALL GRIBEX(KSEC0,KSEC1,KSEC2,PSEC2,KSEC3,PSEC3,KSEC4,
     X                   PSEC4,KLENP,KGRIB,KLENG,KWORD,'D',KRET)

C       Ellen‹rz‚s a visszaadott k¢d alapj n

        WRITE (*,*) 'GRDEMO: GRIBEX return code = ',KRET
        IF( KRET.EQ.-6 ) WRITE (*,*) 'GRDEMO: Pseudo-grib data found.'
        IF( KRET.GT.0 ) THEN
          NUMERR = NUMERR + 1
          GOTO 50
        ENDIF

C       Ki¡ratja a 0, 1, 2 ‚s 3-ik (ha van) ‚s 4.-ik szekci¢t
C       Az els‹ szekci¢ a produktum defin¡ci¢s szekci¢ja
C       A m sodik a grid defin¡ci¢s szekci¢
C       A harmadik a bitmap szekci¢
C       A negyedik szekci¢ az adatok szekci¢ja

        CALL GRPRS0(KSEC0)
        CALL GRPRS1(KSEC0,KSEC1)

        IF( (KSEC1(5).EQ.0).OR.(KSEC1(5).EQ.64) ) THEN
          WRITE (*,*) 'GRDEMO: No section 2 in GRIB message.'
        ELSE
          CALL GRPRS2(KSEC0,KSEC2,PSEC2)
        ENDIF

        IF( (KSEC1(5).EQ.0).OR.(KSEC1(5).EQ.128) ) THEN
          WRITE (*,*) 'GRDEMO: No section 3 in GRIB message.'
        ELSE
          CALL GRPRS3(KSEC0,KSEC3,PSEC3)
        ENDIF

        CALL GRPRS4(KSEC0,KSEC4,PSEC4)

C       A GRIB adatokat ¡ratja ki f jlba

        WRITE(*,*) 'Data values for product ', JCOUNT
        DO LOOP = 1, KSEC4(1)
          WRITE(10,*) PSEC4(LOOP)
        ENDDO	

C       A k”vetkez‹ rekordra ugrik (ha van):

        GOTO 50
        close(10)        
        END
