!########################################################################
!########################################################################
!########################################################################
!#########                                                      #########
!#########               SUBROUTINE get_ncraddims               #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################

SUBROUTINE get_ncraddims(fname,indir,iradtype,ngate,nazim,nvar,          & 4
                         istatus)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Obtain dimension information from a NetCDF Radar file.
!  Handles CASA Tier 2a and Tier 2b files.
!  Reports the type of file via iradtype variable.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  2007/02/27
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  iradtype: 21 CASA Tier 2a Data
!            22 CASA Tier 2b Data (WDSS-II files)
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
  INCLUDE 'netcdf.inc'
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80) , INTENT(IN):: indir
  INTEGER, INTENT(OUT) :: iradtype
  INTEGER, INTENT(OUT) :: ngate
  INTEGER, INTENT(OUT) :: nazim
  INTEGER, INTENT(OUT) :: nvar
  INTEGER, INTENT(OUT) :: istatus
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  CHARACTER(LEN=NF_MAX_NAME) :: varname
  INTEGER :: ncmode,ncid,gateid,azimid,k
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading file dimensions from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
  IF( istatus /= NF_NOERR) THEN
    write(6,'(a,i6)') ' Error opening file, istatus= ',istatus
    RETURN
  END IF

  istatus=nf_inq_dimid(ncid,'Gate',gateid)
  IF( istatus /= NF_NOERR) THEN
    write(6,'(a,i6)') ' Error finding gate ID, istatus= ',istatus
    RETURN
  END IF

  istatus=nf_inq_dimlen(ncid,gateid,ngate)
  IF( istatus /= NF_NOERR) THEN
    write(6,'(a,i6)') ' Error finding number of gates, istatus= ',istatus
    RETURN
  END IF

  iradtype=0
  istatus=nf_inq_dimid(ncid,'Radial',azimid)
  IF( istatus == NF_NOERR) THEN
    iradtype=21
    write(6,'(a,i3)') ' File type is CASA Tier2a, iradtype=',iradtype
    istatus=nf_inq_dimlen(ncid,azimid,nazim)
    IF( istatus /= NF_NOERR) THEN
      write(6,'(a,i6)') & 
        ' Error finding number of azimuths, istatus= ',istatus
      RETURN
    END IF
  ELSE 
    istatus=nf_inq_dimid(ncid,'Azimuth',azimid)
    IF( istatus == NF_NOERR) THEN
      iradtype=22
      write(6,'(a,i3)') ' File type is CASA Tier2b, iradtype=',iradtype
      istatus=nf_inq_dimlen(ncid,azimid,nazim)
      IF( istatus /= NF_NOERR) THEN
        write(6,'(a,i6)') &
          ' Error finding number of azimuths, istatus= ',istatus
        RETURN
      END IF
    ELSE
      write(6,'(a,i6)') ' Error finding azimuth ID, istatus= ',istatus
      RETURN
    END IF
  END IF

  WRITE(6,'(a,i6,a,i6)') ' ngate= ',ngate,'  nazim= ',nazim

  nvar=0
  DO k=1,NF_MAX_VARS
    istatus=nf_inq_varname(ncid,k,varname)
    IF( istatus /= NF_NOERR) EXIT
    nvar=nvar+1
  END DO
  WRITE(6,'(a,i6)') ' nvar= ',nvar
  istatus=NF_CLOSE(ncid)
  RETURN
END SUBROUTINE get_ncraddims
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########             SUBROUTINE get_ncrad2ainfo               #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################

SUBROUTINE get_ncrad2ainfo(fname,indir,nazim,nvar,tem_double,             & 2
                         radarname,radlat,radlon,radelv,                  &
                         itimcdf,frtime,elv,ncvarname,istatus)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Obtain information about a CASA Tier 2a NetCDF radar file, 
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  2007/02/27
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
  IMPLICIT NONE
  INCLUDE 'netcdf.inc'
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: nvar
  REAL(KIND=8), INTENT(OUT) :: tem_double(nazim)
  CHARACTER(LEN=32), INTENT(OUT) :: radarname
  REAL, INTENT(OUT) :: radlat
  REAL, INTENT(OUT) :: radlon
  REAL, INTENT(OUT) :: radelv
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  REAL, INTENT(OUT) :: elv
  CHARACTER(LEN=NF_MAX_NAME) :: ncvarname(nvar)
  INTEGER, INTENT(OUT) :: istatus
