65 & LBi, UBi, LBj, UBj, &
66 & IminS, ImaxS, JminS, JmaxS, &
74 & ad_ubar, ad_vbar, ad_zeta)
83 integer,
intent(in) :: ng, tile
84 integer,
intent(in) :: lbi, ubi, lbj, ubj
85 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
86 integer,
intent(in) :: kinp
90 real(r8),
intent(in) :: umask(lbi:,lbj:)
91 real(r8),
intent(in) :: vmask(lbi:,lbj:)
93 real(r8),
intent(in) :: h(lbi:,lbj:)
94 real(r8),
intent(in) :: om_v(lbi:,lbj:)
95 real(r8),
intent(in) :: on_u(lbi:,lbj:)
97 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
98 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
99 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
101 real(r8),
intent(inout) :: ad_h(lbi:,lbj:)
102 real(r8),
intent(inout) :: ad_ubar(lbi:,lbj:,:)
103 real(r8),
intent(inout) :: ad_vbar(lbi:,lbj:,:)
104 real(r8),
intent(inout) :: ad_zeta(lbi:,lbj:,:)
107 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
108 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
110 real(r8),
intent(in) :: h(lbi:ubi,lbj:ubj)
111 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
112 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
114 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
115 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
116 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,:)
118 real(r8),
intent(inout) :: ad_h(lbi:ubi,lbj:ubj)
119 real(r8),
intent(inout) :: ad_ubar(lbi:ubi,lbj:ubj,:)
120 real(r8),
intent(inout) :: ad_vbar(lbi:ubi,lbj:ubj,:)
121 real(r8),
intent(inout) :: ad_zeta(lbi:ubi,lbj:ubj,:)
128 real(r8) :: cff, my_area, my_flux
129 real(r8) :: adfac, ad_cff, ad_my_area, ad_my_flux
132 real(r8),
dimension(2) :: rbuffer
133 character (len=3),
dimension(2) :: op_handle
136# include "set_bounds.h"
168 IF (
domain(ng)%Northern_Edge(tile))
THEN
170 cff=0.5_r8*om_v(i,jend+1)* &
171 & (zeta(i,jend ,kinp)+h(i,jend )+ &
172 & zeta(i,jend+1,kinp)+h(i,jend+1))
174 cff=cff*vmask(i,jend+1)
180 ad_vbar(i,jend+1,kinp)=ad_vbar(i,jend+1,kinp)- &
182 ad_cff=ad_cff-ad_my_flux*vbar(i,jend+1,kinp)
185 ad_cff=ad_cff+ad_my_area
189 ad_cff=ad_cff*vmask(i,jend+1)
195 adfac=0.5_r8*om_v(i,jend+1)*ad_cff
196 ad_zeta(i,jend ,kinp)=ad_zeta(i,jend ,kinp)+adfac
197 ad_zeta(i,jend+1,kinp)=ad_zeta(i,jend+1,kinp)+adfac
198 ad_h(i,jend )=ad_h(i,jend )+adfac
199 ad_h(i,jend+1)=ad_h(i,jend+1)+adfac
206 IF (
domain(ng)%Southern_Edge(tile))
THEN
208 cff=0.5_r8*om_v(i,jstr)* &
209 & (zeta(i,jstr-1,kinp)+h(i,jstr-1)+ &
210 & zeta(i,jstr ,kinp)+h(i,jstr ))
212 cff=cff*vmask(i,jstr)
218 ad_vbar(i,jstrv-1,kinp)=ad_vbar(i,jstrv-1,kinp)+ &
220 ad_cff=ad_cff+ad_my_flux*vbar(i,jstrv-1,kinp)
223 ad_cff=ad_cff+ad_my_area
227 ad_cff=ad_cff*vmask(i,jstr)
233 adfac=0.5_r8*om_v(i,jstr)*ad_cff
234 ad_zeta(i,jstr-1,kinp)=ad_zeta(i,jstr-1,kinp)+adfac
235 ad_zeta(i,jstr ,kinp)=ad_zeta(i,jstr ,kinp)+adfac
236 ad_h(i,jstr-1)=ad_h(i,jstr-1)+adfac
237 ad_h(i,jstr )=ad_h(i,jstr )+adfac
244 IF (
domain(ng)%Eastern_Edge(tile))
THEN
246 cff=0.5_r8*on_u(iend+1,j)* &
247 & (zeta(iend ,j,kinp)+h(iend ,j)+ &
248 & zeta(iend+1,j,kinp)+h(iend+1,j))
250 cff=cff*umask(iend+1,j)
256 ad_ubar(iend+1,j,kinp)=ad_ubar(iend+1,j,kinp)- &
258 ad_cff=ad_cff-ad_my_flux*ubar(iend+1,j,kinp)
261 ad_cff=ad_cff+ad_my_area
265 ad_cff=ad_cff*umask(iend+1,j)
271 adfac=0.5_r8*on_u(iend+1,j)*ad_cff
272 ad_zeta(iend ,j,kinp)=ad_zeta(iend ,j,kinp)+adfac
273 ad_zeta(iend+1,j,kinp)=ad_zeta(iend+1,j,kinp)+adfac
274 ad_h(iend ,j)=ad_h(iend ,j)+adfac
275 ad_h(iend+1,j)=ad_h(iend+1,j)+adfac
282 IF (
domain(ng)%Western_Edge(tile))
THEN
284 cff=0.5_r8*on_u(istr,j)* &
285 & (zeta(istr-1,j,kinp)+h(istr-1,j)+ &
286 & zeta(istr ,j,kinp)+h(istr ,j))
288 cff=cff*umask(istr,j)
294 ad_ubar(istr,j,kinp)=ad_ubar(istr,j,kinp)+ &
296 ad_cff=ad_cff+ad_my_flux*ubar(istr,j,kinp)
299 ad_cff=ad_cff+ad_my_area
303 ad_cff=ad_cff*umask(istr,j)
309 adfac=0.5_r8*on_u(istr,j)*ad_cff
310 ad_zeta(istr-1,j,kinp)=ad_zeta(istr-1,j,kinp)+adfac
311 ad_zeta(istr ,j,kinp)=ad_zeta(istr ,j,kinp)+adfac
312 ad_h(istr-1,j)=ad_h(istr-1,j)+adfac
313 ad_h(istr-1,j)=ad_h(istr-1,j)+adfac
330 & LBi, UBi, LBj, UBj, &
331 & IminS, ImaxS, JminS, JmaxS, &
338 & ad_ubar, ad_vbar, &
339 & Drhs, Duon, Dvom, &
340 & ad_Drhs, ad_Duon, ad_Dvom)
355 integer,
intent(in) :: ng, tile
356 integer,
intent(in) :: lbi, ubi, lbj, ubj
357 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
358 integer,
intent(in) :: kinp
362 real(r8),
intent(in) :: umask(lbi:,lbj:)
363 real(r8),
intent(in) :: vmask(lbi:,lbj:)
365 real(r8),
intent(in) :: om_v(lbi:,lbj:)
366 real(r8),
intent(in) :: on_u(lbi:,lbj:)
368 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
369 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
370 real(r8),
intent(in) :: drhs(imins:,jmins:)
371 real(r8),
intent(in) :: duon(imins:,jmins:)
372 real(r8),
intent(in) :: dvom(imins:,jmins:)
374 real(r8),
intent(inout) :: ad_ubar(lbi:,lbj:,:)
375 real(r8),
intent(inout) :: ad_vbar(lbi:,lbj:,:)
376 real(r8),
intent(inout) :: ad_drhs(imins:,jmins:)
377 real(r8),
intent(inout) :: ad_duon(imins:,jmins:)
378 real(r8),
intent(inout) :: ad_dvom(imins:,jmins:)
381 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
382 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
384 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
385 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
387 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
388 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
389 real(r8),
intent(in) :: drhs(imins:imaxs,jmins:jmaxs)
390 real(r8),
intent(in) :: duon(imins:imaxs,jmins:jmaxs)
391 real(r8),
intent(in) :: dvom(imins:imaxs,jmins:jmaxs)
393 real(r8),
intent(inout) :: ad_ubar(lbi:ubi,lbj:ubj,:)
394 real(r8),
intent(inout) :: ad_vbar(lbi:ubi,lbj:ubj,:)
395 real(r8),
intent(inout) :: ad_drhs(imins:imaxs,jmins:jmaxs)
396 real(r8),
intent(inout) :: ad_duon(imins:imaxs,jmins:jmaxs)
397 real(r8),
intent(inout) :: ad_dvom(imins:imaxs,jmins:jmaxs)
402 integer :: nsub, i, j
404 real(r8) :: adfac, adfac1, adfac2, adfac3
405 real(r8) :: ad_my_ubar_xs
408 character (len=3) :: op_handle
411# include "set_bounds.h"
414# define I_RANGE IstrU,MIN(Iend+1,Lm(ng))
415# define J_RANGE JstrV,MIN(Jend+1,Mm(ng))
417# define I_RANGE MAX(2,IstrU-1),MIN(Iend+1,Lm(ng))
418# define J_RANGE MAX(2,JstrV-1),MIN(Jend+1,Mm(ng))
443 & imins, imaxs, jmins, jmaxs, &
457 & imins, imaxs, jmins, jmaxs, &
465 IF (
domain(ng)%Northern_Edge(tile))
THEN
470 ad_dvom(i,jend+1)=ad_dvom(i,jend+1)*vmask(i,jend+1)
479 adfac=0.5_r8*om_v(i,jend+1)*ad_dvom(i,jend+1)
480 adfac1=adfac*(vbar(i,jend+1,kinp)+
ubar_xs)
481 adfac2=adfac*(drhs(i,jend+1)+drhs(i,jend))
482 ad_drhs(i,jend+1)=ad_drhs(i,jend+1)+adfac1
483 ad_drhs(i,jend )=ad_drhs(i,jend )+adfac1
484 ad_vbar(i,jend+1,kinp)=ad_vbar(i,jend+1,kinp)+adfac2
485 ad_my_ubar_xs=ad_my_ubar_xs+adfac2
486 ad_dvom(i,jend+1)=0.0_r8
492 IF (
domain(ng)%Southern_Edge(tile))
THEN
497 ad_dvom(i,jstr)=ad_dvom(i,jstr)*vmask(i,jstr)
506 adfac=0.5_r8*om_v(i,jstr)*ad_dvom(i,jstr)
507 adfac1=adfac*(vbar(i,jstr,kinp)-
ubar_xs)
508 adfac2=adfac*(drhs(i,jstr)+drhs(i,jstr-1))
509 ad_drhs(i,jstr-1)=ad_drhs(i,jstr-1)+adfac1
510 ad_drhs(i,jstr )=ad_drhs(i,jstr )+adfac1
511 ad_vbar(i,jstr,kinp)=ad_vbar(i,jstr,kinp)+adfac2
512 ad_my_ubar_xs=ad_my_ubar_xs-adfac2
513 ad_dvom(i,jstr)=0.0_r8
519 IF (
domain(ng)%Eastern_Edge(tile))
THEN
524 ad_duon(iend+1,j)=ad_duon(iend+1,j)*umask(iend+1,j)
533 adfac=0.5_r8*on_u(iend+1,j)*ad_duon(iend+1,j)
534 adfac1=adfac*(ubar(iend+1,j,kinp)+
ubar_xs)
535 adfac2=adfac*(drhs(iend+1,j)+drhs(iend,j))
536 ad_drhs(iend ,j)=ad_drhs(iend ,j)+adfac1
537 ad_drhs(iend+1,j)=ad_drhs(iend+1,j)+adfac1
538 ad_ubar(iend+1,j,kinp)=ad_ubar(iend+1,j,kinp)+adfac2
539 ad_my_ubar_xs=ad_my_ubar_xs+adfac2
540 ad_duon(iend+1,j)=0.0_r8
546 IF (
domain(ng)%Western_Edge(tile))
THEN
551 ad_duon(istr,j)=ad_duon(istr,j)*umask(istr,j)
560 adfac=0.5_r8*on_u(istr,j)*ad_duon(istr,j)
561 adfac1=adfac*(ubar(istr,j,kinp)-
ubar_xs)
562 adfac2=adfac*(drhs(istr,j)+drhs(istr-1,j))
563 ad_drhs(istr-1,j)=ad_drhs(istr-1,j)+adfac1
564 ad_drhs(istr ,j)=ad_drhs(istr ,j)+adfac1
565 ad_ubar(istr,j,kinp)=ad_ubar(istr,j,kinp)+adfac2
566 ad_my_ubar_xs=ad_my_ubar_xs-adfac2
567 ad_duon(istr,j)=0.0_r8
583 IF (
domain(ng)%SouthWest_Corner(tile).and. &
584 &
domain(ng)%NorthEast_Corner(tile))
THEN
594 adfac3=adfac3+ad_my_ubar_xs
618 & LBi, UBi, LBj, UBj, &
619 & IminS, ImaxS, JminS, JmaxS, &
632 integer,
intent(in) :: ng, tile
633 integer,
intent(in) :: LBi, UBi, LBj, UBj
634 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
635 integer,
intent(in) :: kinp
639 real(r8),
intent(in) :: umask(LBi:,LBj:)
640 real(r8),
intent(in) :: vmask(LBi:,LBj:)
642 real(r8),
intent(inout) :: ad_ubar(LBi:,LBj:,:)
643 real(r8),
intent(inout) :: ad_vbar(LBi:,LBj:,:)
646 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
647 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
649 real(r8),
intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
650 real(r8),
intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
657# include "set_bounds.h"
665 IF (
domain(ng)%Northern_Edge(tile))
THEN
671 ad_vbar(i,jend+1,kinp)=ad_vbar(i,jend+1,kinp)* &
682 IF (
domain(ng)%Southern_Edge(tile))
THEN
688 ad_vbar(i,jstr,kinp)=ad_vbar(i,jstr,kinp)* &
699 IF (
domain(ng)%Eastern_Edge(tile))
THEN
705 ad_ubar(iend+1,j,kinp)=ad_ubar(iend+1,j,kinp)* &
716 IF (
domain(ng)%Western_Edge(tile))
THEN
722 ad_ubar(istr,j,kinp)=ad_ubar(istr,j,kinp)* &