!
!##################################################################
!##################################################################
!######                                                      ######
!######      Advanced Regional Prediction System (ARPS)      ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

PROGRAM PLT_RADAR_TILT,99
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!     Plot radar reflectivity and radial velocity in a tilt and
!              vertical cross-sections 
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR: Ming Xue
!  03/19/02.
!
!  MODIFICATION HISTORY:
!  06/12/2005 Keith Brewster, CAPS
!  Added reading of radar emulator volume files (radfmt=2)
!
!  11/15/2005 Keith Brewster, CAPS
!  Updated for changes to content of emulator volume files.
!
!  11/23/2005 Keith Brewster, CAPS
!  Restructured code to use considerably less memory.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

  INTEGER, PARAMETER :: mxradfile= 100
  INTEGER, PARAMETER :: mxmapfile= 10
  INTEGER, PARAMETER :: nref_tilts_max=14
  INTEGER, PARAMETER :: nvel_tilts_max=14
  INTEGER, PARAMETER :: n_elevation_max=14
  INTEGER, PARAMETER :: n_azimuth_max=361

!
!-----------------------------------------------------------------------
!
!  Namelist 
!
!-----------------------------------------------------------------------
!

  CHARACTER (LEN=256) :: filepath
  INTEGER :: radfmt
  INTEGER :: numfiles
  CHARACTER (LEN=256) :: files(mxradfile)
  NAMELIST /input_data/ filepath,radfmt,numfiles,files

  CHARACTER(LEN=4) :: radar_symbol
  NAMELIST /radar_index/ radar_symbol

  INTEGER :: nx
  INTEGER :: ny
  REAL :: dx
  REAL :: dy
  REAL :: ctrlat
  REAL :: ctrlon
  NAMELIST /grid/ nx,ny,dx,dy,ctrlat,ctrlon

  INTEGER :: mapproj
  REAL :: trulat1
  REAL :: trulat2
  REAL :: trulon
  REAL :: sclfct
  NAMELIST /projection/ mapproj,trulat1,trulat2,trulon,sclfct

  INTEGER :: overlayrefcontour
  INTEGER :: n_elevation_ref
  INTEGER :: n_elevation_vel
  INTEGER :: n_azimuth_ref
  INTEGER :: n_azimuth_vel
  REAL :: elevations_ref(n_elevation_max)
  REAL :: elevations_vel(n_elevation_max)
  REAL :: azimuth_ref(n_azimuth_max)
  REAL :: azimuth_vel(n_azimuth_max)
  REAL :: h_range_max,h_range_max_e,h_range_max_w,h_range_max_s,h_range_max_n
  REAL :: z_range_max
  REAL :: elev_error_range
  INTEGER :: coltab_ref
  INTEGER :: ibgncol_ref
  INTEGER :: iendcol_ref
  CHARACTER(LEN=80) :: coltabfn_ref
  INTEGER :: coltab_vel
  INTEGER :: ibgncol_vel
  INTEGER :: iendcol_vel
  CHARACTER(LEN=80) :: coltabfn_vel
  NAMELIST /plotting/ h_range_max_e,h_range_max_w,h_range_max_s, &
                      h_range_max_n,z_range_max,elev_error_range,       &
                      overlayrefcontour,                                &
                      n_elevation_ref,elevations_ref,                   &
                      n_elevation_vel,elevations_vel,                   &
                      n_azimuth_ref,azimuth_ref,                        &
                      n_azimuth_vel,azimuth_vel,                        &
                      coltab_ref,ibgncol_ref,iendcol_ref,coltabfn_ref,  &
                      coltab_vel,ibgncol_vel,iendcol_vel,coltabfn_vel  


  INTEGER :: ovrmap
  INTEGER :: mapgrid
  INTEGER :: nmapfile
  CHARACTER (LEN=256) :: mapfile(mxmapfile)
  REAL :: latgrid
  REAL :: longrid
  NAMELIST /map_plot/ ovrmap,mapgrid,latgrid,longrid,nmapfile,mapfile
  INTEGER :: lmapfile
  REAL :: xorig, yorig
!
!-----------------------------------------------------------------------
!
! plot variables
!
!-----------------------------------------------------------------------
!
  REAL :: cl(100)

  REAL, ALLOCATABLE :: xrplt(:,:)
  REAL, ALLOCATABLE :: yrplt(:,:)
  REAL, ALLOCATABLE :: xvplt(:,:)
  REAL, ALLOCATABLE :: yvplt(:,:)
  REAL, ALLOCATABLE :: rplt(:,:)
  REAL, ALLOCATABLE :: rpltm(:,:)
  REAL, ALLOCATABLE :: zplt(:,:)
  REAL, ALLOCATABLE :: xrw(:)
  REAL, ALLOCATABLE :: yrw(:)
  REAL, ALLOCATABLE :: xvw(:)
  REAL, ALLOCATABLE :: yvw(:)
  REAL, ALLOCATABLE :: elevmean(:)

  INTEGER, ALLOCATABLE :: irwxy(:,:)
  INTEGER, ALLOCATABLE :: ivwxy(:,:)
  INTEGER, ALLOCATABLE :: iwrz(:,:)

  INTEGER :: ncl
  INTEGER :: mode
