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


SUBROUTINE mkradfnm(dmpfmt,dir,ldir,radar,iyr,imo,ida,ihr,imin,isec,           & 1,2
           fname,lfnm)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
!  Input arguments
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=120) :: dir
  INTEGER :: ldir
  CHARACTER (LEN=4) :: radar
  INTEGER :: iyr
  INTEGER :: imo
  INTEGER :: ida
  INTEGER :: ihr
  INTEGER :: imin
  INTEGER :: isec
  INTEGER :: dmpfmt
!
!-----------------------------------------------------------------------
!
!  Output arguments
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=100) :: fname
  INTEGER :: lfnm
!
  INTEGER :: rdtime,jyr,jmo,jda,jhr,jmin,jsec
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
!  Round to nearest minute
!
!-----------------------------------------------------------------------
!
  jyr=iyr+1900
  IF(iyr < 50) jyr=jyr+100
  CALL ctim2abss( jyr,imo,ida,ihr,imin,isec, rdtime )
  IF(isec >= 30) rdtime=rdtime+(60-isec)
  CALL abss2ctim( rdtime, jyr, jmo, jda, jhr, jmin, jsec )
  jyr=MOD(jyr,100)
  IF(dmpfmt==1)THEN
  WRITE(fname,'(a,a4,a1,3(i2.2),a1,2(i2.2))')                           &
        dir(1:ldir),radar,'.',                                          &
        jyr,jmo,jda,'.',jhr,jmin
  lfnm=ldir+16
  ELSE
  WRITE(fname,'(a,a4,a1,3(i2.2),a1,2(i2.2),a5)')                           &
        dir(1:ldir),radar,'.',                                          &
        jyr,jmo,jda,'.',jhr,jmin,'.hdf4'
  lfnm=ldir+21
  ENDIF
  RETURN
END SUBROUTINE mkradfnm
!
!##################################################################
!##################################################################
!######                                                      ######
!######               SUBROUTINE WRTRAD88                    ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE wrtrad88(nx,ny,nz, &,2
           iradfmt,rfname,radid,radlat,radlon,radelv,            &
           iyr,imon,iday,ihr,imin,isec,vcpnum,  &
           xsc,ysc,zpsc,gridvel,gridref,gridnyq,gridtim)
!
!-----------------------------------------------------------------------
!
!  Writes gridded radar data to a file
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INTEGER :: nx,ny,nz
!
  INTEGER :: iradfmt
  CHARACTER (LEN=100) :: rfname
  CHARACTER (LEN=4) :: radid
  REAL :: radlat
  REAL :: radlon
  REAL :: radelv
  INTEGER :: iyr,imon,iday,ihr,imin,isec
  INTEGER :: vcpnum
!
  REAL :: xsc(nx)
  REAL :: ysc(ny)
  REAL :: zpsc(nx,ny,nz)
!
!  ARPS radar arrays
!
  REAL :: gridvel(nx,ny,nz)
  REAL :: gridref(nx,ny,nz)
  REAL :: gridnyq(nx,ny,nz)
  REAL :: gridtim(nx,ny,nz)
!
  INCLUDE 'globcst.inc'
  INCLUDE 'remap.inc'
  INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
!  Misc local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: iunit,myr,itime
  INTEGER :: idummy
  REAL :: rdummy
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  myr=1900+iyr
  IF(myr < 1960) myr=myr+100
  CALL ctim2abss(myr,imon,iday,ihr,imin,isec,itime)
!
  CALL getunit(iunit)
!
!-----------------------------------------------------------------------
!
!  Open file for output
!
!-----------------------------------------------------------------------
!
  OPEN(iunit,FILE=rfname,STATUS='unknown',                              &
       FORM='unformatted')
!
!-----------------------------------------------------------------------
!
!  Write radar description variables
!
!-----------------------------------------------------------------------
!
  WRITE(iunit) radid
  WRITE(iunit) ireftim,itime,vcpnum,idummy,idummy,                      &
               idummy,idummy,idummy,idummy,idummy
