!########################################################################
!########################################################################
!#########                                                      #########
!#########                  PROGRAM ncrad2arps                  #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################


PROGRAM ncrad2arps,50

!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar data from NetCDF data files and remaps data on ARPS
! grid to be used for analysis or display.
! CASA radar data, for example, are stored in netCDF files.
!
!------------------------------------------------------------------------
!
! AUTHOR: 
!
! Keith Brewster (May 2006)
!
! MODIFICATIONS:
!
! 1 Feb 2007 Keith Brewster
! Added processing for gzipped files.
!
!------------------------------------------------------------------------

  IMPLICIT NONE

!------------------------------------------------------------------------
!
! Include files
!
!------------------------------------------------------------------------
 
  INCLUDE 'globcst.inc'
  INCLUDE 'grid.inc'
  INCLUDE 'netcdf.inc'

!------------------------------------------------------------------------
!
! Dimensions and parameters
!
!------------------------------------------------------------------------

  INTEGER, PARAMETER :: maxfile = 90
  INTEGER, PARAMETER :: maxvar = 10
!
  INTEGER, PARAMETER :: stdout = 6
  INTEGER, PARAMETER :: itime1970 = 315619200
  REAL, PARAMETER :: refchek=-35.
  REAL, PARAMETER :: refmiss=-999.
  REAL, PARAMETER :: velchek=-190.
  REAL, PARAMETER :: velmiss=-999.
  REAL, PARAMETER :: winszazim=10.
  REAL, PARAMETER :: winszrad=1000.

!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------

  INTEGER :: nx, ny, nz, nzsoil, itime, nstyps
  REAL    :: radelv, radlat, radlon
  REAL    :: radarx, radary

!------------------------------------------------------------------------
!
! CASA Radar Data Variables
!
!------------------------------------------------------------------------
!
   REAL, ALLOCATABLE :: refl(:,:)
   REAL, ALLOCATABLE :: attref(:,:)
   REAL, ALLOCATABLE :: rhohv(:,:)
   REAL, ALLOCATABLE :: radv(:,:)
!
!------------------------------------------------------------------------
!
! Variables for subroutine remapvol.
!
!------------------------------------------------------------------------
!
  INTEGER, PARAMETER :: nt=1
  INTEGER, PARAMETER :: exbcbufsz=1
  INTEGER, PARAMETER :: bkgopt=1
  INTEGER, PARAMETER :: shropt=1
  INTEGER, PARAMETER :: rfropt = 1  ! 4/3rds earth refraction option
  INTEGER, PARAMETER :: maxsort = 10000
  INTEGER, PARAMETER :: nzsnd = 201
  REAL,    PARAMETER :: dzsnd=100.
  INTEGER :: ktsnd(nzsnd)
  REAL :: zsnd(nzsnd)             ! hgt levels for refractivity sounding
  REAL :: usnd(nzsnd)
  REAL :: vsnd(nzsnd)
  REAL :: rfrsnd(nzsnd)           ! refractivity sounding
  REAL, PARAMETER :: rfrconst = (-1./(4.*6371.E03))   ! -1/(4e)
  REAL, PARAMETER :: envavgr=80000.

  REAL, ALLOCATABLE :: arfdata(:,:) ! attenuated refl (dBZ) data
  REAL, ALLOCATABLE :: refdata(:,:) ! refl (dBZ) data
  REAL, ALLOCATABLE :: veldata(:,:) ! velocity data (m/s)
  REAL, ALLOCATABLE :: spwdata(:,:)
  REAL, ALLOCATABLE :: bkgvel(:,:)
  REAL, ALLOCATABLE :: unfvdata(:,:) ! unfolded velocity data (m/s)
  REAL, ALLOCATABLE :: rhodata(:,:) ! rho-HV data
  REAL, ALLOCATABLE :: snstvty(:) ! radar sensitivity
  REAL, ALLOCATABLE :: rtem(:,:)  ! temporary array for radar data processing
  INTEGER, ALLOCATABLE :: time(:) ! time offset from time1st
  REAL, ALLOCATABLE :: azim(:)    ! azimuth angle for each radial(degree)
  REAL, ALLOCATABLE :: beamw(:)   ! beamwidth for each radial(degree)
  REAL, ALLOCATABLE :: gtspc(:)   ! gate spacing for each radial (mneter)
  REAL, ALLOCATABLE :: vnyq(:)    ! Nyquist velocity (meters/sec)
  REAL, ALLOCATABLE :: elev(:)    ! elevation angle for each radial (degree)
  INTEGER, ALLOCATABLE :: istrgate(:)
  INTEGER, ALLOCATABLE :: bgate(:)
  INTEGER, ALLOCATABLE :: egate(:)
  INTEGER :: time1st              ! time of first radial in volume
  INTEGER :: irfirstg             ! range to first gate (meters)
  INTEGER :: igatesp               ! gate spacing (meters)
  INTEGER :: irefgatsp            ! reflectivity gate spacing (meters)
  INTEGER :: ivelgatsp            ! velocity gate spacing (meters)
  REAL    :: elv                  ! elevation angle for this tilt
  REAL    :: rfirstg              ! range to first gate (m)
  REAL    :: gatesp               ! gate spacing (meters)
  REAL    :: vnyquist             ! Nyquist velocity for this tilt

  INTEGER, ALLOCATABLE :: kntrgat(:,:)
  INTEGER, ALLOCATABLE :: kntrazm(:)
  INTEGER :: kntrelv

  INTEGER, ALLOCATABLE :: kntvgat(:,:)
  INTEGER, ALLOCATABLE :: kntvazm(:)
  INTEGER :: kntvelv

  INTEGER, ALLOCATABLE :: timevol(:,:)
  REAL, ALLOCATABLE :: nyqvvol(:)

  REAL, ALLOCATABLE :: rngrvol(:,:)
  REAL, ALLOCATABLE :: azmrvol(:,:)
  REAL, ALLOCATABLE :: elvrvol(:,:)
  REAL, ALLOCATABLE :: refvol(:,:,:)
  REAL, ALLOCATABLE :: rngvvol(:,:)
  REAL, ALLOCATABLE :: azmvvol(:,:)
  REAL, ALLOCATABLE :: elvvvol(:,:)
  REAL, ALLOCATABLE :: velvol(:,:,:)
  REAL, ALLOCATABLE :: elvmean(:)
  REAL, ALLOCATABLE :: varsort(:)

  REAL, ALLOCATABLE :: rxvol(:,:,:)
  REAL, ALLOCATABLE :: ryvol(:,:,:)
  REAL, ALLOCATABLE :: rzvol(:,:,:)

  REAL, ALLOCATABLE :: gridvel(:,:,:)
  REAL, ALLOCATABLE :: gridref(:,:,:)
  REAL, ALLOCATABLE :: gridnyq(:,:,:)
  REAL, ALLOCATABLE :: gridtim(:,:,:)
  REAL, ALLOCATABLE :: x(:)
  REAL, ALLOCATABLE :: y(:)
  REAL, ALLOCATABLE :: z(:)
  REAL, ALLOCATABLE :: zp(:,:,:)
  REAL, ALLOCATABLE :: xs(:)
  REAL, ALLOCATABLE :: ys(:)
  REAL, ALLOCATABLE :: zps(:,:,:)
  REAL, ALLOCATABLE :: hterain(:,:)
  REAL, ALLOCATABLE :: mapfct(:,:,:) ! Map factors at scalar, u and v points
  REAL, ALLOCATABLE :: j1    (:,:,:) ! Coordinate transformation Jacobian defined
                                     ! as - d( zp )/d( x ).
  REAL, ALLOCATABLE :: j2    (:,:,:) ! Coordinate transformation Jacobian defined
                                     ! as - d( zp )/d( y ).
  REAL, ALLOCATABLE :: j3    (:,:,:) ! Coordinate transformation Jacobian defined
                                     ! as d( zp )/d( z ).
  REAL, ALLOCATABLE :: tem1d1(:)
  REAL, ALLOCATABLE :: tem1d2(:)
  REAL, ALLOCATABLE :: tem2d(:,:)
  REAL, ALLOCATABLE :: tem2dyz(:,:)
  REAL, ALLOCATABLE :: tem2dxz(:,:)
  REAL, ALLOCATABLE :: tem2dns(:,:,:)
  REAL, ALLOCATABLE :: tem3d1(:,:,:)
  REAL, ALLOCATABLE :: tem3d2(:,:,:)
  REAL, ALLOCATABLE :: tem3d3(:,:,:)
  REAL, ALLOCATABLE :: tem3d4(:,:,:)
  INTEGER, ALLOCATABLE :: tem2dint(:,:)
  INTEGER, ALLOCATABLE :: soiltyp(:,:,:)
  REAL, ALLOCATABLE :: stypfrct(:,:,:)
  REAL, ALLOCATABLE :: tem3dsoil(:,:,:)
  REAL, ALLOCATABLE :: tem4dsoilns(:,:,:,:)

  REAL, ALLOCATABLE :: zpsoil(:,:,:)
  REAL, ALLOCATABLE :: j3soil(:,:,:)
  REAL, ALLOCATABLE :: j3soilinv(:,:,:)

  REAL, ALLOCATABLE :: u(:,:,:)
  REAL, ALLOCATABLE :: v(:,:,:)
  REAL, ALLOCATABLE :: qv(:,:,:)
  REAL, ALLOCATABLE :: ubar(:,:,:)
  REAL, ALLOCATABLE :: vbar(:,:,:)
  REAL, ALLOCATABLE :: ptbar(:,:,:)
  REAL, ALLOCATABLE :: uprt(:,:,:)
  REAL, ALLOCATABLE :: vprt(:,:,:)
  REAL, ALLOCATABLE :: ptprt(:,:,:)
  REAL, ALLOCATABLE :: pprt(:,:,:)
  REAL, ALLOCATABLE :: pbar(:,:,:)
  REAL, ALLOCATABLE :: qvbar(:,:,:)
  REAL, ALLOCATABLE :: rhostr(:,:,:)

  REAL, ALLOCATABLE :: trigs1(:)
  REAL, ALLOCATABLE :: trigs2(:)
  INTEGER, ALLOCATABLE :: ifax(:)
  REAL, ALLOCATABLE :: wsave1(:)
  REAL, ALLOCATABLE :: wsave2(:)
  REAL, ALLOCATABLE :: vwork1(:,:)
  REAL, ALLOCATABLE :: vwork2(:,:)

  REAL, ALLOCATABLE :: qcumsrc(:,:,:,:)
  REAL, ALLOCATABLE :: prcrate(:,:,:)
  REAL, ALLOCATABLE :: exbcbuf(:)

  REAL, ALLOCATABLE :: grdvel2(:,:,:)
  REAL, ALLOCATABLE :: grdref2(:,:,:)
  REAL, ALLOCATABLE :: wgtvel(:,:,:)
  REAL, ALLOCATABLE :: wgtref(:,:,:)
  REAL, ALLOCATABLE :: wpotvel(:,:,:)
  REAL, ALLOCATABLE :: wpotref(:,:,:)
  REAL, ALLOCATABLE :: gridazm(:,:)
  REAL, ALLOCATABLE :: gridrng(:,:)  

  REAL(KIND=8), ALLOCATABLE :: tem_double(:)

