C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_check_depths.F,v 1.5 2012/09/18 19:45:21 jmc Exp $ C $Name: $ #include "OBCS_OPTIONS.h" SUBROUTINE OBCS_CHECK_DEPTHS( myThid ) C *==========================================================* C | SUBROUTINE OBCS_CHECK_DEPTHS C | o Check for non-zero normal gradient across open C | boundaries C | o fix them if required and print a message C *==========================================================* C *==========================================================* IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "OBCS_PARAMS.h" #include "OBCS_GRID.h" C === Routine arguments === C myThid :: my Thread Id number INTEGER myThid #ifdef ALLOW_OBCS C === Local variables === C msgBuf :: Informational/error message buffer CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER bi, bj, i, j, ichanged IF ( OBCSfixTopo ) THEN C-- Modify topography to ensure that outward d(topography)/dn >= 0, C topography at open boundary points must be equal or shallower than C topography one grid-point inward from open boundary ichanged = 0 DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) #ifdef ALLOW_OBCS_NORTH DO i=1,sNx j = OB_Jn(i,bi,bj) IF ( j.NE.OB_indexNone ) THEN IF ( R_low(i,j,bi,bj) .LT. R_low(i,j-1,bi,bj) ) THEN ichanged = ichanged + 1 R_low(i,j,bi,bj) = R_low(i,j-1,bi,bj) WRITE(msgBuf,'(2A,2I6,2I4)') & 'OBCS_CHECK_DEPTHS: fixed topography at ', & '(i,j,bi,bj)=', i, j, bi, bj CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid) ENDIF ENDIF ENDDO #endif #ifdef ALLOW_OBCS_SOUTH DO i=1,sNx j = OB_Js(i,bi,bj) IF ( j.NE.OB_indexNone ) THEN IF ( R_low(i,j,bi,bj) .LT. R_low(i,j+1,bi,bj) ) THEN ichanged = ichanged + 1 R_low(i,j,bi,bj) = R_low(i,j+1,bi,bj) WRITE(msgBuf,'(2A,2I6,2I4)') & 'OBCS_CHECK_DEPTHS: fixed topography at ', & '(i,j,bi,bj)=', i, j, bi, bj CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid) ENDIF ENDIF ENDDO #endif #ifdef ALLOW_OBCS_EAST DO j=1,sNy i = OB_Ie(j,bi,bj) IF ( i.NE.OB_indexNone ) THEN IF ( R_low(i,j,bi,bj) .LT. R_low(i-1,j,bi,bj) ) THEN ichanged = ichanged + 1 R_low(i,j,bi,bj) = R_low(i-1,j,bi,bj) WRITE(msgBuf,'(2A,2I6,2I4)') & 'OBCS_CHECK_DEPTHS: fixed topography at ', & '(i,j,bi,bj)=', i, j, bi, bj CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid) ENDIF ENDIF ENDDO #endif C Western boundary #ifdef ALLOW_OBCS_WEST DO j=1,sNy i = OB_Iw(j,bi,bj) IF ( i.NE.OB_indexNone ) THEN IF ( R_low(i,j,bi,bj) .LT. R_low(i+1,j,bi,bj) ) THEN ichanged = ichanged + 1 R_low(i,j,bi,bj) = R_low(i+1,j,bi,bj) WRITE(msgBuf,'(2A,2I6,2I4)') & 'OBCS_CHECK_DEPTHS: fixed topography at ', & '(i,j,bi,bj)=', i, j, bi, bj CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid) ENDIF ENDIF ENDDO #endif ENDDO ENDDO C-- some diagnostics to stdout CALL GLOBAL_SUM_INT( ichanged, myThid ) IF ( ichanged .GT. 0 ) THEN _BEGIN_MASTER(myThid) WRITE(msgBuf,'(2A,I7,A)') 'OBCS_CHECK_DEPTHS: ', & 'Topography gradients normal to open boundaries:' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A,I7,A)') 'OBCS_CHECK_DEPTHS: ', & '==> corrected ', ichanged,' problematic grid-points' c WRITE(msgBuf,'(A,I7,A,A)') c & 'OBCS message: corrected ', ichanged, c & ' instances of problematic topography gradients', c & ' normal to open boundaries' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) _END_MASTER(myThid) ENDIF C endif (OBCSfixTopo) ENDIF #endif /* ALLOW_OBCS */ RETURN END