!
!-----------------------------------------------------------------------
!
!  INPUT RADAR PARAMETER AND OBSERVATION 
!
!-----------------------------------------------------------------------
!
  REAL :: radar_lat
  REAL :: radar_lon
  REAL :: radar_elevation

  INTEGER :: iyear,imon,iday,ihour,imin,isec

  CHARACTER(LEN=256) :: datafile
  CHARACTER(LEN=80)  :: runname
  INTEGER :: lfnkey,abstsec
  INTEGER :: wrtuaref,wrtuavel,wrtvort,idummy,vcp
  REAL :: beamwid,rmisval,rngfval,curtim

  REAL, ALLOCATABLE :: elvref(:)
  REAL, ALLOCATABLE :: elvvel(:)
  REAL, ALLOCATABLE :: reftilt(:,:)
  REAL, ALLOCATABLE :: veltilt(:,:)
  REAL, ALLOCATABLE :: datarz(:,:)

  INTEGER :: maxvelgate
  INTEGER :: maxrefgate
  INTEGER :: maxazim
  INTEGER :: maxelev

  INTEGER, ALLOCATABLE :: itimvol(:)

  REAL, ALLOCATABLE :: rngvvol(:,:)
  REAL, ALLOCATABLE :: azmvvol(:,:)
  REAL, ALLOCATABLE :: elvvvol(:,:)
  REAL, ALLOCATABLE :: velvol(:,:,:)

  REAL, ALLOCATABLE :: rngrvol(:,:)
  REAL, ALLOCATABLE :: azmrvol(:,:)
  REAL, ALLOCATABLE :: elvrvol(:,:)
  REAL, ALLOCATABLE :: refvol(:,:,:)

  REAL, ALLOCATABLE :: vnyquist(:)
  REAL, ALLOCATABLE :: uarefvol(:,:,:)
  REAL, ALLOCATABLE :: uavelvol(:,:,:)
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  INTEGER :: ifiles   
  CHARACTER(LEN=100) :: string 
  CHARACTER(LEN=100) :: stringtime
  real :: radmax ,rad
  INTEGER :: j_razim_start,nref_tilts,nvel_tilts
  INTEGER :: iazimuth
  real :: razim_start

  REAL :: elev_to_plot, xscale, yscale

  INTEGER :: kref,kvel,ktilt
  INTEGER :: kref_tilts,kvel_tilts
  REAL :: refmax, refmin, reflmin, reflmax
  REAL :: velmax, velmin
  REAL :: eleva, deg2rad

  REAL :: xradar, yradar, tem0,tem1,tem2,tem3,tem4
  LOGICAL :: fexist
  INTEGER :: zxplot_initialized = 0
  REAL :: missing_value = -999.0
  INTEGER :: iunit

  INTEGER :: i,j,k,jj

  CHARACTER(LEN=256) :: psfilename
  INTEGER :: ilen

  REAL :: factorx,factory
  REAL :: delazm,dazmin
  REAL :: elvsum,data_azim,last_azim,azmin,xconst,yconst
  INTEGER :: elvknt,jidx,jazim,nazim

!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  deg2rad=acos(-1.0)/180.0

!-----------------------------------------------------------------------
! Input data file name and grid 
!-----------------------------------------------------------------------

  READ(5,input_data,ERR=100)
  WRITE(6,'(a)') 'Namelist input_data was sucessfully read in.'

  READ(5,radar_index,ERR=100) 
  WRITE(6,'(a)') 'Namelist radar_index was sucessfully read in.'

  READ(5,grid,ERR=100) 
  WRITE(6,'(a)') 'Namelist grid was sucessfully read in.'

!-----------------------------------------------------------------------
! Input map projection parameters
!-----------------------------------------------------------------------
 
  sclfct = 1.0
  READ (5,projection,ERR=100)
  WRITE(6,'(a)') 'Namelist projection was sucessfully read in.'

  READ(5,plotting,ERR=100)
  WRITE(6,'(a)') 'Namelist plotting sucessfully read in.'

  READ(5,map_plot,ERR=100)
  WRITE(6,'(a)') 'Namelist map_plot sucessfully read in.'
!
  h_range_max = (h_range_max_e+h_range_max_w)/2.0

!-----------------------------------------------------------------------
! Read in radar data volume 
!-----------------------------------------------------------------------

  DO ifiles=1,numfiles
!
!  read in data on a tilt
!
    WRITE(datafile,'(a,a,a)') TRIM(filepath),'/',TRIM(files(ifiles))
    INQUIRE(FILE=TRIM(datafile),EXIST = fexist)
    IF( .not. fexist) THEN
      WRITE(6,'(a,a,a)') 'Radar data file ',TRIM(datafile),' not found.'
      CYCLE
    END IF

    WRITE(6,'(a,i4)') ' Radar format = ',radfmt
    iunit=27
    IF( radfmt == 1 ) THEN
      WRITE(6,'(a,a)') ' Opening: ',TRIM(datafile)
      OPEN(iunit,file=TRIM(datafile),form='unformatted',status='old')

      READ(iunit) maxvelgate,maxrefgate,maxazim,maxelev
      READ(iunit) radar_elevation,radar_lat, radar_lon
      READ(iunit) iyear,imon,iday,ihour,imin,isec

      write(6,'(3i10)') maxvelgate,maxrefgate,maxazim,maxelev 
      write(6,'(3f10.2)') radar_elevation,radar_lat,radar_lon
      write(6,'(6i6)') iyear,imon,iday,ihour,imin,isec

      ALLOCATE( rngrvol(maxrefgate,maxelev) )
      ALLOCATE( azmrvol(maxazim,maxelev) )
      ALLOCATE( elvrvol(maxazim,maxelev) )
      ALLOCATE( refvol(maxrefgate,maxazim,maxelev) )

      ALLOCATE( rngvvol(maxvelgate,maxelev) )
      ALLOCATE( azmvvol(maxazim,maxelev) )
      ALLOCATE( elvvvol(maxazim,maxelev) )
      ALLOCATE( velvol(maxvelgate,maxazim,maxelev) )

      READ(iunit) rngrvol
      READ(iunit) azmrvol
      READ(iunit) elvrvol
      READ(iunit) refvol
  
      READ(iunit) rngvvol
      READ(iunit) azmvvol
      READ(iunit) elvvvol
      READ(iunit) velvol

      close(iunit)

      psfilename=TRIM(files(ifiles))
      ilen=LEN(TRIM(psfilename))
      iday=ICHAR(psfilename(ilen-12:ilen-12))-ICHAR("0")
      iday=iday*10+(ICHAR(psfilename(ilen-11:ilen-11))-ICHAR("0"))
      ihour=ICHAR(psfilename(ilen-9:ilen-9))-ICHAR("0")
      ihour=ihour*10+(ICHAR(psfilename(ilen-8:ilen-8))-ICHAR("0"))
      imin=ICHAR(psfilename(ilen-7:ilen-7))-ICHAR("0")
      imin=imin*10+(ICHAR(psfilename(ilen-6:ilen-6))-ICHAR("0"))

    ELSE IF (radfmt == 2) THEN   ! radar emulator binary file
      WRITE(6,'(a,a)') ' Opening: ',TRIM(datafile)
      OPEN(iunit,FILE=TRIM(datafile),FORM='unformatted',STATUS='old')
      READ(iunit) runname
      lfnkey=80
      CALL gtlfnkey(runname,lfnkey)
      WRITE(6,'(a,a)') ' Runname:',runname(1:lfnkey)
      READ(iunit) radar_symbol
      WRITE(6,'(a,a)') ' Radar name:',radar_symbol
      READ(iunit) maxvelgate,maxrefgate,maxazim,maxelev
      WRITE(6,'(a,i6,a,i6,a,i6)')                                          &
        ' Ngate : ',maxvelgate,' Nazim: ',maxazim,' maxelev: ',maxelev
      READ(iunit) iyear,imon,iday,ihour,imin,isec
      WRITE(6,'(2(a,i2.2),a,i4.4,3(a,i2.2))')                              &
        ' Date: ',imon,'/',iday,'/',iyear,' Time: ',ihour,':',imin,':',isec
      READ(iunit) radar_elevation,radar_lat,radar_lon
      WRITE(6,'(a,f9.2,a,f9.2,a,f9.2)')                                      &
        ' Latitude:',radar_lat,'  Longitude:',radar_lon, &
        ' Elevation:',radar_elevation
      READ(iunit) vcp,beamwid,rmisval,rngfval,curtim
      WRITE(6,'(a,i5,a,f9.2,a,f10.1,a,f10.1)')                               &
        ' VCP:',vcp,' Beamwidth:',beamwid,                                   &
        ' MissVal: ',rmisval,' RngfVal :',rngfval
