!#define BIT_FOR_BIT
!
!NCEP_MESO:MODEL_LAYER: HORIZONTAL AND VERTICAL ADVECTION
!
!----------------------------------------------------------------------
!

      MODULE MODULE_ADVECTION 2
!
!----------------------------------------------------------------------
      USE MODULE_MPP
      USE module_model_constants
!----------------------------------------------------------------------
#ifdef DM_PARALLEL
      INCLUDE "mpif.h"
#endif
!----------------------------------------------------------------------
!
      REAL,PARAMETER :: FF2=-0.64813,FF3=0.24520,FF4=-0.12189
      REAL,PARAMETER :: FFC=1.533,FBC=1.-FFC
      REAL :: CFL_MAX=0.97
      REAL :: CONSERVE_MIN=0.9,CONSERVE_MAX=1.1
!
!----------------------------------------------------------------------
      CONTAINS
!
!********************************************************************** 

      SUBROUTINE ADVE(NTSD,DT,DETA1,DETA2,PDTOP                        & 1
                     ,CURV,F,FAD,F4D,EM_LOC,EMT_LOC,EN,ENT,DX,DY       &
                     ,HTM,HBM2,VTM,VBM2                                &
                     ,T,U,V,PDSLO,TOLD,UOLD,VOLD                       &
                     ,PETDT,UPSTRM                                     &
                     ,FEW,FNS,FNE,FSE                                  &
                     ,ADT,ADU,ADV                                      &
                     ,N_IUP_H,N_IUP_V                                  &
                     ,N_IUP_ADH,N_IUP_ADV                              &
                     ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                      &
                     ,IHE,IHW,IVE,IVW,INDX3_WRK                        &
                     ,IDS,IDE,JDS,JDE,KDS,KDE                          &
                     ,IMS,IME,JMS,JME,KMS,KME                          &
                     ,ITS,ITE,JTS,JTE,KTS,KTE)
!**********************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .     
! SUBPROGRAM:    ADVE        HORIZONTAL AND VERTICAL ADVECTION
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 93-10-28       
!     
! ABSTRACT:
!     ADVE CALCULATES THE CONTRIBUTION OF THE HORIZONTAL AND VERTICAL
!     ADVECTION TO THE TENDENCIES OF TEMPERATURE AND WIND AND THEN
!     UPDATES THOSE VARIABLES.
!     THE JANJIC ADVECTION SCHEME FOR THE ARAKAWA E GRID IS USED
!     FOR ALL VARIABLES INSIDE THE FIFTH ROW.  AN UPSTREAM SCHEME
!     IS USED ON ALL VARIABLES IN THE THIRD, FOURTH, AND FIFTH
!     OUTERMOST ROWS.  THE ADAMS-BASHFORTH TIME SCHEME IS USED.
!     
! PROGRAM HISTORY LOG:
!   87-06-??  JANJIC     - ORIGINATOR
!   95-03-25  BLACK      - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
!   96-03-28  BLACK      - ADDED EXTERNAL EDGE
!   98-10-30  BLACK      - MODIFIED FOR DISTRIBUTED MEMORY
!   99-07-    JANJIC     - CONVERTED TO ADAMS-BASHFORTH SCHEME
!                          COMBINING HORIZONTAL AND VERTICAL ADVECTION
!   02-02-04  BLACK      - ADDED VERTICAL CFL CHECK
!   02-02-05  BLACK      - CONVERTED TO WRF FORMAT
!   02-08-29  MICHALAKES - CONDITIONAL COMPILATION OF MPI
!                          CONVERT TO GLOBAL INDEXING
!   02-09-06  WOLFE      - MORE CONVERSION TO GLOBAL INDEXING
!     
! USAGE: CALL ADVE FROM SUBROUTINE SOLVE_RUNSTREAM
!   INPUT ARGUMENT LIST:
!  
!   OUTPUT ARGUMENT LIST: 
!     
!   OUTPUT FILES:
!     NONE
!     
!   SUBPROGRAMS CALLED:
!  
!     UNIQUE: NONE
!  
!     LIBRARY: NONE
!  
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$  
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
!
      INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
      INTEGER, DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V        &
                                               ,N_IUP_ADH,N_IUP_ADV
      INTEGER, DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V    &
                                                       ,IUP_ADH,IUP_ADV
!
!***  NMM_MAX_DIM is set in configure.wrf and must agree with
!***  the value of dimspec q in the Registry/Registry
!
      INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK
!
      INTEGER,INTENT(IN) :: NTSD
!
      REAL,INTENT(IN) :: DT,DY,EN,ENT,F4D,PDTOP
!
      REAL,DIMENSION(NMM_MAX_DIM),INTENT(IN) :: EM_LOC,EMT_LOC
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: CURV,DX,F,FAD,HBM2 &
                                                   ,PDSLO,VBM2
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM,VTM
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: T,TOLD  &
                                                              ,U,UOLD  &
                                                              ,V,VOLD
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: ADT,ADU   &
                                                            ,ADV       &
                                                            ,FEW,FNE   &
                                                            ,FNS,FSE
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      LOGICAL :: UPSTRM
!
      INTEGER :: I,IEND,IFP,IFQ,II,IPQ,ISP,ISQ,ISTART                  &
                ,IUP_ADH_J,IVH,IVL                                     &
                ,J,J1,JA,JAK,JEND,JGLOBAL,JJ,JKNT,JP2,JSTART           &
                ,K,KNTI_ADH,KSTART,KSTOP                               &
                ,N,N_IUPH_J,N_IUPADH_J,N_IUPADV_J
!
      INTEGER :: MY_IS_GLB,MY_IE_GLB,MY_JS_GLB,MY_JE_GLB
!
      INTEGER :: J0_P3,J0_P2,J0_P1,J0_00,J0_M1,J1_P2,J1_P1,J1_00,J1_M1 &
                ,J2_P1,J2_00,J2_M1,J3_P2,J3_P1,J3_00                   &
                ,J4_P1,J4_00,J4_M1,J5_00,J5_M1,J6_P1,J6_00
!
      INTEGER,DIMENSION(ITS-5:ITE+5) :: KBOT_CFL_T,KTOP_CFL_T              &
                                   ,KBOT_CFL_U,KTOP_CFL_U              &
                                   ,KBOT_CFL_V,KTOP_CFL_V
!
      INTEGER,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: ISPA,ISQA
!
      REAL :: ARRAY3_X,CFL,DPDE_P3,F0,F1,F2,F3                         &
             ,FEW_00,FEW_P1,FNE_X,FNS_P1,FNS_X,FPP,FSE_X               &
             ,HM,PP,QP,RDPD,RDPDX,RDPDY,T_UP,TEMPA,TEMPB,TTA,TTB       &
             ,U_UP,UDY_P1,UDY_X,VXD_X,VDX_P2,V_UP,VDX_X,VM,VTA,VUA,VVA
!
      REAL,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: ARRAY0,ARRAY1             &
                                            ,ARRAY2,ARRAY3             &
                                        ,VAD_TEND_T,VAD_TEND_U         &
                                        ,VAD_TEND_V
!
      REAL,DIMENSION(ITS-5:ITE+5,KTS:KTE) :: TEW,UEW,VEW
!
      REAL,DIMENSION(ITS-5:ITE+5) :: VTB,VUB,VVB
!
      REAL,DIMENSION(KTS:KTE) :: VAD_TNDX_T,VAD_TNDX_U,VAD_TNDX_V
!
      REAL,DIMENSION(ITS-5:ITE+5,-1:1) :: PETDTK
!
      REAL,DIMENSION(ITS-5:ITE+5) :: TDN,UDN,VDN
!
!----------------------------------------------------------------------
!
!***  TYPE 0 WORKING ARRAY
!
      REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-3:3) :: DPDE
!
!***  TYPE 1 WORKING ARRAY
!
      REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-2:2) :: TST,UDY,UST,VDX,VST
!
!***  TYPE 4 WORKING ARRAY
!
      REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-1:1) :: TNS,UNS,VNS
!
!***  TYPE 5 WORKING ARRAY
!
      REAL,DIMENSION(ITS-5:ITE+5,KMS:KME,-1:0) :: TNE,UNE,VNE
!
!***  TYPE 6 WORKING ARRAY
!
      REAL,DIMENSION(ITS-5:ITE+5,KMS:KME, 0:1) :: TSE,USE,VSE
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!**********************************************************************
!
!                         DPDE      -----  3
!                          |                      J Increasing
!                          |                        
!                          |                            ^
!                         FNS       -----  2            |
!                          |                            |
!                          |                            |
!                          |                            |
!                         VNS       -----  1            |
!                          |
!                          |
!                          |
!                         ADV       -----  0  ------> Current J
!                          |
!                          |
!                          |
!                         VNS       ----- -1
!                          |
!                          |
!                          |
!                         FNS       ----- -2
!                          |
!                          |
!                          |
!                         DPDE      ----- -3
!
!**********************************************************************
!----------------------------------------------------------------------
! initialize the temporaries to avoid floating point exceptions on 
! machines that care

#ifdef FLOATSAFE
      ARRAY0          = 0.
      ARRAY1          = 0.
      ARRAY2          = 0.
      ARRAY3          = 0.
      VAD_TEND_T      = 0.
      VAD_TEND_U      = 0.
      VAD_TEND_V      = 0.
      TEW             = 0.
      UEW             = 0.
      VEW             = 0.
      VTB             = 0.
      VUB             = 0.
      VVB             = 0.
      VAD_TNDX_T      = 0.
      VAD_TNDX_U      = 0.
      VAD_TNDX_V      = 0.
      PETDTK          = 0.
      TDN             = 0.
      UDN             = 0.
      VDN             = 0.
      DPDE            = 0.
      TST             = 0.
      UDY             = 0.
      UST             = 0.
      VDX             = 0.
      VST             = 0.
      TNS             = 0.
      UNS             = 0.
      VNS             = 0.
      TNE             = 0.
      UNE             = 0.
      VNE             = 0.
      TSE             = 0.
      USE             = 0.
      VSE             = 0.
#endif

!----------------------------------------------------------------------
! I should have done all this but right now the loops are still
! using the non-thread safe versions in module_MPP.F  JM
! what about myie and myje?  jw - not stored myis_p2,myie_p2...
      MYIS    =MAX(IDS  ,ITS  )
      MYIE    =MIN(IDE  ,ITE  )
!
      MYIS1   =MAX(IDS+1,ITS  )
      MYIE1   =MIN(IDE-1,ITE  )
      MYJS2   =MAX(JDS+2,JTS  )
      MYJE2   =MIN(JDE-2,JTE  )
!
      MYIS_P2 =MAX(IDS  ,ITS-2)
      MYIE_P2 =MIN(IDE  ,ITE+2)
      MYIS_P3 =MAX(IDS  ,ITS-3)
      MYIE_P3 =MIN(IDE  ,ITE+3)
      MYIS_P4 =MAX(IDS  ,ITS-4)
      MYIE_P4 =MIN(IDE  ,ITE+4)
      MYJS_P2 =MAX(JDS  ,JTS-2)
      MYJE_P2 =MIN(JDE  ,JTE+2)
      MYJS_P4 =MAX(JDS  ,JTS-4)
      MYJE_P4 =MIN(JDE  ,JTE+4)
!
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE1_P1=MIN(IDE-1,ITE+1)
      MYIS1_P2=MAX(IDS+1,ITS-2)
      MYIE1_P2=MIN(IDE-1,ITE+2)
      MYIS1_P3=MAX(IDS+1,ITS-3)
      MYIE1_P3=MIN(IDE-1,ITE+3)
      MYIS1_P4=MAX(IDS+1,ITS-4)
      MYIE1_P4=MIN(IDE-1,ITE+4)

      ISTART=MYIS_P2
      IEND=MYIE_P2
      IF( ITE == IDE )IEND=MYIE-3

!***
!***  INITIALIZE SOME WORKING ARRAYS TO ZERO
!***
      DO K=KTS,KTE
      DO I=ITS,ITE
        TEW(I,K)=0.
        UEW(I,K)=0.
        VEW(I,K)=0.
      ENDDO
      ENDDO
!
!***  TYPE 0
!
      DO N=-3,3
        DO K=KTS,KTE
        DO I=ITS,ITE
          DPDE(I,K,N)=0.
        ENDDO
        ENDDO
      ENDDO
!
!***  TYPE 1
!
      DO N=-2,2
        DO K=KTS,KTE
        DO I=ITS,ITE
          TST(I,K,N)=0.
          UST(I,K,N)=0.
          VST(I,K,N)=0.
          VDX(I,K,N)=0.
        ENDDO
        ENDDO
      ENDDO
!
!***  TYPES 5 AND 6
!
      DO N=-1,0
        DO K=KTS,KTE
        DO I=ITS,ITE
          TNE(I,K,N)=0.
          TSE(I,K,N+1)=0.
          UNE(I,K,N)=0.
          USE(I,K,N+1)=0.
          VNE(I,K,N)=0.
          VSE(I,K,N+1)=0.
        ENDDO
        ENDDO
      ENDDO
!----------------------------------------------------------------------
!***
!***  WE NEED THE STARTING AND ENDING J FOR THIS TASK'S INTEGRATION
!***
      JSTART=MYJS2
      JEND=MYJE2
!!!   JSTART=MYJS_P2
!!!   JEND=MYJE_P2
!
!!!   IF(IBROW==1)THEN
!!!     JSTART=MYJS2
!!!   ELSEIF(ITROW==1)THEN
!!!     JEND=MYJE2
!!!   ENDIF
!
!!!   call f_hpmstart(10,"ADVE_main")
!----------------------------------------------------------------------
!
!***  FILL WORKING ARRAYS FOR THE INTEGRATION
!
!----------------------------------------------------------------------
!
      DO J=-2,1
        JJ=JSTART+J
        DO K=KTS,KTE
        DO I=MYIS_P4,MYIE_P4
          TST(I,K,J)=T(I,K,JJ)*FFC+TOLD(I,K,JJ)*FBC
          UST(I,K,J)=U(I,K,JJ)*FFC+UOLD(I,K,JJ)*FBC
          VST(I,K,J)=V(I,K,JJ)*FFC+VOLD(I,K,JJ)*FBC
        ENDDO
        ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  MARCH NORTHWARD THROUGH THE SOUTHERNMOST SLABS TO BEGIN
