subroutine ndslfv_monoadvv (grid_gr,pdot,
     &                           global_lats_a,lonsperlat,deltim)
!
! a routine to do non-iteration semi-Lagrangain advection
! considering advection  with monotonicity in interpolation
! contact: hann-ming henry juang
! program log:
! 2011 02 20 : henry juang, initial implemented into nems as NDSL with mass_dp
! 2013 09 30 : henry juang, add option of theta advection, (used later)
!
!
      use gfs_dyn_machine , only : kind_grid
      use gfs_dyn_resol_def
      use gfs_dyn_layout1
      use gfs_dyn_vert_def
      use gfs_dyn_coordinate_def
      use gfs_dyn_physcons
      use gfs_dyn_tracer_const
      use gfs_dyn_mpi_def
      implicit none

      real(kind=kind_grid) grid_gr(lonf*lats_node_a_max,lotgr)
      real(kind=kind_grid) pdot(lonf,levs+1,lats_node_a_max)
      real(kind=kind_grid) plev(lonfull,levs+1)
      integer,intent(in):: global_lats_a(latg)
      integer,intent(in):: lonsperlat(latg)
      real,   intent(in):: deltim
   
      real      qqlon(lonfull,levs*ndslvvar,latpart)

!     real      xksav(lonfull,levs      ,latpart)
!     real      stsav(lonfull,levs      ,latpart)
!     real      ttsav(lonfull,levs      ,latpart)

!     real      xr    (lonfull,levs)
!     real      xcp   (lonfull,levs)
!     real      sumrq (lonfull,levs)
!     real      xkappa(lonfull,levs)
!     real      kappa, pi, ply, hh
      real      cons0, cons1

      logical 	lprint

      integer mono,mass,nvars
      integer ilan,i,n,k,kk,lon,lan,lat,lons_lat,lon_dim,jlonf
      integer kss, kqq, ktt, kuu, kvv, nqq
      integer ks, kp , kq , kt , ku , kv
      integer kpg, kqg, ktg, kug, kvg
!
!     lprint = .false.

!     if( lprint ) then
!       print *,' enter ndslfv_advect  with monotonicity '
!     endif
!
      mono  = 1
      mass  = 0
      cons0 = 0.0
      cons1 = 1.0
!
      kuu = 1
      kvv = kuu + levs
      ktt = kvv + levs
      kqq = ktt + levs
      
      nvars = ndslvvar
!
!$omp parallel do schedule(dynamic,1) private(lan)
!$omp+private(lat,lons_lat,jlonf,i,k,plev,ilan,mass)
!$omp+private(kug,kvg,ktg,kpg,kqg)
!$omp+private(ku ,kv ,kt ,kp ,kq )

      do lan=1,lats_node_a

        lat = global_lats_a(ipt_lats_node_a-1+lan)
        lons_lat = lonsperlat(lat)
        jlonf = (lan-1)*lonf
!
        plev(:,levs+1) = 0.0
        do k=levs,1,-1
          kpg=g_dp+k-1
          do i=1,lons_lat
            ilan=i+jlonf
            plev(i,k)=plev(i,k+1)+grid_gr(ilan,kpg)
          enddo
        enddo

!       if( lprint ) then
!       do k=1,levs
!       print *,' k= ',k
!       call mymaxmin(pdot(1,k,lan),lons_lat,lonfull,1,' pdot ')
!       call mymaxmin(plev(1,k),lons_lat,lonfull,1,' plev ')
!       enddo
!       endif
!
! u v h at n+1* 
!       kappa = con_rd / con_cp
        do k=1,levs
          ku=kuu+k-1
          kv=kvv+k-1
          kt=ktt+k-1
          kug=g_u+k-1
          kvg=g_v+k-1
          ktg=g_t+k-1
          do i=1,lons_lat
            ilan=i+jlonf
            qqlon(i,ku,lan) = grid_gr(ilan,kug) 
            qqlon(i,kv,lan) = grid_gr(ilan,kvg) 
            qqlon(i,kt,lan) = grid_gr(ilan,ktg) 
          enddo
        enddo
! rq at n+1* 
        do k=1,levh
          kq=kqq+k-1
          kqg=g_rt+k-1
          do i=1,lons_lat
            ilan=i+jlonf
            qqlon(i,kq,lan) = grid_gr(ilan,kqg)
          enddo
        enddo
