1 SUBROUTINE decoga (PFDATA,KLENF,KBITS,KNBIT,KB1PAR, &
2 & KB2PAR,PVERT,KLENV,KGRIB,KLENG,KWORD, &
3 & KJLENV,KJLENF,KCPACK,KSCALP,KERR, &
218 INTEGER (KIND=JPLIKM) :: KLENF
219 INTEGER (KIND=JPLIKM) :: KBITS
220 INTEGER (KIND=JPLIKM) :: KNBIT
221 INTEGER (KIND=JPLIKM) :: KLENV
222 INTEGER (KIND=JPLIKM) :: KLENG
223 INTEGER (KIND=JPLIKM) :: KWORD
224 INTEGER (KIND=JPLIKM) :: KJLENV
225 INTEGER (KIND=JPLIKM) :: KJLENF
226 INTEGER (KIND=JPLIKM) :: KCPACK
227 INTEGER (KIND=JPLIKM) :: KSCALP
228 INTEGER (KIND=JPLIKM) :: KERR
230 INTEGER (KIND=JPLIKM) :: KB1PAR(19)
231 INTEGER (KIND=JPLIKM) :: KB2PAR(17)
232 INTEGER (KIND=JPLIKB) :: KGRIB(kleng)
234 REAL (KIND=JPDBLD) :: PMIN
235 REAL (KIND=JPDBLD) :: PMAX
237 REAL (KIND=JPDBLD) :: PFDATA(klenf)
238 REAL (KIND=JPDBLD) :: PVERT(klenv)
242 INTEGER (KIND=JPLIKM) :: IMAX, IOFF, IBYTE, INVAL, ISNEW
243 INTEGER (KIND=JPLIKM) :: J, ITEMP, INC, ILBLK
244 INTEGER (KIND=JPLIKM) :: ILNIL, IEXP, IMANT, ILEN
245 INTEGER (KIND=JPLIKM) :: IPW, IPB, ILBIN, IFLAG, IREP
246 INTEGER (KIND=JPLIKM) :: ISCALX, ISCALE, IMISS, ISPDA
247 INTEGER (KIND=JPLIKM) :: IPREMC, ISSUIV, IL, ILBVAL
248 INTEGER (KIND=JPLIKB) :: ILEXP, ILMANT, ILFLAG, ILSCALX, ILLNIL
249 INTEGER (KIND=JPLIKB) :: ILLBLK, ILLBIN, ILBITS, ILSPDA, ILSCALP
250 INTEGER (KIND=JPLIKB) :: ILCPACK
253 INTEGER (KIND=JPLIKM) :: IBLOCK(24), ILAT(2)
254 INTEGER (KIND=JPLIKB) :: ILBLOCK(24), ILB2PAR(17), ILLAT(2)
256 REAL (KIND=JPDBLD) :: ZSCALE
266 REAL(KIND=JPRB) :: ZHOOK_HANDLE
300 CALL gsbyte_mf (kgrib(1),ilblock(1),ioff,ibyte,0,inval,
301 'D',kleng,kerr,kword,.true.)
307 ELSEIF (iblock(1).NE.71.AND.iblock(2).NE.82.AND.
310 WRITE (unit=*,fmt=*)
'NO ''GRIB'' GROUP (BLOCK 0) FOUND' 332 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,ibyte,0,inval,
333 'D',kleng,kerr,kword,.true.)
343 IF (iblock(1).EQ.0.AND.iblock(2).EQ.0.AND.iblock(3).EQ.24
356 CALL gsbyte_mf (kgrib(kword),ilblock(5),ioff,ibyte,0,inval,
357 'D',kleng,kerr,kword,.true.)
368 kb1par(j) = iblock(j+4*isnew)
376 kb1par(18) = iblock(18+4*isnew) * 256 + iblock(19+4*isnew)
380 kb1par(19)=iblock(20+4*isnew)
390 itemp = 32 + (isnew*224)
392 IF( (kb1par(6).EQ. 20).OR.
407 kb1par(7) = kb1par(7) * itemp + kb1par(8)
425 IF (kb1par(17).EQ.10)
427 kb1par(15) = kb1par(15) * itemp + kb1par(16)
467 IF (kb1par(4).EQ.1.OR.kb1par(4).EQ.3) inc = 1
478 IF (kb1par(4).EQ.128.OR.kb1par(4).EQ.192) inc = 1
489 CALL gbyte_mf (kgrib(kword),illblk,ioff,24)
491 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
503 CALL gbyte_mf (kgrib(kword),illnil,ioff,8)
505 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
518 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
534 CALL gbyte_mf (kgrib(kword),ilb2par(1),ioff,8)
536 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
545 IF (kb2par(1).NE.0.AND.kb2par(1).NE.4.AND.kb2par(1).NE.50
548 WRITE (*,*)
'GRID DESCRIPTION BLOCK NOT YET DEFINED' 561 IF (kb2par(1).EQ.0.OR.kb2par(1).EQ.4)
566 CALL gsbyte_mf (kgrib(kword),ilb2par(2),ioff,16,0,2,
567 'D',kleng,kerr,kword,.true.)
576 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
577 'D',kleng,kerr,kword,.true.)
588 IF (ilat(j).LE.2**23)
THEN 589 kb2par(j+3) = ilat(j)
591 kb2par(j+3) = 2**23 - ilat(j)
599 CALL gbyte_mf (kgrib(kword),ilb2par(6),ioff,8)
601 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
610 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
611 'D',kleng,kerr,kword,.true.)
622 IF (ilat(j).LE.2**23)
THEN 623 kb2par(j+6) = ilat(j)
625 kb2par(j+6) = 2**23 - ilat(j)
632 CALL gsbyte_mf (kgrib(kword),ilb2par(9),ioff,16,0,2,
633 'D',kleng,kerr,kword,.true.)
642 CALL gbyte_mf (kgrib(kword),ilb2par(11),ioff,8)
644 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
652 CALL offset_mf (ioff,4,kword,8,knbit,kleng,kerr)
677 IF (kb2par(1).EQ.50.OR.kb2par(1).EQ.80)
682 CALL gsbyte_mf (kgrib(kword),ilb2par(2),ioff,16,0,
683 'D',kleng,kerr,kword,.true.)
692 CALL gsbyte_mf (kgrib(kword),ilb2par(5),ioff,8,0,2,
693 'D',kleng,kerr,kword,.true.)
702 CALL offset_mf (ioff,18,kword,8,knbit,kleng,kerr)
713 IF(kb2par(1).EQ.80)
THEN 717 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
718 'D',kleng,kerr,kword,.true.)
729 IF (ilat(j).LE.2**23)
THEN 730 kb2par(j+11) = ilat(j)
732 kb2par(j+11) = 2**23 - ilat(j)
739 CALL gbyte_mf (kgrib(kword),ilexp,ioff,8)
741 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
746 CALL gbyte_mf (kgrib(kword),ilmant,ioff,24)
748 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
754 CALL decfp_mf (kb2par(14),iexp,imant)
758 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
759 'D',kleng,kerr,kword,.true.)
770 IF (ilat(j).LE.2**23)
THEN 771 kb2par(j+14) = ilat(j)
773 kb2par(j+14) = 2**23 - ilat(j)
780 CALL gbyte_mf (kgrib(kword),ilexp,ioff,8)
782 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
787 CALL gbyte_mf (kgrib(kword),ilmant,ioff,24)
789 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
795 CALL decfp_mf (kb2par(17),iexp,imant)
807 IF(kb2par(1).EQ.80)
THEN 813 kjlenv = (ilblk - ilen) / 4
815 IF(klenv.LT.kjlenv)
THEN 817 WRITE (*,9001) kjlenv,klenv
818 9001
FORMAT (1h ,
'NUMBER OF VERTICAL COORDINATES - ',i4,
819 ', ARRAY SIZE IS - ',i4)
830 IF (kjlenv.NE.0)
THEN 833 CALL gbyte_mf (kgrib(kword),ilexp,ioff,8)
835 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
840 CALL gbyte_mf (kgrib(kword),ilmant,ioff,24)
842 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
892 IF (kb1par(4).EQ.2.OR.kb1par(4).EQ.3) inc = 1
903 IF (kb1par(4).EQ.64.OR.kb1par(4).EQ.192) inc = 1
908 WRITE (*,*)
'BIT MAP BLOCK NOT YET DEFINED' 937 WRITE (*,*)
'DECOGA : BLOCK FLAG ERROR.' 945 IF (kb1par(14).EQ.40)
949 WRITE (*,*)
'DECOGA : TIME UNIT ERROR.' 957 IF (kb2par(1).EQ.0.OR.kb2par(1).EQ.4)
966 WRITE (*,*)
'DECOGA : SCAN MODE FLAG ERROR.' 969 CALL dr_hook(
'DECOGA',1,zhook_handle)
979 WRITE (*,*)
'DECOGA : RESOLUTION FLAG ERROR.' 982 CALL dr_hook(
'DECOGA',1,zhook_handle)
1009 CALL gbyte_mf (kgrib(kword),illbin,ioff,24)
1011 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1024 CALL gbyte_mf (kgrib(kword),ilflag,ioff,8)
1026 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1040 ilnil = iflag - irep * 16
1050 ilnil = mod(iflag,16)
1065 CALL gbyte_mf (kgrib(kword),ilscalx,ioff,16)
1067 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1073 IF (iscalx.LE.2**15)
THEN 1076 iscale = 2**15 - iscalx
1087 CALL gbyte_mf (kgrib(kword),ilexp,ioff,8)
1089 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1094 CALL gbyte_mf (kgrib(kword),ilmant,ioff,24)
1096 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1106 IF (iscalx.EQ.65535.AND.iexp.EQ.255.AND.imant.EQ.16777215)
1115 CALL gbyte_mf (kgrib(kword),ilbits,ioff,8)
1117 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1126 IF (kbits.GT.knbit.OR.kbits.GT.imax)
1129 WRITE (*,9002) kbits,knbit,imax
1130 9002
FORMAT (1h ,
'NUMBER OF BITS PER DATA VALUE, ',i3,
1131 'EXCEEDS WORD LENGTH, ',i3,
' OR MAXIMUM ',
1132 ' PERMITTED VALUE, ',i3)
1135 ELSEIF (ldarpe)
THEN 1141 zscale= ( pmax - pmin ) /
REAL(2**kbits-1,kind=
jpdbld)
1143 ELSEIF (imiss.EQ.0)
THEN 1150 zscale = 2.0_jpdbld**iscale
1151 pmax=pmin+
REAL(2**(KBITS+1)-3,KIND=JPDBLD) * &
1152 & 2.0_JPDBLD ** (ISCALE-1)
1159 IF(iflag.GE.192)
THEN 1163 CALL gbyte_mf (kgrib(kword),ilspda,ioff,16)
1165 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1170 ipremc=1+(8*ispda-1)/knbit
1172 IF (ipremc.GT.klenf)
THEN 1174 WRITE (*,9004) klenf,ispda
1175 9004
FORMAT (
' OUTPUT ARRAY LENGTH (',i7,
1176 ' WORDS) TOO SHORT, START OCTET OF PACKED DATA =',
1183 CALL gbyte_mf (kgrib(kword),ilscalp,ioff,16)
1185 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1190 ELSEIF (kscalp.GT.2**15)
THEN 1197 CALL gbyte_mf (kgrib(kword),ilcpack,ioff,8)
1199 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1223 IF (imiss.EQ.1)
THEN 1226 pfdata(j)=0.0_jpdbld
1229 ELSEIF (ldarpe)
THEN 1235 CALL offset_mf (ioff,irep,kword,32,knbit,kleng,kerr)
1244 CALL gbyte_mf (kgrib(kword),ilexp,ioff,8)
1246 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1251 CALL gbyte_mf (kgrib(kword),ilmant,ioff,24)
1253 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1258 CALL decfp_mf (pfdata(j),iexp,imant)
1263 IF (iflag.GE.192)
THEN 1270 IF (issuiv.LT.ispda)
THEN 1271 CALL offset_mf (ioff,ispda-issuiv,kword,8,knbit,kleng,kerr)
1291 kjlenf = ilbin - 11 - irep * 4
1292 IF(iflag.GE.192) kjlenf=kjlenf-7-(ispda-issuiv)
1293 kjlenf = (kjlenf * 8 - ilnil) / kbits
1297 IF (kjlenf+irep.GT.klenf)
1300 WRITE (*,9003) kjlenf,klenf
1301 9003
FORMAT (1h ,
'NUMBER OF VALUES TO BE DECODED IS - ',i7,
1302 ', ARRAY SIZE - ',i7)
1306 IF (imiss.EQ.0.AND.zscale.GT.0.0_jpdbld)
THEN 1307 CALL gsbyte_mf (kgrib(kword),pfdata(irep+1),ioff,kbits,0,kjlenf,
1308 'D',kleng,kerr,kword,.true.)
1313 CALL unpagb (pfdata(irep+1),pfdata(irep+1),pmin,pmax,kbits,
1317 IF (zscale.LE.0.)
THEN 1319 DO 460 j= irep+1,irep+kjlenf
1325 DO 470 j= irep+1,irep+kjlenf
1326 pfdata(j) = 0.0_jpdbld
1331 CALL offset_mf (ioff,kjlenf,kword,kbits,knbit,kleng,kerr)
1341 kjlenf = irep + kjlenf
1350 il = (kword-ipw) * knbit + ioff -ipb
1354 CALL offset_mf (ioff,1,kword,il,knbit,kleng,kerr)
1375 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,ilbval,0,inval,
1376 'D',kleng,kerr,kword,.false.)
1386 IF (iblock(j).NE.55) kerr = 1
1389 IF (kerr.EQ.1)
WRITE (*,*)
' NO 7777 GROUP FOUND ' 1395 IF (imiss.EQ.1) kjlenf = - kjlenf
subroutine gbyte_mf(KSOURC, KDEST, KOFSET, KBYTSZ)
subroutine gsbyte_mf(KS, KD, KOFF, KSIZE, KSKBTW, K, KBPW,
integer, parameter jpdbld
subroutine decfp_mf(PFVAL, KEXP, KMANT)
subroutine decoga(PFDATA, KLENF, KBITS, KNBIT, KB1PAR,
subroutine offset_mf(KOFF, KVAL, KWORD, KBYTE, KNBIT, KLEN, KERR)
subroutine unpagb(KPDATA, PFDATA, PMIN, PMAX, KBITS, PSCALE,