SUBROUTINE TREADEO_slg(NFT,FHOUR,IDATE,
     X                   GZE,QE,TEE,DIE,ZEE,RQE,
     X                   GZO,QO,TEO,DIO,ZEO,RQO,
     X                   LS_NODE,
     X                   SNNP1EV,SNNP1OD,pdryini,IPRINT,
     &                   cfile)
 
      USE gfs_dyn_machine, ONLY: KIND_EVOD, kind_io8

      use gfs_dyn_resol_def, ONLY: latg, lonf, levs, levp1, latg2, 
     &                             ntcw, jcap, num_p2d,
     &                             num_p3d, ntoz, ivsinp, lnt2, ntrac
      use gfs_dyn_layout1, ONLY: me, len_trie_ls, len_trio_ls, 
     &                           lats_node_a, ls_dim, ls_max_node
      use namelist_dynamics_def, ONLY: igen, hybrid
      USE gfs_dyn_io_header,     ONLY: ienst, iensi, idvt, z, z_r, 
     &                                 itrun, icen2
      USE gfs_dyn_vert_def,      ONLY: si, sl
      USE sigio_module,          ONLY: sigio_head, sigio_alhead
      USE sigio_r_module,        ONLY: sigio_dbti, sigio_rropen,
     &                                 sigio_rrhead, sigio_rrdbti
      USE gfs_dyn_coordinate_def, ONLY: ck, bkl, dbk, ak5, bk5,
     &                                  idsl, idvc
      use gfs_dyn_physcons, ONLY: rerth => con_rerth, grav => con_g, 
     &                            rkap => con_rocp
!
      IMPLICIT NONE
      character*(*) cfile
      INTEGER              NFT
      REAL(KIND=KIND_EVOD) FHOUR
      INTEGER              IDATE(4),NTRACI, ntozi, ntcwi, ncldi, ixgr
     &,                    nt0
!
      REAL(KIND=KIND_EVOD) GZE(LEN_TRIE_LS,2)
     &,                     QE(LEN_TRIE_LS,2)
     &,                    TEE(LEN_TRIE_LS,2,LEVS)
     &,                    DIE(LEN_TRIE_LS,2,LEVS)
     &,                    ZEE(LEN_TRIE_LS,2,LEVS)
     &,                    RQE(LEN_TRIE_LS,2,LEVS,ntrac)
     &,                    GZO(LEN_TRIO_LS,2)
     &,                     QO(LEN_TRIO_LS,2)
     &,                    TEO(LEN_TRIO_LS,2,LEVS)
     &,                     DIO(LEN_TRIO_LS,2,LEVS)
     &,                    ZEO(LEN_TRIO_LS,2,LEVS)
     &,                    RQO(LEN_TRIO_LS,2,LEVS,ntrac)
 
      integer              ls_node(ls_dim,3)
!
!cmr  ls_node(1,1) ... ls_node(ls_max_node,1) : values of L
!cmr  ls_node(1,2) ... ls_node(ls_max_node,2) : values of jbasev
!cmr  ls_node(1,3) ... ls_node(ls_max_node,3) : values of jbasod
!
      REAL(KIND=KIND_EVOD) SNNP1EV(LEN_TRIE_LS)
      REAL(KIND=KIND_EVOD) SNNP1OD(LEN_TRIO_LS)
      INTEGER              IPRINT
      INTEGER              J,K,L,LOCL,N,lv,kk
      integer              i,lan,lat,lons_lat,lon,nn
      integer              indev
      integer              indod
      integer              indev1,indev2
      integer              indod1,indod2
      REAL(KIND=KIND_EVOD) GA2
      REAL(KIND=KIND_EVOD), target ::  TRISCA(LNT2)
      REAL(KIND=KIND_IO8)   PDRYINI
      INTEGER              INDLSEV,JBASEV
      INTEGER              INDLSOD,JBASOD
!
      type(sigio_head) head
      type(sigio_dbti) dati
!
!     integer              idvc
      integer              iret, num_dta
      real(kind=kind_evod) psurfff
      real(kind=kind_evod) pressk
!
      integer kmsk(lonf,latg)
      real(kind=kind_io8), target ::  buff1(lonf*latg)
      real(kind=kind_io8) buffo(lonf,lats_node_a)
     &,                   buff2(lonf,lats_node_a)
 
      INCLUDE 'function2'

      call sigio_rropen(nft,cfile,iret)
      call sigio_alhead(head,iret)
      call sigio_rrhead(nft,head,iret)
!
      ivsinp = head%ivs
      if (me .eq. 0) then
        print *,' In treadeo iret=',iret,' cfile=',cfile
     &,' ivs=',head%ivs,' levs=',head%levs
      endif
      if (iret .ne. 0) then
        print *,' unable to read from unit ',nft,' Job Aborted'
     &,' iret=',iret,' me=',me
        call mpi_quit(7777)
      endif
!
      idvc = head%idvc  !idvc=3:sigma-theta and/or p, idvc=2:sigma-p, idvc=1:sigma files
      idsl = head%idsl
