added README_changes.txt
[wrffire.git] / WPS / ungrib / src / gbytesys.F90
blob0f34bfe6c8b76dfe842de15b39b5af7f16cd880b
1 !-----------------------------------------------------------------------
2 !       Choice of computers
3 !-----------------------------------------------------------------------
5 !                 CRAY XMP,YMP/UNICOS       (#define CRAY)
6 !                 VAX/VMS                   (#define VAX)
7 !                 Stardent 1500/3000/UNIX   (#define STARDENT)
8 !                 IBM RS/6000-AIX           (#define IBM)
9 !                 SUN Sparcstation          (#define SUN)
10 !                 SGI Silicon Graphics      (#define SGI)
11 !                 HP 7xx                    (#define HP)
12 !                 DEC ALPHA                 (#define ALPHA)
13 ! +------------------------------------------------------------------+
14 ! _                     SYSTEM DEPENDENT ROUTINES                    _
15 ! _                                                                  _
16 ! _    This module contains short utility routines that are not      _
17 ! _ of the FORTRAN 77 standard and may differ from system to system. _
18 ! _ These include bit manipulation, I/O, JCL calls, and vector       _
19 ! _ functions.                                                       _
20 ! +------------------------------------------------------------------+
21 ! +------------------------------------------------------------------+
23 !          DATA SET UTILITY    AT LEVEL 003 AS OF 02/25/92
24       SUBROUTINE GBYTE_G1(IN,IOUT,ISKIP,NBYTE)
26 ! THIS PROGRAM WRITTEN BY.....
27 !             DR. ROBERT C. GAMMILL, CONSULTANT
28 !             NATIONAL CENTER FOR ATMOSPHERIC RESEARCH
29 !             MAY 1972
31 !             CHANGES FOR CRAY Y-MP8/832
32 !             CRAY CFT77 FORTRAN
33 !             JULY 1992, RUSSELL E. JONES
34 !             NATIONAL WEATHER SERVICE
36 ! THIS IS THE FORTRAN VERSION OF GBYTE
38       INTEGER    IN(*)
39       INTEGER    IOUT
40 #if defined (CRAY) || defined (BIT64)
42       INTEGER    MASKS(64)
44       DATA  NBITSW/64/
46 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 64 BIT
47 !     COMPUTER
49        DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,  &
50        4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,      &
51        1048575, 2097151, 4194303, 8388607, 16777215, 33554431,       &
52        67108863, 134217727, 268435455, 536870911, 1073741823,        &
53        2147483647, 4294967295, 8589934591, 17179869183,              &
54        34359738367, 68719476735, 137438953471, 274877906943,         &
55        549755813887, 1099511627775, 2199023255551, 4398046511103,    &
56        8796093022207, 17592186044415, 35184372088831,                &
57        70368744177663, 140737488355327, 281474976710655,             &
58        562949953421311, 1125899906842623, 2251799813685247,          &
59        4503599627370495, 9007199254740991, 18014398509481983,        &
60        36028797018963967, 72057594037927935, 144115188075855871,     &
61        288230376151711743, 576460752303423487, 1152921504606846975,  &
62        2305843009213693951, 4611686018427387903, 9223372036854775807, &
63        -1/
64 #else
65       INTEGER    MASKS(32)
67       DATA  NBITSW/32/
69 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 32 BIT
70 !     COMPUTER
72       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, &
73        4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,     &
74        1048575, 2097151, 4194303, 8388607, 16777215, 33554431,      &
75        67108863, 134217727, 268435455, 536870911, 1073741823,       &
76        2147483647, -1/
77 #endif
79 ! NBYTE MUST BE LESS THAN OR EQUAL TO NBITSW
81       ICON   = NBITSW - NBYTE
82       IF (ICON.LT.0) RETURN
83       MASK   = MASKS(NBYTE)
85 ! INDEX TELLS HOW MANY WORDS INTO THE ARRAY 'IN' THE NEXT BYTE APPEARS.
87       INDEX  = ISKIP / NBITSW
89 ! II TELLS HOW MANY BITS THE BYTE IS FROM THE LEFT SIDE OF THE WORD.
91       II     = MOD(ISKIP,NBITSW)
93 ! MOVER SPECIFIES HOW FAR TO THE RIGHT NBYTE MUST BE MOVED IN ORDER
94 !    TO BE RIGHT ADJUSTED.
96       MOVER = ICON - II
98       IF (MOVER.GT.0) THEN
99         IOUT  = IAND(ISHFT(IN(INDEX+1),-MOVER),MASK)
101 ! THE BYTE IS SPLIT ACROSS A WORD BREAK.
103       ELSE IF (MOVER.LT.0) THEN
104         MOVEL = - MOVER
105         MOVER = NBITSW - MOVEL
106         IOUT  = IAND(IOR(ISHFT(IN(INDEX+1),MOVEL),    &
107      &          ISHFT(IN(INDEX+2),-MOVER)),MASK)
109 ! THE BYTE IS ALREADY RIGHT ADJUSTED.
111       ELSE
112         IOUT  = IAND(IN(INDEX+1),MASK)
113       ENDIF
115       RETURN
116       END
118 ! +------------------------------------------------------------------+
119       SUBROUTINE GBYTES_G1(IN,IOUT,ISKIP,NBYTE,NSKIP,N)
121 ! THIS PROGRAM WRITTEN BY.....
122 !             DR. ROBERT C. GAMMILL, CONSULTANT
123 !             NATIONAL CENTER FOR ATMOSPHERIC RESEARCH
124 !             MAY 1972
126 !             CHANGES FOR CRAY Y-MP8/832
127 !             CRAY CFT77 FORTRAN
128 !             JULY 1992, RUSSELL E. JONES
129 !             NATIONAL WEATHER SERVICE
131 ! THIS IS THE FORTRAN VERSION OF GBYTES.
133       INTEGER    IN(*)
134       INTEGER    IOUT(*)
135 #if defined (CRAY) || defined (BIT64)
136 !CDIR$ INTEGER=64
137       INTEGER    MASKS(64)
139       DATA  NBITSW/64/
141 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 64 BIT
142 !     COMPUTER
144       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, &
145      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,     &
146      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,      &
147      & 67108863, 134217727, 268435455, 536870911, 1073741823,       &
148      & 2147483647, 4294967295, 8589934591, 17179869183,             &
149      & 34359738367, 68719476735, 137438953471, 274877906943,        &
150      & 549755813887, 1099511627775, 2199023255551, 4398046511103,   &
151      & 8796093022207, 17592186044415, 35184372088831,               &
152      & 70368744177663, 140737488355327, 281474976710655,            &
153      & 562949953421311, 1125899906842623, 2251799813685247,         &
154      & 4503599627370495, 9007199254740991, 18014398509481983,       &
155      & 36028797018963967, 72057594037927935, 144115188075855871,    &
156      & 288230376151711743, 576460752303423487, 1152921504606846975, &
157      & 2305843009213693951, 4611686018427387903, 9223372036854775807, &
158      & -1/
159 #else
160       INTEGER    MASKS(32)
162       DATA  NBITSW/32/
164 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 32 BIT
165 !     COMPUTER
167       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,   &
168      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,       &
169      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,        &
170      & 67108863, 134217727, 268435455, 536870911, 1073741823,         &
171      & 2147483647, -1/
172 #endif
174 ! NBYTE MUST BE LESS THAN OR EQUAL TO NBITSW
176       ICON   = NBITSW - NBYTE
177       IF (ICON.LT.0) RETURN
178       MASK   = MASKS(NBYTE)
180 ! INDEX TELLS HOW MANY WORDS INTO THE ARRAY 'IN' THE NEXT BYTE APPEARS.
182       INDEX  = ISKIP / NBITSW
184 ! II TELLS HOW MANY BITS THE BYTE IS FROM THE LEFT SIDE OF THE WORD.
186       II     = MOD(ISKIP,NBITSW)
188 ! ISTEP IS THE DISTANCE IN BITS FROM THE START OF ONE BYTE TO THE NEXT.
190       ISTEP  = NBYTE + NSKIP
192 ! IWORDS TELLS HOW MANY WORDS TO SKIP FROM ONE BYTE TO THE NEXT.
194       IWORDS = ISTEP / NBITSW
196 ! IBITS TELLS HOW MANY BITS TO SKIP AFTER SKIPPING IWORDS.
198       IBITS  = MOD(ISTEP,NBITSW)
200       DO 10 I = 1,N
202 ! MOVER SPECIFIES HOW FAR TO THE RIGHT A BYTE MUST BE MOVED IN ORDER
204 !    TO BE RIGHT ADJUSTED.
205 !    TO BE RIGHT ADJUSTED.
207       MOVER = ICON - II
209 ! THE BYTE IS SPLIT ACROSS A WORD BREAK.
211       IF (MOVER.LT.0) THEN
212         MOVEL   = - MOVER
213         MOVER   = NBITSW - MOVEL
214         IOUT(I) = IAND(IOR(ISHFT(IN(INDEX+1),MOVEL),   &
215      &            ISHFT(IN(INDEX+2),-MOVER)),MASK)
217 ! RIGHT ADJUST THE BYTE.
219       ELSE IF (MOVER.GT.0) THEN
220         IOUT(I) = IAND(ISHFT(IN(INDEX+1),-MOVER),MASK)
222 ! THE BYTE IS ALREADY RIGHT ADJUSTED.
224       ELSE
225         IOUT(I) = IAND(IN(INDEX+1),MASK)
226       ENDIF
228 ! INCREMENT II AND INDEX.
230         II    = II + IBITS
231         INDEX = INDEX + IWORDS
232         IF (II.GE.NBITSW) THEN
233           II    = II - NBITSW
234           INDEX = INDEX + 1
235         ENDIF
237    10 CONTINUE
238         RETURN
239       END
241 ! +------------------------------------------------------------------+
242       SUBROUTINE SBYTE_G1(IOUT,IN,ISKIP,NBYTE)
243 ! THIS PROGRAM WRITTEN BY.....
244 !             DR. ROBERT C. GAMMILL, CONSULTANT
245 !             NATIONAL CENTER FOR ATMOSPHERIC RESEARCH
246 !             JULY 1972
247 ! THIS IS THE FORTRAN VERSIONS OF SBYTE.
248 !             FORTRAN 90
249 !             AUGUST 1990  RUSSELL E. JONES
250 !             NATIONAL WEATHER SERVICE
252 ! USAGE:    CALL SBYTE (PCKD,UNPK,INOFST,NBIT)
254 !   INPUT ARGUMENT LIST:
255 !     UNPK     -  NBITS OF THE RIGHT SIDE OF UNPK IS MOVED TO
256 !                 ARRAY PCKD. INOFST BITS ARE SKIPPED OVER BEFORE
257 !                 THE DATA IS MOVED, NBITS ARE STORED.
258 !    INOFST    -  A FULLWORD INTEGER SPECIFYING THE INITAL OFFSET
259 !                 IN BITS OF THE FIRST BYTE, COUNTED FROM THE
260 !                 LEFTMOST BIT IN PCKD.
261 !    NBITS     -  A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
262 !                 IN EACH BYTE TO BE PACKED.  LEGAL BYTE WIDTHS
263 !                 ARE IN THE RANGE 1 - 32.
264 !   OUTPUT ARGUMENT LIST:
265 !    PCKD      -  THE FULLWORD IN MEMORY TO WHICH PACKING IS TO
266 !                 BEGIN STARTING AT BIT INOFST. THE INOSTAT BITS
267 !                 ARE NOT ALTERED.
269       INTEGER    IN
270       INTEGER    IOUT(*)
271 #if defined (CRAY) || defined (BIT64)
272       INTEGER    MASKS(64)
274       DATA  NBITSW/64/
276 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 64 BIT
277 !     COMPUTER
279       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,   &
280      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,       &
281      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,        &
282      & 67108863, 134217727, 268435455, 536870911, 1073741823,         &
283      & 2147483647, 4294967295, 8589934591, 17179869183,               &
284      & 34359738367, 68719476735, 137438953471, 274877906943,          &
285      & 549755813887, 1099511627775, 2199023255551, 4398046511103,     &
286      & 8796093022207, 17592186044415, 35184372088831,                 &
287      & 70368744177663, 140737488355327, 281474976710655,              &
288      & 562949953421311, 1125899906842623, 2251799813685247,           &
289      & 4503599627370495, 9007199254740991, 18014398509481983,         &
290      & 36028797018963967, 72057594037927935, 144115188075855871,      &
291      & 288230376151711743, 576460752303423487, 1152921504606846975,   &
292      & 2305843009213693951, 4611686018427387903, 9223372036854775807, &
293      & -1/
294 #else
295       INTEGER    MASKS(32)
297       DATA  NBITSW/32/
299 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 32 BIT
300 !     COMPUTER
302       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,   &
303      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,       &
304      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,        &
305      & 67108863, 134217727, 268435455, 536870911, 1073741823,         &
306      & 2147483647, -1/
307 #endif
309 ! NBYTE MUST BE LESS THAN OR EQUAL TO NBITSW
311         ICON  = NBITSW - NBYTE
312         IF (ICON.LT.0) RETURN
313         MASK  = MASKS(NBYTE)
315 ! INDEX TELLS HOW MANY WORDS INTO IOUT THE NEXT BYTE IS TO BE STORED.
317         INDEX = ISKIP / NBITSW
319 ! II TELLS HOW MANY BITS IN FROM THE LEFT SIDE OF THE WORD TO STORE IT.
321         II    = MOD(ISKIP,NBITSW)
323         J     = IAND(MASK,IN)
324         MOVEL = ICON - II
326 ! BYTE IS TO BE STORED IN MIDDLE OF WORD.  SHIFT LEFT.
328         IF (MOVEL.GT.0) THEN
329           MSK           = ISHFT(MASK,MOVEL)
330           IOUT(INDEX+1) = IOR(IAND(NOT(MSK),IOUT(INDEX+1)),   &
331      &    ISHFT(J,MOVEL))
333 ! THE BYTE IS TO BE SPLIT ACROSS A WORD BREAK.
335         ELSE IF (MOVEL.LT.0) THEN
336           MSK           = MASKS(NBYTE+MOVEL)
337           IOUT(INDEX+1) = IOR(IAND(NOT(MSK),IOUT(INDEX+1)),    &
338      &    ISHFT(J,MOVEL))
339           ITEMP         = IAND(MASKS(NBITSW+MOVEL),IOUT(INDEX+2))
340           IOUT(INDEX+2) = IOR(ITEMP,ISHFT(J,NBITSW+MOVEL))
342 ! BYTE IS TO BE STORED RIGHT-ADJUSTED.
344         ELSE
345           IOUT(INDEX+1) = IOR(IAND(NOT(MASK),IOUT(INDEX+1)),J)
346         ENDIF
348       RETURN
349       END
351 ! +------------------------------------------------------------------+
352       SUBROUTINE SBYTES_G1(IOUT,IN,ISKIP,NBYTE,NSKIP,N)
353 ! THIS PROGRAM WRITTEN BY.....
354 !             DR. ROBERT C. GAMMILL, CONSULTANT
355 !             NATIONAL CENTER FOR ATMOSPHERIC RESEARCH
356 !             JULY 1972
357 ! THIS IS THE FORTRAN VERSIONS OF SBYTES.
359 !             FORTRAN 90
360 !             AUGUST 1990  RUSSELL E. JONES
361 !             NATIONAL WEATHER SERVICE
363 ! USAGE:    CALL SBYTES (PCKD,UNPK,INOFST,NBIT, NSKIP,ITER)
365 !   INPUT ARGUMENT LIST:
366 !     UNPK     -  NBITS OF THE RIGHT SIDE OF EACH WORD OF ARRAY
367 !                 UNPK IS MOVED TO ARRAY PCKD. INOFST BITS ARE
368 !                 SKIPPED OVER BEFORE THE 1ST DATA IS MOVED, NBITS
369 !                 ARE STORED, NSKIP BITS ARE SKIPPED OVER, THE NEXT
370 !                 NBITS ARE MOVED,  BIT ARE SKIPPED OVER, ETC. UNTIL
371 !                 ITER GROUPS OF BITS ARE PACKED.
372 !    INOFST    -  A FULLWORD INTEGER SPECIFYING THE INITAL OFFSET
373 !                 IN BITS OF THE FIRST BYTE, COUNTED FROM THE
374 !                 LEFTMOST BIT IN PCKD.
375 !    NBITS     -  A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
376 !                 IN EACH BYTE TO BE PACKED.  LEGAL BYTE WIDTHS
377 !                 ARE IN THE RANGE 1 - 32.
378 !    NSKIP     -  A FULLWORD INTEGER SPECIFYING THE NUMBER OF BITS
379 !                 TO SKIP BETWEEN SUCCESSIVE BYTES.  ALL NON-NEGATIVE
380 !                 SKIP COUNTS ARE LEGAL.
381 !    ITER      -  A FULLWORD INTEGER SPECIFYING THE TOTAL NUMBER OF
382 !                 BYTES TO BE PACKED, AS CONTROLLED BY INOFST,
383 !                 NBIT AND NSKIP ABOVE.   ALL NON-NEGATIVE ITERATION
384 !                 COUNTS ARE LEGAL.
386 !   OUTPUT ARGUMENT LIST:
387 !    PCKD      -  THE FULLWORD IN MEMORY TO WHICH PACKING IS TO
388 !                 BEGIN STARTING AT BIT INOFST. THE INOSTAT BITS
389 !                 ARE NOT ALTERED. NSKIP BITS ARE NOT ALTERED.
391       INTEGER    IN(*)
392       INTEGER    IOUT(*)
393 #if defined (CRAY) || defined (BIT64)
394       INTEGER    MASKS(64)
396       DATA  NBITSW/64/
398 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 64 BIT
399 !     COMPUTER
401       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,     &
402      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,         &
403      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,          &
404      & 67108863, 134217727, 268435455, 536870911, 1073741823,           &
405      & 2147483647, 4294967295, 8589934591, 17179869183,                 &
406      & 34359738367, 68719476735, 137438953471, 274877906943,            &
407      & 549755813887, 1099511627775, 2199023255551, 4398046511103,       &
408      & 8796093022207, 17592186044415, 35184372088831,                   &
409      & 70368744177663, 140737488355327, 281474976710655,                &
410      & 562949953421311, 1125899906842623, 2251799813685247,             &
411      & 4503599627370495, 9007199254740991, 18014398509481983,           &
412      & 36028797018963967, 72057594037927935, 144115188075855871,        &
413      & 288230376151711743, 576460752303423487, 1152921504606846975,     &
414      & 2305843009213693951, 4611686018427387903, 9223372036854775807,   &
415      & -1/
416 #else
417       INTEGER    MASKS(32)
419       DATA  NBITSW/32/
421 !     MASKS TABLE PUT IN DECIMAL SO IT WILL COMPILE ON ANY 32 BIT
422 !     COMPUTER
424       DATA  MASKS / 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047,   &
425      & 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287,       &
426      & 1048575, 2097151, 4194303, 8388607, 16777215, 33554431,        &
427      & 67108863, 134217727, 268435455, 536870911, 1073741823,         &
428      & 2147483647, -1/
429 #endif
431 ! NBYTE MUST BE LESS THAN OR EQUAL TO NBITSW
433       ICON = NBITSW - NBYTE
434       IF (ICON.LT.0) RETURN
435       MASK   = MASKS(NBYTE)
437 ! INDEX TELLS HOW MANY WORDS INTO IOUT THE NEXT BYTE IS TO BE STORED.
439       INDEX  = ISKIP / NBITSW
441 ! II TELLS HOW MANY BITS IN FROM THE LEFT SIDE OF THE WORD TO STORE IT.
443       II     = MOD(ISKIP,NBITSW)
445 ! ISTEP IS THE DISTANCE IN BITS FROM ONE BYTE POSITION TO THE NEXT.
447       ISTEP  = NBYTE + NSKIP
449 ! IWORDS TELLS HOW MANY WORDS TO SKIP FROM ONE BYTE TO THE NEXT.
451       IWORDS = ISTEP / NBITSW
453 ! IBITS TELLS HOW MANY BITS TO SKIP AFTER SKIPPING IWORDS.
455       IBITS  = MOD(ISTEP,NBITSW)
457       DO 10 I = 1,N
458         J     = IAND(MASK,IN(I))
459         MOVEL = ICON - II
461 ! BYTE IS TO BE STORED IN MIDDLE OF WORD.  SHIFT LEFT.
463         IF (MOVEL.GT.0) THEN
464           MSK           = ISHFT(MASK,MOVEL)
465           IOUT(INDEX+1) = IOR(IAND(NOT(MSK),IOUT(INDEX+1)),   &
466      &    ISHFT(J,MOVEL))
468 ! THE BYTE IS TO BE SPLIT ACROSS A WORD BREAK.
470         ELSE IF (MOVEL.LT.0) THEN
471           MSK           = MASKS(NBYTE+MOVEL)
472           IOUT(INDEX+1) = IOR(IAND(NOT(MSK),IOUT(INDEX+1)),    &
473      &    ISHFT(J,MOVEL))
474           ITEMP         = IAND(MASKS(NBITSW+MOVEL),IOUT(INDEX+2))
475           IOUT(INDEX+2) = IOR(ITEMP,ISHFT(J,NBITSW+MOVEL))
477 ! BYTE IS TO BE STORED RIGHT-ADJUSTED.
479         ELSE
480           IOUT(INDEX+1) = IOR(IAND(NOT(MASK),IOUT(INDEX+1)),J)
481         ENDIF
483         II    = II + IBITS
484         INDEX = INDEX + IWORDS
485         IF (II.GE.NBITSW) THEN
486           II    = II - NBITSW
487           INDEX = INDEX + 1
488         ENDIF
490 10    CONTINUE
492       RETURN
493       END