52 & LBi, UBi, LBj, UBj, UBk, &
53 & IminS, ImaxS, JminS, JmaxS, &
66 integer,
intent(in) :: ng, tile
67 integer,
intent(in) :: lbi, ubi, lbj, ubj, ubk
68 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
69 integer,
intent(in) :: nout, nstp
72 real(r8),
intent(inout) :: gls(lbi:,lbj:,0:,:)
73 real(r8),
intent(inout) :: tke(lbi:,lbj:,0:,:)
75 real(r8),
intent(inout) :: gls(lbi:ubi,lbj:ubj,0:ubk,3)
76 real(r8),
intent(inout) :: tke(lbi:ubi,lbj:ubj,0:ubk,3)
83 real(r8),
parameter :: eps = 1.0e-20_r8
85 real(r8) :: ce, cx, cff, dkde, dkdt, dkdx
87 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
88 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: gradl
90# include "set_bounds.h"
96 IF (
domain(ng)%Western_Edge(tile))
THEN
103 grad(istr-1,j)=tke(istr-1,j ,k,nstp)- &
104 & tke(istr-1,j-1,k,nstp)
106 grad(istr-1,j)=grad(istr-1,j)* &
107 &
grid(ng)%vmask(istr-1,j)
109 grad(istr ,j)=tke(istr ,j ,k,nstp)- &
110 & tke(istr ,j-1,k,nstp)
112 grad(istr ,j)=grad(istr ,j)* &
113 &
grid(ng)%vmask(istr ,j)
115 gradl(istr-1,j)=gls(istr-1,j ,k,nstp)- &
116 & gls(istr-1,j-1,k,nstp)
118 gradl(istr-1,j)=gradl(istr-1,j)* &
119 &
grid(ng)%vmask(istr-1,j)
121 gradl(istr ,j)=gls(istr ,j ,k,nstp)- &
122 & gls(istr ,j-1,k,nstp)
124 gradl(istr ,j)=gradl(istr ,j)* &
125 &
grid(ng)%vmask(istr ,j)
130 dkdt=tke(istr,j,k,nstp)-tke(istr ,j,k,nout)
131 dkdx=tke(istr,j,k,nout)-tke(istr+1,j,k,nout)
132 IF ((dkdt*dkdx).lt.0.0_r8) dkdt=0.0_r8
133 IF ((dkdt*(grad(istr,j )+ &
134 & grad(istr,j+1))).gt.0.0_r8)
THEN
139 cff=max(dkdx*dkdx+dkde*dkde,eps)
142 ce=min(cff,max(dkdt*dkde,-cff))
146 tke(istr-1,j,k,nout)=(cff*tke(istr-1,j,k,nstp)+ &
147 & cx *tke(istr ,j,k,nout)- &
151 & grad(istr-1,j+1))/ &
154 tke(istr-1,j,k,nout)=tke(istr-1,j,k,nout)* &
155 &
grid(ng)%rmask(istr-1,j)
157 dkdt=gls(istr,j,k,nstp)-gls(istr ,j,k,nout)
158 dkdx=gls(istr,j,k,nout)-gls(istr+1,j,k,nout)
159 IF ((dkdt*dkdx).lt.0.0_r8) dkdt=0.0_r8
160 IF ((dkdt*(gradl(istr,j )+ &
161 & gradl(istr,j+1))).gt.0.0_r8)
THEN
166 cff=max(dkdx*dkdx+dkde*dkde,eps)
169 ce=min(cff,max(dkdt*dkde,-cff))
173 gls(istr-1,j,k,nout)=(cff*gls(istr-1,j,k,nstp)+ &
174 & cx *gls(istr ,j,k,nout)- &
176 & gradl(istr-1,j )- &
178 & gradl(istr-1,j+1))/ &
181 gls(istr-1,j,k,nout)=gls(istr-1,j,k,nout)* &
182 &
grid(ng)%rmask(istr-1,j)
194 tke(istr-1,j,k,nout)=tke(istr,j,k,nout)
196 tke(istr-1,j,k,nout)=tke(istr-1,j,k,nout)* &
197 &
grid(ng)%rmask(istr-1,j)
199 gls(istr-1,j,k,nout)=gls(istr,j,k,nout)
201 gls(istr-1,j,k,nout)=gls(istr-1,j,k,nout)* &
202 &
grid(ng)%rmask(istr-1,j)
214 tke(istr-1,j,k,nout)=tke(istr,j,k,nout)
216 tke(istr-1,j,k,nout)=tke(istr-1,j,k,nout)* &
217 &
grid(ng)%rmask(istr-1,j)
219 gls(istr-1,j,k,nout)=gls(istr,j,k,nout)
221 gls(istr-1,j,k,nout)=gls(istr-1,j,k,nout)* &
222 &
grid(ng)%rmask(istr-1,j)
234 IF (
domain(ng)%Eastern_Edge(tile))
THEN
241 grad(iend ,j)=tke(iend ,j ,k,nstp)- &
242 & tke(iend ,j-1,k,nstp)
244 grad(iend ,j)=grad(iend ,j)* &
245 &
grid(ng)%vmask(iend ,j)
247 grad(iend+1,j)=tke(iend+1,j ,k,nstp)- &
248 & tke(iend+1,j-1,k,nstp)
250 grad(iend+1,j)=grad(iend+1,j)* &
251 &
grid(ng)%vmask(iend+1,j)
253 gradl(iend ,j)=gls(iend ,j ,k,nstp)- &
254 & gls(iend ,j-1,k,nstp)
256 gradl(iend ,j)=gradl(iend ,j)* &
257 &
grid(ng)%vmask(iend ,j)
259 gradl(iend+1,j)=gls(iend+1,j ,k,nstp)- &
260 & gls(iend+1,j-1,k,nstp)
262 gradl(iend+1,j)=gradl(iend+1,j)* &
263 &
grid(ng)%vmask(iend+1,j)
268 dkdt=tke(iend,j,k,nstp)-tke(iend ,j,k,nout)
269 dkdx=tke(iend,j,k,nout)-tke(iend-1,j,k,nout)
270 IF ((dkdt*dkdx).lt.0.0_r8) dkdt=0.0_r8
271 IF ((dkdt*(grad(iend,j )+ &
272 & grad(iend,j+1))).gt.0.0_r8)
THEN
277 cff=max(dkdx*dkdx+dkde*dkde,eps)
280 ce=min(cff,max(dkdt*dkde,-cff))
284 tke(iend+1,j,k,nout)=(cff*tke(iend+1,j,k,nstp)+ &
285 & cx *tke(iend ,j,k,nout)- &
289 & grad(iend+1,j+1))/ &
292 tke(iend+1,j,k,nout)=tke(iend+1,j,k,nout)* &
293 &
grid(ng)%rmask(iend+1,j)
295 dkdt=gls(iend,j,k,nstp)-gls(iend ,j,k,nout)
296 dkdx=gls(iend,j,k,nout)-gls(iend-1,j,k,nout)
297 IF ((dkdt*dkdx).lt.0.0_r8) dkdt=0.0_r8
298 IF ((dkdt*(gradl(iend,j )+ &
299 & gradl(iend,j+1))).gt.0.0_r8)
THEN
304 cff=max(dkdx*dkdx+dkde*dkde,eps)
307 ce=min(cff,max(dkdt*dkde,-cff))
311 gls(iend+1,j,k,nout)=(cff*gls(iend+1,j,k,nstp)+ &
312 & cx *gls(iend ,j,k,nout)- &
314 & gradl(iend+1,j )- &
316 & gradl(iend+1,j+1))/ &
319 gls(iend+1,j,k,nout)=gls(iend+1,j,k,nout)* &
320 &
grid(ng)%rmask(iend+1,j)
332 tke(iend+1,j,k,nout)=tke(iend,j,k,nout)
334 tke(iend+1,j,k,nout)=tke(iend+1,j,k,nout)* &
335 &
grid(ng)%rmask(iend+1,j)
337 gls(iend+1,j,k,nout)=gls(iend,j,k,nout)
339 gls(iend+1,j,k,nout)=gls(iend+1,j,k,nout)* &
340 &
grid(ng)%rmask(iend+1,j)
352 tke(iend+1,j,k,nout)=tke(iend,j,k,nout)
354 tke(iend+1,j,k,nout)=tke(iend+1,j,k,nout)* &
355 &
grid(ng)%rmask(iend+1,j)
357 gls(iend+1,j,k,nout)=gls(iend,j,k,nout)
359 gls(iend+1,j,k,nout)=gls(iend+1,j,k,nout)* &
360 &
grid(ng)%rmask(iend+1,j)
372 IF (
domain(ng)%Southern_Edge(tile))
THEN
379 grad(i,jstr )=tke(i ,jstr ,k,nstp)- &
380 & tke(i-1,jstr ,k,nstp)
382 grad(i,jstr )=grad(i,jstr )*
grid(ng)%umask(i,jstr )
384 grad(i,jstr-1)=tke(i ,jstr-1,k,nstp)- &
385 & tke(i-1,jstr-1,k,nstp)
387 grad(i,jstr-1)=grad(i,jstr-1)*
grid(ng)%umask(i,jstr-1)
389 gradl(i,jstr )=gls(i ,jstr ,k,nstp)- &
390 & gls(i-1,jstr ,k,nstp)
392 gradl(i,jstr )=gradl(i,jstr )*
grid(ng)%umask(i,jstr )
394 gradl(i,jstr-1)=gls(i ,jstr-1,k,nstp)- &
395 & gls(i-1,jstr-1,k,nstp)
397 gradl(i,jstr-1)=gradl(i,jstr-1)*
grid(ng)%umask(i,jstr-1)
402 dkdt=tke(i,jstr,k,nstp)-tke(i,jstr ,k,nout)
403 dkde=tke(i,jstr,k,nout)-tke(i,jstr+1,k,nout)
404 IF ((dkdt*dkde).lt.0.0_r8) dkdt=0.0_r8
405 IF ((dkdt*(grad(i ,jstr)+ &
406 & grad(i+1,jstr))).gt.0.0_r8)
THEN
411 cff=max(dkdx*dkdx+dkde*dkde, eps)
413 cx=min(cff,max(dkdt*dkdx,-cff))
418 tke(i,jstr-1,k,nout)=(cff*tke(i,jstr-1,k,nstp)+ &
419 & ce *tke(i,jstr ,k,nout)- &
423 & grad(i+1,jstr-1))/ &
426 tke(i,jstr-1,k,nout)=tke(i,jstr-1,k,nout)* &
427 &
grid(ng)%rmask(i,jstr-1)
429 dkdt=gls(i,jstr,k,nstp)-gls(i,jstr ,k,nout)
430 dkde=gls(i,jstr,k,nout)-gls(i,jstr+1,k,nout)
431 IF ((dkdt*dkde).lt.0.0_r8) dkdt=0.0_r8
432 IF ((dkdt*(gradl(i ,jstr)+ &
433 & gradl(i+1,jstr))).gt.0.0_r8)
THEN
438 cff=max(dkdx*dkdx+dkde*dkde,eps)
440 cx=min(cff,max(dkdt*dkdx,-cff))
445 gls(i,jstr-1,k,nout)=(cff*gls(i,jstr-1,k,nstp)+ &
446 & ce *gls(i,jstr ,k,nout)- &
448 & gradl(i ,jstr-1)- &
450 & gradl(i+1,jstr-1))/ &
453 gls(i,jstr-1,k,nout)=gls(i,jstr-1,k,nout)* &
454 &
grid(ng)%rmask(i,jstr-1)
466 tke(i,jstr-1,k,nout)=tke(i,jstr,k,nout)
468 tke(i,jstr-1,k,nout)=tke(i,jstr-1,k,nout)* &
469 &
grid(ng)%rmask(i,jstr-1)
471 gls(i,jstr-1,k,nout)=gls(i,jstr,k,nout)
473 gls(i,jstr-1,k,nout)=gls(i,jstr-1,k,nout)* &
474 &
grid(ng)%rmask(i,jstr-1)
486 tke(i,jstr-1,k,nout)=tke(i,jstr,k,nout)
488 tke(i,jstr-1,k,nout)=tke(i,jstr-1,k,nout)* &
489 &
grid(ng)%rmask(i,jstr-1)
491 gls(i,jstr-1,k,nout)=gls(i,jstr,k,nout)
493 gls(i,jstr-1,k,nout)=gls(i,jstr-1,k,nout)* &
494 &
grid(ng)%rmask(i,jstr-1)
506 IF (
domain(ng)%Northern_Edge(tile))
THEN
513 grad(i,jend )=tke(i ,jend ,k,nstp)- &
514 & tke(i-1,jend ,k,nstp)
516 grad(i,jend )=grad(i,jend )* &
517 &
grid(ng)%umask(i,jend )
519 grad(i,jend+1)=tke(i ,jend+1,k,nstp)- &
520 & tke(i-1,jend+1,k,nstp)
522 grad(i,jend+1)=grad(i,jend+1)* &
523 &
grid(ng)%umask(i,jend+1)
525 gradl(i,jend )=gls(i ,jend ,k,nstp)- &
526 & gls(i-1,jend ,k,nstp)
528 gradl(i,jend )=gradl(i,jend )* &
529 &
grid(ng)%umask(i,jend )
531 gradl(i,jend+1)=gls(i ,jend+1,k,nstp)- &
532 & gls(i-1,jend+1,k,nstp)
534 gradl(i,jend+1)=gradl(i,jend+1)* &
535 &
grid(ng)%umask(i,jend+1)
540 dkdt=tke(i,jend,k,nstp)-tke(i,jend ,k,nout)
541 dkde=tke(i,jend,k,nout)-tke(i,jend-1,k,nout)
542 IF ((dkdt*dkde).lt.0.0_r8) dkdt=0.0_r8
543 IF ((dkdt*(grad(i ,jend)+ &
544 & grad(i+1,jend))).gt.0.0_r8)
THEN
549 cff=max(dkdx*dkdx+dkde*dkde,eps)
551 cx=min(cff,max(dkdt*dkdx,-cff))
556 tke(i,jend+1,k,nout)=(cff*tke(i,jend+1,k,nstp)+ &
557 & ce *tke(i,jend ,k,nout)- &
561 & grad(i+1,jend+1))/ &
564 tke(i,jend+1,k,nout)=tke(i,jend+1,k,nout)* &
565 &
grid(ng)%rmask(i,jend+1)
567 dkdt=gls(i,jend,k,nstp)-gls(i,jend ,k,nout)
568 dkde=gls(i,jend,k,nout)-gls(i,jend-1,k,nout)
569 IF ((dkdt*dkde).lt.0.0_r8) dkdt=0.0_r8
570 IF ((dkdt*(gradl(i ,jend)+ &
571 & gradl(i+1,jend))).gt.0.0_r8)
THEN
576 cff=max(dkdx*dkdx+dkde*dkde,eps)
578 cx=min(cff,max(dkdt*dkdx,-cff))
583 gls(i,jend+1,k,nout)=(cff*gls(i,jend+1,k,nstp)+ &
584 & ce *gls(i,jend ,k,nout)- &
586 & gradl(i ,jend+1)- &
588 & gradl(i+1,jend+1))/ &
591 gls(i,jend+1,k,nout)=gls(i,jend+1,k,nout)* &
592 &
grid(ng)%rmask(i,jend+1)
604 tke(i,jend+1,k,nout)=tke(i,jend,k,nout)
606 tke(i,jend+1,k,nout)=tke(i,jend+1,k,nout)* &
607 &
grid(ng)%rmask(i,jend+1)
609 gls(i,jend+1,k,nout)=gls(i,jend,k,nout)
611 gls(i,jend+1,k,nout)=gls(i,jend+1,k,nout)* &
612 &
grid(ng)%rmask(i,jend+1)
624 tke(i,jend+1,k,nout)=tke(i,jend,k,nout)
626 tke(i,jend+1,k,nout)=tke(i,jend+1,k,nout)* &
627 &
grid(ng)%rmask(i,jend+1)
629 gls(i,jend+1,k,nout)=gls(i,jend,k,nout)
631 gls(i,jend+1,k,nout)=gls(i,jend+1,k,nout)* &
632 &
grid(ng)%rmask(i,jend+1)
645 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
649 tke(istr-1,jstr-1,k,nout)=0.5_r8* &
650 & (tke(istr ,jstr-1,k,nout)+ &
651 & tke(istr-1,jstr ,k,nout))
652 gls(istr-1,jstr-1,k,nout)=0.5_r8* &
653 & (gls(istr ,jstr-1,k,nout)+ &
654 & gls(istr-1,jstr ,k,nout))
658 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
662 tke(iend+1,jstr-1,k,nout)=0.5_r8* &
663 & (tke(iend ,jstr-1,k,nout)+ &
664 & tke(iend+1,jstr ,k,nout))
665 gls(iend+1,jstr-1,k,nout)=0.5_r8* &
666 & (gls(iend ,jstr-1,k,nout)+ &
667 & gls(iend+1,jstr ,k,nout))
671 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
675 tke(istr-1,jend+1,k,nout)=0.5_r8* &
676 & (tke(istr ,jend+1,k,nout)+ &
677 & tke(istr-1,jend ,k,nout))
678 gls(istr-1,jend+1,k,nout)=0.5_r8* &
679 & (gls(istr ,jend+1,k,nout)+ &
680 & gls(istr-1,jend ,k,nout))
684 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
688 tke(iend+1,jend+1,k,nout)=0.5_r8* &
689 & (tke(iend ,jend+1,k,nout)+ &
690 & tke(iend+1,jend ,k,nout))
691 gls(iend+1,jend+1,k,nout)=0.5_r8* &
692 & (gls(iend ,jend+1,k,nout)+ &
693 & gls(iend+1,jend ,k,nout))