!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRIBDEC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gribdec(npts,nlev, & 3,12
wdlen,ipds,igds,ibdshd,nbufsz,mgrib, &
fvar,ivar, bds,ibds)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Make a GRIB message for variable fvar or ivar for given PDS and
! GDS.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/05/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! npts Number of grid points
! nlev Number of levels
!
! wdlen Length of machine word
!
! ipds Integer array of PDS
! igds Integer array of GDS
! ibdshd Integer array of BDS header
!
! nbufsz Buffer size of GRIB message
! msglen Length of the GRIB message
! mgrib Buffer carrying the GRIB message
!
! OUTPUT:
!
! pds PDS (GRIB Section 1).
! gds GDS (GRIB Section 3).
! bds BDS except the first 11 octets header
! ibds BDS's integer array
!
! fvar Floating array to be written into GRIB file
! ivar Integer array to be written into GRIB file
!
! TEMPORARY:
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: npts ! Number of grid points
INTEGER :: nlev ! Number of levels
INTEGER :: wdlen ! Length of machine word in bytes
INTEGER :: ipds(25)
INTEGER :: igds(25)
INTEGER :: ibdshd(4)
INTEGER :: nbufsz ! Size of GRIB message array
CHARACTER (LEN=1) :: mgrib(nbufsz) ! GRIB message array
REAL :: fvar(npts) ! Floating array
INTEGER :: ivar(npts) ! Integer array
INTEGER :: ibds(nbufsz/4) ! Identical to BDS
CHARACTER (LEN=1) :: bds(nbufsz) ! BDS
!
!-----------------------------------------------------------------------
!
! Local GRIB parameters
!
!-----------------------------------------------------------------------
!
INTEGER :: bdslen
INTEGER :: pdslen
INTEGER :: gdslen
INTEGER :: msglen ! Length of GRIB message
CHARACTER (LEN=1) :: pds(28) ! PDS
CHARACTER (LEN=1) :: gds(42) ! GDS
CHARACTER (LEN=1) :: bdshd(11) ! BDS header
INTEGER :: ipdsin(25)
INTEGER :: igdsin(25)
INTEGER :: ibdshdin(4)
INTEGER :: iver,bwidth,bscl
INTEGER :: itema
REAL :: vref, scale
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i
INTEGER :: npos, iskip1, iskip2
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
npos = 0
iskip1 = 0
iskip2 = 0
!
!-----------------------------------------------------------------------
!
! Check if the record is a GRIB message
!
!-----------------------------------------------------------------------
!
iver = ICHAR(mgrib(8))
IF ( mgrib(1) /= 'G' .OR. mgrib(2) /= 'R' .OR. &
mgrib(3) /= 'I' .OR. mgrib(4) /= 'B' ) THEN
WRITE (6,'(a/a)') &
'Error: this record is not GRIB message', &
'Program stopped in GRIBDEC'
CALL arpsstop
('arpsstop called from gribdec mgrib error',1)
ELSE IF ( iver /= 1 ) THEN
WRITE (6,'(a,i1/a)') &
'Error: GRIB version ID was not correct, iver = ',iver, &
'Program stopped in GRIBDEC'
CALL arpsstop
('arpsstop called from gribdec iver error ',1)
END IF
msglen = ICHAR(mgrib(5))*65536 &
+ ICHAR(mgrib(6))*256 &
+ ICHAR(mgrib(7))
npos = npos + 8
!
!-----------------------------------------------------------------------
!
! Get IPDS - GRIB Section 1
!
!-----------------------------------------------------------------------
!
pdslen = ICHAR(mgrib(npos+1))*65536 &
+ ICHAR(mgrib(npos+2))*256 &
+ ICHAR(mgrib(npos+3))
IF ( pdslen /= 28 ) THEN
WRITE (6,'(a,i5/a)') &
'PDS length is not equal to 28, pdslen = ',pdslen, &
'Program stopped in GRIBDEC.'
CALL arpsstop
('arpsstop called from gribdec pdslen error',1)
END IF
DO i=1,pdslen
pds(i) = mgrib(npos+i)
END DO
npos = npos + pdslen
CALL gtipds
( pds, ipdsin )
IF ( ipdsin(8) /= ipds(8) .OR. ipdsin(9) /= ipds(9) ) THEN
WRITE (6,'(a)') 'ERROR, variable mismatch (ipds 8 or 9).'
GO TO 150
END IF
IF ( ipds(25) /= 0 ) THEN
WRITE (6,'(a,i6,a)') &
'Incorrect decimal scale factor, D-scale = ',ipds(25), &
'ARPS GRIB dump should always has zero D-scale.'
GO TO 150
END IF
DO i=1,25
IF ( ipdsin(i) /= ipds(i) ) THEN
WRITE (6,'(a,i2)') &
'WARNING: A difference was found in IPDS(i): i = ',i
END IF
END DO
! 120 GO TO 170
GO TO 170
150 CONTINUE
WRITE (6,'(a)') &
' i ipds ipdsin'
DO i=1,25
WRITE (6,'(i2,4x,i8,4x,i8)') i, ipds(i),ipdsin(i)
END DO
WRITE (6,*) 'ERROR, critical mismatch found in ', &
'grib file, subroutine GRIBDEC, ABORTING.'
CALL arpsstop
('arpsstop called from gribdec file mismatch error',1)
170 CONTINUE
!
!-----------------------------------------------------------------------
!
! Get IGDS - GRIB Section 2
!
!-----------------------------------------------------------------------
!
gdslen = ICHAR(mgrib(npos+1))*65536 &
+ ICHAR(mgrib(npos+2))*256 &
+ ICHAR(mgrib(npos+3))
DO i=1,gdslen
gds(i) = mgrib(npos+i)
END DO
npos = npos + gdslen
CALL gtigds
( gds,igdsin )
! DO 210 i=1,5
! IF ( igdsin(i).ne.igds(i) ) THEN
! write (6,'(a,i2)')
! : 'Error: A difference was found in IGDS(i): i = ',i
! GOTO 230
! ENDIF
!210 CONTINUE
GO TO 250
! 230 CONTINUE
! DO i=1,25
! WRITE (6,'(i2,4x,i8,4x,i8)') i, igds(i),igdsin(i)
! END DO
! WRITE (6,'(a)') 'Program stopped in GRIBDEC.'
! CALL arpsstop("arpsstop called from gribdec at 230",1)
250 CONTINUE
! DO 220 i=6,25
! IF ( igdsin(i).ne.igds(i) ) THEN
! write (6,'(a/a)')
! : 'Warning: Data read in may contain errors.',
! : 'A difference was found between IGDS and read-in IGDS:'
! write (6,'(i2,4x,i8,4x,i8)') i, igds(i),igdsin(i)
! ENDIF
!220 CONTINUE
!
!-----------------------------------------------------------------------
!
! Making BDS - GRIB Section 4
!
!-----------------------------------------------------------------------
!
DO i=1,11
bdshd(i) = mgrib(npos+i)
END DO
npos = npos + 11
bdslen = ICHAR(bdshd(1))*65536 &
+ ICHAR(bdshd(2))*256 &
+ ICHAR(bdshd(3))
itema = ICHAR(bdshd(4))
ibdshdin(1) = ishft(IAND(itema,128),-7)
ibdshdin(2) = ishft(IAND(itema, 64),-6)
ibdshdin(3) = ishft(IAND(itema, 32),-5)
ibdshdin(4) = ishft(IAND(itema, 16),-4)
DO i=1,4
IF ( ibdshdin(i) /= ibdshd(i) ) THEN
WRITE (6,'(a,i2.2,a,i4,a,i2.2,a,i4/a)') &
'Error in read-in IBDSHD: ibdshdin(',i,') = ', ibdshdin(i), &
', ibdshd(',i,') = ', ibdshd(i), &
'Program stopped in GRIBDEC'
CALL arpsstop
('arpsstop called from gribdec in reading ibdshd',1)
END IF
END DO
bscl = ICHAR(bdshd(5))*256 + ICHAR(bdshd(6))
IF ( bscl > 32768 ) bscl = 32768 - bscl
IF ( ibdshd(3) == 1 .AND. bscl /= 0 ) THEN
WRITE (6,'(a,a,i2,a,i6)') &
'The binary scale factor should be zero for ', &
'original integer data. itype = ',ibdshd(3),', b-scale = ',bscl, &
'Program stopped in GRIBDEC'
CALL arpsstop
('arpsstop called from gribdec with bscl ',1)
END IF
scale = 2.**bscl
CALL ibm2flt
( bdshd(7), vref )
! write (6,'(a,e20.12)')
! :'The reference value is Vref = ',vref
bwidth = ICHAR(bdshd(11))
DO i=1,bdslen-11
bds(i) = mgrib(npos+i)
END DO
npos = npos + bdslen - 11
IF ( bwidth /= 0 ) THEN
CALL grbgbytes
( ibds,ivar,iskip1,bwidth,iskip2, npts )
ELSE
DO i=1,npts
ivar(i) = 0
END DO
END IF
IF ( ibdshd(3) == 0 ) THEN
DO i=1,npts
fvar(i) = FLOAT(ivar(i)) * scale + vref
END DO
ELSE
DO i=1,npts
ivar(i) = ivar(i) + nint(vref)
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Check the end of GRIB message: '7777'
!
!-----------------------------------------------------------------------
!
DO i=1,4
IF ( mgrib(npos+i) /= '7' ) THEN
WRITE (6,'(a)') &
'Incorrect GRIB end flag: ',mgrib(npos+i), &
'It should be alway character ''7''.', &
'Program stopped in GRIBDEC'
CALL arpsstop
('arpsstop called from gribdec message 7777',1)
END IF
END DO
npos = npos + 4
IF ( npos /= msglen ) THEN
WRITE (6,'(a/a,i8,a,i8)') &
'The GRIB message length was incorrect.', &
'npos = ',npos, ' msglen = ',msglen
CALL arpsstop
('arpsstop called from gribdec with msglen',1)
END IF
RETURN
END SUBROUTINE gribdec
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RDHISHD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rdhishd(nx,ny,nz,inch,grdbas, fmtver, time, x,y,z, & 1,20
nbufsz,mgrib)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read the header of ARPS history dump by using GRIB representation
! to floating point numbers.
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/29/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! inch I/O unit of the history file
!
! grdbas Flag for grid and base state dump
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
!
! fmtver Format and version identical
!
! nbufsz Buffer size of the GRIB message
!
! OUTPUT:
!
! mgrib String containing the header of ARPS history dump
!
! WORK ARRAY:
!
!-----------------------------------------------------------------------
!
! The following parameters are passed into this subroutine through
! a common block in globcst.inc, and they determine which
! variables are output.
!
! grdout =0 or 1. If grdout=0, grid variables are not dumped.
! basout =0 or 1. If basout=0, base state variables are not dumped.
! varout =0 or 1. If varout=0, model perturbation variables are not dumped.
! mstout =0 or 1. If mstout=0, water variables are not dumped.
! rainout=0 or 1. If rainout=0, rain variables are not dumped.
! prcout =0 or 1. If prcout=0, precipitation rates are not dumped.
! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped.
! tkeout =0 or 1. If tkeout=0, tke is not dumped.
! trbout =0 or 1. If trbout=0, kmh and kmv are not dumped.
! sfcout =0 or 1. If sfcout=0, surface variables are not dumped.
! landout=0 or 1. If landout=0, surface propertty arrays are not dumped.
! ...
!
! These following parameters are also passed in through common
! blocks in globcst.inc.
!
! runname,curtim,umove,vmove,xgrdorg,ygrdorg
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: inch ! I/O unit
INTEGER :: grdbas ! Flag for grid and base state dump
CHARACTER (LEN=40) :: fmtverin
REAL :: x(nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y(ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z(nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
CHARACTER (LEN=40) :: fmtver
INTEGER :: nbufsz
CHARACTER (LEN=1) :: mgrib(nbufsz) ! Header of ARPS GRIB file
REAL :: time
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: nxin,nyin,nzin
INTEGER :: npos,hhdlen
INTEGER :: i,j,k
! integer idummy
! real rdummy
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'indtflg.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
READ (inch) (mgrib(i),i=1,3)
npos = 0
hhdlen = ICHAR(mgrib(npos+1))*65536 &
+ ICHAR(mgrib(npos+2))*256 &
+ ICHAR(mgrib(npos+3))
BACKSPACE (inch)
READ (inch) (mgrib(i),i=1,hhdlen)
npos = npos + 3
DO i=1,40
fmtverin(i:i) = mgrib(npos+i)
END DO
IF ( fmtverin /= fmtver ) THEN
WRITE (6,'(/1x,a,/1x,2a,/1x,3a)') &
'Data format incompatible with the data reader.', &
'Format of data is ',fmtverin,' Format of reader is ',fmtver, &
'. Job stopped.'
CALL arpsstop
('arpsstop called from rdhishd with fmtver',1)
END IF
npos = npos + 40
DO i=1,80
runname(i:i) = mgrib(npos+i)
END DO
npos = npos + 80
nocmnt = ICHAR(mgrib(npos+1))
npos = npos + 1
IF( nocmnt > 0 ) THEN
DO j=1,nocmnt
DO i=1,80
cmnt(j)(i:i) = mgrib(npos+i)
END DO
npos = npos + 80
END DO
END IF
CALL ibm2flt
( mgrib(npos+1), time )
npos = npos + 4
nxin = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
nyin = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
nzin = ICHAR(mgrib(npos+1))*256 + ICHAR(mgrib(npos+2))
npos = npos + 2
IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN
WRITE (6,'(1x,a/1x,3(a,I4)/1x,3(a,I4)/1x,a)') &
'Dimensions in RDHISHD inconsistent with data.', &
'nx = ', nx, ' ny = ', ny, ' nz = ', nz, &
'nxin = ', nxin, ' nyin = ', nyin, ' nzin = ', nzin, &
'Program aborted in RDHISHD.'
CALL arpsstop
('arpsstop called from rdhishd with nxin...',1)
END IF
grdin = ICHAR(mgrib(npos+1))
basin = ICHAR(mgrib(npos+2))
varin = ICHAR(mgrib(npos+3))
mstin = ICHAR(mgrib(npos+4))
icein = ICHAR(mgrib(npos+5))
trbin = ICHAR(mgrib(npos+6))
sfcin = ICHAR(mgrib(npos+7))
rainin = ICHAR(mgrib(npos+8))
landin = ICHAR(mgrib(npos+9))
totin = ICHAR(mgrib(npos+10))
tkein = ICHAR(mgrib(npos+11))
mapproj = ICHAR(mgrib(npos+14))
month = ICHAR(mgrib(npos+15))
day = ICHAR(mgrib(npos+16))
year = ICHAR(mgrib(npos+17))*256 + ICHAR(mgrib(npos+18))
hour = ICHAR(mgrib(npos+19))
minute = ICHAR(mgrib(npos+20))
second = ICHAR(mgrib(npos+21))
npos = npos + 21
CALL ibm2flt
( mgrib(npos+1), umove )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), vmove )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), xgrdorg )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), ygrdorg )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), trulat1 )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), trulat2 )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), trulon )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), sclfct )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
! CALL ibm2flt( mgrib(npos+1), rdummy )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), tstop )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), thisdmp )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), latitud )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), ctrlat )
npos = npos + 4
CALL ibm2flt
( mgrib(npos+1), ctrlon )
npos = npos + 4
IF ( totin /= 0 ) THEN
nstyp = ICHAR(mgrib(npos+1))
IF ( nstyp < 0 ) THEN
nstyp = 1
END IF
npos = npos + 1
!
!-----------------------------------------------------------------------
!
! Reserve 20 integers for future compatibility.
!
!-----------------------------------------------------------------------
!
prcin = ICHAR(mgrib(npos+1))
npos = npos + 1
radin = ICHAR(mgrib(npos+1))
npos = npos + 1
flxin = ICHAR(mgrib(npos+1))
npos = npos + 1
snowcin = ICHAR(mgrib(npos+1))
npos = npos + 1
snowin = ICHAR(mgrib(npos+1))
npos = npos + 1
DO i=6,20
! idummy = ichar(mgrib(npos+1))
npos = npos + 1
END DO
DO i=0,16,4
! CALL ibm2flt( mgrib(npos+i+1), rdummy )
npos = npos + 4
END DO
END IF
!
!-----------------------------------------------------------------------
!
! If grdout=1 or grdbas=1, write out grid variables
!
!-----------------------------------------------------------------------
!
IF( grdin == 1 .OR. grdbas == 1 ) THEN
DO i=1,nx
CALL ibm2flt
( mgrib(npos+1), x(i) )
npos = npos + 4
END DO
DO j=1,ny
CALL ibm2flt
( mgrib(npos+1), y(j) )
npos = npos + 4
END DO
DO k=1,nz
CALL ibm2flt
( mgrib(npos+1), z(k) )
npos = npos + 4
END DO
END IF
IF ( npos /= hhdlen ) THEN
WRITE (6,'(1x,a,i6,a,i6/a)') &
'Length of header was incorrect. npos = ',npos, &
', hhdlen = ',hhdlen, &
'Program stopped in GTHISHD'
CALL arpsstop
('arpsstop called from ghishd with npos ',1)
END IF
RETURN
END SUBROUTINE rdhishd
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE IBM2FLT ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE ibm2flt( cibm, flt ) 19
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Convert GRIB IBM floating representation to machine floating
! number.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/29/1995
! MODIFICATIONS:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! cibm 4 bytes character string containing GRIB IBM format
! floating representation
!
! OUTPUT:
!
! flt Machine dependent floating number
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
CHARACTER (LEN=1) :: cibm(4)
REAL :: flt
!
!-----------------------------------------------------------------------
!
! Local variables
!
!-----------------------------------------------------------------------
!
REAL :: tema
INTEGER :: ISIGN
INTEGER :: iexp,imant
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
iexp = ICHAR(cibm(1))
IF ( iexp > 127 ) THEN
iexp = iexp - 128
ISIGN = -1
ELSE
ISIGN = 1
END IF
imant = ICHAR(cibm(2))*65536 &
+ ICHAR(cibm(3))*256 &
+ ICHAR(cibm(4))
tema = 16.0**(iexp-70)
flt = FLOAT(ISIGN*imant)*tema
RETURN
END SUBROUTINE ibm2flt
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GTIPDS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gtipds( pds,ipds ) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Make PDS from ipds
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/30/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! pds PDS (GRIB Section 1).
!
! OUTPUT:
!
! ipds Integer array of PDS
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
CHARACTER (LEN=1) :: pds(28) ! PDS
INTEGER :: ipds(25)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Initialize array ipds
!
!-----------------------------------------------------------------------
!
DO i=1,25
ipds(i) = 0
END DO
!
!-----------------------------------------------------------------------
!
! Put pds into ipds
!
!-----------------------------------------------------------------------
!
ipds(1) = ICHAR(pds(1))*65536 &
+ ICHAR(pds(2))*256 &
+ ICHAR(pds(3))
ipds(2) = ICHAR(pds(4))
ipds(3) = ICHAR(pds(5))
ipds(4) = ICHAR(pds(6))
ipds(5) = ICHAR(pds(7))
i = ICHAR(pds(8))
ipds(6) = ishft(IAND(i,128),-7)
ipds(7) = ishft(IAND(i, 64),-6)
ipds(8) = ICHAR(pds(9))
ipds(9) = ICHAR(pds(10))
!
!-----------------------------------------------------------------------
!
! check if level is in two octets or one
!
!-----------------------------------------------------------------------
!
i = ipds(9)
IF ( (i >= 1.AND.i <= 100).OR.i == 102.OR. &
i == 103.OR.i == 105.OR.i == 107.OR. &
i == 109.OR.i == 111.OR.i == 113.OR. &
i == 115.OR.i == 125.OR.i == 160.OR. &
i == 200.OR.i == 201 ) THEN
ipds(11) = ICHAR(pds(11))*256 &
+ ICHAR(pds(12)) ! one level stored two bytes
IF ( ipds(11) > 32768 ) THEN
ipds(11) = 32768 - ipds(11) ! positive integer for the abs(level)
END IF
ELSE
ipds(10) = ICHAR(pds(11))
ipds(11) = ICHAR(pds(12))
END IF
ipds(12) = ICHAR(pds(13))
ipds(13) = ICHAR(pds(14))
ipds(14) = ICHAR(pds(15))
ipds(15) = ICHAR(pds(16))
ipds(16) = ICHAR(pds(17))
ipds(17) = ICHAR(pds(18))
!
!-----------------------------------------------------------------------
!
! Check if time P1 is in two octets or one
!
!-----------------------------------------------------------------------
!
ipds(20) = ICHAR(pds(21))
IF (ipds(20) == 10) THEN
ipds(18) = ICHAR(pds(19))*256 &
+ ICHAR(pds(20))
ELSE
ipds(18) = ICHAR(pds(19))
ipds(19) = ICHAR(pds(20))
END IF
ipds(21) = ICHAR(pds(22))*256 &
+ ICHAR(pds(23))
ipds(22) = ICHAR(pds(24))
ipds(23) = ICHAR(pds(25))
ipds(24) = ICHAR(pds(26))
ipds(25) = ICHAR(pds(27))*256 &
+ ICHAR(pds(28))
IF ( ipds(25) > 32768 ) THEN
ipds(25) = 32768 - ipds(25) ! negative value
END IF
RETURN
END SUBROUTINE gtipds
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GTIGDS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gtigds(gds,igds) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Make GDS from igds
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 11/05/1995
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! gds GDS
!
! OUTPUT:
!
! igds Integer array of GDS
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
CHARACTER (LEN=1) :: gds(42) ! GDS
INTEGER :: igds(25)
!
!-----------------------------------------------------------------------
!
! Local GRIB parameters
!
!-----------------------------------------------------------------------
!
INTEGER :: i
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Initialize array igds
!
!-----------------------------------------------------------------------
!
DO i=1,25
igds(i) = 0
END DO
!
!-----------------------------------------------------------------------
!
! Put GDS length in bytes 1,2,3
!
!-----------------------------------------------------------------------
!
igds(1) = ICHAR(gds(4)) ! nz use one byte
igds(2) = ICHAR(gds(5)) ! = 255, N/A for PV & PL
igds(3) = ICHAR(gds(6)) ! data representation
igds(8) = ICHAR(gds(17)) ! resolution and u&v component flag
!
!-----------------------------------------------------------------------
!
! ARPS only support 3 types of projection
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Mercator projection
!
!-----------------------------------------------------------------------
!
IF ( igds(3) == 1 ) THEN
igds(4) = ICHAR(gds(7))*256 + ICHAR(gds(8)) ! nx
igds(5) = ICHAR(gds(9))*256 + ICHAR(gds(10)) ! ny
igds(6) = ICHAR(gds(11))*65536 & ! latitude of 1st point
+ ICHAR(gds(12))*256 &
+ ICHAR(gds(13))
IF ( igds(6) > 8388608 ) THEN
igds(6) = 8388608 - igds(6) ! negative value
END IF
igds(7) = ICHAR(gds(14))*65536 & ! longitude of 1st point
+ ICHAR(gds(15))*256 &
+ ICHAR(gds(16))
IF ( igds(7) > 8388608 ) THEN
igds(7) = 8388608 - igds(7) ! negative value
END IF
igds(9) = ICHAR(gds(18))*65536 & ! latitude of last point
+ ICHAR(gds(19))*256 &
+ ICHAR(gds(20))
IF ( igds(9) > 8388608 ) THEN
igds(9) = 8388608 - igds(9) ! negative value
END IF
igds(10) = ICHAR(gds(21))*65536 & ! longitude of last point
+ ICHAR(gds(22))*256 &
+ ICHAR(gds(23))
IF ( igds(10) > 8388608 ) THEN
igds(10) = 8388608 - igds(10) ! negative value
END IF
igds(11) = ICHAR(gds(32))*65536 & ! d(lat) in milidegree
+ ICHAR(gds(33))*256 &
+ ICHAR(gds(34))
igds(12) = ICHAR(gds(29))*65536 & ! d(lon) in milidegree
+ ICHAR(gds(30))*256 &
+ ICHAR(gds(31))
igds(13) = ICHAR(gds(24))*65536 & ! true latitude
+ ICHAR(gds(25))*256 &
+ ICHAR(gds(26))
igds(14) = ICHAR(gds(28))
!
!-----------------------------------------------------------------------
!
! Lambert Conformal projection
!
!-----------------------------------------------------------------------
!
ELSE IF ( igds(3) == 3 ) THEN
igds(4) = ICHAR(gds(7))*256 & ! nx
+ ICHAR(gds(8))
igds(5) = ICHAR(gds(9))*256 & ! ny
+ ICHAR(gds(10))
igds(6) = ICHAR(gds(11))*65536 &
+ ICHAR(gds(12))*256 &
+ ICHAR(gds(13))
IF ( igds(6) > 8388608 ) THEN
igds(6) = 8388608 - igds(6) ! negative value
END IF
igds(7) = ICHAR(gds(14))*65536 &
+ ICHAR(gds(15))*256 &
+ ICHAR(gds(16))
IF ( igds(7) > 8388608 ) THEN
igds(7) = 8388608 - igds(7) ! negative value
END IF
igds(9) = ICHAR(gds(18))*65536 &
+ ICHAR(gds(19))*256 &
+ ICHAR(gds(20))
IF ( igds(9) > 8388608 ) THEN
igds(9) = 8388608 - igds(9) ! negative value
END IF
igds(10) = ICHAR(gds(21))*65536 & ! dx
+ ICHAR(gds(22))*256 &
+ ICHAR(gds(23))
igds(11) = ICHAR(gds(24))*65536 & ! dy
+ ICHAR(gds(25))*256 &
+ ICHAR(gds(26))
igds(12) = ICHAR(gds(27))
igds(13) = ICHAR(gds(28))
igds(15) = ICHAR(gds(29))*65536 & ! 1st true latitude
+ ICHAR(gds(30))*256 &
+ ICHAR(gds(31))
igds(16) = ICHAR(gds(32))*65536 & ! 2nd true latitude
+ ICHAR(gds(33))*256 &
+ ICHAR(gds(34))
igds(17) = ICHAR(gds(35))*65536 & ! latitude of south pole
+ ICHAR(gds(36))*256 &
+ ICHAR(gds(37))
IF ( igds(17) > 8388608 ) THEN
igds(17) = 8388608 - igds(17) ! negative value
END IF
igds(18) = ICHAR(gds(38))*65536 & ! longitude of south pole
+ ICHAR(gds(39))*256 &
+ ICHAR(gds(40))
IF ( igds(18) > 8388608 ) THEN
igds(18) = 8388608 - igds(18) ! negative value
END IF
!
!-----------------------------------------------------------------------
!
! Polar stereographic projection
!
!-----------------------------------------------------------------------
!
ELSE IF ( igds(3) == 5 ) THEN
igds(4) = ICHAR(gds(7))*256 & ! nx
+ ICHAR(gds(8))
igds(5) = ICHAR(gds(9))*256 & ! ny
+ ICHAR(gds(10))
igds(6) = ICHAR(gds(11))*65536 & ! latitude of 1st point
+ ICHAR(gds(12))*256 &
+ ICHAR(gds(13))
IF ( igds(6) > 8388608 ) THEN
igds(6) = 8388608 - igds(6) ! negative value
END IF
igds(7) = ICHAR(gds(14))*65536 & ! longitude of 1st point
+ ICHAR(gds(15))*256 &
+ ICHAR(gds(16))
IF ( igds(7) > 8388608 ) THEN
igds(7) = 8388608 - igds(7) ! negative value
END IF
igds(9) = ICHAR(gds(18))*65536 & ! true longitude
+ ICHAR(gds(19))*256 &
+ ICHAR(gds(20))
IF ( igds(9) > 8388608 ) THEN
igds(9) = 8388608 - igds(9) ! negative value
END IF
igds(10) = ICHAR(gds(21))*65536 & ! dx
+ ICHAR(gds(22))*256 &
+ ICHAR(gds(23))
igds(11) = ICHAR(gds(24))*65536 & ! dy
+ ICHAR(gds(25))*256 &
+ ICHAR(gds(26))
igds(12) = ICHAR(gds(27))
igds(13) = ICHAR(gds(28))
END IF
RETURN
END SUBROUTINE gtigds