! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ASNCTL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE asnctl (string, i , ierr) 59 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Dummy subroutine to substitute Cray function ASNCTL. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 11/30/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INTEGER :: i,ierr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! RETURN END SUBROUTINE asnctl ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ASNUNIT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE asnunit(nchan, string, ierr ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Dummy subroutine to substitute Cray function ASNUNIT. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 11/30/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! CHARACTER (LEN=*) :: string INTEGER :: nchan, ierr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! RETURN END SUBROUTINE asnunit ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ASNFILE ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE asnfile(FILE, string, ierr ) 67 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Dummy subroutine to substitute Cray function ASNFILE. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 11/30/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! CHARACTER (LEN=*) :: FILE CHARACTER (LEN=*) :: string INTEGER :: ierr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! RETURN END SUBROUTINE asnfile ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE UNIXCMD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE unixcmd(cmd) 17 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To executable a system command by making a system call. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 4/15/95 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE CHARACTER (LEN=*) :: cmd ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! CALL system( cmd ) RETURN END SUBROUTINE unixcmd ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CMPRS ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cmprs(filename) 4,9 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Make a system call to compress the file 'filename' with compress ! format developed by Free Software Foundation. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 11/30/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! CHARACTER (LEN=*) :: filename CHARACTER (LEN=132) :: CHAR INTEGER :: lenstr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lenstr = LEN( filename ) CALL strlnth( filename, lenstr) CHAR = 'gzip --fast ' CHAR(13:12+lenstr) = filename lenstr=lenstr+12 IF( lenstr > 132) THEN WRITE(6,'(1x,a)') & 'Work character char too small in CMPRS, call returned.' END IF WRITE(6,'(1x,a,a,a)') 'Compressing file ',filename,' ...' CALL system( CHAR(1:lenstr) ) RETURN END SUBROUTINE cmprs ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE UNCMPRS ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE uncmprs(filename) 14,9 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Make a system call to uncompress the file 'filename' with gunzip ! format developed by Free Software Foundation. ! !----------------------------------------------------------------------- ! ! Author: Ming Xue ! Date: 11/30/93 ! ! MODIFICATION HISTORY: ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! ! 11/27/1995 (M. Xue) ! Decompression for both .Z and .gz files. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE CHARACTER (LEN=*) :: filename CHARACTER (LEN=132) :: CHAR INTEGER :: lenstr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lenstr = LEN( filename ) CALL strlnth( filename, lenstr) IF(filename(lenstr-1:lenstr) == '.Z') THEN CHAR = 'uncompress ' CHAR(12:12+lenstr) = filename lenstr=lenstr+12 ELSE IF(filename(lenstr-2:lenstr) == '.gz') THEN CHAR = 'gunzip ' CHAR(8:7+lenstr) = filename lenstr = lenstr+8 ELSE WRITE(6,'(1x,a,/1x,a)') & 'File name does not have the right affix.', & 'No decompressing was done on file ',filename RETURN END IF IF( lenstr > 132) THEN WRITE(6,'(1x,a)') & 'Work character char too small in UNCMPRS, call returned.' END IF WRITE(6,'(1x,a,a,a)') 'Decompressing file ',filename,' ...' CALL system( CHAR(1:lenstr) ) RETURN END SUBROUTINE uncmprs ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GRBSBYTE ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE grbsbyte(iout,in,iskip,nbits) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Take rightmost nbits bit fields of IN and insert them in ! bitstrings of IOUT. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dr. Robert C. Gammill, Consultant, NCAR ! July 1972 ! ! MODIFICATIONS: ! ! 12/20/95 (Yuhe Liu) ! Converted to ARPS standard format and added documents ! !----------------------------------------------------------------------- ! ! INPUT: ! ! in Integer array to be packed ! iskip ! nbits bits number of packing ! ! OUTPUT: ! ! iout Packed stream ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: in INTEGER :: nbits INTEGER :: iskip INTEGER :: iout(*) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: j, ii INTEGER :: icon, INDEX INTEGER :: mask, msk INTEGER :: movel INTEGER :: itemp INTEGER :: nbitsw DATA nbitsw/32/ ! !----------------------------------------------------------------------- ! ! Masks table put in decimal so it will compile on any 32 bit ! computer ! !----------------------------------------------------------------------- ! INTEGER :: masks(32) DATA masks / 1, 3, 7, 15, & 31, 63, 127, 255, & 511, 1023, 2047, 4095, & 8191, 16383, 32767, 65535, & 131071, 262143, 524287, 1048575, & 2097151, 4194303, 8388607, 16777215, & 33554431, 67108863, 134217727, 268435455, & 536870911, 1073741823, 2147483647, -1/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Nbits must be less than or equal to nbitsW ! !----------------------------------------------------------------------- ! icon = nbitsw - nbits IF (icon < 0) RETURN mask = masks(nbits) ! !----------------------------------------------------------------------- ! ! INDEX TELLS HOW MANY WORDS INTO IOUT THE NEXT BYTE IS TO BE STORED. ! !----------------------------------------------------------------------- ! INDEX = ishft(iskip,-5) ! !----------------------------------------------------------------------- ! ! II tells how many bits in from the left side of the word to store ! it. ! !----------------------------------------------------------------------- ! ii = MOD(iskip,nbitsw) j = IAND(mask,in) movel = icon - ii ! !----------------------------------------------------------------------- ! ! Byte is to be stored in middle of word. shift left. ! !----------------------------------------------------------------------- ! IF (movel > 0) THEN msk = ishft(mask,movel) iout(INDEX+1) = ior(IAND(NOT(msk),iout(INDEX+1)), & ishft(j,movel)) ! !----------------------------------------------------------------------- ! ! The byte is to be split across a word break. ! !----------------------------------------------------------------------- ! ELSE IF (movel < 0) THEN msk = masks(nbits+movel) iout(INDEX+1) = ior(IAND(NOT(msk),iout(INDEX+1)), & ishft(j,movel)) itemp = IAND(masks(nbitsw+movel),iout(INDEX+2)) iout(INDEX+2) = ior(itemp,ishft(j,nbitsw+movel)) ! !----------------------------------------------------------------------- ! ! Byte is to be stored right-adjusted. ! !----------------------------------------------------------------------- ! ELSE iout(INDEX+1) = ior(IAND(NOT(mask),iout(INDEX+1)),j) END IF RETURN END SUBROUTINE grbsbyte ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GRBSBYTES ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE grbsbytes(iout,in,iskip,nbits,nskip,nwrd) 1,1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Take rightmost nbits bit fields from words of IN and insert them ! consecutively in bitstrings of IOUT. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dr. Robert C. Gammill, Consultant, NCAR ! July 1972 ! ! MODIFICATIONS: ! ! 12/05/95 (Yuhe Liu) ! Converted to ARPS standard format and added documents ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nwrd Number of word to be packed ! in Integer array to be packed ! iskip ! nbits bits number of packing ! nskip ! ! OUTPUT: ! ! iout Packed stream ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nwrd INTEGER :: in(nwrd) INTEGER :: nbits INTEGER :: iskip INTEGER :: nskip INTEGER :: iout(nwrd) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, ii INTEGER :: ibits INTEGER :: icon, INDEX INTEGER :: mask, msk INTEGER :: movel, iwords, istep INTEGER :: itemp INTEGER :: nbitsw DATA nbitsw/32/ ! !----------------------------------------------------------------------- ! ! Masks table put in decimal so it will compile on any 32 bit ! computer ! !----------------------------------------------------------------------- ! INTEGER :: masks(32) DATA masks / 1, 3, 7, 15, & 31, 63, 127, 255, & 511, 1023, 2047, 4095, & 8191, 16383, 32767, 65535, & 131071, 262143, 524287, 1048575, & 2097151, 4194303, 8388607, 16777215, & 33554431, 67108863, 134217727, 268435455, & 536870911, 1073741823, 2147483647, -1/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Nbits must be less than or equal to nbitsW ! !----------------------------------------------------------------------- ! icon = nbitsw - nbits IF (icon < 0) RETURN mask = masks(nbits) ! !----------------------------------------------------------------------- ! ! INDEX TELLS HOW MANY WORDS INTO IOUT THE NEXT BYTE IS TO BE STORED. ! !----------------------------------------------------------------------- ! INDEX = ishft(iskip,-5) ! !----------------------------------------------------------------------- ! ! II tells how many bits in from the left side of the word to store ! it. ! !----------------------------------------------------------------------- ! ii = MOD(iskip,nbitsw) ! !----------------------------------------------------------------------- ! ! Istep is the distance in bits from one byte position to the next. ! !----------------------------------------------------------------------- ! istep = nbits + nskip ! !----------------------------------------------------------------------- ! ! Iwords tells how many words to skip from one byte to the next. ! !----------------------------------------------------------------------- ! iwords = istep / nbitsw ! !----------------------------------------------------------------------- ! ! Ibits tells how many bits to skip after skipping iwords. ! !----------------------------------------------------------------------- ! ibits = MOD(istep,nbitsw) DO i = 1,nwrd j = IAND(mask,in(i)) movel = icon - ii ! !----------------------------------------------------------------------- ! ! Byte is to be stored in middle of word. shift left. ! !----------------------------------------------------------------------- ! IF (movel > 0) THEN msk = ishft(mask,movel) iout(INDEX+1) = ior(IAND(NOT(msk),iout(INDEX+1)), & ishft(j,movel)) ! !----------------------------------------------------------------------- ! ! The byte is to be split across a word break. ! !----------------------------------------------------------------------- ! ELSE IF (movel < 0) THEN msk = masks(nbits+movel) iout(INDEX+1) = ior(IAND(NOT(msk),iout(INDEX+1)), & ishft(j,movel)) itemp = IAND(masks(nbitsw+movel),iout(INDEX+2)) iout(INDEX+2) = ior(itemp,ishft(j,nbitsw+movel)) ! !----------------------------------------------------------------------- ! ! Byte is to be stored right-adjusted. ! !----------------------------------------------------------------------- ! ELSE iout(INDEX+1) = ior(IAND(NOT(mask),iout(INDEX+1)),j) END IF ii = ii + ibits INDEX = INDEX + iwords IF (ii >= nbitsw) THEN ii = ii - nbitsw INDEX = INDEX + 1 END IF END DO RETURN END SUBROUTINE grbsbytes ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GRBGBYTE ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE grbgbyte(in,iout,iskip,nbits) 156 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Extract nwrd bitstrings, nbits bits long, and store them right ! justified 0 fill, into IOUT. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dr. Robert C. Gammill, Consultant, NCAR ! May 1972 ! ! MODIFICATIONS: ! ! 12/20/95 (Yuhe Liu) ! Converted to ARPS standard format and added documents ! !----------------------------------------------------------------------- ! ! INPUT: ! ! in Integer array to be packed ! iskip ! nbits bits number of packing ! ! OUTPUT: ! ! iout Packed stream ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: in(*) INTEGER :: nbits INTEGER :: iskip INTEGER :: iout ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: ii INTEGER :: icon, INDEX INTEGER :: mask INTEGER :: movel, mover INTEGER :: nbitsw DATA nbitsw/32/ ! !----------------------------------------------------------------------- ! ! Masks table put in decimal so it will compile on any 32 bit ! computer ! ! DATA MASKS /Z'00000001',Z'00000003',Z'00000007',Z'0000000F', ! : Z'0000001F',Z'0000003F',Z'0000007F',Z'000000FF', ! : Z'000001FF',Z'000003FF',Z'000007FF',Z'00000FFF', ! : Z'00001FFF',Z'00003FFF',Z'00007FFF',Z'0000FFFF', ! : Z'0001FFFF',Z'0003FFFF',Z'0007FFFF',Z'000FFFFF', ! : Z'001FFFFF',Z'003FFFFF',Z'007FFFFF',Z'00FFFFFF', ! : Z'01FFFFFF',Z'03FFFFFF',Z'07FFFFFF',Z'0FFFFFFF', ! : Z'1FFFFFFF',Z'3FFFFFFF',Z'7FFFFFFF',Z'FFFFFFFF'/ ! !----------------------------------------------------------------------- ! INTEGER :: masks(32) DATA masks / 1, 3, 7, 15, & 31, 63, 127, 255, & 511, 1023, 2047, 4095, & 8191, 16383, 32767, 65535, & 131071, 262143, 524287, 1048575, & 2097151, 4194303, 8388607, 16777215, & 33554431, 67108863, 134217727, 268435455, & 536870911, 1073741823, 2147483647, -1/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! NBYTE must be less than or equal to nbitsw ! !----------------------------------------------------------------------- ! icon = nbitsw - nbits IF (icon < 0) RETURN mask = masks(nbits) ! !----------------------------------------------------------------------- ! ! Index tells how many words into the array 'in' the next byte appears. ! !----------------------------------------------------------------------- ! INDEX = ishft(iskip,-5) ! !----------------------------------------------------------------------- ! ! II tells how many bits the byte is from the left side of the word. ! !----------------------------------------------------------------------- ! ii = MOD(iskip,nbitsw) ! !----------------------------------------------------------------------- ! ! MOVER specifies how far to the right a byte must be moved in order ! to be right adjusted. ! !----------------------------------------------------------------------- ! mover = icon - ii ! !----------------------------------------------------------------------- ! ! The byte is split across a word break. ! !----------------------------------------------------------------------- ! IF (mover < 0) THEN movel = - mover mover = nbitsw - movel iout = IAND( ior(ishft(in(INDEX+1),movel), & ishft(in(INDEX+2),-mover)), mask ) ! !----------------------------------------------------------------------- ! ! Right adjust the byte. ! !----------------------------------------------------------------------- ! ELSE IF (mover > 0) THEN iout = IAND(ishft(in(INDEX+1),-mover),mask) ! !----------------------------------------------------------------------- ! ! The byte is already right adjusted. ! !----------------------------------------------------------------------- ! ELSE iout = IAND(in(INDEX+1),mask) END IF RETURN END SUBROUTINE grbgbyte ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GRBGBYTES ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE grbgbytes(in,iout,iskip,nbits,nskip,nwrd) 7 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Extract nwrd bitstrings, nbits bits long, and store them right ! justified 0 fill, into successive words of IOUT. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dr. Robert C. Gammill, Consultant, NCAR ! May 1972 ! ! MODIFICATIONS: ! ! 12/05/95 (Yuhe Liu) ! Converted to ARPS standard format and added documents ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nwrd Number of word to be packed ! in Integer array to be packed ! iskip ! nbits bits number of packing ! nskip ! ! OUTPUT: ! ! iout Packed stream ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nwrd INTEGER :: in(nwrd) INTEGER :: nbits INTEGER :: iskip INTEGER :: nskip INTEGER :: iout(nwrd) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, ii INTEGER :: ibits INTEGER :: icon, INDEX INTEGER :: mask INTEGER :: movel, mover, iwords, istep INTEGER :: nbitsw DATA nbitsw/32/ ! !----------------------------------------------------------------------- ! ! Masks table put in decimal so it will compile on any 32 bit ! computer ! ! DATA MASKS /Z'00000001',Z'00000003',Z'00000007',Z'0000000F', ! : Z'0000001F',Z'0000003F',Z'0000007F',Z'000000FF', ! : Z'000001FF',Z'000003FF',Z'000007FF',Z'00000FFF', ! : Z'00001FFF',Z'00003FFF',Z'00007FFF',Z'0000FFFF', ! : Z'0001FFFF',Z'0003FFFF',Z'0007FFFF',Z'000FFFFF', ! : Z'001FFFFF',Z'003FFFFF',Z'007FFFFF',Z'00FFFFFF', ! : Z'01FFFFFF',Z'03FFFFFF',Z'07FFFFFF',Z'0FFFFFFF', ! : Z'1FFFFFFF',Z'3FFFFFFF',Z'7FFFFFFF',Z'FFFFFFFF'/ ! !----------------------------------------------------------------------- ! INTEGER :: masks(32) DATA masks / 1, 3, 7, 15, & 31, 63, 127, 255, & 511, 1023, 2047, 4095, & 8191, 16383, 32767, 65535, & 131071, 262143, 524287, 1048575, & 2097151, 4194303, 8388607, 16777215, & 33554431, 67108863, 134217727, 268435455, & 536870911, 1073741823, 2147483647, -1/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! NBYTE must be less than or equal to nbitsw ! !----------------------------------------------------------------------- ! icon = nbitsw - nbits IF (icon < 0) RETURN mask = masks(nbits) ! !----------------------------------------------------------------------- ! ! Index tells how many words into the array 'in' the next byte appears. ! !----------------------------------------------------------------------- ! INDEX = ishft(iskip,-5) ! !----------------------------------------------------------------------- ! ! II tells how many bits the byte is from the left side of the word. ! !----------------------------------------------------------------------- ! ii = MOD(iskip,nbitsw) ! !----------------------------------------------------------------------- ! ! ISTEP is the distance in bits from the start of one byte to the next. ! !----------------------------------------------------------------------- ! istep = nbits + nskip ! !----------------------------------------------------------------------- ! ! IWORDS tells how many words to skip from one byte to the next. ! !----------------------------------------------------------------------- ! iwords = istep / nbitsw ! !----------------------------------------------------------------------- ! ! IBITS tells how many bits to skip after skipping iwords. ! !----------------------------------------------------------------------- ! ibits = MOD(istep,nbitsw) DO i = 1,nwrd ! !----------------------------------------------------------------------- ! ! MOVER specifies how far to the right a byte must be moved in order ! to be right adjusted. ! !----------------------------------------------------------------------- ! mover = icon - ii ! !----------------------------------------------------------------------- ! ! The byte is split across a word break. ! !----------------------------------------------------------------------- ! IF (mover < 0) THEN movel = - mover mover = nbitsw - movel iout(i) = IAND( ior(ishft(in(INDEX+1),movel), & ishft(in(INDEX+2),-mover)),mask ) ! !----------------------------------------------------------------------- ! ! Right adjust the byte. ! !----------------------------------------------------------------------- ! ELSE IF (mover > 0) THEN iout(i) = IAND(ishft(in(INDEX+1),-mover),mask) ! !----------------------------------------------------------------------- ! ! The byte is already right adjusted. ! !----------------------------------------------------------------------- ! ELSE iout(i) = IAND(in(INDEX+1),mask) END IF ! !----------------------------------------------------------------------- ! ! Increment ii and index. ! !----------------------------------------------------------------------- ! ii = ii + ibits INDEX = INDEX + iwords IF (ii >= nbitsw) THEN ii = ii - nbitsw INDEX = INDEX + 1 END IF END DO RETURN END SUBROUTINE grbgbytes REAL FUNCTION f_cputime() 31 ! !----------------------------------------------------------------------- ! ! Function to measure the CPU time usage. ! SUN/DEC DEFINITION FOR TIMING ! !----------------------------------------------------------------------- ! REAL :: tmp(2) f_cputime = etime(tmp) RETURN END FUNCTION f_cputime INTEGER FUNCTION lnblnk(str),3 CHARACTER (LEN=*) :: str lnblnk = LEN(str) CALL strlnth( str, lnblnk) RETURN END FUNCTION lnblnk