File indexing completed on 2026-08-13 05:08:40 UTC
view on githubraw file Latest commit 09a9aa1d on 2026-08-10 19:46:52 UTC
89474f9a5c Mart*0001 #include "GGL90_OPTIONS.h"
7bb5a8a109 Jean*0002 #ifdef ALLOW_GENERIC_ADVDIFF
0003 # include "GAD_OPTIONS.h"
0004 #endif
dd9d13d532 Mart*0005 #ifdef ALLOW_AUTODIFF
0006 # include "AUTODIFF_OPTIONS.h"
0007 #endif
89474f9a5c Mart*0008
0009
0010
0011
0012
f688417df1 Jean*0013 SUBROUTINE GGL90_CALC(
dc6107c029 Jean*0014 I bi, bj, sigmaR, myTime, myIter, myThid )
0015
89474f9a5c Mart*0016
5e48dccc42 Jean*0017
89474f9a5c Mart*0018
0019
5e48dccc42 Jean*0020
89474f9a5c Mart*0021
0320e25227 Mart*0022
89474f9a5c Mart*0023
0320e25227 Mart*0024
0025
0026
0027
5e48dccc42 Jean*0028
89474f9a5c Mart*0029
0030
5e48dccc42 Jean*0031
0032
0033
89474f9a5c Mart*0034
0035
0036
5e48dccc42 Jean*0037 IMPLICIT NONE
89474f9a5c Mart*0038 #include "SIZE.h"
0039 #include "EEPARAMS.h"
0040 #include "PARAMS.h"
0041 #include "DYNVARS.h"
0042 #include "FFIELDS.h"
0043 #include "GRID.h"
f13fe90a48 Patr*0044 #include "GGL90.h"
f18a893d42 Mart*0045 #ifdef ALLOW_SHELFICE
0046 # include "SHELFICE.h"
0047 #endif
dd9d13d532 Mart*0048 #ifdef ALLOW_AUTODIFF_TAMC
0049 # include "tamc.h"
0050 #endif
7c50f07931 Mart*0051
89474f9a5c Mart*0052
5e48dccc42 Jean*0053
dc6107c029 Jean*0054
0055
5e48dccc42 Jean*0056
f688417df1 Jean*0057
5e48dccc42 Jean*0058
89474f9a5c Mart*0059 INTEGER bi, bj
dc6107c029 Jean*0060 _RL sigmaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
89474f9a5c Mart*0061 _RL myTime
f688417df1 Jean*0062 INTEGER myIter
5e48dccc42 Jean*0063 INTEGER myThid
89474f9a5c Mart*0064
0065 #ifdef ALLOW_GGL90
0066
5b0716a6b3 Mart*0067 #ifdef ALLOW_DIAGNOSTICS
0068 LOGICAL DIAGNOSTICS_IS_ON
0069 EXTERNAL DIAGNOSTICS_IS_ON
0070 #endif /* ALLOW_DIAGNOSTICS */
0071
89474f9a5c Mart*0072
f688417df1 Jean*0073
0320e25227 Mart*0074
0075
0076
0077
cdafb98dea Mart*0078
f688417df1 Jean*0079
0080
0320e25227 Mart*0081
0082
0083
0084
0085
f688417df1 Jean*0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
89474f9a5c Mart*0097 INTEGER iMin ,iMax ,jMin ,jMax
0320e25227 Mart*0098 INTEGER i, j, k
f18a893d42 Mart*0099 INTEGER kp1, km1
0100 INTEGER kSrf, kTop, kBot
0320e25227 Mart*0101 INTEGER errCode
0102 _RL deltaTloc
0103 _RL explDissFac, implDissFac
0104 _RL uStarSquare (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0105 _RL verticalShear(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0106 _RL KappaM (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0107 _RL KappaH
0108
0109 _RL Nsquare(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0110
0111 _RL SQRTTKE(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0112 _RL RiNumber
87bca9545c Mart*0113 #ifdef ALLOW_GGL90_IDEMIX
0320e25227 Mart*0114 _RL IDEMIX_RiNumber
87bca9545c Mart*0115 #endif
0320e25227 Mart*0116 _RL TKEdissipation
b038e3cc4f Mart*0117 _RL tempU, tempUp, tempV, tempVp, prTemp, tmpVisc
0320e25227 Mart*0118 _RL TKEPrandtlNumber (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0119 _RL GGL90mixingLength(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0120 _RL rMixingLength (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0121 _RL KappaE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0122 _RL GGL90visctmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
cdafb98dea Mart*0123 #ifdef ALLOW_GGL90_IDEMIX
0320e25227 Mart*0124 _RL hFacI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
5b0716a6b3 Mart*0125
0126
f18a893d42 Mart*0127 _RL IDEMIX_gTKE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
cdafb98dea Mart*0128 #endif /* ALLOW_GGL90_IDEMIX */
9293d3c672 Hajo*0129 #ifdef ALLOW_GGL90_LANGMUIR
0130
ee5f92f083 mjlo*0131 _RL depthFac
b038e3cc4f Mart*0132 _RL recip_Lasq, recip_LD
9293d3c672 Hajo*0133 _RL LCmixingLength(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0134 _RL stokesterm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0135 _RL dstokesUdR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0136 _RL dstokesVdR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
ee5f92f083 mjlo*0137 _RL uStar (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0138 _RL vStar (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
9293d3c672 Hajo*0139 #endif /* ALLOW_GGL90_LANGMUIR */
0320e25227 Mart*0140 _RL recip_hFacI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0141 _RL hFac
f18a893d42 Mart*0142 _RS mskLoc
0143 #ifdef ALLOW_GGL90_SMOOTH
0144 _RS maskI (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0145 #endif
b4ce400958 Davi*0146
0320e25227 Mart*0147 _RL a3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0148 _RL b3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0149 _RL c3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
0150
0151
0152
0153 _RL coordFac, recip_coordFac
76f580e1f0 Mart*0154 #ifdef ALLOW_GGL90_HORIZDIFF
f688417df1 Jean*0155
0156
0157
0320e25227 Mart*0158 _RL xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0159 _RL yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0160 _RL dfx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0161 _RL dfy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0162 _RL gTKE(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
76f580e1f0 Mart*0163 #endif /* ALLOW_GGL90_HORIZDIFF */
004d5ee949 Davi*0164 #ifdef ALLOW_GGL90_SMOOTH
f6b150f7f1 Gael*0165 _RL p4, p8, p16
63bbd437b1 Jean*0166 #endif
f18a893d42 Mart*0167 #ifdef ALLOW_SHELFICE
0168 INTEGER ki
0169 _RL KE (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0170 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0171 _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0172 _RL cDragU (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0173 _RL cDragV (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0174 _RL stressU(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0175 _RL stressV(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0176 _RL kappaRX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
0177 #endif
0320e25227 Mart*0178 #ifdef ALLOW_DIAGNOSTICS
5b0716a6b3 Mart*0179 # ifndef ALLOW_AUTODIFF
0180 LOGICAL doDiagTKEmin
0181 _RL recip_deltaT
0182 # endif
0320e25227 Mart*0183 _RL surf_flx_tke(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0184 #endif /* ALLOW_DIAGNOSTICS */
dd9d13d532 Mart*0185 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0186
0187
0188 INTEGER tkey, kkey
dd9d13d532 Mart*0189 #endif
31a3206180 Mart*0190
63bbd437b1 Jean*0191
0192 PARAMETER( iMin = 2-OLx, iMax = sNx+OLx-1 )
0193 PARAMETER( jMin = 2-OLy, jMax = sNy+OLy-1 )
0194 #ifdef ALLOW_GGL90_SMOOTH
0195 p4 = 0.25 _d 0
0196 p8 = 0.125 _d 0
0197 p16 = 0.0625 _d 0
004d5ee949 Davi*0198 #endif
89474f9a5c Mart*0199
0320e25227 Mart*0200 IF ( usingPCoords ) THEN
0201 kSrf = Nr
0202 kTop = Nr
0203 ELSE
0204 kSrf = 1
0205 kTop = 2
0206 ENDIF
0207 deltaTloc = dTtracerLev(kSrf)
0208
0209 coordFac = 1. _d 0
0210 IF ( usingPCoords) coordFac = gravity * rhoConst
0211 recip_coordFac = 1./coordFac
0212
dd9d13d532 Mart*0213 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0214 tkey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
dd9d13d532 Mart*0215 #endif /* ALLOW_AUTODIFF_TAMC */
0216
f688417df1 Jean*0217
0218 explDissFac = 0. _d 0
0219 implDissFac = 1. _d 0 - explDissFac
89474f9a5c Mart*0220
5b0716a6b3 Mart*0221 #ifdef ALLOW_DIAGNOSTICS
0222 # ifndef ALLOW_AUTODIFF
0223 doDiagTKEmin = .FALSE.
0224 # endif
0225 IF ( useDiagnostics ) THEN
0226 # ifndef ALLOW_AUTODIFF
0227 doDiagTKEmin = DIAGNOSTICS_IS_ON('GGL90Emn',myThid)
0228
0229
0230 IF ( doDiagTKEmin )
0231 & CALL DIAGNOSTICS_COUNT('GGL90Emn',bi,bj,myThid)
0232 # endif
0233 DO j=1-OLy,sNy+OLy
0234 DO i=1-OLx,sNx+OLx
0235 surf_flx_tke(i,j) = 0.
0236 ENDDO
0237 ENDDO
0238 ENDIF
0239 #endif
0240
63bbd437b1 Jean*0241
cdafb98dea Mart*0242
0243
7c50f07931 Mart*0244 DO k=1,Nr
0320e25227 Mart*0245 km1 = MAX(k-1,1)
cdafb98dea Mart*0246 DO j=1-OLy,sNy+OLy
0247 DO i=1-OLx,sNx+OLx
63bbd437b1 Jean*0248 hFac =
5b0716a6b3 Mart*0249 & MIN( halfRS, _hFacC(i,j,km1,bi,bj) )
0250 & + MIN( halfRS, _hFacC(i,j,k ,bi,bj) )
7c50f07931 Mart*0251 recip_hFacI(i,j,k)=0. _d 0
cdafb98dea Mart*0252 IF ( hFac .NE. 0. _d 0 )
7c50f07931 Mart*0253 & recip_hFacI(i,j,k)=1. _d 0/hFac
cdafb98dea Mart*0254 #ifdef ALLOW_GGL90_IDEMIX
0255 hFacI(i,j,k) = hFac
0256 #endif /* ALLOW_GGL90_IDEMIX */
0257 ENDDO
0258 ENDDO
0259 ENDDO
0260
31f96e9372 Jean*0261 #ifdef ALLOW_GGL90_IDEMIX
0262
0263
0264 IF ( useIDEMIX) CALL GGL90_IDEMIX(
0265 I bi, bj, hFacI, recip_hFacI, sigmaR,
0266 O IDEMIX_gTKE,
0267 I myTime, myIter, myThid )
0268 #endif /* ALLOW_GGL90_IDEMIX */
0269
89474f9a5c Mart*0270
0320e25227 Mart*0271 DO k=1,Nr
dc6107c029 Jean*0272 DO j=1-OLy,sNy+OLy
0273 DO i=1-OLx,sNx+OLx
87bca9545c Mart*0274 rMixingLength(i,j,k) = 0. _d 0
0275 GGL90visctmp(i,j,k) = 0. _d 0
f688417df1 Jean*0276 KappaE(i,j,k) = 0. _d 0
0277 TKEPrandtlNumber(i,j,k) = 1. _d 0
0278 GGL90mixingLength(i,j,k) = GGL90mixingLengthMin
909cdb2275 Jean*0279 #ifndef SOLVE_DIAGONAL_LOWMEMORY
0280 a3d(i,j,k) = 0. _d 0
0281 b3d(i,j,k) = 1. _d 0
0282 c3d(i,j,k) = 0. _d 0
0283 #endif
87bca9545c Mart*0284 Nsquare(i,j,k) = 0. _d 0
0285 SQRTTKE(i,j,k) = 0. _d 0
89474f9a5c Mart*0286 ENDDO
94c8eb5701 Jean*0287 ENDDO
89474f9a5c Mart*0288 ENDDO
dd9d13d532 Mart*0289 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0290
dd9d13d532 Mart*0291 #endif
dc6107c029 Jean*0292 DO j=1-OLy,sNy+OLy
0293 DO i=1-OLx,sNx+OLx
cdafb98dea Mart*0294 KappaM(i,j) = 0. _d 0
0320e25227 Mart*0295 uStarSquare(i,j) = 0. _d 0
cdafb98dea Mart*0296 verticalShear(i,j) = 0. _d 0
0320e25227 Mart*0297
417b5b7e19 Oliv*0298 #ifdef ALLOW_AUTODIFF
b038e3cc4f Mart*0299 IF ( usingZCoords .AND. maskC(i,j,1,bi,bj).EQ.oneRS
0300 & .AND. GGL90TKE(i,j,1,bi,bj) .GT. zeroRL ) THEN
417b5b7e19 Oliv*0301 #endif
3e0545e2b7 Oliv*0302 SQRTTKE(i,j,1) = SQRT( GGL90TKE(i,j,1,bi,bj) )
417b5b7e19 Oliv*0303 #ifdef ALLOW_AUTODIFF
3e0545e2b7 Oliv*0304 ELSE
0305 SQRTTKE(i,j,1) = 0. _d 0
0306 ENDIF
417b5b7e19 Oliv*0307 #endif
87bca9545c Mart*0308 #ifdef ALLOW_GGL90_HORIZDIFF
0309 xA(i,j) = 0. _d 0
0310 yA(i,j) = 0. _d 0
0311 dfx(i,j) = 0. _d 0
0312 dfy(i,j) = 0. _d 0
0313 gTKE(i,j) = 0. _d 0
0314 #endif /* ALLOW_GGL90_HORIZDIFF */
89474f9a5c Mart*0315 ENDDO
0316 ENDDO
0317
9293d3c672 Hajo*0318 #ifdef ALLOW_GGL90_LANGMUIR
0319 IF (useLANGMUIR) THEN
0320 recip_Lasq = 1. _d 0 / LC_num
0321 recip_Lasq = recip_Lasq * recip_Lasq
0322 recip_LD = 4. _d 0 * PI / LC_lambda
0323 DO j=1-OLy,sNy+OLy
0324 DO i=1-OLx,sNx+OLx
0325 stokesterm(i,j) = 0. _d 0
0326 dstokesUdR(i,j) = 0. _d 0
0327 dstokesVdR(i,j) = 0. _d 0
ee5f92f083 mjlo*0328 uStar(i,j) = SIGN( SQRT(ABS(surfaceForcingU(i,j,bi,bj))),
0329 & surfaceForcingU(i,j,bi,bj) )
0330 vStar(i,j) = SIGN( SQRT(ABS(surfaceForcingV(i,j,bi,bj))),
0331 & surfaceForcingV(i,j,bi,bj) )
9293d3c672 Hajo*0332 ENDDO
0333 ENDDO
0334 ENDIF
0335 #endif
0336
f688417df1 Jean*0337 DO k = 2, Nr
0338 DO j=jMin,jMax
0339 DO i=iMin,iMax
f18a893d42 Mart*0340 mskLoc = maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
417b5b7e19 Oliv*0341 #ifdef ALLOW_AUTODIFF
b038e3cc4f Mart*0342 IF ( mskLoc.EQ.oneRS
0343 & .AND. GGL90TKE(i,j,k,bi,bj) .GT. zeroRL ) THEN
417b5b7e19 Oliv*0344 #endif
3e0545e2b7 Oliv*0345 SQRTTKE(i,j,k)=SQRT( GGL90TKE(i,j,k,bi,bj) )
417b5b7e19 Oliv*0346 #ifdef ALLOW_AUTODIFF
3e0545e2b7 Oliv*0347 ELSE
0348 SQRTTKE(i,j,k)=0. _d 0
0349 ENDIF
417b5b7e19 Oliv*0350 #endif
f5bf4b6e4b Jean*0351
89474f9a5c Mart*0352
dc6107c029 Jean*0353 Nsquare(i,j,k) = gravity*gravitySign*recip_rhoConst
0320e25227 Mart*0354 & * sigmaR(i,j,k) * coordFac
cdafb98dea Mart*0355
0356
b038e3cc4f Mart*0357
f688417df1 Jean*0358 GGL90mixingLength(i,j,k) = SQRTTWO *
004d5ee949 Davi*0359 & SQRTTKE(i,j,k)/SQRT( MAX(Nsquare(i,j,k),GGL90eps) )
f18a893d42 Mart*0360 & * mskLoc
004d5ee949 Davi*0361 ENDDO
0362 ENDDO
0363 ENDDO
0364
b038e3cc4f Mart*0365 CALL GGL90_MIXINGLENGTH(
0366 U GGL90mixingLength,
0367 #ifdef ALLOW_GGL90_LANGMUIR
0368 O LCmixingLength,
dd9d13d532 Mart*0369 #endif
b038e3cc4f Mart*0370 O rMixingLength,
0371 I iMin ,iMax ,jMin ,jMax,
0372 I bi, bj, myTime, myIter, myThid )
0320e25227 Mart*0373 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0374
b038e3cc4f Mart*0375
0376 # ifdef ALLOW_GGL90_LANGMUIR
0377
0378 # endif
0320e25227 Mart*0379 #endif
9293d3c672 Hajo*0380
b038e3cc4f Mart*0381
004d5ee949 Davi*0382 DO k=2,Nr
f688417df1 Jean*0383 km1 = k-1
b038e3cc4f Mart*0384 #ifdef ALLOW_AUTODIFF_TAMC
0385 kkey = k + (tkey-1)*Nr
0386 #endif
f688417df1 Jean*0387 #ifdef ALLOW_GGL90_HORIZDIFF
0320e25227 Mart*0388 IF ( GGL90diffTKEh .GT. 0. _d 0 ) THEN
94c8eb5701 Jean*0389
0390
76f580e1f0 Mart*0391
dc6107c029 Jean*0392 DO j=1-OLy,sNy+OLy
0393 DO i=1-OLx,sNx+OLx
198cdce361 Mart*0394 xA(i,j) = _dyG(i,j,bi,bj)*drC(k)*
0320e25227 Mart*0395 & (MIN(.5 _d 0,_hFacW(i,j,km1,bi,bj) ) +
0396 & MIN(.5 _d 0,_hFacW(i,j,k ,bi,bj) ) )
198cdce361 Mart*0397 yA(i,j) = _dxG(i,j,bi,bj)*drC(k)*
0320e25227 Mart*0398 & (MIN(.5 _d 0,_hFacS(i,j,km1,bi,bj) ) +
0399 & MIN(.5 _d 0,_hFacS(i,j,k ,bi,bj) ) )
76f580e1f0 Mart*0400 ENDDO
94c8eb5701 Jean*0401 ENDDO
76f580e1f0 Mart*0402
0403
dc6107c029 Jean*0404 DO j=1-OLy,sNy+OLy
0405 dfx(1-OLx,j)=0. _d 0
0406 DO i=1-OLx+1,sNx+OLx
76f580e1f0 Mart*0407 dfx(i,j) = -GGL90diffTKEh*xA(i,j)
0408 & *_recip_dxC(i,j,bi,bj)
0409 & *(GGL90TKE(i,j,k,bi,bj)-GGL90TKE(i-1,j,k,bi,bj))
198cdce361 Mart*0410 #ifdef ISOTROPIC_COS_SCALING
76f580e1f0 Mart*0411 & *CosFacU(j,bi,bj)
198cdce361 Mart*0412 #endif /* ISOTROPIC_COS_SCALING */
76f580e1f0 Mart*0413 ENDDO
0414 ENDDO
0415
25c8af7c05 Jean*0416 DO i=1-OLx,sNx+OLx
dc6107c029 Jean*0417 dfy(i,1-OLy)=0. _d 0
76f580e1f0 Mart*0418 ENDDO
dc6107c029 Jean*0419 DO j=1-OLy+1,sNy+OLy
0420 DO i=1-OLx,sNx+OLx
76f580e1f0 Mart*0421 dfy(i,j) = -GGL90diffTKEh*yA(i,j)
0422 & *_recip_dyC(i,j,bi,bj)
0423 & *(GGL90TKE(i,j,k,bi,bj)-GGL90TKE(i,j-1,k,bi,bj))
0424 #ifdef ISOTROPIC_COS_SCALING
0425 & *CosFacV(j,bi,bj)
0426 #endif /* ISOTROPIC_COS_SCALING */
0427 ENDDO
94c8eb5701 Jean*0428 ENDDO
76f580e1f0 Mart*0429
dc6107c029 Jean*0430 DO j=1-OLy,sNy+OLy-1
0431 DO i=1-OLx,sNx+OLx-1
31a3206180 Mart*0432 gTKE(i,j) = -recip_drC(k)*recip_rA(i,j,bi,bj)
cdafb98dea Mart*0433 & *recip_hFacI(i,j,k)
198cdce361 Mart*0434 & *((dfx(i+1,j)-dfx(i,j))
cdafb98dea Mart*0435 & + (dfy(i,j+1)-dfy(i,j)) )
94c8eb5701 Jean*0436 ENDDO
76f580e1f0 Mart*0437 ENDDO
cdafb98dea Mart*0438
f688417df1 Jean*0439 ENDIF
0440 #endif /* ALLOW_GGL90_HORIZDIFF */
0441
cdafb98dea Mart*0442
9293d3c672 Hajo*0443 #ifdef ALLOW_GGL90_LANGMUIR
0444 IF (useLANGMUIR) THEN
0445 DO j=jMin,jMax
0446 DO i=iMin,iMax
0447 KappaM(i,j) = GGL90ck*LCmixingLength(i,j,k)*SQRTTKE(i,j,k)
0448 ENDDO
0449 ENDDO
0450 ELSE
0451 #endif
0452 DO j=jMin,jMax
0453 DO i=iMin,iMax
0454 KappaM(i,j) = GGL90ck*GGL90mixingLength(i,j,k)*SQRTTKE(i,j,k)
0455 #ifdef ALLOW_GGL90_LANGMUIR
0456 ENDDO
0457 ENDDO
0458 ENDIF
f688417df1 Jean*0459 DO j=jMin,jMax
0460 DO i=iMin,iMax
9293d3c672 Hajo*0461 #endif
0320e25227 Mart*0462 GGL90visctmp(i,j,k) = MAX( KappaM(i,j),diffKrNrS(k)
0463 & * recip_coordFac*recip_coordFac )
0464 & * maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
305c472a49 Jean*0465
0466
0320e25227 Mart*0467 KappaM(i,j) = MAX( KappaM(i,j),viscArNr(k)
0468 & * recip_coordFac*recip_coordFac )
0469 & * maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
cdafb98dea Mart*0470 ENDDO
0471 ENDDO
31a3206180 Mart*0472
63bbd437b1 Jean*0473
0474 IF ( calcMeanVertShear ) THEN
0475
0476 DO j=jMin,jMax
0477 DO i=iMin,iMax
0478 tempU = ( uVel( i ,j,km1,bi,bj) - uVel( i ,j,k,bi,bj) )
0479 tempUp = ( uVel(i+1,j,km1,bi,bj) - uVel(i+1,j,k,bi,bj) )
0480 tempV = ( vVel(i, j ,km1,bi,bj) - vVel(i, j ,k,bi,bj) )
0481 tempVp = ( vVel(i,j+1,km1,bi,bj) - vVel(i,j+1,k,bi,bj) )
0482 verticalShear(i,j) = (
31f96e9372 Jean*0483 & ( tempU*tempU + tempUp*tempUp )
0484 & + ( tempV*tempV + tempVp*tempVp )
0485 & )*halfRL*recip_drC(k)*recip_drC(k)
0320e25227 Mart*0486 & *coordFac*coordFac
63bbd437b1 Jean*0487 ENDDO
0488 ENDDO
0489 ELSE
0490
0491 DO j=jMin,jMax
0492 DO i=iMin,iMax
0493 tempU = ( ( uVel(i,j,km1,bi,bj) + uVel(i+1,j,km1,bi,bj) )
0494 & -( uVel(i,j,k ,bi,bj) + uVel(i+1,j,k ,bi,bj) )
0495 & )*halfRL*recip_drC(k)
0320e25227 Mart*0496 & *coordFac
63bbd437b1 Jean*0497 tempV = ( ( vVel(i,j,km1,bi,bj) + vVel(i,j+1,km1,bi,bj) )
0498 & -( vVel(i,j,k ,bi,bj) + vVel(i,j+1,k ,bi,bj) )
0499 & )*halfRL*recip_drC(k)
0320e25227 Mart*0500 & *coordFac
63bbd437b1 Jean*0501 verticalShear(i,j) = tempU*tempU + tempV*tempV
0502 ENDDO
0503 ENDDO
0504 ENDIF
b038e3cc4f Mart*0505 #ifdef ALLOW_AUTODIFF_TAMC
0506
0507
0508 #endif /* ALLOW_AUTODIFF_TAMC */
63bbd437b1 Jean*0509
9293d3c672 Hajo*0510 #ifdef ALLOW_GGL90_LANGMUIR
0511 IF (useLANGMUIR) THEN
0512
0513 depthFac = recip_Lasq*EXP( recip_LD*rF(k) )
0514 DO j=1-OLy,sNy+OLy
0515 DO i=1-OLx,sNx+OLx
ee5f92f083 mjlo*0516 dstokesUdR(i,j) = recip_LD * uStar(i,j) * depthFac
0517 dstokesVdR(i,j) = recip_LD * vStar(i,j) * depthFac
9293d3c672 Hajo*0518 ENDDO
0519 ENDDO
0520
0521 IF ( calcMeanVertShear ) THEN
0522
0523
0524 DO j=jMin,jMax
0525 DO i=iMin,iMax
0526 tempU = ( uVel( i ,j,km1,bi,bj) - uVel( i ,j,k,bi,bj) )
0527 tempUp = ( uVel(i+1,j,km1,bi,bj) - uVel(i+1,j,k,bi,bj) )
0528 tempV = ( vVel(i, j ,km1,bi,bj) - vVel(i, j ,k,bi,bj) )
0529 tempVp = ( vVel(i,j+1,km1,bi,bj) - vVel(i,j+1,k,bi,bj) )
0530 stokesterm(i,j) = (
0531 & ( tempU *dstokesUdR(i,j)
0532 & +tempUp*dstokesUdR(i+1,j) )
0533 & +( tempV *dstokesVdR(i,j)
0534 & +tempVp*dstokesVdR(i,j+1) )
0535 & )*halfRL*recip_drC(k)*coordFac*coordFac
0536 ENDDO
0537 ENDDO
0538 ELSE
0539
0540 DO j=jMin,jMax
0541 DO i=iMin,iMax
0542 tempU = ( ( uVel(i,j,km1,bi,bj) + uVel(i+1,j,km1,bi,bj) )
0543 & -( uVel(i,j,k ,bi,bj) + uVel(i+1,j,k ,bi,bj) )
0544 & )*halfRL*recip_drC(k)
0545 & *coordFac
0546 tempV = ( ( vVel(i,j,km1,bi,bj) + vVel(i,j+1,km1,bi,bj) )
0547 & -( vVel(i,j,k ,bi,bj) + vVel(i,j+1,k ,bi,bj) )
0548 & )*halfRL*recip_drC(k)
0549 & *coordFac
0550 stokesterm(i,j) = halfRL*coordFac*(
0551 & tempU*(dstokesUdR(i,j)+dstokesUdR(i+1,j))
0552 & + tempV*(dstokesVdR(i,j)+dstokesVdR(i,j+1))
0553 & )
0554 ENDDO
0555 ENDDO
0556 ENDIF
0557 ENDIF
0558 # ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0559
9293d3c672 Hajo*0560 # endif
0561 #endif /* ALLOW_GGL90_LANGMUIR */
0562
5b0716a6b3 Mart*0563
31a3206180 Mart*0564 #ifdef ALLOW_GGL90_IDEMIX
cdafb98dea Mart*0565 IF ( useIDEMIX ) THEN
63bbd437b1 Jean*0566 DO j=jMin,jMax
0567 DO i=iMin,iMax
0568 RiNumber = MAX(Nsquare(i,j,k),0. _d 0)
0569 & /(verticalShear(i,j)+GGL90eps)
0570 IDEMIX_RiNumber = MAX( KappaM(i,j)*Nsquare(i,j,k), 0. _d 0)/
31f96e9372 Jean*0571 & ( GGL90eps + IDEMIX_gTKE(i,j,k) )
5b0716a6b3 Mart*0572 prTemp = 6.6 _d 0 * MIN( RiNumber, IDEMIX_RiNumber )
63bbd437b1 Jean*0573 TKEPrandtlNumber(i,j,k) = MIN(10. _d 0,prTemp)
0320e25227 Mart*0574 TKEPrandtlNumber(i,j,k) = MAX( oneRL,TKEPrandtlNumber(i,j,k) )
63bbd437b1 Jean*0575 ENDDO
cdafb98dea Mart*0576 ENDDO
0577 ELSE
0578 #endif /* ALLOW_GGL90_IDEMIX */
63bbd437b1 Jean*0579 DO j=jMin,jMax
0580 DO i=iMin,iMax
0581 RiNumber = MAX(Nsquare(i,j,k),0. _d 0)
0582 & /(verticalShear(i,j)+GGL90eps)
0583 prTemp = 1. _d 0
0584 IF ( RiNumber .GE. 0.2 _d 0 ) prTemp = 5. _d 0 * RiNumber
0585 TKEPrandtlNumber(i,j,k) = MIN(10. _d 0,prTemp)
0586 ENDDO
cdafb98dea Mart*0587 ENDDO
f2a88c9ff8 jm-c 0588 #ifdef ALLOW_GGL90_IDEMIX
cdafb98dea Mart*0589 ENDIF
f2a88c9ff8 jm-c 0590 #endif /* ALLOW_GGL90_IDEMIX */
b038e3cc4f Mart*0591 #ifdef ALLOW_AUTODIFF_TAMC
0592
0593 #endif /* ALLOW_AUTODIFF_TAMC */
31a3206180 Mart*0594
cdafb98dea Mart*0595 DO j=jMin,jMax
0596 DO i=iMin,iMax
305c472a49 Jean*0597
cdafb98dea Mart*0598 KappaH = KappaM(i,j)/TKEPrandtlNumber(i,j,k)
0320e25227 Mart*0599 KappaE(i,j,k) = GGL90alpha * KappaM(i,j)
0600 & * maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
f688417df1 Jean*0601
0602
0603 TKEdissipation = explDissFac*GGL90ceps
0604 & *SQRTTKE(i,j,k)*rMixingLength(i,j,k)
0605 & *GGL90TKE(i,j,k,bi,bj)
0606
0607 GGL90TKE(i,j,k,bi,bj) = GGL90TKE(i,j,k,bi,bj)
0320e25227 Mart*0608 & + deltaTloc*(
cdafb98dea Mart*0609 & + KappaM(i,j)*verticalShear(i,j)
f688417df1 Jean*0610 & - KappaH*Nsquare(i,j,k)
0611 & - TKEdissipation
0612 & )
0613 ENDDO
76f580e1f0 Mart*0614 ENDDO
f688417df1 Jean*0615
cdafb98dea Mart*0616 #ifdef ALLOW_GGL90_IDEMIX
0617 IF ( useIDEMIX ) THEN
0618
0619 DO j=jMin,jMax
0620 DO i=iMin,iMax
0621 GGL90TKE(i,j,k,bi,bj) = GGL90TKE(i,j,k,bi,bj)
31f96e9372 Jean*0622 & + deltaTloc*IDEMIX_gTKE(i,j,k)
cdafb98dea Mart*0623 ENDDO
0624 ENDDO
0625 ENDIF
0626 #endif /* ALLOW_GGL90_IDEMIX */
0627
9293d3c672 Hajo*0628 #ifdef ALLOW_GGL90_LANGMUIR
0629 IF ( useLANGMUIR ) THEN
9af873c532 Hajo*0630
9293d3c672 Hajo*0631 DO j=jMin,jMax
0632 DO i=iMin,iMax
0633 GGL90TKE(i,j,k,bi,bj) = GGL90TKE(i,j,k,bi,bj)
0634 & + deltaTloc*(KappaM(i,j)*stokesterm(i,j))
0635 ENDDO
0636 ENDDO
0637 ENDIF
0638 #endif /* ALLOW_GGL90_LANGMUIR */
0639
f688417df1 Jean*0640 #ifdef ALLOW_GGL90_HORIZDIFF
0641 IF ( GGL90diffTKEh .GT. 0. _d 0 ) THEN
0642
0643 DO j=jMin,jMax
0644 DO i=iMin,iMax
0645 GGL90TKE(i,j,k,bi,bj) = GGL90TKE(i,j,k,bi,bj)
0320e25227 Mart*0646 & + gTKE(i,j)*deltaTloc
f688417df1 Jean*0647 ENDDO
0648 ENDDO
0649 ENDIF
76f580e1f0 Mart*0650 #endif /* ALLOW_GGL90_HORIZDIFF */
0651
f688417df1 Jean*0652
0653 ENDDO
0320e25227 Mart*0654 IF ( usingPCoords ) THEN
0655
0656 DO j=jMin,jMax
0657 DO i=iMin,iMax
0658 GGL90TKE(i,j,1,bi,bj) = 0. _d 0
0659 ENDDO
0660 ENDDO
0661 ENDIF
f688417df1 Jean*0662
0320e25227 Mart*0663
76f580e1f0 Mart*0664
0320e25227 Mart*0665
0666
0667
0668
89474f9a5c Mart*0669
76f580e1f0 Mart*0670
89474f9a5c Mart*0671 DO j=jMin,jMax
0672 DO i=iMin,iMax
909cdb2275 Jean*0673 a3d(i,j,1) = 0. _d 0
89474f9a5c Mart*0674 ENDDO
0675 ENDDO
0676 DO k=2,Nr
5b0716a6b3 Mart*0677 #ifdef GGL90_MISSING_HFAC_BUG
0678 IF ( .NOT.useIDEMIX ) THEN
0679 DO j=1-OLy,sNy+OLy
0680 DO i=1-OLx,sNx+OLx
0681 recip_hFacI(i,j,k) = oneRS
0682 ENDDO
0683 ENDDO
0684 ENDIF
0685 #endif
37a95f6b42 Davi*0686 km1=MAX(2,k-1)
89474f9a5c Mart*0687 DO j=jMin,jMax
0688 DO i=iMin,iMax
0320e25227 Mart*0689 IF ( usingPCoords) km1=MIN(Nr,MAX(kSurfC(i,j,bi,bj)+1,k-1))
37a95f6b42 Davi*0690
0691
0692
0320e25227 Mart*0693 a3d(i,j,k) = -deltaTloc
004d5ee949 Davi*0694 & *recip_drF(k-1)*recip_hFacC(i,j,k-1,bi,bj)
73c2f90ab3 Davi*0695 & *.5 _d 0*(KappaE(i,j, k )+KappaE(i,j,km1))
5b0716a6b3 Mart*0696 & *recip_drC(k)*maskC(i,j,k,bi,bj)*recip_hFacI(i,j,k)
0320e25227 Mart*0697 & *coordFac*coordFac
89474f9a5c Mart*0698 ENDDO
0699 ENDDO
0700 ENDDO
76f580e1f0 Mart*0701
89474f9a5c Mart*0702 DO j=jMin,jMax
0703 DO i=iMin,iMax
909cdb2275 Jean*0704 c3d(i,j,1) = 0. _d 0
89474f9a5c Mart*0705 ENDDO
0706 ENDDO
004d5ee949 Davi*0707 DO k=2,Nr
0320e25227 Mart*0708 kp1=MIN(k+1,Nr)
89474f9a5c Mart*0709 DO j=jMin,jMax
0710 DO i=iMin,iMax
0320e25227 Mart*0711 IF ( usingZCoords ) kp1=MAX(1,MIN(klowC(i,j,bi,bj),k+1))
37a95f6b42 Davi*0712
0713
0714
0320e25227 Mart*0715 c3d(i,j,k) = -deltaTloc
5b0716a6b3 Mart*0716 & *recip_drF( k ) * recip_hFacC(i,j,k,bi,bj)
0717 & *.5 _d 0*(KappaE(i,j,k)+KappaE(i,j,kp1))
0718 & *recip_drC(k)*maskC(i,j,k-1,bi,bj)*recip_hFacI(i,j,k)
0719 & *coordFac*coordFac
89474f9a5c Mart*0720 ENDDO
0721 ENDDO
0722 ENDDO
31a3206180 Mart*0723
0724 IF (.NOT.GGL90_dirichlet) THEN
0725
0320e25227 Mart*0726 IF ( usingPCoords ) THEN
0727 DO j=jMin,jMax
0728 DO i=iMin,iMax
0729 kBot = MIN(kSurfC(i,j,bi,bj)+1,Nr)
0730 a3d(i,j,kBot) = 0. _d 0
0731 ENDDO
31a3206180 Mart*0732 ENDDO
0320e25227 Mart*0733 ELSE
0734 DO j=jMin,jMax
0735 DO i=iMin,iMax
0736 kBot = MAX(kLowC(i,j,bi,bj),1)
0737 c3d(i,j,kBot) = 0. _d 0
0738 ENDDO
0739 ENDDO
0740 ENDIF
31a3206180 Mart*0741 ENDIF
0742
76f580e1f0 Mart*0743
89474f9a5c Mart*0744 DO k=1,Nr
37a95f6b42 Davi*0745 km1 = MAX(k-1,1)
89474f9a5c Mart*0746 DO j=jMin,jMax
0747 DO i=iMin,iMax
cdafb98dea Mart*0748 b3d(i,j,k) = 1. _d 0 - c3d(i,j,k) - a3d(i,j,k)
0320e25227 Mart*0749 & + implDissFac*deltaTloc*GGL90ceps*SQRTTKE(i,j,k)
f688417df1 Jean*0750 & * rMixingLength(i,j,k)
37a95f6b42 Davi*0751 & * maskC(i,j,k,bi,bj)*maskC(i,j,km1,bi,bj)
cdafb98dea Mart*0752 ENDDO
89474f9a5c Mart*0753 ENDDO
0754 ENDDO
0320e25227 Mart*0755 IF ( usingPCoords ) THEN
0756
0757 DO j=jMin,jMax
0758 DO i=iMin,iMax
0759 b3d(i,j,1) = 1. _d 0
0760 ENDDO
0761 ENDDO
0762 ENDIF
89474f9a5c Mart*0763
0764
0765
31f96e9372 Jean*0766 IF ( calcMeanVertShear ) THEN
0767
0768 DO j=jMin,jMax
0769 DO i=iMin,iMax
0770 tempU = surfaceForcingU( i ,j,bi,bj)
0771 tempUp = surfaceForcingU(i+1,j,bi,bj)
0772 tempV = surfaceForcingV(i, j ,bi,bj)
0773 tempVp = surfaceForcingV(i,j+1,bi,bj)
b038e3cc4f Mart*0774 uStarSquare(i,j) =
31f96e9372 Jean*0775 & ( tempU*tempU + tempUp*tempUp
0776 & + tempV*tempV + tempVp*tempVp
b038e3cc4f Mart*0777 & )*halfRL
31f96e9372 Jean*0778
b038e3cc4f Mart*0779
31f96e9372 Jean*0780
0781
b038e3cc4f Mart*0782
31f96e9372 Jean*0783
0784 ENDDO
0785 ENDDO
0786 ELSE
0787 DO j=jMin,jMax
0788 DO i=iMin,iMax
89474f9a5c Mart*0789
b038e3cc4f Mart*0790 uStarSquare(i,j) =
31f96e9372 Jean*0791 & ( .5 _d 0*( surfaceForcingU(i, j, bi,bj)
0792 & + surfaceForcingU(i+1,j, bi,bj) ) )**2
0793 & + ( .5 _d 0*( surfaceForcingV(i, j, bi,bj)
0794 & + surfaceForcingV(i, j+1,bi,bj) ) )**2
0795 ENDDO
89474f9a5c Mart*0796 ENDDO
31f96e9372 Jean*0797 ENDIF
f18a893d42 Mart*0798 #ifdef ALLOW_SHELFICE
0799
0800
0801
0802
0803 IF ( useSHELFICE .AND.
0804 & ( no_slip_shelfice .OR. SHELFICEDragLinear.NE.zeroRL
0805 & .OR. SHELFICEselectDragQuadr.GE.0 )
0806 & ) THEN
0807
0808
0809
0810
0811
0812 DO j=1-OLy,sNy+OLy
0813 DO i=1-OLx,sNx+OLx
0814 stressU(i,j) = 0. _d 0
0815 stressV(i,j) = 0. _d 0
0816 ENDDO
0817 ENDDO
0818 DO k=1,Nr+1
0819 ki = MIN(k,Nr)
0820 DO j=1-OLy,sNy+OLy
0821 DO i=1-OLx,sNx+OLx
0822 kappaRX(i,j,k) = viscArNr(ki)
0823 ENDDO
0824 ENDDO
0825 ENDDO
0826 DO k=1,Nr
0827 DO j=1-OLy,sNy+OLy
0828 DO i=1-OLx,sNx+OLx
0829 KE (i,j) = 0. _d 0
0830 uFld(i,j) = uVel(i,j,k,bi,bj)
0831 vFld(i,j) = vVel(i,j,k,bi,bj)
0832 ENDDO
0833 ENDDO
0834 CALL SHELFICE_U_DRAG_COEFF( bi, bj, k, .FALSE.,
0835 I uFld, vFld, kappaRX, KE,
0836 O cDragU,
0837 I myIter, myThid )
0838 CALL SHELFICE_V_DRAG_COEFF( bi, bj, k, .FALSE.,
0839 I uFld, vFld, kappaRX, KE,
0840 O cDragV,
0841 I myIter, myThid )
0842
0843 DO j=1-OLy,sNy+OLy
0844 DO i=1-OLx,sNx+OLx
0845 stressU(i,j) = stressU(i,j) - cDragU(i,j)*uFld(i,j)*rUnit2mass
0846 stressV(i,j) = stressV(i,j) - cDragV(i,j)*vFld(i,j)*rUnit2mass
0847 ENDDO
0848 ENDDO
0849 ENDDO
0850
0851 DO j=jMin,jMax
09a9aa1d4d Mich*0852 DO i=iMin,iMax
f18a893d42 Mart*0853 IF ( kTopC(i,j,bi,bj) .GT. 0 ) THEN
b038e3cc4f Mart*0854 uStarSquare(i,j) =
f18a893d42 Mart*0855 & ( stressU(i,j)*stressU(i,j)+stressU(i+1,j)*stressU(i+1,j)
0856 & + stressV(i,j)*stressV(i,j)+stressV(i,j+1)*stressV(i,j+1)
b038e3cc4f Mart*0857 & )*halfRL
f18a893d42 Mart*0858 ENDIF
0859 ENDDO
0860 ENDDO
0861 ENDIF
0862 #endif
b038e3cc4f Mart*0863 #ifdef ALLOW_AUTODIFF_TAMC
0864
0865 #endif
0866 DO j=jMin,jMax
0867 DO i=iMin,iMax
0868 #ifdef ALLOW_AUTODIFF
0869 IF ( uStarSquare(i,j) .GT. zeroRL )
0870 & uStarSquare(i,j) = SQRT(uStarSquare(i,j))*recip_coordFac
0871 #else
0872 uStarSquare(i,j) = SQRT(uStarSquare(i,j))*recip_coordFac
0873 #endif
0874 ENDDO
0875 ENDDO
0876 #ifdef ALLOW_AUTODIFF_TAMC
0877
0878
0879
0880
0881
0882 #endif
f18a893d42 Mart*0883
0320e25227 Mart*0884
0885 IF ( usingPCoords ) THEN
0886 DO j=jMin,jMax
0887 DO i=iMin,iMax
f18a893d42 Mart*0888
0889
0890
0891
0892
0893
0320e25227 Mart*0894 GGL90TKE(i,j,kSrf,bi,bj) = GGL90TKE(i,j,kSrf,bi,bj)
0895 & - c3d(i,j,kSrf) * maskC(i,j,kSrf,bi,bj)
0896 & *MAX(GGL90TKEsurfMin,GGL90m2*uStarSquare(i,j))
0897 c3d(i,j,kSrf) = 0. _d 0
0898 ENDDO
0899 ENDDO
0900 ELSE
31a3206180 Mart*0901 DO j=jMin,jMax
0902 DO i=iMin,iMax
f18a893d42 Mart*0903 #ifdef ALLOW_SHELFICE
0904 IF ( useShelfIce ) THEN
0905 kSrf = MAX(1,kTopC(i,j,bi,bj))
0906 kTop = MIN(kSrf+1,Nr)
0907 ENDIF
0908 #endif
0320e25227 Mart*0909 GGL90TKE(i,j,kSrf,bi,bj) = maskC(i,j,kSrf,bi,bj)
0910 & *MAX(GGL90TKEsurfMin,GGL90m2*uStarSquare(i,j))
0911 GGL90TKE(i,j,kTop,bi,bj) = GGL90TKE(i,j,kTop,bi,bj)
0912 & - a3d(i,j,kTop)*GGL90TKE(i,j,kSrf,bi,bj)
0913 a3d(i,j,kTop) = 0. _d 0
31a3206180 Mart*0914 ENDDO
0915 ENDDO
0916 ENDIF
0917
0320e25227 Mart*0918 IF (GGL90_dirichlet) THEN
0919
0920 IF ( usingPCoords ) THEN
0921 DO j=jMin,jMax
0922 DO i=iMin,iMax
0923 kBot = MIN(kSurfC(i,j,bi,bj)+1,Nr)
0924 GGL90TKE(i,j,kBot,bi,bj) = GGL90TKE(i,j,kBot,bi,bj)
0925 & - GGL90TKEbottom*a3d(i,j,kBot)
0926 a3d(i,j,kBot) = 0. _d 0
0927 ENDDO
0928 ENDDO
0929 ELSE
0930 DO j=jMin,jMax
0931 DO i=iMin,iMax
0932 kBot = MAX(kLowC(i,j,bi,bj),1)
0933 GGL90TKE(i,j,kBot,bi,bj) = GGL90TKE(i,j,kBot,bi,bj)
0934 & - GGL90TKEbottom*c3d(i,j,kBot)
0935 c3d(i,j,kBot) = 0. _d 0
0936 ENDDO
0937 ENDDO
0938 ENDIF
0939 ENDIF
0940
dd9d13d532 Mart*0941 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0942
dd9d13d532 Mart*0943 #endif
f688417df1 Jean*0944
fa8d87e2db Jean*0945 errCode = -1
37a95f6b42 Davi*0946 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
909cdb2275 Jean*0947 I a3d, b3d, c3d,
8a58850ca8 Jean*0948 U GGL90TKE(1-OLx,1-OLy,1,bi,bj),
37a95f6b42 Davi*0949 O errCode,
f688417df1 Jean*0950 I bi, bj, myThid )
f5bf4b6e4b Jean*0951
dd9d13d532 Mart*0952 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0953
dd9d13d532 Mart*0954 #endif
0320e25227 Mart*0955 DO k=2,Nr
5b0716a6b3 Mart*0956 #if ( defined ALLOW_DIAGNOSTICS &&
0957
0958 IF ( doDiagTKEmin ) THEN
0959 DO j=1,sNy
0960 DO i=1,sNx
0961 surf_flx_tke(i,j) = GGL90TKE(i,j,k,bi,bj)
0962 & * maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
0963 ENDDO
0964 ENDDO
0965 ENDIF
0966 #endif
f688417df1 Jean*0967 DO j=jMin,jMax
0968 DO i=iMin,iMax
0320e25227 Mart*0969
0970
0971
0972 GGL90TKE(i,j,k,bi,bj) = maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
f688417df1 Jean*0973 & *MAX( GGL90TKE(i,j,k,bi,bj), GGL90TKEmin )
89474f9a5c Mart*0974 ENDDO
0975 ENDDO
5b0716a6b3 Mart*0976 #if ( defined ALLOW_DIAGNOSTICS &&
0977 IF ( doDiagTKEmin ) THEN
0978 recip_deltaT = 1. _d 0 / deltaTloc
0979 DO j=1,sNy
0980 DO i=1,sNx
0981 surf_flx_tke(i,j) = (GGL90TKE(i,j,k,bi,bj)-surf_flx_tke(i,j))
0982 & *recip_deltaT
0983 ENDDO
0984 ENDDO
0985 CALL DIAGNOSTICS_FILL( surf_flx_tke ,'GGL90Emn',
0986 & k, 1, 2, bi, bj, myThid )
0987 ENDIF
0988 #endif
94c8eb5701 Jean*0989 ENDDO
004d5ee949 Davi*0990
76f580e1f0 Mart*0991
0992
004d5ee949 Davi*0993
f688417df1 Jean*0994 DO k=2,Nr
f18a893d42 Mart*0995 #ifdef ALLOW_GGL90_SMOOTH
0996 DO j=1-OLy,sNy+OLy
0997 DO i=1-OLx,sNx+OLx
0998 maskI(i,j) = maskC(i,j,k,bi,bj)*maskC(i,j,k-1,bi,bj)
0999 & *mskCor(i,j,bi,bj)
1000 GGL90visctmp(i,j,k) = GGL90visctmp(i,j,k)*mskCor(i,j,bi,bj)
1001 ENDDO
1002 ENDDO
1003 #endif
f688417df1 Jean*1004 DO j=1,sNy
1005 DO i=1,sNx
f6b150f7f1 Gael*1006 #ifdef ALLOW_GGL90_SMOOTH
63bbd437b1 Jean*1007 tmpVisc = (
f18a893d42 Mart*1008 & p4 * GGL90visctmp(i ,j ,k)
1009 & +p8 *( ( GGL90visctmp(i-1,j ,k) + GGL90visctmp(i+1,j ,k) )
1010 & + ( GGL90visctmp(i ,j-1,k) + GGL90visctmp(i ,j+1,k) ) )
1011 & +p16*( ( GGL90visctmp(i+1,j+1,k) + GGL90visctmp(i-1,j-1,k) )
1012 & + ( GGL90visctmp(i+1,j-1,k) + GGL90visctmp(i-1,j+1,k) ) )
63bbd437b1 Jean*1013 & )/(
1014 & p4
f18a893d42 Mart*1015 & +p8 *(( maskI(i-1,j ) + maskI(i+1,j ) )
1016 & +( maskI(i ,j-1) + maskI(i ,j+1) ) )
1017 & +p16*(( maskI(i+1,j+1) + maskI(i-1,j-1) )
1018 & +( maskI(i+1,j-1) + maskI(i-1,j+1) ) )
1019 & )*maskI(i,j)
f6b150f7f1 Gael*1020 #else
f688417df1 Jean*1021 tmpVisc = GGL90visctmp(i,j,k)
f6b150f7f1 Gael*1022 #endif
1023 tmpVisc = MIN(tmpVisc/TKEPrandtlNumber(i,j,k),GGL90diffMax)
0320e25227 Mart*1024 & * coordFac*coordFac
78524d1402 Jean*1025 GGL90diffKr(i,j,k,bi,bj)= MAX( tmpVisc , diffKrNrS(k) )
f6b150f7f1 Gael*1026 ENDDO
1027 ENDDO
1028
f688417df1 Jean*1029 DO j=1,sNy
1030 DO i=1,sNx+1
f6b150f7f1 Gael*1031 #ifdef ALLOW_GGL90_SMOOTH
63bbd437b1 Jean*1032 tmpVisc = (
f18a893d42 Mart*1033 & p4 *( GGL90visctmp(i-1,j ,k) + GGL90visctmp(i,j ,k) )
1034 & +p8 *( ( GGL90visctmp(i-1,j-1,k) + GGL90visctmp(i,j-1,k) )
1035 & + ( GGL90visctmp(i-1,j+1,k) + GGL90visctmp(i,j+1,k) ) )
63bbd437b1 Jean*1036 & )/(
1037 & p4 * 2. _d 0
f18a893d42 Mart*1038 & +p8 *(( maskI(i-1,j-1) + maskI(i,j-1) )
1039 & +( maskI(i-1,j+1) + maskI(i,j+1) ) )
1040 & )*maskI(i-1,j) * maskI(i,j)
f6b150f7f1 Gael*1041 #else
f18a893d42 Mart*1042 tmpVisc = _maskW(i,j,k-1,bi,bj) * _maskW(i,j,k,bi,bj) * halfRL
63bbd437b1 Jean*1043 & *( GGL90visctmp(i-1,j,k)
0320e25227 Mart*1044 & + GGL90visctmp(i, j,k) )
f6b150f7f1 Gael*1045 #endif
63bbd437b1 Jean*1046 tmpVisc = MIN( tmpVisc , GGL90viscMax )
0320e25227 Mart*1047 & * coordFac*coordFac
63bbd437b1 Jean*1048 GGL90viscArU(i,j,k,bi,bj) = MAX( tmpVisc, viscArNr(k) )
004d5ee949 Davi*1049 ENDDO
1050 ENDDO
f6b150f7f1 Gael*1051
f688417df1 Jean*1052 DO j=1,sNy+1
1053 DO i=1,sNx
f6b150f7f1 Gael*1054 #ifdef ALLOW_GGL90_SMOOTH
63bbd437b1 Jean*1055 tmpVisc = (
f18a893d42 Mart*1056 & p4 *( GGL90visctmp(i ,j-1,k) + GGL90visctmp(i ,j,k) )
1057 & +p8 *( ( GGL90visctmp(i-1,j-1,k) + GGL90visctmp(i-1,j,k) )
1058 & + ( GGL90visctmp(i+1,j-1,k) + GGL90visctmp(i+1,j,k) ) )
63bbd437b1 Jean*1059 & )/(
1060 & p4 * 2. _d 0
f18a893d42 Mart*1061 & +p8 *(( maskI(i-1,j-1) + maskI(i-1,j) )
1062 & +( maskI(i+1,j-1) + maskI(i+1,j) ) )
1063 & )*maskI(i,j-1) * maskI(i,j)
f6b150f7f1 Gael*1064 #else
f18a893d42 Mart*1065 tmpVisc = _maskS(i,j,k-1,bi,bj) * _maskS(i,j,k,bi,bj) * halfRL
63bbd437b1 Jean*1066 & *( GGL90visctmp(i,j-1,k)
0320e25227 Mart*1067 & + GGL90visctmp(i,j, k) )
004d5ee949 Davi*1068 #endif
63bbd437b1 Jean*1069 tmpVisc = MIN( tmpVisc , GGL90viscMax )
0320e25227 Mart*1070 & * coordFac*coordFac
63bbd437b1 Jean*1071 GGL90viscArV(i,j,k,bi,bj) = MAX( tmpVisc, viscArNr(k) )
f6b150f7f1 Gael*1072 ENDDO
1073 ENDDO
1074 ENDDO
73c2f90ab3 Davi*1075
1076 #ifdef ALLOW_DIAGNOSTICS
1077 IF ( useDiagnostics ) THEN
305c472a49 Jean*1078 CALL DIAGNOSTICS_FILL( GGL90TKE ,'GGL90TKE',
1079 & 0,Nr, 1, bi, bj, myThid )
1080 CALL DIAGNOSTICS_FILL( GGL90viscArU,'GGL90ArU',
1081 & 0,Nr, 1, bi, bj, myThid )
1082 CALL DIAGNOSTICS_FILL( GGL90viscArV,'GGL90ArV',
1083 & 0,Nr, 1, bi, bj, myThid )
1084 CALL DIAGNOSTICS_FILL( GGL90diffKr,'GGL90Kr ',
1085 & 0,Nr, 1, bi, bj, myThid )
1086 CALL DIAGNOSTICS_FILL( TKEPrandtlNumber ,'GGL90Prl',
1087 & 0,Nr, 2, bi, bj, myThid )
9293d3c672 Hajo*1088 #ifdef ALLOW_GGL90_LANGMUIR
1089 IF (useLANGMUIR) THEN
1090 CALL DIAGNOSTICS_FILL( LCmixingLength,'GGL90Lmx',
1091 & 0,Nr, 2, bi, bj, myThid )
1092 ELSE
1093 #else
1094 IF (.TRUE.) THEN
1095 #endif /* ALLOW_GGL90_LANGMUIR */
1096 CALL DIAGNOSTICS_FILL( GGL90mixingLength,'GGL90Lmx',
1097 & 0,Nr, 2, bi, bj, myThid )
1098 ENDIF
305c472a49 Jean*1099
5b0716a6b3 Mart*1100
1101 IF ( DIAGNOSTICS_IS_ON('GGL90KN2',myThid) ) THEN
1102 DO k=1,Nr
1103 DO j=1,sNy
1104 DO i=1,sNx
1105 TKEPrandtlNumber(i,j,k) =
1106 & GGL90diffKr(i,j,k,bi,bj) * Nsquare(i,j,k)
1107 ENDDO
1108 ENDDO
1109 ENDDO
1110 CALL DIAGNOSTICS_FILL( TKEPrandtlNumber ,'GGL90KN2',
1111 & 0, Nr, 2, bi, bj, myThid )
1112 ENDIF
1113
1114 IF ( DIAGNOSTICS_IS_ON('GGL90flx',myThid) ) THEN
305c472a49 Jean*1115
5b0716a6b3 Mart*1116 IF ( usingPCoords ) THEN
1117 DO j=jMin,jMax
1118 DO i=iMin,iMax
f18a893d42 Mart*1119
1120
1121
1122
1123
1124
5b0716a6b3 Mart*1125 surf_flx_tke(i,j) =
1126 & (MAX(GGL90TKEsurfMin,GGL90m2*uStarSquare(i,j))
1127 & - GGL90TKE(i,j,kSrf,bi,bj) )
1128 & *recip_drF(kSrf)*recip_hFacC(i,j,kSrf,bi,bj)
1129 & *KappaE(i,j,kSrf)
1130 & *coordFac
1131 ENDDO
0320e25227 Mart*1132 ENDDO
5b0716a6b3 Mart*1133 ELSE
1134 DO j=jMin,jMax
1135 DO i=iMin,iMax
f18a893d42 Mart*1136 #ifdef ALLOW_SHELFICE
5b0716a6b3 Mart*1137 IF ( useShelfIce ) THEN
1138 kSrf = MAX(1,kTopC(i,j,bi,bj))
1139 kTop = MIN(kSrf+1,Nr)
1140 ENDIF
f18a893d42 Mart*1141 #endif
5b0716a6b3 Mart*1142 surf_flx_tke(i,j) =(GGL90TKE(i,j,kSrf,bi,bj)-
1143 & GGL90TKE(i,j,kTop,bi,bj))
0320e25227 Mart*1144 & *recip_drF(kSrf)*recip_hFacC(i,j,kSrf,bi,bj)
1145 & *KappaE(i,j,kTop)
5b0716a6b3 Mart*1146 ENDDO
0320e25227 Mart*1147 ENDDO
5b0716a6b3 Mart*1148 ENDIF
1149 CALL DIAGNOSTICS_FILL( surf_flx_tke,'GGL90flx',
1150 & 0, 1, 2, bi, bj, myThid )
0320e25227 Mart*1151 ENDIF
31a3206180 Mart*1152
5b0716a6b3 Mart*1153 IF ( DIAGNOSTICS_IS_ON('GGL90tau',myThid) ) THEN
1154 k=kSrf
1155 DO j=jMin,jMax
1156 DO i=iMin,iMax
f18a893d42 Mart*1157 #ifdef ALLOW_SHELFICE
5b0716a6b3 Mart*1158 IF ( useShelfIce ) k = MAX(1,kTopC(i,j,bi,bj))
f18a893d42 Mart*1159 #endif
305c472a49 Jean*1160
5b0716a6b3 Mart*1161 surf_flx_tke(i,j) =
305c472a49 Jean*1162 & halfRL*( surfaceForcingU(i, j,bi,bj)*uVel(i ,j,k,bi,bj)
1163 & +surfaceForcingU(i+1,j,bi,bj)*uVel(i+1,j,k,bi,bj))
1164 & + halfRL*( surfaceForcingV(i,j, bi,bj)*vVel(i,j ,k,bi,bj)
1165 & +surfaceForcingV(i,j+1,bi,bj)*vVel(i,j+1,k,bi,bj))
5b0716a6b3 Mart*1166 surf_flx_tke(i,j) = surf_flx_tke(i,j) *recip_coordFac
1167 ENDDO
305c472a49 Jean*1168 ENDDO
5b0716a6b3 Mart*1169 CALL DIAGNOSTICS_FILL( surf_flx_tke,'GGL90tau',
1170 & 0, 1, 2, bi, bj, myThid )
1171 ENDIF
1172
73c2f90ab3 Davi*1173 ENDIF
31a3206180 Mart*1174 #endif /* ALLOW_DIAGNOSTICS */
89474f9a5c Mart*1175
1176 #endif /* ALLOW_GGL90 */
1177
1178 RETURN
1179 END