C $Header: /u/gcmpack/MITgcm/model/src/timestep_wvel.F,v 1.7 2011/05/20 16:20:13 jmc Exp $
C $Name: $
#include "CPP_OPTIONS.h"
CBOP
C !ROUTINE: TIMESTEP_WVEL
C !INTERFACE:
SUBROUTINE TIMESTEP_WVEL(
I bi,bj, myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | S/R TIMESTEP_WVEL
C | o Step model vertical velocity forward in time
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "NH_VARS.h"
c #include "SURFACE.h"
C !INPUT/OUTPUT PARAMETERS:
C == Routine Arguments ==
C bi, bj :: Tile indices
C myTime :: Current time in simulation
C myIter :: Current iteration number in simulation
C myThid :: my Thread Id. number
INTEGER bi,bj
_RL myTime
INTEGER myIter, myThid
#ifdef ALLOW_NONHYDROSTATIC
C !LOCAL VARIABLES:
C == Local variables ==
C iMin,iMax :: 1rst loop counter range
C jMin,jMax :: 2nd loop counter range
C i,j,k :: Loop counters
C gWtmp :: temporary array for vertical momentum tendency
INTEGER iMin,iMax,jMin,jMax
INTEGER i, j, k, km1
_RL gWtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL tmpFac, nh_Fac, igwFac
PARAMETER( iMin = 1 , iMax = sNx )
PARAMETER( jMin = 1 , jMax = sNy )
CEOP
igwFac = 0. _d 0
IF ( implicitIntGravWave ) igwFac = 1. _d 0
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF ( nonHydrostatic ) THEN
nh_Fac = 0.
IF ( nh_Am2.NE.0. ) nh_Fac = 1. _d 0 / nh_Am2
DO k=1,Nr
km1 = MAX( k-1, 1 )
IF ( implicitNHPress.NE.1. _d 0 ) THEN
C-- add explicit part of NH pressure gradient:
tmpFac = pfFacMom*(1. _d 0 - implicitNHPress)
& * wUnit2rVel(k)*wUnit2rVel(k)*recip_rhoFacF(k)
IF ( k.GE.2 ) THEN
DO j=jMin,jMax
DO i=iMin,iMax
gW(i,j,k,bi,bj) = gW(i,j,k,bi,bj)
& - tmpFac*rkSign*recip_drC(k)
& *( phi_nh(i,j,k,bi,bj) - phi_nh(i,j,k-1,bi,bj) )
ENDDO
ENDDO
ELSEIF ( selectNHfreeSurf.GE.1 ) THEN
DO j=jMin,jMax
DO i=iMin,iMax
gW(i,j,k,bi,bj) = gW(i,j,k,bi,bj)
& - tmpFac*rkSign*recip_drC(k)
& *( phi_nh(i,j,k,bi,bj) - dPhiNH(i,j,bi,bj) )
ENDDO
ENDDO
ENDIF
ENDIF
C apply mask to gW and keep a copy of wVel in gW:
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
gWtmp(i,j) = gW(i,j,k,bi,bj)
& *maskC(i,j,k,bi,bj)*maskC(i,j,km1,bi,bj)
gW(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)
ENDDO
ENDDO
C Step forward vertical velocity
tmpFac = nh_Fac + igwFac*wUnit2rVel(k)*wUnit2rVel(k)
& *dBdrRef(k)*deltaTMom*dTtracerLev(k)
IF (tmpFac.GT.0. ) tmpFac = 1. _d 0 / tmpFac
DO j=jMin,jMax
DO i=iMin,iMax
wVel(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)
& + deltaTmom*tmpFac*gWtmp(i,j)
ENDDO
ENDDO
C- End of k loop
ENDDO
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
ELSEIF ( implicitIntGravWave ) THEN
C keep a copy of wVel in gW:
DO k=1,Nr
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
gW(i,j,k,bi,bj) = wVel(i,j,k,bi,bj)
ENDDO
ENDDO
ENDDO
C- End if nonHydrostatic / elseif implicitIntGravWave
ENDIF
#endif /* ALLOW_NONHYDROSTATIC */
RETURN
END