Back to home page

MITgcm

 
 

    


File indexing completed on 2024-06-06 05:11:00 UTC

view on githubraw file Latest commit af61e5eb on 2024-06-06 03:30:35 UTC
42c525bfb4 Alis*0001 #include "OBCS_OPTIONS.h"
                0002 
c34c2efdb0 Jean*0003 CBOP
                0004 C     !ROUTINE: OBCS_CHECK
                0005 C     !INTERFACE:
42c525bfb4 Alis*0006       SUBROUTINE OBCS_CHECK( myThid )
c34c2efdb0 Jean*0007 
                0008 C     !DESCRIPTION:
2d12bccb16 Jean*0009 C     *==========================================================*
                0010 C     | SUBROUTINE OBCS_CHECK
c34c2efdb0 Jean*0011 C     | o Check OBC parameters and set-up
2d12bccb16 Jean*0012 C     *==========================================================*
42c525bfb4 Alis*0013 
c34c2efdb0 Jean*0014 C     !USES:
                0015       IMPLICIT NONE
42c525bfb4 Alis*0016 C     === Global variables ===
                0017 #include "SIZE.h"
                0018 #include "EEPARAMS.h"
63e7cf8192 Jean*0019 #include "PARAMS.h"
fb919e1dd2 Jean*0020 #include "GRID.h"
9b4f2a04e2 Jean*0021 #include "OBCS_PARAMS.h"
                0022 #include "OBCS_GRID.h"
c7c4b57180 Dimi*0023 #include "OBCS_SEAICE.h"
00cd44357b Jean*0024 #ifdef ALLOW_PTRACERS
                0025 # include "PTRACERS_SIZE.h"
                0026 # include "PTRACERS_PARAMS.h"
                0027 # include "OBCS_PTRACERS.h"
                0028 #endif /* ALLOW_PTRACERS */
42c525bfb4 Alis*0029 
c34c2efdb0 Jean*0030 C     !INPUT/OUTPUT PARAMETERS:
42c525bfb4 Alis*0031 C     === Routine arguments ===
2d12bccb16 Jean*0032 C     myThid   :: My thread Id number
42c525bfb4 Alis*0033       INTEGER myThid
c34c2efdb0 Jean*0034 CEOP
42c525bfb4 Alis*0035 
                0036 #ifdef ALLOW_OBCS
                0037 
fb919e1dd2 Jean*0038 C     !FUNCTIONS:
                0039       INTEGER  ILNBLNK
                0040       EXTERNAL ILNBLNK
                0041 
c34c2efdb0 Jean*0042 C     !LOCAL VARIABLES:
fb919e1dd2 Jean*0043 C     msgBuf  :: Informational/error message buffer
                0044 C     bi,bj   :: tile indices
                0045 C     i, j    :: Loop counters
42c525bfb4 Alis*0046       CHARACTER*(MAX_LEN_MBUF) msgBuf
fb919e1dd2 Jean*0047       INTEGER bi, bj
                0048       INTEGER i, j
                0049       INTEGER ln
f4098ccf3f Jean*0050       INTEGER ioUnit
7f7a43158f Jean*0051       INTEGER errCount
abfe198bce Mart*0052 #ifdef ALLOW_OBCS_BALANCE
                0053 C     number of tiles with open boundaries
                0054       INTEGER nTileWithActiveOB
                0055 #endif
f4098ccf3f Jean*0056 
                0057       ioUnit = standardMessageUnit
42c525bfb4 Alis*0058 
f4098ccf3f Jean*0059 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0060 C--   Print OBCS set-up summary:
                0061 
                0062       _BEGIN_MASTER(myThid)
7f7a43158f Jean*0063 
                0064       WRITE(msgBuf,'(A)') 'OBCS_CHECK: #define ALLOW_OBCS'
                0065       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0066 
abfe198bce Mart*0067 #ifdef ALLOW_OBCS_BALANCE
                0068       IF ( OBCSbalanceSurf .AND. .NOT. useRealFreshWaterFlux ) THEN
                0069         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0070      &       'OBCSbalanceSurf requires useRealFreshWaterFlux=T'
                0071         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0072      &                      SQUEEZE_RIGHT, myThid )
                0073         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0074      &       'resetting OBCSbalanceSurf to False'
                0075         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0076      &                      SQUEEZE_RIGHT, myThid )
                0077         OBCSbalanceSurf = .FALSE.
                0078       ENDIF
                0079 #endif /* ALLOW_OBCS_BALANCE */
                0080 
e99fa9b078 Mart*0081       WRITE(msgBuf,'(A)')
                0082      &'// ======================================================='
f4098ccf3f Jean*0083       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
e99fa9b078 Mart*0084       WRITE(msgBuf,'(A)') '// OBCS_CHECK: OBCS configuration summary'
                0085       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0086       WRITE(msgBuf,'(A)')
                0087      &'// ======================================================='
                0088       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0089       WRITE(msgBuf,'(A)') ' '
                0090       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0091 C
4fb81a5efb Jean*0092       CALL WRITE_0D_L( useOBCSprescribe, INDEX_NONE,
                0093      &   'useOBCSprescribe =', ' /* prescribe OB values */')
f4098ccf3f Jean*0094       CALL WRITE_0D_L( useOBCSbalance, INDEX_NONE,
                0095      &   'useOBCSbalance =', ' /* balance the flow through OB */')
                0096       IF ( useOBCSbalance ) THEN
abfe198bce Mart*0097         CALL WRITE_0D_L( OBCSbalanceSurf, INDEX_NONE,
                0098      &   'OBCSbalanceSurf =', ' /* include surf. flux in balance */')
