File indexing completed on 2025-03-03 06:11:28 UTC
view on githubraw file Latest commit b7b61e61 on 2025-03-02 15:55:22 UTC
2fa42a6013 Alis*0001 #include "KPP_OPTIONS.h"
853c5e0e2c Jean*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
1f89baba18 Patr*0005 #ifdef ALLOW_SALT_PLUME
0006 #include "SALT_PLUME_OPTIONS.h"
0007 #endif
853c5e0e2c Jean*0008 #if (defined ALLOW_AUTODIFF_TAMC) && (defined KPP_AUTODIFF_EXCESSIVE_STORE)
0009 # define KPP_AUTODIFF_MORE_STORE
0010 #endif
2fa42a6013 Alis*0011
0012
0013
0014
0015
0016
0017
0018
0019
fe66051ebd Dimi*0020
2fa42a6013 Alis*0021
0022
0023
e750a5e49e Mart*0024
2fa42a6013 Alis*0025
956c0a5824 Patr*0026
2fa42a6013 Alis*0027
0028 SUBROUTINE KPPMIX (
edb6656069 Mart*0029 I kmtj, shsq, dvsq, ustar, msk,
0030 I bo, bosol,
63ceaaa79c Dimi*0031 #ifdef ALLOW_SALT_PLUME
edb6656069 Mart*0032 I boplume, SPDepth,
1f89baba18 Patr*0033 #ifdef SALT_PLUME_SPLIT_BASIN
edb6656069 Mart*0034 I lon, lat,
1f89baba18 Patr*0035 #endif /* SALT_PLUME_SPLIT_BASIN */
63ceaaa79c Dimi*0036 #endif /* ALLOW_SALT_PLUME */
edb6656069 Mart*0037 I dbloc, Ritop, coriol,
0038 I diffusKzS, diffusKzT,
0039 I ikey,
0040 O diffus,
0041 U ghat,
0042 O hbl,
0043 I bi, bj, myTime, myIter, myThid )
2fa42a6013 Alis*0044
956c0a5824 Patr*0045
2fa42a6013 Alis*0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 IMPLICIT NONE
0060
d2175d6909 Jean*0061 #include "SIZE.h"
0062 #include "EEPARAMS.h"
0063 #include "PARAMS.h"
0064 #include "KPP_PARAMS.h"
853c5e0e2c Jean*0065 #ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*0066 # include "tamc.h"
0067 #endif
d2175d6909 Jean*0068
2fa42a6013 Alis*0069
15fd724cec Dimi*0070
eeda3a3aa1 Jean*0071
0072
0073
edb6656069 Mart*0074
059d9fc14f Dimi*0075
25c3477f99 Mart*0076
059d9fc14f Dimi*0077
0078
0079
0080
0081
1f89baba18 Patr*0082
059d9fc14f Dimi*0083
0084
0085
0086
0087
0088
0089
0090
2fa42a6013 Alis*0091
0092
0093
15fd724cec Dimi*0094 INTEGER bi, bj
eeda3a3aa1 Jean*0095 _RL myTime
2b4c90c108 Mart*0096 INTEGER myIter
0097 INTEGER myThid
0098 INTEGER kmtj (imt )
fe66051ebd Dimi*0099 _RL shsq (imt,Nr)
0100 _RL dvsq (imt,Nr)
0101 _RL ustar (imt )
0102 _RL bo (imt )
0103 _RL bosol (imt )
63ceaaa79c Dimi*0104 #ifdef ALLOW_SALT_PLUME
1f89baba18 Patr*0105 _RL boplume (imt,Nrp1)
63ceaaa79c Dimi*0106 _RL SPDepth (imt )
1f89baba18 Patr*0107 #ifdef SALT_PLUME_SPLIT_BASIN
0108 _RL lon (imt )
0109 _RL lat (imt )
0110 #endif /* SALT_PLUME_SPLIT_BASIN */
63ceaaa79c Dimi*0111 #endif /* ALLOW_SALT_PLUME */
fe66051ebd Dimi*0112 _RL dbloc (imt,Nr)
0113 _RL Ritop (imt,Nr)
0114 _RL coriol (imt )
25c3477f99 Mart*0115 _RS msk (imt )
fe66051ebd Dimi*0116 _RL diffusKzS(imt,Nr)
0117 _RL diffusKzT(imt,Nr)
2fa42a6013 Alis*0118
edb6656069 Mart*0119 INTEGER ikey
2fa42a6013 Alis*0120
0121
0122
0123
0124
0125
0126
0127
fe66051ebd Dimi*0128 _RL diffus(imt,0:Nrp1,mdiff)
0129 _RL ghat (imt,Nr)
0130 _RL hbl (imt)
2fa42a6013 Alis*0131
0132 #ifdef ALLOW_KPP
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
2b4c90c108 Mart*0144 INTEGER kbl(imt )
fe66051ebd Dimi*0145 _RL bfsfc (imt )
0146 _RL casea (imt )
0147 _RL stable (imt )
0148 _RL dkm1 (imt, mdiff)
0149 _RL blmc (imt,Nr,mdiff)
0150 _RL sigma (imt )
0151 _RL Rib (imt,Nr )
2fa42a6013 Alis*0152
2b4c90c108 Mart*0153 INTEGER i, k, md
2fa42a6013 Alis*0154
0155
0156
0157
0158
0159
0160
0161
6d45c3b90d Patr*0162
0163
853c5e0e2c Jean*0164 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0165
0166
853c5e0e2c Jean*0167 #endif
6d45c3b90d Patr*0168
2b4c90c108 Mart*0169 CALL Ri_iwmix (
edb6656069 Mart*0170 I kmtj, shsq, dbloc, ghat,
0171 I diffusKzS, diffusKzT,
0172 I ikey,
0173 O diffus, myThid )
2fa42a6013 Alis*0174
6d45c3b90d Patr*0175
0176
0177
853c5e0e2c Jean*0178 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0179
0180
0181
0182
853c5e0e2c Jean*0183 #endif
6d45c3b90d Patr*0184
0185
2fa42a6013 Alis*0186
0187
0188
0189
0190
2b4c90c108 Mart*0191 DO md = 1, mdiff
0192 DO k=1,Nrp1
0193 DO i = 1,imt
0194 IF (k.GE.kmtj(i)) diffus(i,k,md) = 0.0
0195 ENDDO
0196 ENDDO
0197 ENDDO
2fa42a6013 Alis*0198
0199
0200
0201
0202
0203
0204
2b4c90c108 Mart*0205 CALL bldepth (
edb6656069 Mart*0206 I kmtj,
0207 I dvsq, dbloc, Ritop, ustar, bo, bosol,
63ceaaa79c Dimi*0208 #ifdef ALLOW_SALT_PLUME
edb6656069 Mart*0209 I boplume, SPDepth,
1f89baba18 Patr*0210 #ifdef SALT_PLUME_SPLIT_BASIN
edb6656069 Mart*0211 I lon, lat,
1f89baba18 Patr*0212 #endif /* SALT_PLUME_SPLIT_BASIN */
63ceaaa79c Dimi*0213 #endif /* ALLOW_SALT_PLUME */
edb6656069 Mart*0214 I coriol,
0215 I ikey,
0216 O hbl, bfsfc, stable, casea, kbl, Rib, sigma,
0217 I bi, bj, myTime, myIter, myThid )
2fa42a6013 Alis*0218
853c5e0e2c Jean*0219 #ifdef ALLOW_AUTODIFF_TAMC
a9d2e4c565 Jean*0220
edb6656069 Mart*0221
853c5e0e2c Jean*0222 #endif
2fa42a6013 Alis*0223
0224
0225
0226
0227
2b4c90c108 Mart*0228 CALL blmix (
edb6656069 Mart*0229 I ustar, bfsfc, hbl, stable, casea, diffus, kbl,
0230 O dkm1, blmc, ghat, sigma, ikey,
0231 I myThid )
6d45c3b90d Patr*0232
853c5e0e2c Jean*0233 #ifdef ALLOW_AUTODIFF_TAMC
a9d2e4c565 Jean*0234
edb6656069 Mart*0235
a9d2e4c565 Jean*0236
edb6656069 Mart*0237
853c5e0e2c Jean*0238 #endif
6d45c3b90d Patr*0239
2fa42a6013 Alis*0240
0241
0242
0243
0244
2b4c90c108 Mart*0245 CALL enhance (
edb6656069 Mart*0246 I dkm1, hbl, kbl, diffus, casea,
0247 U ghat,
0248 O blmc,
0249 I myThid )
2fa42a6013 Alis*0250
6d45c3b90d Patr*0251
0252
853c5e0e2c Jean*0253 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0254
853c5e0e2c Jean*0255 #endif
6d45c3b90d Patr*0256
0257
2fa42a6013 Alis*0258
0259
6060ec2938 Dimi*0260
04522666de Ed H*0261
6060ec2938 Dimi*0262
2fa42a6013 Alis*0263
2b4c90c108 Mart*0264 DO k = 1, Nr
0265 DO i = 1, imt
0266 IF (k .LT. kbl(i)) THEN
25c3477f99 Mart*0267 #ifdef ALLOW_SHELFICE
0268
0269
2b4c90c108 Mart*0270 blmc(i,k,1) = MAX ( blmc(i,k,1)*msk(i),
25c3477f99 Mart*0271 & diffus(i,k,1) )
2b4c90c108 Mart*0272 blmc(i,k,2) = MAX ( blmc(i,k,2)*msk(i),
25c3477f99 Mart*0273 & diffus(i,k,2) )
2b4c90c108 Mart*0274 blmc(i,k,3) = MAX ( blmc(i,k,3)*msk(i),
25c3477f99 Mart*0275 & diffus(i,k,3) )
0276 #endif /* not ALLOW_SHELFICE */
2b4c90c108 Mart*0277 diffus(i,k,1) = MAX ( blmc(i,k,1), viscArNr(1) )
0278 diffus(i,k,2) = MAX ( blmc(i,k,2), diffusKzS(i,Nr) )
0279 diffus(i,k,3) = MAX ( blmc(i,k,3), diffusKzT(i,Nr) )
0280 ELSE
b5ecce171d Davi*0281 ghat(i,k) = 0. _d 0
2b4c90c108 Mart*0282 ENDIF
0283 ENDDO
0284 ENDDO
2fa42a6013 Alis*0285
0286 #endif /* ALLOW_KPP */
0287
2b4c90c108 Mart*0288 RETURN
0289 END
2fa42a6013 Alis*0290
0291
0292
0293 subroutine bldepth (
edb6656069 Mart*0294 I kmtj,
0295 I dvsq, dbloc, Ritop, ustar, bo, bosol,
63ceaaa79c Dimi*0296 #ifdef ALLOW_SALT_PLUME
edb6656069 Mart*0297 I boplume, SPDepth,
1f89baba18 Patr*0298 #ifdef SALT_PLUME_SPLIT_BASIN
edb6656069 Mart*0299 I lon, lat,
1f89baba18 Patr*0300 #endif /* SALT_PLUME_SPLIT_BASIN */
63ceaaa79c Dimi*0301 #endif /* ALLOW_SALT_PLUME */
edb6656069 Mart*0302 I coriol,
0303 I ikey,
0304 O hbl, bfsfc, stable, casea, kbl, Rib, sigma,
0305 I bi, bj, myTime, myIter, myThid )
2fa42a6013 Alis*0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
a9d2e4c565 Jean*0327
2fa42a6013 Alis*0328 IMPLICIT NONE
0329
0330 #include "SIZE.h"
30c6f5b1cd An T*0331 #include "EEPARAMS.h"
0332 #include "PARAMS.h"
2fa42a6013 Alis*0333 #include "KPP_PARAMS.h"
853c5e0e2c Jean*0334 #ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*0335 # include "tamc.h"
0336 #endif
2fa42a6013 Alis*0337
0338
0339
15fd724cec Dimi*0340
eeda3a3aa1 Jean*0341
0342
0343
2fa42a6013 Alis*0344
0345
0346
0347
0348
0349
0350
0351
0352
63ceaaa79c Dimi*0353
2fa42a6013 Alis*0354
15fd724cec Dimi*0355 INTEGER bi, bj
eeda3a3aa1 Jean*0356 _RL myTime
2b4c90c108 Mart*0357 INTEGER myIter
0358 INTEGER myThid
0359 INTEGER kmtj(imt)
fe66051ebd Dimi*0360 _RL dvsq (imt,Nr)
0361 _RL dbloc (imt,Nr)
0362 _RL Ritop (imt,Nr)
0363 _RL ustar (imt)
0364 _RL bo (imt)
0365 _RL bosol (imt)
0366 _RL coriol (imt)
edb6656069 Mart*0367 INTEGER ikey
63ceaaa79c Dimi*0368 #ifdef ALLOW_SALT_PLUME
1f89baba18 Patr*0369 _RL boplume (imt,Nrp1)
63ceaaa79c Dimi*0370 _RL SPDepth (imt)
1f89baba18 Patr*0371 #ifdef SALT_PLUME_SPLIT_BASIN
0372 _RL lon (imt)
0373 _RL lat (imt)
0374 #endif /* SALT_PLUME_SPLIT_BASIN */
63ceaaa79c Dimi*0375 #endif /* ALLOW_SALT_PLUME */
2fa42a6013 Alis*0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
fe66051ebd Dimi*0386 _RL hbl (imt)
0387 _RL bfsfc (imt)
0388 _RL stable (imt)
0389 _RL casea (imt)
2b4c90c108 Mart*0390 INTEGER kbl(imt)
fe66051ebd Dimi*0391 _RL Rib (imt,Nr)
0392 _RL sigma (imt)
2fa42a6013 Alis*0393
0394 #ifdef ALLOW_KPP
0395
0396
0397
0398
fe66051ebd Dimi*0399 _RL wm(imt), ws(imt)
0400 _RL worka(imt)
0401 _RL bvsq, vtsq, hekman, hmonob, hlimit, tempVar1, tempVar2
2b4c90c108 Mart*0402 INTEGER i, kl
2fa42a6013 Alis*0403
fe66051ebd Dimi*0404 _RL p5 , eins
2b4c90c108 Mart*0405 PARAMETER ( p5=0.5, eins=1.0 )
956c0a5824 Patr*0406 _RL minusone
2b4c90c108 Mart*0407 PARAMETER ( minusone=-1.0 )
29e16c9d38 Jean*0408 #ifdef SALT_PLUME_VOLUME
2b4c90c108 Mart*0409 INTEGER km, km1
29e16c9d38 Jean*0410 _RL temp
0411 #endif
88b144ae49 Jean*0412 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0413 INTEGER kkey
88b144ae49 Jean*0414 #endif
2fa42a6013 Alis*0415
30c6f5b1cd An T*0416 #ifdef ALLOW_DIAGNOSTICS
0417
0418 _RL KPPBFSFC(imt,Nr)
0419 #endif /* ALLOW_DIAGNOSTICS */
0420
2fa42a6013 Alis*0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
2b4c90c108 Mart*0432 DO i = 1, imt
b5ecce171d Davi*0433 Rib(i,1) = 0. _d 0
80b2748a09 Patr*0434 kbl(i) = kmtj(i)
9be8f21400 Mart*0435 IF (kmtj(i).LT.1) kbl(i) = 1
80b2748a09 Patr*0436 kl = kbl(i)
0437 hbl(i) = -zgrid(kl)
2b4c90c108 Mart*0438 ENDDO
2fa42a6013 Alis*0439
30c6f5b1cd An T*0440 #ifdef ALLOW_DIAGNOSTICS
2b4c90c108 Mart*0441 DO kl = 1, Nr
0442 DO i = 1, imt
b5ecce171d Davi*0443 KPPBFSFC(i,kl) = 0. _d 0
2b4c90c108 Mart*0444 ENDDO
0445 ENDDO
30c6f5b1cd An T*0446 #endif /* ALLOW_DIAGNOSTICS */
0447
2b4c90c108 Mart*0448 DO kl = 2, Nr
2fa42a6013 Alis*0449
a9d2e4c565 Jean*0450 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0451 kkey = (ikey-1)*Nr + kl
3067745c9b Patr*0452 #endif
0453
2fa42a6013 Alis*0454
0455
2b4c90c108 Mart*0456 DO i = 1, imt
956c0a5824 Patr*0457 worka(i) = zgrid(kl)
2b4c90c108 Mart*0458 ENDDO
853c5e0e2c Jean*0459 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0460
853c5e0e2c Jean*0461 #endif
2b4c90c108 Mart*0462 CALL SWFRAC(
a9d2e4c565 Jean*0463 I imt, hbf,
eeda3a3aa1 Jean*0464 U worka,
0465 I myTime, myIter, myThid )
853c5e0e2c Jean*0466 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0467
853c5e0e2c Jean*0468 #endif
3067745c9b Patr*0469
2b4c90c108 Mart*0470 DO i = 1, imt
2fa42a6013 Alis*0471
0472
0473
0474 casea(i) = -zgrid(kl)
0475
0476
0477
956c0a5824 Patr*0478 bfsfc(i) = bo(i) + bosol(i)*(1. - worka(i))
2fa42a6013 Alis*0479
2b4c90c108 Mart*0480 ENDDO
63ceaaa79c Dimi*0481 #ifdef ALLOW_SALT_PLUME
0482
30c6f5b1cd An T*0483 IF ( useSALT_PLUME ) THEN
1f89baba18 Patr*0484 #ifndef SALT_PLUME_VOLUME
2b4c90c108 Mart*0485 DO i = 1, imt
30c6f5b1cd An T*0486 worka(i) = zgrid(kl)
2b4c90c108 Mart*0487 ENDDO
1f89baba18 Patr*0488
2b4c90c108 Mart*0489 CALL SALT_PLUME_FRAC(
30c6f5b1cd An T*0490 I imt, hbf,SPDepth,
1f89baba18 Patr*0491 #ifdef SALT_PLUME_SPLIT_BASIN
0492 I lon,lat,
0493 #endif /* SALT_PLUME_SPLIT_BASIN */
30c6f5b1cd An T*0494 U worka,
0495 I myTime, myIter, myThid)
2b4c90c108 Mart*0496 DO i = 1, imt
1f89baba18 Patr*0497 bfsfc(i) = bfsfc(i) + boplume(i,1)*(worka(i))
2b4c90c108 Mart*0498
1f89baba18 Patr*0499
0500
2b4c90c108 Mart*0501 ENDDO
1f89baba18 Patr*0502 #else /* def SALT_PLUME_VOLUME */
0503
0504
0505 DO i = 1, imt
2b4c90c108 Mart*0506 km =MAX(1,kbl(i)-1)
0507 km1=MAX(1,kbl(i))
29e16c9d38 Jean*0508 temp = (boplume(i,km)+boplume(i,km1))*p5
1f89baba18 Patr*0509 bfsfc(i) = bfsfc(i) + temp
0510 ENDDO
0511 #endif /* ndef SALT_PLUME_VOLUME */
30c6f5b1cd An T*0512 ENDIF
0513 #endif /* ALLOW_SALT_PLUME */
0514
0515 #ifdef ALLOW_DIAGNOSTICS
2b4c90c108 Mart*0516 DO i = 1, imt
30c6f5b1cd An T*0517 KPPBFSFC(i,kl) = bfsfc(i)
2b4c90c108 Mart*0518 ENDDO
30c6f5b1cd An T*0519 #endif /* ALLOW_DIAGNOSTICS */
63ceaaa79c Dimi*0520
2b4c90c108 Mart*0521 DO i = 1, imt
63ceaaa79c Dimi*0522 stable(i) = p5 + sign(p5,bfsfc(i))
0523 sigma(i) = stable(i) + (1. - stable(i)) * epsilon
2b4c90c108 Mart*0524 ENDDO
2fa42a6013 Alis*0525
0526
0527
0528
a9d2e4c565 Jean*0529
2b4c90c108 Mart*0530 CALL wscale (
2fa42a6013 Alis*0531 I sigma, casea, ustar, bfsfc,
25c3477f99 Mart*0532 O wm, ws, myThid )
853c5e0e2c Jean*0533 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0534
853c5e0e2c Jean*0535 #endif
2fa42a6013 Alis*0536
2b4c90c108 Mart*0537 DO i = 1, imt
2fa42a6013 Alis*0538
0539
0540
0541
0542
0543 bvsq = p5 *
0544 1 ( dbloc(i,kl-1) / (zgrid(kl-1)-zgrid(kl ))+
0545 2 dbloc(i,kl ) / (zgrid(kl )-zgrid(kl+1)))
2b4c90c108 Mart*0546
0547
0548
0549
0550
2fa42a6013 Alis*0551
2b4c90c108 Mart*0552 IF (bvsq .EQ. 0. _d 0) THEN
b5ecce171d Davi*0553 vtsq = 0. _d 0
2b4c90c108 Mart*0554 ELSE
0555 vtsq = -zgrid(kl) * ws(i) * SQRT(ABS(bvsq)) * Vtc
0556 ENDIF
2fa42a6013 Alis*0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
956c0a5824 Patr*0569
a9d2e4c565 Jean*0570 tempVar1 = dvsq(i,kl) + vtsq
2b4c90c108 Mart*0571 #ifdef KPP_SMOOTH_REGULARISATION
0572 tempVar2 = tempVar1 + phepsi
0573 #else
0574 tempVar2 = MAX(tempVar1, phepsi)
0575 #endif /* KPP_SMOOTH_REGULARISATION */
956c0a5824 Patr*0576 Rib(i,kl) = Ritop(i,kl) / tempVar2
0577
2b4c90c108 Mart*0578 ENDDO
0579 ENDDO
32e2940ee8 Patr*0580
30c6f5b1cd An T*0581 #ifdef ALLOW_DIAGNOSTICS
52b77e9710 Jean*0582 IF ( useDiagnostics ) THEN
15fd724cec Dimi*0583 CALL DIAGNOSTICS_FILL(KPPBFSFC,'KPPbfsfc',0,Nr,2,bi,bj,myThid)
2b4c90c108 Mart*0584 CALL DIAGNOSTICS_FILL(Rib ,'KPPRi ',0,Nr,2,bi,bj,myThid)
52b77e9710 Jean*0585 ENDIF
30c6f5b1cd An T*0586 #endif /* ALLOW_DIAGNOSTICS */
0587
32e2940ee8 Patr*0588
04522666de Ed H*0589
a9d2e4c565 Jean*0590
853c5e0e2c Jean*0591 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0592
95c72ef3a1 Patr*0593
853c5e0e2c Jean*0594 #endif
32e2940ee8 Patr*0595
0596
2b4c90c108 Mart*0597 DO kl = 2, Nr
0598 DO i = 1, imt
0599 IF (kbl(i).EQ.kmtj(i) .AND. Rib(i,kl).GT.Ricr) kbl(i) = kl
0600 ENDDO
0601 ENDDO
2fa42a6013 Alis*0602
853c5e0e2c Jean*0603 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0604
95c72ef3a1 Patr*0605
853c5e0e2c Jean*0606 #endif
2fa42a6013 Alis*0607
2b4c90c108 Mart*0608 DO i = 1, imt
2fa42a6013 Alis*0609 kl = kbl(i)
0610
2b4c90c108 Mart*0611 IF (kl.GT.1 .AND. kl.LT.kmtj(i)) THEN
956c0a5824 Patr*0612 tempVar1 = (Rib(i,kl)-Rib(i,kl-1))
2fa42a6013 Alis*0613 hbl(i) = -zgrid(kl-1) + (zgrid(kl-1)-zgrid(kl)) *
956c0a5824 Patr*0614 1 (Ricr - Rib(i,kl-1)) / tempVar1
2b4c90c108 Mart*0615
0616
0617
0618 ENDIF
0619 ENDDO
2fa42a6013 Alis*0620
853c5e0e2c Jean*0621 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0622
95c72ef3a1 Patr*0623
853c5e0e2c Jean*0624 #endif
2fa42a6013 Alis*0625
0626
0627
0628
0629
2b4c90c108 Mart*0630 DO i = 1, imt
956c0a5824 Patr*0631 worka(i) = hbl(i)
2b4c90c108 Mart*0632 ENDDO
853c5e0e2c Jean*0633 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0634
95c72ef3a1 Patr*0635
853c5e0e2c Jean*0636 #endif
2b4c90c108 Mart*0637 CALL SWFRAC(
a9d2e4c565 Jean*0638 I imt, minusone,
eeda3a3aa1 Jean*0639 U worka,
0640 I myTime, myIter, myThid )
853c5e0e2c Jean*0641 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0642
95c72ef3a1 Patr*0643
853c5e0e2c Jean*0644 #endif
2fa42a6013 Alis*0645
2b4c90c108 Mart*0646 DO i = 1, imt
956c0a5824 Patr*0647 bfsfc(i) = bo(i) + bosol(i) * (1. - worka(i))
2b4c90c108 Mart*0648 ENDDO
63ceaaa79c Dimi*0649
0650 #ifdef ALLOW_SALT_PLUME
7448700841 Mart*0651 # ifdef ALLOW_AUTODIFF_TAMC
0652
0653
0654 # endif
30c6f5b1cd An T*0655 IF ( useSALT_PLUME ) THEN
1f89baba18 Patr*0656 #ifndef SALT_PLUME_VOLUME
2b4c90c108 Mart*0657 DO i = 1, imt
30c6f5b1cd An T*0658 worka(i) = hbl(i)
2b4c90c108 Mart*0659 ENDDO
0660 CALL SALT_PLUME_FRAC(
30c6f5b1cd An T*0661 I imt,minusone,SPDepth,
1f89baba18 Patr*0662 #ifdef SALT_PLUME_SPLIT_BASIN
0663 I lon,lat,
0664 #endif /* SALT_PLUME_SPLIT_BASIN */
30c6f5b1cd An T*0665 U worka,
0666 I myTime, myIter, myThid )
2b4c90c108 Mart*0667 DO i = 1, imt
1f89baba18 Patr*0668 bfsfc(i) = bfsfc(i) + boplume(i,1) * (worka(i))
2b4c90c108 Mart*0669
1f89baba18 Patr*0670
0671
2b4c90c108 Mart*0672 ENDDO
1f89baba18 Patr*0673 #else /* def SALT_PLUME_VOLUME */
0674 DO i = 1, imt
2b4c90c108 Mart*0675 km =MAX(1,kbl(i)-1)
0676 km1=MAX(1,kbl(i))
1f89baba18 Patr*0677 temp = (boplume(i,km)+boplume(i,km1))/2.0
0678 bfsfc(i) = bfsfc(i) + temp
0679 ENDDO
0680 #endif /* ndef SALT_PLUME_VOLUME */
30c6f5b1cd An T*0681 ENDIF
63ceaaa79c Dimi*0682 #endif /* ALLOW_SALT_PLUME */
853c5e0e2c Jean*0683 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0684
95c72ef3a1 Patr*0685
853c5e0e2c Jean*0686 #endif
1d478690dc Patr*0687
956c0a5824 Patr*0688
2b4c90c108 Mart*0689 DO i = 1, imt
2fa42a6013 Alis*0690 stable(i) = p5 + sign( p5, bfsfc(i) )
2b4c90c108 Mart*0691 bfsfc(i) = sign(eins,bfsfc(i))*MAX(phepsi,ABS(bfsfc(i)))
0692 ENDDO
2fa42a6013 Alis*0693
32e2940ee8 Patr*0694
0695
853c5e0e2c Jean*0696 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0697
95c72ef3a1 Patr*0698
853c5e0e2c Jean*0699 #endif
32e2940ee8 Patr*0700
956c0a5824 Patr*0701
2fa42a6013 Alis*0702
0703
0704
0705
0706
35936beffd Davi*0707 IF ( LimitHblStable ) THEN
2b4c90c108 Mart*0708 DO i = 1, imt
0709 IF (bfsfc(i) .GT. 0.0) THEN
0710 hekman = cekman * ustar(i) / MAX(ABS(Coriol(i)),phepsi)
0711 hmonob = cmonob * ustar(i)*ustar(i)*ustar(i)
0712 & / vonk / bfsfc(i)
0713 hlimit = stable(i) * MIN(hekman,hmonob)
0714 & + (stable(i)-1.) * zgrid(Nr)
0715 hbl(i) = MIN(hbl(i),hlimit)
0716 ENDIF
0717 ENDDO
35936beffd Davi*0718 ENDIF
0719
853c5e0e2c Jean*0720 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0721
95c72ef3a1 Patr*0722
853c5e0e2c Jean*0723 #endif
956c0a5824 Patr*0724
2b4c90c108 Mart*0725 DO i = 1, imt
0726 hbl(i) = MAX(hbl(i),minKPPhbl)
2fa42a6013 Alis*0727 kbl(i) = kmtj(i)
2b4c90c108 Mart*0728 ENDDO
2fa42a6013 Alis*0729
853c5e0e2c Jean*0730 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0731
95c72ef3a1 Patr*0732
853c5e0e2c Jean*0733 #endif
2fa42a6013 Alis*0734
0735
0736
0737
0738
2b4c90c108 Mart*0739 DO kl = 2, Nr
0740 DO i = 1, imt
0741 IF ( kbl(i).EQ.kmtj(i) .AND. (-zgrid(kl)).GT.hbl(i) ) THEN
2fa42a6013 Alis*0742 kbl(i) = kl
2b4c90c108 Mart*0743 ENDIF
0744 ENDDO
0745 ENDDO
2fa42a6013 Alis*0746
0747
0748
0749
0750
2b4c90c108 Mart*0751 DO i = 1, imt
956c0a5824 Patr*0752 worka(i) = hbl(i)
2b4c90c108 Mart*0753 ENDDO
853c5e0e2c Jean*0754 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0755
95c72ef3a1 Patr*0756
853c5e0e2c Jean*0757 #endif
2b4c90c108 Mart*0758 CALL SWFRAC(
a9d2e4c565 Jean*0759 I imt, minusone,
eeda3a3aa1 Jean*0760 U worka,
0761 I myTime, myIter, myThid )
853c5e0e2c Jean*0762 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0763
95c72ef3a1 Patr*0764
853c5e0e2c Jean*0765 #endif
a9d2e4c565 Jean*0766
2b4c90c108 Mart*0767 DO i = 1, imt
956c0a5824 Patr*0768 bfsfc(i) = bo(i) + bosol(i) * (1. - worka(i))
2b4c90c108 Mart*0769 ENDDO
63ceaaa79c Dimi*0770
0771 #ifdef ALLOW_SALT_PLUME
30c6f5b1cd An T*0772 IF ( useSALT_PLUME ) THEN
1f89baba18 Patr*0773 #ifndef SALT_PLUME_VOLUME
2b4c90c108 Mart*0774 DO i = 1, imt
30c6f5b1cd An T*0775 worka(i) = hbl(i)
2b4c90c108 Mart*0776 ENDDO
0777 CALL SALT_PLUME_FRAC(
30c6f5b1cd An T*0778 I imt,minusone,SPDepth,
1f89baba18 Patr*0779 #ifdef SALT_PLUME_SPLIT_BASIN
0780 I lon,lat,
0781 #endif /* SALT_PLUME_SPLIT_BASIN */
30c6f5b1cd An T*0782 U worka,
0783 I myTime, myIter, myThid )
2b4c90c108 Mart*0784 DO i = 1, imt
1f89baba18 Patr*0785 bfsfc(i) = bfsfc(i) + boplume(i,1) * (worka(i))
2b4c90c108 Mart*0786
1f89baba18 Patr*0787
0788
2b4c90c108 Mart*0789 ENDDO
1f89baba18 Patr*0790 #else /* def SALT_PLUME_VOLUME */
0791 DO i = 1, imt
2b4c90c108 Mart*0792 km =MAX(1,kbl(i)-1)
0793 km1=MAX(1,kbl(i)-0)
1f89baba18 Patr*0794 temp = (boplume(i,km)+boplume(i,km1))/2.0
0795 bfsfc(i) = bfsfc(i) + temp
0796 ENDDO
0797 #endif /* ndef SALT_PLUME_VOLUME */
30c6f5b1cd An T*0798 ENDIF
63ceaaa79c Dimi*0799 #endif /* ALLOW_SALT_PLUME */
853c5e0e2c Jean*0800 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*0801
95c72ef3a1 Patr*0802
853c5e0e2c Jean*0803 #endif
1d478690dc Patr*0804
956c0a5824 Patr*0805
2b4c90c108 Mart*0806 DO i = 1, imt
2fa42a6013 Alis*0807 stable(i) = p5 + sign( p5, bfsfc(i) )
2b4c90c108 Mart*0808 bfsfc(i) = sign(eins,bfsfc(i))*MAX(phepsi,ABS(bfsfc(i)))
0809 ENDDO
2fa42a6013 Alis*0810
0811
0812
0813
0814
2b4c90c108 Mart*0815 DO i = 1, imt
80b2748a09 Patr*0816 kl = kbl(i)
2fa42a6013 Alis*0817 casea(i) = p5 +
80b2748a09 Patr*0818 1 sign(p5, -zgrid(kl) - p5*hwide(kl) - hbl(i))
2b4c90c108 Mart*0819 ENDDO
2fa42a6013 Alis*0820
0821 #endif /* ALLOW_KPP */
0822
2b4c90c108 Mart*0823 RETURN
0824 END
2fa42a6013 Alis*0825
0826
0827
0828 subroutine wscale (
0829 I sigma, hbl, ustar, bfsfc,
a9d2e4c565 Jean*0830 O wm, ws,
25c3477f99 Mart*0831 I myThid )
2fa42a6013 Alis*0832
0833
0834
0835
0836
0837
2b4c90c108 Mart*0838
2fa42a6013 Alis*0839
a9d2e4c565 Jean*0840
2fa42a6013 Alis*0841 IMPLICIT NONE
0842
0843 #include "SIZE.h"
0844 #include "KPP_PARAMS.h"
0845
0846
0847
0848
0849
0850
0851
25c3477f99 Mart*0852
2b4c90c108 Mart*0853 INTEGER myThid
fe66051ebd Dimi*0854 _RL sigma(imt)
0855 _RL hbl (imt)
0856 _RL ustar(imt)
0857 _RL bfsfc(imt)
a9d2e4c565 Jean*0858
2fa42a6013 Alis*0859
0860
0861
fe66051ebd Dimi*0862 _RL wm(imt), ws(imt)
2fa42a6013 Alis*0863
0864 #ifdef ALLOW_KPP
a9d2e4c565 Jean*0865
2fa42a6013 Alis*0866
0867
0868
fe66051ebd Dimi*0869 _RL zehat
2fa42a6013 Alis*0870
2b4c90c108 Mart*0871 INTEGER iz, izp1, ju, i, jup1
fe66051ebd Dimi*0872 _RL udiff, zdiff, zfrac, ufrac, fzfrac, wam
0873 _RL wbm, was, wbs, u3, tempVar
2fa42a6013 Alis*0874
0875
0876
0877
0878
0879
2b4c90c108 Mart*0880 DO i = 1, imt
2fa42a6013 Alis*0881 zehat = vonk*sigma(i)*hbl(i)*bfsfc(i)
0882
2b4c90c108 Mart*0883 IF (zehat .LE. zmax) THEN
2fa42a6013 Alis*0884
0885 zdiff = zehat - zmin
36d05ba58c Mart*0886
0887
0888
0889
0890
0891
0892
0893
0894
2b4c90c108 Mart*0895
0896 iz = INT( zdiff / deltaz )
0897 iz = MIN( iz, nni )
0898 iz = MAX( iz, 0 )
2fa42a6013 Alis*0899 izp1 = iz + 1
956c0a5824 Patr*0900
2fa42a6013 Alis*0901 udiff = ustar(i) - umin
2b4c90c108 Mart*0902 ju = INT( udiff / deltau )
0903 ju = MIN( ju, nnj )
0904 ju = MAX( ju, 0 )
2fa42a6013 Alis*0905 jup1 = ju + 1
956c0a5824 Patr*0906
2fa42a6013 Alis*0907 zfrac = zdiff / deltaz - float(iz)
0908 ufrac = udiff / deltau - float(ju)
956c0a5824 Patr*0909
2fa42a6013 Alis*0910 fzfrac= 1. - zfrac
0911 wam = fzfrac * wmt(iz,jup1) + zfrac * wmt(izp1,jup1)
0912 wbm = fzfrac * wmt(iz,ju ) + zfrac * wmt(izp1,ju )
0913 wm(i) = (1.-ufrac) * wbm + ufrac * wam
956c0a5824 Patr*0914
2fa42a6013 Alis*0915 was = fzfrac * wst(iz,jup1) + zfrac * wst(izp1,jup1)
0916 wbs = fzfrac * wst(iz,ju ) + zfrac * wst(izp1,ju )
0917 ws(i) = (1.-ufrac) * wbs + ufrac * was
956c0a5824 Patr*0918
2b4c90c108 Mart*0919 ELSE
956c0a5824 Patr*0920
0921 u3 = ustar(i) * ustar(i) * ustar(i)
0922 tempVar = u3 + conc1 * zehat
0923 wm(i) = vonk * ustar(i) * u3 / tempVar
2fa42a6013 Alis*0924 ws(i) = wm(i)
956c0a5824 Patr*0925
2b4c90c108 Mart*0926 ENDIF
a9d2e4c565 Jean*0927
2b4c90c108 Mart*0928 ENDDO
2fa42a6013 Alis*0929
0930 #endif /* ALLOW_KPP */
a9d2e4c565 Jean*0931
2b4c90c108 Mart*0932 RETURN
0933 END
2fa42a6013 Alis*0934
0935
a9d2e4c565 Jean*0936
2fa42a6013 Alis*0937 subroutine Ri_iwmix (
eeda3a3aa1 Jean*0938 I kmtj, shsq, dbloc, dblocSm,
0939 I diffusKzS, diffusKzT,
edb6656069 Mart*0940 I ikey,
eeda3a3aa1 Jean*0941 O diffus,
0942 I myThid )
2fa42a6013 Alis*0943
0944
0945
0946
0947
0948
0949 IMPLICIT NONE
0950
0951 #include "SIZE.h"
0952 #include "EEPARAMS.h"
0953 #include "PARAMS.h"
0954 #include "KPP_PARAMS.h"
95c72ef3a1 Patr*0955 #ifdef ALLOW_AUTODIFF
5127d1d91b Jean*0956 # include "AUTODIFF_PARAMS.h"
853c5e0e2c Jean*0957 #endif
0958 #ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*0959 # include "tamc.h"
0960 #endif
2fa42a6013 Alis*0961
0962
0963
0964
0965
0966
059d9fc14f Dimi*0967
0968
eeda3a3aa1 Jean*0969
2b4c90c108 Mart*0970 INTEGER kmtj (imt)
fe66051ebd Dimi*0971 _RL shsq (imt,Nr)
0972 _RL dbloc (imt,Nr)
0973 _RL dblocSm (imt,Nr)
059d9fc14f Dimi*0974 _RL diffusKzS(imt,Nr)
0975 _RL diffusKzT(imt,Nr)
edb6656069 Mart*0976 INTEGER ikey
2b4c90c108 Mart*0977 INTEGER myThid
a9d2e4c565 Jean*0978
2fa42a6013 Alis*0979
0980
0981
0982
fe66051ebd Dimi*0983 _RL diffus(imt,0:Nrp1,3)
2fa42a6013 Alis*0984
0985 #ifdef ALLOW_KPP
0986
0987
0988
0989
fe66051ebd Dimi*0990 _RL Rig
0991 _RL fRi, fcon
0992 _RL ratio
2b4c90c108 Mart*0993 INTEGER i, ki, kp1
fe66051ebd Dimi*0994 _RL c1, c0
2fa42a6013 Alis*0995
8164aa1823 Patr*0996 #ifdef ALLOW_KPP_VERTICALLY_SMOOTH
2b4c90c108 Mart*0997 INTEGER mr
8164aa1823 Patr*0998
0999 #endif
1000
2fa42a6013 Alis*1001
b5ecce171d Davi*1002 c1 = 1. _d 0
1003 c0 = 0. _d 0
2fa42a6013 Alis*1004
1005
1006
1007
1008
1009
853c5e0e2c Jean*1010 #ifdef ALLOW_AUTODIFF
8164aa1823 Patr*1011
1012 diffus(1,1,1) = 0.0
2b4c90c108 Mart*1013 DO ki = 1, Nr
1014 DO i = 1, imt
3067745c9b Patr*1015 diffus(i,ki,1) = 0.
1016 diffus(i,ki,2) = 0.
1017 diffus(i,ki,3) = 0.
2b4c90c108 Mart*1018 ENDDO
1019 ENDDO
8164aa1823 Patr*1020 #endif
a9d2e4c565 Jean*1021
2b4c90c108 Mart*1022 DO ki = 1, Nr
1023 DO i = 1, imt
1024 IF (kmtj(i) .LE. 1 ) THEN
2fa42a6013 Alis*1025 diffus(i,ki,1) = 0.
1026 diffus(i,ki,2) = 0.
2b4c90c108 Mart*1027 ELSEIF (ki .GE. kmtj(i)) THEN
2fa42a6013 Alis*1028 diffus(i,ki,1) = diffus(i,ki-1,1)
1029 diffus(i,ki,2) = diffus(i,ki-1,2)
2b4c90c108 Mart*1030 ELSE
2fa42a6013 Alis*1031 diffus(i,ki,1) = dblocSm(i,ki) * (zgrid(ki)-zgrid(ki+1))
2b4c90c108 Mart*1032 #ifdef KPP_SMOOTH_REGULARISATION
1033 & / ( Shsq(i,ki) + phepsi**2 )
1034 #else
1035 & / MAX( Shsq(i,ki), phepsi )
1036 #endif
2fa42a6013 Alis*1037 diffus(i,ki,2) = dbloc(i,ki) / (zgrid(ki)-zgrid(ki+1))
2b4c90c108 Mart*1038 ENDIF
1039 ENDDO
1040 ENDDO
853c5e0e2c Jean*1041 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1042
853c5e0e2c Jean*1043 #endif
2fa42a6013 Alis*1044
1045
1046
8164aa1823 Patr*1047 #ifdef ALLOW_KPP_VERTICALLY_SMOOTH
2b4c90c108 Mart*1048 DO mr = 1, num_v_smooth_Ri
1d478690dc Patr*1049
853c5e0e2c Jean*1050 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1051
1052
1053
1054
853c5e0e2c Jean*1055 #endif
1d478690dc Patr*1056
2b4c90c108 Mart*1057 CALL z121 (
30ef4f2c65 Davi*1058 U diffus(1,0,1),
25c3477f99 Mart*1059 I myThid )
2b4c90c108 Mart*1060
1061
1062
1063
1064 ENDDO
8164aa1823 Patr*1065 #endif
2fa42a6013 Alis*1066
1067
1068
1069
2b4c90c108 Mart*1070 DO ki = 1, Nr
1071 DO i = 1, imt
a9d2e4c565 Jean*1072
2fa42a6013 Alis*1073
1074
2b4c90c108 Mart*1075 Rig = MAX ( diffus(i,ki,2) , BVSQcon )
1076 ratio = MIN ( (BVSQcon - Rig) / BVSQcon, c1 )
2fa42a6013 Alis*1077 fcon = c1 - ratio * ratio
1078 fcon = fcon * fcon * fcon
a9d2e4c565 Jean*1079
2fa42a6013 Alis*1080
1081
2b4c90c108 Mart*1082 Rig = MAX ( diffus(i,ki,1), c0 )
1083 ratio = MIN ( Rig / Riinfty , c1 )
2fa42a6013 Alis*1084 fRi = c1 - ratio * ratio
1085 fRi = fRi * fRi * fRi
2b4c90c108 Mart*1086 #ifdef KPP_SCALE_SHEARMIXING
1087
1088
1089 fRi = fRi * shsq(i,ki)*shsq(i,ki)
1090 & /(shsq(i,ki)*shsq(i,ki) + 1. _d -16)
1091 #endif
2fa42a6013 Alis*1092
1093
1094
f7ab1e3823 Patr*1095
faff480f8c Davi*1096 kp1 = MIN(ki+1,Nr)
5127d1d91b Jean*1097 #ifdef EXCLUDE_KPP_SHEAR_MIX
a9d2e4c565 Jean*1098 diffus(i,ki,1) = viscArNr(1)
faff480f8c Davi*1099 diffus(i,ki,2) = diffusKzS(i,kp1)
1100 diffus(i,ki,3) = diffusKzT(i,kp1)
5127d1d91b Jean*1101 #else /* EXCLUDE_KPP_SHEAR_MIX */
1102 # ifdef ALLOW_AUTODIFF
2b4c90c108 Mart*1103 IF ( inAdMode .AND. .NOT. inAdExact ) THEN
5127d1d91b Jean*1104 diffus(i,ki,1) = viscArNr(1)
1105 diffus(i,ki,2) = diffusKzS(i,kp1)
1106 diffus(i,ki,3) = diffusKzT(i,kp1)
2b4c90c108 Mart*1107 ELSE
5127d1d91b Jean*1108 # else /* ALLOW_AUTODIFF */
2b4c90c108 Mart*1109 IF ( .TRUE. ) THEN
5127d1d91b Jean*1110 # endif /* ALLOW_AUTODIFF */
1111 diffus(i,ki,1) = viscArNr(1) + fcon*difmcon + fRi*difm0
1112 diffus(i,ki,2) = diffusKzS(i,kp1)+fcon*difscon+fRi*difs0
1113 diffus(i,ki,3) = diffusKzT(i,kp1)+fcon*diftcon+fRi*dift0
2b4c90c108 Mart*1114 ENDIF
5127d1d91b Jean*1115 #endif /* EXCLUDE_KPP_SHEAR_MIX */
2b4c90c108 Mart*1116 ENDDO
1117 ENDDO
a9d2e4c565 Jean*1118
2fa42a6013 Alis*1119
1120
a9d2e4c565 Jean*1121
2b4c90c108 Mart*1122 DO i = 1, imt
2fa42a6013 Alis*1123 diffus(i,0,1) = c0
1124 diffus(i,0,2) = c0
1125 diffus(i,0,3) = c0
2b4c90c108 Mart*1126 ENDDO
2fa42a6013 Alis*1127
1128 #endif /* ALLOW_KPP */
a9d2e4c565 Jean*1129
2b4c90c108 Mart*1130 RETURN
1131 END
2fa42a6013 Alis*1132
1133
1134
1135 subroutine z121 (
25c3477f99 Mart*1136 U v,
1137 I myThid )
2fa42a6013 Alis*1138
1139
1140
1141
1142
1d478690dc Patr*1143
2fa42a6013 Alis*1144
1d478690dc Patr*1145
2fa42a6013 Alis*1146
1147
1148 IMPLICIT NONE
1149 #include "SIZE.h"
1150 #include "KPP_PARAMS.h"
1151
a9d2e4c565 Jean*1152
2fa42a6013 Alis*1153
1154
25c3477f99 Mart*1155
2b4c90c108 Mart*1156 INTEGER myThid
fe66051ebd Dimi*1157 _RL v(imt,0:Nrp1)
2fa42a6013 Alis*1158
1159 #ifdef ALLOW_KPP
1160
1161
fe66051ebd Dimi*1162 _RL zwork, zflag
1163 _RL KRi_range(1:Nrp1)
2b4c90c108 Mart*1164 INTEGER i, k, km1, kp1
2fa42a6013 Alis*1165
fe66051ebd Dimi*1166 _RL p0 , p25 , p5 , p2
2b4c90c108 Mart*1167 PARAMETER ( p0 = 0.0, p25 = 0.25, p5 = 0.5, p2 = 2.0 )
1d478690dc Patr*1168
1169 KRi_range(Nrp1) = p0
1170
1171 #ifdef ALLOW_AUTODIFF_TAMC
b7b61e618a Mart*1172
1d478690dc Patr*1173 i = 0
b7b61e618a Mart*1174
1d478690dc Patr*1175
1176 #endif /* ALLOW_AUTODIFF_TAMC */
956c0a5824 Patr*1177
2b4c90c108 Mart*1178 DO i = 1, imt
2fa42a6013 Alis*1179
956c0a5824 Patr*1180 k = 1
2fa42a6013 Alis*1181 v(i,Nrp1) = v(i,Nr)
1182
2b4c90c108 Mart*1183 DO k = 1, Nr
2fa42a6013 Alis*1184 KRi_range(k) = p5 + SIGN(p5,v(i,k))
1185 KRi_range(k) = KRi_range(k) *
1186 & ( p5 + SIGN(p5,(Riinfty-v(i,k))) )
2b4c90c108 Mart*1187 ENDDO
2fa42a6013 Alis*1188
1189 zwork = KRi_range(1) * v(i,1)
1190 v(i,1) = p2 * v(i,1) +
1191 & KRi_range(1) * KRi_range(2) * v(i,2)
1192 zflag = p2 + KRi_range(1) * KRi_range(2)
1193 v(i,1) = v(i,1) / zflag
1194
2b4c90c108 Mart*1195 DO k = 2, Nr
2fa42a6013 Alis*1196 km1 = k - 1
1197 kp1 = k + 1
1198 zflag = v(i,k)
1199 v(i,k) = p2 * v(i,k) +
1200 & KRi_range(k) * KRi_range(kp1) * v(i,kp1) +
1201 & KRi_range(k) * zwork
1202 zwork = KRi_range(k) * zflag
1203 zflag = p2 + KRi_range(k)*(KRi_range(kp1)+KRi_range(km1))
1204 v(i,k) = v(i,k) / zflag
2b4c90c108 Mart*1205 ENDDO
2fa42a6013 Alis*1206
2b4c90c108 Mart*1207 ENDDO
2fa42a6013 Alis*1208
1209 #endif /* ALLOW_KPP */
1210
2b4c90c108 Mart*1211 RETURN
1212 END
2fa42a6013 Alis*1213
1214
1215
956c0a5824 Patr*1216 subroutine smooth_horiz (
2fa42a6013 Alis*1217 I k, bi, bj,
25c3477f99 Mart*1218 U fld,
1219 I myThid )
2fa42a6013 Alis*1220
956c0a5824 Patr*1221
2fa42a6013 Alis*1222
1223 IMPLICIT NONE
1224 #include "SIZE.h"
11b9c75340 Jean*1225 #include "GRID.h"
2fa42a6013 Alis*1226 #include "KPP_PARAMS.h"
1227
1228
956c0a5824 Patr*1229
1230
25c3477f99 Mart*1231
1232 INTEGER myThid
2b4c90c108 Mart*1233 INTEGER k, bi, bj
2fa42a6013 Alis*1234
956c0a5824 Patr*1235
1236
1237 _RL fld( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
2fa42a6013 Alis*1238
1239 #ifdef ALLOW_KPP
1240
1241
2b4c90c108 Mart*1242 INTEGER i, j, im1, ip1, jm1, jp1
2fa42a6013 Alis*1243 _RL tempVar
956c0a5824 Patr*1244 _RL fld_tmp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
2fa42a6013 Alis*1245
2b4c90c108 Mart*1246 INTEGER iMin , iMax , jMin , jMax
1247 PARAMETER(iMin=2-OLx, iMax=sNx+OLx-1, jMin=2-OLy, jMax=sNy+OLy-1)
2fa42a6013 Alis*1248
956c0a5824 Patr*1249 _RL p0 , p5 , p25 , p125 , p0625
2b4c90c108 Mart*1250 PARAMETER( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
2fa42a6013 Alis*1251
2b4c90c108 Mart*1252 DO j = jMin, jMax
2fa42a6013 Alis*1253 jm1 = j-1
1254 jp1 = j+1
2b4c90c108 Mart*1255 DO i = iMin, iMax
2fa42a6013 Alis*1256 im1 = i-1
1257 ip1 = i+1
1258 tempVar =
11b9c75340 Jean*1259 & p25 * maskC(i ,j ,k,bi,bj) +
1260 & p125 * ( maskC(im1,j ,k,bi,bj) +
1261 & maskC(ip1,j ,k,bi,bj) +
1262 & maskC(i ,jm1,k,bi,bj) +
1263 & maskC(i ,jp1,k,bi,bj) ) +
1264 & p0625 * ( maskC(im1,jm1,k,bi,bj) +
1265 & maskC(im1,jp1,k,bi,bj) +
1266 & maskC(ip1,jm1,k,bi,bj) +
1267 & maskC(ip1,jp1,k,bi,bj) )
2fa42a6013 Alis*1268 IF ( tempVar .GE. p25 ) THEN
1269 fld_tmp(i,j) = (
11b9c75340 Jean*1270 & p25 * fld(i ,j )*maskC(i ,j ,k,bi,bj) +
1271 & p125 *(fld(im1,j )*maskC(im1,j ,k,bi,bj) +
1272 & fld(ip1,j )*maskC(ip1,j ,k,bi,bj) +
1273 & fld(i ,jm1)*maskC(i ,jm1,k,bi,bj) +
1274 & fld(i ,jp1)*maskC(i ,jp1,k,bi,bj))+
1275 & p0625*(fld(im1,jm1)*maskC(im1,jm1,k,bi,bj) +
1276 & fld(im1,jp1)*maskC(im1,jp1,k,bi,bj) +
1277 & fld(ip1,jm1)*maskC(ip1,jm1,k,bi,bj) +
1278 & fld(ip1,jp1)*maskC(ip1,jp1,k,bi,bj)))
2fa42a6013 Alis*1279 & / tempVar
1280 ELSE
956c0a5824 Patr*1281 fld_tmp(i,j) = fld(i,j)
2fa42a6013 Alis*1282 ENDIF
1283 ENDDO
1284 ENDDO
1285
1286
2b4c90c108 Mart*1287 DO j = jMin, jMax
1288 DO i = iMin, iMax
956c0a5824 Patr*1289 fld(i,j) = fld_tmp(i,j)
2fa42a6013 Alis*1290 ENDDO
1291 ENDDO
1292
1293 #endif /* ALLOW_KPP */
1294
2b4c90c108 Mart*1295 RETURN
1296 END
2fa42a6013 Alis*1297
1298
1299
1300 subroutine blmix (
edb6656069 Mart*1301 I ustar, bfsfc, hbl, stable, casea, diffus, kbl,
1302 O dkm1, blmc, ghat, sigma, ikey,
1303 I myThid )
2fa42a6013 Alis*1304
1305
1306
1307
1308
1309
1310
1311
1312
1313 IMPLICIT NONE
1314
1315 #include "SIZE.h"
1316 #include "KPP_PARAMS.h"
853c5e0e2c Jean*1317 #ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*1318 # include "tamc.h"
1319 #endif
2fa42a6013 Alis*1320
1321
1322
1323
1324
1325
1326
1327
fe66051ebd Dimi*1328
25c3477f99 Mart*1329
2b4c90c108 Mart*1330 INTEGER myThid
fe66051ebd Dimi*1331 _RL ustar (imt)
1332 _RL bfsfc (imt)
1333 _RL hbl (imt)
1334 _RL stable(imt)
1335 _RL casea (imt)
1336 _RL diffus(imt,0:Nrp1,mdiff)
2b4c90c108 Mart*1337 INTEGER kbl(imt)
2fa42a6013 Alis*1338
1339
1340
1341
1342
1343
fe66051ebd Dimi*1344 _RL dkm1 (imt,mdiff)
1345 _RL blmc (imt,Nr,mdiff)
1346 _RL ghat (imt,Nr)
1347 _RL sigma(imt)
edb6656069 Mart*1348 INTEGER ikey
2fa42a6013 Alis*1349
1350 #ifdef ALLOW_KPP
1351
1352
1d478690dc Patr*1353
1354
2fa42a6013 Alis*1355
a9d2e4c565 Jean*1356 _RL gat1m(imt), gat1s(imt), gat1t(imt)
fe66051ebd Dimi*1357 _RL dat1m(imt), dat1s(imt), dat1t(imt)
1358 _RL ws(imt), wm(imt)
2b4c90c108 Mart*1359 INTEGER i, kn, ki, kl
1360 #ifndef KPP_DO_NOT_MATCH_DIFFUSIVITIES
1361 # ifndef KPP_DO_NOT_MATCH_DERIVATIVES
1362 _RL R, dvdzup, dvdzdn
1363 # endif
1364 _RL delhat
1365 #endif
1366 _RL viscp, difsp, diftp, visch, difsh, difth
1367 _RL f1, sig, a1, a2, a3
fe66051ebd Dimi*1368 _RL Gm, Gs, Gt
1369 _RL tempVar
2fa42a6013 Alis*1370
fe66051ebd Dimi*1371 _RL p0 , eins
2b4c90c108 Mart*1372 PARAMETER (p0=0.0, eins=1.0)
88b144ae49 Jean*1373 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1374 INTEGER kkey
88b144ae49 Jean*1375 #endif
2fa42a6013 Alis*1376
1377
1378
1379
1380
2b4c90c108 Mart*1381 DO i = 1, imt
2fa42a6013 Alis*1382 sigma(i) = stable(i) * 1.0 + (1. - stable(i)) * epsilon
2b4c90c108 Mart*1383 ENDDO
2fa42a6013 Alis*1384
853c5e0e2c Jean*1385 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1386
853c5e0e2c Jean*1387 #endif
2b4c90c108 Mart*1388 CALL wscale (
2fa42a6013 Alis*1389 I sigma, hbl, ustar, bfsfc,
25c3477f99 Mart*1390 O wm, ws, myThid )
853c5e0e2c Jean*1391 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1392
1393
853c5e0e2c Jean*1394 #endif
2fa42a6013 Alis*1395
2b4c90c108 Mart*1396 DO i = 1, imt
1397 wm(i) = sign(eins,wm(i))*MAX(phepsi,ABS(wm(i)))
1398 ws(i) = sign(eins,ws(i))*MAX(phepsi,ABS(ws(i)))
1399 ENDDO
853c5e0e2c Jean*1400 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1401
1402
853c5e0e2c Jean*1403 #endif
956c0a5824 Patr*1404
2b4c90c108 Mart*1405 DO i = 1, imt
2fa42a6013 Alis*1406
2b4c90c108 Mart*1407 kn = INT(caseA(i)+phepsi) *(kbl(i) -1) +
1408 $ (1 - INT(caseA(i)+phepsi)) * kbl(i)
2fa42a6013 Alis*1409
1410
1411
1412
1413
2b4c90c108 Mart*1414
1415 #ifdef KPP_DO_NOT_MATCH_DIFFUSIVITIES
1416 visch = 0.
1417 difsh = 0.
1418 difth = 0.
1419 viscp = 0.
1420 difsp = 0.
1421 diftp = 0.
1422 #else /* DO_MATCH_DIFFUSIVITIES */
1423 # ifdef KPP_DO_NOT_MATCH_DERIVATIVES
1424 viscp = 0.
1425 difsp = 0.
1426 diftp = 0.
1427 delhat = 0.
1428 # else /* DO_MATCH_DERIVATIVES */
2fa42a6013 Alis*1429 delhat = 0.5*hwide(kn) - zgrid(kn) - hbl(i)
1430 R = 1.0 - delhat / hwide(kn)
1431 dvdzup = (diffus(i,kn-1,1) - diffus(i,kn ,1)) / hwide(kn)
1432 dvdzdn = (diffus(i,kn ,1) - diffus(i,kn+1,1)) / hwide(kn+1)
2b4c90c108 Mart*1433
1434
1435
1436 viscp = 0.5 * ( (1.-R) * (dvdzup + ABS(dvdzup)) +
1437 1 R * (dvdzdn + ABS(dvdzdn)) )
2fa42a6013 Alis*1438
1439 dvdzup = (diffus(i,kn-1,2) - diffus(i,kn ,2)) / hwide(kn)
1440 dvdzdn = (diffus(i,kn ,2) - diffus(i,kn+1,2)) / hwide(kn+1)
2b4c90c108 Mart*1441 difsp = 0.5 * ( (1.-R) * (dvdzup + ABS(dvdzup)) +
1442 1 R * (dvdzdn + ABS(dvdzdn)) )
2fa42a6013 Alis*1443
1444 dvdzup = (diffus(i,kn-1,3) - diffus(i,kn ,3)) / hwide(kn)
1445 dvdzdn = (diffus(i,kn ,3) - diffus(i,kn+1,3)) / hwide(kn+1)
2b4c90c108 Mart*1446 diftp = 0.5 * ( (1.-R) * (dvdzup + ABS(dvdzup)) +
1447 1 R * (dvdzdn + ABS(dvdzdn)) )
1448 # endif /* KPP_DO_NOT_MATCH_DERIVATIVES */
2fa42a6013 Alis*1449 visch = diffus(i,kn,1) + viscp * delhat
1450 difsh = diffus(i,kn,2) + difsp * delhat
1451 difth = diffus(i,kn,3) + diftp * delhat
2b4c90c108 Mart*1452 #endif /* KPP_DO_NOT_MATCH_DIFFUSIVITIES */
2fa42a6013 Alis*1453
a9d2e4c565 Jean*1454 f1 = stable(i) * conc1 * bfsfc(i) /
2b4c90c108 Mart*1455 #ifdef KPP_SMOOTH_REGULARISATION
1456 & (ustar(i)**4 + phepsi)
1457 #else
1458 & MAX(ustar(i)**4,phepsi)
1459 #endif
1d478690dc Patr*1460 gat1m(i) = visch / hbl(i) / wm(i)
1461 dat1m(i) = -viscp / wm(i) + f1 * visch
a9d2e4c565 Jean*1462
1d478690dc Patr*1463 gat1s(i) = difsh / hbl(i) / ws(i)
a9d2e4c565 Jean*1464 dat1s(i) = -difsp / ws(i) + f1 * difsh
1465
1d478690dc Patr*1466 gat1t(i) = difth / hbl(i) / ws(i)
a9d2e4c565 Jean*1467 dat1t(i) = -diftp / ws(i) + f1 * difth
1468
2b4c90c108 Mart*1469 ENDDO
853c5e0e2c Jean*1470 #ifdef KPP_AUTODIFF_MORE_STORE
edb6656069 Mart*1471
1472
1473
1474
1475
1476
3067745c9b Patr*1477 #endif
2b4c90c108 Mart*1478 DO i = 1, imt
1479 dat1m(i) = MIN(dat1m(i),p0)
1480 dat1s(i) = MIN(dat1s(i),p0)
1481 dat1t(i) = MIN(dat1t(i),p0)
1482 ENDDO
853c5e0e2c Jean*1483 #ifdef KPP_AUTODIFF_MORE_STORE
edb6656069 Mart*1484
1485
1486
3067745c9b Patr*1487 #endif
2fa42a6013 Alis*1488
2b4c90c108 Mart*1489 DO ki = 1, Nr
2fa42a6013 Alis*1490
a9d2e4c565 Jean*1491 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1492 kkey = (ikey-1)*Nr + ki
3067745c9b Patr*1493 #endif
1494
2fa42a6013 Alis*1495
1496
1497
1498
2b4c90c108 Mart*1499 DO i = 1, imt
2fa42a6013 Alis*1500 sig = (-zgrid(ki) + 0.5 * hwide(ki)) / hbl(i)
2b4c90c108 Mart*1501 sigma(i) = stable(i)*sig + (1.-stable(i))*MIN(sig,epsilon)
1502 ENDDO
853c5e0e2c Jean*1503 #ifdef KPP_AUTODIFF_MORE_STORE
edb6656069 Mart*1504
1505
3067745c9b Patr*1506 #endif
853c5e0e2c Jean*1507 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1508
853c5e0e2c Jean*1509 #endif
2b4c90c108 Mart*1510 CALL wscale (
2fa42a6013 Alis*1511 I sigma, hbl, ustar, bfsfc,
25c3477f99 Mart*1512 O wm, ws, myThid )
853c5e0e2c Jean*1513 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1514
1515
853c5e0e2c Jean*1516 #endif
2fa42a6013 Alis*1517
1518
1519
1520
1521
2b4c90c108 Mart*1522 DO i = 1, imt
2fa42a6013 Alis*1523 sig = (-zgrid(ki) + 0.5 * hwide(ki)) / hbl(i)
1524 a1 = sig - 2.
1525 a2 = 3. - 2. * sig
1526 a3 = sig - 1.
1527
1d478690dc Patr*1528 Gm = a1 + a2 * gat1m(i) + a3 * dat1m(i)
1529 Gs = a1 + a2 * gat1s(i) + a3 * dat1s(i)
1530 Gt = a1 + a2 * gat1t(i) + a3 * dat1t(i)
2fa42a6013 Alis*1531
1532
1533
1534
1535
1d478690dc Patr*1536 blmc(i,ki,1) = hbl(i) * wm(i) * sig * (1. + sig * Gm)
2fa42a6013 Alis*1537 blmc(i,ki,2) = hbl(i) * ws(i) * sig * (1. + sig * Gs)
1538 blmc(i,ki,3) = hbl(i) * ws(i) * sig * (1. + sig * Gt)
1539
1540
1541
1542
956c0a5824 Patr*1543
1544 tempVar = ws(i) * hbl(i)
2b4c90c108 Mart*1545 #ifdef KPP_SMOOTH_REGULARISATION
1546 ghat(i,ki) = (1.-stable(i)) * cg / (phepsi+tempVar)
1547 #else
1548 ghat(i,ki) = (1.-stable(i)) * cg / MAX(phepsi,tempVar)
1549 #endif
1550 ENDDO
1551 ENDDO
2fa42a6013 Alis*1552
1553
1554
1555
1556
2b4c90c108 Mart*1557 DO i = 1, imt
80b2748a09 Patr*1558 kl = kbl(i)
1559 sig = -zgrid(kl-1) / hbl(i)
a9d2e4c565 Jean*1560 sigma(i) = stable(i) * sig
2b4c90c108 Mart*1561 & + (1. - stable(i)) * MIN(sig,epsilon)
1562 ENDDO
2fa42a6013 Alis*1563
853c5e0e2c Jean*1564 #ifdef KPP_AUTODIFF_MORE_STORE
edb6656069 Mart*1565
1566
3067745c9b Patr*1567 #endif
853c5e0e2c Jean*1568 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1569
853c5e0e2c Jean*1570 #endif
2b4c90c108 Mart*1571 CALL wscale (
2fa42a6013 Alis*1572 I sigma, hbl, ustar, bfsfc,
25c3477f99 Mart*1573 O wm, ws, myThid )
853c5e0e2c Jean*1574 #ifdef ALLOW_AUTODIFF_TAMC
edb6656069 Mart*1575
1576
853c5e0e2c Jean*1577 #endif
2fa42a6013 Alis*1578
2b4c90c108 Mart*1579 DO i = 1, imt
80b2748a09 Patr*1580 kl = kbl(i)
1581 sig = -zgrid(kl-1) / hbl(i)
2fa42a6013 Alis*1582 a1 = sig - 2.
1583 a2 = 3. - 2. * sig
1584 a3 = sig - 1.
1d478690dc Patr*1585 Gm = a1 + a2 * gat1m(i) + a3 * dat1m(i)
1586 Gs = a1 + a2 * gat1s(i) + a3 * dat1s(i)
1587 Gt = a1 + a2 * gat1t(i) + a3 * dat1t(i)
1588 dkm1(i,1) = hbl(i) * wm(i) * sig * (1. + sig * Gm)
2fa42a6013 Alis*1589 dkm1(i,2) = hbl(i) * ws(i) * sig * (1. + sig * Gs)
1590 dkm1(i,3) = hbl(i) * ws(i) * sig * (1. + sig * Gt)
2b4c90c108 Mart*1591 ENDDO
2fa42a6013 Alis*1592
1593 #endif /* ALLOW_KPP */
1594
2b4c90c108 Mart*1595 RETURN
1596 END
2fa42a6013 Alis*1597
1598
1599
a9d2e4c565 Jean*1600 subroutine enhance (
edb6656069 Mart*1601 I dkm1, hbl, kbl, diffus, casea,
1602 U ghat,
1603 O blmc,
1604 & myThid )
2fa42a6013 Alis*1605
1606
1607
1608 IMPLICIT NONE
1609
1610 #include "SIZE.h"
1611 #include "KPP_PARAMS.h"
1612
1613
1614
1615
1616
1617
1618
25c3477f99 Mart*1619
2b4c90c108 Mart*1620 INTEGER myThid
fe66051ebd Dimi*1621 _RL dkm1 (imt,mdiff)
1622 _RL hbl (imt)
2b4c90c108 Mart*1623 INTEGER kbl (imt)
fe66051ebd Dimi*1624 _RL diffus(imt,0:Nrp1,mdiff)
1625 _RL casea (imt)
2fa42a6013 Alis*1626
1627
1628
fe66051ebd Dimi*1629 _RL ghat (imt,Nr)
2fa42a6013 Alis*1630
1631
1632
fe66051ebd Dimi*1633 _RL blmc (imt,Nr,mdiff)
2fa42a6013 Alis*1634
1635 #ifdef ALLOW_KPP
1636
1637
1638
fe66051ebd Dimi*1639 _RL delta
2b4c90c108 Mart*1640 INTEGER ki, i, md
fe66051ebd Dimi*1641 _RL dkmp5, dstar
2fa42a6013 Alis*1642
2b4c90c108 Mart*1643 DO i = 1, imt
2fa42a6013 Alis*1644 ki = kbl(i)-1
2b4c90c108 Mart*1645 IF ((ki .ge. 1) .AND. (ki .LT. Nr)) THEN
2fa42a6013 Alis*1646 delta = (hbl(i) + zgrid(ki)) / (zgrid(ki) - zgrid(ki+1))
2b4c90c108 Mart*1647 DO md = 1, mdiff
2fa42a6013 Alis*1648 dkmp5 = casea(i) * diffus(i,ki,md) +
1649 1 (1.- casea(i)) * blmc (i,ki,md)
2b4c90c108 Mart*1650
1651
1652
1653
2fa42a6013 Alis*1654 dstar = (1.- delta)**2 * dkm1(i,md)
1655 & + delta**2 * dkmp5
1656 blmc(i,ki,md) = (1.- delta)*diffus(i,ki,md)
1657 & + delta*dstar
2b4c90c108 Mart*1658 ENDDO
2fa42a6013 Alis*1659 ghat(i,ki) = (1.- casea(i)) * ghat(i,ki)
2b4c90c108 Mart*1660 ENDIF
1661 ENDDO
2fa42a6013 Alis*1662
1663 #endif /* ALLOW_KPP */
1664
2b4c90c108 Mart*1665 RETURN
1666 END
2fa42a6013 Alis*1667
1668
1669
1670 SUBROUTINE STATEKPP (
25c3477f99 Mart*1671 O RHO1, DBLOC, DBSFC, TTALPHA, SSBETA,
edb6656069 Mart*1672 I ikey, bi, bj, myThid )
2fa42a6013 Alis*1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
ba0b047096 Mart*1690
2fa42a6013 Alis*1691
1692
1693
1694
1695
1696
7e819019d5 Dimi*1697
2fa42a6013 Alis*1698
1699
1700 IMPLICIT NONE
1701
1702 #include "SIZE.h"
1703 #include "EEPARAMS.h"
1704 #include "PARAMS.h"
1705 #include "KPP_PARAMS.h"
42c525bfb4 Alis*1706 #include "DYNVARS.h"
7e819019d5 Dimi*1707 #include "GRID.h"
853c5e0e2c Jean*1708 #ifdef ALLOW_AUTODIFF_TAMC
95c72ef3a1 Patr*1709 # include "tamc.h"
1710 #endif
2fa42a6013 Alis*1711
1712
1713 INTEGER bi, bj, myThid
fe66051ebd Dimi*1714 _RL RHO1 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
1715 _RL DBLOC ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
1716 _RL DBSFC ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
1717 _RL TTALPHA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
1718 _RL SSBETA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
2fa42a6013 Alis*1719
1720 #ifdef ALLOW_KPP
1721
1722
1723
1724
1725
1726
1727
1728
7e819019d5 Dimi*1729
2fa42a6013 Alis*1730
1731 _RL RHOK (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1732 _RL RHOKM1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1733 _RL RHO1K (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1734 _RL WORK1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1735 _RL WORK2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1736 _RL WORK3 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
7e819019d5 Dimi*1737
2b4c90c108 Mart*1738 INTEGER i, j, k
edb6656069 Mart*1739 INTEGER ikey, kkey
2fa42a6013 Alis*1740
1741
1742
edb6656069 Mart*1743 kkey = (ikey-1)*Nr + 1
3067745c9b Patr*1744
2b4c90c108 Mart*1745 k = 1
853c5e0e2c Jean*1746 #ifdef KPP_AUTODIFF_MORE_STORE
2b4c90c108 Mart*1747
edb6656069 Mart*1748
2b4c90c108 Mart*1749
edb6656069 Mart*1750
853c5e0e2c Jean*1751 #endif /* KPP_AUTODIFF_MORE_STORE */
94c8eb5701 Jean*1752 CALL FIND_RHO_2D(
1753 I 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1,
2b4c90c108 Mart*1754 I theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
2fa42a6013 Alis*1755 O WORK1,
2b4c90c108 Mart*1756 I k, bi, bj, myThid )
853c5e0e2c Jean*1757 #ifdef KPP_AUTODIFF_MORE_STORE
2b4c90c108 Mart*1758
edb6656069 Mart*1759
2b4c90c108 Mart*1760
edb6656069 Mart*1761
853c5e0e2c Jean*1762 #endif /* KPP_AUTODIFF_MORE_STORE */
2fa42a6013 Alis*1763
2b4c90c108 Mart*1764 CALL FIND_ALPHA(
4fa51dc730 Dimi*1765 I bi, bj, 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1,
25c3477f99 Mart*1766 O WORK2, myThid )
2fa42a6013 Alis*1767
2b4c90c108 Mart*1768 CALL FIND_BETA(
4fa51dc730 Dimi*1769 I bi, bj, 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1,
25c3477f99 Mart*1770 O WORK3, myThid )
2fa42a6013 Alis*1771
2b4c90c108 Mart*1772 DO j = 1-OLy, sNy+OLy
1773 DO i = 1-OLx, sNx+OLx
1774 RHO1(i,j) = WORK1(i,j) + rhoConst
1775 TTALPHA(i,j,1) = WORK2(i,j)
1776 SSBETA(i,j,1) = WORK3(i,j)
1777 DBSFC(i,j,1) = 0.
1778 ENDDO
1779 ENDDO
2fa42a6013 Alis*1780
1781
1782
1d478690dc Patr*1783
2b4c90c108 Mart*1784 DO k = 2, Nr
2fa42a6013 Alis*1785
edb6656069 Mart*1786 kkey = (ikey-1)*Nr + k
3067745c9b Patr*1787
853c5e0e2c Jean*1788 #ifdef KPP_AUTODIFF_MORE_STORE
95c72ef3a1 Patr*1789
edb6656069 Mart*1790
95c72ef3a1 Patr*1791
edb6656069 Mart*1792
853c5e0e2c Jean*1793 #endif /* KPP_AUTODIFF_MORE_STORE */
94c8eb5701 Jean*1794 CALL FIND_RHO_2D(
1795 I 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, k,
1796 I theta(1-OLx,1-OLy,k,bi,bj), salt(1-OLx,1-OLy,k,bi,bj),
2fa42a6013 Alis*1797 O RHOK,
94c8eb5701 Jean*1798 I k, bi, bj, myThid )
2fa42a6013 Alis*1799
853c5e0e2c Jean*1800 #ifdef KPP_AUTODIFF_MORE_STORE
95c72ef3a1 Patr*1801
edb6656069 Mart*1802
95c72ef3a1 Patr*1803
edb6656069 Mart*1804
853c5e0e2c Jean*1805 #endif /* KPP_AUTODIFF_MORE_STORE */
94c8eb5701 Jean*1806 CALL FIND_RHO_2D(
1807 I 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, k,
1808 I theta(1-OLx,1-OLy,k-1,bi,bj),salt(1-OLx,1-OLy,k-1,bi,bj),
2fa42a6013 Alis*1809 O RHOKM1,
94c8eb5701 Jean*1810 I k-1, bi, bj, myThid )
2fa42a6013 Alis*1811
853c5e0e2c Jean*1812 #ifdef KPP_AUTODIFF_MORE_STORE
95c72ef3a1 Patr*1813
edb6656069 Mart*1814
95c72ef3a1 Patr*1815
edb6656069 Mart*1816
853c5e0e2c Jean*1817 #endif /* KPP_AUTODIFF_MORE_STORE */
94c8eb5701 Jean*1818 CALL FIND_RHO_2D(
1819 I 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, k,
1820 I theta(1-OLx,1-OLy,1,bi,bj), salt(1-OLx,1-OLy,1,bi,bj),
2fa42a6013 Alis*1821 O RHO1K,
94c8eb5701 Jean*1822 I 1, bi, bj, myThid )
2fa42a6013 Alis*1823
853c5e0e2c Jean*1824 #ifdef KPP_AUTODIFF_MORE_STORE
edb6656069 Mart*1825
1826
1827
853c5e0e2c Jean*1828 #endif /* KPP_AUTODIFF_MORE_STORE */
3067745c9b Patr*1829
2b4c90c108 Mart*1830 CALL FIND_ALPHA(
1831 I bi, bj, 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, k, k,
25c3477f99 Mart*1832 O WORK1, myThid )
2fa42a6013 Alis*1833
2b4c90c108 Mart*1834 CALL FIND_BETA(
1835 I bi, bj, 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, k, k,
25c3477f99 Mart*1836 O WORK2, myThid )
2fa42a6013 Alis*1837
2b4c90c108 Mart*1838 DO j = 1-OLy, sNy+OLy
1839 DO i = 1-OLx, sNx+OLx
1840 TTALPHA(i,j,k) = WORK1 (i,j)
1841 SSBETA(i,j,k) = WORK2 (i,j)
1842 DBLOC(i,j,k-1) = gravity * (RHOK(i,j) - RHOKM1(i,j)) /
1843 & (RHOK(i,j) + rhoConst)
1844 DBSFC(i,j,k) = gravity * (RHOK(i,j) - RHO1K (i,j)) /
1845 & (RHOK(i,j) + rhoConst)
1846 ENDDO
1847 ENDDO
1848
1849 ENDDO
1850
1851
1852 DO j = 1-OLy, sNy+OLy
1853 DO i = 1-OLx, sNx+OLx
1854 TTALPHA(i,j,Nrp1) = TTALPHA(i,j,Nr)
1855 SSBETA(i,j,Nrp1) = SSBETA(i,j,Nr)
1856 DBLOC(i,j,Nr) = 0.
1857 ENDDO
1858 ENDDO
2fa42a6013 Alis*1859
7e819019d5 Dimi*1860 #ifdef ALLOW_DIAGNOSTICS
1861 IF ( useDiagnostics ) THEN
2b4c90c108 Mart*1862 CALL DIAGNOSTICS_FILL(DBSFC ,'KPPdbsfc',0,Nr,2,bi,bj,myThid)
1863 CALL DIAGNOSTICS_FILL(DBLOC ,'KPPdbloc',0,Nr,2,bi,bj,myThid)
7e819019d5 Dimi*1864 ENDIF
1865 #endif /* ALLOW_DIAGNOSTICS */
1866
2fa42a6013 Alis*1867 #endif /* ALLOW_KPP */
1868
1869 RETURN
1870 END
e750a5e49e Mart*1871
1872
1873
1874 SUBROUTINE KPP_DOUBLEDIFF (
1875 I TTALPHA, SSBETA,
a9d2e4c565 Jean*1876 U kappaRT,
e750a5e49e Mart*1877 U kappaRS,
edb6656069 Mart*1878 I ikey, iMin, iMax, jMin, jMax, bi, bj, myThid )
e750a5e49e Mart*1879
1880
a9d2e4c565 Jean*1881
1882
e750a5e49e Mart*1883
1884
1885
2b4c90c108 Mart*1886
b7b61e618a Mart*1887
e750a5e49e Mart*1888
1889
1890
1891
1892
ba0b047096 Mart*1893
e750a5e49e Mart*1894
1895
1896
a9d2e4c565 Jean*1897
e750a5e49e Mart*1898
1899
1900
1901
1902 IMPLICIT NONE
1903
1904 #include "SIZE.h"
1905 #include "EEPARAMS.h"
1906 #include "PARAMS.h"
1907 #include "KPP_PARAMS.h"
1908 #include "DYNVARS.h"
1909 #include "GRID.h"
853c5e0e2c Jean*1910 #ifdef ALLOW_AUTODIFF_TAMC
e750a5e49e Mart*1911 # include "tamc.h"
1912 #endif
1913
1914
edb6656069 Mart*1915 INTEGER ikey, iMin, iMax, jMin, jMax, bi, bj, myThid
e750a5e49e Mart*1916
1917 _RL TTALPHA( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
1918 _RL SSBETA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nrp1 )
52b77e9710 Jean*1919 _RL KappaRT( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
1920 _RL KappaRS( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
e750a5e49e Mart*1921
1922 #ifdef ALLOW_KPP
1923
1924
1925
1926
2b4c90c108 Mart*1927
b7b61e618a Mart*1928
e750a5e49e Mart*1929
2b4c90c108 Mart*1930 INTEGER i, j, k
edb6656069 Mart*1931 INTEGER kkey
e750a5e49e Mart*1932
1933
1934
1935
1936
1937
1938
1939 _RL alphaDT ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
1940 _RL betaDS ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
1941 _RL nuddt ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
1942 _RL nudds ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
1943 _RL Rrho
1944 _RL numol, rFac, nutmp
1945 INTEGER Km1
1946
1947
1948 numol = 1.5 _d -06
1949 rFac = 1. _d 0 / (Rrho0 - 1. _d 0 )
1950
edb6656069 Mart*1951 kkey = (ikey-1)*Nr + 1
e750a5e49e Mart*1952
853c5e0e2c Jean*1953
e750a5e49e Mart*1954
edb6656069 Mart*1955
e750a5e49e Mart*1956
edb6656069 Mart*1957
853c5e0e2c Jean*1958
e750a5e49e Mart*1959
2b4c90c108 Mart*1960 DO k = 1, Nr
1961 Km1 = MAX(k-1,1)
1962 DO j = 1-OLy, sNy+OLy
1963 DO i = 1-OLx, sNx+OLx
1964 alphaDT(i,j) = ( theta(i,j,km1,bi,bj)-theta(i,j,k,bi,bj) )
1965 & * 0.5 _d 0 * ABS( TTALPHA(i,j,km1) + TTALPHA(i,j,k) )
1966 betaDS(i,j) = ( salt(i,j,km1,bi,bj)-salt(i,j,k,bi,bj) )
1967 & * 0.5 _d 0 * ( SSBETA(i,j,km1) + SSBETA(i,j,k) )
1968 nuddt(i,j) = 0. _d 0
1969 nudds(i,j) = 0. _d 0
e750a5e49e Mart*1970 ENDDO
1971 ENDDO
2b4c90c108 Mart*1972 IF ( k .GT. 1 ) THEN
1973 DO j = jMin, jMax
1974 DO i = iMin, iMax
e750a5e49e Mart*1975 Rrho = 0. _d 0
1976
a9d2e4c565 Jean*1977
e750a5e49e Mart*1978
2b4c90c108 Mart*1979 IF ( alphaDT(i,j) .GT. betaDS(i,j)
1980 & .AND. betaDS(i,j) .GT. 0. _d 0 ) THEN
1981 Rrho = MIN( alphaDT(i,j)/betaDS(i,j), Rrho0 )
e750a5e49e Mart*1982
2b4c90c108 Mart*1983
e750a5e49e Mart*1984 nutmp = ( 1. _d 0 - (Rrho - 1. _d 0) * rFac )
2b4c90c108 Mart*1985 nudds(i,j) = dsfmax * nutmp * nutmp * nutmp
e750a5e49e Mart*1986
2b4c90c108 Mart*1987 nuddt(i,j) = 0.7 _d 0 * nudds(i,j)
1988 ELSEIF ( alphaDT(i,j) .LT. 0. _d 0
1989 & .AND. betaDS(i,j) .LT. 0. _d 0
1990 & .AND.alphaDT(i,j) .GT. betaDS(i,j) ) THEN
e750a5e49e Mart*1991
1992
1993
1994
2b4c90c108 Mart*1995 Rrho = alphaDT(i,j)/betaDS(i,j)
e750a5e49e Mart*1996
2b4c90c108 Mart*1997 nuddt(i,j) = numol * 0.909 _d 0
a9d2e4c565 Jean*1998 & * exp ( 4.6 _d 0 * exp (
e750a5e49e Mart*1999 & - 5.4 _d 0 * ( 1. _d 0/Rrho - 1. _d 0 ) ) )
2000
2001
2b4c90c108 Mart*2002
e750a5e49e Mart*2003
2b4c90c108 Mart*2004 nudds(i,j) = nuddt(i,j) * MAX( 0.15 _d 0 * Rrho,
e750a5e49e Mart*2005 & 1.85 _d 0 * Rrho - 0.85 _d 0 )
2006 ELSE
a9d2e4c565 Jean*2007
2008
2009
e750a5e49e Mart*2010 ENDIF
2011 ENDDO
2012 ENDDO
2b4c90c108 Mart*2013
e750a5e49e Mart*2014 ENDIF
2015
2b4c90c108 Mart*2016 DO j = 1-OLy, sNy+OLy
2017 DO i = 1-OLx, sNx+OLx
2018 kappaRT(i,j,k) = kappaRT(i,j,k) + nuddt(i,j)
2019 kappaRS(i,j,k) = kappaRS(i,j,k) + nudds(i,j)
e750a5e49e Mart*2020 ENDDO
2021 ENDDO
2022 #ifdef ALLOW_DIAGNOSTICS
2023 IF ( useDiagnostics ) THEN
2024 CALL DIAGNOSTICS_FILL(nuddt,'KPPnuddt',k,1,2,bi,bj,myThid)
2025 CALL DIAGNOSTICS_FILL(nudds,'KPPnudds',k,1,2,bi,bj,myThid)
2026 ENDIF
2027 #endif /* ALLOW_DIAGNOSTICS */
2b4c90c108 Mart*2028
e750a5e49e Mart*2029 ENDDO
2030 #endif /* ALLOW_KPP */
2031
2032 RETURN
2033 END