!
!NCEP_MESO:MODEL_LAYER: NONHYDROSTATIC DYNAMICS ROUTINES
!
!----------------------------------------------------------------------
!

      MODULE MODULE_NONHY_DYNAM 2
!
!----------------------------------------------------------------------
      USE module_model_constants
      USE MODULE_MPP
!     USE MODULE_INDX
!----------------------------------------------------------------------
!
      REAL :: CAPA=R_D/CP,RG=1./G,TRG=2.*R_D/G
!
      CONTAINS
!
!**********************************************************************

      SUBROUTINE EPS(NTSD,DT,HYDRO,DX,DY,FAD                           & 1
                    ,DETA1,DETA2,PDTOP,PT                              &
                    ,HTM,HBM2,HBM3,LMH                                 &
                    ,PDSL,PDSLO,PINT,RTOP,PETDT,PDWDT                  &
                    ,DWDT,DWDTMN,DWDTMX                                &
                    ,FNS,FEW,FNE,FSE                                   &
                    ,T,U,V,W,Q,CWM                                     &
                    ,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:    EPS
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 9?-??-??
!
! ABSTRACT:
!     EPS COMPUTES THE VERTICAL AND HORIZONTAL ADVECTION OF DZ/DT
!
! PROGRAM HISTORY LOG:
!   9?-??-??  JANJIC     - ORIGINATOR
!   00-01-05  BLACK      - DISTRIBUTED MEMORY AND THREADS
!   02-02-07  BLACK      - CONVERTED TO WRF STRUCTURE
!
! USAGE: CALL EPS 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
!----------------------------------------------------------------------
#ifdef DM_PARALLEL
      INCLUDE "mpif.h"
#endif
!
!----------------------------------------------------------------------
      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
!
!***  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
!
      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: LMH
!
      REAL,INTENT(IN) :: DT,DY,PDTOP,PT
!
      REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DWDTMN,DWDTMX,DX   &
                                                   ,FAD,HBM2,HBM3      &
                                                   ,PDSL,PDSLO
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: CWM        &
                                                           ,FEW,FNE    &
                                                           ,FNS,FSE    &
                                                           ,HTM,Q      &
                                                           ,RTOP       &
                                                           ,U,V
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: DWDT    &
                                                              ,PDWDT   &
                                                              ,T
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: PINT,W
!
      LOGICAL,INTENT(IN) :: HYDRO
!
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
!----------------------------------------------------------------------
!
      INTEGER,PARAMETER :: NTSHY=2
!
      REAL,PARAMETER :: WGHT=0.35,WP=0.
!
      INTEGER,DIMENSION(KTS:KTE) :: LA
!
      INTEGER :: I,J,J4_00,J4_M1,J4_P1,J5_00,J5_M1,J6_00,J6_P1         &
                ,JEND,JJ,JKNT,JSTART,K,KOFF,LMP
!
      REAL,DIMENSION(KTS:KTE) :: B1,B2,B3,C0,CWM_K,DWDT_K,Q_K,RDPP     &
                                ,RTOP_K,T_K
!
      REAL,DIMENSION(KTS:KTE+1) :: CHI,COFF,PINT_K,PNP1,PONE,PSTR,W_K
!
      REAL,DIMENSION(its-5:ite+5,jts-5:jte+5) :: TTB
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE) :: WEW
!
      REAL :: ADDT,DELP,DETAL,DP,DPDE,DPPL,DPSTR,DPTL,DPTU             &
             ,DWDTT,EPSN,FCT,FFC,GDT,GDT2                              &
             ,HBM3IJ,HM,PP1,PSTRDN,PSTRUP,RDP,RDPDN,RDPUP,RDT          &
             ,TFC,TMP,TTAL,TTFC
!
      LOGICAL :: BOT,TOP
