File indexing completed on 2026-01-27 06:08:47 UTC
view on githubraw file Latest commit 9c1d5d8e on 2026-01-23 17:12:06 UTC
0c49347dc7 Alis*0001 #include "GMREDI_OPTIONS.h"
14e0496834 Jean*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
ee8a6f4ffb Jean*0005 #ifdef ALLOW_CTRL
0006 # include "CTRL_OPTIONS.h"
0007 #endif
e2259a1942 Jean*0008 #ifdef ALLOW_KPP
0009 # include "KPP_OPTIONS.h"
0010 #endif
472f570611 Jean*0011 #if ( defined GM_READ_K3D_REDI || defined GM_VISBECK_VARIABLE_K \
0012 || defined ALLOW_GM_LEITH_QG || defined GM_BATES_K3D )
0013 # define GM_USE_K3D_REDI
0014 #endif
0015
0016 #if ( defined GM_READ_K3D_GM || defined GM_VISBECK_VARIABLE_K \
0017 || defined ALLOW_GM_LEITH_QG || defined GM_BATES_K3D )
0018 # define GM_USE_K3D_GM
0019 #endif
0c49347dc7 Alis*0020
e2259a1942 Jean*0021
0022
0023
0c49347dc7 Alis*0024 SUBROUTINE GMREDI_CALC_TENSOR(
e2259a1942 Jean*0025 I iMin, iMax, jMin, jMax,
0c49347dc7 Alis*0026 I sigmaX, sigmaY, sigmaR,
e2259a1942 Jean*0027 I bi, bj, myTime, myIter, myThid )
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0c49347dc7 Alis*0038 IMPLICIT NONE
0039
0040
0041 #include "SIZE.h"
0042 #include "GRID.h"
0043 #include "DYNVARS.h"
0044 #include "EEPARAMS.h"
0045 #include "PARAMS.h"
0046 #include "GMREDI.h"
ee8a6f4ffb Jean*0047 #ifdef ALLOW_CTRL
0048 # include "CTRL_FIELDS.h"
0049 #endif
e2259a1942 Jean*0050 #ifdef ALLOW_KPP
0051 # include "KPP.h"
0052 #endif
0c49347dc7 Alis*0053
b6b11b9b2f Patr*0054 #ifdef ALLOW_AUTODIFF_TAMC
a4576c7cde Juli*0055 # include "tamc.h"
b6b11b9b2f Patr*0056 #endif /* ALLOW_AUTODIFF_TAMC */
0057
e2259a1942 Jean*0058
0059
0060
0061
0062
0c49347dc7 Alis*0063
e2259a1942 Jean*0064 INTEGER iMin,iMax,jMin,jMax
ee8a6f4ffb Jean*0065 _RL sigmaX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0066 _RL sigmaY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0067 _RL sigmaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
e2259a1942 Jean*0068 INTEGER bi, bj
0069 _RL myTime
0070 INTEGER myIter
0c49347dc7 Alis*0071 INTEGER myThid
e2259a1942 Jean*0072
0c49347dc7 Alis*0073
0074 #ifdef ALLOW_GMREDI
e2259a1942 Jean*0075
8233d0ceb9 Jean*0076
2ae58a73ff Jean*0077 INTEGER i,j,k
8233d0ceb9 Jean*0078 _RS maskFk(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
ee8a6f4ffb Jean*0079 _RL SlopeX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0080 _RL SlopeY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0081 _RL dSigmaDx(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0082 _RL dSigmaDy(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0083 _RL dSigmaDr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0084 _RL SlopeSqr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0085 _RL taperFct(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0086 _RL ldd97_LrhoC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0087 _RL ldd97_LrhoW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0088 _RL ldd97_LrhoS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
5b172de0d2 Jean*0089 _RL Cspd, LrhoInf, LrhoSup, fCoriLoc, rDepth
0c12568530 mjlo*0090 _RL Kgm_tmp, Kredi_tmp, isopycK, bolus_K
0c49347dc7 Alis*0091
ee8a6f4ffb Jean*0092 INTEGER kLow_W (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0093 INTEGER kLow_S (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0094 _RL locMixLayer(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0095 _RL baseSlope (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0096 _RL hTransLay (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0097 _RL recipLambda(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a4576c7cde Juli*0098 INTEGER km1
0099 #if ( defined GM_NON_UNITY_DIAGONAL || defined GM_EXTRA_DIAGONAL )
2ae58a73ff Jean*0100 INTEGER kp1
0101 _RL maskp1
0102 #endif
472f570611 Jean*0103 #ifdef GM_USE_K3D_REDI
0104 _RL locK3dRedi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0105 #endif
0106 #ifdef GM_USE_K3D_GM
0107 _RL locK3dGM(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0108 #else
0109 _RL locK3dGM(1)
0110 #endif
e2259a1942 Jean*0111
0c49347dc7 Alis*0112 #ifdef GM_VISBECK_VARIABLE_K
8233d0ceb9 Jean*0113 INTEGER ks
0114 _RL dSigmaH, dSigmaR, Sloc, rTop
0115
9bee368eff Jean*0116 _RL recipMaxSlope
ea71059281 Jean*0117 _RL deltaH, integrDepth
0118 _RL N2loc, SNloc
9bee368eff Jean*0119 #endif /* GM_VISBECK_VARIABLE_K */
0c49347dc7 Alis*0120
066e0d5e64 Jean*0121 #ifdef ALLOW_DIAGNOSTICS
0122 LOGICAL doDiagRediFlx
0123 LOGICAL DIAGNOSTICS_IS_ON
0124 EXTERNAL DIAGNOSTICS_IS_ON
a4576c7cde Juli*0125 # if ( defined GM_NON_UNITY_DIAGONAL || defined GM_EXTRA_DIAGONAL )
066e0d5e64 Jean*0126 _RL dTdz
0127 _RL tmp1k(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
a4576c7cde Juli*0128 # endif
2ae58a73ff Jean*0129 #endif /* ALLOW_DIAGNOSTICS */
7c50f07931 Mart*0130 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0131
0132
0133 INTEGER tkey, kkey
7c50f07931 Mart*0134 #endif
066e0d5e64 Jean*0135
549d1a8d8c Jean*0136
0137
b6b11b9b2f Patr*0138 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0139 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
b6b11b9b2f Patr*0140 #endif /* ALLOW_AUTODIFF_TAMC */
0141
066e0d5e64 Jean*0142 #ifdef ALLOW_DIAGNOSTICS
0143 doDiagRediFlx = .FALSE.
0144 IF ( useDiagnostics ) THEN
0145 doDiagRediFlx = DIAGNOSTICS_IS_ON('GM_KuzTz', myThid )
b0e49a1609 Jean*0146 doDiagRediFlx = doDiagRediFlx .OR.
066e0d5e64 Jean*0147 & DIAGNOSTICS_IS_ON('GM_KvzTz', myThid )
0148 ENDIF
0149 #endif
b0e49a1609 Jean*0150
2092dbb101 Patr*0151 #ifdef GM_VISBECK_VARIABLE_K
9bee368eff Jean*0152 recipMaxSlope = 0. _d 0
0153 IF ( GM_Visbeck_maxSlope.GT.0. _d 0 ) THEN
0154 recipMaxSlope = 1. _d 0 / GM_Visbeck_maxSlope
0155 ENDIF
ee8a6f4ffb Jean*0156 DO j=1-OLy,sNy+OLy
0157 DO i=1-OLx,sNx+OLx
2092dbb101 Patr*0158 VisbeckK(i,j,bi,bj) = 0. _d 0
0159 ENDDO
0160 ENDDO
0161 #endif
0162
549d1a8d8c Jean*0163
e2259a1942 Jean*0164 IF ( GM_taper_scheme.EQ.'ldd97' .OR.
0165 & GM_taper_scheme.EQ.'fm07' ) THEN
549d1a8d8c Jean*0166 Cspd = 2. _d 0
0167 LrhoInf = 15. _d 3
0168 LrhoSup = 100. _d 3
0169
ee8a6f4ffb Jean*0170 DO j=1-OLy,sNy+OLy
0171 DO i=1-OLx,sNx+OLx
549d1a8d8c Jean*0172 IF (fCori(i,j,bi,bj).NE.0.) THEN
0173 ldd97_LrhoC(i,j) = Cspd/ABS(fCori(i,j,bi,bj))
0174 ELSE
0175 ldd97_LrhoC(i,j) = LrhoSup
0176 ENDIF
0177 ldd97_LrhoC(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoC(i,j),LrhoSup))
0178 ENDDO
0179 ENDDO
0180
ee8a6f4ffb Jean*0181 DO j=1-OLy,sNy+OLy
0182 kLow_W(1-OLx,j) = 0
0183 ldd97_LrhoW(1-OLx,j) = LrhoSup
0184 DO i=1-OLx+1,sNx+OLx
e2259a1942 Jean*0185 kLow_W(i,j) = MIN(kLowC(i-1,j,bi,bj),kLowC(i,j,bi,bj))
549d1a8d8c Jean*0186 fCoriLoc = op5*(fCori(i-1,j,bi,bj)+fCori(i,j,bi,bj))
5b172de0d2 Jean*0187 IF ( fCoriLoc.NE.zeroRL ) THEN
549d1a8d8c Jean*0188 ldd97_LrhoW(i,j) = Cspd/ABS(fCoriLoc)
0189 ELSE
0190 ldd97_LrhoW(i,j) = LrhoSup
0191 ENDIF
0192 ldd97_LrhoW(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoW(i,j),LrhoSup))
0193 ENDDO
0194 ENDDO
0195
ee8a6f4ffb Jean*0196 DO i=1-OLx+1,sNx+OLx
0197 kLow_S(i,1-OLy) = 0
0198 ldd97_LrhoS(i,1-OLy) = LrhoSup
549d1a8d8c Jean*0199 ENDDO
ee8a6f4ffb Jean*0200 DO j=1-OLy+1,sNy+OLy
0201 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0202 kLow_S(i,j) = MIN(kLowC(i,j-1,bi,bj),kLowC(i,j,bi,bj))
549d1a8d8c Jean*0203 fCoriLoc = op5*(fCori(i,j-1,bi,bj)+fCori(i,j,bi,bj))
5b172de0d2 Jean*0204 IF ( fCoriLoc.NE.zeroRL ) THEN
549d1a8d8c Jean*0205 ldd97_LrhoS(i,j) = Cspd/ABS(fCoriLoc)
0206 ELSE
0207 ldd97_LrhoS(i,j) = LrhoSup
0208 ENDIF
0209 ldd97_LrhoS(i,j) = MAX(LrhoInf,MIN(ldd97_LrhoS(i,j),LrhoSup))
0210 ENDDO
0211 ENDDO
0212 ELSE
0213
ee8a6f4ffb Jean*0214 DO j=1-OLy,sNy+OLy
0215 DO i=1-OLx,sNx+OLx
549d1a8d8c Jean*0216 ldd97_LrhoC(i,j) = 0. _d 0
0217 ldd97_LrhoW(i,j) = 0. _d 0
0218 ldd97_LrhoS(i,j) = 0. _d 0
0219 ENDDO
0220 ENDDO
0221 ENDIF
0222
050b4366e6 Jean*0223 #ifdef GM_BOLUS_ADVEC
0224 DO k=1,Nr
ee8a6f4ffb Jean*0225 DO j=1-OLy,sNy+OLy
0226 DO i=1-OLx,sNx+OLx
050b4366e6 Jean*0227 GM_PsiX(i,j,k,bi,bj) = 0. _d 0
0228 GM_PsiY(i,j,k,bi,bj) = 0. _d 0
0229 ENDDO
0230 ENDDO
0231 ENDDO
0232 #endif /* GM_BOLUS_ADVEC */
0c12568530 mjlo*0233 #ifdef GM_USE_K3D_REDI
0234 DO k=1,Nr
0235 DO j=1-OLy,sNy+OLy
0236 DO i=1-OLx,sNx+OLx
9c1d5d8ec0 Jean*0237 locK3dRedi(i,j,k) =
0c12568530 mjlo*0238 # ifdef GM_READ_K3D_REDI
9c1d5d8ec0 Jean*0239 & GM_inpK3dRedi(i,j,k,bi,bj)
0c12568530 mjlo*0240 # else
9c1d5d8ec0 Jean*0241 & GM_isopycK*GM_isoFac1d(k)*GM_isoFac2d(i,j,bi,bj)
0c12568530 mjlo*0242 # endif
0243 ENDDO
0244 ENDDO
0245 ENDDO
0246 #endif /* GM_USE_K3D_REDI */
0247 #ifdef GM_USE_K3D_GM
0248 DO k=1,Nr
0249 DO j=1-OLy,sNy+OLy
0250 DO i=1-OLx,sNx+OLx
9c1d5d8ec0 Jean*0251 locK3dGM(i,j,k) =
0c12568530 mjlo*0252 # ifdef GM_READ_K3D_GM
9c1d5d8ec0 Jean*0253 & GM_inpK3dGM(i,j,k,bi,bj)
0c12568530 mjlo*0254 # else
9c1d5d8ec0 Jean*0255 & GM_background_K*GM_bolFac1d(k)*GM_bolFac2d(i,j,bi,bj)
0c12568530 mjlo*0256 # endif
0257 ENDDO
0258 ENDDO
0259 ENDDO
0260 #else
0261 locK3dGM(1) = 0. _d 0
0262 #endif /* GM_USE_K3D_GM */
14e0496834 Jean*0263 #ifdef ALLOW_AUTODIFF
050b4366e6 Jean*0264 DO k=1,Nr
ee8a6f4ffb Jean*0265 DO j=1-OLy,sNy+OLy
0266 DO i=1-OLx,sNx+OLx
050b4366e6 Jean*0267 Kwx(i,j,k,bi,bj) = 0. _d 0
0268 Kwy(i,j,k,bi,bj) = 0. _d 0
0269 Kwz(i,j,k,bi,bj) = 0. _d 0
0270 Kux(i,j,k,bi,bj) = 0. _d 0
0271 Kvy(i,j,k,bi,bj) = 0. _d 0
0272 # ifdef GM_EXTRA_DIAGONAL
0273 Kuz(i,j,k,bi,bj) = 0. _d 0
0274 Kvz(i,j,k,bi,bj) = 0. _d 0
0275 # endif
0276 ENDDO
0277 ENDDO
0278 ENDDO
14e0496834 Jean*0279 #endif /* ALLOW_AUTODIFF */
0c49347dc7 Alis*0280
050b4366e6 Jean*0281
ee8a6f4ffb Jean*0282 DO j=1-OLy,sNy+OLy
0283 DO i=1-OLx,sNx+OLx
5755dbe390 Patr*0284 hTransLay(i,j) = R_low(i,j,bi,bj)
0285 baseSlope(i,j) = 0. _d 0
0286 recipLambda(i,j) = 0. _d 0
0287 locMixLayer(i,j) = 0. _d 0
0288 ENDDO
0289 ENDDO
e2259a1942 Jean*0290 #ifdef ALLOW_KPP
0291 IF ( useKPP ) THEN
ee8a6f4ffb Jean*0292 DO j=1-OLy,sNy+OLy
0293 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0294 locMixLayer(i,j) = KPPhbl(i,j,bi,bj)
0295 ENDDO
0296 ENDDO
0297 ELSE
0298 #else
0299 IF ( .TRUE. ) THEN
0300 #endif
ee8a6f4ffb Jean*0301 DO j=1-OLy,sNy+OLy
0302 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0303 locMixLayer(i,j) = hMixLayer(i,j,bi,bj)
0304 ENDDO
0305 ENDDO
0306 ENDIF
0307
05118ac017 Jean*0308 #ifdef GM_BATES_K3D
0309 IF (GM_useBatesK3d) THEN
7ea279c259 Jean*0310
0311 CALL TIMER_START('GMREDI_CALC_BATES_K [GMREDI_CALC_TENSOR]',
0d1e4b948d Mich*0312 & myThid)
7ea279c259 Jean*0313 CALL GMREDI_CALC_BATES_K(
0d1e4b948d Mich*0314 I iMin, iMax, jMin, jMax,
0315 I sigmaX, sigmaY, sigmaR,
7ea279c259 Jean*0316 I bi, bj, myTime, myIter, myThid )
0317 CALL TIMER_STOP('GMREDI_CALC_BATES_K [GMREDI_CALC_TENSOR]',
0d1e4b948d Mich*0318 & myThid)
0c12568530 mjlo*0319 # ifndef GM_BATES_PASSIVE
0320 DO k=1,Nr
0321 DO j=1-OLy,sNy+OLy
0322 DO i=1-OLx,sNx+OLx
0323 locK3dRedi(i,j,k) = locK3dRedi(i,j,k)
0324 & + GM_BatesK3d(i,j,k,bi,bj)*GM_isoFac_calcK
0325 locK3dGM(i,j,k) = locK3dGM(i,j,k)
0326 & + GM_BatesK3d(i,j,k,bi,bj)
0327 ENDDO
0328 ENDDO
0329 ENDDO
0330 # endif
0d1e4b948d Mich*0331 ENDIF
0332 #endif
0333
f59d76b0dd Ed D*0334 #ifdef ALLOW_GM_LEITH_QG
e25acdb1f2 Jean*0335 # ifdef ALLOW_AUTODIFF
0336 DO k=1,Nr
8233d0ceb9 Jean*0337 DO j=1-OLy,sNy+OLy
0338 DO i=1-OLx,sNx+OLx
0339 GM_LeithQG_K(i,j,k,bi,bj) = 0. _d 0
f59d76b0dd Ed D*0340 ENDDO
8233d0ceb9 Jean*0341 ENDDO
e25acdb1f2 Jean*0342 ENDDO
0343 # endif
0344 IF ( GM_useLeithQG ) THEN
0345
8233d0ceb9 Jean*0346 CALL GMREDI_CALC_QGLEITH(
f59d76b0dd Ed D*0347 O GM_LeithQG_K(1-OLx,1-OLy,1,bi,bj),
0348 I bi, bj, myTime, myIter, myThid )
0c12568530 mjlo*0349 DO k=1,Nr
0350 DO j=1-OLy,sNy+OLy
0351 DO i=1-OLx,sNx+OLx
0352 locK3dRedi(i,j,k) = locK3dRedi(i,j,k)
0353 & + GM_LeithQG_K(i,j,k,bi,bj)*GM_isoFac_calcK
0354 locK3dGM(i,j,k) = locK3dGM(i,j,k)
0355 & + GM_LeithQG_K(i,j,k,bi,bj)
0356 ENDDO
0357 ENDDO
0358 ENDDO
f59d76b0dd Ed D*0359 ENDIF
0360 #endif /* ALLOW_GM_LEITH_QG */
0361
a4576c7cde Juli*0362 #ifdef GM_GEOM_VARIABLE_K
0363
0364
0365 IF ( GM_useGEOM ) THEN
0366 DO k=1,Nr
0367 DO j=1-OLy,sNy+OLy
0368 DO i=1-OLx,sNx+OLx
0369 GEOM_K3d(i,j,k,bi,bj) = 0. _d 0
0370 ENDDO
0371 ENDDO
0372 ENDDO
0373 CALL GMREDI_CALC_GEOM(
0374 I sigmaX, sigmaY, sigmaR,
0375 I bi, bj, myTime, myIter, myThid )
0376 ENDIF
0377 #endif /* GM_GEOM_VARIABLE_K */
0378
050b4366e6 Jean*0379
0380
0381
e2259a1942 Jean*0382 DO k=Nr,2,-1
0383
ee8a6f4ffb Jean*0384 DO j=1-OLy,sNy+OLy
0385 DO i=1-OLx,sNx+OLx
8233d0ceb9 Jean*0386 #ifdef ALLOW_AUTODIFF
b6b11b9b2f Patr*0387 SlopeX(i,j) = 0. _d 0
0388 SlopeY(i,j) = 0. _d 0
a4576c7cde Juli*0389 dSigmaDx(i,j) = 0. _d 0
2092dbb101 Patr*0390 dSigmaDy(i,j) = 0. _d 0
549d1a8d8c Jean*0391 dSigmaDr(i,j) = 0. _d 0
b6b11b9b2f Patr*0392 SlopeSqr(i,j) = 0. _d 0
0393 taperFct(i,j) = 0. _d 0
8233d0ceb9 Jean*0394 #endif /* ALLOW_AUTODIFF */
0395 maskFk(i,j) = maskC(i,j,k-1,bi,bj)*maskC(i,j,k,bi,bj)
b6b11b9b2f Patr*0396 ENDDO
0397 ENDDO
0398
ee8a6f4ffb Jean*0399 DO j=1-OLy+1,sNy+OLy-1
0400 DO i=1-OLx+1,sNx+OLx-1
0c49347dc7 Alis*0401
b0e49a1609 Jean*0402 dSigmaDx(i,j)=op25*( sigmaX(i+1,j,k-1)+sigmaX(i,j,k-1)
0403 & +sigmaX(i+1,j, k )+sigmaX(i,j, k )
8233d0ceb9 Jean*0404 & )*maskFk(i,j)
b0e49a1609 Jean*0405 dSigmaDy(i,j)=op25*( sigmaY(i,j+1,k-1)+sigmaY(i,j,k-1)
0406 & +sigmaY(i,j+1, k )+sigmaY(i,j, k )
8233d0ceb9 Jean*0407 & )*maskFk(i,j)
9bee368eff Jean*0408
b0e49a1609 Jean*0409 ENDDO
0c49347dc7 Alis*0410 ENDDO
0411
b0e49a1609 Jean*0412 #ifdef GM_VISBECK_VARIABLE_K
d1c10e3d93 mjlo*0413 # ifdef ALLOW_AUTODIFF_TAMC
0414
0415 # endif
5b172de0d2 Jean*0416 IF ( GM_Visbeck_alpha.GT.zeroRL .AND.
b0e49a1609 Jean*0417 & -rC(k-1).LT.GM_Visbeck_depth ) THEN
0418
ee8a6f4ffb Jean*0419 DO j=1-OLy,sNy+OLy
0420 DO i=1-OLx,sNx+OLx
5b172de0d2 Jean*0421 dSigmaDr(i,j) = MAX( gravitySign*sigmaR(i,j,k), zeroRL )
9bee368eff Jean*0422 ENDDO
0423 ENDDO
0424
b0e49a1609 Jean*0425
0426
0427
0428
0429
0430
0431
0432
8233d0ceb9 Jean*0433 rTop = rF(1)
ee8a6f4ffb Jean*0434 DO j=1-OLy+1,sNy+OLy-1
0435 DO i=1-OLx+1,sNx+OLx-1
8233d0ceb9 Jean*0436 IF ( maskFk(i,j).NE.zeroRS ) THEN
0437 ks = kSurfC(i,j,bi,bj)
0438
0439
0440
0441 rTop = Ro_surf(i,j,bi,bj)
0442 integrDepth = rTop - rC( kLowC(i,j,bi,bj) )
b0e49a1609 Jean*0443
0444 integrDepth = MIN( integrDepth, GM_Visbeck_depth )
9bee368eff Jean*0445
0446 integrDepth = MAX( integrDepth, GM_Visbeck_minDepth )
b0e49a1609 Jean*0447
8233d0ceb9 Jean*0448 deltaH = integrDepth - rTop + rC(k-1)
b0e49a1609 Jean*0449
0450
0451
0452 deltaH = MIN( deltaH, drC(k) )
0453
8233d0ceb9 Jean*0454 deltaH = deltaH/( integrDepth - rTop + rC(ks) )
b0e49a1609 Jean*0455
ea71059281 Jean*0456
9bee368eff Jean*0457
0458
0459 dSigmaR = ( dSigmaDr(i,j)*4. _d 0
0460 & + dSigmaDr(i-1,j)
0461 & + dSigmaDr(i+1,j)
0462 & + dSigmaDr(i,j-1)
0463 & + dSigmaDr(i,j+1)
0464 & )/( 4. _d 0
8233d0ceb9 Jean*0465 & + maskFk(i-1,j)
0466 & + maskFk(i+1,j)
0467 & + maskFk(i,j-1)
0468 & + maskFk(i,j+1)
9bee368eff Jean*0469 & )
b0e49a1609 Jean*0470 dSigmaH = dSigmaDx(i,j)*dSigmaDx(i,j)
0471 & + dSigmaDy(i,j)*dSigmaDy(i,j)
0472 IF ( dSigmaH .GT. 0. _d 0 ) THEN
0473 dSigmaH = SQRT( dSigmaH )
d1c10e3d93 mjlo*0474 # ifdef ALLOW_AUTODIFF_TAMC
0475
0476
0477
0478 ENDIF
0479 IF ( dSigmaH .GT. 0. _d 0 ) THEN
0480 # endif
9bee368eff Jean*0481
5b172de0d2 Jean*0482 IF ( dSigmaR.GT.dSigmaH*recipMaxSlope ) THEN
0483 Sloc = dSigmaH / dSigmaR
b0e49a1609 Jean*0484 ELSE
9bee368eff Jean*0485 Sloc = GM_Visbeck_maxSlope
b0e49a1609 Jean*0486 ENDIF
8233d0ceb9 Jean*0487
5b172de0d2 Jean*0488 N2loc = gravity*recip_rhoConst*dSigmaR
ea71059281 Jean*0489 IF ( N2loc.GT.0. _d 0 ) THEN
0490 SNloc = Sloc*SQRT(N2loc)
0491 ELSE
0492 SNloc = 0. _d 0
0493 ENDIF
b0e49a1609 Jean*0494 ELSE
0495 SNloc = 0. _d 0
0496 ENDIF
0497 VisbeckK(i,j,bi,bj) = VisbeckK(i,j,bi,bj)
0498 & +deltaH*GM_Visbeck_alpha
0499 & *GM_Visbeck_length*GM_Visbeck_length*SNloc
0500 ENDIF
0501 ENDDO
0502 ENDDO
0503 ENDIF
0504 #endif /* GM_VISBECK_VARIABLE_K */
5b172de0d2 Jean*0505
0506
ee8a6f4ffb Jean*0507 DO j=1-OLy,sNy+OLy
0508 DO i=1-OLx,sNx+OLx
5b172de0d2 Jean*0509 dSigmaDr(i,j) = gravitySign*sigmaR(i,j,k)
9bee368eff Jean*0510 ENDDO
0511 ENDDO
0512
0513 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0514 kkey = k + (tkey-1)*Nr
9bee368eff Jean*0515
0516
0517
361543e926 Jean*0518 # ifndef GM_EXCLUDE_FM07_TAP
9bee368eff Jean*0519
0520
0521
361543e926 Jean*0522 # endif
9bee368eff Jean*0523 #endif /* ALLOW_AUTODIFF_TAMC */
b0e49a1609 Jean*0524
5b172de0d2 Jean*0525
0526 IF ( usingZcoords ) THEN
0527 rDepth = rF(1) - rF(k)
0528 ELSE
0529 rDepth = rF(k) - rF(Nr+1)
0530 ENDIF
0c49347dc7 Alis*0531
b0e49a1609 Jean*0532 CALL GMREDI_SLOPE_LIMIT(
549d1a8d8c Jean*0533 O SlopeX, SlopeY,
e9fd580bc4 Jean*0534 O SlopeSqr, taperFct,
e2259a1942 Jean*0535 U hTransLay, baseSlope, recipLambda,
549d1a8d8c Jean*0536 U dSigmaDr,
0537 I dSigmaDx, dSigmaDy,
5b172de0d2 Jean*0538 I ldd97_LrhoC, locMixLayer, rDepth, rF,
ee8a6f4ffb Jean*0539 I kLowC(1-OLx,1-OLy,bi,bj),
5b172de0d2 Jean*0540 I 3, k, bi, bj, myTime, myIter, myThid )
0c49347dc7 Alis*0541
8233d0ceb9 Jean*0542 #ifdef GMREDI_MASK_SLOPES
ee8a6f4ffb Jean*0543 DO j=1-OLy+1,sNy+OLy-1
0544 DO i=1-OLx+1,sNx+OLx-1
b0e49a1609 Jean*0545
8233d0ceb9 Jean*0546 SlopeX(i,j) = SlopeX(i,j)*maskFk(i,j)
0547 SlopeY(i,j) = SlopeY(i,j)*maskFk(i,j)
0548 SlopeSqr(i,j) = SlopeSqr(i,j)*maskFk(i,j)
b0e49a1609 Jean*0549 ENDDO
b6b11b9b2f Patr*0550 ENDDO
8233d0ceb9 Jean*0551 #endif
b6b11b9b2f Patr*0552
0553 #ifdef ALLOW_AUTODIFF_TAMC
9cb619cfcd Patr*0554
0555
20b8842d78 Patr*0556
549d1a8d8c Jean*0557
0558
b6b11b9b2f Patr*0559 #endif /* ALLOW_AUTODIFF_TAMC */
0560
5b172de0d2 Jean*0561
0562
0563
ee8a6f4ffb Jean*0564 DO j=1-OLy+1,sNy+OLy-1
0565 DO i=1-OLx+1,sNx+OLx-1
5b172de0d2 Jean*0566 Kwx(i,j,k,bi,bj) = -gravitySign*SlopeX(i,j)*taperFct(i,j)
0567 Kwy(i,j,k,bi,bj) = -gravitySign*SlopeY(i,j)*taperFct(i,j)
0568 Kwz(i,j,k,bi,bj) = SlopeSqr(i,j)*taperFct(i,j)
e2259a1942 Jean*0569 ENDDO
0570 ENDDO
0c49347dc7 Alis*0571
f42e64b3e7 Jean*0572
0573 ENDDO
0574
0c49347dc7 Alis*0575 #ifdef GM_VISBECK_VARIABLE_K
a4576c7cde Juli*0576 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0577
a4576c7cde Juli*0578 # endif
5b172de0d2 Jean*0579 IF ( GM_Visbeck_alpha.GT.zeroRL ) THEN
94a8024bbe Jean*0580
ee8a6f4ffb Jean*0581 DO j=1-OLy+1,sNy+OLy-1
0582 DO i=1-OLx+1,sNx+OLx-1
f42e64b3e7 Jean*0583 VisbeckK(i,j,bi,bj)=
9bee368eff Jean*0584 & MIN( MAX( VisbeckK(i,j,bi,bj), GM_Visbeck_minVal_K ),
0585 & GM_Visbeck_maxVal_K )
f42e64b3e7 Jean*0586 ENDDO
0c49347dc7 Alis*0587 ENDDO
0c12568530 mjlo*0588 DO k=1,Nr
0589 DO j=1-OLy,sNy+OLy
0590 DO i=1-OLx,sNx+OLx
0591 locK3dRedi(i,j,k) = locK3dRedi(i,j,k)
0592 & + VisbeckK(i,j,bi,bj)*GM_isoFac_calcK
0593 locK3dGM(i,j,k) = locK3dGM(i,j,k)
0594 & + VisbeckK(i,j,bi,bj)
0595 ENDDO
0596 ENDDO
0597 ENDDO
f42e64b3e7 Jean*0598 ENDIF
d1c10e3d93 mjlo*0599
0c12568530 mjlo*0600
d1c10e3d93 mjlo*0601
0602
0603
f42e64b3e7 Jean*0604 #endif /* GM_VISBECK_VARIABLE_K */
0c49347dc7 Alis*0605
472f570611 Jean*0606
050b4366e6 Jean*0607
0608
0609 #ifdef GM_BOLUS_ADVEC
0610 IF (GM_AdvForm) THEN
a4576c7cde Juli*0611 # ifdef GM_BOLUS_BVP
050b4366e6 Jean*0612 IF (GM_UseBVP) THEN
0613 CALL GMREDI_CALC_PSI_BVP(
0614 I bi, bj, iMin, iMax, jMin, jMax,
0615 I sigmaX, sigmaY, sigmaR,
0616 I myThid )
0617 ELSE
a4576c7cde Juli*0618 # endif
d1eb4480d0 Jean*0619 # ifndef GM_BATES_PASSIVE
05118ac017 Jean*0620 IF ( .NOT.GM_useBatesK3d ) THEN
a4576c7cde Juli*0621 # endif
05118ac017 Jean*0622
d1eb4480d0 Jean*0623 CALL GMREDI_CALC_PSI_BOLUS(
050b4366e6 Jean*0624 I bi, bj, iMin, iMax, jMin, jMax,
472f570611 Jean*0625 I sigmaX, sigmaY, sigmaR, locK3dGM,
050b4366e6 Jean*0626 I ldd97_LrhoW, ldd97_LrhoS,
0627 I myThid )
a4576c7cde Juli*0628 # ifndef GM_BATES_PASSIVE
0d1e4b948d Mich*0629 ENDIF
a4576c7cde Juli*0630 # endif
0631 # ifdef GM_BOLUS_BVP
050b4366e6 Jean*0632 ENDIF
a4576c7cde Juli*0633 # endif
050b4366e6 Jean*0634 ENDIF
361543e926 Jean*0635 #endif /* GM_BOLUS_ADVEC */
050b4366e6 Jean*0636
0637 #ifndef GM_EXCLUDE_SUBMESO
0638 IF ( GM_useSubMeso .AND. GM_AdvForm ) THEN
0639 CALL SUBMESO_CALC_PSI(
0640 I bi, bj, iMin, iMax, jMin, jMax,
0641 I sigmaX, sigmaY, sigmaR,
0642 I locMixLayer,
0643 I myIter, myThid )
472f570611 Jean*0644
050b4366e6 Jean*0645 ENDIF
0646 #endif /* ndef GM_EXCLUDE_SUBMESO */
0c49347dc7 Alis*0647
472f570611 Jean*0648
0649
0650 DO k=1,Nr
0651 #ifdef ALLOW_AUTODIFF_TAMC
0652
0653 kkey = k + (tkey-1)*Nr
0654
0655
0656
0657 #endif
0658 km1 = MAX(k-1,1)
0659 isopycK = GM_isopycK
0660 & *(GM_isoFac1d(km1)+GM_isoFac1d(k))*op5
0661 bolus_K = GM_background_K
0662 & *(GM_bolFac1d(km1)+GM_bolFac1d(k))*op5
0663 DO j=1-OLy+1,sNy+OLy-1
0664 DO i=1-OLx+1,sNx+OLx-1
0c12568530 mjlo*0665 Kredi_tmp =
472f570611 Jean*0666 #ifdef GM_USE_K3D_REDI
0667 & op5*( locK3dRedi(i,j,km1) + locK3dRedi(i,j,k) )
0668 #else
0669 & isopycK*GM_isoFac2d(i,j,bi,bj)
0670 #endif
0c12568530 mjlo*0671 Kgm_tmp = Kredi_tmp
472f570611 Jean*0672 #ifdef GM_USE_K3D_GM
0673 & + GM_skewflx*op5*( locK3dGM(i,j,km1)+locK3dGM(i,j,k) )
0674 #else
0675 & + GM_skewflx*bolus_K*GM_bolFac2d(i,j,bi,bj)
0676 #endif
0677 #ifdef GM_GEOM_VARIABLE_K
0678 & + GM_skewflx*GEOM_K3d(i,j,k,bi,bj)
0679 #endif
0680 Kwx(i,j,k,bi,bj) = Kgm_tmp*Kwx(i,j,k,bi,bj)
0681 Kwy(i,j,k,bi,bj) = Kgm_tmp*Kwy(i,j,k,bi,bj)
0c12568530 mjlo*0682 Kwz(i,j,k,bi,bj) = Kredi_tmp*Kwz(i,j,k,bi,bj)
472f570611 Jean*0683 ENDDO
0684 ENDDO
0685 ENDDO
0686
0687 #ifdef ALLOW_DIAGNOSTICS
0688 IF ( useDiagnostics .AND. GM_taper_scheme.EQ.'fm07' ) THEN
0689 CALL DIAGNOSTICS_FILL( hTransLay, 'GM_hTrsL', 0,1,2,bi,bj,myThid)
0690 CALL DIAGNOSTICS_FILL( baseSlope, 'GM_baseS', 0,1,2,bi,bj,myThid)
0691 CALL DIAGNOSTICS_FILL(recipLambda,'GM_rLamb', 0,1,2,bi,bj,myThid)
0692 ENDIF
0693 #endif /* ALLOW_DIAGNOSTICS */
0694
0695
a4576c7cde Juli*0696 #if ( defined GM_NON_UNITY_DIAGONAL || defined GM_EXTRA_DIAGONAL )
472f570611 Jean*0697
e2259a1942 Jean*0698
0699
0700
a4576c7cde Juli*0701 # ifdef ALLOW_KPP
e2259a1942 Jean*0702 IF ( useKPP ) THEN
ee8a6f4ffb Jean*0703 DO j=1-OLy,sNy+OLy
0704 DO i=2-OLx,sNx+OLx
e2259a1942 Jean*0705 locMixLayer(i,j) = ( KPPhbl(i-1,j,bi,bj)
0706 & + KPPhbl( i ,j,bi,bj) )*op5
0707 ENDDO
0708 ENDDO
0709 ELSE
a4576c7cde Juli*0710 # else
e2259a1942 Jean*0711 IF ( .TRUE. ) THEN
a4576c7cde Juli*0712 # endif
ee8a6f4ffb Jean*0713 DO j=1-OLy,sNy+OLy
0714 DO i=2-OLx,sNx+OLx
e2259a1942 Jean*0715 locMixLayer(i,j) = ( hMixLayer(i-1,j,bi,bj)
0716 & + hMixLayer( i ,j,bi,bj) )*op5
0717 ENDDO
0718 ENDDO
0719 ENDIF
ee8a6f4ffb Jean*0720 DO j=1-OLy,sNy+OLy
0721 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0722 hTransLay(i,j) = 0.
0723 baseSlope(i,j) = 0.
0724 recipLambda(i,j)= 0.
0725 ENDDO
ee8a6f4ffb Jean*0726 DO i=2-OLx,sNx+OLx
e2259a1942 Jean*0727 hTransLay(i,j) = MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
0728 ENDDO
0729 ENDDO
0730
0731 DO k=Nr,1,-1
0732 kp1 = MIN(Nr,k+1)
0733 maskp1 = 1. _d 0
0734 IF (k.GE.Nr) maskp1 = 0. _d 0
a4576c7cde Juli*0735 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0736 kkey = k + (tkey-1)*Nr
a4576c7cde Juli*0737 # endif
0c49347dc7 Alis*0738
0739
ee8a6f4ffb Jean*0740 DO j=1-OLy+1,sNy+OLy-1
0741 DO i=1-OLx+1,sNx+OLx-1
b0e49a1609 Jean*0742 dSigmaDx(i,j)=sigmaX(i,j,k)
0743 & *_maskW(i,j,k,bi,bj)
0744 dSigmaDy(i,j)=op25*( sigmaY(i-1,j+1,k)+sigmaY(i,j+1,k)
0745 & +sigmaY(i-1, j ,k)+sigmaY(i, j ,k)
0746 & )*_maskW(i,j,k,bi,bj)
0747 dSigmaDr(i,j)=op25*( sigmaR(i-1,j, k )+sigmaR(i,j, k )
0748 & +(sigmaR(i-1,j,kp1)+sigmaR(i,j,kp1))*maskp1
5b172de0d2 Jean*0749 & )*_maskW(i,j,k,bi,bj)*gravitySign
b0e49a1609 Jean*0750 ENDDO
0c49347dc7 Alis*0751 ENDDO
0752
a4576c7cde Juli*0753 # ifdef ALLOW_AUTODIFF_TAMC
2092dbb101 Patr*0754
0755
5755dbe390 Patr*0756
a4576c7cde Juli*0757 # ifndef GM_EXCLUDE_FM07_TAP
5755dbe390 Patr*0758
0759
0760
a4576c7cde Juli*0761 # endif
0762 # endif /* ALLOW_AUTODIFF_TAMC */
2092dbb101 Patr*0763
5b172de0d2 Jean*0764
0765 IF ( usingZcoords ) THEN
0766 rDepth = rF(1) - rC(k)
0767 ELSE
0768 rDepth = rC(k) - rF(Nr+1)
0769 ENDIF
0c49347dc7 Alis*0770
b0e49a1609 Jean*0771 CALL GMREDI_SLOPE_LIMIT(
549d1a8d8c Jean*0772 O SlopeX, SlopeY,
e9fd580bc4 Jean*0773 O SlopeSqr, taperFct,
e2259a1942 Jean*0774 U hTransLay, baseSlope, recipLambda,
549d1a8d8c Jean*0775 U dSigmaDr,
0776 I dSigmaDx, dSigmaDy,
5b172de0d2 Jean*0777 I ldd97_LrhoW, locMixLayer, rDepth, rC,
e2259a1942 Jean*0778 I kLow_W,
5b172de0d2 Jean*0779 I 1, k, bi, bj, myTime, myIter, myThid )
0c49347dc7 Alis*0780
a4576c7cde Juli*0781 # ifdef ALLOW_AUTODIFF_TAMC
549d1a8d8c Jean*0782
a4576c7cde Juli*0783 # endif /* ALLOW_AUTODIFF_TAMC */
9cb619cfcd Patr*0784
a4576c7cde Juli*0785 # ifdef GM_NON_UNITY_DIAGONAL
b0e49a1609 Jean*0786
ee8a6f4ffb Jean*0787 DO j=1-OLy+1,sNy+OLy-1
0788 DO i=1-OLx+1,sNx+OLx-1
f42e64b3e7 Jean*0789 Kux(i,j,k,bi,bj) =
472f570611 Jean*0790 # ifdef GM_USE_K3D_REDI
0791 & op5*( locK3dRedi(i-1,j,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*0792 # else
472f570611 Jean*0793 & GM_isopycK*GM_isoFac1d(k)
f6de204bec Jean*0794 & *op5*(GM_isoFac2d(i-1,j,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*0795 # endif
472f570611 Jean*0796 & *taperFct(i,j)
b6b11b9b2f Patr*0797 ENDDO
0798 ENDDO
a4576c7cde Juli*0799 # if ( defined ALLOW_AUTODIFF_TAMC && defined GM_EXCLUDE_CLIPPING )
2092dbb101 Patr*0800
a4576c7cde Juli*0801 # endif
ee8a6f4ffb Jean*0802 DO j=1-OLy+1,sNy+OLy-1
0803 DO i=1-OLx+1,sNx+OLx-1
f42e64b3e7 Jean*0804 Kux(i,j,k,bi,bj) = MAX( Kux(i,j,k,bi,bj), GM_Kmin_horiz )
0805 ENDDO
0806 ENDDO
b0e49a1609 Jean*0807
a4576c7cde Juli*0808 # endif /* GM_NON_UNITY_DIAGONAL */
f42e64b3e7 Jean*0809
a4576c7cde Juli*0810 # ifdef GM_EXTRA_DIAGONAL
2092dbb101 Patr*0811
a4576c7cde Juli*0812 # ifdef ALLOW_AUTODIFF_TAMC
2092dbb101 Patr*0813
a4576c7cde Juli*0814 # endif /* ALLOW_AUTODIFF_TAMC */
e2259a1942 Jean*0815 IF ( GM_ExtraDiag ) THEN
ee8a6f4ffb Jean*0816 DO j=1-OLy+1,sNy+OLy-1
0817 DO i=1-OLx+1,sNx+OLx-1
5b172de0d2 Jean*0818 Kuz(i,j,k,bi,bj) = -gravitySign*
472f570611 Jean*0819 # ifdef GM_USE_K3D_REDI
0820 & ( op5*( locK3dRedi(i-1,j,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*0821 # else
f6de204bec Jean*0822 & ( GM_isopycK*GM_isoFac1d(k)
0823 & *op5*(GM_isoFac2d(i-1,j,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*0824 # endif
472f570611 Jean*0825 # ifdef GM_USE_K3D_GM
0826 & - GM_skewflx*op5*( locK3dGM(i-1,j,k) + locK3dGM(i,j,k) )
a4576c7cde Juli*0827 # else
f6de204bec Jean*0828 & - GM_skewflx*GM_background_K*GM_bolFac1d(k)
0829 & *op5*(GM_bolFac2d(i-1,j,bi,bj)+GM_bolFac2d(i,j,bi,bj))
a4576c7cde Juli*0830 # endif
0831 # ifdef GM_GEOM_VARIABLE_K
0832 & - GM_skewflx*op25*( ( GEOM_K3d(i-1,j, k, bi,bj)
0833 & + GEOM_K3d( i, j, k, bi,bj) )
0834 & + ( GEOM_K3d(i-1,j,kp1,bi,bj)
0835 & + GEOM_K3d( i, j,kp1,bi,bj) ) )
0836 # endif
f42e64b3e7 Jean*0837 & )*SlopeX(i,j)*taperFct(i,j)
0838 ENDDO
0839 ENDDO
796b5e35f7 Jean*0840
0841
0842
0843
0844
0845
b0e49a1609 Jean*0846 ENDIF
a4576c7cde Juli*0847 # endif /* GM_EXTRA_DIAGONAL */
0c49347dc7 Alis*0848
a4576c7cde Juli*0849 # ifdef ALLOW_DIAGNOSTICS
b0e49a1609 Jean*0850 IF (doDiagRediFlx) THEN
066e0d5e64 Jean*0851 km1 = MAX(k-1,1)
0852 DO j=1,sNy
0853 DO i=1,sNx+1
0854
5b172de0d2 Jean*0855 tmp1k(i,j) = -gravitySign*
472f570611 Jean*0856 # ifdef GM_USE_K3D_REDI
0857 & op5*( locK3dRedi(i-1,j,k)+ locK3dRedi(i,j,k) )
a4576c7cde Juli*0858 # else
472f570611 Jean*0859 & GM_isopycK*GM_isoFac1d(k)
0860 & *op5*(GM_isoFac2d(i-1,j,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*0861 # endif
472f570611 Jean*0862 & *SlopeX(i,j)*taperFct(i,j)
066e0d5e64 Jean*0863 ENDDO
0864 ENDDO
0865 DO j=1,sNy
0866 DO i=1,sNx+1
0867
0868 dTdz = (
0869 & +recip_drC(k)*
8233d0ceb9 Jean*0870 & ( maskC(i-1,j,km1,bi,bj)*maskC(i-1,j,k,bi,bj)*
066e0d5e64 Jean*0871 & (theta(i-1,j,km1,bi,bj)-theta(i-1,j,k,bi,bj))
8233d0ceb9 Jean*0872 & +maskC( i ,j,km1,bi,bj)*maskC( i ,j,k,bi,bj)*
066e0d5e64 Jean*0873 & (theta( i ,j,km1,bi,bj)-theta( i ,j,k,bi,bj))
0874 & )
0875 & +recip_drC(kp1)*
8233d0ceb9 Jean*0876 & ( maskC(i-1,j,k,bi,bj)*maskC(i-1,j,kp1,bi,bj)*
066e0d5e64 Jean*0877 & (theta(i-1,j,k,bi,bj)-theta(i-1,j,kp1,bi,bj))
8233d0ceb9 Jean*0878 & +maskC( i ,j,k,bi,bj)*maskC( i ,j,kp1,bi,bj)*
066e0d5e64 Jean*0879 & (theta( i ,j,k,bi,bj)-theta( i ,j,kp1,bi,bj))
0880 & ) ) * 0.25 _d 0
a67797e4f0 Jean*0881 tmp1k(i,j) = dyG(i,j,bi,bj) * deepFacC(k)
0882 & * drF(k) * _hFacW(i,j,k,bi,bj)
066e0d5e64 Jean*0883 & * tmp1k(i,j) * dTdz
0884 ENDDO
0885 ENDDO
0886 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KuzTz', k,1,2,bi,bj,myThid)
b0e49a1609 Jean*0887 ENDIF
a4576c7cde Juli*0888 # endif /* ALLOW_DIAGNOSTICS */
066e0d5e64 Jean*0889
e2259a1942 Jean*0890
0891 ENDDO
0892
0893
0894
0895
a4576c7cde Juli*0896 # ifdef ALLOW_KPP
e2259a1942 Jean*0897 IF ( useKPP ) THEN
ee8a6f4ffb Jean*0898 DO j=2-OLy,sNy+OLy
0899 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0900 locMixLayer(i,j) = ( KPPhbl(i,j-1,bi,bj)
0901 & + KPPhbl(i, j ,bi,bj) )*op5
0902 ENDDO
0903 ENDDO
0904 ELSE
a4576c7cde Juli*0905 # else
e2259a1942 Jean*0906 IF ( .TRUE. ) THEN
a4576c7cde Juli*0907 # endif
ee8a6f4ffb Jean*0908 DO j=2-OLy,sNy+OLy
0909 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0910 locMixLayer(i,j) = ( hMixLayer(i,j-1,bi,bj)
0911 & + hMixLayer(i, j ,bi,bj) )*op5
0912 ENDDO
0913 ENDDO
0914 ENDIF
ee8a6f4ffb Jean*0915 DO j=1-OLy,sNy+OLy
0916 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0917 hTransLay(i,j) = 0.
0918 baseSlope(i,j) = 0.
0919 recipLambda(i,j)= 0.
0920 ENDDO
0921 ENDDO
ee8a6f4ffb Jean*0922 DO j=2-OLy,sNy+OLy
0923 DO i=1-OLx,sNx+OLx
e2259a1942 Jean*0924 hTransLay(i,j) = MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
0925 ENDDO
0926 ENDDO
0927
0c49347dc7 Alis*0928
e2259a1942 Jean*0929 DO k=Nr,1,-1
0930 kp1 = MIN(Nr,k+1)
0931 maskp1 = 1. _d 0
0932 IF (k.GE.Nr) maskp1 = 0. _d 0
a4576c7cde Juli*0933 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0934 kkey = k + (tkey-1)*Nr
a4576c7cde Juli*0935 # endif
e2259a1942 Jean*0936
ee8a6f4ffb Jean*0937 DO j=1-OLy+1,sNy+OLy-1
0938 DO i=1-OLx+1,sNx+OLx-1
b0e49a1609 Jean*0939 dSigmaDx(i,j)=op25*( sigmaX(i, j ,k) +sigmaX(i+1, j ,k)
0940 & +sigmaX(i,j-1,k) +sigmaX(i+1,j-1,k)
0941 & )*_maskS(i,j,k,bi,bj)
0942 dSigmaDy(i,j)=sigmaY(i,j,k)
0943 & *_maskS(i,j,k,bi,bj)
0944 dSigmaDr(i,j)=op25*( sigmaR(i,j-1, k )+sigmaR(i,j, k )
0945 & +(sigmaR(i,j-1,kp1)+sigmaR(i,j,kp1))*maskp1
5b172de0d2 Jean*0946 & )*_maskS(i,j,k,bi,bj)*gravitySign
b0e49a1609 Jean*0947 ENDDO
0c49347dc7 Alis*0948 ENDDO
0949
a4576c7cde Juli*0950 # ifdef ALLOW_AUTODIFF_TAMC
2092dbb101 Patr*0951
0952
5755dbe390 Patr*0953
a4576c7cde Juli*0954 # ifndef GM_EXCLUDE_FM07_TAP
5755dbe390 Patr*0955
0956
0957
a4576c7cde Juli*0958 # endif
0959 # endif /* ALLOW_AUTODIFF_TAMC */
2092dbb101 Patr*0960
5b172de0d2 Jean*0961
0962 IF ( usingZcoords ) THEN
0963 rDepth = rF(1) - rC(k)
0964 ELSE
0965 rDepth = rC(k) - rF(Nr+1)
0966 ENDIF
0c49347dc7 Alis*0967
b0e49a1609 Jean*0968 CALL GMREDI_SLOPE_LIMIT(
549d1a8d8c Jean*0969 O SlopeX, SlopeY,
e9fd580bc4 Jean*0970 O SlopeSqr, taperFct,
e2259a1942 Jean*0971 U hTransLay, baseSlope, recipLambda,
549d1a8d8c Jean*0972 U dSigmaDr,
0973 I dSigmaDx, dSigmaDy,
5b172de0d2 Jean*0974 I ldd97_LrhoS, locMixLayer, rDepth, rC,
e2259a1942 Jean*0975 I kLow_S,
5b172de0d2 Jean*0976 I 2, k, bi, bj, myTime, myIter, myThid )
0c49347dc7 Alis*0977
a4576c7cde Juli*0978 # ifdef ALLOW_AUTODIFF_TAMC
361543e926 Jean*0979
a4576c7cde Juli*0980 # endif /* ALLOW_AUTODIFF_TAMC */
9cb619cfcd Patr*0981
a4576c7cde Juli*0982 # ifdef GM_NON_UNITY_DIAGONAL
b0e49a1609 Jean*0983
ee8a6f4ffb Jean*0984 DO j=1-OLy+1,sNy+OLy-1
0985 DO i=1-OLx+1,sNx+OLx-1
f42e64b3e7 Jean*0986 Kvy(i,j,k,bi,bj) =
472f570611 Jean*0987 # ifdef GM_USE_K3D_REDI
0988 & op5*( locK3dRedi(i,j-1,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*0989 # else
472f570611 Jean*0990 & GM_isopycK*GM_isoFac1d(k)
f6de204bec Jean*0991 & *op5*(GM_isoFac2d(i,j-1,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*0992 # endif
472f570611 Jean*0993 & *taperFct(i,j)
b6b11b9b2f Patr*0994 ENDDO
0995 ENDDO
a4576c7cde Juli*0996 # if ( defined ALLOW_AUTODIFF_TAMC && defined GM_EXCLUDE_CLIPPING )
2092dbb101 Patr*0997
a4576c7cde Juli*0998 # endif
ee8a6f4ffb Jean*0999 DO j=1-OLy+1,sNy+OLy-1
1000 DO i=1-OLx+1,sNx+OLx-1
f42e64b3e7 Jean*1001 Kvy(i,j,k,bi,bj) = MAX( Kvy(i,j,k,bi,bj), GM_Kmin_horiz )
1002 ENDDO
1003 ENDDO
b0e49a1609 Jean*1004
a4576c7cde Juli*1005 # endif /* GM_NON_UNITY_DIAGONAL */
f42e64b3e7 Jean*1006
a4576c7cde Juli*1007 # ifdef GM_EXTRA_DIAGONAL
2092dbb101 Patr*1008
a4576c7cde Juli*1009 # ifdef ALLOW_AUTODIFF_TAMC
2092dbb101 Patr*1010
a4576c7cde Juli*1011 # endif /* ALLOW_AUTODIFF_TAMC */
e2259a1942 Jean*1012 IF ( GM_ExtraDiag ) THEN
ee8a6f4ffb Jean*1013 DO j=1-OLy+1,sNy+OLy-1
1014 DO i=1-OLx+1,sNx+OLx-1
5b172de0d2 Jean*1015 Kvz(i,j,k,bi,bj) = -gravitySign*
472f570611 Jean*1016 # ifdef GM_USE_K3D_REDI
1017 & ( op5*( locK3dRedi(i,j-1,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*1018 # else
f6de204bec Jean*1019 & ( GM_isopycK*GM_isoFac1d(k)
1020 & *op5*(GM_isoFac2d(i,j-1,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*1021 # endif
472f570611 Jean*1022 # ifdef GM_USE_K3D_GM
1023 & - GM_skewflx*op5*( locK3dGM(i,j-1,k) + locK3dGM(i,j,k) )
a4576c7cde Juli*1024 # else
f6de204bec Jean*1025 & - GM_skewflx*GM_background_K*GM_bolFac1d(k)
1026 & *op5*(GM_bolFac2d(i,j-1,bi,bj)+GM_bolFac2d(i,j,bi,bj))
a4576c7cde Juli*1027 # endif
1028 # ifdef GM_GEOM_VARIABLE_K
1029 & - GM_skewflx*op25*( ( GEOM_K3d(i,j-1, k, bi,bj)
1030 & + GEOM_K3d(i, j, k, bi,bj) )
1031 & + ( GEOM_K3d(i,j-1,kp1,bi,bj)
1032 & + GEOM_K3d(i, j, kp1,bi,bj) ) )
1033 # endif
f42e64b3e7 Jean*1034 & )*SlopeY(i,j)*taperFct(i,j)
1035 ENDDO
1036 ENDDO
796b5e35f7 Jean*1037
1038
1039
1040
1041
1042
b0e49a1609 Jean*1043 ENDIF
a4576c7cde Juli*1044 # endif /* GM_EXTRA_DIAGONAL */
f42e64b3e7 Jean*1045
a4576c7cde Juli*1046 # ifdef ALLOW_DIAGNOSTICS
b0e49a1609 Jean*1047 IF (doDiagRediFlx) THEN
81880fdab4 Davi*1048 km1 = MAX(k-1,1)
066e0d5e64 Jean*1049 DO j=1,sNy+1
1050 DO i=1,sNx
1051
5b172de0d2 Jean*1052 tmp1k(i,j) = -gravitySign*
472f570611 Jean*1053 # ifdef GM_USE_K3D_REDI
1054 & op5*( locK3dRedi(i,j-1,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*1055 # else
472f570611 Jean*1056 & GM_isopycK*GM_isoFac1d(k)
1057 & *op5*(GM_isoFac2d(i,j-1,bi,bj)+GM_isoFac2d(i,j,bi,bj))
a4576c7cde Juli*1058 # endif
472f570611 Jean*1059 & *SlopeY(i,j)*taperFct(i,j)
066e0d5e64 Jean*1060 ENDDO
1061 ENDDO
1062 DO j=1,sNy+1
1063 DO i=1,sNx
1064
1065 dTdz = (
1066 & +recip_drC(k)*
8233d0ceb9 Jean*1067 & ( maskC(i,j-1,km1,bi,bj)*maskC(i,j-1,k,bi,bj)*
066e0d5e64 Jean*1068 & (theta(i,j-1,km1,bi,bj)-theta(i,j-1,k,bi,bj))
8233d0ceb9 Jean*1069 & +maskC(i, j ,km1,bi,bj)*maskC(i, j ,k,bi,bj)*
066e0d5e64 Jean*1070 & (theta(i, j ,km1,bi,bj)-theta(i, j ,k,bi,bj))
1071 & )
1072 & +recip_drC(kp1)*
8233d0ceb9 Jean*1073 & ( maskC(i,j-1,kp1,bi,bj)*maskC(i,j-1,k,bi,bj)*
066e0d5e64 Jean*1074 & (theta(i,j-1,k,bi,bj)-theta(i,j-1,kp1,bi,bj))
8233d0ceb9 Jean*1075 & +maskC(i, j ,kp1,bi,bj)*maskC(i, j ,k,bi,bj)*
066e0d5e64 Jean*1076 & (theta(i, j ,k,bi,bj)-theta(i, j ,kp1,bi,bj))
1077 & ) ) * 0.25 _d 0
a67797e4f0 Jean*1078 tmp1k(i,j) = dxG(i,j,bi,bj) * deepFacC(k)
1079 & * drF(k) * _hFacS(i,j,k,bi,bj)
066e0d5e64 Jean*1080 & * tmp1k(i,j) * dTdz
1081 ENDDO
1082 ENDDO
1083 CALL DIAGNOSTICS_FILL(tmp1k, 'GM_KvzTz', k,1,2,bi,bj,myThid)
b0e49a1609 Jean*1084 ENDIF
a4576c7cde Juli*1085 # endif /* ALLOW_DIAGNOSTICS */
066e0d5e64 Jean*1086
e2259a1942 Jean*1087
f42e64b3e7 Jean*1088 ENDDO
0c49347dc7 Alis*1089
e2259a1942 Jean*1090 #endif /* GM_NON_UNITY_DIAGONAL || GM_EXTRA_DIAGONAL */
472f570611 Jean*1091
e2259a1942 Jean*1092
796b5e35f7 Jean*1093 #ifndef GM_NON_UNITY_DIAGONAL
f5509be190 Mart*1094
1095
796b5e35f7 Jean*1096 DO k=1,Nr
1097 DO j=1-OLy+1,sNy+OLy-1
1098 DO i=1-OLx+1,sNx+OLx-1
472f570611 Jean*1099 Kux(i,j,k,bi,bj) =
1100 # ifdef GM_USE_K3D_REDI
1101 & op5*( locK3dRedi(i-1,j,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*1102 # else
472f570611 Jean*1103 & GM_isopycK
a4576c7cde Juli*1104 # endif
796b5e35f7 Jean*1105 ENDDO
1106 ENDDO
1107 DO j=1-OLy+1,sNy+OLy-1
1108 DO i=1-OLx+1,sNx+OLx-1
472f570611 Jean*1109 Kvy(i,j,k,bi,bj) =
1110 # ifdef GM_USE_K3D_REDI
1111 & op5*( locK3dRedi(i,j-1,k) + locK3dRedi(i,j,k) )
a4576c7cde Juli*1112 # else
472f570611 Jean*1113 & GM_isopycK
a4576c7cde Juli*1114 # endif
796b5e35f7 Jean*1115 ENDDO
1116 ENDDO
1117 ENDDO
1118 #endif /* ndef GM_NON_UNITY_DIAGONAL */
1119
d29d98918f Jean*1120 #ifdef ALLOW_DIAGNOSTICS
1121 IF ( useDiagnostics ) THEN
472f570611 Jean*1122 CALL GMREDI_DIAGNOSTICS_FILL( bi, bj, myThid )
d29d98918f Jean*1123 ENDIF
1124 #endif /* ALLOW_DIAGNOSTICS */
1125
0c49347dc7 Alis*1126 #endif /* ALLOW_GMREDI */
1127
1128 RETURN
1129 END
b58589f5c2 Patr*1130
8d8488bf10 Jean*1131
b58589f5c2 Patr*1132
3a15bf3a95 Jean*1133
1134
1135
b58589f5c2 Patr*1136 SUBROUTINE GMREDI_CALC_TENSOR_DUMMY(
e2259a1942 Jean*1137 I iMin, iMax, jMin, jMax,
b58589f5c2 Patr*1138 I sigmaX, sigmaY, sigmaR,
e2259a1942 Jean*1139 I bi, bj, myTime, myIter, myThid )
3a15bf3a95 Jean*1140
1141
1142
1143
1144
1145
1146
1147
1148
b58589f5c2 Patr*1149 IMPLICIT NONE
1150
1151
1152 #include "SIZE.h"
1153 #include "EEPARAMS.h"
1154 #include "GMREDI.h"
1155
3a15bf3a95 Jean*1156
ee8a6f4ffb Jean*1157 _RL sigmaX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
1158 _RL sigmaY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
1159 _RL sigmaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
e2259a1942 Jean*1160 INTEGER iMin,iMax,jMin,jMax
1161 INTEGER bi, bj
1162 _RL myTime
1163 INTEGER myIter
b58589f5c2 Patr*1164 INTEGER myThid
3a15bf3a95 Jean*1165
b58589f5c2 Patr*1166
1167 #ifdef ALLOW_GMREDI
3a15bf3a95 Jean*1168
e2259a1942 Jean*1169 INTEGER i, j, k
1170
f42e64b3e7 Jean*1171 DO k=1,Nr
ee8a6f4ffb Jean*1172 DO j=1-OLy+1,sNy+OLy-1
1173 DO i=1-OLx+1,sNx+OLx-1
796b5e35f7 Jean*1174 Kwx(i,j,k,bi,bj) = 0. _d 0
1175 Kwy(i,j,k,bi,bj) = 0. _d 0
1176 Kwz(i,j,k,bi,bj) = 0. _d 0
1177 Kux(i,j,k,bi,bj) = 0. _d 0
1178 Kvy(i,j,k,bi,bj) = 0. _d 0
1179 # ifdef GM_EXTRA_DIAGONAL
1180 Kuz(i,j,k,bi,bj) = 0. _d 0
1181 Kvz(i,j,k,bi,bj) = 0. _d 0
1182 # endif
f42e64b3e7 Jean*1183 ENDDO
b58589f5c2 Patr*1184 ENDDO
1185 ENDDO
1186 #endif /* ALLOW_GMREDI */
1187
f42e64b3e7 Jean*1188 RETURN
1189 END