/[MITgcm]/MITgcm/pkg/kpp/kpp_routines.F
ViewVC logotype

Contents of /MITgcm/pkg/kpp/kpp_routines.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.9 - (show annotations) (download)
Tue Sep 18 20:30:59 2001 UTC (22 years, 8 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint44e_post, checkpoint44f_post, checkpoint43a-release1mods, chkpt44d_post, release1_p1, release1_p2, release1_p3, release1_p4, checkpoint44e_pre, release1_b1, checkpoint43, release1_chkpt44d_post, release1-branch_tutorials, checkpoint45d_post, chkpt44a_post, checkpoint44h_pre, chkpt44c_pre, checkpoint45a_post, ecco_c44_e19, ecco_c44_e18, ecco_c44_e17, ecco_c44_e16, checkpoint44g_post, checkpoint45b_post, release1-branch-end, release1_final_v1, checkpoint44b_post, checkpoint45c_post, checkpoint44h_post, ecco_c44_e22, chkpt44a_pre, ecco_c44_e23, ecco_c44_e20, ecco_c44_e21, ecco_c44_e24, ecco-branch-mod1, ecco-branch-mod2, ecco-branch-mod3, ecco-branch-mod4, ecco-branch-mod5, release1_beta1, checkpoint44b_pre, checkpoint42, checkpoint40, checkpoint41, checkpoint44, checkpoint45, chkpt44c_post, checkpoint44f_pre, release1-branch_branchpoint
Branch point for: release1_final, release1-branch, release1, ecco-branch, release1_coupled
Changes since 1.8: +3 -3 lines
Bug fix in S/R ri_iwmix (benign bug); spotted by D. Menemenlis.

1 C $Header: /u/gcmpack/models/MITgcmUV/pkg/kpp/kpp_routines.F,v 1.8 2001/03/25 22:33:55 heimbach Exp $
2 C $Name: checkpoint40pre7 $
3
4 #include "KPP_OPTIONS.h"
5
6 C-- File kpp_routines.F: subroutines needed to implement
7 C-- KPP vertical mixing scheme
8 C-- Contents
9 C-- o KPPMIX - Main driver and interface routine.
10 C-- o BLDEPTH - Determine oceanic planetary boundary layer depth.
11 C-- o WSCALE - Compute turbulent velocity scales.
12 C-- o RI_IWMIX - Compute interior viscosity diffusivity coefficients.
13 C-- o Z121 - Apply 121 vertical smoothing.
14 C-- o KPP_SMOOTH_HORIZ - Apply horizontal smoothing to KPP array.
15 C-- o SMOOTH_HORIZ - Apply horizontal smoothing to global array.
16 C-- o BLMIX - Boundary layer mixing coefficients.
17 C-- o ENHANCE - Enhance diffusivity at boundary layer interface.
18 C-- o STATEKPP - Compute buoyancy-related input arrays.
19
20 c***********************************************************************
21
22 SUBROUTINE KPPMIX (
23 I mytime, mythid
24 I , kmtj, shsq, dvsq, ustar
25 I , bo, bosol, dbloc, Ritop, coriol
26 I , ikey
27 O , diffus
28 U , ghat
29 O , hbl )
30
31 c-----------------------------------------------------------------------
32 c
33 c Main driver subroutine for kpp vertical mixing scheme and
34 c interface to greater ocean model
35 c
36 c written by: bill large, june 6, 1994
37 c modified by: jan morzel, june 30, 1994
38 c bill large, august 11, 1994
39 c bill large, january 25, 1995 : "dVsq" and 1d code
40 c detlef stammer, august 1997 : for use with MIT GCM Classic
41 c d. menemenlis, june 1998 : for use with MIT GCM UV
42 c
43 c-----------------------------------------------------------------------
44
45 IMPLICIT NONE
46
47 #include "SIZE.h"
48 #include "EEPARAMS.h"
49 #include "PARAMS.h"
50 #include "DYNVARS.h"
51 #include "FFIELDS.h"
52 #include "KPP_PARAMS.h"
53
54 c input
55 c myTime - current time in simulation
56 c myThid - thread number for this instance of the routine
57 c kmtj (imt) - number of vertical layers on this row
58 c shsq (imt,Nr) - (local velocity shear)^2 ((m/s)^2)
59 c dvsq (imt,Nr) - (velocity shear re sfc)^2 ((m/s)^2)
60 c ustar (imt) - surface friction velocity (m/s)
61 c bo (imt) - surface turbulent buoy. forcing (m^2/s^3)
62 c bosol (imt) - radiative buoyancy forcing (m^2/s^3)
63 c dbloc (imt,Nr) - local delta buoyancy across interfaces (m/s^2)
64 c dblocSm(imt,Nr) - horizontally smoothed dbloc (m/s^2)
65 c stored in ghat to save space
66 c Ritop (imt,Nr) - numerator of bulk Richardson Number
67 c (zref-z) * delta buoyancy w.r.t. surface ((m/s)^2)
68 c coriol (imt) - Coriolis parameter (1/s)
69 c note: there is a conversion from 2-D to 1-D for input output variables,
70 c e.g., hbl(sNx,sNy) -> hbl(imt),
71 c where hbl(i,j) -> hbl((j-1)*sNx+i)
72
73 _RL mytime
74 integer mythid
75 integer kmtj (imt )
76 _KPP_RL shsq (imt,Nr)
77 _KPP_RL dvsq (imt,Nr)
78 _KPP_RL ustar (imt )
79 _KPP_RL bo (imt )
80 _KPP_RL bosol (imt )
81 _KPP_RL dbloc (imt,Nr)
82 _KPP_RL Ritop (imt,Nr)
83 _KPP_RL coriol(imt )
84
85 integer ikey
86
87 c output
88 c diffus (imt,1) - vertical viscosity coefficient (m^2/s)
89 c diffus (imt,2) - vertical scalar diffusivity (m^2/s)
90 c diffus (imt,3) - vertical temperature diffusivity (m^2/s)
91 c ghat (imt) - nonlocal transport coefficient (s/m^2)
92 c hbl (imt) - mixing layer depth (m)
93
94 _KPP_RL diffus(imt,0:Nrp1,mdiff)
95 _KPP_RL ghat (imt,Nr)
96 _KPP_RL hbl (imt)
97
98 #ifdef ALLOW_KPP
99
100 c local
101 c kbl (imt ) - index of first grid level below hbl
102 c bfsfc (imt ) - surface buoyancy forcing (m^2/s^3)
103 c casea (imt ) - 1 in case A; 0 in case B
104 c stable (imt ) - 1 in stable forcing; 0 if unstable
105 c dkm1 (imt, mdiff) - boundary layer diffusivity at kbl-1 level
106 c blmc (imt,Nr,mdiff) - boundary layer mixing coefficients
107 c sigma (imt ) - normalized depth (d / hbl)
108 c Rib (imt,Nr ) - bulk Richardson number
109
110 integer kbl (imt )
111 _KPP_RL bfsfc (imt )
112 _KPP_RL casea (imt )
113 _KPP_RL stable(imt )
114 _KPP_RL dkm1 (imt, mdiff)
115 _KPP_RL blmc (imt,Nr,mdiff)
116 _KPP_RL sigma (imt )
117 _KPP_RL Rib (imt,Nr )
118
119 integer i, k, md
120
121 c-----------------------------------------------------------------------
122 c compute interior mixing coefficients everywhere, due to constant
123 c internal wave activity, static instability, and local shear
124 c instability.
125 c (ghat is temporary storage for horizontally smoothed dbloc)
126 c-----------------------------------------------------------------------
127
128 CADJ STORE ghat = comlev1_kpp, key = ikey
129
130 call Ri_iwmix (
131 I kmtj, shsq, dbloc, ghat
132 I , ikey
133 O , diffus )
134
135 c-----------------------------------------------------------------------
136 c set seafloor values to zero and fill extra "Nrp1" coefficients
137 c for blmix
138 c-----------------------------------------------------------------------
139
140 do md = 1, mdiff
141 do i = 1,imt
142 do k=kmtj(i),Nrp1
143 diffus(i,k,md) = 0.0
144 end do
145 end do
146 end do
147
148 c-----------------------------------------------------------------------
149 c compute boundary layer mixing coefficients:
150 c
151 c diagnose the new boundary layer depth
152 c-----------------------------------------------------------------------
153
154 call bldepth (
155 I mytime, mythid
156 I , kmtj
157 I , dvsq, dbloc, Ritop, ustar, bo, bosol, coriol
158 I , ikey
159 O , hbl, bfsfc, stable, casea, kbl, Rib, sigma
160 & )
161
162 CADJ STORE hbl,bfsfc,stable,casea,kbl = comlev1_kpp, key = ikey
163
164 c-----------------------------------------------------------------------
165 c compute boundary layer diffusivities
166 c-----------------------------------------------------------------------
167
168 call blmix (
169 I ustar, bfsfc, hbl, stable, casea, diffus, kbl
170 O , dkm1, blmc, ghat, sigma, ikey
171 & )
172
173 CADJ STORE dkm1,blmc,ghat = comlev1_kpp, key = ikey
174
175 c-----------------------------------------------------------------------
176 c enhance diffusivity at interface kbl - 1
177 c-----------------------------------------------------------------------
178
179 call enhance (
180 I dkm1, hbl, kbl, diffus, casea
181 U , ghat
182 O , blmc )
183
184 c-----------------------------------------------------------------------
185 c combine interior and boundary layer coefficients and nonlocal term
186 c-----------------------------------------------------------------------
187
188 do k = 1, Nr
189 do i = 1, imt
190 if (k .lt. kbl(i)) then
191 do md = 1, mdiff
192 diffus(i,k,md) = blmc(i,k,md)
193 end do
194 else
195 ghat(i,k) = 0.
196 endif
197 end do
198 end do
199
200 #endif /* ALLOW_KPP */
201
202 return
203 end
204
205 c*************************************************************************
206
207 subroutine bldepth (
208 I mytime, mythid
209 I , kmtj
210 I , dvsq, dbloc, Ritop, ustar, bo, bosol, coriol
211 I , ikey
212 O , hbl, bfsfc, stable, casea, kbl, Rib, sigma
213 & )
214
215 c the oceanic planetary boundary layer depth, hbl, is determined as
216 c the shallowest depth where the bulk Richardson number is
217 c equal to the critical value, Ricr.
218 c
219 c bulk Richardson numbers are evaluated by computing velocity and
220 c buoyancy differences between values at zgrid(kl) < 0 and surface
221 c reference values.
222 c in this configuration, the reference values are equal to the
223 c values in the surface layer.
224 c when using a very fine vertical grid, these values should be
225 c computed as the vertical average of velocity and buoyancy from
226 c the surface down to epsilon*zgrid(kl).
227 c
228 c when the bulk Richardson number at k exceeds Ricr, hbl is
229 c linearly interpolated between grid levels zgrid(k) and zgrid(k-1).
230 c
231 c The water column and the surface forcing are diagnosed for
232 c stable/ustable forcing conditions, and where hbl is relative
233 c to grid points (caseA), so that conditional branches can be
234 c avoided in later subroutines.
235 c
236 IMPLICIT NONE
237
238 #include "SIZE.h"
239 #include "EEPARAMS.h"
240 #include "PARAMS.h"
241 #include "KPP_PARAMS.h"
242 #include "FFIELDS.h"
243
244 c input
245 c------
246 c myTime : current time in simulation
247 c myThid : thread number for this instance of the routine
248 c kmtj : number of vertical layers
249 c dvsq : (velocity shear re sfc)^2 ((m/s)^2)
250 c dbloc : local delta buoyancy across interfaces (m/s^2)
251 c Ritop : numerator of bulk Richardson Number
252 c =(z-zref)*dbsfc, where dbsfc=delta
253 c buoyancy with respect to surface ((m/s)^2)
254 c ustar : surface friction velocity (m/s)
255 c bo : surface turbulent buoyancy forcing (m^2/s^3)
256 c bosol : radiative buoyancy forcing (m^2/s^3)
257 c coriol : Coriolis parameter (1/s)
258 _RL mytime
259 integer mythid
260 integer kmtj(imt)
261 _KPP_RL dvsq (imt,Nr)
262 _KPP_RL dbloc (imt,Nr)
263 _KPP_RL Ritop (imt,Nr)
264 _KPP_RL ustar (imt)
265 _KPP_RL bo (imt)
266 _KPP_RL bosol (imt)
267 _KPP_RL coriol(imt)
268 integer ikey
269
270 c output
271 c--------
272 c hbl : boundary layer depth (m)
273 c bfsfc : Bo+radiation absorbed to d=hbf*hbl (m^2/s^3)
274 c stable : =1 in stable forcing; =0 unstable
275 c casea : =1 in case A, =0 in case B
276 c kbl : -1 of first grid level below hbl
277 c Rib : Bulk Richardson number
278 c sigma : normalized depth (d/hbl)
279 _KPP_RL hbl (imt)
280 _KPP_RL bfsfc (imt)
281 _KPP_RL stable(imt)
282 _KPP_RL casea (imt)
283 integer kbl (imt)
284 _KPP_RL Rib (imt,Nr)
285 _KPP_RL sigma (imt)
286
287 #ifdef ALLOW_KPP
288
289 c local
290 c-------
291 c wm, ws : turbulent velocity scales (m/s)
292 _KPP_RL wm(imt), ws(imt)
293 _RL worka(imt)
294
295 _KPP_RL bvsq, vtsq, hekman, hmonob, hlimit, tempVar1, tempVar2
296 integer i, kl
297
298 _KPP_RL p5 , eins
299 parameter ( p5=0.5, eins=1.0 )
300 _RL minusone
301 parameter ( minusone=-1.0 )
302
303 c find bulk Richardson number at every grid level until > Ricr
304 c
305 c note: the reference depth is -epsilon/2.*zgrid(k), but the reference
306 c u,v,t,s values are simply the surface layer values,
307 c and not the averaged values from 0 to 2*ref.depth,
308 c which is necessary for very fine grids(top layer < 2m thickness)
309 c note: max values when Ricr never satisfied are
310 c kbl(i)=kmtj(i) and hbl(i)=-zgrid(kmtj(i))
311
312 c initialize hbl and kbl to bottomed out values
313
314 do i = 1, imt
315 Rib(i,1) = 0.0
316 kbl(i) = max(kmtj(i),1)
317 hbl(i) = -zgrid(kbl(i))
318 end do
319
320 do kl = 2, Nr
321
322 c compute bfsfc = sw fraction at hbf * zgrid
323
324 do i = 1, imt
325 worka(i) = zgrid(kl)
326 end do
327 call SWFRAC(
328 I imt, hbf,
329 I mytime, mythid,
330 U worka )
331
332 do i = 1, imt
333
334 c use caseA as temporary array
335
336 casea(i) = -zgrid(kl)
337
338 c compute bfsfc= Bo + radiative contribution down to hbf * hbl
339
340 bfsfc(i) = bo(i) + bosol(i)*(1. - worka(i))
341 stable(i) = p5 + sign(p5,bfsfc(i))
342 sigma(i) = stable(i) + (1. - stable(i)) * epsilon
343
344 end do
345
346 c-----------------------------------------------------------------------
347 c compute velocity scales at sigma, for hbl= caseA = -zgrid(kl)
348 c-----------------------------------------------------------------------
349
350 call wscale (
351 I sigma, casea, ustar, bfsfc,
352 O wm, ws )
353
354 do i = 1, imt
355
356 c-----------------------------------------------------------------------
357 c compute the turbulent shear contribution to Rib
358 c-----------------------------------------------------------------------
359
360 bvsq = p5 *
361 1 ( dbloc(i,kl-1) / (zgrid(kl-1)-zgrid(kl ))+
362 2 dbloc(i,kl ) / (zgrid(kl )-zgrid(kl+1)))
363
364 if (bvsq .eq. 0.) then
365 vtsq = 0.0
366 else
367 vtsq = -zgrid(kl) * ws(i) * sqrt(abs(bvsq)) * Vtc
368 endif
369
370 c compute bulk Richardson number at new level
371 c note: Ritop needs to be zero on land and ocean bottom
372 c points so that the following if statement gets triggered
373 c correctly; otherwise, hbl might get set to (big) negative
374 c values, that might exceed the limit for the "exp" function
375 c in "SWFRAC"
376
377 c
378 c rg: assignment to double precision variable to avoid overflow
379 c ph: test for zero nominator
380 c
381
382 tempVar1 = dvsq(i,kl) + vtsq
383 tempVar2 = max(tempVar1, phepsi)
384 Rib(i,kl) = Ritop(i,kl) / tempVar2
385
386 end do
387 end do
388
389 do kl = 2, Nr
390 do i = 1, imt
391 if (kbl(i).eq.kmtj(i) .and. Rib(i,kl).gt.Ricr) kbl(i) = kl
392 end do
393 end do
394
395 CADJ store kbl = comlev1_kpp
396 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
397
398 do i = 1, imt
399 kl = kbl(i)
400 c linearly interpolate to find hbl where Rib = Ricr
401 if (kl.gt.1 .and. kl.lt.kmtj(i)) then
402 tempVar1 = (Rib(i,kl)-Rib(i,kl-1))
403 hbl(i) = -zgrid(kl-1) + (zgrid(kl-1)-zgrid(kl)) *
404 1 (Ricr - Rib(i,kl-1)) / tempVar1
405 endif
406 end do
407
408 CADJ store hbl = comlev1_kpp
409 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
410
411 c-----------------------------------------------------------------------
412 c find stability and buoyancy forcing for boundary layer
413 c-----------------------------------------------------------------------
414
415 do i = 1, imt
416 worka(i) = hbl(i)
417 end do
418 call SWFRAC(
419 I imt, minusone,
420 I mytime, mythid,
421 U worka )
422
423 do i = 1, imt
424 bfsfc(i) = bo(i) + bosol(i) * (1. - worka(i))
425 end do
426 CADJ store bfsfc = comlev1_kpp
427 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
428
429 c-- ensure bfsfc is never 0
430 do i = 1, imt
431 stable(i) = p5 + sign( p5, bfsfc(i) )
432 bfsfc(i) = sign(eins,bfsfc(i))*max(phepsi,abs(bfsfc(i)))
433 end do
434
435 CADJ store bfsfc = comlev1_kpp
436 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
437
438 c-----------------------------------------------------------------------
439 c check hbl limits for hekman or hmonob
440 c ph: test for zero nominator
441 c-----------------------------------------------------------------------
442
443 do i = 1, imt
444 if (bfsfc(i) .gt. 0.0) then
445 hekman = cekman * ustar(i) / max(abs(Coriol(i)),phepsi)
446 hmonob = cmonob * ustar(i)*ustar(i)*ustar(i)
447 & / vonk / bfsfc(i)
448 hlimit = stable(i) * min(hekman,hmonob)
449 & + (stable(i)-1.) * zgrid(Nr)
450 hbl(i) = min(hbl(i),hlimit)
451 end if
452 end do
453 CADJ store hbl = comlev1_kpp
454 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
455
456 do i = 1, imt
457 hbl(i) = max(hbl(i),minKPPhbl)
458 kbl(i) = kmtj(i)
459 end do
460
461 CADJ store hbl = comlev1_kpp
462 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
463
464 c-----------------------------------------------------------------------
465 c find new kbl
466 c-----------------------------------------------------------------------
467
468 do kl = 2, Nr
469 do i = 1, imt
470 if ( kbl(i).eq.kmtj(i) .and. (-zgrid(kl)).gt.hbl(i) ) then
471 kbl(i) = kl
472 endif
473 end do
474 end do
475
476 c-----------------------------------------------------------------------
477 c find stability and buoyancy forcing for final hbl values
478 c-----------------------------------------------------------------------
479
480 do i = 1, imt
481 worka(i) = hbl(i)
482 end do
483 call SWFRAC(
484 I imt, minusone,
485 I mytime, mythid,
486 U worka )
487
488 do i = 1, imt
489 bfsfc(i) = bo(i) + bosol(i) * (1. - worka(i))
490 end do
491 CADJ store bfsfc = comlev1_kpp
492 CADJ & , key = ikey, shape = (/ (sNx+2*OLx)*(sNy+2*OLy) /)
493
494 c-- ensures bfsfc is never 0
495 do i = 1, imt
496 stable(i) = p5 + sign( p5, bfsfc(i) )
497 bfsfc(i) = sign(eins,bfsfc(i))*max(phepsi,abs(bfsfc(i)))
498 end do
499
500 c-----------------------------------------------------------------------
501 c determine caseA and caseB
502 c-----------------------------------------------------------------------
503
504 do i = 1, imt
505 casea(i) = p5 +
506 1 sign(p5, -zgrid(kbl(i)) - p5*hwide(kbl(i)) - hbl(i))
507 end do
508
509 #endif /* ALLOW_KPP */
510
511 return
512 end
513
514 c*************************************************************************
515
516 subroutine wscale (
517 I sigma, hbl, ustar, bfsfc,
518 O wm, ws )
519
520 c compute turbulent velocity scales.
521 c use a 2D-lookup table for wm and ws as functions of ustar and
522 c zetahat (=vonk*sigma*hbl*bfsfc).
523 c
524 c note: the lookup table is only used for unstable conditions
525 c (zehat.le.0), in the stable domain wm (=ws) gets computed
526 c directly.
527 c
528 IMPLICIT NONE
529
530 #include "SIZE.h"
531 #include "KPP_PARAMS.h"
532
533 c input
534 c------
535 c sigma : normalized depth (d/hbl)
536 c hbl : boundary layer depth (m)
537 c ustar : surface friction velocity (m/s)
538 c bfsfc : total surface buoyancy flux (m^2/s^3)
539 _KPP_RL sigma(imt)
540 _KPP_RL hbl (imt)
541 _KPP_RL ustar(imt)
542 _KPP_RL bfsfc(imt)
543
544 c output
545 c--------
546 c wm, ws : turbulent velocity scales at sigma
547 _KPP_RL wm(imt), ws(imt)
548
549 #ifdef ALLOW_KPP
550
551 c local
552 c------
553 c zehat : = zeta * ustar**3
554 _KPP_RL zehat
555
556 integer iz, izp1, ju, i, jup1
557 _KPP_RL udiff, zdiff, zfrac, ufrac, fzfrac, wam
558 _KPP_RL wbm, was, wbs, u3, tempVar
559
560 c-----------------------------------------------------------------------
561 c use lookup table for zehat < zmax only; otherwise use
562 c stable formulae
563 c-----------------------------------------------------------------------
564
565 do i = 1, imt
566 zehat = vonk*sigma(i)*hbl(i)*bfsfc(i)
567
568 if (zehat .le. zmax) then
569
570 zdiff = zehat - zmin
571 iz = int( zdiff / deltaz )
572 iz = min( iz, nni )
573 iz = max( iz, 0 )
574 izp1 = iz + 1
575
576 udiff = ustar(i) - umin
577 ju = int( udiff / deltau )
578 ju = min( ju, nnj )
579 ju = max( ju, 0 )
580 jup1 = ju + 1
581
582 zfrac = zdiff / deltaz - float(iz)
583 ufrac = udiff / deltau - float(ju)
584
585 fzfrac= 1. - zfrac
586 wam = fzfrac * wmt(iz,jup1) + zfrac * wmt(izp1,jup1)
587 wbm = fzfrac * wmt(iz,ju ) + zfrac * wmt(izp1,ju )
588 wm(i) = (1.-ufrac) * wbm + ufrac * wam
589
590 was = fzfrac * wst(iz,jup1) + zfrac * wst(izp1,jup1)
591 wbs = fzfrac * wst(iz,ju ) + zfrac * wst(izp1,ju )
592 ws(i) = (1.-ufrac) * wbs + ufrac * was
593
594 else
595
596 u3 = ustar(i) * ustar(i) * ustar(i)
597 tempVar = u3 + conc1 * zehat
598 wm(i) = vonk * ustar(i) * u3 / tempVar
599 ws(i) = wm(i)
600
601 endif
602
603 end do
604
605 #endif /* ALLOW_KPP */
606
607 return
608 end
609
610 c*************************************************************************
611
612 subroutine Ri_iwmix (
613 I kmtj, shsq, dbloc, dblocSm
614 I , ikey
615 O , diffus )
616
617 c compute interior viscosity diffusivity coefficients due
618 c to shear instability (dependent on a local Richardson number),
619 c to background internal wave activity, and
620 c to static instability (local Richardson number < 0).
621
622 IMPLICIT NONE
623
624 #include "SIZE.h"
625 #include "EEPARAMS.h"
626 #include "PARAMS.h"
627 #include "KPP_PARAMS.h"
628
629 c input
630 c kmtj (imt) number of vertical layers on this row
631 c shsq (imt,Nr) (local velocity shear)^2 ((m/s)^2)
632 c dbloc (imt,Nr) local delta buoyancy (m/s^2)
633 c dblocSm(imt,Nr) horizontally smoothed dbloc (m/s^2)
634 integer kmtj (imt)
635 _KPP_RL shsq (imt,Nr)
636 _KPP_RL dbloc (imt,Nr)
637 _KPP_RL dblocSm(imt,Nr)
638 integer ikey
639
640 c output
641 c diffus(imt,0:Nrp1,1) vertical viscosivity coefficient (m^2/s)
642 c diffus(imt,0:Nrp1,2) vertical scalar diffusivity (m^2/s)
643 c diffus(imt,0:Nrp1,3) vertical temperature diffusivity (m^2/s)
644 _KPP_RL diffus(imt,0:Nrp1,3)
645
646 #ifdef ALLOW_KPP
647
648 c local variables
649 c Rig local Richardson number
650 c fRi, fcon function of Rig
651 _KPP_RL Rig
652 _KPP_RL fRi, fcon
653 _KPP_RL ratio
654 integer i, ki, mr
655 _KPP_RL c1, c0
656
657 #ifdef ALLOW_KPP_VERTICALLY_SMOOTH
658 CADJ INIT kpp_ri_tape_mr = common, 1
659 #endif
660
661 c constants
662 c1 = 1.0
663 c0 = 0.0
664
665 c-----------------------------------------------------------------------
666 c compute interior gradient Ri at all interfaces ki=1,Nr, (not surface)
667 c use diffus(*,*,1) as temporary storage of Ri to be smoothed
668 c use diffus(*,*,2) as temporary storage for Brunt-Vaisala squared
669 c set values at bottom and below to nearest value above bottom
670 #ifdef ALLOW_AUTODIFF_TAMC
671 C break data flow dependence on diffus
672 diffus(1,1,1) = 0.0
673 #endif
674
675 do ki = 1, Nr
676 do i = 1, imt
677 if (kmtj(i) .LE. 1 ) then
678 diffus(i,ki,1) = 0.
679 diffus(i,ki,2) = 0.
680 elseif (ki .GE. kmtj(i)) then
681 diffus(i,ki,1) = diffus(i,ki-1,1)
682 diffus(i,ki,2) = diffus(i,ki-1,2)
683 else
684 diffus(i,ki,1) = dblocSm(i,ki) * (zgrid(ki)-zgrid(ki+1))
685 & / max( Shsq(i,ki), phepsi )
686 diffus(i,ki,2) = dbloc(i,ki) / (zgrid(ki)-zgrid(ki+1))
687 endif
688 end do
689 end do
690
691 c-----------------------------------------------------------------------
692 c vertically smooth Ri
693 #ifdef ALLOW_KPP_VERTICALLY_SMOOTH
694 do mr = 1, num_v_smooth_Ri
695
696 CADJ store diffus(:,:,1) = kpp_ri_tape_mr
697 CADJ & , key=mr, shape=(/ (sNx+2*OLx)*(sNy+2*OLy),Nr+2 /)
698
699 call z121 (
700 U diffus(1,0,1))
701 end do
702 #endif
703
704 c-----------------------------------------------------------------------
705 c after smoothing loop
706
707 do ki = 1, Nr
708 do i = 1, imt
709
710 c evaluate f of Brunt-Vaisala squared for convection, store in fcon
711
712 Rig = max ( diffus(i,ki,2) , BVSQcon )
713 ratio = min ( (BVSQcon - Rig) / BVSQcon, c1 )
714 fcon = c1 - ratio * ratio
715 fcon = fcon * fcon * fcon
716
717 c evaluate f of smooth Ri for shear instability, store in fRi
718
719 Rig = max ( diffus(i,ki,1), c0 )
720 ratio = min ( Rig / Riinfty , c1 )
721 fRi = c1 - ratio * ratio
722 fRi = fRi * fRi * fRi
723
724 c ----------------------------------------------------------------------
725 c evaluate diffusivities and viscosity
726 c mixing due to internal waves, and shear and static instability
727
728 diffus(i,ki,1) = viscAr + fcon * difmcon + fRi * difm0
729 diffus(i,ki,2) = diffKrS + fcon * difscon + fRi * difs0
730 diffus(i,ki,3) = diffKrT + fcon * difscon + fRi * difs0
731
732 end do
733 end do
734
735 c ------------------------------------------------------------------------
736 c set surface values to 0.0
737
738 do i = 1, imt
739 diffus(i,0,1) = c0
740 diffus(i,0,2) = c0
741 diffus(i,0,3) = c0
742 end do
743
744 #endif /* ALLOW_KPP */
745
746 return
747 end
748
749 c*************************************************************************
750
751 subroutine z121 (
752 U v )
753
754 c Apply 121 smoothing in k to 2-d array V(i,k=1,Nr)
755 c top (0) value is used as a dummy
756 c bottom (Nrp1) value is set to input value from above.
757
758 c Note that it is important to exclude from the smoothing any points
759 c that are outside the range of the K(Ri) scheme, ie. >0.8, or <0.0.
760 c Otherwise, there is interference with other physics, especially
761 c penetrative convection.
762
763 IMPLICIT NONE
764 #include "SIZE.h"
765 #include "KPP_PARAMS.h"
766
767 c input/output
768 c-------------
769 c v : 2-D array to be smoothed in Nrp1 direction
770 _KPP_RL v(imt,0:Nrp1)
771
772 #ifdef ALLOW_KPP
773
774 c local
775 _KPP_RL zwork, zflag
776 _KPP_RL KRi_range(1:Nrp1)
777 integer i, k, km1, kp1
778
779 _KPP_RL p0 , p25 , p5 , p2
780 parameter ( p0 = 0.0, p25 = 0.25, p5 = 0.5, p2 = 2.0 )
781
782 KRi_range(Nrp1) = p0
783
784 #ifdef ALLOW_AUTODIFF_TAMC
785 C-- dummy assignment to end declaration part for TAMC
786 i = 0
787
788 C-- HPF directive to help TAMC
789 CHPF$ INDEPENDENT
790 CADJ INIT z121tape = common, Nr
791 #endif /* ALLOW_AUTODIFF_TAMC */
792
793 do i = 1, imt
794
795 k = 1
796 CADJ STORE v(i,k) = z121tape
797 v(i,Nrp1) = v(i,Nr)
798
799 do k = 1, Nr
800 KRi_range(k) = p5 + SIGN(p5,v(i,k))
801 KRi_range(k) = KRi_range(k) *
802 & ( p5 + SIGN(p5,(Riinfty-v(i,k))) )
803 end do
804
805 zwork = KRi_range(1) * v(i,1)
806 v(i,1) = p2 * v(i,1) +
807 & KRi_range(1) * KRi_range(2) * v(i,2)
808 zflag = p2 + KRi_range(1) * KRi_range(2)
809 v(i,1) = v(i,1) / zflag
810
811 do k = 2, Nr
812 CADJ STORE v(i,k), zwork = z121tape
813 km1 = k - 1
814 kp1 = k + 1
815 zflag = v(i,k)
816 v(i,k) = p2 * v(i,k) +
817 & KRi_range(k) * KRi_range(kp1) * v(i,kp1) +
818 & KRi_range(k) * zwork
819 zwork = KRi_range(k) * zflag
820 zflag = p2 + KRi_range(k)*(KRi_range(kp1)+KRi_range(km1))
821 v(i,k) = v(i,k) / zflag
822 end do
823
824 end do
825
826 #endif /* ALLOW_KPP */
827
828 return
829 end
830
831 c*************************************************************************
832
833 subroutine kpp_smooth_horiz (
834 I k, bi, bj,
835 U fld )
836
837 c Apply horizontal smoothing to KPP array
838
839 IMPLICIT NONE
840 #include "SIZE.h"
841 #include "KPP_PARAMS.h"
842
843 c input
844 c bi, bj : array indices
845 c k : vertical index used for masking
846 integer k, bi, bj
847
848 c input/output
849 c fld : 2-D array to be smoothed
850 _KPP_RL fld( ibot:itop, jbot:jtop )
851
852 #ifdef ALLOW_KPP
853
854 c local
855 integer i, j, im1, ip1, jm1, jp1
856 _KPP_RL tempVar
857 _KPP_RL fld_tmp( ibot:itop, jbot:jtop )
858
859 integer imin , imax , jmin , jmax
860 parameter( imin=ibot+1, imax=itop-1, jmin=jbot+1, jmax=jtop-1 )
861
862 _KPP_RL p0 , p5 , p25 , p125 , p0625
863 parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
864
865 DO j = jmin, jmax
866 jm1 = j-1
867 jp1 = j+1
868 DO i = imin, imax
869 im1 = i-1
870 ip1 = i+1
871 tempVar =
872 & p25 * pMask(i ,j ,k,bi,bj) +
873 & p125 * ( pMask(im1,j ,k,bi,bj) +
874 & pMask(ip1,j ,k,bi,bj) +
875 & pMask(i ,jm1,k,bi,bj) +
876 & pMask(i ,jp1,k,bi,bj) ) +
877 & p0625 * ( pMask(im1,jm1,k,bi,bj) +
878 & pMask(im1,jp1,k,bi,bj) +
879 & pMask(ip1,jm1,k,bi,bj) +
880 & pMask(ip1,jp1,k,bi,bj) )
881 IF ( tempVar .GE. p25 ) THEN
882 fld_tmp(i,j) = (
883 & p25 * fld(i ,j )*pMask(i ,j ,k,bi,bj) +
884 & p125 *(fld(im1,j )*pMask(im1,j ,k,bi,bj) +
885 & fld(ip1,j )*pMask(ip1,j ,k,bi,bj) +
886 & fld(i ,jm1)*pMask(i ,jm1,k,bi,bj) +
887 & fld(i ,jp1)*pMask(i ,jp1,k,bi,bj))+
888 & p0625*(fld(im1,jm1)*pMask(im1,jm1,k,bi,bj) +
889 & fld(im1,jp1)*pMask(im1,jp1,k,bi,bj) +
890 & fld(ip1,jm1)*pMask(ip1,jm1,k,bi,bj) +
891 & fld(ip1,jp1)*pMask(ip1,jp1,k,bi,bj)))
892 & / tempVar
893 ELSE
894 fld_tmp(i,j) = fld(i,j)
895 ENDIF
896 ENDDO
897 ENDDO
898
899 c transfer smoothed field to output array
900 DO j = jmin, jmax
901 DO i = imin, imax
902 fld(i,j) = fld_tmp(i,j)
903 ENDDO
904 ENDDO
905
906 #endif /* ALLOW_KPP */
907
908 return
909 end
910
911 c*************************************************************************
912
913 subroutine smooth_horiz (
914 I k, bi, bj,
915 U fld )
916
917 c Apply horizontal smoothing to global _RL 2-D array
918
919 IMPLICIT NONE
920 #include "SIZE.h"
921 #include "KPP_PARAMS.h"
922
923 c input
924 c bi, bj : array indices
925 c k : vertical index used for masking
926 integer k, bi, bj
927
928 c input/output
929 c fld : 2-D array to be smoothed
930 _RL fld( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
931
932 #ifdef ALLOW_KPP
933
934 c local
935 integer i, j, im1, ip1, jm1, jp1
936 _RL tempVar
937 _RL fld_tmp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
938
939 integer imin , imax , jmin , jmax
940 parameter(imin=2-OLx, imax=sNx+OLx-1, jmin=2-OLy, jmax=sNy+OLy-1)
941
942 _RL p0 , p5 , p25 , p125 , p0625
943 parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
944
945 DO j = jmin, jmax
946 jm1 = j-1
947 jp1 = j+1
948 DO i = imin, imax
949 im1 = i-1
950 ip1 = i+1
951 tempVar =
952 & p25 * pMask(i ,j ,k,bi,bj) +
953 & p125 * ( pMask(im1,j ,k,bi,bj) +
954 & pMask(ip1,j ,k,bi,bj) +
955 & pMask(i ,jm1,k,bi,bj) +
956 & pMask(i ,jp1,k,bi,bj) ) +
957 & p0625 * ( pMask(im1,jm1,k,bi,bj) +
958 & pMask(im1,jp1,k,bi,bj) +
959 & pMask(ip1,jm1,k,bi,bj) +
960 & pMask(ip1,jp1,k,bi,bj) )
961 IF ( tempVar .GE. p25 ) THEN
962 fld_tmp(i,j) = (
963 & p25 * fld(i ,j )*pMask(i ,j ,k,bi,bj) +
964 & p125 *(fld(im1,j )*pMask(im1,j ,k,bi,bj) +
965 & fld(ip1,j )*pMask(ip1,j ,k,bi,bj) +
966 & fld(i ,jm1)*pMask(i ,jm1,k,bi,bj) +
967 & fld(i ,jp1)*pMask(i ,jp1,k,bi,bj))+
968 & p0625*(fld(im1,jm1)*pMask(im1,jm1,k,bi,bj) +
969 & fld(im1,jp1)*pMask(im1,jp1,k,bi,bj) +
970 & fld(ip1,jm1)*pMask(ip1,jm1,k,bi,bj) +
971 & fld(ip1,jp1)*pMask(ip1,jp1,k,bi,bj)))
972 & / tempVar
973 ELSE
974 fld_tmp(i,j) = fld(i,j)
975 ENDIF
976 ENDDO
977 ENDDO
978
979 c transfer smoothed field to output array
980 DO j = jmin, jmax
981 DO i = imin, imax
982 fld(i,j) = fld_tmp(i,j)
983 ENDDO
984 ENDDO
985
986 #endif /* ALLOW_KPP */
987
988 return
989 end
990
991 c*************************************************************************
992
993 subroutine blmix (
994 I ustar, bfsfc, hbl, stable, casea, diffus, kbl
995 O , dkm1, blmc, ghat, sigma, ikey
996 & )
997
998 c mixing coefficients within boundary layer depend on surface
999 c forcing and the magnitude and gradient of interior mixing below
1000 c the boundary layer ("matching").
1001 c
1002 c caution: if mixing bottoms out at hbl = -zgrid(Nr) then
1003 c fictitious layer at Nrp1 is needed with small but finite width
1004 c hwide(Nrp1) (eg. epsln = 1.e-20).
1005 c
1006 IMPLICIT NONE
1007
1008 #include "SIZE.h"
1009 #include "KPP_PARAMS.h"
1010
1011 c input
1012 c ustar (imt) surface friction velocity (m/s)
1013 c bfsfc (imt) surface buoyancy forcing (m^2/s^3)
1014 c hbl (imt) boundary layer depth (m)
1015 c stable(imt) = 1 in stable forcing
1016 c casea (imt) = 1 in case A
1017 c diffus(imt,0:Nrp1,mdiff) vertical diffusivities (m^2/s)
1018 c kbl(imt) -1 of first grid level below hbl
1019 _KPP_RL ustar (imt)
1020 _KPP_RL bfsfc (imt)
1021 _KPP_RL hbl (imt)
1022 _KPP_RL stable(imt)
1023 _KPP_RL casea (imt)
1024 _KPP_RL diffus(imt,0:Nrp1,mdiff)
1025 integer kbl(imt)
1026
1027 c output
1028 c dkm1 (imt,mdiff) boundary layer difs at kbl-1 level
1029 c blmc (imt,Nr,mdiff) boundary layer mixing coefficients (m^2/s)
1030 c ghat (imt,Nr) nonlocal scalar transport
1031 c sigma(imt) normalized depth (d / hbl)
1032 _KPP_RL dkm1 (imt,mdiff)
1033 _KPP_RL blmc (imt,Nr,mdiff)
1034 _KPP_RL ghat (imt,Nr)
1035 _KPP_RL sigma(imt)
1036 integer ikey
1037
1038 #ifdef ALLOW_KPP
1039
1040 c local
1041 c gat1*(imt) shape function at sigma = 1
1042 c dat1*(imt) derivative of shape function at sigma = 1
1043 c ws(imt), wm(imt) turbulent velocity scales (m/s)
1044 _KPP_RL gat1m(imt), gat1s(imt), gat1t(imt)
1045 _KPP_RL dat1m(imt), dat1s(imt), dat1t(imt)
1046 _KPP_RL ws(imt), wm(imt)
1047 integer i, kn, ki
1048 _KPP_RL R, dvdzup, dvdzdn, viscp
1049 _KPP_RL difsp, diftp, visch, difsh, difth
1050 _KPP_RL f1, sig, a1, a2, a3, delhat
1051 _KPP_RL Gm, Gs, Gt
1052 _KPP_RL tempVar
1053
1054 _KPP_RL p0 , eins
1055 parameter (p0=0.0, eins=1.0)
1056
1057 c-----------------------------------------------------------------------
1058 c compute velocity scales at hbl
1059 c-----------------------------------------------------------------------
1060
1061 do i = 1, imt
1062 sigma(i) = stable(i) * 1.0 + (1. - stable(i)) * epsilon
1063 end do
1064
1065 call wscale (
1066 I sigma, hbl, ustar, bfsfc,
1067 O wm, ws )
1068
1069 do i = 1, imt
1070 wm(i) = sign(eins,wm(i))*max(phepsi,abs(wm(i)))
1071 ws(i) = sign(eins,ws(i))*max(phepsi,abs(ws(i)))
1072 end do
1073 CADJ STORE wm = comlev1_kpp, key = ikey
1074 CADJ STORE ws = comlev1_kpp, key = ikey
1075
1076 do i = 1, imt
1077
1078 kn = int(caseA(i)+phepsi) *(kbl(i) -1) +
1079 $ (1 - int(caseA(i)+phepsi)) * kbl(i)
1080
1081 c-----------------------------------------------------------------------
1082 c find the interior viscosities and derivatives at hbl(i)
1083 c-----------------------------------------------------------------------
1084
1085 delhat = 0.5*hwide(kn) - zgrid(kn) - hbl(i)
1086 R = 1.0 - delhat / hwide(kn)
1087 dvdzup = (diffus(i,kn-1,1) - diffus(i,kn ,1)) / hwide(kn)
1088 dvdzdn = (diffus(i,kn ,1) - diffus(i,kn+1,1)) / hwide(kn+1)
1089 viscp = 0.5 * ( (1.-R) * (dvdzup + abs(dvdzup)) +
1090 1 R * (dvdzdn + abs(dvdzdn)) )
1091
1092 dvdzup = (diffus(i,kn-1,2) - diffus(i,kn ,2)) / hwide(kn)
1093 dvdzdn = (diffus(i,kn ,2) - diffus(i,kn+1,2)) / hwide(kn+1)
1094 difsp = 0.5 * ( (1.-R) * (dvdzup + abs(dvdzup)) +
1095 1 R * (dvdzdn + abs(dvdzdn)) )
1096
1097 dvdzup = (diffus(i,kn-1,3) - diffus(i,kn ,3)) / hwide(kn)
1098 dvdzdn = (diffus(i,kn ,3) - diffus(i,kn+1,3)) / hwide(kn+1)
1099 diftp = 0.5 * ( (1.-R) * (dvdzup + abs(dvdzup)) +
1100 1 R * (dvdzdn + abs(dvdzdn)) )
1101
1102 visch = diffus(i,kn,1) + viscp * delhat
1103 difsh = diffus(i,kn,2) + difsp * delhat
1104 difth = diffus(i,kn,3) + diftp * delhat
1105
1106 f1 = stable(i) * conc1 * bfsfc(i) /
1107 & max(ustar(i)**4,phepsi)
1108 gat1m(i) = visch / hbl(i) / wm(i)
1109 dat1m(i) = -viscp / wm(i) + f1 * visch
1110 dat1m(i) = min(dat1m(i),p0)
1111
1112 gat1s(i) = difsh / hbl(i) / ws(i)
1113 dat1s(i) = -difsp / ws(i) + f1 * difsh
1114 dat1s(i) = min(dat1s(i),p0)
1115
1116 gat1t(i) = difth / hbl(i) / ws(i)
1117 dat1t(i) = -diftp / ws(i) + f1 * difth
1118 dat1t(i) = min(dat1t(i),p0)
1119
1120 end do
1121
1122 do ki = 1, Nr
1123
1124 c-----------------------------------------------------------------------
1125 c compute turbulent velocity scales on the interfaces
1126 c-----------------------------------------------------------------------
1127
1128 do i = 1, imt
1129 sig = (-zgrid(ki) + 0.5 * hwide(ki)) / hbl(i)
1130 sigma(i) = stable(i)*sig + (1.-stable(i))*min(sig,epsilon)
1131 end do
1132 call wscale (
1133 I sigma, hbl, ustar, bfsfc,
1134 O wm, ws )
1135
1136 c-----------------------------------------------------------------------
1137 c compute the dimensionless shape functions at the interfaces
1138 c-----------------------------------------------------------------------
1139
1140 do i = 1, imt
1141 sig = (-zgrid(ki) + 0.5 * hwide(ki)) / hbl(i)
1142 a1 = sig - 2.
1143 a2 = 3. - 2. * sig
1144 a3 = sig - 1.
1145
1146 Gm = a1 + a2 * gat1m(i) + a3 * dat1m(i)
1147 Gs = a1 + a2 * gat1s(i) + a3 * dat1s(i)
1148 Gt = a1 + a2 * gat1t(i) + a3 * dat1t(i)
1149
1150 c-----------------------------------------------------------------------
1151 c compute boundary layer diffusivities at the interfaces
1152 c-----------------------------------------------------------------------
1153
1154 blmc(i,ki,1) = hbl(i) * wm(i) * sig * (1. + sig * Gm)
1155 blmc(i,ki,2) = hbl(i) * ws(i) * sig * (1. + sig * Gs)
1156 blmc(i,ki,3) = hbl(i) * ws(i) * sig * (1. + sig * Gt)
1157
1158 c-----------------------------------------------------------------------
1159 c nonlocal transport term = ghat * <ws>o
1160 c-----------------------------------------------------------------------
1161
1162 tempVar = ws(i) * hbl(i)
1163 ghat(i,ki) = (1.-stable(i)) * cg / max(phepsi,tempVar)
1164
1165 end do
1166 end do
1167
1168 c-----------------------------------------------------------------------
1169 c find diffusivities at kbl-1 grid level
1170 c-----------------------------------------------------------------------
1171
1172 do i = 1, imt
1173 sig = -zgrid(kbl(i)-1) / hbl(i)
1174 sigma(i) = stable(i) * sig
1175 & + (1. - stable(i)) * min(sig,epsilon)
1176 end do
1177
1178 call wscale (
1179 I sigma, hbl, ustar, bfsfc,
1180 O wm, ws )
1181
1182 do i = 1, imt
1183 sig = -zgrid(kbl(i)-1) / hbl(i)
1184 a1 = sig - 2.
1185 a2 = 3. - 2. * sig
1186 a3 = sig - 1.
1187 Gm = a1 + a2 * gat1m(i) + a3 * dat1m(i)
1188 Gs = a1 + a2 * gat1s(i) + a3 * dat1s(i)
1189 Gt = a1 + a2 * gat1t(i) + a3 * dat1t(i)
1190 dkm1(i,1) = hbl(i) * wm(i) * sig * (1. + sig * Gm)
1191 dkm1(i,2) = hbl(i) * ws(i) * sig * (1. + sig * Gs)
1192 dkm1(i,3) = hbl(i) * ws(i) * sig * (1. + sig * Gt)
1193 end do
1194
1195 #endif /* ALLOW_KPP */
1196
1197 return
1198 end
1199
1200 c*************************************************************************
1201
1202 subroutine enhance (
1203 I dkm1, hbl, kbl, diffus, casea
1204 U , ghat
1205 O , blmc
1206 & )
1207
1208 c enhance the diffusivity at the kbl-.5 interface
1209
1210 IMPLICIT NONE
1211
1212 #include "SIZE.h"
1213 #include "KPP_PARAMS.h"
1214
1215 c input
1216 c dkm1(imt,mdiff) bl diffusivity at kbl-1 grid level
1217 c hbl(imt) boundary layer depth (m)
1218 c kbl(imt) grid above hbl
1219 c diffus(imt,0:Nrp1,mdiff) vertical diffusivities (m^2/s)
1220 c casea(imt) = 1 in caseA, = 0 in case B
1221 _KPP_RL dkm1 (imt,mdiff)
1222 _KPP_RL hbl (imt)
1223 integer kbl (imt)
1224 _KPP_RL diffus(imt,0:Nrp1,mdiff)
1225 _KPP_RL casea (imt)
1226
1227 c input/output
1228 c nonlocal transport, modified ghat at kbl(i)-1 interface (s/m**2)
1229 _KPP_RL ghat (imt,Nr)
1230
1231 c output
1232 c enhanced bound. layer mixing coeff.
1233 _KPP_RL blmc (imt,Nr,mdiff)
1234
1235 #ifdef ALLOW_KPP
1236
1237 c local
1238 c fraction hbl lies beteen zgrid neighbors
1239 _KPP_RL delta
1240 integer ki, i, md
1241 _KPP_RL dkmp5, dstar
1242
1243 do i = 1, imt
1244 ki = kbl(i)-1
1245 if ((ki .ge. 1) .and. (ki .lt. Nr)) then
1246 delta = (hbl(i) + zgrid(ki)) / (zgrid(ki) - zgrid(ki+1))
1247 do md = 1, mdiff
1248 dkmp5 = casea(i) * diffus(i,ki,md) +
1249 1 (1.- casea(i)) * blmc (i,ki,md)
1250 dstar = (1.- delta)**2 * dkm1(i,md)
1251 & + delta**2 * dkmp5
1252 blmc(i,ki,md) = (1.- delta)*diffus(i,ki,md)
1253 & + delta*dstar
1254 end do
1255 ghat(i,ki) = (1.- casea(i)) * ghat(i,ki)
1256 endif
1257 end do
1258
1259 #endif /* ALLOW_KPP */
1260
1261 return
1262 end
1263
1264 c*************************************************************************
1265
1266 SUBROUTINE STATEKPP (
1267 I bi, bj, myThid,
1268 O RHO1, DBLOC, DBSFC, TTALPHA, SSBETA)
1269 c
1270 c-----------------------------------------------------------------------
1271 c "statekpp" computes all necessary input arrays
1272 c for the kpp mixing scheme
1273 c
1274 c input:
1275 c bi, bj = array indices on which to apply calculations
1276 c
1277 c output:
1278 c rho1 = potential density of surface layer (kg/m^3)
1279 c dbloc = local buoyancy gradient at Nr interfaces
1280 c g/rho{k+1,k+1} * [ drho{k,k+1}-drho{k+1,k+1} ] (m/s^2)
1281 c dbsfc = buoyancy difference with respect to the surface
1282 c g * [ drho{1,k}/rho{1,k} - drho{k,k}/rho{k,k} ] (m/s^2)
1283 c ttalpha= thermal expansion coefficient without 1/rho factor
1284 c d(rho) / d(potential temperature) (kg/m^3/C)
1285 c ssbeta = salt expansion coefficient without 1/rho factor
1286 c d(rho) / d(salinity) (kg/m^3/PSU)
1287 c
1288 c see also subroutines find_rho.F find_alpha.F find_beta.F
1289 c
1290 c written by: jan morzel, feb. 10, 1995 (converted from "sigma" version)
1291 c modified by: d. menemenlis, june 1998 : for use with MIT GCM UV
1292 c
1293 c-----------------------------------------------------------------------
1294
1295 IMPLICIT NONE
1296
1297 #include "SIZE.h"
1298 #include "EEPARAMS.h"
1299 #include "PARAMS.h"
1300 #include "KPP_PARAMS.h"
1301 #include "DYNVARS.h"
1302
1303 c-------------- Routine arguments -----------------------------------------
1304 INTEGER bi, bj, myThid
1305 _KPP_RL RHO1 ( ibot:itop, jbot:jtop )
1306 _KPP_RL DBLOC ( ibot:itop, jbot:jtop, Nr )
1307 _KPP_RL DBSFC ( ibot:itop, jbot:jtop, Nr )
1308 _KPP_RL TTALPHA( ibot:itop, jbot:jtop, Nrp1 )
1309 _KPP_RL SSBETA ( ibot:itop, jbot:jtop, Nrp1 )
1310
1311 #ifdef ALLOW_KPP
1312
1313 c--------------------------------------------------------------------------
1314 c
1315 c local arrays:
1316 c
1317 c rhok - density of t(k ) & s(k ) at depth k
1318 c rhokm1 - density of t(k-1) & s(k-1) at depth k
1319 c rho1k - density of t(1 ) & s(1 ) at depth k
1320 c work1, work2 - work arrays for holding horizontal slabs
1321
1322 _RL RHOK (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1323 _RL RHOKM1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1324 _RL RHO1K (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1325 _RL WORK1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1326 _RL WORK2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1327 _RL WORK3 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
1328 INTEGER I, J, K
1329
1330 c calculate density, alpha, beta in surface layer, and set dbsfc to zero
1331
1332 call FIND_RHO(
1333 I bi, bj, ibot, itop, jbot, jtop, 1, 1, eosType,
1334 I theta, salt,
1335 O WORK1,
1336 I myThid )
1337
1338 call FIND_ALPHA(
1339 I bi, bj, ibot, itop, jbot, jtop, 1, 1, eosType,
1340 O WORK2 )
1341
1342 call FIND_BETA(
1343 I bi, bj, ibot, itop, jbot, jtop, 1, 1, eosType,
1344 O WORK3 )
1345
1346 DO J = jbot, jtop
1347 DO I = ibot, itop
1348 RHO1(I,J) = WORK1(I,J) + rhonil
1349 TTALPHA(I,J,1) = WORK2(I,J)
1350 SSBETA(I,J,1) = WORK3(I,J)
1351 DBSFC(I,J,1) = 0.
1352 END DO
1353 END DO
1354
1355 c calculate alpha, beta, and gradients in interior layers
1356
1357 CHPF$ INDEPENDENT, NEW (RHOK,RHOKM1,RHO1K,WORK1,WORK2)
1358 DO K = 2, Nr
1359
1360 call FIND_RHO(
1361 I bi, bj, ibot, itop, jbot, jtop, K, K, eosType,
1362 I theta, salt,
1363 O RHOK,
1364 I myThid )
1365
1366 call FIND_RHO(
1367 I bi, bj, ibot, itop, jbot, jtop, K-1, K, eosType,
1368 I theta, salt,
1369 O RHOKM1,
1370 I myThid )
1371
1372 call FIND_RHO(
1373 I bi, bj, ibot, itop, jbot, jtop, 1, K, eosType,
1374 I theta, salt,
1375 O RHO1K,
1376 I myThid )
1377
1378 call FIND_ALPHA(
1379 I bi, bj, ibot, itop, jbot, jtop, K, K, eosType,
1380 O WORK1 )
1381
1382 call FIND_BETA(
1383 I bi, bj, ibot, itop, jbot, jtop, K, K, eosType,
1384 O WORK2 )
1385
1386 DO J = jbot, jtop
1387 DO I = ibot, itop
1388 TTALPHA(I,J,K) = WORK1 (I,J)
1389 SSBETA(I,J,K) = WORK2 (I,J)
1390 DBLOC(I,J,K-1) = gravity * (RHOK(I,J) - RHOKM1(I,J)) /
1391 & (RHOK(I,J) + rhonil)
1392 DBSFC(I,J,K) = gravity * (RHOK(I,J) - RHO1K (I,J)) /
1393 & (RHOK(I,J) + rhonil)
1394 END DO
1395 END DO
1396
1397 END DO
1398
1399 c compute arrays for K = Nrp1
1400 DO J = jbot, jtop
1401 DO I = ibot, itop
1402 TTALPHA(I,J,Nrp1) = TTALPHA(I,J,Nr)
1403 SSBETA(I,J,Nrp1) = SSBETA(I,J,Nr)
1404 DBLOC(I,J,Nr) = 0.
1405 END DO
1406 END DO
1407
1408 #endif /* ALLOW_KPP */
1409
1410 RETURN
1411 END

  ViewVC Help
Powered by ViewVC 1.1.22