1 SUBROUTINE codega (PFDATA,KLENF,KBITS,KNBIT,KB1PAR, &
2 & KB2PAR,PVERT,KLENV,KGRIB,KLENG,KWORD, &
3 & KROUND,KCPACK,KSCALP,KERR,PMIN,PMAX,LDARPE)
197 INTEGER (KIND=JPLIKM) :: KLENF
198 INTEGER (KIND=JPLIKM) :: KBITS
199 INTEGER (KIND=JPLIKM) :: KNBIT
200 INTEGER (KIND=JPLIKM) :: KLENG
201 INTEGER (KIND=JPLIKM) :: KWORD
202 INTEGER (KIND=JPLIKM) :: KROUND
203 INTEGER (KIND=JPLIKM) :: KCPACK
204 INTEGER (KIND=JPLIKM) :: KSCALP
205 INTEGER (KIND=JPLIKM) :: KERR
206 INTEGER (KIND=JPLIKM) :: KLENV
208 REAL (KIND=JPDBLD) :: PFDATA(*)
209 REAL (KIND=JPDBLD) :: PVERT(klenv)
211 REAL (KIND=JPDBLD) :: PMIN
212 REAL (KIND=JPDBLD) :: PMAX
216 INTEGER (KIND=JPLIKB) :: KGRIB(kleng)
217 INTEGER (KIND=JPLIKM) :: KB1PAR(19)
218 INTEGER (KIND=JPLIKM) :: KB2PAR(17)
220 INTEGER (KIND=JPLIKM) :: IMAX, ILENF, IMISS
221 INTEGER (KIND=JPLIKM) :: J, IBYTE, INVAL, IOFF, ITEMP, IERR
222 INTEGER (KIND=JPLIKM) :: IERY, IERD, IERM, IERH, IERN
223 INTEGER (KIND=JPLIKM) :: I, IEXP, IMANT, IPW, IPB
224 INTEGER (KIND=JPLIKM) :: IREP, IFLAG, ICPACK, ILEN
225 INTEGER (KIND=JPLIKM) :: ISCALE, ISCALX, ISTPA, IRESTE
226 INTEGER (KIND=JPLIKM) :: ISCALP, IAUXIL, ILENFM, ILBIN
227 INTEGER (KIND=JPLIKM) :: IL, ILNIL, IBITS, INUMBI
228 INTEGER (KIND=JPLIKB) :: IL8, ILEXP, ILMANT, ILFLAG, ILSCALX
229 INTEGER (KIND=JPLIKB) :: ILAUXIL, ILLBIN, ILBITS, ILSTPA, ILSCALP
231 INTEGER (KIND=JPLIKM) :: IBLOCK(24)
232 INTEGER (KIND=JPLIKM) :: ILAT(2)
233 INTEGER (KIND=JPLIKB) :: ILBLOCK(24), ILB2PAR(17), ILLAT(2)
235 REAL (KIND=JPDBLD) :: ZCOEFF, ZEPSIL, ZAUXIL, ZSCALE, ZS, ZREFER
236 REAL (KIND=JPDBLD) :: ZAUXI2
245 REAL(KIND=JPRB) :: ZHOOK_HANDLE
267 IF (pfdata(j).NE.0.0_jpdbld)
THEN 270 9012
FORMAT (tr1,
'NON-ZERO VALUE IN MISSING DATA',
292 IF (kbits.GT.knbit.OR.kbits.GT.imax)
295 WRITE (*,9000) kbits,knbit,imax
296 9000
FORMAT (tr1,
'NUMBER OF BITS PER DATA VALUE, ',i3,
297 'EXCEEDS WORD LENGTH, ',i3,
' OR MAXIMUM ',
298 ' PERMITTED VALUE, ',i3)
339 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,ibyte,0,inval,
340 'C',kleng,kerr,kword,.true.)
386 iblock(5) = kb1par(1)
387 IF (kb1par(1).LT.1.OR.kb1par(1).GT.98)
390 WRITE (*,9001) kb1par(1)
391 9001
FORMAT (tr1,
'INVALID ORIGINATING CENTRE ',i3)
406 iblock(6) = kb1par(2)
407 IF (kb1par(2).LT.1.OR.kb1par(2).GT.255)
410 WRITE (*,9002) kb1par(2)
411 9002
FORMAT (tr1,
'INVALID MODEL IDENTIFICATION ',i4)
427 iblock(7) = kb1par(3)
428 IF (kb1par(3).LT.1.OR.kb1par(3).GT.255)
431 WRITE (*,9003) kb1par(3)
432 9003
FORMAT (tr1,
'INVALID GRID IDENTIFICATION ',i4)
455 iblock(8) = kb1par(4)
459 itemp = kb1par(4) / 64
461 IF (itemp.LT.0.OR.itemp.GT.3) kerr = 4
465 IF (kb1par(3).EQ.255.AND.kb1par(4).EQ.0) kerr = 4
466 IF (kb1par(3).EQ.255.AND.kb1par(4).EQ.64) kerr = 4
471 9004
FORMAT (tr1,
'INVALID BLOCK INDICATOR FLAG ',i8.8)
483 iblock(9) = kb1par(5)
484 IF (kb1par(5).LT.0.OR.kb1par(5).GT.255)
487 WRITE (*,9005) kb1par(5)
488 9005
FORMAT (tr1,
'INVALID PARAMETER ',i4)
500 iblock(10) = kb1par(6)
505 IF (kb1par(6).LT.0.OR.kb1par(6).GT.210) kerr = 6
508 WRITE (*,9006) kb1par(6)
509 9006
FORMAT (tr1,
'INVALID LEVEL TYPE ',i4)
539 IF (kb1par(6).LT.100.OR.kb1par(6).EQ.102)
545 iblock(11) = kb1par(7)
546 iblock(12) = kb1par(8)
551 IF( (kb1par(6).NE. 20).AND.
566 IF (kb1par(7).GT.255.OR.kb1par(8).GT.255) kerr = 7
572 iblock(12) = iblock(11)
573 iblock(11) = iblock(11) / 256
574 iblock(12) = iblock(12) - iblock(11) * 256
578 IF (kb1par(7).GT.65535) kerr = 7
583 WRITE (*,9007) kb1par(7),kb1par(8)
584 9007
FORMAT (tr1,
'LEVEL DESCRIPTION ERROR ',i8,3x,i8)
614 iblock(13) = kb1par(9)
616 IF (kb1par(9).LT.0.OR.kb1par(9).GT.99) iery = 1
617 IF (kb1par(9).EQ.255) iery = 0
618 iblock(14) = kb1par(10)
620 IF (kb1par(10).LT.1.OR.kb1par(10).GT.12) ierm = 1
621 IF (kb1par(10).EQ.255) ierm = 0
622 iblock(15) = kb1par(11)
624 IF (kb1par(11).LT.1.OR.kb1par(11).GT.31) ierd = 1
625 IF (kb1par(11).EQ.255) ierd = 0
626 iblock(16) = kb1par(12)
628 IF (kb1par(12).LT.0.OR.kb1par(12).GT.23) ierh = 1
629 IF (kb1par(12).EQ.255) ierh = 0
630 iblock(17) = kb1par(13)
632 IF (kb1par(13).LT.0.OR.kb1par(13).GT.59) iern = 1
633 IF (kb1par(13).EQ.255) iern = 0
635 kerr = iery + ierm + ierd + ierh + iern
640 WRITE (*,9008) kb1par(9),kb1par(10),kb1par(11),kb1par(12),
642 FORMAT (tr1,
'INVALID DATE/TIME ',3i2,
' / ',2i2)
676 iblock(18) = kb1par(14)
677 IF (kb1par(14).LT.0.OR.kb1par(14).GT.7) kerr = 9
681 IF (kb1par(14).EQ.254) kerr = 0
686 IF (kb1par(17).EQ.0.OR.kb1par(17).EQ.1
691 IF (kb1par(15).GT.65535.OR.kb1par(15).LT.0) kerr = 9
692 IF (kb1par(15).GT.255.AND.kb1par(17).NE.10) kerr = 9
693 IF (kb1par(16).GT.255.OR.kb1par(16).LT.0) kerr = 9
694 IF (kb1par(17).LT.0.OR.kb1par(17).GT.10) kerr = 9
697 WRITE (*,9009) kb1par(14),kb1par(15),kb1par(16),kb1par(17)
698 9009
FORMAT (tr1,
'TIME UNIT/TIME 1/TIME 2/INDICATOR ERROR - ',
699 '/',i8,2x,
'/',i8,2x,
'/',i8)
704 iblock(19) = kb1par(15)
705 iblock(20) = kb1par(16)
709 IF (kb1par(17).EQ.10)
714 iblock(20) = iblock(19)
715 iblock(19) = iblock(19) / 256
716 iblock(20) = iblock(20) - iblock(19) * 256
721 iblock(21) = kb1par(17)
739 IF (kb1par(17).EQ.3.AND.kb1par(18).EQ.0)
742 WRITE (*,9013) kb1par(17),kb1par(18)
743 9013
FORMAT (tr1,
'INDICATOR/NUMBER AVERAGED ERROR - ',
751 iblock(22) = kb1par(18)
756 iblock(23) = iblock(22)
757 iblock(22) = iblock(22) / 256
758 iblock(23) = iblock(23) - iblock(22) * 256
769 iblock(24) = kb1par(19)
787 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,ibyte,0,inval,
788 'C',kleng,kerr,kword,.true.)
831 IF (kb1par(4).LT.128)
GOTO 333
850 IF (kb1par(4).EQ.128.OR.kb1par(4).EQ.192)
852 IF (kb2par(1).NE.0.AND.kb2par(1).NE.4.AND.kb2par(1).NE.50
855 WRITE (*,*)
'GRID DESCRIPTION BLOCK NOT YET DEFINED' 872 IF(kb2par(1).EQ.80)
THEN 877 IF (kb1par(6).GT.108) i = i + klenv * 4
880 CALL sbyte_mf (kgrib(kword),il8,ioff,24)
881 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
896 CALL sbyte_mf (kgrib(kword),ilblock(1),ioff,8)
897 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
912 CALL sbyte_mf (kgrib(kword),ilblock(1),ioff,8)
913 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
929 CALL sbyte_mf (kgrib(kword),ilb2par(1),ioff,8)
930 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
957 IF (kb2par(1).EQ.0.OR.kb2par(1).EQ.4)
963 CALL gsbyte_mf (kgrib(kword),ilb2par(2),ioff,16,0,2,
964 'C',kleng,kerr,kword,.true.)
975 IF (kb2par(j+3).GE.0)
THEN 976 ilat(j) = kb2par(j+3)
978 ilat(j) = 2**23 - kb2par(j+3)
984 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,24,0,2,
985 'C',kleng,kerr,kword,.true.)
1001 itemp = kb2par(6) / 128
1003 IF (itemp.LE.0.OR.itemp.GT.1)
1006 WRITE (*,9011) itemp
1007 9011
FORMAT (tr1,
'INVALID RESOLUTION FLAG ',i8.8)
1023 CALL sbyte_mf (kgrib(kword),ilb2par(6),ioff,8)
1024 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1036 IF (kb2par(j+6).GE.0)
THEN 1037 ilat(j) = kb2par(j+6)
1039 ilat(j) = 2**23 - kb2par(j+6)
1045 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
1046 'C',kleng,kerr,kword,.true.)
1057 CALL gsbyte_mf (kgrib(kword),ilb2par(9),ioff,16,0,2,
1058 'C',kleng,kerr,kword,.true.)
1080 itemp = kb2par(11) / 32
1082 IF (itemp.LT.0.OR.itemp.GT.7)
1084 CALL prtbin_mf (kb2par(11),8,itemp,ierr)
1085 WRITE (*,9014) itemp
1086 9014
FORMAT (tr1,
'INVALID SCANNING MODE FLAGS ',i8.8)
1093 CALL sbyte_mf (kgrib(kword),ilb2par(11),ioff,8)
1094 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1103 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,8,0,4,
1104 'C',kleng,kerr,kword,.true.)
1126 IF (kb2par(1).EQ.50.OR.kb2par(1).EQ.80)
1132 CALL gsbyte_mf (kgrib(kword),ilb2par(2),ioff,16,0,3,
1133 'C',kleng,kerr,kword,.true.)
1142 CALL gsbyte_mf (kgrib(kword),ilb2par(5),ioff,8,0,2,
1143 'C',kleng,kerr,kword,.true.)
1152 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,8,0,18,
1153 'C',kleng,kerr,kword,.true.)
1167 IF(kb2par(1).EQ.80)
THEN 1173 IF (kb2par(j+11).GE.0)
THEN 1174 ilat(j) = kb2par(j+11)
1176 ilat(j) = 2**23 - kb2par(j+11)
1182 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
1183 'C',kleng,kerr,kword,.true.)
1191 CALL confp_mf (ilb2par(14),iexp,imant)
1193 CALL sbyte_mf (kgrib(kword),ilexp,ioff,8)
1194 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1200 CALL sbyte_mf (kgrib(kword),ilmant,ioff,24)
1201 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1211 IF (kb2par(j+14).GE.0)
THEN 1212 ilat(j) = kb2par(j+14)
1214 ilat(j) = 2**23 - kb2par(j+14)
1219 CALL gsbyte_mf (kgrib(kword),illat(1),ioff,24,0,2,
1220 'C',kleng,kerr,kword,.true.)
1228 CALL confp_mf (ilb2par(17),iexp,imant)
1230 CALL sbyte_mf (kgrib(kword),iexp,ioff,8)
1231 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1237 CALL sbyte_mf (kgrib(kword),ilmant,ioff,24)
1238 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1251 IF (kb1par(6).GT.108)
THEN 1254 CALL confp_mf (pvert(j),iexp,imant)
1256 CALL sbyte_mf (kgrib(kword),ilexp,ioff,8)
1257 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1263 CALL sbyte_mf (kgrib(kword),ilmant,ioff,24)
1264 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1290 IF (kb1par(4).EQ.64.OR.kb1par(4).EQ.192)
1292 WRITE (*,*)
'BIT MAP BLOCK NOT YET DEFINED' 1337 CALL sbyte_mf (kgrib(kword),ilblock(1),ioff,24)
1338 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1365 IF (kb2par(1).EQ.50.OR.kb2par(1).EQ.80)
THEN 1369 IF (icpack.LT.0)
THEN 1370 WRITE (*,*)
'CODEGA : COMPLEX PACKING CODE ERROR' 1374 ELSEIF (iabs(kscalp).GE.2**15)
THEN 1375 WRITE (*,*)
'CODEGA : LAPLACIAN SCALING FACTOR ERROR' 1381 IF(icpack.NE.0.AND.kb2par(6).EQ.2)
THEN 1391 CALL sbyte_mf (kgrib(kword),ilflag,ioff,8)
1392 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1418 CALL mxmn_mf (pfdata(irep+1),ilen,pmax,pmin)
1441 zcoeff = pmax - pmin
1443 zepsil=1.e-290_jpdbld
1446 IF ( zcoeff .LE. zepsil )
THEN 1447 zauxil=min( abs(pmin), abs(pmax) )
1448 IF ( zauxil .LE. zepsil ) zauxil=0.0_jpdbld
1450 pmax=sign(zauxil,pmax)
1454 zscale=
REAL(2**KBITS-1,KIND=JPDBLD) / ZCOEFF
1464 ELSEIF (imiss.EQ.1)
THEN 1482 CALL confi (pmin,iexp,imant,zrefer)
1484 zs = (pmax-zrefer)/
REAL(2**(kbits+1)-1,kind=
jpdbld)
1491 IF (zs.GT.0.0_jpdbld)
THEN 1492 zs = log(zs)/log(zauxi2) + zauxi2
1496 iscale = min(int(zs),int(zs+sign(zauxil,zs)))
1501 iscale = max(-99,min(99,iscale))
1502 zscale = zauxi2** (-iscale)
1512 IF (iscale.GE.0)
THEN 1515 iscalx= 2**15 - iscale
1519 CALL sbyte_mf (kgrib(kword),ilscalx,ioff,16)
1520 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1530 IF (iexp.EQ.0.AND.imant.EQ.0)
THEN 1532 CALL sbyte_mf (kgrib(kword),ilmant,ioff,32)
1533 CALL offset_mf (ioff,1,kword,32,knbit,kleng,kerr)
1536 CALL sbyte_mf (kgrib(kword),ilexp,ioff,8)
1537 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1543 CALL sbyte_mf (kgrib(kword),ilmant,ioff,24)
1544 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1560 CALL sbyte_mf (kgrib(kword),ilbits,ioff,8)
1561 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1574 IF (irep.NE.0.AND.icpack.NE.0)
THEN 1598 CALL sbyte_mf (kgrib(kword),ilstpa,ioff,16)
1599 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1607 IF (kscalp.GE.0)
THEN 1614 CALL sbyte_mf (kgrib(kword),ilscalp,ioff,16)
1615 CALL offset_mf (ioff,1,kword,16,knbit,kleng,kerr)
1624 iauxil=icpack*(1+2**8*(1+2**8))
1626 CALL sbyte_mf (kgrib(kword),ilauxil,ioff,24)
1627 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1653 CALL sbyte_mf (kgrib(kword),ilmant,ioff,32)
1654 CALL offset_mf (ioff,1,kword,32,knbit,kleng,kerr)
1666 CALL confp_mf (pfdata(j),iexp,imant)
1669 CALL sbyte_mf (kgrib(kword),ilexp,ioff,8)
1670 CALL offset_mf (ioff,1,kword,8,knbit,kleng,kerr)
1676 CALL sbyte_mf (kgrib(kword),ilmant,ioff,24)
1677 CALL offset_mf (ioff,1,kword,24,knbit,kleng,kerr)
1700 ilenfm = ilenf - irep
1701 CALL packgb (pfdata(irep+1),pfdata(irep+1),zrefer,zscale,ilenfm)
1702 CALL gsbyte_mf (kgrib(kword),pfdata(irep+1),ioff,kbits,0,ilenfm,
1703 'C',kleng,kerr,kword,.true.)
1726 ilbin = (kword-ipw) * knbit + ioff - ipb
1737 CALL sbyte_mf (kgrib(kword),ilblock(1),ioff,ilnil)
1738 CALL offset_mf (ioff,1,kword,ilnil,knbit,kleng,kerr)
1745 ilbin = (kword-ipw) * knbit + ioff - ipb
1751 CALL sbyte_mf (kgrib(ipw),illbin,ipb,24)
1752 CALL offset_mf (ipb,1,ipw,24,knbit,kleng,kerr)
1756 iflag = iflag + ilnil
1758 CALL sbyte_mf (kgrib(ipw),ilflag,ipb,8)
1796 CALL gsbyte_mf (kgrib(kword),ilblock(1),ioff,8,0,4,
1797 'C',kleng,kerr,kword,.false.)
1810 ibits = knbit - ioff
1812 CALL sbyte_mf (kgrib(kword),ilblock(5),ioff,ibits)
1823 inumbi = kword * knbit
1827 IF (i.NE.0) i = (960 - i) / knbit
1829 DO 700 j=kword+1,kword+i
subroutine gsbyte_mf(KS, KD, KOFF, KSIZE, KSKBTW, K, KBPW,
subroutine codega(PFDATA, KLENF, KBITS, KNBIT, KB1PAR,
subroutine packgb(PFDATA, KPACKD, PREFER, PSCALE, KLENG)
subroutine confi(PFVAL, KEXP, KMANT, PNFVAL)
integer, parameter jpdbld
subroutine prtbin_mf(KIN, KNBIT, KOUT, KERR)
subroutine mxmn_mf(PARRAY, KLEN, PMAX, PMIN)
subroutine sbyte_mf(KDEST, KSOURC, KOFSET, KBYTSZ)
subroutine offset_mf(KOFF, KVAL, KWORD, KBYTE, KNBIT, KLEN, KERR)
subroutine confp_mf(PFVAL, KEXP, KMANT)