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