52 & LBi, UBi, LBj, UBj, &
53 & IminS, ImaxS, JminS, JmaxS, &
74 integer,
intent(in) :: ng, tile
75 integer,
intent(in) :: lbi, ubi, lbj, ubj
76 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
77 integer,
intent(in) :: krhs, kstp, kout
80 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
81 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
83 real(r8),
intent(inout) :: ubar(lbi:,lbj:,:)
85 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
86 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,:)
88 real(r8),
intent(inout) :: ubar(lbi:ubi,lbj:ubj,:)
96 integer :: idg, jdg, cr, dg, m, rg, tnew, told
99 real(r8),
parameter :: eps = 1.0e-20_r8
101 real(r8) :: ce, cx, zx
102 real(r8) :: bry_pgr, bry_cor, bry_str, bry_val
103 real(r8) :: cff, cff1, cff2, cff3, dt2d, dude, dudt, dudx
104 real(r8) :: obc_in, obc_out, phi, tau
105#if defined ATM_PRESS && defined PRESS_COMPENSATE
106 real(r8) :: oneatm, fac
109 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
111#include "set_bounds.h"
117#if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
121 IF (first_2d_step)
THEN
132#if defined ATM_PRESS && defined PRESS_COMPENSATE
134 fac=100.0_r8/(
g*
rho0)
141 IF (
domain(ng)%Western_Edge(tile))
THEN
147 grad(istr ,j)=ubar(istr ,j ,know)- &
148 & ubar(istr ,j-1,know)
149 grad(istr+1,j)=ubar(istr+1,j ,know)- &
150 & ubar(istr+1,j-1,know)
154 dudt=ubar(istr+1,j,know)-ubar(istr+1,j,kout)
155 dudx=ubar(istr+1,j,kout)-ubar(istr+2,j,kout)
160 & (
clima(ng)%M2nudgcof(istr-1,j)+ &
161 &
clima(ng)%M2nudgcof(istr ,j))
162 obc_in =
obcfac(ng)*obc_out
167 IF ((dudt*dudx).lt.0.0_r8)
THEN
172#ifdef IMPLICIT_NUDGING
173 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
179 IF ((dudt*dudx).lt.0.0_r8) dudt=0.0_r8
180 IF ((dudt*(grad(istr+1,j )+ &
181 & grad(istr+1,j+1))).gt.0.0_r8)
THEN
184 dude=grad(istr+1,j+1)
186 cff=max(dudx*dudx+dude*dude,eps)
189 ce=min(cff,max(dudt*dude,-cff))
193#if defined CELERITY_WRITE && defined FORWARD_WRITE
198 ubar(istr,j,kout)=(cff*ubar(istr ,j,know)+ &
199 & cx *ubar(istr+1,j,kout)- &
200 & max(ce,0.0_r8)*grad(istr,j )- &
201 & min(ce,0.0_r8)*grad(istr,j+1))/ &
205#ifdef IMPLICIT_NUDGING
206 phi=
dt(ng)/(tau+
dt(ng))
207 ubar(istr,j,kout)=(1.0_r8-phi)*ubar(istr,j,kout)+ &
210 ubar(istr,j,kout)=ubar(istr,j,kout)+ &
216 ubar(istr,j,kout)=ubar(istr,j,kout)* &
217 &
grid(ng)%umask(istr,j)
227#if defined SSH_TIDES && !defined UV_TIDES
229 bry_pgr=-
g*(zeta(istr,j,know)- &
231 & 0.5_r8*
grid(ng)%pm(istr,j)
233 bry_pgr=-
g*(zeta(istr ,j,know)- &
234 & zeta(istr-1,j,know))* &
235 & 0.5_r8*(
grid(ng)%pm(istr-1,j)+ &
236 &
grid(ng)%pm(istr ,j))
239 bry_cor=0.125_r8*(vbar(istr-1,j ,know)+ &
240 & vbar(istr-1,j+1,know)+ &
241 & vbar(istr ,j ,know)+ &
242 & vbar(istr ,j+1,know))* &
243 & (
grid(ng)%f(istr-1,j)+ &
244 &
grid(ng)%f(istr ,j))
248 cff1=1.0_r8/(0.5_r8*(
grid(ng)%h(istr-1,j)+ &
249 & zeta(istr-1,j,know)+ &
250 &
grid(ng)%h(istr ,j)+ &
251 & zeta(istr ,j,know)))
252 bry_str=cff1*(
forces(ng)%sustr(istr,j)- &
253 &
forces(ng)%bustr(istr,j))
254 cx=1.0_r8/sqrt(
g*0.5_r8*(
grid(ng)%h(istr-1,j)+ &
255 & zeta(istr-1,j,know)+ &
256 &
grid(ng)%h(istr ,j)+ &
257 & zeta(istr ,j,know)))
258 cff2=
grid(ng)%om_u(istr,j)*cx
260 bry_val=ubar(istr+1,j,know)+ &
267 cff=1.0_r8/(0.5_r8*(
grid(ng)%h(istr-1,j)+ &
268 & zeta(istr-1,j,know)+ &
269 &
grid(ng)%h(istr ,j)+ &
270 & zeta(istr ,j,know)))
272#if defined ATM_PRESS && defined PRESS_COMPENSATE
273 ubar(istr,j,kout)=bry_val- &
275 & (zeta(istr-1,j,know)+ &
276 & zeta(istr ,j,know)+ &
277 & fac*(
forces(ng)%Pair(istr-1,j)+ &
278 &
forces(ng)%Pair(istr ,j)- &
282 ubar(istr,j,kout)=bry_val- &
283 & cx*(0.5_r8*(zeta(istr-1,j,know)+ &
284 & zeta(istr ,j,know))- &
288 ubar(istr,j,kout)=ubar(istr,j,kout)* &
289 &
grid(ng)%umask(istr,j)
299#if defined SSH_TIDES && !defined UV_TIDES
301 bry_pgr=-
g*(zeta(istr,j,know)- &
303 & 0.5_r8*
grid(ng)%pm(istr,j)
305 bry_pgr=-
g*(zeta(istr ,j,know)- &
306 & zeta(istr-1,j,know))* &
307 & 0.5_r8*(
grid(ng)%pm(istr-1,j)+ &
308 &
grid(ng)%pm(istr ,j))
311 bry_cor=0.125_r8*(vbar(istr-1,j ,know)+ &
312 & vbar(istr-1,j+1,know)+ &
313 & vbar(istr ,j ,know)+ &
314 & vbar(istr ,j+1,know))* &
315 & (
grid(ng)%f(istr-1,j)+ &
316 &
grid(ng)%f(istr ,j))
320 cff1=1.0_r8/(0.5_r8*(
grid(ng)%h(istr-1,j)+ &
321 & zeta(istr-1,j,know)+ &
322 &
grid(ng)%h(istr ,j)+ &
323 & zeta(istr ,j,know)))
324 bry_str=cff1*(
forces(ng)%sustr(istr,j)- &
325 &
forces(ng)%bustr(istr,j))
326 cx=1.0_r8/sqrt(
g*0.5_r8*(
grid(ng)%h(istr-1,j)+ &
327 & zeta(istr-1,j,know)+ &
328 &
grid(ng)%h(istr ,j)+ &
329 & zeta(istr ,j,know)))
330 cff2=
grid(ng)%om_u(istr,j)*cx
332 bry_val=ubar(istr+1,j,know)+ &
340 cff=0.5_r8*(
grid(ng)%h(istr-1,j)+ &
341 & zeta(istr-1,j,know)+ &
342 &
grid(ng)%h(istr ,j)+ &
343 & zeta(istr ,j,know))
345 cff=0.5_r8*(
grid(ng)%h(istr-1,j)+ &
346 &
grid(ng)%h(istr ,j))
349 cx=dt2d*cff1*cff*0.5_r8*(
grid(ng)%pm(istr-1,j)+ &
350 &
grid(ng)%pm(istr ,j))
351 zx=(0.5_r8+cx)*zeta(istr ,j,know)+ &
352 & (0.5_r8-cx)*zeta(istr-1,j,know)
354 cff2=(1.0_r8-
co/cx)**2
355 cff3=zeta(istr,j,kout)+ &
356 & cx*zeta(istr-1,j,know)- &
357 & (1.0_r8+cx)*zeta(istr,j,know)
360 ubar(istr,j,kout)=0.5_r8* &
361 & ((1.0_r8-cx)*ubar(istr,j,know)+ &
362 & cx*ubar(istr+1,j,know)+ &
364 & cff1*(zx-
boundary(ng)%zeta_west(j)))
366 ubar(istr,j,kout)=ubar(istr,j,kout)* &
367 &
grid(ng)%umask(istr,j)
377 ubar(istr,j,kout)=
boundary(ng)%ubar_west(j)
379 ubar(istr,j,kout)=ubar(istr,j,kout)* &
380 &
grid(ng)%umask(istr,j)
390 ubar(istr,j,kout)=ubar(istr+1,j,kout)
392 ubar(istr,j,kout)=ubar(istr,j,kout)* &
393 &
grid(ng)%umask(istr,j)
404 bry_pgr=-
g*(zeta(istr,j,know)- &
406 & 0.5_r8*
grid(ng)%pm(istr,j)
408 bry_pgr=-
g*(zeta(istr ,j,know)- &
409 & zeta(istr-1,j,know))* &
410 & 0.5_r8*(
grid(ng)%pm(istr-1,j)+ &
411 &
grid(ng)%pm(istr ,j))
414 bry_cor=0.125_r8*(vbar(istr-1,j ,know)+ &
415 & vbar(istr-1,j+1,know)+ &
416 & vbar(istr ,j ,know)+ &
417 & vbar(istr ,j+1,know))* &
418 & (
grid(ng)%f(istr-1,j)+ &
419 &
grid(ng)%f(istr ,j))
423 cff=1.0_r8/(0.5_r8*(
grid(ng)%h(istr-1,j)+ &
424 & zeta(istr-1,j,know)+ &
425 &
grid(ng)%h(istr ,j)+ &
426 & zeta(istr ,j,know)))
427 bry_str=cff*(
forces(ng)%sustr(istr,j)- &
428 &
forces(ng)%bustr(istr,j))
429 ubar(istr,j,kout)=ubar(istr,j,know)+ &
434 ubar(istr,j,kout)=ubar(istr,j,kout)* &
435 &
grid(ng)%umask(istr,j)
445 ubar(istr,j,kout)=0.0_r8
459 & (rg.eq.ng).and.(
dxmax(dg).gt.
dxmax(rg)))
THEN
466 cff=0.5_r8*
grid(ng)%on_u(istr,j)* &
467 & (
grid(ng)%h(istr-1,j)+zeta(istr-1,j,kout)+ &
468 &
grid(ng)%h(istr ,j)+zeta(istr ,j,kout))
470 bry_val=cff1*
refined(cr)%U2d_flux(1,m,tnew)/cff
472 bry_val=bry_val-
ocean(ng)%ubar_stokes(istr,j)
475 bry_val=bry_val*
grid(ng)%umask(istr,j)
480 ubar(istr,j,kout)=bry_val
492 IF (
domain(ng)%Eastern_Edge(tile))
THEN
498 grad(iend ,j)=ubar(iend ,j ,know)- &
499 & ubar(iend ,j-1,know)
500 grad(iend+1,j)=ubar(iend+1,j ,know)- &
501 & ubar(iend+1,j-1,know)
505 dudt=ubar(iend,j,know)-ubar(iend ,j,kout)
506 dudx=ubar(iend,j,kout)-ubar(iend-1,j,kout)
511 & (
clima(ng)%M2nudgcof(iend ,j)+ &
512 &
clima(ng)%M2nudgcof(iend+1,j))
513 obc_in =
obcfac(ng)*obc_out
518 IF ((dudt*dudx).lt.0.0_r8)
THEN
523#ifdef IMPLICIT_NUDGING
524 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
530 IF ((dudt*dudx).lt.0.0_r8) dudt=0.0_r8
531 IF ((dudt*(grad(iend,j )+ &
532 & grad(iend,j+1))).gt.0.0_r8)
THEN
537 cff=max(dudx*dudx+dude*dude,eps)
540 ce=min(cff,max(dudt*dude,-cff))
544#if defined CELERITY_WRITE && defined FORWARD_WRITE
549 ubar(iend+1,j,kout)=(cff*ubar(iend+1,j,know)+ &
550 & cx *ubar(iend ,j,kout)- &
551 & max(ce,0.0_r8)*grad(iend+1,j )- &
552 & min(ce,0.0_r8)*grad(iend+1,j+1))/ &
556#ifdef IMPLICIT_NUDGING
557 phi=
dt(ng)/(tau+
dt(ng))
558 ubar(iend+1,j,kout)=(1.0_r8-phi)*ubar(iend+1,j,kout)+ &
561 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)+ &
563 & ubar(iend+1,j,know))
567 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
568 &
grid(ng)%umask(iend+1,j)
578#if defined SSH_TIDES && !defined UV_TIDES
581 & zeta(iend,j,know))* &
582 & 0.5_r8*
grid(ng)%pm(iend,j)
584 bry_pgr=-
g*(zeta(iend+1,j,know)- &
585 & zeta(iend ,j,know))* &
586 & 0.5_r8*(
grid(ng)%pm(iend ,j)+ &
587 &
grid(ng)%pm(iend+1,j))
590 bry_cor=0.125_r8*(vbar(iend ,j ,know)+ &
591 & vbar(iend ,j+1,know)+ &
592 & vbar(iend+1,j ,know)+ &
593 & vbar(iend+1,j+1,know))* &
594 & (
grid(ng)%f(iend ,j)+ &
595 &
grid(ng)%f(iend+1,j))
599 cff1=1.0_r8/(0.5_r8*(
grid(ng)%h(iend ,j)+ &
600 & zeta(iend ,j,know)+ &
601 &
grid(ng)%h(iend+1,j)+ &
602 & zeta(iend+1,j,know)))
603 bry_str=cff1*(
forces(ng)%sustr(iend+1,j)- &
604 &
forces(ng)%bustr(iend+1,j))
605 cx=1.0_r8/sqrt(
g*0.5_r8*(
grid(ng)%h(iend+1,j)+ &
606 & zeta(iend+1,j,know)+ &
607 &
grid(ng)%h(iend ,j)+ &
608 & zeta(iend ,j,know)))
609 cff2=
grid(ng)%om_u(iend+1,j)*cx
611 bry_val=ubar(iend,j,know)+ &
618 cff=1.0_r8/(0.5_r8*(
grid(ng)%h(iend ,j)+ &
619 & zeta(iend ,j,know)+ &
620 &
grid(ng)%h(iend+1,j)+ &
621 & zeta(iend+1,j,know)))
623#if defined ATM_PRESS && defined PRESS_COMPENSATE
624 ubar(iend+1,j,kout)=bry_val+ &
626 & (zeta(iend ,j,know)+ &
627 & zeta(iend+1,j,know)+ &
628 & fac*(
forces(ng)%Pair(iend ,j)+ &
629 &
forces(ng)%Pair(iend+1,j)- &
633 ubar(iend+1,j,kout)=bry_val+ &
634 & cx*(0.5_r8*(zeta(iend ,j,know)+ &
635 & zeta(iend+1,j,know))- &
639 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
640 &
grid(ng)%umask(iend+1,j)
650#if defined SSH_TIDES && !defined UV_TIDES
653 & zeta(iend,j,know))* &
654 & 0.5_r8*
grid(ng)%pm(iend,j)
656 bry_pgr=-
g*(zeta(iend+1,j,know)- &
657 & zeta(iend ,j,know))* &
658 & 0.5_r8*(
grid(ng)%pm(iend ,j)+ &
659 &
grid(ng)%pm(iend+1,j))
662 bry_cor=0.125_r8*(vbar(iend ,j ,know)+ &
663 & vbar(iend ,j+1,know)+ &
664 & vbar(iend+1,j ,know)+ &
665 & vbar(iend+1,j+1,know))* &
666 & (
grid(ng)%f(iend ,j)+ &
667 &
grid(ng)%f(iend+1,j))
671 cff1=1.0_r8/(0.5_r8*(
grid(ng)%h(iend ,j)+ &
672 & zeta(iend ,j,know)+ &
673 &
grid(ng)%h(iend+1,j)+ &
674 & zeta(iend+1,j,know)))
675 bry_str=cff1*(
forces(ng)%sustr(iend+1,j)- &
676 &
forces(ng)%bustr(iend+1,j))
677 cx=1.0_r8/sqrt(
g*0.5_r8*(
grid(ng)%h(iend+1,j)+ &
678 & zeta(iend+1,j,know)+ &
679 &
grid(ng)%h(iend ,j)+ &
680 & zeta(iend ,j,know)))
681 cff2=
grid(ng)%om_u(iend+1,j)*cx
683 bry_val=ubar(iend,j,know)+ &
691 cff=0.5_r8*(
grid(ng)%h(iend ,j)+ &
692 & zeta(iend ,j,know)+ &
693 &
grid(ng)%h(iend+1,j)+ &
694 & zeta(iend+1,j,know))
696 cff=0.5_r8*(
grid(ng)%h(iend ,j)+ &
697 &
grid(ng)%h(iend+1,j))
700 cx=dt2d*cff1*cff*0.5_r8*(
grid(ng)%pm(iend ,j)+ &
701 &
grid(ng)%pm(iend+1,j))
702 zx=(0.5_r8+cx)*zeta(iend ,j,know)+ &
703 & (0.5_r8-cx)*zeta(iend+1,j,know)
705 cff2=(1.0_r8-
co/cx)**2
706 cff3=zeta(iend,j,kout)+ &
707 & cx*zeta(iend+1,j,know)- &
708 & (1.0_r8+cx)*zeta(iend,j,know)
711 ubar(iend+1,j,kout)=0.5_r8* &
712 & ((1.0_r8-cx)*ubar(iend+1,j,know)+ &
713 & cx*ubar(iend,j,know)+ &
715 & cff1*(zx-
boundary(ng)%zeta_east(j)))
717 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
718 &
grid(ng)%umask(iend+1,j)
728 ubar(iend+1,j,kout)=
boundary(ng)%ubar_east(j)
730 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
731 &
grid(ng)%umask(iend+1,j)
741 ubar(iend+1,j,kout)=ubar(iend,j,kout)
743 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
744 &
grid(ng)%umask(iend+1,j)
756 & zeta(iend,j,know))* &
757 & 0.5_r8*
grid(ng)%pm(iend,j)
759 bry_pgr=-
g*(zeta(iend+1,j,know)- &
760 & zeta(iend ,j,know))* &
761 & 0.5_r8*(
grid(ng)%pm(iend ,j)+ &
762 &
grid(ng)%pm(iend+1,j))
765 bry_cor=0.125_r8*(vbar(iend ,j ,know)+ &
766 & vbar(iend ,j+1,know)+ &
767 & vbar(iend+1,j ,know)+ &
768 & vbar(iend+1,j+1,know))* &
769 & (
grid(ng)%f(iend ,j)+ &
770 &
grid(ng)%f(iend+1,j))
774 cff=1.0_r8/(0.5_r8*(
grid(ng)%h(iend ,j)+ &
775 & zeta(iend ,j,know)+ &
776 &
grid(ng)%h(iend+1,j)+ &
777 & zeta(iend+1,j,know)))
778 bry_str=cff*(
forces(ng)%sustr(iend+1,j)- &
779 &
forces(ng)%bustr(iend+1,j))
780 ubar(iend+1,j,kout)=ubar(iend+1,j,know)+ &
785 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)* &
786 &
grid(ng)%umask(iend+1,j)
796 ubar(iend+1,j,kout)=0.0_r8
810 & (rg.eq.ng).and.(
dxmax(dg).gt.
dxmax(rg)))
THEN
817 cff=0.5_r8*
grid(ng)%on_u(iend+1,j)* &
818 & (
grid(ng)%h(iend+1,j)+zeta(iend+1,j,kout)+ &
819 &
grid(ng)%h(iend ,j)+zeta(iend ,j,kout))
821 bry_val=cff1*
refined(cr)%U2d_flux(1,m,tnew)/cff
823 bry_val=bry_val-
ocean(ng)%ubar_stokes(iend+1,j)
826 bry_val=bry_val*
grid(ng)%umask(iend+1,j)
831 ubar(iend+1,j,kout)=bry_val
843 IF (
domain(ng)%Southern_Edge(tile))
THEN
849 grad(i,jstr-1)=ubar(i+1,jstr-1,know)- &
850 & ubar(i ,jstr-1,know)
851 grad(i,jstr )=ubar(i+1,jstr ,know)- &
852 & ubar(i ,jstr ,know)
856 dudt=ubar(i,jstr,know)-ubar(i,jstr ,kout)
857 dude=ubar(i,jstr,kout)-ubar(i,jstr+1,kout)
862 & (
clima(ng)%M2nudgcof(i-1,jstr-1)+ &
863 &
clima(ng)%M2nudgcof(i ,jstr-1))
864 obc_in =
obcfac(ng)*obc_out
869 IF ((dudt*dude).lt.0.0_r8)
THEN
874#ifdef IMPLICIT_NUDGING
875 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
881 IF ((dudt*dude).lt.0.0_r8) dudt=0.0_r8
882 IF ((dudt*(grad(i-1,jstr)+ &
883 & grad(i ,jstr))).gt.0.0_r8)
THEN
888 cff=max(dudx*dudx+dude*dude,eps)
890 cx=min(cff,max(dudt*dudx,-cff))
895#if defined CELERITY_WRITE && defined FORWARD_WRITE
900 ubar(i,jstr-1,kout)=(cff*ubar(i,jstr-1,know)+ &
901 & ce *ubar(i,jstr ,kout)- &
902 & max(cx,0.0_r8)*grad(i-1,jstr-1)- &
903 & min(cx,0.0_r8)*grad(i ,jstr-1))/ &
907#ifdef IMPLICIT_NUDGING
908 phi=
dt(ng)/(tau+
dt(ng))
909 ubar(i,jstr-1,kout)=(1.0_r8-phi)*ubar(i,jstr-1,kout)+ &
912 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)+ &
913 & tau*(
boundary(ng)%ubar_south(i)- &
914 & ubar(i,jstr-1,know))
918 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)* &
919 &
grid(ng)%umask(i,jstr-1)
931 cff=dt2d*0.5_r8*(
grid(ng)%pn(i-1,jstr)+ &
932 &
grid(ng)%pn(i ,jstr))
933 cff1=sqrt(
g*0.5_r8*(
grid(ng)%h(i-1,jstr)+ &
934 & zeta(i-1,jstr,know)+ &
935 &
grid(ng)%h(i ,jstr)+ &
936 & zeta(i ,jstr,know)))
938 cff2=1.0_r8/(1.0_r8+ce)
939 ubar(i,jstr-1,kout)=cff2*(ubar(i,jstr-1,know)+ &
940 & ce*ubar(i,jstr,kout))
942 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)* &
943 &
grid(ng)%umask(i,jstr-1)
953 ubar(i,jstr-1,kout)=
boundary(ng)%ubar_south(i)
955 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)* &
956 &
grid(ng)%umask(i,jstr-1)
966 ubar(i,jstr-1,kout)=ubar(i,jstr,kout)
968 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)* &
969 &
grid(ng)%umask(i,jstr-1)
987 ubar(i,jstr-1,kout)=
gamma2(ng)*ubar(i,jstr,kout)
989 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)* &
990 &
grid(ng)%umask(i,jstr-1)
1001 IF (
domain(ng)%Northern_Edge(tile))
THEN
1007 grad(i,jend )=ubar(i+1,jend ,know)- &
1008 & ubar(i ,jend ,know)
1009 grad(i,jend+1)=ubar(i+1,jend+1,know)- &
1010 & ubar(i ,jend+1,know)
1014 dudt=ubar(i,jend,know)-ubar(i,jend ,kout)
1015 dude=ubar(i,jend,kout)-ubar(i,jend-1,kout)
1020 & (
clima(ng)%M2nudgcof(i-1,jend+1)+ &
1021 &
clima(ng)%M2nudgcof(i ,jend+1))
1022 obc_in =
obcfac(ng)*obc_out
1027 IF ((dudt*dude).lt.0.0_r8)
THEN
1032#ifdef IMPLICIT_NUDGING
1033 IF (tau.gt.0.0_r8) tau=1.0_r8/tau
1039 IF ((dudt*dude).lt.0.0_r8) dudt=0.0_r8
1040 IF ((dudt*(grad(i-1,jend)+ &
1041 & grad(i ,jend))).gt.0.0_r8)
THEN
1046 cff=max(dudx*dudx+dude*dude,eps)
1048 cx=min(cff,max(dudt*dudx,-cff))
1053#if defined CELERITY_WRITE && defined FORWARD_WRITE
1058 ubar(i,jend+1,kout)=(cff*ubar(i,jend+1,know)+ &
1059 & ce *ubar(i,jend ,kout)- &
1060 & max(cx,0.0_r8)*grad(i-1,jend+1)- &
1061 & min(cx,0.0_r8)*grad(i ,jend+1))/ &
1065#ifdef IMPLICIT_NUDGING
1066 phi=
dt(ng)/(tau+
dt(ng))
1067 ubar(i,jend+1,kout)=(1.0_r8-phi)*ubar(i,jend+1,kout)+ &
1070 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)+ &
1071 & tau*(
boundary(ng)%ubar_north(i)- &
1072 & ubar(i,jend+1,know))
1076 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)* &
1077 &
grid(ng)%umask(i,jend+1)
1089 cff=dt2d*0.5_r8*(
grid(ng)%pn(i-1,jend)+ &
1090 &
grid(ng)%pn(i ,jend))
1091 cff1=sqrt(
g*0.5_r8*(
grid(ng)%h(i-1,jend)+ &
1092 & zeta(i-1,jend,know)+ &
1093 &
grid(ng)%h(i ,jend)+ &
1094 & zeta(i ,jend,know)))
1096 cff2=1.0_r8/(1.0_r8+ce)
1097 ubar(i,jend+1,kout)=cff2*(ubar(i,jend+1,know)+ &
1098 & ce*ubar(i,jend,kout))
1100 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)* &
1101 &
grid(ng)%umask(i,jend+1)
1111 ubar(i,jend+1,kout)=
boundary(ng)%ubar_north(i)
1113 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)* &
1114 &
grid(ng)%umask(i,jend+1)
1124 ubar(i,jend+1,kout)=ubar(i,jend,kout)
1126 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)* &
1127 &
grid(ng)%umask(i,jend+1)
1145 ubar(i,jend+1,kout)=
gamma2(ng)*ubar(i,jend,kout)
1147 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)* &
1148 &
grid(ng)%umask(i,jend+1)
1160 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1163 ubar(istr,jstr-1,kout)=0.5_r8*(ubar(istr+1,jstr-1,kout)+ &
1164 & ubar(istr ,jstr ,kout))
1167 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1170 ubar(iend+1,jstr-1,kout)=0.5_r8*(ubar(iend ,jstr-1,kout)+ &
1171 & ubar(iend+1,jstr ,kout))
1174 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1177 ubar(istr,jend+1,kout)=0.5_r8*(ubar(istr ,jend ,kout)+ &
1178 & ubar(istr+1,jend+1,kout))
1181 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1184 ubar(iend+1,jend+1,kout)=0.5_r8*(ubar(iend+1,jend ,kout)+ &
1185 & ubar(iend ,jend+1,kout))
1197 IF (
domain(ng)%Western_Edge(tile))
THEN
1201 cff1=abs(abs(
grid(ng)%umask_wet(istr,j))-1.0_r8)
1202 cff2=0.5_r8+dsign(0.5_r8,ubar(istr,j,kout))* &
1203 &
grid(ng)%umask_wet(istr,j)
1204 cff=0.5_r8*
grid(ng)%umask_wet(istr,j)*cff1+ &
1205 & cff2*(1.0_r8-cff1)
1206 ubar(istr,j,kout)=ubar(istr,j,kout)*cff
1210 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1214 cff1=abs(abs(
grid(ng)%umask_wet(iend+1,j))-1.0_r8)
1215 cff2=0.5_r8+dsign(0.5_r8,ubar(iend+1,j,kout))* &
1216 &
grid(ng)%umask_wet(iend+1,j)
1217 cff=0.5_r8*
grid(ng)%umask_wet(iend+1,j)*cff1+ &
1218 & cff2*(1.0_r8-cff1)
1219 ubar(iend+1,j,kout)=ubar(iend+1,j,kout)*cff
1226 IF (
domain(ng)%Southern_Edge(tile))
THEN
1230 cff1=abs(abs(
grid(ng)%umask_wet(i,jstr-1))-1.0_r8)
1231 cff2=0.5_r8+dsign(0.5_r8,ubar(i,jstr-1,kout))* &
1232 &
grid(ng)%umask_wet(i,jstr-1)
1233 cff=0.5_r8*
grid(ng)%umask_wet(i,jstr-1)*cff1+ &
1234 & cff2*(1.0_r8-cff1)
1235 ubar(i,jstr-1,kout)=ubar(i,jstr-1,kout)*cff
1239 IF (
domain(ng)%Northern_Edge(tile))
THEN
1243 cff1=abs(abs(
grid(ng)%umask_wet(i,jend+1))-1.0_r8)
1244 cff2=0.5_r8+dsign(0.5_r8,ubar(i,jend+1,kout))* &
1245 &
grid(ng)%umask_wet(i,jend+1)
1246 cff=0.5_r8*
grid(ng)%umask_wet(i,jend+1)*cff1+ &
1247 & cff2*(1.0_r8-cff1)
1248 ubar(i,jend+1,kout)=ubar(i,jend+1,kout)*cff
1255 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1260 cff1=abs(abs(
grid(ng)%umask_wet(istr,jstr-1))-1.0_r8)
1261 cff2=0.5_r8+dsign(0.5_r8,ubar(istr,jstr-1,kout))* &
1262 &
grid(ng)%umask_wet(istr,jstr-1)
1263 cff=0.5_r8*
grid(ng)%umask_wet(istr,jstr-1)*cff1+ &
1264 & cff2*(1.0_r8-cff1)
1265 ubar(istr,jstr-1,kout)=ubar(istr,jstr-1,kout)*cff
1268 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1273 cff1=abs(abs(
grid(ng)%umask_wet(iend+1,jstr-1))-1.0_r8)
1274 cff2=0.5_r8+dsign(0.5_r8,ubar(iend+1,jstr-1,kout))* &
1275 &
grid(ng)%umask_wet(iend+1,jstr-1)
1276 cff=0.5_r8*
grid(ng)%umask_wet(iend+1,jstr-1)*cff1+ &
1277 & cff2*(1.0_r8-cff1)
1278 ubar(iend+1,jstr-1,kout)=ubar(iend+1,jstr-1,kout)*cff
1281 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1286 cff1=abs(abs(
grid(ng)%umask_wet(istr,jend+1))-1.0_r8)
1287 cff2=0.5_r8+dsign(0.5_r8,ubar(istr,jend+1,kout))* &
1288 &
grid(ng)%umask_wet(istr,jend+1)
1289 cff=0.5_r8*
grid(ng)%umask_wet(istr,jend+1)*cff1+ &
1290 & cff2*(1.0_r8-cff1)
1291 ubar(istr,jend+1,kout)=ubar(istr,jend+1,kout)*cff
1294 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1299 cff1=abs(abs(
grid(ng)%umask_wet(iend+1,jend+1))-1.0_r8)
1300 cff2=0.5_r8+dsign(0.5_r8,ubar(iend+1,jend+1,kout))* &
1301 &
grid(ng)%umask_wet(iend+1,jend+1)
1302 cff=0.5_r8*
grid(ng)%umask_wet(iend+1,jend+1)*cff1+ &
1303 & cff2*(1.0_r8-cff1)
1304 ubar(iend+1,jend+1,kout)=ubar(iend+1,jend+1,kout)*cff