!
!-----------------------------------------------------------------------
!
!  Write grid description variables
!  This should provide enough info to verify that the
!  proper grid has been chosen.  To recreate the grid,
!  icluding elevation information,
!  the reading program should get a grid-base-file
!  named runname.grdbasfil
!
!-----------------------------------------------------------------------
!
  idummy=0
  rdummy=0.
  WRITE(iunit) runname
  WRITE(iunit) iradfmt,strhopt,mapproj,idummy,idummy,                   &
               idummy,idummy,idummy,idummy,idummy
  WRITE(iunit) dx,dy,dz,dzmin,ctrlat,                                   &
               ctrlon,trulat1,trulat2,trulon,sclfct,                    &
               rdummy,rdummy,rdummy,rdummy,rdummy
!
  WRITE(iunit) gridref
  WRITE(iunit) gridvel
  WRITE(iunit) gridnyq
  WRITE(iunit) gridtim
  CLOSE(iunit)
  CALL retunit(iunit)
!
  RETURN
END SUBROUTINE wrtrad88
!
!##################################################################
!##################################################################
!######                                                      ######
!######              SUBROUTINE WTRADCOL                     ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE wtradcol(nx,ny,nz,dmpfmt,iradfmt,hdf4cmpr,                   & 2,37
           rfname,radid,latrad,lonrad,elvrad,                           &
           iyr,imon,iday,ihr,imin,isec,vcpnum,isource,                  &
           xsc,ysc,zpsc,gridvel,gridref,gridnyq,gridtim,                &
           outk,outhgt,outref,outvel,outnyq,outtim)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Writes gridded radar data to a file as columns with
!  individual lat,lons.
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster
!  06/22/95
!
!  MODIFICATION HISTORY:
!
!  2000/09/11 (Gene Bassett)
!  Use only reflectivity to accept or reject a column (thus allowing one
!  to output nids columns without processing velocity data).
!
!  04/29/02 Leilei Wang and Keith Brewster
!  Added hdf option, including two new variables in the argument list.
!
!-----------------------------------------------------------------------
!
!  INPUT:
!    dmpfmt    file format (1:binary, 2:hdf)
!    iradfmt   binary format
!    hdf4cmpr  hdf4 compression level
!    rfname    radar file name (character*80)
!    radid     radar id (character*4)
!    latrad    latitude of radar (degrees N)
!    lonrad    longitude of radar (degrees E)
!    elvrad    elevation of radar (m MSL)
!    iyr       year
!    imon      month
!    iday      day
!    ihr       hour
!    imin      min
!    isec      sec
!    vcpnum    VCP (scan type) number
!    isource)  source number
!                1= WSR-88D raw
!                2= WSR-88D NIDS
!
!  OUTPUT:
!    data are written to file
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INTEGER :: nx,ny,nz
!
  INTEGER :: dmpfmt
  INTEGER :: iradfmt
  INTEGER :: hdf4cmpr
  CHARACTER (LEN=100) :: rfname
  CHARACTER (LEN=4) :: radid
  REAL :: latrad
  REAL :: lonrad
  REAL :: elvrad
  INTEGER :: iyr,imon,iday,ihr,imin,isec
  INTEGER :: vcpnum
  INTEGER :: isource
!
  REAL :: xsc(nx)
  REAL :: ysc(ny)
  REAL :: zpsc(nx,ny,nz)
  REAL :: gridref(nx,ny,nz)
  REAL :: gridvel(nx,ny,nz)
  REAL :: gridnyq(nx,ny,nz)
  REAL :: gridtim(nx,ny,nz)
!
  REAL :: outk(nz)
  REAL :: outhgt(nz)
  REAL :: outref(nz)
  REAL :: outvel(nz)
  REAL :: outnyq(nz)
  REAL :: outtim(nz)
!
!-----------------------------------------------------------------------
!
!  Include files
!
!-----------------------------------------------------------------------
!
  INCLUDE 'globcst.inc'
  INCLUDE 'grid.inc'
  INCLUDE 'remap.inc'