f4098ccf3f Jean*0099         CALL WRITE_0D_RL( OBCS_balanceFacN, INDEX_NONE,
                0100      &   'OBCS_balanceFacN =',
                0101      &   ' /* Northern OB Factor for balancing OB flow [-] */')
                0102         CALL WRITE_0D_RL( OBCS_balanceFacS, INDEX_NONE,
                0103      &   'OBCS_balanceFacS =',
                0104      &   ' /* Southern OB Factor for balancing OB flow [-] */')
                0105         CALL WRITE_0D_RL( OBCS_balanceFacE, INDEX_NONE,
                0106      &   'OBCS_balanceFacE =',
                0107      &   ' /* Eastern  OB Factor for balancing OB flow [-] */')
                0108         CALL WRITE_0D_RL( OBCS_balanceFacW, INDEX_NONE,
                0109      &   'OBCS_balanceFacW =',
                0110      &   ' /* Western  OB Factor for balancing OB flow [-] */')
                0111       ENDIF
e99fa9b078 Mart*0112 C
                0113       CALL WRITE_0D_L( OBCSfixTopo,   INDEX_NONE,
                0114      & 'OBCSfixTopo =',
                0115      & '  /* mod. topo to have zero gradient across boundaries. */')
52fba54157 Jean*0116       CALL WRITE_0D_RL( OBCS_uvApplyFac, INDEX_NONE,
                0117      &   'OBCS_uvApplyFac =',
                0118      &   ' /* Factor to apply to U,V 2nd column/row */')
4fb81a5efb Jean*0119       CALL WRITE_0D_I( OBCS_u1_adv_T, INDEX_NONE,
                0120      &   'OBCS_u1_adv_T =', ' /* Temp uses upwind adv-scheme @ OB */')
                0121       CALL WRITE_0D_I( OBCS_u1_adv_S, INDEX_NONE,
                0122      &   'OBCS_u1_adv_S =', ' /* Salt uses upwind adv-scheme @ OB */')
00cd44357b Jean*0123 #ifdef ALLOW_PTRACERS
                0124       IF ( usePTRACERS ) THEN
                0125        CALL WRITE_1D_I( OBCS_u1_adv_Tr, PTRACERS_numInUse, INDEX_NONE,
                0126      &   'OBCS_u1_adv_Tr =', ' /* pTr uses upwind adv-scheme @ OB */')
                0127       ENDIF
                0128 #endif /* ALLOW_PTRACERS */
f4098ccf3f Jean*0129       CALL WRITE_0D_RL( OBCS_monitorFreq, INDEX_NONE,
                0130      &   'OBCS_monitorFreq =', ' /* monitor output frequency [s] */')
                0131       CALL WRITE_0D_I( OBCS_monSelect, INDEX_NONE, 'OBCS_monSelect =',
                0132      &                  ' /* select group of variables to monitor */')
e99fa9b078 Mart*0133       CALL WRITE_0D_L( OBCSprintDiags,   INDEX_NONE,
672b822630 Jean*0134      &   'OBCSprintDiags =', '  /* print some OBCS diagnostics. */')
e99fa9b078 Mart*0135 C
6f4cf52d27 Dimi*0136       CALL WRITE_0D_L( useOBCStides, INDEX_NONE,
                0137      &   'useOBCStides =', ' /* apply tidal forcing through OB */')
672b822630 Jean*0138       IF ( useOBCStides ) THEN
                0139        CALL WRITE_0D_I( OBCS_nTidalComp, INDEX_NONE,
                0140      &   'OBCS_nTidalComp =', ' /* number of tidal-Comp to use */')
                0141        CALL WRITE_1D_RL( OBCS_tidalPeriod, OBCS_tideCompSize, INDEX_K,
                0142      &   'OBCS_tidalPeriod = ', ' /* (s) */')
                0143       ENDIF
e99fa9b078 Mart*0144 C
                0145       CALL WRITE_0D_L( useOrlanskiNorth,   INDEX_NONE,
                0146      & 'useOrlanskiNorth =', '  /* use Orlanski for northern bound. */')
                0147       CALL WRITE_0D_L( useOrlanskiSouth,   INDEX_NONE,
                0148      & 'useOrlanskiSouth =', '  /* use Orlanski for southern bound. */')
                0149       CALL WRITE_0D_L( useOrlanskiEast,    INDEX_NONE,
                0150      & 'useOrlanskiEast  =', '  /* use Orlanski for eastern bound. */')
                0151       CALL WRITE_0D_L( useOrlanskiWest,    INDEX_NONE,
                0152      & 'useOrlanskiWest  =', '  /* use Orlanski for western bound. */')
                0153 C
                0154       CALL WRITE_0D_L( useStevensNorth,   INDEX_NONE,
                0155      & 'useStevensNorth =', '  /* use Stevens for northern bound. */')
                0156       CALL WRITE_0D_L( useStevensSouth,   INDEX_NONE,
                0157      & 'useStevensSouth =', '  /* use Stevens for southern bound. */')
                0158       CALL WRITE_0D_L( useStevensEast,    INDEX_NONE,
                0159      & 'useStevensEast  =', '  /* use Stevens for eastern bound. */')
                0160       CALL WRITE_0D_L( useStevensWest,    INDEX_NONE,
                0161      & 'useStevensWest  =', '  /* use Stevens for western bound. */')
                0162       CALL WRITE_0D_L( useStevensPhaseVel,    INDEX_NONE,
                0163      & 'useStevensPhaseVel  =', '  /* include phase vel. term. */')
                0164       CALL WRITE_0D_L( useStevensAdvection,    INDEX_NONE,
                0165      & 'useStevensAdvection  =', '  /* include advection term. */')
42f1782a7e Jean*0166       CALL WRITE_0D_RS( TrelaxStevens, INDEX_NONE,
e99fa9b078 Mart*0167      & 'TrelaxStevens =',
                0168      & ' /* relaxation time scale for theta ( s ). */')
