      subroutine CONVECT( len, km, nwater,
     &                    H,U,V,T,S,B,Tdeep,Sdeep,
     &                    ieast,iwest,inorth,isouth,
     &                    Area_h, Area_u)
     &                    
      real    H(len,km)
      real    U(len,km)
      real    V(len,km)
      real    T(len,km)
      real    S(len,km)
      real    B(len,km)
      integer ieast(len)
      integer iwest(len)
      integer inorth(len)
      integer isouth(len)
      real    Area_h(len)
      real    Area_u(len)


c==> Local Variables

      real Z(LEN,KM)
      real Hu(LEN,KM)
      real mix_u(LEN)
      real Wk1(LEN)
      real Wk2(LEN)
      real Area_u_r4(len)
      
      integer NPASSES
      parameter ( NPASSES = 1 )
      real MIX_FAC
      parameter ( MIX_FAC = 0. )
  
c==> Functions

      real BYNCY
      real INSITU
      real POTEMP
CFPP$ EXPAND(INSITU)
CFPP$ EXPAND(POTEMP)
CFPP$ EXPAND(ZC_FROM_H)


       do i=1,nwater
         Z(i,1) = H(i,1)*0.5
       enddo
       do k=2,km
        do i=1,nwater
          Z(i,k) = Z(i,k-1) + (H(i,k)+H(i,k-1))*0.5
        enddo
       enddo

! collect up mapping conversions
       
       do i=nwater,len
        Wk1(i) = 0.0
        Wk2(i) = 0.0
       enddo
       
       do i=1,nwater
        if ( Area_u(i) .GT. 0.) then
         Area_u_r4(i) = 0.25/Area_u(i)
        else
         Area_u_r4(i) = 0.0
        endif
       enddo


       do k=1,KM
         do i=1,nwater
           Wk1(i) = H(i,k)*Area_h(i)
         enddo
         do i=1,nwater
           Wk2(i) = Wk1(ieast(i))+Wk1(i)
         enddo
         do i=1,nwater
           Hu(i,k)  = (Wk2(i)+Wk2(inorth(i)))*Area_u_r4(i)
         enddo
       enddo ! k       

 
       

c     make convective adjustment. 

      do ns=1,NPASSES
       do kstart=1,2
        do k=kstart,km,2

         do i=1,len
          mix_u(i) = 0.
         enddo
            
         if ( k .LT. KM ) then
       
         do i=1,nwater
         
          if ( B(i,k) .lt. B(i,k+1)) then
          
           mix_u(i) = Area_h(i) 
           T(i,k)   = INSITU( T(i,k),   S(i,k),   Z(i,k)  )
           T(i,k+1) = INSITU( T(i,k+1), S(i,k+1), Z(i,k+1))

           T(i,k) = ( H(i,k)*T(i,k) + H(i,k+1)*T(i,k+1) )
     &                / ( H(i,k)+H(i,k+1) )
           T(i,k+1)=T(i,k)

           S(i,k) = ( H(i,k)*S(i,k) + H(i,k+1)*S(i,k+1) )
     &                / ( H(i,k)+H(i,k+1) )
             
           S(i,k+1)=S(i,k)

           T(i,k)   = POTEMP( T(i,k),   S(i,k),    Z(i,k)   )
           T(i,k+1) = POTEMP( T(i,k+1), S(i,k+1) , Z(i,k+1) )
           B(i,k)   = BYNCY( T(i,k), S(i,k), 0.)
           B(i,k+1) = BYNCY( T(i,k+1), S(i,k+1), 0.)

          endif ! Unstable
         enddo ! i   

         do i=1,nwater
           Wk1(i) = (mix_u(ieast(i))+mix_u(i))
         enddo
       
         do i=1,nwater
           mix_u(i) = MIX_FAC * (Wk1(i)+Wk1(inorth(i)))*Area_u_r4(i) 
           if ( mix_u(i) .GT. 0.0) then
           U_new = (Hu(i,k)*U(i,k) + Hu(i,k+1)*U(i,k+1) )/
     &             (    Hu(i,k)    +     Hu(i,k+1)      )
           U(i,k)  =U(i,k)  *(1.-mix_u(i)) + mix_u(i)*U_new
           U(i,k+1)=U(i,k+1)*(1.-mix_u(i)) + mix_u(i)*U_new

           U_new = (Hu(i,k)*V(i,k) + Hu(i,k+1)*V(i,k+1) )/
     &             (    Hu(i,k)    +     Hu(i,k+1)      )
           V(i,k)  =V(i,k)  *(1.-mix_u(i)) + mix_u(i)*U_new
           V(i,k+1)=V(i,k+1)*(1.-mix_u(i)) + mix_u(i)*U_new
          endif
         enddo
       
       
!  At bottom, just mix with abyss
 
        else if ( k .EQ. KM ) then
        
        
        
         do i=1,nwater
          if( B(i,k).lt. 0.) then
            mix_u(i)=Area_h(i)

            T(i,k) = Tdeep
            S(i,k) = Sdeep
            B(i,k) = BYNCY( T(i,k), S(i,k) , 0.)             
          endif
         enddo    

         do i=1,nwater
          Wk1(i) = (mix_u(ieast(i))+mix_u(i))
         enddo
       
         do i=1,nwater
           mix_u(i) = MIX_FAC * (Wk1(i)+Wk1(inorth(i))) * Area_u_r4(i)
           if ( mix_u(i) .GT. 0.0) then
           
            U(i,k)  =U(i,k)  *(1.-mix_u(i))
            U(i,k+1)=U(i,k+1)*(1.-mix_u(i))

            V(i,k)  =V(i,k)  *(1.-mix_u(i)) 
            V(i,k+1)=V(i,k+1)*(1.-mix_u(i)) 
           endif
         enddo
       
        endif       
       
       
       
        enddo ! k
        enddo ! kstart
       enddo ! NPASSES
     
      end