!
!***  TYPE 4 WORKING ARRAY (SEE PFDHT)
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE,-1:1) :: WNS
!
!***  TYPE 5 WORKING ARRAY
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE,-1:0) :: WNE
!
!***  TYPE 6 WORKING ARRAY
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE, 0:1) :: WSE
!----------------------------------------------------------------------
!**********************************************************************
!----------------------------------------------------------------------
      MYJS    =MAX(JDS  ,JTS  )
      MYJE    =MIN(JDE  ,JTE  )
      MYJS2   =MAX(JDS+2,JTS  )
      MYJE2   =MIN(JDE-2,JTE  )
      MYJS3   =MAX(JDS+3,JTS  )
      MYJE3   =MIN(JDE-3,JTE  )
      MYJS_P1 =MAX(JDS  ,JTS-1)
      MYJE_P1 =MIN(JDE  ,JTE+1)
      MYJS_P2 =MAX(JDS  ,JTS-2)
      MYJE_P2 =MIN(JDE  ,JTE+2)
!
      MYIS    =MAX(IDS  ,ITS  )
      MYIE    =MIN(IDE  ,ITE  )
      MYIS1   =MAX(IDS+1,ITS  )
      MYIE1   =MIN(IDE-1,ITE  )
      MYIS2   =MAX(IDS+2,ITS  )
      MYIE2   =MIN(IDE-2,ITE  )
      MYIS_P1 =MAX(IDS  ,ITS-1)
      MYIE_P1 =MIN(IDE  ,ITE+1)
      MYIS_P2 =MAX(IDS  ,ITS-2)
      MYIE_P2 =MIN(IDE  ,ITE+2)
      MYIS_P3 =MAX(IDS  ,ITS-3)
      MYIE_P3 =MIN(IDE  ,ITE+3)
      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)
!----------------------------------------------------------------------
      IF(NTSD.LE.NTSHY.OR.HYDRO)THEN
!***
        DO J=MYJS_P2,MYJE_P2
        DO I=MYIS_P1,MYIE_P1
          PINT(I,KTE+1,J)=PT
        ENDDO
        ENDDO
!
        DO J=MYJS_P2,MYJE_P2
          DO K=KTS,KTE
          DO I=MYIS_P1,MYIE_P1
            DWDT(I,K,J)=1.
            PDWDT(I,K,J)=1.
          ENDDO
          ENDDO
        ENDDO
!
        DO J=MYJS_P2,MYJE_P2
          DO K=KTE,KTS,-1
          DO I=MYIS_P1,MYIE_P1
            PINT(I,K,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)+PINT(I,K+1,J)
          ENDDO
          ENDDO
        ENDDO
!***
        RETURN
!***
      ENDIF
!----------------------------------------------------------------------
      ADDT=DT
      RDT=1./ADDT
!----------------------------------------------------------------------
!
!***  TIME TENDENCY
!
      DO J=MYJS_P1,MYJE_P1
        DO K=KTS,KTE
        DO I=MYIS_P1,MYIE_P1
          DWDT(I,K,J)=(W(I,K,J)-DWDT(I,K,J))*HTM(I,K,J)*HBM2(I,J)*RDT
        ENDDO
        ENDDO
      ENDDO
!
!----------------------------------------------------------------------
!***
!***  VERTICAL ADVECTION
!***
!----------------------------------------------------------------------
      DO J=MYJS2,MYJE2
      DO I=MYIS,MYIE
        TTB(I,J)=0.
      ENDDO
      ENDDO
!
      DO J=MYJS2,MYJE2
      DO K=KTE,KTS+1,-1
      DO I=MYIS,MYIE
        TTAL=(W(I,K-1,J)-W(I,K,J))*PETDT(I,K-1,J)*0.5
        DWDT(I,K,J)=(TTAL+TTB(I,J))                                    &
                   /(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J))               &
                    +DWDT(I,K,J)
        TTB(I,J)=TTAL
      ENDDO
      ENDDO
      ENDDO
!
      DO J=MYJS2,MYJE2
      DO I=MYIS1,MYIE1
        TTB(I,J)=(W(I,KTS,J)-W(I,KTS+1,J))*PETDT(I,KTS,J)*0.5
        DWDT(I,KTS,J)=TTB(I,J)/(DETA1(KTS)*PDTOP+DETA2(KTS)*PDSLO(I,J))&
                     +DWDT(I,KTS,J)
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!***
!***  END OF VERTICAL ADVECTION
!***
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***
!***  HORIZONTAL ADVECTION
!***
!----------------------------------------------------------------------
!***  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
!----------------------------------------------------------------------
!
      JSTART=MYJS3
