!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE RDRADCOL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE rdradcol(nx,ny,nz,nsrc_rad,nvar_radin, & 2,37
mx_rad,nz_rdr,mx_colrad,mx_pass, &
radistride,radkstride, &
iuserad,iusechk,npass,nradfil,radfname, &
srcrad,isrcrad,stnrad,latrad,lonrad,elvrad, &
latradc,lonradc,irad,nlevrad,hgtradc,obsrad, &
ncolrad,istatus,tem1,tem2,tem3,tem4,tem5,tem6)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar data stored as columns on a remapped grid.
! This allows the remapping to occur on a different grid
! than the analysis and allows the radar data to be treated
! as "soundings".
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! August, 1995
!
! MODIFICATION HISTORY:
!
! 04/25/02 (Keith Brewster)
! Added stride processing for data thinning, when desired.
!
! 05/04/02 (Leilei Wang and Keith Brewster)
! Added reading of hdf formatted files.
!
!-----------------------------------------------------------------------
!
! 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
! nsrc_rad number of sources of radar data
! nvar_radin number of variables in the obsrad array
! mx_rad maximum number of radars
! nz_rdr maximum number of levels in a radar column
! mx_colrad maximum number of radar columns
!
! nradfil number of radar files
! radfname file name for radar datasets
! srcrad name of radar sources
!
! OUTPUT:
!
! isrcrad index of radar source
! stnrad radar site name character*4
! latrad latitude of radar (degrees N)
! lonrad longitude of radar (degrees E)
! elvrad elevation of feed horn of radar (m MSL)
! latradc latitude of radar column (degrees N)
! lonradc longitude of radar column (degrees E)
! irad radar number of each column
! nlevrad number of levels of radar data in each column
! hgtradc height (m MSL) of radar observations
! obsrad radar observations
! ncolrad number of radar columns read-in
! istatus status indicator
!
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nsrc_rad,nvar_radin,mx_rad,nz_rdr,mx_colrad
INTEGER :: mx_pass
!
INTEGER :: radistride
INTEGER :: radkstride
INTEGER :: iuserad(0:nsrc_rad,mx_pass)
INTEGER :: iusechk
INTEGER :: npass
!
INTEGER :: nradfil
CHARACTER (LEN=132) :: radfname(mx_rad)
!
!-----------------------------------------------------------------------
!
! Radar site variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=8) :: srcrad(nsrc_rad)
INTEGER :: isrcrad(mx_rad)
REAL :: latrad(mx_rad),lonrad(mx_rad)
REAL :: elvrad(mx_rad)
CHARACTER (LEN=5) :: stnrad(mx_rad)
!
!-----------------------------------------------------------------------
!
! Radar observation variables
!
!-----------------------------------------------------------------------
!
INTEGER :: irad(mx_colrad)
INTEGER :: nlevrad(mx_colrad)
REAL :: latradc(mx_colrad),lonradc(mx_colrad)
REAL :: hgtradc(nz_rdr,mx_colrad)
REAL :: obsrad(nvar_radin,nz_rdr,mx_colrad)
INTEGER :: ncolrad
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Temporary work arrays
!
!-----------------------------------------------------------------------
!
REAL :: tem1(nx,ny,nz)
REAL :: tem2(nx,ny,nz)
REAL :: tem3(nx,ny,nz)
REAL :: tem4(nx,ny,nz)
REAL :: tem5(nx,ny,nz)
REAL :: tem6(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! hdf variables and temporary arrays
!
!-----------------------------------------------------------------------
!
INTEGER, PARAMETER :: mxradvr=10
INTEGER :: iradvr(mxradvr)
!
INTEGER (KIND=selected_int_kind(4)), ALLOCATABLE :: itmp(:,:,:)
REAL, ALLOCATABLE :: hmax(:)
REAL, ALLOCATABLE :: hmin(:)
REAL, ALLOCATABLE :: latradt(:,:)
REAL, ALLOCATABLE :: lonradt(:,:)
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
REAL, PARAMETER :: velchek=-200.
REAL, PARAMETER :: refchek=-20.
!
INTEGER, PARAMETER :: nsrcradin=2
CHARACTER (LEN=8) :: srcradin(nsrcradin)
DATA srcradin /'88D-AII','88D-NIDS'/
!
CHARACTER (LEN=4) :: stn
CHARACTER (LEN=80) :: runname
CHARACTER (LEN=132) :: fname
INTEGER :: ireftim,itime,vcpnum,isource,idummy
INTEGER :: iradfmt,strhopt,mapprin,dmpfmt
INTEGER :: nchanl,ierr,nradvr,iradvr, ipass, ncolbgn
INTEGER :: iyr, imon, idy, ihr, imin, isec
INTEGER :: i,j,k,ivar,isrc,icstrt,icol,jcol
INTEGER :: klev,kk,krad,nfile,maxk,knt,lens,sd_id,nradvr
REAL :: dxin,dyin,dzin,dzminin,ctrlatin
REAL :: ctrlonin,tlat1in,tlat2in,tlonin,scalin,rdummy
REAL :: latcin,loncin
REAL :: xrd,yrd,elev,dummy
LOGICAL :: hdf_alloc
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
maxk=0
icol=0
istatus=0
icstrt=0
nfile=nradfil
hdf_alloc=.FALSE.
IF(nradfil == 0 ) THEN
ncolrad = 0
ELSE IF(nradfil > mx_rad) THEN
WRITE(6,'(a,i3,a,i3/a,i3,a)') &
' WARNING nradfil ',nradfil,' exceeds mx_rad dimension ', &
mx_rad,' only ',mx_rad,' files will be read.'
nfile=mx_rad
END IF
!
!-----------------------------------------------------------------------
!
! Loop through all radars
!
!-----------------------------------------------------------------------
!
DO krad=1,nfile
fname=radfname(krad)
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(fname, '-F f77 -N ieee', ierr)
lens=LEN(trim(fname))
IF (fname(lens-3:lens) == 'hdf4') THEN
dmpfmt=2
ELSE
dmpfmt=1
ENDIF
write(6,'(a,i4,a,a)') &
' rdradcol: dmpfmt=',dmpfmt,' fname=',TRIM(fname)
IF (dmpfmt == 1) THEN
WRITE(6,'(/a,a)') &
' Opening radar file ',trim(fname)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(fname),ERR=400, &
FORM='unformatted',STATUS='old')
istatus=1
!
READ(nchanl) stn
stnrad(krad)=stn
READ(nchanl) ireftim,itime,vcpnum,isource,idummy, &
idummy,idummy,idummy,idummy,idummy
ELSE
!
! Allocate hdf temporary arrays if not already done
!
IF( .NOT. hdf_alloc ) THEN
ALLOCATE(latradt(nx,ny),STAT=istatus)
latradt=-999999.
ALLOCATE(lonradt(nx,ny),STAT=istatus)
lonradt=-999999.
ALLOCATE (itmp(nx,ny,nz),stat=istatus)
IF (istatus /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating itmp, returning"
STOP
END IF
ALLOCATE (hmax(nz),stat=istatus)
IF (istatus /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating hmax, returning"
STOP
END IF
ALLOCATE (hmin(nz),stat=istatus)
IF (istatus /= 0) THEN
WRITE (6,*) "HDFREAD: ERROR allocating hmin, returning"
STOP
END IF
hdf_alloc=.TRUE.
END IF
!
CALL hdfopen
(trim(fname), 1, sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "RDRADCOL: ERROR opening ", &
trim(fname)," for reading."
istatus = 1
STOP
END IF
CALL hdfrdc
(sd_id, 4, 'radid', stn, istatus)
stnrad(krad)=stn
CALL hdfrdi
(sd_id, 'ireftim', ireftim, istatus)
CALL hdfrdi
(sd_id, 'itime', itime, istatus)
CALL hdfrdi
(sd_id, 'vcpnum', vcpnum, istatus)
CALL hdfrdi
(sd_id, 'isource', isource, istatus)
END IF
!
!-----------------------------------------------------------------------
!
! Connect source number to source name.
!
!-----------------------------------------------------------------------
!
IF(isource < 1) THEN
WRITE(6,'(a,i5,/a/)') &
' rdradcol: read isource as',isource, &
' Setting isource to default, 1'
isource=1
END IF
IF(isource > nsrcradin) THEN
WRITE(6,'(a,i3,a,i3,a,/a/)') &
' rdradcol: read isource as',isource, &
' only ',nsrcradin,' sources known.', &
' If a new radar source has been added, update rdradcol.f90'
STOP
END IF
DO isrc=1,nsrc_rad
IF(srcrad(isrc) == srcradin(isource)) THEN
isrcrad(krad)=isrc
WRITE(6,'(a,i3,a,i3,a,a)') ' rdradcol isource: ',isource, &
' = srcrad(',isrc,') ',srcrad(isrc)
GO TO 25
END IF
END DO
WRITE(6,'(/a,i4,a,a)') ' rdradcol read isource: ',isource, &
' could not find srcrad= ',srcradin(isource)
WRITE(6,'(a//)') ' Check radar source names'
STOP
25 CONTINUE
!
!-----------------------------------------------------------------------
!
! Read more header data
!
!-----------------------------------------------------------------------
!
IF (dmpfmt == 1) THEN
!
READ(nchanl) runname
PRINT *, ' runname: ',runname
READ(nchanl) iradfmt,strhopt,mapprin,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
READ(nchanl) dxin,dyin,dzin,dzminin,ctrlatin, &
ctrlonin,tlat1in,tlat2in,tlonin,scalin, &
latrad(krad),lonrad(krad),elvrad(krad), &
rdummy,rdummy
READ(nchanl) nradvr,iradvr
!
ELSE
!
CALL hdfrdc
(sd_id, 4, 'runname', runname, istatus)
CALL hdfrdi
(sd_id, 'iradfmt', iradfmt, istatus)
CALL hdfrdi
(sd_id, 'strhopt', strhopt, istatus)
CALL hdfrdi
(sd_id, 'mapproj', mapprin, istatus)
CALL hdfrdr
(sd_id, 'dx', dxin, istatus)
CALL hdfrdr
(sd_id, 'dy', dyin, istatus)
CALL hdfrdr
(sd_id, 'dz', dzin, istatus)
CALL hdfrdr
(sd_id, 'dzmin', dzminin, istatus)
CALL hdfrdr
(sd_id, 'ctrlat', ctrlatin, istatus)
CALL hdfrdr
(sd_id, 'ctrlon', ctrlonin, istatus)
CALL hdfrdr
(sd_id, 'trulat1', tlat1in, istatus)
CALL hdfrdr
(sd_id, 'trulat2', tlat2in, istatus)
CALL hdfrdr
(sd_id, 'trulon', tlonin, istatus)
CALL hdfrdr
(sd_id, 'sclfct', scalin, istatus)
CALL hdfrdr
(sd_id, 'latrad', latrad(krad), istatus)
CALL hdfrdr
(sd_id, 'lonrad', lonrad(krad), istatus)
CALL hdfrdr
(sd_id, 'elvrad', elvrad(krad), istatus)
CALL hdfrdi
(sd_id, 'nradvr', nradvr, istatus)
CALL hdfrd1d
(sd_id,'iradvr', mxradvr,iradvr,'')
END IF
PRINT *, ' iradfmt: ',iradfmt
PRINT *, ' strhopt: ',strhopt
PRINT *, ' mapprin: ',mapprin
PRINT *, ' idummy: ',idummy
!
PRINT *, ' dxin,dyin,dzin: ',dxin,dyin,dzin
PRINT *, ' ctrlatin,ctrlonin: ',ctrlatin,ctrlonin
PRINT *, ' tlat1in,tlat2in,tlonin: ',tlat1in,tlat2in,tlonin
PRINT *, ' scalin ',scalin
PRINT *, ' latrad,lonrad,elvrad: ', &
latrad(krad),lonrad(krad),elvrad(krad)
PRINT *, ' rdummy: ',rdummy
PRINT *, ' Got nradvr,iradvr: ',nradvr,iradvr
!
CALL abss2ctim
(itime, iyr, imon, idy, ihr, imin, isec )
iyr=MOD(iyr,100)
WRITE(6,'(/a,i2.2,a,i2.2,a,i2.2,1X,i2.2,a,i2.2,a)') &
' Reading remapped raw radar data for: ', &
imon,'-',idy,'-',iyr,ihr,':',imin,' UTC'
!
!-----------------------------------------------------------------------
!
! If this radar source is not going to be used in the successive
! corrections analysis step, then don't bother reading columns.
!
!-----------------------------------------------------------------------
!
IF(iusechk > 0 ) THEN
knt=0
DO ipass=1,npass
knt=knt+iuserad(isource,ipass)
END DO
ELSE
knt=1
END IF
IF( knt > 0 ) THEN
!
!-----------------------------------------------------------------------
!
! Note here the radar data indices:
!
! 1 Reflectivity
! 2 Radial Velocity
! 3 Nyquist Velocity
! 4 Time in seconds from the reference time
!
!-----------------------------------------------------------------------
!
IF (dmpfmt == 1) THEN
DO jcol=1,999999
READ(nchanl,END=101) i,j,xrd,yrd, &
latcin,loncin,elev,klev
READ(nchanl,END=102) (tem1(1,1,kk),kk=1,klev)
READ(nchanl,END=102) (tem2(1,1,kk),kk=1,klev)
READ(nchanl,END=102) (tem3(1,1,kk),kk=1,klev)
READ(nchanl,END=102) (tem4(1,1,kk),kk=1,klev)
READ(nchanl,END=102) (tem5(1,1,kk),kk=1,klev)
READ(nchanl,END=102) (tem6(1,1,kk),kk=1,klev)
IF(mod((i+j),radistride) == 0 ) THEN
icol=icol+1
IF(icol <= mx_colrad) THEN
irad(icol)=krad
latradc(icol)=latcin
lonradc(icol)=loncin
DO kk=1,nz_rdr
hgtradc(kk,icol)=-999.
DO ivar=1,nvar_radin
obsrad(ivar,kk,icol)=-999.
END DO
END DO
IF(klev > 1) THEN
DO kk=1,(klev-1),radkstride
k=nint(tem1(1,1,kk))
maxk=MAX(maxk,k)
k=MIN(k,nz_rdr)
hgtradc(k,icol)=tem2(1,1,kk)
obsrad(1,k,icol)=tem3(1,1,kk)
obsrad(2,k,icol)=tem4(1,1,kk)
obsrad(3,k,icol)=tem5(1,1,kk)
obsrad(4,k,icol)=tem6(1,1,kk)
nlevrad(icol)=k
END DO
END IF
k=nint(tem1(1,1,klev))
maxk=MAX(maxk,k)
k=MIN(k,nz_rdr)
hgtradc(k,icol)=tem2(1,1,klev)
obsrad(1,k,icol)=tem3(1,1,klev)
obsrad(2,k,icol)=tem4(1,1,klev)
obsrad(3,k,icol)=tem5(1,1,klev)
obsrad(4,k,icol)=tem6(1,1,klev)
nlevrad(icol)=k
ELSE
maxk=MAX(maxk,nint(tem1(1,1,klev)))
END IF
END IF
END DO
101 CONTINUE
WRITE(6,'(a,i6,a)') ' End of file reached after reading', &
(icol-icstrt),' columns'
GO TO 105
102 CONTINUE
WRITE(6,'(a,i6,a)') ' End of file reached while reading', &
icol,' column'
icol=icol-1
105 CONTINUE
CLOSE(nchanl)
CALL retunit( nchanl )
icstrt=icol+1
ELSE ! hdf file
CALL hdfrd2d
(sd_id,'grdlatc',nx,ny,latradt,istatus,itmp)
IF (istatus /= 0) GO TO 115
CALL hdfrd2d
(sd_id,'grdlonc',nx,ny,lonradt,istatus,itmp)
IF (istatus /= 0) GO TO 115
CALL hdfrd3d
(sd_id,'hgtrad',nx,ny,nz,tem2,istatus,itmp,hmax,hmin)
IF (istatus /= 0) GO TO 115
CALL hdfrd3d
(sd_id,'gridref',nx,ny,nz,tem3,istatus,itmp,hmax,hmin)
IF (istatus /= 0) GO TO 115
CALL hdfrd3d
(sd_id,'gridvel',nx,ny,nz,tem4,istatus,itmp,hmax,hmin)
IF (istatus /= 0) GO TO 115
CALL hdfrd3d
(sd_id,'gridnyq',nx,ny,nz,tem5,istatus,itmp,hmax,hmin)
IF (istatus /= 0) GO TO 115
CALL hdfrd3d
(sd_id,'gridtim',nx,ny,nz,tem6,istatus,itmp,hmax,hmin)
IF (istatus /= 0) GO TO 115
DO j=1,ny
DO i=1,nx
IF(mod((i+j),radistride) == 0 ) THEN
!
! Check for non-missing data in this column
!
knt=0
DO k=1,(nz-1),radkstride
IF(tem3(i,j,k) > refchek .OR. &
tem4(i,j,k) > velchek ) THEN
maxk=MAX(maxk,k)
knt=knt+1
END IF
END DO
!
! If non-missing data exist increment column counter and
! transfer to column data
!
IF( knt > 0 ) THEN
icol=icol+1
IF(icol <= mx_colrad) THEN
irad(icol)=krad
latradc(icol)=latradt(i,j)
lonradc(icol)=lonradt(i,j)
DO kk=1,nz_rdr
hgtradc(kk,icol)=-999.
DO ivar=1,nvar_radin
obsrad(ivar,kk,icol)=-999.
END DO
END DO
DO k=1,(nz-1),radkstride
IF(tem3(i,j,k) > refchek .OR. &
tem4(i,j,k) > velchek ) THEN
hgtradc(k,icol)=tem2(i,j,k)
obsrad(1,k,icol)=tem3(i,j,k)
obsrad(2,k,icol)=tem4(i,j,k)
obsrad(3,k,icol)=tem5(i,j,k)
obsrad(4,k,icol)=tem6(i,j,k)
nlevrad(icol)=k
END IF
END DO
END IF ! icol less than mx_colrad
END IF ! non-missing data in column
END IF ! stride check
END DO
END DO
CALL hdfclose
(sd_id,istatus)
WRITE(6,'(a,i6,a)') ' Read ',(icol-icstrt), &
' non-missing columns from hdf file.'
icstrt=icol+1
END IF
ELSE ! iuserad check failed
WRITE(6,'(a,a,/a/)') &
' Data for source ',srcradin(isource), &
' are not used in successive correction step, skipping'
END IF
END DO ! file loop
IF(icol > mx_colrad) THEN
WRITE(6,'(//a)') &
' #### WARNING max_colrad EXCEEDED ####'
WRITE(6,'(a,i6,a)') &
' increase mx_colrad from ',mx_colrad,' columns'
WRITE(6,'(2x,i6,a//)') &
icol,' columns are needed to read all files'
END IF
ncolrad=MIN(icol,mx_colrad)
WRITE(6,'(a,i5/)') ' Maximum number of vert levels read:',maxk
IF(maxk > nz_rdr) THEN
WRITE(6,'(a,i5)') &
' EXCEEDS nz_rdr, increase nz_rdr: ',nz_rdr
STOP
END IF
IF( hdf_alloc ) THEN
DEALLOCATE (itmp)
DEALLOCATE(latradt)
DEALLOCATE(lonradt)
END IF
RETURN
115 CONTINUE
WRITE(6,'(/a/)') ' Error reading data in HDFREAD'
STOP
400 CONTINUE
WRITE(6,'(a,a,/a)') &
' Error opening radar file ',trim(fname), &
' Stopping in rdradcol.'
STOP
END SUBROUTINE rdradcol