!
! ----- prepare xr, xcp, xkapa 
!
!       xr    = cons0
!       xcp   = cons0
!       sumrq = cons0
!       do n=1,ntrac
!         nqq = kqq + (n-1)*levs
!         if( ri(n) .ne. cons0 .and. cpi(n) .ne. cons0 ) then
!           do k=1,levs
!             kq=nqq+k-1
!             do i=1,lons_lat
!               xr   (i,k) = xr   (i,k) + qqlon(i,kq,lan)*ri(n)
!               xcp  (i,k) = xcp  (i,k) + qqlon(i,kq,lan)*cpi(n)
!               sumrq(i,k) = sumrq(i,k) + qqlon(i,kq,lan)
!             enddo
!           enddo
!         endif
!       enddo
!       do k=1,levs
!         do i=1,lons_lat
!           xr (i,k)   = ( cons1 - sumrq(i,k) )*ri(0)  + xr (i,k)
!           xcp(i,k)   = ( cons1 - sumrq(i,k) )*cpi(0) + xcp(i,k)
!           xkappa(i,k) = xr(i,k) / xcp(i,k)
!           xksav(i,k,lan) = xkappa(i,k)
!         enddo
!       enddo
!
! change h to theta
!
!       do k=1,levs
!         kt=ktt+k-1
!         do i=1,lons_lat
!           pi = ((plev(i,k)+plev(i,k+1))*0.005)**xkappa(i,k)
!           ttsav(i,k ,lan) = qqlon(i,kt,lan)
!           qqlon(i,kt,lan) = qqlon(i,kt,lan)/pi
!           stsav(i,k ,lan) = qqlon(i,kt,lan)
!         enddo
!       enddo
!
!
        mass=0
        call vertical_cell_advect (lons_lat,lonfull,levs,nvars,
     &            deltim,plev,pdot(1,1,lan),qqlon(1,1,lan),mass)
!
! dp with mass conserving
!       do k=1,levs
!         kp =g_dp +k-1
!         kpg=g_dpn+k-1
!         do i=1,lon_dim
!           ilan=i+jlonf
!           rrlon(i,k,lan) = grid_gr(ilan,kpg)/grid_gr(ilan,kp )
!           rrlon(i,k,lan) = 1.0
!         enddo
!       enddo
!       mass=1
!       call vertical_cell_advect (lons_lat,lonfull,levs,1,
!    &            deltim,plev,pdot(1,1,lan),rrlon(1,1,lan),mass)
!       do k=1,levs
!         kp =g_dp +k-1
!         kpg=g_dpn+k-1
!         do i=1,lon_dim
!           ilan=i+jlonf
!           grid_gr(ilan,kpg) = rrlon(i,k ,lan)*grid_gr(ilan,kp )
!         enddo
!       enddo
!
! ----- prepare xr, xcp, xkapa 
!
!       xr    = cons0
!       xcp   = cons0
!       sumrq = cons0
!       do n=1,ntrac
!         nqq = kqq + (n-1)*levs
!         if( ri(n) .ne. cons0 .and. cpi(n) .ne. cons0 ) then
!           do k=1,levs
!             kq=nqq+k-1
!             do i=1,lons_lat
!               xr   (i,k) = xr   (i,k) + qqlon(i,kq,lan)*ri(n)
!               xcp  (i,k) = xcp  (i,k) + qqlon(i,kq,lan)*cpi(n)
!               sumrq(i,k) = sumrq(i,k) + qqlon(i,kq,lan)
!             enddo
!           enddo
!         endif
!       enddo
!       do k=1,levs
!         do i=1,lons_lat
!           xr (i,k)   = ( cons1 - sumrq(i,k) )*ri(0)  + xr (i,k)
!           xcp(i,k)   = ( cons1 - sumrq(i,k) )*cpi(0) + xcp(i,k)
!           xkappa(i,k) = xr(i,k) / xcp(i,k)
!         enddo
!       enddo
!
! add change of p, theta and kappa to h
!
!       do k=1,levs
!         kt=ktt+k-1
!         do i=1,lons_lat
!           ply = (plev(i,k)+plev(i,k+1))*0.5
!           pi = ((plev(i,k)+plev(i,k+1))*0.005)**xkappa(i,k)
!           hh = ttsav(i,k,lan)
!           ttsav(i,k,lan) = ttsav(i,k,lan)
!    &                      + xksav(i,k,lan)*hh/ply*
!    &                       (pdot(i,k,lan)+pdot(i,k+1,lan))*deltim
!           ttsav(i,k,lan) = ttsav(i,k,lan) 
!    &                      + pi*(qqlon(i,kt,lan)-stsav(i,k,lan))
!    &                      + hh*log(ply/100.)*
!    &                        (xkappa(i,k)-xksav(i,k,lan))
!           qqlon(i,kt,lan)= ttsav(i,k,lan)
!         enddo
!       enddo
!
! u v h at n+1
        do k=1,levs
          ku=kuu+k-1
          kv=kvv+k-1
          kt=ktt+k-1
          kug=g_u+k-1
          kvg=g_v+k-1
          ktg=g_t+k-1
          do i=1,lons_lat
            ilan=i+jlonf
            grid_gr(ilan,kug) = qqlon(i,ku,lan)
            grid_gr(ilan,kvg) = qqlon(i,kv,lan)
            grid_gr(ilan,ktg) = qqlon(i,kt,lan)
          enddo
        enddo
! rq at n+1
        do k=1,levh
          kq=kqq+k-1
          kqg=g_rt+k-1
          do i=1,lons_lat
            ilan=i+jlonf
            grid_gr(ilan,kqg) = qqlon(i,kq,lan)
          enddo
        enddo
!
!       if( lprint ) then
!       call mymaxmin(qqlon(1,kqq,lan),lons_lat,lonfull,1,' q vertadv')
!       print *,' ------------------------------------------- '
!       print *,' finish updating n+1* in grid_gr at lan=',lan
!       endif
!
      enddo

! 
! ===============================
!
      return
      end