!
!-----------------------------------------------------------------------
!
!  Radar output descriptors
!
!-----------------------------------------------------------------------
!
  INTEGER :: mxradvr,nradvr
  PARAMETER(mxradvr=10,nradvr=6)
  INTEGER :: iradvr(mxradvr)
  DATA iradvr /1,2,3,4,5,6,0,0,0,0/
!
!-----------------------------------------------------------------------
!
!  Radar output thresholds
!
!-----------------------------------------------------------------------
!
  REAL :: refmin,refmax,velmin,velmax
  PARAMETER(refmin=-5.0, refmax=100.,                                   &
            velmin=-200.,velmax=200.)
  REAL :: misval
  PARAMETER(misval=-999.0)
!
!-----------------------------------------------------------------------
!
!  Radar output variables
!
!-----------------------------------------------------------------------
!
  REAL :: outarray(nz,6)
  REAL :: grdlatc(nx,ny)
  REAL :: grdlonc(nx,ny)
!
!-----------------------------------------------------------------------
!
!  Misc local variables
!
!-----------------------------------------------------------------------
!
  INTEGER :: iunit,myr,itime
  INTEGER :: i,j,k,klev,kk,kntcol,nn
  INTEGER :: idummy
  INTEGER :: istat,sd_id
  REAL :: gridlat,gridlon,elev,rdummy
  INTEGER(2), allocatable :: itmp(:,:,:) ! Temporary array
  REAL, allocatable :: hmax(:), hmin(:) ! Temporary array
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
 IF (dmpfmt > 1 .AND. hdf4cmpr > 3) THEN
   ALLOCATE (itmp(nx,ny,nz),stat=istat)
   IF (istat /= 0) THEN
     WRITE (6,*) "HDFDUMP: ERROR allocating itmp, returning"
     RETURN
   END IF
   ALLOCATE (hmax(nz),stat=istat)
    IF (istat /= 0) THEN
      WRITE (6,*) "HDFDUMP: ERROR allocating hmax, returning"
      RETURN
    END IF
    ALLOCATE (hmin(nz),stat=istat)
    IF (istat /= 0) THEN
      WRITE (6,*) "HDFDUMP: ERROR allocating hmin, returning"
      RETURN
    END IF
 ENDIF 

  myr=1900+iyr
  IF(myr < 1960) myr=myr+100
  CALL ctim2abss(myr,imon,iday,ihr,imin,isec,itime)
!
  IF(dmpfmt == 1)THEN
  CALL getunit(iunit)
!
!-----------------------------------------------------------------------
!
!  Open file for output
!
!-----------------------------------------------------------------------
!
  OPEN(iunit,FILE=rfname,STATUS='unknown',                              &
       FORM='unformatted')
!
!-----------------------------------------------------------------------
!
!  Write radar description variables
!
!-----------------------------------------------------------------------
!
  WRITE(iunit) radid
  WRITE(iunit) ireftim,itime,vcpnum,isource,idummy,                     &
               idummy,idummy,idummy,idummy,idummy
!
!-----------------------------------------------------------------------
!
!  Write grid description variables
!  This should provide enough info to verify that the
!  proper grid has been chosen.  To recreate the grid,
!  icluding elevation information,
!  the reading program should get a grid-base-file
!  named runname.grdbasfil
!
!-----------------------------------------------------------------------
!
  idummy=0
  rdummy=0.
  WRITE(iunit) runname
  WRITE(iunit) iradfmt,strhopt,mapproj,idummy,idummy,                   &
               idummy,idummy,idummy,idummy,idummy
  WRITE(iunit) dx,dy,dz,dzmin,ctrlat,                                   &
               ctrlon,trulat1,trulat2,trulon,sclfct,                    &
               latrad,lonrad,elvrad,rdummy,rdummy
  WRITE(iunit) nradvr,iradvr
  ELSE  !HDF4 format