!
!-----------------------------------------------------------------------
!
! Misc Internal Variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: ncmode,ncid,timeid,elevid,iazim,k
  REAL :: elvsum,elvknt
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading file information from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
  IF( istatus /= NF_NOERR) THEN
    write(6,'(a,i6)') ' Error opening file, istatus= ',istatus
    RETURN
  END IF

  radarname=' '
  istatus=nf_get_att_text(ncid,nf_global,'RadarName',radarname)
  WRITE(6,'(a,a)') '  RadarName=',TRIM(radarname)
  istatus=nf_get_att_real(ncid,nf_global,'Latitude',radlat)
  istatus=nf_get_att_real(ncid,nf_global,'Longitude',radlon)
  istatus=nf_get_att_real(ncid,nf_global,'Height',radelv)
  WRITE(6,'(a,f10.4,a,f10.4,a,f8.1)') &
    ' Lat=',radlat,'  Lon=',radlon,'  Height=',radelv
    
  istatus=nf_inq_varid(ncid,'Time',timeid)
  istatus=nf_get_var1_int(ncid,timeid,1,itimcdf)
  frtime=0.0
  WRITE(6,'(a,i16,a,f10.2)') &
      ' Time=',itimcdf,'  FrTime=',frtime
!
  istatus=nf_inq_varid(ncid,'Elevation',elevid)
  istatus=nf_get_var_double(ncid,elevid,tem_double)
  elv=0.
  elvsum=0.
  elvknt=0.
  DO iazim=1,nazim
    IF(tem_double(iazim) > -5.0 .AND. tem_double(iazim) < 90.1) THEN
      elvsum=elvsum+tem_double(iazim)
      elvknt=elvknt+1.0
    END IF
  END DO
  IF(elvknt > 0.0) THEN
    elv=elvsum/elvknt
  END IF
!
  DO k=1,nvar
    istatus=nf_inq_varname(ncid,k,ncvarname(k))
    IF( istatus /= NF_NOERR) EXIT
  END DO
  istatus=NF_CLOSE(ncid)
  RETURN
END SUBROUTINE get_ncrad2ainfo
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########             SUBROUTINE get_ncrad2binfo               #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################

SUBROUTINE get_ncrad2binfo(fname,indir,nazim,nvar,                        & 3
                         radarname,radlat,radlon,radelv,                  &
                         itimcdf,frtime,ivcp,elv,ncvarname,istatus)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Obtain information about a CASA Tier 2b NetCDF radar file, 
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  2007/02/26
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
  IMPLICIT NONE
  INCLUDE 'netcdf.inc'
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: nvar
  CHARACTER(LEN=32), INTENT(OUT) :: radarname
  REAL, INTENT(OUT) :: radlat
  REAL, INTENT(OUT) :: radlon
  REAL, INTENT(OUT) :: radelv
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: ivcp
  REAL, INTENT(OUT) :: elv
  CHARACTER(LEN=NF_MAX_NAME) :: ncvarname(nvar)
  INTEGER, INTENT(OUT) :: istatus
