54 & LBi, UBi, LBj, UBj, LBij, UBij, &
55 & NstateVars, DotProd, &
57 & rmask, umask, vmask, &
61 & s1_t_obc, s2_t_obc, &
62 & s1_u_obc, s2_u_obc, &
63 & s1_v_obc, s2_v_obc, &
65 & s1_ubar_obc, s2_ubar_obc, &
66 & s1_vbar_obc, s2_vbar_obc, &
67 & s1_zeta_obc, s2_zeta_obc, &
70 & s1_sustr, s2_sustr, &
71 & s1_svstr, s2_svstr, &
75 & s1_tflux, s2_tflux, &
90#if defined ADJUST_BOUNDARY || defined ADJUST_STFLUX || \
91 defined adjust_wstress
101 integer,
intent(in) :: ng, tile, model
102 integer,
intent(in) :: lbi, ubi, lbj, ubj, lbij, ubij
103 integer,
intent(in) :: nstatevars
107 real(r8),
intent(in) :: rmask(lbi:,lbj:)
108 real(r8),
intent(in) :: umask(lbi:,lbj:)
109 real(r8),
intent(in) :: vmask(lbi:,lbj:)
111# ifdef ADJUST_BOUNDARY
113 real(r8),
intent(in) :: s1_t_obc(lbij:,:,:,:,:)
114 real(r8),
intent(in) :: s2_t_obc(lbij:,:,:,:,:)
115 real(r8),
intent(in) :: s1_u_obc(lbij:,:,:,:)
116 real(r8),
intent(in) :: s2_u_obc(lbij:,:,:,:)
117 real(r8),
intent(in) :: s1_v_obc(lbij:,:,:,:)
118 real(r8),
intent(in) :: s2_v_obc(lbij:,:,:,:)
120 real(r8),
intent(in) :: s1_ubar_obc(lbij:,:,:)
121 real(r8),
intent(in) :: s2_ubar_obc(lbij:,:,:)
122 real(r8),
intent(in) :: s1_vbar_obc(lbij:,:,:)
123 real(r8),
intent(in) :: s2_vbar_obc(lbij:,:,:)
124 real(r8),
intent(in) :: s1_zeta_obc(lbij:,:,:)
125 real(r8),
intent(in) :: s2_zeta_obc(lbij:,:,:)
127# ifdef ADJUST_WSTRESS
128 real(r8),
intent(in) :: s1_sustr(lbi:,lbj:,:)
129 real(r8),
intent(in) :: s2_sustr(lbi:,lbj:,:)
130 real(r8),
intent(in) :: s1_svstr(lbi:,lbj:,:)
131 real(r8),
intent(in) :: s2_svstr(lbi:,lbj:,:)
135 real(r8),
intent(in) :: s1_tflux(lbi:,lbj:,:,:)
136 real(r8),
intent(in) :: s2_tflux(lbi:,lbj:,:,:)
138 real(r8),
intent(in) :: s1_t(lbi:,lbj:,:,:)
139 real(r8),
intent(in) :: s2_t(lbi:,lbj:,:,:)
140 real(r8),
intent(in) :: s1_u(lbi:,lbj:,:)
141 real(r8),
intent(in) :: s2_u(lbi:,lbj:,:)
142 real(r8),
intent(in) :: s1_v(lbi:,lbj:,:)
143 real(r8),
intent(in) :: s2_v(lbi:,lbj:,:)
145 real(r8),
intent(in) :: s1_ubar(lbi:,lbj:)
146 real(r8),
intent(in) :: s2_ubar(lbi:,lbj:)
147 real(r8),
intent(in) :: s1_vbar(lbi:,lbj:)
148 real(r8),
intent(in) :: s2_vbar(lbi:,lbj:)
150 real(r8),
intent(in) :: s1_zeta(lbi:,lbj:)
151 real(r8),
intent(in) :: s2_zeta(lbi:,lbj:)
156 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
157 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
158 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
161# ifdef ADJUST_BOUNDARY
163 real(r8),
intent(in) :: s1_t_obc(lbij:ubij,
n(ng),4, &
165 real(r8),
intent(in) :: s2_t_obc(lbij:ubij,
n(ng),4, &
167 real(r8),
intent(in) :: s1_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
168 real(r8),
intent(in) :: s2_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
169 real(r8),
intent(in) :: s1_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
170 real(r8),
intent(in) :: s2_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
172 real(r8),
intent(in) :: s1_ubar_obc(lbij:ubij,4,
nbrec(ng))
173 real(r8),
intent(in) :: s2_ubar_obc(lbij:ubij,4,
nbrec(ng))
174 real(r8),
intent(in) :: s1_vbar_obc(lbij:ubij,4,
nbrec(ng))
175 real(r8),
intent(in) :: s2_vbar_obc(lbij:ubij,4,
nbrec(ng))
176 real(r8),
intent(in) :: s1_zeta_obc(lbij:ubij,4,
nbrec(ng))
177 real(r8),
intent(in) :: s2_zeta_obc(lbij:ubij,4,
nbrec(ng))
179# ifdef ADJUST_WSTRESS
180 real(r8),
intent(in) :: s1_sustr(lbi:ubi,lbj:ubj,
nfrec(ng))
181 real(r8),
intent(in) :: s2_sustr(lbi:ubi,lbj:ubj,
nfrec(ng))
182 real(r8),
intent(in) :: s1_svstr(lbi:ubi,lbj:ubj,
nfrec(ng))
183 real(r8),
intent(in) :: s2_svstr(lbi:ubi,lbj:ubj,
nfrec(ng))
187 real(r8),
intent(in) :: s1_tflux(lbi:ubi,lbj:ubj,
nfrec(ng),
nt(ng))
188 real(r8),
intent(in) :: s2_tflux(lbi:ubi,lbj:ubj,
nfrec(ng),
nt(ng))
190 real(r8),
intent(in) :: s1_t(lbi:ubi,lbj:ubj,
n(ng),
nt(ng))
191 real(r8),
intent(in) :: s2_t(lbi:ubi,lbj:ubj,
n(ng),
nt(ng))
192 real(r8),
intent(in) :: s1_u(lbi:ubi,lbj:ubj,
n(ng))
193 real(r8),
intent(in) :: s2_u(lbi:ubi,lbj:ubj,
n(ng))
194 real(r8),
intent(in) :: s1_v(lbi:ubi,lbj:ubj,
n(ng))
195 real(r8),
intent(in) :: s2_v(lbi:ubi,lbj:ubj,
n(ng))
197 real(r8),
intent(in) :: s1_ubar(lbi:ubi,lbj:ubj)
198 real(r8),
intent(in) :: s2_ubar(lbi:ubi,lbj:ubj)
199 real(r8),
intent(in) :: s1_vbar(lbi:ubi,lbj:ubj)
200 real(r8),
intent(in) :: s2_vbar(lbi:ubi,lbj:ubj)
202 real(r8),
intent(in) :: s1_zeta(lbi:ubi,lbj:ubj)
203 real(r8),
intent(in) :: s2_zeta(lbi:ubi,lbj:ubj)
206 real(r8),
intent(out),
dimension(0:NstateVars) :: dotprod
210 integer :: nsub, i, j, k
214 real(r8),
dimension(0:NstateVars) :: my_dotprod
216 character (len=3),
dimension(0:NstateVars) :: op_handle
219#include "set_bounds.h"
233 cff=s1_zeta(i,j)*s2_zeta(i,j)
237 my_dotprod(0)=my_dotprod(0)+cff
242#ifdef ADJUST_BOUNDARY
249 &
domain(ng)%Western_Edge(tile))
THEN
251 cff=s1_zeta_obc(j,
iwest,ir)* &
252 & s2_zeta_obc(j,
iwest,ir)
254 cff=cff*rmask(istr-1,j)
256 my_dotprod(0)=my_dotprod(0)+cff
261 &
domain(ng)%Eastern_Edge(tile))
THEN
263 cff=s1_zeta_obc(j,
ieast,ir)* &
264 & s2_zeta_obc(j,
ieast,ir)
266 cff=cff*rmask(iend+1,j)
268 my_dotprod(0)=my_dotprod(0)+cff
273 &
domain(ng)%Southern_Edge(tile))
THEN
275 cff=s1_zeta_obc(i,
isouth,ir)* &
276 & s2_zeta_obc(i,
isouth,ir)
278 cff=cff*rmask(i,jstr-1)
280 my_dotprod(0)=my_dotprod(0)+cff
285 &
domain(ng)%Northern_Edge(tile))
THEN
287 cff=s1_zeta_obc(i,
inorth,ir)* &
288 & s2_zeta_obc(i,
inorth,ir)
290 cff=cff*rmask(i,jend+1)
292 my_dotprod(0)=my_dotprod(0)+cff
306 cff=s1_ubar(i,j)*s2_ubar(i,j)
310 my_dotprod(0)=my_dotprod(0)+cff
316#ifdef ADJUST_BOUNDARY
323 &
domain(ng)%Western_Edge(tile))
THEN
325 cff=s1_ubar_obc(j,
iwest,ir)* &
326 & s2_ubar_obc(j,
iwest,ir)
328 cff=cff*umask(istr,j)
330 my_dotprod(0)=my_dotprod(0)+cff
335 &
domain(ng)%Eastern_Edge(tile))
THEN
337 cff=s1_ubar_obc(j,
ieast,ir)* &
338 & s2_ubar_obc(j,
ieast,ir)
340 cff=cff*umask(iend+1,j)
342 my_dotprod(0)=my_dotprod(0)+cff
347 &
domain(ng)%Southern_Edge(tile))
THEN
349 cff=s1_ubar_obc(i,
isouth,ir)* &
350 & s2_ubar_obc(i,
isouth,ir)
352 cff=cff*umask(i,jstr-1)
354 my_dotprod(0)=my_dotprod(0)+cff
359 &
domain(ng)%Northern_Edge(tile))
THEN
361 cff=s1_ubar_obc(i,
inorth,ir)* &
362 & s2_ubar_obc(i,
inorth,ir)
364 cff=cff*umask(i,jend+1)
366 my_dotprod(0)=my_dotprod(0)+cff
380 cff=s1_vbar(i,j)*s2_vbar(i,j)
384 my_dotprod(0)=my_dotprod(0)+cff
390#ifdef ADJUST_BOUNDARY
397 &
domain(ng)%Western_Edge(tile))
THEN
399 cff=s1_vbar_obc(j,
iwest,ir)* &
400 & s2_vbar_obc(j,
iwest,ir)
402 cff=cff*vmask(istr-1,j)
404 my_dotprod(0)=my_dotprod(0)+cff
409 &
domain(ng)%Eastern_Edge(tile))
THEN
411 cff=s1_vbar_obc(j,
ieast,ir)* &
412 & s2_vbar_obc(j,
ieast,ir)
414 cff=cff*vmask(iend+1,j)
416 my_dotprod(0)=my_dotprod(0)+cff
421 &
domain(ng)%Southern_Edge(tile))
THEN
423 cff=s1_vbar_obc(i,
isouth,ir)* &
424 & s2_vbar_obc(i,
isouth,ir)
426 cff=cff*vmask(i,jstr)
428 my_dotprod(0)=my_dotprod(0)+cff
433 &
domain(ng)%Northern_Edge(tile))
THEN
435 cff=s1_vbar_obc(i,
inorth,ir)* &
436 & s2_vbar_obc(i,
inorth,ir)
438 cff=cff*vmask(i,jend+1)
440 my_dotprod(0)=my_dotprod(0)+cff
455 cff=s1_sustr(i,j,ir)*s2_sustr(i,j,ir)
459 my_dotprod(0)=my_dotprod(0)+cff
465 cff=s1_svstr(i,j,ir)*s2_svstr(i,j,ir)
469 my_dotprod(0)=my_dotprod(0)+cff
483 cff=s1_u(i,j,k)*s2_u(i,j,k)
487 my_dotprod(0)=my_dotprod(0)+cff
493# ifdef ADJUST_BOUNDARY
500 &
domain(ng)%Western_Edge(tile))
THEN
503 cff=s1_u_obc(j,k,
iwest,ir)* &
504 & s2_u_obc(j,k,
iwest,ir)
506 cff=cff*umask(istr,j)
508 my_dotprod(0)=my_dotprod(0)+cff
514 &
domain(ng)%Eastern_Edge(tile))
THEN
517 cff=s1_u_obc(j,k,
ieast,ir)* &
518 & s2_u_obc(j,k,
ieast,ir)
520 cff=cff*umask(iend+1,j)
522 my_dotprod(0)=my_dotprod(0)+cff
528 &
domain(ng)%Southern_Edge(tile))
THEN
531 cff=s1_u_obc(i,k,
isouth,ir)* &
534 cff=cff*umask(i,jstr-1)
536 my_dotprod(0)=my_dotprod(0)+cff
542 &
domain(ng)%Northern_Edge(tile))
THEN
545 cff=s1_u_obc(i,k,
inorth,ir)* &
548 cff=cff*umask(i,jend+1)
550 my_dotprod(0)=my_dotprod(0)+cff
564 cff=s1_v(i,j,k)*s2_v(i,j,k)
568 my_dotprod(0)=my_dotprod(0)+cff
574# ifdef ADJUST_BOUNDARY
581 &
domain(ng)%Western_Edge(tile))
THEN
584 cff=s1_v_obc(j,k,
iwest,ir)* &
585 & s2_v_obc(j,k,
iwest,ir)
587 cff=cff*vmask(istr-1,j)
589 my_dotprod(0)=my_dotprod(0)+cff
595 &
domain(ng)%Eastern_Edge(tile))
THEN
598 cff=s1_v_obc(j,k,
ieast,ir)* &
599 & s2_v_obc(j,k,
ieast,ir)
601 cff=cff*vmask(iend+1,j)
603 my_dotprod(0)=my_dotprod(0)+cff
609 &
domain(ng)%Southern_Edge(tile))
THEN
612 cff=s1_v_obc(i,k,
isouth,ir)* &
615 cff=cff*vmask(i,jstr)
617 my_dotprod(0)=my_dotprod(0)+cff
623 &
domain(ng)%Northern_Edge(tile))
THEN
626 cff=s1_v_obc(i,k,
inorth,ir)* &
629 cff=cff*vmask(i,jend+1)
631 my_dotprod(0)=my_dotprod(0)+cff
646 cff=s1_t(i,j,k,it)*s2_t(i,j,k,it)
650 my_dotprod(0)=my_dotprod(0)+cff
657# ifdef ADJUST_BOUNDARY
665 &
domain(ng)%Western_Edge(tile))
THEN
668 cff=s1_t_obc(j,k,
iwest,ir,it)* &
669 & s2_t_obc(j,k,
iwest,ir,it)
671 cff=cff*rmask(istr-1,j)
673 my_dotprod(0)=my_dotprod(0)+cff
679 &
domain(ng)%Eastern_Edge(tile))
THEN
682 cff=s1_t_obc(j,k,
ieast,ir,it)* &
683 & s2_t_obc(j,k,
ieast,ir,it)
685 cff=cff*rmask(iend+1,j)
687 my_dotprod(0)=my_dotprod(0)+cff
693 &
domain(ng)%Southern_Edge(tile))
THEN
696 cff=s1_t_obc(i,k,
isouth,ir,it)* &
697 & s2_t_obc(i,k,
isouth,ir,it)
699 cff=cff*rmask(i,jstr-1)
701 my_dotprod(0)=my_dotprod(0)+cff
707 &
domain(ng)%Northern_Edge(tile))
THEN
710 cff=s1_t_obc(i,k,
inorth,ir,it)* &
711 & s2_t_obc(i,k,
inorth,ir,it)
713 cff=cff*rmask(i,jend+1)
715 my_dotprod(0)=my_dotprod(0)+cff
734 cff=s1_tflux(i,j,ir,it)*s2_tflux(i,j,ir,it)
738 my_dotprod(0)=my_dotprod(0)+cff
756 IF (
domain(ng)%SouthWest_Corner(tile).and. &
757 &
domain(ng)%NorthEast_Corner(tile))
THEN
770 dotprod(i)=dotprod(i)+my_dotprod(i)
779 CALL mp_reduce (ng, model, nstatevars+1, dotprod(0:), &
subroutine, public state_dotprod(ng, tile, model, lbi, ubi, lbj, ubj, lbij, ubij, nstatevars, dotprod, rmask, umask, vmask, s1_t_obc, s2_t_obc, s1_u_obc, s2_u_obc, s1_v_obc, s2_v_obc, s1_ubar_obc, s2_ubar_obc, s1_vbar_obc, s2_vbar_obc, s1_zeta_obc, s2_zeta_obc, s1_sustr, s2_sustr, s1_svstr, s2_svstr, s1_tflux, s2_tflux, s1_t, s2_t, s1_u, s2_u, s1_v, s2_v, s1_zeta, s2_zeta)