222
223
225
226
227
228 integer, intent(in) :: ng, model, tindex
229 integer, intent(in) :: LBij, UBij, Nrec
230
231 real(dp), intent(in) :: Ascl
232
233 character (len=*), intent(in) :: ncname
234 character (len=*), intent(in) :: ncvname
235
236# ifdef ASSUMED_SHAPE
237 real(r8), intent(in) :: Abry(LBij:,:,:)
238# else
239 real(r8), intent(in) :: Abry(LBij:UBij,4,Nrec)
240# endif
241 real(r8), intent(out), optional :: MinValue
242 real(r8), intent(out), optional :: MaxValue
243
244 TYPE (File_desc_t), intent(inout) :: pioFile
245 TYPE (IO_Desc_t), intent(inout) :: pioDesc
246 TYPE (My_VarDesc), intent(inout) :: pioVar
247
248
249
250 logical, dimension(4) :: bounded
251
252 integer :: bc, i, ib, ic, ir, j, rc
253 integer :: dkind, gtype, tile
254 integer :: IorJ, Imin, Imax, Jmin, Jmax, Npts
255 integer :: Istr, Iend, Jstr, Jend
256
257 integer, dimension(4) :: start, total
258
259 integer :: status
260
261 real(r8), parameter :: Aspv = 0.0_r8
262
263 real(r8), dimension((UBij-LBij+1)*4*Nrec) :: Awrk
264
265
266
267
268
269 status=pio_noerr
270
271
272
273 tile=myrank
274 dkind=piovar%dkind
275 gtype=piovar%gtype
276
277 SELECT CASE (gtype)
278 CASE (p2dvar, p3dvar)
279 imin=bounds(ng)%Istr (tile)
280 imax=bounds(ng)%Iend (tile)
281 jmin=bounds(ng)%Jstr (tile)
282 jmax=bounds(ng)%Jend (tile)
283 CASE (r2dvar, r3dvar)
284 imin=bounds(ng)%IstrR(tile)
285 imax=bounds(ng)%IendR(tile)
286 jmin=bounds(ng)%JstrR(tile)
287 jmax=bounds(ng)%JendR(tile)
288 CASE (u2dvar, u3dvar)
289 imin=bounds(ng)%Istr (tile)
290 imax=bounds(ng)%IendR(tile)
291 jmin=bounds(ng)%JstrR(tile)
292 jmax=bounds(ng)%JendR(tile)
293 CASE (v2dvar, v3dvar)
294 imin=bounds(ng)%IstrR(tile)
295 imax=bounds(ng)%IendR(tile)
296 jmin=bounds(ng)%Jstr (tile)
297 jmax=bounds(ng)%JendR(tile)
298 CASE DEFAULT
299 imin=bounds(ng)%IstrR(tile)
300 imax=bounds(ng)%IendR(tile)
301 jmin=bounds(ng)%JstrR(tile)
302 jmax=bounds(ng)%JendR(tile)
303 END SELECT
304
305 iorj=iobounds(ng)%IorJ
306 npts=iorj*4*nrec
307
308
309
310 istr=bounds(ng)%Istr(tile)
311 iend=bounds(ng)%Iend(tile)
312 jstr=bounds(ng)%Jstr(tile)
313 jend=bounds(ng)%Jend(tile)
314
315
316
317 bounded(iwest )=domain(ng)%Western_Edge (tile)
318 bounded(ieast )=domain(ng)%Eastern_Edge (tile)
319 bounded(isouth)=domain(ng)%Southern_Edge(tile)
320 bounded(inorth)=domain(ng)%Northern_Edge(tile)
321
322
323
324 start(1)=1
325 total(1)=iorj
326 start(2)=1
327 total(2)=4
328 start(3)=1
329 total(3)=nrec
330 start(4)=tindex
331 total(4)=1
332
333
334
335
336
337 awrk=aspv
338
339 DO ir=1,nrec
340 rc=(ir-1)*iorj*4
341 DO ib=1,4
342 IF (bounded(ib)) THEN
343 bc=(ib-1)*iorj+rc
344 IF ((ib.eq.iwest).or.(ib.eq.ieast)) THEN
345 DO j=jmin,jmax
346 ic=1+(j-lbij)+bc
347 awrk(ic)=abry(j,ib,ir)*ascl
348# ifdef POSITIVE_ZERO
349 IF (abs(awrk(ic)).eq.0.0_r8) THEN
350 awrk(ic)=0.0_r8
351 END IF
352# endif
353 END DO
354 ELSE IF ((ib.eq.isouth).or.(ib.eq.inorth)) THEN
355 DO i=imin,imax
356 ic=1+(i-lbij)+bc
357 awrk(ic)=abry(i,ib,ir)*ascl
358# ifdef POSITIVE_ZERO
359 IF (abs(awrk(ic)).eq.0.0_r8) THEN
360 awrk(ic)=0.0_r8
361 END IF
362# endif
363 END DO
364 END IF
365 END IF
366 END DO
367 END DO
368
369
370
371 CALL mp_collect (ng, model, npts, aspv, awrk)
372
373
374
375
376
377 IF (PRESENT(minvalue)) THEN
378 minvalue=spval
379 maxvalue=-spval
380 DO i=1,npts
381 IF (abs(awrk(i)).lt.spval) THEN
382 minvalue=min(minvalue,awrk(i))
383 maxvalue=max(maxvalue,awrk(i))
384 END IF
385 END DO
386 END IF
387
388
389
390
391
392 status=pio_put_var(piofile, piovar%vd, start, total, awrk)
393
394 RETURN