!
!-----------------------------------------------------------------------
!
! Misc Internal Variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  CHARACTER (LEN=6) :: vcpstr
  INTEGER :: ncmode,ncid,timeid,elevid,k

  itimcdf=0
  frtime=0.
  ivcp=0
  elv=0.
  vcpstr='      '
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading file information from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
  IF( istatus /= NF_NOERR) THEN
    write(6,'(a,i6)') ' Error opening file, istatus= ',istatus
    RETURN
  END IF

  radarname=' '
  istatus=nf_get_att_text(ncid,nf_global,'radarName-value',radarname)
  WRITE(6,'(a,a)') '  RadarName=',TRIM(radarname)
  istatus=nf_get_att_real(ncid,nf_global,'Latitude',radlat)
  istatus=nf_get_att_real(ncid,nf_global,'Longitude',radlon)
  istatus=nf_get_att_real(ncid,nf_global,'Height',radelv)
  WRITE(6,'(a,f10.4,a,f10.4,a,f8.1)') &
    ' Lat=',radlat,'  Lon=',radlon,'  Height=',radelv
    
  istatus=nf_get_att_int(ncid,nf_global,'Time',itimcdf)
  istatus=nf_get_att_real(ncid,nf_global,'FractionalTime',frtime)
  WRITE(6,'(a,i16,a,f10.2)') &
      ' Time=',itimcdf,'  FrTime=',frtime
  
  istatus=nf_get_att_text(ncid,nf_global,'vcp-value',vcpstr)
  print *, ' read vcpstr as: ',vcpstr
  IF(istatus == NF_NOERR) read(vcpstr,*) ivcp
  istatus=nf_get_att_real(ncid,nf_global,'Elevation',elv)
!
  DO k=1,nvar
    istatus=nf_inq_varname(ncid,k,ncvarname(k))
    IF( istatus /= NF_NOERR) EXIT
  END DO
  istatus=NF_CLOSE(ncid)
  RETURN
END SUBROUTINE get_ncrad2binfo
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########                SUBROUTINE rdrftiltcdf                #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################
!

SUBROUTINE rdrftiltcdf(nazim,ngate,fname,indir,                         & 3
                       rmisval,rngfval,itimcdf,frtime,initime,rfirstg,  &
                       azim,beamw,gtspc,refl)
!
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar reflectivity data from CASA Tier 2b NetCDF data files 
!
!------------------------------------------------------------------------
!
! AUTHOR:
!
! Keith Brewster (May 2005)
!
! MODIFICATIONS:
! 24 Mar 2007 (Keith Brewster)
! Added default value of beamw=1.0 if beamw is missing.
!
!------------------------------------------------------------------------
                                                                                
  IMPLICIT NONE
                                                                                
!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------
                                                                                
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: ngate
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  REAL, INTENT(OUT) :: rmisval
  REAL, INTENT(OUT) :: rngfval
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: initime
  REAL, INTENT(OUT) :: rfirstg
!
  REAL, INTENT(OUT) :: azim(nazim)
  REAL, INTENT(OUT) :: beamw(nazim)
  REAL, INTENT(OUT) :: gtspc(nazim)
  REAL, INTENT(OUT) :: refl(ngate,nazim)
!
!-----------------------------------------------------------------------
!
!  netCDF variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: istatus,ncid,ncmode
  INTEGER :: ipktyp,nbits
!
!-----------------------------------------------------------------------
!
!  Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: nazimid,ngateid
  INTEGER :: azmid,bmwid,elvid,gtwid,refid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: lrname,ifsecs
!
  INCLUDE 'globcst.inc'
  INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  itimcdf=-99
  frtime=-999.
  rfirstg=-999.
  rmisval=-999.
  rngfval=-999.
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading reflectivity data from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
!
!-----------------------------------------------------------------------
!
!  Read Global Attributes
!
!-----------------------------------------------------------------------
!
  istatus=nf_get_att_int(ncid,nf_global,'Time',itimcdf)
  istatus=nf_get_att_real(ncid,nf_global,'FractionalTime',frtime)
  print *, ' Time=',itimcdf,'  FrTime=',frtime

  istatus=nf_get_att_real(ncid,nf_global,'RangeToFirstGate',rfirstg)
  istatus=nf_get_att_real(ncid,nf_global,'MissingData',rmisval)
  istatus=nf_get_att_real(ncid,nf_global,'RangeFolded',rngfval)
  print *, ' Rng-1stgate=',rfirstg
  print *, ' MissingData=',rmisval,' RangeFolded=',rngfval

  initime=itimcdf
  istatus=nf_get_att_real(ncid,nf_global,'InitialTime',initime)
