SUBROUTINE W3AI01(PACK,REAL8,LABEL)
C$$$   SUBPROGRAM  DOCUMENTATION  BLOCK
C
C SUBPROGRAM: W3AI01         UNPACK RECORD INTO IEEE F.P.
C   AUTHOR: JONES,R.E.       ORG: W342       DATE: 89-10-17
C
C ABSTRACT: UNPACKS A RECORD IN OFFICE NOTE 84 FORMAT AND CONVERT THE
C   PACKED DATA TO IEEE REAL FLOATING POINT NUMBERS. THE
C   OFFICE NOTE 84 DATA IS BIT FOR BIT THE SAME ON THE NAS-9050 AND
C   THE CRAY.
C
C PROGRAM HISTORY LOG:
C   89-10-20  R.E.JONES
C   90-02-02  R.E.JONES  CHANGE TO CRAY FUNCTION FOR INTEGER*2, F.P.
C   90-10-11  R.E.JONES  SPECIAL VERSION OF W3AI01 TO UNPACK RECORDS
C                        PACKED BY BIG VERSION OF W3AI00. WILL DO
C                        OLD AND NEW VERSION.
C   91-03-19  R.E.JONES  MAKE SPECIAL VERSION OF W3AI01 TO UNPACK
C                        BIG RECORDS THE OPERATIONAL VERSION.
C   93-06-10  R.E.JONES  INCREACE ARRAY SIZE TO 262144 WORDS.
C   98-03-10  B. VUONG   REMOVE THE CDIR$ INTEGER=64 DIRECTIVE
C   98-11-17  Gilbert    Changed to unpack into IEEE reals for the IBM SP
C
C USAGE:  CALL W3AI01 (PACK, REAL8, LABEL)
C
C   INPUT VARIABLES:
C     NAMES  INTERFACE DESCRIPTION OF VARIABLES AND TYPES
C     ------ --------- -----------------------------------------------
C     PACK   ARG LIST  INTEGER ARRAY WITH DATA IN OFFICE NOTE 84
C                      FORMAT TO BE UNPACKED.  
C
C   OUTPUT VARIABLES:
C     NAMES  INTERFACE DESCRIPTION OF VARIABLES AND TYPES
C     ------ --------- -----------------------------------------------
C     REAL8  ARG LIST  REAL ARRAY OF N WORDS. WHERE N IS GIVEN IN
C                      WORD 6 OF PACK. WORD 6 OF PACK MUST
C                      CONTAIN CENTER AND SCALING VALUES.
C     LABEL  ARG LIST  SIX WORD INTEGER LABEL COPIED FROM PACK, 12
C                      OFFICE NOTE 84 32 BIT ID'S THAT ARE STORED INTO
C                      six 64-bit words.
C
C   SUBPROGRAMS CALLED:
C     NAMES                                                   LIBRARY
C     ------------------------------------------------------- --------
C     Q9IE32                                                  W3LIB
C
C   REMARKS: LABEL AND PACK MAY BE EQUIVALENCED.
C
C ATTRIBUTES:
C   LANGUAGE: IBM XL FORTRAN
C   MACHINE:  IBM SP
C
C$$$
C
       REAL     REAL8(*)
C
       INTEGER(2)  ITEMP(262144)
       INTEGER(8)  LABEL(6)
       INTEGER(8)  PACK(*)
       INTEGER(8)  MASK16
       INTEGER(8)  MASK32
       integer(2) i2(4)
       real(4)  rtemp(2)
       integer(8)  ktemp,jtemp(65536)
       equivalence (ktemp,rtemp(1),i2(1))
       equivalence (itemp(1),jtemp(1))
C
       SAVE
C
       DATA  MASK16/X'000000000000FFFF'/
       DATA  MASK32/X'00000000FFFFFFFF'/
C
C      MOVE OFFICE NOTE 84 12 32 BIT ID'S INTO LABEL
C
       DO 10 I = 1,6
         LABEL(I) = PACK(I)
 10    CONTINUE
C
C GET WORD COUNT, AVERAGE VALUE, SCALING FACTOR, J, A , N.
C
         J   = IAND(LABEL(4),MASK16)
         IF (J.EQ.0) THEN
           J   = IAND(LABEL(6),MASK32)
           IF (J.EQ.0) THEN
             PRINT *,' W3AI01 ERROR, NUMBER OF WORDS IN GRID IS 0'
             RETURN
           ENDIF
           IF (J.GT.262144) THEN
             PRINT *,' W3AI01 ERROR, NUMBER OF WORDS IN GRID IS ',J
             PRINT *,' THERE IS A LIMIT OF 262144'
             RETURN
           ENDIF
         ENDIF
C
C        CONVERT IBM 32 BIT MEAN VALUE TO IEEE F.P. NUMBER
C
C         CALL USSCTC(LABEL(5),5,A,1)
         ktemp=LABEL(5)
         call q9ie32(rtemp(2),rtemp(1),1,istat)
         A=rtemp(1)
C
C        GET SCALING VALUE N, CAN BE NEGATIVE (INTEGER*2 TWO'S COMPL.)
C
C         CALL USICTC(LABEL(6),3,N,1,2)
         ktemp=LABEL(6)
         n=i2(2)
C
         TWON = 2.0 ** (N - 15)
C
C UNPACK, CONVERT TO REAL 64 BIT FLOATING POINT DATA
C
C         CALL USICTC(PACK(7),1,ITEMP,J,2)
         jtemp(1:65536)=pack(7:65542)
C
         DO 20 I = 1,J
           REAL8(I) = FLOAT(ITEMP(I)) * TWON + A
  20     CONTINUE
C
         RETURN
       END