C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/mom_vecinv/mom_vi_v_vertshear.F,v 1.10 2006/06/07 01:55:15 heimbach Exp $ C $Name: checkpoint64d $ #include "MOM_VECINV_OPTIONS.h" SUBROUTINE MOM_VI_V_VERTSHEAR( I bi,bj,K, I vFld,wFld, U vShearTerm, I myThid) IMPLICIT NONE C *==========================================================* C | S/R MOM_V_VERTSHEAR C *==========================================================* C *==========================================================* C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "GRID.h" #include "PARAMS.h" C == Routine arguments == INTEGER bi,bj,K _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy) _RL wFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy) _RL vShearTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER myThid C == Local variables == INTEGER I,J,Kp1,Km1 _RL mask_Kp1,mask_Km1,wBarYm,wBarYp _RL vZm,vZp LOGICAL rAdvAreaWeight c _RL vmask_Kp1,vmask_K,vmask_Km1 c LOGICAL freeslipK,noslipK c PARAMETER(freeslipK=.TRUE.) c PARAMETER(noslipK=.NOT.freeslipK) c LOGICAL freeslip1,noslip1 c PARAMETER(freeslip1=.TRUE.) c PARAMETER(noslip1=.NOT.freeslip1) c1 _RL wBarYZ,vZbarZ rAdvAreaWeight =.TRUE. C- Area-weighted average either in KE or in vert. advection: IF ( selectKEscheme.EQ.1 .OR. selectKEscheme.EQ.3 ) & rAdvAreaWeight =.FALSE. Kp1=min(K+1,Nr) mask_Kp1=1. IF (K.EQ.Nr) mask_Kp1=0. Km1=max(K-1,1) mask_Km1=1. IF (K.EQ.1) mask_Km1=0. DO J=2-Oly,sNy+Oly DO I=1-Olx,sNx+Olx c vmask_K=_maskS(i,j,k,bi,bj) C barZ( barY( W ) ) c wBarYm=0.5*(wFld(I,J,K,bi,bj)+wFld(I,J-1,K,bi,bj)) c wBarYp=0.5*(wFld(I,J,Kp1,bi,bj)+wFld(I,J-1,Kp1,bi,bj)) c & *mask_Kp1 IF ( rAdvAreaWeight ) THEN C Transport at interface k : Area weighted average wBarYm=0.5*( & wFld(I,J,K,bi,bj)*rA(i,j,bi,bj)*maskC(i,j,Km1,bi,bj) & +wFld(I,J-1,K,bi,bj)*rA(i,j-1,bi,bj)*maskC(i,j-1,Km1,bi,bj) & )*mask_Km1 & *recip_rAs(i,j,bi,bj) C Transport at interface k+1 (here wFld is already masked) wBarYp=0.5*( & wFld(I,J,Kp1,bi,bj)*rA(i,j,bi,bj) & +wFld(I,J-1,Kp1,bi,bj)*rA(i,j-1,bi,bj) & )*mask_Kp1 & *recip_rAs(i,j,bi,bj) ELSE C Transport at interface k : simple average wBarYm=0.5*( & wFld(I,J,K,bi,bj)*maskC(i,j,Km1,bi,bj) & +wFld(I,J-1,K,bi,bj)*maskC(i,j-1,Km1,bi,bj) & )*mask_Km1 C Transport at interface k+1 (here wFld is already masked) wBarYp=0.5*( & wFld(I,J,Kp1,bi,bj) & +wFld(I,J-1,Kp1,bi,bj) & )*mask_Kp1 ENDIF C delta_Z( V ) @ interface k c vmask_Km1=mask_Km1*maskS(i,j,Km1,bi,bj) vZm=(vFld(I,J,K,bi,bj)-mask_Km1*vFld(I,J,Km1,bi,bj))*rkSign c2 & *recip_dRC(K) c IF (freeslip1) vZm=vZm*vmask_Km1 c IF (noslip1.AND.vmask_Km1.EQ.0.) vZm=vZm*2. C delta_Z( V ) @ interface k+1 c vmask_Kp1=mask_Kp1*maskS(i,j,Kp1,bi,bj) vZp=(mask_Kp1*vFld(I,J,Kp1,bi,bj)-vFld(I,J,K,bi,bj))*rkSign c2 & *recip_dRC(Kp1) c IF (freeslipK) vZp=vZp*vmask_Kp1 c IF (noslipK.AND.vmask_Kp1.EQ.0.) vZp=vZp*2. c1 IF (upwindShear) THEN c1 wBarYZ=0.5*( wBarXm + wBarXp ) c1 IF (wBarYZ.GT.0.) THEN c1 vZbarZ=vZp c1 ELSE c1 vZbarZ=vZm c1 ENDIF c1 ELSE c1 vZbarZ=0.5*(vZm+vZp) c1 ENDIF c1 vShearTerm(I,J)=-wBarYZ*vZbarZ*_maskS(I,J,K,bi,bj) c2 vShearTerm(I,J)=-0.5*(wBarYp*vZp+wBarYm*vZm) c2 & *_maskS(I,J,K,bi,bj) IF (upwindShear) THEN vShearTerm(I,J)=-0.5* & ( (wBarYp*vZp+wBarYm*vZm) & +(ABS(wBarYp)*vZp-ABS(wBarYm)*vZm) & )*_recip_hFacS(i,j,k,bi,bj) & * recip_drF(K) c3 & * recip_rAs(i,j,bi,bj) ELSE vShearTerm(I,J)=-0.5*(wBarYp*vZp+wBarYm*vZm) & *_recip_hFacS(i,j,k,bi,bj) & * recip_drF(K) c3 & * recip_rAs(i,j,bi,bj) ENDIF ENDDO ENDDO RETURN END