!
!NCEP_MESO:MODEL_LAYER: BOUNDARY CONDITION UPDATES
!
!----------------------------------------------------------------------
!

      MODULE MODULE_BNDRY_COND 2
!
!----------------------------------------------------------------------
      USE MODULE_MPP
      USE module_state_description
!
#ifdef DM_PARALLEL
      INCLUDE "mpif.h"
#endif
!----------------------------------------------------------------------
      REAL :: D06666=0.06666666
!----------------------------------------------------------------------
!
      CONTAINS
!
!**********************************************************************

      SUBROUTINE BOCOH(NTSD,DT0,NEST,NBC,NBOCO,LAST_TIME,TSPH          & 1
                      ,LB,ETA1,ETA2,PDTOP,PT,RES,HTM                   &
                      ,PD_B,T_B,Q_B,U_B,V_B,Q2_B,CWM_B                 &
                      ,PD_BT,T_BT,Q_BT,U_BT,V_BT,Q2_BT,CWM_BT          &
                      ,PD,T,Q,Q2,CWM,PINT                              &
                      ,IJDS,IJDE,SPEC_BDY_WIDTH                        &  ! min/max(id,jd)
                      ,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:    BOCOH       UPDATE MASS POINTS ON BOUNDARY
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 94-03-08
!     
! ABSTRACT:
!     TEMPERATURE, SPECIFIC HUMIDITY, AND SURFACE PRESSURE
!     ARE UPDATED ON THE DOMAIN BOUNDARY BY APPLYING THE
!     PRE-COMPUTED TENDENCIES AT EACH TIME STEP.
!     
! PROGRAM HISTORY LOG:
!   87-??-??  MESINGER   - ORIGINATOR
!   95-03-25  BLACK      - CONVERSION FROM 1-D TO 2-D in HORIZONTAL
!   96-12-13  BLACK      - FINAL MODIFICATION FOR NESTED RUNS
!   98-10-30  BLACK      - MODIFIED FOR DISTRIBUTED MEMORY
!   00-01-06  BLACK      - MODIFIED FOR JANJIC NONHYDROSTATIC CODE
!   00-09-14  BLACK      - MODIFIED FOR DIRECT ACCESS READ
!   01-03-12  BLACK      - CONVERTED TO WRF STRUCTURE
!   02-08-29  MICHALAKES - CHANGED II=I-MY_IS_GLB+1 TO II=I
!                          ADDED CONDITIONAL COMPILATION AROUND MPI
!                          CONVERT INDEXING FROM LOCAL TO GLOBAL
!   02-09-06  WOLFE      - MORE CONVERSION TO GLOBAL INDEXING 
!     
! USAGE: CALL BOCOH FROM SUBROUTINE SOLVE_RUNSTREAM
!   INPUT ARGUMENT LIST:
!
!     NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN
!     AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT
!     IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM
!  
!   OUTPUT ARGUMENT LIST: 
!     
!   OUTPUT FILES:
!     NONE
!     
!   SUBPROGRAMS CALLED:
!  
!     UNIQUE: NONE
!  
!     LIBRARY: NONE
!  
! ATTRIBUTES:
!   LANGUAGE: FORTRAN 90
!   MACHINE : IBM SP
!$$$  
!**********************************************************************
!----------------------------------------------------------------------
!
      IMPLICIT NONE
!
!----------------------------------------------------------------------
      LOGICAL,INTENT(IN) :: NEST
!
      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
                           ,IMS,IME,JMS,JME,KMS,KME                    &
                           ,ITS,ITE,JTS,JTE,KTS,KTE
      INTEGER,INTENT(IN) :: IJDS,IJDE,SPEC_BDY_WIDTH
!
      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) :: LB,NBC,NTSD
      LOGICAL,INTENT(IN) :: LAST_TIME
      INTEGER,INTENT(INOUT) :: NBOCO
!
      REAL,INTENT(IN) :: DT0,PDTOP,PT,TSPH
!
      REAL,DIMENSION(KMS:KME),INTENT(IN) :: ETA1,ETA2
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: HTM
!
      REAL,DIMENSION(IJDS:IJDE,1,SPEC_BDY_WIDTH,4)                     &
                                           ,INTENT(INOUT) :: PD_B,PD_BT
!
      REAL,DIMENSION(IJDS:IJDE,KMS:KME,SPEC_BDY_WIDTH,4)               &
                                      ,INTENT(INOUT) :: CWM_B,Q_B,Q2_B &
                                                       ,T_B,U_B,V_B 
      REAL,DIMENSION(IJDS:IJDE,KMS:KME,SPEC_BDY_WIDTH,4)               &
                                   ,INTENT(INOUT) :: CWM_BT,Q_BT,Q2_BT &
                                                    ,T_BT,U_BT,V_BT 