!
      DO J=-1,0
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          WNS(I,K,J)=FNS(I,K,JJ)*(W(I,K,JJ+1)-W(I,K,JJ-1))
        ENDDO
        ENDDO
!
      ENDDO
!
      J=-1
      JJ=JSTART+J
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE1_P2
        WNE(I,K,J)=FNE(I,K,JJ)*(W(I+IHE(JJ),K,JJ+1)-W(I,K,JJ))
      ENDDO
      ENDDO
!
      J=0
      JJ=JSTART+J
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE1_P2
        WSE(I,K,J)=FSE(I,K,JJ)*(W(I+IHE(JJ),K,JJ-1)-W(I,K,JJ))
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!
      JKNT=0
      JSTART=MYJS3
      JEND  =MYJE3
!
      main_horizontal:  DO J=JSTART,JEND
!
!----------------------------------------------------------------------
!----------------------------------------------------------------------
!***
!***  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.)
!***
      JKNT=JKNT+1
!
      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)
!
!----------------------------------------------------------------------
!***  THE WORKING ARRAYS FOR THE PRIMARY VARIABLES
!----------------------------------------------------------------------
      DO K=KTS,KTE
      DO I=MYIS_P3,MYIE_P3
        WEW(I,K)=FEW(I,K,J)*(W(I+IVE(J),K,J)-W(I+IVW(J),K,J))
        WNS(I,K,J4_P1)=FNS(I,K,J+1)*(W(I,K,J+2)-W(I,K,J))
      ENDDO
      ENDDO
!
!***  DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE1_P2
        WNE(I,K,J5_00)=FNE(I,K,J)*(W(I+IHE(J),K,J+1)-W(I,K,J))
        WSE(I,K,J6_P1)=FSE(I,K,J+1)*(W(I+IHE(J+1),K,J)-W(I,K,J+1))
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!
      DO K=KTS,KTE
      DO I=MYIS2,MYIE2
        DPDE=DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J)
        DWDT(I,K,J)=-(WEW(I+IHW(J),K)      +WEW(I+IHE(J),K)            &
                     +WNS(I,K,J4_M1)       +WNS(I,K,J4_P1)             &
                     +WNE(I+IHW(J),K,J5_M1)+WNE(I,K,J5_00)             &
                     +WSE(I,K,J6_00)       +WSE(I+IHW(J),K,J6_P1))     &
                     *FAD(I,J)*HTM(I,K,J)*HBM3(I,J)/(DPDE*DT)          &
                     +DWDT(I,K,J)
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!
      ENDDO main_horizontal
!
!----------------------------------------------------------------------
!***
!***  END OF HORIZONTAL ADVECTION
!***
!----------------------------------------------------------------------
!
      DO J=MYJS,MYJE
      DO K=KTS,KTE
      DO I=MYIS,MYIE
        DWDTT=DWDT(I,K,J)*HTM(I,K,J)
        DWDTT=MAX(DWDTT,DWDTMN(I,J))
        DWDTT=MIN(DWDTT,DWDTMX(I,J))
!
        DWDT(I,K,J)=(DWDTT*RG+1.)*(1.-WP)+PDWDT(I,K,J)*WP
      ENDDO
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!
      GDT=G*DT
      GDT2=GDT*GDT
      FFC=-R_D/GDT2
!
      PONE(KTE+1)=PT
      PSTR(KTE+1)=PT
      PNP1(KTE+1)=PT
      CHI(KTE+1)=0.
!----------------------------------------------------------------------
!
      final_update:  DO J=MYJS3,MYJE3
!
      DO I=MYIS2,MYIE2
!
!----------------------------------------------------------------------
!
!***  EXTRACT COLUMNS FROM 3-D ARRAYS
!
        DO K=KTS,KTE
          CWM_K(K)=CWM(I,K,J)
          DWDT_K(K)=DWDT(I,K,J)
          Q_K(K)=Q(I,K,J)
          RTOP_K(K)=RTOP(I,K,J)
          T_K(K)=T(I,K,J)
        ENDDO
!
        DO K=KTS,KTE+1
          PINT_K(K)=PINT(I,K,J)
          W_K(K)=W(I,K,J)
        ENDDO
!----------------------------------------------------------------------
!
        KOFF=KTE-LMH(I,J)
