54 & LBi, UBi, LBj, UBj, &
55 & IminS, ImaxS, JminS, JmaxS, &
68 integer,
intent(in) :: ng, tile
69 integer,
intent(in) :: lbi, ubi, lbj, ubj
70 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
71 integer,
intent(in) :: krhs, kstp, kout
74 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
76 real(r8),
intent(inout) :: tl_zeta(lbi:,lbj:,:)
78 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,3)
80 real(r8),
intent(inout) :: tl_zeta(lbi:ubi,lbj:ubj,3)
88 real(r8) :: cff, cff1, cff2, dt2d, tau
90 real(r8) :: tl_ce, tl_cx
91 real(r8) :: tl_cff1, tl_cff2
93 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_grad
95# include "set_bounds.h"
101 IF (first_2d_step)
THEN
116 IF (
domain(ng)%Western_Edge(tile))
THEN
121 IF (
iic(ng).ne.0)
THEN
126 tl_grad(istr-1,j)=0.0_r8
130# if defined CELERITY_READ && defined FORWARD_READ
132 IF (
boundary(ng)%zeta_west_Cx(j).eq.0.0_r8)
THEN
153 tl_zeta(istr-1,j,kout)=(cff*tl_zeta(istr-1,j,know)+ &
154 & cx *tl_zeta(istr ,j,kout)- &
156 & tl_grad(istr-1,j )- &
158 & tl_grad(istr-1,j+1))/ &
166 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)- &
167 & tau*tl_zeta(istr-1,j,know)
173 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
174 &
grid(ng)%rmask(istr-1,j)
185 cff=dt2d*
grid(ng)%pm(istr,j)
186 cff1=sqrt(
g*(
grid(ng)%h(istr,j)+ &
187 & zeta(istr,j,know)))
188 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(istr,j)+ &
189 & tl_zeta(istr,j,know))/cff1
195 tl_zeta(istr-1,j,kout)=(1.0_r8-cx)*tl_zeta(istr-1,j,know)+&
196 & tl_cx*(zeta(istr-1,j,know)+ &
197 & zeta(istr ,j,know))+ &
198 & cx*tl_zeta(istr,j,know)
203 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
204 &
grid(ng)%rmask(istr-1,j)
214 cff=dt2d*
grid(ng)%pm(istr,j)
215 cff1=sqrt(
g*(
grid(ng)%h(istr,j)+ &
216 & zeta(istr,j,know)))
217 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(istr,j)+ &
218 & tl_zeta(istr,j,know))/cff1
221 cff2=1.0_r8/(1.0_r8+cx)
222 tl_cff2=-cff2*cff2*tl_cx
226 tl_zeta(istr-1,j,kout)=tl_cff2*(zeta(istr-1,j,know)+ &
227 & cx*zeta(istr,j,kout))+ &
228 & cff2*(tl_zeta(istr-1,j,know)+ &
229 & tl_cx*zeta(istr,j,kout)+ &
230 & cx*tl_zeta(istr,j,kout))
235 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
236 &
grid(ng)%rmask(istr-1,j)
248# ifdef ADJUST_BOUNDARY
250 tl_zeta(istr-1,j,kout)=
boundary(ng)%tl_zeta_west(j)
252 tl_zeta(istr-1,j,kout)=0.0_r8
255 tl_zeta(istr-1,j,kout)=0.0_r8
261 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
262 &
grid(ng)%rmask(istr-1,j)
274 tl_zeta(istr-1,j,kout)=tl_zeta(istr,j,kout)
279 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
280 &
grid(ng)%rmask(istr-1,j)
292 tl_zeta(istr-1,j,kout)=tl_zeta(istr,j,kout)
297 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
298 &
grid(ng)%rmask(istr-1,j)
309 IF (
domain(ng)%Eastern_Edge(tile))
THEN
314 IF (
iic(ng).ne.0)
THEN
319 tl_grad(iend+1,j)=0.0_r8
323# if defined CELERITY_READ && defined FORWARD_READ
325 IF (
boundary(ng)%zeta_east_Cx(j).eq.0.0_r8)
THEN
346 tl_zeta(iend+1,j,kout)=(cff*tl_zeta(iend+1,j,know)+ &
347 & cx *tl_zeta(iend ,j,kout)- &
349 & tl_grad(iend+1,j )- &
351 & tl_grad(iend+1,j+1))/ &
359 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)- &
360 & tau*tl_zeta(iend+1,j,know)
366 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
367 &
grid(ng)%rmask(iend+1,j)
378 cff=dt2d*
grid(ng)%pm(iend,j)
379 cff1=sqrt(
g*(
grid(ng)%h(iend,j)+ &
380 & zeta(iend,j,know)))
381 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(iend,j)+ &
382 & tl_zeta(iend,j,know))/cff1
388 tl_zeta(iend+1,j,kout)=(1.0_r8-cx)*tl_zeta(iend+1,j,know)+&
389 & tl_cx*(zeta(iend+1,j,know)+ &
390 & zeta(iend ,j,know))+ &
391 & cx*tl_zeta(iend,j,know)
396 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
397 &
grid(ng)%rmask(iend+1,j)
407 cff=dt2d*
grid(ng)%pm(iend,j)
408 cff1=sqrt(
g*(
grid(ng)%h(iend,j)+ &
409 & zeta(iend,j,know)))
410 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(iend,j)+ &
411 & tl_zeta(iend,j,know))/cff1
414 cff2=1.0_r8/(1.0_r8+cx)
415 tl_cff2=-cff2*cff2*tl_cx
419 tl_zeta(iend+1,j,kout)=tl_cff2*(zeta(iend+1,j,know)+ &
420 & cx*zeta(iend,j,kout))+ &
421 & cff2*(tl_zeta(iend+1,j,know)+ &
422 & tl_cx*zeta(iend,j,kout)+ &
423 & cx*tl_zeta(iend,j,kout))
428 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
429 &
grid(ng)%rmask(iend+1,j)
441# ifdef ADJUST_BOUNDARY
443 tl_zeta(iend+1,j,kout)=
boundary(ng)%tl_zeta_east(j)
445 tl_zeta(iend+1,j,kout)=0.0_r8
448 tl_zeta(iend+1,j,kout)=0.0_r8
454 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
455 &
grid(ng)%rmask(iend+1,j)
467 tl_zeta(iend+1,j,kout)=tl_zeta(iend,j,kout)
472 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
473 &
grid(ng)%rmask(iend+1,j)
485 tl_zeta(iend+1,j,kout)=tl_zeta(iend,j,kout)
490 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
491 &
grid(ng)%rmask(iend+1,j)
502 IF (
domain(ng)%Southern_Edge(tile))
THEN
507 IF (
iic(ng).ne.0)
THEN
512 tl_grad(i,jstr)=0.0_r8
516# if defined CELERITY_READ && defined FORWARD_READ
518 IF (
boundary(ng)%zeta_south_Ce(i).eq.0.0_r8)
THEN
539 tl_zeta(i,jstr-1,kout)=(cff*tl_zeta(i,jstr-1,know)+ &
540 & ce *tl_zeta(i,jstr ,kout)- &
542 & tl_grad(i ,jstr-1)- &
544 & tl_grad(i+1,jstr-1))/ &
552 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)- &
553 & tau*tl_zeta(i,jstr-1,know)
559 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
560 &
grid(ng)%rmask(i,jstr-1)
571 cff=dt2d*
grid(ng)%pn(i,jstr)
572 cff1=sqrt(
g*(
grid(ng)%h(i,jstr)+ &
573 & zeta(i,jstr,know)))
574 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jstr)+ &
575 & tl_zeta(i,jstr,know))/cff1
581 tl_zeta(i,jstr-1,kout)=(1.0_r8-ce)*tl_zeta(i,jstr-1,know)+&
582 & tl_ce*(zeta(i,jstr-1,know)+ &
583 & zeta(i,jstr ,know))+ &
584 & ce*tl_zeta(i,jstr,know)
589 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
590 &
grid(ng)%rmask(i,jstr-1)
600 cff=dt2d*
grid(ng)%pn(i,jstr)
601 cff1=sqrt(
g*(
grid(ng)%h(i,jstr)+ &
602 & zeta(i,jstr,know)))
603 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jstr)+ &
604 & tl_zeta(i,jstr,know))/cff1
607 cff2=1.0_r8/(1.0_r8+ce)
608 tl_cff2=-cff2*cff2*tl_ce
612 tl_zeta(i,jstr-1,kout)=tl_cff2*(zeta(i,jstr-1,know)+ &
613 & ce*zeta(i,jstr,kout))+ &
614 & cff2*(tl_zeta(i,jstr-1,know)+ &
615 & tl_ce*zeta(i,jstr,kout)+ &
616 & ce*tl_zeta(i,jstr,kout))
621 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
622 &
grid(ng)%rmask(i,jstr-1)
634# ifdef ADJUST_BOUNDARY
636 tl_zeta(i,jstr-1,kout)=
boundary(ng)%tl_zeta_south(i)
638 tl_zeta(i,jstr-1,kout)=0.0_r8
641 tl_zeta(i,jstr-1,kout)=0.0_r8
647 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
648 &
grid(ng)%rmask(i,jstr-1)
660 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr,kout)
665 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
666 &
grid(ng)%rmask(i,jstr-1)
678 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr,kout)
683 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
684 &
grid(ng)%rmask(i,jstr-1)
695 IF (
domain(ng)%Northern_Edge(tile))
THEN
700 IF (
iic(ng).ne.0)
THEN
705 tl_grad(i,jend+1)=0.0_r8
709# if defined CELERITY_READ && defined FORWARD_READ
711 IF (
boundary(ng)%zeta_north_Ce(i).eq.0.0_r8)
THEN
732 tl_zeta(i,jend+1,kout)=(cff*tl_zeta(i,jend+1,know)+ &
733 & ce *tl_zeta(i,jend ,kout)- &
735 & tl_grad(i ,jend+1)- &
737 & tl_grad(i+1,jend+1))/ &
745 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)- &
746 & tau*tl_zeta(i,jend+1,know)
752 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
753 &
grid(ng)%rmask(i,jend+1)
764 cff=dt2d*
grid(ng)%pn(i,jend)
765 cff1=sqrt(
g*(
grid(ng)%h(i,jend)+ &
766 & zeta(i,jend,know)))
767 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jend)+ &
768 & tl_zeta(i,jend,know))/cff1
774 tl_zeta(i,jend+1,kout)=(1.0_r8-ce)*tl_zeta(i,jend+1,know)+&
775 & tl_ce*(zeta(i,jend+1,know)+ &
776 & zeta(i,jend ,know))+ &
777 & ce*tl_zeta(i,jend,know)
782 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
783 &
grid(ng)%rmask(i,jend+1)
793 cff=dt2d*
grid(ng)%pn(i,jend)
794 cff1=sqrt(
g*(
grid(ng)%h(i,jend)+ &
795 & zeta(i,jend,know)))
796 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jend)+ &
797 & tl_zeta(i,jend,know))/cff1
800 cff2=1.0_r8/(1.0_r8+ce)
801 tl_cff2=-cff2*cff2*tl_ce
805 tl_zeta(i,jend+1,kout)=tl_cff2*(zeta(i,jend+1,know)+ &
806 & ce*zeta(i,jend,kout))+ &
807 & cff2*(tl_zeta(i,jend+1,know)+ &
808 & tl_ce*zeta(i,jend,kout)+ &
809 & ce*tl_zeta(i,jend,kout))
814 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
815 &
grid(ng)%rmask(i,jend+1)
827# ifdef ADJUST_BOUNDARY
829 tl_zeta(i,jend+1,kout)=
boundary(ng)%tl_zeta_north(i)
831 tl_zeta(i,jend+1,kout)=0.0_r8
834 tl_zeta(i,jend+1,kout)=0.0_r8
840 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
841 &
grid(ng)%rmask(i,jend+1)
853 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend,kout)
858 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
859 &
grid(ng)%rmask(i,jend+1)
871 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend,kout)
876 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
877 &
grid(ng)%rmask(i,jend+1)
889 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
895 tl_zeta(istr-1,jstr-1,kout)=0.5_r8* &
896 & (tl_zeta(istr ,jstr-1,kout)+ &
897 & tl_zeta(istr-1,jstr ,kout))
900 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
906 tl_zeta(iend+1,jstr-1,kout)=0.5_r8* &
907 & (tl_zeta(iend ,jstr-1,kout)+ &
908 & tl_zeta(iend+1,jstr ,kout))
911 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
917 tl_zeta(istr-1,jend+1,kout)=0.5_r8* &
918 & (tl_zeta(istr-1,jend ,kout)+ &
919 & tl_zeta(istr ,jend+1,kout))
922 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
928 tl_zeta(iend+1,jend+1,kout)=0.5_r8* &
929 & (tl_zeta(iend+1,jend ,kout)+ &
930 & tl_zeta(iend ,jend+1,kout))
943 IF (
domain(ng)%Western_Edge(tile))
THEN
946 IF (zeta(istr-1,j,kout).le. &
950 tl_zeta(istr-1,j,kout)=-
grid(ng)%tl_h(istr-1,j)
955 IF (
domain(ng)%Eastern_Edge(tile))
THEN
958 IF (zeta(iend+1,j,kout).le. &
962 tl_zeta(iend+1,j,kout)=-
grid(ng)%tl_h(iend+1,j)
970 IF (
domain(ng)%Southern_Edge(tile))
THEN
973 IF (zeta(i,jstr-1,kout).le. &
977 tl_zeta(i,jstr-1,kout)=-
grid(ng)%tl_h(i,jstr-1)
982 IF (
domain(ng)%Northern_Edge(tile))
THEN
985 IF (zeta(i,jend+1,kout).le. &
989 tl_zeta(i,jend+1,kout)=-
grid(ng)%tl_h(i,jend+1)
997 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1000 IF (zeta(istr-1,jstr-1,kout).le. &
1001 & (
dcrit(ng)-
grid(ng)%h(istr-1,jstr-1)))
THEN
1004 tl_zeta(istr-1,jstr-1,kout)=-
grid(ng)%tl_h(istr-1,jstr-1)
1008 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1011 IF (zeta(iend+1,jstr-1,kout).le. &
1012 & (
dcrit(ng)-
grid(ng)%h(iend+1,jstr-1)))
THEN
1015 tl_zeta(iend+1,jstr-1,kout)=-
grid(ng)%tl_h(iend+1,jstr-1)
1019 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1022 IF (zeta(istr-1,jend+1,kout).le. &
1023 & (
dcrit(ng)-
grid(ng)%h(istr-1,jend+1)))
THEN
1026 tl_zeta(istr-1,jend+1,kout)=-
grid(ng)%tl_h(istr-1,jend+1)
1030 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1033 IF (zeta(iend+1,jend+1,kout).le. &
1034 & (
dcrit(ng)-
grid(ng)%h(iend+1,jend+1)))
THEN
1037 tl_zeta(iend+1,jend+1,kout)=-
grid(ng)%tl_h(iend+1,jend+1)