!
      CALL ctim2abss(iyear,imon,iday,ihour,imin,isec,abstsec)
      READ(iunit) wrtuaref,wrtuavel,wrtvort,                                 &
                idummy,idummy,idummy,idummy,idummy

      WRITE(6,'(a)') ' Allocating volume memory '

      ALLOCATE(itimvol(maxelev))
      ALLOCATE(rngrvol(maxrefgate,maxelev))
      ALLOCATE(azmrvol(maxazim,maxelev))
      ALLOCATE(elvrvol(maxazim,maxelev))
      ALLOCATE(refvol(maxrefgate,maxazim,maxelev))
      IF(wrtuaref /= 0) ALLOCATE(uarefvol(maxrefgate,maxazim,maxelev))

      ALLOCATE(vnyquist(maxelev))
      ALLOCATE(rngvvol(maxvelgate,maxelev))
      ALLOCATE(azmvvol(maxazim,maxelev))
      ALLOCATE(elvvvol(maxazim,maxelev))
      ALLOCATE(velvol(maxvelgate,maxazim,maxelev))
      IF(wrtuavel /= 0) ALLOCATE(uavelvol(maxvelgate,maxazim,maxelev))
                     
      WRITE(6,'(a)') ' Reading Time Array'
      READ(iunit) itimvol
      WRITE(6,'(a)') ' Reading Reflectivity Arrays'
      READ(iunit) rngrvol
      READ(iunit) azmrvol
      READ(iunit) elvrvol
      READ(iunit) refvol
      IF( wrtuaref /= 0 ) READ(iunit) uarefvol

      WRITE(6,'(a)') ' Reading Velocity Arrays'
      READ(iunit) vnyquist
      READ(iunit) rngvvol
      READ(iunit) azmvvol
      READ(iunit) elvvvol
      READ(iunit) velvol
      IF( wrtuavel /= 0 ) READ(iunit) uavelvol
!
      WRITE(6,'(a)') ' Reading successfully completed'
      CLOSE(iunit)

    ELSE IF (radfmt == 4) THEN   ! CASA-formatted NetCDF file
      WRITE(6,'(a,i6,a)') ' Radar format number ',radfmt,' not yet implemented'
      STOP
    ELSE
      WRITE(6,'(a,i6,a)') ' Radar format number ',radfmt,' not supported.'
      STOP
    END IF

    IF ( mapproj == 0 ) THEN
        trulat1 = radar_lat
        trulat2 = radar_lat
        trulon  = radar_lon
    END IF