!
        DO K=KTE,KOFF+1,-1
          CHI(K)=0.
          DPPL=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J)
          RDPP(K)=1./DPPL
          PONE(K)=PINT_K(K)
          DPSTR=DWDT_K(K)*DPPL
          PSTR(K)=PSTR(K+1)+DPSTR
          PP1=PNP1(K+1)+DPSTR
          PNP1(K)=(PP1-PONE(K))*WGHT+PONE(K)
          TFC=Q_K(K)*P608+(1.-CWM_K(K))
          TTFC=-CAPA*TFC+1.
          COFF(K)=T_K(K)*TTFC*TFC*DPPL*FFC                             &
                   /((PNP1(K+1)+PNP1(K))*(PNP1(K+1)+PNP1(K)))
        ENDDO
!----------------------------------------------------------------------
!
        PSTRUP=-(PSTR(KTE+1)+PSTR(KTE)-PONE(KTE+1)-PONE(KTE))*COFF(KTE)
!
!----------------------------------------------------------------------
        DO K=KTE-1,KOFF+1,-1
          RDPDN=RDPP(K)
          RDPUP=RDPP(K+1)
!
          PSTRDN=-(PSTR(K+1)+PSTR(K)-PONE(K+1)-PONE(K))*COFF(K)
!
          B1(K)=COFF(K+1)+RDPUP
          B2(K)=(COFF(K+1)+COFF(K))-(RDPUP+RDPDN)
          B3(K)=COFF(K)+RDPDN
          C0(K)=PSTRUP+PSTRDN
!
          PSTRUP=PSTRDN
        ENDDO
!----------------------------------------------------------------------
        B1(KTE-1)=0.
        B2(KOFF+1)=B2(KOFF+1)+B3(KOFF+1)
!----------------------------------------------------------------------
!
!***  ELIMINATION
!
        DO K=KTE-2,KOFF+1,-1
          TMP=-B1(K)/B2(K+1)
          B2(K)=B3(K+1)*TMP+B2(K)
          C0(K)=C0(K+1)*TMP+C0(K)
        ENDDO
!
        CHI(KTE+1)=0.
!----------------------------------------------------------------------
!
!***  BACK SUBSTITUTION
!
        CHI(KOFF+2)=C0(KOFF+1)/B2(KOFF+1)
        CHI(KOFF+1)=CHI(KOFF+2)
!
        DO K=KOFF+3,KTE
          CHI(K)=(-B3(K-1)*CHI(K-1)+C0(K-1))/B2(K-1)
        ENDDO
!----------------------------------------------------------------------
        HBM3IJ=HBM3(I,J)
        DPTU=0.
        FCT=0.5/CP*HBM3IJ
!
        DO K=KTE,KOFF+1,-1
          DPTL=(CHI(K)+PSTR(K)-PINT_K(K))*HBM3IJ
          PINT_K(K)=PINT_K(K)+DPTL
!     if(i.eq.61.and.j.eq.55.and.k.eq.50)then
!       write(0,33711)t_k(k),rtop_k(k),dptl,koff
!       write(0,33712)chi(k),pstr(k),pint_k(k)
!       write(0,33713)chi(k-1),pstr(k-1),pint_k(k-1)
33711   format(' t_k=',z8,' rtop_k=',z8,' dptl=',z8,' koff=',i2)
33712   format(' chi=',z8,' pstr=',z8,' pint_k=',z8)
33713   format(' chi-=',z8,' pstr-=',z8,' pint_k-=',z8)
!     endif
          T_K(K)=(DPTU+DPTL)*RTOP_K(K)*FCT+T_K(K)
          DELP=(PINT_K(K)-PINT_K(K+1))*RDPP(K)
          W_K(K)=((DELP-DWDT_K(K))*GDT+W_K(K))*HBM3IJ
          DWDT_K(K)=(DELP-1.)*HBM3IJ+1.
!
          DPTU=DPTL
        ENDDO
!----------------------------------------------------------------------
        DO K=KOFF+1,KTE
          PINT(I,K,J)=PINT_K(K)
          T(I,K,J)=T_K(K)
          W(I,K,J)=W_K(K)
          DWDT(I,K,J)=DWDT_K(K)
        ENDDO
!----------------------------------------------------------------------
!
      ENDDO
!
      ENDDO final_update
