35 integer,
intent(in) :: ng, tile, kinp
42 & lbi, ubi, lbj, ubj, &
43 & imins, imaxs, jmins, jmaxs, &
61 & LBi, UBi, LBj, UBj, &
62 & IminS, ImaxS, JminS, JmaxS, &
82 integer,
intent(in) :: ng, tile
83 integer,
intent(in) :: lbi, ubi, lbj, ubj
84 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
85 integer,
intent(in) :: kinp
89 real(r8),
intent(in) :: umask(lbi:,lbj:)
90 real(r8),
intent(in) :: vmask(lbi:,lbj:)
92 real(r8),
intent(in) :: h(lbi:,lbj:)
93 real(r8),
intent(in) :: om_v(lbi:,lbj:)
94 real(r8),
intent(in) :: on_u(lbi:,lbj:)
95 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
96 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
97 real(r8),
intent(in) :: zeta(lbi:,lbj:,:)
100 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
101 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
103 real(r8),
intent(in) :: h(lbi:ubi,lbj:ubj)
104 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
105 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
106 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
107 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
108 real(r8),
intent(in) :: zeta(lbi:ubi,lbj:ubj,:)
113 integer :: nsub, i, j
115 real(r8) :: cff, my_area, my_flux
118 real(r8),
dimension(2) :: rbuffer
119 character (len=3),
dimension(2) :: op_handle
122#include "set_bounds.h"
132 IF (
domain(ng)%Western_Edge(tile))
THEN
134 cff=0.5_r8*(zeta(istr-1,j,kinp)+h(istr-1,j)+ &
135 & zeta(istr ,j,kinp)+h(istr ,j))*on_u(istr,j)
137 cff=cff*umask(istr,j)
140 my_flux=my_flux+cff*ubar(istr,j,kinp)
146 IF (
domain(ng)%Eastern_Edge(tile))
THEN
148 cff=0.5_r8*(zeta(iend ,j,kinp)+h(iend ,j)+ &
149 & zeta(iend+1,j,kinp)+h(iend+1,j))*on_u(iend+1,j)
151 cff=cff*umask(iend+1,j)
154 my_flux=my_flux-cff*ubar(iend+1,j,kinp)
160 IF (
domain(ng)%Southern_Edge(tile))
THEN
162 cff=0.5_r8*(zeta(i,jstr-1,kinp)+h(i,jstr-1)+ &
163 & zeta(i,jstr ,kinp)+h(i,jstr ))*om_v(i,jstr)
165 cff=cff*vmask(i,jstr)
168 my_flux=my_flux+cff*vbar(i,jstrv-1,kinp)
174 IF (
domain(ng)%Northern_Edge(tile))
THEN
176 cff=0.5_r8*(zeta(i,jend ,kinp)+h(i,jend )+ &
177 & zeta(i,jend+1,kinp)+h(i,jend+1))*om_v(i,jend+1)
179 cff=cff*vmask(i,jend+1)
182 my_flux=my_flux-cff*vbar(i,jend+1,kinp)
195 IF (
domain(ng)%SouthWest_Corner(tile).and. &
196 &
domain(ng)%NorthEast_Corner(tile))
THEN
220 bc_flux, rbuffer(2), rbuffer(2)/rbuffer(1)
221 10
FORMAT (i3,1x,i3.3,1x,i3.3,5(1x,1pe23.15))
237 & LBi, UBi, LBj, UBj, &
238 & IminS, ImaxS, JminS, JmaxS, &
243 & om_v, on_u, ubar, vbar, &
256 integer,
intent(in) :: ng, tile
257 integer,
intent(in) :: lbi, ubi, lbj, ubj
258 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
259 integer,
intent(in) :: kinp
263 real(r8),
intent(in) :: umask(lbi:,lbj:)
264 real(r8),
intent(in) :: vmask(lbi:,lbj:)
266 real(r8),
intent(in) :: om_v(lbi:,lbj:)
267 real(r8),
intent(in) :: on_u(lbi:,lbj:)
268 real(r8),
intent(in) :: ubar(lbi:,lbj:,:)
269 real(r8),
intent(in) :: vbar(lbi:,lbj:,:)
270 real(r8),
intent(in) :: drhs(imins:,jmins:)
272 real(r8),
intent(inout) :: duon(imins:,jmins:)
273 real(r8),
intent(inout) :: dvom(imins:,jmins:)
276 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
277 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
279 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
280 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
281 real(r8),
intent(in) :: ubar(lbi:ubi,lbj:ubj,:)
282 real(r8),
intent(in) :: vbar(lbi:ubi,lbj:ubj,:)
283 real(r8),
intent(in) :: drhs(imins:imaxs,jmins:jmaxs)
285 real(r8),
intent(inout) :: duon(imins:imaxs,jmins:jmaxs)
286 real(r8),
intent(inout) :: dvom(imins:imaxs,jmins:jmaxs)
293#include "set_bounds.h"
303# define I_RANGE IstrU,MIN(Iend+1,Lm(ng))
304# define J_RANGE JstrV,MIN(Jend+1,Mm(ng))
306# define I_RANGE MAX(2,IstrU-1),MIN(Iend+1,Lm(ng))
307# define J_RANGE MAX(2,JstrV-1),MIN(Jend+1,Mm(ng))
311 IF (
domain(ng)%Western_Edge(tile))
THEN
313 duon(istr,j)=0.5_r8*(drhs(istr,j)+drhs(istr-1,j))* &
314 & (ubar(istr,j,kinp)-
ubar_xs)* &
317 duon(istr,j)=duon(istr,j)*umask(istr,j)
324 IF (
domain(ng)%Eastern_Edge(tile))
THEN
326 duon(iend+1,j)=0.5_r8*(drhs(iend+1,j)+drhs(iend,j))* &
327 & (ubar(iend+1,j,kinp)+
ubar_xs)* &
330 duon(iend+1,j)=duon(iend+1,j)*umask(iend+1,j)
337 IF (
domain(ng)%Southern_Edge(tile))
THEN
339 dvom(i,jstr)=0.5_r8*(drhs(i,jstr)+drhs(i,jstr-1))* &
340 & (vbar(i,jstr,kinp)-
ubar_xs)* &
343 dvom(i,jstr)=dvom(i,jstr)*vmask(i,jstr)
350 IF (
domain(ng)%Northern_Edge(tile))
THEN
352 dvom(i,jend+1)=0.5_r8*(drhs(i,jend+1)+drhs(i,jend))* &
353 & (vbar(i,jend+1,kinp)+
ubar_xs)* &
356 dvom(i,jend+1)=dvom(i,jend+1)*vmask(i,jend+1)
369 & imins, imaxs, jmins, jmaxs, &
377 & imins, imaxs, jmins, jmaxs, &
392 & LBi, UBi, LBj, UBj, &
393 & IminS, ImaxS, JminS, JmaxS, &
406 integer,
intent(in) :: ng, tile
407 integer,
intent(in) :: LBi, UBi, LBj, UBj
408 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
409 integer,
intent(in) :: kinp
413 real(r8),
intent(in) :: umask(LBi:,LBj:)
414 real(r8),
intent(in) :: vmask(LBi:,LBj:)
417 real(r8),
intent(inout) :: ubar(LBi:,LBj:,:)
418 real(r8),
intent(inout) :: vbar(LBi:,LBj:,:)
421 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
422 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
425 real(r8),
intent(inout) :: ubar(LBi:UBi,LBj:UBj,:)
426 real(r8),
intent(inout) :: vbar(LBi:UBi,LBj:UBj,:)
433#include "set_bounds.h"
441 IF (
domain(ng)%Western_Edge(tile))
THEN
443 ubar(istr,j,kinp)=(ubar(istr,j,kinp)-
ubar_xs)
445 ubar(istr,j,kinp)=ubar(istr,j,kinp)*umask(istr,j)
452 IF (
domain(ng)%Eastern_Edge(tile))
THEN
454 ubar(iend+1,j,kinp)=(ubar(iend+1,j,kinp)+
ubar_xs)
456 ubar(iend+1,j,kinp)=ubar(iend+1,j,kinp)*umask(iend+1,j)
463 IF (
domain(ng)%Southern_Edge(tile))
THEN
465 vbar(i,jstr,kinp)=(vbar(i,jstr,kinp)-
ubar_xs)
467 vbar(i,jstr,kinp)=vbar(i,jstr,kinp)*vmask(i,jstr)
474 IF (
domain(ng)%Northern_Edge(tile))
THEN
476 vbar(i,jend+1,kinp)=(vbar(i,jend+1,kinp)+
ubar_xs)
478 vbar(i,jend+1,kinp)=vbar(i,jend+1,kinp)*vmask(i,jend+1)
type(t_grid), dimension(:), allocatable grid
type(t_ocean), dimension(:), allocatable ocean
integer, dimension(:), allocatable ntilex
type(t_domain), dimension(:), allocatable domain
integer, dimension(:), allocatable ntilee
integer, dimension(:), allocatable iic
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
logical, dimension(:,:), allocatable volcons
integer, parameter isouth
integer, parameter inorth
integer, dimension(:), allocatable iif
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine obc_flux(ng, tile, kinp)
subroutine, public set_duv_bc_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kinp, umask, vmask, om_v, on_u, ubar, vbar, drhs, duon, dvom)
subroutine conserve_mass_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kinp, umask, vmask, ubar, vbar)
subroutine, public obc_flux_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kinp, umask, vmask, h, om_v, on_u, ubar, vbar, zeta)