File indexing completed on 2018-03-02 18:42:36 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
42c525bfb4 Alis*0001 #include "OBCS_OPTIONS.h"
0002
89af82137f Jean*0003
0004
0005
0006
0007
42c525bfb4 Alis*0008 SUBROUTINE OBCS_INIT_FIXED( myThid )
89af82137f Jean*0009
0010
cf2908d436 Jean*0011
0012
0013
0014
89af82137f Jean*0015
0016
42c525bfb4 Alis*0017 IMPLICIT NONE
0018
0019
0020 #include "SIZE.h"
0021 #include "EEPARAMS.h"
0022 #include "PARAMS.h"
7af3d6f22c Jean*0023 #include "GRID.h"
9b4f2a04e2 Jean*0024 #include "OBCS_PARAMS.h"
0025 #include "OBCS_GRID.h"
42c525bfb4 Alis*0026
89af82137f Jean*0027
87ec912e7f Jean*0028
42c525bfb4 Alis*0029 INTEGER myThid
89af82137f Jean*0030
42c525bfb4 Alis*0031
0032 #ifdef ALLOW_OBCS
89af82137f Jean*0033
6646af77e1 Jean*0034
87ec912e7f Jean*0035
0036
0037
0038
6646af77e1 Jean*0039 CHARACTER*(MAX_LEN_MBUF) msgBuf, errMsg
87ec912e7f Jean*0040 INTEGER OB_ApplX
0041 INTEGER OB_ApplY
42c525bfb4 Alis*0042 INTEGER bi, bj
87ec912e7f Jean*0043 INTEGER i, j
6910a0b3a6 Jean*0044 INTEGER im, jm
87ec912e7f Jean*0045 INTEGER iB, jB
0046 LOGICAL flag
6646af77e1 Jean*0047 INTEGER ioUnit
87ec912e7f Jean*0048
6646af77e1 Jean*0049 #ifdef ALLOW_DEBUG
0050 IF (debugMode) CALL DEBUG_ENTER('OBCS_INIT_FIXED',myThid)
0051 #endif
87ec912e7f Jean*0052
0053
6646af77e1 Jean*0054
aa04b5d0aa Jean*0055 DO bj = myByLo(myThid), myByHi(myThid)
0056 DO bi = myBxLo(myThid), myBxHi(myThid)
0057 DO j=1-OLy,sNy+OLy
0058 DO i=1-OLx,sNx+OLx
0059 OBCS_insideMask(i,j,bi,bj) = 1.
0060 ENDDO
0061 ENDDO
0062 ENDDO
0063 ENDDO
87ec912e7f Jean*0064
0065 IF ( insideOBmaskFile.EQ.' ' ) THEN
0066
0067
0068 DO bj = myByLo(myThid), myByHi(myThid)
0069 DO bi = myBxLo(myThid), myBxHi(myThid)
0070 DO j=1,sNy
0071
74019f026d Jean*0072 IF ( OB_Ie(j,bi,bj).NE.OB_indexNone ) THEN
87ec912e7f Jean*0073 flag = .TRUE.
0074 DO i=OB_Ie(j,bi,bj),sNx
0075 flag = flag .AND.
aa04b5d0aa Jean*0076 & kSurfC(i,j,bi,bj).LE.Nr .AND. i.NE.OB_Iw(j,bi,bj)
0077 IF ( flag ) OBCS_insideMask(i,j,bi,bj) = 0.
87ec912e7f Jean*0078 ENDDO
0079 ENDIF
0080
74019f026d Jean*0081 IF ( OB_Iw(j,bi,bj).NE.OB_indexNone ) THEN
87ec912e7f Jean*0082 flag = .TRUE.
0083 DO i=OB_Iw(j,bi,bj),1,-1
0084 flag = flag .AND.
aa04b5d0aa Jean*0085 & kSurfC(i,j,bi,bj).LE.Nr .AND. i.NE.OB_Ie(j,bi,bj)
0086 IF ( flag ) OBCS_insideMask(i,j,bi,bj) = 0.
87ec912e7f Jean*0087 ENDDO
0088 ENDIF
0089 ENDDO
0090 DO i=1,sNx
0091
74019f026d Jean*0092 IF ( OB_Jn(i,bi,bj).NE.OB_indexNone ) THEN
87ec912e7f Jean*0093 flag = .TRUE.
0094 DO j=OB_Jn(i,bi,bj),sNy
0095 flag = flag .AND.
aa04b5d0aa Jean*0096 & kSurfC(i,j,bi,bj).LE.Nr .AND. j.NE.OB_Js(i,bi,bj)
0097 IF ( flag ) OBCS_insideMask(i,j,bi,bj) = 0.
87ec912e7f Jean*0098 ENDDO
0099 ENDIF
0100
74019f026d Jean*0101 IF ( OB_Js(i,bi,bj).NE.OB_indexNone ) THEN
87ec912e7f Jean*0102 flag = .TRUE.
0103 DO j=OB_Js(i,bi,bj),1,-1
0104 flag = flag .AND.
aa04b5d0aa Jean*0105 & kSurfC(i,j,bi,bj).LE.Nr .AND. j.NE.OB_Jn(i,bi,bj)
0106 IF ( flag ) OBCS_insideMask(i,j,bi,bj) = 0.
87ec912e7f Jean*0107 ENDDO
0108 ENDIF
0109 ENDDO
0110
0111
0112 ENDDO
0113 ENDDO
0114
0115 ELSE
0116
0117
aa04b5d0aa Jean*0118 CALL READ_FLD_XY_RS( insideOBmaskFile, ' ', OBCS_insideMask,
0119 & 0, myThid )
87ec912e7f Jean*0120
0121 DO bj = myByLo(myThid), myByHi(myThid)
0122 DO bi = myBxLo(myThid), myBxHi(myThid)
0123 DO j=1,sNy
0124 DO i=1,sNx
aa04b5d0aa Jean*0125 IF ( OBCS_insideMask(i,j,bi,bj).NE.0. )
0126 & OBCS_insideMask(i,j,bi,bj) = 1.
87ec912e7f Jean*0127 ENDDO
0128 ENDDO
0129 ENDDO
0130 ENDDO
0131
0132
0133 ENDIF
0134
0135
aa04b5d0aa Jean*0136 _EXCH_XY_RS( OBCS_insideMask, myThid )
87ec912e7f Jean*0137
0138
d4086c624f Jean*0139
6910a0b3a6 Jean*0140
87ec912e7f Jean*0141 DO bj = myByLo(myThid), myByHi(myThid)
0142 DO bi = myBxLo(myThid), myBxHi(myThid)
6646af77e1 Jean*0143 DO j=2-OLy,sNy+OLy
0144 DO i=2-OLx,sNx+OLx
87ec912e7f Jean*0145 maskInW(i,j,bi,bj) = maskInW(i,j,bi,bj)
aa04b5d0aa Jean*0146 & *MAX( OBCS_insideMask(i-1,j,bi,bj),
0147 & OBCS_insideMask(i,j,bi,bj) )
87ec912e7f Jean*0148 maskInS(i,j,bi,bj) = maskInS(i,j,bi,bj)
aa04b5d0aa Jean*0149 & *MAX( OBCS_insideMask(i,j-1,bi,bj),
0150 & OBCS_insideMask(i,j,bi,bj) )
87ec912e7f Jean*0151 ENDDO
0152 ENDDO
0153 ENDDO
0154 ENDDO
0155
0156
0157
6646af77e1 Jean*0158
0159
0160
33d0ba7c8f Jean*0161
0162 IF ( OBCS_indexStatus .LT. 2 ) THEN
6646af77e1 Jean*0163 ioUnit = standardMessageUnit
0164 WRITE(msgBuf,'(2A)')
0165 & 'OBCS_INIT_FIXED: Setting OB indices in Overlap'
0166 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
0167 WRITE(errMsg,'(2A)') 'S/R OBCS_INIT_FIXED: ',
0168 & 'Inside Mask and OB locations disagree :'
0169 flag = .TRUE.
0170 DO bj = myByLo(myThid), myByHi(myThid)
0171 DO bi = myBxLo(myThid), myBxHi(myThid)
0172
0173
0174 DO j=1-OLy,sNy+OLy
0175 DO i=1,sNx+1
0176 IF ( OBCS_insideMask(i,j,bi,bj).LT.
0177 & OBCS_insideMask(i-1,j,bi,bj)
0178 & .AND. ( j.LT.1 .OR. j.GT.sNy )
9ea74cf9a7 Jean*0179 & .AND. kSurfW(i,j,bi,bj).LE.Nr ) THEN
74019f026d Jean*0180 IF ( OB_Ie(j,bi,bj).EQ.OB_indexNone ) THEN
6646af77e1 Jean*0181 OB_Ie(j,bi,bj) = i
0182 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0183 & ' Sets OBE(j,bi,bj=',j,',',bi,',',bj,')=', OB_Ie(j,bi,bj)
0184 CALL PRINT_MESSAGE( msgBuf,ioUnit,SQUEEZE_RIGHT,myThid )
0185 ELSEIF ( OB_Ie(j,bi,bj).NE.i ) THEN
0186 IF ( flag ) CALL PRINT_ERROR( errMsg, myThid )
0187 flag = .FALSE.
0188 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0189 & ' OBE(j,bi,bj=',j,',',bi,',',bj,')=', OB_Ie(j,bi,bj),
0190 & ' but from insideMask expects I=', i
0191 CALL PRINT_ERROR( msgBuf, myThid )
0192 ENDIF
0193 ENDIF
0194 ENDDO
0195 ENDDO
0196
0197 DO j=1-OLy,sNy+OLy
74019f026d Jean*0198 DO i=0,sNx
6646af77e1 Jean*0199 IF ( OBCS_insideMask(i,j,bi,bj).LT.
0200 & OBCS_insideMask(i+1,j,bi,bj)
0201 & .AND. ( j.LT.1 .OR. j.GT.sNy )
9ea74cf9a7 Jean*0202 & .AND. kSurfW(i+1,j,bi,bj).LE.Nr ) THEN
74019f026d Jean*0203 IF ( OB_Iw(j,bi,bj).EQ.OB_indexNone ) THEN
6646af77e1 Jean*0204 OB_Iw(j,bi,bj) = i
0205 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0206 & ' Sets OBW(j,bi,bj=',j,',',bi,',',bj,')=', OB_Iw(j,bi,bj)
0207 CALL PRINT_MESSAGE( msgBuf,ioUnit,SQUEEZE_RIGHT,myThid )
0208 ELSEIF ( OB_Iw(j,bi,bj).NE.i ) THEN
0209 IF ( flag ) CALL PRINT_ERROR( errMsg, myThid )
0210 flag = .FALSE.
0211 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0212 & ' OBW(j,bi,bj=',j,',',bi,',',bj,')=', OB_Iw(j,bi,bj),
0213 & ' but from insideMask expects I=', i
0214 CALL PRINT_ERROR( msgBuf, myThid )
0215 ENDIF
0216 ENDIF
0217 ENDDO
0218 ENDDO
0219
0220 DO j=1,sNy+1
0221 DO i=1-OLx,sNx+OLx
0222 IF ( OBCS_insideMask(i,j,bi,bj).LT.
0223 & OBCS_insideMask(i,j-1,bi,bj)
0224 & .AND. ( i.LT.1 .OR. i.GT.sNx )
9ea74cf9a7 Jean*0225 & .AND. kSurfS(i,j,bi,bj).LE.Nr ) THEN
74019f026d Jean*0226 IF ( OB_Jn(i,bi,bj).EQ.OB_indexNone ) THEN
6646af77e1 Jean*0227 OB_Jn(i,bi,bj) = j
0228 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0229 & ' Sets OBN(i,bi,bj=',i,',',bi,',',bj,')=', OB_Jn(i,bi,bj)
0230 CALL PRINT_MESSAGE( msgBuf,ioUnit,SQUEEZE_RIGHT,myThid )
0231 ELSEIF ( OB_Jn(i,bi,bj).NE.j ) THEN
0232 IF ( flag ) CALL PRINT_ERROR( errMsg, myThid )
0233 flag = .FALSE.
0234 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0235 & ' OBN(i,bi,bj=',i,',',bi,',',bj,')=', OB_Jn(i,bi,bj),
0236 & ' but from insideMask expects J=', j
0237 CALL PRINT_ERROR( msgBuf, myThid )
0238 ENDIF
0239 ENDIF
0240 ENDDO
0241 ENDDO
0242
74019f026d Jean*0243 DO j=0,sNy
6646af77e1 Jean*0244 DO i=1-OLx,sNx+OLx
0245 IF ( OBCS_insideMask(i,j,bi,bj).LT.
0246 & OBCS_insideMask(i,j+1,bi,bj)
0247 & .AND. ( i.LT.1 .OR. i.GT.sNx )
9ea74cf9a7 Jean*0248 & .AND. kSurfS(i,j+1,bi,bj).LE.Nr ) THEN
74019f026d Jean*0249 IF ( OB_Js(i,bi,bj).EQ.OB_indexNone ) THEN
6646af77e1 Jean*0250 OB_Js(i,bi,bj) = j
0251 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0252 & ' Sets OBS(i,bi,bj=',i,',',bi,',',bj,')=', OB_Js(i,bi,bj)
0253 CALL PRINT_MESSAGE( msgBuf,ioUnit,SQUEEZE_RIGHT,myThid )
0254 ELSEIF ( OB_Js(i,bi,bj).NE.j ) THEN
0255 IF ( flag ) CALL PRINT_ERROR( errMsg, myThid )
0256 flag = .FALSE.
0257 WRITE(msgBuf,'(A,I5,2(A,I3),2(A,I5))')
0258 & ' OBS(i,bi,bj=',i,',',bi,',',bj,')=', OB_Js(i,bi,bj),
0259 & ' but from insideMask expects J=', j
0260 CALL PRINT_ERROR( msgBuf, myThid )
0261 ENDIF
0262 ENDIF
0263 ENDDO
0264 ENDDO
0265
0266 ENDDO
0267 ENDDO
0268 WRITE(msgBuf,'(2A)')
0269 & 'OBCS_INIT_FIXED: Setting OB indices in Overlap <= done'
0270 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
0271 ENDIF
0272
0273
0274
87ec912e7f Jean*0275
0276
0277
6646af77e1 Jean*0278
87ec912e7f Jean*0279
0280 OB_ApplX = OLx
0281 OB_ApplY = OLy
42c525bfb4 Alis*0282
0283 DO bj = myByLo(myThid), myByHi(myThid)
0284 DO bi = myBxLo(myThid), myBxHi(myThid)
0285
cf2908d436 Jean*0286
0287
6910a0b3a6 Jean*0288 DO j=1-OLy,sNy+OLy
6646af77e1 Jean*0289 jm = MAX( j-1, 1-OLy )
87ec912e7f Jean*0290 iB = OB_Ie(j,bi,bj)
74019f026d Jean*0291 IF ( iB.NE.OB_indexNone ) THEN
6910a0b3a6 Jean*0292 DO i=iB,iB+OB_ApplX-1
aa04b5d0aa Jean*0293 OBCS_insideMask(i,j,bi,bj) = 0.
6910a0b3a6 Jean*0294 ENDDO
0295 DO i=iB+1,iB+OB_ApplX-1
0296 maskInW(i,j,bi,bj) = 0.
0297 ENDDO
74019f026d Jean*0298 IF ( OB_Ie(jm,bi,bj).NE.OB_indexNone ) THEN
0299 iB = MAX( iB, OB_Ie(jm,bi,bj) )
0300 DO i=iB,iB+OB_ApplX-1
6910a0b3a6 Jean*0301 maskInS(i,j,bi,bj) = 0.
74019f026d Jean*0302 ENDDO
0303 ENDIF
6910a0b3a6 Jean*0304 ENDIF
0305 ENDDO
cf2908d436 Jean*0306
6910a0b3a6 Jean*0307 DO j=1-OLy,sNy+OLy
6646af77e1 Jean*0308 jm = MAX( j-1, 1-OLy )
87ec912e7f Jean*0309 iB = OB_Iw(j,bi,bj)
74019f026d Jean*0310 IF ( iB.NE.OB_indexNone ) THEN
6910a0b3a6 Jean*0311 DO i=1-OB_ApplX+iB,iB
aa04b5d0aa Jean*0312 OBCS_insideMask(i,j,bi,bj) = 0.
6910a0b3a6 Jean*0313 ENDDO
0314 DO i=2-OB_ApplX+iB,iB
0315 maskInW(i,j,bi,bj) = 0.
0316 ENDDO
74019f026d Jean*0317 IF ( OB_Iw(jm,bi,bj).NE.OB_indexNone ) THEN
0318 iB = MIN( iB, OB_Iw(jm,bi,bj) )
0319 DO i=1-OB_ApplX+iB,iB
6910a0b3a6 Jean*0320 maskInS(i,j,bi,bj) = 0.
74019f026d Jean*0321 ENDDO
0322 ENDIF
cf2908d436 Jean*0323 ENDIF
0324 ENDDO
0325
6910a0b3a6 Jean*0326 DO i=1-OLx,sNx+OLx
6646af77e1 Jean*0327 im = MAX( i-1, 1-OLx )
87ec912e7f Jean*0328 jB = OB_Jn(i,bi,bj)
74019f026d Jean*0329 IF ( jB.NE.OB_indexNone ) THEN
6910a0b3a6 Jean*0330 DO j=jB,jB+OB_ApplY-1
aa04b5d0aa Jean*0331 OBCS_insideMask(i,j,bi,bj) = 0.
6910a0b3a6 Jean*0332 ENDDO
0333 DO j=jB+1,jB+OB_ApplY-1
0334 maskInS(i,j,bi,bj) = 0.
0335 ENDDO
74019f026d Jean*0336 IF ( OB_Jn(im,bi,bj).NE.OB_indexNone ) THEN
0337 jB = MAX( jB, OB_Jn(im,bi,bj) )
0338 DO j=jB,jB+OB_ApplY-1
6910a0b3a6 Jean*0339 maskInW(i,j,bi,bj) = 0.
74019f026d Jean*0340 ENDDO
0341 ENDIF
6910a0b3a6 Jean*0342 ENDIF
0343 ENDDO
cf2908d436 Jean*0344
6910a0b3a6 Jean*0345 DO i=1-OLx,sNx+OLx
6646af77e1 Jean*0346 im = MAX( i-1, 1-OLx )
87ec912e7f Jean*0347 jB = OB_Js(i,bi,bj)
74019f026d Jean*0348 IF ( jB.NE.OB_indexNone ) THEN
6910a0b3a6 Jean*0349 DO j=1-OB_ApplY+jB,jB
aa04b5d0aa Jean*0350 OBCS_insideMask(i,j,bi,bj) = 0.
6910a0b3a6 Jean*0351 ENDDO
0352 DO j=2-OB_ApplY+jB,jB
0353 maskInS(i,j,bi,bj) = 0.
0354 ENDDO
74019f026d Jean*0355 IF ( OB_Js(im,bi,bj).NE.OB_indexNone ) THEN
0356 jB = MIN( jB, OB_Js(im,bi,bj) )
0357 DO j=1-OB_ApplY+jB,jB
6910a0b3a6 Jean*0358 maskInW(i,j,bi,bj) = 0.
74019f026d Jean*0359 ENDDO
0360 ENDIF
cf2908d436 Jean*0361 ENDIF
0362 ENDDO
0363
aa04b5d0aa Jean*0364
6646af77e1 Jean*0365 DO j=1-OLy,sNy+OLy
0366 DO i=1-OLx,sNx+OLx
aa04b5d0aa Jean*0367 maskInC(i,j,bi,bj) = maskInC(i,j,bi,bj)
0368 & *OBCS_insideMask(i,j,bi,bj)
0369 ENDDO
0370 ENDDO
0371
cf2908d436 Jean*0372
42c525bfb4 Alis*0373 ENDDO
0374 ENDDO
0375
6646af77e1 Jean*0376
0377
0378
0379 DO bj = myByLo(myThid), myByHi(myThid)
0380 DO bi = myBxLo(myThid), myBxHi(myThid)
0381 tileHasOBE(bi,bj) = .FALSE.
0382 tileHasOBW(bi,bj) = .FALSE.
74019f026d Jean*0383 tileHasOBN(bi,bj) = .FALSE.
0384 tileHasOBS(bi,bj) = .FALSE.
6646af77e1 Jean*0385 DO j=1-OLy,sNy+OLy
74019f026d Jean*0386 tileHasOBE(bi,bj) = tileHasOBE(bi,bj) .OR.
0387 & ( OB_Ie(j,bi,bj).NE.OB_indexNone )
0388 tileHasOBW(bi,bj) = tileHasOBW(bi,bj) .OR.
0389 & ( OB_Iw(j,bi,bj).NE.OB_indexNone )
6646af77e1 Jean*0390 ENDDO
0391 DO i=1-OLx,sNx+OLx
74019f026d Jean*0392 tileHasOBN(bi,bj) = tileHasOBN(bi,bj) .OR.
0393 & ( OB_Jn(i,bi,bj).NE.OB_indexNone )
0394 tileHasOBS(bi,bj) = tileHasOBS(bi,bj) .OR.
0395 & ( OB_Js(i,bi,bj).NE.OB_indexNone )
6646af77e1 Jean*0396 ENDDO
0397 ENDDO
0398 ENDDO
0399
9ea74cf9a7 Jean*0400
0401 CALL OBCS_SET_CONNECT( myThid )
0402
6646af77e1 Jean*0403 #ifdef ALLOW_DEBUG
0404 IF (debugMode) CALL DEBUG_LEAVE('OBCS_INIT_FIXED',myThid)
0405 #endif
0406
42c525bfb4 Alis*0407 #endif /* ALLOW_OBCS */
0408 RETURN
0409 END