!
!----------------------------------------------------------------------
!
      END SUBROUTINE EPS
!
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!**********************************************************************

      SUBROUTINE VADZ(NTSD,DT,FIS,SIGMA,DFL,HTM,HBM2                   & 1
                     ,DETA1,DETA2,PDTOP                                &
                     ,PINT,PDSL,PDSLO,PETDT                            &
                     ,RTOP,T,Q,CWM,Z,W,DWDT,PDWDT                      &
                     ,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:    VADZ        VERTICAL ADVECTION OF HEIGHT
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 93-11-17
!     
! ABSTRACT:
!     VADV CALCULATES THE CONTRIBUTION OF THE VERTICAL ADVECTION
!     OF HEIGHT IN ORDER TO COMPUTE W=DZ/DT DIAGNOSTICALLY
!     
! PROGRAM HISTORY LOG:
!   96-05-??  JANJIC     - ORIGINATOR
!   00-01-04  BLACK      - DISTRIBUTED MEMORY AND THREADS
!   01-03-26  BLACK      - CONVERTED TO WRF STRUCTURE
!   02-02-19  BLACK      - CONVERSION UPDATED
!     
! USAGE: CALL VADZ FROM MAIN PROGRAM
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST:
!
!   OUTPUT FILES:
!     NONE
!
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
#ifdef  AS_RECEIVED
      LOGICAL,INTENT(IN) :: SIGMA
#else
      INTEGER,INTENT(IN) :: SIGMA
#endif
!
      INTEGER,INTENT(IN) :: NTSD
!
      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
!
!***  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
!
      REAL,INTENT(IN) :: DT,PDTOP
!
      REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DETA1,DETA2
!
      REAL,DIMENSION(KTS:KTE+1),INTENT(IN) :: DFL
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: FIS,HBM2,PDSL,PDSLO
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PETDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: CWM,HTM    &
                                                           ,Q,RTOP,T
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: PDWDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: DWDT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PINT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: W,Z
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
!----------------------------------------------------------------------
      INTEGER :: I,J,K
!
      REAL,DIMENSION(IMS:IME,JMS:JME) :: FNE,FSE,TTB
!
      REAL :: DZ,RDT,TTAL,ZETA
!----------------------------------------------------------------------
!**********************************************************************
!----------------------------------------------------------------------
      RDT=1./DT
!----------------------------------------------------------------------
      DO J=MYJS,MYJE
!
        DO K=KTS,KTE
        DO I=MYIS,MYIE
          PDWDT(I,K,J)=DWDT(I,K,J)
          DWDT(I,K,J)=W(I,K,J)
        ENDDO
        ENDDO
!
        DO I=MYIS,MYIE
          W(I,KTS,J)=0.
#ifdef AS_RECEIVED
          IF(SIGMA)THEN
#else
          IF(SIGMA.EQ.1)THEN
#endif
            Z(I,KTS,J)=FIS(I,J)*RG
          ELSE
            Z(I,KTS,J)=0.
          ENDIF
        ENDDO
!
        DO K=KTS,KTE
!
          ZETA=DFL(K+1)*RG
!
          DO I=MYIS,MYIE
!
            DZ=(Q(I,K,J)*P608-CWM(I,K,J)+1.)*T(I,K,J)                  &
              /(PINT(I,K+1,J)+PINT(I,K,J))                             &
              *(DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J))*TRG
            Z(I,K+1,J)=(Z(I,K,J)+DZ-ZETA)*HTM(I,K,J)+ZETA
!     if(i.eq.61.and.j.eq.55.and.k.eq.49)then
!       write(0,77401)dz,rtop(i,k,j),rg,w(i,k,j)
!       write(0,77402)deta1(k),deta2(k),pdtop,pdslo(i,j)
77401   format(' 1 dz=',z8,' rtop=',z8,' rg=',z8,' w=',z8)
77402   format(' deta1=',z8,' deta2=',z8,' pdtop=',z8,' pdslo=',z8)
!     endif
            W(I,K+1,J)=(DZ-RTOP(I,K,J)                                 &
                      *(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J))*RG)        &
                      *HTM(I,K,J)*HBM2(I,J)                            &
                      +W(I,K,J)
!
          ENDDO
        ENDDO
