C $Header: /u/gcmpack/MITgcm/model/src/taueddy_external_forcing.F,v 1.4 2008/05/31 16:50:35 gforget Exp $
C $Name:  $

#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"

#ifdef ALLOW_GMREDI
# include "GMREDI_OPTIONS.h"
#endif

CBOP
C     !ROUTINE: TAUEDDY_EXTERNAL_FORCING_U
C     !INTERFACE:
      SUBROUTINE TAUEDDY_EXTERNAL_FORCING_U(
     I           iMin, iMax, jMin, jMax,bi,bj,kLev,
     I           myCurrentTime,myThid)
C     !DESCRIPTION: \bv
C     *==========================================================*
C     | S/R TAUEDDY_EXTERNAL_FORCING_U
C     | o Contains problem specific forcing for zonal velocity.
C     *==========================================================*
C     | Adds terms to gU for forcing by external sources
C     | e.g. wind stress, bottom friction etc..................
C     *==========================================================*
C     \ev

C     !USES:
      IMPLICIT NONE
C     == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "FFIELDS.h"
#ifdef ALLOW_GMREDI
#include "GMREDI.h"
#endif

C     !INPUT/OUTPUT PARAMETERS:
C     == Routine arguments ==
C     iMin - Working range of tile for applying forcing.
C     iMax
C     jMin
C     jMax
C     kLev
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      _RL myCurrentTime
      INTEGER myThid
CEOP

#ifdef ALLOW_EDDYPSI
C     !LOCAL VARIABLES:
C     == Local variables ==
C     Loop counters
      INTEGER I, J
C     number of surface interface layer
      INTEGER kSurface, Kp1
      _RL maskm1, maskp1

      IF ( fluidIsAir ) THEN
       kSurface = 0
      ELSEIF ( usingPCoords ) THEN
       kSurface = Nr
      ELSE
       kSurface = 1
      ENDIF

C     Add zonal eddy momentum impulse into the layer
#ifdef ALLOW_GMREDI
      if ( GM_InMomAsStress ) then
#endif
      Kp1=min(klev+1,Nr)
      maskp1=1.
      maskm1=1.
      IF (klev.EQ.Nr) maskp1=0.
      IF (klev.EQ.1)  maskm1=0.
      DO j=jMin,jMax
       DO i=iMin,iMax
        gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
     &  +foFacMom*
#ifdef ALLOW_GMREDI
     &  (maskm1*_maskW(i,j,klev,bi,bj)*GM_PsiX(i,j,klev,bi,bj)
     &  -maskp1*_maskW(i,j,kp1,bi,bj)*GM_PsiX(i,j,kp1,bi,bj))
#else
     &  (maskm1*_maskW(i,j,klev,bi,bj)*eddyPsiX(i,j,klev,bi,bj)
     &  -maskp1*_maskW(i,j,kp1,bi,bj)*eddyPsiX(i,j,kp1,bi,bj))
#endif
     &  *recip_drF(klev)*_recip_hFacW(i,j,klev,bi,bj)
     &  *0.5*(_fCori(i,j,bi,bj)+_fCori(i-1,j,bi,bj))
       ENDDO
      ENDDO
#ifdef ALLOW_GMREDI
      endif
#endif

#endif

      RETURN
      END


CBOP C !ROUTINE: TAUEDDY_EXTERNAL_FORCING_V C !INTERFACE: SUBROUTINE TAUEDDY_EXTERNAL_FORCING_V( I iMin, iMax, jMin, jMax,bi,bj,kLev, I myCurrentTime,myThid) C !DESCRIPTION: \bv C *==========================================================* C | S/R TAUEDDY_EXTERNAL_FORCING_V C | o Contains problem specific forcing for merid velocity. C *==========================================================* C | Adds terms to gV for forcing by external sources C | e.g. wind stress, bottom friction etc.................. C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "FFIELDS.h" #ifdef ALLOW_GMREDI #include "GMREDI.h" #endif C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == C iMin - Working range of tile for applying forcing. C iMax C jMin C jMax C kLev INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj _RL myCurrentTime INTEGER myThid CEOP #ifdef ALLOW_EDDYPSI C !LOCAL VARIABLES: C == Local variables == C Loop counters INTEGER I, J C number of surface interface layer INTEGER kSurface, Kp1 _RL maskm1, maskp1 IF ( fluidIsAir ) THEN kSurface = 0 ELSEIF ( usingPCoords ) THEN kSurface = Nr ELSE kSurface = 1 ENDIF C Add meridional eddy momentum impulse into the layer #ifdef ALLOW_GMREDI if ( GM_InMomAsStress ) then #endif Kp1=min(klev+1,Nr) maskp1=1. maskm1=1. IF (klev.EQ.Nr) maskp1=0. IF (klev.EQ.1) maskm1=0. DO j=jMin,jMax DO i=iMin,iMax gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj) & +foFacMom* #ifdef ALLOW_GMREDI & (maskm1*_maskS(i,j,klev,bi,bj)*GM_PsiY(i,j,klev,bi,bj) & -maskp1*_maskS(i,j,kp1,bi,bj)*GM_PsiY(i,j,kp1,bi,bj)) #else & (maskm1*_maskS(i,j,klev,bi,bj)*eddyPsiY(i,j,klev,bi,bj) & -maskp1*_maskS(i,j,kp1,bi,bj)*eddyPsiY(i,j,kp1,bi,bj)) #endif & *recip_drF(klev)*_recip_hFacS(i,j,klev,bi,bj) & *0.5*(_fCori(i,j,bi,bj)+_fCori(i,j-1,bi,bj)) ENDDO ENDDO #ifdef ALLOW_GMREDI endif #endif #endif RETURN END