PROGRAM RADSECTOR,18
!
!
! Reads a NetCDF file containing radar data and writes the file
! containing only those radials in a sector defined by azimbgn and azimend,
! where azimend is clockwise from azimbgn. Both are in degrees from North.
!
! The transformation is applied to both the Reflectivity, Velocity and Vorticity files.
! They are presumed to be in the same directory. Default is the present
! working directory (./), or specified following the -indir flag. The output
! files have the same filenames but are stored in a new directory, specified by
! the -outdir flag.
!
! Usage
!
! radsector Filename [-indir input_directory] -outdir output_directory
! -azimbgn beginning_azimuth -azimend ending_azimuth
!
! AUTHOR:
! Keith Brewster, CAPS
! 04/08/2005
!
! MODIFICATIONS:
! 04/12/2005 (Keith Brewster, CAPS)
! Added index file writing.
!
! 05/25/2005 (Keith Brewster, CAPS)
! Added processing of unattenuated reflectivity and velocity.
!
IMPLICIT NONE
!
! Dimensions
!
INTEGER :: nazim,nazimin
INTEGER :: ngate
!
! Radar data variables
!
CHARACTER (LEN=256) :: fname
CHARACTER (LEN=256) :: rfname
CHARACTER (LEN=256) :: vfname
CHARACTER (LEN=256) :: uarfname
CHARACTER (LEN=256) :: uavfname
CHARACTER (LEN=256) :: hfname
CHARACTER (LEN=256) :: idxfname
CHARACTER (LEN=40) :: varname
CHARACTER (LEN=80) :: indir
CHARACTER (LEN=80) :: outdir
CHARACTER (LEN=120) :: cmd
CHARACTER (LEN=256) :: cdfname
CHARACTER (LEN=4) :: radname
CHARACTER (LEN=5) :: cmprext
REAL :: radlat
REAL :: radlon
REAL :: radelv
INTEGER :: ivcp
REAL :: elv
REAL :: rmisval
REAL :: rngfval
INTEGER :: itimcdf
REAL :: frtime
INTEGER :: initime
REAL :: vnyquist
REAL :: rfrgate
LOGICAL :: fexist
!
REAL,ALLOCATABLE :: azimin(:)
REAL,ALLOCATABLE :: beamwin(:)
REAL,ALLOCATABLE :: gtspcin(:)
REAL,ALLOCATABLE :: vnyqin(:)
REAL,ALLOCATABLE :: reflin(:,:)
REAL,ALLOCATABLE :: radvin(:,:)
REAL,ALLOCATABLE :: vortin(:,:)
!
REAL,ALLOCATABLE :: azim(:)
REAL,ALLOCATABLE :: beamw(:)
REAL,ALLOCATABLE :: gtspc(:)
REAL,ALLOCATABLE :: vnyq(:)
REAL,ALLOCATABLE :: refl(:,:)
REAL,ALLOCATABLE :: radv(:,:)
REAL,ALLOCATABLE :: vort(:,:)
!
!-----------------------------------------------------------------------
!
! NetCDF variables
!
!-----------------------------------------------------------------------
!
INTEGER :: ncmode
INTEGER :: ncid,nazimid,ngateid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
INTEGER, PARAMETER :: itim1970=315619200
CHARACTER(LEN=256) :: argstr
CHARACTER(LEN=256) :: tmpstr
REAL :: azimbgn,azimend
REAL :: dazmax,dazmin,dazim
INTEGER :: iarg,narg,iloc,ltmp,lfname
INTEGER :: igate,ielv,felv,jazim,kazim,jstart,irot
INTEGER :: istatus,iostatus
INTEGER :: iargc,creidx,openidx,ifsecs,itime,idxunit
LOGICAL :: back,needfname
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'netcdf.inc'
!
! Variable initializations
!
openidx=0
creidx=1
azimbgn=0.
azimend=30.
indir='.'
outdir='radsect'
fname='dummy'
needfname=.true.
cmprext='.gz'
!
!-----------------------------------------------------------------------
!
! Get input arguments
!
!-----------------------------------------------------------------------
!
narg=iargc()
IF(narg < 7) THEN
WRITE(6,'(a,a/a)') &
' Usage: radsector Filename [-indir input_directory]', &
' -outdir output_directory ', &
' -azimbgn beginning_azimuth -azimend ending_azimuth'
STOP
END IF
iarg=1
DO
CALL getarg(iarg,argstr)
iarg=iarg+1
IF(argstr(1:8) == '-azimbgn') THEN
IF(iarg > narg) EXIT
CALL getarg(iarg,argstr)
iarg=iarg+1
READ(argstr,*,iostat=iostatus) azimbgn
IF(iostatus /= 0) THEN
WRITE(6,'(a,a/a)') &
' Usage: radsector Filename [-indir input_directory]', &
' -outdir output_directory ', &
' -azimbgn beginning_azimuth -azimend ending_azimuth'
STOP
END IF
ELSE IF(argstr(1:8) == '-azimend') THEN
IF(iarg > narg) EXIT
CALL getarg(iarg,argstr)
iarg=iarg+1
READ(argstr,*,iostat=iostatus) azimend
IF(iostatus /= 0) THEN
WRITE(6,'(a,a/a)') ' radsector Filename [-indir input_directory]', &
' -outdir output_directory ', &
' -azimbgn beginning_azimuth -azimend ending_azimuth'
STOP
END IF
ELSE IF (argstr(1:6) == '-indir') THEN
IF(iarg > narg) EXIT
CALL getarg(iarg,argstr)
iarg=iarg+1
indir=argstr(1:80)
ELSE IF (argstr(1:7) == '-outdir') THEN
IF(iarg > narg) EXIT
CALL getarg(iarg,argstr)
iarg=iarg+1
outdir=argstr(1:80)
ELSE IF (argstr(1:1) /= '-' .AND. needfname) THEN
fname=argstr
needfname=.false.
ELSE
WRITE(6,'(a,a)') &
' Unrecognized command line input: ',TRIM(argstr)
WRITE(6,'(a,a/a)') ' radsector Filename [-indir input_directory]', &
' -outdir output_directory ', &
' -azimbgn beginning_azimuth -azimend ending_azimuth'
STOP
END IF
IF(iarg > narg) EXIT
END DO
!
!-----------------------------------------------------------------------
!
! Strip directory name, if any from filename
!
!-----------------------------------------------------------------------
!
back=.true.
iloc=INDEX(fname,'/',back)
ltmp=LEN(tmpstr)
lfname=LEN(TRIM(fname))
IF(iloc > 0) THEN
indir=fname(1:(iloc-1))
tmpstr=TRIM(fname)
fname=tmpstr((iloc+1):ltmp)
END IF
IF(fname(1:7) == 'Reflect') THEN
rfname=fname
WRITE(vfname,'(a,a)') 'Velocity',fname(13:lfname)
WRITE(uavfname,'(a,a)') 'VelocityUnattenuated',fname(13:lfname)
WRITE(uarfname,'(a,a)') 'ReflectivityUnattenuated',fname(13:lfname)
WRITE(hfname,'(a,a)') 'Vorticity',fname(13:lfname)
ELSE IF(fname(1:8) == 'Velocity') THEN
vfname=fname
WRITE(rfname,'(a,a)') 'Reflectivity',fname(9:lfname)
WRITE(uarfname,'(a,a)') 'ReflectivityUnattenuated',fname(9:lfname)
WRITE(uavfname,'(a,a)') 'VelocityUnattenuated',fname(9:lfname)
WRITE(hfname,'(a,a)') 'Vorticity',fname(9:lfname)
ELSE IF(fname(1:9) == 'Vorticity') THEN
hfname=fname
WRITE(rfname,'(a,a)') 'Reflectivity',fname(10:lfname)
WRITE(vfname,'(a,a)') 'Velocity',fname(10:lfname)
WRITE(uarfname,'(a,a)') 'ReflectivityUnattenuated',fname(10:lfname)
WRITE(uavfname,'(a,a)') 'VelocityUnattenuated',fname(10:lfname)
END IF
WRITE(6,'(a,a)') ' Input directory: ',TRIM(indir)
WRITE(6,'(a,a)') ' Ouput directory: ',TRIM(outdir)
WRITE(6,'(a,a)') ' Reflectivity Filename: ',TRIM(rfname)
WRITE(6,'(a,a)') ' Velocity Filename: ',TRIM(vfname)
WRITE(6,'(a,a)') ' Unattenuated Reflectivity Filename: ',TRIM(uarfname)
WRITE(6,'(a,a)') ' Unattenuated Velocity Filename: ',TRIM(uavfname)
WRITE(6,'(a,a)') ' Vorticity Filename: ',TRIM(hfname)
WRITE(6,'(a,f6.2)') ' Sector beginning azimuth: ',azimbgn
WRITE(6,'(a,f6.2//)') ' Sector ending azimuth: ',azimend
IF(TRIM(outdir) /= '.') THEN
INQUIRE(FILE=TRIM(outdir),EXIST=fexist)
IF(.NOT.fexist) THEN
WRITE(6,'(a,a)') ' Creating directory ',TRIM(outdir)
WRITE(cmd,'(a,a)') 'mkdir ',TRIM(outdir)
CALL unixcmd
(cmd)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Open and get reflectivity dimensions from netCDF file
!
!-----------------------------------------------------------------------
!
nazimin=0
ngate=0
write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(rfname)
write(6,'(a,a)') ' Reading data dimensions from: ',TRIM(cdfname)
ncmode=nf_share
istatus=nf_open(cdfname,ncmode,ncid)
IF(istatus == 0) THEN
istatus=nf_inq_dimid(ncid,'Azimuth',nazimid)
istatus=nf_inq_dimid(ncid,'Gate',ngateid)
istatus=nf_inq_dimlen(ncid,nazimid,nazimin)
istatus=nf_inq_dimlen(ncid,ngateid,ngate)
istatus=nf_close(ncid)
write(6,'(a,i5,a,i5)') ' nazimin=',nazimin,' ngate=',ngate
IF( nazimin == 0 .OR. ngate == 0) THEN
WRITE(6,'(a)') ' Error getting data dimensions.'
STOP
END IF
ALLOCATE(azimin(nazimin))
ALLOCATE(beamwin(nazimin))
ALLOCATE(gtspcin(nazimin))
ALLOCATE(reflin(ngate,nazimin))
azimin=-199.
beamwin=-199.
gtspcin=-199.
reflin=-199.
runname='dummy'
CALL rdrftiltcdf
(nazimin,ngate,rfname,indir,radname, &
radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azimin,beamwin,gtspcin,reflin)
ielv=INT(elv)
felv=NINT(100.*(elv-ielv))
CALL gtlfnkey
(runname,lfnkey)
itime=itimcdf+itim1970
CALL abss2ctim
(itime,year,month,day,hour,minute,second)
IF(azimend > azimbgn) THEN
dazmax=azimend-azimbgn
ELSE
dazmax=360.+azimend-azimbgn
END IF
WRITE(6,'(a,f7.2)') ' Sector width (degrees): ',dazmax
!
! Count radials in input arrays within specified sector
!
nazim=0
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) nazim=nazim+1
END DO
WRITE(6,'(i6,a,f9.2,a,f9.2)') &
nazim,' radials found in range ',azimbgn,' to ',azimend
!
! Find rotating direction and starting azimuth
!
irot=1
dazim=azimin(2)-azimin(1)
IF(dazim < -180.) dazim=dazim+360.
IF(dazim < 0.) irot=-1
IF( irot > 0 ) THEN
WRITE(6,'(a)') ' Clockwise rotation detected'
ELSE
WRITE(6,'(a)') ' Counter-clockwise rotation detected'
END IF
jstart=1
dazmin=361.
IF(irot > 0) THEN
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
ELSE
DO jazim=1,nazimin
dazim=azimend-azimin(jazim)
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
END IF
!
IF(nazim > 0) THEN
!
!-----------------------------------------------------------------------
!
! Open index record file
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
ifsecs=NINT(curtim)
write(idxfname,'(a,a,a,a,a,a,i6.6,a)') &
TRIM(outdir),'/',radname,'.',runname(1:lfnkey),'.',ifsecs,'.xml'
idxunit=32
write(6,'(a,a)') ' Writing index to:',TRIM(idxfname)
OPEN(idxunit,file=idxfname,form='formatted',status='unknown')
write(idxunit,'(a)') '<?xml version="1.0" encoding="iso-8859-1" ?>'
write(idxunit,'(a,a,a)') '<codeindex type="netcdf" dataset="', &
TRIM(outdir),'">'
openidx=1
END IF
ALLOCATE(azim(nazim))
ALLOCATE(beamw(nazim))
ALLOCATE(gtspc(nazim))
ALLOCATE(refl(ngate,nazim))
azim=-199.
beamw=-199.
gtspc=-199.
refl=-199.
kazim=0
DO jazim=jstart,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
refl(igate,kazim)=reflin(igate,jazim)
END DO
END IF
END DO
DO jazim=1,(jstart-1)
IF(azimin(jazim) > azimend) THEN
dazim=azimin(jazim)-azimbgn
ELSE
dazim=360.+azimin(jazim)-azimbgn
END IF
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
refl(igate,kazim)=reflin(igate,jazim)
END DO
END IF
END DO
varname='Reflectivity'
CALL wtrftiltcdf
(ngate,nazim,nazim,rfname,outdir,varname, &
radname,radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azim,beamw,gtspc,refl)
!
!-----------------------------------------------------------------------
!
! Write index record
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
write(idxunit,'(a)') '<item>'
write(idxunit,'(a,f8.6,a,i10,a)') &
'<time fractional="',frtime,'">',itimcdf,'</time>'
write(idxunit,'(a,a,a,a)') '<params>netcdf {indexlocation} ', &
TRIM(rfname),TRIM(cmprext),'</params>'
write(idxunit,'(a,i4.4,2i2.2,a,3i2.2,a,i2.2,a1,i2.2,a)') &
'<selections>',year,month,day,'-', &
hour,minute,second,' Reflectivity',ielv,'.',felv, &
'</selections>'
write(idxunit,'(a)') '</item>'
END IF
!
DEALLOCATE(azimin)
DEALLOCATE(beamwin)
DEALLOCATE(gtspcin)
DEALLOCATE(reflin)
DEALLOCATE(azim)
DEALLOCATE(beamw)
DEALLOCATE(gtspc)
DEALLOCATE(refl)
END IF
ELSE
WRITE(6,'(a,a)') &
' Error opening NetCDF data file: ',TRIM(cdfname)
STOP
END IF
!
!-----------------------------------------------------------------------
!
! Open and get unattenuated reflectivity dimensions from netCDF file
!
!-----------------------------------------------------------------------
!
nazimin=0
ngate=0
write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(uarfname)
write(6,'(a,a)') ' Reading data dimensions from: ',TRIM(cdfname)
ncmode=nf_share
istatus=nf_open(cdfname,ncmode,ncid)
IF(istatus == 0) THEN
istatus=nf_inq_dimid(ncid,'Azimuth',nazimid)
istatus=nf_inq_dimid(ncid,'Gate',ngateid)
istatus=nf_inq_dimlen(ncid,nazimid,nazimin)
istatus=nf_inq_dimlen(ncid,ngateid,ngate)
istatus=nf_close(ncid)
write(6,'(a,i5,a,i5)') ' nazimin=',nazimin,' ngate=',ngate
IF( nazimin == 0 .OR. ngate == 0) THEN
WRITE(6,'(a)') ' Error getting data dimensions.'
STOP
END IF
ALLOCATE(azimin(nazimin))
ALLOCATE(beamwin(nazimin))
ALLOCATE(gtspcin(nazimin))
ALLOCATE(reflin(ngate,nazimin))
azimin=-199.
beamwin=-199.
gtspcin=-199.
reflin=-199.
runname='dummy'
CALL rdrftiltcdf
(nazimin,ngate,rfname,indir,radname, &
radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azimin,beamwin,gtspcin,reflin)
ielv=INT(elv)
felv=NINT(100.*(elv-ielv))
CALL gtlfnkey
(runname,lfnkey)
itime=itimcdf+itim1970
CALL abss2ctim
(itime,year,month,day,hour,minute,second)
IF(azimend > azimbgn) THEN
dazmax=azimend-azimbgn
ELSE
dazmax=360.+azimend-azimbgn
END IF
WRITE(6,'(a,f7.2)') ' Sector width (degrees): ',dazmax
!
! Count radials in input arrays within specified sector
!
nazim=0
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) nazim=nazim+1
END DO
WRITE(6,'(i6,a,f9.2,a,f9.2)') &
nazim,' radials found in range ',azimbgn,' to ',azimend
!
! Find rotating direction and starting azimuth
!
irot=1
dazim=azimin(2)-azimin(1)
IF(dazim < -180.) dazim=dazim+360.
IF(dazim < 0.) irot=-1
IF( irot > 0 ) THEN
WRITE(6,'(a)') ' Clockwise rotation detected'
ELSE
WRITE(6,'(a)') ' Counter-clockwise rotation detected'
END IF
jstart=1
dazmin=361.
IF(irot > 0) THEN
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
ELSE
DO jazim=1,nazimin
dazim=azimend-azimin(jazim)
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
END IF
!
IF(nazim > 0) THEN
!
!-----------------------------------------------------------------------
!
! Open index record file
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
ifsecs=NINT(curtim)
write(idxfname,'(a,a,a,a,a,a,i6.6,a)') &
TRIM(outdir),'/',radname,'.',runname(1:lfnkey),'.',ifsecs,'.xml'
idxunit=32
write(6,'(a,a)') ' Writing index to:',TRIM(idxfname)
OPEN(idxunit,file=idxfname,form='formatted',status='unknown')
write(idxunit,'(a)') '<?xml version="1.0" encoding="iso-8859-1" ?>'
write(idxunit,'(a,a,a)') '<codeindex type="netcdf" dataset="', &
TRIM(outdir),'">'
openidx=1
END IF
ALLOCATE(azim(nazim))
ALLOCATE(beamw(nazim))
ALLOCATE(gtspc(nazim))
ALLOCATE(refl(ngate,nazim))
azim=-199.
beamw=-199.
gtspc=-199.
refl=-199.
kazim=0
DO jazim=jstart,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
refl(igate,kazim)=reflin(igate,jazim)
END DO
END IF
END DO
DO jazim=1,(jstart-1)
IF(azimin(jazim) > azimend) THEN
dazim=azimin(jazim)-azimbgn
ELSE
dazim=360.+azimin(jazim)-azimbgn
END IF
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
refl(igate,kazim)=reflin(igate,jazim)
END DO
END IF
END DO
varname='UnattenuatedReflectivity'
CALL wtrftiltcdf
(ngate,nazim,nazim,rfname,outdir, &
radname,radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azim,beamw,gtspc,refl)
!
!-----------------------------------------------------------------------
!
! Write index record
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
write(idxunit,'(a)') '<item>'
write(idxunit,'(a,f8.6,a,i10,a)') &
'<time fractional="',frtime,'">',itimcdf,'</time>'
write(idxunit,'(a,a,a,a)') '<params>netcdf {indexlocation} ', &
TRIM(rfname),TRIM(cmprext),'</params>'
write(idxunit,'(a,i4.4,2i2.2,a,3i2.2,a,i2.2,a1,i2.2,a)') &
'<selections>',year,month,day,'-', &
hour,minute,second,' UnattenuatedReflectivity',ielv,'.',felv, &
'</selections>'
write(idxunit,'(a)') '</item>'
END IF
!
DEALLOCATE(azimin)
DEALLOCATE(beamwin)
DEALLOCATE(gtspcin)
DEALLOCATE(reflin)
DEALLOCATE(azim)
DEALLOCATE(beamw)
DEALLOCATE(gtspc)
DEALLOCATE(refl)
END IF
ELSE
WRITE(6,'(a,a)') &
' Error opening NetCDF data file: ',TRIM(cdfname)
END IF
!-----------------------------------------------------------------------
!
! Open and get velocity dimensions from netCDF file
!
!-----------------------------------------------------------------------
!
nazimin=0
ngate=0
write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(vfname)
write(6,'(a,a)') ' Reading data dimensions from: ',TRIM(cdfname)
ncmode=nf_share
istatus=nf_open(cdfname,ncmode,ncid)
IF(istatus == 0) THEN
istatus=nf_inq_dimid(ncid,'Azimuth',nazimid)
istatus=nf_inq_dimid(ncid,'Gate',ngateid)
istatus=nf_inq_dimlen(ncid,nazimid,nazimin)
istatus=nf_inq_dimlen(ncid,ngateid,ngate)
istatus=nf_close(ncid)
write(6,'(a,i5,a,i5)') ' nazimin=',nazimin,' ngate=',ngate
IF( nazimin == 0 .OR. ngate == 0) THEN
WRITE(6,'(a)') ' Error getting data dimensions.'
STOP
END IF
ALLOCATE(azimin(nazimin))
ALLOCATE(beamwin(nazimin))
ALLOCATE(gtspcin(nazimin))
ALLOCATE(vnyqin(nazimin))
ALLOCATE(radvin(ngate,nazimin))
azimin=-199.
beamwin=-199.
gtspcin=-199.
vnyqin=-199.
radvin=-199.
runname='dummy'
CALL rdvrtiltcdf
(nazimin,ngate,vfname,indir,radname, &
radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azimin,beamwin,gtspcin,vnyqin,radvin)
ielv=INT(elv)
felv=NINT(100.*(elv-ielv))
CALL gtlfnkey
(runname,lfnkey)
IF(azimend > azimbgn) THEN
dazmax=azimend-azimbgn
ELSE
dazmax=360.+azimend-azimbgn
END IF
WRITE(6,'(a,f7.2)') ' Sector width (degrees): ',dazmax
!
! Count radials in input arrays within specified sector
!
nazim=0
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) nazim=nazim+1
END DO
WRITE(6,'(i6,a,f9.2,a,f9.2)') &
nazim,' radials found in range ',azimbgn,' to ',azimend
!
! Find rotating direction and starting azimuth
!
irot=1
dazim=azimin(2)-azimin(1)
IF(dazim < -180.) dazim=dazim+360.
IF(dazim < 0.) irot=-1
IF( irot > 0 ) THEN
WRITE(6,'(a)') ' Clockwise rotation detected'
ELSE
WRITE(6,'(a)') ' Counter-clockwise rotation detected'
END IF
jstart=1
dazmin=361.
IF(irot > 0) THEN
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
ELSE
DO jazim=1,nazimin
dazim=azimend-azimin(jazim)
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
END IF
!
IF(nazim > 0) THEN
IF( creidx > 0 .and. openidx < 1) THEN
ifsecs=NINT(curtim)
write(idxfname,'(a,a,a,a,a,a,i6.6,a)') &
TRIM(outdir),'/',radname,'.',runname(1:lfnkey),'.',ifsecs,'.xml'
idxunit=32
write(6,'(a,a)') ' Writing index to:',TRIM(idxfname)
OPEN(idxunit,file=idxfname,form='formatted',status='unknown')
write(idxunit,'(a)') '<?xml version="1.0" encoding="iso-8859-1" ?>'
write(idxunit,'(a,a,a)') '<codeindex type="netcdf" dataset="', &
TRIM(outdir),'">'
openidx = 1
END IF
ALLOCATE(azim(nazim))
ALLOCATE(beamw(nazim))
ALLOCATE(gtspc(nazim))
ALLOCATE(vnyq(nazim))
ALLOCATE(radv(ngate,nazim))
azim=-199.
beamw=-199.
gtspc=-199.
vnyq=-199.
radv=-199.
kazim=0
DO jazim=jstart,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
vnyq(kazim)=vnyqin(jazim)
DO igate=1,ngate
radv(igate,kazim)=radvin(igate,jazim)
END DO
END IF
END DO
DO jazim=1,(jstart-1)
IF(azimin(jazim) > azimend) THEN
dazim=azimin(jazim)-azimbgn
ELSE
dazim=360.+azimin(jazim)-azimbgn
END IF
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
vnyq(kazim)=vnyqin(jazim)
DO igate=1,ngate
radv(igate,kazim)=radvin(igate,jazim)
END DO
END IF
END DO
varname='Velocity'
CALL wtvrtiltcdf
(ngate,nazim,nazim,vfname,outdir,varname, &
radname,radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azim,beamw,gtspc,vnyq,radv)
!
!-----------------------------------------------------------------------
!
! Write index record
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
write(idxunit,'(a)') '<item>'
write(idxunit,'(a,f8.6,a,i10,a)') &
'<time fractional="',frtime,'">',itimcdf,'</time>'
write(idxunit,'(a,a,a,a)') '<params>netcdf {indexlocation} ', &
TRIM(vfname),TRIM(cmprext),'</params>'
write(idxunit,'(a,i4.4,2i2.2,a,3i2.2,a,i2.2,a1,i2.2,a)') &
'<selections>',year,month,day,'-', &
hour,minute,second,' Velocity',ielv,'.',felv, &
'</selections>'
write(idxunit,'(a)') '</item>'
END IF
DEALLOCATE(azimin)
DEALLOCATE(beamwin)
DEALLOCATE(gtspcin)
DEALLOCATE(vnyqin)
DEALLOCATE(radvin)
DEALLOCATE(azim)
DEALLOCATE(beamw)
DEALLOCATE(gtspc)
DEALLOCATE(vnyq)
DEALLOCATE(radv)
END IF
ELSE
WRITE(6,'(a,a)') &
' Error opening NetCDF data file: ',TRIM(cdfname)
STOP
END IF
!
!-----------------------------------------------------------------------
!
! Open and get unattenuated velocity dimensions from netCDF file
!
!-----------------------------------------------------------------------
!
nazimin=0
ngate=0
write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(uavfname)
write(6,'(a,a)') ' Reading data dimensions from: ',TRIM(cdfname)
ncmode=nf_share
istatus=nf_open(cdfname,ncmode,ncid)
IF(istatus == 0) THEN
istatus=nf_inq_dimid(ncid,'Azimuth',nazimid)
istatus=nf_inq_dimid(ncid,'Gate',ngateid)
istatus=nf_inq_dimlen(ncid,nazimid,nazimin)
istatus=nf_inq_dimlen(ncid,ngateid,ngate)
istatus=nf_close(ncid)
write(6,'(a,i5,a,i5)') ' nazimin=',nazimin,' ngate=',ngate
IF( nazimin == 0 .OR. ngate == 0) THEN
WRITE(6,'(a)') ' Error getting data dimensions.'
STOP
END IF
ALLOCATE(azimin(nazimin))
ALLOCATE(beamwin(nazimin))
ALLOCATE(gtspcin(nazimin))
ALLOCATE(vnyqin(nazimin))
ALLOCATE(radvin(ngate,nazimin))
azimin=-199.
beamwin=-199.
gtspcin=-199.
vnyqin=-199.
radvin=-199.
runname='dummy'
CALL rdvrtiltcdf
(nazimin,ngate,vfname,indir,radname, &
radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azimin,beamwin,gtspcin,vnyqin,radvin)
ielv=INT(elv)
felv=NINT(100.*(elv-ielv))
CALL gtlfnkey
(runname,lfnkey)
IF(azimend > azimbgn) THEN
dazmax=azimend-azimbgn
ELSE
dazmax=360.+azimend-azimbgn
END IF
WRITE(6,'(a,f7.2)') ' Sector width (degrees): ',dazmax
!
! Count radials in input arrays within specified sector
!
nazim=0
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) nazim=nazim+1
END DO
WRITE(6,'(i6,a,f9.2,a,f9.2)') &
nazim,' radials found in range ',azimbgn,' to ',azimend
!
! Find rotating direction and starting azimuth
!
irot=1
dazim=azimin(2)-azimin(1)
IF(dazim < -180.) dazim=dazim+360.
IF(dazim < 0.) irot=-1
IF( irot > 0 ) THEN
WRITE(6,'(a)') ' Clockwise rotation detected'
ELSE
WRITE(6,'(a)') ' Counter-clockwise rotation detected'
END IF
jstart=1
dazmin=361.
IF(irot > 0) THEN
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
ELSE
DO jazim=1,nazimin
dazim=azimend-azimin(jazim)
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
END IF
!
IF(nazim > 0) THEN
IF( creidx > 0 .and. openidx < 1) THEN
ifsecs=NINT(curtim)
write(idxfname,'(a,a,a,a,a,a,i6.6,a)') &
TRIM(outdir),'/',radname,'.',runname(1:lfnkey),'.',ifsecs,'.xml'
idxunit=32
write(6,'(a,a)') ' Writing index to:',TRIM(idxfname)
OPEN(idxunit,file=idxfname,form='formatted',status='unknown')
write(idxunit,'(a)') '<?xml version="1.0" encoding="iso-8859-1" ?>'
write(idxunit,'(a,a,a)') '<codeindex type="netcdf" dataset="', &
TRIM(outdir),'">'
openidx = 1
END IF
ALLOCATE(azim(nazim))
ALLOCATE(beamw(nazim))
ALLOCATE(gtspc(nazim))
ALLOCATE(vnyq(nazim))
ALLOCATE(radv(ngate,nazim))
azim=-199.
beamw=-199.
gtspc=-199.
vnyq=-199.
radv=-199.
kazim=0
DO jazim=jstart,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
vnyq(kazim)=vnyqin(jazim)
DO igate=1,ngate
radv(igate,kazim)=radvin(igate,jazim)
END DO
END IF
END DO
DO jazim=1,(jstart-1)
IF(azimin(jazim) > azimend) THEN
dazim=azimin(jazim)-azimbgn
ELSE
dazim=360.+azimin(jazim)-azimbgn
END IF
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
vnyq(kazim)=vnyqin(jazim)
DO igate=1,ngate
radv(igate,kazim)=radvin(igate,jazim)
END DO
END IF
END DO
varname='UnattenuatedVelocity'
CALL wtvrtiltcdf
(ngate,nazim,nazim,vfname,outdir,varname, &
radname,radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azim,beamw,gtspc,vnyq,radv)
!
!-----------------------------------------------------------------------
!
! Write index record
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
write(idxunit,'(a)') '<item>'
write(idxunit,'(a,f8.6,a,i10,a)') &
'<time fractional="',frtime,'">',itimcdf,'</time>'
write(idxunit,'(a,a,a,a)') '<params>netcdf {indexlocation} ', &
TRIM(vfname),TRIM(cmprext),'</params>'
write(idxunit,'(a,i4.4,2i2.2,a,3i2.2,a,i2.2,a1,i2.2,a)') &
'<selections>',year,month,day,'-', &
hour,minute,second,' UnattenuatedVelocity',ielv,'.',felv, &
'</selections>'
write(idxunit,'(a)') '</item>'
END IF
DEALLOCATE(azimin)
DEALLOCATE(beamwin)
DEALLOCATE(gtspcin)
DEALLOCATE(vnyqin)
DEALLOCATE(radvin)
DEALLOCATE(azim)
DEALLOCATE(beamw)
DEALLOCATE(gtspc)
DEALLOCATE(vnyq)
DEALLOCATE(radv)
END IF
ELSE
WRITE(6,'(a,a)') &
' Error opening NetCDF data file: ',TRIM(cdfname)
END IF
!-----------------------------------------------------------------------
!
! Open and get vorticity dimensions from netCDF file
!
!-----------------------------------------------------------------------
!
nazimin=0
ngate=0
write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(hfname)
write(6,'(a,a)') ' Reading data dimensions from: ',TRIM(cdfname)
ncmode=nf_share
istatus=nf_open(cdfname,ncmode,ncid)
IF(istatus == 0) THEN
istatus=nf_inq_dimid(ncid,'Azimuth',nazimid)
istatus=nf_inq_dimid(ncid,'Gate',ngateid)
istatus=nf_inq_dimlen(ncid,nazimid,nazimin)
istatus=nf_inq_dimlen(ncid,ngateid,ngate)
istatus=nf_close(ncid)
write(6,'(a,i5,a,i5)') ' nazimin=',nazimin,' ngate=',ngate
IF( nazimin == 0 .OR. ngate == 0) THEN
WRITE(6,'(a)') ' Error getting data dimensions.'
STOP
END IF
ALLOCATE(azimin(nazimin))
ALLOCATE(beamwin(nazimin))
ALLOCATE(gtspcin(nazimin))
ALLOCATE(vortin(ngate,nazimin))
azimin=-199.
beamwin=-199.
gtspcin=-199.
vortin=-199.
runname='dummy'
CALL rdvvtiltcdf
(nazimin,ngate,hfname,indir,radname, &
radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azimin,beamwin,gtspcin,vortin)
ielv=INT(elv)
felv=NINT(100.*(elv-ielv))
CALL gtlfnkey
(runname,lfnkey)
IF(azimend > azimbgn) THEN
dazmax=azimend-azimbgn
ELSE
dazmax=360.+azimend-azimbgn
END IF
WRITE(6,'(a,f7.2)') ' Sector width (degrees): ',dazmax
!
! Count radials in input arrays within specified sector
!
nazim=0
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) nazim=nazim+1
END DO
WRITE(6,'(i6,a,f9.2,a,f9.2)') &
nazim,' radials found in range ',azimbgn,' to ',azimend
!
! Find rotating direction and starting azimuth
!
irot=1
dazim=azimin(2)-azimin(1)
IF(dazim < -180.) dazim=dazim+360.
IF(dazim < 0.) irot=-1
IF( irot > 0 ) THEN
WRITE(6,'(a)') ' Clockwise rotation detected'
ELSE
WRITE(6,'(a)') ' Counter-clockwise rotation detected'
END IF
jstart=1
dazmin=361.
IF(irot > 0) THEN
DO jazim=1,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
ELSE
DO jazim=1,nazimin
dazim=azimend-azimin(jazim)
IF(dazim < 0.) dazim=dazim+360.
IF(dazim < dazmin) THEN
dazmin=dazim
jstart=jazim
END IF
END DO
END IF
!
IF(nazim > 0) THEN
!
!-----------------------------------------------------------------------
!
! Open index record file
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 .and. openidx < 1) THEN
ifsecs=NINT(curtim)
write(idxfname,'(a,a,a,a,a,a,i6.6,a)') &
TRIM(outdir),'/',radname,'.',runname(1:lfnkey),'.',ifsecs,'.xml'
idxunit=32
write(6,'(a,a)') ' Writing index to:',TRIM(idxfname)
OPEN(idxunit,file=idxfname,form='formatted',status='unknown')
write(idxunit,'(a)') '<?xml version="1.0" encoding="iso-8859-1" ?>'
write(idxunit,'(a,a,a)') '<codeindex type="netcdf" dataset="', &
TRIM(outdir),'">'
openidx = 1
END IF
ALLOCATE(azim(nazim))
ALLOCATE(beamw(nazim))
ALLOCATE(gtspc(nazim))
ALLOCATE(vort(ngate,nazim))
azim=-199.
beamw=-199.
gtspc=-199.
vort=-199.
kazim=0
DO jazim=jstart,nazimin
dazim=azimin(jazim)-azimbgn
IF(dazim < 0.) dazim=dazim+360.
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
vort(igate,kazim)=vortin(igate,jazim)
END DO
END IF
END DO
DO jazim=1,(jstart-1)
IF(azimin(jazim) > azimend) THEN
dazim=azimin(jazim)-azimbgn
ELSE
dazim=360.+azimin(jazim)-azimbgn
END IF
IF(dazim <= dazmax) THEN
kazim=kazim+1
IF(kazim > nazim) EXIT
azim(kazim)=azimin(jazim)
beamw(kazim)=beamwin(jazim)
gtspc(kazim)=gtspcin(jazim)
DO igate=1,ngate
vort(igate,kazim)=vortin(igate,jazim)
END DO
END IF
END DO
varname='Vorticity'
CALL wtvvtiltcdf
(ngate,nazim,nazim,hfname,outdir,varname, &
radname,radlat,radlon,radelv,ivcp,elv, &
rmisval,rngfval,itimcdf,frtime,initime, &
vnyquist,rfrgate, &
azim,beamw,gtspc,vort)
!
!-----------------------------------------------------------------------
!
! Write index record
!
!-----------------------------------------------------------------------
!
IF( creidx > 0 ) THEN
write(idxunit,'(a)') '<item>'
write(idxunit,'(a,f8.6,a,i10,a)') &
'<time fractional="',frtime,'">',itimcdf,'</time>'
write(idxunit,'(a,a,a,a)') '<params>netcdf {indexlocation} ', &
TRIM(hfname),TRIM(cmprext),'</params>'
write(idxunit,'(a,i4.4,2i2.2,a,3i2.2,a,i2.2,a1,i2.2,a)') &
'<selections>',year,month,day,'-', &
hour,minute,second,' Vorticity',ielv,'.',felv, &
'</selections>'
write(idxunit,'(a)') '</item>'
END IF
!
DEALLOCATE(azimin)
DEALLOCATE(beamwin)
DEALLOCATE(gtspcin)
DEALLOCATE(vortin)
DEALLOCATE(azim)
DEALLOCATE(beamw)
DEALLOCATE(gtspc)
DEALLOCATE(vort)
END IF
ELSE
WRITE(6,'(a,a)') &
' Error opening NetCDF data file: ',TRIM(cdfname)
END IF
!
! Finish index file and close it out
!
IF( openidx > 0 ) THEN
write(idxunit,'(a)') '</codeindex>'
CLOSE(idxunit)
END IF
STOP
END PROGRAM RADSECTOR