!     rewind(nft)
!     READ(NFT)

      if (hybrid .and. idvc .eq. 2) then				! hmhj
!       idsl=slid  !=2,pk=0.5*(p(k+1/2)+p(k-1/2)) check alfa(1)  am_bm
!   ak bk order in "sigma" file is bottom to top !!!!!!!!!!!!!!!!!!
        psurfff = 101.3
        do k=1,levp1
          ak5(k) = head%vcoord(levp1+1-k,1)/1000.
          bk5(k) = head%vcoord(levp1+1-k,2)
          pressk = ak5(k)+bk5(k)*psurfff
          
          if(me.eq.0)print 190,k,ak5(k),bk5(k),pressk
190       format('k=',i3,'  ak5=',E15.8,'  bk5=',e15.8,
     &           '  pressk=',E14.6)
           
        enddo
        do k=1,levs
          dbk(k) = bk5(k+1)-bk5(k)
          bkl(k) = (bk5(k+1)+bk5(k))*0.5
          ck(k)  = ak5(k+1)*bk5(k)-ak5(k)*bk5(k+1)
          if(me.eq.0)print 200,k,dbk(k),ck(k)
200       format('k=',i3,'  dbk=',f9.6,'  ck=',e13.5)
        enddo
!
! hmhj give an estimated si and sl for dynamics
        do k=1,levs+1
          si(levs+2-k)=ak5(k)/psurfff+bk5(k) !ak(k) bk(k) go top to bottom
        enddo
        do k=1,levs
          sl(k)=0.5*(si(k)+si(k+1))
        enddo
!
      else
        print *,' Non compatible Initial state IDVC=',head%idvc
     &,' iret=',iret
        call MPI_QUIT(333)
      endif
!
      FHOUR       = head%fhour
      idate       = head%idate
      itrun       = head%itrun
      icen2       = head%icen2
      igen        = head%igen
      ienst       = head%iens(1)
      iensi       = head%iens(2)
!     runid       = head%idrun
!     usrid       = head%idusr
      if (fhour .gt. 0.0 .and. head%nxss .eq. 0 .and.
     &    head%pdryini > 0.0 ) then
        if (pdryini .eq. 0.0) pdryini = head%pdryini
      endif
      if (me == 0) print *,' IN TREAD PDRYINI=',pdryini,
     &                     ' head=',head%pdryini
      ntraci = head%ntrac
      if (head%idvt .gt. 0.0) then
        nt0   = mod(head%idvt,10)
        if (nt0 > 0) then
          ntcwi = head%idvt / 10
          ntozi = head%idvt - ntcwi * 10 + 1
          ntcwi = ntcwi + 1
        else
          ntcwi = ntcw
          ntozi = ntoz
        endif
        ncldi = head%ncldt
      elseif(ntraci .eq. 2) then
        ntozi = 2
        ntcwi = 0
        ncldi = 0
      elseif(ntraci .eq. 3) then
        ntozi = 2
        ntcwi = 3
        ncldi = 1
      else
        ntozi = 0
        ntcwi = 0
        ncldi = 0
      endif
      ixgr = head%ixgr
!
      if (ntrac <= 3) then
        idvt = (ntcw-1)*10 + ntoz - 1
      else
        idvt = head%idvt
      endif
!
      IF (me.eq.0) THEN
        write(*,*)'nfile,in treadeo fhour,idate=',nft,fhour,idate
     &, ' ntozi=',ntozi,' ntcwi=',ntcwi,' ncldi=',ncldi
     &, ' ntraci=',ntraci,' tracers=',head%ntrac,' vtid=',head%idvt
     &,  head%ncldt,' idvc=',head%idvc,' jcap=',head%jcap
     &, ' ixgr=',ixgr,' pdryini=',pdryini
      ENDIF
!cjfe
      IF(IPRINT.EQ.1)
     X PRINT *,'TREAD UNIT,FHOUR,IDATE=',NFT,FHOUR,IDATE
 
