SURFEX v7.3
General documentation of Surfex
|
00001 SUBROUTINE DECOGA (PFDATA,KLENF,KBITS,KNBIT,KB1PAR, 00002 C KB2PAR,PVERT,KLENV,KGRIB,KLENG,KWORD, 00003 C KJLENV,KJLENF,KCPACK,KSCALP,KERR,PMIN,PMAX,LDARPE) 00004 USE PARKIND1, ONLY : JPRB 00005 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00006 C 00007 C 00008 C 00009 C 00010 C 00011 C 00012 C******************************************************************** 00013 C* 00014 C* NAME : DECOGA 00015 C* 00016 C* FUNCTION : DECODE WMO GRIB CODED DATA. 00017 C* 00018 C* INPUT : KNBIT - NUMBER OF BITS IN COMPUTER WORD 00019 C* 00020 C* KGRIB - INTEGER ARRAY CONTAINING DATA IN GRIB CODE. 00021 C* KLENG - LENGTH OF ARRAY KGRIB. 00022 C* 00023 C* PVERT - REAL ARRAY TO RECEIVE VERTICAL COORDINATE 00024 C* PARAMETERS. 00025 C* KLENV - LENGTH OF ARRAY PVERT. 00026 C* 00027 C* PFDATA - REAL ARRAY TO RECEIVE DECODED DATA VALUES. 00028 C* KLENF - LENGTH OF ARRAY PFDATA. 00029 C* 00030 C* ***** IF THIS IS 1 ONLY 00031 C* THE PRODUCT AND GRID DEFINITION BLOCKS 00032 C* ARE DECODED. ***** 00033 C* 00034 C* KB1PAR - INTEGER ARRAY (DIMENSION 19) TO RECEIVE 00035 C* PRODUCT DEFINITION INFORMATION. 00036 C* 00037 C* KB2PAR - INTEGER ARRAY (DIMENSION 11) TO RECEIVE GRID 00038 C* DEFINITION INFORMATION. 00039 C* 00040 C* PMIN - MINIMUM VALUE OF THE FIELD DATA. 00041 C* 00042 C* PMAX - MAXIMUM VALUE OF THE FIELD DATA. 00043 C* 00044 C* ***** These 2 last values have only to be supplied 00045 C* if next argument is .TRUE. . ***** 00046 C* 00047 C* LDARPE - .TRUE., modifications for ARPEGE coding 00048 C* have been included when coding data; 00049 C* .FALSE., no such modifications. 00050 C* 00051 C* OUTPUT : PARAMETERS FROM BLOCK 1 , PRODUCT DEFINITION BLOCK. 00052 C* -------------------------------------------------- 00053 C* KB1PAR - INTEGER ARRAY (DIMENSION 19) OF PRODUCT 00054 C* DEFINITION INFORMATION. 00055 C* 00056 C* WORD CONTENTS 00057 C* ---- -------- 00058 C* 1 ORIGINATING CENTRE IDENTIFIER. 00059 C* 2 MODEL IDENTIFICATION. 00060 C* 3 GRID DEFINITION. 00061 C* 4 FLAG ( CODE TABLE 1) 00062 C* 5 PARAMETER IDENTIFIER ( CODE TABLE 2 ). 00063 C* 6 TYPE OF LEVEL (CODE TABLE 3). 00064 C* 7-8 VALUE(S) OF LEVELS (CODE TABLE 3). 00065 C* 9 YEAR OF DATA 00066 C* 10 MONTH OF DATA 00067 C* 11 DAY OF DATA 00068 C* 12 HOUR OF DATA 00069 C* 13 MINUTE OF DATA 00070 C* 14 TIME UNIT (CODE TABLE 4). 00071 C* 15 TIME RANGE ONE 00072 C* 16 TIME RANGE TWO 00073 C* 17 TIME RANGE FLAG (CODE TABLE 5). 00074 C* 18 NUMBER AVERAGED OR ACCUMULATED. 00075 C* 19 NUMBER MISSING FROM AVERAGES/ACCUMULATIONS. 00076 C* 00077 C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS.. 00078 C* FOR A LAYER THE FIRST WORD DEFINES THE TOP 00079 C* AND THE SECOND THE BOTTOM OF THE LAYER. 00080 C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS 00081 C* USED. 00082 C* 00083 C* PARAMETERS FROM BLOCK 2 , GRID DEFINITION BLOCK. 00084 C* ----------------------------------------------- 00085 C* KB2PAR - INTEGER ARRAY (DIMENSION 17) CONTAINING GRID 00086 C* DEFINITION INFORMATION. 00087 C* USE VARIES WITH DATA REPRESENTATION TYPE. 00088 C* 00089 C* WORD LAT/LONG GRID 00090 C* ---- ------------- 00091 C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6). 00092 C* 2 NO. OF POINTS ALONG A LATITUDE 00093 C* 3 NO. OF POINTS ALONG A MERIDIAN. 00094 C* 4 LATITUDE OF ORIGIN (SOUTH - IVE). 00095 C* 5 LONGITUDE OF ORIGIN (WEST - IVE). 00096 C* 6 RESOLUTION FLAG. (CODE TABLE 7) 00097 C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE). 00098 C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE). 00099 C* 9 LATITUDE INCREMENT 00100 C* 10 LONGITUDE INCREMENT 00101 C* 11 SCANNING MODE FLAGS (CODE TABLE 8) 00102 C* 00103 C* WORD GAUSSIAN GRID 00104 C* ---- ------------- 00105 C* 1-9 AS FOR LAT/LONGITUDE GRID. 00106 C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE 00107 C* AND THE EQUATOR. 00108 C* 11 SCANNING MODE FLAGS (CODE TABLE 8) 00109 C* 00110 C* WORD SPHERICAL HARMONICS 00111 C* ---- ------------------- 00112 C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6) 00113 C* 2 J - PENTAGONAL RESOLUTION PARAMETER 00114 C* 3 K - PENTAGONAL RESOLUTION PARAMETER 00115 C* 4 M - PENTAGONAL RESOLUTION PARAMETER 00116 C* 5 REPRESENTATION TYPE (CODE TABLE 9) 00117 C* 6 REPRESENTATION MODE (CODE TABLE 10) 00118 C* 7-11 NOT USED 00119 C* 00120 C* 00121 C* USE FOR OTHER DATA REPRESENTATION TYPES IS 00122 C* 00123 C* PVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS 00124 C* KJLENV - NUMBER OF VALUES IN THIS ARRAY. 00125 C* 00126 C* USED FOR HYBRID LEVELS ONLY. 00127 C* 00128 C* PARAMETERS FROM BLOCK 3 , BIT-MAP DEFINITION BLOCK. 00129 C* -------------------------------------------------- 00130 C* 00131 C* TO BE DEFINED LATER. 00132 C* 00133 C* PARAMETERS FROM BLOCK 4 , BINARY DATA BLOCK. 00134 C* ------------------------------------------- 00135 C* PFDATA - ARRAY OF FLOATING POINT VALUES. 00136 C* KJLENF - NUMBER OF VALUES IN THIS ARRAY. 00137 C* KJLENF IS NEGATIVE IF MISSING DATA CODED 00138 C* 00139 C* KBITS - NUMBER OF BITS FOR CODED DATA VALUES. 00140 C* 00141 C* KWORD - NUMBER OF WORDS DECODED. 00142 C* 00143 C* KCPACK - KCPACK GREATER THAN ZERO INDICATES COMPLEX 00144 C* PACKING, WITH A *TRIANGULAR* SUB-TRUNCATION 00145 C* "UNPACKED" OF ORDER KCPACK. 00146 C 00147 C* KSCALP - FOR COMPLEX PACKING OF SPECTRAL COEFFICIENTS 00148 C* ONLY, LAPLACIAN SCALING FACTOR. 00149 C* 00150 C* ***** THE 2 NEXT VALUES ARE SUPPLIED BY THE ROUTINE 00151 C* ONLY IF ARGUMENT "LDARPE" IS .FALSE. . ***** 00152 C* 00153 C* PMIN - MINIMUM VALUE OF THE FIELD DATA, OR A SLIGHT 00154 C* UNDER-APPROXIMATION OF THE "TRUE" MINIMUM OF 00155 C* DECODED FIELD DATA. 00156 C* 00157 C* PMAX - OVER-ESTIMATION OF THE MAXIMUM VALUE OF THE 00158 C* FIELD DATA (COMPUTED WITH PMIN, THE SCALE 00159 C* FACTOR "ISCALE" OF GRIB, AND KBITS). 00160 C* 00161 C* 00162 C* KERR - ERROR INDICATOR. 00163 C* 00164 C* 0, NO ERROR. 00165 C* 00166 C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS 00167 C* WORD LENGTH, OR MAXIMUM ALLOWED. 00168 C* -2, INPUT ARRAY HOLDS FEWER CODED VALUES 00169 C* THAN EXPECTED. 00170 C* -3, OUTPUT ARRAY TOO SMALL TO HOLD DECODED 00171 C* DATA VALUES. 00172 C* -4, CURRENTLY UNDEFINED OPTION SELECTED. 00173 C* 00174 C* 1, NO BLOCK 5 FOUND. 00175 C 2, ERROR IN CONVERTING OLD TO NEW FORM OF 00176 C BLOCK 1 OR 2. 00177 C* 3, NO BLOCK 0 FOUND. 00178 C* 00179 C* GENERAL : DECOGA CALLS GBYTE 00180 C* GSBYTE 00181 C* OFFSET 00182 C* DECFP 00183 C* 00184 C* 00185 C* MODIFIED : J. HENNESSY 17.06.87 00186 C* CONVERT OLD FORMAT BLOCK 1 AND 2 TO NEW FORMAT. 00187 C* ( DISTINCTION BETWEEN ANALYSIS AND INITIALISED 00188 C* NOT POSSIBLE ). 00189 C* 00190 C* Modifications by Mats HAMRUD, ECMWF, to handle complex unpacking 00191 C* of spectral harmonics data, 1988. 00192 C* 00193 C* Modifications by Jean CLOCHARD, French DMN, February 1990: 00194 C* 00195 C* - to remove automatic arrays introduced by the last modification; 00196 C* - to comply with the "DOCTOR" norm; 00197 C* - to allow modifications of the unpacking for ARPEGE files use, 00198 C* in an optional way. 00199 C* 00200 C******************************************************************** 00201 C 00202 C 00203 C 00204 C 00205 C 00206 C 00207 C 00208 C 00209 C 00210 00211 USE SDL_MOD , ONLY : SDL_SRLABORT 00212 00213 #include "precision.h" 00214 C 00215 INTEGER KLENF, KBITS, KNBIT, KLENV, KLENG, KWORD, KJLENV, KJLENF 00216 INTEGER KCPACK, KSCALP, KERR 00217 C 00218 INTEGER KB1PAR(19),KB2PAR(17) 00219 INTEGER (KIND=JPDBLE) KGRIB(KLENG) 00220 C 00221 REAL (KIND=JPDBLR) PMIN, PMAX 00222 C 00223 REAL (KIND=JPDBLR) PFDATA(KLENF), PVERT(KLENV) 00224 C 00225 LOGICAL LDARPE 00226 C 00227 INTEGER IMAX, IOFF, IBYTE, INVAL, ISNEW, J, ITEMP, INC, ILBLK 00228 INTEGER ILNIL, IEXP, IMANT, ILEN, IPW, IPB, ILBIN, IFLAG, IREP 00229 INTEGER ISCALX, ISCALE, IMISS, ISPDA, IPREMC, ISSUIV, IL, ILBVAL 00230 INTEGER (KIND=JPDBLE) ILEXP, ILMANT, ILFLAG, ILSCALX, ILLNIL 00231 INTEGER (KIND=JPDBLE) ILLBLK, ILLBIN, ILBITS, ILSPDA, ILSCALP 00232 INTEGER (KIND=JPDBLE) ILCPACK 00233 C 00234 C 00235 INTEGER IBLOCK(24), ILAT(2) 00236 INTEGER (KIND=JPDBLE) ILBLOCK(24), ILB2PAR(17), ILLAT(2) 00237 C 00238 REAL (KIND=JPDBLR) ZSCALE 00239 C 00240 C 00241 C SET MAXIMUM NUMBER OF BITS PER DATA FIELD. 00242 C 00243 SAVE IMAX 00244 DATA IMAX /60/ 00245 C 00246 C CLEAR ERROR INDICATOR. 00247 C 00248 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00249 IF (LHOOK) CALL DR_HOOK('DECOGA',0,ZHOOK_HANDLE) 00250 KERR = 0 00251 C 00252 C 00253 C 00254 C 00255 C 00256 C 00257 C 00258 C 00259 C 00260 C 00261 C 00262 C 00263 C 00264 C 00265 C 00266 C 00267 C 00268 C******************************************************************** 00269 C* 00270 C* BLOCK 0 - INDICATOR BLOCK. 00271 C* 00272 C******************************************************************** 00273 C 00274 C 00275 C EXTRACT 4 OCTETS CONTAINING ASCII G R I B . 00276 C 00277 KWORD = 1 00278 IOFF = 0 00279 IBYTE = 8 00280 INVAL = 4 00281 C 00282 CALL GSBYTE_MF (KGRIB(1),ILBLOCK(1),IOFF,IBYTE,0,INVAL, 00283 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00284 IBLOCK=ILBLOCK 00285 C 00286 IF (KERR.NE.0) THEN 00287 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00288 RETURN 00289 ELSEIF (IBLOCK(1).NE.71.AND.IBLOCK(2).NE.82.AND. 00290 S IBLOCK(3).NE.73.AND.IBLOCK(4).NE.66) THEN 00291 KERR=3 00292 WRITE (UNIT=*,FMT=*) 'NO ''GRIB'' GROUP (BLOCK 0) FOUND' 00293 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00294 RETURN 00295 ENDIF 00296 C 00297 C 00298 C 00299 C 00300 C 00301 C 00302 C 00303 C******************************************************************** 00304 C* 00305 C* BLOCK 1 - PRODUCT DEFINITION BLOCK. 00306 C* 00307 C******************************************************************** 00308 C 00309 C 00310 C EXTRACT FIRST 4 OCTETS OF BLOCK 1. 00311 C 00312 INVAL = 4 00313 C 00314 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,IBYTE,0,INVAL, 00315 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00316 IBLOCK=ILBLOCK 00317 IF (KERR.NE.0) THEN 00318 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00319 RETURN 00320 ENDIF 00321 C 00322 C IF THESE OCTETS DO NOT CONTAIN 0, 0, 24 AND 0 RESPECTIVELY 00323 C THEN THE DATA IS IN THE OLD VERSION OF THE CODE. 00324 C 00325 IF (IBLOCK(1).EQ.0.AND.IBLOCK(2).EQ.0.AND.IBLOCK(3).EQ.24. 00326 C AND.IBLOCK(4).EQ.0) 00327 C THEN 00328 ISNEW = 1 00329 INVAL = 20 00330 ELSE 00331 ISNEW = 0 00332 INVAL = 16 00333 ENDIF 00334 C 00335 C EXTRACT NEXT 16 OR 20 OCTETS OF BLOCK 1 - NUMBER DEPENDS 00336 C ON VERSION OF CODE. 00337 C 00338 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(5),IOFF,IBYTE,0,INVAL, 00339 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00340 IBLOCK=ILBLOCK 00341 IF (KERR.NE.0) THEN 00342 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00343 RETURN 00344 ENDIF 00345 C 00346 C TRANSFER PRODUCT DEFINITION INFORMATION TO OUTPUT ARRAY. 00347 C EXCEPT FOR NUMBER AVERAGED/ACCUMULATED AND MISSING FROM AVER/ACCUM 00348 C 00349 DO 100 J=1,17 00350 KB1PAR(J) = IBLOCK(J+4*ISNEW) 00351 100 CONTINUE 00352 C 00353 C 00354 C 00355 C 00356 C NUMBER AVERAGED OCCUPIES 2 OCTETS. 00357 C 00358 KB1PAR(18) = IBLOCK(18+4*ISNEW) * 256 + IBLOCK(19+4*ISNEW) 00359 C 00360 C NUMBER MISSING FROM AVERAGES/ACCUMULATIONS. 00361 C 00362 KB1PAR(19)=IBLOCK(20+4*ISNEW) 00363 C 00364 C 00365 C*** 00366 C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ). 00367 C*** 00368 C 00369 C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY 00370 C BOTH 8 BIT FIELDS. PUT SINGLE VALUE IN FIRST LEVEL WORD. 00371 C 00372 ITEMP = 32 + (ISNEW*224) 00373 C 00374 IF( (KB1PAR(6).EQ. 20).OR. 00375 X (KB1PAR(6).EQ.100).OR. 00376 X (KB1PAR(6).EQ.103).OR. 00377 X (KB1PAR(6).EQ.105).OR. 00378 X (KB1PAR(6).EQ.107).OR. 00379 X (KB1PAR(6).EQ.109).OR. 00380 X (KB1PAR(6).EQ.111).OR. 00381 X (KB1PAR(6).EQ.113).OR. 00382 X (KB1PAR(6).EQ.115).OR. 00383 X (KB1PAR(6).EQ.117).OR. 00384 X (KB1PAR(6).EQ.125).OR. 00385 X (KB1PAR(6).EQ.127).OR. 00386 X (KB1PAR(6).EQ.160).OR. 00387 X (KB1PAR(6).EQ.210) ) THEN 00388 C 00389 KB1PAR(7) = KB1PAR(7) * ITEMP + KB1PAR(8) 00390 KB1PAR(8) = 0 00391 ENDIF 00392 C 00393 C 00394 C 00395 C 00396 C 00397 C 00398 C 00399 C 00400 C 00401 C*** 00402 C* TIME RANGE. 00403 C*** 00404 C 00405 C ONE TIME RANGE CAN OCCUPY TWO OCTETS. 00406 C 00407 IF (KB1PAR(17).EQ.10) 00408 C THEN 00409 KB1PAR(15) = KB1PAR(15) * ITEMP + KB1PAR(16) 00410 KB1PAR(16) = 0 00411 ENDIF 00412 C 00413 C 00414 C 00415 C 00416 C 00417 C 00418 C 00419 C 00420 C 00421 C 00422 C 00423 C******************************************************************** 00424 C* 00425 C* BLOCK 2 - GRID DESCRIPTION BLOCK. 00426 C* 00427 C******************************************************************** 00428 C 00429 C*** 00430 C* CHECK FLAG INDICATING IF BLOCK 2 IS INCLUDED IN CODE. 00431 C*** 00432 C 00433 C INC IS SET TO 1 , IF BLOCK 2 IS INCLUDED. 00434 C 00435 INC = 0 00436 C 00437 C 00438 IF (ISNEW.EQ.0) 00439 C THEN 00440 C OLD VERSION OF CODE 00441 C 00442 C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE 00443 C 00444 C NONE 00000000 0 00445 C 2 00000001 1 00446 C 3 00000010 2 00447 C 2 AND 3 00000011 3 00448 C 00449 IF (KB1PAR(4).EQ.1.OR.KB1PAR(4).EQ.3) INC = 1 00450 ELSE 00451 C NEW VERSION 00452 C 00453 C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE 00454 C 00455 C NONE 00000000 0 00456 C 2 10000000 128 00457 C 3 01000000 64 00458 C 2 AND 3 11000000 192 00459 C 00460 IF (KB1PAR(4).EQ.128.OR.KB1PAR(4).EQ.192) INC = 1 00461 ENDIF 00462 C 00463 IF (INC.EQ.1) 00464 C THEN 00465 C 00466 C 00467 C*** 00468 C* LENGTH OF GRID DESCRIPTION BLOCK. 00469 C*** 00470 C 00471 CALL GBYTE_MF (KGRIB(KWORD),ILLBLK,IOFF,24) 00472 ILBLK=ILLBLK 00473 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00474 IF (KERR.NE.0) THEN 00475 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00476 RETURN 00477 ENDIF 00478 C 00479 C 00480 C 00481 C*** 00482 C* NUMBER OF UNUSED BITS AT END OF BLOCK. 00483 C*** 00484 C 00485 CALL GBYTE_MF (KGRIB(KWORD),ILLNIL,IOFF,8) 00486 ILNIL=ILLNIL 00487 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00488 IF (KERR.NE.0) THEN 00489 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00490 RETURN 00491 ENDIF 00492 C 00493 C 00494 C 00495 C 00496 C*** 00497 C* NEXT OCTET IS RESERVED. 00498 C*** 00499 C 00500 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00501 IF (KERR.NE.0) THEN 00502 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00503 RETURN 00504 ENDIF 00505 C 00506 C 00507 C 00508 C 00509 C 00510 C 00511 C 00512 C*** 00513 C* DATA REPRESENTATION TYPE. 00514 C*** 00515 C 00516 CALL GBYTE_MF (KGRIB(KWORD),ILB2PAR(1),IOFF,8) 00517 KB2PAR=ILB2PAR 00518 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00519 IF (KERR.NE.0) THEN 00520 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00521 RETURN 00522 ENDIF 00523 C 00524 C LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS 00525 C ARE THE ONLY DATA REPRESENTATIONS HANDLED. 00526 C 00527 IF (KB2PAR(1).NE.0.AND.KB2PAR(1).NE.4.AND.KB2PAR(1).NE.50 00528 C .AND.KB2PAR(1).NE.80) 00529 C THEN 00530 WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED' 00531 KERR = -4 00532 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00533 RETURN 00534 ENDIF 00535 C 00536 C 00537 C 00538 C 00539 C*** 00540 C* LAT/LONG OR GAUSSIAN GRID. 00541 C*** 00542 C 00543 IF (KB2PAR(1).EQ.0.OR.KB2PAR(1).EQ.4) 00544 C THEN 00545 C 00546 C NUMBER OF LAT/LONG POINTS. 00547 C 00548 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(2),IOFF,16,0,2, 00549 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00550 KB2PAR=ILB2PAR 00551 IF (KERR.NE.0) THEN 00552 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00553 RETURN 00554 ENDIF 00555 C 00556 C LAT/LONG OF ORIGIN. 00557 C 00558 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 00559 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00560 ILAT=ILLAT 00561 IF (KERR.NE.0) THEN 00562 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00563 RETURN 00564 ENDIF 00565 C 00566 C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE. 00567 C 00568 DO 200 J=1,2 00569 C 00570 IF (ILAT(J).LE.2**23) THEN 00571 KB2PAR(J+3) = ILAT(J) 00572 ELSE 00573 KB2PAR(J+3) = 2**23 - ILAT(J) 00574 ENDIF 00575 C 00576 200 CONTINUE 00577 C 00578 C 00579 C RESOLUTION FLAG. 00580 C 00581 CALL GBYTE_MF (KGRIB(KWORD),ILB2PAR(6),IOFF,8) 00582 KB2PAR=ILB2PAR 00583 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00584 IF (KERR.NE.0) THEN 00585 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00586 RETURN 00587 ENDIF 00588 C 00589 C 00590 C LAT/LONG OF EXTREME POINTS. 00591 C 00592 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 00593 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00594 ILAT=ILLAT 00595 IF (KERR.NE.0) THEN 00596 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00597 RETURN 00598 ENDIF 00599 C 00600 C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE. 00601 C 00602 DO 300 J=1,2 00603 C 00604 IF (ILAT(J).LE.2**23) THEN 00605 KB2PAR(J+6) = ILAT(J) 00606 ELSE 00607 KB2PAR(J+6) = 2**23 - ILAT(J) 00608 ENDIF 00609 C 00610 300 CONTINUE 00611 C 00612 C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES. 00613 C 00614 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(9),IOFF,16,0,2, 00615 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00616 KB2PAR=ILB2PAR 00617 IF (KERR.NE.0) THEN 00618 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00619 RETURN 00620 ENDIF 00621 C 00622 C SCANNING MODE FLAGS. 00623 C 00624 CALL GBYTE_MF (KGRIB(KWORD),ILB2PAR(11),IOFF,8) 00625 KB2PAR=ILB2PAR 00626 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00627 IF (KERR.NE.0) THEN 00628 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00629 RETURN 00630 ENDIF 00631 C 00632 C 4 RESERVED OCTETS. 00633 C 00634 CALL OFFSET_MF (IOFF,4,KWORD,8,KNBIT,KLENG,KERR) 00635 IF (KERR.NE.0) THEN 00636 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00637 RETURN 00638 ENDIF 00639 C 00640 ENDIF 00641 C 00642 C 00643 C 00644 C 00645 C 00646 C 00647 C 00648 C 00649 C 00650 C 00651 C 00652 C 00653 C 00654 C 00655 C*** 00656 C* SPHERICAL HARMONIC DATA. 00657 C*** 00658 C 00659 IF (KB2PAR(1).EQ.50.OR.KB2PAR(1).EQ.80) 00660 C THEN 00661 C 00662 C PENTAGONAL RESOLUTION PARAMETERS. 00663 C 00664 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(2),IOFF,16,0, 00665 S 3,KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00666 KB2PAR=ILB2PAR 00667 IF (KERR.NE.0) THEN 00668 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00669 RETURN 00670 ENDIF 00671 C 00672 C REPRESENTATION TYPE AND MODE. 00673 C 00674 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(5),IOFF,8,0,2, 00675 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00676 KB2PAR=ILB2PAR 00677 IF (KERR.NE.0) THEN 00678 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00679 RETURN 00680 ENDIF 00681 C 00682 C 18 RESERVED OCTETS. 00683 C 00684 CALL OFFSET_MF (IOFF,18,KWORD,8,KNBIT,KLENG,KERR) 00685 IF (KERR.NE.0) THEN 00686 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00687 RETURN 00688 ENDIF 00689 C 00690 ENDIF 00691 C 00692 C** 00693 C* STRETCHED AND ROTATED SHPERICAL HARMONICS. 00694 C** 00695 IF(KB2PAR(1).EQ.80) THEN 00696 C 00697 C* SOUTHERN POLE OF ROTATED GRID 00698 C 00699 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 00700 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00701 ILAT=ILLAT 00702 IF (KERR.NE.0) THEN 00703 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00704 RETURN 00705 ENDIF 00706 C 00707 C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE. 00708 C 00709 DO 410 J=1,2 00710 C 00711 IF (ILAT(J).LE.2**23) THEN 00712 KB2PAR(J+11) = ILAT(J) 00713 ELSE 00714 KB2PAR(J+11) = 2**23 - ILAT(J) 00715 ENDIF 00716 C 00717 410 CONTINUE 00718 C 00719 C* ANGLE OF ROTATION 00720 C 00721 CALL GBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 00722 IEXP=ILEXP 00723 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00724 IF (KERR.NE.0) THEN 00725 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00726 RETURN 00727 ENDIF 00728 CALL GBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 00729 IMANT=ILMANT 00730 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00731 IF (KERR.NE.0) THEN 00732 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00733 RETURN 00734 ENDIF 00735 C 00736 CALL DECFP_MF (KB2PAR(14),IEXP,IMANT) 00737 C 00738 C* POLE OF STRETCHING 00739 C 00740 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 00741 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 00742 ILAT=ILLAT 00743 IF (KERR.NE.0) THEN 00744 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00745 RETURN 00746 ENDIF 00747 C 00748 C IF SIGN BIT SET TO 1 , VALUES ARE NEGATIVE. 00749 C 00750 DO 420 J=1,2 00751 C 00752 IF (ILAT(J).LE.2**23) THEN 00753 KB2PAR(J+14) = ILAT(J) 00754 ELSE 00755 KB2PAR(J+14) = 2**23 - ILAT(J) 00756 ENDIF 00757 C 00758 420 CONTINUE 00759 C 00760 C* STRETCHING FACTOR 00761 C 00762 CALL GBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 00763 IEXP=ILEXP 00764 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00765 IF (KERR.NE.0) THEN 00766 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00767 RETURN 00768 ENDIF 00769 CALL GBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 00770 IMANT=ILMANT 00771 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00772 IF (KERR.NE.0) THEN 00773 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00774 RETURN 00775 ENDIF 00776 C 00777 CALL DECFP_MF (KB2PAR(17),IEXP,IMANT) 00778 C 00779 ENDIF 00780 C 00781 C 00782 C 00783 C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL 00784 C HARMONICS, 52 OCTETS FOR STRETCHED AND ROTATED SPHERICAL 00785 C HARMONICS.FOR ANY DATA ON HYBRID LEVELS THE 00786 C VERTICAL COORDINATES ARE ADDED. 00787 C GET NUMBER OF VERTICAL COORDINATE PARAMETERS, IF ANY. 00788 C 00789 IF(KB2PAR(1).EQ.80) THEN 00790 ILEN=52 00791 ELSE 00792 ILEN=32 00793 ENDIF 00794 C 00795 KJLENV = (ILBLK - ILEN) / 4 00796 C 00797 IF(KLENV.LT.KJLENV) THEN 00798 KERR = -3 00799 WRITE (*,9001) KJLENV,KLENV 00800 9001 FORMAT (1H ,'NUMBER OF VERTICAL COORDINATES - ',I4, 00801 C ', ARRAY SIZE IS - ',I4) 00802 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00803 RETURN 00804 ENDIF 00805 C 00806 C 00807 C 00808 C*** 00809 C* VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS. 00810 C*** 00811 C 00812 IF (KJLENV.NE.0) THEN 00813 C 00814 DO 400 J=1,KJLENV 00815 CALL GBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 00816 IEXP=ILEXP 00817 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00818 IF (KERR.NE.0) THEN 00819 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00820 RETURN 00821 ENDIF 00822 CALL GBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 00823 IMANT=ILMANT 00824 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00825 IF (KERR.NE.0) THEN 00826 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00827 RETURN 00828 ENDIF 00829 CALL DECFP_MF (PVERT(J),IEXP,IMANT) 00830 400 CONTINUE 00831 C 00832 ENDIF 00833 C 00834 ENDIF 00835 C 00836 C 00837 C 00838 C RETURN IF ONLY PRODUCT AND GRID DEFINITION BLOCKS REQUIRED. 00839 C 00840 IF (KLENF.EQ.1) THEN 00841 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00842 RETURN 00843 ENDIF 00844 C 00845 C 00846 C 00847 C 00848 C 00849 C 00850 C 00851 C 00852 C******************************************************************** 00853 C* 00854 C* BLOCK 3 - BIT MAP BLOCK. 00855 C* 00856 C******************************************************************** 00857 C 00858 C INC IS SET TO 1 , IF BLOCK 3 IS INCLUDED. 00859 C 00860 INC = 0 00861 C 00862 C 00863 IF (ISNEW.EQ.0) 00864 C THEN 00865 C OLD VERSION OF CODE 00866 C 00867 C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE 00868 C 00869 C NONE 00000000 0 00870 C 2 00000001 1 00871 C 3 00000010 2 00872 C 2 AND 3 00000011 3 00873 C 00874 IF (KB1PAR(4).EQ.2.OR.KB1PAR(4).EQ.3) INC = 1 00875 ELSE 00876 C NEW VERSION 00877 C 00878 C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE 00879 C 00880 C NONE 00000000 0 00881 C 2 10000000 128 00882 C 3 01000000 64 00883 C 2 AND 3 11000000 192 00884 C 00885 IF (KB1PAR(4).EQ.64.OR.KB1PAR(4).EQ.192) INC = 1 00886 ENDIF 00887 C 00888 IF (INC.EQ.1) 00889 C THEN 00890 WRITE (*,*)'BIT MAP BLOCK NOT YET DEFINED' 00891 KERR = -4 00892 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00893 RETURN 00894 ENDIF 00895 C 00896 C 00897 C 00898 C 00899 C********************************************************************** 00900 C* 00901 C* CONVERT VALUES IN BLOCKS 1 AND 2 TO NEW CODE VALUES. 00902 C* 00903 C********************************************************************** 00904 C 00905 C 00906 IF (ISNEW.EQ.0) 00907 C THEN 00908 C 00909 C CHANGE CODE FOR FLAG INDICATING INCLUSION OR OMISSION 00910 C OF BLOCKS 2 AND 3. 00911 C 00912 C BINARY VALUE OLD CODE = 00000001 00913 C BINARY VALUE NEW CODE = 10000000 (128 DECIMAL) 00914 C 00915 IF (KB1PAR(4).EQ.1) 00916 C THEN 00917 KB1PAR(4) = 128 00918 ELSE 00919 WRITE (*,*) 'DECOGA : BLOCK FLAG ERROR.' 00920 KERR = 2 00921 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00922 RETURN 00923 ENDIF 00924 C 00925 C CHANGE CODE FOR TIME UNIT. 00926 C 00927 IF (KB1PAR(14).EQ.40) 00928 C THEN 00929 KB1PAR(14) = 1 00930 ELSE 00931 WRITE (*,*) 'DECOGA : TIME UNIT ERROR.' 00932 KERR = 2 00933 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00934 RETURN 00935 ENDIF 00936 C 00937 C CONVERT FLAGS FOR LAT/LONG AND GAUSSIAN GRID DATA. 00938 C 00939 IF (KB2PAR(1).EQ.0.OR.KB2PAR(1).EQ.4) 00940 C THEN 00941 C 00942 C CONVERT SCANNING MODE FLAG. 00943 C 00944 IF (KB2PAR(11).EQ.1) 00945 C THEN 00946 KB2PAR(11) = 0 00947 ELSE 00948 WRITE (*,*) 'DECOGA : SCAN MODE FLAG ERROR.' 00949 KERR = 2 00950 IF (LHOOK) 00951 C CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00952 RETURN 00953 ENDIF 00954 C 00955 C CONVERT RESOLUTION FLAG. 00956 C 00957 IF (KB2PAR(6).EQ.3) 00958 C THEN 00959 KB2PAR(6) = 128 00960 ELSE 00961 WRITE (*,*) 'DECOGA : RESOLUTION FLAG ERROR.' 00962 KERR = 2 00963 IF (LHOOK) 00964 C CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00965 RETURN 00966 ENDIF 00967 ENDIF 00968 ENDIF 00969 C 00970 C 00971 C 00972 C 00973 C 00974 C 00975 C******************************************************************** 00976 C* 00977 C* BLOCK 4 - BINARY DATA BLOCK. 00978 C* 00979 C******************************************************************** 00980 C 00981 C 00982 C 00983 C*** 00984 C* GET LENGTH OF BINARY DATA BLOCK. 00985 C*** 00986 C 00987 C 00988 IPW = KWORD 00989 IPB = IOFF 00990 C 00991 CALL GBYTE_MF (KGRIB(KWORD),ILLBIN,IOFF,24) 00992 ILBIN=ILLBIN 00993 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00994 IF (KERR.NE.0) THEN 00995 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 00996 RETURN 00997 ENDIF 00998 C 00999 C 01000 C 01001 C 01002 C*** 01003 C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET. 01004 C*** 01005 C 01006 CALL GBYTE_MF (KGRIB(KWORD),ILFLAG,IOFF,8) 01007 IFLAG=ILFLAG 01008 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01009 IF (KERR.NE.0) THEN 01010 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01011 RETURN 01012 ENDIF 01013 C 01014 IF (ISNEW.EQ.0) 01015 C THEN 01016 C OLD VERSION OF CODE 01017 C 01018 C 0000---- GRID POINT 01019 C 0001---- SPHERICAL HARMONICS 01020 C 01021 IREP = IFLAG / 16 01022 ILNIL = IFLAG - IREP * 16 01023 C 01024 ELSE 01025 C NEW VERSION OF CODE 01026 C 01027 C 0000---- GRID POINT 01028 C 1000---- SPHERICAL HARMONICS 01029 C 1100---- -''- COMPLEX PACKING 01030 C 01031 IREP = IFLAG / 128 01032 ILNIL = MOD(IFLAG,16) 01033 C 01034 ENDIF 01035 C 01036 C 01037 C 01038 C 01039 C 01040 C 01041 C 01042 C 01043 C*** 01044 C* GET SCALE FACTOR 01045 C*** 01046 C 01047 CALL GBYTE_MF (KGRIB(KWORD),ILSCALX,IOFF,16) 01048 ISCALX=ILSCALX 01049 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01050 IF (KERR.NE.0) THEN 01051 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01052 RETURN 01053 ENDIF 01054 C 01055 IF (ISCALX.LE.2**15) THEN 01056 ISCALE = ISCALX 01057 ELSE 01058 ISCALE = 2**15 - ISCALX 01059 ENDIF 01060 C 01061 C 01062 C 01063 C 01064 C*** 01065 C* GET REFERENCE VALUE (PMIN) IN GRIB FORMAT (IEXP,IMANT) 01066 C*** 01067 C 01068 C 01069 CALL GBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01070 IEXP=ILEXP 01071 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01072 IF (KERR.NE.0) THEN 01073 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01074 RETURN 01075 ENDIF 01076 CALL GBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01077 IMANT=ILMANT 01078 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01079 IF (KERR.NE.0) THEN 01080 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01081 RETURN 01082 ENDIF 01083 C 01084 C 01085 C CHECK FOR MISSING DATA INDICATORS. 01086 C 01087 IMISS = 0 01088 IF (ISCALX.EQ.65535.AND.IEXP.EQ.255.AND.IMANT.EQ.16777215) 01089 C IMISS = 1 01090 C 01091 C 01092 C 01093 C*** 01094 C* GET NUMBER OF BITS IN EACH DATA VALUE. 01095 C*** 01096 C 01097 CALL GBYTE_MF (KGRIB(KWORD),ILBITS,IOFF,8) 01098 KBITS=ILBITS 01099 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01100 IF (KERR.NE.0) THEN 01101 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01102 RETURN 01103 ENDIF 01104 C 01105 C 01106 C CHECK NUMBER OF BITS PER DATA FIELD. 01107 C 01108 IF (KBITS.GT.KNBIT.OR.KBITS.GT.IMAX) 01109 C THEN 01110 KERR = -1 01111 WRITE (*,9002) KBITS,KNBIT,IMAX 01112 9002 FORMAT (1H ,'NUMBER OF BITS PER DATA VALUE, ',I3, 01113 C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ', 01114 C ' PERMITTED VALUE, ',I3) 01115 CALL SDL_SRLABORT 01116 C 01117 ELSEIF (LDARPE) THEN 01118 C 01119 C Minimum value given as input argument... it has not been decoded 01120 C before as stored in GRIB field (should be zero). 01121 C But the scale factor may be computed, now. 01122 C 01123 ZSCALE= ( PMAX - PMIN ) / FLOAT ( 2**KBITS-1 ) 01124 C 01125 ELSEIF (IMISS.EQ.0) THEN 01126 C 01127 C 01128 C CONVERT REFERENCE VALUE AND SCALE FACTOR. 01129 C 01130 C 01131 CALL DECFP_MF (PMIN,IEXP,IMANT) 01132 ZSCALE = 2.**ISCALE 01133 PMAX=PMIN+FLOAT (2**(KBITS+1)-3) * 2.** (ISCALE-1) 01134 C 01135 ENDIF 01136 C 01137 C** 01138 C* IF COMPLEX PACKING GET ADDITIONAL PARAMETERS 01139 C** 01140 IF(IFLAG.GE.192) THEN 01141 C 01142 C GET START OCTET OF PACKED DATA 01143 C 01144 CALL GBYTE_MF (KGRIB(KWORD),ILSPDA,IOFF,16) 01145 ISPDA=ILSPDA 01146 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01147 IF (KERR.NE.0) THEN 01148 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01149 RETURN 01150 ENDIF 01151 IPREMC=1+(8*ISPDA-1)/KNBIT 01152 C 01153 IF (IPREMC.GT.KLENF) THEN 01154 KERR=-3 01155 WRITE (*,9004) KLENF,ISPDA 01156 9004 FORMAT (' OUTPUT ARRAY LENGTH (',I7, 01157 S ' WORDS) TOO SHORT, START OCTET OF PACKED DATA =', 01158 S I9) 01159 CALL SDL_SRLABORT 01160 ENDIF 01161 C 01162 C GET LAPLACIAN SCALING FACTOR 01163 C 01164 CALL GBYTE_MF (KGRIB(KWORD),ILSCALP,IOFF,16) 01165 KSCALP=ILSCALP 01166 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01167 C 01168 IF (KERR.NE.0) THEN 01169 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01170 RETURN 01171 ELSEIF (KSCALP.GT.2**15) THEN 01172 KSCALP=2**15-KSCALP 01173 ENDIF 01174 C 01175 C GET TRUNCATION OF UNPACKED COEFFS. 01176 C 01177 DO 430 J=1,3 01178 CALL GBYTE_MF (KGRIB(KWORD),ILCPACK,IOFF,8) 01179 KCPACK=ILCPACK 01180 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01181 IF (KERR.NE.0) THEN 01182 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01183 RETURN 01184 ENDIF 01185 430 CONTINUE 01186 C 01187 C COMPUTE NUMBER OF UNPACKED DATA ITEMS 01188 C 01189 IREP=(KCPACK+1)**2 01190 ENDIF 01191 C 01192 C*** 01193 C* IF DATA IS IN SPHERICAL HARMONIC FORM, NEXT OCTETS 01194 C* CONTAIN UNPACKED COEFFICIENT(S). 01195 C*** 01196 C 01197 IF (IREP.NE.0) 01198 C THEN 01199 C 01200 C EVENTUALLY, 01201 C GET UNPACKED COEFFICIENTS IN GRIB FORMAT AND 01202 C CONVERT TO FLOATING POINT. 01203 C 01204 IF (IMISS.EQ.1) THEN 01205 C 01206 DO 440 J=1,IREP 01207 PFDATA(J)=0. 01208 440 CONTINUE 01209 C 01210 ELSEIF (LDARPE) THEN 01211 C 01212 C The "unpacked" values should then contain zeroes, 01213 C and are skipped: the corresponding values of PFDATA array 01214 C are then not provided. A positioning in KGRIB is made. 01215 C 01216 CALL OFFSET_MF (IOFF,IREP,KWORD,32,KNBIT,KLENG,KERR) 01217 IF (KERR.NE.0) THEN 01218 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01219 RETURN 01220 ENDIF 01221 C 01222 ELSE 01223 C 01224 DO 450 J=1,IREP 01225 CALL GBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01226 IEXP=ILEXP 01227 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01228 IF (KERR.NE.0) THEN 01229 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01230 RETURN 01231 ENDIF 01232 CALL GBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01233 IMANT=ILMANT 01234 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01235 IF (KERR.NE.0) THEN 01236 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01237 RETURN 01238 ENDIF 01239 CALL DECFP_MF (PFDATA(J),IEXP,IMANT) 01240 450 CONTINUE 01241 C 01242 ENDIF 01243 C 01244 IF (IFLAG.GE.192) THEN 01245 C 01246 C Proper positioning on start octet of packed data, because 01247 C it may be not the first octet following the "unpacked" data. 01248 C 01249 ISSUIV=19+IREP*4 01250 C 01251 IF (ISSUIV.LT.ISPDA) THEN 01252 CALL OFFSET_MF (IOFF,ISPDA-ISSUIV,KWORD,8,KNBIT,KLENG,KERR) 01253 IF (KERR.NE.0) THEN 01254 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01255 RETURN 01256 ENDIF 01257 ENDIF 01258 C 01259 ENDIF 01260 C 01261 ENDIF 01262 C 01263 C 01264 C 01265 C 01266 C***** 01267 C* DECODE DATA VALUES TO FLOATING POINT AND STORE IN PFDATA. 01268 C***** 01269 C 01270 C FIRST CALCULATE THE NUMBER OF DATA VALUES. 01271 C 01272 KJLENF = ILBIN - 11 - IREP * 4 01273 IF(IFLAG.GE.192) KJLENF=KJLENF-7-(ISPDA-ISSUIV) 01274 KJLENF = (KJLENF * 8 - ILNIL) / KBITS 01275 C 01276 C CHECK LENGTH OF OUTPUT ARRAY. 01277 C 01278 IF (KJLENF+IREP.GT.KLENF) 01279 C THEN 01280 KERR = -3 01281 WRITE (*,9003) KJLENF,KLENF 01282 9003 FORMAT (1H ,'NUMBER OF VALUES TO BE DECODED IS - ',I7, 01283 C ', ARRAY SIZE - ',I7) 01284 CALL SDL_SRLABORT 01285 ENDIF 01286 C 01287 IF (IMISS.EQ.0.AND.ZSCALE.GT.0.) THEN 01288 CALL GSBYTE_MF (KGRIB(KWORD),PFDATA(IREP+1),IOFF,KBITS,0,KJLENF, 01289 S KNBIT,'D',KLENG,KERR,KWORD,.TRUE.) 01290 IF (KERR.NE.0) THEN 01291 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01292 RETURN 01293 ENDIF 01294 CALL UNPAGB (PFDATA(IREP+1),PFDATA(IREP+1),PMIN,PMAX,KBITS, 01295 S ZSCALE,KJLENF,LDARPE) 01296 ELSE 01297 C 01298 IF (ZSCALE.LE.0.) THEN 01299 C 01300 DO 460 J= IREP+1,IREP+KJLENF 01301 PFDATA(J) = PMIN 01302 460 CONTINUE 01303 C 01304 ELSE 01305 C 01306 DO 470 J= IREP+1,IREP+KJLENF 01307 PFDATA(J) = 0. 01308 470 CONTINUE 01309 C 01310 ENDIF 01311 C 01312 CALL OFFSET_MF (IOFF,KJLENF,KWORD,KBITS,KNBIT,KLENG,KERR) 01313 IF (KERR.NE.0) THEN 01314 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01315 RETURN 01316 ENDIF 01317 ENDIF 01318 C 01319 C 01320 C INCLUDE UNPACKED COEFFICIENT IN COUNT, IF SPHERICAL HARMONIC DATA. 01321 C 01322 KJLENF = IREP + KJLENF 01323 C 01324 C 01325 C 01326 C 01327 C*** 01328 C* SKIP ANY ZERO FILL AT END OF DATA BLOCK. 01329 C*** 01330 C 01331 IL = (KWORD-IPW) * KNBIT + IOFF -IPB 01332 IL = ILBIN * 8 - IL 01333 C 01334 IF (IL.NE.0) THEN 01335 CALL OFFSET_MF (IOFF,1,KWORD,IL,KNBIT,KLENG,KERR) 01336 IF (KERR.NE.0) THEN 01337 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01338 RETURN 01339 ENDIF 01340 ENDIF 01341 C 01342 C 01343 C 01344 C 01345 C******************************************************************** 01346 C* 01347 C* BLOCK 5 - END BLOCK. 01348 C* 01349 C******************************************************************** 01350 C 01351 C CHECK 7 7 7 7 AT END OF CODED DATA. 01352 C 01353 C 01354 INVAL=4 01355 ILBVAL=8 01356 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,ILBVAL,0,INVAL, 01357 S KNBIT,'D',KLENG,KERR,KWORD,.FALSE.) 01358 IBLOCK=ILBLOCK 01359 IF (KERR.NE.0) THEN 01360 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01361 RETURN 01362 ENDIF 01363 C 01364 C 55 IS THE VALUE OF ASCII CHARACTER '7' 01365 C 01366 DO 600 J=1,INVAL 01367 IF (IBLOCK(J).NE.55) KERR = 1 01368 600 CONTINUE 01369 C 01370 IF (KERR.EQ.1) WRITE (*,*) ' NO 7777 GROUP FOUND ' 01371 C 01372 C 01373 C 01374 C SET NUMBER OF VALUES NEGATIVE, IF MISSING DATA VALUES. 01375 C 01376 IF (IMISS.EQ.1) KJLENF = - KJLENF 01377 C 01378 IF (LHOOK) CALL DR_HOOK('DECOGA',1,ZHOOK_HANDLE) 01379 END