42f1782a7e Jean*0169       CALL WRITE_0D_RS( SrelaxStevens, INDEX_NONE,
e99fa9b078 Mart*0170      & 'SrelaxStevens =',
                0171      & ' /* relaxation time scale for salinity ( s ). */')
                0172 C
                0173       CALL WRITE_0D_L( useOBCSsponge,   INDEX_NONE,
                0174      & 'useOBCSSponge =', '  /* use sponge along boundaries */')
                0175       IF ( useOBCSSponge ) THEN
                0176        CALL WRITE_0D_L( OBCSsponge_N,   INDEX_NONE,
                0177      & 'OBCSSponge_N =', '  /* use sponge for northern boundary */')
                0178        CALL WRITE_0D_L( OBCSsponge_S,   INDEX_NONE,
                0179      & 'OBCSSponge_S =', '  /* use sponge for southern boundary */')
                0180        CALL WRITE_0D_L( OBCSsponge_E,    INDEX_NONE,
                0181      & 'OBCSSponge_E =', '  /* use sponge for eastern boundary */')
                0182        CALL WRITE_0D_L( OBCSsponge_W,    INDEX_NONE,
                0183      & 'OBCSSponge_W =', '  /* use sponge for western boundary */')
                0184        CALL WRITE_0D_L( OBCSsponge_UatNS,   INDEX_NONE,
                0185      & 'OBCSSponge_UatNS =', '  /* use u-vel. sponge at N/S bound. */')
                0186        CALL WRITE_0D_L( OBCSsponge_UatEW,   INDEX_NONE,
                0187      & 'OBCSSponge_UatEW =', '  /* use u-vel. sponge at E/W bound. */')
                0188        CALL WRITE_0D_L( OBCSsponge_VatNS,   INDEX_NONE,
                0189      & 'OBCSSponge_VatNS =', '  /* use v-vel. sponge at N/S bound. */')
                0190        CALL WRITE_0D_L( OBCSsponge_UatEW,   INDEX_NONE,
                0191      & 'OBCSSponge_VatEW =', '  /* use v-vel. sponge at E/W bound. */')
                0192        CALL WRITE_0D_L( OBCSsponge_Theta,   INDEX_NONE,
                0193      & 'OBCSSponge_Theta =', '  /* use sponge for Theta. */')
                0194        CALL WRITE_0D_L( OBCSsponge_Salt,   INDEX_NONE,
                0195      & 'OBCSSponge_Salt =', '  /* use sponge for salinity. */')
                0196        CALL WRITE_0D_L( useLinearSponge,   INDEX_NONE,
                0197      & 'useLinearSponge =', '  /* use linear sponge. */')
                0198        CALL WRITE_0D_I( spongeThickness, INDEX_NONE,
                0199      & 'spongeThickness =',
                0200      & ' /* number grid points in sponge */')
42f1782a7e Jean*0201        CALL WRITE_0D_RS( Urelaxobcsinner, INDEX_NONE,
e99fa9b078 Mart*0202      &  'Urelaxobcsinner =',
                0203      & ' /* innermost relaxation time scale, u-velocity ( s ). */')
42f1782a7e Jean*0204        CALL WRITE_0D_RS( Urelaxobcsbound, INDEX_NONE,
e99fa9b078 Mart*0205      &  'Urelaxobcsbound =',
                0206      & ' /* boudnary relaxation time scale, u-velocity ( s ). */')
42f1782a7e Jean*0207        CALL WRITE_0D_RS( Vrelaxobcsinner, INDEX_NONE,
e99fa9b078 Mart*0208      &  'Vrelaxobcsinner =',
                0209      & ' /* innermost relaxation time scale, v-velocity ( s ). */')
42f1782a7e Jean*0210        CALL WRITE_0D_RS( Vrelaxobcsbound, INDEX_NONE,
e99fa9b078 Mart*0211      &  'Vrelaxobcsbound =',
                0212      & ' /* boundary relaxation time scale, v-velocity ( s ). */')
                0213       ENDIF
af61e5eb16 Mart*0214       CALL WRITE_0D_L( useSeaiceSponge, INDEX_NONE,
                0215      & 'useSeaiceSponge =', '  /* use sponge for sea ice variables */')
                0216       CALL WRITE_0D_L( useSeaiceNeumann, INDEX_NONE,
                0217      & 'useSeaiceNeumann =',
                0218      & '  /* use Neumann conditions for sea ice variables */')
e99fa9b078 Mart*0219 C
fb919e1dd2 Jean*0220       ln = ILNBLNK(insideOBmaskFile)
                0221       IF ( ln.GT.0 ) THEN
                0222         CALL WRITE_0D_C( insideOBmaskFile, ln, INDEX_NONE,
                0223      &   'insideOBmaskFile =',
                0224      &   ' /* used to specify Inside OB region mask */')
                0225       ENDIF
c816a80284 Jean*0226       CALL WRITE_0D_I( OB_indexNone, INDEX_NONE, 'OB_indexNone =',
                0227      &                 ' /* null value for OB index (i.e. no OB) */')
c34c2efdb0 Jean*0228 
f7adb5bd83 Jean*0229       IF ( debugLevel.GE.debLevA ) THEN
c34c2efdb0 Jean*0230        DO bj = 1,nSy
                0231         DO bi = 1,nSx
f7adb5bd83 Jean*0232          WRITE(msgBuf,'(A,2(I4,A))')
                0233      &     '======== Tile bi=', bi, ' , bj=', bj, ' ========'
f4098ccf3f Jean*0234          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
f7adb5bd83 Jean*0235          WRITE(msgBuf,'(A)') ' OB_Jn = /* Northern OB local indices */'
f4098ccf3f Jean*0236          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
4fb81a5efb Jean*0237          CALL PRINT_LIST_I( OB_Jn(1-OLx,bi,bj), 1-OLx, sNx+OLx, INDEX_I,
f4098ccf3f Jean*0238      &                     .FALSE., .TRUE., ioUnit )
f7adb5bd83 Jean*0239          WRITE(msgBuf,'(A)') ' OB_Js = /* Southern OB local indices */'
f4098ccf3f Jean*0240          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
4fb81a5efb Jean*0241          CALL PRINT_LIST_I( OB_Js(1-OLx,bi,bj), 1-OLx, sNx+OLx, INDEX_I,
f4098ccf3f Jean*0242      &                     .FALSE., .TRUE., ioUnit )
f7adb5bd83 Jean*0243          WRITE(msgBuf,'(A)') ' OB_Ie = /* Eastern OB local indices */'
f4098ccf3f Jean*0244          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
4fb81a5efb Jean*0245          CALL PRINT_LIST_I( OB_Ie(1-OLy,bi,bj), 1-OLy, sNy+OLy, INDEX_J,
f4098ccf3f Jean*0246      &                     .FALSE., .TRUE., ioUnit )
f7adb5bd83 Jean*0247          WRITE(msgBuf,'(A)') ' OB_Iw = /* Western OB local indices */'
f4098ccf3f Jean*0248          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
4fb81a5efb Jean*0249          CALL PRINT_LIST_I( OB_Iw(1-OLy,bi,bj), 1-OLy, sNy+OLy, INDEX_J,
f4098ccf3f Jean*0250      &                     .FALSE., .TRUE., ioUnit )
c34c2efdb0 Jean*0251         ENDDO
                0252        ENDDO
                0253       ENDIF
                0254 