!
!-----------------------------------------------------------------------
!
!  Open file for output
!
!-----------------------------------------------------------------------
!
    CALL hdfopen(trim(rfname), 2, sd_id)
    IF (sd_id < 0) THEN
      WRITE (6,*) "WTRADCOL: ERROR opening ",                           &
                  trim(rfname)," for writing."
      istat = 1
      STOP
    END IF
!
!-----------------------------------------------------------------------
!
!  Write radar description variables
!
!-----------------------------------------------------------------------
!
    CALL hdfwrtc(sd_id, 4, 'radid', radid, istat)
    CALL hdfwrti(sd_id, 'ireftim', ireftim, istat)
    CALL hdfwrti(sd_id, 'itime', itime, istat)
    CALL hdfwrti(sd_id, 'vcpnum', vcpnum, istat)
    CALL hdfwrti(sd_id, 'isource', isource, istat)
!
!-----------------------------------------------------------------------
!
!  Write grid description variables
!  This should provide enough info to verify that the
!  proper grid has been chosen.  To recreate the grid,
!  icluding elevation information,
!  the reading program should get a grid-base-file
!  named runname.grdbasfil
!
!-----------------------------------------------------------------------
!
    CALL hdfwrtc(sd_id, 4, 'runname', runname, istat)
    CALL hdfwrti(sd_id, 'iradfmt', iradfmt, istat)
    CALL hdfwrti(sd_id, 'strhopt', strhopt, istat)
    CALL hdfwrti(sd_id, 'mapproj', mapproj, istat)
    CALL hdfwrtr(sd_id, 'dx', dx, istat)
    CALL hdfwrtr(sd_id, 'dy', dy, istat)
    CALL hdfwrtr(sd_id, 'dz', dz, istat)
    CALL hdfwrtr(sd_id, 'dzmin', dzmin, istat)
    CALL hdfwrtr(sd_id, 'ctrlat', ctrlat, istat)
    CALL hdfwrtr(sd_id, 'ctrlon', ctrlon, istat)
    CALL hdfwrtr(sd_id, 'trulat1', trulat1, istat)
    CALL hdfwrtr(sd_id, 'trulat2', trulat2, istat)
    CALL hdfwrtr(sd_id, 'trulon', trulon, istat)
    CALL hdfwrtr(sd_id, 'sclfct', sclfct, istat)
    CALL hdfwrtr(sd_id, 'latrad', latrad, istat)
    CALL hdfwrtr(sd_id, 'lonrad', lonrad, istat)
    CALL hdfwrtr(sd_id, 'elvrad', elvrad, istat)
    CALL hdfwrti(sd_id, 'nradvr', nradvr, istat)
    CALL hdfwrt1d(iradvr,mxradvr,sd_id,'iradvr', 'iradvr','')
    print*,'hdfwrt iradvr'
  ENDIF
!
!-----------------------------------------------------------------------
!
!  For each horizontal grid point form a column of remapped
!  data containing the non-missing grid points
!
!-----------------------------------------------------------------------
!
  IF(dmpfmt==1)THEN
    kntcol=0
    DO j=1,ny
      DO i=1,nx
        DO k=1,nz
          outk(k)=misval
          outhgt(k)=misval
          outref(k)=misval
          outvel(k)=misval
          outnyq(k)=misval
          outtim(k)=misval
        END DO
        klev=0
        DO k=1,nz-1
          IF((gridref(i,j,k)>refmin .AND. gridref(i,j,k)<refmax) .OR.   &
             (gridvel(i,j,k)>velmin .AND. gridvel(i,j,k)<velmax))THEN
            klev=klev+1
            outk(klev)=FLOAT(k)
            outhgt(klev)=zpsc(i,j,k)
            outref(klev)=gridref(i,j,k)
            outvel(klev)=gridvel(i,j,k)
            outnyq(klev)=gridnyq(i,j,k)
            outtim(klev)=gridtim(i,j,k)
          END IF
        END DO