!
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: RES
      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: PD
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: CWM     &
                                                              ,PINT,Q  &
                                                              ,Q2,T
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      INTEGER :: I,II,IIM,IM,IRTN,ISIZ1,ISIZ2                          &
                ,J,JJ,JJM,JM,K,N,NN,NREC,REC
      INTEGER :: IBDY, BF, JB, IB
      INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB    !jm
      INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1
      LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
!
      REAL :: BCHR,RHTM,SHTM,DT
!----------------------------------------------------------------------
!**********************************************************************
!----------------------------------------------------------------------
!
      MYIS =MAX(IDS,ITS)     !jw
      MYIE1=MIN(IDE,ITE)
!
      IM=IDE-IDS+1
      JM=JDE-JDS+1
      IIM=IM
      JJM=JM
!
      ISIZ1=2*LB
      ISIZ2=2*LB*(KME-KMS)
!
      W_BDY=(ITS==IDS)
      E_BDY=(ITE==IDE)
      S_BDY=(JTS==JDS)
      N_BDY=(JTE==JDE)
!
      ILPAD1=1
      IF(W_BDY)ILPAD1=0
      IRPAD1=1
      IF(E_BDY)IRPAD1=0
      JBPAD1=1
      IF(S_BDY)JBPAD1=0
      JTPAD1=1
      IF(N_BDY)JTPAD1=0
!
      MY_IS_GLB=ITS
      MY_IE_GLB=ITE
      MY_JS_GLB=JTS
      MY_JE_GLB=JTE
!
      DT=DT0
!
!----------------------------------------------------------------------
!***  SOUTH AND NORTH BOUNDARIES
!----------------------------------------------------------------------
!
!***  USE IBDY=1 FOR SOUTH; 2 FOR NORTH
!
      DO IBDY=1,2 
!
!***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
!
        IF((S_BDY.AND.IBDY.EQ.1).OR.(N_BDY.AND.IBDY.EQ.2))THEN
!
          IF(IBDY.EQ.1)THEN
            BF=P_YSB     ! Which boundary (YSB=the boundary where Y is at its start)
            JB=1         ! Which cell in from boundary
            JJ=1         ! Which cell in the domain
          ELSE
            BF=P_YEB     ! Which boundary (YEB=the boundary where Y is at its end)
            JB=1         ! Which cell in from boundary
            JJ=JJM       ! Which cell in the domain
          ENDIF
!
          DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
            PD_B(I,1,JB,BF)=PD_B(I,1,JB,BF)+PD_BT(I,1,JB,BF)*DT
            PD(I,JJ)=PD_B(I,1,JB,BF)
          ENDDO
!
          DO K=KTS,KTE
            DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
              T_B(I,K,JB,BF)=T_B(I,K,JB,BF)+T_BT(I,K,JB,BF)*DT
              Q_B(I,K,JB,BF)=Q_B(I,K,JB,BF)+Q_BT(I,K,JB,BF)*DT
              Q2_B(I,K,JB,BF)=Q2_B(I,K,JB,BF)+Q2_BT(I,K,JB,BF)*DT
              CWM_B(I,K,JB,BF)=CWM_B(I,K,JB,BF)+CWM_BT(I,K,JB,BF)*DT
              T(I,K,JJ)=T_B(I,K,JB,BF)
              Q(I,K,JJ)=Q_B(I,K,JB,BF)
              Q2(I,K,JJ)=Q2_B(I,K,JB,BF)
              CWM(I,K,JJ)=CWM_B(I,K,JB,BF)
              PINT(I,K,JJ)=ETA1(K)*PDTOP                               &
                          +ETA2(K)*PD(I,JJ)*RES(I,JJ)+PT
            ENDDO
          ENDDO
        ENDIF
      ENDDO

!
!----------------------------------------------------------------------
!***  WEST AND EAST BOUNDARIES
!----------------------------------------------------------------------
!
!***  USE IBDY=1 FOR WEST; 2 FOR EAST. 
!
      DO IBDY=1,2 
!
!***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
!
        IF((W_BDY.AND.IBDY.EQ.1).OR.(E_BDY.AND.IBDY.EQ.2))THEN
          IF(IBDY.EQ.1)THEN
            BF=P_XSB     ! Which boundary (XSB=the boundary where X is at its start)
            IB=1         ! Which cell in from boundary 
            II=1         ! Which cell in the domain
          ELSE
            BF=P_XEB     ! Which boundary (XEB=the boundary where X is at its end)
            IB=1         ! Which cell in from boundary
            II=IIM       ! Which cell in the domain
          ENDIF
!
          DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
            IF(MOD(J,2).EQ.1)THEN
              PD_B(J,1,IB,BF)=PD_B(J,1,IB,BF)+PD_BT(J,1,IB,BF)*DT
              PD(II,J)=PD_B(J,1,IB,BF)
            ENDIF
          ENDDO