!
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS,MYJE
!
        DO K=KTS,KTE
        DO I=MYIS,MYIE
          Z(I,K,J)=(Z(I,K+1,J)+Z(I,K,J))*0.5
!     if(i.eq.61.and.j.eq.55.and.k.eq.50)then
!       write(0,77411)w(i,k+1,j),w(i,k,j),rdt
77411   format(' 2 w=',2(1x,z8),' rdt=',z8)
!     endif
          W(I,K,J)=(W(I,K+1,J)+W(I,K,J))*HTM(I,K,J)*HBM2(I,J)*0.5*RDT
        ENDDO
        ENDDO
!
      ENDDO
!----------------------------------------------------------------------
      DO J=MYJS,MYJE
      DO I=MYIS,MYIE
        TTB(I,J)=0.
      ENDDO
      ENDDO
!
      DO J=MYJS2,MYJE2
        DO K=KTE,KTS+1,-1
        DO I=MYIS1,MYIE1
          TTAL=(Z(I,K-1,J)-Z(I,K,J))*PETDT(I,K-1,J)*0.5
!     if(i.eq.61.and.j.eq.55.and.k.eq.50)then
!       write(0,77421)w(i,k,j),z(i,k-1,j),z(i,k,j),petdt(i,k-1,j)
!       write(0,77422)z(i,k+1,j),petdt(i,k,j)
77421   format(' 3 w=',z8,' z=',2(1x,z8),' petdt-=',z8)
77422   format(' z+=',z8,' petdt=',z8)
!     endif
          W(I,K,J)=(TTAL+TTB(I,J))/(DETA1(K)*PDTOP+DETA2(K)*PDSLO(I,J))&
                  +W(I,K,J)
          TTB(I,J)=TTAL
        ENDDO
        ENDDO
      ENDDO
!
      DO J=MYJS2,MYJE2
      DO I=MYIS1,MYIE1
        W(I,KTS,J)=TTB(I,J)/(DETA1(KTS)*PDTOP+DETA2(KTS)*PDSLO(I,J))   &
                  +W(I,KTS,J)
      ENDDO
      ENDDO
!----------------------------------------------------------------------
      END SUBROUTINE VADZ
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!**********************************************************************

      SUBROUTINE HADZ(NTSD,DT,HYDRO,HTM,HBM2,DETA1,DETA2,PDTOP         & 1
                     ,DX,DY,FAD                                        &
                     ,FEW,FNS,FNE,FSE                                  &
                     ,PDSL,U,V,W,Z                                     &
                     ,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:    HADZ        HORIZONTAL ADVECTION OF HEIGHT
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 96-05-??       
!     
! ABSTRACT:
!     HADZ CALCULATES DIAGNOSTICALLY THE CONTRIBUTION OF
!     THE HORIZONTAL ADVECTION OF HEIGHT
!     
! PROGRAM HISTORY LOG:
!   96-05-??  JANJIC     - ORIGINATOR
!   00-01-04  BLACK      - DISTRIBUTED MEMORY AND THREADS
!   01-03-26  BLACK      - CONVERTED TO WRF STRUCTURE
!
! USAGE: CALL HADZ FROM MAIN PROGRAM
!   INPUT ARGUMENT LIST:
!
!   OUTPUT ARGUMENT LIST:
!     NONE
!
!   OUTPUT FILES:
!
!   SUBPROGRAMS CALLED:
!
!     UNIQUE: NONE
!
!     LIBRARY: NONE
!
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
      LOGICAL,INTENT(IN) :: HYDRO
!
      INTEGER,INTENT(IN) :: NTSD
!
      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
!
!***  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
!
      REAL,INTENT(IN) :: DT,DY,PDTOP
!
      REAL,DIMENSION(KMS:KME-1),INTENT(IN) :: DETA1,DETA2
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: DX,FAD,HBM2,PDSL
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM,U,V
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: FEW,FNE   &
                                                            ,FNS,FSE
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: Z
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: W
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
!----------------------------------------------------------------------
      INTEGER,PARAMETER :: NTSHY=2
!
      INTEGER :: I,J,J1_00,J1_P1,J1_P2,J4_00,J4_M1,J4_P1,J5_00,J5_M1   &
                ,J6_00,J6_P1,JJ,JKNT,JSTART,K
!
      REAL :: FEWP,FNEP,FNSP,FSEP,UDY,VDX
!
      REAL,DIMENSION(IMS:IME,KTS:KTE) :: UDY_00,ZEW
!
!***  TYPE 1 WORKING ARRAY (SEE PFDHT)
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE,-2:2) :: DPDE
!
!***  TYPE 4 WORKING ARRAY 
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE,-1:1) :: UNED,USED,ZNS
!
!***  TYPE 5 WORKING ARRAY
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE,-1:0) :: ZNE
!
!***  TYPE 6 WORKING ARRAY
!
      REAL,DIMENSION(its-5:ite+5,KTS:KTE, 0:1) :: ZSE
