PageRenderTime 59ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1596 lines | 559 code | 1 blank | 1036 comment | 0 complexity | 724b1026278950ea32cb72d76d8fd9c5 MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. SUBROUTINE W3FI75 (IBITL,ITYPE,ITOSS,FLD,IFLD,IBMAP,IBDSFL,
  2. & NPTS,BDS11,IPFLD,PFLD,LEN,LENBDS,IBERR,PDS,IGDS)
  3. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  4. C . . . .
  5. C SUBPROGRAM: W3FI75 GRIB PACK DATA AND FORM BDS OCTETS(1-11)
  6. C PRGMMR: FARLEY ORG: NMC421 DATE:94-11-22
  7. C
  8. C ABSTRACT: THIS ROUTINE PACKS A GRIB FIELD AND FORMS OCTETS(1-11)
  9. C OF THE BINARY DATA SECTION (BDS).
  10. C
  11. C PROGRAM HISTORY LOG:
  12. C 92-07-10 M. FARLEY ORIGINAL AUTHOR
  13. C 92-10-01 R.E.JONES CORRECTION FOR FIELD OF CONSTANT DATA
  14. C 92-10-16 R.E.JONES GET RID OF ARRAYS FP AND INT
  15. C 93-08-06 CAVANAUGH ADDED ROUTINES FI7501, FI7502, FI7503
  16. C TO ALLOW SECOND ORDER PACKING IN PDS.
  17. C 93-07-21 STACKPOLE ASSORTED REPAIRS TO GET 2ND DIFF PACK IN
  18. C 93-10-28 CAVANAUGH COMMENTED OUT NONOPERATIONAL PRINTS AND
  19. C WRITE STATEMENTS
  20. C 93-12-15 CAVANAUGH CORRECTED LOCATION OF START OF FIRST ORDER
  21. C VALUES AND START OF SECOND ORDER VALUES TO
  22. C REFLECT A BYTE LOCATION IN THE BDS INSTEAD
  23. C OF AN OFFSET IN SUBROUTINE FI7501.
  24. C 94-01-27 CAVANAUGH ADDED IGDS AS INPUT ARGUMENT TO THIS ROUTINE
  25. C AND ADDED PDS AND IGDS ARRAYS TO THE CALL TO
  26. C W3FI82 TO PROVIDE INFORMATION NEEDED FOR
  27. C BOUSTROPHEDONIC PROCESSING.
  28. C 94-05-25 CAVANAUGH SUBROUTINE FI7503 HAS BEEN ADDED TO PROVIDE
  29. C FOR ROW BY ROW OR COLUMN BY COLUMN SECOND
  30. C ORDER PACKING. THIS FEATURE CAN BE ACTIVATED
  31. C BY SETTING IBDSFL(7) TO ZERO.
  32. C 94-07-08 CAVANAUGH COMMENTED OUT PRINT STATEMENTS USED FOR DEBUG
  33. C 94-11-22 FARLEY ENLARGED WORK ARRAYS TO HANDLE .5DEGREE GRIDS
  34. C 95-06-01 R.E.JONES CORRECTION FOR NUMBER OF UNUSED BITS AT END
  35. C OF SECTION 4, IN BDS BYTE 4, BITS 5-8.
  36. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  37. C
  38. C USAGE: CALL W3FI75 (IBITL,ITYPE,ITOSS,FLD,IFLD,IBMAP,IBDSFL,
  39. C & NPTS,BDS11,IPFLD,PFLD,LEN,LENBDS,IBERR,PDS,IGDS)
  40. C INPUT ARGUMENT LIST:
  41. C IBITL - 0, COMPUTER COMPUTES PACKING LENGTH FROM POWER
  42. C OF 2 THAT BEST FITS THE DATA.
  43. C 8, 12, ETC. COMPUTER RESCALES DATA TO FIT INTO
  44. C SET NUMBER OF BITS.
  45. C ITYPE - 0 = IF INPUT DATA IS FLOATING POINT (FLD)
  46. C 1 = IF INPUT DATA IS INTEGER (IFLD)
  47. C ITOSS - 0 = NO BIT MAP IS INCLUDED (DON'T TOSS DATA)
  48. C 1 = TOSS NULL DATA ACCORDING TO IBMAP
  49. C FLD - REAL ARRAY OF DATA TO BE PACKED IF ITYPE=0
  50. C IFLD - INTEGER ARRAY TO BE PACKED IF ITYPE=1
  51. C IBMAP - BIT MAP SUPPLIED FROM USER
  52. C IBDSFL - INTEGER ARRAY CONTAINING TABLE 11 FLAG INFO
  53. C BDS OCTET 4:
  54. C (1) 0 = GRID POINT DATA
  55. C 1 = SPHERICAL HARMONIC COEFFICIENTS
  56. C (2) 0 = SIMPLE PACKING
  57. C 1 = SECOND ORDER PACKING
  58. C (3) 0 = ORIGINAL DATA WERE FLOATING POINT VALUES
  59. C 1 = ORIGINAL DATA WERE INTEGER VALUES
  60. C (4) 0 = NO ADDITIONAL FLAGS AT OCTET 14
  61. C 1 = OCTET 14 CONTAINS FLAG BITS 5-12
  62. C (5) 0 = RESERVED - ALWAYS SET TO 0
  63. C (6) 0 = SINGLE DATUM AT EACH GRID POINT
  64. C 1 = MATRIX OF VALUES AT EACH GRID POINT
  65. C (7) 0 = NO SECONDARY BIT MAPS
  66. C 1 = SECONDARY BIT MAPS PRESENT
  67. C (8) 0 = SECOND ORDER VALUES HAVE CONSTANT WIDTH
  68. C 1 = SECOND ORDER VALUES HAVE DIFFERENT WIDTHS
  69. C NPTS - NUMBER OF GRIDPOINTS IN ARRAY TO BE PACKED
  70. C IGDS - ARRAY OF GDS INFORMATION
  71. C
  72. C OUTPUT ARGUMENT LIST:
  73. C BDS11 - FIRST 11 OCTETS OF BDS
  74. C PFLD - PACKED GRIB FIELD
  75. C LEN - LENGTH OF PFLD
  76. C LENBDS - LENGTH OF BDS
  77. C IBERR - 1, ERROR CONVERTING IEEE F.P. NUMBER TO IBM370 F.P.
  78. C
  79. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  80. C
  81. C ATTRIBUTES:
  82. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  83. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  84. C
  85. C $$
  86. C
  87. REAL FLD(*)
  88. C REAL FWORK(260000)
  89. C
  90. C FWORK CAN USE DYNAMIC ALLOCATION OF MEMORY ON CRAY
  91. C
  92. REAL FWORK(NPTS)
  93. REAL RMIN,REFNCE
  94. C
  95. INTEGER IPFLD(*)
  96. INTEGER IBDSFL(*)
  97. INTEGER IBMAP(*)
  98. INTEGER IFLD(*),IGDS(*)
  99. C INTEGER IWORK(260000)
  100. C
  101. C IWORK CAN USE DYNAMIC ALLOCATION OF MEMORY ON CRAY
  102. C
  103. INTEGER IWORK(NPTS)
  104. C
  105. LOGICAL CONST
  106. C
  107. CHARACTER * 1 BDS11(11),PDS(*)
  108. CHARACTER * 1 PFLD(*)
  109. CHARACTER * 1 CIEXP(8)
  110. CHARACTER * 1 CIMANT(8)
  111. C
  112. EQUIVALENCE (IEXP,CIEXP(1))
  113. EQUIVALENCE (IMANT,CIMANT(1))
  114. C
  115. C 1.0 PACK THE FIELD.
  116. C
  117. C 1.1 TOSS DATA IF BITMAP BEING USED,
  118. C MOVING 'DATA' TO WORK AREA...
  119. C
  120. CONST = .FALSE.
  121. IBERR = 0
  122. IW = 0
  123. C
  124. IF (ITOSS .EQ. 1) THEN
  125. IF (ITYPE .EQ. 0) THEN
  126. DO 110 IT=1,NPTS
  127. IF (IBMAP(IT) .EQ. 1) THEN
  128. IW = IW + 1
  129. FWORK(IW) = FLD(IT)
  130. ENDIF
  131. 110 CONTINUE
  132. NPTS = IW
  133. ELSE IF (ITYPE .EQ. 1) THEN
  134. DO 111 IT=1,NPTS
  135. IF (IBMAP(IT) .EQ. 1) THEN
  136. IW = IW + 1
  137. IWORK(IW) = IFLD(IT)
  138. ENDIF
  139. 111 CONTINUE
  140. NPTS = IW
  141. ENDIF
  142. C
  143. C ELSE, JUST MOVE DATA TO WORK ARRAY
  144. C
  145. ELSE IF (ITOSS .EQ. 0) THEN
  146. IF (ITYPE .EQ. 0) THEN
  147. DO 112 IT=1,NPTS
  148. FWORK(IT) = FLD(IT)
  149. 112 CONTINUE
  150. ELSE IF (ITYPE .EQ. 1) THEN
  151. DO 113 IT=1,NPTS
  152. IWORK(IT) = IFLD(IT)
  153. 113 CONTINUE
  154. ENDIF
  155. ENDIF
  156. C
  157. C 1.2 CONVERT DATA IF NEEDED PRIOR TO PACKING.
  158. C (INTEGER TO F.P. OR F.P. TO INTEGER)
  159. C ITYPE = 0...FLOATING POINT DATA
  160. C IBITL = 0...PACK IN LEAST # BITS...CONVERT TO INTEGER
  161. C ITYPE = 1...INTEGER DATA
  162. C IBITL > 0...PACK IN FIXED # BITS...CONVERT TO FLOATING POINT
  163. C
  164. IF (ITYPE .EQ. 0 .AND. IBITL .EQ. 0) THEN
  165. DO 120 IF=1,NPTS
  166. IWORK(IF) = NINT(FWORK(IF))
  167. 120 CONTINUE
  168. ELSE IF (ITYPE .EQ. 1 .AND. IBITL .NE. 0) THEN
  169. DO 123 IF=1,NPTS
  170. FWORK(IF) = FLOAT(IWORK(IF))
  171. 123 CONTINUE
  172. ENDIF
  173. C
  174. C 1.3 PACK THE DATA.
  175. C
  176. IF (IBDSFL(2).NE.0) THEN
  177. C SECOND ORDER PACKING
  178. C
  179. C PRINT*,' DOING SECOND ORDER PACKING...'
  180. IF (IBITL.EQ.0) THEN
  181. C
  182. C PRINT*,' AND VARIABLE BIT PACKING'
  183. C
  184. C WORKING WITH INTEGER VALUES
  185. C SINCE DOING VARIABLE BIT PACKING
  186. C
  187. MAX = IWORK(1)
  188. MIN = IWORK(1)
  189. DO 300 I = 2, NPTS
  190. IF (IWORK(I).LT.MIN) THEN
  191. MIN = IWORK(I)
  192. ELSE IF (IWORK(I).GT.MAX) THEN
  193. MAX = IWORK(I)
  194. END IF
  195. 300 CONTINUE
  196. C EXTRACT MINIMA
  197. DO 400 I = 1, NPTS
  198. C IF (IWORK(I).LT.0) THEN
  199. C PRINT *,'MINIMA 400',I,IWORK(I),NPTS
  200. C END IF
  201. IWORK(I) = IWORK(I) - MIN
  202. 400 CONTINUE
  203. REFNCE = MIN
  204. IDIFF = MAX - MIN
  205. C PRINT *,'REFERENCE VALUE',REFNCE
  206. C
  207. C WRITE (6,FMT='('' MINIMA REMOVED = '',/,
  208. C & 10(3X,10I10,/))') (IWORK(I),I=1,6)
  209. C WRITE (6,FMT='('' END OF ARRAY = '',/,
  210. C & 10(3X,10I10,/))') (IWORK(I),I=NPTS-5,NPTS)
  211. C
  212. C FIND BIT WIDTH OF IDIFF
  213. C
  214. CALL FI7505 (IDIFF,KWIDE)
  215. C PRINT*,' BIT WIDTH FOR ORIGINAL DATA', KWIDE
  216. ISCAL2 = 0
  217. C
  218. C MULTIPLICATIVE SCALE FACTOR SET TO 1
  219. C IN ANTICIPATION OF POSSIBLE USE IN GLAHN 2DN DIFF
  220. C
  221. SCAL2 = 1.
  222. C
  223. ELSE
  224. C
  225. C PRINT*,' AND FIXED BIT PACKING, IBITL = ', IBITL
  226. C FIXED BIT PACKING
  227. C - LENGTH OF FIELD IN IBITL
  228. C - MUST BE REAL DATA
  229. C FLOATING POINT INPUT
  230. C
  231. RMAX = FWORK(1)
  232. RMIN = FWORK(1)
  233. DO 100 I = 2, NPTS
  234. IF (FWORK(I).LT.RMIN) THEN
  235. RMIN = FWORK(I)
  236. ELSE IF (FWORK(I).GT.RMAX) THEN
  237. RMAX = FWORK(I)
  238. END IF
  239. 100 CONTINUE
  240. REFNCE = RMIN
  241. C PRINT *,'100 REFERENCE',REFNCE
  242. C EXTRACT MINIMA
  243. DO 200 I = 1, NPTS
  244. FWORK(I) = FWORK(I) - RMIN
  245. 200 CONTINUE
  246. C PRINT *,'REFERENCE VALUE',REFNCE
  247. C WRITE (6,FMT='('' MINIMA REMOVED = '',/,
  248. C & 10(3X,10F8.2,/))') (FWORK(I),I=1,6)
  249. C WRITE (6,FMT='('' END OF ARRAY = '',/,
  250. C & 10(3X,10F8.2,/))') (FWORK(I),I=NPTS-5,NPTS)
  251. C FIND LARGEST DELTA
  252. IDELT = NINT(RMAX - RMIN)
  253. C DO BINARY SCALING
  254. C FIND OUT WHAT BINARY SCALE FACTOR
  255. C PERMITS CONTAINMENT OF
  256. C LARGEST DELTA
  257. CALL FI7505 (IDELT,IWIDE)
  258. C
  259. C BINARY SCALING
  260. C
  261. ISCAL2 = IWIDE - IBITL
  262. C PRINT *,'SCALING NEEDED TO FIT =',ISCAL2
  263. C PRINT*,' RANGE OF = ',IDELT
  264. C
  265. C EXPAND DATA WITH BINARY SCALING
  266. C CONVERT TO INTEGER
  267. SCAL2 = 2.0**ISCAL2
  268. SCAL2 = 1./ SCAL2
  269. DO 600 I = 1, NPTS
  270. IWORK(I) = NINT(FWORK(I) * SCAL2)
  271. 600 CONTINUE
  272. KWIDE = IBITL
  273. END IF
  274. C
  275. C *****************************************************************
  276. C
  277. C FOLLOWING IS FOR GLAHN SECOND DIFFERENCING
  278. C NOT STANDARD GRIB
  279. C
  280. C TEST FOR SECOND DIFFERENCE PACKING
  281. C BASED OF SIZE OF PDS - SIZE IN FIRST 3 BYTES
  282. C
  283. CALL GBYTE (PDS,IPDSIZ,0,24)
  284. IF (IPDSIZ.EQ.50) THEN
  285. C PRINT*,' DO SECOND DIFFERENCE PACKING '
  286. C
  287. C GLAHN PACKING TO 2ND DIFFS
  288. C
  289. C WRITE (6,FMT='('' CALL TO W3FI82 WITH = '',/,
  290. C & 10(3X,10I6,/))') (IWORK(I),I=1,NPTS)
  291. C
  292. CALL W3FI82 (IWORK,FVAL1,FDIFF1,NPTS,PDS,IGDS)
  293. C
  294. C PRINT *,'GLAHN',FVAL1,FDIFF1
  295. C WRITE (6,FMT='('' OUT FROM W3FI82 WITH = '',/,
  296. C & 10(3X,10I6,/))') (IWORK(I),I=1,NPTS)
  297. C
  298. C MUST NOW RE-REMOVE THE MINIMUM VALUE
  299. C OF THE SECOND DIFFERENCES TO ASSURE
  300. C ALL POSITIVE NUMBERS FOR SECOND ORDER GRIB PACKING
  301. C
  302. C ORIGINAL REFERENCE VALUE ADDED TO FIRST POINT
  303. C VALUE FROM THE 2ND DIFF PACKER TO BE ADDED
  304. C BACK IN WHEN THE 2ND DIFF VALUES ARE
  305. C RECONSTRUCTED BACK TO THE BASIC VALUES
  306. C
  307. C ALSO, THE REFERENCE VALUE IS
  308. C POWER-OF-TWO SCALED TO MATCH
  309. C FVAL1. ALL OF THIS SCALING
  310. C WILL BE REMOVED AFTER THE
  311. C GLAHN SECOND DIFFERENCING IS UNDONE.
  312. C THE SCALING FACTOR NEEDED TO DO THAT
  313. C IS SAVED IN THE PDS AS A SIGNED POSITIVE
  314. C TWO BYTE INTEGER
  315. C
  316. C THE SCALING FOR THE 2ND DIF PACKED
  317. C VALUES IS PROPERLY SET TO ZERO
  318. C
  319. FVAL1 = FVAL1 + REFNCE*SCAL2
  320. C FIRST TEST TO SEE IF
  321. C ON 32 OR 64 BIT COMPUTER
  322. CALL W3FI01(LW)
  323. IF (LW.EQ.4) THEN
  324. CALL W3FI76 (FVAL1,IEXP,IMANT,32)
  325. ELSE
  326. CALL W3FI76 (FVAL1,IEXP,IMANT,64)
  327. END IF
  328. CALL SBYTE (PDS,IEXP,320,8)
  329. CALL SBYTE (PDS,IMANT,328,24)
  330. C
  331. IF (LW.EQ.4) THEN
  332. CALL W3FI76 (FDIFF1,IEXP,IMANT,32)
  333. ELSE
  334. CALL W3FI76 (FDIFF1,IEXP,IMANT,64)
  335. END IF
  336. CALL SBYTE (PDS,IEXP,352,8)
  337. CALL SBYTE (PDS,IMANT,360,24)
  338. C
  339. C TURN ISCAL2 INTO SIGNED POSITIVE INTEGER
  340. C AND STORE IN TWO BYTES
  341. C
  342. IF(ISCAL2.GE.0) THEN
  343. CALL SBYTE (PDS,ISCAL2,384,16)
  344. ELSE
  345. CALL SBYTE (PDS,1,384,1)
  346. ISCAL2 = - ISCAL2
  347. CALL SBYTE( PDS,ISCAL2,385,15)
  348. ENDIF
  349. C
  350. MAX = IWORK(1)
  351. MIN = IWORK(1)
  352. DO 700 I = 2, NPTS
  353. IF (IWORK(I).LT.MIN) THEN
  354. MIN = IWORK(I)
  355. ELSE IF (IWORK(I).GT.MAX) THEN
  356. MAX = IWORK(I)
  357. END IF
  358. 700 CONTINUE
  359. C EXTRACT MINIMA
  360. DO 710 I = 1, NPTS
  361. IWORK(I) = IWORK(I) - MIN
  362. 710 CONTINUE
  363. REFNCE = MIN
  364. C PRINT *,'710 REFERENCE',REFNCE
  365. ISCAL2 = 0
  366. C
  367. C AND RESET VALUE OF KWIDE - THE BIT WIDTH
  368. C FOR THE RANGE OF THE VALUES
  369. C
  370. IDIFF = MAX - MIN
  371. CALL FI7505 (IDIFF,KWIDE)
  372. C
  373. C PRINT*,'BIT WIDTH (KWIDE) OF 2ND DIFFS', KWIDE
  374. C
  375. C **************************** END OF GLAHN PACKING ************
  376. ELSE IF (IBDSFL(2).EQ.1.AND.IBDSFL(7).EQ.0) THEN
  377. C HAVE SECOND ORDER PACKING WITH NO SECOND ORDER
  378. C BIT MAP. ERGO ROW BY ROW - COL BY COL
  379. CALL FI7503 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  380. * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE,IGDS)
  381. RETURN
  382. END IF
  383. C WRITE (6,FMT='('' CALL TO FI7501 WITH = '',/,
  384. C & 10(3X,10I6,/))') (IWORK(I),I=1,NPTS)
  385. C WRITE (6,FMT='('' END OF ARRAY = '',/,
  386. C & 10(3X,10I6,/))') (IWORK(I),I=NPTS-5,NPTS)
  387. C PRINT*,' REFNCE,ISCAL2, KWIDE AT CALL TO FI7501',
  388. C & REFNCE, ISCAL2,KWIDE
  389. C
  390. C SECOND ORDER PACKING
  391. C
  392. CALL FI7501 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  393. * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE)
  394. C
  395. C BDS COMPLETELY ASSEMBLED IN FI7501 FOR SECOND ORDER
  396. C PACKING.
  397. C
  398. ELSE
  399. C SIMPLE PACKING
  400. C
  401. C PRINT*,' SIMPLE FIRST ORDER PACKING...'
  402. IF (IBITL.EQ.0) THEN
  403. C PRINT*,' WITH VARIABLE BIT LENGTH'
  404. C
  405. C WITH VARIABLE BIT LENGTH, ADJUSTED
  406. C TO ACCOMMODATE LARGEST VALUE
  407. C BINARY SCALING ALWAYS = 0
  408. C
  409. CALL W3FI58(IWORK,NPTS,IWORK,PFLD,NBITS,LEN,KMIN)
  410. RMIN = KMIN
  411. REFNCE = RMIN
  412. ISCALE = 0
  413. C PRINT*,' BIT LENGTH CAME OUT AT ...',NBITS
  414. C
  415. C SET CONST .TRUE. IF ALL VALUES ARE THE SAME
  416. C
  417. IF (LEN.EQ.0.AND.NBITS.EQ.0) CONST = .TRUE.
  418. C
  419. ELSE
  420. C PRINT*,' FIXED BIT LENGTH, IBITL = ', IBITL
  421. C
  422. C FIXED BIT LENGTH PACKING (VARIABLE PRECISION)
  423. C VALUES SCALED BY POWER OF 2 (ISCALE) TO
  424. C FIT LARGEST VALUE INTO GIVEN BIT LENGTH (IBITL)
  425. C
  426. CALL W3FI59(FWORK,NPTS,IBITL,IWORK,PFLD,ISCALE,LEN,RMIN)
  427. REFNCE = RMIN
  428. C PRINT *,' SCALING NEEDED TO FIT IS ...', ISCALE
  429. NBITS = IBITL
  430. C
  431. C SET CONST .TRUE. IF ALL VALUES ARE THE SAME
  432. C
  433. IF (LEN.EQ.0) THEN
  434. CONST = .TRUE.
  435. NBITS = 0
  436. END IF
  437. END IF
  438. C
  439. C COMPUTE LENGTH OF BDS IN OCTETS
  440. C
  441. INUM = NPTS * NBITS + 88
  442. C PRINT *,'NUMBER OF BITS BEFORE FILL ADDED',INUM
  443. C
  444. C NUMBER OF FILL BITS
  445. NFILL = 0
  446. NLEFT = MOD(INUM,16)
  447. IF (NLEFT.NE.0) THEN
  448. INUM = INUM + 16 - NLEFT
  449. NFILL = 16 - NLEFT
  450. END IF
  451. C PRINT *,'NUMBER OF BITS AFTER FILL ADDED',INUM
  452. C LENGTH OF BDS IN BYTES
  453. LENBDS = INUM / 8
  454. C
  455. C 2.0 FORM THE BINARY DATA SECTION (BDS).
  456. C
  457. C CONCANTENATE ALL FIELDS FOR BDS
  458. C
  459. C BYTES 1-3
  460. CALL SBYTE (BDS11,LENBDS,0,24)
  461. C
  462. C BYTE 4
  463. C FLAGS
  464. CALL SBYTE (BDS11,IBDSFL(1),24,1)
  465. CALL SBYTE (BDS11,IBDSFL(2),25,1)
  466. CALL SBYTE (BDS11,IBDSFL(3),26,1)
  467. CALL SBYTE (BDS11,IBDSFL(4),27,1)
  468. C NR OF FILL BITS
  469. CALL SBYTE (BDS11,NFILL,28,4)
  470. C
  471. C FILL OCTETS 5-6 WITH THE SCALE FACTOR.
  472. C
  473. C BYTE 5-6
  474. IF (ISCALE.LT.0) THEN
  475. CALL SBYTE (BDS11,1,32,1)
  476. ISCALE = - ISCALE
  477. CALL SBYTE (BDS11,ISCALE,33,15)
  478. ELSE
  479. CALL SBYTE (BDS11,ISCALE,32,16)
  480. END IF
  481. C
  482. C FILL OCTET 7-10 WITH THE REFERENCE VALUE
  483. C CONVERT THE FLOATING POINT OF YOUR MACHINE TO IBM370 32 BIT
  484. C FLOATING POINT NUMBER
  485. C
  486. C BYTE 7-10
  487. C REFERENCE VALUE
  488. C FIRST TEST TO SEE IF
  489. C ON 32 OR 64 BIT COMPUTER
  490. CALL W3FI01(LW)
  491. IF (LW.EQ.4) THEN
  492. CALL W3FI76 (REFNCE,IEXP,IMANT,32)
  493. ELSE
  494. CALL W3FI76 (REFNCE,IEXP,IMANT,64)
  495. END IF
  496. CALL SBYTE (BDS11,IEXP,48,8)
  497. CALL SBYTE (BDS11,IMANT,56,24)
  498. C
  499. C
  500. C FILL OCTET 11 WITH THE NUMBER OF BITS.
  501. C
  502. C BYTE 11
  503. CALL SBYTE (BDS11,NBITS,80,8)
  504. END IF
  505. C
  506. RETURN
  507. END
  508. SUBROUTINE FI7501 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  509. * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE)
  510. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  511. C . . . .
  512. C SUBPROGRAM: FI7501 BDS SECOND ORDER PACKING
  513. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 93-08-06
  514. C
  515. C ABSTRACT: PERFORM SECONDARY PACKING ON GRID POINT DATA,
  516. C GENERATING ALL BDS INFORMATION.
  517. C
  518. C PROGRAM HISTORY LOG:
  519. C 93-08-06 CAVANAUGH
  520. C 93-12-15 CAVANAUGH CORRECTED LOCATION OF START OF FIRST ORDER
  521. C VALUES AND START OF SECOND ORDER VALUES TO
  522. C REFLECT A BYTE LOCATION IN THE BDS INSTEAD
  523. C OF AN OFFSET.
  524. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  525. C
  526. C USAGE: CALL FI7501 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  527. C * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE)
  528. C INPUT ARGUMENT LIST:
  529. C IWORK - INTEGER SOURCE ARRAY
  530. C NPTS - NUMBER OF POINTS IN IWORK
  531. C IBDSFL - FLAGS
  532. C
  533. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  534. C IPFLD - CONTAINS BDS FROM BYTE 12 ON
  535. C BDS11 - CONTAINS FIRST 11 BYTES FOR BDS
  536. C LEN - NUMBER OF BYTES FROM 12 ON
  537. C LENBDS - TOTAL LENGTH OF BDS
  538. C
  539. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  540. C
  541. C ATTRIBUTES:
  542. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  543. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  544. C
  545. C $$
  546. CHARACTER*1 BDS11(*),PDS(*)
  547. C
  548. REAL REFNCE
  549. C
  550. INTEGER ISCAL2,KWIDE
  551. INTEGER LENBDS
  552. INTEGER IPFLD(*)
  553. INTEGER LEN,KBDS(22)
  554. INTEGER IWORK(*)
  555. C OCTET NUMBER IN SECTION, FIRST ORDER PACKING
  556. C INTEGER KBDS(12)
  557. C FLAGS
  558. INTEGER IBDSFL(*)
  559. C EXTENDED FLAGS
  560. C INTEGER KBDS(14)
  561. C OCTET NUMBER FOR SECOND ORDER PACKING
  562. C INTEGER KBDS(15)
  563. C NUMBER OF FIRST ORDER VALUES
  564. C INTEGER KBDS(17)
  565. C NUMBER OF SECOND ORDER PACKED VALUES
  566. C INTEGER KBDS(19)
  567. C WIDTH OF SECOND ORDER PACKING
  568. INTEGER ISOWID(50000)
  569. C SECONDARY BIT MAP
  570. INTEGER ISOBMP(8200)
  571. C FIRST ORDER PACKED VALUES
  572. INTEGER IFOVAL(50000)
  573. C SECOND ORDER PACKED VALUES
  574. INTEGER ISOVAL(100000)
  575. C
  576. C INTEGER KBDS(11)
  577. C BIT WIDTH TABLE
  578. INTEGER IBITS(31)
  579. C
  580. DATA IBITS/1,3,7,15,31,63,127,255,511,1023,
  581. * 2047,4095,8191,16383,32767,65535,131072,
  582. * 262143,524287,1048575,2097151,4194303,
  583. * 8388607,16777215,33554431,67108863,
  584. * 134217727,268435455,536870911,
  585. * 1073741823,2147483647/
  586. C ----------------------------------
  587. C INITIALIZE ARRAYS
  588. DO 100 I = 1, 50000
  589. ISOWID(I) = 0
  590. IFOVAL(I) = 0
  591. 100 CONTINUE
  592. C
  593. DO 101 I = 1, 8200
  594. ISOBMP(I) = 0
  595. 101 CONTINUE
  596. DO 102 I = 1, 100000
  597. ISOVAL(I) = 0
  598. 102 CONTINUE
  599. C INITIALIZE POINTERS
  600. C SECONDARY BIT WIDTH POINTER
  601. IWDPTR = 0
  602. C SECONDARY BIT MAP POINTER
  603. IBMP2P = 0
  604. C FIRST ORDER VALUE POINTER
  605. IFOPTR = 0
  606. C BYTE POINTER TO START OF 1ST ORDER VALUES
  607. KBDS(12) = 0
  608. C BYTE POINTER TO START OF 2ND ORDER VALUES
  609. KBDS(15) = 0
  610. C TO CONTAIN NUMBER OF FIRST ORDER VALUES
  611. KBDS(17) = 0
  612. C TO CONTAIN NUMBER OF SECOND ORDER VALUES
  613. KBDS(19) = 0
  614. C SECOND ORDER PACKED VALUE POINTER
  615. ISOPTR = 0
  616. C =======================================================
  617. C
  618. C DATA IS IN IWORK
  619. C
  620. KBDS(11) = KWIDE
  621. C
  622. C DATA PACKING
  623. C
  624. ITER = 0
  625. INEXT = 1
  626. ISTART = 1
  627. C -----------------------------------------------------------
  628. KOUNT = 0
  629. C DO 1 I = 1, NPTS, 10
  630. C PRINT *,I,(IWORK(K),K=I, I+9)
  631. C 1 CONTINUE
  632. 2000 CONTINUE
  633. ITER = ITER + 1
  634. C PRINT *,'NEXT ITERATION STARTS AT',ISTART
  635. IF (ISTART.GT.NPTS) THEN
  636. GO TO 4000
  637. ELSE IF (ISTART.EQ.NPTS) THEN
  638. KPTS = 1
  639. MXDIFF = 0
  640. GO TO 2200
  641. END IF
  642. C
  643. C LOOK FOR REPITITIONS OF A SINGLE VALUE
  644. CALL FI7502 (IWORK,ISTART,NPTS,ISAME)
  645. IF (ISAME.GE.15) THEN
  646. KOUNT = KOUNT + 1
  647. C PRINT *,'FI7501 - FOUND IDENTICAL SET OF ',ISAME
  648. MXDIFF = 0
  649. KPTS = ISAME
  650. ELSE
  651. C
  652. C LOOK FOR SETS OF VALUES IN TREND SELECTED RANGE
  653. CALL FI7513 (IWORK,ISTART,NPTS,NMAX,NMIN,INRNGE)
  654. C PRINT *,'ISTART ',ISTART,' INRNGE',INRNGE,NMAX,NMIN
  655. IEND = ISTART + INRNGE - 1
  656. C DO 2199 NM = ISTART, IEND, 10
  657. C PRINT *,' ',(IWORK(NM+JK),JK=0,9)
  658. C2199 CONTINUE
  659. MXDIFF = NMAX - NMIN
  660. KPTS = INRNGE
  661. END IF
  662. 2200 CONTINUE
  663. C PRINT *,' RANGE ',MXDIFF,' MAX',NMAX,' MIN',NMIN
  664. C INCREMENT NUMBER OF FIRST ORDER VALUES
  665. KBDS(17) = KBDS(17) + 1
  666. C ENTER FIRST ORDER VALUE
  667. IF (MXDIFF.GT.0) THEN
  668. DO 2220 LK = 0, KPTS-1
  669. IWORK(ISTART+LK) = IWORK(ISTART+LK) - NMIN
  670. 2220 CONTINUE
  671. CALL SBYTE (IFOVAL,NMIN,IFOPTR,KBDS(11))
  672. ELSE
  673. CALL SBYTE (IFOVAL,IWORK(ISTART),IFOPTR,KBDS(11))
  674. END IF
  675. IFOPTR = IFOPTR + KBDS(11)
  676. C PROCESS SECOND ORDER BIT WIDTH
  677. IF (MXDIFF.GT.0) THEN
  678. DO 2330 KWIDE = 1, 31
  679. IF (MXDIFF.LE.IBITS(KWIDE)) THEN
  680. GO TO 2331
  681. END IF
  682. 2330 CONTINUE
  683. 2331 CONTINUE
  684. ELSE
  685. KWIDE = 0
  686. END IF
  687. CALL SBYTE (ISOWID,KWIDE,IWDPTR,8)
  688. IWDPTR = IWDPTR + 8
  689. C PRINT *,KWIDE,' IFOVAL=',NMIN,IWORK(ISTART),KPTS
  690. C IF KWIDE NE 0, SAVE SECOND ORDER VALUE
  691. IF (KWIDE.GT.0) THEN
  692. CALL SBYTES (ISOVAL,IWORK(ISTART),ISOPTR,KWIDE,0,KPTS)
  693. ISOPTR = ISOPTR + KPTS * KWIDE
  694. KBDS(19) = KBDS(19) + KPTS
  695. C PRINT *,' SECOND ORDER VALUES'
  696. C PRINT *,(IWORK(ISTART+I),I=0,KPTS-1)
  697. END IF
  698. C ADD TO SECOND ORDER BITMAP
  699. CALL SBYTE (ISOBMP,1,IBMP2P,1)
  700. IBMP2P = IBMP2P + KPTS
  701. ISTART = ISTART + KPTS
  702. GO TO 2000
  703. C --------------------------------------------------------------
  704. 4000 CONTINUE
  705. C PRINT *,'THERE WERE ',ITER,' SECOND ORDER GROUPS'
  706. C PRINT *,'THERE WERE ',KOUNT,' STRINGS OF CONSTANTS'
  707. C CONCANTENATE ALL FIELDS FOR BDS
  708. C
  709. C REMAINDER GOES INTO IPFLD
  710. IPTR = 0
  711. C BYTES 12-13
  712. C VALUE FOR N1
  713. C LEAVE SPACE FOR THIS
  714. IPTR = IPTR + 16
  715. C BYTE 14
  716. C EXTENDED FLAGS
  717. CALL SBYTE (IPFLD,IBDSFL(5),IPTR,1)
  718. IPTR = IPTR + 1
  719. CALL SBYTE (IPFLD,IBDSFL(6),IPTR,1)
  720. IPTR = IPTR + 1
  721. CALL SBYTE (IPFLD,IBDSFL(7),IPTR,1)
  722. IPTR = IPTR + 1
  723. CALL SBYTE (IPFLD,IBDSFL(8),IPTR,1)
  724. IPTR = IPTR + 1
  725. CALL SBYTE (IPFLD,IBDSFL(9),IPTR,1)
  726. IPTR = IPTR + 1
  727. CALL SBYTE (IPFLD,IBDSFL(10),IPTR,1)
  728. IPTR = IPTR + 1
  729. CALL SBYTE (IPFLD,IBDSFL(11),IPTR,1)
  730. IPTR = IPTR + 1
  731. CALL SBYTE (IPFLD,IBDSFL(12),IPTR,1)
  732. IPTR = IPTR + 1
  733. C BYTES 15-16
  734. C SKIP OVER VALUE FOR N2
  735. IPTR = IPTR + 16
  736. C BYTES 17-18
  737. C P1
  738. CALL SBYTE (IPFLD,KBDS(17),IPTR,16)
  739. IPTR = IPTR + 16
  740. C BYTES 19-20
  741. C P2
  742. CALL SBYTE (IPFLD,KBDS(19),IPTR,16)
  743. IPTR = IPTR + 16
  744. C BYTE 21 - RESERVED LOCATION
  745. CALL SBYTE (IPFLD,0,IPTR,8)
  746. IPTR = IPTR + 8
  747. C BYTES 22 - ?
  748. C WIDTHS OF SECOND ORDER PACKING
  749. IX = (IWDPTR + 32) / 32
  750. CALL SBYTES (IPFLD,ISOWID,IPTR,32,0,IX)
  751. IPTR = IPTR + IWDPTR
  752. C SECONDARY BIT MAP
  753. IJ = (IBMP2P + 32) / 32
  754. CALL SBYTES (IPFLD,ISOBMP,IPTR,32,0,IJ)
  755. IPTR = IPTR + IBMP2P
  756. IF (MOD(IPTR,8).NE.0) THEN
  757. IPTR = IPTR + 8 - MOD(IPTR,8)
  758. END IF
  759. C DETERMINE LOCATION FOR START
  760. C OF FIRST ORDER PACKED VALUES
  761. KBDS(12) = IPTR / 8 + 12
  762. C STORE LOCATION
  763. CALL SBYTE (IPFLD,KBDS(12),0,16)
  764. C MOVE IN FIRST ORDER PACKED VALUES
  765. IPASS = (IFOPTR + 32) / 32
  766. CALL SBYTES (IPFLD,IFOVAL,IPTR,32,0,IPASS)
  767. IPTR = IPTR + IFOPTR
  768. IF (MOD(IPTR,8).NE.0) THEN
  769. IPTR = IPTR + 8 - MOD(IPTR,8)
  770. END IF
  771. C PRINT *,'IFOPTR =',IFOPTR,' ISOPTR =',ISOPTR
  772. C DETERMINE LOCATION FOR START
  773. C OF SECOND ORDER VALUES
  774. KBDS(15) = IPTR / 8 + 12
  775. C SAVE LOCATION OF SECOND ORDER VALUES
  776. CALL SBYTE (IPFLD,KBDS(15),24,16)
  777. C MOVE IN SECOND ORDER PACKED VALUES
  778. IX = (ISOPTR + 32) / 32
  779. CALL SBYTES (IPFLD,ISOVAL,IPTR,32,0,IX)
  780. IPTR = IPTR + ISOPTR
  781. NLEFT = MOD(IPTR+88,16)
  782. IF (NLEFT.NE.0) THEN
  783. NLEFT = 16 - NLEFT
  784. IPTR = IPTR + NLEFT
  785. END IF
  786. C COMPUTE LENGTH OF DATA PORTION
  787. LEN = IPTR / 8
  788. C COMPUTE LENGTH OF BDS
  789. LENBDS = LEN + 11
  790. C -----------------------------------
  791. C BYTES 1-3
  792. C THIS FUNCTION COMPLETED BELOW
  793. C WHEN LENGTH OF BDS IS KNOWN
  794. CALL SBYTE (BDS11,LENBDS,0,24)
  795. C BYTE 4
  796. CALL SBYTE (BDS11,IBDSFL(1),24,1)
  797. CALL SBYTE (BDS11,IBDSFL(2),25,1)
  798. CALL SBYTE (BDS11,IBDSFL(3),26,1)
  799. CALL SBYTE (BDS11,IBDSFL(4),27,1)
  800. C ENTER NUMBER OF FILL BITS
  801. CALL SBYTE (BDS11,NLEFT,28,4)
  802. C BYTE 5-6
  803. IF (ISCAL2.LT.0) THEN
  804. CALL SBYTE (BDS11,1,32,1)
  805. ISCAL2 = - ISCAL2
  806. ELSE
  807. CALL SBYTE (BDS11,0,32,1)
  808. END IF
  809. CALL SBYTE (BDS11,ISCAL2,33,15)
  810. C
  811. C FILL OCTET 7-10 WITH THE REFERENCE VALUE
  812. C CONVERT THE FLOATING POINT OF YOUR MACHINE TO IBM370 32 BIT
  813. C FLOATING POINT NUMBER
  814. C REFERENCE VALUE
  815. C FIRST TEST TO SEE IF
  816. C ON 32 OR 64 BIT COMPUTER
  817. CALL W3FI01(LW)
  818. IF (LW.EQ.4) THEN
  819. CALL W3FI76 (REFNCE,IEXP,IMANT,32)
  820. ELSE
  821. CALL W3FI76 (REFNCE,IEXP,IMANT,64)
  822. END IF
  823. CALL SBYTE (BDS11,IEXP,48,8)
  824. CALL SBYTE (BDS11,IMANT,56,24)
  825. C
  826. C BYTE 11
  827. C
  828. CALL SBYTE (BDS11,KBDS(11),80,8)
  829. C
  830. RETURN
  831. END
  832. SUBROUTINE FI7502 (IWORK,ISTART,NPTS,ISAME)
  833. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  834. C . . . .
  835. C SUBPROGRAM: FI7502 SECOND ORDER SAME VALUE COLLECTION
  836. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 93-06-23
  837. C
  838. C ABSTRACT: COLLECT SEQUENTIAL SAME VALUES FOR PROCESSING
  839. C AS SECOND ORDER VALUE FOR GRIB MESSAGES.
  840. C
  841. C PROGRAM HISTORY LOG:
  842. C 93-06-23 CAVANAUGH
  843. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  844. C
  845. C USAGE: CALL FI7502 (IWORK,ISTART,NPTS,ISAME)
  846. C INPUT ARGUMENT LIST:
  847. C IWORK - ARRAY CONTAINING SOURCE DATA
  848. C ISTART - STARTING LOCATION FOR THIS TEST
  849. C NPTS - NUMBER OF POINTS IN IWORK
  850. C
  851. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  852. C ISAME - NUMBER OF SEQUENTIAL POINTS HAVING THE SAME VALUE
  853. C
  854. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  855. C
  856. C ATTRIBUTES:
  857. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  858. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  859. C
  860. C $$
  861. INTEGER IWORK(*)
  862. INTEGER ISTART
  863. INTEGER ISAME
  864. INTEGER K
  865. INTEGER NPTS
  866. C -------------------------------------------------------------
  867. ISAME = 0
  868. DO 100 K = ISTART, NPTS
  869. IF (IWORK(K).NE.IWORK(ISTART)) THEN
  870. RETURN
  871. END IF
  872. ISAME = ISAME + 1
  873. 100 CONTINUE
  874. RETURN
  875. END
  876. SUBROUTINE FI7503 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  877. * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE,IGDS)
  878. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  879. C . . . .
  880. C SUBPROGRAM: FI7501 ROW BY ROW, COL BY COL PACKING
  881. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 94-05-20
  882. C
  883. C ABSTRACT: PERFORM ROW BY ROW OR COLUMN BY COLUMN PACKING
  884. C GENERATING ALL BDS INFORMATION.
  885. C
  886. C PROGRAM HISTORY LOG:
  887. C 93-08-06 CAVANAUGH
  888. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  889. C
  890. C USAGE: CALL FI7503 (IWORK,IPFLD,NPTS,IBDSFL,BDS11,
  891. C * LEN,LENBDS,PDS,REFNCE,ISCAL2,KWIDE,IGDS)
  892. C INPUT ARGUMENT LIST:
  893. C IWORK - INTEGER SOURCE ARRAY
  894. C NPTS - NUMBER OF POINTS IN IWORK
  895. C IBDSFL - FLAGS
  896. C
  897. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  898. C IPFLD - CONTAINS BDS FROM BYTE 12 ON
  899. C BDS11 - CONTAINS FIRST 11 BYTES FOR BDS
  900. C LEN - NUMBER OF BYTES FROM 12 ON
  901. C LENBDS - TOTAL LENGTH OF BDS
  902. C
  903. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  904. C
  905. C ATTRIBUTES:
  906. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  907. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  908. C
  909. C $$
  910. CHARACTER*1 BDS11(*),PDS(*)
  911. C
  912. REAL REFNCE
  913. C
  914. INTEGER ISCAL2,KWIDE
  915. INTEGER LENBDS
  916. INTEGER IPFLD(*),IGDS(*)
  917. INTEGER LEN,KBDS(22)
  918. INTEGER IWORK(*)
  919. C OCTET NUMBER IN SECTION, FIRST ORDER PACKING
  920. C INTEGER KBDS(12)
  921. C FLAGS
  922. INTEGER IBDSFL(*)
  923. C EXTENDED FLAGS
  924. C INTEGER KBDS(14)
  925. C OCTET NUMBER FOR SECOND ORDER PACKING
  926. C INTEGER KBDS(15)
  927. C NUMBER OF FIRST ORDER VALUES
  928. C INTEGER KBDS(17)
  929. C NUMBER OF SECOND ORDER PACKED VALUES
  930. C INTEGER KBDS(19)
  931. C WIDTH OF SECOND ORDER PACKING
  932. INTEGER ISOWID(50000)
  933. C SECONDARY BIT MAP
  934. INTEGER ISOBMP(8200)
  935. C FIRST ORDER PACKED VALUES
  936. INTEGER IFOVAL(50000)
  937. C SECOND ORDER PACKED VALUES
  938. INTEGER ISOVAL(100000)
  939. C
  940. C INTEGER KBDS(11)
  941. C ----------------------------------
  942. C INITIALIZE ARRAYS
  943. DO 100 I = 1, 50000
  944. ISOWID(I) = 0
  945. IFOVAL(I) = 0
  946. 100 CONTINUE
  947. C
  948. DO 101 I = 1, 8200
  949. ISOBMP(I) = 0
  950. 101 CONTINUE
  951. DO 102 I = 1, 100000
  952. ISOVAL(I) = 0
  953. 102 CONTINUE
  954. C INITIALIZE POINTERS
  955. C SECONDARY BIT WIDTH POINTER
  956. IWDPTR = 0
  957. C SECONDARY BIT MAP POINTER
  958. IBMP2P = 0
  959. C FIRST ORDER VALUE POINTER
  960. IFOPTR = 0
  961. C BYTE POINTER TO START OF 1ST ORDER VALUES
  962. KBDS(12) = 0
  963. C BYTE POINTER TO START OF 2ND ORDER VALUES
  964. KBDS(15) = 0
  965. C TO CONTAIN NUMBER OF FIRST ORDER VALUES
  966. KBDS(17) = 0
  967. C TO CONTAIN NUMBER OF SECOND ORDER VALUES
  968. KBDS(19) = 0
  969. C SECOND ORDER PACKED VALUE POINTER
  970. ISOPTR = 0
  971. C =======================================================
  972. C BUILD SECOND ORDER BIT MAP IN EITHER
  973. C ROW BY ROW OR COL BY COL FORMAT
  974. IF (IAND(IGDS(13),32).NE.0) THEN
  975. C COLUMN BY COLUMN
  976. KOUT = IGDS(4)
  977. KIN = IGDS(5)
  978. C PRINT *,'COLUMN BY COLUMN',KOUT,KIN
  979. ELSE
  980. C ROW BY ROW
  981. KOUT = IGDS(5)
  982. KIN = IGDS(4)
  983. C PRINT *,'ROW BY ROW',KOUT,KIN
  984. END IF
  985. KBDS(17) = KOUT
  986. KBDS(19) = NPTS
  987. C
  988. C DO 4100 J = 1, NPTS, 53
  989. C WRITE (6,4101) (IWORK(K),K=J,J+52)
  990. 4101 FORMAT (1X,25I4)
  991. C PRINT *,' '
  992. C4100 CONTINUE
  993. C
  994. C INITIALIZE BIT MAP POINTER
  995. IBMP2P = 0
  996. C CONSTRUCT WORKING BIT MAP
  997. DO 2000 I = 1, KOUT
  998. DO 1000 J = 1, KIN
  999. IF (J.EQ.1) THEN
  1000. CALL SBYTE (ISOBMP,1,IBMP2P,1)
  1001. ELSE
  1002. CALL SBYTE (ISOBMP,0,IBMP2P,1)
  1003. END IF
  1004. IBMP2P = IBMP2P + 1
  1005. 1000 CONTINUE
  1006. 2000 CONTINUE
  1007. LEN = IBMP2P / 32 + 1
  1008. C CALL BINARY(ISOBMP,LEN)
  1009. C
  1010. C PROCESS OUTER LOOP OF ROW BY ROW OR COL BY COL
  1011. C
  1012. KPTR = 1
  1013. KBDS(11) = KWIDE
  1014. DO 6000 I = 1, KOUT
  1015. C IN CURRENT ROW OR COL
  1016. C FIND FIRST ORDER VALUE
  1017. JPTR = KPTR
  1018. LOWEST = IWORK(JPTR)
  1019. DO 4000 J = 1, KIN
  1020. IF (IWORK(JPTR).LT.LOWEST) THEN
  1021. LOWEST = IWORK(JPTR)
  1022. END IF
  1023. JPTR = JPTR + 1
  1024. 4000 CONTINUE
  1025. C SAVE FIRST ORDER VALUE
  1026. CALL SBYTE (IFOVAL,LOWEST,IFOPTR,KWIDE)
  1027. IFOPTR = IFOPTR + KWIDE
  1028. C PRINT *,'FOVAL',I,LOWEST,KWIDE
  1029. C SUBTRACT FIRST ORDER VALUE FROM OTHER VALS
  1030. C GETTING SECOND ORDER VALUES
  1031. JPTR = KPTR
  1032. IBIG = IWORK(JPTR) - LOWEST
  1033. DO 4200 J = 1, KIN
  1034. IWORK(JPTR) = IWORK(JPTR) - LOWEST
  1035. IF (IWORK(JPTR).GT.IBIG) THEN
  1036. IBIG = IWORK(JPTR)
  1037. END IF
  1038. JPTR = JPTR + 1
  1039. 4200 CONTINUE
  1040. C HOW MANY BITS TO CONTAIN LARGEST SECOND
  1041. C ORDER VALUE IN SEGMENT
  1042. CALL FI7505 (IBIG,NWIDE)
  1043. C SAVE BIT WIDTH
  1044. CALL SBYTE (ISOWID,NWIDE,IWDPTR,8)
  1045. IWDPTR = IWDPTR + 8
  1046. C PRINT *,I,'SOVAL',IBIG,' IN',NWIDE,' BITS'
  1047. C WRITE (6,4101) (IWORK(K),K=KPTR,KPTR+52)
  1048. C SAVE SECOND ORDER VALUES OF THIS SEGMENT
  1049. DO 5000 J = 0, KIN-1
  1050. CALL SBYTE (ISOVAL,IWORK(KPTR+J),ISOPTR,NWIDE)
  1051. ISOPTR = ISOPTR + NWIDE
  1052. 5000 CONTINUE
  1053. KPTR = KPTR + KIN
  1054. 6000 CONTINUE
  1055. C =======================================================
  1056. C CONCANTENATE ALL FIELDS FOR BDS
  1057. C
  1058. C REMAINDER GOES INTO IPFLD
  1059. IPTR = 0
  1060. C BYTES 12-13
  1061. C VALUE FOR N1
  1062. C LEAVE SPACE FOR THIS
  1063. IPTR = IPTR + 16
  1064. C BYTE 14
  1065. C EXTENDED FLAGS
  1066. CALL SBYTE (IPFLD,IBDSFL(5),IPTR,1)
  1067. IPTR = IPTR + 1
  1068. CALL SBYTE (IPFLD,IBDSFL(6),IPTR,1)
  1069. IPTR = IPTR + 1
  1070. CALL SBYTE (IPFLD,IBDSFL(7),IPTR,1)
  1071. IPTR = IPTR + 1
  1072. CALL SBYTE (IPFLD,IBDSFL(8),IPTR,1)
  1073. IPTR = IPTR + 1
  1074. CALL SBYTE (IPFLD,IBDSFL(9),IPTR,1)
  1075. IPTR = IPTR + 1
  1076. CALL SBYTE (IPFLD,IBDSFL(10),IPTR,1)
  1077. IPTR = IPTR + 1
  1078. CALL SBYTE (IPFLD,IBDSFL(11),IPTR,1)
  1079. IPTR = IPTR + 1
  1080. CALL SBYTE (IPFLD,IBDSFL(12),IPTR,1)
  1081. IPTR = IPTR + 1
  1082. C BYTES 15-16
  1083. C SKIP OVER VALUE FOR N2
  1084. IPTR = IPTR + 16
  1085. C BYTES 17-18
  1086. C P1
  1087. CALL SBYTE (IPFLD,KBDS(17),IPTR,16)
  1088. IPTR = IPTR + 16
  1089. C BYTES 19-20
  1090. C P2
  1091. CALL SBYTE (IPFLD,KBDS(19),IPTR,16)
  1092. IPTR = IPTR + 16
  1093. C BYTE 21 - RESERVED LOCATION
  1094. CALL SBYTE (IPFLD,0,IPTR,8)
  1095. IPTR = IPTR + 8
  1096. C BYTES 22 - ?
  1097. C WIDTHS OF SECOND ORDER PACKING
  1098. IX = (IWDPTR + 32) / 32
  1099. CALL SBYTES (IPFLD,ISOWID,IPTR,32,0,IX)
  1100. IPTR = IPTR + IWDPTR
  1101. C PRINT *,'ISOWID',IWDPTR,IX
  1102. C CALL BINARY (ISOWID,IX)
  1103. C
  1104. C NO SECONDARY BIT MAP
  1105. C DETERMINE LOCATION FOR START
  1106. C OF FIRST ORDER PACKED VALUES
  1107. KBDS(12) = IPTR / 8 + 12
  1108. C STORE LOCATION
  1109. CALL SBYTE (IPFLD,KBDS(12),0,16)
  1110. C MOVE IN FIRST ORDER PACKED VALUES
  1111. IPASS = (IFOPTR + 32) / 32
  1112. CALL SBYTES (IPFLD,IFOVAL,IPTR,32,0,IPASS)
  1113. IPTR = IPTR + IFOPTR
  1114. C PRINT *,'IFOVAL',IFOPTR,IPASS,KWIDE
  1115. C CALL BINARY (IFOVAL,IPASS)
  1116. IF (MOD(IPTR,8).NE.0) THEN
  1117. IPTR = IPTR + 8 - MOD(IPTR,8)
  1118. END IF
  1119. C PRINT *,'IFOPTR =',IFOPTR,' ISOPTR =',ISOPTR
  1120. C DETERMINE LOCATION FOR START
  1121. C OF SECOND ORDER VALUES
  1122. KBDS(15) = IPTR / 8 + 12
  1123. C SAVE LOCATION OF SECOND ORDER VALUES
  1124. CALL SBYTE (IPFLD,KBDS(15),24,16)
  1125. C MOVE IN SECOND ORDER PACKED VALUES
  1126. IX = (ISOPTR + 32) / 32
  1127. CALL SBYTES (IPFLD,ISOVAL,IPTR,32,0,IX)
  1128. IPTR = IPTR + ISOPTR
  1129. C PRINT *,'ISOVAL',ISOPTR,IX
  1130. C CALL BINARY (ISOVAL,IX)
  1131. NLEFT = MOD(IPTR+88,16)
  1132. IF (NLEFT.NE.0) THEN
  1133. NLEFT = 16 - NLEFT
  1134. IPTR = IPTR + NLEFT
  1135. END IF
  1136. C COMPUTE LENGTH OF DATA PORTION
  1137. LEN = IPTR / 8
  1138. C COMPUTE LENGTH OF BDS
  1139. LENBDS = LEN + 11
  1140. C -----------------------------------
  1141. C BYTES 1-3
  1142. C THIS FUNCTION COMPLETED BELOW
  1143. C WHEN LENGTH OF BDS IS KNOWN
  1144. CALL SBYTE (BDS11,LENBDS,0,24)
  1145. C BYTE 4
  1146. CALL SBYTE (BDS11,IBDSFL(1),24,1)
  1147. CALL SBYTE (BDS11,IBDSFL(2),25,1)
  1148. CALL SBYTE (BDS11,IBDSFL(3),26,1)
  1149. CALL SBYTE (BDS11,IBDSFL(4),27,1)
  1150. C ENTER NUMBER OF FILL BITS
  1151. CALL SBYTE (BDS11,NLEFT,28,4)
  1152. C BYTE 5-6
  1153. IF (ISCAL2.LT.0) THEN
  1154. CALL SBYTE (BDS11,1,32,1)
  1155. ISCAL2 = - ISCAL2
  1156. ELSE
  1157. CALL SBYTE (BDS11,0,32,1)
  1158. END IF
  1159. CALL SBYTE (BDS11,ISCAL2,33,15)
  1160. C
  1161. C FILL OCTET 7-10 WITH THE REFERENCE VALUE
  1162. C CONVERT THE FLOATING POINT OF YOUR MACHINE TO IBM370 32 BIT
  1163. C FLOATING POINT NUMBER
  1164. C REFERENCE VALUE
  1165. C FIRST TEST TO SEE IF
  1166. C ON 32 OR 64 BIT COMPUTER
  1167. CALL W3FI01(LW)
  1168. IF (LW.EQ.4) THEN
  1169. CALL W3FI76 (REFNCE,IEXP,IMANT,32)
  1170. ELSE
  1171. CALL W3FI76 (REFNCE,IEXP,IMANT,64)
  1172. END IF
  1173. CALL SBYTE (BDS11,IEXP,48,8)
  1174. CALL SBYTE (BDS11,IMANT,56,24)
  1175. C
  1176. C BYTE 11
  1177. C
  1178. CALL SBYTE (BDS11,KBDS(11),80,8)
  1179. C
  1180. KLEN = LENBDS / 4 + 1
  1181. C PRINT *,'BDS11 LISTING',4,LENBDS
  1182. C CALL BINARY (BDS11,4)
  1183. C PRINT *,'IPFLD LISTING'
  1184. C CALL BINARY (IPFLD,KLEN)
  1185. RETURN
  1186. END
  1187. SUBROUTINE FI7505 (N,NBITS)
  1188. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  1189. C . . . .
  1190. C SUBPROGRAM: FI7505 DETERMINE NUMBER OF BITS TO CONTAIN VALUE
  1191. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 93-06-23
  1192. C
  1193. C ABSTRACT: CALCULATE NUMBER OF BITS TO CONTAIN VALUE N, WITH A
  1194. C MAXIMUM OF 32 BITS.
  1195. C
  1196. C PROGRAM HISTORY LOG:
  1197. C 93-06-23 CAVANAUGH
  1198. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  1199. C
  1200. C USAGE: CALL FI7505 (N,NBITS)
  1201. C INPUT ARGUMENT LIST:
  1202. C N - INTEGER VALUE
  1203. C
  1204. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  1205. C NBITS - NUMBER OF BITS TO CONTAIN N
  1206. C
  1207. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1208. C
  1209. C ATTRIBUTES:
  1210. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  1211. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  1212. C
  1213. C $$
  1214. INTEGER N,NBITS
  1215. INTEGER IBITS(31)
  1216. C
  1217. DATA IBITS/1,3,7,15,31,63,127,255,511,1023,2047,
  1218. * 4095,8191,16383,32767,65535,131071,262143,
  1219. * 524287,1048575,2097151,4194303,8388607,
  1220. * 16777215,33554431,67108863,134217727,268435455,
  1221. * 536870911,1073741823,2147483647/
  1222. C ----------------------------------------------------------------
  1223. C
  1224. DO 1000 NBITS = 1, 31
  1225. IF (N.LE.IBITS(NBITS)) THEN
  1226. RETURN
  1227. END IF
  1228. 1000 CONTINUE
  1229. RETURN
  1230. END
  1231. SUBROUTINE FI7513 (IWORK,ISTART,NPTS,MAX,MIN,INRNGE)
  1232. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  1233. C . . . .
  1234. C SUBPROGRAM: FI7513 SELECT BLOCK OF DATA FOR PACKING
  1235. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 94-01-21
  1236. C
  1237. C ABSTRACT: SELECT A BLOCK OF DATA FOR PACKING
  1238. C
  1239. C PROGRAM HISTORY LOG:
  1240. C 94-01-21 CAVANAUGH
  1241. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  1242. C
  1243. C USAGE: CALL FI7513 (IWORK,ISTART,NPTS,MAX,MIN,INRNGE)
  1244. C INPUT ARGUMENT LIST:
  1245. C * - RETURN ADDRESS IF ENCOUNTER SET OF SAME VALUES
  1246. C IWORK -
  1247. C ISTART -
  1248. C NPTS -
  1249. C
  1250. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  1251. C MAX -
  1252. C MIN -
  1253. C INRNGE -
  1254. C
  1255. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1256. C
  1257. C ATTRIBUTES:
  1258. C LANGUAGE: IBM VS FORTRAN 77, CRAY CFT77 FORTRAN
  1259. C MACHINE: HDS, CRAY C916/256, Y-MP8/64, Y-MP EL92/256
  1260. C
  1261. C $$
  1262. INTEGER IWORK(*),NPTS,ISTART,INRNGE,INRNGA,INRNGB
  1263. INTEGER MAX,MIN,MXVAL,MAXB,MINB,MXVALB
  1264. INTEGER IBITS(31)
  1265. C
  1266. DATA IBITS/1,3,7,15,31,63,127,255,511,1023,2047,
  1267. * 4095,8191,16383,32767,65535,131071,262143,
  1268. * 524287,1048575,2097151,4194303,8388607,
  1269. * 16777215,33554431,67108863,134217727,268435455,
  1270. * 536870911,1073741823,2147483647/
  1271. C ----------------------------------------------------------------
  1272. C IDENTIFY NEXT BLOCK OF DATA FOR PACKING AND
  1273. C RETURN TO CALLER
  1274. C ********************************************************************
  1275. ISTRTA = ISTART
  1276. C
  1277. C GET BLOCK A
  1278. CALL FI7516 (IWORK,NPTS,INRNGA,ISTRTA,
  1279. * MAX,MIN,MXVAL,LWIDE)
  1280. C ********************************************************************
  1281. C
  1282. ISTRTB = ISTRTA + INRNGA
  1283. 2000 CONTINUE
  1284. C IF HAVE PROCESSED ALL DATA, RETURN
  1285. IF (ISTRTB.GT.NPTS) THEN
  1286. C NO MORE DATA TO LOOK AT
  1287. INRNGE = INRNGA
  1288. RETURN
  1289. END IF
  1290. C GET BLOCK B
  1291. CALL FI7502 (IWORK,ISTRTB,NPTS,ISAME)
  1292. IF (ISAME.GE.15) THEN
  1293. C PRINT *,'BLOCK B HAS ALL IDENTICAL VALUES'
  1294. C PRINT *,'BLOCK A HAS INRNGE =',INRNGA
  1295. C BLOCK B CONTAINS ALL IDENTICAL VALUES
  1296. INRNGE = INRNGA
  1297. C EXIT WITH BLOCK A
  1298. RETURN
  1299. END IF
  1300. C GET BLOCK B
  1301. C
  1302. ISTRTB = ISTRTA + INRNGA
  1303. CALL FI7516 (IWORK,NPTS,INRNGB,ISTRTB,
  1304. * MAXB,MINB,MXVALB,LWIDEB)
  1305. C PRINT *,'BLOCK A',INRNGA,' BLOCK B',INRNGB
  1306. C ********************************************************************
  1307. C PERFORM TREND ANALYSIS TO DETERMINE
  1308. C IF DATA COLLECTION CAN BE IMPROVED
  1309. C
  1310. KTRND = LWIDE - LWIDEB
  1311. C PRINT *,'TREND',LWIDE,LWIDEB
  1312. IF (KTRND.LE.0) THEN
  1313. C PRINT *,'BLOCK A - SMALLER, SHOULD EXTEND INTO BLOCK B'
  1314. MXVAL = IBITS(LWIDE)
  1315. C
  1316. C IF BLOCK A REQUIRES THE SAME OR FEWER BITS
  1317. C LOOK AHEAD
  1318. C AND GATHER THOSE DATA POINTS THAT CAN
  1319. C BE RETAINED IN BLOCK A
  1320. C BECAUSE THIS BLOCK OF DATA
  1321. C USES FEWER BITS
  1322. C
  1323. CALL FI7518 (IRET,IWORK,NPTS,ISTRTA,INRNGA,INRNGB,
  1324. * MAX,MIN,LWIDE,MXVAL)
  1325. IF(IRET.EQ.1) GO TO 8000
  1326. C PRINT *,'18 INRNGA IS NOW ',INRNGA
  1327. IF (INRNGB.LT.20) THEN
  1328. RETURN
  1329. ELSE
  1330. GO TO 2000
  1331. END IF
  1332. ELSE
  1333. C PRINT *,'BLOCK A - LARGER, B SHOULD EXTEND BACK INTO A'
  1334. MXVALB = IBITS(LWIDEB)
  1335. C
  1336. C IF BLOCK B REQUIRES FEWER BITS
  1337. C LOOK BACK
  1338. C SHORTEN BLOCK A BECAUSE NEXT BLOCK OF DATA
  1339. C USES FEWER BITS
  1340. C
  1341. CALL FI7517 (IRET,IWORK,NPTS,ISTRTB,INRNGA,
  1342. * MAXB,MINB,LWIDEB,MXVALB)
  1343. IF(IRET.EQ.1) GO TO 8000
  1344. C PRINT *,'17 INRNGA IS NOW ',INRNGA
  1345. END IF
  1346. C
  1347. C PACK UP BLOCK A
  1348. C UPDATA POINTERS
  1349. 8000 CONTINUE
  1350. INRNGE = INRNGA
  1351. C GET NEXT BLOCK A
  1352. 9000 CONTINUE
  1353. RETURN
  1354. END
  1355. SUBROUTINE FI7516 (IWORK,NPTS,INRNG,ISTART,MAX,MIN,MXVAL,LWIDTH)
  1356. C $$ SUBPROGRAM DOCUMENTATION BLOCK
  1357. C . . . .
  1358. C SUBPROGRAM: FI7516 SCAN NUMBER OF POINTS
  1359. C PRGMMR: CAVANAUGH ORG: W/NMC42 DATE: 94-01-21
  1360. C
  1361. C ABSTRACT: SCAN FORWARD FROM CURRENT POSITION. COLLECT POINTS AND
  1362. C DETERMINE MAXIMUM AND MINIMUM VALUES AND THE NUMBER
  1363. C OF POINTS THAT ARE INCLUDED. FORWARD SEARCH IS TERMINATED
  1364. C BY ENCOUNTERING A SET OF IDENTICAL VALUES, BY REACHING
  1365. C THE NUMBER OF POINTS SELECTED OR BY REACHING THE END
  1366. C OF DATA.
  1367. C
  1368. C PROGRAM HISTORY LOG:
  1369. C 94-01-21 CAVANAUGH
  1370. C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
  1371. C
  1372. C USAGE: CALL FI7516 (IWORK,NPTS,INRNG,ISTART,MAX,MIN,MXVAL,LWIDTH)
  1373. C INPUT ARGUMENT LIST:
  1374. C * - RETURN ADDRESS IF ENCOUNTER SET OF SAME VALUES
  1375. C IWORK - DATA ARRAY
  1376. C NPTS - NUMBER OF POINTS IN DATA ARRAY
  1377. C ISTART - STARTING LOCATION IN DATA
  1378. C
  1379. C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
  1380. C INRNG - NUMBER OF POINTS SELECTED
  1381. C MAX - MAXIMUM VALUE OF POINTS
  1382. C MIN - MINIMUM VALUE OF POINTS
  1383. C MXVAL - MAXIMUM VALUE THAT CAN BE CONTAINED IN LWIDTH BITS
  1384. C LWIDTH - NUMBER OF BITS TO CONTAIN MAX DIFF
  1385. C
  1386. C REMARKS: SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
  1387. C
  1388. C ATTRIBUT

Large files files are truncated, but you can click here to view the full file