PROGRAM bin2gem,32
!
!##################################################################
!##################################################################
!######                                                      ######
!######                  PROGRAM BIN2GEM                     ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!  PURPOSE:
!  Read in binary dump produced by arpspost and write out in GEMPAK
!
!  Author :    Fanyou Kong
!  History:  March 31, 2007: First code implementation
!
!-----------------------------------------------------------------------
!
!  MODIFIED: 
!
!-----------------------------------------------------------------------
!  IMPLICIT NONE

  INCLUDE 'GEMPRM.PRM'
  INCLUDE 'mp.inc'

  INTEGER :: nx,ny,nz

  INTEGER :: ireturn, iret, ierr, istatus
  CHARACTER (LEN=256) :: filename,filnam
  CHARACTER (LEN=256) :: binheader,gemoutheader
  INTEGER :: lengbf,lenfil,lenbin,lengem
  INTEGER :: ihr
  CHARACTER (LEN=4) :: ihrc
  CHARACTER (LEN=6) :: tlevel(100)
  CHARACTER (LEN=6) :: varname,varunit
  INTEGER :: i,j,k, itags,itagr
  INTEGER :: nf

  NAMELIST /bin2gem_data/nf,tlevel,binheader,gemoutheader

  REAL :: lat1,lon1,lat2,lon2
  REAL :: ctime
  INTEGER :: year,month,day,hour,minute

  REAL, ALLOCATABLE :: hgtp(:,:,:),uwndp(:,:,:),vwndp(:,:,:),wwndp(:,:,:)
  REAL, ALLOCATABLE :: tmpp(:,:,:),sphp(:,:,:)
  REAL, ALLOCATABLE :: uwndh(:,:,:),vwndh(:,:,:),wwndh(:,:,:)
  REAL, ALLOCATABLE :: psf(:,:),mslp(:,:),vort500(:,:)
  REAL, ALLOCATABLE :: temp2m(:,:),dewp2m(:,:),qv2m(:,:)
  REAL, ALLOCATABLE :: u10m(:,:),v10m(:,:),hgtsfc(:,:)
  REAL, ALLOCATABLE :: refl1km(:,:),refl4km(:,:),cmpref(:,:)
  REAL, ALLOCATABLE :: accppt(:,:),convppt(:,:)
  REAL, ALLOCATABLE :: cape(:,:),mcape(:,:),cin(:,:),mcin(:,:),lcl(:,:)
  REAL, ALLOCATABLE :: srh01(:,:),srh03(:,:),uh25(:,:),sh01(:,:),sh06(:,:)
  REAL, ALLOCATABLE :: thck(:,:),li(:,:),brn(:,:),pw(:,:)

!-----------------------------------------------------------------------
!  nprgem:  number of pressure levels for GEMPAK file.
!
!  iprgem:  actual pressure levels defined by the user (mb)
!
  INTEGER :: nprgem
!
  PARAMETER (nprgem = 5)
!
  INTEGER :: iprgem(nprgem)
!
  DATA iprgem  / 850, 700, 600, 500, 250/
!
!-----------------------------------------------------------------------
!  nhtgem:  number of height levels for GEMPAK file.
!
!  ihtgem:  actual height levels defined by the user (km)
!
  INTEGER :: nhtgem
!
  PARAMETER (nhtgem = 6)
!
  INTEGER :: ihtgem(nhtgem)
!
  DATA ihtgem / 1, 2, 3, 4, 5, 6/

  CHARACTER (LEN=6) :: hgtptag(5),uwndptag(5)
  CHARACTER (LEN=6) :: vwndptag(5),wwndptag(5)
  CHARACTER (LEN=6) :: tmpptag(5),qvptag(5)
  CHARACTER (LEN=6) :: uwndhtag(6),vwndhtag(6),wwndhtag(6)

  DATA hgtptag  / 'hgt850','hgt700','hgt600','hgt500','hgt250'/
  DATA uwndptag / 'u850__','u700__','u600__','u500__','u250__'/
  DATA vwndptag / 'v850__','v700__','v600__','v500__','v250__'/
  DATA wwndptag / 'w850__','w700__','w600__','w500__','w250__'/
  DATA tmpptag  / 'tmp850','tmp700','tmp600','tmp500','tmp250'/
  DATA qvptag   / 'sph850','sph700','sph600','sph500','sph250'/
! 
  DATA uwndhtag /'u1km__','u2km__','u3km__','u4km__','u5km__','u6km__'/
  DATA vwndhtag /'v1km__','v2km__','v3km__','v4km__','v5km__','v6km__'/
  DATA wwndhtag /'w1km__','w2km__','w3km__','w4km__','w5km__','w6km__'/

