51 & LBi, UBi, LBj, UBj, UBk, &
52 & 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) :: nstp, nout
72 real(r8),
intent(inout) :: u(lbi:,lbj:,:,:)
74 real(r8),
intent(inout) :: u(lbi:ubi,lbj:ubj,ubk,2)
82 real(r8),
parameter :: eps = 1.0e-20_r8
84 real(r8) :: ce, cx, cff, dude, dudt, dudx
85 real(r8) :: obc_in, obc_out, phi, tau
87 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
89# include "set_bounds.h"
95 IF (
domain(ng)%Western_Edge(tile))
THEN
102 grad(istr ,j)=u(istr ,j ,k,nstp)- &
103 & u(istr ,j-1,k,nstp)
104 grad(istr+1,j)=u(istr+1,j ,k,nstp)- &
105 & u(istr+1,j-1,k,nstp)
109 dudt=u(istr+1,j,k,nstp)-u(istr+1,j,k,nout)
110 dudx=u(istr+1,j,k,nout)-u(istr+2,j,k,nout)
115 & (
clima(ng)%M3nudgcof(istr-1,j,k)+ &
116 &
clima(ng)%M3nudgcof(istr ,j,k))
117 obc_in =
obcfac(ng)*obc_out
122 IF ((dudt*dudx).lt.0.0_r8)
THEN
127# ifdef IMPLICIT_NUDGING
128 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
134 IF ((dudt*dudx).lt.0.0_r8) dudt=0.0_r8
135 IF ((dudt*(grad(istr+1,j )+ &
136 & grad(istr+1,j+1))).gt.0.0_r8)
THEN
139 dude=grad(istr+1,j+1)
141 cff=max(dudx*dudx+dude*dude,eps)
144 ce=min(cff,max(dudt*dude,-cff))
148# if defined CELERITY_WRITE && defined FORWARD_WRITE
153 u(istr,j,k,nout)=(cff*u(istr ,j,k,nstp)+ &
154 & cx *u(istr+1,j,k,nout)- &
155 & max(ce,0.0_r8)*grad(istr,j )- &
156 & min(ce,0.0_r8)*grad(istr,j+1))/ &
160# ifdef IMPLICIT_NUDGING
161 phi=
dt(ng)/(tau+
dt(ng))
162 u(istr,j,k,nout)=(1.0_r8-phi)*u(istr,j,k,nout)+ &
165 u(istr,j,k,nout)=u(istr,j,k,nout)+ &
171 u(istr,j,k,nout)=u(istr,j,k,nout)* &
172 &
grid(ng)%umask(istr,j)
175 u(istr,j,k,nout)=u(istr,j,k,nout)* &
176 &
grid(ng)%umask_wet(istr,j)
188 u(istr,j,k,nout)=
boundary(ng)%u_west(j,k)
190 u(istr,j,k,nout)=u(istr,j,k,nout)* &
191 &
grid(ng)%umask(istr,j)
194 u(istr,j,k,nout)=u(istr,j,k,nout)* &
195 &
grid(ng)%umask_wet(istr,j)
207 u(istr,j,k,nout)=u(istr+1,j,k,nout)
209 u(istr,j,k,nout)=u(istr,j,k,nout)* &
210 &
grid(ng)%umask(istr,j)
213 u(istr,j,k,nout)=u(istr,j,k,nout)* &
214 &
grid(ng)%umask_wet(istr,j)
226 u(istr,j,k,nout)=0.0_r8
237 IF (
domain(ng)%Eastern_Edge(tile))
THEN
244 grad(iend ,j)=u(iend ,j ,k,nstp)- &
245 & u(iend ,j-1,k,nstp)
246 grad(iend+1,j)=u(iend+1,j ,k,nstp)- &
247 & u(iend+1,j-1,k,nstp)
251 dudt=u(iend,j,k,nstp)-u(iend ,j,k,nout)
252 dudx=u(iend,j,k,nout)-u(iend-1,j,k,nout)
257 & (
clima(ng)%M3nudgcof(iend ,j,k)+ &
258 &
clima(ng)%M3nudgcof(iend+1,j,k))
259 obc_in =
obcfac(ng)*obc_out
264 IF ((dudt*dudx).lt.0.0_r8)
THEN
269# ifdef IMPLICIT_NUDGING
270 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
276 IF ((dudt*dudx).lt.0.0_r8) dudt=0.0_r8
277 IF ((dudt*(grad(iend,j )+ &
278 & grad(iend,j+1))).gt.0.0_r8)
THEN
283 cff=max(dudx*dudx+dude*dude,eps)
286 ce=min(cff,max(dudt*dude,-cff))
290# if defined CELERITY_WRITE && defined FORWARD_WRITE
295 u(iend+1,j,k,nout)=(cff*u(iend+1,j,k,nstp)+ &
296 & cx *u(iend ,j,k,nout)- &
297 & max(ce,0.0_r8)*grad(iend+1,j )- &
298 & min(ce,0.0_r8)*grad(iend+1,j+1))/ &
302# ifdef IMPLICIT_NUDGING
303 phi=
dt(ng)/(tau+
dt(ng))
304 u(iend+1,j,k,nout)=(1.0_r8-phi)*u(iend+1,j,k,nout)+ &
307 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)+ &
309 & u(iend+1,j,k,nstp))
313 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
314 &
grid(ng)%umask(iend+1,j)
317 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
318 &
grid(ng)%umask_wet(iend+1,j)
330 u(iend+1,j,k,nout)=
boundary(ng)%u_east(j,k)
332 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
333 &
grid(ng)%umask(iend+1,j)
336 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
337 &
grid(ng)%umask_wet(iend+1,j)
349 u(iend+1,j,k,nout)=u(iend,j,k,nout)
351 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
352 &
grid(ng)%umask(iend+1,j)
355 u(iend+1,j,k,nout)=u(iend+1,j,k,nout)* &
356 &
grid(ng)%umask_wet(iend+1,j)
368 u(iend+1,j,k,nout)=0.0_r8
379 IF (
domain(ng)%Southern_Edge(tile))
THEN
386 grad(i,jstr-1)=u(i+1,jstr-1,k,nstp)- &
387 & u(i ,jstr-1,k,nstp)
388 grad(i,jstr )=u(i+1,jstr ,k,nstp)- &
393 dudt=u(i,jstr,k,nstp)-u(i,jstr ,k,nout)
394 dude=u(i,jstr,k,nout)-u(i,jstr+1,k,nout)
399 & (
clima(ng)%M3nudgcof(i-1,jstr-1,k)+ &
400 &
clima(ng)%M3nudgcof(i ,jstr-1,k))
401 obc_in =
obcfac(ng)*obc_out
406 IF ((dudt*dude).lt.0.0_r8)
THEN
411# ifdef IMPLICIT_NUDGING
412 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
418 IF ((dudt*dude).lt.0.0_r8) dudt=0.0_r8
419 IF ((dudt*(grad(i-1,jstr)+ &
420 & grad(i ,jstr))).gt.0.0_r8)
THEN
425 cff=max(dudx*dudx+dude*dude,eps)
427 cx=min(cff,max(dudt*dudx,-cff))
432# if defined CELERITY_WRITE && defined FORWARD_WRITE
437 u(i,jstr-1,k,nout)=(cff*u(i,jstr-1,k,nstp)+ &
438 & ce *u(i,jstr ,k,nout)- &
439 & max(cx,0.0_r8)*grad(i-1,jstr-1)- &
440 & min(cx,0.0_r8)*grad(i ,jstr-1))/ &
444# ifdef IMPLICIT_NUDGING
445 phi=
dt(ng)/(tau+
dt(ng))
446 u(i,jstr-1,k,nout)=(1.0_r8-phi)*u(i,jstr-1,k,nout)+ &
449 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)+ &
451 & u(i,jstr-1,k,nstp))
455 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
456 &
grid(ng)%umask(i,jstr-1)
459 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
460 &
grid(ng)%umask_wet(i,jstr-1)
472 u(i,jstr-1,k,nout)=
boundary(ng)%u_south(i,k)
474 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
475 &
grid(ng)%umask(i,jstr-1)
478 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
479 &
grid(ng)%umask_wet(i,jstr-1)
491 u(i,jstr-1,k,nout)=u(i,jstr,k,nout)
493 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
494 &
grid(ng)%umask(i,jstr-1)
497 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
498 &
grid(ng)%umask_wet(i,jstr-1)
518 u(i,jstr-1,k,nout)=
gamma2(ng)*u(i,jstr,k,nout)
520 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
521 &
grid(ng)%umask(i,jstr-1)
524 u(i,jstr-1,k,nout)=u(i,jstr-1,k,nout)* &
525 &
grid(ng)%umask_wet(i,jstr-1)
537 IF (
domain(ng)%Northern_Edge(tile))
THEN
544 grad(i,jend )=u(i+1,jend ,k,nstp)- &
546 grad(i,jend+1)=u(i+1,jend+1,k,nstp)- &
547 & u(i ,jend+1,k,nstp)
551 dudt=u(i,jend,k,nstp)-u(i,jend ,k,nout)
552 dude=u(i,jend,k,nout)-u(i,jend-1,k,nout)
557 & (
clima(ng)%M3nudgcof(i-1,jend+1,k)+ &
558 &
clima(ng)%M3nudgcof(i ,jend+1,k))
559 obc_in =
obcfac(ng)*obc_out
564 IF ((dudt*dude).lt.0.0_r8)
THEN
569# ifdef IMPLICIT_NUDGING
570 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
576 IF ((dudt*dude).lt.0.0_r8) dudt=0.0_r8
577 IF ((dudt*(grad(i-1,jend)+ &
578 & grad(i ,jend))).gt.0.0_r8)
THEN
583 cff=max(dudx*dudx+dude*dude,eps)
585 cx=min(cff,max(dudt*dudx,-cff))
590# if defined CELERITY_WRITE && defined FORWARD_WRITE
595 u(i,jend+1,k,nout)=(cff*u(i,jend+1,k,nstp)+ &
596 & ce *u(i,jend ,k,nout)- &
597 & max(cx,0.0_r8)*grad(i-1,jend+1)- &
598 & min(cx,0.0_r8)*grad(i ,jend+1))/ &
602# ifdef IMPLICIT_NUDGING
603 phi=
dt(ng)/(tau+
dt(ng))
604 u(i,jend+1,k,nout)=(1.0_r8-phi)*u(i,jend+1,k,nout)+ &
607 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)+ &
609 & u(i,jend+1,k,nstp))
613 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
614 &
grid(ng)%umask(i,jend+1)
617 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
618 &
grid(ng)%umask_wet(i,jend+1)
630 u(i,jend+1,k,nout)=
boundary(ng)%u_north(i,k)
632 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
633 &
grid(ng)%umask(i,jend+1)
636 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
637 &
grid(ng)%umask_wet(i,jend+1)
649 u(i,jend+1,k,nout)=u(i,jend,k,nout)
651 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
652 &
grid(ng)%umask(i,jend+1)
655 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
656 &
grid(ng)%umask_wet(i,jend+1)
676 u(i,jend+1,k,nout)=
gamma2(ng)*u(i,jend,k,nout)
678 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
679 &
grid(ng)%umask(i,jend+1)
682 u(i,jend+1,k,nout)=u(i,jend+1,k,nout)* &
683 &
grid(ng)%umask_wet(i,jend+1)
696 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
700 u(istr,jstr-1,k,nout)=0.5_r8*(u(istr+1,jstr-1,k,nout)+ &
701 & u(istr ,jstr ,k,nout))
705 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
709 u(iend+1,jstr-1,k,nout)=0.5_r8*(u(iend ,jstr-1,k,nout)+ &
710 & u(iend+1,jstr ,k,nout))
714 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
718 u(istr,jend+1,k,nout)=0.5_r8*(u(istr ,jend ,k,nout)+ &
719 & u(istr+1,jend+1,k,nout))
723 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
727 u(iend+1,jend+1,k,nout)=0.5_r8*(u(iend+1,jend ,k,nout)+ &
728 & u(iend ,jend+1,k,nout))