e99fa9b078 Mart*0255       WRITE(msgBuf,'(A)')
                0256      &'// ======================================================='
                0257       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0258       WRITE(msgBuf,'(A)') '// End of OBCS config. summary'
                0259       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0260       WRITE(msgBuf,'(A)')
                0261      &'// ======================================================='
                0262       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0263       WRITE(msgBuf,'(A)') ' '
f4098ccf3f Jean*0264       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0265 
                0266       _END_MASTER(myThid)
                0267 
                0268 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0269 C--   Check OBCS set-up
                0270 
7f7a43158f Jean*0271 C-    Check each tile set-up
                0272       errCount = 0
c34c2efdb0 Jean*0273       _BEGIN_MASTER( myThid )
7f7a43158f Jean*0274       DO bj = 1,nSy
                0275        DO bi = 1,nSx
c34c2efdb0 Jean*0276 #ifndef ALLOW_OBCS_NORTH
                0277          IF ( tileHasOBN(bi,bj) ) THEN
                0278            WRITE(msgBuf,'(A)')
                0279      &      'OBCS_CHECK: #undef ALLOW_OBCS_NORTH and'
                0280            CALL PRINT_ERROR( msgBuf, myThid )
                0281            WRITE(msgBuf,'(A,2I4,A)')
                0282      &      'OBCS_CHECK: tile bi,bj=',bi,bj, ' has Northern OB'
                0283            CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0284            errCount = errCount + 1
c34c2efdb0 Jean*0285          ENDIF
                0286 #endif
                0287 #ifndef ALLOW_OBCS_SOUTH
                0288          IF ( tileHasOBS(bi,bj) ) THEN
                0289            WRITE(msgBuf,'(A)')
                0290      &      'OBCS_CHECK: #undef ALLOW_OBCS_SOUTH and'
                0291            CALL PRINT_ERROR( msgBuf, myThid )
                0292            WRITE(msgBuf,'(A,2I4,A)')
                0293      &      'OBCS_CHECK: tile bi,bj=',bi,bj, ' has Southern OB'
                0294            CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0295            errCount = errCount + 1
c34c2efdb0 Jean*0296          ENDIF
                0297 #endif
                0298 #ifndef ALLOW_OBCS_EAST
                0299          IF ( tileHasOBE(bi,bj) ) THEN
                0300            WRITE(msgBuf,'(A)')
                0301      &      'OBCS_CHECK: #undef ALLOW_OBCS_EAST and'
                0302            CALL PRINT_ERROR( msgBuf, myThid )
                0303            WRITE(msgBuf,'(A,2I4,A)')
                0304      &      'OBCS_CHECK: tile bi,bj=',bi,bj, ' has Eastern OB'
                0305            CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0306            errCount = errCount + 1
c34c2efdb0 Jean*0307          ENDIF
                0308 #endif
                0309 #ifndef ALLOW_OBCS_WEST
                0310          IF ( tileHasOBW(bi,bj) ) THEN
                0311            WRITE(msgBuf,'(A)')
                0312      &      'OBCS_CHECK: #undef ALLOW_OBCS_WEST and'
                0313            CALL PRINT_ERROR( msgBuf, myThid )
                0314            WRITE(msgBuf,'(A,2I4,A)')
                0315      &      'OBCS_CHECK: tile bi,bj=',bi,bj, ' has Western OB'
                0316            CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0317            errCount = errCount + 1
c34c2efdb0 Jean*0318          ENDIF
                0319 #endif
                0320        ENDDO
7f7a43158f Jean*0321       ENDDO
c34c2efdb0 Jean*0322       _END_MASTER(myThid)
7f7a43158f Jean*0323       CALL GLOBAL_SUM_INT( errCount, myThid )
                0324       IF ( errCount.GE.1 ) THEN
                0325         WRITE(msgBuf,'(A,I6,A)')
                0326      &       'OBCS_CHECK:', errCount,' errors in tile OB set-up'
                0327         CALL PRINT_ERROR( msgBuf, myThid )
                0328         CALL ALL_PROC_DIE( myThid )
                0329         STOP 'ABNORMAL END: S/R OBCS_CHECK'
                0330       ENDIF
                0331 
abfe198bce Mart*0332 #ifdef ALLOW_OBCS_BALANCE
                0333       IF ( OBCSbalanceSurf ) THEN
                0334 C     check if there is any open boundary to balance the flow with
                0335         nTileWithActiveOB  = 0
                0336         DO bj = myByLo(myThid), myByHi(myThid)
                0337          DO bi = myBxLo(myThid), myBxHi(myThid)
                0338 C     Eastern boundary
                0339           IF ( tileHasOBE(bi,bj) .AND. OBCS_balanceFacE .GT. 0. _d 0 )
                0340      &         nTileWithActiveOB = nTileWithActiveOB + 1
                0341 C     Western boundary
                0342           IF ( tileHasOBW(bi,bj) .AND. OBCS_balanceFacW .GT. 0. _d 0 )
                0343      &         nTileWithActiveOB = nTileWithActiveOB + 1
                0344 C     Northern boundary
                0345           IF ( tileHasOBN(bi,bj) .AND. OBCS_balanceFacN .GT. 0. _d 0 )
                0346      &         nTileWithActiveOB = nTileWithActiveOB + 1
                0347 C     Southern boundary
                0348           IF ( tileHasOBS(bi,bj) .AND. OBCS_balanceFacS .GT. 0. _d 0 )
                0349      &         nTileWithActiveOB = nTileWithActiveOB + 1
                0350          ENDDO
                0351         ENDDO
                0352         CALL GLOBAL_SUM_INT( nTileWithActiveOB, myThid )
                0353       ENDIF
                0354 #endif /* ALLOW_OBCS_BALANCE */
                0355 
