26 & LBi, UBi, LBj, UBj, LBij, UBij, &
28 & rmask, umask, vmask, &
32 & s1_t_obc, s2_t_obc, s3_t_obc, &
33 & s1_u_obc, s2_u_obc, s3_u_obc, &
34 & s1_v_obc, s2_v_obc, s3_v_obc, &
36 & s1_ubar_obc, s2_ubar_obc, s3_ubar_obc, &
37 & s1_vbar_obc, s2_vbar_obc, s3_vbar_obc, &
38 & s1_zeta_obc, s2_zeta_obc, s3_zeta_obc, &
41 & s1_sustr, s2_sustr, s3_sustr, &
42 & s1_svstr, s2_svstr, s3_svstr, &
46 & s1_tflux, s2_tflux, s3_tflux, &
52 & s1_ubar, s2_ubar, s3_ubar, &
53 & s1_vbar, s2_vbar, s3_vbar, &
55 & s1_zeta, s2_zeta, s3_zeta)
61#if defined ADJUST_BOUNDARY || defined ADJUST_STFLUX || \
62 defined adjust_wstress
72 integer,
intent(in) :: ng, tile, model
73 integer,
intent(in) :: lbi, ubi, lbj, ubj, lbij, ubij
77 real(r8),
intent(in) :: rmask(lbi:,lbj:)
78 real(r8),
intent(in) :: umask(lbi:,lbj:)
79 real(r8),
intent(in) :: vmask(lbi:,lbj:)
81# ifdef ADJUST_BOUNDARY
83 real(r8),
intent(in) :: s1_t_obc(lbij:,:,:,:,:)
84 real(r8),
intent(in) :: s2_t_obc(lbij:,:,:,:,:)
85 real(r8),
intent(in) :: s1_u_obc(lbij:,:,:,:)
86 real(r8),
intent(in) :: s2_u_obc(lbij:,:,:,:)
87 real(r8),
intent(in) :: s1_v_obc(lbij:,:,:,:)
88 real(r8),
intent(in) :: s2_v_obc(lbij:,:,:,:)
90 real(r8),
intent(inout) :: s3_t_obc(lbij:,:,:,:,:)
91 real(r8),
intent(inout) :: s3_u_obc(lbij:,:,:,:)
92 real(r8),
intent(inout) :: s3_v_obc(lbij:,:,:,:)
94 real(r8),
intent(in) :: s1_ubar_obc(lbij:,:,:)
95 real(r8),
intent(in) :: s2_ubar_obc(lbij:,:,:)
96 real(r8),
intent(in) :: s1_vbar_obc(lbij:,:,:)
97 real(r8),
intent(in) :: s2_vbar_obc(lbij:,:,:)
98 real(r8),
intent(in) :: s1_zeta_obc(lbij:,:,:)
99 real(r8),
intent(in) :: s2_zeta_obc(lbij:,:,:)
101 real(r8),
intent(inout) :: s3_ubar_obc(lbij:,:,:)
102 real(r8),
intent(inout) :: s3_vbar_obc(lbij:,:,:)
103 real(r8),
intent(inout) :: s3_zeta_obc(lbij:,:,:)
105# ifdef ADJUST_WSTRESS
106 real(r8),
intent(in) :: s1_sustr(lbi:,lbj:,:)
107 real(r8),
intent(in) :: s2_sustr(lbi:,lbj:,:)
108 real(r8),
intent(in) :: s1_svstr(lbi:,lbj:,:)
109 real(r8),
intent(in) :: s2_svstr(lbi:,lbj:,:)
111 real(r8),
intent(inout) :: s3_sustr(lbi:,lbj:,:)
112 real(r8),
intent(inout) :: s3_svstr(lbi:,lbj:,:)
116 real(r8),
intent(in) :: s1_tflux(lbi:,lbj:,:,:)
117 real(r8),
intent(in) :: s2_tflux(lbi:,lbj:,:,:)
119 real(r8),
intent(inout) :: s3_tflux(lbi:,lbj:,:,:)
121 real(r8),
intent(in) :: s1_t(lbi:,lbj:,:,:)
122 real(r8),
intent(in) :: s2_t(lbi:,lbj:,:,:)
123 real(r8),
intent(in) :: s1_u(lbi:,lbj:,:)
124 real(r8),
intent(in) :: s2_u(lbi:,lbj:,:)
125 real(r8),
intent(in) :: s1_v(lbi:,lbj:,:)
126 real(r8),
intent(in) :: s2_v(lbi:,lbj:,:)
128 real(r8),
intent(inout) :: s3_t(lbi:,lbj:,:,:)
129 real(r8),
intent(inout) :: s3_u(lbi:,lbj:,:)
130 real(r8),
intent(inout) :: s3_v(lbi:,lbj:,:)
132 real(r8),
intent(in) :: s1_ubar(lbi:,lbj:)
133 real(r8),
intent(in) :: s2_ubar(lbi:,lbj:)
134 real(r8),
intent(in) :: s1_vbar(lbi:,lbj:)
135 real(r8),
intent(in) :: s2_vbar(lbi:,lbj:)
137 real(r8),
intent(inout) :: s3_ubar(lbi:,lbj:)
138 real(r8),
intent(inout) :: s3_vbar(lbi:,lbj:)
140 real(r8),
intent(in) :: s1_zeta(lbi:,lbj:)
141 real(r8),
intent(in) :: s2_zeta(lbi:,lbj:)
143 real(r8),
intent(inout) :: s3_zeta(lbi:,lbj:)
148 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
149 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
150 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
153# ifdef ADJUST_BOUNDARY
155 real(r8),
intent(in) :: s1_t_obc(lbij:ubij,
n(ng),4, &
157 real(r8),
intent(in) :: s2_t_obc(lbij:ubij,
n(ng),4, &
159 real(r8),
intent(in) :: s1_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
160 real(r8),
intent(in) :: s2_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
161 real(r8),
intent(in) :: s1_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
162 real(r8),
intent(in) :: s2_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
164 real(r8),
intent(inout) :: s3_t_obc(lbij:ubij,
n(ng),4, &
166 real(r8),
intent(inout) :: s3_u_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
167 real(r8),
intent(inout) :: s3_v_obc(lbij:ubij,
n(ng),4,
nbrec(ng))
169 real(r8),
intent(in) :: s1_ubar_obc(lbij:ubij,4,
nbrec(ng))
170 real(r8),
intent(in) :: s2_ubar_obc(lbij:ubij,4,
nbrec(ng))
171 real(r8),
intent(in) :: s1_vbar_obc(lbij:ubij,4,
nbrec(ng))
172 real(r8),
intent(in) :: s2_vbar_obc(lbij:ubij,4,
nbrec(ng))
173 real(r8),
intent(in) :: s1_zeta_obc(lbij:ubij,4,
nbrec(ng))
174 real(r8),
intent(in) :: s2_zeta_obc(lbij:ubij,4,
nbrec(ng))
176 real(r8),
intent(inout) :: s3_ubar_obc(lbij:ubij,4,
nbrec(ng))
177 real(r8),
intent(inout) :: s3_vbar_obc(lbij:ubij,4,
nbrec(ng))
178 real(r8),
intent(inout) :: s3_zeta_obc(lbij:ubij,4,
nbrec(ng))
180# ifdef ADJUST_WSTRESS
181 real(r8),
intent(in) :: s1_sustr(lbi:ubi,lbj:ubj,
nfrec(ng))
182 real(r8),
intent(in) :: s2_sustr(lbi:ubi,lbj:ubj,
nfrec(ng))
183 real(r8),
intent(in) :: s1_svstr(lbi:ubi,lbj:ubj,
nfrec(ng))
184 real(r8),
intent(in) :: s2_svstr(lbi:ubi,lbj:ubj,
nfrec(ng))
186 real(r8),
intent(inout) :: s3_sustr(lbi:ubi,lbj:ubj,
nfrec(ng))
187 real(r8),
intent(inout) :: s3_svstr(lbi:ubi,lbj:ubj,
nfrec(ng))
191 real(r8),
intent(in) :: s1_tflux(lbi:ubi,lbj:ubj,
nfrec(ng),
nt(ng))
192 real(r8),
intent(in) :: s2_tflux(lbi:ubi,lbj:ubj,
nfrec(ng),
nt(ng))
194 real(r8),
intent(inout) :: s3_tflux(lbi:ubi,lbj:ubj, &
197 real(r8),
intent(in) :: s1_t(lbi:ubi,lbj:ubj,
n(ng),
nt(ng))
198 real(r8),
intent(in) :: s2_t(lbi:ubi,lbj:ubj,
n(ng),
nt(ng))
199 real(r8),
intent(in) :: s1_u(lbi:ubi,lbj:ubj,
n(ng))
200 real(r8),
intent(in) :: s2_u(lbi:ubi,lbj:ubj,
n(ng))
201 real(r8),
intent(in) :: s1_v(lbi:ubi,lbj:ubj,
n(ng))
202 real(r8),
intent(in) :: s2_v(lbi:ubi,lbj:ubj,
n(ng))
204 real(r8),
intent(inout) :: s3_t(lbi:ubi,lbj:ubj,
n(ng),
nt(ng))
205 real(r8),
intent(inout) :: s3_u(lbi:ubi,lbj:ubj,
n(ng))
206 real(r8),
intent(inout) :: s3_v(lbi:ubi,lbj:ubj,
n(ng))
208 real(r8),
intent(in) :: s1_ubar(lbi:ubi,lbj:ubj)
209 real(r8),
intent(in) :: s2_ubar(lbi:ubi,lbj:ubj)
210 real(r8),
intent(in) :: s1_vbar(lbi:ubi,lbj:ubj)
211 real(r8),
intent(in) :: s2_vbar(lbi:ubi,lbj:ubj)
213 real(r8),
intent(inout) :: s3_ubar(lbi:ubi,lbj:ubj)
214 real(r8),
intent(inout) :: s3_vbar(lbi:ubi,lbj:ubj)
216 real(r8),
intent(in) :: s1_zeta(lbi:ubi,lbj:ubj)
217 real(r8),
intent(in) :: s2_zeta(lbi:ubi,lbj:ubj)
219 real(r8),
intent(inout) :: s3_zeta(lbi:ubi,lbj:ubj)
224 integer :: nsub, i, j, k
229#include "set_bounds.h"
240 cff=s1_zeta(i,j)*s2_zeta(i,j)
248#ifdef ADJUST_BOUNDARY
255 &
domain(ng)%Western_Edge(tile))
THEN
257 cff=s1_zeta_obc(j,
iwest,ir)*s2_zeta_obc(j,
iwest,ir)
259 cff=cff*rmask(istr-1,j)
261 s3_zeta_obc(j,
iwest,ir)=cff
265 &
domain(ng)%Eastern_Edge(tile))
THEN
267 cff=s1_zeta_obc(j,
ieast,ir)* &
268 & s2_zeta_obc(j,
ieast,ir)
270 cff=cff*rmask(iend+1,j)
272 s3_zeta_obc(j,
ieast,ir)=cff
276 &
domain(ng)%Southern_Edge(tile))
THEN
278 cff=s1_zeta_obc(i,
isouth,ir)* &
279 & s2_zeta_obc(i,
isouth,ir)
281 cff=cff*rmask(i,jstr-1)
283 s3_zeta_obc(i,
isouth,ir)=cff
287 &
domain(ng)%Northern_Edge(tile))
THEN
289 cff=s1_zeta_obc(i,
inorth,ir)* &
290 & s2_zeta_obc(i,
inorth,ir)
292 cff=cff*rmask(i,jend+1)
294 s3_zeta_obc(i,
inorth,ir)=cff
307 cff=s1_ubar(i,j)*s2_ubar(i,j)
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 s3_ubar_obc(j,
iwest,ir)=cff
334 &
domain(ng)%Eastern_Edge(tile))
THEN
336 cff=s1_ubar_obc(j,
ieast,ir)* &
337 & s2_ubar_obc(j,
ieast,ir)
339 cff=cff*umask(iend+1,j)
341 s3_ubar_obc(j,
ieast,ir)=cff
345 &
domain(ng)%Southern_Edge(tile))
THEN
347 cff=s1_ubar_obc(i,
isouth,ir)* &
348 & s2_ubar_obc(i,
isouth,ir)
350 cff=cff*umask(i,jstr-1)
352 s3_ubar_obc(i,
isouth,ir)=cff
356 &
domain(ng)%Northern_Edge(tile))
THEN
358 cff=s1_ubar_obc(i,
inorth,ir)* &
359 & s2_ubar_obc(i,
inorth,ir)
361 cff=cff*umask(i,jend+1)
363 s3_ubar_obc(i,
inorth,ir)=cff
376 cff=s1_vbar(i,j)*s2_vbar(i,j)
385#ifdef ADJUST_BOUNDARY
392 &
domain(ng)%Western_Edge(tile))
THEN
394 cff=s1_vbar_obc(j,
iwest,ir)* &
395 & s2_vbar_obc(j,
iwest,ir)
397 cff=cff*vmask(istr-1,j)
399 s3_vbar_obc(j,
iwest,ir)=cff
403 &
domain(ng)%Eastern_Edge(tile))
THEN
405 cff=s1_vbar_obc(j,
ieast,ir)* &
406 & s2_vbar_obc(j,
ieast,ir)
408 cff=cff*vmask(iend+1,j)
410 s3_vbar_obc(j,
ieast,ir)=cff
414 &
domain(ng)%Southern_Edge(tile))
THEN
416 cff=s1_vbar_obc(i,
isouth,ir)* &
417 & s2_vbar_obc(i,
isouth,ir)
419 cff=cff*vmask(i,jstr)
421 s3_vbar_obc(i,
isouth,ir)=cff
425 &
domain(ng)%Northern_Edge(tile))
THEN
427 cff=s1_vbar_obc(i,
inorth,ir)* &
428 & s2_vbar_obc(i,
inorth,ir)
430 cff=cff*vmask(i,jend+1)
432 s3_vbar_obc(i,
inorth,ir)=cff
446 cff=s1_sustr(i,j,ir)*s2_sustr(i,j,ir)
455 cff=s1_svstr(i,j,ir)*s2_svstr(i,j,ir)
472 cff=s1_u(i,j,k)*s2_u(i,j,k)
481# ifdef ADJUST_BOUNDARY
488 &
domain(ng)%Western_Edge(tile))
THEN
491 cff=s1_u_obc(j,k,
iwest,ir)* &
492 & s2_u_obc(j,k,
iwest,ir)
494 cff=cff*umask(istr,j)
496 s3_u_obc(j,k,
iwest,ir)=cff
501 &
domain(ng)%Eastern_Edge(tile))
THEN
504 cff=s1_u_obc(j,k,
ieast,ir)* &
505 & s2_u_obc(j,k,
ieast,ir)
507 cff=cff*umask(iend+1,j)
509 s3_u_obc(j,k,
ieast,ir)=cff
514 &
domain(ng)%Southern_Edge(tile))
THEN
517 cff=s1_u_obc(i,k,
isouth,ir)* &
520 cff=cff*umask(i,jstr-1)
522 s3_u_obc(i,k,
isouth,ir)=cff
527 &
domain(ng)%Northern_Edge(tile))
THEN
530 cff=s1_u_obc(i,k,
inorth,ir)* &
533 cff=cff*umask(i,jend+1)
535 s3_u_obc(i,k,
inorth,ir)=cff
548 cff=s1_v(i,j,k)*s2_v(i,j,k)
557# ifdef ADJUST_BOUNDARY
564 &
domain(ng)%Western_Edge(tile))
THEN
567 cff=s1_v_obc(j,k,
iwest,ir)* &
568 & s2_v_obc(j,k,
iwest,ir)
570 cff=cff*vmask(istr-1,j)
572 s3_v_obc(j,k,
iwest,ir)=cff
577 &
domain(ng)%Eastern_Edge(tile))
THEN
580 cff=s1_v_obc(j,k,
ieast,ir)* &
581 & s2_v_obc(j,k,
ieast,ir)
583 cff=cff*vmask(iend+1,j)
585 s3_v_obc(j,k,
ieast,ir)=cff
590 &
domain(ng)%Southern_Edge(tile))
THEN
593 cff=s1_v_obc(i,k,
isouth,ir)* &
596 cff=cff*vmask(i,jstr)
598 s3_v_obc(i,k,
isouth,ir)=cff
603 &
domain(ng)%Northern_Edge(tile))
THEN
606 cff=s1_v_obc(i,k,
inorth,ir)* &
609 cff=cff*vmask(i,jend+1)
611 s3_v_obc(i,k,
inorth,ir)=cff
625 cff=s1_t(i,j,k,it)*s2_t(i,j,k,it)
635# ifdef ADJUST_BOUNDARY
643 &
domain(ng)%Western_Edge(tile))
THEN
646 cff=s1_t_obc(j,k,
iwest,ir,it)* &
647 & s2_t_obc(j,k,
iwest,ir,it)
649 cff=cff*rmask(istr-1,j)
651 s3_t_obc(j,k,
iwest,ir,it)=cff
656 &
domain(ng)%Eastern_Edge(tile))
THEN
659 cff=s1_t_obc(j,k,
ieast,ir,it)* &
660 & s2_t_obc(j,k,
ieast,ir,it)
662 cff=cff*rmask(iend+1,j)
664 s3_t_obc(j,k,
ieast,ir,it)=cff
669 &
domain(ng)%Southern_Edge(tile))
THEN
672 cff=s1_t_obc(i,k,
isouth,ir,it)* &
673 & s2_t_obc(i,k,
isouth,ir,it)
675 cff=cff*rmask(i,jstr-1)
677 s3_t_obc(i,k,
isouth,ir,it)=cff
682 &
domain(ng)%Northern_Edge(tile))
THEN
685 cff=s1_t_obc(i,k,
inorth,ir,it)* &
686 & s2_t_obc(i,k,
inorth,ir,it)
688 cff=cff*rmask(i,jend+1)
690 s3_t_obc(i,k,
inorth,ir,it)=cff
708 cff=s1_tflux(i,j,ir,it)*s2_tflux(i,j,ir,it)
712 s3_tflux(i,j,ir,it)=cff
subroutine, public state_product(ng, tile, model, lbi, ubi, lbj, ubj, lbij, ubij, rmask, umask, vmask, s1_t_obc, s2_t_obc, s3_t_obc, s1_u_obc, s2_u_obc, s3_u_obc, s1_v_obc, s2_v_obc, s3_v_obc, s1_ubar_obc, s2_ubar_obc, s3_ubar_obc, s1_vbar_obc, s2_vbar_obc, s3_vbar_obc, s1_zeta_obc, s2_zeta_obc, s3_zeta_obc, s1_sustr, s2_sustr, s3_sustr, s1_svstr, s2_svstr, s3_svstr, s1_tflux, s2_tflux, s3_tflux, s1_t, s2_t, s3_t, s1_u, s2_u, s3_u, s1_v, s2_v, s3_v, s1_zeta, s2_zeta, s3_zeta)