!------------------------------------------------------------------------
!
! Data dimensions, determined from the data files
!
!------------------------------------------------------------------------

  INTEGER :: maxgate,maxazim,maxelev

!------------------------------------------------------------------------
!
! Misc. variables
!
!------------------------------------------------------------------------

  CHARACTER(LEN=256) :: infilname
  CHARACTER(LEN=80) :: indir
  CHARACTER(LEN=80) :: dir_name
  CHARACTER(LEN=256) :: fname
  CHARACTER(LEN=256) :: full_fname
  CHARACTER(LEN=6) :: velid = 'radv3d'
  CHARACTER(LEN=6) :: refid = 'refl3d'
  CHARACTER(LEN=20) :: refname = 'Reflectivity'
  CHARACTER(LEN=20) :: velname = 'RawVelocity'
  CHARACTER(LEN=6) :: refunits = 'dBZ'
  CHARACTER(LEN=6) :: velunits = 'm/s'
  CHARACTER(LEN=NF_MAX_NAME), ALLOCATABLE :: ncvarname(:)
  CHARACTER(LEN=266) :: syscall
  INTEGER :: fvartype(maxfile)
  LOGICAL :: gzipped(maxfile)
  REAL :: felv(maxfile)
  INTEGER :: fitime(maxfile)

  INTEGER :: n, i, j, k, istatus
  INTEGER :: nazim,ngate,nvar
  INTEGER :: ivcp,itimcdf,initime,mintimcdf
  INTEGER :: ivar,varfill,dmpfmt,hdf4cmpr
  INTEGER :: len_dir,len_fname
  INTEGER :: arbvaropt,velopt
  
  LOGICAL :: velproc
  LOGICAL :: vel2d,vel3d
  LOGICAL :: ref2d,ref3d
  LOGICAL :: qc_on

  LOGICAL :: rho_match

  INTEGER :: iyear,iyr,imonth,iday,ihr,imin,isec
  INTEGER :: iiyr,iimonth,iiday,iihr,iimin,iisec
  INTEGER :: velknt,refknt,rhoknt,kntt2a,kntt2b
  INTEGER :: isource,icount,iradtype
  INTEGER :: nyqset,timeset,vardump

  INTEGER :: xscale
  REAL :: rdx,dtime,rmin,rmax
  REAL :: rmisval,rngfval,frtime
  REAL :: refelvmin,refelvmax
  REAL :: refrngmin,refrngmax

  INTEGER :: remapopt
  REAL :: radius,vconst,bmwidth

  REAL :: xrad,yrad

  INTEGER :: maxinfile,infile,lenfn
  INTEGER :: iarg,jarg,iargc,narg,ifile,jfile,kfile
  CHARACTER(LEN=4) tsthead
  CHARACTER(LEN=256) charg
  CHARACTER(LEN=256) listfile

  CHARACTER (LEN=6) :: varid
  CHARACTER (LEN=20) :: varname
  CHARACTER (LEN=20) :: varunits

!------------------------------------------------------------------------
!
! Some tunable parameters - convert to Namelist in future
!
!------------------------------------------------------------------------

  INTEGER, PARAMETER :: maxncradfile=90

  INTEGER, PARAMETER :: iordref = 2
  INTEGER, PARAMETER :: iordvel = 1

  REAL, PARAMETER :: refmedl = 15.
  REAL, PARAMETER :: velmedl = 15.
  REAL, PARAMETER :: refdazl = 360.
  REAL, PARAMETER :: veldazl = 20.

  REAL, PARAMETER :: dazim = 1.0
  REAL, PARAMETER :: rngmin = 500.
  REAL, PARAMETER :: rngmax = 230.E03
  REAL, PARAMETER :: rhohvlim = 0.50

  CHARACTER(LEN=4) :: radname
  CHARACTER(LEN=32) :: radarname
  INTEGER :: nncradfn = 0
  CHARACTER(LEN=256) :: ncradfn(maxncradfile)

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
  
!------------------------------------------------------------------------
!
! Initializations
!
!------------------------------------------------------------------------
  
  isource = 3                  ! 1 - WSR-88D raw     2 - WSR-88D NIDS
  
  refelvmin = 91.0
  refelvmax = -91.0
  refrngmin = rngmin
  refrngmax = rngmax  
  dmpfmt=1
  hdf4cmpr=0
  kntt2a=0
  kntt2b=0
  refknt=0
  rhoknt=0
  velknt=0
  velproc = .TRUE.
  qc_on = .TRUE.
  ref2d = .FALSE.
  ref3d = .FALSE.
  vel2d = .FALSE.
  vel3d = .FALSE.
   
!------------------------------------------------------------------------
!
! Initialize ncrad_data NAMELIST variables
!
!------------------------------------------------------------------------

  radname = 'DMMY'
  nncradfn = 0
  dir_name = './'
  len_dir = LEN(TRIM(dir_name))

  arbvaropt = 0

  DO ifile=1,maxncradfile
    ncradfn(ifile)='dummy'
  END DO
  
  narg=iargc()
  WRITE(stdout,'(a,i4)') ' Number of command-line arguments: ',narg 
  IF(narg < 2 ) THEN
    WRITE(stdout,'(a,a,a,a)') &
    ' Usage: ncrad2arps RADAR_ID radarfile_listfile [-novel] [-hdf 2]', &
    ' [-binary] [-ref2d] [-ref3d] [-reffile] [-vel2d] [-vel3d] [-velfile]',&
    ' [-noqc]', &
    ' < arps.input'
    STOP
  END IF

!------------------------------------------------------------------------
!
! Read grid info from the arps.input
!
!------------------------------------------------------------------------
  
  CALL initpara(nx, ny, nz, nzsoil, nstyps)! Reads standard ARPS namelists

!------------------------------------------------------------------------
!
! Process command line
! For backward comptability allow input of radar file names via
! files specified on the command line
!
!------------------------------------------------------------------------

  IF(narg > 1) THEN
    CALL getarg(1,charg)
    radname=charg(1:4)
    WRITE(stdout,'(a,a)')  '    radname = ', radname
    kfile=0
    nncradfn=0
    iarg=2
    DO jarg=2,narg
      CALL getarg(iarg,charg)
      IF(charg(1:6) == '-novel') THEN
        velproc=.FALSE.
      ELSE IF(charg(1:4) == '-hdf') THEN
        dmpfmt=2
        hdf4cmpr=0
        IF(iarg < narg) THEN
          iarg=iarg+1
          CALL getarg(iarg,charg)
          READ(charg,'(i1)') hdf4cmpr
          hdf4cmpr=min(max(hdf4cmpr,0),7)
        END IF
        WRITE(stdout,'(a,i2)')                                            &
        ' Output in hdf format with compression level: ',hdf4cmpr
      ELSE IF(charg(1:7) == '-binary') THEN
        dmpfmt=1
        hdf4cmpr=0
        WRITE(stdout,'(a)') ' Output in binary format'
      ELSE IF(charg(1:6) == '-ref2d') THEN
        ref2d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 2d reflectivity file of lowest tilt'
      ELSE IF(charg(1:6) == '-ref3d') THEN
        ref3d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 3d reflectivity file for plotting'
      ELSE IF(charg(1:8) == '-reffile') THEN
        ref3d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 3d reflectivity file for plotting'
      ELSE IF(charg(1:6) == '-vel2d') THEN
        vel2d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 2d velocity file of lowest tilt'
      ELSE IF(charg(1:6) == '-vel3d') THEN
        vel3d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 3d velocity file for plotting'
      ELSE IF(charg(1:8) == '-velfile') THEN
        vel3d=.TRUE.
        WRITE(stdout,'(a)')                                               &
          ' Will produce 3d velocity file for plotting'
      ELSE IF(charg(1:5) == '-noqc') THEN
        qc_on=.FALSE.
        WRITE(stdout,'(a)')                                               &
          ' Will skip qc steps in processing'
      ELSE
        listfile=charg
        WRITE(stdout,'(a,a)')  ' Reading file lists ',charg
        OPEN(31,file=listfile,status='old',form='formatted')
        DO ifile=(nncradfn+1),maxncradfile
          READ(31,'(a)',END=101) ncradfn(ifile)
          kfile=kfile+1
          WRITE(stdout,'(a,i4,a,a)')                                      &
               ' kfile:',kfile,' ncradfn: ',TRIM(ncradfn(ifile))
        END DO
        101 CONTINUE
        nncradfn=kfile
      END IF
      iarg=iarg+1
      IF(iarg > narg) EXIT
    END DO
    WRITE(stdout,'(i4,a)') nncradfn,' file names read'
  END IF
 
  istatus = 0
  icount = 0
  rfirstg=1000.
  gatesp = 1000.
  irfirstg = NINT(rfirstg)
  igatesp = NINT(gatesp)