!
      dati%i = 1                                           ! hs
      dati%f => TRISCA
      call sigio_rrdbti(nft,head,dati,iret)
      if (me == 0) print *,' Z_R=',trisca(1:10),' iret=',iret
      Z   = TRISCA
      Z_R = TRISCA
      CALL TRISEORI(TRISCA,GZE,GZO,1,LS_NODE)
      GA2=GRAV/(RERTH*RERTH)
      DO LOCL=1,LS_MAX_NODE
              L=ls_node(locl,1)
         jbasev=ls_node(locl,2)
         indev1 = indlsev(L,L)
         if (mod(L,2).eq.mod(jcap+1,2)) then
            indev2 = indlsev(jcap+1,L)
         else
            indev2 = indlsev(jcap  ,L)
         endif
         do indev = indev1 , indev2
            GZE(INDEV,1)=
     X      GZE(INDEV,1)*SNNP1EV(INDEV)*GA2
            GZE(INDEV,2)=
     X      GZE(INDEV,2)*SNNP1EV(INDEV)*GA2
         END DO
      END DO
      DO LOCL=1,LS_MAX_NODE
              L=ls_node(locl,1)
         jbasod=ls_node(locl,3)
         indod1 = indlsod(L+1,L)
         if (mod(L,2).eq.mod(jcap+1,2)) then
            indod2 = indlsod(jcap  ,L)
         else
            indod2 = indlsod(jcap+1,L)
         endif
         do indod = indod1 , indod2
            GZO(INDOD,1)=
     X      GZO(INDOD,1)*SNNP1OD(INDOD)*GA2
            GZO(INDOD,2)=
     X      GZO(INDOD,2)*SNNP1OD(INDOD)*GA2
         END DO
      END DO
 
      if (mod(head%idvm/10,10) == 3 .and. me == 0)then
        print *,' CPI=',head%cpi(1:ntraci+1)
        print *,' RI=',head%ri(1:ntraci+1)
      endif
      dati%i = 2                               ! Surface pressure
      dati%f => TRISCA                       
      call sigio_rrdbti(nft,head,dati,iret)
      if (me == 0) print *,' SFCPRES=',trisca(1:10)
      CALL TRISEORI(TRISCA,QE,QO,1,LS_NODE)
      DO K=1,LEVS
        dati%i = k + 2                        ! Virtual Temperature or CpT
        dati%f => TRISCA                       

        call sigio_rrdbti(nft,head,dati,iret)

        CALL TRISEORI(TRISCA,TEE(1,1,K),TEO(1,1,K),1,LS_NODE)
      enddo
!
      DO K=1,LEVS
         dati%i = levs + 2 + (k-1) * 2 + 1     ! Divergence
         dati%f => TRISCA
         call sigio_rrdbti(nft,head,dati,iret)
         CALL TRISEORI(TRISCA,DIE(1,1,K),DIO(1,1,K),1,LS_NODE)
!
         dati%i = levs + 2 + (k-1) * 2 + 2     ! Vorticity
         dati%f => TRISCA
         call sigio_rrdbti(nft,head,dati,iret)
         CALL TRISEORI(TRISCA,ZEE(1,1,K),ZEO(1,1,K),1,LS_NODE)
      END DO
csela print*,' levh=',levh
!
!
      RQE=0.
      RQO=0.
      DO K=1,ntraci
        kk = 0
        if (k .eq. 1) then
          kk = 1
        elseif (k .eq. ntozi) then
          kk = ntoz
        elseif (k .ge. ntcwi .and. k .lt. ntcwi+ncldi-1) then
          do n=1,ncldi
            if (k .eq. ntcwi+n-1) kk = ntcw+n-1
          enddo
        else
          kk = k
        endif
!
        DO lv=1,levs
          dati%i = levs * (2+k) + 2 + lv             ! Tracers starting with q
          dati%f => TRISCA
          call sigio_rrdbti(nft,head,dati,iret)
          CALL TRISEORI(TRISCA,RQE(1,1,lv,KK),RQO(1,1,lv,KK),1,LS_NODE)
        END DO
      END DO
!
      if (((ixgr .eq. 4 .and. num_p3d .eq. 4) .or.   ! Zhao Scheme!
     &     (ixgr .eq. 5 .and. num_p3d .eq. 3))       ! Ferrier Scheme!
     &     .and. fhour .gt. 0.1) then
        kmsk(:,:)  = 0
          num_dta = (ntraci+3)*levs + 2
          do nn=1,num_p3d
            do k=1,levs
              dati%i = num_dta + (nn-1)*levs + k      ! physics 3D grid fields
              dati%f => buff1
              call sigio_rrdbti(nft,head,dati,iret)
!              call split2d_r(buff1(1),buffo,global_lats_a)
!              CALL interpred(1,kmsk,buffo,buff2,global_lats_a,
!     &                lonsperlat)
!
!              do lan=1,LATS_NODE_A
!                lat = global_lats_a(ipt_lats_node_a-1+lan)
!                lons_lat = lonsperlat(lat)
!                DO i=1,lons_lat
!                  phy_f3d(i,k,nn,lan) = buff2(i,lan)
!                enddo
!              enddo
            enddo
          enddo
          do nn=1,num_p2d
            dati%i = num_dta + num_p3d*levs + nn      ! physics 2D grid fields
            dati%f => buff1
            call sigio_rrdbti(nft,head,dati,iret)
!            call split2d_r(buff1,buffo,global_lats_a)
!            CALL interpred(1,kmsk,buffo,buff2,global_lats_a,
!     &              lonsperlat)
!            do j=1,lats_node_a
!              do i=1,lonf
!                phy_f2d(i,nn,j) = buff2(i,j)
!              enddo
!            enddo
          enddo
!       endif
      endif
      if (head%nxss .gt. 0) then
        dati%i = num_dta + num_p3d*levs + num_p2d + 1    ! pdryini
        dati%f => buff1
        call sigio_rrdbti(nft,head,dati,iret)
        pdryini = buff1(1)
      endif
!
      iprint=0
 
      END SUBROUTINE TREADEO_slg