      subroutine neptune

#if defined O_mom && defined O_neptune
!=======================================================================
!     calculate neptune (maximum entropy) velocities

!     the option "neptune" provides a subgridscale parameterization
!     for the interaction of eddies and topography

!     reference:
!       Holloway, G., 1992: representing topographic stress for large
!     scale ocean models, J. Phys. Oceanogr., 22, 1033-1046

!     neptune is calculated as an equilibrium streamfunction given by
!     pnep=-f*snep*snep*hnep and is applied through eddy viscosity

!     hnep = model streamfunction depth
!     snep = spnep + (senep-spnep)*(0.5 + 0.5*cos(2.0*latitude))

!     the neptune length scale snep has a value of senep at the
!     equator and smoothly changes to spnep at the poles
!=======================================================================

      implicit none

      integer i, jrow

      real tl, f, snep, hnep, diag1, diag0

      include "size.h"
      include "param.h"
      include "pconst.h"
      include "stdunits.h"
      include "coord.h"
      include "cnep.h"
      include "emode.h"
      include "grdvar.h"
      include "levind.h"
      include "mw.h"
      include "scalar.h"

      integer kmz(imt,jmt)

!     compute an array to indicate "interior" streamfunction grid boxes

      do i=1,imt
        kmz(i,1) = 0
      enddo

      do jrow=1,jmt
        kmz(1,jrow) = 0
      enddo

      do jrow=2,jmt
        do i=2,imt
          kmz(i,jrow) = min(kmu(i-1,jrow-1), kmu(i,jrow-1),
     &                      kmu(i-1,jrow), kmu(i,jrow))
        enddo
      enddo

!     calculate the topographic stress equilibrium streamfunction

!     snep = spnep + (senep-spnep)*(0.5 + 0.5*cos(2.0*latitude))
!     pnep  = -f*snep*snep*hnep

      do jrow=2,jmtm1
        do i=2,imtm1
          tl = tlat(i,jrow)/radian
          f    = c2*omega*sin(tl)
          snep = spnep + (senep - spnep)*
     &           (p5 + p5*cos(c2*tl))

!    find depth on streamfunction grid

          hnep = 0
          if (kmz(i,jrow) .ne. 0) then
            hnep = zw(kmz(i,jrow))
          endif

          pnep(i,jrow) = -f*snep*snep*hnep

        enddo
# if defined O_cyclic
          pnep(1,jrow) = pnep(imtm1,jrow)
          pnep(imt,jrow) = pnep(2,jrow)
# endif
      enddo

!     calculate depth independent velocity components from pnep

      do jrow=2,jmtm1
        do i=2,imtm1
          diag1 = pnep(i+1,jrow+1) - pnep(i  ,jrow)
          diag0 = pnep(i  ,jrow+1) - pnep(i+1,jrow)
          unep(i,jrow,1) = -(diag1+diag0)*dyu2r(jrow)*hr(i,jrow)
          unep(i,jrow,2) =  (diag1-diag0)*dxu2r(jrow)*hr(i,jrow)
     &                      *csur(jrow)
        enddo
# if defined O_cyclic
          unep(1,jrow,1) = unep(imtm1,jrow,1)
          unep(1,jrow,2) = unep(imtm1,jrow,2)
          unep(imt,jrow,1) = unep(2,jrow,1)
          unep(imt,jrow,2) = unep(2,jrow,2)
# endif
      enddo

#endif
      return
      end
