C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_apply_seaice.F,v 1.12 2012/09/20 19:04:46 dimitri Exp $
C $Name: $
#include "OBCS_OPTIONS.h"
#ifdef ALLOW_SEAICE
# include "SEAICE_OPTIONS.h"
#endif
CBOP
C !ROUTINE: OBCS_APPLY_SEAICE
C !INTERFACE:
SUBROUTINE OBCS_APPLY_SEAICE( myThid )
C !DESCRIPTION:
C *==========================================================*
C | S/R OBCS_APPLY_SEAICE
C *==========================================================*
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
c#include "OBCS_PARAMS.h"
#include "OBCS_GRID.h"
#include "OBCS_SEAICE.h"
#ifdef ALLOW_SEAICE
# include "SEAICE_SIZE.h"
# include "SEAICE_PARAMS.h"
# include "SEAICE.h"
#endif
C !INPUT/OUTPUT PARAMETERS:
C == Routine Arguments ==
C myThid :: my Thread Id number
INTEGER myThid
CEOP
#if (defined (ALLOW_OBCS) defined (ALLOW_SEAICE))
C !LOCAL VARIABLES:
C == Local variables ==
INTEGER bi, bj
INTEGER i, j
INTEGER Iobc, Jobc
#ifdef OBCS_SEAICE_SMOOTH_EDGE
INTEGER k
_RL edge_val
#endif
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
#ifdef ALLOW_OBCS_NORTH
IF ( tileHasOBN(bi,bj) ) THEN
C Set model variables to OB values on Northern Boundary
DO i=1-OLx,sNx+OLx
Jobc = OB_Jn(I,bi,bj)
IF ( Jobc.NE.OB_indexNone ) THEN
HEFF (i,Jobc,bi,bj) = OBNh (i,bi,bj)
AREA (i,Jobc,bi,bj) = OBNa (i,bi,bj)
HSNOW(i,Jobc,bi,bj) = OBNsn(i,bi,bj)
# ifdef SEAICE_VARIABLE_SALINITY
HSALT(i,Jobc,bi,bj) = OBNsl(i,bi,bj)
# endif
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_NORTH */
#ifdef ALLOW_OBCS_SOUTH
IF ( tileHasOBS(bi,bj) ) THEN
C Set model variables to OB values on Southern Boundary
DO i=1-OLx,sNx+OLx
Jobc = OB_Js(I,bi,bj)
IF ( Jobc.NE.OB_indexNone ) THEN
HEFF (i,Jobc,bi,bj) = OBSh (i,bi,bj)
AREA (i,Jobc,bi,bj) = OBSa (i,bi,bj)
HSNOW(i,Jobc,bi,bj) = OBSsn(i,bi,bj)
# ifdef SEAICE_VARIABLE_SALINITY
HSALT(i,Jobc,bi,bj) = OBSsl(i,bi,bj)
# endif
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_SOUTH */
#ifdef ALLOW_OBCS_EAST
IF ( tileHasOBE(bi,bj) ) THEN
C Set model variables to OB values on Eastern Boundary
DO j=1-OLy,sNy+OLy
Iobc = OB_Ie(J,bi,bj)
IF ( Iobc.NE.OB_indexNone ) THEN
HEFF (Iobc,j,bi,bj) = OBEh (j,bi,bj)
AREA (Iobc,j,bi,bj) = OBEa (j,bi,bj)
HSNOW(Iobc,j,bi,bj) = OBEsn(j,bi,bj)
# ifdef SEAICE_VARIABLE_SALINITY
HSALT(Iobc,j,bi,bj) = OBEsl(j,bi,bj)
# endif
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_EAST */
#ifdef ALLOW_OBCS_WEST
IF ( tileHasOBW(bi,bj) ) THEN
C Set model variables to OB values on Western Boundary
DO j=1-OLy,sNy+OLy
Iobc = OB_Iw(j,bi,bj)
IF ( Iobc.NE.OB_indexNone ) THEN
HEFF (Iobc,j,bi,bj) = OBWh (j,bi,bj)
AREA (Iobc,j,bi,bj) = OBWa (j,bi,bj)
HSNOW(Iobc,j,bi,bj) = OBWsn(j,bi,bj)
# ifdef SEAICE_VARIABLE_SALINITY
HSALT(Iobc,j,bi,bj) = OBWsl(j,bi,bj)
# endif
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_WEST */
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#ifdef OBCS_SEAICE_SMOOTH_EDGE
k = 1
#ifdef ALLOW_OBCS_NORTH
IF ( tileHasOBN(bi,bj) ) THEN
C Northern Boundary
DO i=1-OLx,sNx+OLx
Jobc = OB_Jn(I,bi,bj)
IF ( Jobc.NE.OB_indexNone ) THEN
IF ( _maskS(i,Jobc-1,k,bi,bj) .NE. 0. ) THEN
IF ( SEAICEadvHeff .AND. OBNhfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HEFF(i,Jobc-1,bi,bj)+HEFF(i,Jobc-2,bi,bj))
HEFF(i,Jobc-1,bi,bj) = edge_val
HEFF(i,Jobc-2,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvArea .AND. OBNafile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (AREA(i,Jobc-1,bi,bj)+AREA(i,Jobc-2,bi,bj))
AREA(i,Jobc-1,bi,bj) = edge_val
AREA(i,Jobc-2,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvSNOW .AND. OBNsnfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSNOW(i,Jobc-1,bi,bj)+HSNOW(i,Jobc-2,bi,bj))
HSNOW(i,Jobc-1,bi,bj) = edge_val
HSNOW(i,Jobc-2,bi,bj) = edge_val
ENDIF
# ifdef SEAICE_VARIABLE_SALINITY
IF ( SEAICEadvSALT .AND. OBNslfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSALT(i,Jobc-1,bi,bj)+HSALT(i,Jobc-2,bi,bj))
HSALT(i,Jobc-1,bi,bj) = edge_val
HSALT(i,Jobc-2,bi,bj) = edge_val
ENDIF
# endif
ENDIF
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_NORTH */
#ifdef ALLOW_OBCS_SOUTH
IF ( tileHasOBS(bi,bj) ) THEN
C Southern Boundary
DO i=1-OLx,sNx+OLx
Jobc = OB_Js(I,bi,bj)
IF ( Jobc.NE.OB_indexNone ) THEN
IF ( _maskS(i,Jobc+2,k,bi,bj) .NE. 0. ) THEN
IF ( SEAICEadvHeff .AND. OBNhfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HEFF(i,Jobc+1,bi,bj)+HEFF(i,Jobc+2,bi,bj))
HEFF(i,Jobc+1,bi,bj) = edge_val
HEFF(i,Jobc+2,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvArea .AND. OBNafile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (AREA(i,Jobc+1,bi,bj)+AREA(i,Jobc+2,bi,bj))
AREA(i,Jobc+1,bi,bj) = edge_val
AREA(i,Jobc+2,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvSNOW .AND. OBNsnfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSNOW(i,Jobc+1,bi,bj)+HSNOW(i,Jobc+2,bi,bj))
HSNOW(i,Jobc+1,bi,bj) = edge_val
HSNOW(i,Jobc+2,bi,bj) = edge_val
ENDIF
# ifdef SEAICE_VARIABLE_SALINITY
IF ( SEAICEadvSALT .AND. OBNslfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSALT(i,Jobc+1,bi,bj)+HSALT(i,Jobc+2,bi,bj))
HSALT(i,Jobc+1,bi,bj) = edge_val
HSALT(i,Jobc+2,bi,bj) = edge_val
ENDIF
# endif
ENDIF
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_SOUTH */
#ifdef ALLOW_OBCS_EAST
IF ( tileHasOBE(bi,bj) ) THEN
C Eastern Boundary
DO j=1-OLy,sNy+OLy
Iobc = OB_Ie(J,bi,bj)
IF ( Iobc.NE.OB_indexNone ) THEN
IF ( _maskW(Iobc-1,j,k,bi,bj) .NE. 0. ) THEN
IF ( SEAICEadvHeff .AND. OBNhfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HEFF(Iobc-1,j,bi,bj)+HEFF(Iobc-2,j,bi,bj))
HEFF(Iobc-1,j,bi,bj) = edge_val
HEFF(Iobc-2,j,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvArea .AND. OBNafile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (AREA(Iobc-1,j,bi,bj)+AREA(Iobc-2,j,bi,bj))
AREA(Iobc-1,j,bi,bj) = edge_val
AREA(Iobc-2,j,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvSNOW .AND. OBNsnfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSNOW(Iobc-1,j,bi,bj)+HSNOW(Iobc-2,j,bi,bj))
HSNOW(Iobc-1,j,bi,bj) = edge_val
HSNOW(Iobc-2,j,bi,bj) = edge_val
ENDIF
# ifdef SEAICE_VARIABLE_SALINITY
IF ( SEAICEadvSALT .AND. OBNslfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSALT(Iobc-1,j,bi,bj)+HSALT(Iobc-2,j,bi,bj))
HSALT(Iobc-1,j,bi,bj) = edge_val
HSALT(Iobc-2,j,bi,bj) = edge_val
ENDIF
# endif
ENDIF
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_EAST */
#ifdef ALLOW_OBCS_WEST
IF ( tileHasOBW(bi,bj) ) THEN
C Western Boundary
DO j=1-OLy,sNy+OLy
Iobc = OB_Iw(j,bi,bj)
IF ( Iobc.NE.OB_indexNone ) THEN
IF ( _maskW(Iobc+2,j,k,bi,bj) .NE. 0. ) THEN
IF ( SEAICEadvHeff .AND. OBNhfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HEFF(Iobc+1,j,bi,bj)+HEFF(Iobc+2,j,bi,bj))
HEFF(Iobc+1,j,bi,bj) = edge_val
HEFF(Iobc+2,j,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvArea .AND. OBNafile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (AREA(Iobc+1,j,bi,bj)+AREA(Iobc+2,j,bi,bj))
AREA(Iobc+1,j,bi,bj) = edge_val
AREA(Iobc+2,j,bi,bj) = edge_val
ENDIF
IF ( SEAICEadvSNOW .AND. OBNsnfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSNOW(Iobc+1,j,bi,bj)+HSNOW(Iobc+2,j,bi,bj))
HSNOW(Iobc+1,j,bi,bj) = edge_val
HSNOW(Iobc+2,j,bi,bj) = edge_val
ENDIF
# ifdef SEAICE_VARIABLE_SALINITY
IF ( SEAICEadvSALT .AND. OBNslfile .NE. ' ' ) THEN
edge_val = 0.5 _d 0 *
& (HSALT(Iobc+1,j,bi,bj)+HSALT(Iobc+2,j,bi,bj))
HSALT(Iobc+1,j,bi,bj) = edge_val
HSALT(Iobc+2,j,bi,bj) = edge_val
ENDIF
# endif
ENDIF
ENDIF
ENDDO
ENDIF
#endif /* ALLOW_OBCS_WEST */
#endif /* OBCS_SEAICE_SMOOTH_EDGE */
ENDDO
ENDDO
#ifdef ALLOW_OBCS_SEAICE_SPONGE
IF ( useSeaiceSponge ) THEN
CALL OBCS_SEAICE_SPONGE_A( myThid )
CALL OBCS_SEAICE_SPONGE_H( myThid )
ENDIF
#endif /* ALLOW_OBCS_SEAICE_SPONGE */
#endif /* defined (ALLOW_OBCS) && defined (ALLOW_SEAICE) */
RETURN
END