!------------------------------------------------------------------------
!
! Loop through the NetCDF radar files.
!
!------------------------------------------------------------------------
    
  IF (nncradfn > 0 .AND. nncradfn <= maxncradfile) THEN
    maxinfile = nncradfn
  ELSE IF (nncradfn > maxncradfile) THEN
    WRITE(stdout,'(a,i4,a,i4)') &
      ' WARNING: nncradfn=', nncradfn,' > maxncradfile=',maxncradfile
    WRITE(stdout,'(a,i4,a)') &
      ' Will only read in ', maxncradfile,' NIDS files.'
    maxinfile = maxncradfile
  ELSE
    maxinfile = 0
  END IF

  IF (maxinfile > 0) THEN
!
!------------------------------------------------------------------------
!
!   First check each file for variable stored and dimensions of data
!
!------------------------------------------------------------------------
!
    maxgate=1
    maxazim=1
    maxelev=1
    mintimcdf=-1
    DO infile = 1,maxinfile
      fvartype(infile)=0
      gzipped(infile)=.FALSE.
    END DO
    DO infile = 1,maxinfile
      nazim = 0
      ngate = 0
      nvar = 0
      infilname = ncradfn(infile) 
      lenfn=len(infilname)
      CALL strlnth(infilname,lenfn)
      IF(infilname((lenfn-2):lenfn) == ".gz") THEN
        gzipped(infile)=.TRUE.
        WRITE(syscall,'(a,1x,a)') 'gunzip',TRIM(infilname)
        CALL system(syscall)
        infilname((lenfn-2):lenfn)='   '
        ncradfn(infile)=infilname
        WRITE(6,'(a,a)') 'Uncompressed ',TRIM(infilname)
      END IF
      WRITE(stdout,'(a,a)') 'Checking dims in file:',TRIM(infilname)
      CALL extdirn(infilname,indir,fname)
      print *, ' infile: ',TRIM(infilname)
      print *, '  indir: ',TRIM(indir)
      print *, '  fname: ',TRIM(fname)
      CALL get_ncraddims(fname,indir,iradtype,ngate,nazim,nvar,        &
                         istatus)
      WRITE(6,'(a,i6,a,i6)') ' istatus: ',istatus,'  nvar in file: ',nvar
      IF(istatus == NF_NOERR .AND. nvar > 0) THEN
        ALLOCATE(ncvarname(nvar))

        IF(iradtype == 21) THEN
          kntt2a=kntt2a+1
          ALLOCATE(tem_double(nazim))
          CALL get_ncrad2ainfo(fname,indir,nazim,nvar,tem_double,        &
                 radarname,radlat,radlon,radelv,itimcdf,frtime,elv,    &
                 ncvarname,istatus)
          DEALLOCATE(tem_double)
          fvartype(infile)=100
          refknt=refknt+1
          velknt=velknt+1
          rhoknt=rhoknt+1
        ELSE IF(iradtype == 22) THEN
          kntt2b=kntt2b+1
          CALL get_ncrad2binfo(fname,indir,nazim,nvar,                   &
                 radarname,radlat,radlon,radelv,itimcdf,frtime,        &
                 ivcp,elv,ncvarname,istatus)
          DO k=1,nvar
            print *, '  variable(',k,') = ',TRIM(ncvarname(k))
            IF(ncvarname(k)(1:7) == 'Reflect') THEN
              fvartype(infile)=1
              refknt=refknt+1
              EXIT
            ELSE IF(ncvarname(k)(1:11) == 'RawVelocity' .OR.             &
                  ncvarname(k)(1:15) == 'AliasedVelocity' ) THEN
              fvartype(infile)=2
              velknt=velknt+1
              EXIT
            ELSE IF(ncvarname(k)(1:5) == 'RhoHV') THEN
              fvartype(infile)=3
              rhoknt=rhoknt+1
              EXIT
            END IF
          END DO
        ELSE
          WRITE(stdout,'(a,a)') 'Unknown radar file type:',iradtype
          fvartype(infile)=0
          STOP
        END IF

        IF(radarname(1:5) == 'cyril') THEN
          IF(radelv < 100.) radelv=432.9
          IF(elv < 0.1) elv=1.0
        ELSE IF(radarname(1:5) == 'chick') THEN
          IF(radelv < 100.) radelv=354.0
          IF(elv < 0.1) elv=1.0
        ELSE IF(radarname(1:5) == 'lawto') THEN
          IF(radelv < 100.) radelv=377.4
          IF(elv < 0.1) elv=1.0
        ELSE IF(radarname(1:5) == 'rushs') THEN
          IF(radelv < 100.) radelv=414.8
          IF(elv < 0.1) elv=1.0
        END IF

        felv(infile)=elv
        fitime(infile)=itimcdf
      
        maxazim=max(nazim,maxazim)
        maxgate=max(ngate,maxgate)

        IF(mintimcdf < 0) THEN
          mintimcdf=itimcdf
        ELSE
          mintimcdf=min(mintimcdf,itimcdf)
        END IF
  
        DEALLOCATE(ncvarname)

      ELSE  ! error return from get dims

        fvartype(infile)=0

      END IF

    END DO
    maxelev=max(maxelev,refknt)
    maxelev=max(maxelev,velknt)

    IF(velknt == 0) velproc=.false.

    WRITE(6,'(/a,i6)') ' Number of reflectivity files:',refknt
    WRITE(6,'(a,i6)') ' Number of Rho-HV files:',rhoknt
    WRITE(6,'(a,i6)') ' Number of velocity files:',velknt
    WRITE(6,'(/a,i6)') ' Max azimuth dimension of NetCDF data:',maxazim
    WRITE(6,'(a,i6)') ' Max gate dimension of NetCDF data:',maxgate
    WRITE(6,'(a,i6/)') ' Max elevations among data:',maxelev

    IF(kntt2a > 0 .AND. kntt2b > 0) THEN
      WRITE(6,'(a)') ' Mixed Tier 2a and Tier 2b files in list, stopping'
      WRITE(6,'(a,i4,a,i4)')' N Tier 2a=',kntt2a,'  N Tier 2b=',kntt2b
      STOP
    END IF

    ALLOCATE(x(nx))
    ALLOCATE(y(ny))
    ALLOCATE(z(nz))
    ALLOCATE(zp(nx,ny,nz))
    ALLOCATE(hterain(nx,ny))
    ALLOCATE(mapfct(nx,ny,8))
    ALLOCATE(j1(nx,ny,nz))
    ALLOCATE(j2(nx,ny,nz))
    ALLOCATE(j3(nx,ny,nz))
    ALLOCATE(tem1d1(nz))
    ALLOCATE(tem1d2(nz))
    ALLOCATE(tem3d1(nx,ny,nz))

    IF(qc_on .AND. velknt > 0) THEN
!------------------------------------------------------------------------
!
! Fill refractivity sounding with constant lapse rate
! This is only used when rfropt > 1, but for completeness and
! future upgrade (when an actual sounding made from gridded data
! would be used) this is filled-in.
!
!------------------------------------------------------------------------
 
      DO k=1,nzsnd
        zsnd(k)=(k-1)*dzsnd
        rfrsnd(k)=325.+rfrconst*zsnd(k)
      END DO