7f7a43158f Jean*0356 C----------------------------------
                0357 C-    Check options and parameters
                0358       _BEGIN_MASTER( myThid )
                0359       errCount = 0
42c525bfb4 Alis*0360 
fc187b9c6d Mart*0361 #ifdef ALLOW_CD_CODE
                0362       IF ( useCDscheme ) THEN
7f7a43158f Jean*0363         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
509b3e039c Jean*0364      &      'OBCS not yet implemented in CD-Scheme (useCDscheme=T)'
7f7a43158f Jean*0365         CALL PRINT_ERROR( msgBuf, myThid )
                0366         errCount = errCount + 1
fc187b9c6d Mart*0367       ENDIF
                0368 #endif /* ALLOW_CD_CODE */
                0369 
42c525bfb4 Alis*0370 #ifdef ALLOW_ORLANSKI
                0371       WRITE(msgBuf,'(A)') 'OBCS_CHECK: #define ALLOW_ORLANSKI'
f4098ccf3f Jean*0372       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
42c525bfb4 Alis*0373 #else
                0374       IF (useOrlanskiNorth.OR.useOrlanskiSouth.OR.
                0375      &    useOrlanskiEast.OR.useOrlanskiWest) THEN
                0376         WRITE(msgBuf,'(A)')
509b3e039c Jean*0377      &  'OBCS_CHECK: #undef ALLOW_ORLANSKI  and'
2d12bccb16 Jean*0378         CALL PRINT_ERROR( msgBuf, myThid )
42c525bfb4 Alis*0379         WRITE(msgBuf,'(A)')
509b3e039c Jean*0380      &  'OBCS_CHECK: one of useOrlanski* logicals is true'
2d12bccb16 Jean*0381         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0382         errCount = errCount + 1
614077ca71 Jean*0383       ENDIF
42c525bfb4 Alis*0384 #endif /* ALLOW_ORLANSKI */
                0385 
63e7cf8192 Jean*0386       IF (useOrlanskiNorth.OR.useOrlanskiSouth.OR.
                0387      &    useOrlanskiEast.OR.useOrlanskiWest) THEN
                0388        IF (nonlinFreeSurf.GT.0) THEN
509b3e039c Jean*0389         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0390      &      'nonlinFreeSurf not yet implemented in Orlanski OBC'
2d12bccb16 Jean*0391         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0392         errCount = errCount + 1
63e7cf8192 Jean*0393        ENDIF
ee1c912a22 Mart*0394        IF (usePTracers) THEN
509b3e039c Jean*0395         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0396      &      ' useOrlanski* OBC not yet implemented for pTracers'
2d12bccb16 Jean*0397         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0398         errCount = errCount + 1
ee1c912a22 Mart*0399        ENDIF
869a19390a Dimi*0400        IF (useSEAICE) THEN
509b3e039c Jean*0401         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0402      &      ' useOrlanski* OBC not yet implemented for SEAICE'
2d12bccb16 Jean*0403         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0404         errCount = errCount + 1
869a19390a Dimi*0405        ENDIF
                0406       ENDIF
                0407 
b2cb1ccb9a Mart*0408 #ifdef ALLOW_OBCS_STEVENS
                0409       WRITE(msgBuf,'(A)') 'OBCS_CHECK: #define ALLOW_OBCS_STEVENS'
f4098ccf3f Jean*0410       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
b2cb1ccb9a Mart*0411 C     check compatibility with Orlanski
                0412       IF (      ( useStevensNorth.AND.useOrlanskiNorth )
                0413      &     .OR. ( useStevensSouth.AND.useOrlanskiSouth )
                0414      &     .OR. (  useStevensEast.AND.useOrlanskiEast )
                0415      &     .OR. (  useStevensWest.AND.useOrlanskiWest ) ) THEN
7f7a43158f Jean*0416         WRITE(msgBuf,'(A)')
                0417      &  'OBCS_CHECK: both useOrlanski* and useStevens* logicals'
                0418         CALL PRINT_ERROR( msgBuf, myThid )
                0419         WRITE(msgBuf,'(A)')
509b3e039c Jean*0420      &      'OBCS_CHECK: are true for at least one boundary'
7f7a43158f Jean*0421         CALL PRINT_ERROR( msgBuf, myThid )
                0422         errCount = errCount + 1
b2cb1ccb9a Mart*0423       ENDIF
                0424       IF (useStevensNorth.OR.useStevensSouth.OR.
                0425      &    useStevensEast.OR.useStevensWest) THEN
                0426        IF (nonlinFreeSurf.GT.0) THEN
509b3e039c Jean*0427         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0428      &    'useStevens OBC with nonlinFreeSurf not yet implemented'
f7adb5bd83 Jean*0429         CALL PRINT_ERROR( msgBuf, myThid )
b2cb1ccb9a Mart*0430        ENDIF
                0431        IF (usePTracers) THEN
509b3e039c Jean*0432         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0433      &    'useStevens OBC with pTracers not yet implemented'
                0434         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0435      &                      SQUEEZE_RIGHT, myThid )
                0436         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0437      &    'therefore expect the unexpected'
                0438         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0439      &                      SQUEEZE_RIGHT, myThid )
b2cb1ccb9a Mart*0440        ENDIF
                0441        IF (useSEAICE) THEN
