28 & LBi, UBi, LBj, UBj, LBij, UBij, &
32 & rmask, umask, vmask, &
36 & s1_t_obc, s2_t_obc, &
37 & s1_u_obc, s2_u_obc, &
38 & s1_v_obc, s2_v_obc, &
40 & s1_ubar_obc, s2_ubar_obc, &
41 & s1_vbar_obc, s2_vbar_obc, &
42 & s1_zeta_obc, s2_zeta_obc, &
45 & s1_sustr, s2_sustr, &
46 & s1_svstr, s2_svstr, &
50 & s1_tflux, s2_tflux, &
55# if defined WEAK_CONSTRAINT && defined TIME_CONV
67#if defined ADJUST_BOUNDARY || defined ADJUST_STFLUX || \
68 defined adjust_wstress
75 integer,
intent(in) :: ng, tile
76 integer,
intent(in) :: lbi, ubi, lbj, ubj, lbij, ubij
77 integer,
intent(in) :: lin1, lin2, lout
79 real(r8),
intent(in) :: fac1, fac2
83 real(r8),
intent(in) :: rmask(lbi:,lbj:)
84 real(r8),
intent(in) :: umask(lbi:,lbj:)
85 real(r8),
intent(in) :: vmask(lbi:,lbj:)
87# ifdef ADJUST_BOUNDARY
89 real(r8),
intent(in) :: s2_t_obc(lbij:,:,:,:,:,:)
90 real(r8),
intent(in) :: s2_u_obc(lbij:,:,:,:,:)
91 real(r8),
intent(in) :: s2_v_obc(lbij:,:,:,:,:)
93 real(r8),
intent(in) :: s2_ubar_obc(lbij:,:,:,:)
94 real(r8),
intent(in) :: s2_vbar_obc(lbij:,:,:,:)
95 real(r8),
intent(in) :: s2_zeta_obc(lbij:,:,:,:)
98 real(r8),
intent(in) :: s2_sustr(lbi:,lbj:,:,:)
99 real(r8),
intent(in) :: s2_svstr(lbi:,lbj:,:,:)
103 real(r8),
intent(in) :: s2_tflux(lbi:,lbj:,:,:,:)
105 real(r8),
intent(in) :: s2_t(lbi:,lbj:,:,:,:)
106 real(r8),
intent(in) :: s2_u(lbi:,lbj:,:,:)
107 real(r8),
intent(in) :: s2_v(lbi:,lbj:,:,:)
108# if defined WEAK_CONSTRAINT && defined TIME_CONV
109 real(r8),
intent(in) :: s2_ubar(lbi:,lbj:,:)
110 real(r8),
intent(in) :: s2_vbar(lbi:,lbj:,:)
113 real(r8),
intent(in) :: s2_ubar(lbi:,lbj:,:)
114 real(r8),
intent(in) :: s2_vbar(lbi:,lbj:,:)
116 real(r8),
intent(in) :: s2_zeta(lbi:,lbj:,:)
118# ifdef ADJUST_BOUNDARY
120 real(r8),
intent(inout) :: s1_t_obc(lbij:,:,:,:,:,:)
121 real(r8),
intent(inout) :: s1_u_obc(lbij:,:,:,:,:)
122 real(r8),
intent(inout) :: s1_v_obc(lbij:,:,:,:,:)
124 real(r8),
intent(inout) :: s1_ubar_obc(lbij:,:,:,:)
125 real(r8),
intent(inout) :: s1_vbar_obc(lbij:,:,:,:)
126 real(r8),
intent(inout) :: s1_zeta_obc(lbij:,:,:,:)
128# ifdef ADJUST_WSTRESS
129 real(r8),
intent(inout) :: s1_sustr(lbi:,lbj:,:,:)
130 real(r8),
intent(inout) :: s1_svstr(lbi:,lbj:,:,:)
134 real(r8),
intent(inout) :: s1_tflux(lbi:,lbj:,:,:,:)
136 real(r8),
intent(inout) :: s1_t(lbi:,lbj:,:,:,:)
137 real(r8),
intent(inout) :: s1_u(lbi:,lbj:,:,:)
138 real(r8),
intent(inout) :: s1_v(lbi:,lbj:,:,:)
139# if defined WEAK_CONSTRAINT && defined TIME_CONV
140 real(r8),
intent(inout) :: s1_ubar(lbi:,lbj:,:)
141 real(r8),
intent(inout) :: s1_vbar(lbi:,lbj:,:)
144 real(r8),
intent(inout) :: s1_ubar(lbi:,lbj:,:)
145 real(r8),
intent(inout) :: s1_vbar(lbi:,lbj:,:)
147 real(r8),
intent(inout) :: s1_zeta(lbi:,lbj:,:)
152 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
153 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
154 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
156# ifdef ADJUST_BOUNDARY
158 real(r8),
intent(in) :: s2_t_obc(lbij:ubij,
n(ng),4, &
159 & Nbrec(ng),2,NT(ng))
160 real(r8),
intent(in) :: s2_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng),2)
161 real(r8),
intent(in) :: s2_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng),2)
163 real(r8),
intent(in) :: s2_ubar_obc(lbij:ubij,4,
nbrec(ng),2)
164 real(r8),
intent(in) :: s2_vbar_obc(lbij:ubij,4,
nbrec(ng),2)
165 real(r8),
intent(in) :: s2_zeta_obc(lbij:ubij,4,
nbrec(ng),2)
167# ifdef ADJUST_WSTRESS
168 real(r8),
intent(in) :: s2_sustr(lbi:ubi,lbj:ubj,
nfrec(ng),2)
169 real(r8),
intent(in) :: s2_svstr(lbi:ubi,lbj:ubj,
nfrec(ng),2)
173 real(r8),
intent(in) :: s2_tflux(lbi:ubi,lbj:ubj, &
174 & Nfrec(ng),2,NT(ng))
176 real(r8),
intent(in) :: s2_t(lbi:ubi,lbj:ubj,
n(ng),3,
nt(ng))
177 real(r8),
intent(in) :: s2_u(lbi:ubi,lbj:ubj,
n(ng),2)
178 real(r8),
intent(in) :: s2_v(lbi:ubi,lbj:ubj,
n(ng),2)
179# if defined WEAK_CONSTRAINT && defined TIME_CONV
180 real(r8),
intent(in) :: s2_ubar(lbi:ubi,lbj:ubj,:)
181 real(r8),
intent(in) :: s2_vbar(lbi:ubi,lbj:ubj,:)
184 real(r8),
intent(in) :: s2_ubar(lbi:ubi,lbj:ubj,:)
185 real(r8),
intent(in) :: s2_vbar(lbi:ubi,lbj:ubj,:)
187 real(r8),
intent(in) :: s2_zeta(lbi:ubi,lbj:ubj,:)
189# ifdef ADJUST_BOUNDARY
191 real(r8),
intent(inout) :: s1_t_obc(lbij:ubij,
n(ng),4, &
192 & Nbrec(ng),2,NT(ng))
193 real(r8),
intent(inout) :: s1_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng),2)
194 real(r8),
intent(inout) :: s1_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng),2)
196 real(r8),
intent(inout) :: s1_ubar_obc(lbij:ubij,4,
nbrec(ng),2)
197 real(r8),
intent(inout) :: s1_vbar_obc(lbij:ubij,4,
nbrec(ng),2)
198 real(r8),
intent(inout) :: s1_zeta_obc(lbij:ubij,4,
nbrec(ng),2)
200# ifdef ADJUST_WSTRESS
201 real(r8),
intent(inout) :: s1_sustr(lbi:ubi,lbj:ubj,
nfrec(ng),2)
202 real(r8),
intent(inout) :: s1_svstr(lbi:ubi,lbj:ubj,
nfrec(ng),2)
206 real(r8),
intent(inout) :: s1_tflux(lbi:ubi,lbj:ubj, &
207 & Nfrec(ng),2,NT(ng))
209 real(r8),
intent(inout) :: s1_t(lbi:ubi,lbj:ubj,
n(ng),3,
nt(ng))
210 real(r8),
intent(inout) :: s1_u(lbi:ubi,lbj:ubj,
n(ng),2)
211 real(r8),
intent(inout) :: s1_v(lbi:ubi,lbj:ubj,
n(ng),2)
212# if defined WEAK_CONSTRAINT && defined TIME_CONV
213 real(r8),
intent(inout) :: s1_ubar(lbi:ubi,lbj:ubj,:)
214 real(r8),
intent(inout) :: s1_vbar(lbi:ubi,lbj:ubj,:)
217 real(r8),
intent(inout) :: s1_ubar(lbi:ubi,lbj:ubj,:)
218 real(r8),
intent(inout) :: s1_vbar(lbi:ubi,lbj:ubj,:)
220 real(r8),
intent(inout) :: s1_zeta(lbi:ubi,lbj:ubj,:)
226 integer :: ib, ir, it
228#include "set_bounds.h"
240 s1_zeta(i,j,lout)=fac1*s1_zeta(i,j,lin1)+ &
241 & fac2*s2_zeta(i,j,lin2)
243 s1_zeta(i,j,lout)=s1_zeta(i,j,lout)*rmask(i,j)
248#ifdef ADJUST_BOUNDARY
255 &
domain(ng)%Western_Edge(tile))
THEN
258 s1_zeta_obc(j,ib,ir,lout)=fac1*s1_zeta_obc(j,ib,ir,lin1)+ &
259 & fac2*s2_zeta_obc(j,ib,ir,lin2)
261 s1_zeta_obc(j,ib,ir,lout)=s1_zeta_obc(j,ib,ir,lout)* &
267 &
domain(ng)%Eastern_Edge(tile))
THEN
270 s1_zeta_obc(j,ib,ir,lout)=fac1*s1_zeta_obc(j,ib,ir,lin1)+ &
271 & fac2*s2_zeta_obc(j,ib,ir,lin2)
273 s1_zeta_obc(j,ib,ir,lout)=s1_zeta_obc(j,ib,ir,lout)* &
279 &
domain(ng)%Southern_Edge(tile))
THEN
282 s1_zeta_obc(i,ib,ir,lout)=fac1*s1_zeta_obc(i,ib,ir,lin1)+ &
283 & fac2*s2_zeta_obc(i,ib,ir,lin2)
285 s1_zeta_obc(i,ib,ir,lout)=s1_zeta_obc(i,ib,ir,lout)* &
291 &
domain(ng)%Northern_Edge(tile))
THEN
294 s1_zeta_obc(i,ib,ir,lout)=fac1*s1_zeta_obc(i,ib,ir,lin1)+ &
295 & fac2*s2_zeta_obc(i,ib,ir,lin2)
297 s1_zeta_obc(i,ib,ir,lout)=s1_zeta_obc(i,ib,ir,lout)* &
306#if !defined SOLVE3D || (defined WEAK_CONSTRAINT && defined TIME_CONV )
312 s1_ubar(i,j,lout)=fac1*s1_ubar(i,j,lin1)+ &
313 & fac2*s2_ubar(i,j,lin2)
315 s1_ubar(i,j,lout)=s1_ubar(i,j,lout)*umask(i,j)
321#ifdef ADJUST_BOUNDARY
328 &
domain(ng)%Western_Edge(tile))
THEN
331 s1_ubar_obc(j,ib,ir,lout)=fac1*s1_ubar_obc(j,ib,ir,lin1)+ &
332 & fac2*s2_ubar_obc(j,ib,ir,lin2)
334 s1_ubar_obc(j,ib,ir,lout)=s1_ubar_obc(j,ib,ir,lout)* &
340 &
domain(ng)%Eastern_Edge(tile))
THEN
343 s1_ubar_obc(j,ib,ir,lout)=fac1*s1_ubar_obc(j,ib,ir,lin1)+ &
344 & fac2*s2_ubar_obc(j,ib,ir,lin2)
346 s1_ubar_obc(j,ib,ir,lout)=s1_ubar_obc(j,ib,ir,lout)* &
352 &
domain(ng)%Southern_Edge(tile))
THEN
355 s1_ubar_obc(i,ib,ir,lout)=fac1*s1_ubar_obc(i,ib,ir,lin1)+ &
356 & fac2*s2_ubar_obc(i,ib,ir,lin2)
358 s1_ubar_obc(i,ib,ir,lout)=s1_ubar_obc(i,ib,ir,lout)* &
364 &
domain(ng)%Northern_Edge(tile))
THEN
367 s1_ubar_obc(i,ib,ir,lout)=fac1*s1_ubar_obc(i,ib,ir,lin1)+ &
368 & fac2*s2_ubar_obc(i,ib,ir,lin2)
370 s1_ubar_obc(i,ib,ir,lout)=s1_ubar_obc(i,ib,ir,lout)* &
379#if !defined SOLVE3D || (defined WEAK_CONSTRAINT && defined TIME_CONV )
385 s1_vbar(i,j,lout)=fac1*s1_vbar(i,j,lin1)+ &
386 & fac2*s2_vbar(i,j,lin2)
388 s1_vbar(i,j,lout)=s1_vbar(i,j,lout)*vmask(i,j)
394#ifdef ADJUST_BOUNDARY
401 &
domain(ng)%Western_Edge(tile))
THEN
404 s1_vbar_obc(j,ib,ir,lout)=fac1*s1_vbar_obc(j,ib,ir,lin1)+ &
405 & fac2*s2_vbar_obc(j,ib,ir,lin2)
407 s1_vbar_obc(j,ib,ir,lout)=s1_vbar_obc(j,ib,ir,lout)* &
413 &
domain(ng)%Eastern_Edge(tile))
THEN
416 s1_vbar_obc(j,ib,ir,lout)=fac1*s1_vbar_obc(j,ib,ir,lin1)+ &
417 & fac2*s2_vbar_obc(j,ib,ir,lin2)
419 s1_vbar_obc(j,ib,ir,lout)=s1_vbar_obc(j,ib,ir,lout)* &
425 &
domain(ng)%Southern_Edge(tile))
THEN
428 s1_vbar_obc(i,ib,ir,lout)=fac1*s1_vbar_obc(i,ib,ir,lin1)+ &
429 & fac2*s2_vbar_obc(i,ib,ir,lin2)
431 s1_vbar_obc(i,ib,ir,lout)=s1_vbar_obc(i,ib,ir,lout)* &
437 &
domain(ng)%Northern_Edge(tile))
THEN
440 s1_vbar_obc(i,ib,ir,lout)=fac1*s1_vbar_obc(i,ib,ir,lin1)+ &
441 & fac2*s2_vbar_obc(i,ib,ir,lin2)
443 s1_vbar_obc(i,ib,ir,lout)=s1_vbar_obc(i,ib,ir,lout)* &
459 s1_sustr(i,j,ir,lout)=fac1*s1_sustr(i,j,ir,lin1)+ &
460 & fac2*s2_sustr(i,j,ir,lin2)
462 s1_sustr(i,j,ir,lout)=s1_sustr(i,j,ir,lout)*umask(i,j)
468 s1_svstr(i,j,ir,lout)=fac1*s1_svstr(i,j,ir,lin1)+ &
469 & fac2*s2_svstr(i,j,ir,lin2)
471 s1_svstr(i,j,ir,lout)=s1_svstr(i,j,ir,lout)*vmask(i,j)
485 s1_u(i,j,k,lout)=fac1*s1_u(i,j,k,lin1)+ &
486 & fac2*s2_u(i,j,k,lin2)
488 s1_u(i,j,k,lout)=s1_u(i,j,k,lout)*umask(i,j)
494# ifdef ADJUST_BOUNDARY
501 &
domain(ng)%Western_Edge(tile))
THEN
505 s1_u_obc(j,k,ib,ir,lout)=fac1*s1_u_obc(j,k,ib,ir,lin1)+ &
506 & fac2*s2_u_obc(j,k,ib,ir,lin2)
508 s1_u_obc(j,k,ib,ir,lout)=s1_u_obc(j,k,ib,ir,lout)* &
515 &
domain(ng)%Eastern_Edge(tile))
THEN
519 s1_u_obc(j,k,ib,ir,lout)=fac1*s1_u_obc(j,k,ib,ir,lin1)+ &
520 & fac2*s2_u_obc(j,k,ib,ir,lin2)
522 s1_u_obc(j,k,ib,ir,lout)=s1_u_obc(j,k,ib,ir,lout)* &
529 &
domain(ng)%Southern_Edge(tile))
THEN
533 s1_u_obc(i,k,ib,ir,lout)=fac1*s1_u_obc(i,k,ib,ir,lin1)+ &
534 & fac2*s2_u_obc(i,k,ib,ir,lin2)
536 s1_u_obc(i,k,ib,ir,lout)=s1_u_obc(i,k,ib,ir,lout)* &
543 &
domain(ng)%Northern_Edge(tile))
THEN
547 s1_u_obc(i,k,ib,ir,lout)=fac1*s1_u_obc(i,k,ib,ir,lin1)+ &
548 & fac2*s2_u_obc(i,k,ib,ir,lin2)
550 s1_u_obc(i,k,ib,ir,lout)=s1_u_obc(i,k,ib,ir,lout)* &
565 s1_v(i,j,k,lout)=fac1*s1_v(i,j,k,lin1)+ &
566 & fac2*s2_v(i,j,k,lin2)
568 s1_v(i,j,k,lout)=s1_v(i,j,k,lout)*vmask(i,j)
574# ifdef ADJUST_BOUNDARY
581 &
domain(ng)%Western_Edge(tile))
THEN
585 s1_v_obc(j,k,ib,ir,lout)=fac1*s1_v_obc(j,k,ib,ir,lin1)+ &
586 & fac2*s2_v_obc(j,k,ib,ir,lin2)
588 s1_v_obc(j,k,ib,ir,lout)=s1_v_obc(j,k,ib,ir,lout)* &
595 &
domain(ng)%Eastern_Edge(tile))
THEN
599 s1_v_obc(j,k,ib,ir,lout)=fac1*s1_v_obc(j,k,ib,ir,lin1)+ &
600 & fac2*s2_v_obc(j,k,ib,ir,lin2)
602 s1_v_obc(j,k,ib,ir,lout)=s1_v_obc(j,k,ib,ir,lout)* &
609 &
domain(ng)%Southern_Edge(tile))
THEN
613 s1_v_obc(i,k,ib,ir,lout)=fac1*s1_v_obc(i,k,ib,ir,lin1)+ &
614 & fac2*s2_v_obc(i,k,ib,ir,lin2)
616 s1_v_obc(i,k,ib,ir,lout)=s1_v_obc(i,k,ib,ir,lout)* &
623 &
domain(ng)%Northern_Edge(tile))
THEN
627 s1_v_obc(i,k,ib,ir,lout)=fac1*s1_v_obc(i,k,ib,ir,lin1)+ &
628 & fac2*s2_v_obc(i,k,ib,ir,lin2)
630 s1_v_obc(i,k,ib,ir,lout)=s1_v_obc(i,k,ib,ir,lout)* &
646 s1_t(i,j,k,lout,it)=fac1*s1_t(i,j,k,lin1,it)+ &
647 & fac2*s2_t(i,j,k,lin2,it)
649 s1_t(i,j,k,lout,it)=s1_t(i,j,k,lout,it)*rmask(i,j)
656# ifdef ADJUST_BOUNDARY
664 &
domain(ng)%Western_Edge(tile))
THEN
668 s1_t_obc(j,k,ib,ir,lout,it)= &
669 & fac1*s1_t_obc(j,k,ib,ir,lin1,it)+ &
670 & fac2*s2_t_obc(j,k,ib,ir,lin2,it)
672 s1_t_obc(j,k,ib,ir,lout,it)= &
673 & s1_t_obc(j,k,ib,ir,lout,it)*rmask(istr-1,j)
679 &
domain(ng)%Eastern_Edge(tile))
THEN
683 s1_t_obc(j,k,ib,ir,lout,it)= &
684 & fac1*s1_t_obc(j,k,ib,ir,lin1,it)+ &
685 & fac2*s2_t_obc(j,k,ib,ir,lin2,it)
687 s1_t_obc(j,k,ib,ir,lout,it)= &
688 & s1_t_obc(j,k,ib,ir,lout,it)*rmask(iend+1,j)
694 &
domain(ng)%Southern_Edge(tile))
THEN
698 s1_t_obc(i,k,ib,ir,lout,it)= &
699 & fac1*s1_t_obc(i,k,ib,ir,lin1,it)+ &
700 & fac2*s2_t_obc(i,k,ib,ir,lin2,it)
702 s1_t_obc(i,k,ib,ir,lout,it)= &
703 & s1_t_obc(i,k,ib,ir,lout,it)*rmask(i,jstr-1)
709 &
domain(ng)%Northern_Edge(tile))
THEN
713 s1_t_obc(i,k,ib,ir,lout,it)= &
714 & fac1*s1_t_obc(i,k,ib,ir,lin1,it)+ &
715 & fac2*s2_t_obc(i,k,ib,ir,lin2,it)
717 s1_t_obc(i,k,ib,ir,lout,it)= &
718 & s1_t_obc(i,k,ib,ir,lout,it)*rmask(i,jend+1)
737 s1_tflux(i,j,ir,lout,it)=fac1*s1_tflux(i,j,ir,lin1,it)+ &
738 & fac2*s2_tflux(i,j,ir,lin2,it)
740 s1_tflux(i,j,ir,lout,it)=s1_tflux(i,j,ir,lout,it)* &