!------------------------------------------------------------------------
!
! ARPS grid array allocations and variable initializations.
!
!------------------------------------------------------------------------

      ALLOCATE(u(nx,ny,nz))
      ALLOCATE(v(nx,ny,nz))
      ALLOCATE(qv(nx,ny,nz))
      ALLOCATE(uprt(nx,ny,nz))
      ALLOCATE(vprt(nx,ny,nz))
      ALLOCATE(ptprt(nx,ny,nz))
      ALLOCATE(pprt(nx,ny,nz))
      ALLOCATE(ubar(nx,ny,nz))
      ALLOCATE(vbar(nx,ny,nz))
      ALLOCATE(ptbar(nx,ny,nz))
      ALLOCATE(pbar(nx,ny,nz))
      ALLOCATE(qvbar(nx,ny,nz))
      ALLOCATE(rhostr(nx,ny,nz))
    
      ALLOCATE(tem2d(nx,ny))
      ALLOCATE(tem2dyz(ny,nz))
      ALLOCATE(tem2dxz(nx,nz))
      ALLOCATE(tem2dns(nx,ny,0:nstyps))
    
      ALLOCATE(trigs1(3*(nx-1)/2+1))
      ALLOCATE(trigs2(3*(ny-1)/2+1))
      ALLOCATE(ifax(13))

      ALLOCATE(wsave1(3*(ny-1)+15))
      ALLOCATE(wsave2(3*(nx-1)+15))
      ALLOCATE(vwork1(nx+1,ny+1))
      ALLOCATE(vwork2(ny,nx+1))

      ALLOCATE(qcumsrc(nx,ny,nz,5))
      ALLOCATE(prcrate(nx,ny,4))
      ALLOCATE(exbcbuf(exbcbufsz))
      ALLOCATE(soiltyp(nx,ny,nstyps))
      ALLOCATE(stypfrct(nx,ny,nstyps))
      ALLOCATE(tem2dint(nx,ny))

      ALLOCATE(tem3d2(nx,ny,nz))
      ALLOCATE(tem3d3(nx,ny,nz))
      ALLOCATE(tem3d4(nx,ny,nz))

      ALLOCATE(tem3dsoil(nx,ny,nzsoil))
      ALLOCATE(tem4dsoilns(nx,ny,nzsoil,0:nstyps))

      CALL set_lbcopt(1)

      CALL initgrdvar(nx,ny,nz,nzsoil,nt,nstyps,exbcbufsz,                  &
              x,y,z,zp,tem3dsoil,hterain,mapfct,                        &
              j1,j2,j3,tem3dsoil,tem3d1,tem3d1,tem3d1,tem3d1,tem3dsoil, &
              u,v,tem3d1,tem3d1,ptprt,pprt,                             &
              qv,tem3d1,tem3d1,tem3d1,tem3d1,tem3d1,tem3d1,             &
              tem2dyz,tem2dyz,tem2dxz,tem2dxz,                          &
              tem2dyz,tem2dyz,tem2dxz,tem2dxz,                          &
              trigs1,trigs2,ifax,ifax,                                  &
              wsave1,wsave2,vwork1,vwork2,                              &
              ubar,vbar,ptbar,pbar,tem3d1,tem3d1,                       &
              rhostr,tem3d1,qvbar,tem3d1,tem3d1,                        &
              soiltyp,stypfrct,tem2dint,tem2d,tem2d,tem2d,              &
              tem4dsoilns,tem4dsoilns,tem2dns,tem2d,tem2dns,            &
              tem3d1,qcumsrc,tem3d1,tem2dint,tem2d,                     &
              tem2d,tem2d,tem2d,                                        &
              tem2d,tem2d,prcrate,exbcbuf,                              &
              tem3d1,tem2d,tem2d,tem2d,tem2d,                           & 
              tem2d,tem2d,tem2d,tem2d,                                  &
              tem3dsoil,tem3dsoil,tem3dsoil,tem3dsoil,tem3dsoil,        &
              tem3d2,tem3d3,tem3d4,tem3d4,tem3d4,                       &
              tem3d4,tem3d4,tem3d4,tem3d4)
       print *, ' Back from initgrdvar'

      DEALLOCATE(j1)
      DEALLOCATE(j2)
      DEALLOCATE(j3)
      DEALLOCATE(trigs1)
      DEALLOCATE(trigs2)
      DEALLOCATE(ifax)
      DEALLOCATE(wsave1)
      DEALLOCATE(wsave2)
      DEALLOCATE(vwork1)
      DEALLOCATE(vwork2)
      DEALLOCATE(qcumsrc)
      DEALLOCATE(prcrate)
      DEALLOCATE(soiltyp)
      DEALLOCATE(stypfrct)
      DEALLOCATE(exbcbuf)
      DEALLOCATE(tem2dint)
      DEALLOCATE(tem2dyz)
      DEALLOCATE(tem2dxz)
      DEALLOCATE(tem2dns)
      DEALLOCATE(tem4dsoilns)
      DEALLOCATE(tem3dsoil)

      ALLOCATE(xs(nx))
      ALLOCATE(ys(ny))
      ALLOCATE(zps(nx,ny,nz))

      print *, ' Setting radar coordinate: '

      CALL radcoord(nx,ny,nz,x,y,z,zp,xs,ys,zps, &
                radlat,radlon,radarx,radary)

      print *, ' Radar x: ',(0.001*radarx),' km'
      print *, ' Radar y: ',(0.001*radary),' km'

      print *, ' Environmental wind averaging radius: ',envavgr

      CALL extenvprf(nx,ny,nz,nzsnd, &
                 x,y,zp,xs,ys,zps, &
                 u,v,ptprt,pprt,qv,ptbar,pbar,tem3d1,tem3d2,tem3d3, &
                 radarx,radary,radelv,envavgr, &
                 zsnd,ktsnd,usnd,vsnd,rfrsnd)
      print *, ' Back from extenvprf'

      DEALLOCATE(ubar)
      DEALLOCATE(vbar)
      DEALLOCATE(pbar)
      DEALLOCATE(ptbar)
      DEALLOCATE(qvbar)
      DEALLOCATE(rhostr)
    
      DEALLOCATE(uprt)
      DEALLOCATE(vprt)
      DEALLOCATE(ptprt)
      DEALLOCATE(pprt)
      DEALLOCATE(qv)
    
      DEALLOCATE(tem3d2)
      DEALLOCATE(tem3d3)
      DEALLOCATE(tem3d4)

    ELSE

      ALLOCATE(xs(nx))
      ALLOCATE(ys(ny))
      ALLOCATE(zps(nx,ny,nz))
      ALLOCATE(zpsoil(nx,ny,nzsoil))
      ALLOCATE(j3soil(nx,ny,nzsoil))
      ALLOCATE(j3soilinv(nx,ny,nzsoil))

      print *, ' Setting ARPS grid coordinates ...'
      CALL inigrd(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil,                  &
               hterain,mapfct,j1,j2,j3,j3soil,j3soilinv,         &
               tem1d1,tem1d2,tem3d1)

      print *, ' Setting radar coordinate...'

      CALL radcoord(nx,ny,nz,x,y,z,zp,xs,ys,zps, &
                radlat,radlon,radarx,radary)

      DEALLOCATE(j1)
      DEALLOCATE(j2)
      DEALLOCATE(j3)
      DEALLOCATE(zpsoil)
      DEALLOCATE(j3soil)
      DEALLOCATE(j3soilinv)

    END IF

  DEALLOCATE(hterain)
  DEALLOCATE(mapfct)
  DEALLOCATE(tem3d1)

  ALLOCATE(gridvel(nx,ny,nz))
  ALLOCATE(gridref(nx,ny,nz))
  ALLOCATE(gridnyq(nx,ny,nz))
  ALLOCATE(gridtim(nx,ny,nz))

  ALLOCATE(grdvel2(nx,ny,nz))
  ALLOCATE(grdref2(nx,ny,nz))
  ALLOCATE(wgtvel(nx,ny,nz))
  ALLOCATE(wgtref(nx,ny,nz))
  ALLOCATE(wpotvel(nx,ny,nz))
  ALLOCATE(wpotref(nx,ny,nz))
  ALLOCATE(gridazm(nx,ny))
  ALLOCATE(gridrng(nx,ny))

  ALLOCATE(varsort(maxsort))


!------------------------------------------------------------------------
!
! Radar data array allocations
!
!------------------------------------------------------------------------

    IF(refknt > 0) THEN
      ALLOCATE(refdata(maxgate,maxazim))
      ALLOCATE(arfdata(maxgate,maxazim))
    END IF
    IF(velknt > 0) THEN
      ALLOCATE(veldata(maxgate,maxazim))
      IF(qc_on) THEN
        ALLOCATE(spwdata(maxgate,maxazim))
        ALLOCATE(unfvdata(maxgate,maxazim))
        ALLOCATE(bkgvel(maxgate,maxazim))
        ALLOCATE(bgate(maxazim))
        ALLOCATE(egate(maxazim))
        spwdata=0.
      END IF
    END IF
    IF(rhoknt > 0) ALLOCATE(rhodata(maxgate,maxazim))
    ALLOCATE(snstvty(maxgate))
    ALLOCATE(rtem(maxgate,maxazim))
    ALLOCATE(time(maxazim))
    ALLOCATE(azim(maxazim))
    ALLOCATE(beamw(maxazim))
    ALLOCATE(gtspc(maxazim))
    ALLOCATE(vnyq(maxazim))
    ALLOCATE(elev(maxazim))
    ALLOCATE(istrgate(maxazim))

    ALLOCATE(kntrgat(maxazim,maxelev))
    ALLOCATE(kntrazm(maxelev))

    ALLOCATE(kntvgat(maxazim,maxelev))
    ALLOCATE(kntvazm(maxelev))

    ALLOCATE(nyqvvol(maxelev))
    ALLOCATE(timevol(maxazim,maxelev))

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

    ALLOCATE(rngvvol(maxgate,maxelev))
    ALLOCATE(azmvvol(maxazim,maxelev))
    ALLOCATE(elvvvol(maxazim,maxelev))
    ALLOCATE(velvol(maxgate,maxazim,maxelev))
    ALLOCATE(elvmean(maxelev))

    ALLOCATE(rxvol(maxgate,maxazim,maxelev))
    ALLOCATE(ryvol(maxgate,maxazim,maxelev))
    ALLOCATE(rzvol(maxgate,maxazim,maxelev))

