C $Header: /u/gcmpack/MITgcm/pkg/shap_filt/shap_filt_u.F,v 1.4 2001/05/29 14:01:40 adcroft Exp $
C $Name: $
#include "SHAP_FILT_OPTIONS.h"
SUBROUTINE SHAP_FILT_U(uVel,bi,bj,K,myCurrentTime,myThid)
C /==========================================================\
C | S/R SHAP_FILT_U |
C | Applies Shapiro filter to U field over one XY slice |
C | of one tile at a time. |
C \==========================================================/
IMPLICIT NONE
C == Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "SHAP_FILT.h"
C == Routine arguments
_RL uVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
INTEGER myThid
_RL myCurrentTime
INTEGER bi, bj, K
#ifdef ALLOW_SHAP_FILT
C == Local variables ==
_RL tmpFldX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
_RL tmpFldY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
_RS maskZ(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
INTEGER I,J,N,N1,N2
DO J=1-OLy,sNy+OLy
DO I=1-OLx,sNx+OLx
tmpFldX(i,j,1) = uVel(i,j,k,bi,bj)
& *_maskW(i,j,k,bi,bj)
ENDDO
ENDDO
C Extract small-scale noise from tmpFldX (delta_ii^n)
DO N=1,nShapUV
N1=1+mod(N+1,2)
N2=1+mod( N ,2)
DO J=1-OLy,sNy+OLy
DO I=1-OLx+1,sNx+OLx-1
tmpFldX(i,j,N2) = -0.25*(
& tmpFldX(i-1,j,N1) + tmpFldX(i+1,j,N1)
& - 2.*tmpFldX(i,j,N1)
& )*_maskW(i,j,k,bi,bj)
ENDDO
ENDDO
ENDDO
C Create temporary Zeta mask (accounting for thin walls)
DO J=1-OLy,sNy+OLy
DO I=1-OLx+1,sNx+OLx
maskZ(i,j) = _maskS(i-1,j,k,bi,bj)
& *_maskS( i ,j,k,bi,bj)
ENDDO
ENDDO
#ifdef SEQUENTIAL_2D_SHAP
DO J=1-OLy,sNy+OLy
DO I=1-OLx,sNx+OLx
tmpFldX(i,j,N2) = uVel(i,j,k,bi,bj) - tmpFldX(i,j,N2)
tmpFldY(i,j,1) = tmpFldX(i,j,N2)
ENDDO
ENDDO
#else
DO J=1-OLy,sNy+OLy
DO I=1-OLx,sNx+OLx
tmpFldY(i,j,1) = uVel(i,j,k,bi,bj)
& *_maskW(i,j,k,bi,bj)
ENDDO
ENDDO
#endif /* SEQUENTIAL_2D_SHAP */
C Extract small-scale noise from tmpFldY (delta_jj^n)
DO N=1,nShapUV
N1=1+mod(N+1,2)
N2=1+mod( N ,2)
DO J=1-OLy+1,sNy+OLy-1
DO I=1-OLx+1,sNx+OLx
tmpFldY(i,j,N2) = -0.25*(
& (tmpFldY(i,j+1,N1)-tmpFldY(i, j ,N1))*maskZ(i,j+1)
& -(tmpFldY(i, j ,N1)-tmpFldY(i,j-1,N1))*maskZ(i, j )
#ifdef NO_SLIP_SHAP
& -2.*(2.-maskZ(i,j)-maskZ(i,j+1))*tmpFldY(i,j,N1)
#endif
& )*_maskW(i,j,k,bi,bj)
ENDDO
ENDDO
ENDDO
C Subtract small-scale noise from field
#ifdef SEQUENTIAL_2D_SHAP
DO J=1-OLy,sNy+OLy
DO I=1-OLx,sNx+OLx
uVel(i,j,k,bi,bj) = tmpFldX(i,j,N2) - tmpFldY(i,j,N2)
ENDDO
ENDDO
#else
DO J=1-OLy,sNy+OLy
DO I=1-OLx,sNx+OLx
uVel(i,j,k,bi,bj) = uVel(i,j,k,bi,bj)
& -0.5*( tmpFldX(i,j,N2)+tmpFldY(i,j,N2) )
ENDDO
ENDDO
#endif /* SEQUENTIAL_2D_SHAP */
#endif /* ALLOW_SHAP_FILT */
RETURN
END