!***  FILLING THE MAIN WORKING ARRAYS WHICH ARE MULTI-DIMENSIONED
!***  IN J BECAUSE THEY ARE DIFFERENCED OR AVERAGED IN J.
!***  THE NORTHERNMOST OF EACH OF THE WORKING ARRAYS WILL BE
!***  FILLED IN THE PRIMARY INTEGRATION SECTONS.
!----------------------------------------------------------------------
!
      J1=-3
      IF(JTS==JDS)J1=-2  ! Cannot go 3 south from J=2 for south tasks
!
      DO J=J1,2
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P4,MYIE_P4
          DPDE(I,K,J)=DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,JJ)
        ENDDO
        ENDDO
!
      ENDDO
!
!----------------------------------------------------------------------
      DO J=-2,1
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P4,MYIE_P4
          UDY(I,K,J)=U(I,K,JJ)*DY
          VDX_X=V(I,K,JJ)*DX(I,JJ)
          FNS(I,K,JJ)=VDX_X*(DPDE(I,K,J-1)+DPDE(I,K,J+1))
          VDX(I,K,J)=VDX_X
        ENDDO
        ENDDO
!
      ENDDO
!
!----------------------------------------------------------------------
      DO J=-2,0
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          TEMPA=(UDY(I+IHE(JJ),K,J)+VDX(I+IHE(JJ),K,J))                &
               +(UDY(I,K,J+1)      +VDX(I,K,J+1))
          FNE(I,K,JJ)=TEMPA*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J+1))
        ENDDO
        ENDDO
!
      ENDDO
!
!----------------------------------------------------------------------
      DO J=-1,1
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          TEMPB=(UDY(I+IHE(JJ),K,J)-VDX(I+IHE(JJ),K,J))                &
               +(UDY(I,K,J-1)      -VDX(I,K,J-1))
          FSE(I,K,JJ)=TEMPB*(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J-1))
        ENDDO
        ENDDO
!
      ENDDO
!
!----------------------------------------------------------------------
      DO J=-1,0
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS1_P3,MYIE1_P3
          FNS_X=FNS(I,K,JJ)
          TNS(I,K,J)=FNS_X*(TST(I,K,J+1)-TST(I,K,J-1))
!
          UDY_X=U(I,K,JJ)*DY
          FEW(I,K,JJ)=UDY_X*(DPDE(I+IVW(JJ),K,J)+DPDE(I+IVE(JJ),K,J))   
        ENDDO
        ENDDO
!
        DO K=KTS,KTE
        DO I=MYIS1_P4,MYIE1_P4
          UNS(I,K,J)=(FNS(I+IHW(JJ),K,JJ)+FNS(I+IHE(JJ),K,JJ))         &
                    *(UST(I,K,J+1)-UST(I,K,J-1))
          VNS(I,K,J)=(FNS(I,K,JJ-1)+FNS(I,K,JJ+1))                     &
                    *(VST(I,K,J+1)-VST(I,K,J-1))
        ENDDO
        ENDDO
!
      ENDDO
!
!----------------------------------------------------------------------
      JJ=JSTART-1
!
      DO K=KTS,KTE
      DO I=MYIS1_P2,MYIE1_P2
        FNE_X=FNE(I,K,JJ)
        TNE(I,K,-1)=FNE_X*(TST(I+IHE(JJ),K,0)-TST(I,K,-1))
!
        FSE_X=FSE(I,K,JJ+1)
        TSE(I,K,0)=FSE_X*(TST(I+IHE(JJ+1),K,-1)-TST(I,K,0))
!
        UNE(I,K,-1)=(FNE(I+IVW(JJ),K,JJ)+FNE(I+IVE(JJ),K,JJ))          &
                   *(UST(I+IVE(JJ),K,0)-UST(I,K,-1))
        USE(I,K,0)=(FSE(I+IVW(JJ+1),K,JJ+1)+FSE(I+IVE(JJ+1),K,JJ+1))   &
                  *(UST(I+IVE(JJ+1),K,-1)-UST(I,K,0))
        VNE(I,K,-1)=(FNE(I,K,JJ-1)+FNE(I,K,JJ+1))                      &
                   *(VST(I+IVE(JJ),K,0)-VST(I,K,-1))
        VSE(I,K,0)=(FSE(I,K,JJ)+FSE(I,K,JJ+2))                         &
                  *(VST(I+IVE(JJ+1),K,-1)-VST(I,K,0))
      ENDDO
      ENDDO
!
      JKNT=0
!!!   call f_hpmstop(10)
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
      main_integration : DO J=JSTART,JEND
!!!   call f_hpmstart(10,"ADVE_main")
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***
!***  SET THE 3RD INDEX IN THE WORKING ARRAYS (SEE SUBROUTINE INIT
!***                                           AND PFDHT DIAGRAMS)
!***
!***  J[TYPE]_NN WHERE "TYPE" IS THE WORKING ARRAY TYPE SEEN IN THE
!***  LOCAL DECLARATION ABOVE (DEPENDENT UPON THE J EXTENT) AND
!***  NN IS THE NUMBER OF ROWS NORTH OF THE CENTRAL ROW WHOSE J IS
!***  THE CURRENT VALUE OF THE main_integration LOOP.
!***  (P3 denotes +3, M1 denotes -1, etc.)
!***

!
! John and Tom both think this is all right, even for tiles,
! as long as the slab arrays being indexed by these things
! are locally defined.
!
      JKNT=JKNT+1
!
      J0_P3=INDX3_WRK(3,JKNT,0)
      J0_P2=INDX3_WRK(2,JKNT,0)
      J0_P1=INDX3_WRK(1,JKNT,0)
      J0_00=INDX3_WRK(0,JKNT,0)
      J0_M1=INDX3_WRK(-1,JKNT,0)
!
      J1_P2=INDX3_WRK(2,JKNT,1)
      J1_P1=INDX3_WRK(1,JKNT,1)
      J1_00=INDX3_WRK(0,JKNT,1)
      J1_M1=INDX3_WRK(-1,JKNT,1)
!
      J2_P1=INDX3_WRK(1,JKNT,2)
      J2_00=INDX3_WRK(0,JKNT,2)
      J2_M1=INDX3_WRK(-1,JKNT,2)
!
      J3_P2=INDX3_WRK(2,JKNT,3)
      J3_P1=INDX3_WRK(1,JKNT,3)
      J3_00=INDX3_WRK(0,JKNT,3)
!
      J4_P1=INDX3_WRK(1,JKNT,4)
      J4_00=INDX3_WRK(0,JKNT,4)
      J4_M1=INDX3_WRK(-1,JKNT,4)
!
      J5_00=INDX3_WRK(0,JKNT,5)
      J5_M1=INDX3_WRK(-1,JKNT,5)
!
      J6_P1=INDX3_WRK(1,JKNT,6)
      J6_00=INDX3_WRK(0,JKNT,6)
!
!
!jm
! only the J ones are used here
      MY_IS_GLB=1  ! make this a noop for global indexing
      MY_IE_GLB=1  ! make this a noop for global indexing
      MY_JS_GLB=1  ! make this a noop for global indexing
      MY_JE_GLB=1  ! make this a noop for global indexing
  
!----------------------------------------------------------------------
!***  THE WORKING ARRAYS FOR THE PRIMARY VARIABLES
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
      DO I=MYIS_P4,MYIE_P4
        TST(I,K,J1_P2)=T(I,K,J+2)*FFC+TOLD(I,K,J+2)*FBC
        UST(I,K,J1_P2)=U(I,K,J+2)*FFC+UOLD(I,K,J+2)*FBC
        VST(I,K,J1_P2)=V(I,K,J+2)*FFC+VOLD(I,K,J+2)*FBC
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  MASS FLUXES AND MASS POINT ADVECTION COMPONENTS
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
      DO I=MYIS_P4,MYIE_P4
!
!----------------------------------------------------------------------
!***  THE NS AND EW FLUXES IN THE FOLLOWING LOOP ARE ON V POINTS
!***  FOR T.
!----------------------------------------------------------------------
!
        DPDE_P3=DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J+3)
        DPDE(I,K,J0_P3)=DPDE_P3
!
!----------------------------------------------------------------------
        UDY(I,K,J1_P2)=U(I,K,J+2)*DY
        VDX_P2=V(I,K,J+2)*DX(I,J+2)
        VDX(I,K,J1_P2)=VDX_P2
        FNS(I,K,J+2)=VDX_P2*(DPDE(I,K,J0_P1)+DPDE_P3)
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!!!   call f_hpmstart(2,"BIGLOOP")
      DO K=KTS,KTE
      DO I=MYIS_P3,MYIE_P3


        TEMPA=(UDY(I+IHE(J+1),K,J1_P1)+VDX(I+IHE(J+1),K,J1_P1))       &
             +(UDY(I,K,J1_P2)         +VDX(I,K,J1_P2))
        FNE(I,K,J+1)=TEMPA*(DPDE(I,K,J0_P1)+DPDE(I+IHE(J+1),K,J0_P2))
!
!----------------------------------------------------------------------
        TEMPB=(UDY(I+IHE(J+2),K,J1_P2)-VDX(I+IHE(J+2),K,J1_P2))        &
             +(UDY(I,K,J1_P1)         -VDX(I,K,J1_P1))
        FSE(I,K,J+2)=TEMPB*(DPDE(I,K,J0_P2)+DPDE(I+IHE(J),K,J0_P1))
!
!----------------------------------------------------------------------
        FNS_P1=FNS(I,K,J+1)
        TNS(I,K,J4_P1)=FNS_P1*(TST(I,K,J1_P2)-TST(I,K,J1_00))
!
!----------------------------------------------------------------------
        UDY_P1=U(I,K,J+1)*DY
!write(0,*)'i,j,k ',i,j,k
!write(0,*)'U(I,K,J+1) ',U(I,K,J+1)
!write(0,*)'UDY_P1 ',UDY_P1
!write(0,*)'DPDE(I+IVW(J+1),K,J0_P1) ',DPDE(I+IVW(J+1),K,J0_P1)
!write(0,*)'DPDE(I+IVE(J+1),K,J0_P1) ',DPDE(I+IVE(J+1),K,J0_P1)
!write(0,*)'IVW(J+1) ',IVW(J+1),' IVE(J+1) ',IVE(J+1)
!write(0,*)'J0_P1  ',J0_P1
        FEW(I,K,J+1)=UDY_P1*(DPDE(I+IVW(J+1),K,J0_P1)                  &
                              +DPDE(I+IVE(J+1),K,J0_P1))
        FEW_00=FEW(I,K,J)
        TEW(I,K)=FEW_00*(TST(I+IVE(J),K,J1_00)-TST(I+IVW(J),K,J1_00))
!
!----------------------------------------------------------------------
!***  THE NE AND SE FLUXES ARE ASSOCIATED WITH H POINTS
!***  (ACTUALLY JUST TO THE NE AND SE OF EACH H POINT).
!----------------------------------------------------------------------
!
        FNE_X=FNE(I,K,J)
        TNE(I,K,J5_00)=FNE_X*(TST(I+IHE(J),K,J1_P1)-TST(I,K,J1_00))
!
        FSE_X=FSE(I,K,J+1)
        TSE(I,K,J6_P1)=FSE_X*(TST(I+IHE(J+1),K,J1_00)-TST(I,K,J1_P1))
      ENDDO
      ENDDO
!!!!  call f_hpmstop(2)
!
!----------------------------------------------------------------------
!***  CALCULATION OF MOMENTUM ADVECTION COMPONENTS
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***  THE NS AND EW FLUXES ARE ON H POINTS FOR U AND V.
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE_P2
        UEW(I,K)=(FEW(I+IHW(J),K,J)+FEW(I+IHE(J),K,J))                 &
                *(UST(I+IHE(J),K,J1_00)-UST(I+IHW(J),K,J1_00))
        UNS(I,K,J4_P1)=(FNS(I+IHW(J+1),K,J+1)                          &
                       +FNS(I+IHE(J+1),K,J+1))                         &
                      *(UST(I,K,J1_P2)-UST(I,K,J1_00))
        VEW(I,K)=(FEW(I,K,J-1)+FEW(I,K,J+1))                           &
                *(VST(I+IHE(J),K,J1_00)-VST(I+IHW(J),K,J1_00))
        VNS(I,K,J4_P1)=(FNS(I,K,J)+FNS(I,K,J+2))                       &
                      *(VST(I,K,J1_P2)-VST(I,K,J1_00))
!
!----------------------------------------------------------------------
!***  THE FOLLOWING NE AND SE FLUXES ARE TIED TO V POINTS AND ARE
!***  LOCATED JUST TO THE NE AND SE OF THE GIVEN I,J.
!----------------------------------------------------------------------
!
        UNE(I,K,J5_00)=(FNE(I+IVW(J),K,J)+FNE(I+IVE(J),K,J))           &
                      *(UST(I+IVE(J),K,J1_P1)-UST(I,K,J1_00))
        USE(I,K,J6_P1)=(FSE(I+IVW(J+1),K,J+1)                          &
                       +FSE(I+IVE(J+1),K,J+1))                         &
                      *(UST(I+IVE(J+1),K,J1_00)-UST(I,K,J1_P1))
        VNE(I,K,J5_00)=(FNE(I,K,J-1)+FNE(I,K,J+1))                     &
                      *(VST(I+IVE(J),K,J1_P1)-VST(I,K,J1_00))
        VSE(I,K,J6_P1)=(FSE(I,K,J)+FSE(I,K,J+2))                       &
                      *(VST(I+IVE(J+1),K,J1_00)-VST(I,K,J1_P1))
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  COMPUTE THE ADVECTION TENDENCIES FOR T.
!***  THE AD ARRAYS ARE ON H POINTS.
!***  SKIP TO UPSTREAM IF THESE ROWS HAVE ONLY UPSTREAM POINTS.
!----------------------------------------------------------------------
!
      
      JGLOBAL=J+MY_JS_GLB-1
      IF(JGLOBAL.GE.6.AND.JGLOBAL.LE.JDE-5)THEN
