53 & LBi, UBi, LBj, UBj, UBk, &
54 & IminS, ImaxS, JminS, JmaxS, &
68 integer,
intent(in) :: ng, tile
69 integer,
intent(in) :: lbi, ubi, lbj, ubj, ubk
70 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
71 integer,
intent(in) :: nstp, nout
74 real(r8),
intent(inout) :: ad_v(lbi:,lbj:,:,:)
76 real(r8),
intent(inout) :: ad_v(lbi:ubi,lbj:ubj,ubk,2)
84 real(r8) :: ce, cx, cff
85 real(r8) :: obc_in, obc_out, tau
88 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_grad
90# include "set_bounds.h"
96 ad_grad(lbi:ubi,lbj:ubj)=0.0_r8
103 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
111 adfac=0.5_r8*ad_v(iend+1,jend+1,k,nout)
112 ad_v(iend+1,jend ,k,nout)=ad_v(iend+1,jend ,k,nout)+ &
114 ad_v(iend ,jend+1,k,nout)=ad_v(iend ,jend+1,k,nout)+ &
116 ad_v(iend+1,jend+1,k,nout)=0.0_r8
120 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
128 adfac=0.5_r8*ad_v(istr-1,jend+1,k,nout)
129 ad_v(istr-1,jend ,k,nout)=ad_v(istr-1,jend ,k,nout)+ &
131 ad_v(istr ,jend+1,k,nout)=ad_v(istr ,jend+1,k,nout)+ &
133 ad_v(istr-1,jend+1,k,nout)=0.0_r8
137 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
145 adfac=0.5_r8*ad_v(iend+1,jstr,k,nout)
146 ad_v(iend ,jstr ,k,nout)=ad_v(iend ,jstr ,k,nout)+ &
148 ad_v(iend+1,jstr+1,k,nout)=ad_v(iend+1,jstr+1,k,nout)+ &
150 ad_v(iend+1,jstr ,k,nout)=0.0_r8
154 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
162 adfac=0.5_r8*ad_v(istr-1,jstr,k,nout)
163 ad_v(istr ,jstr ,k,nout)=ad_v(istr ,jstr ,k,nout)+ &
165 ad_v(istr-1,jstr+1,k,nout)=ad_v(istr-1,jstr+1,k,nout)+ &
167 ad_v(istr-1,jstr ,k,nout)=0.0_r8
177 IF (
domain(ng)%Eastern_Edge(tile))
THEN
182 IF (
iic(ng).ne.0)
THEN
186# if defined CELERITY_READ && defined FORWARD_READ
190 & (
clima(ng)%M3nudgcof(iend+1,j-1,k)+ &
191 &
clima(ng)%M3nudgcof(iend+1,j ,k))
192 obc_in =
obcfac(ng)*obc_out
197 IF (
boundary(ng)%v_east_Cx(j,k).lt.0.0_r8)
THEN
216 ad_v(iend+1,j,k,nout)=ad_v(iend+1,j,k,nout)* &
217 &
grid(ng)%vmask(iend+1,j)
223 ad_v(iend+1,j,k,nstp)=ad_v(iend+1,j,k,nstp)- &
224 & tau*ad_v(iend+1,j,k,nout)
234 adfac=ad_v(iend+1,j,k,nout)/(cff+cx)
235 ad_grad(iend+1,j-1)=ad_grad(iend+1,j-1)- &
236 & max(ce,0.0_r8)*adfac
237 ad_grad(iend+1,j )=ad_grad(iend+1,j )- &
238 & min(ce,0.0_r8)*adfac
239 ad_v(iend ,j,k,nout)=ad_v(iend ,j,k,nout)+cx *adfac
240 ad_v(iend+1,j,k,nstp)=ad_v(iend+1,j,k,nstp)+cff*adfac
241 ad_v(iend+1,j,k,nout)=0.0_r8
257 ad_v(iend+1,j,k,nout)=ad_v(iend+1,j,k,nout)* &
258 &
grid(ng)%vmask(iend+1,j)
260# ifdef ADJUST_BOUNDARY
266 & ad_v(iend+1,j,k,nout)
267 ad_v(iend+1,j,k,nout)=0.0_r8
271 ad_v(iend+1,j,k,nout)=0.0_r8
276 ad_v(iend+1,j,k,nout)=0.0_r8
292 ad_v(iend+1,j,k,nout)=ad_v(iend+1,j,k,nout)* &
293 &
grid(ng)%vmask(iend+1,j)
297 ad_v(iend ,j,k,nout)=ad_v(iend ,j,k,nout)+ &
298 & ad_v(iend+1,j,k,nout)
299 ad_v(iend+1,j,k,nout)=0.0_r8
322 ad_v(iend+1,j,k,nout)=ad_v(iend+1,j,k,nout)* &
323 &
grid(ng)%vmask(iend+1,j)
327 ad_v(iend ,j,k,nout)=ad_v(iend ,j,k,nout)+ &
328 &
gamma2(ng)*ad_v(iend+1,j,k,nout)
329 ad_v(iend+1,j,k,nout)=0.0_r8
340 IF (
domain(ng)%Western_Edge(tile))
THEN
345 IF (
iic(ng).ne.0)
THEN
349# if defined CELERITY_READ && defined FORWARD_READ
353 & (
clima(ng)%M3nudgcof(istr-1,j-1,k)+ &
354 &
clima(ng)%M3nudgcof(istr-1,j ,k))
355 obc_in =
obcfac(ng)*obc_out
360 IF (
boundary(ng)%v_west_Cx(j,k).lt.0.0_r8)
THEN
379 ad_v(istr-1,j,k,nout)=ad_v(istr-1,j,k,nout)* &
380 &
grid(ng)%vmask(istr-1,j)
386 ad_v(istr-1,j,k,nstp)=ad_v(istr-1,j,k,nstp)- &
387 & tau*ad_v(istr-1,j,k,nout)
397 adfac=ad_v(istr-1,j,k,nout)/(cff+cx)
398 ad_grad(istr-1,j-1)=ad_grad(istr-1,j-1)- &
399 & max(ce,0.0_r8)*adfac
400 ad_grad(istr-1,j )=ad_grad(istr-1,j )- &
401 & min(ce,0.0_r8)*adfac
402 ad_v(istr-1,j,k,nstp)=ad_v(istr-1,j,k,nstp)+cff*adfac
403 ad_v(istr ,j,k,nout)=ad_v(istr ,j,k,nout)+cx *adfac
404 ad_v(istr-1,j,k,nout)=0.0_r8
420 ad_v(istr-1,j,k,nout)=ad_v(istr-1,j,k,nout)* &
421 &
grid(ng)%vmask(istr-1,j)
423# ifdef ADJUST_BOUNDARY
429 & ad_v(istr-1,j,k,nout)
430 ad_v(istr-1,j,k,nout)=0.0_r8
434 ad_v(istr-1,j,k,nout)=0.0_r8
439 ad_v(istr-1,j,k,nout)=0.0_r8
455 ad_v(istr-1,j,k,nout)=ad_v(istr-1,j,k,nout)* &
456 &
grid(ng)%vmask(istr-1,j)
460 ad_v(istr ,j,k,nout)=ad_v(istr ,j,k,nout)+ &
461 & ad_v(istr-1,j,k,nout)
462 ad_v(istr-1,j,k,nout)=0.0_r8
485 ad_v(istr-1,j,k,nout)=ad_v(istr-1,j,k,nout)* &
486 &
grid(ng)%vmask(istr-1,j)
490 ad_v(istr ,j,k,nout)=ad_v(istr ,j,k,nout)+ &
491 &
gamma2(ng)*ad_v(istr-1,j,k,nout)
492 ad_v(istr-1,j,k,nout)=0.0
503 IF (
domain(ng)%Northern_Edge(tile))
THEN
508 IF (
iic(ng).ne.0)
THEN
512# if defined CELERITY_READ && defined FORWARD_READ
516 & (
clima(ng)%M3nudgcof(i,jend ,k)+ &
517 &
clima(ng)%M3nudgcof(i,jend+1,k))
518 obc_in =
obcfac(ng)*obc_out
523 IF (
boundary(ng)%v_south_Ce(i,k).lt.0.0_r8)
THEN
542 ad_v(i,jend+1,k,nout)=ad_v(i,jend+1,k,nout)* &
543 &
grid(ng)%vmask(i,jend+1)
549 ad_v(i,jend+1,k,nstp)=ad_v(i,jend+1,k,nstp)- &
550 & tau*ad_v(i,jend+1,k,nout)
560 adfac=ad_v(i,jend+1,k,nout)/(cff+ce)
561 ad_grad(i ,jend+1)=ad_grad(i ,jend+1)- &
562 & max(cx,0.0_r8)*adfac
563 ad_grad(i+1,jend+1)=ad_grad(i+1,jend+1)- &
564 & min(cx,0.0_r8)*adfac
565 ad_v(i,jend ,k,nstp)=ad_v(i,jend ,k,nstp)+ce *adfac
566 ad_v(i,jend+1,k,nstp)=ad_v(i,jend+1,k,nstp)+cff*adfac
567 ad_v(i,jend+1,k,nout)=0.0_r8
583 ad_v(i,jend+1,k,nout)=ad_v(i,jend+1,k,nout)* &
584 &
grid(ng)%vmask(i,jend+1)
586# ifdef ADJUST_BOUNDARY
592 & ad_v(i,jend+1,k,nout)
593 ad_v(i,jend+1,k,nout)=0.0_r8
597 ad_v(i,jend+1,k,nout)=0.0_r8
602 ad_v(i,jend+1,k,nout)=0.0_r8
618 ad_v(i,jend+1,k,nout)=ad_v(i,jend+1,k,nout)* &
619 &
grid(ng)%vmask(i,jend+1)
623 ad_v(i,jend ,k,nout)=ad_v(i,jend ,k,nout)+ &
624 & ad_v(i,jend+1,k,nout)
625 ad_v(i,jend+1,k,nout)=0.0_r8
638 ad_v(i,jend+1,k,nout)=0.0_r8
649 IF (
domain(ng)%Southern_Edge(tile))
THEN
654 IF (
iic(ng).ne.0)
THEN
658# if defined CELERITY_READ && defined FORWARD_READ
662 & (
clima(ng)%M3nudgcof(i,jstr-1,k)+ &
663 &
clima(ng)%M3nudgcof(i,jstr ,k))
664 obc_in =
obcfac(ng)*obc_out
669 IF (
boundary(ng)%v_south_Ce(i,k).lt.0.0_r8)
THEN
688 ad_v(i,jstr,k,nout)=ad_v(i,jstr,k,nout)* &
689 &
grid(ng)%vmask(i,jstr)
695 ad_v(i,jstr,k,nstp)=ad_v(i,jstr,k,nstp)- &
696 & tau*ad_v(i,jstr,k,nout)
706 adfac=ad_v(i,jstr,k,nout)/(cff+ce)
707 ad_grad(i ,jstr)=ad_grad(i ,jstr)- &
708 & max(cx,0.0_r8)*adfac
709 ad_grad(i+1,jstr)=ad_grad(i+1,jstr)- &
710 & min(cx,0.0_r8)*adfac
711 ad_v(i,jstr ,k,nstp)=ad_v(i,jstr ,k,nstp)+cff*adfac
712 ad_v(i,jstr+1,k,nout)=ad_v(i,jstr+1,k,nout)+ce *adfac
713 ad_v(i,jstr ,k,nout)=0.0_r8
729 ad_v(i,jstr,k,nout)=ad_v(i,jstr,k,nout)* &
730 &
grid(ng)%vmask(i,jstr)
732# ifdef ADJUST_BOUNDARY
738 & ad_v(i,jstr,k,nout)
739 ad_v(i,jstr,k,nout)=0.0_r8
743 ad_v(i,jstr,k,nout)=0.0_r8
748 ad_v(i,jstr,k,nout)=0.0_r8
764 ad_v(i,jstr ,k,nout)=ad_v(i,jstr ,k,nout)* &
765 &
grid(ng)%vmask(i,jstr)
769 ad_v(i,jstr+1,k,nout)=ad_v(i,jstr+1,k,nout)+ &
770 & ad_v(i,jstr ,k,nout)
771 ad_v(i,jstr ,k,nout)=0.0_r8
784 ad_v(i,jstr,k,nout)=0.0_r8