!------------------------------------------------------------------------
!
!     Initialize 3-d radar data arrays
!
!------------------------------------------------------------------------

    itimcdf=mintimcdf+itime1970
    time1st=itimcdf

    CALL abss2ctim(itimcdf, iyear, imonth, iday, ihr, imin, isec)
    iyr = MOD(iyear, 100)      

    CALL rmpinit(nx,ny,nz,maxgate,maxgate,maxazim,maxelev,           &
                   kntrgat,kntrazm,kntrelv,                              &
                   kntvgat,kntvazm,kntvelv,                              &
                   nyqvvol,timevol,                                      &
                   rngrvol,azmrvol,elvrvol,refvol,                       &
                   rngvvol,azmvvol,elvvvol,velvol,                       &
                   gridvel,gridref,gridnyq,gridtim)

    iiyr = iyr
    iimonth = imonth
    iiday = iday 
    iihr = ihr
    iimin = imin
    iisec = isec

    IF(kntt2a > 0) THEN
      DO infile = 1,maxinfile
        infilname = ncradfn(infile) 
        WRITE(6,'(a,i4,a,i4)') ' infile= ',infile,'  type=',fvartype(infile)
        CALL extdirn(infilname,indir,fname)
        CALL get_ncraddims(fname,indir,iradtype,ngate,nazim,nvar,        &
                         istatus)
        ALLOCATE(tem_double(nazim))
        ALLOCATE(ncvarname(nvar))
        CALL get_ncrad2ainfo(fname,indir,nazim,nvar,tem_double,        &
                 radarname,radlat,radlon,radelv,itimcdf,frtime,elv,    &
                 ncvarname,istatus)
        DEALLOCATE(ncvarname)
        ALLOCATE(attref(ngate,nazim))
        ALLOCATE(refl(ngate,nazim))
        ALLOCATE(radv(ngate,nazim))
        ALLOCATE(rhohv(ngate,nazim))
        CALL rd2atiltcdf(nazim,ngate,fname,indir,               &
                       rmisval,rngfval,itimcdf,frtime,initime,           &
                       vnyquist,rfirstg,istrgate,                        &
                       azim,beamw,gtspc,attref,refl,radv,rhohv,          &
                       tem_double)
        DEALLOCATE(tem_double)
        bmwidth=beamw(1)
        arfdata=-999.0
        refdata=-999.0
        DO j=1,nazim
          DO i=istrgate(j),ngate
            IF(abs(refl(i,j)) < 99. ) THEN
              arfdata(i,j)=attref(i,j)
              refdata(i,j)=refl(i,j)
            END IF
          END DO
        END DO
        veldata=-999.0
        DO j=1,nazim
          DO i=istrgate(j),ngate
            IF(abs(radv(i,j)) < 199. ) veldata(i,j)=radv(i,j)
          END DO
        END DO
        rhodata=-999.0 
        DO j=1,nazim
          DO i=istrgate(j),ngate
            IF(abs(rhohv(i,j)) < 1.1 ) rhodata(i,j)=rhohv(i,j)
          END DO
        END DO
        DEALLOCATE(attref)
        DEALLOCATE(refl)
        DEALLOCATE(radv)
        DEALLOCATE(rhohv)

!------------------------------------------------------------------------
!
!     Process reflectivity data.
!
!------------------------------------------------------------------------

        WRITE(stdout,'(a,i4)') &
             ' Processing base reflectivity data... ', icount
        
        WRITE(stdout,*)'Transferring ',nazim,' reflectivity radials.'
  
        dtime=float(itime-time1st)
        refelvmin=min(elv,refelvmin)
        refelvmax=max(elv,refelvmax)
        DO j = 1, maxazim
          time(j) = dtime
          elev(j) = elv
        END DO

        WRITE(stdout,'(a,i5,a,4f9.1)')                                 &
          '  Ref  j   azim   elev   refmin   refmax'
        DO j = 1, nazim
          rmin=999.
          rmax=-999.
          DO i=1,ngate
            IF(refdata(i,j) > refchek) THEN
              rmin=min(refdata(i,j),rmin)
              rmax=max(refdata(i,j),rmax)
            END IF
          END DO
          IF(mod(j,5) == 0) &
            WRITE(stdout,'(2x,i5,4f9.1)') j,azim(j),elev(j),rmin,rmax
        END DO
  
        gatesp = gtspc(1)
        igatesp = NINT(gatesp)
        irfirstg = NINT(rfirstg)

        IF( qc_on) THEN 
          print *, ' calling SNR sensitivity screen'
          CALL snrchk(maxgate,maxazim,ngate,nazim,refchek,rfirstg,gatesp, &
                   snstvty,refdata,veldata,arfdata)
          print *, ' calling RhoHV screen'
          CALL rhohvchk(maxgate,maxazim,ngate,nazim,refchek,rhohvlim, &
               refdata,veldata,rhodata)
          print *, ' calling despekl '
          CALL despekl(maxgate,maxazim,maxgate,maxazim,refchek,         &
               refdata,rtem)
        END IF

        print *, ' calling volbuild reflectivity'
        print *, '    elv=',elev(1),' nazim =',nazim 
        CALL volbuild(maxgate,maxazim,maxelev,ngate,nazim,              &
                nyqset,timeset,                                         &
                kntrgat,kntrazm,kntrelv,                                &
                igatesp,irfirstg,refchek,                               &
                vnyquist,time,                                          &
                azim,elev,refdata,                                      &
                nyqvvol,timevol,                                        &
                rngrvol,azmrvol,elvrvol,refvol)

!------------------------------------------------------------------------
!
!       Process velocity data.
!
!------------------------------------------------------------------------
       
        icount = icount + 1
      
        WRITE(stdout,'(a,i4)') 'VCP number for this file:', ivcp
        WRITE(stdout,'(1x,a,i4.4,a1,i2.2,a1,i2.2)', ADVANCE='NO') &
               '    DATE: ', iyear, '/', imonth, '/', iday
        WRITE(stdout,'(1X,a,i2.2,a1,i2.2,a1,i2.2)')  &
               '    TIME: ', ihr, ':', imin, ':', isec


        WRITE(stdout,'(a,i4)')' Processing base velocity data... ', icount

        WRITE(stdout,'(a,i6,a)')'Transferring',nazim,' velocity radials.'

        WRITE(stdout,'(a,f10.2)') ' Nyquist velocity: ',vnyquist

        dtime=float(itime-time1st)
        DO j = 1, maxazim
          time(j) = dtime
          elev(j) = elv
        END DO

        WRITE(stdout,'(a,i5,a,4f9.1)')                                 &
          '  Ref  j   azim   elev   vr min   vr max'
        DO j = 1, nazim
          rmin=999.
          rmax=-999.
          DO i=1,ngate
            IF(veldata(i,j) > velchek) THEN
              rmin=min(veldata(i,j),rmin)
              rmax=max(veldata(i,j),rmax)
            END IF
          END DO
          IF(mod(j,5) == 0) &
            WRITE(stdout,'(2x,i5,4f9.1)') j,azim(j),elev(j),rmin,rmax
        END DO
    
        gatesp = gtspc(1)
        igatesp = NINT(gatesp)
        irfirstg = NINT(rfirstg)

!------------------------------------------------------------------------
!
!       Call radar volume builder.
!
!------------------------------------------------------------------------
        ivelgatsp=igatesp 
        nyqset=1
        timeset=1

        IF( qc_on ) THEN
          print *, ' calling despekl '
          CALL despekl(maxgate,maxazim,maxgate,maxazim,velchek,          &
               veldata,rtem)
          print *,' calling unfnqc'
          print *,' vnyquist=',vnyquist
          CALL unfnqc(maxgate,maxazim,maxgate,nazim,                     &
                      nzsnd,zsnd,usnd,vsnd,rfrsnd,                       &
                      bkgopt,shropt,rfropt,igatesp,irfirstg,             &
                      radlat,radlon,radelv,                              &
                      veldata,spwdata,elev,azim,vnyquist,                &
                      unfvdata,bkgvel,bgate,egate,rtem)

          print *, ' calling volbuild velocity '
          print *, '    elv=',elev(1),' nazim =',nazim 
          CALL volbuild(maxgate,maxazim,maxelev,maxgate,nazim,           &
                 nyqset,timeset,                                         &
                 kntvgat,kntvazm,kntvelv,                                &
                 igatesp,irfirstg,velchek,                               &
                 vnyquist,time,                                          &
                 azim,elev,unfvdata,                                     &
                 nyqvvol,timevol,                                        &
                 rngvvol,azmvvol,elvvvol,velvol)
        ELSE

          print *, ' calling volbuild velocity '
          print *, '    elv=',elev(1),' nazim =',nazim 
          CALL volbuild(maxgate,maxazim,maxelev,maxgate,nazim,           &
                 nyqset,timeset,                                         &
                 kntvgat,kntvazm,kntvelv,                                &
                 igatesp,irfirstg,velchek,                               &
                 vnyquist,time,                                          &
                 azim,elev,veldata,                                      &
                 nyqvvol,timevol,                                        &
                 rngvvol,azmvvol,elvvvol,velvol)
        END IF

      END DO  ! infile

    ELSE IF(kntt2b > 0) THEN