!
!-----------------------------------------------------------------------
!
!  Read data variables
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Azimuth',azmid)
  istatus=nf_get_var_real(ncid,azmid,azim)

  istatus=nf_inq_varid(ncid,'BeamWidth',bmwid)
  IF(istatus == NF_NOERR) THEN
    istatus=nf_get_var_real(ncid,bmwid,beamw)
  ELSE
    beamw=1.0
  END IF

  istatus=nf_inq_varid(ncid,'GateWidth',gtwid)
  istatus=nf_get_var_real(ncid,gtwid,gtspc)

  istatus=nf_inq_varid(ncid,'Reflectivity',refid)
  istatus=nf_get_var_real(ncid,refid,refl)
!
!-----------------------------------------------------------------------
!
! Close data file.
!
!-----------------------------------------------------------------------
!
  istatus=nf_close(ncid)

END SUBROUTINE rdrftiltcdf
 
!########################################################################
!########################################################################
!#########                                                      #########
!#########                SUBROUTINE rdvrtiltcdf                #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################
!

SUBROUTINE rdvrtiltcdf(nazim,ngate,fname,indir,                         & 3
                       rmisval,rngfval,itimcdf,frtime,initime,          &
                       vnyquist,rfirstg,                                &
                       azim,beamw,gtspc,vnyq,radv)
!
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar radial velocity data from CASA Tier 2b NetCDF data files 
!
!------------------------------------------------------------------------
!
! AUTHOR:
!
! Keith Brewster (May 2005)
!
! MODIFICATIONS:
!
! 24 Mar 2007 (Keith Brewster)
! Added check for variable name AliasedVelocity in addition to RawVelocity
! Added default value of beamw=1.0 if beamw is missing.
!
!------------------------------------------------------------------------
!
  IMPLICIT NONE
!
!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------
!
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: ngate
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  REAL, INTENT(OUT) :: rmisval
  REAL, INTENT(OUT) :: rngfval
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: initime
  REAL, INTENT(OUT) :: vnyquist
  REAL, INTENT(OUT) :: rfirstg
!
  REAL, INTENT(OUT) :: azim(nazim)
  REAL, INTENT(OUT) :: beamw(nazim)
  REAL, INTENT(OUT) :: gtspc(nazim)
  REAL, INTENT(OUT) :: vnyq(nazim)
  REAL, INTENT(OUT) :: radv(ngate,nazim)
!
!-----------------------------------------------------------------------
!
!  netCDF variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: istatus,iostatus,ncid,ncmode
  INTEGER :: ipktyp,nbits
!
!-----------------------------------------------------------------------
!
!  Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: nazimid,ngateid
  INTEGER :: azmid,bmwid,elvid,gtwid,nyqid,velid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
  INCLUDE 'globcst.inc'
  INCLUDE 'netcdf.inc'

  INTEGER :: lrname,ifsecs
  CHARACTER(LEN=NF_MAX_NAME) vnyqtext
  REAL, PARAMETER :: vnyq_default = 31.9
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  itimcdf=-99
  frtime=-999.
  vnyquist=-99.
  rfirstg=-999.
  rmisval=-999.
  rngfval=-999.
  initime=-99
  curtim=-999.
  vnyqtext=' '
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading velocity data from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
!
!-----------------------------------------------------------------------
!
!  Read Global Attributes
!
!-----------------------------------------------------------------------
!
  istatus=nf_get_att_int(ncid,nf_global,'Time',itimcdf)
  istatus=nf_get_att_real(ncid,nf_global,'FractionalTime',frtime)
  istatus=nf_get_att_text(ncid,nf_global,'Nyquist_Vel-value',vnyqtext)
  READ(vnyqtext,*,iostat=iostatus) vnyquist
  IF(iostatus /= 0) vnyquist=vnyq_default
  istatus=nf_get_att_real(ncid,nf_global,'RangeToFirstGate',rfirstg)
  istatus=nf_get_att_real(ncid,nf_global,'MissingData',rmisval)
  istatus=nf_get_att_real(ncid,nf_global,'RangeFolded',rngfval)

  istatus=nf_get_att_text(ncid,nf_global,'Runname',runname)
  initime=itimcdf
  istatus=nf_get_att_int(ncid,nf_global,'InitialTime',initime)
  curtim=0.
  istatus=nf_get_att_real(ncid,nf_global,'ForecastSeconds',curtim)

  print *, ' Done reading global variables '