!
        JJ=J+MY_JS_GLB-1   ! okay because MY_JS_GLB is 1
        IF(ITS==IDS)ISTART=3+MOD(JJ,2)  ! need to think about this
                                        ! more in terms of how to 
                                        ! convert to global indexing
!
        DO K=KTS,KTE
        DO I=ISTART,IEND
          RDPD=1./DPDE(I,K,J0_00)
!
          ADT(I,K,J)=(TEW(I+IHW(J),K)+TEW(I+IHE(J),K)                  &
                     +TNS(I,K,J4_M1)+TNS(I,K,J4_P1)                    &
                     +TNE(I+IHW(J),K,J5_M1)+TNE(I,K,J5_00)             &
                     +TSE(I,K,J6_00)+TSE(I+IHW(J),K,J6_P1))            &
                     *RDPD*FAD(I,J)
!
        ENDDO
        ENDDO
!
!----------------------------------------------------------------------
!***  COMPUTE THE ADVECTION TENDENCIES FOR U AND V.
!***  THE AD ARRAYS ARE ON VELOCITY POINTS.
!----------------------------------------------------------------------
!
!jw        ISTART=MYIS_P2
        IF(ITS==IDS)ISTART=3+MOD(JJ+1,2)
!jw        IEND=MYIE_P2
!jw        IF( ITE == IDE ) IEND=MYIE-3
!
        DO K=KTS,KTE
        DO I=ISTART,IEND
          RDPDX=1./(DPDE(I+IVW(J),K,J0_00)+DPDE(I+IVE(J),K,J0_00))
          RDPDY=1./(DPDE(I,K,J0_M1)+DPDE(I,K,J0_P1))
!
          ADU(I,K,J)=(UEW(I+IVW(J),K)+UEW(I+IVE(J),K)                  &
                     +UNS(I,K,J4_M1)+UNS(I,K,J4_P1)                    &
                     +UNE(I+IVW(J),K,J5_M1)+UNE(I,K,J5_00)             &
                     +USE(I,K,J6_00)+USE(I+IVW(J),K,J6_P1))            &
                     *RDPDX*FAD(I+IVW(J),J)
!
          ADV(I,K,J)=(VEW(I+IVW(J),K)+VEW(I+IVE(J),K)                  &
                     +VNS(I,K,J4_M1)+VNS(I,K,J4_P1)                    &
                     +VNE(I+IVW(J),K,J5_M1)+VNE(I,K,J5_00)             &
                     +VSE(I,K,J6_00)+VSE(I+IVW(J),K,J6_P1))            &
                     *RDPDY*FAD(I+IVW(J),J)
!
        ENDDO
        ENDDO
!
      ENDIF
!!!   call f_hpmstop(10)
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
!***  END OF JANJIC ADVECTION 
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***  UPSTREAM ADVECTION OF T, U, AND V
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
!!!   call f_hpmstart(11,"ADVE_upstr")
      upstream : IF(UPSTRM)THEN
!
!----------------------------------------------------------------------
!***
!***  COMPUTE UPSTREAM COMPUTATIONS ON THIS TASK'S ROWS.
!***
!----------------------------------------------------------------------
!
          N_IUPH_J=N_IUP_H(J)   ! See explanation in INIT
!
          DO K=KTS,KTE
!
            DO II=1,N_IUPH_J
              I=IUP_H(II,J)
              TTA=EMT_LOC(J)*(UST(I,K,J1_M1)+UST(I+IHW(J),K,J1_00)     &
                             +UST(I+IHE(J),K,J1_00)+UST(I,K,J1_P1))
              TTB=ENT       *(VST(I,K,J1_M1)+VST(I+IHW(J),K,J1_00)     &
                             +VST(I+IHE(J),K,J1_00)+VST(I,K,J1_P1))
              PP=-TTA-TTB
              QP= TTA-TTB
!
              IF(PP.LT.0.)THEN
                ISPA(I,K)=-1
              ELSE
                ISPA(I,K)= 1
              ENDIF
!
              IF(QP.LT.0.)THEN
                ISQA(I,K)=-1
              ELSE
                ISQA(I,K)= 1
              ENDIF
!
              PP=ABS(PP)
              QP=ABS(QP)
              ARRAY3_X=PP*QP
              ARRAY0(I,K)=ARRAY3_X-PP-QP
              ARRAY1(I,K)=PP-ARRAY3_X
              ARRAY2(I,K)=QP-ARRAY3_X
              ARRAY3(I,K)=ARRAY3_X
            ENDDO
!
          ENDDO
!----------------------------------------------------------------------
!
          N_IUPADH_J=N_IUP_ADH(J) 
!
          DO K=KTS,KTE
!
            KNTI_ADH=1
            IUP_ADH_J=IUP_ADH(1,J)
!
            DO II=1,N_IUPH_J
              I=IUP_H(II,J)
!
              ISP=ISPA(I,K)
              ISQ=ISQA(I,K)
              IFP=(ISP-1)/2
              IFQ=(-ISQ-1)/2
              IPQ=(ISP-ISQ)/2
!
              IF(HTM(I+IHE(J)+IFP,K,J+ISP)                             &
                *HTM(I+IHE(J)+IFQ,K,J+ISQ)                             &
                *HTM(I+IPQ,K,J+ISP+ISQ).GT.0.1)THEN
                 GO TO 150
              ENDIF
!
              IF(HTM(I+IHE(J)+IFP,K,J+ISP)                             &
                +HTM(I+IHE(J)+IFQ,K,J+ISQ)                             &
                +HTM(I+IPQ,K,J+ISP+ISQ).LT.0.1)THEN 
!
                T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J)
                T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J)
                T(I+IPQ,K,J+ISP+ISQ)=T(I,K,J)
!
              ELSEIF                                                   &
              (HTM(I+IHE(J)+IFP,K,J+ISP)+HTM(I+IPQ,K,J+ISP+ISQ)        &
              .LT.0.99)THEN
!
                T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J)
                T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFQ,K,J+ISQ)
!
              ELSEIF                                                   &
              (HTM(I+IHE(J)+IFQ,K,J+ISQ)+HTM(I+IPQ,K,J+ISP+ISQ)        &
              .LT.0.99)THEN
!
                T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J)
                T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP)
!
              ELSEIF                                                   &
              (HTM(I+IHE(J)+IFP,K,J+ISP)                               &
              +HTM(I+IHE(J)+IFQ,K,J+ISQ).LT.0.99)THEN
                T(I+IHE(J)+IFP,K,J+ISP)=0.5*(T(I,K,J)                  &
                                            +T(I+IPQ,K,J+ISP+ISQ))
                T(I+IHE(J)+IFQ,K,J+ISQ)=T(I+IHE(J)+IFP,K,J+ISP)
!
              ELSEIF(HTM(I+IHE(J)+IFP,K,J+ISP).LT.0.99)THEN
                T(I+IHE(J)+IFP,K,J+ISP)=T(I,K,J)                       &
                                       +T(I+IPQ,K,J+ISP+ISQ)           &
                                       -T(I+IHE(J)+IFQ,K,J+ISQ)
!
              ELSEIF(HTM(I+IHE(J)+IFQ,K,J+ISQ).LT.0.99)THEN
                T(I+IHE(J)+IFQ,K,J+ISQ)=T(I,K,J)                       &
                                       +T(I+IPQ,K,J+ISP+ISQ)           &
                                       -T(I+IHE(J)+IFP,K,J+ISP)
!
              ELSE
                T(I+IPQ,K,J+ISP+ISQ)=T(I+IHE(J)+IFP,K,J+ISP)           &
                                    +T(I+IHE(J)+IFQ,K,J+ISQ)           &
                                    -T(I,K,J)
!
              ENDIF
!
  150         CONTINUE
!
!----------------------------------------------------------------------
!
              IF(I.EQ.IUP_ADH_J)THEN  ! Update advection H tendencies
!
                ISP=ISPA(I,K)
                ISQ=ISQA(I,K)
                IFP=(ISP-1)/2
                IFQ=(-ISQ-1)/2
                IPQ=(ISP-ISQ)/2
!
                F0=ARRAY0(I,K)
                F1=ARRAY1(I,K)
                F2=ARRAY2(I,K)
                F3=ARRAY3(I,K)
!
                ADT(I,K,J)=F0*T(I,K,J)                                 &
                          +F1*T(I+IHE(J)+IFP,K,J+ISP)                  &
                          +F2*T(I+IHE(J)+IFQ,K,J+ISQ)                  &
                          +F3*T(I+IPQ,K,J+ISP+ISQ)
!
!----------------------------------------------------------------------
!
                IF(KNTI_ADH.LT.N_IUPADH_J)THEN
                  KNTI_ADH=KNTI_ADH+1
                  IUP_ADH_J=IUP_ADH(KNTI_ADH,J)
                ENDIF
!
              ENDIF  ! End of advection H tendency IF block
!
            ENDDO  ! End of I loop
!
          ENDDO  ! End of K loop
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***  UPSTREAM ADVECTION OF VELOCITY COMPONENTS
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
          N_IUPADV_J=N_IUP_ADV(J)
!
          DO K=KTS,KTE
!
            DO II=1,N_IUPADV_J
              I=IUP_ADV(II,J)
!
              TTA=EM_LOC(J)*UST(I,K,J1_00)
              TTB=EN       *VST(I,K,J1_00)
              PP=-TTA-TTB
              QP=TTA-TTB
!
              IF(PP.LT.0.)THEN
                ISP=-1
              ELSE
                ISP= 1
              ENDIF
!
              IF(QP.LT.0.)THEN
                ISQ=-1
              ELSE
                ISQ= 1
              ENDIF
!
              IFP=(ISP-1)/2
              IFQ=(-ISQ-1)/2
              IPQ=(ISP-ISQ)/2
              PP=ABS(PP)
              QP=ABS(QP)
              F3=PP*QP
              F0=F3-PP-QP
              F1=PP-F3
              F2=QP-F3
!
              ADU(I,K,J)=F0*U(I,K,J)                                   &
                        +F1*U(I+IVE(J)+IFP,K,J+ISP)                    &
                        +F2*U(I+IVE(J)+IFQ,K,J+ISQ)                    &
                        +F3*U(I+IPQ,K,J+ISP+ISQ)
! 
              ADV(I,K,J)=F0*V(I,K,J)                                   &
                        +F1*V(I+IVE(J)+IFP,K,J+ISP)                    &
                        +F2*V(I+IVE(J)+IFQ,K,J+ISQ)                    &
                        +F3*V(I+IPQ,K,J+ISP+ISQ)
!
            ENDDO
!
          ENDDO  !  End of K loop
!
!----------------------------------------------------------------------
!
        ENDIF upstream
!!!   call f_hpmstop(11)
!
!----------------------------------------------------------------------
!***
!***  END OF THIS UPSTREAM REGION
!***
!----------------------------------------------------------------------
!
!***  IF THE VERTICAL CFL CRITERION IS VIOLATED THEN LOCATE LIMITS
!***  BETWEEN WHICH TO SMOOTH THE TENDENCIES.
!
!-----------------------------------------------------------------------
      DO I=MYIS1,MYIE1
        KTOP_CFL_T(I)=0
        KBOT_CFL_T(I)=0
        KTOP_CFL_U(I)=0
        KBOT_CFL_U(I)=0
        KTOP_CFL_V(I)=0
        KBOT_CFL_V(I)=0
      ENDDO
!
      DO I=MYIS1,MYIE1
        VTB(I)=0.
        VUB(I)=0.
        VVB(I)=0.
      ENDDO
!
      DO K=KTE-1,KTS,-1
      DO I=MYIS1,MYIE1
!
!***  MASS POINTS
!
        CFL=PETDT(I,K,J)*DT*HBM2(I,J)                                   &
           /(0.5*(DPDE(I,K+1,J0_00)+DPDE(I,K,J0_00)))
!
        IF(ABS(CFL).GT.CFL_MAX)THEN
          IF(KTOP_CFL_T(I).EQ.0)KTOP_CFL_T(I)=MIN(K,KTE-2)
          IF(KBOT_CFL_T(I).LT.K)KBOT_CFL_T(I)=MIN(K,KTE-2)
        ENDIF
!
!***  U COMPONENT
!
        CFL=(PETDT(I+IVW(J),K,J)+PETDT(I+IVE(J),K,J))*DT*VBM2(I,J)     &
           /((DPDE(I+IVW(J),K+1,J0_00)+DPDE(I+IVE(J),K+1,J0_00)        &
             +DPDE(I+IVW(J),K  ,J0_00)+DPDE(I+IVE(J),K  ,J0_00))*0.5)
!
        IF(ABS(CFL).GT.CFL_MAX)THEN
          IF(KTOP_CFL_U(I).EQ.0)KTOP_CFL_U(I)=MIN(K,KTE-2)
          IF(KBOT_CFL_U(I).LT.K)KBOT_CFL_U(I)=MIN(K,KTE-2)
        ENDIF
!
!***  V COMPONENT
!
        CFL=(PETDT(I,K,J-1)+PETDT(I,K,J+1))*DT*VBM2(I,J)               &
           /((DPDE(I,K+1,J0_M1)+DPDE(I,K+1,J0_P1)                      &
             +DPDE(I,K  ,J0_M1)+DPDE(I,K  ,J0_P1))*0.5)
!
        IF(ABS(CFL).GT.CFL_MAX)THEN
          IF(KTOP_CFL_V(I).EQ.0)KTOP_CFL_V(I)=MIN(K,KTE-2)
          IF(KBOT_CFL_V(I).LT.K)KBOT_CFL_V(I)=MIN(K,KTE-2)
        ENDIF
!
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!
!***  COMPUTE VERTICAL ADVECTION TENDENCIES
!
!----------------------------------------------------------------------
!
      DO K=KTE,KTS,-1