!
!------------------------------------------------------------------------
!
!   Process reflectivity files
!
!------------------------------------------------------------------------
!
    DO infile = 1,maxinfile
      WRITE(6,'(a,i4,a,i4)') ' infile= ',infile,                       &
        ' type=',fvartype(infile)
      IF(fvartype(infile) == 1) THEN  ! type is reflectivity
        infilname = ncradfn(infile) 
        WRITE(stdout,'(a,/a)')                                         &
          'Reading reflectivity file:',TRIM(infilname)
        CALL extdirn(infilname,indir,fname)
        CALL get_ncraddims(fname,indir,iradtype,ngate,nazim,nvar,      &
                         istatus)
        ALLOCATE(ncvarname(nvar))
        CALL get_ncrad2binfo(fname,indir,nazim,nvar,                   &
                 radarname,radlat,radlon,radelv,itimcdf,frtime,        &
                 ivcp,elv,ncvarname,istatus)
        DEALLOCATE(ncvarname)

        ALLOCATE(refl(ngate,nazim))
        CALL rdrftiltcdf(nazim,ngate,fname,indir,                      &
                       rmisval,rngfval,itimcdf,frtime,initime,rfirstg, &
                       azim,beamw,gtspc,refl)
        bmwidth=beamw(1)
        refdata=rmisval
        DO j=1,nazim
          DO i=21,ngate
            refdata(i,j)=refl(i,j)
          END DO
        END DO
        DEALLOCATE(refl)

        IF(radarname(1:5) == 'cyril') THEN
          IF(radelv < 0.1) radelv=445.3
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'chick') THEN
          IF(radelv < 0.1) radelv=355.4
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'lawto') THEN
          IF(radelv < 0.1) radelv=295.0
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'rushs') THEN
          IF(radelv < 0.1) radelv=365.8
          IF(elv < 0.1) elv=1.5
        END IF

!------------------------------------------------------------------------
!
!     Now begin processing the data.
!
!------------------------------------------------------------------------
       
        icount = icount + 1
      
        WRITE(stdout,'(a,i4)') 'VCP number for this file:', ivcp
        WRITE(stdout,'(1x,a,i4.4,a1,i2.2,a1,i2.2)', ADVANCE='NO') &
               '    DATE: ', iyear, '/', imonth, '/', iday
        WRITE(stdout,'(1X,a,i2.2,a1,i2.2,a1,i2.2)')  &
               '    TIME: ', ihr, ':', imin, ':', isec

!------------------------------------------------------------------------
!
!     Process reflectivity data.
!
!------------------------------------------------------------------------

        WRITE(stdout,'(a,i4)') &
             ' Processing base reflectivity data... ', icount
        
        WRITE(stdout,*)'Transferring ',nazim,' reflectivity radials.'
  
        dtime=float(itime-time1st)
        refelvmin=min(elv,refelvmin)
        refelvmax=max(elv,refelvmax)
        DO j = 1, maxazim
          time(j) = dtime
          elev(j) = elv
        END DO

        WRITE(stdout,'(a,i5,a,4f9.1)')                                 &
          '  Ref  j   azim   elev   refmin   refmax'
        DO j = 1, nazim, 5
          rmin=999.
          rmax=-999.
          DO i=1,ngate
            IF(refdata(i,j) > refchek) THEN
              rmin=min(refdata(i,j),rmin)
              rmax=max(refdata(i,j),rmax)
            END IF
          END DO
          WRITE(stdout,'(2x,i5,4f9.1)') j,azim(j),elev(j),rmin,rmax
        END DO
  
        gatesp  = gtspc(1)
        igatesp  = NINT(gatesp)
        rfirstg = NINT(rfirstg)
  
!------------------------------------------------------------------------
!
!       Call radar volume builder.
!
!------------------------------------------------------------------------
        irefgatsp=igatesp

        print *, ' gatesp,rfirstg,refchek=',gatesp,rfirstg,refchek
!
!------------------------------------------------------------------------
!
!     Get matching rho-HV data
!
!------------------------------------------------------------------------
!
        rho_match=.FALSE.
        DO jfile=1,maxinfile
          IF(fvartype(jfile) == 3 .AND. fitime(jfile) == itimcdf .AND.   &
             abs(felv(jfile)-elv) < 0.01 ) THEN
            rho_match=.TRUE.
            infilname = ncradfn(jfile) 
            WRITE(stdout,'(a,a)') 'Reading Rho-HV file:',TRIM(infilname)
            CALL extdirn(infilname,indir,fname)
  
            ALLOCATE(rhohv(ngate,nazim))
            CALL rdrhotiltcdf(nazim,ngate,fname,indir,radarname,         &
                       radlat,radlon,radelv,elv,                         &
                       rmisval,rngfval,itimcdf,frtime,initime,           &
                       rfirstg,azim,rhohv)
            rhodata=rmisval
            print *, ' ngate =',ngate
            print *, ' max range =',(ngate*0.024)
            DO j=1,nazim
              DO i=21,ngate
                rhodata(i,j)=rhohv(i,j)
              END DO
            END DO
            DEALLOCATE(rhohv)
            EXIT
          END IF
        END DO  ! jfile loop

        IF(radarname(1:5) == 'cyril') THEN
          IF(radelv < 0.1) radelv=445.3
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'chick') THEN
          IF(radelv < 0.1) radelv=355.4
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'lawto') THEN
          IF(radelv < 0.1) radelv=295.0
          IF(elv < 0.1) elv=1.5
        ELSE IF(radarname(1:5) == 'rushs') THEN
          IF(radelv < 0.1) radelv=365.8
          IF(elv < 0.1) elv=1.5
        END IF

        IF( qc_on) THEN 
          IF(rho_match) THEN
            print *, ' calling RhoHV screen'
            CALL rhohvchk(maxgate,maxazim,ngate,nazim,refchek,rhohvlim, &
               refdata,veldata,rhodata)
          END IF
          print *, ' calling despekl '
          CALL despekl(maxgate,maxazim,maxgate,maxazim,refchek,         &
               refdata,rtem)
        END IF

        nyqset=0
        IF ( velproc ) THEN
          timeset=0
        ELSE
          timeset=1
        END IF 
        vnyquist=0.
        print *, ' calling volbuild reflectivity'
        print *, '    elv=',elev(1),' nazim =',nazim 
        CALL volbuild(maxgate,maxazim,maxelev,ngate,nazim,              &
                nyqset,timeset,                                         &
                kntrgat,kntrazm,kntrelv,                                &
                igatesp,irfirstg,refchek,                               &
                vnyquist,time,                                          &
                azim,elev,refdata,                                      &
                nyqvvol,timevol,                                        &
                rngrvol,azmrvol,elvrvol,refvol)
      END IF  ! type is reflectivity
    END DO  ! file loop

!------------------------------------------------------------------------
!
!   Process radial velocity files
!
!------------------------------------------------------------------------S
!
    DO infile = 1,maxinfile
      IF(fvartype(infile) == 2) THEN  ! type is velocity
        infilname = ncradfn(infile) 
        WRITE(stdout,'(a,a)') 'Reading velocity file:',TRIM(infilname)
        CALL extdirn(infilname,indir,fname)
        CALL get_ncraddims(fname,indir,iradtype,ngate,nazim,nvar,        &
                         istatus)
        ALLOCATE(ncvarname(nvar))
        CALL get_ncrad2binfo(fname,indir,nazim,nvar,                     &
                 radarname,radlat,radlon,radelv,itimcdf,frtime,          &
                 ivcp,elv,ncvarname,istatus)
        DEALLOCATE(ncvarname)

        ALLOCATE(radv(ngate,nazim))
        CALL rdvrtiltcdf(nazim,ngate,fname,indir,                        &
                       rmisval,rngfval,itimcdf,frtime,initime,           &
                       vnyquist,rfirstg,                                 &
                       azim,beamw,gtspc,vnyq,radv)
        bmwidth=beamw(1)
        veldata=-999.
        DO j=1,nazim
          DO i=1,ngate
            veldata(i,j)=radv(i,j)
          END DO
        END DO
        DEALLOCATE(radv)

!------------------------------------------------------------------------
!
!     Correction for early experimental CASA data
!
!------------------------------------------------------------------------

        IF(radarname(1:5) == 'cyril' .OR.  &
           radarname(1:5) == 'chick' .OR.  &
           radarname(1:5) == 'lawto' .OR.  &
           radarname(1:5) == 'rushs' ) THEN
          vconst=15./acos(-1.)
          DO j=1,nazim
            DO i=1,ngate
              IF(veldata(i,j) > -4.0) THEN
                veldata(i,j)=veldata(i,j)*vconst
              END IF
            END DO
          END DO
          vnyquist=15.0
          vnyq=15.0
        END IF
    