!-----------------------------------------------------------------------
!
!  GEMPAK variables
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=72) :: gdfile,gdarea
  REAL :: rnvblk (llnnav), anlblk (llnanl)
  CHARACTER (LEN=3) :: cproj(0:3)
  DATA cproj /'CED','STR','LCC','MER'/
  CHARACTER (LEN=72) :: chproj

  REAL :: deltan
  REAL :: deltax,deltay
  REAL :: angle1,angle2,angle3
  LOGICAL :: angflg
  PARAMETER ( deltan= 1.,                                               &
              deltax= -9999.,                                           &
              deltay= -9999.,                                           &
              angflg=.true.)
  REAL :: gbnds(4)

  LOGICAL :: wrtflg,rewrite,notopn,gemExist,tppExist,cppExist

  COMMON /gemblk/rnvblk,anlblk,notopn

    nproc_x = 1
    nproc_y = 1 
    readsplit = 0
    joindmp = 1
    nprocs = 1
    max_fopen = 1


  READ(5,bin2gem_data,END=200)
   write(6,bin2gem_data)
  GO TO 20
  200   WRITE(6,'(a)')                                                  &
         'Error reading NAMELIST block bin2gem_data.  ',                 &
         'Default values used.'
  20 CONTINUE

!-----------------------------------------------------------------------
!
!  Get dimension nx,ny
!
!-----------------------------------------------------------------------

    OPEN(4,FILE=trim(binheader)//'.sfpres'//tlevel(1),STATUS='old',  &
        FORM='unformatted',ERR=9000, IOSTAT=istat)
    READ(4, ERR=9000, END=9000, IOSTAT=istat) nx,ny,nz
    CLOSE(4)
    print *,'nx,ny,nz:',nx,ny,nz
!
!-----------------------------------------------------------------------
!
! Allocate arrays
!
!-----------------------------------------------------------------------
!
  ALLOCATE(hgtp(nx,ny,nprgem),STAT=istatus)
  hgtp=0
  ALLOCATE(uwndp(nx,ny,nprgem),STAT=istatus)
  uwndp=0
  ALLOCATE(vwndp(nx,ny,nprgem),STAT=istatus)
  vwndp=0
  ALLOCATE(wwndp(nx,ny,nprgem),STAT=istatus)
  wwndp=0
  ALLOCATE(tmpp(nx,ny,nprgem),STAT=istatus)
  tmpp=0
  ALLOCATE(sphp(nx,ny,nprgem),STAT=istatus)
  sphp=0
  ALLOCATE(uwndh(nx,ny,nhtgem),STAT=istatus)
  uwndh=0 
  ALLOCATE(vwndh(nx,ny,nhtgem),STAT=istatus)
  vwndh=0 
  ALLOCATE(wwndh(nx,ny,nhtgem),STAT=istatus)
  wwndh=0
  ALLOCATE(psf(nx,ny),STAT=istatus)
  psf=0
  ALLOCATE(mslp(nx,ny),STAT=istatus)
  mslp=0
  ALLOCATE(vort500(nx,ny),STAT=istatus)
  vort500=0
  ALLOCATE(temp2m(nx,ny),STAT=istatus)
  temp2m=0
  ALLOCATE(dewp2m(nx,ny),STAT=istatus)
  dewp2m=0
  ALLOCATE(qv2m(nx,ny),STAT=istatus)
  qv2m=0
ALLOCATE(u10m(nx,ny),STAT=istatus)
  u10m=0
  ALLOCATE(v10m(nx,ny),STAT=istatus)
  v10m=0
  ALLOCATE(hgtsfc(nx,ny),STAT=istatus)
  hgtsfc=0
  ALLOCATE(refl1km(nx,ny),STAT=istatus)
  refl1km=0
  ALLOCATE(refl4km(nx,ny),STAT=istatus)
  refl4km=0
  ALLOCATE(cmpref(nx,ny),STAT=istatus)
  cmpref=0
  ALLOCATE(accppt(nx,ny),STAT=istatus)
  accppt=0
  ALLOCATE(convppt(nx,ny),STAT=istatus)
  convppt=0
  ALLOCATE(cape(nx,ny),STAT=istatus)
  cape=0
  ALLOCATE(mcape(nx,ny),STAT=istatus)
  mcape=0
  ALLOCATE(cin(nx,ny),STAT=istatus)
  cin=0
  ALLOCATE(mcin(nx,ny),STAT=istatus)
  mcin=0
  ALLOCATE(lcl(nx,ny),STAT=istatus)
  lcl=0
  ALLOCATE(srh01(nx,ny),STAT=istatus)
  srh01=0
  ALLOCATE(srh03(nx,ny),STAT=istatus)
  srh03=0
  ALLOCATE(uh25(nx,ny),STAT=istatus)
  uh25=0
  ALLOCATE(sh01(nx,ny),STAT=istatus)
  sh01=0
  ALLOCATE(sh06(nx,ny),STAT=istatus)
  sh06=0
  ALLOCATE(thck(nx,ny),STAT=istatus)
  thck=0
  ALLOCATE(li(nx,ny),STAT=istatus)
  li=0
  ALLOCATE(brn(nx,ny),STAT=istatus)
  brn=0
  ALLOCATE(pw(nx,ny),STAT=istatus)
  pw=0


