PageRenderTime 89ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/WPS/ungrib/src/ngl/w3/w3fi63.f

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 4020 lines | 1716 code | 1 blank | 2303 comment | 0 complexity | 0c471b57123c3c19f33701c39a780cf2 MD5 | raw file
Possible License(s): AGPL-1.0
  1. SUBROUTINE W3FI63(MSGA,KPDS,KGDS,KBMS,DATA,KPTR,KRET)
  2. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  3. C . . . .
  4. C SUBPROGRAM: W3FI63 UNPK GRIB FIELD TO GRIB GRID
  5. C PRGMMR: FARLEY ORG: NMC421 DATE:94-11-22
  6. C
  7. C ABSTRACT: UNPACK A GRIB (EDITION 1) FIELD TO THE EXACT GRID
  8. C SPECIFIED IN THE GRIB MESSAGE, ISOLATE THE BIT MAP, AND MAKE
  9. C THE VALUES OF THE PRODUCT DESCRIPTON SECTION (PDS) AND THE
  10. C GRID DESCRIPTION SECTION (GDS) AVAILABLE IN RETURN ARRAYS.
  11. C
  12. C WHEN DECODING IS COMPLETED, DATA AT EACH GRID POINT HAS BEEN
  13. C RETURNED IN THE UNITS SPECIFIED IN THE GRIB MANUAL.
  14. C
  15. C PROGRAM HISTORY LOG:
  16. C 91-09-13 CAVANAUGH
  17. C 91-11-12 CAVANAUGH MODIFIED SIZE OF ECMWF GRIDS 5-8
  18. C 91-12-22 CAVANAUGH CORRECTED PROCESSING OF MERCATOR PROJECTIONS
  19. C IN GRID DEFINITION SECTION (GDS) IN
  20. C ROUTINE FI633
  21. C 92-08-05 CAVANAUGH CORRECTED MAXIMUM GRID SIZE TO ALLOW FOR
  22. C ONE DEGREE BY ONE DEGREE GLOBAL GRIDS
  23. C 92-08-27 CAVANAUGH CORRECTED TYPO ERROR, ADDED CODE TO COMPARE
  24. C TOTAL BYTE SIZE FROM SECTION 0 WITH SUM OF
  25. C SECTION SIZES.
  26. C 92-10-21 CAVANAUGH CORRECTIONS WERE MADE (IN FI634) TO REDUCE
  27. C PROCESSING TIME FOR INTERNATIONAL GRIDS.
  28. C REMOVED A TYPOGRAPHICAL ERROR IN FI635.
  29. C 93-01-07 CAVANAUGH CORRECTIONS WERE MADE (IN FI635) TO
  30. C FACILITATE USE OF THESE ROUTINES ON A PC.
  31. C A TYPOGRAPHICAL ERROR WAS ALSO CORRECTED
  32. C 93-01-13 CAVANAUGH CORRECTIONS WERE MADE (IN FI632) TO
  33. C PROPERLY HANDLE CONDITION WHEN
  34. C TIME RANGE INDICATOR = 10.
  35. C ADDED U.S.GRID 87.
  36. C 93-02-04 CAVANAUGH ADDED U.S.GRIDS 85 AND 86
  37. C 93-02-26 CAVANAUGH ADDED GRIDS 2, 3, 37 THRU 44,AND
  38. C GRIDS 55, 56, 90, 91, 92, AND 93 TO
  39. C LIST OF U.S. GRIDS.
  40. C 93-04-07 CAVANAUGH ADDED GRIDS 67 THRU 77 TO
  41. C LIST OF U.S. GRIDS.
  42. C 93-04-20 CAVANAUGH INCREASED MAX SIZE TO ACCOMODATE
  43. C GAUSSIAN GRIDS.
  44. C 93-05-26 CAVANAUGH CORRECTED GRID RANGE SELECTION IN FI634
  45. C FOR RANGES 67-71 & 75-77
  46. C 93-06-08 CAVANAUGH CORRECTED FI635 TO ACCEPT GRIB MESSAGES
  47. C WITH SECOND ORDER PACKING. ADDED ROUTINE FI636
  48. C TO PROCESS MESSAGES WITH SECOND ORDER PACKING.
  49. C 93-09-22 CAVANAUGH MODIFIED TO EXTRACT SUB-CENTER NUMBER FROM
  50. C PDS BYTE 26
  51. C 93-10-13 CAVANAUGH MODIFIED FI634 TO CORRECT GRID SIZES FOR
  52. C GRIDS 204 AND 208
  53. C 93-10-14 CAVANAUGH INCREASED SIZE OF KGDS TO INCLUDE ENTRIES FOR
  54. C NUMBER OF POINTS IN GRID AND NUMBER OF WORDS
  55. C IN EACH ROW
  56. C 93-12-08 CAVANAUGH CORRECTED TEST FOR EDITION NUMBER INSTEAD
  57. C OF VERSION NUMBER
  58. C 93-12-15 CAVANAUGH MODIFIED SECOND ORDER POINTERS TO FIRST ORDER
  59. C VALUES AND SECOND ORDER VALUES CORRECTLY
  60. C IN ROUTINE FI636
  61. C 94-03-02 CAVANAUGH ADDED CALL TO W3FI83 WITHIN DECODER. USER
  62. C NO LONGER NEEDS TO MAKE CALL TO THIS ROUTINE
  63. C 94-04-22 CAVANAUGH MODIFIED FI635, FI636 TO PROCESS ROW BY ROW
  64. C SECOND ORDER PACKING, ADDED SCALING CORRECTION
  65. C TO FI635, AND CORRECTED TYPOGRAPHICAL ERRORS
  66. C IN COMMENT FIELDS IN FI634
  67. C 94-05-17 CAVANAUGH CORRECTED ERROR IN FI633 TO EXTRACT RESOLUTION
  68. C FOR LAMBERT-CONFORMAL GRIDS. ADDED CLARIFYING
  69. C INFORMATION TO DOCBLOCK ENTRIES
  70. C 94-05-25 CAVANAUGH ADDED CODE TO PROCESS COLUMN BY COLUMN AS WELL
  71. C AS ROW BY ROW ORDERING OF SECOND ORDER DATA
  72. C 94-06-27 CAVANAUGH ADDED PROCESSING FOR GRIDS 45, 94 AND 95.
  73. C INCLUDES CONSTRUCTION OF SECOND ORDER BIT MAPS
  74. C FOR THINNED GRIDS IN FI636.
  75. C 94-07-08 CAVANAUGH COMMENTED OUT PRINT OUTS USED FOR DEBUGGING
  76. C 94-09-08 CAVANAUGH ADDED GRIDS 220, 221, 223 FOR FNOC
  77. C 94-11-10 FARLEY INCREASED MXSIZE FROM 72960 TO 260000
  78. C FOR .5 DEGREE SST ANALYSIS FIELDS
  79. C 94-12-06 R.E.JONES CHANGES IN FI632 FOR PDS GREATER THAN 28
  80. C 95-02-14 R.E.JONES CORRECT IN FI633 FOR NAVY WAFS GRIB
  81. C 95-03-20 M.BALDWIN FI633 MODIFICATION TO GET
  82. C DATA REP TYPES [KGDS(1)] 201 AND 202 TO WORK.
  83. C 95-04-10 E.ROGERS ADDED GRIDS 96 AND 97 FOR ETA MODEL IN FI634.
  84. C 95-04-26 R.E.JONES FI636 CORECTION FOR 2ND ORDER COMPLEX
  85. C UNPACKING. R
  86. C 95-05-19 R.E.JONES ADDED GRID 215, 20 KM AWIPS GRID
  87. C 95-07-06 R.E.JONES ADDED GAUSSIAN T62, T126 GRID 98, 126
  88. C 95-10-19 R.E.JONES ADDED GRID 216, 45 KM ETA AWIPS ALASKA GRID
  89. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  90. C 96-03-07 R.E.JONES CONTINUE UNPACK WITH KRET ERROR 9 IN FI631.
  91. C 96-08-19 R.E.JONES ADDED MERCATOR GRIDS 8 AND 53, AND GRID 196
  92. C 97-02-12 W BOSTELMAN CORRECTS ECMWF US GRID 2 PROCESSING
  93. C 98-06-17 IREDELL REMOVED ALTERNATE RETURN IN FI637
  94. C 98-08-31 IREDELL ELIMINATED NEED FOR MXSIZE
  95. C 98-09-02 Gilbert Corrected error in map size for U.S. Grid 92
  96. C 98-09-08 BALDWIN ADD DATA REP TYPE [KGDS(1)] 203
  97. C 01-03-08 ROGERS CHANGED ETA GRIDS 90-97, ADDED ETA GRIDS
  98. C 194, 198. ADDED AWIPS GRIDS 241,242,243,
  99. C 245, 246, 247, 248, AND 250
  100. C 01-03-19 VUONG ADDED AWIPS GRIDS 238,239,240, AND 244
  101. C 2001-06-06 GILBERT Changed gbyte/sbyte calls to refer to
  102. C Wesley Ebisuzaki's endian independent
  103. C versions gbytec/sbytec.
  104. C Removed equivalences.
  105. C 01-05-03 ROGERS ADDED GRID 249 (12KM FOR ALASKA)
  106. C 01-10-10 ROGERS REDEFINED GRID 218 FOR 12 KM ETA
  107. C REDEFINED GRID 192 FOR NEW 32-KM ETA GRID
  108. C 02-03-27 VUONG ADDED RSAS GRID 88 AND AWIPS GRIDS 219, 220,
  109. C 223, 224, 225, 226, 227, 228, 229, 230, 231,
  110. C 232, 233, 234, 235, 251, AND 252
  111. C 02-08-06 ROGERS REDEFINED GRIDS 90-93,97,194,245-250 FOR THE
  112. C 8KM HI-RES-WINDOW MODEL AND ADD AWIPS GRID 253
  113. C 2003-06-30 GILBERT SET NEW VALUES IN ARRAY KPTR TO PASS BACK ADDITIONAL
  114. C PACKING INFO.
  115. C KPTR(19) - BINARY SCALE FACTOR
  116. C KPTR(20) - NUM BITS USED TO PACK EACH DATUM
  117. C 2003-06-30 GILBERT ADDED GRIDS 145 and 146 for CMAQ
  118. C and GRID 175 for AWIPS over GUAM.
  119. C 2003-07-08 VUONG ADDED GRIDS 110, 127, 171, 172 AND MODIFIED GRID 170
  120. C 2004-09-02 VUONG ADDED AWIPS GRIDS 147, 148, 173 AND 254
  121. C 2005-01-04 COOKE ADDED AWIPS GRIDS 160 AND 161
  122. C 2005-03-03 VUONG MOVED GRID 170 TO GRID 174 AND ADD GRID 170
  123. C 2005-03-21 VUONG ADDED AWIPS GRID 130
  124. C 2005-10-11 VUONG ADDED AWIPS GRID 163
  125. C 2006-12-12 VUONG ADDED AWIPS GRID 120
  126. C 2007-04-12 VUONG ADDED AWIPS 176 AND DATA REP TYPE KGDS(1) 204
  127. C 2007-06-11 VUONG ADDED NEW GRIDS 11 TO 18 AND 122 TO 125 AND 138
  128. C AND 180 TO 183
  129. C 2007-11-06 VUONG CHANGED GRID 198 FROM ARAKAWA STAGGERED E-GRID TO POLAR
  130. C STEREOGRAPGIC GRID ADDED NEW GRID 10, 99, 150, 151, 197
  131. C 2008-01-17 VUONG ADDED NEW GRID 195 AND CHANGED GRID 196 (ARAKAWA-E TO MERCATOR)
  132. C 2009-05-21 VUONG MODIFIED TO HANDLE GRID 45
  133. C 2010-05-11 VUONG DATA REP TYPE KGDS(1) 205
  134. C 2010-02-18 VUONG ADDED GRID 128, 139 AND 140
  135. C 2010-07-20 GAYNO ADDED ROTATED LAT/LON "A,B,C,D" STAGGERS -> KGDS(1) 205
  136. C 2010-08-05 VUONG ADDED NEW GRID 184, 199, 83 AND
  137. C REDEFINED GRID 90 FOR NEW RTMA CONUS 1.27-KM
  138. C REDEFINED GRID 91 FOR NEW RTMA ALASKA 2.976-KM
  139. C REDEFINED GRID 92 FOR NEW RTMA ALASKA 1.488-KM
  140. C 2010-09-08 ROGERS CHANGED GRID 94 TO ALASKA 6KM STAGGERED B-GRID
  141. C CHANGED GRID 95 TO PUERTO RICO 3KM STAGGERED B-GRID
  142. C CHANGED GRID 96 TO HAWAII 3KM STAGGERED B-GRID
  143. C CHANGED GRID 96 TO HAWAII 3KM STAGGERED B-GRID
  144. C CHANGED GRID 97 TO CONUS 4KM STAGGERED B-GRID
  145. C CHANGED GRID 99 TO NAM 12KM STAGGERED B-GRID
  146. C ADDED GRID 179 (12 KM POLAR STEREOGRAPHIC OVER NORTH AMERICA)
  147. C CHANGED GRID 194 TO 3KM MERCATOR GRID OVER PUERTO RICO
  148. C CORRECTED LATITUDE OF SW CORNER POINT OF GRID 151
  149. C
  150. C USAGE: CALL W3FI63(MSGA,KPDS,KGDS,KBMS,DATA,KPTR,KRET)
  151. C INPUT ARGUMENT LIST:
  152. C MSGA - GRIB FIELD - "GRIB" THRU "7777" CHAR*1
  153. C (MESSAGE CAN BE PRECEDED BY JUNK CHARS)
  154. C
  155. C OUTPUT ARGUMENT LIST:
  156. C DATA - ARRAY CONTAINING DATA ELEMENTS
  157. C KPDS - ARRAY CONTAINING PDS ELEMENTS. (EDITION 1)
  158. C (1) - ID OF CENTER
  159. C (2) - GENERATING PROCESS ID NUMBER
  160. C (3) - GRID DEFINITION
  161. C (4) - GDS/BMS FLAG (RIGHT ADJ COPY OF OCTET 8)
  162. C (5) - INDICATOR OF PARAMETER
  163. C (6) - TYPE OF LEVEL
  164. C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
  165. C (8) - YEAR INCLUDING (CENTURY-1)
  166. C (9) - MONTH OF YEAR
  167. C (10) - DAY OF MONTH
  168. C (11) - HOUR OF DAY
  169. C (12) - MINUTE OF HOUR
  170. C (13) - INDICATOR OF FORECAST TIME UNIT
  171. C (14) - TIME RANGE 1
  172. C (15) - TIME RANGE 2
  173. C (16) - TIME RANGE FLAG
  174. C (17) - NUMBER INCLUDED IN AVERAGE
  175. C (18) - VERSION NR OF GRIB SPECIFICATION
  176. C (19) - VERSION NR OF PARAMETER TABLE
  177. C (20) - NR MISSING FROM AVERAGE/ACCUMULATION
  178. C (21) - CENTURY OF REFERENCE TIME OF DATA
  179. C (22) - UNITS DECIMAL SCALE FACTOR
  180. C (23) - SUBCENTER NUMBER
  181. C (24) - PDS BYTE 29, FOR NMC ENSEMBLE PRODUCTS
  182. C 128 IF FORECAST FIELD ERROR
  183. C 64 IF BIAS CORRECTED FCST FIELD
  184. C 32 IF SMOOTHED FIELD
  185. C WARNING: CAN BE COMBINATION OF MORE THAN 1
  186. C (25) - PDS BYTE 30, NOT USED
  187. C (26-35) - RESERVED
  188. C (36-N) - CONSECUTIVE BYTES EXTRACTED FROM PROGRAM
  189. C DEFINITION SECTION (PDS) OF GRIB MESSAGE
  190. C KGDS - ARRAY CONTAINING GDS ELEMENTS.
  191. C (1) - DATA REPRESENTATION TYPE
  192. C (19) - NUMBER OF VERTICAL COORDINATE PARAMETERS
  193. C (20) - OCTET NUMBER OF THE LIST OF VERTICAL COORDINATE
  194. C PARAMETERS
  195. C OR
  196. C OCTET NUMBER OF THE LIST OF NUMBERS OF POINTS
  197. C IN EACH ROW
  198. C OR
  199. C 255 IF NEITHER ARE PRESENT
  200. C (21) - FOR GRIDS WITH PL, NUMBER OF POINTS IN GRID
  201. C (22) - NUMBER OF WORDS IN EACH ROW
  202. C LATITUDE/LONGITUDE GRIDS
  203. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  204. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  205. C (4) - LA(1) LATITUDE OF ORIGIN
  206. C (5) - LO(1) LONGITUDE OF ORIGIN
  207. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  208. C (7) - LA(2) LATITUDE OF EXTREME POINT
  209. C (8) - LO(2) LONGITUDE OF EXTREME POINT
  210. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  211. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  212. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  213. C GAUSSIAN GRIDS
  214. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  215. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  216. C (4) - LA(1) LATITUDE OF ORIGIN
  217. C (5) - LO(1) LONGITUDE OF ORIGIN
  218. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  219. C (7) - LA(2) LATITUDE OF EXTREME POINT
  220. C (8) - LO(2) LONGITUDE OF EXTREME POINT
  221. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  222. C (10) - N - NR OF CIRCLES POLE TO EQUATOR
  223. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  224. C (12) - NV - NR OF VERT COORD PARAMETERS
  225. C (13) - PV - OCTET NR OF LIST OF VERT COORD PARAMETERS
  226. C OR
  227. C PL - LOCATION OF THE LIST OF NUMBERS OF POINTS IN
  228. C EACH ROW (IF NO VERT COORD PARAMETERS
  229. C ARE PRESENT
  230. C OR
  231. C 255 IF NEITHER ARE PRESENT
  232. C POLAR STEREOGRAPHIC GRIDS
  233. C (2) - N(I) NR POINTS ALONG LAT CIRCLE
  234. C (3) - N(J) NR POINTS ALONG LON CIRCLE
  235. C (4) - LA(1) LATITUDE OF ORIGIN
  236. C (5) - LO(1) LONGITUDE OF ORIGIN
  237. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  238. C (7) - LOV GRID ORIENTATION
  239. C (8) - DX - X DIRECTION INCREMENT
  240. C (9) - DY - Y DIRECTION INCREMENT
  241. C (10) - PROJECTION CENTER FLAG
  242. C (11) - SCANNING MODE (RIGHT ADJ COPY OF OCTET 28)
  243. C SPHERICAL HARMONIC COEFFICIENTS
  244. C (2) - J PENTAGONAL RESOLUTION PARAMETER
  245. C (3) - K " " "
  246. C (4) - M " " "
  247. C (5) - REPRESENTATION TYPE
  248. C (6) - COEFFICIENT STORAGE MODE
  249. C MERCATOR GRIDS
  250. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  251. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  252. C (4) - LA(1) LATITUDE OF ORIGIN
  253. C (5) - LO(1) LONGITUDE OF ORIGIN
  254. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  255. C (7) - LA(2) LATITUDE OF LAST GRID POINT
  256. C (8) - LO(2) LONGITUDE OF LAST GRID POINT
  257. C (9) - LATIT - LATITUDE OF PROJECTION INTERSECTION
  258. C (10) - RESERVED
  259. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  260. C (12) - LONGITUDINAL DIR GRID LENGTH
  261. C (13) - LATITUDINAL DIR GRID LENGTH
  262. C LAMBERT CONFORMAL GRIDS
  263. C (2) - NX NR POINTS ALONG X-AXIS
  264. C (3) - NY NR POINTS ALONG Y-AXIS
  265. C (4) - LA1 LAT OF ORIGIN (LOWER LEFT)
  266. C (5) - LO1 LON OF ORIGIN (LOWER LEFT)
  267. C (6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
  268. C (7) - LOV - ORIENTATION OF GRID
  269. C (8) - DX - X-DIR INCREMENT
  270. C (9) - DY - Y-DIR INCREMENT
  271. C (10) - PROJECTION CENTER FLAG
  272. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  273. C (12) - LATIN 1 - FIRST LAT FROM POLE OF SECANT CONE INTER
  274. C (13) - LATIN 2 - SECOND LAT FROM POLE OF SECANT CONE INTER
  275. C E-STAGGERED ARAKAWA ROTATED LAT/LON GRIDS (TYPE 203)
  276. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  277. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  278. C (4) - LA(1) LATITUDE OF ORIGIN
  279. C (5) - LO(1) LONGITUDE OF ORIGIN
  280. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  281. C (7) - LA(2) LATITUDE OF CENTER
  282. C (8) - LO(2) LONGITUDE OF CENTER
  283. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  284. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  285. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  286. C CURVILINEAR ORTHIGINAL GRID (TYPE 204)
  287. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  288. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  289. C (4) - RESERVED SET TO 0
  290. C (5) - RESERVED SET TO 0
  291. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  292. C (7) - RESERVED SET TO 0
  293. C (8) - RESERVED SET TO 0
  294. C (9) - RESERVED SET TO 0
  295. C (10) - RESERVED SET TO 0
  296. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  297. C ROTATED LAT/LON A,B,C,D-STAGGERED (TYPE 205)
  298. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  299. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  300. C (4) - LA(1) LATITUDE OF FIRST POINT
  301. C (5) - LO(1) LONGITUDE OF FIRST POINT
  302. C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
  303. C (7) - LA(2) LATITUDE OF CENTER
  304. C (8) - LO(2) LONGITUDE OF CENTER
  305. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  306. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  307. C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
  308. C (12) - LATITUDE OF LAST POINT
  309. C (13) - LONGITUDE OF LAST POINT
  310. C KBMS - BITMAP DESCRIBING LOCATION OF OUTPUT ELEMENTS.
  311. C (ALWAYS CONSTRUCTED)
  312. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  313. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  314. C (2) - LENGTH OF INDICATOR (SECTION 0)
  315. C (3) - LENGTH OF PDS (SECTION 1)
  316. C (4) - LENGTH OF GDS (SECTION 2)
  317. C (5) - LENGTH OF BMS (SECTION 3)
  318. C (6) - LENGTH OF BDS (SECTION 4)
  319. C (7) - VALUE OF CURRENT BYTE
  320. C (8) - BIT POINTER
  321. C (9) - GRIB START BIT NR
  322. C (10) - GRIB/GRID ELEMENT COUNT
  323. C (11) - NR UNUSED BITS AT END OF SECTION 3
  324. C (12) - BIT MAP FLAG (COPY OF BMS OCTETS 5,6)
  325. C (13) - NR UNUSED BITS AT END OF SECTION 2
  326. C (14) - BDS FLAGS (RIGHT ADJ COPY OF OCTET 4)
  327. C (15) - NR UNUSED BITS AT END OF SECTION 4
  328. C (16) - RESERVED
  329. C (17) - RESERVED
  330. C (18) - RESERVED
  331. C (19) - BINARY SCALE FACTOR
  332. C (20) - NUM BITS USED TO PACK EACH DATUM
  333. C KRET - FLAG INDICATING QUALITY OF COMPLETION
  334. C
  335. C REMARKS: WHEN DECODING IS COMPLETED, DATA AT EACH GRID POINT HAS BEEN
  336. C RETURNED IN THE UNITS SPECIFIED IN THE GRIB MANUAL.
  337. C
  338. C VALUES FOR RETURN FLAG (KRET)
  339. C KRET = 0 - NORMAL RETURN, NO ERRORS
  340. C = 1 - 'GRIB' NOT FOUND IN FIRST 100 CHARS
  341. C = 2 - '7777' NOT IN CORRECT LOCATION
  342. C = 3 - UNPACKED FIELD IS LARGER THAN 260000
  343. C = 4 - GDS/ GRID NOT ONE OF CURRENTLY ACCEPTED VALUES
  344. C = 5 - GRID NOT CURRENTLY AVAIL FOR CENTER INDICATED
  345. C = 8 - TEMP GDS INDICATED, BUT GDS FLAG IS OFF
  346. C = 9 - GDS INDICATES SIZE MISMATCH WITH STD GRID
  347. C =10 - INCORRECT CENTER INDICATOR
  348. C =11 - BINARY DATA SECTION (BDS) NOT COMPLETELY PROCESSED.
  349. C PROGRAM IS NOT SET TO PROCESS FLAG COMBINATIONS
  350. C SHOWN IN OCTETS 4 AND 14.
  351. C =12 - BINARY DATA SECTION (BDS) NOT COMPLETELY PROCESSED.
  352. C PROGRAM IS NOT SET TO PROCESS FLAG COMBINATIONS
  353. C
  354. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  355. C
  356. C ATTRIBUTES:
  357. C LANGUAGE: FORTRAN 90
  358. C
  359. C$$$
  360. C 4 AUG 1988
  361. C W3FI63
  362. C
  363. C
  364. C GRIB UNPACKING ROUTINE
  365. C
  366. C
  367. C THIS ROUTINE WILL UNPACK A 'GRIB' FIELD TO THE EXACT GRID
  368. C TYPE SPECIFIED IN THE MESSAGE, RETURN A BIT MAP AND MAKE THE
  369. C VALUES OF THE PRODUCT DEFINITION SEC (PDS) AND THE GRID
  370. C DESCRIPTION SEC (GDS) AVAILABLE IN RETURN ARRAYS.
  371. C SEE "GRIB - THE WMO FORMAT FOR THE STORAGE OF WEATHER PRODUCT
  372. C INFORMATION AND THE EXCHANGE OF WEATHER PRODUCT MESSAGES IN
  373. C GRIDDED BINARY FORM" DATED JULY 1, 1988 BY JOHN D. STACKPOLE
  374. C DOC, NOAA, NWS, NATIONAL METEOROLOGICAL CENTER.
  375. C
  376. C THE CALL TO THE GRIB UNPACKING ROUTINE IS AS FOLLOWS:
  377. C
  378. C CALL W3FI63(MSGA,KPDS,KGDS,LBMS,DATA,KPTR,KRET)
  379. C
  380. C INPUT:
  381. C
  382. C MSGA = CONTAINS THE GRIB MESSAGE TO BE UNPACKED. CHARACTERS
  383. C "GRIB" MAY BEGIN ANYWHERE WITHIN FIRST 100 BYTES.
  384. C
  385. C OUTPUT:
  386. C
  387. C KPDS(100) INTEGER*4
  388. C ARRAY TO CONTAIN THE ELEMENTS OF THE PRODUCT
  389. C DEFINITION SEC .
  390. C (VERSION 1)
  391. C KPDS(1) - ID OF CENTER
  392. C KPDS(2) - MODEL IDENTIFICATION (SEE "GRIB" TABLE 1)
  393. C KPDS(3) - GRID IDENTIFICATION (SEE "GRIB" TABLE 2)
  394. C KPDS(4) - GDS/BMS FLAG
  395. C BIT DEFINITION
  396. C 25 0 - GDS OMITTED
  397. C 1 - GDS INCLUDED
  398. C 26 0 - BMS OMITTED
  399. C 1 - BMS INCLUDED
  400. C NOTE:- LEFTMOST BIT = 1,
  401. C RIGHTMOST BIT = 32
  402. C KPDS(5) - INDICATOR OF PARAMETER (SEE "GRIB" TABLE 5)
  403. C KPDS(6) - TYPE OF LEVEL (SEE "GRIB" TABLES 6 & 7)
  404. C KPDS(7) - HEIGHT,PRESSURE,ETC OF LEVEL
  405. C KPDS(8) - YEAR INCLUDING CENTURY
  406. C KPDS(9) - MONTH OF YEAR
  407. C KPDS(10) - DAY OF MONTH
  408. C KPDS(11) - HOUR OF DAY
  409. C KPDS(12) - MINUTE OF HOUR
  410. C KPDS(13) - INDICATOR OF FORECAST TIME UNIT (SEE "GRIB"
  411. C TABLE 8)
  412. C KPDS(14) - TIME 1 (SEE "GRIB" TABLE 8A)
  413. C KPDS(15) - TIME 2 (SEE "GRIB" TABLE 8A)
  414. C KPDS(16) - TIME RANGE INDICATOR (SEE "GRIB" TABLE 8A)
  415. C KPDS(17) - NUMBER INCLUDED IN AVERAGE
  416. C KPDS(18) - EDITION NR OF GRIB SPECIFICATION
  417. C KPDS(19) - VERSION NR OF PARAMETER TABLE
  418. C
  419. C KGDS(13) INTEGER*4
  420. C ARRAY CONTAINING GDS ELEMENTS.
  421. C
  422. C KGDS(1) - DATA REPRESENTATION TYPE
  423. C
  424. C LATITUDE/LONGITUDE GRIDS (SEE "GRIB" TABLE 10)
  425. C KGDS(2) - N(I) NUMBER OF POINTS ON LATITUDE
  426. C CIRCLE
  427. C KGDS(3) - N(J) NUMBER OF POINTS ON LONGITUDE
  428. C CIRCLE
  429. C KGDS(4) - LA(1) LATITUDE OF ORIGIN
  430. C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
  431. C KGDS(6) - RESOLUTION FLAG
  432. C BIT MEANING
  433. C 25 0 - DIRECTION INCREMENTS NOT
  434. C GIVEN
  435. C 1 - DIRECTION INCREMENTS GIVEN
  436. C KGDS(7) - LA(2) LATITUDE OF EXTREME POINT
  437. C KGDS(8) - LO(2) LONGITUDE OF EXTREME POINT
  438. C KGDS(9) - DI LONGITUDINAL DIRECTION INCREMENT
  439. C KGDS(10) - REGULAR LAT/LON GRID
  440. C DJ - LATITUDINAL DIRECTION
  441. C INCREMENT
  442. C GAUSSIAN GRID
  443. C N - NUMBER OF LATITUDE CIRCLES
  444. C BETWEEN A POLE AND THE EQUATOR
  445. C KGDS(11) - SCANNING MODE FLAG
  446. C BIT MEANING
  447. C 25 0 - POINTS ALONG A LATITUDE
  448. C SCAN FROM WEST TO EAST
  449. C 1 - POINTS ALONG A LATITUDE
  450. C SCAN FROM EAST TO WEST
  451. C 26 0 - POINTS ALONG A MERIDIAN
  452. C SCAN FROM NORTH TO SOUTH
  453. C 1 - POINTS ALONG A MERIDIAN
  454. C SCAN FROM SOUTH TO NORTH
  455. C 27 0 - POINTS SCAN FIRST ALONG
  456. C CIRCLES OF LATITUDE, THEN
  457. C ALONG MERIDIANS
  458. C (FORTRAN: (I,J))
  459. C 1 - POINTS SCAN FIRST ALONG
  460. C MERIDIANS THEN ALONG
  461. C CIRCLES OF LATITUDE
  462. C (FORTRAN: (J,I))
  463. C
  464. C POLAR STEREOGRAPHIC GRIDS (SEE GRIB TABLE 12)
  465. C KGDS(2) - N(I) NR POINTS ALONG LAT CIRCLE
  466. C KGDS(3) - N(J) NR POINTS ALONG LON CIRCLE
  467. C KGDS(4) - LA(1) LATITUDE OF ORIGIN
  468. C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
  469. C KGDS(6) - RESERVED
  470. C KGDS(7) - LOV GRID ORIENTATION
  471. C KGDS(8) - DX - X DIRECTION INCREMENT
  472. C KGDS(9) - DY - Y DIRECTION INCREMENT
  473. C KGDS(10) - PROJECTION CENTER FLAG
  474. C KGDS(11) - SCANNING MODE
  475. C
  476. C SPHERICAL HARMONIC COEFFICIENTS (SEE "GRIB" TABLE 14)
  477. C KGDS(2) - J PENTAGONAL RESOLUTION PARAMETER
  478. C KGDS(3) - K PENTAGONAL RESOLUTION PARAMETER
  479. C KGDS(4) - M PENTAGONAL RESOLUTION PARAMETER
  480. C KGDS(5) - REPRESENTATION TYPE
  481. C KGDS(6) - COEFFICIENT STORAGE MODE
  482. C
  483. C MERCATOR GRIDS
  484. C KGDS(2) - N(I) NR POINTS ON LATITUDE CIRCLE
  485. C KGDS(3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  486. C KGDS(4) - LA(1) LATITUDE OF ORIGIN
  487. C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
  488. C KGDS(6) - RESOLUTION FLAG
  489. C KGDS(7) - LA(2) LATITUDE OF LAST GRID POINT
  490. C KGDS(8) - LO(2) LONGITUDE OF LAST GRID POINT
  491. C KGDS(9) - LATIN - LATITUDE OF PROJECTION INTERSECTION
  492. C KGDS(10) - RESERVED
  493. C KGDS(11) - SCANNING MODE FLAG
  494. C KGDS(12) - LONGITUDINAL DIR GRID LENGTH
  495. C KGDS(13) - LATITUDINAL DIR GRID LENGTH
  496. C LAMBERT CONFORMAL GRIDS
  497. C KGDS(2) - NX NR POINTS ALONG X-AXIS
  498. C KGDS(3) - NY NR POINTS ALONG Y-AXIS
  499. C KGDS(4) - LA1 LAT OF ORIGIN (LOWER LEFT)
  500. C KGDS(5) - LO1 LON OF ORIGIN (LOWER LEFT)
  501. C KGDS(6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
  502. C KGDS(7) - LOV - ORIENTATION OF GRID
  503. C KGDS(8) - DX - X-DIR INCREMENT
  504. C KGDS(9) - DY - Y-DIR INCREMENT
  505. C KGDS(10) - PROJECTION CENTER FLAG
  506. C KGDS(11) - SCANNING MODE FLAG
  507. C KGDS(12) - LATIN 1 - FIRST LAT FROM POLE OF
  508. C SECANT CONE INTERSECTION
  509. C KGDS(13) - LATIN 2 - SECOND LAT FROM POLE OF
  510. C SECANT CONE INTERSECTION
  511. C
  512. C LBMS(*) LOGICAL
  513. C ARRAY TO CONTAIN THE BIT MAP DESCRIBING THE
  514. C PLACEMENT OF DATA IN THE OUTPUT ARRAY. IF A
  515. C BIT MAP IS NOT INCLUDED IN THE SOURCE MESSAGE,
  516. C ONE WILL BE GENERATED AUTOMATICALLY BY THE
  517. C UNPACKING ROUTINE.
  518. C
  519. C
  520. C DATA(*) REAL*4
  521. C THIS ARRAY WILL CONTAIN THE UNPACKED DATA POINTS.
  522. C
  523. C NOTE:- 65160 IS MAXIMUN FIELD SIZE ALLOWABLE
  524. C
  525. C KPTR(10) INTEGER*4
  526. C ARRAY CONTAINING STORAGE FOR THE FOLLOWING
  527. C PARAMETERS.
  528. C
  529. C (1) - UNUSED
  530. C (2) - UNUSED
  531. C (3) - LENGTH OF PDS (IN BYTES)
  532. C (4) - LENGTH OF GDS (IN BYTES)
  533. C (5) - LENGTH OF BMS (IN BYTES)
  534. C (6) - LENGTH OF BDS (IN BYTES)
  535. C (7) - USED BY UNPACKING ROUTINE
  536. C (8) - NUMBER OF DATA POINTS FOR GRID
  537. C (9) - "GRIB" CHARACTERS START IN BYTE NUMBER
  538. C (10) - USED BY UNPACKING ROUTINE
  539. C
  540. C
  541. C KRET INTEGER*4
  542. C THIS VARIABLE WILL CONTAIN THE RETURN INDICATOR.
  543. C
  544. C 0 - NO ERRORS DETECTED.
  545. C
  546. C 1 - 'GRIB' NOT FOUND IN FIRST 100
  547. C CHARACTERS.
  548. C
  549. C 2 - '7777' NOT FOUND, EITHER MISSING OR
  550. C TOTAL OF SEC COUNTS OF INDIVIDUAL
  551. C SECTIONS IS INCORRECT.
  552. C
  553. C 3 - UNPACKED FIELD IS LARGER THAN 65160.
  554. C
  555. C 4 - IN GDS, DATA REPRESENTATION TYPE
  556. C NOT ONE OF THE CURRENTLY ACCEPTABLE
  557. C VALUES. SEE "GRIB" TABLE 9. VALUE
  558. C OF INCORRECT TYPE RETURNED IN KGDS(1).
  559. C
  560. C 5 - GRID INDICATED IN KPDS(3) IS NOT
  561. C AVAILABLE FOR THE CENTER INDICATED IN
  562. C KPDS(1) AND NO GDS SENT.
  563. C
  564. C 7 - EDITION INDICATED IN KPDS(18) HAS NOT
  565. C YET BEEN INCLUDED IN THE DECODER.
  566. C
  567. C 8 - GRID IDENTIFICATION = 255 (NOT STANDARD
  568. C GRID) BUT FLAG INDICATING PRESENCE OF
  569. C GDS IS TURNED OFF. NO METHOD OF
  570. C GENERATING PROPER GRID.
  571. C
  572. C 9 - PRODUCT OF KGDS(2) AND KGDS(3) DOES NOT
  573. C MATCH STANDARD NUMBER OF POINTS FOR THIS
  574. C GRID (FOR OTHER THAN SPECTRALS). THIS
  575. C WILL OCCUR ONLY IF THE GRID.
  576. C IDENTIFICATION, KPDS(3), AND A
  577. C TRANSMITTED GDS ARE INCONSISTENT.
  578. C
  579. C 10 - CENTER INDICATOR WAS NOT ONE INDICATED
  580. C IN "GRIB" TABLE 1. PLEASE CONTACT AD
  581. C PRODUCTION MANAGEMENT BRANCH (W/NMC42)
  582. C IF THIS ERROR IS ENCOUNTERED.
  583. C
  584. C 11 - BINARY DATA SECTION (BDS) NOT COMPLETELY
  585. C PROCESSED. PROGRAM IS NOT SET TO PROCESS
  586. C FLAG COMBINATIONS AS SHOWN IN
  587. C OCTETS 4 AND 14.
  588. C
  589. C
  590. C LIST OF TEXT MESSAGES FROM CODE
  591. C
  592. C
  593. C W3FI63/FI632
  594. C
  595. C 'HAVE ENCOUNTERED A NEW GRID FOR NMC, PLEASE NOTIFY
  596. C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
  597. C (W/NMC42)'
  598. C
  599. C 'HAVE ENCOUNTERED A NEW GRID FOR ECMWF, PLEASE NOTIFY
  600. C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
  601. C (W/NMC42)'
  602. C
  603. C 'HAVE ENCOUNTERED A NEW GRID FOR U.K. METEOROLOGICAL
  604. C OFFICE, BRACKNELL. PLEASE NOTIFY AUTOMATION DIVISION,
  605. C PRODUCTION MANAGEMENT BRANCH (W/NMC42)'
  606. C
  607. C 'HAVE ENCOUNTERED A NEW GRID FOR FNOC, PLEASE NOTIFY
  608. C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
  609. C (W/NMC42)'
  610. C
  611. C
  612. C W3FI63/FI633
  613. C
  614. C 'POLAR STEREO PROCESSING NOT AVAILABLE' *
  615. C
  616. C W3FI63/FI634
  617. C
  618. C 'WARNING - BIT MAP MAY NOT BE ASSOCIATED WITH SPHERICAL
  619. C COEFFICIENTS'
  620. C
  621. C
  622. C W3FI63/FI637
  623. C
  624. C 'NO CURRENT LISTING OF FNOC GRIDS' *
  625. C
  626. C
  627. C * WILL BE AVAILABLE IN NEXT UPDATE
  628. C ***************************************************************
  629. C
  630. C INCOMING MESSAGE HOLDER
  631. CHARACTER*1 MSGA(*)
  632. C BIT MAP
  633. LOGICAL*1 KBMS(*)
  634. C
  635. C ELEMENTS OF PRODUCT DESCRIPTION SEC (PDS)
  636. INTEGER KPDS(*)
  637. C ELEMENTS OF GRID DESCRIPTION SEC (PDS)
  638. INTEGER KGDS(*)
  639. C
  640. C CONTAINER FOR GRIB GRID
  641. REAL DATA(*)
  642. C
  643. C ARRAY OF POINTERS AND COUNTERS
  644. INTEGER KPTR(*)
  645. C
  646. C *****************************************************************
  647. INTEGER JSGN,JEXP,IFR,NPTS
  648. REAL REALKK,FVAL1,FDIFF1
  649. C *****************************************************************
  650. C 1.0 LOCATE BEGINNING OF 'GRIB' MESSAGE
  651. C FIND 'GRIB' CHARACTERS
  652. C 2.0 USE COUNTS IN EACH DESCRIPTION SEC TO DETERMINE
  653. C IF '7777' IS IN PROPER PLACE.
  654. C 3.0 PARSE PRODUCT DEFINITION SECTION.
  655. C 4.0 PARSE GRID DESCRIPTION SEC (IF INCLUDED)
  656. C 5.0 PARSE BIT MAP SEC (IF INCLUDED)
  657. C 6.0 USING INFORMATION FROM PRODUCT DEFINITION, GRID
  658. C DESCRIPTION, AND BIT MAP SECTIONS.. EXTRACT
  659. C DATA AND PLACE INTO PROPER ARRAY.
  660. C *******************************************************************
  661. C
  662. C MAIN DRIVER
  663. C
  664. C *******************************************************************
  665. KPTR(10) = 0
  666. C SEE IF PROPER 'GRIB' KEY EXISTS, THEN
  667. C USING SEC COUNTS, DETERMINE IF '7777'
  668. C IS IN THE PROPER LOCATION
  669. C
  670. CALL FI631(MSGA,KPTR,KPDS,KRET)
  671. IF(KRET.NE.0) THEN
  672. GO TO 900
  673. END IF
  674. C PRINT *,'FI631 KPTR',(KPTR(I),I=1,16)
  675. C
  676. C PARSE PARAMETERS FROM PRODUCT DESCRIPTION SECTION
  677. C
  678. CALL FI632(MSGA,KPTR,KPDS,KRET)
  679. IF(KRET.NE.0) THEN
  680. GO TO 900
  681. END IF
  682. C PRINT *,'FI632 KPTR',(KPTR(I),I=1,16)
  683. C
  684. C IF AVAILABLE, EXTRACT NEW GRID DESCRIPTION
  685. C
  686. IF (IAND(KPDS(4),128).NE.0) THEN
  687. CALL FI633(MSGA,KPTR,KGDS,KRET)
  688. IF(KRET.NE.0) THEN
  689. GO TO 900
  690. END IF
  691. C PRINT *,'FI633 KPTR',(KPTR(I),I=1,16)
  692. END IF
  693. C
  694. C EXTRACT OR GENERATE BIT MAP
  695. C
  696. CALL FI634(MSGA,KPTR,KPDS,KGDS,KBMS,KRET)
  697. IF (KRET.NE.0) THEN
  698. IF (KRET.NE.9) THEN
  699. GO TO 900
  700. END IF
  701. END IF
  702. C PRINT *,'FI634 KPTR',(KPTR(I),I=1,16)
  703. C
  704. C USING INFORMATION FROM PDS, BMS AND BIT DATA SEC ,
  705. C EXTRACT AND SAVE IN GRIB GRID, ALL DATA ENTRIES.
  706. C
  707. IF (KPDS(18).EQ.1) THEN
  708. CALL FI635(MSGA,KPTR,KPDS,KGDS,KBMS,DATA,KRET)
  709. IF (KPTR(3).EQ.50) THEN
  710. C
  711. C PDS EQUAL 50 BYTES
  712. C THEREFORE SOMETHING SPECIAL IS GOING ON
  713. C
  714. C IN THIS CASE 2ND DIFFERENCE PACKING
  715. C NEEDS TO BE UNDONE.
  716. C
  717. C EXTRACT FIRST VALUE FROM BYTE 41-44 PDS
  718. C KPTR(9) CONTAINS OFFSET TO START OF
  719. C GRIB MESSAGE.
  720. C EXTRACT FIRST FIRST-DIFFERENCE FROM BYTES 45-48 PDS
  721. C
  722. C AND EXTRACT SCALE FACTOR (E) TO UNDO 2**E
  723. C THAT WAS APPLIED PRIOR TO 2ND ORDER PACKING
  724. C AND PLACED IN PDS BYTES 49-51
  725. C FACTOR IS A SIGNED TWO BYTE INTEGER
  726. C
  727. C ALSO NEED THE DECIMAL SCALING FROM PDS(27-28)
  728. C (AVAILABLE IN KPDS(22) FROM UNPACKER)
  729. C TO UNDO THE DECIMAL SCALING APPLIED TO THE
  730. C SECOND DIFFERENCES DURING UNPACKING.
  731. C SECOND DIFFS ALWAYS PACKED WITH 0 DECIMAL SCALE
  732. C BUT UNPACKER DOESNT KNOW THAT.
  733. C
  734. C CALL GBYTE (MSGA,FVAL1,KPTR(9)+384,32)
  735. C
  736. C NOTE INTEGERS, CHARACTERS AND EQUIVALENCES
  737. C DEFINED ABOVE TO MAKE THIS KKK EXTRACTION
  738. C WORK AND LINE UP ON WORD BOUNDARIES
  739. C
  740. C THE NEXT CODE WILL CONVERT THE IBM370 FOATING POINT
  741. C TO THE FLOATING POINT USED ON YOUR MACHINE.
  742. C
  743. call gbytec(MSGA,JSGN,KPTR(9)+384,1)
  744. call gbytec(MSGA,JEXP,KPTR(9)+385,7)
  745. call gbytec(MSGA,IFR,KPTR(9)+392,24)
  746. C
  747. IF (IFR.EQ.0) THEN
  748. REALKK = 0.0
  749. ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
  750. REALKK = 0.0
  751. ELSE
  752. REALKK = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
  753. IF (JSGN.NE.0) REALKK = -REALKK
  754. END IF
  755. FVAL1 = REALKK
  756. C
  757. C CALL GBYTE (MSGA,FDIFF1,KPTR(9)+416,32)
  758. C (REPLACED BY FOLLOWING EXTRACTION)
  759. C
  760. C THE NEXT CODE WILL CONVERT THE IBM370 FOATING POINT
  761. C TO THE FLOATING POINT USED ON YOUR MACHINE.
  762. C
  763. call gbytec(MSGA,JSGN,KPTR(9)+416,1)
  764. call gbytec(MSGA,JEXP,KPTR(9)+417,7)
  765. call gbytec(MSGA,IFR,KPTR(9)+424,24)
  766. C
  767. IF (IFR.EQ.0) THEN
  768. REALKK = 0.0
  769. ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
  770. REALKK = 0.0
  771. ELSE
  772. REALKK = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
  773. IF (JSGN.NE.0) REALKK = -REALKK
  774. END IF
  775. FDIFF1 = REALKK
  776. C
  777. CALL GBYTEC (MSGA,ISIGN,KPTR(9)+448,1)
  778. CALL GBYTEC (MSGA,ISCAL2,KPTR(9)+449,15)
  779. IF(ISIGN.GT.0) THEN
  780. ISCAL2 = - ISCAL2
  781. ENDIF
  782. C PRINT *,'DELTA POINT 1-',FVAL1
  783. C PRINT *,'DELTA POINT 2-',FDIFF1
  784. C PRINT *,'DELTA POINT 3-',ISCAL2
  785. NPTS = KPTR(10)
  786. C WRITE (6,FMT='('' 2ND DIFF POINTS IN FIELD = '',/,
  787. C & 10(3X,10F12.2,/))') (DATA(I),I=1,NPTS)
  788. C PRINT *,'DELTA POINT 4-',KPDS(22)
  789. CALL W3FI83 (DATA,NPTS,FVAL1,FDIFF1,
  790. & ISCAL2,KPDS(22),KPDS,KGDS)
  791. C WRITE (6,FMT='('' 2ND DIFF EXPANDED POINTS IN FIELD = '',
  792. C & /,10(3X,10F12.2,/))') (DATA(I),I=1,NPTS)
  793. C WRITE (6,FMT='('' END OF ARRAY IN FIELD = '',/,
  794. C & 10(3X,10F12.2,/))') (DATA(I),I=NPTS-5,NPTS)
  795. END IF
  796. ELSE
  797. C PRINT *,'FI635 NOT PROGRAMMED FOR EDITION NR',KPDS(18)
  798. KRET = 7
  799. END IF
  800. C
  801. 900 RETURN
  802. END
  803. SUBROUTINE FI631(MSGA,KPTR,KPDS,KRET)
  804. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  805. C . . . .
  806. C SUBPROGRAM: FI631 FIND 'GRIB' CHARS & RESET POINTERS
  807. C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  808. C
  809. C ABSTRACT: FIND 'GRIB; CHARACTERS AND SET POINTERS TO THE NEXT
  810. C BYTE FOLLOWING 'GRIB'. IF THEY EXIST EXTRACT COUNTS FROM GDS AND
  811. C BMS. EXTRACT COUNT FROM BDS. DETERMINE IF SUM OF COUNTS ACTUALLY
  812. C PLACES TERMINATOR '7777' AT THE CORRECT LOCATION.
  813. C
  814. C PROGRAM HISTORY LOG:
  815. C 91-09-13 CAVANAUGH
  816. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  817. C
  818. C USAGE: CALL FI631(MSGA,KPTR,KPDS,KRET)
  819. C INPUT ARGUMENT LIST:
  820. C MSGA - GRIB FIELD - "GRIB" THRU "7777"
  821. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  822. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  823. C (2) - LENGTH OF INDICATOR (SECTION 0)
  824. C (3) - LENGTH OF PDS (SECTION 1)
  825. C (4) - LENGTH OF GDS (SECTION 2)
  826. C (5) - LENGTH OF BMS (SECTION 3)
  827. C (6) - LENGTH OF BDS (SECTION 4)
  828. C (7) - VALUE OF CURRENT BYTE
  829. C (8) - BIT POINTER
  830. C (9) - GRIB START BIT NR
  831. C (10) - GRIB/GRID ELEMENT COUNT
  832. C (11) - NR UNUSED BITS AT END OF SECTION 3
  833. C (12) - BIT MAP FLAG
  834. C (13) - NR UNUSED BITS AT END OF SECTION 2
  835. C (14) - BDS FLAGS
  836. C (15) - NR UNUSED BITS AT END OF SECTION 4
  837. C
  838. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  839. C KPDS - ARRAY CONTAINING PDS ELEMENTS.
  840. C (1) - ID OF CENTER
  841. C (2) - MODEL IDENTIFICATION
  842. C (3) - GRID IDENTIFICATION
  843. C (4) - GDS/BMS FLAG
  844. C (5) - INDICATOR OF PARAMETER
  845. C (6) - TYPE OF LEVEL
  846. C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
  847. C (8) - YEAR OF CENTURY
  848. C (9) - MONTH OF YEAR
  849. C (10) - DAY OF MONTH
  850. C (11) - HOUR OF DAY
  851. C (12) - MINUTE OF HOUR
  852. C (13) - INDICATOR OF FORECAST TIME UNIT
  853. C (14) - TIME RANGE 1
  854. C (15) - TIME RANGE 2
  855. C (16) - TIME RANGE FLAG
  856. C (17) - NUMBER INCLUDED IN AVERAGE
  857. C KPTR - SEE INPUT LIST
  858. C KRET - ERROR RETURN
  859. C
  860. C REMARKS:
  861. C ERROR RETURNS
  862. C KRET = 1 - NO 'GRIB'
  863. C 2 - NO '7777' OR MISLOCATED (BY COUNTS)
  864. C
  865. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  866. C
  867. C ATTRIBUTES:
  868. C LANGUAGE: FORTRAN 77
  869. C MACHINE: HDS9000
  870. C
  871. C$$$
  872. C
  873. C INCOMING MESSAGE HOLDER
  874. CHARACTER*1 MSGA(*)
  875. C ARRAY OF POINTERS AND COUNTERS
  876. INTEGER KPTR(*)
  877. C PRODUCT DESCRIPTION SECTION DATA.
  878. INTEGER KPDS(*)
  879. C
  880. INTEGER KRET
  881. C
  882. C ******************************************************************
  883. KRET = 0
  884. C ------------------- FIND 'GRIB' KEY
  885. DO 50 I = 0, 839, 8
  886. CALL GBYTEC (MSGA,MGRIB,I,32)
  887. IF (MGRIB.EQ.1196575042) THEN
  888. KPTR(9) = I
  889. GO TO 60
  890. END IF
  891. 50 CONTINUE
  892. KRET = 1
  893. RETURN
  894. 60 CONTINUE
  895. C -------------FOUND 'GRIB'
  896. C SKIP GRIB CHARACTERS
  897. C PRINT *,'FI631 GRIB AT',I
  898. KPTR(8) = KPTR(9) + 32
  899. CALL GBYTEC (MSGA,ITOTAL,KPTR(8),24)
  900. C HAVE LIFTED WHAT MAY BE A MSG TOTAL BYTE COUNT
  901. IPOINT = KPTR(9) + ITOTAL * 8 - 32
  902. CALL GBYTEC (MSGA,I7777,IPOINT,32)
  903. IF (I7777.EQ.926365495) THEN
  904. C HAVE FOUND END OF MESSAGE '7777' IN PROPER LOCATION
  905. C MARK AND PROCESS AS GRIB VERSION 1 OR HIGHER
  906. C PRINT *,'FI631 7777 AT',IPOINT
  907. KPTR(8) = KPTR(8) + 24
  908. KPTR(1) = ITOTAL
  909. KPTR(2) = 8
  910. CALL GBYTEC (MSGA,KPDS(18),KPTR(8),8)
  911. KPTR(8) = KPTR(8) + 8
  912. ELSE
  913. C CANNOT FIND END OF GRIB EDITION 1 MESSAGE
  914. KRET = 2
  915. RETURN
  916. END IF
  917. C ------------------- PROCESS SECTION 1
  918. C EXTRACT COUNT FROM PDS
  919. C PRINT *,'START OF PDS',KPTR(8)
  920. CALL GBYTEC (MSGA,KPTR(3),KPTR(8),24)
  921. LOOK = KPTR(8) + 56
  922. C EXTRACT GDS/BMS FLAG
  923. CALL GBYTEC (MSGA,KPDS(4),LOOK,8)
  924. KPTR(8) = KPTR(8) + KPTR(3) * 8
  925. C PRINT *,'START OF GDS',KPTR(8)
  926. IF (IAND(KPDS(4),128).NE.0) THEN
  927. C EXTRACT COUNT FROM GDS
  928. CALL GBYTEC (MSGA,KPTR(4),KPTR(8),24)
  929. KPTR(8) = KPTR(8) + KPTR(4) * 8
  930. ELSE
  931. KPTR(4) = 0
  932. END IF
  933. C PRINT *,'START OF BMS',KPTR(8)
  934. IF (IAND(KPDS(4),64).NE.0) THEN
  935. C EXTRACT COUNT FROM BMS
  936. CALL GBYTEC (MSGA,KPTR(5),KPTR(8),24)
  937. ELSE
  938. KPTR(5) = 0
  939. END IF
  940. KPTR(8) = KPTR(8) + KPTR(5) * 8
  941. C PRINT *,'START OF BDS',KPTR(8)
  942. C EXTRACT COUNT FROM BDS
  943. CALL GBYTEC (MSGA,KPTR(6),KPTR(8),24)
  944. C --------------- TEST FOR '7777'
  945. C PRINT *,(KPTR(KJ),KJ=1,10)
  946. KPTR(8) = KPTR(8) + KPTR(6) * 8
  947. C EXTRACT FOUR BYTES FROM THIS LOCATION
  948. C PRINT *,'FI631 LOOKING FOR 7777 AT',KPTR(8)
  949. CALL GBYTEC (MSGA,K7777,KPTR(8),32)
  950. MATCH = KPTR(2) + KPTR(3) + KPTR(4) + KPTR(5) + KPTR(6) + 4
  951. IF (K7777.NE.926365495.OR.MATCH.NE.KPTR(1)) THEN
  952. KRET = 2
  953. ELSE
  954. C PRINT *,'FI631 7777 AT',KPTR(8)
  955. IF (KPDS(18).EQ.0) THEN
  956. KPTR(1) = KPTR(2) + KPTR(3) + KPTR(4) + KPTR(5) +
  957. * KPTR(6) + 4
  958. END IF
  959. END IF
  960. C PRINT *,'KPTR',(KPTR(I),I=1,16)
  961. RETURN
  962. END
  963. SUBROUTINE FI632(MSGA,KPTR,KPDS,KRET)
  964. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  965. C . . . .
  966. C SUBPROGRAM: FI632 GATHER INFO FROM PRODUCT DEFINITION SEC
  967. C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  968. C
  969. C ABSTRACT: EXTRACT INFORMATION FROM THE PRODUCT DESCRIPTION
  970. C SEC , AND GENERATE LABEL INFORMATION TO PERMIT STORAGE
  971. C IN OFFICE NOTE 84 FORMAT.
  972. C
  973. C PROGRAM HISTORY LOG:
  974. C 91-09-13 CAVANAUGH
  975. C 93-12-08 CAVANAUGH CORRECTED TEST FOR EDITION NUMBER INSTEAD
  976. C OF VERSION NUMBER
  977. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  978. C 99-01-20 BALDWIN MODIFIED TO HANDLE GRID 237
  979. C
  980. C USAGE: CALL FI632(MSGA,KPTR,KPDS,KRET)
  981. C INPUT ARGUMENT LIST:
  982. C MSGA - ARRAY CONTAINING GRIB MESSAGE
  983. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  984. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  985. C (2) - LENGTH OF INDICATOR (SECTION 0)
  986. C (3) - LENGTH OF PDS (SECTION 1)
  987. C (4) - LENGTH OF GDS (SECTION 2)
  988. C (5) - LENGTH OF BMS (SECTION 3)
  989. C (6) - LENGTH OF BDS (SECTION 4)
  990. C (7) - VALUE OF CURRENT BYTE
  991. C (8) - BIT POINTER
  992. C (9) - GRIB START BIT NR
  993. C (10) - GRIB/GRID ELEMENT COUNT
  994. C (11) - NR UNUSED BITS AT END OF SECTION 3
  995. C (12) - BIT MAP FLAG
  996. C (13) - NR UNUSED BITS AT END OF SECTION 2
  997. C (14) - BDS FLAGS
  998. C (15) - NR UNUSED BITS AT END OF SECTION 4
  999. C
  1000. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  1001. C KPDS - ARRAY CONTAINING PDS ELEMENTS.
  1002. C (1) - ID OF CENTER
  1003. C (2) - MODEL IDENTIFICATION
  1004. C (3) - GRID IDENTIFICATION
  1005. C (4) - GDS/BMS FLAG
  1006. C (5) - INDICATOR OF PARAMETER
  1007. C (6) - TYPE OF LEVEL
  1008. C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
  1009. C (8) - YEAR OF CENTURY
  1010. C (9) - MONTH OF YEAR
  1011. C (10) - DAY OF MONTH
  1012. C (11) - HOUR OF DAY
  1013. C (12) - MINUTE OF HOUR
  1014. C (13) - INDICATOR OF FORECAST TIME UNIT
  1015. C (14) - TIME RANGE 1
  1016. C (15) - TIME RANGE 2
  1017. C (16) - TIME RANGE FLAG
  1018. C (17) - NUMBER INCLUDED IN AVERAGE
  1019. C (18) -
  1020. C (19) -
  1021. C (20) - NUMBER MISSING FROM AVGS/ACCUMULATIONS
  1022. C (21) - CENTURY
  1023. C (22) - UNITS DECIMAL SCALE FACTOR
  1024. C (23) - SUBCENTER
  1025. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  1026. C SEE INPUT LIST
  1027. C KRET - ERROR RETURN
  1028. C
  1029. C REMARKS:
  1030. C ERROR RETURN = 0 - NO ERRORS
  1031. C = 8 - TEMP GDS INDICATED, BUT NO GDS
  1032. C
  1033. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1034. C
  1035. C ATTRIBUTES:
  1036. C LANGUAGE: FORTRAN 77
  1037. C MACHINE: HDS9000
  1038. C
  1039. C$$$
  1040. C
  1041. C INCOMING MESSAGE HOLDER
  1042. CHARACTER*1 MSGA(*)
  1043. C
  1044. C ARRAY OF POINTERS AND COUNTERS
  1045. INTEGER KPTR(*)
  1046. C PRODUCT DESCRIPTION SECTION ENTRIES
  1047. INTEGER KPDS(*)
  1048. C
  1049. INTEGER KRET
  1050. KRET=0
  1051. C ------------------- PROCESS SECTION 1
  1052. KPTR(8) = KPTR(9) + KPTR(2) * 8 + 24
  1053. C BYTE 4
  1054. C PARAMETER TABLE VERSION NR
  1055. CALL GBYTEC (MSGA,KPDS(19),KPTR(8),8)
  1056. KPTR(8) = KPTR(8) + 8
  1057. C BYTE 5 IDENTIFICATION OF CENTER
  1058. CALL GBYTEC (MSGA,KPDS(1),KPTR(8),8)
  1059. KPTR(8) = KPTR(8) + 8
  1060. C BYTE 6
  1061. C GET GENERATING PROCESS ID NR
  1062. CALL GBYTEC (MSGA,KPDS(2),KPTR(8),8)
  1063. KPTR(8) = KPTR(8) + 8
  1064. C BYTE 7
  1065. C GRID DEFINITION
  1066. CALL GBYTEC (MSGA,KPDS(3),KPTR(8),8)
  1067. KPTR(8) = KPTR(8) + 8
  1068. C BYTE 8
  1069. C GDS/BMS FLAGS
  1070. C CALL GBYTEC (MSGA,KPDS(4),KPTR(8),8)
  1071. KPTR(8) = KPTR(8) + 8
  1072. C BYTE 9
  1073. C INDICATOR OF PARAMETER
  1074. CALL GBYTEC (MSGA,KPDS(5),KPTR(8),8)
  1075. KPTR(8) = KPTR(8) + 8
  1076. C BYTE 10
  1077. C TYPE OF LEVEL
  1078. CALL GBYTEC (MSGA,KPDS(6),KPTR(8),8)
  1079. KPTR(8) = KPTR(8) + 8
  1080. C BYTE 11,12
  1081. C HEIGHT/PRESSURE
  1082. CALL GBYTEC (MSGA,KPDS(7),KPTR(8),16)
  1083. KPTR(8) = KPTR(8) + 16
  1084. C BYTE 13
  1085. C YEAR OF CENTURY
  1086. CALL GBYTEC (MSGA,KPDS(8),KPTR(8),8)
  1087. KPTR(8) = KPTR(8) + 8
  1088. C BYTE 14
  1089. C MONTH OF YEAR
  1090. CALL GBYTEC (MSGA,KPDS(9),KPTR(8),8)
  1091. KPTR(8) = KPTR(8) + 8
  1092. C BYTE 15
  1093. C DAY OF MONTH
  1094. CALL GBYTEC (MSGA,KPDS(10),KPTR(8),8)
  1095. KPTR(8) = KPTR(8) + 8
  1096. C BYTE 16
  1097. C HOUR OF DAY
  1098. CALL GBYTEC (MSGA,KPDS(11),KPTR(8),8)
  1099. KPTR(8) = KPTR(8) + 8
  1100. C BYTE 17
  1101. C MINUTE
  1102. CALL GBYTEC (MSGA,KPDS(12),KPTR(8),8)
  1103. KPTR(8) = KPTR(8) + 8
  1104. C BYTE 18
  1105. C INDICATOR TIME UNIT RANGE
  1106. CALL GBYTEC (MSGA,KPDS(13),KPTR(8),8)
  1107. KPTR(8) = KPTR(8) + 8
  1108. C BYTE 19
  1109. C P1 - PERIOD OF TIME
  1110. CALL GBYTEC (MSGA,KPDS(14),KPTR(8),8)
  1111. KPTR(8) = KPTR(8) + 8
  1112. C BYTE 20
  1113. C P2 - PERIOD OF TIME
  1114. CALL GBYTEC (MSGA,KPDS(15),KPTR(8),8)
  1115. KPTR(8) = KPTR(8) + 8
  1116. C BYTE 21
  1117. C TIME RANGE INDICATOR
  1118. CALL GBYTEC (MSGA,KPDS(16),KPTR(8),8)
  1119. KPTR(8) = KPTR(8) + 8
  1120. C
  1121. C IF TIME RANGE INDICATOR IS 10, P1 IS PACKED IN
  1122. C PDS BYTES 19-20
  1123. C
  1124. IF (KPDS(16).EQ.10) THEN
  1125. KPDS(14) = KPDS(14) * 256 + KPDS(15)
  1126. KPDS(15) = 0
  1127. END IF
  1128. C BYTE 22,23
  1129. C NUMBER INCLUDED IN AVERAGE
  1130. CALL GBYTEC (MSGA,KPDS(17),KPTR(8),16)
  1131. KPTR(8) = KPTR(8) + 16
  1132. C BYTE 24
  1133. C NUMBER MISSING FROM AVERAGES/ACCUMULATIONS
  1134. CALL GBYTEC (MSGA,KPDS(20),KPTR(8),8)
  1135. KPTR(8) = KPTR(8) + 8
  1136. C BYTE 25
  1137. C IDENTIFICATION OF CENTURY
  1138. CALL GBYTEC (MSGA,KPDS(21),KPTR(8),8)
  1139. KPTR(8) = KPTR(8) + 8
  1140. IF (KPTR(3).GT.25) THEN
  1141. C BYTE 26 SUB CENTER NUMBER
  1142. CALL GBYTEC (MSGA,KPDS(23),KPTR(8),8)
  1143. KPTR(8) = KPTR(8) + 8
  1144. IF (KPTR(3).GE.28) THEN
  1145. C BYTE 27-28
  1146. C UNITS DECIMAL SCALE FACTOR
  1147. CALL GBYTEC (MSGA,ISIGN,KPTR(8),1)
  1148. KPTR(8) = KPTR(8) + 1
  1149. CALL GBYTEC (MSGA,IDEC,KPTR(8),15)
  1150. KPTR(8) = KPTR(8) + 15
  1151. IF (ISIGN.GT.0) THEN
  1152. KPDS(22) = - IDEC
  1153. ELSE
  1154. KPDS(22) = IDEC
  1155. END IF
  1156. ISIZ = KPTR(3) - 28
  1157. IF (ISIZ.LE.12) THEN
  1158. C BYTE 29
  1159. CALL GBYTEC (MSGA,KPDS(24),KPTR(8)+8,8)
  1160. C BYTE 30
  1161. CALL GBYTEC (MSGA,KPDS(25),KPTR(8)+16,8)
  1162. C BYTES 31-40 CURRENTLY RESERVED FOR FUTURE USE
  1163. KPTR(8) = KPTR(8) + ISIZ * 8
  1164. ELSE
  1165. C BYTE 29
  1166. CALL GBYTEC (MSGA,KPDS(24),KPTR(8)+8,8)
  1167. C BYTE 30
  1168. CALL GBYTEC (MSGA,KPDS(25),KPTR(8)+16,8)
  1169. C BYTES 31-40 CURRENTLY RESERVED FOR FUTURE USE
  1170. KPTR(8) = KPTR(8) + 12 * 8
  1171. C BYTES 41 - N LOCAL USE DATA
  1172. CALL W3FI01(LW)
  1173. C MWDBIT = LW * 8
  1174. MWDBIT = bit_size(KPDS)
  1175. ISIZ = KPTR(3) - 40
  1176. ITER = ISIZ / LW
  1177. IF (MOD(ISIZ,LW).NE.0) ITER = ITER + 1
  1178. CALL GBYTESC (MSGA,KPDS(36),KPTR(8),MWDBIT,0,ITER)
  1179. KPTR(8) = KPTR(8) + ISIZ * 8
  1180. END IF
  1181. END IF
  1182. END IF
  1183. C ----------- TEST FOR NEW GRID
  1184. IF (IAND(KPDS(4),128).NE.0) THEN
  1185. IF (IAND(KPDS(4),64).NE.0) THEN
  1186. IF (KPDS(3).NE.255) THEN
  1187. IF (KPDS(3).GE.21.AND.KPDS(3).LE.26)THEN
  1188. RETURN
  1189. ELSE IF (KPDS(3).GE.37.AND.KPDS(3).LE.44)THEN
  1190. RETURN
  1191. ELSE IF (KPDS(3).GE.61.AND.KPDS(3).LE.64) THEN
  1192. RETURN
  1193. END IF
  1194. IF (KPDS(1).EQ.7) THEN
  1195. IF (KPDS(3).GE.2.AND.KPDS(3).LE.3) THEN
  1196. ELSE IF (KPDS(3).GE.5.AND.KPDS(3).LE.6) THEN
  1197. ELSE IF (KPDS(3).EQ.8) THEN
  1198. ELSE IF (KPDS(3).EQ.10) THEN
  1199. ELSE IF (KPDS(3).GE.27.AND.KPDS(3).LE.34) THEN
  1200. ELSE IF (KPDS(3).EQ.50) THEN
  1201. ELSE IF (KPDS(3).EQ.53) THEN
  1202. ELSE IF (KPDS(3).GE.70.AND.KPDS(3).LE.77) THEN
  1203. ELSE IF (KPDS(3).EQ.98) THEN
  1204. ELSE IF (KPDS(3).EQ.99) THEN
  1205. ELSE IF (KPDS(3).GE.100.AND.KPDS(3).LE.105) THEN
  1206. ELSE IF (KPDS(3).EQ.126) THEN
  1207. ELSE IF (KPDS(3).EQ.195) THEN
  1208. ELSE IF (KPDS(3).EQ.196) THEN
  1209. ELSE IF (KPDS(3).EQ.197) THEN
  1210. ELSE IF (KPDS(3).EQ.198) THEN
  1211. ELSE IF (KPDS(3).GE.201.AND.KPDS(3).LE.237) THEN
  1212. ELSE
  1213. C PRINT *,' HAVE ENCOUNTERED A NEW GRID FOR',
  1214. C * ' NMC WITHOUT A GRID DESCRIPTION SECTION'
  1215. C PRINT *,' PLEASE NOTIFY AUTOMATION DIVISION'
  1216. C PRINT *,' PRODUCTION MANAGEMENT BRANCH'
  1217. C PRINT *,' W/NMC42)'
  1218. END IF
  1219. ELSE IF (KPDS(1).EQ.98) THEN
  1220. IF (KPDS(3).GE.1.AND.KPDS(3).LE.16) THEN
  1221. ELSE
  1222. C PRINT *,' HAVE ENCOUNTERED A NEW GRID FOR',
  1223. C * ' ECMWF WITHOUT A GRID DESCRIPTION SECTION'
  1224. C PRINT *,' PLEASE NOTIFY AUTOMATION DIVISION'
  1225. C PRINT *,' PRODUCTION MANAGEMENT BRANCH'
  1226. C PRINT *,' W/NMC42)'
  1227. END IF
  1228. ELSE IF (KPDS(1).EQ.74) THEN
  1229. IF (KPDS(3).GE.1.AND.KPDS(3).LE.12) THEN
  1230. ELSE IF (KPDS(3).GE.21.AND.KPDS(3).LE.26)THEN
  1231. ELSE IF (KPDS(3).GE.61.AND.KPDS(3).LE.64) THEN
  1232. ELSE IF (KPDS(3).GE.70.AND.KPDS(3).LE.77) THEN
  1233. ELSE
  1234. C PRINT *,' HAVE ENCOUNTERED A NEW GRID FOR',
  1235. C * ' U.K. MET OFFICE, BRACKNELL',
  1236. C * ' WITHOUT A GRID DESCRIPTION SECTION'
  1237. C PRINT *,' PLEASE NOTIFY AUTOMATION DIVISION'
  1238. C PRINT *,' PRODUCTION MANAGEMENT BRANCH'
  1239. C PRINT *,' W/NMC42)'
  1240. END IF
  1241. ELSE IF (KPDS(1).EQ.58) THEN
  1242. IF (KPDS(3).GE.1.AND.KPDS(3).LE.12) THEN
  1243. ELSE
  1244. C PRINT *,' HAVE ENCOUNTERED A NEW GRID FOR',
  1245. C * ' FNOC WITHOUT A GRID DESCRIPTION SECTION'
  1246. C PRINT *,' PLEASE NOTIFY AUTOMATION DIVISION'
  1247. C PRINT *,' PRODUCTION MANAGEMENT BRANCH'
  1248. C PRINT *,' W/NMC42)'
  1249. END IF
  1250. END IF
  1251. END IF
  1252. END IF
  1253. END IF
  1254. RETURN
  1255. END
  1256. SUBROUTINE FI633(MSGA,KPTR,KGDS,KRET)
  1257. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  1258. C . . . .
  1259. C SUBPROGRAM: FI633 EXTRACT INFO FROM GRIB-GDS
  1260. C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  1261. C
  1262. C ABSTRACT: EXTRACT INFORMATION ON UNLISTED GRID TO ALLOW
  1263. C CONVERSION TO OFFICE NOTE 84 FORMAT.
  1264. C
  1265. C PROGRAM HISTORY LOG:
  1266. C 91-09-13 CAVANAUGH
  1267. C 95-03-20 M.BALDWIN FI633 MODIFICATION TO GET
  1268. C DATA REP TYPES [KGDS(1)] 201 AND 202 TO WORK.
  1269. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  1270. C 98-09-08 BALDWIN ADD DATA REP TYPE [KGDS(1)] 203
  1271. C 07-04-24 VUONG ADD DATA REP TYPE [KGDS(1)] 204
  1272. C 10-07-20 GAYNO ADD DATA REP TYPE [KGDS(1)] 205
  1273. C
  1274. C
  1275. C USAGE: CALL FI633(MSGA,KPTR,KGDS,KRET)
  1276. C INPUT ARGUMENT LIST:
  1277. C MSGA - ARRAY CONTAINING GRIB MESSAGE
  1278. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  1279. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  1280. C (2) - LENGTH OF INDICATOR (SECTION 0)
  1281. C (3) - LENGTH OF PDS (SECTION 1)
  1282. C (4) - LENGTH OF GDS (SECTION 2)
  1283. C (5) - LENGTH OF BMS (SECTION 3)
  1284. C (6) - LENGTH OF BDS (SECTION 4)
  1285. C (7) - VALUE OF CURRENT BYTE
  1286. C (8) - BIT POINTER
  1287. C (9) - GRIB START BIT NR
  1288. C (10) - GRIB/GRID ELEMENT COUNT
  1289. C (11) - NR UNUSED BITS AT END OF SECTION 3
  1290. C (12) - BIT MAP FLAG
  1291. C (13) - NR UNUSED BITS AT END OF SECTION 2
  1292. C (14) - BDS FLAGS
  1293. C (15) - NR UNUSED BITS AT END OF SECTION 4
  1294. C
  1295. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  1296. C KGDS - ARRAY CONTAINING GDS ELEMENTS.
  1297. C (1) - DATA REPRESENTATION TYPE
  1298. C (19) - NUMBER OF VERTICAL COORDINATE PARAMETERS
  1299. C (20) - OCTET NUMBER OF THE LIST OF VERTICAL COORDINATE
  1300. C PARAMETERS
  1301. C OR
  1302. C OCTET NUMBER OF THE LIST OF NUMBERS OF POINTS
  1303. C IN EACH ROW
  1304. C OR
  1305. C 255 IF NEITHER ARE PRESENT
  1306. C (21) - FOR GRIDS WITH PL, NUMBER OF POINTS IN GRID
  1307. C (22) - NUMBER OF WORDS IN EACH ROW
  1308. C LATITUDE/LONGITUDE GRIDS
  1309. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  1310. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  1311. C (4) - LA(1) LATITUDE OF ORIGIN
  1312. C (5) - LO(1) LONGITUDE OF ORIGIN
  1313. C (6) - RESOLUTION FLAG
  1314. C (7) - LA(2) LATITUDE OF EXTREME POINT
  1315. C (8) - LO(2) LONGITUDE OF EXTREME POINT
  1316. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  1317. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  1318. C (11) - SCANNING MODE FLAG
  1319. C POLAR STEREOGRAPHIC GRIDS
  1320. C (2) - N(I) NR POINTS ALONG LAT CIRCLE
  1321. C (3) - N(J) NR POINTS ALONG LON CIRCLE
  1322. C (4) - LA(1) LATITUDE OF ORIGIN
  1323. C (5) - LO(1) LONGITUDE OF ORIGIN
  1324. C (6) - RESERVED
  1325. C (7) - LOV GRID ORIENTATION
  1326. C (8) - DX - X DIRECTION INCREMENT
  1327. C (9) - DY - Y DIRECTION INCREMENT
  1328. C (10) - PROJECTION CENTER FLAG
  1329. C (11) - SCANNING MODE
  1330. C SPHERICAL HARMONIC COEFFICIENTS
  1331. C (2) - J PENTAGONAL RESOLUTION PARAMETER
  1332. C (3) - K " " "
  1333. C (4) - M " " "
  1334. C (5) - REPRESENTATION TYPE
  1335. C (6) - COEFFICIENT STORAGE MODE
  1336. C MERCATOR GRIDS
  1337. C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
  1338. C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
  1339. C (4) - LA(1) LATITUDE OF ORIGIN
  1340. C (5) - LO(1) LONGITUDE OF ORIGIN
  1341. C (6) - RESOLUTION FLAG
  1342. C (7) - LA(2) LATITUDE OF LAST GRID POINT
  1343. C (8) - LO(2) LONGITUDE OF LAST GRID POINT
  1344. C (9) - LATIN - LATITUDE OF PROJECTION INTERSECTION
  1345. C (10) - RESERVED
  1346. C (11) - SCANNING MODE FLAG
  1347. C (12) - LONGITUDINAL DIR GRID LENGTH
  1348. C (13) - LATITUDINAL DIR GRID LENGTH
  1349. C LAMBERT CONFORMAL GRIDS
  1350. C (2) - NX NR POINTS ALONG X-AXIS
  1351. C (3) - NY NR POINTS ALONG Y-AXIS
  1352. C (4) - LA1 LAT OF ORIGIN (LOWER LEFT)
  1353. C (5) - LO1 LON OF ORIGIN (LOWER LEFT)
  1354. C (6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
  1355. C (7) - LOV - ORIENTATION OF GRID
  1356. C (8) - DX - X-DIR INCREMENT
  1357. C (9) - DY - Y-DIR INCREMENT
  1358. C (10) - PROJECTION CENTER FLAG
  1359. C (11) - SCANNING MODE FLAG
  1360. C (12) - LATIN 1 - FIRST LAT FROM POLE OF SECANT CONE INTER
  1361. C (13) - LATIN 2 - SECOND LAT FROM POLE OF SECANT CONE INTER
  1362. C STAGGERED ARAKAWA ROTATED LAT/LON GRIDS (203 E STAGGER)
  1363. C (2) - N(I) NR POINTS ON ROTATED LATITUDE CIRCLE
  1364. C (3) - N(J) NR POINTS ON ROTATED LONGITUDE MERIDIAN
  1365. C (4) - LA(1) LATITUDE OF ORIGIN
  1366. C (5) - LO(1) LONGITUDE OF ORIGIN
  1367. C (6) - RESOLUTION FLAG
  1368. C (7) - LA(2) LATITUDE OF CENTER
  1369. C (8) - LO(2) LONGITUDE OF CENTER
  1370. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  1371. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  1372. C (11) - SCANNING MODE FLAG
  1373. C STAGGERED ARAKAWA ROTATED LAT/LON GRIDS (205 A,B,C,D STAGGERS)
  1374. C (2) - N(I) NR POINTS ON ROTATED LATITUDE CIRCLE
  1375. C (3) - N(J) NR POINTS ON ROTATED LONGITUDE MERIDIAN
  1376. C (4) - LA(1) LATITUDE OF ORIGIN
  1377. C (5) - LO(1) LONGITUDE OF ORIGIN
  1378. C (6) - RESOLUTION FLAG
  1379. C (7) - LA(2) LATITUDE OF CENTER
  1380. C (8) - LO(2) LONGITUDE OF CENTER
  1381. C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
  1382. C (10) - DJ LATITUDINAL DIRECTION INCREMENT
  1383. C (11) - SCANNING MODE FLAG
  1384. C (12) - LATITUDE OF LAST POINT
  1385. C (13) - LONGITUDE OF LAST POINT
  1386. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  1387. C SEE INPUT LIST
  1388. C KRET - ERROR RETURN
  1389. C
  1390. C REMARKS:
  1391. C KRET = 0
  1392. C = 4 - DATA REPRESENTATION TYPE NOT CURRENTLY ACCEPTABLE
  1393. C
  1394. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1395. C
  1396. C ATTRIBUTES:
  1397. C LANGUAGE: FORTRAN 77
  1398. C MACHINE: HDS9000
  1399. C
  1400. C$$$
  1401. C ************************************************************
  1402. C INCOMING MESSAGE HOLDER
  1403. CHARACTER*1 MSGA(*)
  1404. C
  1405. C ARRAY GDS ELEMENTS
  1406. INTEGER KGDS(*)
  1407. C ARRAY OF POINTERS AND COUNTERS
  1408. INTEGER KPTR(*)
  1409. C
  1410. INTEGER KRET
  1411. C ---------------------------------------------------------------
  1412. KRET = 0
  1413. C PROCESS GRID DEFINITION SECTION (IF PRESENT)
  1414. C MAKE SURE BIT POINTER IS PROPERLY SET
  1415. KPTR(8) = KPTR(9) + (KPTR(2)*8) + (KPTR(3)*8) + 24
  1416. NSAVE = KPTR(8) - 24
  1417. C BYTE 4
  1418. C NV - NR OF VERT COORD PARAMETERS
  1419. CALL GBYTEC (MSGA,KGDS(19),KPTR(8),8)
  1420. KPTR(8) = KPTR(8) + 8
  1421. C BYTE 5
  1422. C PV - LOCATION - SEE FM92 MANUAL
  1423. CALL GBYTEC (MSGA,KGDS(20),KPTR(8),8)
  1424. KPTR(8) = KPTR(8) + 8
  1425. C BYTE 6
  1426. C DATA REPRESENTATION TYPE
  1427. CALL GBYTEC (MSGA,KGDS(1),KPTR(8),8)
  1428. KPTR(8) = KPTR(8) + 8
  1429. C BYTES 7-32 ARE GRID DEFINITION DEPENDING ON
  1430. C DATA REPRESENTATION TYPE
  1431. IF (KGDS(1).EQ.0) THEN
  1432. GO TO 1000
  1433. ELSE IF (KGDS(1).EQ.1) THEN
  1434. GO TO 4000
  1435. ELSE IF (KGDS(1).EQ.2.OR.KGDS(1).EQ.5) THEN
  1436. GO TO 2000
  1437. ELSE IF (KGDS(1).EQ.3) THEN
  1438. GO TO 5000
  1439. ELSE IF (KGDS(1).EQ.4) THEN
  1440. GO TO 1000
  1441. C ELSE IF (KGDS(1).EQ.10) THEN
  1442. C ELSE IF (KGDS(1).EQ.14) THEN
  1443. C ELSE IF (KGDS(1).EQ.20) THEN
  1444. C ELSE IF (KGDS(1).EQ.24) THEN
  1445. C ELSE IF (KGDS(1).EQ.30) THEN
  1446. C ELSE IF (KGDS(1).EQ.34) THEN
  1447. ELSE IF (KGDS(1).EQ.50) THEN
  1448. GO TO 3000
  1449. C ELSE IF (KGDS(1).EQ.60) THEN
  1450. C ELSE IF (KGDS(1).EQ.70) THEN
  1451. C ELSE IF (KGDS(1).EQ.80) THEN
  1452. ELSE IF (KGDS(1).EQ.201.OR.KGDS(1).EQ.202.OR.
  1453. & KGDS(1).EQ.203.OR.KGDS(1).EQ.204.OR.KGDS(1).EQ.205) THEN
  1454. GO TO 1000
  1455. ELSE
  1456. C MARK AS GDS/ UNKNOWN DATA REPRESENTATION TYPE
  1457. KRET = 4
  1458. RETURN
  1459. END IF
  1460. C BYTE 33-N VERTICAL COORDINATE PARAMETERS
  1461. C -----------
  1462. C BYTES 33-42 EXTENSIONS OF GRID DEFINITION FOR ROTATION
  1463. C OR STRETCHING OF THE COORDINATE SYSTEM OR
  1464. C LAMBERT CONFORMAL PROJECTION.
  1465. C BYTE 43-N VERTICAL COORDINATE PARAMETERS
  1466. C -----------
  1467. C BYTES 33-52 EXTENSIONS OF GRID DEFINITION FOR STRETCHED
  1468. C AND ROTATED COORDINATE SYSTEM
  1469. C BYTE 53-N VERTICAL COORDINATE PARAMETERS
  1470. C -----------
  1471. C ************************************************************
  1472. C ------------------- LATITUDE/LONGITUDE GRIDS
  1473. C ------------------- ARAKAWA STAGGERED, SEMI-STAGGERED, OR FILLED
  1474. C ROTATED LAT/LON GRIDS OR CURVILINEAR ORTHIGINAL GRIDS
  1475. C
  1476. C ------------------- BYTE 7-8 NR OF POINTS ALONG LATITUDE CIRCLE
  1477. 1000 CONTINUE
  1478. CALL GBYTEC (MSGA,KGDS(2),KPTR(8),16)
  1479. KPTR(8) = KPTR(8) + 16
  1480. C ------------------- BYTE 9-10 NR OF POINTS ALONG LONG MERIDIAN
  1481. CALL GBYTEC (MSGA,KGDS(3),KPTR(8),16)
  1482. KPTR(8) = KPTR(8) + 16
  1483. C ------------------- BYTE 11-13 LATITUDE OF ORIGIN
  1484. CALL GBYTEC (MSGA,KGDS(4),KPTR(8),24)
  1485. KPTR(8) = KPTR(8) + 24
  1486. IF (IAND(KGDS(4),8388608).NE.0) THEN
  1487. KGDS(4) = IAND(KGDS(4),8388607) * (-1)
  1488. END IF
  1489. C ------------------- BYTE 14-16 LONGITUDE OF ORIGIN
  1490. CALL GBYTEC (MSGA,KGDS(5),KPTR(8),24)
  1491. KPTR(8) = KPTR(8) + 24
  1492. IF (IAND(KGDS(5),8388608).NE.0) THEN
  1493. KGDS(5) = - IAND(KGDS(5),8388607)
  1494. END IF
  1495. C ------------------- BYTE 17 RESOLUTION FLAG
  1496. CALL GBYTEC (MSGA,KGDS(6),KPTR(8),8)
  1497. KPTR(8) = KPTR(8) + 8
  1498. C ------------------- BYTE 18-20 LATITUDE OF LAST GRID POINT
  1499. CALL GBYTEC (MSGA,KGDS(7),KPTR(8),24)
  1500. KPTR(8) = KPTR(8) + 24
  1501. IF (IAND(KGDS(7),8388608).NE.0) THEN
  1502. KGDS(7) = - IAND(KGDS(7),8388607)
  1503. END IF
  1504. C ------------------- BYTE 21-23 LONGITUDE OF LAST GRID POINT
  1505. CALL GBYTEC (MSGA,KGDS(8),KPTR(8),24)
  1506. KPTR(8) = KPTR(8) + 24
  1507. IF (IAND(KGDS(8),8388608).NE.0) THEN
  1508. KGDS(8) = - IAND(KGDS(8),8388607)
  1509. END IF
  1510. C ------------------- BYTE 24-25 LATITUDINAL DIR INCREMENT
  1511. CALL GBYTEC (MSGA,KGDS(9),KPTR(8),16)
  1512. KPTR(8) = KPTR(8) + 16
  1513. C ------------------- BYTE 26-27 IF REGULAR LAT/LON GRID
  1514. C HAVE LONGIT DIR INCREMENT
  1515. C ELSE IF GAUSSIAN GRID
  1516. C HAVE NR OF LAT CIRCLES
  1517. C BETWEEN POLE AND EQUATOR
  1518. CALL GBYTEC (MSGA,KGDS(10),KPTR(8),16)
  1519. KPTR(8) = KPTR(8) + 16
  1520. C ------------------- BYTE 28 SCANNING MODE FLAGS
  1521. CALL GBYTEC (MSGA,KGDS(11),KPTR(8),8)
  1522. KPTR(8) = KPTR(8) + 8
  1523. IF(KGDS(1).EQ.205)THEN
  1524. C ------------------- BYTE 29-31 LATITUDE OF LAST GRID POINT
  1525. CALL GBYTEC (MSGA,KGDS(12),KPTR(8),24)
  1526. KPTR(8) = KPTR(8) + 24
  1527. IF (IAND(KGDS(12),8388608).NE.0) THEN
  1528. KGDS(12) = - IAND(KGDS(12),8388607)
  1529. END IF
  1530. C ------------------- BYTE 32-34 LONGITUDE OF LAST GRID POINT
  1531. CALL GBYTEC (MSGA,KGDS(13),KPTR(8),24)
  1532. KPTR(8) = KPTR(8) + 24
  1533. IF (IAND(KGDS(13),8388608).NE.0) THEN
  1534. KGDS(13) = - IAND(KGDS(13),8388607)
  1535. END IF
  1536. ELSE
  1537. C ------------------- BYTE 29-32 RESERVED
  1538. C SKIP TO START OF BYTE 33
  1539. CALL GBYTEC (MSGA,KGDS(12),KPTR(8),32)
  1540. KPTR(8) = KPTR(8) + 32
  1541. ENDIF
  1542. C -------------------
  1543. GO TO 900
  1544. C ******************************************************************
  1545. C ' POLAR STEREO PROCESSING '
  1546. C
  1547. C ------------------- BYTE 7-8 NR OF POINTS ALONG X=AXIS
  1548. 2000 CONTINUE
  1549. CALL GBYTEC (MSGA,KGDS(2),KPTR(8),16)
  1550. KPTR(8) = KPTR(8) + 16
  1551. C ------------------- BYTE 9-10 NR OF POINTS ALONG Y-AXIS
  1552. CALL GBYTEC (MSGA,KGDS(3),KPTR(8),16)
  1553. KPTR(8) = KPTR(8) + 16
  1554. C ------------------- BYTE 11-13 LATITUDE OF ORIGIN
  1555. CALL GBYTEC (MSGA,KGDS(4),KPTR(8),24)
  1556. KPTR(8) = KPTR(8) + 24
  1557. IF (IAND(KGDS(4),8388608).NE.0) THEN
  1558. KGDS(4) = - IAND(KGDS(4),8388607)
  1559. END IF
  1560. C ------------------- BYTE 14-16 LONGITUDE OF ORIGIN
  1561. CALL GBYTEC (MSGA,KGDS(5),KPTR(8),24)
  1562. KPTR(8) = KPTR(8) + 24
  1563. IF (IAND(KGDS(5),8388608).NE.0) THEN
  1564. KGDS(5) = - IAND(KGDS(5),8388607)
  1565. END IF
  1566. C ------------------- BYTE 17 RESERVED
  1567. CALL GBYTEC (MSGA,KGDS(6),KPTR(8),8)
  1568. KPTR(8) = KPTR(8) + 8
  1569. C ------------------- BYTE 18-20 LOV ORIENTATION OF THE GRID
  1570. CALL GBYTEC (MSGA,KGDS(7),KPTR(8),24)
  1571. KPTR(8) = KPTR(8) + 24
  1572. IF (IAND(KGDS(7),8388608).NE.0) THEN
  1573. KGDS(7) = - IAND(KGDS(7),8388607)
  1574. END IF
  1575. C ------------------- BYTE 21-23 DX - THE X DIRECTION INCREMENT
  1576. CALL GBYTEC (MSGA,KGDS(8),KPTR(8),24)
  1577. KPTR(8) = KPTR(8) + 24
  1578. IF (IAND(KGDS(8),8388608).NE.0) THEN
  1579. KGDS(8) = - IAND(KGDS(8),8388607)
  1580. END IF
  1581. C ------------------- BYTE 24-26 DY - THE Y DIRECTION INCREMENT
  1582. CALL GBYTEC (MSGA,KGDS(9),KPTR(8),24)
  1583. KPTR(8) = KPTR(8) + 24
  1584. IF (IAND(KGDS(9),8388608).NE.0) THEN
  1585. KGDS(9) = - IAND(KGDS(9),8388607)
  1586. END IF
  1587. C ------------------- BYTE 27 PROJECTION CENTER FLAG
  1588. CALL GBYTEC (MSGA,KGDS(10),KPTR(8),8)
  1589. KPTR(8) = KPTR(8) + 8
  1590. C ------------------- BYTE 28 SCANNING MODE
  1591. CALL GBYTEC (MSGA,KGDS(11),KPTR(8),8)
  1592. KPTR(8) = KPTR(8) + 8
  1593. C ------------------- BYTE 29-32 RESERVED
  1594. C SKIP TO START OF BYTE 33
  1595. CALL GBYTEC (MSGA,KGDS(12),KPTR(8),32)
  1596. KPTR(8) = KPTR(8) + 32
  1597. C
  1598. C -------------------
  1599. GO TO 900
  1600. C
  1601. C ******************************************************************
  1602. C ------------------- GRID DESCRIPTION FOR SPHERICAL HARMONIC COEFF.
  1603. C
  1604. C ------------------- BYTE 7-8 J PENTAGONAL RESOLUTION PARAMETER
  1605. 3000 CONTINUE
  1606. CALL GBYTEC (MSGA,KGDS(2),KPTR(8),16)
  1607. KPTR(8) = KPTR(8) + 16
  1608. C ------------------- BYTE 9-10 K PENTAGONAL RESOLUTION PARAMETER
  1609. CALL GBYTEC (MSGA,KGDS(3),KPTR(8),16)
  1610. KPTR(8) = KPTR(8) + 16
  1611. C ------------------- BYTE 11-12 M PENTAGONAL RESOLUTION PARAMETER
  1612. CALL GBYTEC (MSGA,KGDS(4),KPTR(8),16)
  1613. KPTR(8) = KPTR(8) + 16
  1614. C ------------------- BYTE 13 REPRESENTATION TYPE
  1615. CALL GBYTEC (MSGA,KGDS(5),KPTR(8),8)
  1616. KPTR(8) = KPTR(8) + 8
  1617. C ------------------- BYTE 14 COEFFICIENT STORAGE MODE
  1618. CALL GBYTEC (MSGA,KGDS(6),KPTR(8),8)
  1619. KPTR(8) = KPTR(8) + 8
  1620. C ------------------- EMPTY FIELDS - BYTES 15 - 32
  1621. C SET TO START OF BYTE 33
  1622. KPTR(8) = KPTR(8) + 18 * 8
  1623. GO TO 900
  1624. C ******************************************************************
  1625. C PROCESS MERCATOR GRIDS
  1626. C
  1627. C ------------------- BYTE 7-8 NR OF POINTS ALONG LATITUDE CIRCLE
  1628. 4000 CONTINUE
  1629. CALL GBYTEC (MSGA,KGDS(2),KPTR(8),16)
  1630. KPTR(8) = KPTR(8) + 16
  1631. C ------------------- BYTE 9-10 NR OF POINTS ALONG LONG MERIDIAN
  1632. CALL GBYTEC (MSGA,KGDS(3),KPTR(8),16)
  1633. KPTR(8) = KPTR(8) + 16
  1634. C ------------------- BYTE 11-13 LATITUE OF ORIGIN
  1635. CALL GBYTEC (MSGA,KGDS(4),KPTR(8),24)
  1636. KPTR(8) = KPTR(8) + 24
  1637. IF (IAND(KGDS(4),8388608).NE.0) THEN
  1638. KGDS(4) = - IAND(KGDS(4),8388607)
  1639. END IF
  1640. C ------------------- BYTE 14-16 LONGITUDE OF ORIGIN
  1641. CALL GBYTEC (MSGA,KGDS(5),KPTR(8),24)
  1642. KPTR(8) = KPTR(8) + 24
  1643. IF (IAND(KGDS(5),8388608).NE.0) THEN
  1644. KGDS(5) = - IAND(KGDS(5),8388607)
  1645. END IF
  1646. C ------------------- BYTE 17 RESOLUTION FLAG
  1647. CALL GBYTEC (MSGA,KGDS(6),KPTR(8),8)
  1648. KPTR(8) = KPTR(8) + 8
  1649. C ------------------- BYTE 18-20 LATITUDE OF EXTREME POINT
  1650. CALL GBYTEC (MSGA,KGDS(7),KPTR(8),24)
  1651. KPTR(8) = KPTR(8) + 24
  1652. IF (IAND(KGDS(7),8388608).NE.0) THEN
  1653. KGDS(7) = - IAND(KGDS(7),8388607)
  1654. END IF
  1655. C ------------------- BYTE 21-23 LONGITUDE OF EXTREME POINT
  1656. CALL GBYTEC (MSGA,KGDS(8),KPTR(8),24)
  1657. KPTR(8) = KPTR(8) + 24
  1658. IF (IAND(KGDS(8),8388608).NE.0) THEN
  1659. KGDS(8) = - IAND(KGDS(8),8388607)
  1660. END IF
  1661. C ------------------- BYTE 24-26 LATITUDE OF PROJECTION INTERSECTION
  1662. CALL GBYTEC (MSGA,KGDS(9),KPTR(8),24)
  1663. KPTR(8) = KPTR(8) + 24
  1664. IF (IAND(KGDS(9),8388608).NE.0) THEN
  1665. KGDS(9) = - IAND(KGDS(9),8388607)
  1666. END IF
  1667. C ------------------- BYTE 27 RESERVED
  1668. CALL GBYTEC (MSGA,KGDS(10),KPTR(8),8)
  1669. KPTR(8) = KPTR(8) + 8
  1670. C ------------------- BYTE 28 SCANNING MODE
  1671. CALL GBYTEC (MSGA,KGDS(11),KPTR(8),8)
  1672. KPTR(8) = KPTR(8) + 8
  1673. C ------------------- BYTE 29-31 LONGITUDINAL DIR INCREMENT
  1674. CALL GBYTEC (MSGA,KGDS(12),KPTR(8),24)
  1675. KPTR(8) = KPTR(8) + 24
  1676. IF (IAND(KGDS(12),8388608).NE.0) THEN
  1677. KGDS(12) = - IAND(KGDS(12),8388607)
  1678. END IF
  1679. C ------------------- BYTE 32-34 LATITUDINAL DIR INCREMENT
  1680. CALL GBYTEC (MSGA,KGDS(13),KPTR(8),24)
  1681. KPTR(8) = KPTR(8) + 24
  1682. IF (IAND(KGDS(13),8388608).NE.0) THEN
  1683. KGDS(13) = - IAND(KGDS(13),8388607)
  1684. END IF
  1685. C ------------------- BYTE 35-42 RESERVED
  1686. C SKIP TO START OF BYTE 43
  1687. KPTR(8) = KPTR(8) + 8 * 8
  1688. C -------------------
  1689. GO TO 900
  1690. C ******************************************************************
  1691. C PROCESS LAMBERT CONFORMAL
  1692. C
  1693. C ------------------- BYTE 7-8 NR OF POINTS ALONG X-AXIS
  1694. 5000 CONTINUE
  1695. CALL GBYTEC (MSGA,KGDS(2),KPTR(8),16)
  1696. KPTR(8) = KPTR(8) + 16
  1697. C ------------------- BYTE 9-10 NR OF POINTS ALONG Y-AXIS
  1698. CALL GBYTEC (MSGA,KGDS(3),KPTR(8),16)
  1699. KPTR(8) = KPTR(8) + 16
  1700. C ------------------- BYTE 11-13 LATITUDE OF ORIGIN
  1701. CALL GBYTEC (MSGA,KGDS(4),KPTR(8),24)
  1702. KPTR(8) = KPTR(8) + 24
  1703. IF (IAND(KGDS(4),8388608).NE.0) THEN
  1704. KGDS(4) = - IAND(KGDS(4),8388607)
  1705. END IF
  1706. C ------------------- BYTE 14-16 LONGITUDE OF ORIGIN (LOWER LEFT)
  1707. CALL GBYTEC (MSGA,KGDS(5),KPTR(8),24)
  1708. KPTR(8) = KPTR(8) + 24
  1709. IF (IAND(KGDS(5),8388608).NE.0) THEN
  1710. KGDS(5) = - IAND(KGDS(5),8388607)
  1711. END IF
  1712. C ------------------- BYTE 17 RESOLUTION
  1713. CALL GBYTEC (MSGA,KGDS(6),KPTR(8),8)
  1714. KPTR(8) = KPTR(8) + 8
  1715. C ------------------- BYTE 18-20 LOV -ORIENTATION OF GRID
  1716. CALL GBYTEC (MSGA,KGDS(7),KPTR(8),24)
  1717. KPTR(8) = KPTR(8) + 24
  1718. IF (IAND(KGDS(7),8388608).NE.0) THEN
  1719. KGDS(7) = - IAND(KGDS(7),8388607)
  1720. END IF
  1721. C ------------------- BYTE 21-23 DX - X-DIR INCREMENT
  1722. CALL GBYTEC (MSGA,KGDS(8),KPTR(8),24)
  1723. KPTR(8) = KPTR(8) + 24
  1724. C ------------------- BYTE 24-26 DY - Y-DIR INCREMENT
  1725. CALL GBYTEC (MSGA,KGDS(9),KPTR(8),24)
  1726. KPTR(8) = KPTR(8) + 24
  1727. C ------------------- BYTE 27 PROJECTION CENTER FLAG
  1728. CALL GBYTEC (MSGA,KGDS(10),KPTR(8),8)
  1729. KPTR(8) = KPTR(8) + 8
  1730. C ------------------- BYTE 28 SCANNING MODE
  1731. CALL GBYTEC (MSGA,KGDS(11),KPTR(8),8)
  1732. KPTR(8) = KPTR(8) + 8
  1733. C ------------------- BYTE 29-31 LATIN1 - 1ST LAT FROM POLE
  1734. CALL GBYTEC (MSGA,KGDS(12),KPTR(8),24)
  1735. KPTR(8) = KPTR(8) + 24
  1736. IF (IAND(KGDS(12),8388608).NE.0) THEN
  1737. KGDS(12) = - IAND(KGDS(12),8388607)
  1738. END IF
  1739. C ------------------- BYTE 32-34 LATIN2 - 2ND LAT FROM POLE
  1740. CALL GBYTEC (MSGA,KGDS(13),KPTR(8),24)
  1741. KPTR(8) = KPTR(8) + 24
  1742. IF (IAND(KGDS(13),8388608).NE.0) THEN
  1743. KGDS(13) = - IAND(KGDS(13),8388607)
  1744. END IF
  1745. C ------------------- BYTE 35-37 LATITUDE OF SOUTHERN POLE
  1746. CALL GBYTEC (MSGA,KGDS(14),KPTR(8),24)
  1747. KPTR(8) = KPTR(8) + 24
  1748. IF (IAND(KGDS(14),8388608).NE.0) THEN
  1749. KGDS(14) = - IAND(KGDS(14),8388607)
  1750. END IF
  1751. C ------------------- BYTE 38-40 LONGITUDE OF SOUTHERN POLE
  1752. CALL GBYTEC (MSGA,KGDS(15),KPTR(8),24)
  1753. KPTR(8) = KPTR(8) + 24
  1754. IF (IAND(KGDS(15),8388608).NE.0) THEN
  1755. KGDS(15) = - IAND(KGDS(15),8388607)
  1756. END IF
  1757. C ------------------- BYTE 41-42 RESERVED
  1758. CALL GBYTEC (MSGA,KGDS(16),KPTR(8),16)
  1759. KPTR(8) = KPTR(8) + 16
  1760. C -------------------
  1761. 900 CONTINUE
  1762. C
  1763. C MORE CODE FOR GRIDS WITH PL
  1764. C
  1765. IF (KGDS(19).EQ.0.OR.KGDS(19).EQ.255) THEN
  1766. IF (KGDS(20).NE.255) THEN
  1767. ISUM = 0
  1768. KPTR(8) = NSAVE + (KGDS(20) - 1) * 8
  1769. CALL GBYTESC (MSGA,KGDS(22),KPTR(8),16,0,KGDS(3))
  1770. DO 910 J = 1, KGDS(3)
  1771. ISUM = ISUM + KGDS(21+J)
  1772. 910 CONTINUE
  1773. KGDS(21) = ISUM
  1774. END IF
  1775. END IF
  1776. RETURN
  1777. END
  1778. SUBROUTINE FI634(MSGA,KPTR,KPDS,KGDS,KBMS,KRET)
  1779. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  1780. C . . . .
  1781. C SUBPROGRAM: FI634 EXTRACT OR GENERATE BIT MAP FOR OUTPUT
  1782. C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  1783. C
  1784. C ABSTRACT: IF BIT MAP SEC IS AVAILABLE IN GRIB MESSAGE, EXTRACT
  1785. C FOR PROGRAM USE, OTHERWISE GENERATE AN APPROPRIATE BIT MAP.
  1786. C
  1787. C PROGRAM HISTORY LOG:
  1788. C 91-09-13 CAVANAUGH
  1789. C 91-11-12 CAVANAUGH MODIFIED SIZE OF ECMWF GRIDS 5 - 8.
  1790. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  1791. C 97-02-12 W BOSTELMAN CORRECTS ECMWF US GRID 2 PROCESSING
  1792. C 97-09-19 IREDELL VECTORIZED BITMAP DECODER
  1793. C 98-09-02 GILBERT CORRECTED ERROR IN MAP SIZE FOR U.S. GRID 92
  1794. C 98-09-08 BALDWIN ADD GRIDS 190,192
  1795. C 99-01-20 BALDWIN ADD GRIDS 236,237
  1796. C 01-10-02 ROGERS REDEFINED GRID #218 FOR 12 KM ETA
  1797. C REDEFINED GRID 192 FOR NEW 32-KM ETA GRID
  1798. C 2003-06-30 GILBERT ADDED GRIDS 145 and 146 for CMAQ
  1799. C and GRID 175 for AWIPS over GUAM.
  1800. C 2004-09-02 VUONG ADDED AWIPS GRIDS 147, 148, 173 AND 254
  1801. C 2006-12-12 VUONG ADDED AWIPS GRIDS 120
  1802. C 2007-04-20 VUONG ADDED AWIPS GRIDS 176
  1803. C 2007-06-11 VUONG ADDED AWIPS GRIDS 11 TO 18 AND 122 TO 125
  1804. C AND 180 TO 183
  1805. C 2010-08-05 VUONG ADDED NEW GRID 184, 199, 83 AND
  1806. C REDEFINED GRID 90 FOR NEW RTMA CONUS 1.27-KM
  1807. C REDEFINED GRID 91 FOR NEW RTMA ALASKA 2.976-KM
  1808. C REDEFINED GRID 92 FOR NEW RTMA ALASKA 1.488-KM
  1809. C
  1810. C USAGE: CALL FI634(MSGA,KPTR,KPDS,KGDS,KBMS,KRET)
  1811. C INPUT ARGUMENT LIST:
  1812. C MSGA - BUFR MESSAGE
  1813. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  1814. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  1815. C (2) - LENGTH OF INDICATOR (SECTION 0)
  1816. C (3) - LENGTH OF PDS (SECTION 1)
  1817. C (4) - LENGTH OF GDS (SECTION 2)
  1818. C (5) - LENGTH OF BMS (SECTION 3)
  1819. C (6) - LENGTH OF BDS (SECTION 4)
  1820. C (7) - VALUE OF CURRENT BYTE
  1821. C (8) - BIT POINTER
  1822. C (9) - GRIB START BIT NR
  1823. C (10) - GRIB/GRID ELEMENT COUNT
  1824. C (11) - NR UNUSED BITS AT END OF SECTION 3
  1825. C (12) - BIT MAP FLAG
  1826. C (13) - NR UNUSED BITS AT END OF SECTION 2
  1827. C (14) - BDS FLAGS
  1828. C (15) - NR UNUSED BITS AT END OF SECTION 4
  1829. C KPDS - ARRAY CONTAINING PDS ELEMENTS.
  1830. C (1) - ID OF CENTER
  1831. C (2) - MODEL IDENTIFICATION
  1832. C (3) - GRID IDENTIFICATION
  1833. C (4) - GDS/BMS FLAG
  1834. C (5) - INDICATOR OF PARAMETER
  1835. C (6) - TYPE OF LEVEL
  1836. C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
  1837. C (8) - YEAR OF CENTURY
  1838. C (9) - MONTH OF YEAR
  1839. C (10) - DAY OF MONTH
  1840. C (11) - HOUR OF DAY
  1841. C (12) - MINUTE OF HOUR
  1842. C (13) - INDICATOR OF FORECAST TIME UNIT
  1843. C (14) - TIME RANGE 1
  1844. C (15) - TIME RANGE 2
  1845. C (16) - TIME RANGE FLAG
  1846. C (17) - NUMBER INCLUDED IN AVERAGE
  1847. C
  1848. C OUTPUT ARGUMENT LIST:
  1849. C KBMS - BITMAP DESCRIBING LOCATION OF OUTPUT ELEMENTS.
  1850. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  1851. C SEE INPUT LIST
  1852. C KRET - ERROR RETURN
  1853. C
  1854. C REMARKS:
  1855. C KRET = 0 - NO ERROR
  1856. C = 5 - GRID NOT AVAIL FOR CENTER INDICATED
  1857. C =10 - INCORRECT CENTER INDICATOR
  1858. C =12 - BYTES 5-6 ARE NOT ZERO IN BMS, PREDEFINED BIT MAP
  1859. C NOT PROVIDED BY THIS CENTER
  1860. C
  1861. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1862. C
  1863. C ATTRIBUTES:
  1864. C LANGUAGE: FORTRAN 77
  1865. C MACHINE: HDS9000
  1866. C
  1867. C$$$
  1868. C
  1869. C INCOMING MESSAGE HOLDER
  1870. CHARACTER*1 MSGA(*)
  1871. C
  1872. C BIT MAP
  1873. LOGICAL*1 KBMS(*)
  1874. C
  1875. C ARRAY OF POINTERS AND COUNTERS
  1876. INTEGER KPTR(*)
  1877. C ARRAY OF POINTERS AND COUNTERS
  1878. INTEGER KPDS(*)
  1879. INTEGER KGDS(*)
  1880. C
  1881. INTEGER KRET
  1882. INTEGER MASK(8)
  1883. C ----------------------GRID 21 AND GRID 22 ARE THE SAME
  1884. LOGICAL*1 GRD21( 1369)
  1885. C ----------------------GRID 23 AND GRID 24 ARE THE SAME
  1886. LOGICAL*1 GRD23( 1369)
  1887. LOGICAL*1 GRD25( 1368)
  1888. LOGICAL*1 GRD26( 1368)
  1889. C ----------------------GRID 27 AND GRID 28 ARE THE SAME
  1890. C ----------------------GRID 29 AND GRID 30 ARE THE SAME
  1891. C ----------------------GRID 33 AND GRID 34 ARE THE SAME
  1892. LOGICAL*1 GRD50( 1188)
  1893. C -----------------------GRID 61 AND GRID 62 ARE THE SAME
  1894. LOGICAL*1 GRD61( 4186)
  1895. C -----------------------GRID 63 AND GRID 64 ARE THE SAME
  1896. LOGICAL*1 GRD63( 4186)
  1897. C LOGICAL*1 GRD70(16380)/16380*.TRUE./
  1898. C -------------------------------------------------------------
  1899. DATA GRD21 /1333*.TRUE.,36*.FALSE./
  1900. DATA GRD23 /.TRUE.,36*.FALSE.,1332*.TRUE./
  1901. DATA GRD25 /1297*.TRUE.,71*.FALSE./
  1902. DATA GRD26 /.TRUE.,71*.FALSE.,1296*.TRUE./
  1903. DATA GRD50/
  1904. C LINE 1-4
  1905. & 7*.FALSE.,22*.TRUE.,14*.FALSE.,22*.TRUE.,
  1906. & 14*.FALSE.,22*.TRUE.,14*.FALSE.,22*.TRUE.,7*.FALSE.,
  1907. C LINE 5-8
  1908. & 6*.FALSE.,24*.TRUE.,12*.FALSE.,24*.TRUE.,
  1909. & 12*.FALSE.,24*.TRUE.,12*.FALSE.,24*.TRUE.,6*.FALSE.,
  1910. C LINE 9-12
  1911. & 5*.FALSE.,26*.TRUE.,10*.FALSE.,26*.TRUE.,
  1912. & 10*.FALSE.,26*.TRUE.,10*.FALSE.,26*.TRUE.,5*.FALSE.,
  1913. C LINE 13-16
  1914. & 4*.FALSE.,28*.TRUE., 8*.FALSE.,28*.TRUE.,
  1915. & 8*.FALSE.,28*.TRUE., 8*.FALSE.,28*.TRUE.,4*.FALSE.,
  1916. C LINE 17-20
  1917. & 3*.FALSE.,30*.TRUE., 6*.FALSE.,30*.TRUE.,
  1918. & 6*.FALSE.,30*.TRUE., 6*.FALSE.,30*.TRUE.,3*.FALSE.,
  1919. C LINE 21-24
  1920. & 2*.FALSE.,32*.TRUE., 4*.FALSE.,32*.TRUE.,
  1921. & 4*.FALSE.,32*.TRUE., 4*.FALSE.,32*.TRUE.,2*.FALSE.,
  1922. C LINE 25-28
  1923. & .FALSE.,34*.TRUE., 2*.FALSE.,34*.TRUE.,
  1924. & 2*.FALSE.,34*.TRUE., 2*.FALSE.,34*.TRUE., .FALSE.,
  1925. C LINE 29-33
  1926. & 180*.TRUE./
  1927. DATA GRD61 /4096*.TRUE.,90*.FALSE./
  1928. DATA GRD63 /.TRUE.,90*.FALSE.,4095*.TRUE./
  1929. DATA MASK /128,64,32,16,8,4,2,1/
  1930. C
  1931. C PRINT *,'FI634'
  1932. IF (IAND(KPDS(4),64).EQ.64) THEN
  1933. C
  1934. C SET UP BIT POINTER
  1935. C SECTION 0 SECTION 1 SECTION 2
  1936. KPTR(8) = KPTR(9) + (KPTR(2)*8) + (KPTR(3)*8) + (KPTR(4)*8) + 24
  1937. C
  1938. C BYTE 4 NUMBER OF UNUSED BITS AT END OF SECTION 3
  1939. C
  1940. CALL GBYTEC (MSGA,KPTR(11),KPTR(8),8)
  1941. KPTR(8) = KPTR(8) + 8
  1942. C
  1943. C BYTE 5,6 TABLE REFERENCE IF 0, BIT MAP FOLLOWS
  1944. C
  1945. CALL GBYTEC (MSGA,KPTR(12),KPTR(8),16)
  1946. KPTR(8) = KPTR(8) + 16
  1947. C IF TABLE REFERENCE = 0, EXTRACT BIT MAP
  1948. IF (KPTR(12).EQ.0) THEN
  1949. C CALCULATE NR OF BITS IN BIT MAP
  1950. IBITS = (KPTR(5) - 6) * 8 - KPTR(11)
  1951. KPTR(10) = IBITS
  1952. IF (KPDS(3).EQ.21.OR.KPDS(3).EQ.22.OR.KPDS(3).EQ.25.
  1953. * OR.KPDS(3).EQ.61.OR.KPDS(3).EQ.62) THEN
  1954. C NORTHERN HEMISPHERE 21, 22, 25, 61, 62
  1955. CALL FI634X(IBITS,KPTR(8),MSGA,KBMS)
  1956. IF (KPDS(3).EQ.25) THEN
  1957. KADD = 71
  1958. ELSE IF (KPDS(3).EQ.61.OR.KPDS(3).EQ.62) THEN
  1959. KADD = 90
  1960. ELSE
  1961. KADD = 36
  1962. END IF
  1963. DO 25 I = 1, KADD
  1964. KBMS(I+IBITS) = .FALSE.
  1965. 25 CONTINUE
  1966. KPTR(10) = KPTR(10) + KADD
  1967. RETURN
  1968. ELSE IF (KPDS(3).EQ.23.OR.KPDS(3).EQ.24.OR.KPDS(3).EQ.26.
  1969. * OR.KPDS(3).EQ.63.OR.KPDS(3).EQ.64) THEN
  1970. C SOUTHERN HEMISPHERE 23, 24, 26, 63, 64
  1971. CALL FI634X(IBITS,KPTR(8),MSGA,KBMS)
  1972. IF (KPDS(3).EQ.26) THEN
  1973. KADD = 72
  1974. ELSE IF (KPDS(3).EQ.63.OR.KPDS(3).EQ.64) THEN
  1975. KADD = 91
  1976. ELSE
  1977. KADD = 37
  1978. END IF
  1979. DO 26 I = 1, KADD
  1980. KBMS(I+IBITS) = .FALSE.
  1981. 26 CONTINUE
  1982. KPTR(10) = KPTR(10) + KADD - 1
  1983. RETURN
  1984. ELSE IF (KPDS(3).EQ.50) THEN
  1985. KPAD = 7
  1986. KIN = 22
  1987. KBITS = 0
  1988. DO 55 I = 1, 7
  1989. DO 54 J = 1, 4
  1990. DO 51 K = 1, KPAD
  1991. KBITS = KBITS + 1
  1992. KBMS(KBITS) = .FALSE.
  1993. 51 CONTINUE
  1994. CALL FI634X(KIN,KPTR(8),MSGA,KBMS(KBITS+1))
  1995. KPTR(8)=KPTR(8)+KIN
  1996. KBITS=KBITS+KIN
  1997. DO 53 K = 1, KPAD
  1998. KBITS = KBITS + 1
  1999. KBMS(KBITS) = .FALSE.
  2000. 53 CONTINUE
  2001. 54 CONTINUE
  2002. KIN = KIN + 2
  2003. KPAD = KPAD - 1
  2004. 55 CONTINUE
  2005. DO 57 II = 1, 5
  2006. CALL FI634X(KIN,KPTR(8),MSGA,KBMS(KBITS+1))
  2007. KPTR(8)=KPTR(8)+KIN
  2008. KBITS=KBITS+KIN
  2009. 57 CONTINUE
  2010. ELSE
  2011. C EXTRACT BIT MAP FROM BMS FOR OTHER GRIDS
  2012. CALL FI634X(IBITS,KPTR(8),MSGA,KBMS)
  2013. END IF
  2014. RETURN
  2015. ELSE
  2016. C PRINT *,'FI634-NO PREDEFINED BIT MAP PROVIDED BY THIS CENTER'
  2017. KRET = 12
  2018. RETURN
  2019. END IF
  2020. C
  2021. END IF
  2022. KRET = 0
  2023. C -------------------------------------------------------
  2024. C PROCESS NON-STANDARD GRID
  2025. C -------------------------------------------------------
  2026. IF (KPDS(3).EQ.255) THEN
  2027. C PRINT *,'NON STANDARD GRID, CENTER = ',KPDS(1)
  2028. J = KGDS(2) * KGDS(3)
  2029. KPTR(10) = J
  2030. DO 600 I = 1, J
  2031. KBMS(I) = .TRUE.
  2032. 600 CONTINUE
  2033. RETURN
  2034. END IF
  2035. C -------------------------------------------------------
  2036. C CHECK INTERNATIONAL SET
  2037. C -------------------------------------------------------
  2038. IF (KPDS(3).EQ.21.OR.KPDS(3).EQ.22) THEN
  2039. C ----- INT'L GRIDS 21, 22 - MAP SIZE 1369
  2040. J = 1369
  2041. KPTR(10) = J
  2042. CALL FI637(J,KPDS,KGDS,KRET)
  2043. IF(KRET.NE.0) GO TO 820
  2044. DO 3021 I = 1, 1369
  2045. KBMS(I) = GRD21(I)
  2046. 3021 CONTINUE
  2047. RETURN
  2048. ELSE IF (KPDS(3).EQ.23.OR.KPDS(3).EQ.24) THEN
  2049. C ----- INT'L GRIDS 23, 24 - MAP SIZE 1369
  2050. J = 1369
  2051. KPTR(10) = J
  2052. CALL FI637(J,KPDS,KGDS,KRET)
  2053. IF(KRET.NE.0) GO TO 820
  2054. DO 3023 I = 1, 1369
  2055. KBMS(I) = GRD23(I)
  2056. 3023 CONTINUE
  2057. RETURN
  2058. ELSE IF (KPDS(3).EQ.25) THEN
  2059. C ----- INT'L GRID 25 - MAP SIZE 1368
  2060. J = 1368
  2061. KPTR(10) = J
  2062. CALL FI637(J,KPDS,KGDS,KRET)
  2063. IF(KRET.NE.0) GO TO 820
  2064. DO 3025 I = 1, 1368
  2065. KBMS(I) = GRD25(I)
  2066. 3025 CONTINUE
  2067. RETURN
  2068. ELSE IF (KPDS(3).EQ.26) THEN
  2069. C ----- INT'L GRID 26 - MAP SIZE 1368
  2070. J = 1368
  2071. KPTR(10) = J
  2072. CALL FI637(J,KPDS,KGDS,KRET)
  2073. IF(KRET.NE.0) GO TO 820
  2074. DO 3026 I = 1, 1368
  2075. KBMS(I) = GRD26(I)
  2076. 3026 CONTINUE
  2077. RETURN
  2078. ELSE IF (KPDS(3).GE.37.AND.KPDS(3).LE.44) THEN
  2079. C ----- INT'L GRID 37-44 - MAP SIZE 3447
  2080. J = 3447
  2081. GO TO 800
  2082. ELSE IF (KPDS(1).EQ.7.AND.KPDS(3).EQ.50) THEN
  2083. C ----- INT'L GRIDS 50 - MAP SIZE 964
  2084. J = 1188
  2085. KPTR(10) = J
  2086. CALL FI637(J,KPDS,KGDS,KRET)
  2087. IF(KRET.NE.0) GO TO 890
  2088. DO 3050 I = 1, J
  2089. KBMS(I) = GRD50(I)
  2090. 3050 CONTINUE
  2091. RETURN
  2092. ELSE IF (KPDS(3).EQ.61.OR.KPDS(3).EQ.62) THEN
  2093. C ----- INT'L GRIDS 61, 62 - MAP SIZE 4186
  2094. J = 4186
  2095. KPTR(10) = J
  2096. CALL FI637(J,KPDS,KGDS,KRET)
  2097. IF(KRET.NE.0) GO TO 820
  2098. DO 3061 I = 1, 4186
  2099. KBMS(I) = GRD61(I)
  2100. 3061 CONTINUE
  2101. RETURN
  2102. ELSE IF (KPDS(3).EQ.63.OR.KPDS(3).EQ.64) THEN
  2103. C ----- INT'L GRIDS 63, 64 - MAP SIZE 4186
  2104. J = 4186
  2105. KPTR(10) = J
  2106. CALL FI637(J,KPDS,KGDS,KRET)
  2107. IF(KRET.NE.0) GO TO 820
  2108. DO 3063 I = 1, 4186
  2109. KBMS(I) = GRD63(I)
  2110. 3063 CONTINUE
  2111. RETURN
  2112. END IF
  2113. C -------------------------------------------------------
  2114. C CHECK UNITED STATES SET
  2115. C -------------------------------------------------------
  2116. IF (KPDS(1).EQ.7) THEN
  2117. IF (KPDS(3).LT.100) THEN
  2118. IF (KPDS(3).EQ.1) THEN
  2119. C ----- U.S. GRID 1 - MAP SIZE 1679
  2120. J = 1679
  2121. GO TO 800
  2122. END IF
  2123. IF (KPDS(3).EQ.2) THEN
  2124. C ----- U.S. GRID 2 - MAP SIZE 10512
  2125. J = 10512
  2126. GO TO 800
  2127. ELSE IF (KPDS(3).EQ.3) THEN
  2128. C ----- U.S. GRID 3 - MAP SIZE 65160
  2129. J = 65160
  2130. GO TO 800
  2131. ELSE IF (KPDS(3).EQ.4) THEN
  2132. C ----- U.S. GRID 4 - MAP SIZE 259920
  2133. J = 259920
  2134. GO TO 800
  2135. ELSE IF (KPDS(3).EQ.5) THEN
  2136. C ----- U.S. GRID 5 - MAP SIZE 3021
  2137. J = 3021
  2138. GO TO 800
  2139. ELSE IF (KPDS(3).EQ.6) THEN
  2140. C ----- U.S. GRID 6 - MAP SIZE 2385
  2141. J = 2385
  2142. GO TO 800
  2143. ELSE IF (KPDS(3).EQ.8) THEN
  2144. C ----- U.S. GRID 8 - MAP SIZE 5104
  2145. J = 5104
  2146. GO TO 800
  2147. ELSE IF (KPDS(3).EQ.10) THEN
  2148. C ----- U.S. GRID 10 - MAP SIZE 25020
  2149. J = 25020
  2150. GO TO 800
  2151. ELSE IF (KPDS(3).EQ.11) THEN
  2152. C ----- U.S. GRID 11 - MAP SIZE 223920
  2153. J = 223920
  2154. GO TO 800
  2155. ELSE IF (KPDS(3).EQ.12) THEN
  2156. C ----- U.S. GRID 12 - MAP SIZE 99631
  2157. J = 99631
  2158. GO TO 800
  2159. ELSE IF (KPDS(3).EQ.13) THEN
  2160. C ----- U.S. GRID 13 - MAP SIZE 36391
  2161. J = 36391
  2162. GO TO 800
  2163. ELSE IF (KPDS(3).EQ.14) THEN
  2164. C ----- U.S. GRID 14 - MAP SIZE 153811
  2165. J = 153811
  2166. GO TO 800
  2167. ELSE IF (KPDS(3).EQ.15) THEN
  2168. C ----- U.S. GRID 15 - MAP SIZE 74987
  2169. J = 74987
  2170. GO TO 800
  2171. ELSE IF (KPDS(3).EQ.16) THEN
  2172. C ----- U.S. GRID 16 - MAP SIZE 214268
  2173. J = 214268
  2174. GO TO 800
  2175. ELSE IF (KPDS(3).EQ.17) THEN
  2176. C ----- U.S. GRID 17 - MAP SIZE 387136
  2177. J = 387136
  2178. GO TO 800
  2179. ELSE IF (KPDS(3).EQ.18) THEN
  2180. C ----- U.S. GRID 18 - MAP SIZE 281866
  2181. J = 281866
  2182. GO TO 800
  2183. ELSE IF (KPDS(3).EQ.27.OR.KPDS(3).EQ.28) THEN
  2184. C ----- U.S. GRIDS 27, 28 - MAP SIZE 4225
  2185. J = 4225
  2186. GO TO 800
  2187. ELSE IF (KPDS(3).EQ.29.OR.KPDS(3).EQ.30) THEN
  2188. C ----- U.S. GRIDS 29,30 - MAP SIZE 5365
  2189. J = 5365
  2190. GO TO 800
  2191. ELSE IF (KPDS(3).EQ.33.OR.KPDS(3).EQ.34) THEN
  2192. C ----- U.S GRID 33, 34 - MAP SIZE 8326
  2193. J = 8326
  2194. GO TO 800
  2195. ELSE IF (KPDS(3).GE.37.AND.KPDS(3).LE.44) THEN
  2196. C ----- U.S. GRID 37-44 - MAP SIZE 3447
  2197. J = 3447
  2198. GO TO 800
  2199. ELSE IF (KPDS(3).EQ.45) THEN
  2200. C ----- U.S. GRID 45 - MAP SIZE 41760
  2201. J = 41760
  2202. GO TO 800
  2203. ELSE IF (KPDS(3).EQ.53) THEN
  2204. C ----- U.S. GRID 53 - MAP SIZE 5967
  2205. J = 5967
  2206. GO TO 800
  2207. ELSE IF (KPDS(3).EQ.55.OR.KPDS(3).EQ.56) THEN
  2208. C ----- U.S GRID 55, 56 - MAP SIZE 6177
  2209. J = 6177
  2210. GO TO 800
  2211. ELSE IF (KPDS(3).GE.67.AND.KPDS(3).LE.71) THEN
  2212. C ----- U.S GRID 67-71 - MAP SIZE 13689
  2213. J = 13689
  2214. GO TO 800
  2215. ELSE IF (KPDS(3).EQ.72) THEN
  2216. C ----- U.S GRID 72 - MAP SIZE 406
  2217. J = 406
  2218. GO TO 800
  2219. ELSE IF (KPDS(3).EQ.73) THEN
  2220. C ----- U.S GRID 73 - MAP SIZE 13056
  2221. J = 13056
  2222. GO TO 800
  2223. ELSE IF (KPDS(3).EQ.74) THEN
  2224. C ----- U.S GRID 74 - MAP SIZE 10800
  2225. J = 10800
  2226. GO TO 800
  2227. ELSE IF (KPDS(3).GE.75.AND.KPDS(3).LE.77) THEN
  2228. C ----- U.S GRID 75-77 - MAP SIZE 12321
  2229. J = 12321
  2230. GO TO 800
  2231. ELSE IF (KPDS(3).EQ.83) THEN
  2232. C ----- U.S GRID 83 - MAP SIZE 429786
  2233. J = 429786
  2234. GO TO 800
  2235. ELSE IF (KPDS(3).EQ.85.OR.KPDS(3).EQ.86) THEN
  2236. C ----- U.S GRID 85,86 - MAP SIZE 32400
  2237. J = 32400
  2238. GO TO 800
  2239. ELSE IF (KPDS(3).EQ.87) THEN
  2240. C ----- U.S GRID 87 - MAP SIZE 5022
  2241. J = 5022
  2242. GO TO 800
  2243. ELSE IF (KPDS(3).EQ.88) THEN
  2244. C ----- U.S GRID 88 - MAP SIZE 317840
  2245. J = 317840
  2246. GO TO 800
  2247. ELSE IF (KPDS(3).EQ.90) THEN
  2248. C ----- U.S GRID 90 - MAP SIZE 11807617
  2249. J = 11807617
  2250. GO TO 800
  2251. ELSE IF (KPDS(3).EQ.91) THEN
  2252. C ----- U.S GRID 91 - MAP SIZE 1822145
  2253. J = 1822145
  2254. GO TO 800
  2255. ELSE IF (KPDS(3).EQ.92) THEN
  2256. C ----- U.S GRID 92 - MAP SIZE 7283073
  2257. J = 7283073
  2258. GO TO 800
  2259. ELSE IF (KPDS(3).EQ.93) THEN
  2260. C ----- U.S GRID 93 - MAP SIZE 111723
  2261. J = 111723
  2262. GO TO 800
  2263. ELSE IF (KPDS(3).EQ.94) THEN
  2264. C ----- U.S GRID 94 - MAP SIZE 371875
  2265. J = 371875
  2266. GO TO 800
  2267. ELSE IF (KPDS(3).EQ.95) THEN
  2268. C ----- U.S GRID 95 - MAP SIZE 130325
  2269. J = 130325
  2270. GO TO 800
  2271. ELSE IF (KPDS(3).EQ.96) THEN
  2272. C ----- U.S GRID 96 - MAP SIZE 209253
  2273. J = 209253
  2274. GO TO 800
  2275. ELSE IF (KPDS(3).EQ.97) THEN
  2276. C ----- U.S GRID 97 - MAP SIZE 1508100
  2277. J = 1508100
  2278. GO TO 800
  2279. ELSE IF (KPDS(3).EQ.98) THEN
  2280. C ----- U.S GRID 98 - MAP SIZE 18048
  2281. J = 18048
  2282. GO TO 800
  2283. ELSE IF (KPDS(3).EQ.99) THEN
  2284. C ----- U.S GRID 99 - MAP SIZE 779385
  2285. J = 779385
  2286. GO TO 800
  2287. END IF
  2288. ELSE IF (KPDS(3).GE.100.AND.KPDS(3).LT.200) THEN
  2289. IF (KPDS(3).EQ.100) THEN
  2290. C ----- U.S. GRID 100 - MAP SIZE 6889
  2291. J = 6889
  2292. GO TO 800
  2293. ELSE IF (KPDS(3).EQ.101) THEN
  2294. C ----- U.S. GRID 101 - MAP SIZE 10283
  2295. J = 10283
  2296. GO TO 800
  2297. ELSE IF (KPDS(3).EQ.103) THEN
  2298. C ----- U.S. GRID 103 - MAP SIZE 3640
  2299. J = 3640
  2300. GO TO 800
  2301. ELSE IF (KPDS(3).EQ.104) THEN
  2302. C ----- U.S. GRID 104 - MAP SIZE 16170
  2303. J = 16170
  2304. GO TO 800
  2305. ELSE IF (KPDS(3).EQ.105) THEN
  2306. C ----- U.S. GRID 105 - MAP SIZE 6889
  2307. J = 6889
  2308. GO TO 800
  2309. ELSE IF (KPDS(3).EQ.106) THEN
  2310. C ----- U.S. GRID 106 - MAP SIZE 19305
  2311. J = 19305
  2312. GO TO 800
  2313. ELSE IF (KPDS(3).EQ.107) THEN
  2314. C ----- U.S. GRID 107 - MAP SIZE 11040
  2315. J = 11040
  2316. GO TO 800
  2317. ELSE IF (KPDS(3).EQ.110) THEN
  2318. C ----- U.S. GRID 110 - MAP SIZE 103936
  2319. J = 103936
  2320. GO TO 800
  2321. ELSE IF (KPDS(3).EQ.120) THEN
  2322. C ----- U.S. GRID 120 - MAP SIZE 2020800
  2323. J = 2020800
  2324. GO TO 800
  2325. ELSE IF (KPDS(3).EQ.122) THEN
  2326. C ----- U.S. GRID 122 - MAP SIZE 162750
  2327. J = 162750
  2328. GO TO 800
  2329. ELSE IF (KPDS(3).EQ.123) THEN
  2330. C ----- U.S. GRID 123 - MAP SIZE 100800
  2331. J = 100800
  2332. GO TO 800
  2333. ELSE IF (KPDS(3).EQ.124) THEN
  2334. C ----- U.S. GRID 124 - MAP SIZE 75360
  2335. J = 75360
  2336. GO TO 800
  2337. ELSE IF (KPDS(3).EQ.125) THEN
  2338. C ----- U.S. GRID 125 - MAP SIZE 102000
  2339. J = 102000
  2340. GO TO 800
  2341. ELSE IF (KPDS(3).EQ.126) THEN
  2342. C ----- U.S. GRID 126 - MAP SIZE 72960
  2343. J = 72960
  2344. GO TO 800
  2345. ELSE IF (KPDS(3).EQ.127) THEN
  2346. C ----- U.S. GRID 127 - MAP SIZE 294912
  2347. J = 294912
  2348. GO TO 800
  2349. ELSE IF (KPDS(3).EQ.128) THEN
  2350. C ----- U.S. GRID 128 - MAP SIZE 663552
  2351. J = 663552
  2352. GO TO 800
  2353. ELSE IF (KPDS(3).EQ.130) THEN
  2354. C ----- U.S. GRID 130 - MAP SIZE 151987
  2355. J = 151987
  2356. GO TO 800
  2357. ELSE IF (KPDS(3).EQ.138) THEN
  2358. C ----- U.S. GRID 138 - MAP SIZE 134784
  2359. J = 134784
  2360. GO TO 800
  2361. ELSE IF (KPDS(3).EQ.139) THEN
  2362. C ----- U.S. GRID 139 - MAP SIZE 4160
  2363. J = 4160
  2364. GO TO 800
  2365. ELSE IF (KPDS(3).EQ.140) THEN
  2366. C ----- U.S. GRID 140 - MAP SIZE 32437
  2367. J = 32437
  2368. GO TO 800
  2369. C
  2370. ELSE IF (KPDS(3).EQ.145) THEN
  2371. C ----- U.S. GRID 145 - MAP SIZE 24505
  2372. J = 24505
  2373. GO TO 800
  2374. ELSE IF (KPDS(3).EQ.146) THEN
  2375. C ----- U.S. GRID 146 - MAP SIZE 23572
  2376. J = 23572
  2377. GO TO 800
  2378. ELSE IF (KPDS(3).EQ.147) THEN
  2379. C ----- U.S. GRID 147 - MAP SIZE 69412
  2380. J = 69412
  2381. GO TO 800
  2382. ELSE IF (KPDS(3).EQ.148) THEN
  2383. C ----- U.S. GRID 148 - MAP SIZE 117130
  2384. J = 117130
  2385. GO TO 800
  2386. ELSE IF (KPDS(3).EQ.150) THEN
  2387. C ----- U.S. GRID 150 - MAP SIZE 806010
  2388. J = 806010
  2389. GO TO 800
  2390. ELSE IF (KPDS(3).EQ.151) THEN
  2391. C ----- U.S. GRID 151 - MAP SIZE 205062
  2392. J = 205062
  2393. GO TO 800
  2394. ELSE IF (KPDS(3).EQ.160) THEN
  2395. C ----- U.S. GRID 160 - MAP SIZE 28080
  2396. J = 28080
  2397. GO TO 800
  2398. ELSE IF (KPDS(3).EQ.161) THEN
  2399. C ----- U.S. GRID 161 - MAP SIZE 13974
  2400. J = 13974
  2401. GO TO 800
  2402. ELSE IF (KPDS(3).EQ.163) THEN
  2403. C ----- U.S. GRID 163 - MAP SIZE 727776
  2404. J = 727776
  2405. GO TO 800
  2406. ELSE IF (KPDS(3).EQ.170) THEN
  2407. C ----- U.S. GRID 170 - MAP SIZE 131072
  2408. J = 131072
  2409. GO TO 800
  2410. ELSE IF (KPDS(3).EQ.171) THEN
  2411. C ----- U.S. GRID 171 - MAP SIZE 716100
  2412. J = 716100
  2413. GO TO 800
  2414. ELSE IF (KPDS(3).EQ.172) THEN
  2415. C ----- U.S. GRID 172 - MAP SIZE 489900
  2416. J = 489900
  2417. GO TO 800
  2418. ELSE IF (KPDS(3).EQ.173) THEN
  2419. C ----- U.S. GRID 173 - MAP SIZE 9331200
  2420. J = 9331200
  2421. GO TO 800
  2422. ELSE IF (KPDS(3).EQ.174) THEN
  2423. C ----- U.S. GRID 174 - MAP SIZE 4147200
  2424. J = 4147200
  2425. GO TO 800
  2426. ELSE IF (KPDS(3).EQ.175) THEN
  2427. C ----- U.S. GRID 175 - MAP SIZE 185704
  2428. J = 185704
  2429. GO TO 800
  2430. ELSE IF (KPDS(3).EQ.176) THEN
  2431. C ----- U.S. GRID 176 - MAP SIZE 76845
  2432. J = 76845
  2433. GO TO 800
  2434. ELSE IF (KPDS(3).EQ.179) THEN
  2435. C ----- U.S. GRID 179 - MAP SIZE 977132
  2436. J = 977132
  2437. GO TO 800
  2438. ELSE IF (KPDS(3).EQ.180) THEN
  2439. C ----- U.S. GRID 180 - MAP SIZE 267168
  2440. J = 267168
  2441. GO TO 800
  2442. ELSE IF (KPDS(3).EQ.181) THEN
  2443. C ----- U.S. GRID 181 - MAP SIZE 102860
  2444. J = 102860
  2445. GO TO 800
  2446. ELSE IF (KPDS(3).EQ.182) THEN
  2447. C ----- U.S. GRID 182 - MAP SIZE 64218
  2448. J = 64218
  2449. GO TO 800
  2450. ELSE IF (KPDS(3).EQ.183) THEN
  2451. C ----- U.S. GRID 183 - MAP SIZE 180144
  2452. J = 180144
  2453. GO TO 800
  2454. ELSE IF (KPDS(3).EQ.184) THEN
  2455. C ----- U.S. GRID 184 - MAP SIZE 2953665
  2456. J = 2953665
  2457. GO TO 800
  2458. ELSE IF (KPDS(3).EQ.190) THEN
  2459. C ----- U.S GRID 190 - MAP SIZE 796590
  2460. J = 796590
  2461. GO TO 800
  2462. ELSE IF (KPDS(3).EQ.192) THEN
  2463. C ----- U.S GRID 192 - MAP SIZE 91719
  2464. J = 91719
  2465. GO TO 800
  2466. ELSE IF (KPDS(3).EQ.194) THEN
  2467. C ----- U.S GRID 194 - MAP SIZE 168640
  2468. J = 168640
  2469. GO TO 800
  2470. ELSE IF (KPDS(3).EQ.195) THEN
  2471. C ----- U.S. GRID 195 - MAP SIZE 22833
  2472. J = 22833
  2473. GO TO 800
  2474. ELSE IF (KPDS(3).EQ.196) THEN
  2475. C ----- U.S. GRID 196 - MAP SIZE 72225
  2476. J = 72225
  2477. GO TO 800
  2478. ELSE IF (KPDS(3).EQ.197) THEN
  2479. C ----- U.S. GRID 197 - MAP SIZE 739297
  2480. J = 739297
  2481. GO TO 800
  2482. ELSE IF (KPDS(3).EQ.198) THEN
  2483. C ----- U.S. GRID 198 - MAP SIZE 456225
  2484. J = 456225
  2485. GO TO 800
  2486. ELSE IF (KPDS(3).EQ.199) THEN
  2487. C ----- U.S. GRID 199 - MAP SIZE 37249
  2488. J = 37249
  2489. GO TO 800
  2490. ELSE IF (IAND(KPDS(4),128).EQ.128) THEN
  2491. C ----- U.S. NON-STANDARD GRID
  2492. GO TO 895
  2493. END IF
  2494. ELSE IF (KPDS(3).GE.200) THEN
  2495. IF (KPDS(3).EQ.201) THEN
  2496. J = 4225
  2497. GO TO 800
  2498. ELSE IF (KPDS(3).EQ.202) THEN
  2499. J = 2795
  2500. GO TO 800
  2501. ELSE IF (KPDS(3).EQ.203.OR.KPDS(3).EQ.205) THEN
  2502. J = 1755
  2503. GO TO 800
  2504. ELSE IF (KPDS(3).EQ.204) THEN
  2505. J = 6324
  2506. GO TO 800
  2507. ELSE IF (KPDS(3).EQ.206) THEN
  2508. J = 2091
  2509. GO TO 800
  2510. ELSE IF (KPDS(3).EQ.207) THEN
  2511. J = 1715
  2512. GO TO 800
  2513. ELSE IF (KPDS(3).EQ.208) THEN
  2514. J = 783
  2515. GO TO 800
  2516. ELSE IF (KPDS(3).EQ.209) THEN
  2517. J = 61325
  2518. GO TO 800
  2519. ELSE IF (KPDS(3).EQ.210) THEN
  2520. J = 625
  2521. GO TO 800
  2522. ELSE IF (KPDS(3).EQ.211) THEN
  2523. J = 6045
  2524. GO TO 800
  2525. ELSE IF (KPDS(3).EQ.212) THEN
  2526. J = 23865
  2527. GO TO 800
  2528. ELSE IF (KPDS(3).EQ.213) THEN
  2529. J = 10965
  2530. GO TO 800
  2531. ELSE IF (KPDS(3).EQ.214) THEN
  2532. J = 6693
  2533. GO TO 800
  2534. ELSE IF (KPDS(3).EQ.215) THEN
  2535. J = 94833
  2536. GO TO 800
  2537. ELSE IF (KPDS(3).EQ.216) THEN
  2538. J = 14873
  2539. GO TO 800
  2540. ELSE IF (KPDS(3).EQ.217) THEN
  2541. J = 59001
  2542. GO TO 800
  2543. ELSE IF (KPDS(3).EQ.218) THEN
  2544. J = 262792
  2545. GO TO 800
  2546. ELSE IF (KPDS(3).EQ.219) THEN
  2547. J = 179025
  2548. GO TO 800
  2549. ELSE IF (KPDS(3).EQ.220) THEN
  2550. J = 122475
  2551. GO TO 800
  2552. ELSE IF (KPDS(3).EQ.221) THEN
  2553. J = 96673
  2554. GO TO 800
  2555. ELSE IF (KPDS(3).EQ.222) THEN
  2556. J = 15456
  2557. GO TO 800
  2558. ELSE IF (KPDS(3).EQ.223) THEN
  2559. J = 16641
  2560. GO TO 800
  2561. ELSE IF (KPDS(3).EQ.224) THEN
  2562. J = 4225
  2563. GO TO 800
  2564. ELSE IF (KPDS(3).EQ.225) THEN
  2565. J = 24975
  2566. GO TO 800
  2567. ELSE IF (KPDS(3).EQ.226) THEN
  2568. J = 381029
  2569. GO TO 800
  2570. ELSE IF (KPDS(3).EQ.227) THEN
  2571. J = 1509825
  2572. GO TO 800
  2573. ELSE IF (KPDS(3).EQ.228) THEN
  2574. J = 10512
  2575. GO TO 800
  2576. ELSE IF (KPDS(3).EQ.229) THEN
  2577. J = 65160
  2578. GO TO 800
  2579. ELSE IF (KPDS(3).EQ.230) THEN
  2580. J = 259920
  2581. GO TO 800
  2582. ELSE IF (KPDS(3).EQ.231) THEN
  2583. J = 130320
  2584. GO TO 800
  2585. ELSE IF (KPDS(3).EQ.232) THEN
  2586. J = 32760
  2587. GO TO 800
  2588. ELSE IF (KPDS(3).EQ.233) THEN
  2589. J = 45216
  2590. GO TO 800
  2591. ELSE IF (KPDS(3).EQ.234) THEN
  2592. J = 16093
  2593. GO TO 800
  2594. ELSE IF (KPDS(3).EQ.235) THEN
  2595. J = 259200
  2596. GO TO 800
  2597. ELSE IF (KPDS(3).EQ.236) THEN
  2598. J = 17063
  2599. GO TO 800
  2600. ELSE IF (KPDS(3).EQ.237) THEN
  2601. J = 2538
  2602. GO TO 800
  2603. ELSE IF (KPDS(3).EQ.238) THEN
  2604. J = 55825
  2605. GO TO 800
  2606. ELSE IF (KPDS(3).EQ.239) THEN
  2607. J = 19065
  2608. GO TO 800
  2609. ELSE IF (KPDS(3).EQ.240) THEN
  2610. J = 987601
  2611. GO TO 800
  2612. ELSE IF (KPDS(3).EQ.241) THEN
  2613. J = 244305
  2614. GO TO 800
  2615. ELSE IF (KPDS(3).EQ.242) THEN
  2616. J = 235025
  2617. GO TO 800
  2618. ELSE IF (KPDS(3).EQ.243) THEN
  2619. J = 12726
  2620. GO TO 800
  2621. ELSE IF (KPDS(3).EQ.244) THEN
  2622. J = 55825
  2623. GO TO 800
  2624. ELSE IF (KPDS(3).EQ.245) THEN
  2625. J = 124992
  2626. GO TO 800
  2627. ELSE IF (KPDS(3).EQ.246) THEN
  2628. J = 123172
  2629. GO TO 800
  2630. ELSE IF (KPDS(3).EQ.247) THEN
  2631. J = 124992
  2632. GO TO 800
  2633. ELSE IF (KPDS(3).EQ.248) THEN
  2634. J = 13635
  2635. GO TO 800
  2636. ELSE IF (KPDS(3).EQ.249) THEN
  2637. J = 125881
  2638. GO TO 800
  2639. ELSE IF (KPDS(3).EQ.250) THEN
  2640. J = 13635
  2641. GO TO 800
  2642. ELSE IF (KPDS(3).EQ.251) THEN
  2643. J = 69720
  2644. GO TO 800
  2645. ELSE IF (KPDS(3).EQ.252) THEN
  2646. J = 67725
  2647. GO TO 800
  2648. ELSE IF (KPDS(3).EQ.253) THEN
  2649. J = 83552
  2650. GO TO 800
  2651. ELSE IF (KPDS(3).EQ.254) THEN
  2652. J = 110700
  2653. GO TO 800
  2654. ELSE IF (IAND(KPDS(4),128).EQ.128) THEN
  2655. GO TO 895
  2656. END IF
  2657. KRET = 5
  2658. RETURN
  2659. END IF
  2660. END IF
  2661. C -------------------------------------------------------
  2662. C CHECK JAPAN METEOROLOGICAL AGENCY SET
  2663. C -------------------------------------------------------
  2664. IF (KPDS(1).EQ.34) THEN
  2665. IF (IAND(KPDS(4),128).EQ.128) THEN
  2666. C PRINT *,'JMA MAP IS NOT PREDEFINED, THE GDS WILL'
  2667. C PRINT *,'BE USED TO UNPACK THE DATA, MAP = ',KPDS(3)
  2668. GO TO 900
  2669. END IF
  2670. END IF
  2671. C -------------------------------------------------------
  2672. C CHECK CANADIAN SET
  2673. C -------------------------------------------------------
  2674. IF (KPDS(1).EQ.54) THEN
  2675. IF (IAND(KPDS(4),128).EQ.128) THEN
  2676. C PRINT *,'CANADIAN MAP IS NOT PREDEFINED, THE GDS WILL'
  2677. C PRINT *,'BE USED TO UNPACK THE DATA, MAP = ',KPDS(3)
  2678. GO TO 900
  2679. END IF
  2680. END IF
  2681. C -------------------------------------------------------
  2682. C CHECK FNOC SET
  2683. C -------------------------------------------------------
  2684. IF (KPDS(1).EQ.58) THEN
  2685. IF (KPDS(3).EQ.220.OR.KPDS(3).EQ.221) THEN
  2686. C FNOC GRID 220, 221 - MAPSIZE 3969 (63 * 63)
  2687. J = 3969
  2688. KPTR(10) = J
  2689. DO I = 1, J
  2690. KBMS(I) = .TRUE.
  2691. END DO
  2692. RETURN
  2693. END IF
  2694. IF (KPDS(3).EQ.223) THEN
  2695. C FNOC GRID 223 - MAPSIZE 10512 (73 * 144)
  2696. J = 10512
  2697. KPTR(10) = J
  2698. DO I = 1, J
  2699. KBMS(I) = .TRUE.
  2700. END DO
  2701. RETURN
  2702. END IF
  2703. IF (IAND(KPDS(4),128).EQ.128) THEN
  2704. C PRINT *,'FNOC MAP IS NOT PREDEFINED, THE GDS WILL'
  2705. C PRINT *,'BE USED TO UNPACK THE DATA, MAP = ',KPDS(3)
  2706. GO TO 900
  2707. END IF
  2708. END IF
  2709. C -------------------------------------------------------
  2710. C CHECK UKMET SET
  2711. C -------------------------------------------------------
  2712. IF (KPDS(1).EQ.74) THEN
  2713. IF (IAND(KPDS(4),128).EQ.128) THEN
  2714. GO TO 820
  2715. END IF
  2716. END IF
  2717. C -------------------------------------------------------
  2718. C CHECK ECMWF SET
  2719. C -------------------------------------------------------
  2720. IF (KPDS(1).EQ.98) THEN
  2721. IF (KPDS(3).GE.1.AND.KPDS(3).LE.12) THEN
  2722. IF (KPDS(3).GE.5.AND.KPDS(3).LE.8) THEN
  2723. J = 1073
  2724. ELSE
  2725. J = 1369
  2726. END IF
  2727. KPTR(10) = J
  2728. CALL FI637(J,KPDS,KGDS,KRET)
  2729. IF(KRET.NE.0) GO TO 810
  2730. KPTR(10) = J ! Reset For Modified J
  2731. DO 1000 I = 1, J
  2732. KBMS(I) = .TRUE.
  2733. 1000 CONTINUE
  2734. RETURN
  2735. ELSE IF (KPDS(3).GE.13.AND.KPDS(3).LE.16) THEN
  2736. J = 361
  2737. KPTR(10) = J
  2738. CALL FI637(J,KPDS,KGDS,KRET)
  2739. IF(KRET.NE.0) GO TO 810
  2740. DO 1013 I = 1, J
  2741. KBMS(I) = .TRUE.
  2742. 1013 CONTINUE
  2743. RETURN
  2744. ELSE IF (IAND(KPDS(4),128).EQ.128) THEN
  2745. GO TO 810
  2746. ELSE
  2747. KRET = 5
  2748. RETURN
  2749. END IF
  2750. ELSE
  2751. C PRINT *,'CENTER ',KPDS(1),' IS NOT DEFINED'
  2752. IF (IAND(KPDS(4),128).EQ.128) THEN
  2753. C PRINT *,'GDS WILL BE USED TO UNPACK THE DATA',
  2754. C * ' MAP = ',KPDS(3)
  2755. GO TO 900
  2756. ELSE
  2757. KRET = 10
  2758. RETURN
  2759. END IF
  2760. END IF
  2761. C =======================================
  2762. C
  2763. 800 CONTINUE
  2764. KPTR(10) = J
  2765. CALL FI637 (J,KPDS,KGDS,KRET)
  2766. IF(KRET.NE.0) GO TO 801
  2767. DO 2201 I = 1, J
  2768. KBMS(I) = .TRUE.
  2769. 2201 CONTINUE
  2770. RETURN
  2771. 801 CONTINUE
  2772. C
  2773. C ----- THE MAP HAS A GDS, BYTE 7 OF THE (PDS) THE GRID IDENTIFICATION
  2774. C ----- IS NOT 255, THE SIZE OF THE GRID IS NOT THE SAME AS THE
  2775. C ----- PREDEFINED SIZES OF THE U.S. GRIDS, OR KNOWN GRIDS OF THE
  2776. C ----- OF THE OTHER CENTERS. THE GRID CAN BE UNKNOWN, OR FROM AN
  2777. C ----- UNKNOWN CENTER, WE WILL USE THE INFORMATION IN THE GDS TO MAKE
  2778. C ----- A BIT MAP.
  2779. C
  2780. 810 CONTINUE
  2781. C PRINT *,'ECMWF PREDEFINED MAP SIZE DOES NOT MATCH, I WILL USE'
  2782. GO TO 895
  2783. C
  2784. 820 CONTINUE
  2785. C PRINT *,'U.K. MET PREDEFINED MAP SIZE DOES NOT MATCH, I WILL USE'
  2786. GO TO 895
  2787. C
  2788. 890 CONTINUE
  2789. C PRINT *,'PREDEFINED MAP SIZE DOES NOT MATCH, I WILL USE'
  2790. 895 CONTINUE
  2791. C PRINT *,'THE GDS TO UNPACK THE DATA, MAP TYPE = ',KPDS(3)
  2792. C
  2793. 900 CONTINUE
  2794. J = KGDS(2) * KGDS(3)
  2795. C AFOS AFOS AFOS SPECIAL CASE
  2796. C INVOLVES NEXT SINGLE STATEMENT ONLY
  2797. IF (KPDS(3).EQ.211) KRET = 0
  2798. KPTR(10) = J
  2799. DO 2203 I = 1, J
  2800. KBMS(I) = .TRUE.
  2801. 2203 CONTINUE
  2802. C PRINT *,'EXIT FI634'
  2803. RETURN
  2804. END
  2805. C-----------------------------------------------------------------------
  2806. SUBROUTINE FI634X(NPTS,NSKP,MSGA,KBMS)
  2807. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  2808. C . . . .
  2809. C SUBPROGRAM: FI634X EXTRACT BIT MAP
  2810. C PRGMMR: IREDELL ORG: W/NP23 DATE: 91-09-19
  2811. C
  2812. C ABSTRACT: EXTRACT THE PACKED BITMAP INTO A LOGICAL ARRAY.
  2813. C
  2814. C PROGRAM HISTORY LOG:
  2815. C 97-09-19 IREDELL VECTORIZED BITMAP DECODER
  2816. C
  2817. C USAGE: CALL FI634X(NPTS,NSKP,MSGA,KBMS)
  2818. C INPUT ARGUMENT LIST:
  2819. C NPTS - INTEGER NUMBER OF POINTS IN THE BITMAP FIELD
  2820. C NSKP - INTEGER NUMBER OF BITS TO SKIP IN GRIB MESSAGE
  2821. C MSGA - CHARACTER*1 GRIB MESSAGE
  2822. C
  2823. C OUTPUT ARGUMENT LIST:
  2824. C KBMS - LOGICAL*1 BITMAP
  2825. C
  2826. C REMARKS:
  2827. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  2828. C
  2829. C ATTRIBUTES:
  2830. C LANGUAGE: FORTRAN 77
  2831. C MACHINE: CRAY
  2832. C
  2833. C$$$
  2834. CHARACTER*1 MSGA(*)
  2835. LOGICAL*1 KBMS(NPTS)
  2836. INTEGER ICHK(NPTS)
  2837. C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2838. CALL GBYTESC(MSGA,ICHK,NSKP,1,0,NPTS)
  2839. KBMS=ICHK.NE.0
  2840. C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  2841. END
  2842. SUBROUTINE FI635(MSGA,KPTR,KPDS,KGDS,KBMS,DATA,KRET)
  2843. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  2844. C . . . .
  2845. C SUBPROGRAM: FI635 EXTRACT GRIB DATA ELEMENTS FROM BDS
  2846. C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  2847. C
  2848. C ABSTRACT: EXTRACT GRIB DATA FROM BINARY DATA SECTION AND PLACE
  2849. C INTO OUTPUT ARRAY IN PROPER POSITION.
  2850. C
  2851. C PROGRAM HISTORY LOG:
  2852. C 91-09-13 CAVANAUGH
  2853. C 94-04-01 CAVANAUGH MODIFIED CODE TO INCLUDE DECIMAL SCALING WHEN
  2854. C CALCULATING THE VALUE OF DATA POINTS SPECIFIED
  2855. C AS BEING EQUAL TO THE REFERENCE VALUE
  2856. C 94-11-10 FARLEY INCREASED MXSIZE FROM 72960 TO 260000
  2857. C FOR .5 DEGREE SST ANALYSIS FIELDS
  2858. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  2859. C 98-08-31 IREDELL ELIMINATED NEED FOR MXSIZE
  2860. C
  2861. C USAGE: CALL FI635(MSGA,KPTR,KPDS,KGDS,KBMS,DATA,KRET)
  2862. C INPUT ARGUMENT LIST:
  2863. C MSGA - ARRAY CONTAINING GRIB MESSAGE
  2864. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  2865. C (1) - TOTAL LENGTH OF GRIB MESSAGE
  2866. C (2) - LENGTH OF INDICATOR (SECTION 0)
  2867. C (3) - LENGTH OF PDS (SECTION 1)
  2868. C (4) - LENGTH OF GDS (SECTION 2)
  2869. C (5) - LENGTH OF BMS (SECTION 3)
  2870. C (6) - LENGTH OF BDS (SECTION 4)
  2871. C (7) - VALUE OF CURRENT BYTE
  2872. C (8) - BIT POINTER
  2873. C (9) - GRIB START BIT NR
  2874. C (10) - GRIB/GRID ELEMENT COUNT
  2875. C (11) - NR UNUSED BITS AT END OF SECTION 3
  2876. C (12) - BIT MAP FLAG
  2877. C (13) - NR UNUSED BITS AT END OF SECTION 2
  2878. C (14) - BDS FLAGS
  2879. C (15) - NR UNUSED BITS AT END OF SECTION 4
  2880. C (16) - RESERVED
  2881. C (17) - RESERVED
  2882. C (18) - RESERVED
  2883. C (19) - BINARY SCALE FACTOR
  2884. C (20) - NUM BITS USED TO PACK EACH DATUM
  2885. C KPDS - ARRAY CONTAINING PDS ELEMENTS.
  2886. C SEE INITIAL ROUTINE
  2887. C KBMS - BITMAP DESCRIBING LOCATION OF OUTPUT ELEMENTS.
  2888. C
  2889. C OUTPUT ARGUMENT LIST:
  2890. C KBDS - INFORMATION EXTRACTED FROM BINARY DATA SECTION
  2891. C KBDS(1) - N1
  2892. C KBDS(2) - N2
  2893. C KBDS(3) - P1
  2894. C KBDS(4) - P2
  2895. C KBDS(5) - BIT POINTER TO 2ND ORDER WIDTHS
  2896. C KBDS(6) - " " " " " BIT MAPS
  2897. C KBDS(7) - " " " FIRST ORDER VALUES
  2898. C KBDS(8) - " " " SECOND ORDER VALUES
  2899. C KBDS(9) - " " START OF BDS
  2900. C KBDS(10) - " " MAIN BIT MAP
  2901. C KBDS(11) - BINARY SCALING
  2902. C KBDS(12) - DECIMAL SCALING
  2903. C KBDS(13) - BIT WIDTH OF FIRST ORDER VALUES
  2904. C KBDS(14) - BIT MAP FLAG
  2905. C 0 = NO SECOND ORDER BIT MAP
  2906. C 1 = SECOND ORDER BIT MAP PRESENT
  2907. C KBDS(15) - SECOND ORDER BIT WIDTH
  2908. C KBDS(16) - CONSTANT / DIFFERENT WIDTHS
  2909. C 0 = CONSTANT WIDTHS
  2910. C 1 = DIFFERENT WIDTHS
  2911. C KBDS(17) - SINGLE DATUM / MATRIX
  2912. C 0 = SINGLE DATUM AT EACH GRID POINT
  2913. C 1 = MATRIX OF VALUES AT EACH GRID POINT
  2914. C (18-20)- UNUSED
  2915. C
  2916. C DATA - REAL*4 ARRAY OF GRIDDED ELEMENTS IN GRIB MESSAGE.
  2917. C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
  2918. C SEE INPUT LIST
  2919. C KRET - ERROR RETURN
  2920. C
  2921. C REMARKS:
  2922. C ERROR RETURN
  2923. C 3 = UNPACKED FIELD IS LARGER THAN 65160
  2924. C 6 = DOES NOT MATCH NR OF ENTRIES FOR THIS GRIB/GRID
  2925. C 7 = NUMBER OF BITS IN FILL TOO LARGE
  2926. C
  2927. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  2928. C
  2929. C ATTRIBUTES:
  2930. C LANGUAGE: FORTRAN 77
  2931. C MACHINE: HDS9000
  2932. C
  2933. C$$$
  2934. C
  2935. CHARACTER*1 MSGA(*)
  2936. C
  2937. LOGICAL*1 KBMS(*)
  2938. C
  2939. INTEGER KPDS(*)
  2940. INTEGER KGDS(*)
  2941. INTEGER KBDS(20)
  2942. INTEGER KPTR(*)
  2943. INTEGER NRBITS
  2944. INTEGER,ALLOCATABLE:: KSAVE(:)
  2945. INTEGER KSCALE
  2946. C
  2947. REAL DATA(*)
  2948. REAL REFNCE
  2949. REAL SCALE
  2950. REAL REALKK
  2951. C
  2952. C
  2953. C CHANGED HEX VALUES TO DECIMAL TO MAKE CODE MORE PORTABLE
  2954. C
  2955. C *************************************************************
  2956. C PRINT *,'ENTER FI635'
  2957. C SET UP BIT POINTER
  2958. KPTR(8) = KPTR(9) + (KPTR(2)*8) + (KPTR(3)*8) + (KPTR(4)*8)
  2959. * + (KPTR(5)*8) + 24
  2960. C ------------- EXTRACT FLAGS
  2961. C BYTE 4
  2962. CALL GBYTEC(MSGA,KPTR(14),KPTR(8),4)
  2963. KPTR(8) = KPTR(8) + 4
  2964. C --------- NR OF UNUSED BITS IN SECTION 4
  2965. CALL GBYTEC(MSGA,KPTR(15),KPTR(8),4)
  2966. KPTR(8) = KPTR(8) + 4
  2967. KEND = KPTR(9) + (KPTR(2)*8) + (KPTR(3)*8) + (KPTR(4)*8)
  2968. * + (KPTR(5)*8) + KPTR(6) * 8 - KPTR(15)
  2969. C ------------- GET SCALE FACTOR
  2970. C BYTES 5,6
  2971. C CHECK SIGN
  2972. CALL GBYTEC (MSGA,KSIGN,KPTR(8),1)
  2973. KPTR(8) = KPTR(8) + 1
  2974. C GET ABSOLUTE SCALE VALUE
  2975. CALL GBYTEC (MSGA,KSCALE,KPTR(8),15)
  2976. KPTR(8) = KPTR(8) + 15
  2977. IF (KSIGN.GT.0) THEN
  2978. KSCALE = - KSCALE
  2979. END IF
  2980. SCALE = 2.0**KSCALE
  2981. KPTR(19)=KSCALE
  2982. C ------------ GET REFERENCE VALUE
  2983. C BYTES 7,10
  2984. C CALL GBYTE (MSGA,KREF,KPTR(8),32)
  2985. call gbytec(MSGA,JSGN,KPTR(8),1)
  2986. call gbytec(MSGA,JEXP,KPTR(8)+1,7)
  2987. call gbytec(MSGA,IFR,KPTR(8)+8,24)
  2988. KPTR(8) = KPTR(8) + 32
  2989. C
  2990. C THE NEXT CODE WILL CONVERT THE IBM370 FLOATING POINT
  2991. C TO THE FLOATING POINT USED ON YOUR COMPUTER.
  2992. C
  2993. C
  2994. C PRINT *,109,JSGN,JEXP,IFR
  2995. C 109 FORMAT (' JSGN,JEXP,IFR = ',3(1X,Z8))
  2996. IF (IFR.EQ.0) THEN
  2997. REFNCE = 0.0
  2998. ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
  2999. REFNCE = 0.0
  3000. ELSE
  3001. REFNCE = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
  3002. IF (JSGN.NE.0) REFNCE = - REFNCE
  3003. END IF
  3004. C PRINT *,'SCALE ',SCALE,' REF VAL ',REFNCE
  3005. C ------------- NUMBER OF BITS SPECIFIED FOR EACH ENTRY
  3006. C BYTE 11
  3007. CALL GBYTEC (MSGA,KBITS,KPTR(8),8)
  3008. KPTR(8) = KPTR(8) + 8
  3009. KBDS(4) = KBITS
  3010. C KBDS(13) = KBITS
  3011. KPTR(20) = KBITS
  3012. IBYT12 = KPTR(8)
  3013. C ------------------ IF THERE ARE NO EXTENDED FLAGS PRESENT
  3014. C THIS IS WHERE DATA BEGINS AND AND THE PROCESSING
  3015. C INCLUDED IN THE FOLLOWING IF...END IF
  3016. C WILL BE SKIPPED
  3017. C PRINT *,'BASIC FLAGS =',KPTR(14) ,IAND(KPTR(14),1)
  3018. IF (IAND(KPTR(14),1).EQ.0) THEN
  3019. C PRINT *,'NO EXTENDED FLAGS'
  3020. ELSE
  3021. C BYTES 12,13
  3022. CALL GBYTEC (MSGA,KOCTET,KPTR(8),16)
  3023. KPTR(8) = KPTR(8) + 16
  3024. C --------------------------- EXTENDED FLAGS
  3025. C BYTE 14
  3026. CALL GBYTEC (MSGA,KXFLAG,KPTR(8),8)
  3027. C PRINT *,'HAVE EXTENDED FLAGS',KXFLAG
  3028. KPTR(8) = KPTR(8) + 8
  3029. IF (IAND(KXFLAG,16).EQ.0) THEN
  3030. C SECOND ORDER VALUES CONSTANT WIDTHS
  3031. KBDS(16) = 0
  3032. ELSE
  3033. C SECOND ORDER VALUES DIFFERENT WIDTHS
  3034. KBDS(16) = 1
  3035. END IF
  3036. IF (IAND (KXFLAG,32).EQ.0) THEN
  3037. C NO SECONDARY BIT MAP
  3038. KBDS(14) = 0
  3039. ELSE
  3040. C HAVE SECONDARY BIT MAP
  3041. KBDS(14) = 1
  3042. END IF
  3043. IF (IAND (KXFLAG,64).EQ.0) THEN
  3044. C SINGLE DATUM AT GRID POINT
  3045. KBDS(17) = 0
  3046. ELSE
  3047. C MATRIX OF VALUES AT GRID POINT
  3048. KBDS(17) = 1
  3049. END IF
  3050. C ---------------------- NR - FIRST DIMENSION (ROWS) OF EACH MATRIX
  3051. C BYTES 15,16
  3052. CALL GBYTEC (MSGA,NR,KPTR(8),16)
  3053. KPTR(8) = KPTR(8) + 16
  3054. C ---------------------- NC - SECOND DIMENSION (COLS) OF EACH MATRIX
  3055. C BYTES 17,18
  3056. CALL GBYTEC (MSGA,NC,KPTR(8),16)
  3057. KPTR(8) = KPTR(8) + 16
  3058. C ---------------------- NRV - FIRST DIM COORD VALS
  3059. C BYTE 19
  3060. CALL GBYTEC (MSGA,NRV,KPTR(8),8)
  3061. KPTR(8) = KPTR(8) + 8
  3062. C ---------------------- NC1 - NR COEFF'S OR VALUES
  3063. C BYTE 20
  3064. CALL GBYTEC (MSGA,NC1,KPTR(8),8)
  3065. KPTR(8) = KPTR(8) + 8
  3066. C ---------------------- NCV - SECOND DIM COORD OR VALUE
  3067. C BYTE 21
  3068. CALL GBYTEC (MSGA,NCV,KPTR(8),8)
  3069. KPTR(8) = KPTR(8) + 8
  3070. C ---------------------- NC2 - NR COEFF'S OR VALS
  3071. C BYTE 22
  3072. CALL GBYTEC (MSGA,NC2,KPTR(8),8)
  3073. KPTR(8) = KPTR(8) + 8
  3074. C ---------------------- KPHYS1 - FIRST DIM PHYSICAL SIGNIF
  3075. C BYTE 23
  3076. CALL GBYTEC (MSGA,KPHYS1,KPTR(8),8)
  3077. KPTR(8) = KPTR(8) + 8
  3078. C ---------------------- KPHYS2 - SECOND DIM PHYSICAL SIGNIF
  3079. C BYTE 24
  3080. CALL GBYTEC (MSGA,KPHYS2,KPTR(8),8)
  3081. KPTR(8) = KPTR(8) + 8
  3082. C BYTES 25-N
  3083. END IF
  3084. IF (KBITS.EQ.0) THEN
  3085. C HAVE NO BDS ENTRIES, ALL ENTRIES = REFNCE
  3086. SCAL10 = 10.0 ** KPDS(22)
  3087. SCAL10 = 1.0 / SCAL10
  3088. REFN10 = REFNCE * SCAL10
  3089. KENTRY = KPTR(10)
  3090. DO 210 I = 1, KENTRY
  3091. DATA(I) = 0.0
  3092. IF (KBMS(I)) THEN
  3093. DATA(I) = REFN10
  3094. END IF
  3095. 210 CONTINUE
  3096. GO TO 900
  3097. END IF
  3098. C PRINT *,'KEND ',KEND,' KPTR(8) ',KPTR(8),'KBITS ',KBITS
  3099. KNR = (KEND - KPTR(8)) / KBITS
  3100. C PRINT *,'NUMBER OF ENTRIES IN DATA ARRAY',KNR
  3101. C --------------------
  3102. C CYCLE THRU BDS UNTIL HAVE USED ALL (SPECIFIED NUMBER)
  3103. C ENTRIES.
  3104. C ------------- UNUSED BITS IN DATA AREA
  3105. C NUMBER OF BYTES IN DATA AREA
  3106. NRBYTE = KPTR(6) - 11
  3107. C ------------- TOTAL NR OF USABLE BITS
  3108. NRBITS = NRBYTE * 8 - KPTR(15)
  3109. C ------------- TOTAL NR OF ENTRIES
  3110. KENTRY = NRBITS / KBITS
  3111. C ALLOCATE KSAVE
  3112. ALLOCATE(KSAVE(KENTRY))
  3113. C
  3114. C IF (IAND(KPTR(14),2).EQ.0) THEN
  3115. C PRINT *,'SOURCE VALUES IN FLOATING POINT'
  3116. C ELSE
  3117. C PRINT *,'SOURCE VALUES IN INTEGER'
  3118. C END IF
  3119. C
  3120. IF (IAND(KPTR(14),8).EQ.0) THEN
  3121. C PRINT *,'PROCESSING GRID POINT DATA'
  3122. IF (IAND(KPTR(14),4).EQ.0) THEN
  3123. C PRINT *,' WITH SIMPLE PACKING'
  3124. IF (IAND(KPTR(14),1).EQ.0) THEN
  3125. C PRINT *,' WITH NO ADDITIONAL FLAGS'
  3126. GO TO 4000
  3127. ELSE IF (IAND(KPTR(14),1).NE.0) THEN
  3128. C PRINT *,' WITH ADDITIONAL FLAGS',KXFLAG
  3129. IF (KBDS(17).EQ.0) THEN
  3130. C PRINT *,' SINGLE DATUM EACH GRID PT'
  3131. IF (KBDS(14).EQ.0) THEN
  3132. C PRINT *,' NO SEC BIT MAP'
  3133. IF (KBDS(16).EQ.0) THEN
  3134. C PRINT *,' SECOND ORDER',
  3135. C * ' VALUES CONSTANT WIDTH'
  3136. ELSE IF (KBDS(16).NE.0) THEN
  3137. C PRINT *,' SECOND ORDER',
  3138. C * ' VALUES DIFFERENT WIDTHS'
  3139. END IF
  3140. ELSE IF (KBDS(14).NE.0) THEN
  3141. C PRINT *,' SEC BIT MAP'
  3142. IF (KBDS(16).EQ.0) THEN
  3143. C PRINT *,' SECOND ORDER',
  3144. C * ' VALUES CONSTANT WIDTH'
  3145. ELSE IF (KBDS(16).NE.0) THEN
  3146. C PRINT *,' SECOND ORDER',
  3147. C * ' VALUES DIFFERENT WIDTHS'
  3148. END IF
  3149. END IF
  3150. ELSE IF (KBDS(17).NE.0) THEN
  3151. C PRINT *,' MATRIX OF VALS EACH PT'
  3152. IF (KBDS(14).EQ.0) THEN
  3153. C PRINT *,' NO SEC BIT MAP'
  3154. IF (KBDS(16).EQ.0) THEN
  3155. C PRINT *,' SECOND ORDER',
  3156. C * ' VALUES CONSTANT WIDTH'
  3157. ELSE IF (KBDS(16).NE.0) THEN
  3158. C PRINT *,' SECOND ORDER',
  3159. C * ' VALUES DIFFERENT WIDTHS'
  3160. END IF
  3161. ELSE IF (KBDS(14).NE.0) THEN
  3162. C PRINT *,' SEC BIT MAP'
  3163. IF (KBDS(16).EQ.0) THEN
  3164. C PRINT *,' SECOND ORDER',
  3165. C * ' VALUES CONSTANT WIDTH'
  3166. ELSE IF (KBDS(16).NE.0) THEN
  3167. C PRINT *,' SECOND ORDER',
  3168. C * ' VALUES DIFFERENT WIDTHS'
  3169. END IF
  3170. END IF
  3171. END IF
  3172. END IF
  3173. ELSE IF (IAND(KPTR(14),4).NE.0) THEN
  3174. C PRINT *,' WITH COMPLEX/SECOND ORDER PACKING'
  3175. IF (IAND(KPTR(14),1).EQ.0) THEN
  3176. C PRINT *,' WITH NO ADDITIONAL FLAGS'
  3177. ELSE IF (IAND(KPTR(14),1).NE.0) THEN
  3178. C PRINT *,' WITH ADDITIONAL FLAGS'
  3179. IF (KBDS(17).EQ.0) THEN
  3180. C PRINT *,' SINGLE DATUM AT EACH PT'
  3181. IF (KBDS(14).EQ.0) THEN
  3182. C PRINT *,' NO SEC BIT MAP'
  3183. IF (KBDS(16).EQ.0) THEN
  3184. C PRINT *,' SECOND ORDER',
  3185. C * ' VALUES CONSTANT WIDTH'
  3186. ELSE IF (KBDS(16).NE.0) THEN
  3187. C PRINT *,' SECOND ORDER',
  3188. C * ' VALUES DIFFERENT WIDTHS'
  3189. END IF
  3190. C ROW BY ROW - COL BY COL
  3191. CALL FI636 (DATA,MSGA,KBMS,
  3192. * REFNCE,KPTR,KPDS,KGDS)
  3193. GO TO 900
  3194. ELSE IF (KBDS(14).NE.0) THEN
  3195. C PRINT *,' SEC BIT MAP'
  3196. IF (KBDS(16).EQ.0) THEN
  3197. C PRINT *,' SECOND ORDER',
  3198. C * ' VALUES CONSTANT WIDTH'
  3199. ELSE IF (KBDS(16).NE.0) THEN
  3200. C PRINT *,' SECOND ORDER',
  3201. C * ' VALUES DIFFERENT WIDTHS'
  3202. END IF
  3203. CALL FI636 (DATA,MSGA,KBMS,
  3204. * REFNCE,KPTR,KPDS,KGDS)
  3205. GO TO 900
  3206. END IF
  3207. ELSE IF (KBDS(17).NE.0) THEN
  3208. C PRINT *,' MATRIX OF VALS EACH PT'
  3209. IF (KBDS(14).EQ.0) THEN
  3210. C PRINT *,' NO SEC BIT MAP'
  3211. IF (KBDS(16).EQ.0) THEN
  3212. C PRINT *,' SECOND ORDER',
  3213. C * ' VALUES CONSTANT WIDTH'
  3214. ELSE IF (KBDS(16).NE.0) THEN
  3215. C PRINT *,' SECOND ORDER',
  3216. C * ' VALUES DIFFERENT WIDTHS'
  3217. END IF
  3218. ELSE IF (KBDS(14).NE.0) THEN
  3219. C PRINT *,' SEC BIT MAP'
  3220. IF (KBDS(16).EQ.0) THEN
  3221. C PRINT *,' SECOND ORDER',
  3222. C * ' VALUES CONSTANT WIDTH'
  3223. ELSE IF (KBDS(16).NE.0) THEN
  3224. C PRINT *,' SECOND ORDER',
  3225. C * ' VALUES DIFFERENT WIDTHS'
  3226. END IF
  3227. END IF
  3228. END IF
  3229. END IF
  3230. END IF
  3231. ELSE IF (IAND(KPTR(14),8).NE.0) THEN
  3232. C PRINT *,'PROCESSING SPHERICAL HARMONIC COEFFICIENTS'
  3233. IF (IAND(KPTR(14),4).EQ.0) THEN
  3234. C PRINT *,' WITH SIMPLE PACKING'
  3235. IF (IAND(KPTR(14),1).EQ.0) THEN
  3236. C PRINT *,' WITH NO ADDITIONAL FLAGS'
  3237. GO TO 5000
  3238. ELSE IF (IAND(KPTR(14),1).NE.0) THEN
  3239. C PRINT *,' WITH ADDITIONAL FLAGS'
  3240. IF (KBDS(17).EQ.0) THEN
  3241. C PRINT *,' SINGLE DATUM EACH GRID PT'
  3242. IF (KBDS(14).EQ.0) THEN
  3243. C PRINT *,' NO SEC BIT MAP'
  3244. IF (KBDS(16).EQ.0) THEN
  3245. C PRINT *,' SECOND ORDER',
  3246. C * ' VALUES CONSTANT WIDTH'
  3247. ELSE IF (KBDS(16).NE.0) THEN
  3248. C PRINT *,' SECOND ORDER',
  3249. C * ' VALUES DIFFERENT WIDTHS'
  3250. END IF
  3251. ELSE IF (KBDS(14).NE.0) THEN
  3252. C PRINT *,' SEC BIT MAP'
  3253. IF (KBDS(16).EQ.0) THEN
  3254. C PRINT *,' SECOND ORDER',
  3255. C * ' VALUES CONSTANT WIDTH'
  3256. ELSE IF (KBDS(16).NE.0) THEN
  3257. C PRINT *,' SECOND ORDER',
  3258. C * ' VALUES DIFFERENT WIDTHS'
  3259. END IF
  3260. END IF
  3261. ELSE IF (KBDS(17).NE.0) THEN
  3262. C PRINT *,' MATRIX OF VALS EACH PT'
  3263. IF (KBDS(14).EQ.0) THEN
  3264. C PRINT *,' NO SEC BIT MAP'
  3265. IF (KBDS(16).EQ.0) THEN
  3266. C PRINT *,' SECOND ORDER',
  3267. C * ' VALUES CONSTANT WIDTH'
  3268. ELSE IF (KBDS(16).NE.0) THEN
  3269. C PRINT *,' SECOND ORDER',
  3270. C * ' VALUES DIFFERENT WIDTHS'
  3271. END IF
  3272. ELSE IF (KBDS(14).NE.0) THEN
  3273. C PRINT *,' SEC BIT MAP'
  3274. IF (KBDS(16).EQ.0) THEN
  3275. C PRINT *,' SECOND ORDER',
  3276. C * ' VALUES CONSTANT WIDTH'
  3277. ELSE IF (KBDS(16).NE.0) THEN
  3278. C PRINT *,' SECOND ORDER',
  3279. C * ' VALUES DIFFERENT WIDTHS'
  3280. END IF
  3281. END IF
  3282. END IF
  3283. END IF
  3284. ELSE IF (IAND(KPTR(14),4).NE.0) THEN
  3285. C COMPLEX/SECOND ORDER PACKING
  3286. C PRINT *,' WITH COMPLEX/SECOND ORDER PACKING'
  3287. IF (IAND(KPTR(14),1).EQ.0) THEN
  3288. C PRINT *,' WITH NO ADDITIONAL FLAGS'
  3289. ELSE IF (IAND(KPTR(14),1).NE.0) THEN
  3290. C PRINT *,' WITH ADDITIONAL FLAGS'
  3291. IF (KBDS(17).EQ.0) THEN
  3292. C PRINT *,' SINGLE DATUM EACH GRID PT'
  3293. IF (KBDS(14).EQ.0) THEN
  3294. C PRINT *,' NO SEC BIT MAP'
  3295. IF (KBDS(16).EQ.0) THEN
  3296. C PRINT *,' SECOND ORDER',
  3297. C * ' VALUES CONSTANT WIDTH'
  3298. ELSE IF (KBDS(16).NE.0) THEN
  3299. C PRINT *,' SECOND ORDER',
  3300. C * ' VALUES DIFFERENT WIDTHS'
  3301. END IF
  3302. ELSE IF (KBDS(14).NE.0) THEN
  3303. C PRINT *,' SEC BIT MAP'
  3304. IF (KBDS(16).EQ.0) THEN
  3305. C PRINT *,' SECOND ORDER',
  3306. C * ' VALUES CONSTANT WIDTH'
  3307. ELSE IF (KBDS(16).NE.0) THEN
  3308. C PRINT *,' SECOND ORDER',
  3309. C * ' VALUES DIFFERENT WIDTHS'
  3310. END IF
  3311. END IF
  3312. ELSE IF (KBDS(17).NE.0) THEN
  3313. C PRINT *,' MATRIX OF VALS EACH PT'
  3314. IF (KBDS(14).EQ.0) THEN
  3315. C PRINT *,' NO SEC BIT MAP'
  3316. IF (KBDS(16).EQ.0) THEN
  3317. C PRINT *,' SECOND ORDER',
  3318. C * ' VALUES CONSTANT WIDTH'
  3319. ELSE IF (KBDS(16).NE.0) THEN
  3320. C PRINT *,' SECOND ORDER',
  3321. C * ' VALUES DIFFERENT WIDTHS'
  3322. END IF
  3323. ELSE IF (KBDS(14).NE.0) THEN
  3324. C PRINT *,' SEC BIT MAP'
  3325. IF (KBDS(16).EQ.0) THEN
  3326. C PRINT *,' SECOND ORDER',
  3327. C * ' VALUES CONSTANT WIDTH'
  3328. ELSE IF (KBDS(16).NE.0) THEN
  3329. C PRINT *,' SECOND ORDER',
  3330. C * ' VALUES DIFFERENT WIDTHS'
  3331. END IF
  3332. END IF
  3333. END IF
  3334. END IF
  3335. END IF
  3336. END IF
  3337. IF(ALLOCATED(KSAVE)) DEALLOCATE(KSAVE)
  3338. C PRINT *,' NOT PROCESSED - NOT PROCESSED - NOT PROCESSED'
  3339. KRET = 11
  3340. RETURN
  3341. 4000 CONTINUE
  3342. C ****************************************************************
  3343. C
  3344. C GRID POINT DATA, SIMPLE PACKING, FLOATING POINT, NO ADDN'L FLAGS
  3345. C
  3346. SCAL10 = 10.0 ** KPDS(22)
  3347. SCAL10 = 1.0 / SCAL10
  3348. IF (KPDS(3).EQ.23.OR.KPDS(3).EQ.24.OR.KPDS(3).EQ.26.
  3349. * OR.KPDS(3).EQ.63.OR.KPDS(3).EQ.64) THEN
  3350. IF (KPDS(3).EQ.26) THEN
  3351. KADD = 72
  3352. ELSE IF (KPDS(3).EQ.63.OR.KPDS(3).EQ.64) THEN
  3353. KADD = 91
  3354. ELSE
  3355. KADD = 37
  3356. END IF
  3357. CALL GBYTESC (MSGA,KSAVE,KPTR(8),KBITS,0,KNR)
  3358. KPTR(8) = KPTR(8) + KBITS * KNR
  3359. II = 1
  3360. KENTRY = KPTR(10)
  3361. DO 4001 I = 1, KENTRY
  3362. IF (KBMS(I)) THEN
  3363. DATA(I) = (REFNCE+FLOAT(KSAVE(II))*SCALE)*SCAL10
  3364. II = II + 1
  3365. ELSE
  3366. DATA(I) = 0.0
  3367. END IF
  3368. 4001 CONTINUE
  3369. DO 4002 I = 2, KADD
  3370. DATA(I) = DATA(1)
  3371. 4002 CONTINUE
  3372. ELSE IF (KPDS(3).EQ.21.OR.KPDS(3).EQ.22.OR.KPDS(3).EQ.25.
  3373. * OR.KPDS(3).EQ.61.OR.KPDS(3).EQ.62) THEN
  3374. CALL GBYTESC (MSGA,KSAVE,KPTR(8),KBITS,0,KNR)
  3375. II = 1
  3376. KENTRY = KPTR(10)
  3377. DO 4011 I = 1, KENTRY
  3378. IF (KBMS(I)) THEN
  3379. DATA(I) = (REFNCE + FLOAT(KSAVE(II)) * SCALE) * SCAL10
  3380. II = II + 1
  3381. ELSE
  3382. DATA(I) = 0.0
  3383. END IF
  3384. 4011 CONTINUE
  3385. IF (KPDS(3).EQ.25) THEN
  3386. KADD = 71
  3387. ELSE IF (KPDS(3).EQ.61.OR.KPDS(3).EQ.62) THEN
  3388. KADD = 90
  3389. ELSE
  3390. KADD = 36
  3391. END IF
  3392. LASTP = KENTRY - KADD
  3393. DO 4012 I = LASTP+1, KENTRY
  3394. DATA(I) = DATA(LASTP)
  3395. 4012 CONTINUE
  3396. ELSE
  3397. CALL GBYTESC (MSGA,KSAVE,KPTR(8),KBITS,0,KNR)
  3398. II = 1
  3399. KENTRY = KPTR(10)
  3400. DO 500 I = 1, KENTRY
  3401. IF (KBMS(I)) THEN
  3402. DATA(I) = (REFNCE + FLOAT(KSAVE(II)) * SCALE) * SCAL10
  3403. II = II + 1
  3404. ELSE
  3405. DATA(I) = 0.0
  3406. END IF
  3407. 500 CONTINUE
  3408. END IF
  3409. GO TO 900
  3410. C ------------- PROCESS SPHERICAL HARMONIC COEFFICIENTS,
  3411. C SIMPLE PACKING, FLOATING POINT, NO ADDN'L FLAGS
  3412. 5000 CONTINUE
  3413. C PRINT *,'CHECK POINT SPECTRAL COEFF'
  3414. KPTR(8) = IBYT12
  3415. C CALL GBYTE (MSGA,KKK,KPTR(8),32)
  3416. call gbytec(MSGA,JSGN,KPTR(8),1)
  3417. call gbytec(MSGA,JEXP,KPTR(8)+1,7)
  3418. call gbytec(MSGA,IFR,KPTR(8)+8,24)
  3419. KPTR(8) = KPTR(8) + 32
  3420. C
  3421. C THE NEXT CODE WILL CONVERT THE IBM370 FOATING POINT
  3422. C TO THE FLOATING POINT USED ON YOUR MACHINE.
  3423. C
  3424. IF (IFR.EQ.0) THEN
  3425. REALKK = 0.0
  3426. ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
  3427. REALKK = 0.0
  3428. ELSE
  3429. REALKK = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
  3430. IF (JSGN.NE.0) REALKK = -REALKK
  3431. END IF
  3432. DATA(1) = REALKK
  3433. CALL GBYTESC (MSGA,KSAVE,KPTR(8),KBITS,0,KNR)
  3434. C --------------
  3435. DO 6000 I = 1, KENTRY
  3436. DATA(I+1) = REFNCE + FLOAT(KSAVE(I)) * SCALE
  3437. 6000 CONTINUE
  3438. 900 CONTINUE
  3439. IF(ALLOCATED(KSAVE)) DEALLOCATE(KSAVE)
  3440. C PRINT *,'EXIT FI635'
  3441. RETURN
  3442. END
  3443. SUBROUTINE FI636 (DATA,MSGA,KBMS,REFNCE,KPTR,KPDS,KGDS)
  3444. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  3445. C . . . .
  3446. C SUBPROGRAM: FI636 PROCESS SECOND ORDER PACKING
  3447. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 92-09-22
  3448. C
  3449. C ABSTRACT: PROCESS SECOND ORDER PACKING FROM THE BINARY DATA SECTION
  3450. C (BDS) FOR SINGLE DATA ITEMS GRID POINT DATA
  3451. C
  3452. C PROGRAM HISTORY LOG:
  3453. C 93-06-08 CAVANAUGH
  3454. C 93-12-15 CAVANAUGH MODIFIED SECOND ORDER POINTERS TO FIRST ORDER
  3455. C VALUES AND SECOND ORDER VALUES CORRECTLY.
  3456. C 95-04-26 R.E.JONES FI636 CORECTION FOR 2ND ORDER COMPLEX
  3457. C UNPACKING.
  3458. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  3459. C
  3460. C USAGE: CALL FI636 (DATA,MSGA,KBMS,REFNCE,KPTR,KPDS,KGDS)
  3461. C INPUT ARGUMENT LIST:
  3462. C
  3463. C MSGA - ARRAY CONTAINING GRIB MESSAGE
  3464. C REFNCE - REFERENCE VALUE
  3465. C KPTR - WORK ARRAY
  3466. C
  3467. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  3468. C DATA - LOCATION OF OUTPUT ARRAY
  3469. C WORKING ARRAY
  3470. C KBDS(1) - N1
  3471. C KBDS(2) - N2
  3472. C KBDS(3) - P1
  3473. C KBDS(4) - P2
  3474. C KBDS(5) - BIT POINTER TO 2ND ORDER WIDTHS
  3475. C KBDS(6) - " " " " " BIT MAPS
  3476. C KBDS(7) - " " " FIRST ORDER VALUES
  3477. C KBDS(8) - " " " SECOND ORDER VALUES
  3478. C KBDS(9) - " " START OF BDS
  3479. C KBDS(10) - " " MAIN BIT MAP
  3480. C KBDS(11) - BINARY SCALING
  3481. C KBDS(12) - DECIMAL SCALING
  3482. C KBDS(13) - BIT WIDTH OF FIRST ORDER VALUES
  3483. C KBDS(14) - BIT MAP FLAG
  3484. C 0 = NO SECOND ORDER BIT MAP
  3485. C 1 = SECOND ORDER BIT MAP PRESENT
  3486. C KBDS(15) - SECOND ORDER BIT WIDTH
  3487. C KBDS(16) - CONSTANT / DIFFERENT WIDTHS
  3488. C 0 = CONSTANT WIDTHS
  3489. C 1 = DIFFERENT WIDTHS
  3490. C KBDS(17) - SINGLE DATUM / MATRIX
  3491. C 0 = SINGLE DATUM AT EACH GRID POINT
  3492. C 1 = MATRIX OF VALUES AT EACH GRID POINT
  3493. C (18-20)- UNUSED
  3494. C
  3495. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  3496. C
  3497. C ATTRIBUTES:
  3498. C LANGUAGE: FORTRAN 77
  3499. C MACHINE: HDS, CRAY
  3500. C
  3501. C$$$
  3502. REAL DATA(*)
  3503. REAL REFN
  3504. REAL REFNCE
  3505. C
  3506. INTEGER KBDS(20)
  3507. INTEGER KPTR(*)
  3508. character(len=1) BMAP2(1000000)
  3509. INTEGER I,IBDS
  3510. INTEGER KBIT,IFOVAL,ISOVAL
  3511. INTEGER KPDS(*),KGDS(*)
  3512. C
  3513. LOGICAL*1 KBMS(*)
  3514. C
  3515. CHARACTER*1 MSGA(*)
  3516. C
  3517. C ******************* SETUP ******************************
  3518. C PRINT *,'ENTER FI636'
  3519. C START OF BMS (BIT POINTER)
  3520. DO I = 1,20
  3521. KBDS(I) = 0
  3522. END DO
  3523. C BYTE START OF BDS
  3524. IBDS = KPTR(2) + KPTR(3) + KPTR(4) + KPTR(5)
  3525. C PRINT *,'KPTR(2-5) ',KPTR(2),KPTR(3),KPTR(4),KPTR(5)
  3526. C BIT START OF BDS
  3527. JPTR = IBDS * 8
  3528. C PRINT *,'JPTR ',JPTR
  3529. KBDS(9) = JPTR
  3530. C PRINT *,'START OF BDS ',KBDS(9)
  3531. C BINARY SCALE VALUE BDS BYTES 5-6
  3532. CALL GBYTEC (MSGA,ISIGN,JPTR+32,1)
  3533. CALL GBYTEC (MSGA,KBDS(11),JPTR+33,15)
  3534. IF (ISIGN.GT.0) THEN
  3535. KBDS(11) = - KBDS(11)
  3536. END IF
  3537. C PRINT *,'BINARY SCALE VALUE =',KBDS(11)
  3538. C EXTRACT REFERENCE VALUE
  3539. C CALL GBYTEC(MSGA,JREF,JPTR+48,32)
  3540. call gbytec(MSGA,JSGN,KPTR(8),1)
  3541. call gbytec(MSGA,JEXP,KPTR(8)+1,7)
  3542. call gbytec(MSGA,IFR,KPTR(8)+8,24)
  3543. IF (IFR.EQ.0) THEN
  3544. REFNCE = 0.0
  3545. ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
  3546. REFNCE = 0.0
  3547. ELSE
  3548. REFNCE = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
  3549. IF (JSGN.NE.0) REFNCE = - REFNCE
  3550. END IF
  3551. C PRINT *,'DECODED REFERENCE VALUE =',REFN,REFNCE
  3552. C F O BIT WIDTH
  3553. CALL GBYTEC(MSGA,KBDS(13),JPTR+80,8)
  3554. JPTR = JPTR + 88
  3555. C AT START OF BDS BYTE 12
  3556. C EXTRACT N1
  3557. CALL GBYTEC (MSGA,KBDS(1),JPTR,16)
  3558. C PRINT *,'N1 = ',KBDS(1)
  3559. JPTR = JPTR + 16
  3560. C EXTENDED FLAGS
  3561. CALL GBYTEC (MSGA,KFLAG,JPTR,8)
  3562. C ISOLATE BIT MAP FLAG
  3563. IF (IAND(KFLAG,32).NE.0) THEN
  3564. KBDS(14) = 1
  3565. ELSE
  3566. KBDS(14) = 0
  3567. END IF
  3568. IF (IAND(KFLAG,16).NE.0) THEN
  3569. KBDS(16) = 1
  3570. ELSE
  3571. KBDS(16) = 0
  3572. END IF
  3573. IF (IAND(KFLAG,64).NE.0) THEN
  3574. KBDS(17) = 1
  3575. ELSE
  3576. KBDS(17) = 0
  3577. END IF
  3578. JPTR = JPTR + 8
  3579. C EXTRACT N2
  3580. CALL GBYTEC (MSGA,KBDS(2),JPTR,16)
  3581. C PRINT *,'N2 = ',KBDS(2)
  3582. JPTR = JPTR + 16
  3583. C EXTRACT P1
  3584. CALL GBYTEC (MSGA,KBDS(3),JPTR,16)
  3585. C PRINT *,'P1 = ',KBDS(3)
  3586. JPTR = JPTR + 16
  3587. C EXTRACT P2
  3588. CALL GBYTEC (MSGA,KBDS(4),JPTR,16)
  3589. C PRINT *,'P2 = ',KBDS(4)
  3590. JPTR = JPTR + 16
  3591. C SKIP RESERVED BYTE
  3592. JPTR = JPTR + 8
  3593. C START OF SECOND ORDER BIT WIDTHS
  3594. KBDS(5) = JPTR
  3595. C COMPUTE START OF SECONDARY BIT MAP
  3596. IF (KBDS(14).NE.0) THEN
  3597. C FOR INCLUDED SECONDARY BIT MAP
  3598. JPTR = JPTR + (KBDS(3) * 8)
  3599. KBDS(6) = JPTR
  3600. ELSE
  3601. C FOR CONSTRUCTED SECONDARY BIT MAP
  3602. KBDS(6) = 0
  3603. END IF
  3604. C CREATE POINTER TO START OF FIRST ORDER VALUES
  3605. KBDS(7) = KBDS(9) + KBDS(1) * 8 - 8
  3606. C PRINT *,'BIT POINTER TO START OF FOVALS',KBDS(7)
  3607. C CREATE POINTER TO START OF SECOND ORDER VALUES
  3608. KBDS(8) = KBDS(9) + KBDS(2) * 8 - 8
  3609. C PRINT *,'BIT POINTER TO START OF SOVALS',KBDS(8)
  3610. C PRINT *,'KBDS( 1) - N1 ',KBDS( 1)
  3611. C PRINT *,'KBDS( 2) - N2 ',KBDS( 2)
  3612. C PRINT *,'KBDS( 3) - P1 ',KBDS( 3)
  3613. C PRINT *,'KBDS( 4) - P2 ',KBDS( 4)
  3614. C PRINT *,'KBDS( 5) - BIT PTR - 2ND ORDER WIDTHS ',KBDS( 5)
  3615. C PRINT *,'KBDS( 6) - " " " " BIT MAPS ',KBDS( 6)
  3616. C PRINT *,'KBDS( 7) - " " F O VALS ',KBDS( 7)
  3617. C PRINT *,'KBDS( 8) - " " S O VALS ',KBDS( 8)
  3618. C PRINT *,'KBDS( 9) - " " START OF BDS ',KBDS( 9)
  3619. C PRINT *,'KBDS(10) - " " MAIN BIT MAP ',KBDS(10)
  3620. C PRINT *,'KBDS(11) - BINARY SCALING ',KBDS(11)
  3621. C PRINT *,'KPDS(22) - DECIMAL SCALING ',KPDS(22)
  3622. C PRINT *,'KBDS(13) - FO BIT WIDTH ',KBDS(13)
  3623. C PRINT *,'KBDS(14) - 2ND ORDER BIT MAP FLAG ',KBDS(14)
  3624. C PRINT *,'KBDS(15) - 2ND ORDER BIT WIDTH ',KBDS(15)
  3625. C PRINT *,'KBDS(16) - CONSTANT/DIFFERENT WIDTHS ',KBDS(16)
  3626. C PRINT *,'KBDS(17) - SINGLE DATUM/MATRIX ',KBDS(17)
  3627. C PRINT *,'REFNCE VAL ',REFNCE
  3628. C ************************* PROCESS DATA **********************
  3629. IJ = 0
  3630. C ========================================================
  3631. IF (KBDS(14).EQ.0) THEN
  3632. C NO BIT MAP, MUST CONSTRUCT ONE
  3633. IF (KGDS(2).EQ.65535) THEN
  3634. IF (KGDS(20).EQ.255) THEN
  3635. C PRINT *,'CANNOT BE USED HERE'
  3636. ELSE
  3637. C POINT TO PL
  3638. LP = KPTR(9) + KPTR(2)*8 + KPTR(3)*8 + KGDS(20)*8 - 8
  3639. C PRINT *,'LP = ',LP
  3640. JT = 0
  3641. DO 2000 JZ = 1, KGDS(3)
  3642. C GET NUMBER IN CURRENT ROW
  3643. CALL GBYTEC (MSGA,NUMBER,LP,16)
  3644. C INCREMENT TO NEXT ROW NUMBER
  3645. LP = LP + 16
  3646. C PRINT *,'NUMBER IN ROW',JZ,' = ',NUMBER
  3647. DO 1500 JQ = 1, NUMBER
  3648. IF (JQ.EQ.1) THEN
  3649. CALL SBYTEC (BMAP2,1,JT,1)
  3650. ELSE
  3651. CALL SBYTEC (BMAP2,0,JT,1)
  3652. END IF
  3653. JT = JT + 1
  3654. 1500 CONTINUE
  3655. 2000 CONTINUE
  3656. END IF
  3657. ELSE
  3658. IF (IAND(KGDS(11),32).EQ.0) THEN
  3659. C ROW BY ROW
  3660. C PRINT *,' ROW BY ROW'
  3661. KOUT = KGDS(3)
  3662. KIN = KGDS(2)
  3663. ELSE
  3664. C COL BY COL
  3665. C PRINT *,' COL BY COL'
  3666. KIN = KGDS(3)
  3667. KOUT = KGDS(2)
  3668. END IF
  3669. C PRINT *,'KIN=',KIN,' KOUT= ',KOUT
  3670. DO 200 I = 1, KOUT
  3671. DO 150 J = 1, KIN
  3672. IF (J.EQ.1) THEN
  3673. CALL SBYTEC (BMAP2,1,IJ,1)
  3674. ELSE
  3675. CALL SBYTEC (BMAP2,0,IJ,1)
  3676. END IF
  3677. IJ = IJ + 1
  3678. 150 CONTINUE
  3679. 200 CONTINUE
  3680. END IF
  3681. END IF
  3682. C ========================================================
  3683. C PRINT 99,(BMAP2(J),J=1,110)
  3684. C99 FORMAT ( 10(1X,Z8.8))
  3685. C CALL BINARY (BMAP2,2)
  3686. C FOR EACH GRID POINT ENTRY
  3687. C
  3688. SCALE2 = 2.0**KBDS(11)
  3689. SCAL10 = 10.0**KPDS(22)
  3690. C PRINT *,'SCALE VALUES - ',SCALE2,SCAL10
  3691. DO 1000 I = 1, KPTR(10)
  3692. C GET NEXT MASTER BIT MAP BIT POSITION
  3693. C IF NEXT MASTER BIT MAP BIT POSITION IS 'ON' (1)
  3694. IF (KBMS(I)) THEN
  3695. C WRITE(6,900)I,KBMS(I)
  3696. C 900 FORMAT (1X,I4,3X,14HMAIN BIT IS ON,3X,L4)
  3697. IF (KBDS(14).NE.0) THEN
  3698. CALL GBYTEC (MSGA,KBIT,KBDS(6),1)
  3699. ELSE
  3700. CALL GBYTEC (BMAP2,KBIT,KBDS(6),1)
  3701. END IF
  3702. C PRINT *,'KBDS(6) =',KBDS(6),' KBIT =',KBIT
  3703. KBDS(6) = KBDS(6) + 1
  3704. IF (KBIT.NE.0) THEN
  3705. C PRINT *,' SOB ON'
  3706. C GET NEXT FIRST ORDER PACKED VALUE
  3707. CALL GBYTEC (MSGA,IFOVAL,KBDS(7),KBDS(13))
  3708. KBDS(7) = KBDS(7) + KBDS(13)
  3709. C PRINT *,'FOVAL =',IFOVAL
  3710. C GET SECOND ORDER BIT WIDTH
  3711. CALL GBYTEC (MSGA,KBDS(15),KBDS(5),8)
  3712. KBDS(5) = KBDS(5) + 8
  3713. C PRINT *,KBDS(7)-KBDS(13),' FOVAL =',IFOVAL,' KBDS(5)=',
  3714. C * ,KBDS(5), 'ISOWID =',KBDS(15)
  3715. ELSE
  3716. C PRINT *,' SOB NOT ON'
  3717. END IF
  3718. ISOVAL = 0
  3719. IF (KBDS(15).EQ.0) THEN
  3720. C IF SECOND ORDER BIT WIDTH = 0
  3721. C THEN SECOND ORDER VALUE IS 0
  3722. C SO CALCULATE DATA VALUE FOR THIS POINT
  3723. C DATA(I) = (REFNCE + (FLOAT(IFOVAL) * SCALE2)) / SCAL10
  3724. ELSE
  3725. CALL GBYTEC (MSGA,ISOVAL,KBDS(8),KBDS(15))
  3726. KBDS(8) = KBDS(8) + KBDS(15)
  3727. END IF
  3728. DATA(I) = (REFNCE + (FLOAT(IFOVAL + ISOVAL) *
  3729. * SCALE2)) / SCAL10
  3730. C PRINT *,I,DATA(I),REFNCE,IFOVAL,ISOVAL,SCALE2,SCAL10
  3731. ELSE
  3732. C WRITE(6,901) I,KBMS(I)
  3733. C 901 FORMAT (1X,I4,3X,15HMAIN BIT NOT ON,3X,L4)
  3734. DATA(I) = 0.0
  3735. END IF
  3736. C PRINT *,I,DATA(I),IFOVAL,ISOVAL,KBDS(5),KBDS(15)
  3737. 1000 CONTINUE
  3738. C **************************************************************
  3739. C PRINT *,'EXIT FI636'
  3740. RETURN
  3741. END
  3742. SUBROUTINE FI637(J,KPDS,KGDS,KRET)
  3743. C$$$ SUBPROGRAM DOCUMENTATION BLOCK
  3744. C . . . .
  3745. C SUBPROGRAM: FI637 GRIB GRID/SIZE TEST
  3746. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
  3747. C
  3748. C ABSTRACT: TO TEST WHEN GDS IS AVAILABLE TO SEE IF SIZE MISMATCH
  3749. C ON EXISTING GRIDS (BY CENTER) IS INDICATED
  3750. C
  3751. C PROGRAM HISTORY LOG:
  3752. C 91-09-13 CAVANAUGH
  3753. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  3754. C 97-02-12 W BOSTELMAN CORRECTS ECMWF US GRID 2 PROCESSING
  3755. C 98-06-17 IREDELL REMOVED ALTERNATE RETURN
  3756. C 99-01-20 BALDWIN MODIFY TO HANDLE GRID 237
  3757. C 09-05-21 VUONG MODIFY TO HANDLE GRID 45
  3758. C
  3759. C USAGE: CALL FI637(J,KPDS,KGDS,KRET)
  3760. C INPUT ARGUMENT LIST:
  3761. C J - SIZE FOR INDICATED GRID
  3762. C KPDS -
  3763. C KGDS -
  3764. C
  3765. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  3766. C J - SIZE FOR INDICATED GRID MODIFIED FOR ECMWF-US 2
  3767. C KRET - ERROR RETURN
  3768. C (A MISMATCH WAS DETECTED IF KRET IS NOT ZERO)
  3769. C
  3770. C REMARKS:
  3771. C KRET -
  3772. C = 9 - GDS INDICATES SIZE MISMATCH WITH STD GRID
  3773. C
  3774. C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  3775. C
  3776. C ATTRIBUTES:
  3777. C LANGUAGE: FORTRAN 77
  3778. C MACHINE: HDS
  3779. C
  3780. C$$$
  3781. INTEGER KPDS(*)
  3782. INTEGER KGDS(*)
  3783. INTEGER J
  3784. INTEGER I
  3785. C ---------------------------------------
  3786. C ---------------------------------------
  3787. C IF GDS NOT INDICATED, RETURN
  3788. C ----------------------------------------
  3789. KRET=0
  3790. IF (IAND(KPDS(4),128).EQ.0) RETURN
  3791. C ---------------------------------------
  3792. C GDS IS INDICATED, PROCEED WITH TESTING
  3793. C ---------------------------------------
  3794. IF (KGDS(2).EQ.65535) THEN
  3795. RETURN
  3796. END IF
  3797. KRET=1
  3798. I = KGDS(2) * KGDS(3)
  3799. C ---------------------------------------
  3800. C INTERNATIONAL SET
  3801. C ---------------------------------------
  3802. IF (KPDS(3).GE.21.AND.KPDS(3).LE.26) THEN
  3803. IF (I.NE.J) THEN
  3804. RETURN
  3805. END IF
  3806. ELSE IF (KPDS(3).GE.37.AND.KPDS(3).LE.44) THEN
  3807. IF (I.NE.J) THEN
  3808. RETURN
  3809. END IF
  3810. ELSE IF (KPDS(3).EQ.50) THEN
  3811. IF (I.NE.J) THEN
  3812. RETURN
  3813. END IF
  3814. ELSE IF (KPDS(3).GE.61.AND.KPDS(3).LE.64) THEN
  3815. IF (I.NE.J) THEN
  3816. RETURN
  3817. END IF
  3818. C ---------------------------------------
  3819. C TEST ECMWF CONTENT
  3820. C ---------------------------------------
  3821. ELSE IF (KPDS(1).EQ.98) THEN
  3822. KRET = 9
  3823. IF (KPDS(3).GE.1.AND.KPDS(3).LE.16) THEN
  3824. IF (I.NE.J) THEN
  3825. IF (KPDS(3) .NE. 2) THEN
  3826. RETURN
  3827. ELSEIF (I .NE. 10512) THEN ! Test for US Grid 2
  3828. RETURN
  3829. END IF
  3830. J = I ! Set to US Grid 2, 2.5 Global
  3831. END IF
  3832. ELSE
  3833. KRET = 5
  3834. RETURN
  3835. END IF
  3836. C ---------------------------------------
  3837. C U.K. MET OFFICE, BRACKNELL
  3838. C ---------------------------------------
  3839. ELSE IF (KPDS(1).EQ.74) THEN
  3840. KRET = 9
  3841. IF (KPDS(3).GE.25.AND.KPDS(3).LE.26) THEN
  3842. IF (I.NE.J) THEN
  3843. RETURN
  3844. END IF
  3845. ELSE
  3846. KRET = 5
  3847. RETURN
  3848. END IF
  3849. C ---------------------------------------
  3850. C CANADA
  3851. C ---------------------------------------
  3852. ELSE IF (KPDS(1).EQ.54) THEN
  3853. C PRINT *,' NO CURRENT LISTING OF CANADIAN GRIDS'
  3854. RETURN
  3855. C ---------------------------------------
  3856. C JAPAN METEOROLOGICAL AGENCY
  3857. C ---------------------------------------
  3858. ELSE IF (KPDS(1).EQ.34) THEN
  3859. C PRINT *,' NO CURRENT LISTING OF JMA GRIDS'
  3860. RETURN
  3861. C ---------------------------------------
  3862. C NAVY - FNOC
  3863. C ---------------------------------------
  3864. ELSE IF (KPDS(1).EQ.58) THEN
  3865. IF (KPDS(3).GE.37.AND.KPDS(3).LE.44) THEN
  3866. IF (I.NE.J) THEN
  3867. RETURN
  3868. END IF
  3869. ELSE IF (KPDS(3).GE.220.AND.KPDS(3).LE.221) THEN
  3870. IF (I.NE.J) THEN
  3871. RETURN
  3872. END IF
  3873. ELSE IF (KPDS(3).EQ.223) THEN
  3874. IF (I.NE.J) THEN
  3875. RETURN
  3876. END IF
  3877. ELSE
  3878. KRET = 5
  3879. RETURN
  3880. END IF
  3881. C ---------------------------------------
  3882. C U.S. GRIDS
  3883. C ---------------------------------------
  3884. ELSE IF (KPDS(1).EQ.7) THEN
  3885. KRET = 9
  3886. IF (KPDS(3).GE.1.AND.KPDS(3).LE.6) THEN
  3887. IF (I.NE.J) THEN
  3888. RETURN
  3889. END IF
  3890. ELSE IF (KPDS(3).EQ.8) THEN
  3891. IF (I.NE.J) THEN
  3892. RETURN
  3893. END IF
  3894. ELSE IF (KPDS(3).EQ.10) THEN
  3895. IF (I.NE.J) THEN
  3896. RETURN
  3897. END IF
  3898. ELSE IF (KPDS(3).GE.11.AND.KPDS(3).LE.18) THEN
  3899. IF (I.NE.J) THEN
  3900. RETURN
  3901. END IF
  3902. ELSE IF (KPDS(3).GE.27.AND.KPDS(3).LE.30) THEN
  3903. IF (I.NE.J) THEN
  3904. RETURN
  3905. END IF
  3906. ELSE IF (KPDS(3).GE.33.AND.KPDS(3).LE.34) THEN
  3907. IF (I.NE.J) THEN
  3908. RETURN
  3909. END IF
  3910. ELSE IF (KPDS(3).GE.37.AND.KPDS(3).LE.45) THEN
  3911. IF (I.NE.J) THEN
  3912. RETURN
  3913. END IF
  3914. ELSE IF (KPDS(3).EQ.53) THEN
  3915. IF (I.NE.J) THEN
  3916. RETURN
  3917. END IF
  3918. ELSE IF (KPDS(3).GE.55.AND.KPDS(3).LE.56) THEN
  3919. IF (I.NE.J) THEN
  3920. RETURN
  3921. END IF
  3922. ELSE IF (KPDS(3).GE.67.AND.KPDS(3).LE.77) THEN
  3923. IF (I.NE.J) THEN
  3924. RETURN
  3925. END IF
  3926. ELSE IF (KPDS(3).GE.85.AND.KPDS(3).LE.88) THEN
  3927. IF (I.NE.J) THEN
  3928. RETURN
  3929. END IF
  3930. ELSE IF (KPDS(3).GE.90.AND.KPDS(3).LE.99) THEN
  3931. IF (I.NE.J) THEN
  3932. RETURN
  3933. END IF
  3934. ELSE IF (KPDS(3).EQ.100.OR.KPDS(3).EQ.101) THEN
  3935. IF (I.NE.J) THEN
  3936. RETURN
  3937. END IF
  3938. ELSE IF (KPDS(3).GE.103.AND.KPDS(3).LE.107) THEN
  3939. IF (I.NE.J) THEN
  3940. RETURN
  3941. END IF
  3942. ELSE IF (KPDS(3).EQ.110) THEN
  3943. IF (I.NE.J) THEN
  3944. RETURN
  3945. END IF
  3946. ELSE IF (KPDS(3).EQ.120) THEN
  3947. IF (I.NE.J) THEN
  3948. RETURN
  3949. END IF
  3950. ELSE IF (KPDS(3).GE.122.AND.KPDS(3).LE.128) THEN
  3951. IF (I.NE.J) THEN
  3952. RETURN
  3953. END IF
  3954. ELSE IF (KPDS(3).EQ.130) THEN
  3955. IF (I.NE.J) THEN
  3956. RETURN
  3957. END IF
  3958. ELSE IF (KPDS(3).EQ.138) THEN
  3959. IF (I.NE.J) THEN
  3960. RETURN
  3961. END IF
  3962. ELSE IF (KPDS(3).EQ.139) THEN
  3963. IF (I.NE.J) THEN
  3964. RETURN
  3965. END IF
  3966. ELSE IF (KPDS(3).EQ.140) THEN
  3967. IF (I.NE.J) THEN
  3968. RETURN
  3969. END IF
  3970. ELSE IF (KPDS(3).GE.145.AND.KPDS(3).LE.148) THEN
  3971. IF (I.NE.J) THEN
  3972. RETURN
  3973. END IF
  3974. ELSE IF (KPDS(3).EQ.150.OR.KPDS(3).EQ.151) THEN
  3975. IF (I.NE.J) THEN
  3976. RETURN
  3977. END IF
  3978. ELSE IF (KPDS(3).EQ.160.OR.KPDS(3).EQ.161) THEN
  3979. IF (I.NE.J) THEN
  3980. RETURN
  3981. END IF
  3982. ELSE IF (KPDS(3).EQ.163) THEN
  3983. IF (I.NE.J) THEN
  3984. RETURN
  3985. END IF
  3986. ELSE IF (KPDS(3).GE.170.AND.KPDS(3).LE.176) THEN
  3987. IF (I.NE.J) THEN
  3988. RETURN
  3989. END IF
  3990. ELSE IF (KPDS(3).GE.179.AND.KPDS(3).LE.184) THEN
  3991. IF (I.NE.J) THEN
  3992. RETURN
  3993. END IF
  3994. ELSE IF (KPDS(3).EQ.190.OR.KPDS(3).EQ.192) THEN
  3995. IF (I.NE.J) THEN
  3996. RETURN
  3997. END IF
  3998. ELSE IF (KPDS(3).GE.194.AND.KPDS(3).LE.199) THEN
  3999. IF (I.NE.J) THEN
  4000. RETURN
  4001. END IF
  4002. ELSE IF (KPDS(3).GE.201.AND.KPDS(3).LE.254) THEN
  4003. IF (I.NE.J) THEN
  4004. RETURN
  4005. END IF
  4006. ELSE
  4007. KRET = 5
  4008. RETURN
  4009. END IF
  4010. ELSE
  4011. KRET = 10
  4012. RETURN
  4013. END IF
  4014. C ------------------------------------
  4015. C NORMAL EXIT
  4016. C ------------------------------------
  4017. KRET = 0
  4018. RETURN
  4019. END