!------------------------------------------------------------------------
!
!       Process velocity data.
!
!------------------------------------------------------------------------
       
        icount = icount + 1
      
        WRITE(stdout,'(a,i4)') 'VCP number for this file:', ivcp
        WRITE(stdout,'(1x,a,i4.4,a1,i2.2,a1,i2.2)', ADVANCE='NO') &
               '    DATE: ', iyear, '/', imonth, '/', iday
        WRITE(stdout,'(1X,a,i2.2,a1,i2.2,a1,i2.2)')  &
               '    TIME: ', ihr, ':', imin, ':', isec


        WRITE(stdout,'(a,i4)')' Processing base velocity data... ', icount

        WRITE(stdout,'(a,i6,a)')'Transferring',nazim,' velocity radials.'

        WRITE(stdout,'(a,f10.2)') ' Nyquist velocity: ',vnyquist

        dtime=float(itime-time1st)
        DO j = 1, maxazim
          time(j) = dtime
          elev(j) = elv
        END DO

        DO j = 1, nazim, 20
          WRITE(stdout,'(a,i5,a,f8.1)') &
                '  Vel j =',j,'  azim =',azim(j)
        END DO
   
        gatesp = gtspc(1) 
        igatesp = NINT(gtspc(1))
        irfirstg = NINT(rfirstg)

!------------------------------------------------------------------------
!
!       Call radar volume builder.
!
!------------------------------------------------------------------------
        ivelgatsp=igatesp 
        nyqset=1
        timeset=1

        IF( qc_on ) THEN
          print *, ' calling despekl '
          CALL despekl(maxgate,maxazim,maxgate,maxazim,velchek,          &
               veldata,rtem)
          print *, ' calling unfnqc'
          print *, ' Nyquist velocity: ',vnyquist
          CALL unfnqc(maxgate,maxazim,maxgate,nazim,                     &
                      nzsnd,zsnd,usnd,vsnd,rfrsnd,                       &
                      bkgopt,shropt,rfropt,igatesp,irfirstg,             &
                      radlat,radlon,radelv,                              &
                      veldata,spwdata,elev,azim,vnyquist,                &
                      unfvdata,bkgvel,bgate,egate,rtem)

          print *, ' calling volbuild velocity '
          print *, '    elv=',elev(1),' nazim =',nazim 
          CALL volbuild(maxgate,maxazim,maxelev,maxgate,nazim,           &
                 nyqset,timeset,                                         &
                 kntvgat,kntvazm,kntvelv,                                &
                 igatesp,irfirstg,velchek,                               &
                 vnyquist,time,                                          &
                 azim,elev,unfvdata,                                     &
                 nyqvvol,timevol,                                        &
                 rngvvol,azmvvol,elvvvol,velvol)
        ELSE

          print *, ' calling volbuild velocity '
          print *, '    elv=',elev(1),' nazim =',nazim 
          CALL volbuild(maxgate,maxazim,maxelev,maxgate,nazim,           &
                 nyqset,timeset,                                         &
                 kntvgat,kntvazm,kntvelv,                                &
                 igatesp,irfirstg,velchek,                               &
                 vnyquist,time,                                          &
                 azim,elev,veldata,                                      &
                 nyqvvol,timevol,                                        &
                 rngvvol,azmvvol,elvvvol,velvol)
        END IF

      END IF ! velocity
    END DO ! DO ifile = 1,maxinfile
    END IF  ! knt2b > 0
!
!   Restore any gzipped files
!
    DO infile=1,maxinfile
      IF(gzipped(infile)) THEN
        WRITE(syscall,'(a,1x,a)') 'gzip',TRIM(ncradfn(infile))
        CALL system(syscall)
      END IF
    END DO

  END IF ! IF (maxinfile > 0)

!------------------------------------------------------------------------
!
! Create filename for output of remapped reflectivity and velocity.
!
!------------------------------------------------------------------------

  IF (icount > 0) THEN
!------------------------------------------------------------------------
!
!   Call remapping routines
!
!------------------------------------------------------------------------

    IF( qc_on ) THEN
      print *, ' Calling apdetect '
      CALL apdetect(maxgate,maxgate,maxazim,maxelev,                     &
                    kntrgat,kntrazm,kntrelv,                             &
                    kntvgat,kntvazm,kntvelv,                             &
                    refchek,velchek,                                     &
                    irefgatsp,ivelgatsp,                                 &
                    winszrad,winszazim,ivcp,                             &
                    rngrvol,azmrvol,elvrvol,                             &
                    rngvvol,azmvvol,elvvvol,                             &
                    refvol,velvol,rtem,                                  &
                    istatus)
    END IF

    nyqset=0
    IF( velproc ) THEN
      timeset=0
    ELSE
      timeset=1
    END IF
    IF(ref3d) THEN
      vardump=1
    ELSE
      vardump=0
    END IF
    varfill=0
    ivar=1
    print *, ' Calling remapvol for reflectivity '
    CALL remapvol(maxgate,maxazim,maxelev,nx,ny,nz,nzsnd,maxsort,        &
                  vardump,varfill,ivar,nyqset,timeset,rfropt,            &
                  refid,refname,refunits,                                &
                  refchek,refmiss,bmwidth,refmedl,refdazl,iordref,       &
                  kntrgat,kntrazm,kntrelv,                               &
                  radlat,radlon,radarx,radary,radelv,dazim,              &
                  rngmin,rngmax,time1st,                                 &
                  rngrvol,azmrvol,elvrvol,                               &
                  refvol,timevol,nyqvvol,rxvol,ryvol,rzvol,              &
                  xs,ys,zps,zsnd,rfrsnd,varsort,elvmean,                 &
                  gridref,gridtim,gridnyq,istatus)

    IF( ref2d ) THEN
      vardump=1
      ivar=1
      varid='refl2d'
      varname='Low-level reflect'
      varunits='dBZ'
      print *, ' Calling remap2d for reflectivity'
      CALL remap2d(maxgate,maxazim,maxelev,nx,ny,nzsnd,maxsort,          &
                   vardump,ivar,rfropt,varid,varname,varunits,dmpfmt,hdf4cmpr, &
                   refchek,refmiss,refmedl,refdazl,iordref,              &
                   kntrgat,kntrazm,kntrelv,                              &
                   radlat,radlon,radarx,radary,radelv,dazim,             &
                   rngmin,rngmax,rngrvol,azmrvol,elvrvol,                &
                   refvol,rxvol,ryvol,xs,ys,zsnd,rfrsnd,varsort,         &
                   tem2d,istatus)

    END IF

    IF( velproc ) THEN
      nyqset=1
      timeset=1
      IF(vel3d) THEN
        vardump=1
      ELSE
        vardump=0
      END IF
      vardump=0
      varfill=0
      ivar=2
      WRITE(stdout,'(a)') ' Calling remapvol for velocity '
      CALL remapvol(maxgate,maxazim,maxelev,nx,ny,nz,nzsnd,maxsort,      &
                    vardump,varfill,ivar,nyqset,timeset,rfropt,          &
                    velid,velname,velunits,                              &
                    velchek,velmiss,bmwidth,velmedl,veldazl,iordvel,     &
                    kntvgat,kntvazm,kntvelv,                             &
                    radlat,radlon,radarx,radary,radelv,dazim,            &
                    rngmin,rngmax,time1st,                               &
                    rngvvol,azmvvol,elvvvol,                             &
                    velvol,timevol,nyqvvol,rxvol,ryvol,rzvol,            &
                    xs,ys,zps,zsnd,rfrsnd,varsort,elvmean,               &
                    gridvel,gridtim,gridnyq,istatus)
    END IF

    IF( vel2d ) THEN
      vardump=1
      ivar=1
      varid='radv2d'
      varname='Low-level Velocity'
      varunits='m/s'
      print *, ' Calling remap2d for velocity '
      CALL remap2d(maxgate,maxazim,maxelev,nx,ny,nzsnd,maxsort,          &
                   vardump,ivar,rfropt,varid,varname,varunits,dmpfmt,hdf4cmpr, &
                   velchek,velmiss,velmedl,veldazl,iordvel,              &
                   kntvgat,kntvazm,kntvelv,                              &
                   radlat,radlon,radarx,radary,radelv,dazim,             &
                   rngmin,rngmax,rngvvol,azmvvol,elvvvol,                &
                   velvol,rxvol,ryvol,xs,ys,zsnd,rfrsnd,varsort,         &
                   tem2d,istatus)
    END IF

!------------------------------------------------------------------------
!
!   Create filename and write file.
!
!------------------------------------------------------------------------

    full_fname=' '
    CALL mkradfnm(dmpfmt,dir_name,len_dir,radname,iiyr,iimonth,iiday,    &
                  iihr, iimin, iisec, full_fname, len_fname)

    WRITE(stdout,'(a,a)') ' Filename for this volume: ',TRIM(full_fname)
  
!    CALL wtradcol(nx, ny, nz, dmpfmt, 1, hdf4cmpr, full_fname,           &
!                  radname, radlat, radlon, radelv,                       &
!                  iyr,imonth,iday,iihr,iimin,iisec,ivcp,isource,         &
!                  refelvmin,refelvmax,refrngmin,refrngmax,               &
!                  xs, ys, zps, gridvel, gridref, gridnyq, gridtim,       &
!                  tem1d1,tem1d2,tem1d3,tem1d4,tem1d5,tem1d6)
    CALL wtradcol(nx,ny,nz,dmpfmt,1,hdf4cmpr,full_fname,                &
                  radname,radlat,radlon,radelv,                         &
                  iyr,imonth,iday,iihr,iimin,iisec,ivcp,isource,        &
                  refelvmin,refelvmax,refrngmin,refrngmax,              &
                  xs,ys,zps,gridvel,gridref,gridnyq,gridtim,tem2d);

  END IF

