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