!
        DO I=MYIS,MYIE
          PETDTK(I,0)=0.
        ENDDO
!
        IF(K.GT.KTS)THEN
!
          DO I=MYIS1_P1,MYIE1_P1
            PETDTK(I,1)=PETDT(I,K-1,J+1)
            PETDTK(I,0)=PETDT(I,K-1,J)
            PETDTK(I,-1)=PETDT(I,K-1,J-1)
            TDN(I)=T(I,K-1,J)
            UDN(I)=U(I,K-1,J)
            VDN(I)=V(I,K-1,J)
          ENDDO
        ELSE
          DO I=MYIS,MYIE
            PETDTK(I,1)=0.
            PETDTK(I,0)=0.
            PETDTK(I,-1)=0.
          ENDDO
        ENDIF
!
      DO I=MYIS1,MYIE1
!
!***  TEMPERATURE
!
        T_UP=T(I,K,J)
        VTA=(TDN(I)-T_UP)*PETDTK(I,0)*F4D
        VAD_TEND_T(I,K)=(VTA+VTB(I))/DPDE(I,K,J0_00)+T_UP
        VTB(I)=VTA
!
!***  U COMPONENT
!
        U_UP=U(I,K,J)
        VUA=(UDN(I)-U_UP)                                              &
           *(PETDTK(I+IVW(J),0)+PETDTK(I+IVE(J),0))*F4D                   
        VAD_TEND_U(I,K)=(VUA+VUB(I))                                   &
                       /(DPDE(I+IVW(J),K,J0_00)                        &
                        +DPDE(I+IVE(J),K,J0_00))+U_UP
        VUB(I)=VUA
!
!***  V COMPONENT
!
        V_UP=V(I,K,J)
        VVA=(VDN(I)-V_UP)                                              &
           *(PETDTK(I,-1)+PETDTK(I,1))*F4D  
        VAD_TEND_V(I,K)=(VVA+VVB(I))                                   &
                       /(DPDE(I,K,J0_M1)+DPDE(I,K,J0_P1))+V_UP
        VVB(I)=VVA
!
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  SECOND (BACKWARD) STEP
!----------------------------------------------------------------------
!
      DO K=KTE,KTS,-1
        IF(K.GT.KTS)THEN
          DO I=MYIS1_P1,MYIE1_P1
            PETDTK(I,1)=PETDT(I,K-1,J+1)
            PETDTK(I,0)=PETDT(I,K-1,J)
            PETDTK(I,-1)=PETDT(I,K-1,J-1)
            TDN(I)=VAD_TEND_T(I,K-1)
            UDN(I)=VAD_TEND_U(I,K-1)
            VDN(I)=VAD_TEND_V(I,K-1)
          ENDDO
        ELSE
          DO I=MYIS,MYIE
            PETDTK(I,1)=0.
            PETDTK(I,0)=0.
            PETDTK(I,-1)=0.
          ENDDO
        ENDIF
!
        DO I=MYIS1,MYIE1
!
!***  TEMPERATURE
!
          T_UP=VAD_TEND_T(I,K)
          VTA=(TDN(I)-T_UP)*PETDTK(I,0)*F4D
          VAD_TEND_T(I,K)=(VTA+VTB(I))/DPDE(I,K,J0_00)
          VTB(I)=VTA
!
!***  U COMPONENT
!
          U_UP=VAD_TEND_U(I,K)
          VUA=(UDN(I)-U_UP)                                            &
             *(PETDTK(I+IVW(J),0)+PETDTK(I+IVE(J),0))*F4D
          VAD_TEND_U(I,K)=(VUA+VUB(I))                                 &
                         /(DPDE(I+IVW(J),K,J0_00)                      &
                          +DPDE(I+IVE(J),K,J0_00))
          VUB(I)=VUA
!
!***  V COMPONENT
!
          V_UP=VAD_TEND_V(I,K)
          VVA=(VDN(I)-V_UP)                                            &
             *(PETDTK(I,-1)+PETDTK(I,1))*F4D
          VAD_TEND_V(I,K)=(VVA+VVB(I))                                 &
                         /(DPDE(I,K,J0_M1)+DPDE(I,K,J0_P1))
          VVB(I)=VVA
!
        ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!
!***  IF THE CFL CRITERION IS VIOLATED THEN VERTICALLY SMOOTH
!***  THE TENDENCIES
!
!-----------------------------------------------------------------------
!
!***  TEMPERATURE
!
      DO I=MYIS1,MYIE1
!
        IF(KTOP_CFL_T(I).GT.0)THEN
          KSTART=KTOP_CFL_T(I)
          KSTOP =MIN(KBOT_CFL_T(I),KTE-1)
!
          DO K=KSTOP,KSTART,-1
            VAD_TNDX_T(K)=(VAD_TEND_T(I,K+1)+VAD_TEND_T(I,K-1)          &
                          +2.*VAD_TEND_T(I,K))*0.25
          ENDDO
!
          DO K=KSTART,KSTOP
            VAD_TEND_T(I,K)=VAD_TNDX_T(K)
          ENDDO
!
        ENDIF
!
      ENDDO
!
!***  U COMPONENT
!
      DO I=MYIS1,MYIE1
!
        IF(KTOP_CFL_U(I).GT.0)THEN
          KSTART=KTOP_CFL_U(I)
          KSTOP =MIN(KBOT_CFL_U(I),KTE-1)
!
          DO K=KSTOP,KSTART,-1
            VAD_TNDX_U(K)=(VAD_TEND_U(I,K+1)+VAD_TEND_U(I,K-1)         &
                          +2.*VAD_TEND_U(I,K))*0.25
          ENDDO
          DO K=KSTART,KSTOP
            VAD_TEND_U(I,K)=VAD_TNDX_U(K)
          ENDDO
!
        ENDIF
      ENDDO
!
!***  V COMPONENT
!
      DO I=MYIS1,MYIE1
!
        IF(KTOP_CFL_V(I).GT.0)THEN
          KSTART=KTOP_CFL_V(I)
          KSTOP =MIN(KBOT_CFL_V(I),KTE-1)
!
          DO K=KSTOP,KSTART,-1
            VAD_TNDX_V(K)=(VAD_TEND_V(I,K+1)+VAD_TEND_V(I,K-1)         &
                          +2.*VAD_TEND_V(I,K))*0.25
          ENDDO
          DO K=KSTART,KSTOP
            VAD_TEND_V(I,K)=VAD_TNDX_V(K)
          ENDDO
!
        ENDIF
      ENDDO
!
!----------------------------------------------------------------------
!
!***  NOW SUM THE VERTICAL AND HORIZONTAL TENDENCIES,
!***  CURVATURE AND CORIOLIS TERMS
!
!-----------------------------------------------------------------------
!
      DO K=KTS,KTE
      DO I=MYIS1,MYIE1
        HM=HTM(I,K,J)*HBM2(I,J)
        VM=VTM(I,K,J)*VBM2(I,J)
        ADT(I,K,J)=(VAD_TEND_T(I,K)+2.*ADT(I,K,J))*HM
!
        FPP=CURV(I,J)*2.*UST(I,K,J1_00)+F(I,J)*2.
        ADU(I,K,J)=(VAD_TEND_U(I,K)+2.*ADU(I,K,J)+VST(I,K,J1_00)*FPP)  &
                   *VM
        ADV(I,K,J)=(VAD_TEND_V(I,K)+2.*ADV(I,K,J)-UST(I,K,J1_00)*FPP)  &
                   *VM
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
      ENDDO main_integration
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***  SAVE THE OLD VALUES FOR TIMESTEPPING
!----------------------------------------------------------------------
!
      DO J=MYJS_P4,MYJE_P4
        DO K=KTS,KTE
        DO I=MYIS_P4,MYIE_P4
          TOLD(I,K,J)=T(I,K,J)
          UOLD(I,K,J)=U(I,K,J)
          VOLD(I,K,J)=V(I,K,J)
        ENDDO
        ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  FINALLY UPDATE THE PROGNOSTIC VARIABLES
!----------------------------------------------------------------------
!
      DO J=MYJS2,MYJE2
        DO K=KTS,KTE
        DO I=MYIS1,MYIE1
          T(I,K,J)=ADT(I,K,J)+T(I,K,J)
          U(I,K,J)=ADU(I,K,J)+U(I,K,J)
          V(I,K,J)=ADV(I,K,J)+V(I,K,J)
        ENDDO
        ENDDO
      ENDDO
!----------------------------------------------------------------------
      END SUBROUTINE ADVE
!----------------------------------------------------------------------
!
!**********************************************************************

      SUBROUTINE VAD2(NTSD,DT,IDTAD,DX,DY                              & 1
                     ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP               &
                     ,HBM2,LMH                                         &
                     ,Q,Q2,CWM,PETDT                                   &
                     ,N_IUP_H,N_IUP_V                                  &
                     ,N_IUP_ADH,N_IUP_ADV                              &
                     ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                      &
                     ,IHE,IHW,IVE,IVW,INDX3_WRK                        &
                     ,IDS,IDE,JDS,JDE,KDS,KDE                          &
                     ,IMS,IME,JMS,JME,KMS,KME                          &
                     ,ITS,ITE,JTS,JTE,KTS,KTE)
!**********************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .
! SUBPROGRAM:    VAD2        VERTICAL ADVECTION OF H2O SUBSTANCE AND TKE
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 96-07-19
!
! ABSTRACT:
!     VAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL AND VERTICAL
!     ADVECTION TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN
!     UPDATES THOSE VARIABLES.  AN ANTI-FILTERING TECHNIQUE IS USED.
!
! PROGRAM HISTORY LOG:
!   96-07-19  JANJIC   - ORIGINATOR
!   98-11-02  BLACK    - MODIFIED FOR DISTRIBUTED MEMORY
!   99-03-17  TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
!   02-02-06  BLACK    - CONVERTED TO WRF FORMAT
!   02-09-06  WOLFE    - MORE CONVERSION TO GLOBAL INDEXING
!
! USAGE: CALL VAD2 FROM SUBROUTINE SOLVE_RUNSTREAM
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST
!
!   OUTPUT FILES:
!       NONE
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!***********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
!
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V         &
                                              ,N_IUP_ADH,N_IUP_ADV
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V     &
                                                      ,IUP_ADH,IUP_ADV
! NMM_MAX_DIM is set in configure.wrf and must agree with
! the value of dimspec q in the Registry/Registry
      INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK
!
      INTEGER,INTENT(IN) :: IDTAD,NTSD
!
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LMH
!
      REAL,INTENT(IN) :: DT,DY,PDTOP
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: CWM,Q,Q2
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      REAL,PARAMETER :: FF1=0.525
!
      LOGICAL :: BOT,TOP
!
      INTEGER :: I,IRECV,J,JFP,JFQ,K,KOFF,LAP,LLAP
!
      INTEGER,DIMENSION(KTS:KTE) :: LA
!
      REAL*8 :: ADDT,AFRP,D2PQE,D2PQQ,D2PQW,DEP,DETAP,DPDN,DPUP,DQP    &
             ,DWP,E00,E4P,EP,EP0,HADDT,HBM2IJ                          &
             ,Q00,Q4P,QP,QP0                                           &
             ,RFACEK,RFACQK,RFACWK,RFC,RR                              &
             ,SUMNE,SUMNQ,SUMNW,SUMPE,SUMPQ,SUMPW                      &
             ,W00,W4P,WP,WP0
!
      REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK          &
                                ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
!
!**********************************************************************
!
      MYJS2   =MAX(JDS+2,JTS  )
      MYJE2   =MIN(JDE-2,JTE  )
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE1_P1=MIN(IDE-1,ITE+1)
!
!----------------------------------------------------------------------
!
      ADDT=REAL(IDTAD)*DT
!
!----------------------------------------------------------------------
!
!jm still needs to be converted
      main_integration : DO J=MYJS2,MYJE2
!
      DO I=MYIS1_P1,MYIE1_P1
!----------------------------------------------------------------------
        KOFF=KTE-LMH(I,J)
!
        E3(KTE)=Q2(I,KTE,J)*0.5
!
        DO K=KTE-1,KOFF+1,-1
          E3(K)=MAX((Q2(I,K+1,J)+Q2(I,K,J))*0.5,EPSQ2)
        ENDDO
!
        DO K=KOFF+1,KTE
          Q3(K)=MAX(Q(I,K,J),EPSQ)
          W3(K)=MAX(CWM(I,K,J),CLIMIT)
          E4(K)=E3(K)
          Q4(K)=Q3(K)
          W4(K)=W3(K)
        ENDDO
!
        PETDTK(KTE)=PETDT(I,KTE-1,J)*0.5
!
        DO K=KTE-1,KOFF+2,-1
          PETDTK(K)=(PETDT(I,K,J)+PETDT(I,K-1,J))*0.5
        ENDDO
!
        PETDTK(KOFF+1)=PETDT(I,KOFF+1,J)*0.5
!----------------------------------------------------------------------
        HADDT=-ADDT*HBM2(I,J)
!
        DO K=KTE,KOFF+1,-1
          RR=PETDTK(K)*HADDT
!
          IF(RR.LT.0.)THEN
            LAP=1
          ELSE
            LAP=-1
          ENDIF
!
          LA(K)=LAP
          LLAP=K+LAP
!
          TOP=.FALSE.
          BOT=.FALSE.
!
          IF(LLAP.GT.KOFF.AND.LLAP.LT.KTE+1.AND.LAP.NE.0)THEN
            RR=ABS(RR/((AETA1(LLAP)-AETA1(K))*PDTOP                    &
                      +(AETA2(LLAP)-AETA2(K))*PDSL(I,J)))
!
            AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
            DQP=(Q3(LLAP)-Q3(K))*RR
            DWP=(W3(LLAP)-W3(K))*RR
            DEP=(E3(LLAP)-E3(K))*RR
            DQL(K)=DQP
            DWL(K)=DWP
            DEL(K)=DEP
          ELSE
            TOP=LLAP.EQ.KTE+1
            BOT=LLAP.EQ.KOFF
