C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/mom_vecinv/mom_vi_v_coriolis_c4.F,v 1.8 2006/06/12 21:15:27 jmc Exp $ C $Name: mitgcm_mapl_00 $ #include "MOM_VECINV_OPTIONS.h" CBOP C !ROUTINE: MOM_VI_V_CORIOLIS_C4 C !INTERFACE: SUBROUTINE MOM_VI_V_CORIOLIS_C4( I bi,bj,k, I uFld,omega3,r_hFacZ, O vCoriolisTerm, I myThid) C !DESCRIPTION: \bv C *==========================================================* C | S/R MOM_VI_V_CORIOLIS_C4 C |==========================================================* C | o Calculate zonal flux of vorticity at V point C | using 4th order interpolation C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #ifdef ALLOW_EXCH2 #include "W2_EXCH2_TOPOLOGY.h" #include "W2_EXCH2_PARAMS.h" #endif /* ALLOW_EXCH2 */ C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == INTEGER bi,bj,k _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL omega3(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS r_hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL vCoriolisTerm(1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER myThid CEOP C == Local variables == INTEGER i,j _RL vort3r(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL uBarXY,vort3v,Rjp,Rjm _RL uBarYm,uBarYp LOGICAL northWestCorner, northEastCorner, & southWestCorner, southEastCorner INTEGER myFace #ifdef ALLOW_EXCH2 INTEGER myTile #endif /* ALLOW_EXCH2 */ _RL oneSixth, oneTwelve LOGICAL upwindVort3 LOGICAL fourthVort3 PARAMETER(oneSixth=1.D0/6.D0 , oneTwelve=1.D0/12.D0) PARAMETER(upwindVort3=.FALSE.) PARAMETER(fourthVort3=.TRUE. ) C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| DO j=1-Oly,sNy+Oly DO i=1-Olx,sNx+Olx vort3r(i,j) = r_hFacZ(i,j)*omega3(i,j) ENDDO ENDDO C-- Special stuff for Cubed Sphere IF (useCubedSphereExchange) THEN #ifdef ALLOW_EXCH2 myTile = W2_myTileList(bi) myFace = exch2_myFace(myTile) southWestCorner = exch2_isWedge(myTile).EQ.1 & .AND. exch2_isSedge(myTile).EQ.1 southEastCorner = exch2_isEedge(myTile).EQ.1 & .AND. exch2_isSedge(myTile).EQ.1 northEastCorner = exch2_isEedge(myTile).EQ.1 & .AND. exch2_isNedge(myTile).EQ.1 northWestCorner = exch2_isWedge(myTile).EQ.1 & .AND. exch2_isNedge(myTile).EQ.1 #else myFace = bi southWestCorner = .TRUE. southEastCorner = .TRUE. northWestCorner = .TRUE. northEastCorner = .TRUE. #endif /* ALLOW_EXCH2 */ IF ( southWestCorner ) THEN i = 1 j = 1 vort3r(i-1,j) = ( vort3r(i-1,j) + vort3r(i,j+1) )*0.5 _d 0 ENDIF IF ( southEastCorner ) THEN i = sNx+1 j = 1 vort3r(i+1,j) = ( vort3r(i+1,j) + vort3r(i,j+1) )*0.5 _d 0 ENDIF IF ( northWestCorner ) THEN i = 1 j = sNy+1 vort3r(i-1,j) = ( vort3r(i-1,j) + vort3r(i,j-1) )*0.5 _d 0 ENDIF IF ( northEastCorner ) THEN i = sNx+1 j = sNy+1 vort3r(i+1,j) = ( vort3r(i+1,j) + vort3r(i,j-1) )*0.5 _d 0 ENDIF C-- End of special stuff for Cubed Sphere. ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| c DO j=2-Oly,sNy+Oly c DO i=2-Olx,sNx+Olx-2 DO j=1,sNy+1 DO i=1,sNx IF ( SadournyCoriolis ) THEN C- using SadournyCoriolis discretization: uBarXY=1. uBarYm=0.5*( & uFld( i , j )*dyG( i , j ,bi,bj)*_hFacW( i , j ,k,bi,bj) & +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*_hFacW( i ,j-1,k,bi,bj) ) uBarYp=0.5*( & uFld(i+1, j )*dyG(i+1, j ,bi,bj)*_hFacW(i+1, j ,k,bi,bj) & +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*_hFacW(i+1,j-1,k,bi,bj) ) IF (upwindVorticity) THEN IF ( (uBarYm+uBarYp) .GT.0.) THEN vort3v=uBarYm*vort3r( i ,j) ELSE vort3v=uBarYp*vort3r(i+1,j) ENDIF ELSEIF (fourthVort3) THEN Rjp = vort3r(i+1,j) -oneSixth*( vort3r(i+2,j)-vort3r( i ,j) ) Rjm = vort3r( i ,j) +oneSixth*( vort3r(i+1,j)-vort3r(i-1,j) ) vort3v=0.5*( uBarYm*Rjm + uBarYp*Rjp ) ELSE vort3v=0.5*( uBarYm*vort3r( i ,j) + uBarYp*vort3r(i+1,j) ) ENDIF ELSE C- not using SadournyCoriolis discretization: uBarXY=0.25*( & (uFld( i , j )*dyG( i , j ,bi,bj)*_hFacW( i , j ,k,bi,bj) & +uFld( i ,j-1)*dyG( i ,j-1,bi,bj)*_hFacW( i ,j-1,k,bi,bj)) & +(uFld(i+1, j )*dyG(i+1, j ,bi,bj)*_hFacW(i+1, j ,k,bi,bj) & +uFld(i+1,j-1)*dyG(i+1,j-1,bi,bj)*_hFacW(i+1,j-1,k,bi,bj)) & ) IF (upwindVort3) THEN IF (uBarXY.GT.0.) THEN vort3v=vort3r(i,j) ELSE vort3v=vort3r(i+1,j) ENDIF ELSEIF (fourthVort3) THEN Rjp = vort3r(i+2,j) - vort3r(i+1,j) Rjm = vort3r( i ,j) - vort3r(i-1,j) vort3v=0.5*( vort3r(i,j) + vort3r(i+1,j) & -oneTwelve*(Rjp-Rjm) & ) ELSE vort3v=0.5*( vort3r(i,j) + vort3r(i+1,j) ) ENDIF C- end if / else SadournyCoriolis ENDIF vCoriolisTerm(i,j)= & -vort3v*uBarXY*recip_dyC(i,j,bi,bj) & * _maskS(i,j,k,bi,bj) ENDDO ENDDO RETURN END