!
          DO K=KTS,KTE
            DO J=MAX(JTS-1,JDS+3-1),MIN(JTE+1,JDE-2)
!
              IF(MOD(J,2).EQ.1)THEN
                T_B(J,K,IB,BF)=T_B(J,K,IB,BF)+T_BT(J,K,IB,BF)*DT
                Q_B(J,K,IB,BF)=Q_B(J,K,IB,BF)+Q_BT(J,K,IB,BF)*DT
                Q2_B(J,K,IB,BF)=Q2_B(J,K,IB,BF)+Q2_BT(J,K,IB,BF)*DT
                CWM_B(J,K,IB,BF)=CWM_B(J,K,IB,BF)+CWM_BT(J,K,IB,BF)*DT
                T(II,K,J)=T_B(J,K,IB,BF)
                Q(II,K,J)=Q_B(J,K,IB,BF)
                Q2(II,K,J)=Q2_B(J,K,IB,BF)
                CWM(II,K,J)=CWM_B(J,K,IB,BF)
                PINT(II,K,J)=ETA1(K)*PDTOP                             &
                            +ETA2(K)*PD(II,J)*RES(II,J)+PT
              ENDIF
!
            ENDDO
          ENDDO
        ENDIF
      ENDDO

!----------------------------------------------------------------------
!
  100 CONTINUE


!
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***  SPACE INTERPOLATION OF PD THEN REMAINING MASS VARIABLES
!***  AT INNER BOUNDARY
!----------------------------------------------------------------------
!
!***  ONE ROW NORTH OF SOUTHERN BOUNDARY
!
      IF(S_BDY)THEN
        DO I=MYIS,MYIE1
          SHTM=HTM(I,KTE,1)+HTM(I+1,KTE,1)+HTM(I,KTE,3)+HTM(I+1,KTE,3)
          PD(I,2)=(PD(I,1)*HTM(I,KTE,1)+PD(I+1,1)*HTM(I+1,KTE,1)       &
                  +PD(I,3)*HTM(I,KTE,3)+PD(I+1,3)*HTM(I+1,KTE,3))/SHTM
        ENDDO
      ENDIF
!
!***  ONE ROW SOUTH OF NORTHERN BOUNDARY
!
      IF(N_BDY)THEN
        DO I=MYIS,MYIE1
          SHTM=HTM(I,KTE,JJM-2)+HTM(I+1,KTE,JJM-2)+HTM(I,KTE,JJM)      &
                                                +HTM(I+1,KTE,JJM)
          PD(I,JJM-1)=(PD(I,JJM-2)*HTM(I,KTE,JJM-2)                    &
                      +PD(I+1,JJM-2)*HTM(I+1,KTE,JJM-2)                &
                      +PD(I,JJM)*HTM(I,KTE,JJM)                        &
                      +PD(I+1,JJM)*HTM(I+1,KTE,JJM))/SHTM
        ENDDO
      ENDIF
!
!***  ONE ROW EAST OF WESTERN BOUNDARY
!
      IF(W_BDY)THEN
        DO J=4,JM-3,2