509b3e039c Jean*0442         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0443      &    'useStevens OBC with SEAICE not yet implemented'
                0444         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0445      &                      SQUEEZE_RIGHT, myThid )
                0446         WRITE(msgBuf,'(2A)') '** WARNING ** OBCS_CHECK: ',
                0447      &    'therefore expect the unexpected'
                0448         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0449      &                      SQUEEZE_RIGHT, myThid )
b2cb1ccb9a Mart*0450        ENDIF
                0451 CML       IF (usePTracers) THEN
509b3e039c Jean*0452 CML        WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0453 CML     &  'useStevens* OBC with pTracers not yet implemented'
f7adb5bd83 Jean*0454 CML        CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0455 CML        errCount = errCount + 1
b2cb1ccb9a Mart*0456 CML       ENDIF
                0457 CML       IF (useSEAICE) THEN
509b3e039c Jean*0458 CML        WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0459 CML     &  'useStevens* OBC with SEAICE not yet implemented'
                0460 CML        CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0461 CML        errCount = errCount + 1
b2cb1ccb9a Mart*0462 CML       ENDIF
                0463       ENDIF
                0464 #else
                0465       IF (useStevensNorth.OR.useStevensSouth.OR.
                0466      &    useStevensEast.OR.useStevensWest) THEN
                0467         WRITE(msgBuf,'(A)')
509b3e039c Jean*0468      &  'OBCS_CHECK: #undef OBCS_ALLOW_STEVENS  and'
f7adb5bd83 Jean*0469         CALL PRINT_ERROR( msgBuf, myThid )
b2cb1ccb9a Mart*0470         WRITE(msgBuf,'(A)')
509b3e039c Jean*0471      &  'OBCS_CHECK: one of useStevens* logicals is true'
f7adb5bd83 Jean*0472         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0473         errCount = errCount + 1
f7adb5bd83 Jean*0474       ENDIF
b2cb1ccb9a Mart*0475 #endif /* ALLOW_OBCS_STEVENS */
                0476 
869a19390a Dimi*0477 #ifndef ALLOW_OBCS_PRESCRIBE
                0478       IF (useOBCSprescribe) THEN
7f7a43158f Jean*0479         WRITE(msgBuf,'(A)')
                0480      &       'OBCS_CHECK: useOBCSprescribe = .TRUE. for'
                0481         CALL PRINT_ERROR( msgBuf, myThid )
                0482         WRITE(msgBuf,'(A)')
                0483      &       'OBCS_CHECK: undef ALLOW_OBCS_PRESCRIBE'
                0484         CALL PRINT_ERROR( msgBuf, myThid )
                0485         errCount = errCount + 1
255732ba09 Jean*0486       ENDIF
                0487 #endif /* ALLOW_OBCS_PRESCRIBE */
                0488 
f7adb5bd83 Jean*0489 #ifndef ALLOW_OBCS_SPONGE
                0490       IF (useOBCSsponge) THEN
7f7a43158f Jean*0491         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0492      &       'Cannot set useOBCSsponge=.TRUE. (data.obcs)'
                0493         CALL PRINT_ERROR( msgBuf, myThid )
                0494         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0495      &       'with #undef ALLOW_OBCS_SPONGE (OBCS_OPTIONS.h)'
                0496         CALL PRINT_ERROR( msgBuf, myThid )
                0497         errCount = errCount + 1
f7adb5bd83 Jean*0498       ENDIF
                0499 #endif /* ALLOW_OBCS_SPONGE */
                0500 
c7c4b57180 Dimi*0501 #ifndef ALLOW_OBCS_SEAICE_SPONGE
                0502       IF (useSeaiceSponge) THEN
                0503         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0504      &       'Cannot set useSeaiceSponge=.TRUE. (data.obcs)'
                0505         CALL PRINT_ERROR( msgBuf, myThid )
                0506         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0507      &       'with #undef ALLOW_OBCS_SEAICE_SPONGE (OBCS_OPTIONS.h)'
                0508         CALL PRINT_ERROR( msgBuf, myThid )
                0509         errCount = errCount + 1
                0510       ENDIF
                0511 #endif /* ALLOW_OBCS_SEAICE_SPONGE */
                0512 
abfe198bce Mart*0513 #ifdef ALLOW_OBCS_BALANCE
                0514       IF ( OBCSbalanceSurf ) THEN
                0515 C     The surface correction is not applied when none of the
                0516 C     four OBCS_balanceFacE,W,N,S is positive.
                0517         IF ( nTileWithActiveOB .EQ. 0 ) THEN
                0518          WRITE(msgBuf,'(A)')
                0519      &    'OBCS_CHECK: OBCSbalanceSurf=T requires to have at least'
                0520          CALL PRINT_ERROR( msgBuf, myThid )
                0521          WRITE(msgBuf,'(2A)')
                0522      &        'OBCS_CHECK: one of OBCS_balanceFac[E,W,N,S] > 0',
                0523      &        ' on an active boundary to work.'
                0524          CALL PRINT_ERROR( msgBuf, myThid )
                0525          errCount = errCount + 1
                0526         ENDIF
                0527       ENDIF
                0528 #else /* ALLOW_OBCS_BALANCE */
255732ba09 Jean*0529       IF ( useOBCSbalance ) THEN
7f7a43158f Jean*0530         WRITE(msgBuf,'(A)')
255732ba09 Jean*0531      &  'OBCS_CHECK: useOBCSbalance requires to define'
7f7a43158f Jean*0532         CALL PRINT_ERROR( msgBuf, myThid )
                0533         WRITE(msgBuf,'(A)')
255732ba09 Jean*0534      &  'OBCS_CHECK: ALLOW_OBCS_BALANCE in "OBCS_OPTIONS.h"'
7f7a43158f Jean*0535         CALL PRINT_ERROR( msgBuf, myThid )
                0536         errCount = errCount + 1
