65 & LBi, UBi, LBj, UBj, &
66 & IminS, ImaxS, JminS, JmaxS, &
74 & tl_ubar, tl_vbar, tl_zeta)
88 integer,
intent(in) :: ng, tile
89 integer,
intent(in) :: lbi, ubi, lbj, ubj
90 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
91 integer,
intent(in) :: kinp
95 real(r8),
intent(in) :: umask(lbi:,lbj:)
96 real(r8),
intent(in) :: vmask(lbi:,lbj:)
98 real(r8),
intent(in) :: h(lbi:,lbj:)
99 real(r8),
intent(in) :: tl_h(lbi:,lbj:)
100 real(r8),
intent(in) :: om_v(lbi:,lbj:)
101 real(r8),
intent(in) :: on_u(lbi:,lbj:)
103 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
104 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
105 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
106 real(r8),
intent(in) :: tl_ubar(lbi:,lbj:,:)
107 real(r8),
intent(in) :: tl_vbar(lbi:,lbj:,:)
108 real(r8),
intent(in) :: tl_zeta(lbi:,lbj:,:)
111 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
112 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
114 real(r8),
intent(in) :: h(lbi:ubi,lbj:ubj)
115 real(r8),
intent(in) :: tl_h(lbi:ubi,lbj:ubj)
116 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
117 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
119 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
120 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
121 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,:)
122 real(r8),
intent(in) :: tl_ubar(lbi:ubi,lbj:ubj,:)
123 real(r8),
intent(in) :: tl_vbar(lbi:ubi,lbj:ubj,:)
124 real(r8),
intent(in) :: tl_zeta(lbi:ubi,lbj:ubj,:)
129 integer :: nsub, i, j
131 real(r8) :: cff, my_area, my_flux
132 real(r8) :: tl_cff, tl_my_area, tl_my_flux
135 real(r8),
dimension(2) :: rbuffer
136 character (len=3),
dimension(2) :: op_handle
139# include "set_bounds.h"
152 IF (
domain(ng)%Western_Edge(tile))
THEN
154 cff=0.5_r8*on_u(istr,j)* &
155 & (zeta(istr-1,j,kinp)+h(istr-1,j)+ &
156 & zeta(istr ,j,kinp)+h(istr ,j))
157 tl_cff=0.5_r8*on_u(istr,j)* &
158 & (tl_zeta(istr-1,j,kinp)+tl_h(istr-1,j)+ &
159 & tl_zeta(istr ,j,kinp)+tl_h(istr-1,j))
161 cff=cff*umask(istr,j)
162 tl_cff=tl_cff*umask(istr,j)
166 tl_my_area=tl_my_area+tl_cff
169 tl_my_flux=tl_my_flux+ &
170 & tl_cff*ubar(istr,j,kinp)+ &
171 & cff*tl_ubar(istr,j,kinp)- &
173 & cff*ubar(istr,j,kinp)
180 IF (
domain(ng)%Eastern_Edge(tile))
THEN
182 cff=0.5_r8*on_u(iend+1,j)* &
183 & (zeta(iend ,j,kinp)+h(iend ,j)+ &
184 & zeta(iend+1,j,kinp)+h(iend+1,j))
185 tl_cff=0.5_r8*on_u(iend+1,j)* &
186 & (tl_zeta(iend ,j,kinp)+tl_h(iend ,j)+ &
187 & tl_zeta(iend+1,j,kinp)+tl_h(iend+1,j))
189 cff=cff*umask(iend+1,j)
190 tl_cff=tl_cff*umask(iend+1,j)
194 tl_my_area=tl_my_area+tl_cff
197 tl_my_flux=tl_my_flux- &
198 & tl_cff*ubar(iend+1,j,kinp)- &
199 & cff*tl_ubar(iend+1,j,kinp)+ &
201 & cff*ubar(iend+1,j,kinp)
208 IF (
domain(ng)%Southern_Edge(tile))
THEN
210 cff=0.5_r8*om_v(i,jstr)* &
211 & (zeta(i,jstr-1,kinp)+h(i,jstr-1)+ &
212 & zeta(i,jstr ,kinp)+h(i,jstr ))
213 tl_cff=0.5_r8*om_v(i,jstr)* &
214 & (tl_zeta(i,jstr-1,kinp)+tl_h(i,jstr-1)+ &
215 & tl_zeta(i,jstr ,kinp)+tl_h(i,jstr ))
217 cff=cff*vmask(i,jstr)
218 tl_cff=tl_cff*vmask(i,jstr)
222 tl_my_area=tl_my_area+tl_cff
225 tl_my_flux=tl_my_flux+ &
226 & tl_cff*vbar(i,jstrv-1,kinp)+ &
227 & cff*tl_vbar(i,jstrv-1,kinp)- &
229 & cff*vbar(i,jstrv-1,kinp)
236 IF (
domain(ng)%Northern_Edge(tile))
THEN
238 cff=0.5_r8*om_v(i,jend+1)* &
239 & (zeta(i,jend ,kinp)+h(i,jend )+ &
240 & zeta(i,jend+1,kinp)+h(i,jend+1))
241 tl_cff=0.5_r8*om_v(i,jend+1)* &
242 & (tl_zeta(i,jend ,kinp)+tl_h(i,jend )+ &
243 & tl_zeta(i,jend+1,kinp)+tl_h(i,jend+1))
245 cff=cff*vmask(i,jend+1)
246 tl_cff=tl_cff*vmask(i,jend+1)
250 tl_my_area=tl_my_area+tl_cff
253 tl_my_flux=tl_my_flux- &
254 & tl_cff*vbar(i,jend+1,kinp)- &
255 & cff*tl_vbar(i,jend+1,kinp)+ &
257 & cff*vbar(i,jend+1,kinp)
271 IF (
domain(ng)%SouthWest_Corner(tile).and. &
272 &
domain(ng)%NorthEast_Corner(tile))
THEN
325 & LBi, UBi, LBj, UBj, &
326 & IminS, ImaxS, JminS, JmaxS, &
333 & tl_ubar, tl_vbar, &
334 & Drhs, Duon, Dvom, &
335 & tl_Drhs, tl_Duon, tl_Dvom)
347 integer,
intent(in) :: ng, tile
348 integer,
intent(in) :: lbi, ubi, lbj, ubj
349 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
350 integer,
intent(in) :: kinp
354 real(r8),
intent(in) :: umask(lbi:,lbj:)
355 real(r8),
intent(in) :: vmask(lbi:,lbj:)
357 real(r8),
intent(in) :: om_v(lbi:,lbj:)
358 real(r8),
intent(in) :: on_u(lbi:,lbj:)
359 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
360 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
361 real(r8),
intent(in) :: drhs(imins:,jmins:)
362 real(r8),
intent(in) :: tl_ubar(lbi:,lbj:,:)
363 real(r8),
intent(in) :: tl_vbar(lbi:,lbj:,:)
364 real(r8),
intent(in) :: tl_drhs(imins:,jmins:)
366 real(r8),
intent(inout) :: duon(imins:,jmins:)
367 real(r8),
intent(inout) :: dvom(imins:,jmins:)
368 real(r8),
intent(inout) :: tl_duon(imins:,jmins:)
369 real(r8),
intent(inout) :: tl_dvom(imins:,jmins:)
372 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
373 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
375 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
376 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
378 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
379 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
380 real(r8),
intent(in) :: drhs(imins:imaxs,jmins:jmaxs)
381 real(r8),
intent(in) :: tl_ubar(lbi:ubi,lbj:ubj,:)
382 real(r8),
intent(in) :: tl_vbar(lbi:ubi,lbj:ubj,:)
383 real(r8),
intent(in) :: tl_drhs(imins:,jmins:)
385 real(r8),
intent(inout) :: duon(imins:imaxs,jmins:jmaxs)
386 real(r8),
intent(inout) :: dvom(imins:imaxs,jmins:jmaxs)
387 real(r8),
intent(inout) :: tl_duon(imins:imaxs,jmins:jmaxs)
388 real(r8),
intent(inout) :: tl_dvom(imins:imaxs,jmins:jmaxs)
395# include "set_bounds.h"
405# define I_RANGE IstrU,MIN(Iend+1,Lm(ng))
406# define J_RANGE JstrV,MIN(Jend+1,Mm(ng))
408# define I_RANGE MAX(2,IstrU-1),MIN(Iend+1,Lm(ng))
409# define J_RANGE MAX(2,JstrV-1),MIN(Jend+1,Mm(ng))
413 IF (
domain(ng)%Western_Edge(tile))
THEN
415 duon(istr,j)=0.5_r8*(drhs(istr,j)+drhs(istr-1,j))* &
416 & (ubar(istr,j,kinp)-
ubar_xs)* &
418 tl_duon(istr,j)=0.5_r8* &
419 & ((tl_drhs(istr,j)+tl_drhs(istr-1,j))* &
420 & (ubar(istr,j,kinp)-
ubar_xs)+ &
421 & (drhs(istr,j)+drhs(istr-1,j))* &
430 tl_duon(istr,j)=tl_duon(istr,j)*umask(istr,j)
437 IF (
domain(ng)%Eastern_Edge(tile))
THEN
439 duon(iend+1,j)=0.5_r8*(drhs(iend+1,j)+drhs(iend,j))* &
440 & (ubar(iend+1,j,kinp)+
ubar_xs)* &
442 tl_duon(iend+1,j)=0.5_r8* &
443 & ((tl_drhs(iend+1,j)+tl_drhs(iend,j))* &
444 & (ubar(iend+1,j,kinp)+
ubar_xs)+ &
445 & (drhs(iend+1,j)+drhs(iend,j))* &
454 tl_duon(iend+1,j)=tl_duon(iend+1,j)*umask(iend+1,j)
461 IF (
domain(ng)%Southern_Edge(tile))
THEN
463 dvom(i,jstr)=0.5_r8*(drhs(i,jstr)+drhs(i,jstr-1))* &
464 & (vbar(i,jstr,kinp)-
ubar_xs)* &
466 tl_dvom(i,jstr)=0.5_r8* &
467 & ((tl_drhs(i,jstr)+tl_drhs(i,jstr-1))* &
468 & (vbar(i,jstr,kinp)-
ubar_xs)+ &
469 & (drhs(i,jstr)+drhs(i,jstr-1))* &
478 tl_dvom(i,jstr)=tl_dvom(i,jstr)*vmask(i,jstr)
485 IF (
domain(ng)%Northern_Edge(tile))
THEN
487 dvom(i,jend+1)=0.5_r8*(drhs(i,jend+1)+drhs(i,jend))* &
488 & (vbar(i,jend+1,kinp)+
ubar_xs)* &
490 tl_dvom(i,jend+1)=0.5_r8* &
491 & ((tl_drhs(i,jend+1)+tl_drhs(i,jend))* &
492 & (vbar(i,jend+1,kinp)+
ubar_xs)+ &
493 & (drhs(i,jend+1)+drhs(i,jend))* &
502 tl_dvom(i,jend+1)=tl_dvom(i,jend+1)*vmask(i,jend+1)
521 & imins, imaxs, jmins, jmaxs, &
535 & imins, imaxs, jmins, jmaxs, &
550 & LBi, UBi, LBj, UBj, &
551 & IminS, ImaxS, JminS, JmaxS, &
564 integer,
intent(in) :: ng, tile
565 integer,
intent(in) :: LBi, UBi, LBj, UBj
566 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
567 integer,
intent(in) :: kinp
571 real(r8),
intent(in) :: umask(LBi:,LBj:)
572 real(r8),
intent(in) :: vmask(LBi:,LBj:)
574 real(r8),
intent(inout) :: tl_ubar(LBi:,LBj:,:)
575 real(r8),
intent(inout) :: tl_vbar(LBi:,LBj:,:)
578 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
579 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
581 real(r8),
intent(inout) :: tl_ubar(LBi:UBi,LBj:UBj,:)
582 real(r8),
intent(inout) :: tl_vbar(LBi:UBi,LBj:UBj,:)
589# include "set_bounds.h"
597 IF (
domain(ng)%Western_Edge(tile))
THEN
601 tl_ubar(istr,j,kinp)=tl_ubar(istr,j,kinp)-
tl_ubar_xs
605 tl_ubar(istr,j,kinp)=tl_ubar(istr,j,kinp)* &
613 IF (
domain(ng)%Eastern_Edge(tile))
THEN
617 tl_ubar(iend+1,j,kinp)=tl_ubar(iend+1,j,kinp)+
tl_ubar_xs
621 tl_ubar(iend+1,j,kinp)=tl_ubar(iend+1,j,kinp)* &
629 IF (
domain(ng)%Southern_Edge(tile))
THEN
633 tl_vbar(i,jstr,kinp)=(tl_vbar(i,jstr,kinp)-
tl_ubar_xs)
637 tl_vbar(i,jstr,kinp)=tl_vbar(i,jstr,kinp)* &
645 IF (
domain(ng)%Northern_Edge(tile))
THEN
649 tl_vbar(i,jend+1,kinp)=(tl_vbar(i,jend+1,kinp)+
tl_ubar_xs)
653 tl_vbar(i,jend+1,kinp)=tl_vbar(i,jend+1,kinp)* &
subroutine, public rp_set_duv_bc_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kinp, umask, vmask, om_v, on_u, ubar, vbar, tl_ubar, tl_vbar, drhs, duon, dvom, tl_drhs, tl_duon, tl_dvom)
subroutine, public rp_obc_flux_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kinp, umask, vmask, h, tl_h, om_v, on_u, ubar, vbar, zeta, tl_ubar, tl_vbar, tl_zeta)