!
            RR=0.
            AFR(K)=0.
            DQL(K)=0.
            DWL(K)=0.
            DEL(K)=0.
          ENDIF
        ENDDO
!----------------------------------------------------------------------
        IF(TOP)THEN
          IF(LA(KTE-1).GT.0)THEN
            RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J))            &
               /(DETA1(KTE  )*PDTOP+DETA2(KTE  )*PDSL(I,J))
            DQL(KTE)=-DQL(KTE+1)*RFC
            DWL(KTE)=-DWL(KTE+1)*RFC
            DEL(KTE)=-DEL(KTE+1)*RFC
          ENDIF
        ENDIF
!
        IF(BOT)THEN
          IF(LA(KOFF+2).LT.0)THEN
            RFC=(DETA1(KOFF+2)*PDTOP+DETA2(KOFF+2)*PDSL(I,J))          &
               /(DETA1(KOFF+1)*PDTOP+DETA2(KOFF+1)*PDSL(I,J))
            DQL(KOFF+1)=-DQL(KOFF+2)*RFC
            DWL(KOFF+1)=-DWL(KOFF+2)*RFC
            DEL(KOFF+1)=-DEL(KOFF+2)*RFC
          ENDIF
        ENDIF
!
        DO K=KOFF+1,KTE
          Q4(K)=Q3(K)+DQL(K)
          W4(K)=W3(K)+DWL(K)
          E4(K)=E3(K)+DEL(K)
        ENDDO
!----------------------------------------------------------------------
!***  ANTI-FILTERING STEP
!----------------------------------------------------------------------
        SUMPQ=0.
        SUMNQ=0.
        SUMPW=0.
        SUMNW=0.
        SUMPE=0.
        SUMNE=0.
!
!***  ANTI-FILTERING LIMITERS
!
        DO 50 K=KTE-1,KOFF+2,-1
!
        DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
!
        Q4P=Q4(K)
        W4P=W4(K)
        E4P=E4(K)
!
        LAP=LA(K)
!
        IF(LAP.NE.0)THEN
          DPDN=(AETA1(K+LAP)-AETA1(K))*PDTOP                           &
              +(AETA2(K+LAP)-AETA2(K))*PDSL(I,J)
          DPUP=(AETA1(K)-AETA1(K-LAP))*PDTOP                           &
              +(AETA2(K)-AETA2(K-LAP))*PDSL(I,J)
!
          AFRP=2.*AFR(K)*DPDN*DPDN/(DPDN+DPUP)
          D2PQQ=((Q4(K+LAP)-Q4P)/DPDN                                  &
                -(Q4P-Q4(K-LAP))/DPUP)*AFRP
          D2PQW=((W4(K+LAP)-W4P)/DPDN                                  &
                -(W4P-W4(K-LAP))/DPUP)*AFRP
          D2PQE=((E4(K+LAP)-E4P)/DPDN                                  &
                -(E4P-E4(K-LAP))/DPUP)*AFRP
        ELSE
          D2PQQ=0.
          D2PQW=0.
          D2PQE=0.
        ENDIF
!
        QP=Q4P-D2PQQ
        WP=W4P-D2PQW
        EP=E4P-D2PQE
!
        Q00=Q3(K)
        QP0=Q3(K+LAP)
!
        W00=W3(K)
        WP0=W3(K+LAP)
!
        E00=E3(K)
        EP0=E3(K+LAP)
!
        IF(LAP.NE.0)THEN
          QP=MAX(QP,MIN(Q00,QP0))
          QP=MIN(QP,MAX(Q00,QP0))
          WP=MAX(WP,MIN(W00,WP0))
          WP=MIN(WP,MAX(W00,WP0))
          EP=MAX(EP,MIN(E00,EP0))
          EP=MIN(EP,MAX(E00,EP0))
        ENDIF
!
        DQP=QP-Q00
        DWP=WP-W00
        DEP=EP-E00
!
        DQL(K)=DQP
        DWL(K)=DWP
        DEL(K)=DEP
!
        DQP=DQP*DETAP
        DWP=DWP*DETAP
        DEP=DEP*DETAP
!
        IF(DQP.GT.0.)THEN
          SUMPQ=SUMPQ+DQP
        ELSE
          SUMNQ=SUMNQ+DQP
        ENDIF
!
        IF(DWP.GT.0.)THEN
          SUMPW=SUMPW+DWP
        ELSE
          SUMNW=SUMNW+DWP
        ENDIF
!
        IF(DEP.GT.0.)THEN
          SUMPE=SUMPE+DEP
        ELSE
          SUMNE=SUMNE+DEP
        ENDIF
!
   50   CONTINUE
!----------------------------------------------------------------------
        DQL(KOFF+1)=0.
        DWL(KOFF+1)=0.
        DEL(KOFF+1)=0.
!
        DQL(KTE)=0.
        DWL(KTE)=0.
        DEL(KTE)=0.
!----------------------------------------------------------------------
!***  FIRST MOMENT CONSERVING FACTOR
!----------------------------------------------------------------------
        IF(SUMPQ.GT.1.E-9)THEN
          RFACQK=-SUMNQ/SUMPQ
        ELSE
          RFACQK=1.
        ENDIF
!
        IF(SUMPW.GT.1.E-9)THEN
          RFACWK=-SUMNW/SUMPW
        ELSE
          RFACWK=1.
        ENDIF
!
        IF(SUMPE.GT.1.E-9)THEN
          RFACEK=-SUMNE/SUMPE
        ELSE
          RFACEK=1.
        ENDIF
!
        IF(RFACQK.LT.CONSERVE_MIN.OR.RFACQK.GT.CONSERVE_MAX)RFACQK=1.
        IF(RFACWK.LT.CONSERVE_MIN.OR.RFACWK.GT.CONSERVE_MAX)RFACWK=1.
        IF(RFACEK.LT.CONSERVE_MIN.OR.RFACEK.GT.CONSERVE_MAX)RFACEK=1.
!----------------------------------------------------------------------
!***  IMPOSE CONSERVATION ON ANTI-FILTERING
!----------------------------------------------------------------------
        DO K=KTE,KOFF+1,-1
          DQP=DQL(K)
          IF(DQP.GE.0.)DQP=DQP*RFACQK
          Q(I,K,J)=Q3(K)+DQP
        ENDDO
!----------------------------------------------------------------------
        DO K=KTE,KOFF+1,-1
          DWP=DWL(K)
          IF(DWP.GE.0.)DWP=DWP*RFACWK
          CWM(I,K,J)=W3(K)+DWP
        ENDDO
!----------------------------------------------------------------------
        DO K=KTE,KOFF+1,-1
          DEP=DEL(K)
          IF(DEP.GE.0.)DEP=DEP*RFACEK
          E3(K)=E3(K)+DEP
        ENDDO
!
        HBM2IJ=HBM2(I,J)
        Q2(I,KTE,J)=MAX(E3(KTE)+E3(KTE)-EPSQ2,EPSQ2)*HBM2IJ            &
                   +Q2(I,KTE,J)*(1.-HBM2IJ)
        DO K=KTE-1,KOFF+2,-1
          Q2(I,K,J)=MAX(E3(K)+E3(K)-Q2(I,K+1,J),EPSQ2)*HBM2IJ          &
                   +Q2(I,K,J)*(1.-HBM2IJ)
        ENDDO
!----------------------------------------------------------------------
!----------------------------------------------------------------------
      ENDDO 
!
      ENDDO main_integration
!----------------------------------------------------------------------
!----------------------------------------------------------------------
      END SUBROUTINE VAD2
!----------------------------------------------------------------------
!
!**********************************************************************

      SUBROUTINE HAD2(                                                 & 1,3
#if defined(DM_PARALLEL)
                      domdesc ,                                        &
#endif
                      NTSD,DT,IDTAD,DX,DY                              &
                     ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP               &
                     ,HTM,HBM2,HBM3,LMH                                &
                     ,Q,Q2,CWM,U,V,Z,HYDRO                             &
                     ,N_IUP_H,N_IUP_V                                  &
                     ,N_IUP_ADH,N_IUP_ADV                              &
                     ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                      &
                     ,IHE,IHW,IVE,IVW,INDX3_WRK                        &
                     ,IDS,IDE,JDS,JDE,KDS,KDE                          &
                     ,IMS,IME,JMS,JME,KMS,KME                          &
                     ,ITS,ITE,JTS,JTE,KTS,KTE)
!**********************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .
! SUBPROGRAM:    HAD2        HORIZONTAL ADVECTION OF H2O AND TKE
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 96-07-19
!
! ABSTRACT:
!     HAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
!     TO THE TENDENCIES OF WATER SUBSTANCE AND TKE AND THEN
!     UPDATES THOSE VARIABLES.  AN ANTI-FILTERING TECHNIQUE IS USED.
!
! PROGRAM HISTORY LOG:
!   96-07-19  JANJIC   - ORIGINATOR
!   98-11-02  BLACK    - MODIFIED FOR DISTRIBUTED MEMORY
!   99-03-17  TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
!   02-02-06  BLACK    - CONVERTED TO WRF FORMAT
!   02-09-06  WOLFE    - MORE CONVERSION TO GLOBAL INDEXING
!   03-05-23  JANJIC   - ADDED SLOPE FACTOR
!
! USAGE: CALL ADV2 FROM SUBROUTINE SOLVE_RUNSTREAM
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST
!
!   OUTPUT FILES:
!       NONE
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
!
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V         &
                                              ,N_IUP_ADH,N_IUP_ADV
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V     &
                                                      ,IUP_ADH,IUP_ADV
! NMM_MAX_DIM is set in configure.wrf and must agree with
! the value of dimspec q in the Registry/Registry
      INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK
!
      INTEGER,INTENT(IN) :: IDTAD,NTSD
!
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LMH
!
      REAL,INTENT(IN) :: DT,DY,PDTOP
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM,U,V,Z
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: CWM,Q,Q2
!
      LOGICAL,INTENT(IN) :: HYDRO
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      REAL,PARAMETER :: FF1=0.530
#ifdef DM_PARALLEL
      integer domdesc
#endif
#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL)
      logical, external :: wrf_dm_on_monitor
      integer ii
      real, dimension(ims:ime,kms:kme,jms:jme,6) :: xsums_l
      real, dimension(ids:ide,kds:kde,jds:jde,6) :: xsums_g
#endif
!
      LOGICAL :: BOT,TOP
!
      INTEGER :: I,IRECV,J,JFP,JFQ,K,KOFF,LAP,LLAP
!
      INTEGER,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: IFPA,IFPF          &
                                                   ,IFQA,IFQF          &
                                                   ,JFPA,JFPF          &
                                                   ,JFQA,JFQF
!
      REAL :: ADDT,AFRP,CRIT,D2PQE,D2PQQ,D2PQW,DEP,DESTIJ,DQP,DQSTIJ   &
             ,DVOLP,DWP,DWSTIJ,DZA,DZB,E00,E0Q,E1X,E2IJ,E4P,ENH,EP,EP0 &
             ,ESTIJ,FPQ,HAFP,HAFQ,HBM2IJ,HM,HTMIKJ,PP,PPQ00,Q00,Q0Q    &
             ,Q1IJ,Q4P,QP,QP0,QSTIJ,RDY,RFACEK,RFACQK,RFACWK,RFC       &
             ,RFEIJ,RFQIJ,RFWIJ,RR,SLOPAC,SPP,SQP,SSA,SSB,SUMNE,SUMNQ  &
             ,SUMNW,SUMPE,SUMPQ,SUMPW,TTA,TTB,W00,W0Q,W1IJ,W4P,WP,WP0  &
             ,WSTIJ
!
      DOUBLE PRECISION,DIMENSION(6,KTE-KTS+1) :: GSUMS,XSUMS
!
      REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4                 &
                                ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
!
      REAL,DIMENSION(IMS:IME,JMS:JME) :: DARE,EMH
!
      REAL,DIMENSION(ITS-5:ITE+5,KTS:KTE,JTS-5:JTE+5) :: AFP,AFQ,DEST,DQST     &
                                                ,DVOL,DWST,E1,E2       &
                                                ,Q1,W1
!
!**********************************************************************
!
!----------------------------------------------------------------------
      MYIS    =MAX(IDS  ,ITS  )
      MYIE    =MIN(IDE  ,ITE  )
      MYJS    =MAX(JDS  ,JTS  )
      MYJE    =MIN(JDE  ,JTE  )
!
      MYIS1   =MAX(IDS+1,ITS  )
      MYIE1   =MIN(IDE-1,ITE  )
      MYJS2   =MAX(JDS+2,JTS  )
      MYJE2   =MIN(JDE-2,JTE  )
!
      MYIS_P2 =MAX(IDS  ,ITS-2)
      MYIE_P2 =MIN(IDE  ,ITE+2)
      MYJS_P3 =MAX(JDS  ,JTS-3)
      MYJE_P3 =MIN(JDE  ,JTE+3)
!
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE1_P1=MIN(IDE-1,ITE+1)
      MYJS2_P1=MAX(JDS+2,JTS-1)
      MYJE2_P1=MIN(JDE-2,JTE+1)
!
!----------------------------------------------------------------------
!
      RDY=1./DY
      SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
      CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
!
      ADDT=REAL(IDTAD)*DT
      ENH=ADDT/(08.*DY)
!
!----------------------------------------------------------------------
      DO J=MYJS_P3,MYJE_P3
      DO I=MYIS_P2,MYIE_P2
        EMH (I,J)=ADDT/(08.*DX(I,J))
        DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
        E1(I,KTE,J)=MAX(Q2(I,KTE,J)*0.5,EPSQ2)
        E2(I,KTE,J)=E1(I,KTE,J)
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!
      DO J=MYJS_P3,MYJE_P3
        DO K=KTS,KTE
        DO I=MYIS_P2,MYIE_P2
          DVOL(I,K,J)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
          HTMIKJ=HTM(I,K,J)
          Q  (I,K,J)=MAX(Q  (I,K,J),EPSQ)*HTMIKJ
          CWM(I,K,J)=MAX(CWM(I,K,J),CLIMIT)*HTMIKJ
          Q1  (I,K,J)=Q  (I,K,J)
          W1  (I,K,J)=CWM(I,K,J)
        ENDDO
        ENDDO