!----------------------------------------------------------------------
!**********************************************************************
!----------------------------------------------------------------------
      IF(NTSD+1.LE.NTSHY.OR.HYDRO)THEN
        DO J=MYJS,MYJE
          DO K=KTS,KTE
          DO I=MYIS,MYIE
            W(I,K,J)=0.
          ENDDO
          ENDDO
        ENDDO
!***
        RETURN
!***
      ENDIF
!**********************************************************************
!----------------------------------------------------------------------
!***  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
!----------------------------------------------------------------------
!
      JSTART=MYJS2_P1
!
      DO J=-2,1
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          DPDE(I,K,J)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,JJ)
        ENDDO
        ENDDO
!
      ENDDO
!
      DO J=-1,0
        JJ=JSTART+J
!
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          UDY=U(I,K,JJ)*DY
          VDX=V(I,K,JJ)*DX(I,JJ)
          UNED(I,K,J)=UDY+VDX
          USED(I,K,J)=UDY-VDX
          FNSP=VDX*(DPDE(I,K,J-1)+DPDE(I,K,J+1))
          ZNS(I,K,J)=FNSP*(Z(I,K,JJ+1)-Z(I,K,JJ-1))
          FNS(I,K,JJ)=FNSP
          UDY_00(I,K)=UDY
        ENDDO
        ENDDO
!
      ENDDO
!
      J=-1
      JJ=JSTART+J
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE_P2
        FNEP=(UNED(I+IHE(JJ),K,J)+UNED(I,K,J+1))                       &
            *(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J+1))
        ZNE(I,K,J)=FNEP*(Z(I+IHE(JJ),K,JJ+1)-Z(I,K,JJ))
      ENDDO
      ENDDO
!
      J=0
      JJ=JSTART+J
!
      DO K=KTS,KTE
      DO I=MYIS_P2,MYIE_P2
        FSEP=(USED(I+IHE(JJ),K,J)+USED(I,K,J-1))                       &
            *(DPDE(I,K,J)+DPDE(I+IHE(JJ),K,J-1))
        ZSE(I,K,J)=FSEP*(Z(I+IHE(JJ),K,JJ-1)-Z(I,K,JJ))
        FSE(I,K,JJ)=FSEP
      ENDDO
      ENDDO
!----------------------------------------------------------------------
!
      JKNT=0
!
      main_integration:  DO J=MYJS2_P1,MYJE2_P1
!
!----------------------------------------------------------------------
!***
!***  SET THE 3RD INDEX IN THE WORKING ARRAYS (SEE SUBROUTINE INIT
!***                                           AND ABOVE 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.
!***  (P2 denotes +2, etc.)
!***
        JKNT=JKNT+1
!
        J1_P2=INDX3_WRK(2,JKNT,1)
        J1_P1=INDX3_WRK(1,JKNT,1)
        J1_00=INDX3_WRK(0,JKNT,1)
!
        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)
!----------------------------------------------------------------------
!
!***  MASS FLUXES AND MASS POINT ADVECTION COMPONENTS
!
!----------------------------------------------------------------------
        DO K=KTS,KTE
        DO I=MYIS_P3,MYIE_P3
          DPDE(I,K,J1_P2)=DETA1(K)*PDTOP+DETA2(K)*PDSL(I,J+2)
          UDY=U(I,K,J+1)*DY
          VDX=V(I,K,J+1)*DX(I,J+1)
!
          FEWP=UDY_00(I,K)                                             &
             *(DPDE(I+IVW(J),K,J1_00)+DPDE(I+IVE(J),K,J1_00))
          FNSP=VDX*(DPDE(I,K,J1_00)+DPDE(I,K,J1_P2))
