File indexing completed on 2022-11-23 06:09:58 UTC
view on githubraw file Latest commit 20dee616 on 2022-11-22 15:45:38 UTC
b2cb1ccb9a Mart*0001 #include "OBCS_OPTIONS.h"
4e4ad91a39 Jean*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
eb8aff1784 Jean*0005 #undef CHECK_BALANCE
b2cb1ccb9a Mart*0006
4e4ad91a39 Jean*0007
0daa63ec35 Mart*0008
0009
0010
0011
0012
0013
0014
0015
b2cb1ccb9a Mart*0016
0017
0018
eb8aff1784 Jean*0019 SUBROUTINE OBCS_CALC_STEVENS(
b2cb1ccb9a Mart*0020 I futureTime, futureIter,
0021 I myThid )
2c64c37c71 Mart*0022
eb8aff1784 Jean*0023
b2cb1ccb9a Mart*0024
0025
eb8aff1784 Jean*0026
0027
b2cb1ccb9a Mart*0028
0029
0030
eb8aff1784 Jean*0031
0032
b2cb1ccb9a Mart*0033
eb8aff1784 Jean*0034
0035
0036
2c64c37c71 Mart*0037
0038
0039
0040
0041
0042
0043
b2cb1ccb9a Mart*0044
0045
0046
0047
b1353a35da Mart*0048
74019f026d Jean*0049
0050
b1353a35da Mart*0051
0052
b2cb1ccb9a Mart*0053
0054
0daa63ec35 Mart*0055
b2cb1ccb9a Mart*0056
0057
0058
eb8aff1784 Jean*0059
b2cb1ccb9a Mart*0060
eb8aff1784 Jean*0061
0062
b2cb1ccb9a Mart*0063
eb8aff1784 Jean*0064
2c64c37c71 Mart*0065
b2cb1ccb9a Mart*0066
eb8aff1784 Jean*0067 IMPLICIT NONE
b2cb1ccb9a Mart*0068
0069 #include "SIZE.h"
0070 #include "EEPARAMS.h"
0071 #include "PARAMS.h"
eb8aff1784 Jean*0072 #include "GRID.h"
9b4f2a04e2 Jean*0073 #include "OBCS_PARAMS.h"
0074 #include "OBCS_GRID.h"
0075 #include "OBCS_FIELDS.h"
b2cb1ccb9a Mart*0076 #include "DYNVARS.h"
0077 #ifdef ALLOW_PTRACERS
0078 #include "PTRACERS_SIZE.h"
0079 #include "PTRACERS_PARAMS.h"
0080 #include "PTRACERS_FIELDS.h"
0081 #include "OBCS_PTRACERS.h"
0082 #endif /* ALLOW_PTRACERS */
38b71af82a Patr*0083 #ifdef ALLOW_AUTODIFF_TAMC
4e4ad91a39 Jean*0084 # include "tamc.h"
38b71af82a Patr*0085 #endif /* ALLOW_AUTODIFF_TAMC */
b2cb1ccb9a Mart*0086
0087
0088
0089 _RL futureTime
eb8aff1784 Jean*0090 INTEGER futureIter
b2cb1ccb9a Mart*0091 INTEGER myThid
0092
0093 #ifdef ALLOW_OBCS_STEVENS
0094
0095
0096
eb8aff1784 Jean*0097
0098
0099
0100
0101
0102
b2cb1ccb9a Mart*0103
b1353a35da Mart*0104
eb8aff1784 Jean*0105
2c64c37c71 Mart*0106
eb8aff1784 Jean*0107
b2cb1ccb9a Mart*0108 INTEGER bi, bj
4e4ad91a39 Jean*0109 INTEGER i, j, k
eb8aff1784 Jean*0110
2c64c37c71 Mart*0111 _RL cflMer (1-OLy:sNy+OLy,Nr)
0112 _RL gFacM (1-OLy:sNy+OLy,Nr)
e37ac28e89 Mart*0113 _RL uMerPri(Nr)
0114 _RL uMerBar
16a91a6f85 Mart*0115 _RL cflZon (1-OLx:sNx+OLx,Nr)
3cf13754ce Mart*0116 _RL gFacZ (1-OLx:sNx+OLx,Nr)
e37ac28e89 Mart*0117 _RL vZonPri(Nr)
0118 _RL vZonBar
74019f026d Jean*0119 _RL drFBar
2c64c37c71 Mart*0120 _RL gammat, gammas, pFac, aFac
b2cb1ccb9a Mart*0121 #ifdef ALLOW_PTRACERS
eb8aff1784 Jean*0122
b2cb1ccb9a Mart*0123 #endif /* ALLOW_PTRACERS */
4e4ad91a39 Jean*0124 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0125 INTEGER ikey
4e4ad91a39 Jean*0126 #endif /* ALLOW_AUTODIFF_TAMC */
eb8aff1784 Jean*0127 #ifdef CHECK_BALANCE
0128 _RL uVelLoc, vVelLoc
0129 _RL vPhase
0130 #endif
b2cb1ccb9a Mart*0131
0132
0133 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0134 IF (debugMode) CALL DEBUG_ENTER('OBCS_CALC_STEVENS',myThid)
b2cb1ccb9a Mart*0135 #endif
0136
0137 aFac = 1. _d 0
0138 IF (.NOT. useStevensAdvection ) aFac = 0. _d 0
0139 pFac = 1. _d 0
0140 IF (.NOT. useStevensPhaseVel ) pFac = 0. _d 0
0141 gammat = 0. _d 0
0142 IF (TrelaxStevens .GT. 0. _d 0) gammat = 1./TrelaxStevens
0143 gammas = 0. _d 0
0144 IF (SrelaxStevens .GT. 0. _d 0) gammas = 1./SrelaxStevens
0145
0146 DO bj=myByLo(myThid),myByHi(myThid)
0147 DO bi=myBxLo(myThid),myBxHi(myThid)
eb8aff1784 Jean*0148
38b71af82a Patr*0149 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0150 ikey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
38b71af82a Patr*0151 #endif /* ALLOW_AUTODIFF_TAMC */
0152
b2cb1ccb9a Mart*0153 #ifdef ALLOW_OBCS_EAST
38b71af82a Patr*0154
0155 # ifdef ALLOW_AUTODIFF_TAMC
4e4ad91a39 Jean*0156
0157
38b71af82a Patr*0158 # endif
b2cb1ccb9a Mart*0159 IF ( useStevensEast ) THEN
0160
0161 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0162 IF (debugMode)
b2cb1ccb9a Mart*0163 & CALL DEBUG_MSG('OBCS_CALC_STEVENS: East',myThid)
0164 #endif
eb8aff1784 Jean*0165
9f68a71aa4 Mart*0166
4e4ad91a39 Jean*0167 DO j=1-OLy,sNy+OLy
0168 i = OB_Ie(j,bi,bj)
0169 IF ( i.NE.OB_indexNone ) THEN
e37ac28e89 Mart*0170
0171 drFbar = 0. _d 0
0172 uMerBar = 0. _d 0
4e4ad91a39 Jean*0173 DO k=1,Nr
0174 uMerPri(k) = 0. _d 0
e37ac28e89 Mart*0175 ENDDO
4e4ad91a39 Jean*0176 DO k=1,Nr
2c64c37c71 Mart*0177 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0178 uMerBar = uMerBar + uVel(i-1,j,k,bi,bj)
2c64c37c71 Mart*0179 #else
4e4ad91a39 Jean*0180 uMerBar = uMerBar + OBEuStevens(j,k,bi,bj)
2c64c37c71 Mart*0181 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0182 & *drF(k)* _hFacW(i,j,k,bi,bj)
0183 drFBar = drFBar + drF(k)* _hFacW(i,j,k,bi,bj)
9f68a71aa4 Mart*0184 ENDDO
e37ac28e89 Mart*0185 IF ( drFBar .GT. 0. _d 0 ) uMerBar = uMerBar/drFBar
4e4ad91a39 Jean*0186 DO k=1,Nr
2c64c37c71 Mart*0187 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0188 uMerPri(k) = (uVel(i-1,j,k,bi,bj)-uMerBar)
74019f026d Jean*0189 #else
4e4ad91a39 Jean*0190 uMerPri(k) = (OBEuStevens(j,k,bi,bj)-uMerBar)
2c64c37c71 Mart*0191 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0192 & * _maskW(i,j,k,bi,bj)
9f68a71aa4 Mart*0193 ENDDO
eb8aff1784 Jean*0194
e37ac28e89 Mart*0195 drFbar = 0. _d 0
0196 uMerBar = 0. _d 0
4e4ad91a39 Jean*0197 DO k=1,Nr
0198 uMerBar = uMerBar + OBEu(j,k,bi,bj)
0199 & *drF(k)* _hFacW(i,j,k,bi,bj)
0200 drFBar = drFBar + drF(k)* _hFacW(i,j,k,bi,bj)
9f68a71aa4 Mart*0201 ENDDO
e37ac28e89 Mart*0202 IF ( drFBar .GT. 0. _d 0 ) uMerBar = uMerBar/drFBar
b2cb1ccb9a Mart*0203
e37ac28e89 Mart*0204
4e4ad91a39 Jean*0205 DO k=1,Nr
0206 OBEu(j,k,bi,bj) = (uMerBar + uMerPri(k))
0207 & * _maskW(i,j,k,bi,bj)
9f68a71aa4 Mart*0208
b2cb1ccb9a Mart*0209 #ifdef ALLOW_NONHYDROSTATIC
4e4ad91a39 Jean*0210 OBEw(j,k,bi,bj)=0.
b2cb1ccb9a Mart*0211 #endif
9f68a71aa4 Mart*0212 ENDDO
0213 ENDIF
b2cb1ccb9a Mart*0214 ENDDO
2c64c37c71 Mart*0215 #ifdef NONLIN_FRSURF
0216
0217 IF ( nonlinFreeSurf.GT.0 ) THEN
4e4ad91a39 Jean*0218 DO j=1-OLy,sNy+OLy
0219 i = OB_Ie(j,bi,bj)
0220 IF ( i.NE.OB_indexNone ) THEN
0221 OBEeta(j,bi,bj) = etaN(i-1,j,bi,bj)
2c64c37c71 Mart*0222 ENDIF
0223 ENDDO
0224 ENDIF
0225 #endif /* NONLIN_FRSURF */
b2cb1ccb9a Mart*0226
2c64c37c71 Mart*0227
4e4ad91a39 Jean*0228 DO k=1,Nr
0229 DO j=1-OLy,sNy+OLy
0230 i = OB_Ie(j,bi,bj)
0231 IF ( i.NE.OB_indexNone ) THEN
0232 cflMer(j,k) = 0.5 _d 0 * _dxC(i-1,j,bi,bj)/dTtracerLev(k)
2c64c37c71 Mart*0233
0234
4e4ad91a39 Jean*0235 gFacM(j,k) = ABS(MIN(SIGN(1.D0,uVel(i,j,k,bi,bj)),0.D0))
2c64c37c71 Mart*0236 ELSE
4e4ad91a39 Jean*0237 cflMer(j,k) = 0. _d 0
0238 gFacM (j,k) = 0. _d 0
2c64c37c71 Mart*0239 ENDIF
0240 ENDDO
0241 ENDDO
4e4ad91a39 Jean*0242 # ifdef ALLOW_AUTODIFF_TAMC
0243
0244 # endif
0daa63ec35 Mart*0245
0246 CALL OBCS_STEVENS_CALC_TRACER_EAST(
4e4ad91a39 Jean*0247 U OBEt,
0248 I OBEtStevens, theta, gammat,
0daa63ec35 Mart*0249 I uVel, cflMer, gFacM, pFac, aFac,
0250 I OB_Ie, OB_indexNone, bi, bj,
0251 I futureTime, futureIter,
0252 I myThid )
0253
0254 CALL OBCS_STEVENS_CALC_TRACER_EAST(
4e4ad91a39 Jean*0255 U OBEs,
0daa63ec35 Mart*0256 I OBEsStevens, salt, gammas,
0257 I uVel, cflMer, gFacM, pFac, aFac,
0258 I OB_Ie, OB_indexNone, bi, bj,
0259 I futureTime, futureIter,
0260 I myThid )
0261
0262
0263
0264
0265
0266
4e4ad91a39 Jean*0267
0268
0daa63ec35 Mart*0269
0270
0271
0272
0273
0274
0275
0276
b2cb1ccb9a Mart*0277
eb8aff1784 Jean*0278 ENDIF
b2cb1ccb9a Mart*0279 #endif /* ALLOW_OBCS_EAST */
eb8aff1784 Jean*0280
b2cb1ccb9a Mart*0281
0282
0283 #ifdef ALLOW_OBCS_WEST
38b71af82a Patr*0284
0285 # ifdef ALLOW_AUTODIFF_TAMC
4e4ad91a39 Jean*0286
0287
38b71af82a Patr*0288 # endif
eb8aff1784 Jean*0289 IF ( useStevensWest ) THEN
b2cb1ccb9a Mart*0290
0291 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0292 IF (debugMode)
0293 & CALL DEBUG_MSG('OBCS_CALC_STEVENS: West',myThid)
b2cb1ccb9a Mart*0294 #endif
eb8aff1784 Jean*0295
9f68a71aa4 Mart*0296
4e4ad91a39 Jean*0297 DO j=1-OLy,sNy+OLy
0298 i = OB_Iw(j,bi,bj)
0299 IF ( i.NE.OB_indexNone ) THEN
e37ac28e89 Mart*0300
0301 drFBar = 0. _d 0
0302 uMerBar = 0. _d 0
4e4ad91a39 Jean*0303 DO k=1,Nr
0304 uMerPri(k) = 0. _d 0
e37ac28e89 Mart*0305 ENDDO
4e4ad91a39 Jean*0306 DO k=1,Nr
2c64c37c71 Mart*0307 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0308 uMerBar = uMerBar + uVel(i+2,j,k,bi,bj)
2c64c37c71 Mart*0309 #else
4e4ad91a39 Jean*0310 uMerBar = uMerBar + OBWuStevens(j,k,bi,bj)
2c64c37c71 Mart*0311 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0312 & *drF(k)* _hFacW(i+1,j,k,bi,bj)
0313 drFBar = drFBar + drF(k)* _hFacW(i+1,j,k,bi,bj)
9f68a71aa4 Mart*0314 ENDDO
e37ac28e89 Mart*0315 IF ( drFBar .GT. 0. _d 0 ) uMerBar = uMerBar/drFBar
4e4ad91a39 Jean*0316 DO k=1,Nr
2c64c37c71 Mart*0317 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0318 uMerPri(k) = (uVel(i+2,j,k,bi,bj)-uMerBar)
2c64c37c71 Mart*0319 #else
4e4ad91a39 Jean*0320 uMerPri(k) = (OBWuStevens(j,k,bi,bj)-uMerBar)
2c64c37c71 Mart*0321 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0322 & * _maskW(i+1,j,k,bi,bj)
9f68a71aa4 Mart*0323 ENDDO
eb8aff1784 Jean*0324
9f68a71aa4 Mart*0325 drFBar = 0. _d 0
e37ac28e89 Mart*0326 uMerBar = 0. _d 0
4e4ad91a39 Jean*0327 DO k=1,Nr
0328 uMerBar = uMerBar + OBWu(j,k,bi,bj)
0329 & *drF(k)* _hFacW(i+1,j,k,bi,bj)
0330 drFBar = drFBar + drF(k)* _hFacW(i+1,j,k,bi,bj)
9f68a71aa4 Mart*0331 ENDDO
e37ac28e89 Mart*0332 IF ( drFBar .GT. 0. _d 0 ) uMerBar = uMerBar/drFBar
b2cb1ccb9a Mart*0333
e37ac28e89 Mart*0334
4e4ad91a39 Jean*0335 DO k=1,Nr
0336 OBWu(j,k,bi,bj) = (uMerBar + uMerPri(k))
0337 & * _maskW(i+1,j,k,bi,bj)
9f68a71aa4 Mart*0338
b2cb1ccb9a Mart*0339 #ifdef ALLOW_NONHYDROSTATIC
4e4ad91a39 Jean*0340 OBWw(j,k,bi,bj)=0.
b2cb1ccb9a Mart*0341 #endif
9f68a71aa4 Mart*0342 ENDDO
0343 ENDIF
eb8aff1784 Jean*0344 ENDDO
2c64c37c71 Mart*0345 #ifdef NONLIN_FRSURF
0346
0347 IF ( nonlinFreeSurf.GT.0 ) THEN
4e4ad91a39 Jean*0348 DO j=1-OLy,sNy+OLy
0349 i = OB_Iw(j,bi,bj)
0350 IF ( i.NE.OB_indexNone ) THEN
0351 OBWeta(j,bi,bj) = etaN(i+1,j,bi,bj)
2c64c37c71 Mart*0352 ENDIF
0353 ENDDO
0354 ENDIF
0355 #endif /* NONLIN_FRSURF */
b2cb1ccb9a Mart*0356
74019f026d Jean*0357
4e4ad91a39 Jean*0358 DO k=1,Nr
0359 DO j=1-OLy,sNy+OLy
0360 i = OB_Iw(j,bi,bj)
0361 IF ( i.NE.OB_indexNone ) THEN
0362 cflMer(j,k) = 0.5 _d 0 * _dxC(i+2,j,bi,bj)/dTtracerLev(k)
2c64c37c71 Mart*0363
0364
4e4ad91a39 Jean*0365 gFacM(j,k) = ABS(MAX(SIGN(1.D0,uVel(i+1,j,k,bi,bj)),0.D0))
2c64c37c71 Mart*0366 ELSE
4e4ad91a39 Jean*0367 cflMer(j,k) = 0. _d 0
0368 gFacM (j,k) = 0. _d 0
2c64c37c71 Mart*0369 ENDIF
0370 ENDDO
0371 ENDDO
4e4ad91a39 Jean*0372 # ifdef ALLOW_AUTODIFF_TAMC
0373
0374 # endif
0daa63ec35 Mart*0375
0376 CALL OBCS_STEVENS_CALC_TRACER_WEST(
4e4ad91a39 Jean*0377 U OBWt,
0378 I OBWtStevens, theta, gammat,
0daa63ec35 Mart*0379 I uVel, cflMer, gFacM, pFac, aFac,
0380 I OB_Iw, OB_indexNone, bi, bj,
0381 I futureTime, futureIter,
0382 I myThid )
0383
0384 CALL OBCS_STEVENS_CALC_TRACER_WEST(
4e4ad91a39 Jean*0385 U OBWs,
0daa63ec35 Mart*0386 I OBWsStevens, salt, gammas,
0387 I uVel, cflMer, gFacM, pFac, aFac,
0388 I OB_Iw, OB_indexNone, bi, bj,
0389 I futureTime, futureIter,
0390 I myThid )
0391
0392
eb8aff1784 Jean*0393 ENDIF
b2cb1ccb9a Mart*0394 #endif /* ALLOW_OBCS_WEST */
0395
0396
0397
0398 #ifdef ALLOW_OBCS_NORTH
9f68a71aa4 Mart*0399 # ifdef ALLOW_AUTODIFF_TAMC
4e4ad91a39 Jean*0400
0401
9f68a71aa4 Mart*0402 # endif
eb8aff1784 Jean*0403 IF ( useStevensNorth ) THEN
b2cb1ccb9a Mart*0404
0405 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0406 IF (debugMode)
0407 & CALL DEBUG_MSG('OBCS_CALC_STEVENS: North',myThid)
b2cb1ccb9a Mart*0408 #endif
9f68a71aa4 Mart*0409
0410
4e4ad91a39 Jean*0411 DO i=1-OLx,sNx+OLx
0412 j = OB_Jn(i,bi,bj)
0413 IF ( j.NE.OB_indexNone ) THEN
e37ac28e89 Mart*0414
9f68a71aa4 Mart*0415 drFBar = 0. _d 0
e37ac28e89 Mart*0416 vZonBar = 0. _d 0
4e4ad91a39 Jean*0417 DO k=1,Nr
0418 vZonPri(k) = 0. _d 0
e37ac28e89 Mart*0419 ENDDO
4e4ad91a39 Jean*0420 DO k=1,Nr
9f68a71aa4 Mart*0421 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0422 vZonBar = vZonBar + vVel(i,j-1,k,bi,bj)
9f68a71aa4 Mart*0423 #else
4e4ad91a39 Jean*0424 vZonBar = vZonBar + OBNvStevens(i,k,bi,bj)
9f68a71aa4 Mart*0425 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0426 & *drF(k)* _hFacS(i,j,k,bi,bj)
0427 drFBar = drFBar + drF(k)* _hFacS(i,j,k,bi,bj)
9f68a71aa4 Mart*0428 ENDDO
e37ac28e89 Mart*0429 IF ( drFBar .GT. 0. _d 0 ) vZonBar = vZonBar/drFBar
4e4ad91a39 Jean*0430 DO k=1,Nr
9f68a71aa4 Mart*0431 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0432 vZonPri(k) = (vVel(i,j-1,k,bi,bj)-vZonBar)
9f68a71aa4 Mart*0433 #else
4e4ad91a39 Jean*0434 vZonPri(k) = (OBNvStevens(i,k,bi,bj)-vZonBar)
9f68a71aa4 Mart*0435 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0436 & * _maskS(i,j,k,bi,bj)
9f68a71aa4 Mart*0437 ENDDO
0438
0439 drFBar = 0. _d 0
e37ac28e89 Mart*0440 vZonBar = 0. _d 0
4e4ad91a39 Jean*0441 DO k=1,Nr
0442 vZonBar = vZonBar + OBNv(i,k,bi,bj)
0443 & *drF(k)* _hFacS(i,j,k,bi,bj)
0444 drFBar = drFBar + drF(k)* _hFacS(i,j,k,bi,bj)
9f68a71aa4 Mart*0445 ENDDO
e37ac28e89 Mart*0446 IF ( drFBar .GT. 0. _d 0 ) vZonBar = vZonBar/drFBar
9f68a71aa4 Mart*0447
e37ac28e89 Mart*0448
4e4ad91a39 Jean*0449 DO k=1,Nr
0450 OBNv(i,k,bi,bj) = (vZonBar + vZonPri(k))
0451 & * _maskS(i,j,k,bi,bj)
9f68a71aa4 Mart*0452
b2cb1ccb9a Mart*0453 #ifdef ALLOW_NONHYDROSTATIC
4e4ad91a39 Jean*0454 OBNw(i,k,bi,bj)=0.
b2cb1ccb9a Mart*0455 #endif
9f68a71aa4 Mart*0456 ENDDO
0457 ENDIF
0458 ENDDO
b2cb1ccb9a Mart*0459 #ifdef NONLIN_FRSURF
9f68a71aa4 Mart*0460
0461 IF ( nonlinFreeSurf.GT.0 ) THEN
4e4ad91a39 Jean*0462 DO i=1-OLx,sNx+OLx
0463 j = OB_Jn(i,bi,bj)
0464 IF ( j.NE.OB_indexNone ) THEN
0465 OBNeta(i,bi,bj) = etaN(i,j-1,bi,bj)
9f68a71aa4 Mart*0466 ENDIF
0467 ENDDO
0468 ENDIF
0469 #endif /* NONLIN_FRSURF */
0470
74019f026d Jean*0471
4e4ad91a39 Jean*0472 DO k=1,Nr
0473 DO i=1-OLx,sNx+OLx
0474 j = OB_Jn(i,bi,bj)
0475 IF ( j.NE.OB_indexNone ) THEN
0476 cflZon(i,k) = 0.5 _d 0 * _dyC(i,j-1,bi,bj)/dTtracerLev(k)
9f68a71aa4 Mart*0477
0478
4e4ad91a39 Jean*0479 gFacZ(i,k) = ABS(MIN(SIGN(1.D0,vVel(i,j,k,bi,bj)),0.D0))
9f68a71aa4 Mart*0480 ELSE
4e4ad91a39 Jean*0481 cflZon(i,k) = 0. _d 0
0482 gFacZ (i,k) = 0. _d 0
9f68a71aa4 Mart*0483 ENDIF
0484 ENDDO
0485 ENDDO
4e4ad91a39 Jean*0486 # ifdef ALLOW_AUTODIFF_TAMC
0487
0488 # endif
0daa63ec35 Mart*0489
0490 CALL OBCS_STEVENS_CALC_TRACER_NORTH(
4e4ad91a39 Jean*0491 U OBNt,
0daa63ec35 Mart*0492 I OBNtStevens, theta, gammat,
4e4ad91a39 Jean*0493 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0494 I OB_Jn, OB_indexNone, bi, bj,
0495 I futureTime, futureIter,
0496 I myThid )
0497
0498 CALL OBCS_STEVENS_CALC_TRACER_NORTH(
4e4ad91a39 Jean*0499 U OBNs,
0daa63ec35 Mart*0500 I OBNsStevens, salt, gammas,
4e4ad91a39 Jean*0501 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0502 I OB_Jn, OB_indexNone, bi, bj,
0503 I futureTime, futureIter,
0504 I myThid )
0505
0506
eb8aff1784 Jean*0507 ENDIF
b2cb1ccb9a Mart*0508 #endif /* ALLOW_OBCS_NORTH */
0509
0510
0511
0512 #ifdef ALLOW_OBCS_SOUTH
9f68a71aa4 Mart*0513
0514 # ifdef ALLOW_AUTODIFF_TAMC
4e4ad91a39 Jean*0515
0516
9f68a71aa4 Mart*0517 # endif
eb8aff1784 Jean*0518 IF ( useStevensSouth ) THEN
b2cb1ccb9a Mart*0519
0520 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0521 IF (debugMode)
0522 & CALL DEBUG_MSG('OBCS_CALC_STEVENS: South',myThid)
b2cb1ccb9a Mart*0523 #endif
9f68a71aa4 Mart*0524
0525
4e4ad91a39 Jean*0526 DO i=1-OLx,sNx+OLx
0527 j = OB_Js(i,bi,bj)
0528 IF ( j.NE.OB_indexNone ) THEN
e37ac28e89 Mart*0529
9f68a71aa4 Mart*0530 drFBar = 0. _d 0
e37ac28e89 Mart*0531 vZonBar = 0. _d 0
4e4ad91a39 Jean*0532 DO k=1,Nr
0533 vZonPri(k) = 0. _d 0
e37ac28e89 Mart*0534 ENDDO
4e4ad91a39 Jean*0535 DO k=1,Nr
9f68a71aa4 Mart*0536 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0537 vZonBar = vZonBar + vVel(i,j+2,k,bi,bj)
9f68a71aa4 Mart*0538 #else
4e4ad91a39 Jean*0539 vZonBar = vZonBar + OBSvStevens(i,k,bi,bj)
9f68a71aa4 Mart*0540 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0541 & *drF(k)* _hFacS(i,j+1,k,bi,bj)
0542 drFBar = drFBar + drF(k)* _hFacS(i,j+1,k,bi,bj)
9f68a71aa4 Mart*0543 ENDDO
e37ac28e89 Mart*0544 IF ( drFBar .GT. 0. _d 0 ) vZonBar = vZonBar/drFBar
4e4ad91a39 Jean*0545 DO k=1,Nr
9f68a71aa4 Mart*0546 #ifdef OBCS_STEVENS_USE_INTERIOR_VELOCITY
4e4ad91a39 Jean*0547 vZonPri(k) = (vVel(i,j+2,k,bi,bj)-vZonBar)
9f68a71aa4 Mart*0548 #else
4e4ad91a39 Jean*0549 vZonPri(k) = (OBSvStevens(i,k,bi,bj)-vZonBar)
9f68a71aa4 Mart*0550 #endif /* OBCS_STEVENS_USE_INTERIOR_VELOCITY */
4e4ad91a39 Jean*0551 & * _maskS(i,j+1,k,bi,bj)
9f68a71aa4 Mart*0552 ENDDO
0553
0554 drFBar = 0. _d 0
e37ac28e89 Mart*0555 vZonBar = 0. _d 0
4e4ad91a39 Jean*0556 DO k=1,Nr
0557 vZonBar = vZonBar + OBSv(i,k,bi,bj)
0558 & *drF(k)* _hFacS(i,j+1,k,bi,bj)
0559 drFBar = drFBar + drF(k)* _hFacS(i,j+1,k,bi,bj)
9f68a71aa4 Mart*0560 ENDDO
e37ac28e89 Mart*0561 IF ( drFBar .GT. 0. _d 0 ) vZonBar = vZonBar/drFBar
9f68a71aa4 Mart*0562
e37ac28e89 Mart*0563
4e4ad91a39 Jean*0564 DO k=1,Nr
0565 OBSv(i,k,bi,bj) = (vZonBar + vZonPri(k))
0566 & * _maskS(i,j+1,k,bi,bj)
9f68a71aa4 Mart*0567
b2cb1ccb9a Mart*0568 #ifdef ALLOW_NONHYDROSTATIC
4e4ad91a39 Jean*0569 OBSw(i,k,bi,bj)=0.
b2cb1ccb9a Mart*0570 #endif
9f68a71aa4 Mart*0571 ENDDO
0572 ENDIF
0573 ENDDO
b2cb1ccb9a Mart*0574 #ifdef NONLIN_FRSURF
9f68a71aa4 Mart*0575
0576 IF ( nonlinFreeSurf.GT.0 ) THEN
4e4ad91a39 Jean*0577 DO i=1-OLx,sNx+OLx
0578 j = OB_Js(i,bi,bj)
0579 IF ( j.NE.OB_indexNone ) THEN
0580 OBSeta(i,bi,bj) = etaN(i,j+1,bi,bj)
9f68a71aa4 Mart*0581 ENDIF
0582 ENDDO
0583 ENDIF
0584 #endif /* NONLIN_FRSURF */
0585
74019f026d Jean*0586
4e4ad91a39 Jean*0587 DO k=1,Nr
0588 DO i=1-OLx,sNx+OLx
0589 j = OB_Js(i,bi,bj)
0590 IF ( j.NE.OB_indexNone ) THEN
0591 cflZon(i,k) = 0.5 _d 0 * _dyC(i,j+2,bi,bj)/dTtracerLev(k)
9f68a71aa4 Mart*0592
0593
4e4ad91a39 Jean*0594 gFacZ(i,k) = ABS(MAX(SIGN(1.D0,vVel(i,j+1,k,bi,bj)),0.D0))
9f68a71aa4 Mart*0595 ELSE
4e4ad91a39 Jean*0596 cflZon(i,k) = 0. _d 0
0597 gFacZ (i,k) = 0. _d 0
9f68a71aa4 Mart*0598 ENDIF
0599 ENDDO
0600 ENDDO
4e4ad91a39 Jean*0601 # ifdef ALLOW_AUTODIFF_TAMC
0602
0603 # endif
0daa63ec35 Mart*0604
0605 CALL OBCS_STEVENS_CALC_TRACER_SOUTH(
4e4ad91a39 Jean*0606 U OBSt,
0daa63ec35 Mart*0607 I OBStStevens, theta, gammat,
4e4ad91a39 Jean*0608 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0609 I OB_Js, OB_indexNone, bi, bj,
0610 I futureTime, futureIter,
0611 I myThid )
0612
0613 CALL OBCS_STEVENS_CALC_TRACER_SOUTH(
4e4ad91a39 Jean*0614 U OBSs,
0daa63ec35 Mart*0615 I OBSsStevens, salt, gammas,
4e4ad91a39 Jean*0616 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0617 I OB_Js, OB_indexNone, bi, bj,
0618 I futureTime, futureIter,
0619 I myThid )
0620
9f68a71aa4 Mart*0621
eb8aff1784 Jean*0622 ENDIF
b2cb1ccb9a Mart*0623 #endif /* ALLOW_OBCS_SOUTH */
0624
0625
0626 ENDDO
0627 ENDDO
0628
b1353a35da Mart*0629
0630 CALL OBCS_STEVENS_SAVE_TRACERS(
0631 I futureTime, futureIter,
0632 I myThid )
b2cb1ccb9a Mart*0633
0634
0635 #ifdef CHECK_BALANCE
0636 DO bj=myByLo(myThid),myByHi(myThid)
0637 DO bi=myBxLo(myThid),myBxHi(myThid)
0638 uPhase=0.
0639 vPhase=0.
eb8aff1784 Jean*0640 uVelLoc = 0.
4e4ad91a39 Jean*0641 DO j=1-OLy,sNy+OLy
e37ac28e89 Mart*0642 uMerBar=0. _d 0
4e4ad91a39 Jean*0643 DO k=1,Nr
0644 i = OB_Ie(j,bi,bj)
0645 IF ( i.EQ.OB_indexNone ) i = 1
0646 uPhase = uPhase + OBEu(j,k,bi,bj)
0647 & *drF(k)* _hFacW(i,j,k,bi,bj)*dyG(i,j,bi,bj)
0648 i = OB_Iw(j,bi,bj)
0649 IF ( i.EQ.OB_indexNone ) i = 1
0650 vPhase = vPhase + OBWu(j,k,bi,bj)
0651 & *drF(k)* _hFacW(i+1,j,k,bi,bj)*dyG(i+1,j,bi,bj)
e37ac28e89 Mart*0652
0653
0654
0655
b2cb1ccb9a Mart*0656 ENDDO
e37ac28e89 Mart*0657
eb8aff1784 Jean*0658 ENDDO
b2cb1ccb9a Mart*0659
0660 ENDDO
0661 ENDDO
eb8aff1784 Jean*0662 _GLOBAL_SUM_RL( uPhase, myThid )
0663 _GLOBAL_SUM_RL( vPhase, myThid )
e37ac28e89 Mart*0664
eb8aff1784 Jean*0665 print *, 'ml-obcs: OBE = ', uPhase*1 _d -6, ' Sv'
0666 print *, 'ml-obcs: OBW = ', vPhase*1 _d -6, ' Sv'
e37ac28e89 Mart*0667
eb8aff1784 Jean*0668 #endif /* CHECK_BALANCE */
b2cb1ccb9a Mart*0669
0670 #ifdef ALLOW_DEBUG
eb8aff1784 Jean*0671 IF (debugMode) CALL DEBUG_LEAVE('OBCS_CALC_STEVENS',myThid)
b2cb1ccb9a Mart*0672 #endif
eb8aff1784 Jean*0673
b2cb1ccb9a Mart*0674 #endif /* ALLOW_OBCS_STEVENS */
0675 RETURN
0676 END
b1353a35da Mart*0677
0678
0daa63ec35 Mart*0679
0680
0681 SUBROUTINE OBCS_STEVENS_CALC_TRACER_EAST(
4e4ad91a39 Jean*0682 U OBEf,
0daa63ec35 Mart*0683 I OBE_Stevens, tracer, gammaf,
4e4ad91a39 Jean*0684 I uVel, cflMer, gFacM, pFac, aFac,
0daa63ec35 Mart*0685 I OB_I, OB_indexNone, bi, bj,
0686 I futureTime, futureIter,
0687 I myThid )
0688
0689
0690
0691
0692
0693
0694
0695
0696 IMPLICIT NONE
0697
0698 #include "SIZE.h"
0699 #include "GRID.h"
0700
0701
0702
0703
0704
0705 _RL futureTime
0706 INTEGER futureIter
0707 INTEGER myThid
0708 INTEGER bi, bj
0709 INTEGER OB_indexNone
0710 INTEGER OB_I (1-OLy:sNy+OLy,nSx,nSy)
0711 _RL cflMer (1-OLy:sNy+OLy,Nr)
0712 _RL gFacM (1-OLy:sNy+OLy,Nr)
0713 _RL gammaf, pFac, aFac
4e4ad91a39 Jean*0714 _RL OBEf (1-OLy:sNy+OLy,Nr,nSx,nSy)
0715 _RL OBE_Stevens (1-OLy:sNy+OLy,Nr,nSx,nSy)
0716 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0717 _RL uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0daa63ec35 Mart*0718
0719 #ifdef ALLOW_OBCS_STEVENS
0720
0721
0722
0723
0724
0725 INTEGER i,j,k
0726 _RL uPhase
0727 _RL dtracSpace
0728 _RL dTracTime
0729
4e4ad91a39 Jean*0730 DO k=1,Nr
0731 DO j=1-OLy,sNy+OLy
0732 i = OB_I(j,bi,bj)
0733 IF ( i.NE.OB_indexNone ) THEN
0734 dTracSpace = (tracer(i-1,j,k,bi,bj)-tracer(i-2,j,k,bi,bj))
0735 & * _maskW(i-1,j,k,bi,bj)
0736 dTracTime = (tracer(i-1,j,k,bi,bj)-OBE_Stevens(j,k,bi,bj))
0737 uPhase = cflMer(j,k) * pFac
0daa63ec35 Mart*0738 IF ( dTracSpace .NE. 0. _d 0 ) THEN
4e4ad91a39 Jean*0739 uPhase = MIN( cflMer(j,k),
0740 & MAX( 0.D0, -cflMer(j,k)*dTracTime/dTracSpace )
0daa63ec35 Mart*0741 & ) * pFac
0742 ENDIF
0743
0744
4e4ad91a39 Jean*0745 OBEf(j,k,bi,bj) = _maskW(i,j,k,bi,bj) * (
0746 & - ( aFac*MAX(0.D0,uVel(i,j,k,bi,bj)) + uPhase )
0747 & *(tracer(i,j,k,bi,bj)-tracer(i-1,j,k,bi,bj))
0748 & * _recip_dxC(i,j,bi,bj)
0749 & - gFacM(j,k) * gammaf
0750 & * (tracer(i,j,k,bi,bj)-OBEf(j,k,bi,bj)) )
0daa63ec35 Mart*0751 ENDIF
0752 ENDDO
0753 ENDDO
0754
0755 #endif /* ALLOW_OBCS_STEVENS */
0756 RETURN
0757 END
0758
0759
0760
0761
0762 SUBROUTINE OBCS_STEVENS_CALC_TRACER_WEST(
4e4ad91a39 Jean*0763 U OBWf,
0daa63ec35 Mart*0764 I OBW_Stevens, tracer, gammaf,
4e4ad91a39 Jean*0765 I uVel, cflMer, gFacM, pFac, aFac,
0daa63ec35 Mart*0766 I OB_I, OB_indexNone, bi, bj,
0767 I futureTime, futureIter,
0768 I myThid )
0769
0770
0771
0772
0773
0774
0775
0776
0777 IMPLICIT NONE
0778
0779 #include "SIZE.h"
0780 #include "GRID.h"
0781
0782
0783
0784
0785
0786 _RL futureTime
0787 INTEGER futureIter
0788 INTEGER myThid
0789 INTEGER bi, bj
0790 INTEGER OB_indexNone
0791 INTEGER OB_I (1-OLy:sNy+OLy,nSx,nSy)
0792 _RL cflMer (1-OLy:sNy+OLy,Nr)
0793 _RL gFacM (1-OLy:sNy+OLy,Nr)
0794 _RL gammaf, pFac, aFac
4e4ad91a39 Jean*0795 _RL OBWf (1-OLy:sNy+OLy,Nr,nSx,nSy)
0796 _RL OBW_Stevens (1-OLy:sNy+OLy,Nr,nSx,nSy)
0797 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0798 _RL uVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0daa63ec35 Mart*0799
0800 #ifdef ALLOW_OBCS_STEVENS
0801
0802
0803
0804
0805
0806 INTEGER i,j,k
0807 _RL uPhase
0808 _RL dtracSpace
0809 _RL dTracTime
0810
0811
4e4ad91a39 Jean*0812 DO k=1,Nr
0813 DO j=1-OLy,sNy+OLy
0814 i = OB_I(j,bi,bj)
0815 IF ( i.NE.OB_indexNone ) THEN
0816 dTracSpace = (tracer(i+2,j,k,bi,bj)-tracer(i+1,j,k,bi,bj))
0817 & * _maskW(i+2,j,k,bi,bj)
0818 dTracTime = (tracer(i+1,j,k,bi,bj)-OBW_Stevens(j,k,bi,bj))
0819 uPhase = -cflMer(j,k) * pFac
0daa63ec35 Mart*0820 IF ( dTracSpace .NE. 0. _d 0 ) THEN
4e4ad91a39 Jean*0821 uPhase = MAX( -cflMer(j,k),
0822 & MIN( 0.D0, -cflMer(j,k)*dTracTime/dTracSpace )
0daa63ec35 Mart*0823 & ) * pFac
0824 ENDIF
0825
0826
4e4ad91a39 Jean*0827 OBWf(j,k,bi,bj) = _maskW(i+1,j,k,bi,bj) * (
0828 & - ( aFac*MIN(0.D0,uVel(i+1,j,k,bi,bj)) + uPhase )
0829 & *(tracer(i+1,j,k,bi,bj)-tracer(i,j,k,bi,bj))
0830 & * _recip_dxC(i+1,j,bi,bj)
0831 & - gFacM(j,k) * gammaf
0832 & * (tracer(i,j,k,bi,bj)-OBWf(j,k,bi,bj)) )
0daa63ec35 Mart*0833 ENDIF
0834 ENDDO
0835 ENDDO
0836
0837 #endif /* ALLOW_OBCS_STEVENS */
0838 RETURN
0839 END
0840
0841
0842
0843
0844 SUBROUTINE OBCS_STEVENS_CALC_TRACER_NORTH(
4e4ad91a39 Jean*0845 U OBNf,
0daa63ec35 Mart*0846 I OBN_Stevens, tracer, gammaf,
4e4ad91a39 Jean*0847 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0848 I OB_J, OB_indexNone, bi, bj,
0849 I futureTime, futureIter,
0850 I myThid )
0851
0852
0853
0854
0855
0856
0857
0858
0859 IMPLICIT NONE
0860
0861 #include "SIZE.h"
0862 #include "GRID.h"
0863
0864
0865
0866
0867
0868 _RL futureTime
0869 INTEGER futureIter
0870 INTEGER myThid
0871 INTEGER bi, bj
0872 INTEGER OB_indexNone
0873 INTEGER OB_J (1-OLx:sNx+OLx,nSx,nSy)
0874 _RL cflZon (1-OLx:sNx+OLx,Nr)
0875 _RL gFacZ (1-OLx:sNx+OLx,Nr)
0876 _RL gammaf, pFac, aFac
4e4ad91a39 Jean*0877 _RL OBNf (1-OLx:sNx+OLx,Nr,nSx,nSy)
0878 _RL OBN_Stevens (1-OLx:sNx+OLx,Nr,nSx,nSy)
0879 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0880 _RL vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0daa63ec35 Mart*0881
0882 #ifdef ALLOW_OBCS_STEVENS
0883
0884
0885
0886
0887
0888 INTEGER i,j,k
0889 _RL vPhase
0890 _RL dtracSpace
0891 _RL dTracTime
0892
4e4ad91a39 Jean*0893 DO k=1,Nr
0894 DO i=1-OLx,sNx+OLx
0895 j = OB_J(i,bi,bj)
0896 IF ( j.NE.OB_indexNone ) THEN
0daa63ec35 Mart*0897
4e4ad91a39 Jean*0898 dTracSpace = (tracer(i,j-1,k,bi,bj)-tracer(i,j-2,k,bi,bj))
0899 & * _maskS(i,j-1,k,bi,bj)
0900 dTracTime = (tracer(i,j-1,k,bi,bj)-OBN_Stevens(i,k,bi,bj))
0901 vPhase = cflZon(i,k) * pFac
0daa63ec35 Mart*0902 IF ( dTracSpace .NE. 0. _d 0 ) THEN
4e4ad91a39 Jean*0903 vPhase = MIN( cflZon(i,k),
0904 & MAX( 0.D0, -cflZon(i,k)*dTracTime/dTracSpace )
0daa63ec35 Mart*0905 & ) * pFac
0906 ENDIF
0907
0908
4e4ad91a39 Jean*0909 OBNf(i,k,bi,bj) = _maskS(i,j,k,bi,bj) * (
0910 & - ( aFac*MAX(0.D0,vVel(i,j,k,bi,bj)) + vPhase )
0911 & *(tracer(i,j,k,bi,bj)-tracer(i,j-1,k,bi,bj))
0912 & * _recip_dyC(i,j,bi,bj)
0913 & - gFacZ(i,k) * gammaf
0914 & * (tracer(i,j,k,bi,bj)-OBNf(i,k,bi,bj)) )
0daa63ec35 Mart*0915 ENDIF
0916 ENDDO
0917 ENDDO
0918
0919 #endif /* ALLOW_OBCS_STEVENS */
0920 RETURN
0921 END
0922
0923
0924
0925
0926 SUBROUTINE OBCS_STEVENS_CALC_TRACER_SOUTH(
4e4ad91a39 Jean*0927 U OBSf,
0daa63ec35 Mart*0928 I OBS_Stevens, tracer, gammaf,
4e4ad91a39 Jean*0929 I vVel, cflZon, gFacZ, pFac, aFac,
0daa63ec35 Mart*0930 I OB_J, OB_indexNone, bi, bj,
0931 I futureTime, futureIter,
0932 I myThid )
0933
0934
0935
0936
0937
0938
0939
0940
0941 IMPLICIT NONE
0942
0943 #include "SIZE.h"
0944 #include "GRID.h"
0945
0946
0947
0948
0949
0950 _RL futureTime
0951 INTEGER futureIter
0952 INTEGER myThid
0953 INTEGER bi, bj
0954 INTEGER OB_indexNone
0955 INTEGER OB_J (1-OLx:sNx+OLx,nSx,nSy)
0956 _RL cflZon (1-OLx:sNx+OLx,Nr)
0957 _RL gFacZ (1-OLx:sNx+OLx,Nr)
0958 _RL gammaf, pFac, aFac
4e4ad91a39 Jean*0959 _RL OBSf (1-OLx:sNx+OLx,Nr,nSx,nSy)
0960 _RL OBS_Stevens (1-OLx:sNx+OLx,Nr,nSx,nSy)
0961 _RL tracer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0962 _RL vVel (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
0daa63ec35 Mart*0963
0964 #ifdef ALLOW_OBCS_STEVENS
0965
0966
0967
0968
0969
0970 INTEGER i,j,k
0971 _RL vPhase
0972 _RL dtracSpace
0973 _RL dTracTime
0974
4e4ad91a39 Jean*0975 DO k=1,Nr
0976 DO i=1-OLx,sNx+OLx
0977 j = OB_J(i,bi,bj)
0978 IF ( j.NE.OB_indexNone ) THEN
0979 dTracSpace = (tracer(i,j+2,k,bi,bj)-tracer(i,j+1,k,bi,bj))
0980 & * _maskS(i,j+2,k,bi,bj)
0981 dTracTime = (tracer(i,j+1,k,bi,bj)-OBS_Stevens(i,k,bi,bj))
0982 vPhase = -cflZon(i,k) * pFac
0daa63ec35 Mart*0983 IF ( dTracSpace .NE. 0. _d 0 ) THEN
4e4ad91a39 Jean*0984 vPhase = MAX( -cflZon(i,k),
0985 & MIN( 0.D0, -cflZon(i,k)*dTracTime/dTracSpace )
0daa63ec35 Mart*0986 & ) * pFac
0987 ENDIF
0988
0989
4e4ad91a39 Jean*0990 OBSf(i,k,bi,bj) = _maskS(i,j+1,k,bi,bj) * (
0991 & - ( aFac*MIN(0.D0,vVel(i,j+1,k,bi,bj)) + vPhase )
0992 & *(tracer(i,j+1,k,bi,bj)-tracer(i,j,k,bi,bj))
0993 & * _recip_dyC(i,j+1,bi,bj)
0994 & - gFacZ(i,k) * gammaf
0995 & * (tracer(i,j,k,bi,bj)-OBSf(i,k,bi,bj)) )
0daa63ec35 Mart*0996 ENDIF
0997 ENDDO
0998 ENDDO
0999
1000 #endif /* ALLOW_OBCS_STEVENS */
1001 RETURN
1002 END
1003
1004
b1353a35da Mart*1005
1006
1007 SUBROUTINE OBCS_STEVENS_SAVE_TRACERS(
1008 I futureTime, futureIter,
1009 I myThid )
1010
1011
1012
74019f026d Jean*1013
1014
b1353a35da Mart*1015
1016
1017
1018
1019 IMPLICIT NONE
1020
1021 #include "SIZE.h"
1022 #include "EEPARAMS.h"
1023 #include "GRID.h"
1024 #include "OBCS_PARAMS.h"
1025 #include "OBCS_GRID.h"
1026 #include "OBCS_FIELDS.h"
1027 #include "DYNVARS.h"
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038 _RL futureTime
1039 INTEGER futureIter
1040 INTEGER myThid
1041
397c34a218 Mart*1042 #ifdef ALLOW_OBCS_STEVENS
b1353a35da Mart*1043
4e4ad91a39 Jean*1044
1045
1046
b1353a35da Mart*1047 INTEGER bi,bj,i,j,k,Iobc,Jobc
1048
1049
1050 DO bj=myByLo(myThid),myByHi(myThid)
1051 DO bi=myBxLo(myThid),myBxHi(myThid)
1052 #ifdef ALLOW_OBCS_NORTH
1053 IF ( tileHasOBN(bi,bj) .AND. useStevensNorth ) THEN
1054
74019f026d Jean*1055 DO i=1-OLx,sNx+OLx
b1353a35da Mart*1056 Jobc = OB_Jn(i,bi,bj)
74019f026d Jean*1057 IF ( Jobc.NE.OB_indexNone ) THEN
b1353a35da Mart*1058 DO k = 1,Nr
1059 OBNtStevens(i,k,bi,bj) = theta(i,Jobc-1,k,bi,bj)
1060 & *maskC(i,Jobc+1,k,bi,bj)
1061 OBNsStevens(i,k,bi,bj) = salt(i,Jobc-1,k,bi,bj)
1062 & *maskC(i,Jobc+1,k,bi,bj)
1063 ENDDO
1064 ENDIF
1065 ENDDO
1066 ENDIF
1067 #endif /* ALLOW_OBCS_NORTH */
1068 #ifdef ALLOW_OBCS_SOUTH
1069 IF ( tileHasOBS(bi,bj) .AND. useStevensSouth ) THEN
1070
74019f026d Jean*1071 DO i=1-OLx,sNx+OLx
b1353a35da Mart*1072 Jobc = OB_Js(i,bi,bj)
74019f026d Jean*1073 IF ( Jobc.NE.OB_indexNone ) THEN
b1353a35da Mart*1074 DO k = 1,Nr
1075 OBStStevens(i,k,bi,bj) = theta(i,Jobc+1,k,bi,bj)
1076 & *maskC(i,Jobc+1,k,bi,bj)
1077 OBSsStevens(i,k,bi,bj) = salt(i,Jobc+1,k,bi,bj)
1078 & *maskC(i,Jobc+1,k,bi,bj)
1079 ENDDO
1080 ENDIF
1081 ENDDO
1082 ENDIF
1083 #endif /* ALLOW_OBCS_SOUTH */
1084 #ifdef ALLOW_OBCS_EAST
1085 IF ( tileHasOBE(bi,bj) .AND. useStevensEast ) THEN
1086
74019f026d Jean*1087 DO j=1-OLy,sNy+OLy
b1353a35da Mart*1088 Iobc = OB_Ie(j,bi,bj)
74019f026d Jean*1089 IF ( Iobc.NE.OB_indexNone ) THEN
b1353a35da Mart*1090 DO k = 1,Nr
1091 OBEtStevens(j,k,bi,bj) = theta(Iobc-1,j,k,bi,bj)
1092 & *maskC(Iobc-1,j,k,bi,bj)
1093 OBEsStevens(j,k,bi,bj) = salt(Iobc-1,j,k,bi,bj)
1094 & *maskC(Iobc-1,j,k,bi,bj)
1095 ENDDO
1096 ENDIF
1097 ENDDO
1098 ENDIF
1099 #endif /* ALLOW_OBCS_EAST */
1100 #ifdef ALLOW_OBCS_WEST
1101 IF ( tileHasOBW(bi,bj) .AND. useStevensWest ) THEN
1102
74019f026d Jean*1103 DO j=1-OLy,sNy+OLy
b1353a35da Mart*1104 Iobc = OB_Iw(j,bi,bj)
74019f026d Jean*1105 IF ( Iobc.NE.OB_indexNone ) THEN
b1353a35da Mart*1106 DO k = 1,Nr
1107 OBWtStevens(j,k,bi,bj) = theta(Iobc+1,j,k,bi,bj)
1108 & *maskC(Iobc+1,j,k,bi,bj)
1109 OBWsStevens(j,k,bi,bj) = salt(Iobc+1,j,k,bi,bj)
1110 & *maskC(Iobc+1,j,k,bi,bj)
1111 ENDDO
1112 ENDIF
1113 ENDDO
1114 ENDIF
1115 #endif /* ALLOW_OBCS_WEST */
1116 ENDDO
1117 ENDDO
1118 #endif /* ALLOW_OBCS_STEVENS */
1119 RETURN
1120 END