!-----------------------------------------------------------------------
! plot set-up
!-----------------------------------------------------------------------
    print *, ' Begin plotting'

    ALLOCATE(elvref(maxelev))
    ALLOCATE(elvvel(maxelev))

    factorx=0.3
    factory=0.3
    IF(h_range_max_w + h_range_max_e > h_range_max_s + h_range_max_n ) THEN
       h_range_max=(h_range_max_e+h_range_max_w)/2
       factory=factorx*(h_range_max_s + h_range_max_n)/(h_range_max_w + h_range_max_e)
    ELSE
       factorx=factory*(h_range_max_w + h_range_max_e)/(h_range_max_s + h_range_max_n)
       h_range_max=(h_range_max_n+h_range_max_s)/2
    END IF

    IF( n_elevation_ref > 0 .or. n_azimuth_ref > 0 .or.                    &
        n_elevation_vel > 0 .or. n_azimuth_vel > 0 ) THEN
      IF( zxplot_initialized == 0 ) THEN 
        CALL xpsfn('zxout'//'.ps', 5) 
                    ! PS output will be called zxout.ps
        CALL xpaprlnth( 1.0 )

        CALL xdevic     ! begin graphic
        zxplot_initialized = 1 
      END IF
    END IF

    elvref=-99.
    DO ktilt=1,maxelev
      elvsum=0.
      elvknt=0
      DO j=1,maxazim
        IF(elvrvol(j,ktilt) > -9.) THEN
          elvknt=elvknt+1
          elvsum=elvsum+elvrvol(j,ktilt)
        END IF
      END DO
      IF(elvknt > 0) THEN
        elvref(ktilt)=elvsum/float(elvknt)
        nref_tilts=ktilt
      ELSE
        elvref(ktilt)=-99.
      END IF
      WRITE(6,'(a,i4,a,f10.2)') ' Elevation(',ktilt,') = ',elvref(ktilt)
    END DO
    WRITE(6,'(a,i4)') ' nref_tilts=',nref_tilts

    elvvel=-99.
    DO ktilt=1,maxelev
      elvsum=0.
      elvknt=0
      DO j=1,maxazim
        IF(elvvvol(j,ktilt) > -9.) THEN
          elvknt=elvknt+1
          elvsum=elvsum+elvrvol(j,ktilt)
        END IF
      END DO
      IF(elvknt > 0) THEN
        elvvel(ktilt)=elvsum/float(elvknt)
        nref_tilts=ktilt
      ELSE
        elvvel(ktilt)=-99.
      END IF
      WRITE(6,'(a,i4,a,f10.2)') ' Elevation(',ktilt,') = ',elvvel(ktilt)
    END DO
    WRITE(6,'(a,i4)') ' nvel_tilts=',nvel_tilts

!-----------------------------------------------------------------------
! plot reflectivity variables
!-----------------------------------------------------------------------

    IF(n_elevation_ref > 0) THEN

    WRITE(6,'(a)') ' Allocating xrplt,yrplt,reftilt ...'
    ALLOCATE( xrplt(maxrefgate,(maxazim+1)) )
    ALLOCATE( yrplt(maxrefgate,(maxazim+1)) )
    ALLOCATE( reftilt(maxrefgate,(maxazim+1)) )
    ALLOCATE( irwxy(maxrefgate,(maxazim+1)) )
    ALLOCATE( xrw(8*maxrefgate) )
    ALLOCATE( yrw(8*maxrefgate) )

    WRITE(6,'(a)') ' Reflectivity tilt plotting...'

    DO ktilt = 1,n_elevation_ref

      elev_to_plot = elevations_ref(ktilt)

      kref = 0 
      DO k = 1,maxelev
        IF( abs( elvref(k)-elev_to_plot )                   &
                            < elev_error_range ) THEN
          kref = k
          EXIT
        END IF
      END DO

      IF(kref == 0 ) CYCLE  ! no elevation angle 
                            ! within error range was found
      refmin = 1000.0
      refmax =-1000.0
      velmin = 1000.0
      refmax =-1000.0

      eleva=elvref(kref)

      last_azim=-999.
      jazim=0
      DO j=1,maxazim
        jidx=j
        IF(jidx > maxazim) jidx=jidx-maxazim
        data_azim=azmrvol(jidx,kref)
        IF(data_azim >= 0. .AND. (abs(data_azim-last_azim) > 1.0E-04)) THEN
          jazim=jazim+1
          last_azim=data_azim
          xconst=cos( (90.-data_azim)*deg2rad ) 
          yconst=sin( (90.-data_azim)*deg2rad ) 
          reflmax=-999.
          reflmin=999.
          DO i=1,maxrefgate
            rad = 0.001 * rngrvol(i,kref)
            xrplt(i,jazim)= rad * xconst
            yrplt(i,jazim)= rad * yconst
            reftilt(i,jazim)=max(refvol(i,jidx,kref),-30.)

            IF(refvol(i,jidx,kref) > missing_value ) THEN 
              refmax=max(refvol(i,jidx,kref),refmax)
              refmin=min(refvol(i,jidx,kref),refmin)
              reflmax=max(refvol(i,jidx,kref),reflmax)
              reflmin=min(refvol(i,jidx,kref),reflmin)
            END IF
          END DO
          print *, ' Azimuth,reflmin,reflmax: ',data_azim,reflmin,reflmax
        END IF
      END DO
      nazim=jazim

      WRITE(6,'(a,2f10.2)') ' Refmin, Refmax on tilt= ', refmin, refmax
      WRITE(6,'(a,i5)') 'N unique azimuths: ',nazim
!
!-----------------------------------------------------------------------
! Define plotting space.
!
      CALL xpspac(0.5-factorx,0.5+factorx,0.5-factory,0.5+factory)
      CALL xmap(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)

      CALL xlabmask(1)

      IF( coltab_ref == -1 ) CALL xstctfn(coltabfn_ref)
      CALL xsetclrs(coltab_ref)  ! Use internally defined color map number 6
      CALL xcolor(1)    ! Set color to black
      CALL xcfont(3)
!
      call xaxfmt('(I4)')
!
! Set tentative color interval and limit on the min/max number of contours
!
      cl(1)=0.0
      cl(2)=5.0           ! Set tentative contour interval
      CALL xnctrs(2,100)  ! Set lower and upper limits
                          ! on the number of contours allowed
                          ! It's used by both xcolfil and xclimit
      CALL xnctrs(5,20)   ! Set lower and upper limits
      mode=2

      call xctrbadv(1)    ! Turn on bad value checking
                          !     in contouring routine
      call xbadval( missing_value ) ! Specify bad value flag
!
! plot a color filled contour field for positive values
!
      CALL xctrclr(ibgncol_ref,iendcol_ref)   ! Use colors between 10 and 39 inclusive

      CALL xctrlim(5.0, 75.0) ! Only contours above zero are plotted

      CALL xwindw(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)
      WRITE(6,'(a,f10.2)') &
       ' Plotting colfil reflectivity field at elevation angle = ', eleva
      CALL xcolfil(reftilt,xrplt,yrplt,irwxy,xrw,yrw,                   &
                       maxrefgate,maxrefgate,nazim, cl, ncl,mode)

      IF ( overlayrefcontour == 1 ) THEN
        call XCLTYP(0)
        CALL xctrclr(14,15)   ! Use colors between 10 and 39 inclusive
        mode=3
        ncl=1
        cl(1)=15.0
        CALL XCONTA(reftilt,xrplt,yrplt,irwxy, &
                    maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
        cl(1)=30.0
        CALL XCONTA(reftilt,xrplt,yrplt,irwxy, &
                    maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
        cl(1)=45.0
        CALL XCONTA(reftilt,xrplt,yrplt,irwxy, &
                    maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
        cl(1)=55.0
        CALL XCONTA(reftilt,xrplt,yrplt,irwxy, &
                    maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
      END IF

      CALL xwdwof
      CALL xaxsca(-h_range_max_w, h_range_max_e, 0.1*h_range_max,          &
                  -h_range_max_s, h_range_max_n, 0.1*h_range_max)

      WRITE(string,'(a,f5.2)') 'Reflectivity at Elevation Angle=',eleva
      CALL xchsiz(0.025*2*h_range_max )  ! Set character size
      CALL xcharc((-h_range_max_w+h_range_max_e)*0.5, &
           h_range_max_n+2*h_range_max*0.04, trim(string) )

      WRITE(stringtime,'(a,i2.2,a,i2.2,a,i4,a,i2.2,a,i2.2)') 'Scan Time:',      &
            imon,'/',iday,'/',iyear, ' ',ihour,':',imin 
      CALL xchsiz(0.025*2*h_range_max )  ! Set character size
      CALL xcharc((-h_range_max_w+h_range_max_e)*0.5, &
           h_range_max_n+2*h_range_max*0.01, trim(stringtime) )

      CALL xchsiz(0.02* 2*h_range_max )  ! Set character size
      CALL xcpalet(1)            ! Plot horizontal color palette

      xscale = h_range_max
      yscale = h_range_max
      xorig = -(h_range_max_e+h_range_max_w)/2.0
      yorig = -(h_range_max_s+h_range_max_n)/2.0

      xradar = 0.0
      yradar = 0.0
      CALL xthick(3)
      CALL xpenup( xradar-xscale*0.02, yradar )
      CALL xpendn( xradar+xscale*0.02, yradar )
      CALL xpenup( xradar, yradar-yscale*0.02 )
      CALL xpendn( xradar, yradar+yscale*0.02 )
      call xthick(1)
      CALL xchsiz(0.02* 2*h_range_max )  ! Set character size
      CALL xcharc(xradar, yradar-0.05*yscale, radar_symbol)

      xscale = h_range_max_e+h_range_max_w
      yscale = h_range_max_s+h_range_max_n
      CALL XSTPJGRD(mapproj,trulat1,trulat2,trulon,ctrlat,ctrlon,       & 
                    xscale,yscale,xorig,yorig)
      CALL xwindw(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)

      IF( ovrmap /= 0 ) THEN
        DO i=1,MIN(mxmapfile,nmapfile)
          lmapfile=len_trim(mapfile(i))
          WRITE(6,'(1x,a,a)') 'Input was ',trim(mapfile(i))

          INQUIRE(FILE=trim(mapfile(i)), EXIST = fexist )
          IF( .NOT.fexist) THEN
            WRITE(6,'(a)') 'Map file '//mapfile(i)(1:lmapfile)//         &
                 ' not found. Corresponding map no plotted.'
          ELSE
            CALL xdrawmap(10,mapfile(i)(1:lmapfile),latgrid,longrid)
          END IF
        END DO
      END IF

      CALL xwdwof

      CALL xframe

    END DO ! ktilt 

    DEALLOCATE( xrplt )
    DEALLOCATE( yrplt )
    DEALLOCATE( reftilt )
    DEALLOCATE( irwxy )
    DEALLOCATE( xrw )
    DEALLOCATE( yrw )

  END IF  !  n_elevation_ref>0
!
!-----------------------------------------------------------------------
! To plot vertical cross-sections of reflectivity
!-----------------------------------------------------------------------
!
  IF(n_azimuth_ref > 0) THEN

    ALLOCATE( rplt(maxrefgate,nref_tilts))
    ALLOCATE( rpltm(maxrefgate,nref_tilts))
    ALLOCATE( zplt(maxrefgate,nref_tilts))
    ALLOCATE( datarz(maxrefgate,nref_tilts) )
    ALLOCATE( iwrz(maxrefgate,nref_tilts) )
    ALLOCATE( xrw(8*maxrefgate) )
    ALLOCATE( yrw(8*maxrefgate) )

    DO k=1,nref_tilts
      DO i=1,maxrefgate
        rad = 0.001 * rngrvol(i,k)
        rplt(i,k)= rad*cos( elvref(k)*deg2rad )
        rpltm(i,k)=-rad*cos( elvref(k)*deg2rad )
        zplt(i,k)= rad*sin( elvref(k)*deg2rad )
      END DO
    END DO

    DO iazimuth= 1,n_azimuth_ref

      WRITE(6,'(a,f10.2)') &
        ' Plotting vertical cross-section at azimuth angle = ',      &
                                azimuth_ref(iazimuth)

      CALL xpspac(0.1,0.9,0.2,0.6)
      z_range_max = 12.0

      CALL xmap(-h_range_max, h_range_max, 0.0, z_range_max)

      CALL xlabmask(1)

      IF( coltab_ref == -1 ) CALL xstctfn(coltabfn_ref)
      CALL xsetclrs(coltab_ref)  ! Use internally defined color map number 6
      CALL xcolor(1)    ! Set color to black
      CALL xcfont(3)
!
! Set tentative color interval and limit on the min/max number of contours
!
      cl(1)=0.0
      cl(2)=5.0           ! Set tentative contour interval
      CALL xnctrs(2,100)  ! Set lower and upper limits
                          ! on the number of contours allowed
                          ! It's used by both xcolfil and xclimit
      CALL xnctrs(5,20)  ! Set lower and upper limits
      mode=2

      CALL xctrbadv(1)   ! Turn on bad value checking
                         ! in contouring routine
      CALL xbadval( missing_value ) ! Specify bad value flag
!
! plot a color filled contour field for positive values
!
      CALL xctrclr(ibgncol_ref,iendcol_ref) ! Use colors between 10 and 39 inclusive

      CALL xctrlim(5.0, 75.0) ! Only contours above zero are plotted
      CALL xwindw(-h_range_max, h_range_max, 0.0, z_range_max)

      DO k=1,nref_tilts
        jj=1
        dazmin=720.
        DO j=1,maxazim
          delazm=azmrvol(j,k)-azimuth_ref(iazimuth)
          IF(delazm > 180.) delazm=delazm-360.
          IF(delazm < -180.) delazm=delazm+360.
          delazm=abs(delazm)
          IF(delazm < dazmin) THEN
            jj=j
            dazmin=delazm
          END IF
        END DO
        DO i=1,maxrefgate
          datarz(i,k) = max(refvol(i,jj,k),-30.)
        END DO
      END DO
 
      CALL xcolfil(datarz,rplt,zplt,iwrz,xrw,yrw, &
                   maxrefgate,maxrefgate,nref_tilts,cl,ncl,mode)

      tem0 = azimuth_ref(iazimuth)+180.0
      IF( tem0 > 360.) tem0=tem0-360.

      DO k=1,nref_tilts
        jj=1
        dazmin=720.
        DO j=1,maxazim
          delazm=azmrvol(j,k)-tem0
          IF(delazm > 180.) delazm=delazm-360.
          IF(delazm < -180.) delazm=delazm+360.
          delazm=abs(delazm)
          IF(delazm < dazmin) THEN
            jj=j
            dazmin=delazm
          END IF
        END DO
        DO i=1,maxrefgate
          datarz(i,k) = max(refvol(i,jj,k),-30.)
        END DO
      END DO
      CALL xcolfil(datarz,rpltm,zplt,iwrz,xrw,yrw,                   &
                   maxrefgate,maxrefgate,nref_tilts,cl,ncl,mode)

      CALL xwdwof

      CALL xaxsca(-h_range_max, h_range_max, 0.1*h_range_max,         &
                       0.0, z_range_max, 0.5 )

      WRITE(string,'(a,f6.2)')                                        &
            ' Reflectivity at Azimuth Angle=',azimuth_ref(iazimuth)
      CALL xchsiz(0.06*z_range_max )  ! Set character size
      CALL xcharc(0.0, z_range_max*1.10, trim(string) )

      WRITE(stringtime,'(a,i2.2,a,i2.2,a,i4,a,i2.2,a,i2.2)') 'First Scan Time:',&
            imon,'/',iday,'/',iyear,               &
            ' ',ihour,':',imin
      CALL xchsiz(0.05*z_range_max )  ! Set character size
      CALL xcharc(0.0, z_range_max*1.04, trim(stringtime) )

      CALL xchsiz(0.04*z_range_max )  ! Set character size
      CALL xcpalet(1)            ! Plot horizontal color palette

      CALL xframe

    END DO ! iazimuth

    DEALLOCATE( rplt )
    DEALLOCATE( rpltm )
    DEALLOCATE( zplt )
    DEALLOCATE( iwrz )
    DEALLOCATE( xrw )
    DEALLOCATE( yrw )
    DEALLOCATE( datarz )

  END IF   ! n_azimuth_ref
!
! Velocity data plotting section
!
  IF (n_elevation_vel > 0 ) THEN

    WRITE(6,'(a)') ' Allocating x,y,veltilt ...'
    ALLOCATE( xvplt(maxvelgate,(maxazim+1)) )
    ALLOCATE( yvplt(maxvelgate,(maxazim+1)) )
    ALLOCATE( veltilt(maxvelgate,(maxazim+1)) )
    ALLOCATE( ivwxy(maxvelgate,(maxazim+1)) )
    ALLOCATE( xvw(8*maxvelgate) )
    ALLOCATE( yvw(8*maxvelgate) )

    IF ( overlayrefcontour == 1 ) THEN
      ALLOCATE( xrplt(maxrefgate,(maxazim+1)) )
      ALLOCATE( yrplt(maxrefgate,(maxazim+1)) )
      ALLOCATE( reftilt(maxrefgate,(maxazim+1)) )
      ALLOCATE( irwxy(maxrefgate,(maxazim+1)) )
      ALLOCATE( xrw(8*maxrefgate) )
      ALLOCATE( yrw(8*maxrefgate) )
    END IF

    WRITE(6,'(a)') ' Radial Velocity tilt plotting...'

    DO ktilt = 1,n_elevation_vel

      elev_to_plot = elevations_vel(ktilt)

      kvel = 0 
      DO k = 1,maxelev
        IF( abs( elvref(k)-elev_to_plot )                   &
                            < elev_error_range ) THEN
          kvel = k
          EXIT
        END IF
      END DO

      IF(kvel == 0 ) CYCLE  ! no elevation angle 
                            ! within error range was found
      velmin = 1000.0
      velmax =-1000.0
      velmin = 1000.0
      velmax =-1000.0

      eleva=elvref(kvel)

      last_azim=-999.
      jazim=0
      DO j=1,maxazim+1
        jidx=j
        IF(jidx > maxazim) jidx=jidx-maxazim
        data_azim=azmvvol(jidx,kvel)
        IF(data_azim >= 0. .AND. (abs(data_azim-last_azim) > 1.0E-04)) THEN
          jazim=jazim+1
          last_azim=data_azim
          xconst=cos( (90.-data_azim)*deg2rad ) 
          yconst=sin( (90.-data_azim)*deg2rad ) 
          DO i=1,maxvelgate
            rad = 0.001 * rngvvol(i,kvel)
            xvplt(i,jazim)= rad * xconst
            yvplt(i,jazim)= rad * yconst
            veltilt(i,jazim)=max(velvol(i,jidx,kvel),-150.)

            IF(velvol(i,jidx,kvel) > missing_value ) THEN 
              velmax=max(velvol(i,jidx,kvel),velmax)
              velmin=min(velvol(i,jidx,kvel),velmin)
            END IF
          END DO
        END IF
      END DO

      nazim=jazim

      WRITE(6,'(a,2f10.2)') ' Velmin, Velmax on tilt= ', velmin, velmax
      WRITE(6,'(a,i5)') 'N unique azimuths: ',nazim
!
!-----------------------------------------------------------------------
! Define plotting space.
!
      CALL xpspac(0.5-factorx,0.5+factorx,0.5-factory,0.5+factory)
      CALL xmap(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)

      CALL xlabmask(1)

      IF( coltab_vel == -1 ) CALL xstctfn(coltabfn_vel)
      CALL xsetclrs(coltab_vel)  ! Use internally defined color map number 6
      CALL xcolor(1)    ! Set color to black
      CALL xcfont(3)
!
      call xaxfmt('(I4)')
!
! Set tentative color interval and limit on the min/max number of contours
!
      cl(1)=0.0
      cl(2)=5.0           ! Set tentative contour interval
      CALL xnctrs(2,100)  ! Set lower and upper limits
                          ! on the number of contours allowed
                          ! It's used by both xcolfil and xclimit
      CALL xnctrs(5,20)   ! Set lower and upper limits
      mode=2

      call xctrbadv(1)    ! Turn on bad value checking
                          !     in contouring routine
      call xbadval( missing_value ) ! Specify bad value flag

      CALL xctrclr(ibgncol_vel,iendcol_vel)

      CALL xctrlim(-50.0, 50.0) 

      CALL xwindw(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)
      WRITE(6,'(a,f10.2)') &
        'Plotting colfil radial velocity at elevation angle=',eleva
      CALL xcolfil(veltilt,xvplt,yvplt,ivwxy,xvw,yvw,                   &
                       maxvelgate,maxvelgate,nazim, cl, ncl,mode)

      IF ( overlayrefcontour == 1 ) THEN

        kref = 0 
        DO k = 1,maxelev
          IF( abs( elvref(k)-elev_to_plot )                   &
                              < elev_error_range ) THEN
            kref = k
            EXIT
          END IF
        END DO

        IF(kref /= 0 ) THEN
          refmin = 1000.0
          refmax =-1000.0
          velmin = 1000.0
          refmax =-1000.0

          eleva=elvref(kref)

          last_azim=-999.
          jazim=0
          DO j=1,maxazim+1
            jidx=j
            IF(jidx > maxazim) jidx=jidx-maxazim
            data_azim=azmrvol(jidx,kref)
            IF(data_azim >= 0. .AND. (abs(data_azim-last_azim) > 1.0E-04)) THEN
              jazim=jazim+1
              last_azim=data_azim
              xconst=cos( (90.-data_azim)*deg2rad ) 
              yconst=sin( (90.-data_azim)*deg2rad ) 
              DO i=1,maxrefgate
                rad = 0.001 * rngrvol(i,kref)
                xrplt(i,jazim)= rad * xconst
                yrplt(i,jazim)= rad * yconst
                reftilt(i,jazim)=max(refvol(i,jidx,kref),-30.)
    
                IF(refvol(i,jidx,kref) > missing_value ) THEN 
                  refmax=max(refvol(i,jidx,kref),refmax)
                  refmin=min(refvol(i,jidx,kref),refmin)
                END IF
              END DO
            END IF
          END DO
          nazim=jazim
    
          call XCLTYP(0)
          CALL xctrclr(14,15)   ! Use colors between 10 and 39 inclusive
          mode=3
          ncl=1
          cl(1)=15.0
          CALL XCONTA(reftilt,xrplt,yrplt,irwxy,    &
                      maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
          cl(1)=30.0
          CALL XCONTA(reftilt,xrplt,yrplt,irwxy,    &
                      maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
          cl(1)=45.0
          CALL XCONTA(reftilt,xrplt,yrplt,irwxy,    &
                      maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
          cl(1)=55.0
          CALL XCONTA(reftilt,xrplt,yrplt,irwxy,    &
                      maxrefgate,maxrefgate,nazim, CL, NCL,MODE)
        END IF
      END IF

      CALL xwdwof
      CALL xaxsca(-h_range_max_w, h_range_max_e, 0.1*h_range_max,          &
                  -h_range_max_s, h_range_max_n, 0.1*h_range_max)

      WRITE(string,'(a,f5.2)') 'Radial Velocity at Elevation Angle=',eleva
      CALL xchsiz(0.025*2*h_range_max )  ! Set character size
      CALL xcharc((-h_range_max_w+h_range_max_e)*0.5, &
           h_range_max_n+2*h_range_max*0.04, trim(string) )

      WRITE(stringtime,'(a,i2.2,a,i2.2,a,i4,a,i2.2,a,i2.2)') 'Scan Time:',      &
            imon,'/',iday,'/',iyear, ' ',ihour,':',imin 
      CALL xchsiz(0.025*2*h_range_max )  ! Set character size
      CALL xcharc((-h_range_max_w+h_range_max_e)*0.5, &
           h_range_max_n+2*h_range_max*0.01, trim(stringtime) )

      CALL xchsiz(0.02* 2*h_range_max )  ! Set character size
      CALL xcpalet(1)            ! Plot horizontal color palette

      xscale = h_range_max
      yscale = h_range_max
      xorig = -(h_range_max_e+h_range_max_w)/2.0
      yorig = -(h_range_max_s+h_range_max_n)/2.0

      xradar = 0.0
      yradar = 0.0
      CALL xthick(3)
      CALL xpenup( xradar-xscale*0.02, yradar )
      CALL xpendn( xradar+xscale*0.02, yradar )
      CALL xpenup( xradar, yradar-yscale*0.02 )
      CALL xpendn( xradar, yradar+yscale*0.02 )
      call xthick(1)
      CALL xchsiz(0.02* 2*h_range_max )  ! Set character size
      CALL xcharc(xradar, yradar-0.05*yscale, radar_symbol)

      xscale = h_range_max_e+h_range_max_w
      yscale = h_range_max_s+h_range_max_n
      CALL XSTPJGRD(mapproj,trulat1,trulat2,trulon,ctrlat,ctrlon,       & 
                    xscale,yscale,xorig,yorig)
      CALL xwindw(-h_range_max_w, h_range_max_e, -h_range_max_s, h_range_max_n)

      IF( ovrmap /= 0 ) THEN
        DO i=1,MIN(mxmapfile,nmapfile)
          lmapfile=len_trim(mapfile(i))
          WRITE(6,'(1x,a,a)') 'Input was ',trim(mapfile(i))

          INQUIRE(FILE=trim(mapfile(i)), EXIST = fexist )
          IF( .NOT.fexist) THEN
            WRITE(6,'(a)') 'Map file '//mapfile(i)(1:lmapfile)//         &
                 ' not found. Corresponding map no plotted.'
          ELSE
            CALL xdrawmap(10,mapfile(i)(1:lmapfile),latgrid,longrid)
          END IF
        END DO
      END IF

      CALL xwdwof

      CALL xframe

    END DO ! ktilt 

    DEALLOCATE( ivwxy )
    DEALLOCATE( xvw )
    DEALLOCATE( yvw )
    DEALLOCATE( xvplt )
    DEALLOCATE( yvplt )
    DEALLOCATE( veltilt )

    IF(overlayrefcontour == 1) THEN
      DEALLOCATE( irwxy )
      DEALLOCATE( xrw )
      DEALLOCATE( yrw )
      DEALLOCATE( xrplt )
      DEALLOCATE( yrplt )
      DEALLOCATE( reftilt )
    END IF

  END IF  !  n_elevation_vel>0
!
!-----------------------------------------------------------------------
! To plot vertical cross-sections of radial velocity
!-----------------------------------------------------------------------
!
  IF(n_azimuth_vel > 0) THEN

    ALLOCATE( rplt(maxvelgate,nvel_tilts))
    ALLOCATE( rpltm(maxvelgate,nvel_tilts))
    ALLOCATE( zplt(maxvelgate,nvel_tilts))
    ALLOCATE( datarz(maxvelgate,nvel_tilts) )
    ALLOCATE( iwrz(maxvelgate,nvel_tilts) )
    ALLOCATE( xvw(8*maxvelgate) )
    ALLOCATE( yvw(8*maxvelgate) )

    DO k=1,nvel_tilts
      DO i=1,maxvelgate
        rad = 0.001 * rngvvol(i,k)
        rplt(i,k)= rad*cos( elvref(k)*deg2rad )
        rpltm(i,k)=-rad*cos( elvref(k)*deg2rad )
        zplt(i,k)= rad*sin( elvref(k)*deg2rad )
      END DO
    END DO

    DO iazimuth= 1,n_azimuth_vel

      WRITE(6,'(a,f10.2)') &
        ' Plotting vertical cross-section at azimuth angle = ',      &
                                azimuth_vel(iazimuth)

      CALL xpspac(0.1,0.9,0.2,0.6)
      z_range_max = 12.0

      CALL xmap(-h_range_max, h_range_max, 0.0, z_range_max)

      CALL xlabmask(1)

      IF( coltab_vel == -1 ) CALL xstctfn(coltabfn_vel)
      CALL xsetclrs(coltab_vel)  ! Use internally defined color map number 6
      CALL xcolor(1)    ! Set color to black
      CALL xcfont(3)
!
! Set tentative color interval and limit on the min/max number of contours
!
      cl(1)=0.0
      cl(2)=5.0           ! Set tentative contour interval
      CALL xnctrs(2,100)  ! Set lower and upper limits
                          ! on the number of contours allowed
                          ! It's used by both xcolfil and xclimit
      CALL xnctrs(5,20)  ! Set lower and upper limits
      mode=2

      CALL xctrbadv(1)   ! Turn on bad value checking
                         ! in contouring routine
      CALL xbadval( missing_value ) ! Specify bad value flag
!
! plot a color filled contour field for positive values
!
      CALL xctrclr(ibgncol_vel,iendcol_vel) ! Use colors between 10 and 39 inclusive

      CALL xctrlim(50.0, 50.0) ! Only contours above zero are plotted
      CALL xwindw(-h_range_max, h_range_max, 0.0, z_range_max)

      DO k=1,nvel_tilts
        jj=1
        dazmin=720.
        DO j=1,maxazim
          delazm=azmrvol(j,k)-azimuth_vel(iazimuth)
          IF(delazm > 180.) delazm=delazm-360.
          IF(delazm < -180.) delazm=delazm+360.
          delazm=abs(delazm)
          IF(delazm < dazmin) THEN
            jj=j
            dazmin=delazm
          END IF
        END DO
        DO i=1,maxvelgate
          datarz(i,k) = max(velvol(i,jj,k),-30.)
        END DO
      END DO
 
      CALL xcolfil(datarz,rplt,zplt,iwrz,xvw,yvw, &
                   maxvelgate,maxvelgate,nvel_tilts,cl,ncl,mode)

      tem0 = azimuth_vel(iazimuth)+180.0
      IF( tem0 > 360.) tem0=tem0-360.

      DO k=1,nvel_tilts
        jj=1
        dazmin=720.
        DO j=1,maxazim
          delazm=azmrvol(j,k)-tem0
          IF(delazm > 180.) delazm=delazm-360.
          IF(delazm < -180.) delazm=delazm+360.
          delazm=abs(delazm)
          IF(delazm < dazmin) THEN
            jj=j
            dazmin=delazm
          END IF
        END DO
        DO i=1,maxvelgate
          datarz(i,k) = max(velvol(i,jj,k),-30.)
        END DO
      END DO
      CALL xcolfil(datarz,rpltm,zplt,iwrz,xvw,yvw,                   &
                   maxvelgate,maxvelgate,nvel_tilts,cl,ncl,mode)

      CALL xwdwof

      CALL xaxsca(-h_range_max, h_range_max, 0.1*h_range_max,         &
                       0.0, z_range_max, 0.5 )

      WRITE(string,'(a,f6.2)')                                        &
            ' Radial Velocity at Azimuth Angle=',azimuth_vel(iazimuth)
      CALL xchsiz(0.06*z_range_max )  ! Set character size
      CALL xcharc(0.0, z_range_max*1.10, trim(string) )

      WRITE(stringtime,'(a,i2.2,a,i2.2,a,i4,a,i2.2,a,i2.2)') 'First Scan Time:',&
            imon,'/',iday,'/',iyear,               &
            ' ',ihour,':',imin
      CALL xchsiz(0.05*z_range_max )  ! Set character size
      CALL xcharc(0.0, z_range_max*1.04, trim(stringtime) )

      CALL xchsiz(0.04*z_range_max )  ! Set character size
      CALL xcpalet(1)            ! Plot horizontal color palette

      CALL xframe

    END DO ! iazimuth

    DEALLOCATE( rplt )
    DEALLOCATE( rpltm )
    DEALLOCATE( zplt )
    DEALLOCATE( iwrz )
    DEALLOCATE( xvw )
    DEALLOCATE( yvw )
    DEALLOCATE( datarz )

    END IF   ! n_azimuth_vel
!
!-----------------------------------------------------------------------
! End of processing for this file
!-----------------------------------------------------------------------
!
    DEALLOCATE( rngrvol)
    DEALLOCATE( azmrvol)
    DEALLOCATE( elvrvol)
    DEALLOCATE( refvol)
    DEALLOCATE( rngvvol)
    DEALLOCATE( azmvvol)
    DEALLOCATE( elvvvol)
    DEALLOCATE( velvol)

    IF(wrtuaref /= 0) DEALLOCATE(uarefvol)
    IF(wrtuavel /= 0) DEALLOCATE(uavelvol)

  END DO ! ifiles
  IF( zxplot_initialized == 1 ) CALL xgrend  ! End graphics

  STOP  999

100 CONTINUE
  Write(6,'(a)') 'Error reading namelist input file.'
  Write(6,'(a)') 'Program aborted.'
  STOP  101

END PROGRAM PLT_RADAR_TILT

!
!##################################################################
!##################################################################
!######                                                      ######
!######      Advanced Regional Prediction System (ARPS)      ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!
!

SUBROUTINE OUTPUT_REGULAR(regular_file, ntilts_max,ntilts,              &
                  radar_symbol,radar_lat,radar_lon,radar_elevation,     &
                  ngate,nray,fstgat,gatsp,int_razim,eleva,              &
                  volume )
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Out put 3d regular polar grid data for further retrival.
!
!-----------------------------------------------------------------------
!
!
!  AUTHOR: Ming Hu
!  03/19/02.
!
!  MODIFICATION HISTORY:
!
! INPUT:
!
!   regular_file  file name that data will be saved into
!   ntilts_max    maximum number of tilts
!   ntilts        actual number of tilts in this observation data
!   radar_symbol  radar Name 
!   radar_lat     radar location: latitude
!   radar_lon     radar location: longitude
!   radar_elevation  radar location: elavation
!
!   ngate      number of gates of observation data per radial
!   nray       number of radials of data( here = 361 )
!   fstgat     distance from radar of first gate of data(meters)
!   gatsp      gate spacing of data (meters)
!
!   volume(ngate,nray,ntilts)    Array containing one full volume scan of
!                                observation(reflectivity or radial velocity
!                                which has been intepolated to 1-degree
!                                regular spaced polar angles
!  int_razim(nray)     azimuth angle for each radial (degrees)
!  eleva(ntilts_max)   elevation angle for each tilt
!
!
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE

!-----------------------------------------------------------------------
!
!  INPUT RADAR PARAMETER AND OBSERVATION
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: regular_file
  INTEGER :: ntilts_max
  INTEGER :: ntilts
  CHARACTER(LEN=4) :: radar_symbol
  REAL :: radar_lat
  REAL :: radar_lon
  REAL :: radar_elevation

  INTEGER :: ngate
  INTEGER :: nray
  REAL ::    fstgat
  REAL ::    gatsp

  REAL :: volume(ngate,nray,ntilts)      ! Array containing one
                                         ! full volume scan of
                                         ! reflectivity intepolated to
                                         ! 1-degree spaced polar angles
  REAL :: int_razim(nray)
  REAL :: eleva(ntilts_max)

!
!-----------------------------------------------------------------------
!
!   WRITE(*,*) regular_file
!   WRITE(*,*) ntilts_max,ntilts,ngate,nray,ntilts
!   WRITE(*,*) radar_symbol,radar_lat,radar_lon,radar_elevation
!   WRITE(*,*) ngate,nray,fstgat,gatsp
!   WRITE(*,*) int_razim
!   WRITE(*,*) eleva
!  WRITE(*,*) volume
!
  OPEN(27,file=trim(regular_file),status='unknown',form='unformatted')
  WRITE(27) ntilts_max,ntilts
  WRITE(27) radar_symbol,radar_lat,radar_lon,radar_elevation
  WRITE(27) ngate,nray,fstgat,gatsp
  WRITE(27) int_razim
  WRITE(27) eleva
  WRITE(27) volume
  CLOSE(27)
  
  WRITE(*,*) ' The file:',trim(regular_file),                             &
                 'has been written out successfully'

END SUBROUTINE OUTPUT_REGULAR