C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_uv_smag_3d.F,v 1.2 2013/11/06 00:37:11 jmc Exp $
C $Name: $
#include "MOM_COMMON_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: MOM_UV_SMAG_3D
C !INTERFACE:
SUBROUTINE MOM_UV_SMAG_3D(
I str11, str22, str12, str13, str23,
I viscAh3d_00, viscAh3d_12,
I viscAh3d_13, viscAh3d_23,
c I hFacZ,
O uDissip, vDissip,
I iMin,iMax,jMin,jMax, k, bi, bj, myThid )
C !DESCRIPTION:
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "GRID.h"
#include "PARAMS.h"
C !INPUT PARAMETERS:
C iMin,iMax :: 1rst index loop ranges
C jMin,jMax :: 2nd index loop ranges
_RL str11(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL str22(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL str12(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL str13(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
_RL str23(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
c _RS hFacZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL viscAh3d_00(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL viscAh3d_12(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL viscAh3d_13(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
_RL viscAh3d_23(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
INTEGER iMin,iMax, jMin,jMax
INTEGER k, bi, bj
INTEGER myThid
C !OUTPUT PARAMETERS:
_RL uDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL vDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
CEOP
#ifdef ALLOW_SMAG_3D
C !LOCAL VARIABLES:
INTEGER i,j
INTEGER km1, kp1
_RL maskM1, maskP1
km1 = MAX( 1,k-1)
kp1 = MIN(Nr,k+1)
maskM1 = 1.
maskP1 = 1.
IF ( k.LE.1 ) maskM1 = 0.
IF ( k.GE.Nr ) maskP1 = 0.
C - Laplacian and bi-harmonic terms
c IF (harmonic) THEN
C- note: free-slip @ bottom is commented out
C- use simple (momentum conserving) scaling
C (but not conserving angular momentum)
DO j= jMin,jMax
DO i= iMin,iMax
uDissip(i,j) = recip_rAw(i,j,bi,bj)*(
& ( viscAh3d_00( i , j , k )*str11( i , j , k )
& *dyF( i , j ,bi,bj)
& -viscAh3d_00(i-1, j , k )*str11(i-1, j , k )
& *dyF(i-1, j ,bi,bj)
& )
& +( viscAh3d_12( i ,j+1, k )*str12( i ,j+1, k )
& *dxV( i ,j+1,bi,bj)
& -viscAh3d_12( i , j , k )*str12( i , j , k )
& *dxV( i , j ,bi,bj)
& ) )
& + recip_drF( k )
& *( viscAh3d_13( i , j ,k+1)*str13( i , j ,k+1)
c & *maskW(i,j,kp1,bi,bj)*maskP1
& -viscAh3d_13( i , j , k )*str13( i , j , k )
c & *maskW(i,j,km1,bi,bj)*maskM1
& )*rkSign*recip_hFacW(i,j,k,bi,bj)
ENDDO
ENDDO
DO j= jMin,jMax
DO i= iMin,iMax
vDissip(i,j) = recip_rAs(i,j,bi,bj)*(
& ( viscAh3d_12(i+1, j , k )*str12(i+1, j ,k)
& *dyU(i+1, j ,bi,bj)
& -viscAh3d_12( i , j , k )*str12( i , j ,k)
& *dyU( i , j ,bi,bj)
& )
& +( viscAh3d_00( i , j , k )*str22( i , j ,k)
& *dxF( i , j ,bi,bj)
& -viscAh3d_00( i ,j-1, k )*str22( i ,j-1,k)
& *dxF( i ,j-1,bi,bj)
& ) )
& + recip_drF( k )
& *( viscAh3d_23( i , j ,k+1)*str23( i , j ,k+1)
c & *maskS(i,j,kp1,bi,bj)*maskP1
& -viscAh3d_23( i , j , k )*str23( i , j , k )
c & *maskS(i,j,km1,bi,bj)*maskM1
& )*rkSign*recip_hFacS(i,j,k,bi,bj)
ENDDO
ENDDO
c ENDIF
c IF (biharmonic) THEN
c STOP 'MOM_UV_SMAG_3D: BIHARMONIC NOT ALLOWED WITH SMAG_3D'
c ENDIF
#endif /* ALLOW_SMAG_3D */
RETURN
END