869a19390a Dimi*0537       ENDIF
255732ba09 Jean*0538 #endif /* ALLOW_OBCS_BALANCE */
38224ac59a Patr*0539 
6f4cf52d27 Dimi*0540 #ifndef ALLOW_OBCS_TIDES
                0541       IF ( useOBCStides ) THEN
                0542         WRITE(msgBuf,'(A)')
                0543      &  'OBCS_CHECK: useOBCStides requires to define'
                0544         CALL PRINT_ERROR( msgBuf, myThid )
                0545         WRITE(msgBuf,'(A)')
                0546      &  'OBCS_CHECK: ALLOW_OBCS_TIDES in "OBCS_OPTIONS.h"'
                0547         CALL PRINT_ERROR( msgBuf, myThid )
                0548         errCount = errCount + 1
                0549       ENDIF
                0550 #endif /* ALLOW_OBCS_TIDES */
                0551 
2d12bccb16 Jean*0552       IF ( .NOT.nonHydrostatic .AND.
                0553      &         ( OBNwFile.NE.' ' .OR. OBSwFile.NE.' ' .OR.
                0554      &           OBEwFile.NE.' ' .OR. OBWwFile.NE.' ' )
                0555      &   ) THEN
                0556         WRITE(msgBuf,'(2A)')
                0557      &  'OBCS_CHECK: OB*wFile only allowed with nonHydrostatic'
                0558         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0559         errCount = errCount + 1
2d12bccb16 Jean*0560       ENDIF
                0561       IF ( nonlinFreeSurf.EQ.0 .AND.
                0562      &         ( OBNetaFile.NE.' ' .OR. OBSetaFile.NE.' ' .OR.
                0563      &           OBEetaFile.NE.' ' .OR. OBWetaFile.NE.' ' )
                0564      &   ) THEN
                0565         WRITE(msgBuf,'(2A)')
                0566      &  'OBCS_CHECK: OB*etaFile(s) only allowed with nonlinFreeSurf'
                0567         CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0568         errCount = errCount + 1
2d12bccb16 Jean*0569       ENDIF
                0570 
869a19390a Dimi*0571       IF (useSEAICE .AND. .NOT. useEXF) THEN
7f7a43158f Jean*0572         WRITE(msgBuf,'(A)')
                0573      &   'OBCS_CHECK: for SEAICE OBCS, use'
                0574         CALL PRINT_ERROR( msgBuf, myThid )
                0575         WRITE(msgBuf,'(A)')
                0576      &   'OBCS_CHECK: pkg/exf to read input files'
                0577         CALL PRINT_ERROR( msgBuf, myThid )
                0578         errCount = errCount + 1
869a19390a Dimi*0579       ENDIF
a53202d9cb Jean*0580 #ifndef OBCS_UVICE_OLD
                0581 c     IF ( useSEAICE .AND. SEAICEuseDYNAMICS ) THEN
                0582       IF ( useSEAICE ) THEN
                0583 #if ( defined (OBCS_SEAICE_COMPUTE_UVICE)     || \
                0584       defined (OBCS_SEAICE_AVOID_CONVERGENCE) || \
                0585       defined (OBCS_SEAICE_SMOOTH_UVICE_PERP) || \
                0586       defined (OBCS_SEAICE_SMOOTH_UVICE_PAR) )
7f7a43158f Jean*0587         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0588      &       'needs to define OBCS_UVICE_OLD in OBCS_OPTIONS.h'
                0589         CALL PRINT_ERROR( msgBuf, myThid )
                0590         WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0591      &       'to activate such OBCS_SEAICE_[] option'
                0592         CALL PRINT_ERROR( msgBuf, myThid )
                0593         errCount = errCount + 1
a53202d9cb Jean*0594 #endif
                0595       ENDIF
                0596 #endif /* ndef OBCS_UVICE_OLD */
869a19390a Dimi*0597 
7f7a43158f Jean*0598       IF ( errCount.GE.1 ) THEN
                0599         WRITE(msgBuf,'(A,I3,A)')
                0600      &       'OBCS_CHECK: detected', errCount,' fatal error(s)'
                0601         CALL PRINT_ERROR( msgBuf, myThid )
                0602         CALL ALL_PROC_DIE( 0 )
                0603         STOP 'ABNORMAL END: S/R OBCS_CHECK'
                0604       ENDIF
                0605 
fb919e1dd2 Jean*0606       WRITE(msgBuf,'(A)') 'OBCS_CHECK: set-up OK'
f4098ccf3f Jean*0607       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
42c525bfb4 Alis*0608 
7f7a43158f Jean*0609       _END_MASTER(myThid)
                0610 
fb919e1dd2 Jean*0611 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0612 C--   Check if Interior mask is consistent with OB list of indices
                0613 c     IF ( insideOBmaskFile.NE.' ' ) THEN
7f7a43158f Jean*0614        errCount = 0
fb919e1dd2 Jean*0615        WRITE(msgBuf,'(2A)') 'S/R OBCS_CHECK: ',
                0616      &              'Inside Mask and OB locations disagree :'
                0617        DO bj = myByLo(myThid), myByHi(myThid)
                0618         DO bi = myBxLo(myThid), myBxHi(myThid)
                0619 
                0620          DO j=1,sNy
                0621 C-    Eastern boundary
                0622           i = OB_Ie(j,bi,bj)
78c7c1d8ad Jean*0623           IF ( i.NE.OB_indexNone ) THEN
                0624            IF ( maskInC(i,j,bi,bj).NE.0. ) THEN
7f7a43158f Jean*0625             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0626             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0627      &        ' from OB_Ie (bi,bj=', bi, ',', bj,
                0628      &        ') expects Mask=0 @ i,j=', i, ',', j
                0629             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0630             errCount = errCount + 1
78c7c1d8ad Jean*0631            ENDIF
fb919e1dd2 Jean*0632           ENDIF
                0633           DO i=1,sNx+1
                0634            IF ( maskInC(i-1,j,bi,bj).GT.maskInC(i,j,bi,bj)
00cd44357b Jean*0635      &          .AND.kSurfW(i,j,bi,bj).LE.Nr
fb919e1dd2 Jean*0636      &          .AND. i.NE.OB_Ie(j,bi,bj) ) THEN
7f7a43158f Jean*0637             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0638             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0639      &        ' from insideMask (bi,bj=', bi, ',', bj,
                0640      &        ') expects OBE=', i, ' @ j=', j
                0641             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0642             errCount = errCount + 1