!
        DO K=KTE-1,KTS,-1
        DO I=MYIS_P2,MYIE_P2
          E1X=(Q2(I,K+1,J)+Q2(I,K,J))*0.5
          E1(I,K,J)=MAX(E1X,EPSQ2)
          E2(I,K,J)=E1(I,K,J)
        ENDDO
        ENDDO
!
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS2_P1,MYJE2_P1
      DO K=KTS,KTE
      DO I=MYIS1_P1,MYIE1_P1
!
        TTA=(U(I,K,J-1)+U(I+IHW(J),K,J)+U(I+IHE(J),K,J)+U(I,K,J+1))    &
            *EMH(I,J)*HBM2(I,J)
        TTB=(V(I,K,J-1)+V(I+IHW(J),K,J)+V(I+IHE(J),K,J)+V(I,K,J+1))    &
            *ENH*HBM2(I,J)
!
        SPP=-TTA-TTB
        SQP= TTA-TTB
!
        IF(SPP.LT.0.)THEN
          JFP=-1
        ELSE
          JFP=1
        ENDIF
        IF(SQP.LT.0.)THEN
          JFQ=-1
        ELSE
          JFQ=1
        ENDIF
!
        IFPA(I,K,J)=IHE(J)+I+( JFP-1)/2
        IFQA(I,K,J)=IHE(J)+I+(-JFQ-1)/2
!
        JFPA(I,K,J)=J+JFP
        JFQA(I,K,J)=J+JFQ
!
        IFPF(I,K,J)=IHE(J)+I+(-JFP-1)/2
        IFQF(I,K,J)=IHE(J)+I+( JFQ-1)/2
!
        JFPF(I,K,J)=J-JFP
        JFQF(I,K,J)=J-JFQ
!
!-----------------------------------------------------------------------
        IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
          DZA=(Z(IFPA(I,K,J),K,JFPA(I,K,J))-Z(I,K,J))*RDY
          DZB=(Z(IFQA(I,K,J),K,JFQA(I,K,J))-Z(I,K,J))*RDY
!
          IF(ABS(DZA).GT.SLOPAC)THEN
            SSA=DZA*SPP
            IF(SSA.GT.CRIT)THEN
              SPP=0. !spp*.1
            ENDIF
          ENDIF
!
          IF(ABS(DZB).GT.SLOPAC)THEN
            SSB=DZB*SQP
            IF(SSB.GT.CRIT)THEN
              SQP=0. !sqp*.1
            ENDIF
          ENDIF
!
        ENDIF
!-----------------------------------------------------------------------
        SPP=SPP*HTM(IFPA(I,K,J),K,JFPA(I,K,J))
        SQP=SQP*HTM(IFQA(I,K,J),K,JFQA(I,K,J))
        FPQ=SPP*SQP*HTM(I,K,J-2)*HTM(I-1,K,J)                           &
                   *HTM(I+1,K,J)*HTM(I,K,J+2)*0.25
        PP=ABS(SPP)
        QP=ABS(SQP)
!
        AFP(I,K,J)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
        AFQ(I,K,J)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
!
        Q1(I,K,J)=(Q  (IFPA(I,K,J),K,JFPA(I,K,J))-Q  (I,K,J))*PP       &
                 +(Q  (IFQA(I,K,J),K,JFQA(I,K,J))-Q  (I,K,J))*QP       &
                 +(Q  (I,K,J-2)+Q  (I,K,J+2)                           &
                  -Q  (I-1,K,J)-Q  (I+1,K,J))*FPQ                      &
                 +Q(I,K,J)
!
        W1(I,K,J)=(CWM(IFPA(I,K,J),K,JFPA(I,K,J))-CWM(I,K,J))*PP       &
                 +(CWM(IFQA(I,K,J),K,JFQA(I,K,J))-CWM(I,K,J))*QP       &
                 +(CWM(I,K,J-2)+CWM(I,K,J+2)                           &
                  -CWM(I-1,K,J)-CWM(I+1,K,J))*FPQ                      &
                 +CWM(I,K,J)
!
        E2(I,K,J)=(E1 (IFPA(I,K,J),K,JFPA(I,K,J))-E1 (I,K,J))*PP       &
                 +(E1 (IFQA(I,K,J),K,JFQA(I,K,J))-E1 (I,K,J))*QP       &
                 +(E1 (I,K,J-2)+E1 (I,K,J+2)                           &
                  -E1 (I-1,K,J)-E1 (I+1,K,J))*FPQ                      &
                 +E1(I,K,J)
!
      ENDDO
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  ANTI-FILTERING STEP
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
        XSUMS(1,K)=0.
        XSUMS(2,K)=0.
        XSUMS(3,K)=0.
        XSUMS(4,K)=0.
        XSUMS(5,K)=0.
        XSUMS(6,K)=0.
      ENDDO
!
!-------------ANTI-FILTERING LIMITERS----------------------------------
!
#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL)
      xsums_l = 0
      xsums_g = 0
#endif
      DO 150 J=MYJS2,MYJE2
      DO 150 K=KTS,KTE
      DO 150 I=MYIS1,MYIE1
!
      DVOLP=DVOL(I,K,J)
      Q1IJ =Q1(I,K,J)
      W1IJ =W1(I,K,J)
      E2IJ =E2(I,K,J)
!
      HAFP=HTM(IFPF(I,K,J),K,JFPF(I,K,J))*AFP(I,K,J)
      HAFQ=HTM(IFQF(I,K,J),K,JFQF(I,K,J))*AFQ(I,K,J)
!
      D2PQQ=(Q1(IFPA(I,K,J),K,JFPA(I,K,J))-Q1IJ                        &
            -Q1IJ+Q1(IFPF(I,K,J),K,JFPF(I,K,J)))                       &
            *HAFP                                                      &
           +(Q1(IFQA(I,K,J),K,JFQA(I,K,J))-Q1IJ                        &
            -Q1IJ+Q1(IFQF(I,K,J),K,JFQF(I,K,J)))                       &
            *HAFQ
!
      D2PQW=(W1(IFPA(I,K,J),K,JFPA(I,K,J))-W1IJ                        &
            -W1IJ+W1(IFPF(I,K,J),K,JFPF(I,K,J)))                       &
            *HAFP                                                      &
           +(W1(IFQA(I,K,J),K,JFQA(I,K,J))-W1IJ                        &
            -W1IJ+W1(IFQF(I,K,J),K,JFQF(I,K,J)))                       &
            *HAFQ
!
      D2PQE=(E2(IFPA(I,K,J),K,JFPA(I,K,J))-E2IJ                        &
            -E2IJ+E2(IFPF(I,K,J),K,JFPF(I,K,J)))                       &
            *HAFP                                                      &
           +(E2(IFQA(I,K,J),K,JFQA(I,K,J))-E2IJ                        &
            -E2IJ+E2(IFQF(I,K,J),K,JFQF(I,K,J)))                       &
            *HAFQ
!
      QSTIJ=Q1IJ-D2PQQ
      WSTIJ=W1IJ-D2PQW
      ESTIJ=E2IJ-D2PQE
!
      Q00=Q  (I          ,K          ,J)
      QP0=Q  (IFPA(I,K,J),K,JFPA(I,K,J))
      Q0Q=Q  (IFQA(I,K,J),K,JFQA(I,K,J))
!
      W00=CWM(I          ,K          ,J)
      WP0=CWM(IFPA(I,K,J),K,JFPA(I,K,J))
      W0Q=CWM(IFQA(I,K,J),K,JFQA(I,K,J))
!
      E00=E1 (I          ,K          ,J)
      EP0=E1 (IFPA(I,K,J),K,JFPA(I,K,J))
      E0Q=E1 (IFQA(I,K,J),K,JFQA(I,K,J))
!
      QSTIJ=MAX(QSTIJ,MIN(Q00,QP0,Q0Q))
      QSTIJ=MIN(QSTIJ,MAX(Q00,QP0,Q0Q))
      WSTIJ=MAX(WSTIJ,MIN(W00,WP0,W0Q))
      WSTIJ=MIN(WSTIJ,MAX(W00,WP0,W0Q))
      ESTIJ=MAX(ESTIJ,MIN(E00,EP0,E0Q))
      ESTIJ=MIN(ESTIJ,MAX(E00,EP0,E0Q))
!
      DQSTIJ=QSTIJ-Q(I,K,J)
      DWSTIJ=WSTIJ-CWM(I,K,J)
      DESTIJ=ESTIJ-E1(I,K,J)
!
      DQST(I,K,J)=DQSTIJ
      DWST(I,K,J)=DWSTIJ
      DEST(I,K,J)=DESTIJ
!
      DQSTIJ=DQSTIJ*DVOLP
      DWSTIJ=DWSTIJ*DVOLP
      DESTIJ=DESTIJ*DVOLP
!
#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL)
      do ii = 1,6
      xsums_l(i,k,j,ii) = 0
      enddo
      IF(DQSTIJ.GT.0.)THEN
        XSUMS_l(i,K,j,1)=DQSTIJ
      ELSE
        XSUMS_l(i,K,j,2)=DQSTIJ
      ENDIF
!
      IF(DWSTIJ.GT.0.)THEN
        XSUMS_l(i,K,j,3)=DWSTIJ
      ELSE
        XSUMS_l(i,K,j,4)=DWSTIJ
      ENDIF
!
      IF(DESTIJ.GT.0.)THEN
        XSUMS_l(i,K,j,5)=DESTIJ
      ELSE
        XSUMS_l(i,K,j,6)=DESTIJ
      ENDIF
#else
      IF(DQSTIJ.GT.0.)THEN
        XSUMS(1,K)=XSUMS(1,K)+DQSTIJ
      ELSE
        XSUMS(2,K)=XSUMS(2,K)+DQSTIJ
      ENDIF
!
      IF(DWSTIJ.GT.0.)THEN
        XSUMS(3,K)=XSUMS(3,K)+DWSTIJ
      ELSE
        XSUMS(4,K)=XSUMS(4,K)+DWSTIJ
      ENDIF
!
      IF(DESTIJ.GT.0.)THEN
        XSUMS(5,K)=XSUMS(5,K)+DESTIJ
      ELSE
        XSUMS(6,K)=XSUMS(6,K)+DESTIJ
      ENDIF
#endif
!
  150 CONTINUE
#if defined(BIT_FOR_BIT) && defined(DM_PARALLEL)
      do ii = 1,6
        CALL WRF_PATCH_TO_GLOBAL_REAL( XSUMS_L(IMS,KMS,JMS,II),        &
                                       XSUMS_G(1,1,1,ii), domdesc,     &
                                       'xyz','xzy', &
                                       ids,ide,kds,kde,jds,jde, &
                                       ims,ime,kms,kme,jms,jme, &
                                       its,ite,kts,kte,jts,jte )
      enddo
      gsums = 0.
      if ( wrf_dm_on_monitor() ) then
        do ii = 1,6
        do j = jds,jde
        do k = kds,kde
        do i = ids,ide
          gsums(ii,k) = gsums(ii,k) + XSUMS_G(i,k,j,ii)
        enddo
        enddo
        enddo
        enddo
      endif
      call wrf_dm_bcast_bytes( gsums, 2*RWORDSIZE*6*(kde-kds+1) )

#else
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***  GLOBAL REDUCTION
!----------------------------------------------------------------------
!
# ifdef DM_PARALLEL
      CALL wrf_get_dm_communicator ( mpi_comm_comp )
      CALL MPI_ALLREDUCE(XSUMS,GSUMS,6*(KTE-KTS+1)                     &
                        ,MPI_DOUBLE_PRECISION,MPI_SUM                  &
                        ,MPI_COMM_COMP,IRECV)
# else
      GSUMS = XSUMS
# endif
#endif
!
!----------------------------------------------------------------------
!***  END OF GLOBAL REDUCTION
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
!
!----------------------------------------------------------------------
        SUMPQ=GSUMS(1,K)
        SUMNQ=GSUMS(2,K)
        SUMPW=GSUMS(3,K)
        SUMNW=GSUMS(4,K)
        SUMPE=GSUMS(5,K)
        SUMNE=GSUMS(6,K)
!
!----------------------------------------------------------------------
!***  FIRST MOMENT CONSERVING FACTOR
!----------------------------------------------------------------------
!
        IF(SUMPQ.GT.1.)THEN
          RFACQK=-SUMNQ/SUMPQ
        ELSE
          RFACQK=1.
        ENDIF
!
        IF(SUMPW.GT.1.)THEN
          RFACWK=-SUMNW/SUMPW
        ELSE
          RFACWK=1.
        ENDIF
!
        IF(SUMPE.GT.1.)THEN
          RFACEK=-SUMNE/SUMPE
        ELSE
          RFACEK=1.
        ENDIF
!
        IF(RFACQK.LT.CONSERVE_MIN.OR.RFACQK.GT.CONSERVE_MAX)RFACQK=1.
        IF(RFACWK.LT.CONSERVE_MIN.OR.RFACWK.GT.CONSERVE_MAX)RFACWK=1.
        IF(RFACEK.LT.CONSERVE_MIN.OR.RFACEK.GT.CONSERVE_MAX)RFACEK=1.
!
        RFACQ(K)=RFACQK
        RFACW(K)=RFACWK
        RFACE(K)=RFACEK
!
      ENDDO
