55 & LBi, UBi, LBj, UBj, &
56 & IminS, ImaxS, JminS, JmaxS, &
69 integer,
intent(in) :: ng, tile
70 integer,
intent(in) :: lbi, ubi, lbj, ubj
71 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
72 integer,
intent(in) :: krhs, kstp, kout
75 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
77 real(r8),
intent(inout) :: tl_zeta(lbi:,lbj:,:)
79 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,3)
81 real(r8),
intent(inout) :: tl_zeta(lbi:ubi,lbj:ubj,3)
89 real(r8) :: cff, cff1, cff2, dt2d, tau
91 real(r8) :: tl_ce, tl_cx
92 real(r8) :: tl_cff1, tl_cff2
94 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_grad
96# include "set_bounds.h"
102 IF (first_2d_step)
THEN
117 IF (
domain(ng)%Western_Edge(tile))
THEN
122 IF (
iic(ng).ne.0)
THEN
127 tl_grad(istr-1,j)=0.0_r8
131# if defined CELERITY_READ && defined FORWARD_READ
133 IF (
boundary(ng)%zeta_west_Cx(j).eq.0.0_r8)
THEN
154 tl_zeta(istr-1,j,kout)=(cff*tl_zeta(istr-1,j,know)+ &
155 & cx *tl_zeta(istr ,j,kout)- &
157 & tl_grad(istr-1,j )- &
159 & tl_grad(istr-1,j+1))/ &
167 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)- &
168 & tau*tl_zeta(istr-1,j,know)
174 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
175 &
grid(ng)%rmask(istr-1,j)
186 cff=dt2d*
grid(ng)%pm(istr,j)
187 cff1=sqrt(
g*(
grid(ng)%h(istr,j)+ &
188 & zeta(istr,j,know)))
189 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(istr,j)+ &
190 & tl_zeta(istr,j,know))/cff1+ &
199 tl_zeta(istr-1,j,kout)=(1.0_r8-cx)*tl_zeta(istr-1,j,know)+&
200 & tl_cx*(zeta(istr-1,j,know)+ &
201 & zeta(istr ,j,know))+ &
202 & cx*tl_zeta(istr,j,know)
210 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
211 &
grid(ng)%rmask(istr-1,j)
221 cff=dt2d*
grid(ng)%pm(istr,j)
222 cff1=sqrt(
g*(
grid(ng)%h(istr,j)+ &
223 & zeta(istr,j,know)))
224 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(istr,j)+ &
225 & tl_zeta(istr,j,know))/cff1+ &
231 cff2=1.0_r8/(1.0_r8+cx)
232 tl_cff2=-cff2*cff2*tl_cx+ &
234 & cff2*cff2*(1.0_r8+2.0_r8*cx)
239 tl_zeta(istr-1,j,kout)=tl_cff2*(zeta(istr-1,j,know)+ &
240 & cx*zeta(istr,j,kout))+ &
241 & cff2*(tl_zeta(istr-1,j,know)+ &
242 & tl_cx*zeta(istr,j,kout)+ &
243 & cx*tl_zeta(istr,j,kout))- &
245 & cff2*(zeta(istr-1,j,know)+ &
246 & 2.0_r8*cx*zeta(istr,j,kout))
252 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
253 &
grid(ng)%rmask(istr-1,j)
265 tl_zeta(istr-1,j,kout)=
boundary(ng)%tl_zeta_west(j)
270 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
271 &
grid(ng)%rmask(istr-1,j)
283 tl_zeta(istr-1,j,kout)=tl_zeta(istr,j,kout)
288 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
289 &
grid(ng)%rmask(istr-1,j)
301 tl_zeta(istr-1,j,kout)=tl_zeta(istr,j,kout)
306 tl_zeta(istr-1,j,kout)=tl_zeta(istr-1,j,kout)* &
307 &
grid(ng)%rmask(istr-1,j)
318 IF (
domain(ng)%Eastern_Edge(tile))
THEN
323 IF (
iic(ng).ne.0)
THEN
328 tl_grad(iend+1,j)=0.0_r8
332# if defined CELERITY_READ && defined FORWARD_READ
334 IF (
boundary(ng)%zeta_east_Cx(j).eq.0.0_r8)
THEN
355 tl_zeta(iend+1,j,kout)=(cff*tl_zeta(iend+1,j,know)+ &
356 & cx *tl_zeta(iend ,j,kout)- &
358 & tl_grad(iend+1,j )- &
360 & tl_grad(iend+1,j+1))/ &
368 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)- &
369 & tau*tl_zeta(iend+1,j,know)
375 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
376 &
grid(ng)%rmask(iend+1,j)
387 cff=dt2d*
grid(ng)%pm(iend,j)
388 cff1=sqrt(
g*(
grid(ng)%h(iend,j)+ &
389 & zeta(iend,j,know)))
390 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(iend,j)+ &
391 & tl_zeta(iend,j,know))/cff1+ &
400 tl_zeta(iend+1,j,kout)=(1.0_r8-cx)*tl_zeta(iend+1,j,know)+&
401 & tl_cx*(zeta(iend+1,j,know)+ &
402 & zeta(iend ,j,know))+ &
403 & cx*tl_zeta(iend,j,know)
411 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
412 &
grid(ng)%rmask(iend+1,j)
422 cff=dt2d*
grid(ng)%pm(iend,j)
423 cff1=sqrt(
g*(
grid(ng)%h(iend,j)+ &
424 & zeta(iend,j,know)))
425 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(iend,j)+ &
426 & tl_zeta(iend,j,know))/cff1+ &
432 cff2=1.0_r8/(1.0_r8+cx)
433 tl_cff2=-cff2*cff2*tl_cx+ &
435 & cff2*cff2*(1.0_r8+2.0_r8*cx)
440 tl_zeta(iend+1,j,kout)=tl_cff2*(zeta(iend+1,j,know)+ &
441 & cx*zeta(iend,j,kout))+ &
442 & cff2*(tl_zeta(iend+1,j,know)+ &
443 & tl_cx*zeta(iend,j,kout)+ &
444 & cx*tl_zeta(iend,j,kout))- &
446 & cff2*(zeta(iend+1,j,know)+ &
447 & 2.0_r8*cx*zeta(iend,j,kout))
453 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
454 &
grid(ng)%rmask(iend+1,j)
466 tl_zeta(iend+1,j,kout)=
boundary(ng)%tl_zeta_east(j)
471 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
472 &
grid(ng)%rmask(iend+1,j)
484 tl_zeta(iend+1,j,kout)=tl_zeta(iend,j,kout)
489 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
490 &
grid(ng)%rmask(iend+1,j)
502 tl_zeta(iend+1,j,kout)=tl_zeta(iend,j,kout)
507 tl_zeta(iend+1,j,kout)=tl_zeta(iend+1,j,kout)* &
508 &
grid(ng)%rmask(iend+1,j)
519 IF (
domain(ng)%Southern_Edge(tile))
THEN
524 IF (
iic(ng).ne.0)
THEN
529 tl_grad(i,jstr)=0.0_r8
533# if defined CELERITY_READ && defined FORWARD_READ
535 IF (
boundary(ng)%zeta_south_Ce(i).eq.0.0_r8)
THEN
556 tl_zeta(i,jstr-1,kout)=(cff*tl_zeta(i,jstr-1,know)+ &
557 & ce *tl_zeta(i,jstr ,kout)- &
559 & tl_grad(i ,jstr-1)- &
561 & tl_grad(i+1,jstr-1))/ &
569 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)- &
570 & tau*tl_zeta(i,jstr-1,know)
576 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
577 &
grid(ng)%rmask(i,jstr-1)
588 cff=dt2d*
grid(ng)%pn(i,jstr)
589 cff1=sqrt(
g*(
grid(ng)%h(i,jstr)+ &
590 & zeta(i,jstr,know)))
591 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jstr)+ &
592 & tl_zeta(i,jstr,know))/cff1+ &
601 tl_zeta(i,jstr-1,kout)=(1.0_r8-ce)*tl_zeta(i,jstr-1,know)+&
602 & tl_ce*(zeta(i,jstr-1,know)+ &
603 & zeta(i,jstr ,know))+ &
604 & ce*tl_zeta(i,jstr,know)
612 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
613 &
grid(ng)%rmask(i,jstr-1)
623 cff=dt2d*
grid(ng)%pn(i,jstr)
624 cff1=sqrt(
g*(
grid(ng)%h(i,jstr)+ &
625 & zeta(i,jstr,know)))
626 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jstr)+ &
627 & tl_zeta(i,jstr,know))/cff1+ &
633 cff2=1.0_r8/(1.0_r8+ce)
634 tl_cff2=-cff2*cff2*tl_ce+ &
636 & cff2*cff2*(1.0_r8+2.0_r8*ce)
641 tl_zeta(i,jstr-1,kout)=tl_cff2*(zeta(i,jstr-1,know)+ &
642 & ce*zeta(i,jstr,kout))+ &
643 & cff2*(tl_zeta(i,jstr-1,know)+ &
644 & tl_ce*zeta(i,jstr,kout)+ &
645 & ce*tl_zeta(i,jstr,kout))- &
647 & cff2*(zeta(i,jstr-1,know)+ &
648 & 2.0_r8*ce*zeta(i,jstr,kout))
654 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
655 &
grid(ng)%rmask(i,jstr-1)
667 tl_zeta(i,jstr-1,kout)=
boundary(ng)%tl_zeta_south(i)
672 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
673 &
grid(ng)%rmask(i,jstr-1)
685 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr,kout)
690 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
691 &
grid(ng)%rmask(i,jstr-1)
703 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr,kout)
708 tl_zeta(i,jstr-1,kout)=tl_zeta(i,jstr-1,kout)* &
709 &
grid(ng)%rmask(i,jstr-1)
720 IF (
domain(ng)%Northern_Edge(tile))
THEN
725 IF (
iic(ng).ne.0)
THEN
730 tl_grad(i,jend+1)=0.0_r8
734# if defined CELERITY_READ && defined FORWARD_READ
736 IF (
boundary(ng)%zeta_north_Ce(i).eq.0.0_r8)
THEN
757 tl_zeta(i,jend+1,kout)=(cff*tl_zeta(i,jend+1,know)+ &
758 & ce *tl_zeta(i,jend ,kout)- &
760 & tl_grad(i ,jend+1)- &
762 & tl_grad(i+1,jend+1))/ &
770 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)- &
771 & tau*tl_zeta(i,jend+1,know)
777 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
778 &
grid(ng)%rmask(i,jend+1)
789 cff=dt2d*
grid(ng)%pn(i,jend)
790 cff1=sqrt(
g*(
grid(ng)%h(i,jend)+ &
791 & zeta(i,jend,know)))
792 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jend)+ &
793 & tl_zeta(i,jend,know))/cff1+ &
802 tl_zeta(i,jend+1,kout)=(1.0_r8-ce)*tl_zeta(i,jend+1,know)+&
803 & tl_ce*(zeta(i,jend+1,know)+ &
804 & zeta(i,jend ,know))+ &
805 & ce*tl_zeta(i,jend,know)
813 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
814 &
grid(ng)%rmask(i,jend+1)
824 cff=dt2d*
grid(ng)%pn(i,jend)
825 cff1=sqrt(
g*(
grid(ng)%h(i,jend)+ &
826 & zeta(i,jend,know)))
827 tl_cff1=0.5_r8*
g*(
grid(ng)%tl_h(i,jend)+ &
828 & tl_zeta(i,jend,know))/cff1+ &
834 cff2=1.0_r8/(1.0_r8+ce)
835 tl_cff2=-cff2*cff2*tl_ce+ &
837 & cff2*cff2*(1.0_r8+2.0_r8*ce)
842 tl_zeta(i,jend+1,kout)=tl_cff2*(zeta(i,jend+1,know)+ &
843 & ce*zeta(i,jend,kout))+ &
844 & cff2*(tl_zeta(i,jend+1,know)+ &
845 & tl_ce*zeta(i,jend,kout)+ &
846 & ce*tl_zeta(i,jend,kout))- &
848 & cff2*(zeta(i,jend+1,know)+ &
849 & 2.0_r8*ce*zeta(i,jend,kout))
855 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
856 &
grid(ng)%rmask(i,jend+1)
868 tl_zeta(i,jend+1,kout)=
boundary(ng)%tl_zeta_north(i)
873 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
874 &
grid(ng)%rmask(i,jend+1)
886 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend,kout)
891 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
892 &
grid(ng)%rmask(i,jend+1)
904 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend,kout)
909 tl_zeta(i,jend+1,kout)=tl_zeta(i,jend+1,kout)* &
910 &
grid(ng)%rmask(i,jend+1)
922 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
928 tl_zeta(istr-1,jstr-1,kout)=0.5_r8* &
929 & (tl_zeta(istr ,jstr-1,kout)+ &
930 & tl_zeta(istr-1,jstr ,kout))
933 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
939 tl_zeta(iend+1,jstr-1,kout)=0.5_r8* &
940 & (tl_zeta(iend ,jstr-1,kout)+ &
941 & tl_zeta(iend+1,jstr ,kout))
944 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
950 tl_zeta(istr-1,jend+1,kout)=0.5_r8* &
951 & (tl_zeta(istr-1,jend ,kout)+ &
952 & tl_zeta(istr ,jend+1,kout))
955 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
961 tl_zeta(iend+1,jend+1,kout)=0.5_r8* &
962 & (tl_zeta(iend+1,jend ,kout)+ &
963 & tl_zeta(iend ,jend+1,kout))
976 IF (
domain(ng)%Western_Edge(tile))
THEN
979 IF (zeta(istr-1,j,kout).le. &
983 tl_zeta(istr-1,j,kout)=-
grid(ng)%tl_h(istr-1,j)
988 IF (
domain(ng)%Eastern_Edge(tile))
THEN
991 IF (zeta(iend+1,j,kout).le. &
995 tl_zeta(iend+1,j,kout)=-
grid(ng)%tl_h(iend+1,j)
1003 IF (
domain(ng)%Southern_Edge(tile))
THEN
1006 IF (zeta(i,jstr-1,kout).le. &
1007 & (
dcrit(ng)-
grid(ng)%h(i,jstr-1)))
THEN
1010 tl_zeta(i,jstr-1,kout)=-
grid(ng)%tl_h(i,jstr-1)
1015 IF (
domain(ng)%Northern_Edge(tile))
THEN
1018 IF (zeta(i,jend+1,kout).le. &
1019 & (
dcrit(ng)-
grid(ng)%h(i,jend+1)))
THEN
1022 tl_zeta(i,jend+1,kout)=-
grid(ng)%tl_h(i,jend+1)
1030 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1033 IF (zeta(istr-1,jstr-1,kout).le. &
1034 & (
dcrit(ng)-
grid(ng)%h(istr-1,jstr-1)))
THEN
1037 tl_zeta(istr-1,jstr-1,kout)=-
grid(ng)%tl_h(istr-1,jstr-1)
1041 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1044 IF (zeta(iend+1,jstr-1,kout).le. &
1045 & (
dcrit(ng)-
grid(ng)%h(iend+1,jstr-1)))
THEN
1048 tl_zeta(iend+1,jstr-1,kout)=-
grid(ng)%tl_h(iend+1,jstr-1)
1052 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1055 IF (zeta(istr-1,jend+1,kout).le. &
1056 & (
dcrit(ng)-
grid(ng)%h(istr-1,jend+1)))
THEN
1059 tl_zeta(istr-1,jend+1,kout)=-
grid(ng)%tl_h(istr-1,jend+1)
1063 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1066 IF (zeta(iend+1,jend+1,kout).le. &
1067 & (
dcrit(ng)-
grid(ng)%h(iend+1,jend+1)))
THEN
1070 tl_zeta(iend+1,jend+1,kout)=-
grid(ng)%tl_h(iend+1,jend+1)