!------------------------------------------------------------------------
!
! The End.
!
!------------------------------------------------------------------------
 
  WRITE(stdout,'(/a)') ' Normal termination of ncrad2arps.'
  STOP

END PROGRAM ncrad2arps

SUBROUTINE rhohvchk(maxgate,maxazim,ngate,nazim,refchek,rhohvlim,         & 2
             refl,radv,rhohv)
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: maxgate
  INTEGER, INTENT(IN) :: maxazim
  INTEGER, INTENT(IN) :: ngate
  INTEGER, INTENT(IN) :: nazim
  REAL, INTENT(IN) :: refchek
  REAL, INTENT(IN) :: rhohvlim
  REAL, INTENT(INOUT) :: refl(maxgate,maxazim)
  REAL, INTENT(INOUT) :: radv(maxgate,maxazim)
  REAL, INTENT(IN) :: rhohv(maxgate,maxazim)
!
  REAL, PARAMETER :: refmiss=-901.0
  REAL, PARAMETER :: velmiss=-901.0
  INTEGER, PARAMETER :: nhist=20
  INTEGER :: histknt(nhist)
  INTEGER :: igate,jazim,ihist
  INTEGER :: kntvalid,kntflag
  REAL :: histcst,histinv,histbin,pctflg,pcthist

  histknt=0
  histcst=1.0/float(nhist)
  histinv=float(nhist)

  kntvalid=0
  kntflag=0
  DO jazim=1,nazim
    DO igate=1,ngate
      IF(refl(igate,jazim) > refchek ) THEN
        kntvalid=kntvalid+1
        IF( rhohv(igate,jazim) < rhohvlim) THEN
          kntflag=kntflag+1
          refl(igate,jazim) = refmiss
          radv(igate,jazim) = velmiss
        END IF
        ihist=1+INT(rhohv(igate,jazim)*histinv)
        ihist=min(max(ihist,1),nhist)
        histknt(ihist)=histknt(ihist)+1
      END IF
    END DO
  END DO
!
  pctflg=0.
  IF(kntvalid > 0) THEN
    pctflg=100.*float(kntflag)/float(kntvalid)
  END IF
  WRITE(6,'(a,i9,a,i9,a,f5.1,a)') &
   ' Rho-HV screened ',kntflag,' of ',kntvalid,' = ',pctflg, &
   '% reflectivity gates'
!
  WRITE(6,'(/a)') ' Histogram of Rho-HV (count, percent):'
  DO ihist=1,nhist
    histbin=histcst*(ihist-1)
    pcthist=100.*float(histknt(ihist))/float(kntvalid)
    WRITE(6,'(f7.3,i9,f10.1)') histbin,histknt(ihist),pcthist
  END DO
  RETURN
END SUBROUTINE rhohvchk

SUBROUTINE snrchk(maxgate,maxazim,ngate,nazim,refchek,rfirstg,gatesp, & 1,1
                   snstvty,refl,radv,attref)
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: maxgate
  INTEGER, INTENT(IN) :: maxazim
  INTEGER, INTENT(IN) :: ngate
  INTEGER, INTENT(IN) :: nazim
  REAL, INTENT(IN) :: refchek
  REAL, INTENT(IN) :: rfirstg
  REAL, INTENT(IN) :: gatesp
  REAL, INTENT(OUT) :: snstvty(maxgate)
  REAL, INTENT(INOUT) :: refl(maxgate,maxazim)
  REAL, INTENT(INOUT) :: radv(maxgate,maxazim)
  REAL, INTENT(IN) :: attref(maxgate,maxazim)
!
  REAL, PARAMETER :: refmiss=-911.0
  REAL, PARAMETER :: velmiss=-911.0
  INTEGER :: igate,jazim
  INTEGER :: kntvalid,kntflag
  REAL :: snr,pctflg

  CALL xbsnstvty(maxgate,rfirstg,gatesp,snstvty)
  DO igate=1,maxgate,10
    print *, ' igate: ',igate,' range=',(0.001*(rfirstg+(igate-1)*gatesp)), &
             ' sens= ',snstvty(igate)
  END DO

  kntvalid=0
  kntflag=0
  DO jazim=1,nazim
    DO igate=1,ngate
      IF(refl(igate,jazim) > refchek ) THEN
        kntvalid=kntvalid+1
        IF( attref(igate,jazim) < snstvty(igate)) THEN
          kntflag=kntflag+1
          refl(igate,jazim) = refmiss
          radv(igate,jazim) = velmiss
        END IF
      END IF
    END DO
  END DO
!
  pctflg=0.
  IF(kntvalid > 0) THEN
    pctflg=100.*float(kntflag)/float(kntvalid)
  END IF
  WRITE(6,'(a,i9,a,i9,a,f5.1,a)') &
   ' SNR screened ',kntflag,' of ',kntvalid,' = ',pctflg, &
   '% reflectivity gates'
  RETURN
END SUBROUTINE snrchk

SUBROUTINE xbsnstvty(ngate,rfirstg,gatesp,sens) 1
! 
!-----------------------------------------------------------------------
! Calculate X-band radar sensitivity (dBZ) as a function of range.
!
! Based on information provided by Francesc Joyvount
!
! Keith Brewster and Erin Fay, CAPS
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
     
  INTEGER, INTENT(IN) :: ngate
  REAL, INTENT(IN) :: rfirstg
  REAL, INTENT(IN) :: gatesp
  REAL, INTENT (OUT):: sens(ngate)     ! Sensitivity values for all dist from radar.
!
! Parameters for CASA radar
!
!  REAL, PARAMETER :: lmbda = 3.0E-02 ! Wavelength (m)
  REAL, PARAMETER :: freqkhz=11505000.0  ! kHz
  REAL, PARAMETER :: ptxdbm=66.68    ! Peak power (dBm)
!  REAL, PARAMETER :: pt = 12500     ! Peak power (Watts)
  REAL, PARAMETER :: G  = 38.0       ! Antenna gain (dB)
  REAL, PARAMETER :: F  = 5.5        ! Noise figure (dB)
!  REAL, PARAMETER :: tau = 0.67E-06  ! Radar pulse length (s)
  REAL, PARAMETER :: tau = 4.06E-07  ! Radar pulse length (s)

  REAL, PARAMETER :: theta = 1.8     ! Antenna half-power beamwidth (deg)
  REAL, PARAMETER :: B = 2.5         ! Bandwidth (MHz)
  REAL, PARAMETER :: lm = 1.0        ! Receiver mis-match loss(dB)
  REAL, PARAMETER :: Kw2 = 0.91      ! Refractive Index of water squarred
  REAL, PARAMETER :: T0 = 300.       ! Rx temperature (K)
  REAL, PARAMETER :: Ta = 200.       ! Antenna temperature (K)
!
! Physical constants
!
  REAL, PARAMETER :: K = 1.38E-23    ! Boltsmann's Constant (J/K)
  REAL, PARAMETER :: c = 2.99792E08  ! Speed of light (m/s)
  REAL, PARAMETER :: rconst =1.0E18  ! m6/m3 to mm6/m3
!
! Misc internal variables
!
  INTEGER :: igate
  REAL :: ln2,pi,pi3,four3,bwrad,rnoise,BHz,Ni,sconst,rlm,rG
  REAL :: pt,lmbda
  REAL :: range
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  pt=0.001*(10.0**(0.1*ptxdbm))
  print *, ' pt= ',pt
  lmbda=c/(freqkhz*1000.)
  print *, ' lmbda (m)= ',lmbda
  ln2=log(2.0)
  pi=acos(-1.)
  pi3=pi*pi*pi
  four3=4.*4.*4.
  bwrad=theta*pi/180.
  rnoise=10.**(0.1*F)
  rlm=10.**(0.1*lm)
  rG=10.**(0.1*G)
  BHz=1.0E06*b
  Ni=K*(Ta+(rnoise-1.0)*T0)*BHz
  sconst=rconst *(Ni/(pi3*Kw2)) * ((8.*ln2)/(bwrad*bwrad)) *         &
         (2./(c*tau)) * ((lmbda*lmbda*four3*rlm)/(Pt*rG*rG))
  DO igate = 1, ngate
     range=rfirstg+((igate-1)*gatesp)
     sens(igate) = 10.*LOG10(range*range*sconst)
  END DO
END SUBROUTINE xbsnstvty

SUBROUTINE extdirn(filename,dirname,fname) 5
!
! Extract directory name from complete filename and output
! directory name and filename in two character string variables
!
IMPLICIT NONE

CHARACTER (LEN=*) :: filename
CHARACTER (LEN=*) :: dirname
CHARACTER (LEN=*) :: fname

INTEGER :: lenf
INTEGER :: i

lenf=LEN(filename)
dirname='./'
fname=filename
DO i=(lenf-1),1,-1
  IF(filename(i:i) == '/') THEN
    dirname=filename(1:(i-1))
    fname=filename((i+1):lenf)
    EXIT
  END IF
END DO
RETURN

END SUBROUTINE extdirn