!
!----------------------------------------------------------------------
!***  IMPOSE CONSERVATION ON ANTI-FILTERING
!----------------------------------------------------------------------
      DO J=MYJS2,MYJE2
        DO K=KTS,KTE
          RFACQK=RFACQ(K)
          IF(RFACQK.LT.1.)THEN
            DO I=MYIS1,MYIE1
              DQSTIJ=DQST(I,K,J)
              RFQIJ=HBM2(I,J)*(RFACQK-1.)+1.
              IF(DQSTIJ.GE.0.)DQSTIJ=DQSTIJ*RFQIJ
              Q  (I,K,J)=Q(I,K,J)+DQSTIJ
            ENDDO
          ELSE
            DO I=MYIS1,MYIE1
              DQSTIJ=DQST(I,K,J)
              RFQIJ=HBM2(I,J)*(RFACQK-1.)+1.
              IF(DQSTIJ.LT.0.)DQSTIJ=DQSTIJ/RFQIJ
              Q  (I,K,J)=Q(I,K,J)+DQSTIJ
            ENDDO
          ENDIF
        ENDDO
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS2,MYJE2
        DO K=KTS,KTE
          RFACWK=RFACW(K)
          IF(RFACWK.LT.1.)THEN
            DO I=MYIS1,MYIE1
              DWSTIJ=DWST(I,K,J)
              RFWIJ=HBM2(I,J)*(RFACWK-1.)+1.
              IF(DWSTIJ.GE.0.)DWSTIJ=DWSTIJ*RFWIJ
              CWM(I,K,J)=CWM(I,K,J)+DWSTIJ
            ENDDO
          ELSE
            DO I=MYIS1,MYIE1
              DWSTIJ=DWST(I,K,J)
              RFWIJ=HBM2(I,J)*(RFACWK-1.)+1.
              IF(DWSTIJ.LT.0.)DWSTIJ=DWSTIJ/RFWIJ
              CWM(I,K,J)=CWM(I,K,J)+DWSTIJ
            ENDDO
          ENDIF
        ENDDO
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS2,MYJE2
        DO K=KTS,KTE
          RFACEK=RFACE(K)
          IF(RFACEK.LT.1.)THEN
            DO I=MYIS1,MYIE1
              DESTIJ=DEST(I,K,J)
              RFEIJ=HBM2(I,J)*(RFACEK-1.)+1.
              IF(DESTIJ.GE.0.)DESTIJ=DESTIJ*RFEIJ
              E1 (I,K,J)=E1 (I,K,J)+DESTIJ
            ENDDO
          ELSE
            DO I=MYIS1,MYIE1
              DESTIJ=DEST(I,K,J)
              RFEIJ=HBM2(I,J)*(RFACEK-1.)+1.
              IF(DESTIJ.LT.0.)DESTIJ=DESTIJ/RFEIJ
              E1 (I,K,J)=E1 (I,K,J)+DESTIJ
            ENDDO
          ENDIF
        ENDDO
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS,MYJE
      DO K=KTS,KTE
      DO I=MYIS,MYIE
        Q  (I,K,J)=MAX(Q  (I,K,J),EPSQ)*HTM(I,K,J)
        CWM(I,K,J)=MAX(CWM(I,K,J),CLIMIT)*HTM(I,K,J)
      ENDDO
      ENDDO
      ENDDO
!
      DO J=MYJS,MYJE
      DO I=MYIS,MYIE
        Q2(I,KTE,J)=MAX(E1(I,KTE,J)+E1(I,KTE,J)-EPSQ2,EPSQ2)           &
                   *HTM(I,KTE,J)
      ENDDO
      ENDDO
!
      DO J=MYJS,MYJE
      DO K=KTE-1,KTS+1,-1
      DO I=MYIS,MYIE
        KOFF=KTE-LMH(I,J)
        IF(K.GT.KOFF+1)THEN
          Q2(I,K,J)=MAX(E1(I,K,J)+E1(I,K,J)-Q2(I,K+1,J),EPSQ2)         &
                   *HTM(I,K,J)
        ELSE
          Q2(I,K,J)=Q2(I,K+1,J)
        ENDIF
      ENDDO
      ENDDO
      ENDDO
!----------------------------------------------------------------------
      END SUBROUTINE HAD2
!----------------------------------------------------------------------
!**********************************************************************

      SUBROUTINE VAD2_DRY(NTSD,DT,IDTAD,DX,DY                          &
                         ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP           &
                         ,HBM2,LMH                                     &
                         ,Q2,PETDT                                     &
                         ,N_IUP_H,N_IUP_V                              &
                         ,N_IUP_ADH,N_IUP_ADV                          &
                         ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                  &
                         ,IHE,IHW,IVE,IVW,INDX3_WRK                    &
                         ,IDS,IDE,JDS,JDE,KDS,KDE                      &
                         ,IMS,IME,JMS,JME,KMS,KME                      &
                         ,ITS,ITE,JTS,JTE,KTS,KTE)
!**********************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .
! SUBPROGRAM:    VAD2_DRY    VERTICAL ADVECTION OF TKE
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 96-07-19
!
! ABSTRACT:
!     VAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL AND VERTICAL
!     ADVECTION TO THE TENDENCY OF TKE AND THEN UPDATES IT.
!     AN ANTI-FILTERING TECHNIQUE IS USED.
!
! PROGRAM HISTORY LOG:
!   96-07-19  JANJIC   - ORIGINATOR
!   98-11-02  BLACK    - MODIFIED FOR DISTRIBUTED MEMORY
!   99-03-17  TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
!   02-02-06  BLACK    - CONVERTED TO WRF FORMAT
!   02-09-06  WOLFE    - MORE CONVERSION TO GLOBAL INDEXING
!
! USAGE: CALL VAD2_DRY FROM SUBROUTINE DIGITAL_FILTER
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST
!
!   OUTPUT FILES:
!       NONE
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!***********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
!
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V         &
                                              ,N_IUP_ADH,N_IUP_ADV
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V     &
                                                      ,IUP_ADH,IUP_ADV
! NMM_MAX_DIM is set in configure.wrf and must agree with
! the value of dimspec q in the Registry/Registry
      INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK
!
      INTEGER,INTENT(IN) :: IDTAD,NTSD
!
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LMH
!
      REAL,INTENT(IN) :: DT,DY,PDTOP
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,PDSL
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: Q2
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      REAL,PARAMETER :: FF1=0.525
!
      LOGICAL :: BOT,TOP
!
      INTEGER :: I,IRECV,J,JFP,JFQ,K,KOFF,LAP,LLAP
!
      INTEGER,DIMENSION(KTS:KTE) :: LA
!
      REAL :: ADDT,AFRP,D2PQE,DEP,DETAP,DPDN,DPUP,DQP                  &
             ,DWP,E00,E4P,EP,EP0,HADDT,HBM2IJ                          &
             ,RFACEK,RFC,RR,SUMNE,SUMPE
!
      REAL,DIMENSION(KTS:KTE) :: AFR,DEL,E3,E4,PETDTK,RFACE
!
!**********************************************************************
!
!----------------------------------------------------------------------
      MYJS2   =MAX(JDS+2,JTS  )     !jw
      MYJE2   =MIN(JDE-2,JTE  )
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE1_P1=MIN(IDE-1,ITE+1)
!
!----------------------------------------------------------------------
!
      ADDT=REAL(IDTAD)*DT
!
!----------------------------------------------------------------------
!
      main_integration : DO J=MYJS2,MYJE2
!
      DO I=MYIS1_P1,MYIE1_P1
!----------------------------------------------------------------------
        KOFF=KTE-LMH(I,J)
!
        E3(KTE)=Q2(I,KTE,J)*0.5
!
        DO K=KTE-1,KOFF+1,-1
          E3(K)=MAX((Q2(I,K+1,J)+Q2(I,K,J))*0.5,EPSQ2)
        ENDDO
!
        DO K=KOFF+1,KTE
          E4(K)=E3(K)
        ENDDO
!
        PETDTK(KTE)=PETDT(I,KTE-1,J)*0.5
!
        DO K=KTE-1,KOFF+2,-1
          PETDTK(K)=(PETDT(I,K+1,J)+PETDT(I,K,J))*0.5
        ENDDO
!
        PETDTK(KOFF+1)=PETDT(I,KOFF+1,J)*0.5
!----------------------------------------------------------------------
        HADDT=-ADDT*HBM2(I,J)
!
        DO K=KTE,KOFF+1,-1
          RR=PETDTK(K)*HADDT
!
          IF(RR.LT.0.)THEN
            LAP=1
          ELSE
            LAP=-1
          ENDIF
!
          LA(K)=LAP
          LLAP=K+LAP
!
          TOP=.FALSE.
          BOT=.FALSE.
!
          IF(LLAP.GT.0.AND.LLAP.LT.KTE+1.AND.LAP.NE.0)THEN
            RR=ABS(RR/((AETA1(LLAP)-AETA1(K))*PDTOP                    &
                      +(AETA2(LLAP)-AETA2(K))*PDSL(I,J)))
!
            AFR(K)=(((FF4*RR+FF3)*RR+FF2)*RR+FF1)*RR
            DEP=(E3(LLAP)-E3(K))*RR
            DEL(K)=DEP
          ELSE
            TOP=LLAP.EQ.KTE+1
            BOT=LLAP.EQ.KOFF
!
            RR=0.
            AFR(K)=0.
            DEL(K)=0.
          ENDIF
        ENDDO
!----------------------------------------------------------------------
        IF(TOP)THEN
          IF(LA(KTE-1).LT.0)THEN
            RFC=(DETA1(KTE-1)*PDTOP+DETA2(KTE-1)*PDSL(I,J))            &
               /(DETA1(KTE  )*PDTOP+DETA2(KTE  )*PDSL(I,J))
            DEL(KTE)=-DEL(KTE+1)*RFC
          ENDIF
        ENDIF
!
        IF(BOT)THEN
          IF(LA(KOFF+2).LT.0)THEN
            RFC=(DETA1(KOFF+2)*PDTOP+DETA2(KOFF+2)*PDSL(I,J))          &
               /(DETA1(KOFF+1)*PDTOP+DETA2(KOFF+1)*PDSL(I,J))
            DEL(KOFF+1)=-DEL(KOFF+2)*RFC
          ENDIF
        ENDIF
!
        DO K=KOFF+1,KTE
          E4(K)=E3(K)+DEL(K)
        ENDDO
!----------------------------------------------------------------------
!***  ANTI-FILTERING STEP
!----------------------------------------------------------------------
        SUMPE=0.
        SUMNE=0.
!
!***  ANTI-FILTERING LIMITERS
!
        DO 50 K=KTE-1,KOFF+2,-1
!
        DETAP=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
!
        E4P=E4(K)
!
        LAP=LA(K)
!
        IF(LAP.NE.0)THEN
          DPDN=(AETA1(K+LAP)-AETA1(K))*PDTOP                           &
              +(AETA2(K+LAP)-AETA2(K))*PDSL(I,J)
          DPUP=(AETA1(K)-AETA1(K-LAP))*PDTOP                           &
              +(AETA2(K)-AETA2(K-LAP))*PDSL(I,J)
!
          AFRP=2.*AFR(K)*DPDN*DPDN/(DPDN+DPUP)
          D2PQE=((E4(K+LAP)-E4P)/DPDN                                  &
                -(E4P-E4(K-LAP))/DPUP)*AFRP
        ELSE
          D2PQE=0.
        ENDIF
!
        EP=E4P-D2PQE
!
        E00=E3(K)
        EP0=E3(K+LAP)
!
        IF(LAP.NE.0)THEN
          EP=MAX(EP,MIN(E00,EP0))
          EP=MIN(EP,MAX(E00,EP0))
        ENDIF
!
        DEP=EP-E00
!
        DEL(K)=DEP
!
        DEP=DEP*DETAP
!
        IF(DEP.GT.0.)THEN
          SUMPE=SUMPE+DEP
        ELSE
          SUMNE=SUMNE+DEP
        ENDIF
!
   50   CONTINUE
!----------------------------------------------------------------------
        DEL(KTE)=0.
!
        DEL(KOFF+1)=0.
!----------------------------------------------------------------------
!***  FIRST MOMENT CONSERVING FACTOR
!----------------------------------------------------------------------
        IF(SUMPE.GT.1.E-9)THEN
          RFACEK=-SUMNE/SUMPE
        ELSE
          RFACEK=1.
        ENDIF
!
        IF(RFACEK.LT.CONSERVE_MIN.OR.RFACEK.GT.CONSERVE_MAX)RFACEK=1.
!----------------------------------------------------------------------
!***  IMPOSE CONSERVATION ON ANTI-FILTERING
!----------------------------------------------------------------------
        DO K=KOFF+1,KTE
          DEP=DEL(K)
          IF(DEP.GE.0.)DEP=DEP*RFACEK
          E3(K)=E3(K)+DEP
        ENDDO
!
        HBM2IJ=HBM2(I,J)
        Q2(I,KTE,J)=MAX(E3(KTE)+E3(KTE)-EPSQ2,EPSQ2)*HBM2IJ            &
                   +Q2(I,KTE,J)*(1.-HBM2IJ)
        DO K=KTE-1,KOFF+2
          Q2(I,K,J)=MAX(E3(K)+E3(K)-Q2(I,K+1,J),EPSQ2)*HBM2IJ          &
                   +Q2(I,K,J)*(1.-HBM2IJ)
        ENDDO
!----------------------------------------------------------------------
!----------------------------------------------------------------------
      ENDDO 
!
      ENDDO main_integration
!----------------------------------------------------------------------
!----------------------------------------------------------------------
      END SUBROUTINE VAD2_DRY
!----------------------------------------------------------------------
!
!**********************************************************************

      SUBROUTINE HAD2_DRY(NTSD,DT,IDTAD,DX,DY                          &,1
                         ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP           &
                         ,HTM,HBM2,HBM3,LMH                            &
                         ,Q2,U,V,Z,HYDRO                               &
                         ,N_IUP_H,N_IUP_V                              &
                         ,N_IUP_ADH,N_IUP_ADV                          &
                         ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                  &
                         ,IHE,IHW,IVE,IVW,INDX3_WRK                    &
                         ,IDS,IDE,JDS,JDE,KDS,KDE                      &
                         ,IMS,IME,JMS,JME,KMS,KME                      &
                         ,ITS,ITE,JTS,JTE,KTS,KTE)
