76 & LBi, UBi, LBj, UBj, &
77 & IminS, ImaxS, JminS, JmaxS, &
79 & pmask_full, rmask_full, &
80 & umask_full, vmask_full, &
82 & IJwaterR, IJwaterU, IJwaterV, &
92# if defined PROPAGATOR && defined CHECKPOINTING && \
93 defined pio_lib && defined distribute
103# if defined PROPAGATOR && defined CHECKPOINTING && defined PIO_LIB
112 integer,
intent(in) :: ng, tile, model
113 integer,
intent(in) :: LBi, UBi, LBj, UBj
114 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
119 integer,
intent(out) :: IJwaterR(LBi:,LBj:)
120 integer,
intent(out) :: IJwaterU(LBi:,LBj:)
121 integer,
intent(out) :: IJwaterV(LBi:,LBj:)
123 real(r8),
intent(in) :: rmask_full(LBi:,LBj:)
124 real(r8),
intent(in) :: pmask_full(LBi:,LBj:)
125 real(r8),
intent(in) :: umask_full(LBi:,LBj:)
126 real(r8),
intent(in) :: vmask_full(LBi:,LBj:)
128 real(r8),
intent(in) :: h(LBi:,LBj:)
132 integer,
intent(out) :: IJwaterR(LBi:UBi,LBj:UBj)
133 integer,
intent(out) :: IJwaterU(LBi:UBi,LBj:UBj)
134 integer,
intent(out) :: IJwaterV(LBi:UBi,LBj:UBj)
136 real(r8),
intent(in) :: rmask_full(LBi:UBi,LBj:UBj)
137 real(r8),
intent(in) :: pmask_full(LBi:UBi,LBj:UBj)
138 real(r8),
intent(in) :: umask_full(LBi:UBi,LBj:UBj)
139 real(r8),
intent(in) :: vmask_full(LBi:UBi,LBj:UBj)
141 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
146# if defined PROPAGATOR && defined CHECKPOINTING && \
147 defined pio_lib && defined distribute
148 logical,
save :: first = .true.
151 integer :: my_Nxyp, my_Nxyr, my_Nxyu, my_Nxyv
153 integer :: my_NwaterR, my_NwaterU, my_NwaterV
157 integer :: Imin, Imax, Jmin, Jmax
159 integer :: Uoff, Voff
160 integer :: NSUB, Npts, i, ic, ij, j
163 integer :: block_size
165 real(r8),
dimension(3) :: wp_buffer
166 character (len=3),
dimension(3) :: wp_handle
168# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
169 real(r8),
dimension(4) :: io_buffer
170 character (len=3),
dimension(4) :: io_handle
173# if defined READ_WATER || defined PROPAGATOR
174 real(r8),
dimension((Lm(ng)+2)*(Mm(ng)+2)) :: mask
177# include "set_bounds.h"
179# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
194 IF (pmask_full(i,j).gt.0.0_r8) my_nxyp=my_nxyp+1
195 IF (rmask_full(i,j).gt.0.0_r8) my_nxyr=my_nxyr+1
196 IF (umask_full(i,j).gt.0.0_r8) my_nxyu=my_nxyu+1
197 IF (vmask_full(i,j).gt.0.0_r8) my_nxyv=my_nxyv+1
204 IF (
domain(ng)%Western_Edge(tile))
THEN
206 IF (rmask_full(istr-1,j).gt.0.0_r8) my_nxyr=my_nxyr+1
207 IF (vmask_full(istr-1,j).gt.0.0_r8) my_nxyv=my_nxyv+1
210 IF (
domain(ng)%Eastern_Edge(tile))
THEN
212 IF (pmask_full(iend+1,j).gt.0.0_r8) my_nxyp=my_nxyp+1
213 IF (rmask_full(iend+1,j).gt.0.0_r8) my_nxyr=my_nxyr+1
214 IF (umask_full(iend+1,j).gt.0.0_r8) my_nxyu=my_nxyu+1
215 IF (vmask_full(iend+1,j).gt.0.0_r8) my_nxyv=my_nxyv+1
218 IF (
domain(ng)%Southern_Edge(tile))
THEN
220 IF (rmask_full(i,jstr-1).gt.0.0_r8) my_nxyr=my_nxyr+1
221 IF (umask_full(i,jstr-1).gt.0.0_r8) my_nxyu=my_nxyu+1
224 IF (
domain(ng)%Northern_Edge(tile))
THEN
226 IF (pmask_full(i,jend+1).gt.0.0_r8) my_nxyp=my_nxyp+1
227 IF (rmask_full(i,jend+1).gt.0.0_r8) my_nxyr=my_nxyr+1
228 IF (umask_full(i,jend+1).gt.0.0_r8) my_nxyu=my_nxyu+1
229 IF (vmask_full(i,jend+1).gt.0.0_r8) my_nxyv=my_nxyv+1
232 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
233 IF (rmask_full(istr-1,jstr-1).gt.0.0_r8) my_nxyr=my_nxyr+1
235 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
236 IF (rmask_full(iend+1,jstr-1).gt.0.0_r8) my_nxyr=my_nxyr+1
237 IF (umask_full(iend+1,jstr-1).gt.0.0_r8) my_nxyu=my_nxyu+1
239 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
240 IF (rmask_full(istr-1,jend+1).gt.0.0_r8) my_nxyr=my_nxyr+1
241 IF (vmask_full(istr-1,jend+1).gt.0.0_r8) my_nxyv=my_nxyv+1
243 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
244 IF (pmask_full(iend+1,jend+1).gt.0.0_r8) my_nxyp=my_nxyp+1
245 IF (rmask_full(iend+1,jend+1).gt.0.0_r8) my_nxyr=my_nxyr+1
246 IF (umask_full(iend+1,jend+1).gt.0.0_r8) my_nxyu=my_nxyu+1
247 IF (vmask_full(iend+1,jend+1).gt.0.0_r8) my_nxyv=my_nxyv+1
263 IF (rmask_full(i,j).gt.0.0_r8)
THEN
264 my_nwaterr=my_nwaterr+1
267 my_nwaterr=my_nwaterr+1
272 IF (umask_full(i,j).gt.0.0_r8)
THEN
273 my_nwateru=my_nwateru+1
276 my_nwateru=my_nwateru+1
283 IF (vmask_full(i,j).gt.0.0_r8)
THEN
284 my_nwaterv=my_nwaterv+1
287 my_nwaterv=my_nwaterv+1
298 IF (
domain(ng)%SouthWest_Corner(tile).and. &
299 &
domain(ng)%NorthEast_Corner(tile))
THEN
307# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
319# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
334# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
335 io_buffer(1)=real(
nxyp(ng),r8)
336 io_buffer(2)=real(
nxyr(ng),r8)
337 io_buffer(3)=real(
nxyu(ng),r8)
338 io_buffer(4)=real(
nxyv(ng),r8)
343 CALL mp_reduce (ng, model, 4, io_buffer, io_handle)
344 nxyp(ng)=int(io_buffer(1))
345 nxyr(ng)=int(io_buffer(2))
346 nxyu(ng)=int(io_buffer(3))
347 nxyv(ng)=int(io_buffer(4))
350 wp_buffer(1)=real(
nwaterr(ng),r8)
351 wp_buffer(2)=real(
nwateru(ng),r8)
352 wp_buffer(3)=real(
nwaterv(ng),r8)
356 CALL mp_reduce (ng, model, 3, wp_buffer, wp_handle)
362# if defined MASKING && (defined READ_WATER || defined WRITE_WATER)
376# if defined FORCING_SV || \
377 defined so_semi || defined stochastic_opt
446 10
FORMAT (/,
' Size of FULL state arrays for propagator of grid ', &
447 & i2.2,
', Mstate = ', i10,/,38x, &
448 &
'NODE partition, Nstate = ', i10,/,/, &
449 & 9x,
'Node',7x,
'Nstr',7x,
'Nend',7x,
'Size',/)
452 j=min(
mstate(ng),i+block_size-1)
453 WRITE (
stdout,20) ic, i, j, j-i+1
454 20
FORMAT (11x, i2, 3(1x,i10))
467 10
FORMAT (
' Size of FULL state arrays for propagator of grid ', &
468 & i2.2,
', Mstate = ', i10,/)
473# if defined PIO_LIB && defined DISTRIBUTE && defined CHECKPOINTING
481 IF (ng.eq.
ngrids) first=.false.
505# if ((defined READ_WATER && defined DISTRIBUTE) || \
506 defined propagator) && defined masking
535 & rmask_full, rmask_full, npts, mask, .false.)
545 mask(ic)=rmask_full(i,j)
550# if defined READ_WATER && defined DISTRIBUTE
556 IF (mask(ij).gt.0.0_r8)
THEN
583 IF ((mask(ij).gt.0.0_r8).and. &
584 & (imin.le.i).and.(i.le.imax).and. &
585 & (jmin.le.j).and.(j.le.jmax))
THEN
598 IF ((
rilb(ng).le.i).and.(i.le.
riub(ng)).and. &
599 & (
rjlb(ng).le.j).and.(j.le.
rjub(ng)))
THEN
600 IF (mask(ij).gt.0.0_r8)
THEN
601 ijwaterr(i,j)=int(mask(ij))
610# if defined READ_WATER && defined DISTRIBUTE
616 & pmask_full, pmask_full, npts, mask, .false.)
623 IF (mask(ij).gt.0.0_r8)
THEN
637 & umask_full, umask_full, npts, mask, .false.)
647 mask(ic)=umask_full(i,j)
652# if defined READ_WATER && defined DISTRIBUTE
658 IF (mask(ij).gt.0.0_r8)
THEN
685 IF ((mask(ij).gt.0.0_r8).and. &
686 & (imin.le.i).and.(i.le.imax).and. &
687 & (jmin.le.j).and.(j.le.jmax))
THEN
700 IF ((
uilb(ng).le.i).and.(i.le.
uiub(ng)).and. &
701 & (
ujlb(ng).le.j).and.(j.le.
ujub(ng)))
THEN
702 IF (mask(ij).gt.0.0_r8)
THEN
703 ijwateru(i,j)=int(mask(ij))
718 & vmask_full, vmask_full, npts, mask, .false.)
728 mask(ic)=vmask_full(i,j)
733# if defined READ_WATER && defined DISTRIBUTE
739 IF (mask(ij).gt.0.0_r8)
THEN
766 IF ((mask(ij).gt.0.0_r8).and. &
767 & (imin.le.i).and.(i.le.imax).and. &
768 & (jmin.le.j).and.(j.le.jmax))
THEN
781 IF ((
vilb(ng).le.i).and.(i.le.
viub(ng)).and. &
782 & (
vjlb(ng).le.j).and.(j.le.
vjub(ng)))
THEN
783 IF (mask(ij).gt.0.0_r8)
THEN
784 ijwaterv(i,j)=int(mask(ij))