!
          IF(W_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            SHTM=HTM(1,KTE,JJ-1)+HTM(2,KTE,JJ-1)+HTM(1,KTE,JJ+1)       &
                                              +HTM(2,KTE,JJ+1)
            PD(1,JJ)=(PD(1,JJ-1)*HTM(1,KTE,JJ-1)                       &
                     +PD(2,JJ-1)*HTM(2,KTE,JJ-1)                       &
                     +PD(1,JJ+1)*HTM(1,KTE,JJ+1)                       &
                     +PD(2,JJ+1)*HTM(2,KTE,JJ+1))/SHTM
          ENDIF
!
        ENDDO
      ENDIF
!
!***  ONE ROW WEST OF EASTERN BOUNDARY
!
      IF(E_BDY)THEN
        DO J=4,JM-3,2
!
          IF(E_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            SHTM=HTM(IIM-1,KTE,JJ-1)+HTM(IIM,KTE,JJ-1)                 &
                +HTM(IIM-1,KTE,JJ+1)+HTM(IIM,KTE,JJ+1)
            PD(IIM-1,JJ)=(PD(IIM-1,JJ-1)*HTM(IIM-1,KTE,JJ-1)           &
                         +PD(IIM,JJ-1)*HTM(IIM,KTE,JJ-1)               &
                         +PD(IIM-1,JJ+1)*HTM(IIM-1,KTE,JJ+1)           &
                         +PD(IIM,JJ+1)*HTM(IIM,KTE,JJ+1))/SHTM
          ENDIF
!
        ENDDO
      ENDIF
!
!----------------------------------------------------------------------
!
      DO 200 K=KTS,KTE
!
!----------------------------------------------------------------------
!
!***  ONE ROW NORTH OF SOUTHERN BOUNDARY
!
      IF(S_BDY)THEN
        DO I=MYIS,MYIE1
          RHTM=1./(HTM(I,K,1)+HTM(I+1,K,1)+HTM(I,K,3)+HTM(I+1,K,3))
          T(I,K,2)=(T(I,K,1)*HTM(I,K,1)+T(I+1,K,1)*HTM(I+1,K,1)        &
                   +T(I,K,3)*HTM(I,K,3)+T(I+1,K,3)*HTM(I+1,K,3))       &
                   *RHTM
          Q(I,K,2)=(Q(I,K,1)*HTM(I,K,1)+Q(I+1,K,1)*HTM(I+1,K,1)        &
                   +Q(I,K,3)*HTM(I,K,3)+Q(I+1,K,3)*HTM(I+1,K,3))       &
                   *RHTM
          Q2(I,K,2)=(Q2(I,K,1)*HTM(I,K,1)+Q2(I+1,K,1)*HTM(I+1,K,1)     &
                    +Q2(I,K,3)*HTM(I,K,3)+Q2(I+1,K,3)*HTM(I+1,K,3))    &
                    *RHTM
          CWM(I,K,2)=(CWM(I,K,1)*HTM(I,K,1)+CWM(I+1,K,1)*HTM(I+1,K,1)  &
                     +CWM(I,K,3)*HTM(I,K,3)+CWM(I+1,K,3)*HTM(I+1,K,3)) &
                     *RHTM
          PINT(I,K,2)=ETA1(K)*PDTOP+ETA2(K)*PD(I,2)*RES(I,2)+PT
        ENDDO
      ENDIF
!
!***  ONE ROW SOUTH OF NORTHERN BOUNDARY
!
      IF(N_BDY)THEN
        DO I=MYIS,MYIE1
          RHTM=1./(HTM(I,K,JJM-2)+HTM(I+1,K,JJM-2)                     &
                  +HTM(I,K,JJM)+HTM(I+1,K,JJM))
          T(I,K,JJM-1)=(T(I,K,JJM-2)*HTM(I,K,JJM-2)                    &
                       +T(I+1,K,JJM-2)*HTM(I+1,K,JJM-2)                &
                       +T(I,K,JJM)*HTM(I,K,JJM)                        &
                       +T(I+1,K,JJM)*HTM(I+1,K,JJM))                   &
                       *RHTM
          Q(I,K,JJM-1)=(Q(I,K,JJM-2)*HTM(I,K,JJM-2)                    &
                       +Q(I+1,K,JJM-2)*HTM(I+1,K,JJM-2)                &
                       +Q(I,K,JJM)*HTM(I,K,JJM)                        &
                       +Q(I+1,K,JJM)*HTM(I+1,K,JJM))                   &
                       *RHTM
          Q2(I,K,JJM-1)=(Q2(I,K,JJM-2)*HTM(I,K,JJM-2)                  &
                        +Q2(I+1,K,JJM-2)*HTM(I+1,K,JJM-2)              &
                        +Q2(I,K,JJM)*HTM(I,K,JJM)                      &
                        +Q2(I+1,K,JJM)*HTM(I+1,K,JJM))                 &
                        *RHTM
          CWM(I,K,JJM-1)=(CWM(I,K,JJM-2)*HTM(I,K,JJM-2)                &
                         +CWM(I+1,K,JJM-2)*HTM(I+1,K,JJM-2)            &
                         +CWM(I,K,JJM)*HTM(I,K,JJM)                    &
                         +CWM(I+1,K,JJM)*HTM(I+1,K,JJM))               &
                         *RHTM
          PINT(I,K,JJM-1)=ETA1(K)*PDTOP                                &
                         +ETA2(K)*PD(I,JJM-1)*RES(I,JJM-1)+PT
        ENDDO
      ENDIF
!
!***  ONE ROW EAST OF WESTERN BOUNDARY
!
      IF(W_BDY)THEN
        DO J=4,JM-3,2
!
          IF(W_BDY          .AND.J.GE.MY_JS_GLB-JBPAD1                  &
                           .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            RHTM=1./(HTM(1,K,JJ-1)+HTM(2,K,JJ-1)                       &
                    +HTM(1,K,JJ+1)+HTM(2,K,JJ+1))
            T(1,K,JJ)=(T(1,K,JJ-1)*HTM(1,K,JJ-1)                       &
                      +T(2,K,JJ-1)*HTM(2,K,JJ-1)                       &
                      +T(1,K,JJ+1)*HTM(1,K,JJ+1)                       &
                      +T(2,K,JJ+1)*HTM(2,K,JJ+1))                      &
                      *RHTM
            Q(1,K,JJ)=(Q(1,K,JJ-1)*HTM(1,K,JJ-1)                       &
                      +Q(2,K,JJ-1)*HTM(2,K,JJ-1)                       &
                      +Q(1,K,JJ+1)*HTM(1,K,JJ+1)                       &
                      +Q(2,K,JJ+1)*HTM(2,K,JJ+1))                      &
                      *RHTM
            Q2(1,K,JJ)=(Q2(1,K,JJ-1)*HTM(1,K,JJ-1)                     &
                       +Q2(2,K,JJ-1)*HTM(2,K,JJ-1)                     &
                       +Q2(1,K,JJ+1)*HTM(1,K,JJ+1)                     &
                       +Q2(2,K,JJ+1)*HTM(2,K,JJ+1))                    &
                       *RHTM
            CWM(1,K,JJ)=(CWM(1,K,JJ-1)*HTM(1,K,JJ-1)                   &
                        +CWM(2,K,JJ-1)*HTM(2,K,JJ-1)                   &
                        +CWM(1,K,JJ+1)*HTM(1,K,JJ+1)                   &
                        +CWM(2,K,JJ+1)*HTM(2,K,JJ+1))                  &
                        *RHTM
            PINT(1,K,JJ)=ETA1(K)*PDTOP                                 &
                        +ETA2(K)*PD(1,JJ)*RES(1,JJ)+PT
          ENDIF
!
        ENDDO
      ENDIF
!
!***  ONE ROW WEST OF EASTERN BOUNDARY
!
      IF(E_BDY)THEN
        DO J=4,JM-3,2
!
          IF(E_BDY          .AND.J.GE.MY_JS_GLB-JBPAD1                 &
                            .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            RHTM=1./(HTM(IIM-1,K,JJ-1)+HTM(IIM,K,JJ-1)                 &
                    +HTM(IIM-1,K,JJ+1)+HTM(IIM,K,JJ+1))
            T(IIM-1,K,JJ)=(T(IIM-1,K,JJ-1)*HTM(IIM-1,K,JJ-1)           &
                          +T(IIM,K,JJ-1)*HTM(IIM,K,JJ-1)               &
                          +T(IIM-1,K,JJ+1)*HTM(IIM-1,K,JJ+1)           &
                          +T(IIM,K,JJ+1)*HTM(IIM,K,JJ+1))              &
                          *RHTM
            Q(IIM-1,K,JJ)=(Q(IIM-1,K,JJ-1)*HTM(IIM-1,K,JJ-1)           &
                          +Q(IIM,K,JJ-1)*HTM(IIM,K,JJ-1)               &
                          +Q(IIM-1,K,JJ+1)*HTM(IIM-1,K,JJ+1)           &
                          +Q(IIM,K,JJ+1)*HTM(IIM,K,JJ+1))              &
                          *RHTM
            Q2(IIM-1,K,JJ)=(Q2(IIM-1,K,JJ-1)*HTM(IIM-1,K,JJ-1)         &
                           +Q2(IIM,K,JJ-1)*HTM(IIM,K,JJ-1)             &
                           +Q2(IIM-1,K,JJ+1)*HTM(IIM-1,K,JJ+1)         &
                           +Q2(IIM,K,JJ+1)*HTM(IIM,K,JJ+1))            &
                           *RHTM
            CWM(IIM-1,K,JJ)=(CWM(IIM-1,K,JJ-1)*HTM(IIM-1,K,JJ-1)       &
                            +CWM(IIM,K,JJ-1)*HTM(IIM,K,JJ-1)           &
                            +CWM(IIM-1,K,JJ+1)*HTM(IIM-1,K,JJ+1)       &
                            +CWM(IIM,K,JJ+1)*HTM(IIM,K,JJ+1))          &
                            *RHTM
            PINT(IIM-1,K,JJ)=ETA1(K)*PDTOP                             &
                            +ETA2(K)*PD(IIM-1,JJ)*RES(IIM-1,JJ)+PT
          ENDIF
!
        ENDDO
      ENDIF
!----------------------------------------------------------------------
!
  200 CONTINUE
!
!----------------------------------------------------------------------
      END SUBROUTINE BOCOH
!----------------------------------------------------------------------
!**********************************************************************

      SUBROUTINE BOCOV(NTSD,DT,LB,VTM,U_B,V_B,U_BT,V_BT                & 1
                      ,U,V                                             &
                      ,IJDS,IJDE,SPEC_BDY_WIDTH                        &  ! min/max(id,jd)
                      ,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:    BOCOV       UPDATE WIND POINTS ON BOUNDARY
!   PRGRMMR: JANJIC          ORG: W/NP22     DATE: 94-03-08
!     
! ABSTRACT:
!     U AND V COMPONENTS OF THE WIND ARE UPDATED ON THE
!     DOMAIN BOUNDARY BY APPLYING THE PRE-COMPUTED
!     TENDENCIES AT EACH TIME STEP.  AN EXTRAPOLATION FROM
!     INSIDE THE DOMAIN IS USED FOR THE COMPONENT TANGENTIAL
!     TO THE BOUNDARY IF THE NORMAL COMPONENT IS OUTWARD.
!     
! PROGRAM HISTORY LOG:
!   87-??-??  MESINGER   - ORIGINATOR
!   95-03-25  BLACK      - CONVERSION FROM 1-D TO 2-D IN HORIZONTAL
!   98-10-30  BLACK      - MODIFIED FOR DISTRIBUTED MEMORY
!   01-03-13  BLACK      - CONVERTED TO WRF STRUCTURE
!   02-09-06  WOLFE      - MORE CONVERSION TO GLOBAL INDEXING 
!     
! USAGE: CALL BOCOH FROM MAIN PROGRAM EBU
!   INPUT ARGUMENT LIST:
!
!     NOTE THAT IDE AND JDE INSIDE ROUTINE SHOULD BE PASSED IN
!     AS WHAT WRF CONSIDERS THE UNSTAGGERED GRID DIMENSIONS; THAT
!     IS, 1 LESS THAN THE IDE AND JDE SET BY WRF FRAMEWORK, JM
!  
!   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,INTENT(IN) :: IJDS,IJDE,SPEC_BDY_WIDTH
!
      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) :: LB,NTSD
!
      REAL,INTENT(IN) :: DT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: VTM
!
      REAL,DIMENSION(IJDS:IJDE,KMS:KME,SPEC_BDY_WIDTH,4),INTENT(INOUT) &
                                               :: U_B,V_B,U_BT,V_BT
!
      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(INOUT) :: U,V
!----------------------------------------------------------------------
!
!***  LOCAL VARIABLES
!
      INTEGER :: I,II,IIM,IM,J,JJ,JJM,JM,K,N
      INTEGER :: MY_IS_GLB, MY_JS_GLB,MY_IE_GLB,MY_JE_GLB    !jm
      INTEGER :: IBDY,BF,JB,IB
      INTEGER :: ILPAD1,IRPAD1,JBPAD1,JTPAD1
      LOGICAL :: E_BDY,W_BDY,N_BDY,S_BDY
!----------------------------------------------------------------------
!**********************************************************************
!----------------------------------------------------------------------
      MYIS2=MAX(IDS+2,ITS)     !jw
      MYIE2=MIN(IDE-2,ITE)
!
      MYIS1_P1=MAX(IDS+1,ITS-1)
      MYIE2_P1=MIN(IDE-2,ITE+1)
!
!----------------------------------------------------------------------
!***  TIME INTERPOLATION OF U AND V AT THE OUTER BOUNDARY
!----------------------------------------------------------------------
!
      IM=IDE-IDS+1
      JM=JDE-JDS+1
      IIM=IM
      JJM=JM
!
      W_BDY=(ITS==IDS)
      E_BDY=(ITE==IDE)
      S_BDY=(JTS==JDS)
      N_BDY=(JTE==JDE)
!
      ILPAD1=1
      IF(ITS==IDS)ILPAD1=0
      IRPAD1=1
      IF(ITE==IDE)ILPAD1=0
      JBPAD1=1
      IF(JTS==JDS)JBPAD1=0
      JTPAD1=1
      IF(JTE==JDE)JTPAD1=0
!
      MY_IS_GLB=ITS
      MY_IE_GLB=ITE
      MY_JS_GLB=JTS
      MY_JE_GLB=JTE
!
!----------------------------------------------------------------------
!***  SOUTH AND NORTH BOUNDARIES
!***  USE IBDY=1 FOR SOUTH; 2 FOR NORTH.
!----------------------------------------------------------------------
!
      DO IBDY=1,2  
!
!***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
!
        IF((S_BDY.AND.IBDY.EQ.1).OR.(N_BDY.AND.IBDY.EQ.2))THEN
!
          IF(IBDY.EQ.1)THEN 
            BF=P_YSB     ! Which boundary (YSB=the boundary where Y is at its start)
            JB=1         ! Which cell in from Boundary 
            JJ=1         ! Which cell in the Domain
          ELSE
            BF=P_YEB     ! Which boundary (YEB=the boundary where Y is at its end)
            JB=1         ! Which cell in from Boundary
            JJ=JJM       ! Which cell in the Domain
          ENDIF
!
          DO K=KTS,KTE
            DO I=MAX(ITS-1,IDS),MIN(ITE+1,IDE)
              U_B(I,K,JB,BF)=U_B(I,K,JB,BF)+U_BT(I,K,JB,BF)*DT
              V_B(I,K,JB,BF)=V_B(I,K,JB,BF)+V_BT(I,K,JB,BF)*DT
              U(I,K,JJ)=U_B(I,K,JB,BF)
              V(I,K,JJ)=V_B(I,K,JB,BF)
            ENDDO
          ENDDO
!
        ENDIF
      ENDDO

!
!***  WEST AND EAST BOUNDARIES
!***  USE IBDY=1 FOR WEST; 2 FOR EAST.
!
      DO IBDY=1,2    
!
!***  MAKE SURE THE PROCESSOR HAS THIS BOUNDARY.
!
        IF((W_BDY.AND.IBDY.EQ.1).OR.(E_BDY.AND.IBDY.EQ.2))THEN
!
          IF(IBDY.EQ.1)THEN 
            BF=P_XSB     ! Which boundary (YSB=the boundary where Y is at its start)
            IB=1         ! Which cell in from boundary
            II=1         ! Which cell in the domain
          ELSE
            BF=P_XEB     ! Which boundary (YEB=the boundary where Y is at its end)
            IB=1         ! Which cell in from boundary
            II=IIM       ! Which cell in the domain
          ENDIF
!
          DO K=KTS,KTE
            DO J=MAX(JTS-1,JDS+2-1),MIN(JTE+1,JDE-1)
              IF(MOD(J,2).EQ.0)THEN
                U_B(J,K,IB,BF)=U_B(J,K,IB,BF)+U_BT(J,K,IB,BF)*DT
                V_B(J,K,IB,BF)=V_B(J,K,IB,BF)+V_BT(J,K,IB,BF)*DT
                U(II,K,J)=U_B(J,K,IB,BF)
                V(II,K,J)=V_B(J,K,IB,BF)
              ENDIF
            ENDDO
          ENDDO
!
        ENDIF
      ENDDO

!
!----------------------------------------------------------------------
!***  EXTRAPOLATION OF TANGENTIAL VELOCITY AT OUTFLOW POINTS
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!
      DO 200 K=KTS,KTE
!
!----------------------------------------------------------------------
!
!***  SOUTHERN BOUNDARY
!
      IF(S_BDY)THEN
        DO I=MYIS1_P1,MYIE2_P1
          IF(V(I,K,1).LT.0.)U(I,K,1)=(VTM(I,K,5)+1.)*U(I,K,3)          &
                                     -VTM(I,K,5)    *U(I,K,5)
        ENDDO
      ENDIF
!
!***  NORTHERN BOUNDARY
!
      IF(N_BDY)THEN
        DO I=MYIS1_P1,MYIE2_P1
          IF(V(I,K,JJM).GT.0.)                                         &
              U(I,K,JJM)=(VTM(I,K,JJM-4)+1.)*U(I,K,JJM-2)              &
                         -VTM(I,K,JJM-4)    *U(I,K,JJM-4)
        ENDDO
      ENDIF
!
!***  WESTERN BOUNDARY
!
      DO J=4,JM-3,2
        IF(W_BDY)THEN
!
          IF(W_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            IF(U(1,K,JJ).LT.0.)                                        &
                V(1,K,JJ)=(VTM(3,K,JJ)+1.)*V(2,K,JJ)                   &
                          -VTM(3,K,JJ)    *V(3,K,JJ)
          ENDIF
!
        ENDIF
      ENDDO
!
!***  EASTERN BOUNDARY
!
      DO J=4,JM-3,2
        IF(E_BDY)THEN
!
          IF(E_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            IF(U(IIM,K,JJ).GT.0.)                                      &
                V(IIM,K,JJ)=(VTM(IIM-2,K,JJ)+1.)*V(IIM-1,K,JJ)         &
                            -VTM(IIM-2,K,JJ)    *V(IIM-2,K,JJ)
          ENDIF
!
        ENDIF
      ENDDO
!----------------------------------------------------------------------
!
  200 CONTINUE
!
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!***  SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
!----------------------------------------------------------------------
!
!----------------------------------------------------------------------
!
      DO 300 K=KTS,KTE
!
!----------------------------------------------------------------------
!
!***  SOUTHWEST CORNER
!
      IF(S_BDY.AND.W_BDY)THEN
        U(2,K,2)=D06666*(4.*(U(1,K,1)+U(2,K,1)+U(2,K,3))               &
                           + U(1,K,2)+U(1,K,4)+U(2,K,4))               
        V(2,K,2)=D06666*(4.*(V(1,K,1)+V(2,K,1)+V(2,K,3))               &
                            +V(1,K,2)+V(1,K,4)+V(2,K,4))
      ENDIF
!
!***  SOUTHEAST CORNER
!
      IF(S_BDY.AND.E_BDY)THEN
        U(IIM-1,K,2)=D06666*(4.*(U(IIM-2,K,1)+U(IIM-1,K,1)             &
                                +U(IIM-2,K,3))                         &
                                +U(IIM,K,2)+U(IIM,K,4)+U(IIM-1,K,4))
        V(IIM-1,K,2)=D06666*(4.*(V(IIM-2,K,1)+V(IIM-1,K,1)             &
                                +V(IIM-2,K,3))                         &
                                +V(IIM,K,2)+V(IIM,K,4)+V(IIM-1,K,4))
      ENDIF
!
!***  NORTHWEST CORNER
!
      IF(N_BDY.AND.W_BDY)THEN
        U(2,K,JJM-1)=D06666*(4.*(U(1,K,JJM)+U(2,K,JJM)+U(2,K,JJM-2))   &
                                +U(1,K,JJM-1)+U(1,K,JJM-3)             &
                                +U(2,K,JJM-3))
        V(2,K,JJM-1)=D06666*(4.*(V(1,K,JJM)+V(2,K,JJM)+V(2,K,JJM-2))   &
                                +V(1,K,JJM-1)+V(1,K,JJM-3)             &
                                +V(2,K,JJM-3))
      ENDIF
!
!***  NORTHEAST CORNER
!
      IF(N_BDY.AND.E_BDY)THEN
        U(IIM-1,K,JJM-1)=                                              &
          D06666*(4.*(U(IIM-2,K,JJM)+U(IIM-1,K,JJM)+U(IIM-2,K,JJM-2))  &
                     +U(IIM,K,JJM-1)+U(IIM,K,JJM-3)+U(IIM-1,K,JJM-3))
        V(IIM-1,K,JJM-1)=                                              &
          D06666*(4.*(V(IIM-2,K,JJM)+V(IIM-1,K,JJM)+V(IIM-2,K,JJM-2))  &
                     +V(IIM,K,JJM-1)+V(IIM,K,JJM-3)+V(IIM-1,K,JJM-3))
      ENDIF
!
!----------------------------------------------------------------------
!***  SPACE INTERPOLATION OF U AND V AT THE INNER BOUNDARY
!----------------------------------------------------------------------
!
!***  ONE ROW NORTH OF SOUTHERN BOUNDARY
!
      IF(S_BDY)THEN
        DO I=MYIS2,MYIE2
          U(I,K,2)=(U(I-1,K,1)+U(I,K,1)+U(I-1,K,3)+U(I,K,3))*0.25
          V(I,K,2)=(V(I-1,K,1)+V(I,K,1)+V(I-1,K,3)+V(I,K,3))*0.25
        ENDDO
      ENDIF
!
!***  ONE ROW SOUTH OF NORTHERN BOUNDARY
!
      IF(N_BDY)THEN
        DO I=MYIS2,MYIE2
          U(I,K,JJM-1)=(U(I-1,K,JJM-2)+U(I,K,JJM-2)                    &
                       +U(I-1,K,JJM)+U(I,K,JJM))*0.25
          V(I,K,JJM-1)=(V(I-1,K,JJM-2)+V(I,K,JJM-2)                    &
                       +V(I-1,K,JJM)+V(I,K,JJM))*0.25
        ENDDO
      ENDIF
!
!***  ONE ROW EAST OF WESTERN BOUNDARY
!
      DO J=3,JM-2,2
        IF(W_BDY)THEN
          IF(W_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            U(1,K,JJ)=(U(1,K,JJ-1)+U(2,K,JJ-1)                         &
                      +U(1,K,JJ+1)+U(2,K,JJ+1))*0.25
            V(1,K,JJ)=(V(1,K,JJ-1)+V(2,K,JJ-1)                         &
                      +V(1,K,JJ+1)+V(2,K,JJ+1))*0.25
          ENDIF
        ENDIF
      ENDDO
!
!***  ONE ROW WEST OF EASTERN BOUNDARY
!
      IF(E_BDY)THEN
        DO J=3,JM-2,2
          IF(E_BDY.AND.J.GE.MY_JS_GLB-JBPAD1                           &
                  .AND.J.LE.MY_JE_GLB+JTPAD1)THEN
            JJ=J
            U(IIM-1,K,JJ)=0.25*(U(IIM-1,K,JJ-1)+U(IIM,K,JJ-1)          &
                               +U(IIM-1,K,JJ+1)+U(IIM,K,JJ+1))
            V(IIM-1,K,JJ)=0.25*(V(IIM-1,K,JJ-1)+V(IIM,K,JJ-1)          &
                               +V(IIM-1,K,JJ+1)+V(IIM,K,JJ+1))
          ENDIF
        ENDDO
      ENDIF
!----------------------------------------------------------------------
!
  300 CONTINUE
!
!----------------------------------------------------------------------
      END SUBROUTINE BOCOV
!----------------------------------------------------------------------

!----------------------------------------------------------------------
      END MODULE MODULE_BNDRY_COND