fb919e1dd2 Jean*0643            ENDIF
                0644           ENDDO
                0645 C-    Western boundary
                0646           i = OB_Iw(j,bi,bj)
78c7c1d8ad Jean*0647           IF ( i.NE.OB_indexNone ) THEN
                0648            IF ( maskInC(i,j,bi,bj).NE.0. ) THEN
7f7a43158f Jean*0649             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0650             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0651      &        ' from OB_Iw (bi,bj=', bi, ',', bj,
                0652      &        ') expects Mask=0 @ i,j=', i, ',', j
                0653             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0654             errCount = errCount + 1
78c7c1d8ad Jean*0655            ENDIF
fb919e1dd2 Jean*0656           ENDIF
                0657           DO i=1,sNx+1
                0658            IF ( maskInC(i-1,j,bi,bj).LT.maskInC(i,j,bi,bj)
00cd44357b Jean*0659      &          .AND.kSurfW(i,j,bi,bj).LE.Nr
fb919e1dd2 Jean*0660      &          .AND. i.NE.OB_Iw(j,bi,bj)+1 ) THEN
7f7a43158f Jean*0661             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0662             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0663      &        ' from insideMask (bi,bj=', bi, ',', bj,
                0664      &        ') expects OBW=', i-1, ' @ j=', j
                0665             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0666             errCount = errCount + 1
fb919e1dd2 Jean*0667            ENDIF
                0668           ENDDO
                0669          ENDDO
                0670 
                0671          DO i=1,sNx
                0672 C-    Northern boundary
                0673           j = OB_Jn(i,bi,bj)
78c7c1d8ad Jean*0674           IF ( j.NE.OB_indexNone ) THEN
                0675            IF ( maskInC(i,j,bi,bj).NE.0. ) THEN
7f7a43158f Jean*0676             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0677             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0678      &        ' from OB_Jn (bi,bj=', bi, ',', bj,
                0679      &        ') expects Mask=0 @ i,j=', i, ',', j
                0680             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0681             errCount = errCount + 1
78c7c1d8ad Jean*0682            ENDIF
fb919e1dd2 Jean*0683           ENDIF
                0684           DO j=1,sNy+1
                0685            IF ( maskInC(i,j-1,bi,bj).GT.maskInC(i,j,bi,bj)
00cd44357b Jean*0686      &          .AND.kSurfS(i,j,bi,bj).LE.Nr
fb919e1dd2 Jean*0687      &          .AND. j.NE.OB_Jn(i,bi,bj) ) THEN
7f7a43158f Jean*0688             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0689             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0690      &        ' from insideMask (bi,bj=', bi, ',', bj,
                0691      &        ') expects OBN=', j, ' @ i=', i
                0692             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0693             errCount = errCount + 1
fb919e1dd2 Jean*0694            ENDIF
                0695           ENDDO
                0696 C-    Southern boundary
c816a80284 Jean*0697           j = OB_Js(i,bi,bj)
78c7c1d8ad Jean*0698           IF ( j.NE.OB_indexNone ) THEN
                0699            IF ( maskInC(i,j,bi,bj).NE.0. ) THEN
c816a80284 Jean*0700             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
                0701             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0702      &        ' from OB_Js (bi,bj=', bi, ',', bj,
                0703      &        ') expects Mask=0 @ i,j=', i, ',', j
                0704             CALL PRINT_ERROR( msgBuf, myThid )
                0705             errCount = errCount + 1
78c7c1d8ad Jean*0706            ENDIF
c816a80284 Jean*0707           ENDIF
fb919e1dd2 Jean*0708           DO j=1,sNy+1
                0709            IF ( maskInC(i,j-1,bi,bj).LT.maskInC(i,j,bi,bj)
00cd44357b Jean*0710      &          .AND.kSurfS(i,j,bi,bj).LE.Nr
fb919e1dd2 Jean*0711      &          .AND. j.NE.OB_Js(i,bi,bj)+1 ) THEN
7f7a43158f Jean*0712             IF ( errCount.EQ.0 ) CALL PRINT_ERROR( msgBuf, myThid )
fb919e1dd2 Jean*0713             WRITE(msgBuf,'(2(A,I3),2(A,I5))')
                0714      &        ' from insideMask (bi,bj=', bi, ',', bj,
                0715      &        ') expects OBS=', j-1, ' @ i=', i
                0716             CALL PRINT_ERROR( msgBuf, myThid )
7f7a43158f Jean*0717             errCount = errCount + 1
fb919e1dd2 Jean*0718            ENDIF
                0719           ENDDO
                0720          ENDDO
                0721 
                0722         ENDDO
                0723        ENDDO
7f7a43158f Jean*0724        CALL GLOBAL_SUM_INT( errCount, myThid )
                0725        IF ( errCount.GE.1 ) THEN
                0726          WRITE(msgBuf,'(A,I6,A)')
                0727      &       'OBCS_CHECK:', errCount,' errors in OB location vs Mask'
                0728          CALL PRINT_ERROR( msgBuf, myThid )
                0729          CALL ALL_PROC_DIE( myThid )
                0730          STOP 'ABNORMAL END: S/R OBCS_CHECK'
                0731        ELSE
                0732          _BEGIN_MASTER(myThid)
fb919e1dd2 Jean*0733          WRITE(msgBuf,'(2A)') 'OBCS_CHECK: ',
                0734      &              'check Inside Mask and OB locations: OK'
                0735          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
672b822630 Jean*0736          WRITE(msgBuf,'(A)') ' '
                0737          CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
7f7a43158f Jean*0738          _END_MASTER(myThid)
fb919e1dd2 Jean*0739        ENDIF
                0740 c     ENDIF
                0741 
42c525bfb4 Alis*0742 #endif /* ALLOW_OBCS */
41c3b782a2 Jean*0743       RETURN
                0744       END