!
!-----------------------------------------------------------------------
!
!  Read data variables
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Azimuth',azmid)
  istatus=nf_get_var_real(ncid,azmid,azim)

  istatus=nf_inq_varid(ncid,'BeamWidth',bmwid)
  IF(istatus == NF_NOERR) THEN
    istatus=nf_get_var_real(ncid,bmwid,beamw)
  ELSE
    beamw=1.0
  END IF

  istatus=nf_inq_varid(ncid,'GateWidth',gtwid)
  istatus=nf_get_var_real(ncid,gtwid,gtspc)

  istatus=nf_inq_varid(ncid,'NyquistVelocity',nyqid)
  istatus=nf_get_var_real(ncid,nyqid,vnyq)

  istatus=nf_inq_varid(ncid,'RawVelocity',velid)
  IF(istatus == NF_NOERR) THEN
    istatus=nf_get_var_real(ncid,velid,radv)
  ELSE
    istatus=nf_inq_varid(ncid,'AliasedVelocity',velid)
    istatus=nf_get_var_real(ncid,velid,radv)
  END IF
!
!-----------------------------------------------------------------------
!
! Close data file.
!
!-----------------------------------------------------------------------
!
  istatus=nf_close(ncid)

END SUBROUTINE rdvrtiltcdf
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########                SUBROUTINE rdvvtiltcdf                #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################


SUBROUTINE rdvvtiltcdf(nazim,ngate,fname,indir,                         & 1
                       rmisval,rngfval,itimcdf,frtime,initime,rfirstg,  &
                       azim,beamw,gtspc,vort)
!
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads vertical vorticity data from NetCDF data files
! Interpolated vertical vorticity is a special dataset generated by the
! radar emulator to use for verification of radar algortihms.
!
!------------------------------------------------------------------------
!
! AUTHOR:
!
! Keith Brewster (May 2005)
!
! MODIFICATIONS:
! 24 Mar 2007 (Keith Brewster)
! Added default value of beamw=1.0 if beamw is missing.
!
!------------------------------------------------------------------------

  IMPLICIT NONE

!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------
!
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: ngate
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  REAL, INTENT(OUT) :: rmisval
  REAL, INTENT(OUT) :: rngfval
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: initime
  REAL, INTENT(OUT) :: rfirstg
!
  REAL, INTENT(OUT) :: azim(nazim)
  REAL, INTENT(OUT) :: beamw(nazim)
  REAL, INTENT(OUT) :: gtspc(nazim)
  REAL, INTENT(OUT) :: vort(ngate,nazim)
!
!-----------------------------------------------------------------------
!
!  netCDF variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: istatus,ncid,ncmode
  INTEGER :: ipktyp,nbits