!
!-----------------------------------------------------------------------
!
!  If there are data in this column, write them to the file.
!
!-----------------------------------------------------------------------
!
        IF(klev > 0) THEN
          kntcol=kntcol+1
          CALL xytoll(1,1,xsc(i),ysc(j),gridlat,gridlon)
          elev=0.5*(zpsc(i,j,1)+zpsc(i,j,2))
            WRITE(iunit) i,j,xsc(i),ysc(j),                                 &
                       gridlat,gridlon,elev,klev
            WRITE(iunit) (outk(k),k=1,klev)
            WRITE(iunit) (outhgt(k),k=1,klev)
            WRITE(iunit) (outref(k),k=1,klev)
            WRITE(iunit) (outvel(k),k=1,klev)
            WRITE(iunit) (outnyq(k),k=1,klev)
            WRITE(iunit) (outtim(k),k=1,klev)
       END IF
      END DO
    END DO
  ELSE    !HDF4 format
    CALL xytoll(nx,ny,xsc,ysc,grdlatc,grdlonc)
    CALL hdfwrt2d(grdlatc,nx,ny,sd_id,0,hdf4cmpr,                         &
                  'grdlatc','grid latitude','degree',itmp)
    CALL hdfwrt2d(grdlonc,nx,ny,sd_id,0,hdf4cmpr,                         &
                  'grdlonc','grid lontitude','degree',itmp)
!   write(19,'(10f10.1)') gridref

    CALL hdfwrt3d(zpsc,nx,ny,nz,sd_id,0,hdf4cmpr,                         &
                  'hgtrad','height','m',                &
                   itmp,hmax,hmin)
    CALL hdfwrt3d(gridref,nx,ny,nz,sd_id,0,hdf4cmpr,                         &
                  'gridref','reflectivity','dbz',                &
                   itmp,hmax,hmin)
    CALL hdfwrt3d(gridvel,nx,ny,nz,sd_id,0,hdf4cmpr,               &
                  'gridvel','radial velocity','m/s',                &
                   itmp,hmax,hmin)
    CALL hdfwrt3d(gridnyq,nx,ny,nz,sd_id,0,hdf4cmpr,                &
                  'gridnyq','nyquist velocity','m/s',                &
                   itmp,hmax,hmin)
    CALL hdfwrt3d(gridtim,nx,ny,nz,sd_id,0,hdf4cmpr,                &
                  'gridtim','time','',                &
                   itmp,hmax,hmin)
!
! Although all columns are actually written, find the non-missing
! data columns for statistics reporting purposes.
!
    kntcol=0
    DO j=1,ny
      DO i=1,nx
        klev=0
        DO k=1,nz
          IF(gridref(i,j,k) > refmin .AND. gridref(i,j,k) < refmax) &
            klev=klev+1
        END DO
        IF(klev > 0) kntcol=kntcol+1
      END DO
    END DO

  ENDIF
!
  IF(dmpfmt==1)THEN
    CLOSE(iunit)
    CALL retunit(iunit)
  ELSE
    CALL hdfclose(sd_id,istat)
  IF (istat /= 0) THEN
    WRITE (6,*) "HDFDUMP: ERROR on closing file ",trim(rfname),       &
                " (status",istat,")"
  END IF

  IF (hdf4cmpr > 3) THEN
    DEALLOCATE (itmp,stat=istat)
    DEALLOCATE (hmax,stat=istat)
    DEALLOCATE (hmin,stat=istat)
  END IF
  ENDIF
!
!-----------------------------------------------------------------------
!
!  Report on what data were written
!
!-----------------------------------------------------------------------
!
  WRITE(6,'(//a,i2.2,i2.2,i2.2,a1,i2.2,a1,i2.2)')                       &
                    ' Output statistics for time ',                     &
                      iyr,imon,iday,' ',ihr,':',imin
  WRITE(6,'(a,i6,a,/a,i6,a//)')                                         &
           ' There were ',kntcol,' columns written ',                   &
           ' of a total ',(nx*ny),' possible.'
!
  RETURN
END SUBROUTINE wtradcol