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