!
!-----------------------------------------------------------------------
!
!  Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: azmid,bmwid,elvid,gtwid,vorid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: lrname,ifsecs
!
  INCLUDE 'globcst.inc'
  INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  itimcdf=-99
  frtime=-999.
  rfirstg=-999.
  rmisval=-999.
  rngfval=-999.
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,a)') ' Reading vorticity data from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
!
!-----------------------------------------------------------------------
!
!  Read Global Attributes
!
!-----------------------------------------------------------------------
!
  istatus=nf_get_att_int(ncid,nf_global,'Time',itimcdf)
  istatus=nf_get_att_real(ncid,nf_global,'FractionalTime',frtime)
  istatus=nf_get_att_real(ncid,nf_global,'RangeToFirstGate',rfirstg)
  istatus=nf_get_att_real(ncid,nf_global,'MissingData',rmisval)
  istatus=nf_get_att_real(ncid,nf_global,'RangeFolded',rngfval)

  istatus=nf_get_att_text(ncid,nf_global,'Runname',runname)
  initime=itimcdf
  istatus=nf_get_att_int(ncid,nf_global,'InitialTime',initime)
  curtim=0.
  istatus=nf_get_att_real(ncid,nf_global,'ForecastSeconds',curtim)
!
!-----------------------------------------------------------------------
!
!  Read data variables
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Azimuth',azmid)
  istatus=nf_get_var_real(ncid,azmid,azim)
  istatus=nf_inq_varid(ncid,'BeamWidth',bmwid)
  IF(istatus == NF_NOERR) THEN
    istatus=nf_get_var_real(ncid,bmwid,beamw)
  ELSE
    beamw=1.0
  END IF
  istatus=nf_inq_varid(ncid,'GateWidth',gtwid)
  istatus=nf_get_var_real(ncid,gtwid,gtspc)
  istatus=nf_inq_varid(ncid,'VerticalVorticity',vorid)
  istatus=nf_get_var_real(ncid,vorid,vort)
!
!-----------------------------------------------------------------------
!
! Close data file.
!
!-----------------------------------------------------------------------
!
  istatus=nf_close(ncid)

END SUBROUTINE rdvvtiltcdf
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########                SUBROUTINE rdrhotiltcdf               #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################
!

SUBROUTINE rdrhotiltcdf(nazim,ngate,fname,indir,                        & 1
                       rmisval,rngfval,itimcdf,frtime,initime,          &
                       rfirstg,azim,rhohv)
!
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar dual-pol Rho-HV data from CASA Level-2b NetCDF data files 
!
!------------------------------------------------------------------------
!
! AUTHOR:
!
! Keith Brewster (Nov 2006)
!
! MODIFICATIONS:
!
!------------------------------------------------------------------------
                                                                                
  IMPLICIT NONE
                                                                                
!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------
                                                                                
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: ngate
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  REAL, INTENT(OUT) :: rmisval
  REAL, INTENT(OUT) :: rngfval
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: initime
  REAL, INTENT(OUT) :: rfirstg
!
  REAL, INTENT(OUT) :: azim(nazim)
  REAL, INTENT(OUT) :: rhohv(ngate,nazim)
!
!-----------------------------------------------------------------------
!
!  netCDF variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: istatus,ncid,ncmode
  INTEGER :: ipktyp,nbits
!
!-----------------------------------------------------------------------
!
!  Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: azmid,elvid,rhoid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: lrname,ifsecs
!
  INCLUDE 'globcst.inc'
  INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  itimcdf=-99
  frtime=-999.
  rfirstg=-999.
  rmisval=-999.
  rngfval=-999.
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,/a)') ' Reading Rho-HV data from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
!
!-----------------------------------------------------------------------
!
!  Read Global Attributes
!
!-----------------------------------------------------------------------
!
  istatus=nf_get_att_int(ncid,nf_global,'Time',itimcdf)
  istatus=nf_get_att_real(ncid,nf_global,'FractionalTime',frtime)
  print *, ' Time=',itimcdf,'  FrTime=',frtime

  istatus=nf_get_att_real(ncid,nf_global,'RangeToFirstGate',rfirstg)
  istatus=nf_get_att_real(ncid,nf_global,'MissingData',rmisval)
  istatus=nf_get_att_real(ncid,nf_global,'RangeFolded',rngfval)
  print *, ' r-1stgate=',rfirstg
  print *, '  MissingData=',rmisval,' RangeFolded=',rngfval

  initime=itimcdf
  istatus=nf_get_att_real(ncid,nf_global,'InitialTime',initime)