!**********************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .
! SUBPROGRAM:    HAD2_DRY    HORIZONTAL ADVECTION OF TKE
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 96-07-19
!
! ABSTRACT:
!     HAD2 CALCULATES THE CONTRIBUTION OF THE HORIZONTAL ADVECTION
!     TO THE TENDENCIES OF TKE AND UPDATES IT.
!     AN ANTI-FILTERING TECHNIQUE IS USED.
!
! PROGRAM HISTORY LOG:
!   96-07-19  JANJIC   - ORIGINATOR
!   98-11-02  BLACK    - MODIFIED FOR DISTRIBUTED MEMORY
!   99-03-17  TUCCILLO - INCORPORATED MPI_ALLREDUCE FOR GLOBAL SUM
!   02-02-06  BLACK    - CONVERTED TO WRF FORMAT
!   02-09-06  WOLFE    - MORE CONVERSION TO GLOBAL INDEXING
!   03-05-23  JANJIC   - ADDED SLOPE FACTOR
!
! USAGE: CALL HAD2_DRY FROM SUBROUTINE DIGITAL_FILTER
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST
!
!   OUTPUT FILES:
!       NONE
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
!
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: IHE,IHW,IVE,IVW
      INTEGER,DIMENSION(JMS:JME),INTENT(IN) :: N_IUP_H,N_IUP_V         &
                                              ,N_IUP_ADH,N_IUP_ADV
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IUP_H,IUP_V     &
                                                      ,IUP_ADH,IUP_ADV
! NMM_MAX_DIM is set in configure.wrf and must agree with
! the value of dimspec q in the Registry/Registry
      INTEGER,DIMENSION(-3:3,NMM_MAX_DIM,0:6),INTENT(IN) :: INDX3_WRK
!
      INTEGER,INTENT(IN) :: IDTAD,NTSD
!
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LMH
!
      REAL,INTENT(IN) :: DT,DY,PDTOP
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: AETA1,AETA2,DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,HBM2,HBM3,PDSL
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM,U,V,Z
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: Q2
!
      LOGICAL,INTENT(IN) :: HYDRO
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      REAL,PARAMETER :: FF1=0.530
!
      LOGICAL :: BOT,TOP
!
      INTEGER :: I,IRECV,J,JFP,JFQ,K,KOFF,LAP,LLAP
!
      INTEGER,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: IFPA,IFPF          &
                                                   ,IFQA,IFQF          &
                                                   ,JFPA,JFPF          &
                                                   ,JFQA,JFQF
!
      REAL :: ADDT,AFRP,CRIT,D2PQE,DEP,DESTIJ,DVOLP,DZA,DZB            &
             ,E00,E0Q,E2IJ,E4P,ENH,EP,EP0,ESTIJ,FPQ                    &
             ,HAFP,HAFQ,HBM2IJ,HM,HTMIKJ,PP,PPQ00                      &
             ,QP,RDY,RFACEK,RFC,RFEIJ,RR                               &
             ,SLOPAC,SPP,SQP,SSA,SSB,SUMNE,SUMPE,TTA,TTB
!
      REAL,DIMENSION(2,KTE-KTS+1) :: GSUMS,XSUMS
!
      REAL,DIMENSION(KTS:KTE) :: AFR,DEL,E3,E4,RFACE
!
      REAL,DIMENSION(IMS:IME,JMS:JME) :: DARE,EMH
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) :: AFP,AFQ,DEST,DVOL     &
                                                ,E1,E2  
!
!**********************************************************************
!
!----------------------------------------------------------------------
      MYIS    =MAX(IDS  ,ITS  )     !jw
      MYIE    =MIN(IDE  ,ITE  )
      MYJS    =MAX(JDS  ,JTS  )
      MYJE    =MIN(JDE  ,JTE  )
!
      MYIS1   =MAX(IDS+1,ITS  )
      MYIE1   =MIN(IDE-1,ITE  )
      MYJS2   =MAX(JDS+2,JTS  )
      MYJE2   =MIN(JDE-2,JTE  )
!
      MYIS_P2 =MAX(IDS  ,ITS-2)
      MYIE_P2 =MIN(IDE  ,ITE+2)
      MYJS_P3 =MAX(JDS  ,JTS-3)
      MYJE_P3 =MIN(JDE  ,JTE+3)
!
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE1_P1=MIN(IDE-1,ITE+1)
      MYJS2_P1=MAX(JDS+2,JTS-1)
      MYJE2_P1=MIN(JDE-2,JTE+1)
!
!----------------------------------------------------------------------
      RDY=1./DY
      SLOPAC=SLOPHT*SQRT(2.)*0.5*50.
      CRIT=SLOPAC*REAL(IDTAD)*DT*RDY*1000.
!
      ADDT=REAL(IDTAD)*DT
      ENH=ADDT/(08.*DY)
!
!----------------------------------------------------------------------
      DO J=MYJS_P3,MYJE_P3
      DO I=MYIS_P2,MYIE_P2
        EMH (I,J)=ADDT/(08.*DX(I,J))
        DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
        E1(I,KTE,J)=MAX(Q2(I,KTE,J)*0.5,EPSQ2)
        E2(I,KTE,J)=E1(I,KTE,J)
      ENDDO
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS_P3,MYJE_P3
!
        DO K=KTS,KTE
        DO I=MYIS_P2,MYIE_P2
          DVOL(I,K,J)=DARE(I,J)*(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))
        ENDDO
        ENDDO
!
        DO K=KTE-1,KTS,-1
        DO I=MYIS_P2,MYIE_P2
          E1(I,K,J)=MAX((Q2(I,K+1,J)+Q2(I,K,J))*0.5,EPSQ2)
          E2(I,K,J)=E1(I,K,J)
        ENDDO
        ENDDO
!
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS2_P1,MYJE2_P1
      DO K=KTS,KTE
      DO I=MYIS1_P1,MYIE1_P1
!
        TTA=(U(I,K,J-1)+U(I+IHW(J),K,J)+U(I+IHE(J),K,J)+U(I,K,J+1))    &
            *EMH(I,J)*HBM2(I,J)
        TTB=(V(I,K,J-1)+V(I+IHW(J),K,J)+V(I+IHE(J),K,J)+V(I,K,J+1))    &
            *ENH*HBM2(I,J)
!
        SPP=-TTA-TTB
        SQP= TTA-TTB
!
        IF(SPP.LT.0.)THEN
          JFP=-1
        ELSE
          JFP=1
        ENDIF
        IF(SQP.LT.0.)THEN
          JFQ=-1
        ELSE
          JFQ=1
        ENDIF
!
        IFPA(I,K,J)=IHE(J)+I+( JFP-1)/2
        IFQA(I,K,J)=IHE(J)+I+(-JFQ-1)/2
!
        JFPA(I,K,J)=J+JFP
        JFQA(I,K,J)=J+JFQ
!
        IFPF(I,K,J)=IHE(J)+I+(-JFP-1)/2
        IFQF(I,K,J)=IHE(J)+I+( JFQ-1)/2
!
        JFPF(I,K,J)=J-JFP
        JFQF(I,K,J)=J-JFQ
!
!-----------------------------------------------------------------------
        IF(.NOT.HYDRO)THEN ! z currently not available for hydro=.true.
          DZA=(Z(IFPA(I,K,J),K,JFPA(I,K,J))-Z(I,K,J))*RDY
          DZB=(Z(IFQA(I,K,J),K,JFQA(I,K,J))-Z(I,K,J))*RDY
!
          IF(ABS(DZA).GT.SLOPAC)THEN
            SSA=DZA*SPP
            IF(SSA.GT.CRIT)THEN
              SPP=0. !spp*.1
            ENDIF
          ENDIF
!
          IF(ABS(DZB).GT.SLOPAC)THEN
            SSB=DZB*SQP
            IF(SSB.GT.CRIT)THEN
              SQP=0. !sqp*.1
            ENDIF
          ENDIF
!
        ENDIF
!-----------------------------------------------------------------------
        SPP=SPP*HTM(IFPA(I,K,J),K,JFPA(I,K,J))
        SQP=SQP*HTM(IFQA(I,K,J),K,JFQA(I,K,J))
        FPQ=SPP*SQP*HTM(I,K,J-2)*HTM(I-1,K,J)                &
                   *HTM(I+1,K,J)*HTM(I,K,J+2)*0.25
        PP=ABS(SPP)
        QP=ABS(SQP)
!
        AFP(I,K,J)=(((FF4*PP+FF3)*PP+FF2)*PP+FF1)*PP
        AFQ(I,K,J)=(((FF4*QP+FF3)*QP+FF2)*QP+FF1)*QP
!
        E2(I,K,J)=(E1 (IFPA(I,K,J),K,JFPA(I,K,J))-E1 (I,K,J))*PP       &
                 +(E1 (IFQA(I,K,J),K,JFQA(I,K,J))-E1 (I,K,J))*QP       &
                 +(E1 (I,K,J-2)+E1 (I,K,J+2)                           &
                  -E1 (I-1,K,J)-E1 (I+1,K,J))*FPQ                      &
                 +E1(I,K,J)
!
      ENDDO
      ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***  ANTI-FILTERING STEP
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
        XSUMS(1,K)=0.
        XSUMS(2,K)=0.
      ENDDO
!
!-------------ANTI-FILTERING LIMITERS----------------------------------
!
      DO 150 J=MYJS2,MYJE2
      DO 150 K=KTS,KTE
      DO 150 I=MYIS1,MYIE1
!
      DVOLP=DVOL(I,K,J)
      E2IJ =E2(I,K,J)
!
      HAFP=HTM(IFPF(I,K,J),K,JFPF(I,K,J))*AFP(I,K,J)
      HAFQ=HTM(IFQF(I,K,J),K,JFQF(I,K,J))*AFQ(I,K,J)
!
      D2PQE=(E2(IFPA(I,K,J),K,JFPA(I,K,J))-E2IJ                        &
            -E2IJ+E2(IFPF(I,K,J),K,JFPF(I,K,J)))                       &
            *HAFP                                                      &
           +(E2(IFQA(I,K,J),K,JFQA(I,K,J))-E2IJ                        &
            -E2IJ+E2(IFQF(I,K,J),K,JFQF(I,K,J)))                       &
            *HAFQ
!
      ESTIJ=E2IJ-D2PQE
!
      E00=E1 (I          ,K          ,J)
      EP0=E1 (IFPA(I,K,J),K,JFPA(I,K,J))
      E0Q=E1 (IFQA(I,K,J),K,JFQA(I,K,J))
!
      ESTIJ=MAX(ESTIJ,MIN(E00,EP0,E0Q))
      ESTIJ=MIN(ESTIJ,MAX(E00,EP0,E0Q))
!
      DESTIJ=ESTIJ-E1(I,K,J)
      DEST(I,K,J)=DESTIJ
!
      DESTIJ=DESTIJ*DVOLP
!
      IF(DESTIJ.GT.0.)THEN
        XSUMS(1,K)=XSUMS(1,K)+DESTIJ
      ELSE
        XSUMS(2,K)=XSUMS(2,K)+DESTIJ
      ENDIF
!
  150 CONTINUE
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***  GLOBAL REDUCTION
!----------------------------------------------------------------------
!
#ifdef DM_PARALLEL
      CALL wrf_get_dm_communicator ( mpi_comm_comp )
      CALL MPI_ALLREDUCE(XSUMS,GSUMS,2*(KTE-KTS+1),MPI_REAL,MPI_SUM    &
                        ,MPI_COMM_COMP,IRECV)
#else
      GSUMS = XSUMS
#endif
!
!----------------------------------------------------------------------
!***  END OF GLOBAL REDUCTION
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
!
!----------------------------------------------------------------------
        SUMPE=GSUMS(1,K)
        SUMNE=GSUMS(2,K)
!
!----------------------------------------------------------------------
!***  FIRST MOMENT CONSERVING FACTOR
!----------------------------------------------------------------------
!
        IF(SUMPE.GT.1.)THEN
          RFACEK=-SUMNE/SUMPE
        ELSE
          RFACEK=1.
        ENDIF
!
        IF(RFACEK.LT.CONSERVE_MIN.OR.RFACEK.GT.CONSERVE_MAX)RFACEK=1.
!
        RFACE(K)=RFACEK
!
      ENDDO
!
!----------------------------------------------------------------------
!***  IMPOSE CONSERVATION ON ANTI-FILTERING
!----------------------------------------------------------------------
      DO J=MYJS2,MYJE2
        DO K=KTS,KTE
          RFACEK=RFACE(K)
          IF(RFACEK.LT.1.)THEN
            DO I=MYIS1,MYIE1
              DESTIJ=DEST(I,K,J)
              RFEIJ=HBM2(I,J)*(RFACEK-1.)+1.
              IF(DESTIJ.GE.0.)DESTIJ=DESTIJ*RFEIJ
              E1 (I,K,J)=E1 (I,K,J)+DESTIJ
            ENDDO
          ELSE
            DO I=MYIS1,MYIE1
              DESTIJ=DEST(I,K,J)
              RFEIJ=HBM2(I,J)*(RFACEK-1.)+1.
              IF(DESTIJ.LT.0.)DESTIJ=DESTIJ/RFEIJ
              E1 (I,K,J)=E1 (I,K,J)+DESTIJ
            ENDDO
          ENDIF
        ENDDO
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS,MYJE
      DO I=MYIS,MYIE
        Q2(I,KTE,J)=MAX(E1(I,KTE,J)+E1(I,KTE,J)-EPSQ2,EPSQ2)           &
                   *HTM(I,KTE,J)
      ENDDO
      ENDDO
!
      DO J=MYJS,MYJE
      DO K=KTE-1,KTS+1,-1
      DO I=MYIS,MYIE
        KOFF=KTE-LMH(I,J)
        IF(K.GT.KOFF+1)THEN
          Q2(I,K,J)=MAX(E1(I,K,J)+E1(I,K,J)-Q2(I,K+1,J),EPSQ2)         &
                   *HTM(I,K,J)
        ELSE
          Q2(I,K,J)=Q2(I,K+1,J)
        ENDIF
      ENDDO
      ENDDO
      ENDDO
!----------------------------------------------------------------------
      END SUBROUTINE HAD2_DRY
!----------------------------------------------------------------------
!----------------------------------------------------------------------
      END MODULE MODULE_ADVECTION