C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_apply_uvice.F,v 1.12 2010/10/27 00:55:15 dimitri Exp $
C $Name: $
#include "OBCS_OPTIONS.h"
SUBROUTINE OBCS_APPLY_UVICE(
U uFld, vFld,
I myThid )
C /==========================================================\
C | S/R OBCS_APPLY_UVICE |
C \==========================================================/
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "OBCS.h"
C == Routine Arguments ==
_RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
INTEGER myThid
#if (defined (ALLOW_OBCS) defined (ALLOW_SEAICE))
C == Local variables ==
C I,J,K,bi,bj - Loop counters
INTEGER I,J,K,bi,bj
K = 1
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
C Set model variables to OB values on North/South Boundaries
# ifdef ALLOW_OBCS_NORTH
if ( OBNvicefile .NE. ' ' ) then
DO I=1-Olx,sNx+Olx
C Northern boundary
IF (OB_Jn(I,bi,bj).NE.0) THEN
# ifdef OBCS_SEAICE_COMPUTE_UVICE
uFld(I,OB_Jn(I,bi,bj) ,bi,bj) =
& _maskW(I,OB_Jn(I,bi,bj),K,bi,bj) *
& uFld(I,OB_Jn(I,bi,bj)-1,bi,bj)
vFld(I,OB_Jn(I,bi,bj) ,bi,bj) =
& _maskS(I,OB_Jn(I,bi,bj),K,bi,bj) *
& vFld(I,OB_Jn(I,bi,bj)-1,bi,bj)
else /* OBCS_SEAICE_COMPUTE_UVICE */
# ifdef OBCS_SEAICE_AVOID_CONVERGENCE
vFld(I,OB_Jn(I,bi,bj),bi,bj) =
& max(OBNvice(I,bi,bj),vFld(I,OB_Jn(I,bi,bj),bi,bj)) *
& _maskS(I,OB_Jn(I,bi,bj),K,bi,bj)
else /* OBCS_SEAICE_AVOID_CONVERGENCE */
vFld(I,OB_Jn(I,bi,bj),bi,bj) = OBNvice(I,bi,bj) *
& _maskS(I,OB_Jn(I,bi,bj),K,bi,bj)
# endif /* OBCS_SEAICE_AVOID_CONVERGENCE */
uFld(I,OB_Jn(I,bi,bj),bi,bj) = OBNuice(I,bi,bj) *
& _maskW(I,OB_Jn(I,bi,bj),K,bi,bj)
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PERP
if ( _maskS(I,OB_Jn(I,bi,bj) ,K,bi,bj) .NE. 0. .AND.
& _maskS(I,OB_Jn(I,bi,bj)-2,K,bi,bj) .NE. 0. )
& vFld(I,OB_Jn(I,bi,bj)-1,bi,bj) = 0.5 _d 0 *
& ( vFld(I,OB_Jn(I,bi,bj) ,bi,bj) +
& vFld(I,OB_Jn(I,bi,bj)-2,bi,bj) ) *
& _maskS(I,OB_Jn(I,bi,bj)-1,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PERP */
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PAR
if ( _maskW(I,OB_Jn(I,bi,bj) ,K,bi,bj) .NE. 0. .AND.
& _maskW(I,OB_Jn(I,bi,bj)-2,K,bi,bj) .NE. 0. )
& uFld(I,OB_Jn(I,bi,bj)-1,bi,bj) = 0.5 _d 0 *
& ( uFld(I,OB_Jn(I,bi,bj) ,bi,bj) +
& uFld(I,OB_Jn(I,bi,bj)-2,bi,bj) ) *
& _maskW(I,OB_Jn(I,bi,bj)-1,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PAR */
# endif /* OBCS_SEAICE_COMPUTE_UVICE */
ENDIF
ENDDO
endif
# endif /* ALLOW_OBCS_NORTH */
# ifdef ALLOW_OBCS_SOUTH
if ( OBSvicefile .NE. ' ' ) then
DO I=1-Olx,sNx+Olx
C Southern boundary
IF (OB_Js(I,bi,bj).NE.0) THEN
# ifdef OBCS_SEAICE_COMPUTE_UVICE
uFld(I,OB_Js(I,bi,bj)+1,bi,bj) =
& _maskW(I,OB_Js(I,bi,bj)+1,K,bi,bj) *
& uFld(I,OB_Js(I,bi,bj)+2,bi,bj)
vFld(I,OB_Js(I,bi,bj)+1,bi,bj) =
& _maskS(I,OB_Js(I,bi,bj)+1,K,bi,bj) *
& vFld(I,OB_Js(I,bi,bj)+2,bi,bj)
else /* OBCS_SEAICE_COMPUTE_UVICE */
# ifdef OBCS_SEAICE_AVOID_CONVERGENCE
vFld(I,OB_Js(I,bi,bj)+1,bi,bj)=
& min(OBSvice(I,bi,bj),vFld(I,OB_Js(I,bi,bj)+1,bi,bj))
& * _maskS(I,OB_Js(I,bi,bj)+1,K,bi,bj)
else /* OBCS_SEAICE_AVOID_CONVERGENCE */
vFld(I,OB_Js(I,bi,bj)+1,bi,bj)=OBSvice(I,bi,bj)
& * _maskS(I,OB_Js(I,bi,bj)+1,K,bi,bj)
# endif /* OBCS_SEAICE_AVOID_CONVERGENCE */
uFld(I,OB_Js(I,bi,bj),bi,bj)=OBSuice(I,bi,bj)
& * _maskW(I,OB_Js(I,bi,bj),K,bi,bj)
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PERP
if ( _maskS(I,OB_Js(I,bi,bj)+1,K,bi,bj) .NE. 0. .AND.
& _maskS(I,OB_Js(I,bi,bj)+3,K,bi,bj) .NE. 0. )
& vFld(I,OB_Js(I,bi,bj)+2,bi,bj) = 0.5 _d 0 *
& ( vFld(I,OB_Js(I,bi,bj)+1,bi,bj) +
& vFld(I,OB_Js(I,bi,bj)+3,bi,bj) ) *
& _maskS(I,OB_Js(I,bi,bj)+2,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PERP */
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PAR
if ( _maskW(I,OB_Js(I,bi,bj) ,K,bi,bj) .NE. 0. .AND.
& _maskW(I,OB_Js(I,bi,bj)+2,K,bi,bj) .NE. 0. )
& uFld(I,OB_Js(I,bi,bj)+1,bi,bj) = 0.5 _d 0 *
& ( uFld(I,OB_Js(I,bi,bj) ,bi,bj) +
& uFld(I,OB_Js(I,bi,bj)+2,bi,bj) ) *
& _maskW(I,OB_Js(I,bi,bj)+1,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PAR */
# endif /* OBCS_SEAICE_COMPUTE_UVICE */
ENDIF
ENDDO
endif
# endif /* ALLOW_OBCS_SOUTH */
C Set model variables to OB values on East/West Boundaries
# ifdef ALLOW_OBCS_EAST
if ( OBEuicefile .NE. ' ' ) then
DO J=1-Oly,sNy+Oly
C Eastern boundary
IF (OB_Ie(J,bi,bj).NE.0) THEN
# ifdef OBCS_SEAICE_COMPUTE_UVICE
uFld(OB_Ie(J,bi,bj),J,bi,bj) =
& _maskW(OB_Ie(J,bi,bj),J,K,bi,bj) *
& uFld(OB_Ie(J,bi,bj)-1,J,bi,bj)
vFld(OB_Ie(J,bi,bj),J,bi,bj) =
& _maskS(OB_Ie(J,bi,bj),J,K,bi,bj) *
& vFld(OB_Ie(J,bi,bj)-1,J,bi,bj)
else /* OBCS_SEAICE_COMPUTE_UVICE */
# ifdef OBCS_SEAICE_AVOID_CONVERGENCE
uFld(OB_Ie(J,bi,bj),J,bi,bj)=
& max(OBEuice(J,bi,bj),uFld(OB_Ie(J,bi,bj),J,bi,bj))
& * _maskW(OB_Ie(J,bi,bj),J,K,bi,bj)
else /* OBCS_SEAICE_AVOID_CONVERGENCE */
uFld(OB_Ie(J,bi,bj),J,bi,bj)=OBEuice(J,bi,bj)
& * _maskW(OB_Ie(J,bi,bj),J,K,bi,bj)
# endif /* OBCS_SEAICE_AVOID_CONVERGENCE */
vFld(OB_Ie(J,bi,bj),J,bi,bj)=OBEvice(J,bi,bj)
& * _maskS(OB_Ie(J,bi,bj),J,K,bi,bj)
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PERP
if ( _maskW(OB_Ie(J,bi,bj) ,J,K,bi,bj) .NE. 0. .AND.
& _maskW(OB_Ie(J,bi,bj)-2,J,K,bi,bj) .NE. 0. )
& uFld(OB_Ie(J,bi,bj)-1,J,bi,bj) = 0.5 _d 0 *
& ( uFld(OB_Ie(J,bi,bj) ,J,bi,bj) +
& uFld(OB_Ie(J,bi,bj)-2,J,bi,bj) ) *
& _maskW(OB_Ie(J,bi,bj)-1,J,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PERP */
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PAR
if ( _maskS(OB_Ie(J,bi,bj) ,J,K,bi,bj) .NE. 0. .AND.
& _maskS(OB_Ie(J,bi,bj)-2,J,K,bi,bj) .NE. 0. )
& vFld(OB_Ie(J,bi,bj)-1,J,bi,bj) = 0.5 _d 0 *
& ( vFld(OB_Ie(J,bi,bj) ,J,bi,bj) +
& vFld(OB_Ie(J,bi,bj)-2,J,bi,bj) ) *
& _maskS(OB_Ie(J,bi,bj)-1,J,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PAR */
# endif /* OBCS_SEAICE_COMPUTE_UVICE */
ENDIF
ENDDO
endif
# endif /* ALLOW_OBCS_EAST */
# ifdef ALLOW_OBCS_WEST
if ( OBWuicefile .NE. ' ' ) then
DO J=1-Oly,sNy+Oly
C Western boundary
IF (OB_Iw(J,bi,bj).NE.0) THEN
# ifdef OBCS_SEAICE_COMPUTE_UVICE
uFld(OB_Iw(J,bi,bj)+1,J,bi,bj)=
& _maskW(OB_Iw(J,bi,bj)+1,J,K,bi,bj) *
& uFld(OB_Iw(J,bi,bj)+2,J,bi,bj)
vFld(OB_Iw(J,bi,bj)+1,J,bi,bj)=
& _maskS(OB_Iw(J,bi,bj)+1,J,K,bi,bj) *
& vFld(OB_Iw(J,bi,bj)+2,J,bi,bj)
else /* OBCS_SEAICE_COMPUTE_UVICE */
# ifdef OBCS_SEAICE_AVOID_CONVERGENCE
uFld(OB_Iw(J,bi,bj)+1,J,bi,bj)=
& min(OBWuice(J,bi,bj),uFld(OB_Iw(J,bi,bj)+1,J,bi,bj))
& * _maskW(OB_Iw(J,bi,bj)+1,J,K,bi,bj)
else /* OBCS_SEAICE_AVOID_CONVERGENCE */
uFld(OB_Iw(J,bi,bj)+1,J,bi,bj)=OBWuice(J,bi,bj)
& * _maskW(OB_Iw(J,bi,bj)+1,J,K,bi,bj)
# endif /* OBCS_SEAICE_AVOID_CONVERGENCE */
vFld(OB_Iw(J,bi,bj),J,bi,bj)=OBWvice(J,bi,bj)
& * _maskS(OB_Iw(J,bi,bj),J,K,bi,bj)
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PERP
if ( _maskW(OB_Iw(J,bi,bj)+1,J,K,bi,bj) .NE. 0. .AND.
& _maskW(OB_Iw(J,bi,bj)+3,J,K,bi,bj) .NE. 0. )
& uFld(OB_Iw(J,bi,bj)+2,J,bi,bj) = 0.5 _d 0 *
& ( uFld(OB_Iw(J,bi,bj)+1,J,bi,bj) +
& uFld(OB_Iw(J,bi,bj)+3,J,bi,bj) ) *
& _maskW(OB_Iw(J,bi,bj)+2,J,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PERP */
# ifdef OBCS_SEAICE_SMOOTH_UVICE_PAR
if ( _maskS(OB_Iw(J,bi,bj) ,J,K,bi,bj) .NE. 0. .AND.
& _maskS(OB_Iw(J,bi,bj)+2,J,K,bi,bj) .NE. 0. )
& vFld(OB_Iw(J,bi,bj)+1,J,bi,bj) = 0.5 _d 0 *
& ( vFld(OB_Iw(J,bi,bj) ,J,bi,bj) +
& vFld(OB_Iw(J,bi,bj)+2,J,bi,bj) ) *
& _maskS(OB_Iw(J,bi,bj)+1,J,K,bi,bj)
# endif /* OBCS_SEAICE_SMOOTH_UVICE_PAR */
# endif /* OBCS_SEAICE_COMPUTE_UVICE */
ENDIF
ENDDO
endif
# endif /* ALLOW_OBCS_WEST */
ENDDO
ENDDO
#endif /* defined (ALLOW_OBCS) && defined (ALLOW_SEAICE) */
RETURN
END