!
          FEW(I,K,J)=FEWP
          FNS(I,K,J+1)=FNSP
!
          ZEW(I,K)=FEWP*(Z(I+IVE(J),K,J)-Z(I+IVW(J),K,J))
!     if(i.eq.61.and.j.eq.55.and.k.eq.50)then
!       write(0,77451)zew(i,k),ive(j),ivw(j),Z(I+IVE(J),K,J),Z(I+IVW(J),K,J)
!       write(0,77452)UDY_00(I,K),DPDE(I+IVW(J),K,J1_00),DPDE(I+IVE(J),K,J1_00)
77451   format(' zew=',z8,' ive=',i2,' ivw=',i2,' z=',2(1x,z8))
77452   format(' udy=',z8,' dpde=',2(1x,z8))
!     endif
          ZNS(I,K,J4_P1)=FNSP*(Z(I,K,J+2)-Z(I,K,J))
!
          UNED(I,K,J4_P1)=UDY+VDX
          USED(I,K,J4_P1)=UDY-VDX
!
          UDY_00(I,K)=UDY
        ENDDO
        ENDDO
!
!----------------------------------------------------------------------
!
!***  DIAGONAL FLUXES AND DIAGONALLY AVERAGED WIND
!
!----------------------------------------------------------------------
        DO K=KTS,KTE
        DO I=MYIS_P2,MYIE1_P2
          FNEP=(UNED(I+IHE(J),K,J4_00)+UNED(I,K,J4_P1))                &
              *(DPDE(I,K,J1_00)+DPDE(I+IHE(J),K,J1_P1))
          FNE(I,K,J)=FNEP
          ZNE(I,K,J5_00)=FNEP*(Z(I+IHE(J),K,J+1)-Z(I,K,J))
!
          FSEP=(USED(I+IHE(J+1),K,J4_P1)+USED(I,K,J4_00))              &
              *(DPDE(I,K,J1_P1)+DPDE(I+IHE(J+1),K,J1_00))
          FSE(I,K,J+1)=FSEP
          ZSE(I,K,J6_P1)=FSEP*(Z(I+IHE(J+1),K,J)-Z(I,K,J+1))
        ENDDO
        ENDDO
!
!----------------------------------------------------------------------
!
!***  ADVECTION OF Z
!
!----------------------------------------------------------------------
        DO K=KTS,KTE
        DO I=MYIS1_P1,MYIE1_P1
!     if(i.eq.61.and.j.eq.55.and.k.eq.50)then
!       write(0,72851)w(i,k,j),ihe(j),ihw(j),dpde(i,k,j1_00),fad(i,j)
!       write(0,72852)ZEW(I+IHW(J),K),ZEW(I+IHE(J),K) &
!                    ,ZNS(I,K,J4_M1),ZNS(I,K,J4_P1)
!       write(0,72853)ZNE(I+IHW(J),K,J5_M1),ZNE(I,K,J5_00) &
!                    ,ZSE(I,K,J6_00),ZSE(I+IHW(J),K,J6_P1)
72851   format(' w=',z8,' ihe=',i2,' ihw=',i2,' dpde=',z8,' fad=',z8)
72852   format(' zew=',2(1x,z8),' zns=',2(1x,z8))
72853   format(' zne=',2(1x,z8),' zse=',2(1x,z8))
!     endif
          W(I,K,J)=-(ZEW(I+IHW(J),K)+ZEW(I+IHE(J),K)                   &
                    +ZNS(I,K,J4_M1)+ZNS(I,K,J4_P1)                     &
                    +ZNE(I+IHW(J),K,J5_M1)+ZNE(I,K,J5_00)              &
                    +ZSE(I,K,J6_00)+ZSE(I+IHW(J),K,J6_P1))             &
                    *FAD(I,J)*HTM(I,K,J)*HBM2(I,J)/(DPDE(I,K,J1_00)*DT)&
                    +W(I,K,J)
        ENDDO
        ENDDO
!----------------------------------------------------------------------
!
      ENDDO main_integration
!
!----------------------------------------------------------------------
!
      END SUBROUTINE HADZ
!
!----------------------------------------------------------------------
      END MODULE MODULE_NONHY_DYNAM