97 & LBi, UBi, LBj, UBj, &
98 & IminS, ImaxS, JminS, JmaxS, &
103 & Huon, Hvom, Hz, pm, pn, z_r, z_w, &
105 & bustr, bvstr, sustr, svstr, &
107 & Akk, Lscale, gls, tke)
122 integer,
intent(in) :: ng, tile
123 integer,
intent(in) :: LBi, UBi, LBj, UBj
124 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
125 integer,
intent(in) :: nstp, nnew
129 real(r8),
intent(in) :: umask(LBi:,LBj:)
130 real(r8),
intent(in) :: vmask(LBi:,LBj:)
132 real(r8),
intent(in) :: Huon(LBi:,LBj:,:)
133 real(r8),
intent(in) :: Hvom(LBi:,LBj:,:)
134 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
135 real(r8),
intent(in) :: pm(LBi:,LBj:)
136 real(r8),
intent(in) :: pn(LBi:,LBj:)
137 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
138 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
139 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
140 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
141 real(r8),
intent(in) :: W(LBi:,LBj:,0:)
142 real(r8),
intent(in) :: bustr(LBi:,LBj:)
143 real(r8),
intent(in) :: bvstr(LBi:,LBj:)
144 real(r8),
intent(in) :: sustr(LBi:,LBj:)
145 real(r8),
intent(in) :: svstr(LBi:,LBj:)
146 real(r8),
intent(in) :: bvf(LBi:,LBj:,0:)
148 real(r8),
intent(inout) :: Akt(LBi:,LBj:,0:,:)
149 real(r8),
intent(inout) :: Akv(LBi:,LBj:,0:)
150 real(r8),
intent(inout) :: Akk(LBi:,LBj:,0:)
151 real(r8),
intent(inout) :: Lscale(LBi:,LBj:,0:)
152 real(r8),
intent(inout) :: gls(LBi:,LBj:,0:,:)
153 real(r8),
intent(inout) :: tke(LBi:,LBj:,0:,:)
156 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
157 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
159 real(r8),
intent(in) :: Huon(LBi:UBi,LBj:UBj,N(ng))
160 real(r8),
intent(in) :: Hvom(LBi:UBi,LBj:UBj,N(ng))
161 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
162 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
163 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
164 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
165 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
166 real(r8),
intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
167 real(r8),
intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
168 real(r8),
intent(in) :: W(LBi:UBi,LBj:UBj,0:N(ng))
169 real(r8),
intent(in) :: bustr(LBi:UBi,LBj:UBj)
170 real(r8),
intent(in) :: bvstr(LBi:UBi,LBj:UBj)
171 real(r8),
intent(in) :: sustr(LBi:UBi,LBj:UBj)
172 real(r8),
intent(in) :: svstr(LBi:UBi,LBj:UBj)
173 real(r8),
intent(in) :: bvf(LBi:UBi,LBj:UBj,0:N(ng))
175 real(r8),
intent(inout) :: Akt(LBi:UBi,LBj:UBj,0:N(ng),NAT)
176 real(r8),
intent(inout) :: Akv(LBi:UBi,LBj:UBj,0:N(ng))
177 real(r8),
intent(inout) :: Akk(LBi:UBi,LBj:UBj,0:N(ng))
178 real(r8),
intent(inout) :: Lscale(LBi:UBi,LBj:UBj,0:N(ng))
179 real(r8),
intent(inout) :: gls(LBi:UBi,LBj:UBj,0:N(ng),3)
180 real(r8),
intent(inout) :: tke(LBi:UBi,LBj:UBj,0:N(ng),3)
185 integer :: i, itrc, j, k
187 real(r8),
parameter :: Gadv = 1.0_r8/3.0_r8
188 real(r8),
parameter :: eps = 1.0e-10_r8
190 real(r8) :: Gh, Ls_unlmt, Ls_lmt, Qprod, Qdiss, Sh, Sm, Wscale
191 real(r8) :: cff, cff1, cff2, cff3, ql, strat2
193 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BCK
194 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BCP
195 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
196 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCK
197 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCP
198 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: dU
199 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: dV
201 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: shear2
202 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: buoy2
204 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FEK
205 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FEP
206 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FXK
207 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FXP
208 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: curvK
209 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: curvP
210 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: gradK
211 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: gradP
213# include "set_bounds.h"
228 cff=1.0_r8/(2.0_r8*hz(i,j,k+1)+ &
229 & hz(i,j,k)*(2.0_r8-cf(i,k-1)))
230 cf(i,k)=cff*hz(i,j,k+1)
231 du(i,k)=cff*(3.0_r8*(u(i ,j,k+1,nstp)-u(i, j,k,nstp)+ &
232 & u(i+1,j,k+1,nstp)-u(i+1,j,k,nstp))- &
233 & hz(i,j,k)*du(i,k-1))
234 dv(i,k)=cff*(3.0_r8*(v(i,j ,k+1,nstp)-v(i,j ,k,nstp)+ &
235 & v(i,j+1,k+1,nstp)-v(i,j+1,k,nstp))- &
236 & hz(i,j,k)*dv(i,k-1))
245 du(i,k)=du(i,k)-cf(i,k)*du(i,k+1)
246 dv(i,k)=dv(i,k)-cf(i,k)*dv(i,k+1)
251 shear2(i,j,k)=du(i,k)*du(i,k)+dv(i,k)*dv(i,k)
259 cff=0.5_r8/(z_r(i,j,k+1)-z_r(i,j,k))
260 shear2(i,j,k)=(cff*(u(i ,j,k+1,nstp)-u(i ,j,k,nstp)+ &
261 & u(i+1,j,k+1,nstp)-u(i+1,j,k,nstp)))**2+ &
262 & (cff*(v(i,j ,k+1,nstp)-v(i,j ,k,nstp)+ &
263 & v(i,j+1,k+1,nstp)-v(i,j+1,k,nstp)))**2
274 buoy2(i,j,k)=bvf(i,j,k)
286 IF (
domain(ng)%Western_Edge(tile))
THEN
287 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
288 shear2(istr-1,j,k)=shear2(istr,j,k)
291 IF (
domain(ng)%Eastern_Edge(tile))
THEN
292 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
293 shear2(iend+1,j,k)=shear2(iend,j,k)
296 IF (
domain(ng)%Southern_Edge(tile))
THEN
297 DO i=max(1,istr-1),min(iend+1,
lm(ng))
298 shear2(i,jstr-1,k)=shear2(i,jstr,k)
301 IF (
domain(ng)%Northern_Edge(tile))
THEN
302 DO i=max(1,istr-1),min(iend+1,
lm(ng))
303 shear2(i,jend+1,k)=shear2(i,jend,k)
306 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
307 shear2(istr-1,jstr-1,k)=shear2(istr,jstr,k)
309 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
310 shear2(istr-1,jend+1,k)=shear2(istr,jend,k)
312 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
313 shear2(iend+1,jstr-1,k)=shear2(iend,jstr,k)
315 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
316 shear2(iend+1,jend+1,k)=shear2(iend,jend,k)
323 buoy2(i,j,0)=0.25_r8*(buoy2(i,j ,k)+buoy2(i+1,j ,k)+ &
324 & buoy2(i,j+1,k)+buoy2(i+1,j+1,k))
325 shear2(i,j,0)=0.25_r8*(shear2(i,j ,k)+shear2(i+1,j ,k)+ &
326 & shear2(i,j+1,k)+shear2(i+1,j+1,k))
331 buoy2(i,j,k)=0.25_r8*(buoy2(i,j ,0)+buoy2(i-1,j ,0)+ &
332 & buoy2(i,j-1,0)+buoy2(i-1,j-1,0))
333 shear2(i,j,k)=0.25_r8*(shear2(i,j ,0)+shear2(i-1,j ,0)+ &
334 & shear2(i,j-1,0)+shear2(i-1,j-1,0))
356 cff=0.25_r8*(huon(i,j,k)+huon(i,j,k+1))
357 fxk(i,j)=cff*(tke(i,j,k,3)+tke(i-1,j,k,3))
358 fxp(i,j)=cff*(gls(i,j,k,3)+gls(i-1,j,k,3))
363 cff=0.25_r8*(hvom(i,j,k)+hvom(i,j,k+1))
364 fek(i,j)=cff*(tke(i,j,k,3)+tke(i,j-1,k,3))
365 fep(i,j)=cff*(gls(i,j,k,3)+gls(i,j-1,k,3))
371 gradk(i,j)=(tke(i,j,k,3)-tke(i-1,j,k,3))
373 gradk(i,j)=gradk(i,j)*umask(i,j)
375 gradp(i,j)=(gls(i,j,k,3)-gls(i-1,j,k,3))
377 gradp(i,j)=gradp(i,j)*umask(i,j)
382 IF (
domain(ng)%Western_Edge(tile))
THEN
384 gradk(istr-1,j)=gradk(istr,j)
385 gradp(istr-1,j)=gradp(istr,j)
390 IF (
domain(ng)%Eastern_Edge(tile))
THEN
392 gradk(iend+2,j)=gradk(iend+1,j)
393 gradp(iend+2,j)=gradp(iend+1,j)
404 cff=0.5_r8*(huon(i,j,k)+huon(i,j,k+1))
405 fxk(i,j)=cff*0.5_r8*(tke(i-1,j,k,3)+tke(i,j,k,3)- &
406 & cff1*(gradk(i+1,j)-gradk(i-1,j)))
407 fxp(i,j)=cff*0.5_r8*(gls(i-1,j,k,3)+gls(i,j,k,3)- &
408 & cff1*(gradp(i+1,j)-gradp(i-1,j)))
418 curvk(i,j)=gradk(i+1,j)-gradk(i,j)
419 curvp(i,j)=gradp(i+1,j)-gradp(i,j)
424 cff=0.5_r8*(huon(i,j,k)+huon(i,j,k+1))
425 IF (cff.gt.0.0_r8)
THEN
432 fxk(i,j)=cff*0.5_r8*(tke(i-1,j,k,3)+tke(i,j,k,3)- &
434 fxp(i,j)=cff*0.5_r8*(gls(i-1,j,k,3)+gls(i,j,k,3)- &
441 gradk(i,j)=(tke(i,j,k,3)-tke(i,j-1,k,3))
443 gradk(i,j)=gradk(i,j)*vmask(i,j)
445 gradp(i,j)=(gls(i,j,k,3)-gls(i,j-1,k,3))
447 gradp(i,j)=gradp(i,j)*vmask(i,j)
452 IF (
domain(ng)%Southern_Edge(tile))
THEN
454 gradk(i,jstr-1)=gradk(i,jstr)
455 gradp(i,jstr-1)=gradp(i,jstr)
460 IF (
domain(ng)%Northern_Edge(tile))
THEN
462 gradk(i,jend+2)=gradk(i,jend+1)
463 gradp(i,jend+2)=gradp(i,jend+1)
471 cff=0.5_r8*(hvom(i,j,k)+hvom(i,j,k+1))
472 fek(i,j)=cff*0.5_r8*(tke(i,j-1,k,3)+tke(i,j,k,3)- &
473 & cff1*(gradk(i,j+1)-gradk(i,j-1)))
474 fep(i,j)=cff*0.5_r8*(gls(i,j-1,k,3)+gls(i,j,k,3)- &
475 & cff1*(gradp(i,j+1)-gradp(i,j-1)))
481 curvk(i,j)=gradk(i,j+1)-gradk(i,j)
482 curvp(i,j)=gradp(i,j+1)-gradp(i,j)
487 cff=0.5_r8*(hvom(i,j,k)+hvom(i,j,k+1))
488 IF (cff.gt.0.0_r8)
THEN
495 fek(i,j)=cff*0.5_r8*(tke(i,j-1,k,3)+tke(i,j,k,3)- &
497 fep(i,j)=cff*0.5_r8*(gls(i,j-1,k,3)+gls(i,j,k,3)- &
508 cff=
dt(ng)*pm(i,j)*pn(i,j)
509 tke(i,j,k,nnew)=tke(i,j,k,nnew)- &
510 & cff*(fxk(i+1,j)-fxk(i,j)+ &
511 & fek(i,j+1)-fek(i,j))
512 gls(i,j,k,nnew)=gls(i,j,k,nnew)- &
513 & cff*(fxp(i+1,j)-fxp(i,j)+ &
514 & fep(i,j+1)-fep(i,j))
525 cff=0.25_r8*(w(i,j,k)+w(i,j,k-1))
526 fck(i,k)=cff*(tke(i,j,k,3)+tke(i,j,k-1,3))
527 fcp(i,k)=cff*(gls(i,j,k,3)+gls(i,j,k-1,3))
535 cff=0.5*(w(i,j,k)+w(i,j,k-1))
536 fck(i,k)=cff*(cff1*(tke(i,j,k-1,3)+ &
538 & cff2*(tke(i,j,k-2,3)+ &
540 fcp(i,k)=cff*(cff1*(gls(i,j,k-1,3)+ &
542 & cff2*(gls(i,j,k-2,3)+ &
550 cff=0.5_r8*(w(i,j,0)+w(i,j,1))
551 fck(i,1)=cff*(cff1*tke(i,j,0,3)+ &
552 & cff2*tke(i,j,1,3)- &
554 fcp(i,1)=cff*(cff1*gls(i,j,0,3)+ &
555 & cff2*gls(i,j,1,3)- &
557 cff=0.5_r8*(w(i,j,n(ng))+w(i,j,n(ng)-1))
558 fck(i,n(ng))=cff*(cff1*tke(i,j,n(ng) ,3)+ &
559 & cff2*tke(i,j,n(ng)-1,3)- &
560 & cff3*tke(i,j,n(ng)-2,3))
561 fcp(i,n(ng))=cff*(cff1*gls(i,j,n(ng) ,3)+ &
562 & cff2*gls(i,j,n(ng)-1,3)- &
563 & cff3*gls(i,j,n(ng)-2,3))
571 cff=
dt(ng)*pm(i,j)*pn(i,j)
572 tke(i,j,k,nnew)=tke(i,j,k,nnew)- &
573 & cff*(fck(i,k+1)-fck(i,k))
574 gls(i,j,k,nnew)=gls(i,j,k,nnew)- &
575 & cff*(fcp(i,k+1)-fcp(i,k))
589 fck(i,k)=cff*(akk(i,j,k)+akk(i,j,k-1))/hz(i,j,k)
603 IF ((buoy2(i,j,k).gt.-5.0e-5_r8).and. &
604 & (buoy2(i,j,k).lt.0.0_r8))
THEN
609 qprod=shear2(i,j,k)*(akv(i,j,k)-
akv_bak(ng))- &
615 & gls(i,j,k,nstp)/(max(tke(i,j,k,nstp),eps)))
619 cff1=0.5_r8*(hz(i,j,k)+hz(i,j,k+1))
620 tke(i,j,k,nnew)=tke(i,j,k,nnew)+ &
621 &
dt(ng)*cff1*qprod*2.0_r8
622 gls(i,j,k,nnew)=gls(i,j,k,nnew)+ &
623 &
dt(ng)*cff1*qprod*
my_e1*ls_unlmt
628 qdiss=
dt(ng)*sqrt(tke(i,j,k,nstp))/(
my_b1*ls_unlmt)
629 cff=ls_unlmt*(1.0_r8/(z_w(i,j,n(ng))-z_w(i,j,k))+ &
630 & 1.0_r8/(z_w(i,j,k)-z_w(i,j,0)))
631 wscale=1.0_r8+cff3*cff*cff
632 bck(i,k)=cff1*(1.0_r8+2.0_r8*qdiss)-fck(i,k)-fck(i,k+1)
633 bcp(i,k)=cff1*(1.0_r8+wscale*qdiss)-fck(i,k)-fck(i,k+1)
645 & sqrt((sustr(i,j)+sustr(i+1,j))**2+ &
646 & (svstr(i,j)+svstr(i,j+1))**2)
647 gls(i,j,n(ng),nnew)=0.0_r8
649 & sqrt((bustr(i,j)+bustr(i+1,j))**2+ &
650 & (bvstr(i,j)+bvstr(i,j+1))**2)
651 gls(i,j,0,nnew)=0.0_r8
657 cff=1.0_r8/bck(i,n(ng)-1)
658 cf(i,n(ng)-1)=cff*fck(i,n(ng)-1)
659 tke(i,j,n(ng)-1,nnew)=cff*(tke(i,j,n(ng)-1,nnew)- &
660 & fck(i,n(ng))*tke(i,j,n(ng),nnew))
664 cff=1.0_r8/(bck(i,k)-cf(i,k+1)*fck(i,k+1))
666 tke(i,j,k,nnew)=cff*(tke(i,j,k,nnew)- &
667 & fck(i,k+1)*tke(i,j,k+1,nnew))
672 tke(i,j,k,nnew)=tke(i,j,k,nnew)-cf(i,k)*tke(i,j,k-1,nnew)
679 cff=1.0_r8/bcp(i,n(ng)-1)
680 cf(i,n(ng)-1)=cff*fck(i,n(ng)-1)
681 gls(i,j,n(ng)-1,nnew)=cff*(gls(i,j,n(ng)-1,nnew)- &
682 & fck(i,n(ng))*gls(i,j,n(ng),nnew))
686 cff=1.0_r8/(bcp(i,k)-cf(i,k+1)*fck(i,k+1))
688 gls(i,j,k,nnew)=cff*(gls(i,j,k,nnew)- &
689 & fck(i,k+1)*gls(i,j,k+1,nnew))
694 gls(i,j,k,nnew)=gls(i,j,k,nnew)-cf(i,k)*gls(i,j,k-1,nnew)
709 tke(i,j,k,nnew)=max(tke(i,j,k,nnew),
my_qmin)
710 gls(i,j,k,nnew)=max(gls(i,j,k,nnew),
my_qmin)
711 ls_unlmt=gls(i,j,k,nnew)/tke(i,j,k,nnew)
712 ls_lmt=min(ls_unlmt, &
713 &
my_lmax*sqrt(tke(i,j,k,nnew)/ &
714 & (max(0.0_r8,buoy2(i,j,k))+eps)))
722 gh=min(
my_gh0,-buoy2(i,j,k)*ls_lmt*ls_lmt/ &
726# ifdef KANTHA_CLAYSON
736 ql=0.5_r8*(ls_lmt*sqrt(tke(i,j,k,nnew))+ &
737 & lscale(i,j,k)*sqrt(tke(i,j,k,nstp)))
740 akt(i,j,k,itrc)=
akt_bak(itrc,ng)+ql*sh
753# if defined LIMIT_VDIFF || defined LIMIT_VVISC
762 akt(i,j,k,itrc)=min(
akt_limit(itrc,ng), akt(i,j,k,itrc))
766 akv(i,j,k)=min(
akv_limit(ng), akv(i,j,k))
778 IF (
domain(ng)%Western_Edge(tile))
THEN
781 akt(istr-1,j,k,itrc)=akt(istr,j,k,itrc)
783 akv(istr-1,j,k)=akv(istr,j,k)
786 IF (
domain(ng)%Eastern_Edge(tile))
THEN
789 akt(iend-1,j,k,itrc)=akt(iend,j,k,itrc)
791 akv(iend-1,j,k)=akv(iend,j,k)
795 IF (
domain(ng)%Southern_Edge(tile))
THEN
798 akt(i,jstr-1,k,itrc)=akt(i,jstr,k,itrc)
800 akv(i,jstr-1,k)=akv(i,jstr,k)
803 IF (
domain(ng)%Northern_Edge(tile))
THEN
806 akt(i,jend+1,k,itrc)=akt(i,jend,k,itrc)
808 akv(i,jend+1,k)=akv(i,jend,k)
811 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
813 akt(istr-1,jstr-1,k,itrc)=0.5_r8* &
814 & (akt(istr ,jstr-1,k,itrc)+ &
815 & akt(istr-1,jstr ,k,itrc))
817 akv(istr-1,jstr-1,k)=0.5_r8* &
818 & (akv(istr ,jstr-1,k)+ &
819 & akv(istr-1,jstr ,k))
821 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
823 akt(iend+1,jstr-1,k,itrc)=0.5_r8* &
824 & (akt(iend ,jstr-1,k,itrc)+ &
825 & akt(iend+1,jstr ,k,itrc))
827 akv(iend+1,jstr-1,k)=0.5_r8* &
828 & (akv(iend ,jstr-1,k)+ &
829 & akv(iend+1,jstr ,k))
831 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
833 akt(istr-1,jend+1,k,itrc)=0.5_r8* &
834 & (akt(istr ,jend+1,k,itrc)+ &
835 & akt(istr-1,jend ,k,itrc))
837 akv(istr-1,jend+1,k)=0.5_r8* &
838 & (akv(istr ,jend+1,k)+ &
839 & akv(istr-1,jend ,k))
841 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
843 akt(iend+1,jend+1,k,itrc)=0.5_r8* &
844 & (akt(iend ,jend+1,k,itrc)+ &
845 & akt(iend+1,jend ,k,itrc))
847 akv(iend+1,jend+1,k)=0.5_r8* &
848 & (akv(iend ,jend+1,k)+ &
849 & akv(iend+1,jend ,k))
854 & lbi, ubi, lbj, ubj, n(ng), &
855 & imins, imaxs, jmins, jmaxs, &
861 & lbi, ubi, lbj, ubj, 0, n(ng), &
864 & lbi, ubi, lbj, ubj, 0, n(ng), &
867 & lbi, ubi, lbj, ubj, 0, n(ng), &
871 & lbi, ubi, lbj, ubj, 0, n(ng), &
878 & lbi, ubi, lbj, ubj, 0, n(ng), &
885 & lbi, ubi, lbj, ubj, 0, n(ng), 1, nat, &