!
!-----------------------------------------------------------------------
!
!  Read data variables
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Azimuth',azmid)
  print *, ' azmid=',azmid
  istatus=nf_get_var_real(ncid,azmid,azim)

  istatus=nf_inq_varid(ncid,'RhoHV',rhoid)
  print *, ' rhoid',rhoid
  istatus=nf_get_var_real(ncid,rhoid,rhohv)
!
!-----------------------------------------------------------------------
!
! Close data file.
!
!-----------------------------------------------------------------------
!
  istatus=nf_close(ncid)

END SUBROUTINE rdrhotiltcdf
!
!########################################################################
!########################################################################
!#########                                                      #########
!#########                SUBROUTINE rd2atiltcdf                #########
!#########                                                      #########
!#########                     Developed by                     #########
!#########    Center for Analysis and Prediction of Storms      #########
!#########                University of Oklahoma                #########
!#########                                                      #########
!########################################################################
!########################################################################
!

SUBROUTINE rd2atiltcdf(nazim,ngate,fname,indir,                         &  1
                       rmisval,rngfval,itimcdf,frtime,initime,          &
                       vnyquist,rfirstg,istrgate,                       &
                       azim,beamw,gtspc,attref,refl,radv,rhohv,         &
                       tem_double)
!
!------------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar data from CASA Level-2a NetCDF data files 
!
!------------------------------------------------------------------------
!
! AUTHOR:
!
! Keith Brewster, CAPS  (Feb 2007)
!
! MODIFICATIONS:
!
!------------------------------------------------------------------------
                                                                                
  IMPLICIT NONE
                                                                                
!------------------------------------------------------------------------
!
! Variable Declarations.
!
!------------------------------------------------------------------------
                                                                                
  INTEGER, INTENT(IN) :: nazim
  INTEGER, INTENT(IN) :: ngate
  CHARACTER (LEN=256), INTENT(IN) :: fname
  CHARACTER (LEN=80), INTENT(IN) :: indir
  REAL, INTENT(OUT) :: rmisval
  REAL, INTENT(OUT) :: rngfval
  INTEGER, INTENT(OUT) :: itimcdf
  REAL, INTENT(OUT) :: frtime
  INTEGER, INTENT(OUT) :: initime
  REAL, INTENT(OUT) :: vnyquist
  REAL, INTENT(OUT) :: rfirstg
  INTEGER, INTENT(OUT) :: istrgate(nazim)
!
  REAL, INTENT(OUT) :: azim(nazim)
  REAL, INTENT(OUT) :: beamw(nazim)
  REAL, INTENT(OUT) :: gtspc(nazim)
  REAL, INTENT(OUT) :: attref(ngate,nazim)
  REAL, INTENT(OUT) :: refl(ngate,nazim)
  REAL, INTENT(OUT) :: radv(ngate,nazim)
  REAL, INTENT(OUT) :: rhohv(ngate,nazim)
  REAL(KIND=8), INTENT(OUT) :: tem_double(nazim)
!
!-----------------------------------------------------------------------
!
!  netCDF variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=256) :: cdfname
  INTEGER :: istatus,ncid,ncmode
  INTEGER :: ipktyp,nbits
!
!-----------------------------------------------------------------------
!
!  Variable indexes and descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: timeid,istrid,strid
  INTEGER :: azmid,gtwid,arfid,refid,velid,rhoid
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
  REAL, PARAMETER :: mm2m = 0.001
  REAL, PARAMETER :: vnyq_default = 31.9
  REAL :: elvsum,rfrsum,bmwidth,strange
  INTEGER :: lrname,ifsecs
  INTEGER :: jazim,kntelv,kntrfr
!
  INCLUDE 'globcst.inc'
  INCLUDE 'netcdf.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  itimcdf=-99
  frtime=-999.
  vnyquist=-99.
  rfirstg=0.
  istrgate=1
  rmisval=-999.
  rngfval=-999.