! Read in map parameters
    OPEN(4,file=trim(binheader)//'.map')
    READ(4,*) mapproj,trulon,trulat1,trulat2,lat1,lon1,lat2,lon2
    CLOSE(4)

    WRITE(6,'(/a,4(a,F7.2),a/)') ' ARPS domain ', &
            'SW: (',lat1,',',lon1, ') NE: (',lat2,',',lon2,')'
!
!-----------------------------------------------------------------------
!
! Initializing GEMPAK
!
!-----------------------------------------------------------------------
!

!  notopn = .true.

  DO ntime=1,nf

      CALL in_bdta(iret) ! initializing GEMPAK sans TAE

      chproj = cproj(mapproj)
      angle2 = trulon
!
!  modify projection if polar stereographic
!
        IF (chproj == 'STR') THEN
          angle1=90.0
          angle3=0.0
          WRITE (*,*) '**********************************'
          WRITE (*,*) '**********************************'
          WRITE (*,*) ' '
          WRITE (*,*) 'SETTING ANGLE1=90. FOR GEMPAK FILE'
          WRITE (*,*) 'SETTING ANGLE3=0.0 FOR GEMPAK FILE'
          WRITE (*,*) '(GEMPAK origin is at North Pole)'
          WRITE (*,*) ' '
          WRITE (*,*) '**********************************'
          WRITE (*,*) '**********************************'
        ELSE
          angle1=trulat1
          angle3=trulat2
          WRITE (*,*) '**********************************'
          WRITE (*,*) '**********************************'
          WRITE (*,*) ' '
          WRITE (*,*) '      SETTING ANGLE1=TRULAT1      '
          WRITE (*,*) '      SETTING ANGLE3=TRULAT2      '
          WRITE (*,*) ' '
          WRITE (*,*) '**********************************'
          WRITE (*,*) '**********************************'
        END IF
        gbnds(1)=lat1
        gbnds(2)=lon1
        gbnds(3)=lat2
        gbnds(4)=lon2

        WRITE(gdarea,'(f8.4,a1,f9.4,a1,f8.4,a1,f9.4)')                  &
            lat1,';',lon1,';',lat2,';',lon2

      call gr_mnav(chproj, nx,ny,lat1,lon1,lat2,lon2,           &
                   angle1,angle2,angle3,angflg,                 &
                   rnvblk, iret)

      IF( iret /= 0 ) GO TO 950
!
!-----------------------------------------------------------------------
!
!  Build analysis block
!
!-----------------------------------------------------------------------
!
!        CALL gr_mban  ( deltan, deltax, deltay,                         &
!                          gbnds, gbnds, gbnds, anlblk, iret )
!
!        IF( iret /= 0 )  GO TO 950
!

! Read 2D Fields ...

    filnam = trim(binheader)//'.sfpres'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),psf)
    print *,trim(filnam)

    filnam = trim(binheader)//'.mspres'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),mslp)
    print *,trim(filnam)

    filnam = trim(binheader)//'.accppt'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),accppt)
    print *,trim(filnam)

    filnam = trim(binheader)//'.pwat__'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),pw)
    print *,trim(filnam)
CALL a3dmax0(pw,1,nx,1,nx-1,1,ny,1,ny,1,1,1,1, amax,amin)
print *,'PWAT -- amax, amin: ',amax, amin

    filnam = trim(binheader)//'.temp2m'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),temp2m)
    print *,trim(filnam)

    filnam = trim(binheader)//'.dewp2m'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),dewp2m)
    print *,trim(filnam)

    filnam = trim(binheader)//'.qv2m__'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),qv2m)
    print *,trim(filnam)

    filnam = trim(binheader)//'.u10m__'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),u10m)
    print *,trim(filnam)

    filnam = trim(binheader)//'.v10m__'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),v10m)
    print *,trim(filnam)

    filnam = trim(binheader)//'.hgtsfc'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),hgtsfc)
    print *,trim(filnam)

!    filnam = trim(binheader)//'.vrt500'//tlevel(ntime)
!    CALL binread2d(nx,ny,trim(filnam),vort500)
!    print *,trim(filnam)

    filnam = trim(binheader)//'.ref1km'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),refl1km)
    print *,trim(filnam)

    filnam = trim(binheader)//'.ref4km'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),refl4km)
    print *,trim(filnam)

    filnam = trim(binheader)//'.cmpref'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),cmpref)
    print *,trim(filnam)

    filnam = trim(binheader)//'.sbcape'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),cape)
    print *,trim(filnam)

    filnam = trim(binheader)//'.mucape'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),mcape)
    print *,trim(filnam)

    filnam = trim(binheader)//'.sbcins'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),cin)
    print *,trim(filnam)

    filnam = trim(binheader)//'.mucins'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),mcin)
    print *,trim(filnam)

    filnam = trim(binheader)//'.sblcl_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),lcl)
    print *,trim(filnam)

    filnam = trim(binheader)//'.srh01_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),srh01)
    print *,trim(filnam)

    filnam = trim(binheader)//'.srh03_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),srh03)
    print *,trim(filnam)

    filnam = trim(binheader)//'.vhel__'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),uh25)
    print *,trim(filnam)

    filnam = trim(binheader)//'.shr01_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),sh01)
    print *,trim(filnam)

    filnam = trim(binheader)//'.shr06_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),sh06)
    print *,trim(filnam)

    filnam = trim(binheader)//'.shr06_'//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),sh06)
    print *,trim(filnam)

      IF( nprgem > 0 ) THEN
        DO klev=1,nprgem

    filnam = trim(binheader)//'.'//hgtptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),hgtp(1,1,klev))
    print *,trim(filnam)

    filnam = trim(binheader)//'.'//uwndptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),uwndp(1,1,klev))
    print *,trim(filnam)

    filnam = trim(binheader)//'.'//vwndptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),vwndp(1,1,klev))
    print *,trim(filnam)

    filnam = trim(binheader)//'.'//wwndptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),wwndp(1,1,klev))
    print *,trim(filnam)

    filnam = trim(binheader)//'.'//tmpptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),tmpp(1,1,klev))
    print *,trim(filnam)

    filnam = trim(binheader)//'.'//qvptag(klev)//tlevel(ntime)
    CALL binread2d(nx,ny,trim(filnam),sphp(1,1,klev))
    print *,trim(filnam)

        END DO ! nprgem-loop
      END IF
!CALL a3dmax0(tmpp(1,1,1),1,nx,1,nx-1,1,ny,1,ny,1,1,1,1, amax,amin)
!print *,'T 850 -- amax, amin: ',amax, amin


! Read in time parameters
    OPEN(4,file=trim(binheader)//'.time'//tlevel(ntime))
    READ(4,*) year,month,day,hour,minute,ctime
    CLOSE(4)
    print *,'year,month,day,hour,minute,ctime:'
    print *,year,month,day,hour,minute,ctime

! Find forecast hour for name construction
  ihr = int(ctime/3600.)
  WRITE(ihrc,'(a1,i3.3)') 'f',ihr

    filename=trim(gemoutheader)//ihrc
    lenfil = len_trim(filename)
    WRITE(6,'(a,a/)')                                   &
        ' GEMPAK output file: ', filename(1:lenfil)

!if(0>1) then
    CALL enswrtgem (nx,ny,filename(1:lenfil), lenfil,                   &
                    ctime,year,month,day,hour,minute,                   &
                    iprgem,nprgem,ihtgem,nhtgem,                        &
                    hgtp,uwndp,vwndp,wwndp,tmpp,sphp,                   &
                    uwndh,vwndh,wwndh,                                  &
                    psf,mslp,vort500,temp2m,dewp2m,qv2m,                &
                    u10m,v10m,hgtsfc,refl1km,refl4km,cmpref,            &
                    accppt,convppt,cape,mcape,cin,mcin,lcl,             &
                    srh01,srh03,uh25,sh01,sh06,thck,li,brn,pw)
!end if

!       CALL getunit( nchout )
       OPEN (UNIT=4,FILE=trim(filename)//"_ready")
       WRITE (4,'(a)') trim(filename)//"_ready"
       CLOSE (4)
!       CALL retunit (nchout )

  ENDDO    ! ntime loop

  STOP

  9000 CONTINUE        ! I/O errors
  CLOSE(4)
  PRINT *, 'IO ERRORS'
  STOP

  950  CONTINUE
  WRITE(6,'(a)') ' Error setting up GEMPAK file'
  STOP
END PROGRAM bin2gem