SURFEX v7.3
General documentation of Surfex
|
00001 SUBROUTINE CODEGA (PFDATA,KLENF,KBITS,KNBIT,KB1PAR, 00002 C KB2PAR,PVERT,KLENV,KGRIB,KLENG,KWORD, 00003 C KROUND,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* NAME : CODEGA 00011 C* 00012 C* FUNCTION : CODE ARRAY OF FLOATING POINT VALUES 00013 C* IN WMO GRIB CODE. 00014 C* 00015 C* INPUT : PARAMETERS FOR BLOCK 1 , PRODUCT DEFINITION BLOCK. 00016 C* -------------------------------------------------- 00017 C* KB1PAR - INTEGER ARRAY (DIMENSION 19) OF PRODUCT 00018 C* DEFINITION INFORMATION. 00019 C* 00020 C* WORD CONTENTS 00021 C* ---- -------- 00022 C* 1 ORIGINATING CENTRE IDENTIFIER. 00023 C* 2 MODEL IDENTIFICATION. 00024 C* 3 GRID DEFINITION. 00025 C* 4 FLAG ( CODE TABLE 1 ). 00026 C* 5 PARAMETER IDENTIFIER (CODE TABLE 2). 00027 C* 6 TYPE OF LEVEL (CODE TABLE 3). 00028 C* 7-8 VALUE(S) OF LEVEL (CODE TABLE 3). 00029 C* 9 YEAR OF DATA 00030 C* 10 MONTH OF DATA 00031 C* 11 DAY OF DATA 00032 C* 12 HOUR OF DATA 00033 C* 13 MINUTE OF DATA 00034 C* 14 TIME UNIT (CODE TABLE 4). 00035 C* 15 TIME RANGE ONE 00036 C* 16 TIME RANGE TWO 00037 C* 17 TIME RANGE FLAG (CODE TABLE 5). 00038 C* 18 NUMBER AVERAGED OR ACCUMULATED. 00039 C* 19 NUMBER MISSING FROM AVERAGES/ACCUMULATIONS. 00040 C* 00041 C* VALUE(S) OF LEVEL CAN OCCUPY 2 WORDS. 00042 C* FOR A LAYER THE FIRST WORD DEFINES THE TOP 00043 C* AND THE SECOND THE BOTTOM OF THE LAYER. 00044 C* FOR A SINGLE LEVEL, ONLY THE FIRST WORD IS 00045 C* USED. 00046 C* 00047 C* PARAMETERS FOR BLOCK 2 , GRID DEFINITION BLOCK. 00048 C* ----------------------------------------------- 00049 C* KB2PAR - INTEGER ARRAY (DIMENSION 17) CONTAINING GRID 00050 C* DEFINITION INFORMATION. 00051 C* USE VARIES WITH REPRESENTATION TYPE. 00052 C* 00053 C* WORD LAT/LONG GRID 00054 C* ---- ------------- 00055 C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6) 00056 C* 2 NO. OF POINTS ALONG A LATITUDE 00057 C* 3 NO. OF POINTS ALONG A MERIDIAN 00058 C* 4 LATITUDE OF ORIGIN (SOUTH - IVE). 00059 C* 5 LONGITUDE OF ORIGIN (WEST - IVE). 00060 C* 6 RESOLUTION FLAG. (CODE TABLE 7) 00061 C* 7 LATITUDE OF EXTREME POINT (SOUTH - IVE). 00062 C* 8 LONGITUDE OF EXTREME POINT (WEST - IVE). 00063 C* 9 LATITUDE INCREMENT 00064 C* 10 LONGITUDE INCREMENT 00065 C* 11 SCANNING MODE FLAGS (CODE TABLE 8) 00066 C* 00067 C* WORD GAUSSIAN GRID 00068 C* ---- ------------- 00069 C* 1-9 AS FOR LAT/LONGITUDE GRID. 00070 C* 10 THE NUMBER OF LATITUDE LINES BETWEEN A POLE 00071 C* AND THE EQUATOR. 00072 C* 11 SCANNING MODE FLAGS (CODE TABLE 8) 00073 C* 00074 C* WORD SPHERICAL HARMONICS 00075 C* ---- ------------------- 00076 C* 1 DATA REPRESENTATION TYPE (CODE TABLE 6) 00077 C* 2 J - PENTAGONAL RESOLUTION PARAMETER 00078 C* 3 K - PENTAGONAL RESOLUTION PARAMETER 00079 C* 4 M - PENTAGONAL RESOLUTION PARAMETER 00080 C* 5 REPRESENTATION TYPE (CODE TABLE 9) 00081 C* 6 REPRESENTATION MODE (CODE TABLE 10) 00082 C* 7-11 NOT USED 00083 C* 00084 C* 00085 C* USE FOR OTHER DATA REPRESENTATION TYPES IS 00086 C* TO BE DEFINED LATER. 00087 C* 00088 C* PVERT - REAL ARRAY OF VERTICAL COORDINATE PARAMETERS 00089 C* KLENV - LENGTH OF THIS ARRAY (NUMBER OF COORDINATE 00090 C* PARAMETERS). 00091 C* 00092 C* USED FOR HYBRID LEVELS ONLY. 00093 C* 00094 C* 00095 C* PARAMETERS FOR BLOCK 3 , BIT-MAP DEFINITION BLOCK. 00096 C* -------------------------------------------------- 00097 C* 00098 C* TO BE DEFINED LATER. 00099 C* 00100 C* PARAMETERS FOR BLOCK 4 , BINARY DATA BLOCK. 00101 C* ------------------------------------------- 00102 C* PFDATA - ARRAY OF FLOATING POINT VALUES. 00103 C* 00104 C* **** 00105 C* VALUES IN THIS ARRAY ARE OVERWRITTEN 00106 C* BY THE SUBROUTINE. 00107 C* **** 00108 C* 00109 C* KLENF - LENGTH OF THIS ARRAY (NUMBER OF DATA 00110 C* VALUES TO BE CODED) 00111 C* KBITS - NUMBER OF BITS FOR CODED DATA VALUES. 00112 C* 00113 C* KCPACK - KCPACK GREATER THAN ZERO INDICATES COMPLEX 00114 C* PACKING, WITH A *TRIANGULAR* SUB-TRUNCATION 00115 C* "UNPACKED" OF ORDER KCPACK. 00116 C 00117 C* KSCALP - FOR COMPLEX PACKING OF SPECTRAL COEFFICIENTS 00118 C* ONLY, LAPLACIAN SCALING FACTOR. 00119 C* 00120 C* TO INDICATE MISSING DATA VALUES, KLENF IS 00121 C* MADE NEGATIVE AND ALL DATA VALUES SET TO 0. 00122 C* 00123 C* OTHER PARAMETERS 00124 C* ---------------- 00125 C* 00126 C* KNBIT - NUMBER OF BITS IN COMPUTER WORD. 00127 C* 00128 C* KGRIB - ARRAY TO RECEIVE DATA IN GRIB CODE. 00129 C* KLENG - LENGTH OF THIS ARRAY. 00130 C* 00131 C* KROUND - 0 , NO ROUNDING. 00132 C* 1 , ROUND TO NEAREST 120 OCTETS. 00133 C* 00134 C* LDARPE - .TRUE., modifications for ARPEGE coding. 00135 C* .FALSE., no such modifications. 00136 C* 00137 C* OUTPUT : KGRIB - DATA CODED IN GRIB CODE. 00138 C* KWORD - NUMBER OF WORDS OCCUPIED BY CODED DATA. 00139 C* 00140 C* KERR - ERROR INDICATOR. 00141 C* 00142 C* 0, NO ERROR. 00143 C* 00144 C* -1, NUMBER OF BITS PER DATA VALUE EXCEEDS 00145 C* WORD LENGTH, OR MAXIMUM ALLOWED. 00146 C* -2, OUTPUT ARRAY TOO SMALL TO HOLD CODED 00147 C* DATA VALUES. 00148 C* -3, CURRENTLY UNDEFINED OPTION SELECTED. 00149 C* -4, MISSING DATA FIELD CONTAINS NON-ZERO. 00150 C* -5, INVALID COMPLEX PACKING MODE. 00151 C* -6, INVALID LAPLACIAN SCALING FACTOR. 00152 C* 00153 C* 1, INVALID ORIGINATING CENTRE. 00154 C* 2, INVALID MODEL IDENTIFICATION. 00155 C* 3, INVALID GRID DEFINITION. 00156 C* 4, INVALID BLOCK INDICATOR FLAG 00157 C* 5, INVALID PARAMETER IDENTIFIER. 00158 C* 6, INVALID LEVEL TYPE INDICATOR. 00159 C* 7, ERROR IN DESCRIPTION OF LEVELS. 00160 C* 8, DATE/TIME ERROR. 00161 C* 9, INVALID TIME UNIT OR RANGE. 00162 C* 10, INVALID DATA REPRESENTATION TYPE. 00163 C* 11, INVALID EXTREME POINT/INCREMENT FLAG. 00164 C* 12, INVALID SCANNING MODE FLAGS. 00165 C* 13, INVALID COMPLEX PACKING MODE. 00166 C* 00167 C* PMIN - MINIMUM VALUE OF THE FIELD DATA. 00168 C* 00169 C* PMAX - MAXIMUM VALUE OF THE FIELD DATA. 00170 C* 00171 C* JOHN HENNESSY , ECMWF , NOVEMBER 1985 00172 C* 00173 C* Modifications by Mats HAMRUD, ECMWF, to handle complex packing of 00174 C* spectral harmonics data, 1988. 00175 C* 00176 C* Modifications by Jean CLOCHARD, French DMN, January 1990: 00177 C* 00178 C* - to remove automatic arrays introduced by the last modification 00179 C* ( *** BUT INPUT ARRAY PFDATA IS OVERWRITTEN AGAIN *** ); 00180 C* - to comply with the "DOCTOR" norm; 00181 C* - to use (standard case) as reference value the highest 32-bit 00182 C* value not exceeding the minimum of the field, this reference 00183 C* value being used to compute departures from this value; 00184 C* - to allow modifications of the packing for ARPEGE files use, 00185 C* in an optional way. 00186 C* 00187 C******************************************************************** 00188 C 00189 C 00190 C 00191 C 00192 C 00193 C 00194 #include "precision.h" 00195 C 00196 INTEGER KLENF, KBITS, KNBIT, KLENG, KWORD, KROUND, KCPACK, KSCALP 00197 INTEGER KERR, KLENV 00198 C 00199 REAL (KIND=JPDBLR) PFDATA(*), PVERT(KLENV) 00200 C 00201 REAL (KIND=JPDBLR) PMIN, PMAX 00202 C 00203 LOGICAL LDARPE 00204 C 00205 INTEGER (KIND=JPDBLE) KGRIB(KLENG) 00206 INTEGER KB1PAR(19), KB2PAR(17) 00207 C 00208 INTEGER IMAX, ILENF, IMISS, J, IBYTE, INVAL, IOFF, ITEMP, IERR 00209 INTEGER IERY, IERD, IERM, IERH, IERN, I, IEXP, IMANT, IPW, IPB 00210 INTEGER IREP, IFLAG, ICPACK, ILEN, ISCALE, ISCALX, ISTPA, IRESTE 00211 INTEGER ISCALP, IAUXIL, ILENFM, ILBIN, IL, ILNIL, IBITS, INUMBI 00212 INTEGER (KIND=JPDBLE) IL8, ILEXP, ILMANT, ILFLAG, ILSCALX 00213 INTEGER (KIND=JPDBLE) ILAUXIL, ILLBIN, ILBITS, ILSTPA, ILSCALP 00214 C 00215 INTEGER IBLOCK(24) 00216 INTEGER ILAT(2) 00217 INTEGER (KIND=JPDBLE) ILBLOCK(24), ILB2PAR(17), ILLAT(2) 00218 C 00219 REAL (KIND=JPDBLR) ZCOEFF, ZEPSIL, ZAUXIL, ZSCALE, ZS, ZREFER 00220 REAL (KIND=JPDBLR) ZAUXI2 00221 C 00222 C SET MAXIMUM NUMBER OF BITS PER DATA FIELD. 00223 C 00224 SAVE IMAX 00225 DATA IMAX /60/ 00226 C 00227 C CLEAR ERROR INDICATOR. 00228 C 00229 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00230 IF (LHOOK) CALL DR_HOOK('CODEGA',0,ZHOOK_HANDLE) 00231 KERR = 0 00232 C 00233 C 00234 C 00235 C 00236 C 00237 C******************************************************************** 00238 C* 00239 C* CHECK FOR MISSING DATA INDICATORS. 00240 C* 00241 C******************************************************************** 00242 C 00243 C 00244 IF (KLENF.LT.0) 00245 C THEN 00246 ILENF = - KLENF 00247 IMISS = 1 00248 C 00249 DO 50 J=1,ILENF 00250 C 00251 IF (PFDATA(J).NE.0.) THEN 00252 KERR = -4 00253 WRITE (*,9012) 00254 9012 FORMAT (TR1,'NON-ZERO VALUE IN MISSING DATA', 00255 C ' FIELD.') 00256 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00257 RETURN 00258 ENDIF 00259 50 CONTINUE 00260 C 00261 ELSE 00262 ILENF = KLENF 00263 IMISS = 0 00264 ENDIF 00265 C 00266 C 00267 C 00268 C 00269 C******************************************************************** 00270 C* 00271 C* CHECK NUMBER OF BITS PER DATA FIELD. 00272 C* 00273 C******************************************************************** 00274 C 00275 C 00276 IF (KBITS.GT.KNBIT.OR.KBITS.GT.IMAX) 00277 C THEN 00278 KERR = -1 00279 WRITE (*,9000) KBITS,KNBIT,IMAX 00280 9000 FORMAT (TR1,'NUMBER OF BITS PER DATA VALUE, ',I3, 00281 C 'EXCEEDS WORD LENGTH, ',I3,' OR MAXIMUM ', 00282 C ' PERMITTED VALUE, ',I3) 00283 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00284 RETURN 00285 ENDIF 00286 C 00287 C 00288 C 00289 C 00290 C 00291 C 00292 C 00293 C 00294 C 00295 C 00296 C 00297 C******************************************************************** 00298 C* 00299 C* BLOCK 0 - INDICATOR BLOCK. 00300 C* 00301 C******************************************************************** 00302 C 00303 C 00304 C 00305 C*** 00306 C* THE LETTERS G R I B ARE INSERTED IN THE 00307 C* FIRST 4 ELEMENTS OF 'IBLOCK'. 00308 C*** 00309 C 00310 IBLOCK(1) = 71 00311 IBLOCK(2) = 82 00312 IBLOCK(3) = 73 00313 IBLOCK(4) = 66 00314 C 00315 KWORD = 1 00316 IBYTE = 8 00317 INVAL = 4 00318 IOFF = 0 00319 C 00320 C PACK 4 8-BIT FIELDS IN BLOCK 0 OF CODED ARRAY. 00321 C 00322 ILBLOCK=IBLOCK 00323 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,IBYTE,0,INVAL, 00324 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 00325 IF (KERR.NE.0) THEN 00326 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00327 RETURN 00328 ENDIF 00329 C 00330 C 00331 C 00332 C 00333 C 00334 C 00335 C 00336 C 00337 C******************************************************************** 00338 C* 00339 C* BLOCK 1 - PRODUCT DEFINITION BLOCK. 00340 C* 00341 C******************************************************************** 00342 C 00343 C 00344 C 00345 C*** 00346 C* LENGTH OF BLOCK 1 (IN OCTETS) IN FIRST 3 OCTETS. 00347 C*** 00348 C 00349 IBLOCK(1) = 0 00350 IBLOCK(2) = 0 00351 IBLOCK(3) = 24 00352 C 00353 C 00354 C 00355 C 00356 C*** 00357 C* FOURTH OCTET RESERVED AND SET TO 0. 00358 C*** 00359 C 00360 IBLOCK(4) = 0 00361 C 00362 C 00363 C 00364 C 00365 C 00366 C 00367 C*** 00368 C* IDENTIFICATION OF CENTRE 00369 C*** 00370 IBLOCK(5) = KB1PAR(1) 00371 IF (KB1PAR(1).LT.1.OR.KB1PAR(1).GT.98) 00372 C THEN 00373 KERR = 1 00374 WRITE (*,9001) KB1PAR(1) 00375 9001 FORMAT (TR1,'INVALID ORIGINATING CENTRE ',I3) 00376 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00377 RETURN 00378 ENDIF 00379 C 00380 C 00381 C 00382 C 00383 C 00384 C 00385 C 00386 C*** 00387 C* MODEL IDENTIFICATION 00388 C*** 00389 C 00390 IBLOCK(6) = KB1PAR(2) 00391 IF (KB1PAR(2).LT.1.OR.KB1PAR(2).GT.255) 00392 C THEN 00393 KERR = 2 00394 WRITE (*,9002) KB1PAR(2) 00395 9002 FORMAT (TR1,'INVALID MODEL IDENTIFICATION ',I4) 00396 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00397 RETURN 00398 ENDIF 00399 C 00400 C 00401 C 00402 C 00403 C 00404 C 00405 C 00406 C 00407 C*** 00408 C* GRID DEFINITION 00409 C*** 00410 C 00411 IBLOCK(7) = KB1PAR(3) 00412 IF (KB1PAR(3).LT.1.OR.KB1PAR(3).GT.255) 00413 C THEN 00414 KERR = 3 00415 WRITE (*,9003) KB1PAR(3) 00416 9003 FORMAT (TR1,'INVALID GRID IDENTIFICATION ',I4) 00417 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00418 RETURN 00419 ENDIF 00420 C 00421 C 00422 C 00423 C 00424 C 00425 C 00426 C 00427 C 00428 C*** 00429 C* OPTIONAL BLOCK INDICATOR FLAGS ( CODE TABLE 1 ). 00430 C*** 00431 C 00432 C BLOCKS INCLUDED BINARY VALUE DECIMAL VALUE 00433 C 00434 C NONE 00000000 0 00435 C 2 10000000 128 00436 C 3 01000000 64 00437 C 2 AND 3 11000000 192 00438 C 00439 IBLOCK(8) = KB1PAR(4) 00440 C 00441 C SHIFT 2-BIT FLAG FIELD RIGHT BY 6 BITS TO FACILITATE CHECKING 00442 C 00443 ITEMP = KB1PAR(4) / 64 00444 C 00445 IF (ITEMP.LT.0.OR.ITEMP.GT.3) KERR = 4 00446 C 00447 C CHECK IF GRID SPECIFIED IS UNCATALOGUED. 00448 C 00449 IF (KB1PAR(3).EQ.255.AND.KB1PAR(4).EQ.0) KERR = 4 00450 IF (KB1PAR(3).EQ.255.AND.KB1PAR(4).EQ.64) KERR = 4 00451 C 00452 IF (KERR.NE.0) THEN 00453 CALL PRTBIN_MF (KB1PAR(4),8,ITEMP,IERR) 00454 WRITE (*,9004) ITEMP 00455 9004 FORMAT (TR1,'INVALID BLOCK INDICATOR FLAG ',I8.8) 00456 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00457 RETURN 00458 ENDIF 00459 C 00460 C 00461 C 00462 C 00463 C*** 00464 C* PARAMETER IDENTIFIER ( CODE TABLE 2 ). 00465 C*** 00466 C 00467 IBLOCK(9) = KB1PAR(5) 00468 IF (KB1PAR(5).LT.0.OR.KB1PAR(5).GT.255) 00469 C THEN 00470 KERR = 5 00471 WRITE (*,9005) KB1PAR(5) 00472 9005 FORMAT (TR1,'INVALID PARAMETER ',I4) 00473 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00474 RETURN 00475 ENDIF 00476 C 00477 C 00478 C 00479 C 00480 C*** 00481 C* INDICATOR OF LEVEL TYPE ( CODE TABLE 3 ). 00482 C*** 00483 C 00484 IBLOCK(10) = KB1PAR(6) 00485 C 00486 C* CODE FIGURES FOR LEVEL TYPE RANGE FROM 0 - 210, WITH 200 00487 C BEING USED FOR PSEUDO-LEVELS. 00488 C 00489 IF (KB1PAR(6).LT.0.OR.KB1PAR(6).GT.210) KERR = 6 00490 IF (KERR.EQ.6) 00491 C THEN 00492 WRITE (*,9006) KB1PAR(6) 00493 9006 FORMAT (TR1,'INVALID LEVEL TYPE ',I4) 00494 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00495 RETURN 00496 ENDIF 00497 C 00498 C 00499 C 00500 C 00501 C 00502 C 00503 C 00504 C 00505 C 00506 C 00507 C 00508 C 00509 C 00510 C 00511 C 00512 C 00513 C 00514 C*** 00515 C* DESCRIPTION OF LEVEL OR LAYER ( CODE TABLE 3 ). 00516 C*** 00517 C 00518 C 00519 C 00520 C FOR CERTAIN SPECIAL LEVELS NO FURTHER DESCRIPTION IS 00521 C NECESSARY, AND THE FIELDS ARE SET TO 0. 00522 C 00523 IF (KB1PAR(6).LT.100.OR.KB1PAR(6).EQ.102) 00524 C THEN 00525 KB1PAR(7) = 0 00526 KB1PAR(8) = 0 00527 ENDIF 00528 C 00529 IBLOCK(11) = KB1PAR(7) 00530 IBLOCK(12) = KB1PAR(8) 00531 C 00532 C CERTAIN LEVEL TYPES REQUIRE THAT THE DESCRIPTION OCCUPY 00533 C BOTH 8 BIT FIELDS. 00534 C 00535 IF( (KB1PAR(6).NE. 20).AND. 00536 X (KB1PAR(6).NE.100).AND. 00537 X (KB1PAR(6).NE.103).AND. 00538 X (KB1PAR(6).NE.105).AND. 00539 X (KB1PAR(6).NE.107).AND. 00540 X (KB1PAR(6).NE.109).AND. 00541 X (KB1PAR(6).NE.111).AND. 00542 X (KB1PAR(6).NE.113).AND. 00543 X (KB1PAR(6).NE.115).AND. 00544 X (KB1PAR(6).NE.117).AND. 00545 X (KB1PAR(6).NE.125).AND. 00546 X (KB1PAR(6).NE.127).AND. 00547 X (KB1PAR(6).NE.160).AND. 00548 X (KB1PAR(6).NE.210) ) THEN 00549 C 00550 IF (KB1PAR(7).GT.255.OR.KB1PAR(8).GT.255) KERR = 7 00551 ELSE 00552 C 00553 C 8 LOW ORDER BITS IN IBLOCK(12) 00554 C HIGH ORDER BITS IN IBLOCK(11) 00555 C 00556 IBLOCK(12) = IBLOCK(11) 00557 IBLOCK(11) = IBLOCK(11) / 256 00558 IBLOCK(12) = IBLOCK(12) - IBLOCK(11) * 256 00559 C 00560 C CHECK MAXIMUM POSSIBLE IN 16 BITS. 00561 C 00562 IF (KB1PAR(7).GT.65535) KERR = 7 00563 ENDIF 00564 C 00565 IF (KERR.NE.0) 00566 C THEN 00567 WRITE (*,9007) KB1PAR(7),KB1PAR(8) 00568 9007 FORMAT (TR1,'LEVEL DESCRIPTION ERROR ',I8,3X,I8) 00569 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00570 RETURN 00571 ENDIF 00572 C 00573 C 00574 C 00575 C 00576 C 00577 C 00578 C 00579 C 00580 C 00581 C 00582 C 00583 C 00584 C 00585 C 00586 C 00587 C 00588 C 00589 C 00590 C 00591 C 00592 C 00593 C 00594 C*** 00595 C* DATE AND TIME. CHECK VALID RANGES AND MISSING DATA VALUES. 00596 C*** 00597 C 00598 IBLOCK(13) = KB1PAR(9) 00599 IERY = 0 00600 IF (KB1PAR(9).LT.0.OR.KB1PAR(9).GT.99) IERY = 1 00601 IF (KB1PAR(9).EQ.255) IERY = 0 00602 IBLOCK(14) = KB1PAR(10) 00603 IERM = 0 00604 IF (KB1PAR(10).LT.1.OR.KB1PAR(10).GT.12) IERM = 1 00605 IF (KB1PAR(10).EQ.255) IERM = 0 00606 IBLOCK(15) = KB1PAR(11) 00607 IERD = 0 00608 IF (KB1PAR(11).LT.1.OR.KB1PAR(11).GT.31) IERD = 1 00609 IF (KB1PAR(11).EQ.255) IERD = 0 00610 IBLOCK(16) = KB1PAR(12) 00611 IERH = 0 00612 IF (KB1PAR(12).LT.0.OR.KB1PAR(12).GT.23) IERH = 1 00613 IF (KB1PAR(12).EQ.255) IERH = 0 00614 IBLOCK(17) = KB1PAR(13) 00615 IERN = 0 00616 IF (KB1PAR(13).LT.0.OR.KB1PAR(13).GT.59) IERN = 1 00617 IF (KB1PAR(13).EQ.255) IERN = 0 00618 C 00619 KERR = IERY + IERM + IERD + IERH + IERN 00620 C 00621 IF (KERR.NE.0) 00622 C THEN 00623 KERR = 8 00624 WRITE (*,9008) KB1PAR(9),KB1PAR(10),KB1PAR(11),KB1PAR(12), 00625 C KB1PAR(13) 00626 9008 FORMAT (TR1,'INVALID DATE/TIME ',3I2,' / ',2I2) 00627 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00628 RETURN 00629 ENDIF 00630 C 00631 C 00632 C 00633 C 00634 C 00635 C 00636 C 00637 C 00638 C 00639 C 00640 C 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* UNIT OF TIME - ( CODE TABLE 4 ). 00655 C* TIME RANGE(S) AND TIME RANGE INDICATOR ( CODE TABLE 5 ). 00656 C*** 00657 C 00658 C TIME UNIT. 00659 C 00660 IBLOCK(18) = KB1PAR(14) 00661 IF (KB1PAR(14).LT.0.OR.KB1PAR(14).GT.7) KERR = 9 00662 C 00663 C* TIME UNIT CODES ARE IN THE RANGE 0 - 7, WITH 254 USED FOR SECONDS. 00664 C 00665 IF (KB1PAR(14).EQ.254) KERR = 0 00666 C 00667 C THERE CAN BE ONE OR TWO TIME RANGES, EACH IN 1 OCTECT OR 00668 C ONE TIME RANGE IN 2 OCTECTS. 00669 C 00670 IF (KB1PAR(17).EQ.0.OR.KB1PAR(17).EQ.1 00671 C .OR.KB1PAR(17).EQ.10) KB1PAR(16) = 0 00672 C 00673 C CROSS CHECK RANGE VALUES AND FLAG VALUES. 00674 C 00675 IF (KB1PAR(15).GT.65535.OR.KB1PAR(15).LT.0) KERR = 9 00676 IF (KB1PAR(15).GT.255.AND.KB1PAR(17).NE.10) KERR = 9 00677 IF (KB1PAR(16).GT.255.OR.KB1PAR(16).LT.0) KERR = 9 00678 IF (KB1PAR(17).LT.0.OR.KB1PAR(17).GT.10) KERR = 9 00679 IF (KERR.NE.0) 00680 C THEN 00681 WRITE (*,9009) KB1PAR(14),KB1PAR(15),KB1PAR(16),KB1PAR(17) 00682 9009 FORMAT (TR1,'TIME UNIT/TIME 1/TIME 2/INDICATOR ERROR - ', 00683 C I8,2X,'/',I8,2X,'/',I8,2X,'/',I8) 00684 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00685 RETURN 00686 ENDIF 00687 C 00688 IBLOCK(19) = KB1PAR(15) 00689 IBLOCK(20) = KB1PAR(16) 00690 C 00691 C ONE TIME RANGE OCCUPYING BOTH OCTETS. 00692 C 00693 IF (KB1PAR(17).EQ.10) 00694 C THEN 00695 C 8 LOW ORDER BITS IN IBLOCK(20) 00696 C HIGH ORDER BITS IN IBLOCK(19) 00697 C 00698 IBLOCK(20) = IBLOCK(19) 00699 IBLOCK(19) = IBLOCK(19) / 256 00700 IBLOCK(20) = IBLOCK(20) - IBLOCK(19) * 256 00701 ENDIF 00702 C 00703 C TIME RANGE INDICATOR 00704 C 00705 IBLOCK(21) = KB1PAR(17) 00706 C 00707 C 00708 C 00709 C 00710 C 00711 C 00712 C 00713 C*** 00714 C* NUMBER AVERAGED OR ACCUMULATED. 00715 C*** 00716 C 00717 IBLOCK(22) = 0 00718 IBLOCK(23) = 0 00719 C 00720 C 00721 C CHECK CONSISTENCY INDICATOR AND NUMBER FIELD. 00722 C 00723 IF (KB1PAR(17).EQ.3.AND.KB1PAR(18).EQ.0) 00724 C THEN 00725 KERR = 12 00726 WRITE (*,9013) KB1PAR(17),KB1PAR(18) 00727 9013 FORMAT (TR1,'INDICATOR/NUMBER AVERAGED ERROR - ', 00728 C I8,2X,'/',I8) 00729 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00730 RETURN 00731 ENDIF 00732 C 00733 C VALUE IN TWO OCTETS. 00734 C 00735 IBLOCK(22) = KB1PAR(18) 00736 C 00737 C 8 LOW ORDER BITS IN IBLOCK(23) 00738 C HIGH ORDER BITS IN IBLOCK(22) 00739 C 00740 IBLOCK(23) = IBLOCK(22) 00741 IBLOCK(22) = IBLOCK(22) / 256 00742 IBLOCK(23) = IBLOCK(23) - IBLOCK(22) * 256 00743 C 00744 C 00745 C 00746 C 00747 C 00748 C 00749 C*** 00750 C* NUMBER MISSING FROM AVERAGES/ACCUMULATIONS. 00751 C*** 00752 C 00753 IBLOCK(24) = KB1PAR(19) 00754 C 00755 C 00756 C 00757 C 00758 C 00759 C 00760 C 00761 C*** 00762 C* 00763 C* PACK 24 8-BIT FIELDS OF BLOCK 1 IN CODED ARRAY. 00764 C* 00765 C*** 00766 C 00767 IBYTE = 8 00768 INVAL = 24 00769 C 00770 ILBLOCK=IBLOCK 00771 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,IBYTE,0,INVAL, 00772 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 00773 IF (KERR.NE.0) THEN 00774 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00775 RETURN 00776 ENDIF 00777 C 00778 C 00779 C 00780 C 00781 C 00782 C 00783 C 00784 C 00785 C 00786 C 00787 C 00788 C 00789 C 00790 C 00791 C 00792 C 00793 C 00794 C 00795 C 00796 C 00797 C 00798 C 00799 C 00800 C 00801 C 00802 C 00803 C 00804 C 00805 C 00806 C 00807 C 00808 C******************************************************************** 00809 C* 00810 C* BLOCK 2 - GRID DESCRIPTION BLOCK. 00811 C* 00812 C******************************************************************** 00813 C 00814 C 00815 IF (KB1PAR(4).LT.128) GOTO 333 00816 C 00817 C 00818 C*** 00819 C* SET ARRAY IBLOCK TO 0 . IT IS USED TO ZERO FILL RESERVED OCTETS. 00820 C*** 00821 C 00822 DO 100 J=1,24 00823 IBLOCK(J) = 0 00824 100 CONTINUE 00825 C 00826 C 00827 C 00828 C 00829 C*** 00830 C* LAT/LONGITUDE GRID, GAUSSIAN GRID AND SPHERICAL HARMONICS 00831 C* ARE THE ONLY DATA REPRESENTATIONS HANDLED. 00832 C*** 00833 C 00834 IF (KB1PAR(4).EQ.128.OR.KB1PAR(4).EQ.192) 00835 C THEN 00836 IF (KB2PAR(1).NE.0.AND.KB2PAR(1).NE.4.AND.KB2PAR(1).NE.50 00837 C .AND.KB2PAR(1).NE.80) 00838 C THEN 00839 WRITE (*,*)'GRID DESCRIPTION BLOCK NOT YET DEFINED' 00840 KERR = -3 00841 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00842 RETURN 00843 ENDIF 00844 C 00845 C 00846 C 00847 C 00848 C*** 00849 C* LENGTH OF GRID DESCRIPTION BLOCK. 00850 C*** 00851 C 00852 C LENGTH IS 32 OCTETS FOR LAT/LONG, GAUSSIAN AND SPHERICAL 00853 C HARMONICS . FOR ANY DATA ON HYBRID LEVELS THE 00854 C VERTICAL COORDINATES ARE ADDED. 00855 C 00856 IF(KB2PAR(1).EQ.80) THEN 00857 I=52 00858 ELSE 00859 I = 32 00860 ENDIF 00861 IF (KB1PAR(6).GT.108) I = I + KLENV * 4 00862 C 00863 IL8=I 00864 CALL SBYTE_MF (KGRIB(KWORD),IL8,IOFF,24) 00865 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 00866 IF (KERR.NE.0) THEN 00867 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00868 RETURN 00869 ENDIF 00870 C 00871 C 00872 C 00873 C 00874 C*** 00875 C* NUMBER OF UNUSED BITS AT END OF BLOCK. 00876 C* CURRENT DEFINITION IMPLIES 0. 00877 C*** 00878 C 00879 ILBLOCK=IBLOCK 00880 CALL SBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,8) 00881 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00882 IF (KERR.NE.0) THEN 00883 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00884 RETURN 00885 ENDIF 00886 C 00887 C 00888 C 00889 C 00890 C 00891 C*** 00892 C* NEXT OCTET IS RESERVED. 00893 C*** 00894 C 00895 ILBLOCK=IBLOCK 00896 CALL SBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,8) 00897 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00898 IF (KERR.NE.0) THEN 00899 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00900 RETURN 00901 ENDIF 00902 C 00903 C 00904 C 00905 C 00906 C 00907 C 00908 C*** 00909 C* DATA REPRESENTATION TYPE. 00910 C*** 00911 C 00912 ILB2PAR=KB2PAR 00913 CALL SBYTE_MF (KGRIB(KWORD),ILB2PAR(1),IOFF,8) 00914 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 00915 IF (KERR.NE.0) THEN 00916 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00917 RETURN 00918 ENDIF 00919 C 00920 C 00921 C 00922 C 00923 C 00924 C 00925 C 00926 C 00927 C 00928 C 00929 C 00930 C 00931 C 00932 C 00933 C 00934 C 00935 C 00936 C 00937 C*** 00938 C* LAT/LONG OR GAUSSIAN GRID. 00939 C*** 00940 C 00941 IF (KB2PAR(1).EQ.0.OR.KB2PAR(1).EQ.4) 00942 C THEN 00943 C 00944 C NUMBER OF LAT/LONG POINTS. 00945 C 00946 ILB2PAR=KB2PAR 00947 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(2),IOFF,16,0,2, 00948 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 00949 IF (KERR.NE.0) THEN 00950 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00951 RETURN 00952 ENDIF 00953 C 00954 C LAT/LONG OF ORIGIN. 00955 C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE. 00956 C 00957 DO 200 J=1,2 00958 C 00959 IF (KB2PAR(J+3).GE.0) THEN 00960 ILAT(J) = KB2PAR(J+3) 00961 ELSE 00962 ILAT(J) = 2**23 - KB2PAR(J+3) 00963 ENDIF 00964 C 00965 200 CONTINUE 00966 C 00967 ILBLOCK=IBLOCK 00968 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,24,0,2, 00969 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 00970 IF (KERR.NE.0) THEN 00971 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00972 RETURN 00973 ENDIF 00974 C 00975 C RESOLUTION FLAG. 00976 C 00977 C INCREMENTS BINARY CODE DECIMAL VALUE 00978 C 00979 C NOT GIVEN 00000000 0 00980 C GIVEN 10000000 128 00981 C 00982 C 00983 C SHIFT 1 BIT FLAG FIELD TO LOW ORDER BIT 00984 C 00985 ITEMP = KB2PAR(6) / 128 00986 C 00987 IF (ITEMP.LE.0.OR.ITEMP.GT.1) 00988 C THEN 00989 CALL PRTBIN_MF (KB2PAR(6),8,ITEMP,IERR) 00990 WRITE (*,9011) ITEMP 00991 9011 FORMAT (TR1,'INVALID RESOLUTION FLAG ',I8.8) 00992 KERR = 11 00993 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 00994 RETURN 00995 ENDIF 00996 C 00997 C SET TO ALL 1-BITS UNUSED INCREMENT FIELDS. 00998 C 00999 IF (KB2PAR(6).EQ.0) 01000 C THEN 01001 C 1111111111111111 BINARY = 65535 DECIMAL 01002 KB2PAR(9) = 65535 01003 KB2PAR(10) = 65535 01004 ENDIF 01005 C 01006 ILB2PAR=KB2PAR 01007 CALL SBYTE_MF (KGRIB(KWORD),ILB2PAR(6),IOFF,8) 01008 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01009 IF (KERR.NE.0) THEN 01010 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01011 RETURN 01012 ENDIF 01013 C 01014 C LAT/LONG OF EXTREME POINT. 01015 C 01016 C SIGN BIT SET TO 1 IF VALUES ARE NEGATIVE. 01017 C 01018 DO 300 J=1,2 01019 C 01020 IF (KB2PAR(J+6).GE.0) THEN 01021 ILAT(J) = KB2PAR(J+6) 01022 ELSE 01023 ILAT(J) = 2**23 - KB2PAR(J+6) 01024 ENDIF 01025 C 01026 300 CONTINUE 01027 C 01028 ILLAT=ILAT 01029 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 01030 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01031 IF (KERR.NE.0) THEN 01032 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01033 RETURN 01034 ENDIF 01035 C 01036 C 01037 C 01038 C DIRECTION INCREMENTS / NUMBER OF LATITUDE LINES. 01039 C 01040 ILB2PAR=KB2PAR 01041 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(9),IOFF,16,0,2, 01042 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01043 IF (KERR.NE.0) THEN 01044 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01045 RETURN 01046 ENDIF 01047 C 01048 C SCANNING MODE FLAGS. 01049 C 01050 C VALID VALUES VALUE / 32 01051 C BINARY DECIMAL 01052 C 01053 C 00000000 0 01054 C 10000000 4 01055 C 01000000 2 01056 C 11000000 6 01057 C 00100000 1 01058 C 10100000 5 01059 C 01100000 3 01060 C 11100000 7 01061 C 01062 C SHIFT 3 BIT FLAG FIELD TO LOW ORDER BITS. 01063 C 01064 ITEMP = KB2PAR(11) / 32 01065 C 01066 IF (ITEMP.LT.0.OR.ITEMP.GT.7) 01067 C THEN 01068 CALL PRTBIN_MF (KB2PAR(11),8,ITEMP,IERR) 01069 WRITE (*,9014) ITEMP 01070 9014 FORMAT (TR1,'INVALID SCANNING MODE FLAGS ',I8.8) 01071 KERR = 12 01072 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01073 RETURN 01074 ENDIF 01075 C 01076 ILB2PAR=KB2PAR 01077 CALL SBYTE_MF (KGRIB(KWORD),ILB2PAR(11),IOFF,8) 01078 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01079 IF (KERR.NE.0) THEN 01080 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01081 RETURN 01082 ENDIF 01083 C 01084 C 4 RESERVED OCTETS. 01085 C 01086 ILBLOCK=IBLOCK 01087 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,8,0,4, 01088 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01089 IF (KERR.NE.0) THEN 01090 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01091 RETURN 01092 ENDIF 01093 C 01094 ENDIF 01095 C 01096 C 01097 C 01098 C 01099 C 01100 C 01101 C 01102 C 01103 C 01104 C 01105 C 01106 C*** 01107 C* SPHERICAL HARMONIC DATA. 01108 C*** 01109 C 01110 IF (KB2PAR(1).EQ.50.OR.KB2PAR(1).EQ.80) 01111 C THEN 01112 C 01113 C PENTAGONAL RESOLUTION PARAMETERS. 01114 C 01115 ILB2PAR=KB2PAR 01116 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(2),IOFF,16,0,3, 01117 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01118 IF (KERR.NE.0) THEN 01119 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01120 RETURN 01121 ENDIF 01122 C 01123 C REPRESENTATION TYPE AND MODE. 01124 C 01125 ILB2PAR=KB2PAR 01126 CALL GSBYTE_MF (KGRIB(KWORD),ILB2PAR(5),IOFF,8,0,2, 01127 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01128 IF (KERR.NE.0) THEN 01129 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01130 RETURN 01131 ENDIF 01132 C 01133 C 18 RESERVED OCTETS. 01134 C 01135 ILBLOCK=IBLOCK 01136 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,8,0,18, 01137 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01138 IF (KERR.NE.0) THEN 01139 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01140 RETURN 01141 ENDIF 01142 C 01143 ENDIF 01144 C 01145 C 01146 C*** 01147 C* ADD PARAMETERS NEEDED TO DESCRIBE STRETCHED AND ROTATED 01148 C* SPHERICAL HARMONICS DATA 01149 C*** 01150 C 01151 IF(KB2PAR(1).EQ.80) THEN 01152 C 01153 C* POLE OF ROTATION 01154 C 01155 DO 310 J=1,2 01156 C 01157 IF (KB2PAR(J+11).GE.0) THEN 01158 ILAT(J) = KB2PAR(J+11) 01159 ELSE 01160 ILAT(J) = 2**23 - KB2PAR(J+11) 01161 ENDIF 01162 C 01163 310 CONTINUE 01164 C 01165 ILLAT=ILAT 01166 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 01167 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01168 IF (KERR.NE.0) THEN 01169 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01170 RETURN 01171 ENDIF 01172 C 01173 C* ANGLE OF ROTATION 01174 ILB2PAR=KB2PAR 01175 CALL CONFP_MF (ILB2PAR(14),IEXP,IMANT) 01176 ILEXP=IEXP 01177 CALL SBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01178 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01179 IF (KERR.NE.0) THEN 01180 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01181 RETURN 01182 ENDIF 01183 ILMANT=IMANT 01184 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01185 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01186 IF (KERR.NE.0) THEN 01187 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01188 RETURN 01189 ENDIF 01190 C 01191 C* POLE OF STRETCHING 01192 C 01193 DO 320 J=1,2 01194 C 01195 IF (KB2PAR(J+14).GE.0) THEN 01196 ILAT(J) = KB2PAR(J+14) 01197 ELSE 01198 ILAT(J) = 2**23 - KB2PAR(J+14) 01199 ENDIF 01200 C 01201 320 CONTINUE 01202 ILLAT=ILAT 01203 CALL GSBYTE_MF (KGRIB(KWORD),ILLAT(1),IOFF,24,0,2, 01204 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01205 IF (KERR.NE.0) THEN 01206 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01207 RETURN 01208 ENDIF 01209 C 01210 C* STRETCHING FACTOR 01211 ILB2PAR=KB2PAR 01212 CALL CONFP_MF (ILB2PAR(17),IEXP,IMANT) 01213 ILEXP=IEXP 01214 CALL SBYTE_MF (KGRIB(KWORD),IEXP,IOFF,8) 01215 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01216 IF (KERR.NE.0) THEN 01217 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01218 RETURN 01219 ENDIF 01220 ILMANT=IMANT 01221 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01222 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01223 IF (KERR.NE.0) THEN 01224 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01225 RETURN 01226 ENDIF 01227 ENDIF 01228 C 01229 C 01230 C 01231 C*** 01232 C* ADD VERTICAL COORDINATE PARAMETERS FOR HYBRID LEVELS. 01233 C*** 01234 C 01235 IF (KB1PAR(6).GT.108) THEN 01236 C 01237 DO 400 J=1,KLENV 01238 CALL CONFP_MF (PVERT(J),IEXP,IMANT) 01239 ILEXP=IEXP 01240 CALL SBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01241 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01242 IF (KERR.NE.0) THEN 01243 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01244 RETURN 01245 ENDIF 01246 ILMANT=IMANT 01247 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01248 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01249 IF (KERR.NE.0) THEN 01250 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01251 RETURN 01252 ENDIF 01253 400 CONTINUE 01254 C 01255 ENDIF 01256 C 01257 ENDIF 01258 C 01259 C 01260 C 01261 C 01262 C 01263 C 01264 C 01265 333 CONTINUE 01266 C 01267 C 01268 C******************************************************************** 01269 C* 01270 C* BLOCK 3 (IF REQUIRED) - BIT MAP BLOCK. 01271 C* 01272 C******************************************************************** 01273 C 01274 IF (KB1PAR(4).EQ.64.OR.KB1PAR(4).EQ.192) 01275 C THEN 01276 WRITE (*,*)'BIT MAP BLOCK NOT YET DEFINED' 01277 KERR = -3 01278 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01279 RETURN 01280 ENDIF 01281 C 01282 C 01283 C 01284 C 01285 C 01286 C 01287 C 01288 C 01289 C 01290 C 01291 C 01292 C 01293 C 01294 C 01295 C 01296 C 01297 C 01298 C 01299 C 01300 C 01301 C 01302 C 01303 C 01304 C 01305 C******************************************************************** 01306 C* 01307 C* BLOCK 4 - BINARY DATA BLOCK. 01308 C* 01309 C******************************************************************** 01310 C 01311 C 01312 C*** 01313 C* RETAIN POINTERS TO WORD AND BIT POSITION OF BINARY DATA 01314 C* BLOCK LENGTH FIELD. ENTER LENGTH AS 0. 01315 C*** 01316 C 01317 IPW = KWORD 01318 IPB = IOFF 01319 C 01320 ILBLOCK=IBLOCK 01321 CALL SBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,24) 01322 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01323 IF (KERR.NE.0) THEN 01324 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01325 RETURN 01326 ENDIF 01327 C 01328 C 01329 C 01330 C 01331 C 01332 C 01333 C 01334 C 01335 C 01336 C 01337 C 01338 C*** 01339 C* 4 BIT FLAG / 4 BIT COUNT OF UNUSED BITS AT END OF BLOCK OCTET. 01340 C*** 01341 C 01342 C FLAG IS 1000 FOR SPHERICAL HARMONICS, 0000 FOR LAT/LONG 01343 C OR GAUSSIAN GRID, 1100 FOR SPHERICAL HARM. COMPLEX PACKING 01344 C 01345 IREP = 0 01346 IFLAG=0 01347 ICPACK=KCPACK 01348 C 01349 IF (KB2PAR(1).EQ.50.OR.KB2PAR(1).EQ.80) THEN 01350 IFLAG=128 01351 IREP=1 01352 C 01353 IF (ICPACK.LT.0) THEN 01354 WRITE (*,*) 'CODEGA : COMPLEX PACKING CODE ERROR' 01355 KERR = -5 01356 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01357 RETURN 01358 ELSEIF (IABS (KSCALP).GE.2**15) THEN 01359 WRITE (*,*) 'CODEGA : LAPLACIAN SCALING FACTOR ERROR' 01360 KERR = -6 01361 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01362 RETURN 01363 ENDIF 01364 C 01365 IF(ICPACK.NE.0.AND.KB2PAR(6).EQ.2) THEN 01366 IFLAG=IFLAG+64 01367 IREP=(ICPACK+1)**2 01368 ELSE 01369 ICPACK=0 01370 ENDIF 01371 C 01372 ENDIF 01373 C 01374 ILFLAG=IFLAG 01375 CALL SBYTE_MF (KGRIB(KWORD),ILFLAG,IOFF,8) 01376 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01377 IF (KERR.NE.0) THEN 01378 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01379 RETURN 01380 ENDIF 01381 C 01382 C 01383 C 01384 C 01385 C 01386 C 01387 C 01388 C 01389 C 01390 C 01391 C 01392 C*** 01393 C* FIND MAXIMUM AND MINIMUM VALUES IN DATA ARRAY. FOR 01394 C* DATA IN SPHERICAL HARMONIC FORM THE FIRST WORD CONTAINS 01395 C* THE REAL (0,0)COEFFICIENT, WHICH IS TREATED SEPARATELY. 01396 C* FOR COMPLEX PACKING AND SPECTRAL DATA REPRESENTATION MODE=2 01397 C* THE FIRST (ICPACK+1)**2 COEFFICENTS ARE NOT PACKED 01398 C*** 01399 C 01400 C 01401 ILEN = ILENF - IREP 01402 CALL MXMN_MF (PFDATA(IREP+1),ILEN,PMAX,PMIN) 01403 C 01404 C 01405 C 01406 C 01407 C 01408 C 01409 C 01410 C 01411 C 01412 C 01413 C 01414 C 01415 C 01416 C 01417 C 01418 C 01419 C*** 01420 C* COMPUTE REFERENCE VALUE AND SCALE FACTOR. 01421 C*** 01422 C 01423 IF (LDARPE) THEN 01424 C 01425 ZCOEFF = PMAX - PMIN 01426 ZEPSIL=1.E-290 01427 C 01428 IF ( ZCOEFF .LE. ZEPSIL ) THEN 01429 ZAUXIL=MIN ( ABS (PMIN), ABS (PMAX) ) 01430 IF ( ZAUXIL .LE. ZEPSIL ) ZAUXIL=0. 01431 C 01432 PMAX=SIGN (ZAUXIL,PMAX) 01433 PMIN=PMAX 01434 ZSCALE=0. 01435 ELSE 01436 ZSCALE=REAL (2**KBITS-1) / ZCOEFF 01437 ENDIF 01438 C 01439 C Scale factor and reference value forced to zero. 01440 C 01441 ISCALE=0 01442 ZREFER=PMIN 01443 IEXP=0 01444 IMANT=0 01445 C 01446 ELSEIF (IMISS.EQ.1) THEN 01447 C 01448 C Scaling factor, 01449 C EXPONENT AND MANTISSA SET TO ALL 1-BITS FOR MISSING DATA. 01450 C 01451 ISCALE = 65535 01452 IEXP = 255 01453 IMANT = 16777215 01454 ZREFER = PMIN 01455 C 01456 ELSE 01457 C 01458 C CONVERT MINIMUM VALUE (PMIN) TO GRIB FORMAT (IEXP,IMANT). 01459 C 01460 C Its image decoded back is being used as reference value to compute 01461 C (in PACKGB) normalized integer field values that will be 01462 C chained into the binary string. 01463 C 01464 CALL CONFI (PMIN,IEXP,IMANT,ZREFER) 01465 C 01466 ZS = (PMAX-ZREFER)/(2**(KBITS+1)-1) 01467 ZAUXIL=1. 01468 ZAUXI2=2. 01469 C 01470 C CONFI may return ZREFER > PMAX if the range 01471 C of PMAX-PMIN is smaller than the GRIB accuracy 01472 C 01473 IF (ZS.GT.0.) THEN 01474 ZS = LOG(ZS)/LOG(ZAUXI2) + ZAUXI2 01475 ELSE 01476 ZS=0. 01477 ENDIF 01478 ISCALE = MIN(INT(ZS),INT(ZS+SIGN(ZAUXIL,ZS))) 01479 C 01480 C Absolute value of ISCALE is limited, to avoid problems due to 01481 C fields constant except on a few points. 01482 C 01483 ISCALE = MAX(-99,MIN(99,ISCALE)) 01484 ZSCALE = ZAUXI2** (-ISCALE) 01485 C 01486 ENDIF 01487 C 01488 C 01489 C 01490 C 01491 C SET SIGN BIT (BIT 16) AND PUT SCALE FACTOR INTO REMAINING 01492 C 15 BITS OF CODED 16 BIT FIELD. 01493 C 01494 IF (ISCALE.GE.0) THEN 01495 ISCALX = ISCALE 01496 ELSE 01497 ISCALX= 2**15 - ISCALE 01498 ENDIF 01499 C 01500 ILSCALX=ISCALX 01501 CALL SBYTE_MF (KGRIB(KWORD),ILSCALX,IOFF,16) 01502 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01503 IF (KERR.NE.0) THEN 01504 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01505 RETURN 01506 ENDIF 01507 C 01508 C 01509 C 01510 C 01511 C 01512 IF (IEXP.EQ.0.AND.IMANT.EQ.0) THEN 01513 ILMANT=IMANT 01514 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,32) 01515 CALL OFFSET_MF (IOFF,1,KWORD,32,KNBIT,KLENG,KERR) 01516 ELSE 01517 ILEXP=IEXP 01518 CALL SBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01519 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01520 IF (KERR.NE.0) THEN 01521 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01522 RETURN 01523 ENDIF 01524 ILMANT=IMANT 01525 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01526 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01527 ENDIF 01528 C 01529 IF (KERR.NE.0) THEN 01530 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01531 RETURN 01532 ENDIF 01533 C 01534 C 01535 C 01536 C 01537 C*** 01538 C* NUMBER OF BITS IN EACH DATA VALUE. 01539 C*** 01540 C 01541 ILBITS=KBITS 01542 CALL SBYTE_MF (KGRIB(KWORD),ILBITS,IOFF,8) 01543 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01544 IF (KERR.NE.0) THEN 01545 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01546 RETURN 01547 ENDIF 01548 C 01549 C 01550 C 01551 C 01552 C*** 01553 C* IF COMPLEX PACKING DESCRIBE PACKING 01554 C*** 01555 C 01556 IF (IREP.NE.0.AND.ICPACK.NE.0) THEN 01557 C 01558 C START OF PACKED DATA 01559 C 01560 ISTPA=19+IREP*4 01561 C 01562 C Removing of the padding (06 sept 2000, not correct and useless) 01563 C 01564 C IRESTE=MOD (IOFF+40+IREP*32,KNBIT) 01565 CC 01566 C IF (IRESTE.NE.0) THEN 01567 CC 01568 C IF ( MOD (KNBIT,KBITS).EQ.0 .AND. MOD (IRESTE,8).EQ.0 .AND. 01569 C S MOD (KBITS,IRESTE).NE.0 ) THEN 01570 CC 01571 CC Packed data will start on a word boundary, 01572 CC and each packed data will be into a single word. 01573 CC 01574 C ISTPA=ISTPA+IRESTE/8 01575 C ENDIF 01576 CC 01577 C ENDIF 01578 C 01579 ILSTPA=ISTPA 01580 CALL SBYTE_MF (KGRIB(KWORD),ILSTPA,IOFF,16) 01581 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01582 IF (KERR.NE.0) THEN 01583 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01584 RETURN 01585 ENDIF 01586 C 01587 C SCALING FACTOR. 01588 C 01589 IF (KSCALP.GE.0) THEN 01590 ISCALP=KSCALP 01591 ELSE 01592 ISCALP=2**15-KSCALP 01593 ENDIF 01594 C 01595 ILSCALP=ISCALP 01596 CALL SBYTE_MF (KGRIB(KWORD),ILSCALP,IOFF,16) 01597 CALL OFFSET_MF (IOFF,1,KWORD,16,KNBIT,KLENG,KERR) 01598 IF (KERR.NE.0) THEN 01599 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01600 RETURN 01601 ENDIF 01602 C 01603 C TRUNCATION FOR UNPACKED PART OF SPECTRAL DATA, CURRENTLY 01604 C ONLY TRIANGULAR TRUNCATION SUPPORTED 01605 C 01606 IAUXIL=ICPACK*(1+2**8*(1+2**8)) 01607 ILAUXIL=IAUXIL 01608 CALL SBYTE_MF (KGRIB(KWORD),ILAUXIL,IOFF,24) 01609 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01610 IF (KERR.NE.0) THEN 01611 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01612 RETURN 01613 ENDIF 01614 C 01615 ENDIF 01616 C*** 01617 C* IF SPHERICAL HARMONICS DATA, NEXT 4 OCTETS ARE DIFFERENT FORMAT. 01618 C*** 01619 C 01620 IF (IREP.NE.0) 01621 C THEN 01622 C 01623 C STORE IREP COEFFICIENTS IN FLOATING 01624 C POINT FORM. 01625 C 01626 IF (LDARPE) THEN 01627 C 01628 C THE "UNPACKED" PART IS FILLED WITH ZEROES. 01629 C 01630 IEXP=0 01631 IMANT=0 01632 C 01633 DO 510 J=1,IREP 01634 ILMANT=IMANT 01635 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,32) 01636 CALL OFFSET_MF (IOFF,1,KWORD,32,KNBIT,KLENG,KERR) 01637 IF (KERR.NE.0) THEN 01638 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01639 RETURN 01640 ENDIF 01641 510 CONTINUE 01642 C 01643 ELSE 01644 C 01645 C STANDARD CASE. 01646 C 01647 DO 520 J=1,IREP 01648 CALL CONFP_MF (PFDATA(J),IEXP,IMANT) 01649 C 01650 ILEXP=IEXP 01651 CALL SBYTE_MF (KGRIB(KWORD),ILEXP,IOFF,8) 01652 CALL OFFSET_MF (IOFF,1,KWORD,8,KNBIT,KLENG,KERR) 01653 IF (KERR.NE.0) THEN 01654 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01655 RETURN 01656 ENDIF 01657 ILMANT=IMANT 01658 CALL SBYTE_MF (KGRIB(KWORD),ILMANT,IOFF,24) 01659 CALL OFFSET_MF (IOFF,1,KWORD,24,KNBIT,KLENG,KERR) 01660 IF (KERR.NE.0) THEN 01661 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01662 RETURN 01663 ENDIF 01664 520 CONTINUE 01665 C 01666 ENDIF 01667 C 01668 ENDIF 01669 C 01670 C 01671 C 01672 C 01673 C*** 01674 C* SCALE AND STORE DATA VALUES. 01675 C*** 01676 C 01677 C DO 600 J = IREP+1 , ILENF 01678 C IPDATA = NINT ( (PFDATA(J)-ZREFER) * ZSCALE ) 01679 C PFDATA(J)=OR (IPDATA,0) 01680 C 600 CONTINUE 01681 C 01682 ILENFM = ILENF - IREP 01683 CALL PACKGB (PFDATA(IREP+1),PFDATA(IREP+1),ZREFER,ZSCALE,ILENFM) 01684 CALL GSBYTE_MF (KGRIB(KWORD),PFDATA(IREP+1),IOFF,KBITS,0,ILENFM, 01685 S KNBIT,'C',KLENG,KERR,KWORD,.TRUE.) 01686 IF (KERR.NE.0) THEN 01687 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01688 RETURN 01689 ENDIF 01690 C 01691 C 01692 C 01693 C 01694 C 01695 C 01696 C 01697 C 01698 C 01699 C 01700 C 01701 C*** 01702 C* ENTER LENGTH OF BINARY DATA BLOCK, HAVING ENSURED THAT 01703 C* THE LENGTH IS AN EVEN NUMBER OF OCTETS. 01704 C*** 01705 C 01706 C LENGTH OF BINARY DATA BLOCK IN BITS. 01707 C 01708 ILBIN = (KWORD-IPW) * KNBIT + IOFF - IPB 01709 C 01710 IL = MOD (ILBIN,16) 01711 C 01712 C FILL UNUSED PORTION OF LAST 2 OCTETS WITH BINARY ZEROES. 01713 C 01714 ILNIL = 0 01715 C 01716 IF (IL.NE.0) THEN 01717 ILNIL = 16 - IL 01718 ILBLOCK=IBLOCK 01719 CALL SBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,ILNIL) 01720 CALL OFFSET_MF (IOFF,1,KWORD,ILNIL,KNBIT,KLENG,KERR) 01721 IF (KERR.NE.0) THEN 01722 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01723 RETURN 01724 ENDIF 01725 ENDIF 01726 C 01727 ILBIN = (KWORD-IPW) * KNBIT + IOFF - IPB 01728 C 01729 C ENTER LENGTH - IN OCTETS - OF DATA BLOCK. 01730 C 01731 ILBIN = ILBIN / 8 01732 ILLBIN=ILBIN 01733 CALL SBYTE_MF (KGRIB(IPW),ILLBIN,IPB,24) 01734 CALL OFFSET_MF (IPB,1,IPW,24,KNBIT,KLENG,KERR) 01735 C 01736 C ENTER NUMBER OF UNUSED BITS IN FLAG/BIT COUNT FIELD. 01737 C 01738 IFLAG = IFLAG + ILNIL 01739 ILFLAG=IFLAG 01740 CALL SBYTE_MF (KGRIB(IPW),ILFLAG,IPB,8) 01741 C 01742 C 01743 C 01744 C 01745 C 01746 C 01747 C 01748 C 01749 C 01750 C 01751 C 01752 C 01753 C 01754 C 01755 C 01756 C 01757 C 01758 C 01759 C 01760 C 01761 C******************************************************************** 01762 C* 01763 C* BLOCK 5 - END BLOCK. 01764 C* 01765 C******************************************************************** 01766 C 01767 C 01768 C*** 01769 C* ADD 7 7 7 7 TO CODED DATA. 01770 C*** 01771 C 01772 IBLOCK(1) = 55 01773 IBLOCK(2) = 55 01774 IBLOCK(3) = 55 01775 IBLOCK(4) = 55 01776 C 01777 ILBLOCK=IBLOCK 01778 CALL GSBYTE_MF (KGRIB(KWORD),ILBLOCK(1),IOFF,8,0,4, 01779 S KNBIT,'C',KLENG,KERR,KWORD,.FALSE.) 01780 IF (KERR.NE.0) THEN 01781 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01782 RETURN 01783 ENDIF 01784 C 01785 C 01786 C*** 01787 C* SET ANY UNUSED PART OF LAST WORD TO BINARY ZEROES. 01788 C*** 01789 C 01790 IF (IOFF.NE.KNBIT) 01791 C THEN 01792 IBITS = KNBIT - IOFF 01793 ILBLOCK=IBLOCK 01794 CALL SBYTE_MF (KGRIB(KWORD),ILBLOCK(5),IOFF,IBITS) 01795 ENDIF 01796 C 01797 C 01798 C 01799 C*** 01800 C* ROUND TO 120 OCTETS, IF REQUIRED. 01801 C*** 01802 C 01803 IF (KROUND.EQ.1) 01804 C THEN 01805 INUMBI = KWORD * KNBIT 01806 I = INUMBI / 960 01807 I = I * 960 01808 I = INUMBI - I 01809 IF (I.NE.0) I = (960 - I) / KNBIT 01810 C 01811 DO 700 J=KWORD+1,KWORD+I 01812 KGRIB(J) = 0 01813 700 CONTINUE 01814 C 01815 KWORD = KWORD + I 01816 ENDIF 01817 C 01818 IF (LHOOK) CALL DR_HOOK('CODEGA',1,ZHOOK_HANDLE) 01819 END 01820