File indexing completed on 2024-03-30 05:10:45 UTC
view on githubraw file Latest commit 598aebfc on 2024-03-29 19:16:48 UTC
31566b6684 Alis*0001 #include "GAD_OPTIONS.h"
1574069d50 Mart*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
31566b6684 Alis*0005
28d97917ae Alis*0006
0007
0008
0009
0845f1a203 Jean*0010 SUBROUTINE GAD_CALC_RHS(
31566b6684 Alis*0011 I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
0845f1a203 Jean*0012 I xA, yA, maskUp, uFld, vFld, wFld,
0013 I uTrans, vTrans, rTrans, rTransKp1,
6b7e107e49 Jean*0014 I diffKh, diffK4, KappaR, diffKr4, TracerN, TracAB,
cb0d108b91 Jean*0015 I deltaTLev, trIdentity,
0d75a51072 Mart*0016 I advectionSchArg, vertAdvecSchArg,
77c3815cb8 Jean*0017 I calcAdvection, implicitAdvection, applyAB_onTracer,
46918f1b26 Jean*0018 I trUseDiffKr4, trUseGMRedi, trUseKPP, trUseSmolHack,
a7a3adb269 Jean*0019 O fZon, fMer,
31566b6684 Alis*0020 U fVerT, gTracer,
616d5d70aa Jean*0021 I myTime, myIter, myThid )
31566b6684 Alis*0022
28d97917ae Alis*0023
1bb133c00c Jean*0024
28d97917ae Alis*0025
1bb133c00c Jean*0026
28d97917ae Alis*0027
0028
0029
0030
0031
0032
0033
0034
1bb133c00c Jean*0035
28d97917ae Alis*0036
0037
0038
0039
1bb133c00c Jean*0040
28d97917ae Alis*0041
0042
0043 IMPLICIT NONE
31566b6684 Alis*0044 #include "SIZE.h"
0045 #include "EEPARAMS.h"
0046 #include "PARAMS.h"
0047 #include "GRID.h"
e0c3eb6fa1 Jean*0048 #include "SURFACE.h"
31566b6684 Alis*0049 #include "GAD.h"
5127d1d91b Jean*0050 #ifdef ALLOW_AUTODIFF
0051 # include "AUTODIFF_PARAMS.h"
0052 #endif /* ALLOW_AUTODIFF */
09c4028516 Patr*0053
28d97917ae Alis*0054
b92db9c400 Jean*0055
0056
0057
0845f1a203 Jean*0058
0059
0060
0061
b92db9c400 Jean*0062
0845f1a203 Jean*0063
b92db9c400 Jean*0064
0065
1b5fb69d21 Ed H*0066
0067
0068
6b7e107e49 Jean*0069
5a39f5fdb9 Jean*0070
6b7e107e49 Jean*0071
77c3815cb8 Jean*0072
0073
0074
a8c74226d9 Jean*0075
cb0d108b91 Jean*0076
0d75a51072 Mart*0077
0078
1b5fb69d21 Ed H*0079
0080
77c3815cb8 Jean*0081
6b7e107e49 Jean*0082
6ea562f7f0 Jean*0083
0084
46918f1b26 Jean*0085
616d5d70aa Jean*0086
0087
1b5fb69d21 Ed H*0088
31566b6684 Alis*0089 INTEGER bi,bj,iMin,iMax,jMin,jMax
28d97917ae Alis*0090 INTEGER k,kUp,kDown,kM1
31566b6684 Alis*0091 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0092 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0845f1a203 Jean*0093 _RS maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0094 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0095 _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0096 _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
31566b6684 Alis*0097 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0098 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0099 _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75abb052f1 Jean*0100 _RL rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
31566b6684 Alis*0101 _RL diffKh, diffK4
5a39f5fdb9 Jean*0102 _RL KappaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
6b7e107e49 Jean*0103 _RL diffKr4(Nr)
e9de1d7682 Jean*0104 _RL TracerN(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0105 _RL TracAB (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
4e66ab0b67 Oliv*0106 _RL deltaTLev(Nr)
cb0d108b91 Jean*0107 INTEGER trIdentity
0d75a51072 Mart*0108 INTEGER advectionSchArg, vertAdvecSchArg
6ea562f7f0 Jean*0109 LOGICAL calcAdvection
77c3815cb8 Jean*0110 LOGICAL implicitAdvection, applyAB_onTracer
46918f1b26 Jean*0111 LOGICAL trUseDiffKr4, trUseGMRedi, trUseKPP, trUseSmolHack
616d5d70aa Jean*0112 _RL myTime
0113 INTEGER myIter, myThid
31566b6684 Alis*0114
28d97917ae Alis*0115
1bb133c00c Jean*0116
a7a3adb269 Jean*0117
0118
1b5fb69d21 Ed H*0119
935a76deec Jean*0120 _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
a7a3adb269 Jean*0121 _RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0122 _RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
28d97917ae Alis*0123 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
0124
cb0d108b91 Jean*0125
0126 #ifdef ALLOW_DIAGNOSTICS
0127 CHARACTER*4 GAD_DIAG_SUFX
0128 EXTERNAL GAD_DIAG_SUFX
0129 #endif /* ALLOW_DIAGNOSTICS */
0130
28d97917ae Alis*0131
1b5fb69d21 Ed H*0132
0d75a51072 Mart*0133
0134
1b5fb69d21 Ed H*0135
0136
0137
0138
1bb133c00c Jean*0139
31566b6684 Alis*0140 INTEGER i,j
0d75a51072 Mart*0141 INTEGER advectionScheme, vertAdvecScheme
2a09aadbbc Jean*0142 _RS maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0143 _RS maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
31566b6684 Alis*0144 _RL df4 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0145 _RL af (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0146 _RL df (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0147 _RL localT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1bb133c00c Jean*0148 _RL locABT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75abb052f1 Jean*0149 _RL advFac, rAdvFac
998cbd211e Oliv*0150 #ifdef GAD_SMOLARKIEWICZ_HACK
622cf2fb44 Jean*0151 _RL outFlux, trac, gTrFac
998cbd211e Oliv*0152 #endif
cb0d108b91 Jean*0153 #ifdef ALLOW_DIAGNOSTICS
0154 CHARACTER*8 diagName
0155 CHARACTER*4 diagSufx
0156 #endif
28d97917ae Alis*0157
31566b6684 Alis*0158
0d75a51072 Mart*0159
0160 advectionScheme = advectionSchArg
0161 vertAdvecScheme = vertAdvecSchArg
64442af1fe Jean*0162 #ifdef ALLOW_AUTODIFF
1574069d50 Mart*0163 #ifdef ALLOW_AUTODIFF_TAMC
0164
0165
0166
0167
0168 #endif
31566b6684 Alis*0169
0170
0171 fVerT(1,1,kDown) = fVerT(1,1,kDown)
0d75a51072 Mart*0172
0173 IF ( inAdMode .AND. useApproxAdvectionInAdMode ) THEN
0174
0175
0176
0177
0178 IF ( advectionSchArg.EQ.ENUM_DST3_FLUX_LIMIT )
0179 & advectionScheme = ENUM_DST3
0180 IF ( vertAdvecSchArg.EQ.ENUM_DST3_FLUX_LIMIT )
0181 & vertAdvecScheme = ENUM_DST3
0182
0183 ENDIF
0184 #endif /* ALLOW_AUTODIFF */
09c4028516 Patr*0185
81c8d7b9aa Jean*0186 #ifdef ALLOW_DIAGNOSTICS
0187
0188 IF ( useDiagnostics ) THEN
cb0d108b91 Jean*0189 diagSufx = GAD_DIAG_SUFX( trIdentity, myThid )
81c8d7b9aa Jean*0190 ENDIF
0191 #endif
0192
75abb052f1 Jean*0193 advFac = 0. _d 0
0194 IF (calcAdvection) advFac = 1. _d 0
bb6c554092 Jean*0195 rAdvFac = rkSign*advFac
95826db035 Jean*0196 IF (implicitAdvection) rAdvFac = rkSign
75abb052f1 Jean*0197
31566b6684 Alis*0198 DO j=1-OLy,sNy+OLy
0199 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0200 fZon(i,j) = 0. _d 0
0201 fMer(i,j) = 0. _d 0
0202 fVerT(i,j,kUp) = 0. _d 0
09c4028516 Patr*0203 df(i,j) = 0. _d 0
0204 df4(i,j) = 0. _d 0
31566b6684 Alis*0205 ENDDO
0206 ENDDO
0207
0208
77c3815cb8 Jean*0209 IF ( applyAB_onTracer ) THEN
0210 DO j=1-OLy,sNy+OLy
0211 DO i=1-OLx,sNx+OLx
e9de1d7682 Jean*0212 localT(i,j)=TracerN(i,j,k)
0213 locABT(i,j)= TracAB(i,j,k)
77c3815cb8 Jean*0214 ENDDO
0215 ENDDO
0216 ELSE
0217 DO j=1-OLy,sNy+OLy
0218 DO i=1-OLx,sNx+OLx
e9de1d7682 Jean*0219 localT(i,j)=TracerN(i,j,k)
0220 locABT(i,j)=TracerN(i,j,k)
77c3815cb8 Jean*0221 ENDDO
0222 ENDDO
0223 ENDIF
31566b6684 Alis*0224
0225
0226 IF (diffK4 .NE. 0.) THEN
1574069d50 Mart*0227 #ifdef ALLOW_AUTODIFF_TAMC
0228
0229
0230
0231
0232 #endif
31566b6684 Alis*0233 CALL GAD_GRAD_X(bi,bj,k,xA,localT,fZon,myThid)
1574069d50 Mart*0234 #ifdef ALLOW_AUTODIFF_TAMC
0235
0236 #endif
31566b6684 Alis*0237 CALL GAD_GRAD_Y(bi,bj,k,yA,localT,fMer,myThid)
1574069d50 Mart*0238 #ifdef ALLOW_AUTODIFF_TAMC
0239
0240 #endif
31566b6684 Alis*0241 CALL GAD_DEL2(bi,bj,k,fZon,fMer,df4,myThid)
0242 ENDIF
0243
0244
cb0d108b91 Jean*0245 DO j=1-OLy,sNy+OLy
0246 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0247 fZon(i,j) = 0. _d 0
31566b6684 Alis*0248 ENDDO
0249 ENDDO
0250
0251
c17bf9e7ce Jean*0252 IF (calcAdvection) THEN
0d75a51072 Mart*0253 IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN
2a09aadbbc Jean*0254 CALL GAD_C2_ADV_X( bi,bj,k, uTrans, locABT, af, myThid )
0845f1a203 Jean*0255 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
a90759ed9a Jean*0256 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
2a09aadbbc Jean*0257 CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE.,
0258 I deltaTLev(k), uTrans, uFld, locABT,
0259 O af, myThid )
0260 ELSE
0261 DO j=1-OLy,sNy+OLy
0262 DO i=1-OLx,sNx+OLx
0263 #ifdef ALLOW_OBCS
0264 maskLocW(i,j) = _maskW(i,j,k,bi,bj)*maskInW(i,j,bi,bj)
0265 #else /* ALLOW_OBCS */
0266 maskLocW(i,j) = _maskW(i,j,k,bi,bj)
0267 #endif /* ALLOW_OBCS */
0268 ENDDO
0269 ENDDO
0d75a51072 Mart*0270 IF ( advectionScheme.EQ.ENUM_FLUX_LIMIT ) THEN
2a09aadbbc Jean*0271 CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
0272 I uTrans, uFld, maskLocW, locABT,
0273 O af, myThid )
0d75a51072 Mart*0274 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
188f784a21 Jean*0275 CALL GAD_U3_ADV_X( bi,bj,k, uTrans, maskLocW, locABT,
2a09aadbbc Jean*0276 O af, myThid )
0d75a51072 Mart*0277 ELSEIF ( advectionScheme.EQ.ENUM_CENTERED_4TH ) THEN
2a09aadbbc Jean*0278 CALL GAD_C4_ADV_X( bi,bj,k, uTrans, maskLocW, locABT,
0279 O af, myThid )
0d75a51072 Mart*0280 ELSEIF ( advectionScheme.EQ.ENUM_DST3 ) THEN
2a09aadbbc Jean*0281 CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
0282 I uTrans, uFld, maskLocW, locABT,
0283 O af, myThid )
0d75a51072 Mart*0284 ELSEIF ( advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
2a09aadbbc Jean*0285 CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
0286 I uTrans, uFld, maskLocW, locABT,
0287 O af, myThid )
0d75a51072 Mart*0288 ELSEIF ( advectionScheme.EQ.ENUM_OS7MP ) THEN
2a09aadbbc Jean*0289 CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
0290 I uTrans, uFld, maskLocW, locABT,
0291 O af, myThid )
0292 ELSE
0293 STOP 'GAD_CALC_RHS: Bad advectionScheme (X)'
0294 ENDIF
81c8d7b9aa Jean*0295 ENDIF
cb0d108b91 Jean*0296 #ifdef ALLOW_OBCS
0297 IF ( useOBCS ) THEN
0298
0299 CALL OBCS_U1_ADV_TRACER( .TRUE., trIdentity, bi, bj, k,
0300 I maskW(1-OLx,1-OLy,k,bi,bj),
0301 I uTrans, locABT,
0302 U af, myThid )
0303 ENDIF
0304 #endif /* ALLOW_OBCS */
0305 DO j=1-OLy,sNy+OLy
0306 DO i=1-OLx,sNx+OLx
81c8d7b9aa Jean*0307 fZon(i,j) = fZon(i,j) + af(i,j)
0308 ENDDO
0309 ENDDO
0310 #ifdef ALLOW_DIAGNOSTICS
0311 IF ( useDiagnostics ) THEN
0312 diagName = 'ADVx'//diagSufx
cb0d108b91 Jean*0313 CALL DIAGNOSTICS_FILL( af, diagName, k,1, 2,bi,bj, myThid )
81c8d7b9aa Jean*0314 ENDIF
50d8304171 Ryan*0315 #ifdef ALLOW_LAYERS
0316 IF ( useLayers ) THEN
9897ae9d92 Jean*0317 CALL LAYERS_FILL( af, trIdentity, 'AFX',
50d8304171 Ryan*0318 & k, 1, 2,bi,bj, myThid )
0319 ENDIF
0320 #endif /* ENDIF */
81c8d7b9aa Jean*0321 #endif
24016b3859 Alis*0322 ENDIF
31566b6684 Alis*0323
0324
0325 IF (diffKh.NE.0.) THEN
0326 CALL GAD_DIFF_X(bi,bj,k,xA,diffKh,localT,df,myThid)
0327 ELSE
cb0d108b91 Jean*0328 DO j=1-OLy,sNy+OLy
0329 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0330 df(i,j) = 0. _d 0
31566b6684 Alis*0331 ENDDO
0332 ENDDO
0333 ENDIF
0334
81c8d7b9aa Jean*0335
0336 IF (diffK4 .NE. 0.) THEN
0337 CALL GAD_BIHARM_X(bi,bj,k,xA,df4,diffK4,df,myThid)
0338 ENDIF
0339
31566b6684 Alis*0340 #ifdef ALLOW_GMREDI
0341
8e4e737494 Jean*0342 IF ( trUseGMRedi ) THEN
972c0130ec Jean*0343 CALL GMREDI_XTRANSPORT(
b92db9c400 Jean*0344 I trIdentity, bi, bj, k, iMin, iMax+1, jMin, jMax,
8233d0ceb9 Jean*0345 I xA, maskUp, TracerN,
77c3815cb8 Jean*0346 U df,
e9de1d7682 Jean*0347 I myThid )
31566b6684 Alis*0348 ENDIF
0349 #endif
eaba2fd266 Jean*0350
cb0d108b91 Jean*0351 DO j=1-OLy,sNy+OLy
0352 DO i=1-OLx,sNx+OLx
eaba2fd266 Jean*0353 fZon(i,j) = fZon(i,j) + df(i,j)*rhoFacC(k)
31566b6684 Alis*0354 ENDDO
0355 ENDDO
0356
81c8d7b9aa Jean*0357 #ifdef ALLOW_DIAGNOSTICS
0358
0359
0360 IF ( useDiagnostics .AND.
8e4e737494 Jean*0361 & (diffKh.NE.0. .OR. diffK4 .NE.0. .OR. trUseGMRedi) ) THEN
f68e77b60d Jean*0362 diagName = 'DFxE'//diagSufx
cb0d108b91 Jean*0363 CALL DIAGNOSTICS_FILL( df, diagName, k,1, 2,bi,bj, myThid )
cf336ab6c5 Ryan*0364 #ifdef ALLOW_LAYERS
ee16a2cae4 Ryan*0365 IF ( useLayers ) THEN
50d8304171 Ryan*0366 CALL LAYERS_FILL( df, trIdentity, 'DFX',
0367 & k, 1, 2,bi,bj, myThid )
ee16a2cae4 Ryan*0368 ENDIF
cf336ab6c5 Ryan*0369 #endif /* ALLOW_LAYERS */
31566b6684 Alis*0370 ENDIF
81c8d7b9aa Jean*0371 #endif
31566b6684 Alis*0372
0373
cb0d108b91 Jean*0374 DO j=1-OLy,sNy+OLy
0375 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0376 fMer(i,j) = 0. _d 0
31566b6684 Alis*0377 ENDDO
0378 ENDDO
0379
0380
c17bf9e7ce Jean*0381 IF (calcAdvection) THEN
0d75a51072 Mart*0382 IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN
2a09aadbbc Jean*0383 CALL GAD_C2_ADV_Y( bi,bj,k, vTrans, locABT, af, myThid )
0845f1a203 Jean*0384 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
a90759ed9a Jean*0385 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
2a09aadbbc Jean*0386 CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE.,
0387 I deltaTLev(k), vTrans, vFld, locABT,
0388 O af, myThid )
0389 ELSE
0390 DO j=1-OLy,sNy+OLy
0391 DO i=1-OLx,sNx+OLx
0392 #ifdef ALLOW_OBCS
0393 maskLocS(i,j) = _maskS(i,j,k,bi,bj)*maskInS(i,j,bi,bj)
0394 #else /* ALLOW_OBCS */
0395 maskLocS(i,j) = _maskS(i,j,k,bi,bj)
0396 #endif /* ALLOW_OBCS */
0397 ENDDO
0398 ENDDO
0d75a51072 Mart*0399 IF ( advectionScheme.EQ.ENUM_FLUX_LIMIT ) THEN
2a09aadbbc Jean*0400 CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
0401 I vTrans, vFld, maskLocS, locABT,
0402 O af, myThid )
0d75a51072 Mart*0403 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
2a09aadbbc Jean*0404 CALL GAD_U3_ADV_Y( bi,bj,k, vTrans, maskLocS, locABT,
0405 O af, myThid )
0d75a51072 Mart*0406 ELSEIF ( advectionScheme.EQ.ENUM_CENTERED_4TH ) THEN
2a09aadbbc Jean*0407 CALL GAD_C4_ADV_Y( bi,bj,k, vTrans, maskLocS, locABT,
0408 O af, myThid )
0d75a51072 Mart*0409 ELSEIF ( advectionScheme.EQ.ENUM_DST3 ) THEN
2a09aadbbc Jean*0410 CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
0411 I vTrans, vFld, maskLocS, locABT,
0412 O af, myThid )
0d75a51072 Mart*0413 ELSEIF ( advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
2a09aadbbc Jean*0414 CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
0415 I vTrans, vFld, maskLocS, locABT,
0416 O af, myThid )
0d75a51072 Mart*0417 ELSEIF ( advectionScheme.EQ.ENUM_OS7MP ) THEN
2a09aadbbc Jean*0418 CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
0419 I vTrans, vFld, maskLocS, locABT,
0420 O af, myThid )
0421 ELSE
0422 STOP 'GAD_CALC_RHS: Bad advectionScheme (Y)'
0423 ENDIF
81c8d7b9aa Jean*0424 ENDIF
cb0d108b91 Jean*0425 #ifdef ALLOW_OBCS
0426 IF ( useOBCS ) THEN
0427
0428 CALL OBCS_U1_ADV_TRACER( .FALSE., trIdentity, bi, bj, k,
0429 I maskS(1-OLx,1-OLy,k,bi,bj),
0430 I vTrans, locABT,
0431 U af, myThid )
0432 ENDIF
0433 #endif /* ALLOW_OBCS */
0434 DO j=1-OLy,sNy+OLy
0435 DO i=1-OLx,sNx+OLx
81c8d7b9aa Jean*0436 fMer(i,j) = fMer(i,j) + af(i,j)
0437 ENDDO
0438 ENDDO
0439 #ifdef ALLOW_DIAGNOSTICS
0440 IF ( useDiagnostics ) THEN
0441 diagName = 'ADVy'//diagSufx
cb0d108b91 Jean*0442 CALL DIAGNOSTICS_FILL( af, diagName, k,1, 2,bi,bj, myThid )
81c8d7b9aa Jean*0443 ENDIF
50d8304171 Ryan*0444 #ifdef ALLOW_LAYERS
0445 IF ( useLayers ) THEN
0446 CALL LAYERS_FILL( af, trIdentity, 'AFY',
0447 & k, 1, 2,bi,bj, myThid )
0448 ENDIF
0449 #endif /* ALLOW_LAYES */
81c8d7b9aa Jean*0450 #endif
24016b3859 Alis*0451 ENDIF
31566b6684 Alis*0452
0453
0454 IF (diffKh.NE.0.) THEN
0455 CALL GAD_DIFF_Y(bi,bj,k,yA,diffKh,localT,df,myThid)
0456 ELSE
cb0d108b91 Jean*0457 DO j=1-OLy,sNy+OLy
0458 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0459 df(i,j) = 0. _d 0
31566b6684 Alis*0460 ENDDO
0461 ENDDO
0462 ENDIF
0463
81c8d7b9aa Jean*0464
0465 IF (diffK4 .NE. 0.) THEN
0466 CALL GAD_BIHARM_Y(bi,bj,k,yA,df4,diffK4,df,myThid)
0467 ENDIF
0468
31566b6684 Alis*0469 #ifdef ALLOW_GMREDI
0470
8e4e737494 Jean*0471 IF ( trUseGMRedi ) THEN
972c0130ec Jean*0472 CALL GMREDI_YTRANSPORT(
b92db9c400 Jean*0473 I trIdentity, bi, bj, k, iMin, iMax, jMin, jMax+1,
8233d0ceb9 Jean*0474 I yA, maskUp, TracerN,
77c3815cb8 Jean*0475 U df,
e9de1d7682 Jean*0476 I myThid )
31566b6684 Alis*0477 ENDIF
0478 #endif
eaba2fd266 Jean*0479
cb0d108b91 Jean*0480 DO j=1-OLy,sNy+OLy
0481 DO i=1-OLx,sNx+OLx
eaba2fd266 Jean*0482 fMer(i,j) = fMer(i,j) + df(i,j)*rhoFacC(k)
31566b6684 Alis*0483 ENDDO
0484 ENDDO
0485
81c8d7b9aa Jean*0486 #ifdef ALLOW_DIAGNOSTICS
0487
0488
0489 IF ( useDiagnostics .AND.
8e4e737494 Jean*0490 & (diffKh.NE.0. .OR. diffK4 .NE.0. .OR. trUseGMRedi) ) THEN
f68e77b60d Jean*0491 diagName = 'DFyE'//diagSufx
cb0d108b91 Jean*0492 CALL DIAGNOSTICS_FILL( df, diagName, k,1, 2,bi,bj, myThid )
cf336ab6c5 Ryan*0493 #ifdef ALLOW_LAYERS
ee16a2cae4 Ryan*0494 IF ( useLayers ) THEN
50d8304171 Ryan*0495 CALL LAYERS_FILL( df, trIdentity, 'DFY',
0496 & k, 1, 2,bi,bj, myThid )
ee16a2cae4 Ryan*0497 ENDIF
cf336ab6c5 Ryan*0498 #endif /* ALLOW_LAYERS */
31566b6684 Alis*0499 ENDIF
81c8d7b9aa Jean*0500 #endif
31566b6684 Alis*0501
e0c3eb6fa1 Jean*0502
31566b6684 Alis*0503
ca239d4b54 Jean*0504 #ifdef ALLOW_AIM
0505
77c3815cb8 Jean*0506 IF (calcAdvection .AND. .NOT.implicitAdvection .AND. k.GE.2 .AND.
cb0d108b91 Jean*0507 & (.NOT.useAIM .OR. trIdentity.NE.GAD_SALINITY .OR. k.LT.Nr)
ca239d4b54 Jean*0508 & ) THEN
0509 #else
77c3815cb8 Jean*0510 IF (calcAdvection .AND. .NOT.implicitAdvection .AND. k.GE.2) THEN
ca239d4b54 Jean*0511 #endif
972c0130ec Jean*0512 IF ( applyAB_onTracer ) THEN
0513
0d75a51072 Mart*0514 IF ( vertAdvecScheme.EQ.ENUM_CENTERED_2ND ) THEN
cb0d108b91 Jean*0515 CALL GAD_C2_ADV_R( bi,bj,k, rTrans, TracAB, af, myThid )
0845f1a203 Jean*0516 ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
a90759ed9a Jean*0517 & .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
cb0d108b91 Jean*0518 CALL GAD_DST2U1_ADV_R( bi,bj,k,vertAdvecScheme,deltaTLev(k),
e9de1d7682 Jean*0519 I rTrans, wFld, TracAB,
cb0d108b91 Jean*0520 O af, myThid )
0d75a51072 Mart*0521 ELSEIF ( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT ) THEN
cb0d108b91 Jean*0522 CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0523 I rTrans, wFld, TracAB,
cb0d108b91 Jean*0524 O af, myThid )
0d75a51072 Mart*0525 ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN
cb0d108b91 Jean*0526 CALL GAD_U3_ADV_R( bi,bj,k, rTrans, TracAB, af, myThid )
81c8d7b9aa Jean*0527 ELSEIF (vertAdvecScheme.EQ.ENUM_CENTERED_4TH) THEN
cb0d108b91 Jean*0528 CALL GAD_C4_ADV_R( bi,bj,k, rTrans, TracAB, af, myThid )
0d75a51072 Mart*0529 ELSEIF ( vertAdvecScheme.EQ.ENUM_DST3 ) THEN
cb0d108b91 Jean*0530 CALL GAD_DST3_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0531 I rTrans, wFld, TracAB,
cb0d108b91 Jean*0532 O af, myThid )
0d75a51072 Mart*0533 ELSEIF ( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
cb0d108b91 Jean*0534 CALL GAD_DST3FL_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0535 I rTrans, wFld, TracAB,
cb0d108b91 Jean*0536 O af, myThid )
0d75a51072 Mart*0537 ELSEIF ( vertAdvecScheme.EQ.ENUM_OS7MP ) THEN
cb0d108b91 Jean*0538 CALL GAD_OS7MP_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0539 I rTrans, wFld, TracAB,
cb0d108b91 Jean*0540 O af, myThid )
81c8d7b9aa Jean*0541 ELSE
0542 STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)'
0543 ENDIF
972c0130ec Jean*0544 ELSE
0545
0d75a51072 Mart*0546 IF ( vertAdvecScheme.EQ.ENUM_CENTERED_2ND ) THEN
972c0130ec Jean*0547 CALL GAD_C2_ADV_R( bi,bj,k, rTrans, TracerN, af, myThid )
0548 ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
0549 & .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
0550 CALL GAD_DST2U1_ADV_R( bi,bj,k,vertAdvecScheme,deltaTLev(k),
e9de1d7682 Jean*0551 I rTrans, wFld, TracerN,
972c0130ec Jean*0552 O af, myThid )
0d75a51072 Mart*0553 ELSEIF ( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT ) THEN
972c0130ec Jean*0554 CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0555 I rTrans, wFld, TracerN,
972c0130ec Jean*0556 O af, myThid )
0d75a51072 Mart*0557 ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN
972c0130ec Jean*0558 CALL GAD_U3_ADV_R( bi,bj,k, rTrans, TracerN, af, myThid )
0d75a51072 Mart*0559 ELSEIF ( vertAdvecScheme.EQ.ENUM_CENTERED_4TH ) THEN
972c0130ec Jean*0560 CALL GAD_C4_ADV_R( bi,bj,k, rTrans, TracerN, af, myThid )
0561 ELSEIF( vertAdvecScheme.EQ.ENUM_DST3 ) THEN
0562 CALL GAD_DST3_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0563 I rTrans, wFld, TracerN,
972c0130ec Jean*0564 O af, myThid )
0d75a51072 Mart*0565 ELSEIF ( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
972c0130ec Jean*0566 CALL GAD_DST3FL_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0567 I rTrans, wFld, TracerN,
972c0130ec Jean*0568 O af, myThid )
0d75a51072 Mart*0569 ELSEIF ( vertAdvecScheme.EQ.ENUM_OS7MP ) THEN
972c0130ec Jean*0570 CALL GAD_OS7MP_ADV_R( bi,bj,k, deltaTLev(k),
e9de1d7682 Jean*0571 I rTrans, wFld, TracerN,
972c0130ec Jean*0572 O af, myThid )
0573 ELSE
0574 STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)'
0575 ENDIF
0576 ENDIF
75abb052f1 Jean*0577
972c0130ec Jean*0578 DO j=1-OLy,sNy+OLy
0579 DO i=1-OLx,sNx+OLx
4d24da31b2 Mart*0580 fVerT(i,j,kUp) = fVerT(i,j,kUp) + af(i,j)*maskInC(i,j,bi,bj)
fb78c12fcf Jean*0581 ENDDO
972c0130ec Jean*0582 ENDDO
81c8d7b9aa Jean*0583 #ifdef ALLOW_DIAGNOSTICS
972c0130ec Jean*0584 IF ( useDiagnostics ) THEN
81c8d7b9aa Jean*0585 diagName = 'ADVr'//diagSufx
cb0d108b91 Jean*0586 CALL DIAGNOSTICS_FILL( af, diagName, k,1, 2,bi,bj, myThid )
ed8ddd9828 Jean*0587
0588
0589 IF ( k.EQ.2 ) CALL DIAGNOSTICS_COUNT(diagName,bi,bj,myThid)
50d8304171 Ryan*0590 #ifdef ALLOW_LAYERS
0591 IF ( useLayers ) THEN
0592 CALL LAYERS_FILL(af,trIdentity,'AFR',k,1,2,bi,bj,myThid)
0593 ENDIF
0594 #endif /* ALLOW_LAYERS */
972c0130ec Jean*0595 ENDIF
81c8d7b9aa Jean*0596 #endif
24016b3859 Alis*0597 ENDIF
31566b6684 Alis*0598
0599
0600
0601
0602 IF (implicitDiffusion) THEN
cb0d108b91 Jean*0603 DO j=1-OLy,sNy+OLy
0604 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0605 df(i,j) = 0. _d 0
31566b6684 Alis*0606 ENDDO
0607 ENDDO
0608 ELSE
0e9223926c Jean*0609 CALL GAD_DIFF_R(
0610 I bi,bj,k, maskup, KappaR, TracerN,
0611 O df, myThid )
31566b6684 Alis*0612 ENDIF
0613
6b7e107e49 Jean*0614 IF ( trUseDiffKr4 ) THEN
0e9223926c Jean*0615 CALL GAD_BIHARM_R(
0616 I bi,bj,k, maskUp, diffKr4, TracerN,
0617 U df, myThid )
6b7e107e49 Jean*0618 ENDIF
0619
31566b6684 Alis*0620 #ifdef ALLOW_GMREDI
0621
8e4e737494 Jean*0622 IF ( trUseGMRedi ) THEN
972c0130ec Jean*0623 CALL GMREDI_RTRANSPORT(
e9de1d7682 Jean*0624 I trIdentity, bi, bj, k, iMin, iMax, jMin, jMax,
0e9223926c Jean*0625 I maskUp, TracerN,
77c3815cb8 Jean*0626 U df,
e9de1d7682 Jean*0627 I myThid )
31566b6684 Alis*0628 ENDIF
0629 #endif
0630
cb0d108b91 Jean*0631 DO j=1-OLy,sNy+OLy
0632 DO i=1-OLx,sNx+OLx
0e9223926c Jean*0633 fVerT(i,j,kUp) = fVerT(i,j,kUp) + df(i,j)
31566b6684 Alis*0634 ENDDO
0635 ENDDO
0636
81c8d7b9aa Jean*0637 #ifdef ALLOW_DIAGNOSTICS
0845f1a203 Jean*0638
81c8d7b9aa Jean*0639
0640 IF ( useDiagnostics .AND.
9897ae9d92 Jean*0641 & (.NOT.implicitDiffusion .OR. trUseDiffKr4 .OR. trUseGMRedi)
0642 & ) THEN
81c8d7b9aa Jean*0643 diagName = 'DFrE'//diagSufx
cb0d108b91 Jean*0644 CALL DIAGNOSTICS_FILL( df, diagName, k,1, 2,bi,bj, myThid )
cf336ab6c5 Ryan*0645 #ifdef ALLOW_LAYERS
ee16a2cae4 Ryan*0646 IF ( useLayers ) THEN
50d8304171 Ryan*0647 CALL LAYERS_FILL(df,trIdentity,'DFR',k,1,2,bi,bj,myThid)
ee16a2cae4 Ryan*0648 ENDIF
cf336ab6c5 Ryan*0649 #endif /* ALLOW_LAYERS */
81c8d7b9aa Jean*0650 ENDIF
0651 #endif
0652
31566b6684 Alis*0653 #ifdef ALLOW_KPP
60fa91c126 Jean*0654
8e4e737494 Jean*0655 IF ( trUseKPP .AND. k.GE.2 ) THEN
cb0d108b91 Jean*0656 DO j=1-OLy,sNy+OLy
0657 DO i=1-OLx,sNx+OLx
67a1e439d8 Patr*0658 df(i,j) = 0. _d 0
31566b6684 Alis*0659 ENDDO
0660 ENDDO
cb0d108b91 Jean*0661 IF (trIdentity.EQ.GAD_TEMPERATURE) THEN
31566b6684 Alis*0662 CALL KPP_TRANSPORT_T(
eb76443793 Jean*0663 I iMin,iMax,jMin,jMax,bi,bj,k,km1,
0664 O df,
0665 I myTime, myIter, myThid )
cb0d108b91 Jean*0666 ELSEIF (trIdentity.EQ.GAD_SALINITY) THEN
31566b6684 Alis*0667 CALL KPP_TRANSPORT_S(
eb76443793 Jean*0668 I iMin,iMax,jMin,jMax,bi,bj,k,km1,
0669 O df,
0670 I myTime, myIter, myThid )
5174b865b3 Mart*0671 #ifdef ALLOW_PTRACERS
cb0d108b91 Jean*0672 ELSEIF (trIdentity .GE. GAD_TR1) THEN
5174b865b3 Mart*0673 CALL KPP_TRANSPORT_PTR(
eb76443793 Jean*0674 I iMin,iMax,jMin,jMax,bi,bj,k,km1,
cb0d108b91 Jean*0675 I trIdentity-GAD_TR1+1,
eb76443793 Jean*0676 O df,
0677 I myTime, myIter, myThid )
5174b865b3 Mart*0678 #endif
31566b6684 Alis*0679 ELSE
cfa7d1c982 Jean*0680 WRITE(errorMessageUnit,*)
cb0d108b91 Jean*0681 & 'tracer identity =', trIdentity, ' is not valid => STOP'
cfa7d1c982 Jean*0682 STOP 'ABNORMAL END: S/R GAD_CALC_RHS: invalid tracer identity'
31566b6684 Alis*0683 ENDIF
cb0d108b91 Jean*0684 DO j=1-OLy,sNy+OLy
0685 DO i=1-OLx,sNx+OLx
eaba2fd266 Jean*0686 fVerT(i,j,kUp) = fVerT(i,j,kUp)
0687 & + df(i,j)*maskUp(i,j)*rhoFacF(k)
31566b6684 Alis*0688 ENDDO
0689 ENDDO
cfa7d1c982 Jean*0690 #ifdef ALLOW_DIAGNOSTICS
0691
0692 IF ( useDiagnostics ) THEN
0693 diagName = 'KPPg'//diagSufx
0694 CALL DIAGNOSTICS_FILL( df, diagName, k,1, 2,bi,bj, myThid )
0695
0696
0697 IF ( k.EQ.2 ) CALL DIAGNOSTICS_COUNT(diagName,bi,bj,myThid)
cf336ab6c5 Ryan*0698 #ifdef ALLOW_LAYERS
ee16a2cae4 Ryan*0699 IF ( useLayers ) THEN
50d8304171 Ryan*0700 CALL LAYERS_FILL(df,trIdentity,'DFR',k,1,2,bi,bj,myThid)
ee16a2cae4 Ryan*0701 ENDIF
cf336ab6c5 Ryan*0702 #endif /* ALLOW_LAYERS */
cfa7d1c982 Jean*0703 ENDIF
31566b6684 Alis*0704 #endif
cfa7d1c982 Jean*0705 ENDIF
0706 #endif /* ALLOW_KPP */
31566b6684 Alis*0707
998cbd211e Oliv*0708 #ifdef GAD_SMOLARKIEWICZ_HACK
2bd077d2cd Oliv*0709
0710
0711
46918f1b26 Jean*0712 IF ( trUseSmolHack ) THEN
cb0d108b91 Jean*0713 DO j=1-OLy,sNy+OLy-1
0714 DO i=1-OLx,sNx+OLx-1
2bd077d2cd Oliv*0715
4e66ab0b67 Oliv*0716 outFlux=deltaTLev(k)*
998cbd211e Oliv*0717 & _recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
0718 & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
0719 & *( MAX(0. _d 0,fZon(i+1,j)) + MAX(0. _d 0,-fZon(i,j))
0720 & +MAX(0. _d 0,fMer(i,j+1)) + MAX(0. _d 0,-fMer(i,j))
0721 & +MAX(0. _d 0,fVerT(i,j,kDown)*rkSign)
0722 & +MAX(0. _d 0,-fVerT(i,j,kUp)*rkSign)
0723 & )
3ad42fd705 Jean*0724 trac = localT(i,j)
2bd077d2cd Oliv*0725
0726
998cbd211e Oliv*0727 IF (outFlux.GT.0. _d 0 .AND.
0728 & outFlux.GT.SmolarkiewiczMaxFrac*trac) THEN
2bd077d2cd Oliv*0729
622cf2fb44 Jean*0730 gTrFac = MAX(0. _d 0,SmolarkiewiczMaxFrac*trac/outFlux)
2bd077d2cd Oliv*0731
622cf2fb44 Jean*0732 IF (fZon(i+1,j).GT.0. _d 0) fZon(i+1,j)=gTrFac*fZon(i+1,j)
0733 IF (-fZon(i,j) .GT.0. _d 0) fZon(i,j) =gTrFac*fZon(i,j)
0734 IF (fMer(i,j+1).GT.0. _d 0) fMer(i,j+1)=gTrFac*fMer(i,j+1)
0735 IF (-fMer(i,j) .GT.0. _d 0) fMer(i,j) =gTrFac*fMer(i,j)
998cbd211e Oliv*0736 IF (-fVerT(i,j,kUp)*rkSign .GT.0. _d 0)
622cf2fb44 Jean*0737 & fVerT(i,j,kUp)=gTrFac*fVerT(i,j,kUp)
2bd077d2cd Oliv*0738
0739 IF (k.LT.Nr .AND. fVerT(i,j,kDown)*rkSign.GT.0. _d 0) THEN
0740
0741
20a3ab10b2 Oliv*0742
935a76deec Jean*0743 gTracer(i,j,k+1) = gTracer(i,j,k+1)
20a3ab10b2 Oliv*0744 & +_recip_hFacC(i,j,k+1,bi,bj)*recip_drF(k+1)
2bd077d2cd Oliv*0745 & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k+1)
0746 & *recip_rhoFacC(k+1)
0747 & *( -fVerT(i,j,kDown)*rkSign )
0748
622cf2fb44 Jean*0749 fVerT(i,j,kDown)=gTrFac*fVerT(i,j,kDown)
2bd077d2cd Oliv*0750
935a76deec Jean*0751 gTracer(i,j,k+1) = gTracer(i,j,k+1)
20a3ab10b2 Oliv*0752 & +_recip_hFacC(i,j,k+1,bi,bj)*recip_drF(k+1)
2bd077d2cd Oliv*0753 & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k+1)
0754 & *recip_rhoFacC(k+1)
0755 & *( fVerT(i,j,kDown)*rkSign )
998cbd211e Oliv*0756 ENDIF
2bd077d2cd Oliv*0757
998cbd211e Oliv*0758 ENDIF
0759 ENDDO
0760 ENDDO
0761 ENDIF
46918f1b26 Jean*0762 #endif /* GAD_SMOLARKIEWICZ_HACK */
998cbd211e Oliv*0763
31566b6684 Alis*0764
eaba2fd266 Jean*0765
4d24da31b2 Mart*0766
cb0d108b91 Jean*0767 DO j=1-OLy,sNy+OLy-1
0768 DO i=1-OLx,sNx+OLx-1
935a76deec Jean*0769 gTracer(i,j,k) = gTracer(i,j,k)
eaba2fd266 Jean*0770 & -_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
0771 & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
4d24da31b2 Mart*0772 & *( (fZon(i+1,j)-fZon(i,j))*maskInC(i,j,bi,bj)
0773 & +(fMer(i,j+1)-fMer(i,j))*maskInC(i,j,bi,bj)
bb6c554092 Jean*0774 & +(fVerT(i,j,kDown)-fVerT(i,j,kUp))*rkSign
95826db035 Jean*0775 & -localT(i,j)*( (uTrans(i+1,j)-uTrans(i,j))*advFac
0776 & +(vTrans(i,j+1)-vTrans(i,j))*advFac
bb6c554092 Jean*0777 & +(rTransKp1(i,j)-rTrans(i,j))*rAdvFac
4d24da31b2 Mart*0778 & )*maskInC(i,j,bi,bj)
31566b6684 Alis*0779 & )
0780 ENDDO
0781 ENDDO
0782
616d5d70aa Jean*0783 #ifdef ALLOW_DEBUG
188f784a21 Jean*0784 IF ( debugLevel .GE. debLevC
cb0d108b91 Jean*0785 & .AND. trIdentity.EQ.GAD_TEMPERATURE
616d5d70aa Jean*0786 & .AND. k.EQ.2 .AND. myIter.EQ.1+nIter0
0787 & .AND. nPx.EQ.1 .AND. nPy.EQ.1
0788 & .AND. useCubedSphereExchange ) THEN
0789 CALL DEBUG_CS_CORNER_UV( ' fZon,fMer from GAD_CALC_RHS',
0790 & fZon,fMer, k, standardMessageUnit,bi,bj,myThid )
0791 ENDIF
0792 #endif /* ALLOW_DEBUG */
0845f1a203 Jean*0793
31566b6684 Alis*0794 RETURN
0795 END