!
!-----------------------------------------------------------------------
!
!  Open netcdf file
!
!-----------------------------------------------------------------------
!
  write(cdfname,'(a,a,a)') TRIM(indir),'/',TRIM(fname)
  write(6,'(a,/a)') ' Reading Tier 2a ref, vel, rhohv data from: ',TRIM(cdfname)
  ncmode=nf_share
  istatus=nf_open(cdfname,ncmode,ncid)
!
!-----------------------------------------------------------------------
!
!  Read Global Attributes
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Time',timeid)
  istatus=nf_get_var1_int(ncid,timeid,1,itimcdf)
  frtime=0. 
  WRITE(6,'(a,i16,a,f10.2)') ' Time=',itimcdf,'  FrTime=',frtime
  vnyquist=vnyq_default
  istatus=nf_get_att_real(ncid,nf_global,'NyquistVelocity',vnyquist)
  print *, ' Nyquist=',vnyquist
  istatus=nf_get_att_real(ncid,nf_global,'AntennaBeamwidth',bmwidth)
  print *, '  Beamwidth=',bmwidth
  DO jazim=1,nazim
    beamw(jazim)=bmwidth
  END DO

  istatus=nf_inq_varid(ncid,'StartGate',istrid)
  print *, ' istrid=',istrid
  istatus=nf_get_var_int(ncid,istrid,istrgate)
  istatus=nf_inq_varid(ncid,'StartRange',strid)
  print *, ' strid=',strid
  istatus=nf_get_var_double(ncid,strid,tem_double)
  rfrsum=0.
  kntrfr=0
  DO jazim=1,nazim
    strange=abs(mm2m*tem_double(jazim))
    IF(strange < 10000.0) THEN
      rfrsum=rfrsum+strange
      kntrfr=kntrfr+1
    END IF
  END DO
  rfirstg=0.
  IF(kntrfr > 0) THEN
    rfirstg=rfrsum/float(kntrfr)
  END IF
  print *, ' r-1stgate=',rfirstg

  rmisval=99900.
  rngfval=99901.
  istatus=nf_get_att_real(ncid,nf_global,'MissingData',rmisval)
  istatus=nf_get_att_real(ncid,nf_global,'RangeFolded',rngfval)
  print *, '  MissingData=',rmisval,' RangeFolded=',rngfval

  istatus=nf_get_att_real(ncid,nf_global,'InitialTime',initime)
  initime=itimcdf
!
!-----------------------------------------------------------------------
!
!  Read data variables
!
!-----------------------------------------------------------------------
!
  istatus=nf_inq_varid(ncid,'Azimuth',azmid)
  print *, ' azmid=',azmid
  istatus=nf_get_var_double(ncid,azmid,tem_double)
  azim=-999.
  DO jazim=1,nazim
    azim(jazim)=tem_double(jazim)
  END DO

  istatus=nf_inq_varid(ncid,'GateWidth',gtwid)
  print *, ' gtwid=',gtwid
  istatus=nf_get_var_double(ncid,gtwid,tem_double)
  DO jazim=1,nazim
    gtspc(jazim)=mm2m*tem_double(jazim)
  END DO

  istatus=nf_inq_varid(ncid,'Reflectivity',arfid)
  print *, ' arfid',arfid
  istatus=nf_get_var_real(ncid,arfid,attref)

  istatus=nf_inq_varid(ncid,'CorrectedReflectivity',refid)
  print *, ' refid',refid
  istatus=nf_get_var_real(ncid,refid,refl)

  istatus=nf_inq_varid(ncid,'Velocity',velid)
  print *, ' velid',velid
  istatus=nf_get_var_real(ncid,velid,radv)

  istatus=nf_inq_varid(ncid,'CrossPolCorrelation',rhoid)
  print *, ' rhoid',rhoid
  istatus=nf_get_var_real(ncid,rhoid,rhohv)
!
!-----------------------------------------------------------------------
!
! Close data file.
!
!-----------------------------------------------------------------------
!
  istatus=nf_close(ncid)

END SUBROUTINE rd2atiltcdf