ROMS
Loading...
Searching...
No Matches
set_pio.F
Go to the documentation of this file.
1#include "cppdefs.h"
3#if defined PIO_LIB && defined DISTRIBUTE
4!
5!git $Id$
6!================================================== Hernan G. Arango ===
7! Copyright (c) 2002-2025 The ROMS Group !
8! Licensed under a MIT/X style license !
9! See License_ROMS.md !
10!=======================================================================
11! !
12! This module contains several routines initializes and configures !
13! Parallel-IO (PIO) in ROMS. It uses the SCORPIO library which is !
14! based on the PIO library developed at NCAR. !
15! !
16!=======================================================================
17!
18 USE pio
19!
20 USE mod_kinds
21 USE mod_param
22 USE mod_parallel
24 USE mod_iounits
25# if defined PROPAGATOR && defined CHECKPOINTING
26 USE mod_storage
27# endif
28!
29# if defined SSH_TIDES || defined UV_TIDES
30 USE mod_stepping, ONLY : ntc
31# endif
32 USE strings_mod, ONLY : founderror
33!
34 implicit none
35!
36 PUBLIC :: initialize_pio
37 PUBLIC :: finalize_pio
38 PUBLIC :: field_iodecomp
39# if defined PROPAGATOR && defined CHECKPOINTING
40 PUBLIC :: state_iodecomp
41# endif
42 PUBLIC :: set_iodecomp
43# ifdef ASYNCHRONOUS_SCORPIO
44 PUBLIC :: set_pio_async
45# endif
46!
47 CONTAINS
48!
49 SUBROUTINE initialize_pio
50!
51!***********************************************************************
52! !
53! Initializes the PIO subsystem. It sets PIO decomposition for all !
54! ROMS variables. !
55! !
56!***********************************************************************
57!
58! Local variable declarations.
59!
60# ifdef ASYNCHRONOUS_PIO
61 logical, allocatable :: lranks(:)
62!
63 integer :: computesize
64
65 integer, allocatable :: compute_comm(:,:), io_comm(:)
66 integer, allocatable :: compute_ranks(:,:), io_ranks(:)
67# endif
68 integer :: myerror
69 integer :: i, ic, ng
70!
71 character (len=*), parameter :: myfile = &
72 & __FILE__//", initialize_pio"
73!
74!-----------------------------------------------------------------------
75! Initialize PIO and get IO system descriptor. It uses collective
76! communicatios.
77!-----------------------------------------------------------------------
78!
79 IF (.not.allocated(piosystem)) THEN
80 allocate ( piosystem(npiocomps,ngrids) )
81 END IF
82!
83! Set PIO internal level of debug information. The default value is 0,
84! allowed values 0-6.
85!
86 IF (pio_debug.gt.0) THEN
87 CALL pio_setdebuglevel (pio_debug)
88 END IF
89
90# if defined ASYNCHRONOUS_PIO
91!
92!-----------------------------------------------------------------------
93! If NCAR/UNIDATA PIO library, set the ranks of the computational and
94! IO processes with respect the initial (peer) communicator. Notice
95! that the communicator is natively split inside "PIO_init". Therefore,
96! the I/O processes do not return from the call. Instead go to an
97! internal loop and wait to receive further instructions from the
98! computational processes. I think that this is a better strategy.
99!-----------------------------------------------------------------------
100!
101! Set peer communicator as the initial ROMS communicator.
102!
103 peer_comm_world=ocn_comm_world
104 peersize=numthreads
105 peerrank=myrank
106 computesize=peersize-pio_numiotasks
107!
108! Allocate and initialize local arrays.
109!
110 IF (.not.allocated(compute_comm)) THEN
111 allocate ( compute_comm(npiocomps,ngrids) )
112 compute_comm=mpi_comm_null
113 END IF
114 IF (.not.allocated(io_comm)) THEN
115 allocate ( io_comm(ngrids) )
116 io_comm=mpi_comm_null
117 END IF
118!
119 IF (.not.allocated(lranks)) THEN
120 allocate ( lranks(0:peersize-1) )
121 lranks(0:peersize-1)=.true.
122 END IF
123 IF (.not.allocated(compute_ranks)) THEN
124 allocate ( compute_ranks(computesize,npiocomps) )
125 compute_ranks=-1
126 END IF
127 IF (.not.allocated(io_ranks)) THEN
128 allocate ( io_ranks(pio_numiotasks) )
129 io_ranks=-1
130 END IF
131!
132! Set the ranks of the dedicated I/O processes with respect the peer
133! communicator.
134!
135 ic=pio_base
136 io_ranks(1)=ic
137 lranks(ic)=.false.
138 DO i=2,pio_numiotasks
139 IF ((ic+pio_stride).le.(peersize-1)) THEN
140 ic=ic+pio_stride
141 io_ranks(i)=ic
142 lranks(ic)=.false.
143 END IF
144 END DO
145 WRITE (cioranks,'(*(i0,1x))') io_ranks
146!
147! Set the ranks of the computational processes with respect the peer
148! communicator.
149!
150 ic=0
151 DO i=0,peersize-1
152 IF (lranks(i)) THEN
153 ic=ic+1
154 compute_ranks(ic,ipioroms)=i
155 END IF
156 END DO
157 WRITE (ccompranks,'(*(i0,1x))') compute_ranks
158!
159! Create a new IO system for asynchronous or synchronous I/O. The
160! asynchronous I/O is only possible PIO type ("io_pio") files.
161!
162!! IF ((inp_lib.eq.io_pio).and.(out_lib.eq.io_pio)) THEN
163 IF (out_lib.eq.io_pio) THEN
164 DO ng=1,ngrids
165 CALL pio_init (piosystem(ipioroms:,ng), &
166 & peer_comm_world, &
167 & (/computesize/), &
168 & compute_ranks, &
169 & io_ranks, &
170 & pio_rearranger, &
171 & compute_comm(ipioroms:,ng), &
172 & io_comm(ng))
173 END DO
174!
175! Initialize ROMS kernel communicators.
176!
177 ng=1
178 ocn_comm_world=compute_comm(ipioroms,ng)
179 io_comm_world =io_comm(ng)
180!
181! Reset ROMS communicator parameters.
182!
183 CALL mpi_comm_size (ocn_comm_world, numthreads, myerror)
184 CALL mpi_comm_rank (ocn_comm_world, myrank, myerror)
185!
187# ifdef PARALLEL_IO
188 inpthread=.true.
189 outthread=.true.
190# else
191 IF (myrank.eq.0) THEN
192 inpthread=.true.
193 outthread=.true.
194 ELSE
195 inpthread=.false.
196 outthread=.false.
197 END IF
198# endif
199!
200! Deallocate local arrays.
201!
202 IF (allocated(compute_comm)) deallocate (compute_comm)
203 IF (allocated(io_comm)) deallocate (io_comm)
204 IF (allocated(lranks)) deallocate (lranks)
205 IF (allocated(compute_ranks)) deallocate (compute_ranks)
206 IF (allocated(io_ranks)) deallocate (io_ranks)
207!
208! Otherwise, do synchronous I/O.
209!
210 ELSE
211 DO ng=1,ngrids
212 CALL pio_init (myrank, &
213 & ocn_comm_world, &
214 & pio_numiotasks, &
215 & pio_aggregator, &
216 & pio_stride, &
217 & pio_rearranger, &
218 & piosystem(ipioroms,ng), &
219 & base = pio_base)
220 END DO
221 END IF
222
223# elif defined ASYNCHRONOUS_SCORPIO
224!
225!-----------------------------------------------------------------------
226! If SCORPIO library, set the ranks of the computational and I/O
227! IO processes with respect the initial (peer) communicator. Unlike
228! the NCAR/UNIDATA version, there is not a version to split the
229! communicator internally in the call to "PIO_init". We need to
230! split the communicator previously by calling "set_pio_async".
231! (HGA: this option does not work yet).
232!-----------------------------------------------------------------------
233!
234 DO ng=1,ngrids
235!! IF ((inp_lib.eq.io_pio).and.(out_lib.eq.io_pio)) THEN
236 IF (out_lib.eq.io_pio) THEN
237 CALL pio_init (piosystem(ipioroms:,ng), &
238 & peer_comm_world, &
239 & (/ocn_comm_world/), &
240 & io_comm_world, &
242 ELSE
243 CALL pio_init (myrank, &
244 & ocn_comm_world, &
245 & pio_numiotasks, &
246 & pio_aggregator, &
247 & pio_stride, &
248 & pio_rearranger, &
249 & piosystem(ipioroms,ng), &
250 & base = pio_base)
251 END IF
252 END DO
253
254# else
255!
256!-----------------------------------------------------------------------
257! Initialize synchronous PIO system.
258!-----------------------------------------------------------------------
259!
260 DO ng=1,ngrids
261 CALL pio_init (myrank, &
262 & ocn_comm_world, &
263 & pio_numiotasks, &
264 & pio_aggregator, &
265 & pio_stride, &
266 & pio_rearranger, &
267 & piosystem(ipioroms,ng), &
268 & base = pio_base)
269 END DO
270# endif
271!
272!-----------------------------------------------------------------------
273! Set PIO rearrangement communication options.
274!-----------------------------------------------------------------------
275!
276 lpioinitialized=.true.
277!
278! The rearranger communication type "pio_rearr_comm" has two choices:
279!
280! PIO_rearr_comm_p2p Point to point (send/recive)
281! PIO_rearr_comm_coll Collective (gather/scatter)
282!
283! The rearranger communication flow control direction "pio_rearr_fcd"
284! has four choices:
285!
286! PIO_rearr_comm_fc_2d_enable COMM to IO processes and viceversa
287! PIO_rearr_comm_fc_1d_comp2io COMM to IO processes only
288! PIO_rearr_comm_fc_1d_io2comp IO to COMM processes only
289! PIO_rearr_comm_fc_2d_disable Disable flow control
290!
291! Compute to IO (C2I) processes:
292!
293! pio_rearr_C2I_HS Enable handshake (true/false)
294! pio_rearr_C2I_iS Enable Isends (true/false)
295! pio_rearr_C2I_PR Maximum pending requests
296!
297! IO to compute (I2C) processes:
298!
299! pio_rearr_I2C_HS Enable handshake (true/false)
300! pio_rearr_I2C_iS Enable Isends (true/false)
301! pio_rearr_I2C_PR Maximum pending requests
302!
303! Use PIO_REARR_COMM_UNLIMITED_PEND_REQ for unlimited number of
304! requests.
305!
306 DO ng=1,ngrids
307 myerror=pio_set_rearr_opts(piosystem(ipioroms,ng), &
309 & pio_rearr_fcd, &
316 IF (founderror(myerror, pio_noerr, __line__, myfile)) RETURN
317 END DO
318!
319 RETURN
320 END SUBROUTINE initialize_pio
321!
322 SUBROUTINE finalize_pio
323!
324!***********************************************************************
325! !
326! Finalizes the PIO subsystem. It frees all the storage memory !
327! associated with the IO decomposition. !
328! !
329!***********************************************************************
330!
331! Local variable declarations.
332!
333 integer :: i, ng, status
334!
335!-----------------------------------------------------------------------
336! Deallocate storage memory associated with IO decomposition.
337!-----------------------------------------------------------------------
338!
339 IF (lpioinitialized) THEN
340!
341! Single precision decomposition descriptors.
342!
343 DO ng=1,ngrids
344 DO i=1,npiocomps
345 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_p2dvar(ng))
346# ifdef ADJUST_BOUNDARY
347 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r2dobc(ng))
348 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u2dobc(ng))
349 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v2dobc(ng))
350# endif
351 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r2dvar(ng))
352 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u2dvar(ng))
353 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v2dvar(ng))
354# if defined SSH_TIDES || defined UV_TIDES
355 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_rtides(ng))
356# endif
357# ifdef SOLVE3D
358# ifdef SEDIMENT
359 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_b3dvar(ng))
360# endif
361# if defined DIAGNOSTICS_BIO && defined ECOSIM
362 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_l3dvar(ng))
363 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_l4dvar(ng))
364# endif
365 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_p3dvar(ng))
366# ifdef ADJUST_BOUNDARY
367 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r3dobc(ng))
368 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u3dobc(ng))
369 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v3dobc(ng))
370# endif
371 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r3dvar(ng))
372 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u3dvar(ng))
373 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v3dvar(ng))
374 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_w3dvar(ng))
375# endif
376 END DO
377 END DO
378!
379! Double precision decomposition descriptors.
380!
381 DO ng=1,ngrids
382 DO i=1,npiocomps
383 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_p2dvar(ng))
384# ifdef ADJUST_BOUNDARY
385 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r2dobc(ng))
386 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u2dobc(ng))
387 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v2dobc(ng))
388# endif
389 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r2dvar(ng))
390 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u2dvar(ng))
391 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v2dvar(ng))
392# if defined SSH_TIDES || defined UV_TIDES
393 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_rtides(ng))
394# endif
395# ifdef SOLVE3D
396# ifdef SEDIMENT
397 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_b3dvar(ng))
398# endif
399# if defined DIAGNOSTICS_BIO && defined ECOSIM
400 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_l3dvar(ng))
401 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_l4dvar(ng))
402# endif
403 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_p3dvar(ng))
404# ifdef ADJUST_BOUNDARY
405 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r3dobc(ng))
406 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u3dobc(ng))
407 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v3dobc(ng))
408# endif
409 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r3dvar(ng))
410 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u3dvar(ng))
411 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v3dvar(ng))
412 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_w3dvar(ng))
413# endif
414 END DO
415 END DO
416!
417! Special restart and harmonics single precision decomposition
418! descriptors.
419!
420 DO ng=1,ngrids
421 DO i=1,npiocomps
422 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_rubar(ng))
423 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_rvbar(ng))
424 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_rzeta(ng))
425 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_ubar(ng))
426 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_vbar(ng))
427 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_zeta(ng))
428# ifdef SOLVE3D
429 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_ruvel(ng))
430 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_rvvel(ng))
431# if defined GLS_MIXING || defined MY25_MIXING
432 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_tkevar(ng))
433# endif
434 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_trcvar(ng))
435 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_uvel(ng))
436 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_vvel(ng))
437# endif
438# if defined AVERAGES && defined AVERAGES_DETIDE && \
439 (defined ssh_tides || defined uv_tides)
440 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r2dhar(ng))
441 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u2dhar(ng))
442 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v2dhar(ng))
443# ifdef SOLVE3D
444 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_r3dhar(ng))
445 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_u3dhar(ng))
446 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_v3dhar(ng))
447# endif
448# endif
449 END DO
450 END DO
451!
452! Special restart and harmonics double precision decomposition
453! descriptors.
454!
455 DO ng=1,ngrids
456 DO i=1,npiocomps
457 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_rubar(ng))
458 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_rvbar(ng))
459 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_rzeta(ng))
460 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_ubar(ng))
461 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_vbar(ng))
462 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_zeta(ng))
463# ifdef SOLVE3D
464 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_ruvel(ng))
465 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_rvvel(ng))
466# if defined GLS_MIXING || defined MY25_MIXING
467 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_tkevar(ng))
468# endif
469 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_trcvar(ng))
470 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_uvel(ng))
471 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_vvel(ng))
472# endif
473# if defined AVERAGES && defined AVERAGES_DETIDE && \
474 (defined ssh_tides || defined uv_tides)
475 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r2dhar(ng))
476 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u2dhar(ng))
477 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v2dhar(ng))
478# ifdef SOLVE3D
479 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_r3dhar(ng))
480 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_u3dhar(ng))
481 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_v3dhar(ng))
482# endif
483# endif
484# if defined PROPAGATOR && defined CHECKPOINTING
485!
486! I/O decomposition descriptors for GST single and double precision
487! state propagator data.
488!
489 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_bvec(ng))
490 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_resid(ng))
491 CALL pio_freedecomp (piosystem(i,ng), iodesc_sp_sworkd(ng))
492!
493 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_bvec(ng))
494 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_resid(ng))
495 CALL pio_freedecomp (piosystem(i,ng), iodesc_dp_sworkd(ng))
496# endif
497 END DO
498 END DO
499!
500!-----------------------------------------------------------------------
501! Shut down and clean up any memory associated with the PIO library.
502!-----------------------------------------------------------------------
503!
504 DO ng=1,ngrids
505 DO i=1,npiocomps
506 CALL pio_finalize (piosystem(i,ng), status)
507 END DO
508 END DO
509 END IF
510!
511 RETURN
512 END SUBROUTINE finalize_pio
513!
514 SUBROUTINE field_iodecomp (ng, ioSystem, ioType, ioDesc, &
515 & gtype, ndims, LBk, UBk, LBt, UBt)
516!
517!***********************************************************************
518! !
519! Sets the IO decomposition descriptor for ROMS field variable types. !
520! !
521! On Input: !
522! !
523! ng Nested grid number (integer) !
524! ioSystem PIO system descriptor (TYPE IOSystem_desc_t) !
525! ioType PIO kind variable type (integer) !
526! gtype Variable C-grid type (integer) !
527! ndims Number of state variable dimensions (integer) !
528! LBk K- or 3rd-dimension Lower bound (integer, OPTIONAL) !
529! UBk K- or 3rd-dimension Upper bound (integer, OPTIONAL) !
530! LBt T- or 4th-dimension Lower bound (integer, OPTIONAL) !
531! UBt T- or 4th-dimension Upper bound (integer, OPTIONAL) !
532! !
533! On Output: !
534! !
535! ioDesc IO decomposition descriptor (TYPE io_desc_t) !
536! !
537!***********************************************************************
538!
539! Imported variable declarations.
540!
541 integer, intent(in) :: ng, iotype, gtype, ndims
542
543 integer, intent(in), optional :: lbk, ubk
544 integer, intent(in), optional :: lbt, ubt
545!
546 TYPE (iosystem_desc_t), intent(in) :: iosystem
547 TYPE (io_desc_t), intent(out) :: iodesc
548!
549! Local variable declarations.
550!
551 logical :: lboundary
552!
553 integer :: cgrid, ghost
554 integer :: i, ic, j, jc, k, kc, l, lc, np
555 integer :: is, ie, js, je
556 integer :: imin, imax, jmin, jmax
557 integer :: ioff, joff, koff, loff
558 integer :: ilen, isize, jlen, jsize, klen, ksize, llen, lsize
559 integer :: ijlen, ijklen
560 integer :: my_size
561!
562 integer(PIO_Offset_kind), allocatable :: map_decomp(:)
563!
564!-----------------------------------------------------------------------
565! Set the PIO computational decomposition for ROMS C-type variables
566! and array rank. It is based on variable kind type and its mapping
567! from storage order to memory order.
568!-----------------------------------------------------------------------
569!
570 lboundary=.false.
571
572! Get GLOBAL lower and upper bounds for each variable type in input
573! or ouput NetCDF files.
574!
575 SELECT CASE (gtype)
576 CASE (r2dobc, u2dobc, v2dobc)
577 lboundary=.true.
578 cgrid=2
579 is=0
580 ie=iobounds(ng) % IorJ
581 js=1
582 je=4
583 ioff=1
584 joff=0
585 CASE (r3dobc, u3dobc, v3dobc)
586 lboundary=.true.
587 cgrid=2
588 is=0
589 ie=iobounds(ng) % IorJ
590 js=1
591 je=4
592 ioff=1
593 joff=0
594 CASE (p2dvar, p3dvar)
595 cgrid=1
596 is=iobounds(ng) % ILB_psi
597 ie=iobounds(ng) % IUB_psi
598 js=iobounds(ng) % JLB_psi
599 je=iobounds(ng) % JUB_psi
600 ioff=0
601 joff=1
602 CASE (r2dvar, b3dvar, l3dvar, l4dvar, r3dvar)
603 cgrid=2
604 is=iobounds(ng) % ILB_rho
605 ie=iobounds(ng) % IUB_rho
606 js=iobounds(ng) % JLB_rho
607 je=iobounds(ng) % JUB_rho
608 ioff=1
609 joff=0
610 CASE (u2dvar, u3dvar)
611 cgrid=3
612 is=iobounds(ng) % ILB_u
613 ie=iobounds(ng) % IUB_u
614 js=iobounds(ng) % JLB_u
615 je=iobounds(ng) % JUB_u
616 ioff=0
617 joff=0
618 CASE (v2dvar, v3dvar)
619 cgrid=4
620 is=iobounds(ng) % ILB_v
621 ie=iobounds(ng) % IUB_v
622 js=iobounds(ng) % JLB_v
623 je=iobounds(ng) % JUB_v
624 ioff=1
625 joff=1
626 CASE (w3dvar)
627 cgrid=2
628 is=iobounds(ng) % ILB_rho
629 ie=iobounds(ng) % IUB_rho
630 js=iobounds(ng) % JLB_rho
631 je=iobounds(ng) % JUB_rho
632 ioff=1
633 joff=0
634 END SELECT
635!
636! Get GLOBAL length for each variable dimension.
637!
638 ilen=ie-is+1
639 jlen=je-js+1
640 ijlen=ilen*jlen
641!
642 IF (PRESENT(lbk)) THEN
643 IF (lbk.eq.0) THEN
644 koff=0
645 ELSE
646 koff=1
647 END IF
648 klen=ubk-lbk+1
649 ksize=klen
650 ijklen=ijlen*klen
651 END IF
652!
653 IF (PRESENT(lbt)) THEN
654 IF (lbt.eq.0) THEN
655 loff=0
656 ELSE
657 loff=1
658 END IF
659 llen=ubt-lbt+1
660 lsize=llen
661 END IF
662!
663! Starting/ending I- and J-indices for each decomposition tile
664! according to C-grid locatation, excluding ghost points.
665!
666 IF (lboundary) THEN
667 imin=is
668 imax=ie
669 jmin=js
670 jmax=je
671 ELSE
672 ghost=0
673 imin=bounds(ng) % Imin(cgrid,ghost,myrank)
674 imax=bounds(ng) % Imax(cgrid,ghost,myrank)
675 jmin=bounds(ng) % Jmin(cgrid,ghost,myrank)
676 jmax=bounds(ng) % Jmax(cgrid,ghost,myrank)
677 END IF
678!
679! Allocate 1D array for mapping of the storage order of the variable to
680! its memory order.
681!
682 isize=imax-imin+1
683 jsize=jmax-jmin+1
684!
685 IF (ndims.eq.2) THEN
686 my_size=isize*jsize
687 ELSE IF (ndims.eq.3) THEN
688 my_size=isize*jsize*ksize
689 ELSE IF (ndims.eq.4) THEN
690 my_size=isize*jsize*ksize*lsize
691 END IF
692!
693 IF (.not.ALLOCATED(map_decomp)) THEN
694 allocate ( map_decomp(my_size) )
695 END IF
696 map_decomp=0_pio_offset_kind
697!
698! Set variable decomposition mapping.
699!
700 IF (ndims.eq.2) THEN
701 np=0
702 DO j=jmin,jmax
703 jc=(j-joff)*ilen
704 DO i=imin,imax
705 np=np+1
706 ic=i+ioff+jc
707 map_decomp(np)=ic
708 END DO
709 END DO
710 ELSE IF (ndims.eq.3) THEN
711 np=0
712 DO k=lbk,ubk
713 kc=(k-koff)*ijlen
714 DO j=jmin,jmax
715 jc=(j-joff)*ilen+kc
716 DO i=imin,imax
717 np=np+1
718 ic=i+ioff+jc
719 map_decomp(np)=ic
720 END DO
721 END DO
722 END DO
723 ELSE IF (ndims.eq.4) THEN
724 np=0
725 DO l=lbt,ubt
726 lc=(l-loff)*ijklen
727 DO k=lbk,ubk
728 kc=(k-koff)*ijlen+lc
729 DO j=jmin,jmax
730 jc=(j-joff)*ilen+kc
731 DO i=imin,imax
732 np=np+1
733 ic=i+ioff+jc
734 map_decomp(np)=ic
735 END DO
736 END DO
737 END DO
738 END DO
739 END IF
740!
741! Set IO decomposition descriptor
742!
743 IF (ndims.eq.2) THEN
744 CALL pio_initdecomp (iosystem, iotype, (/ilen,jlen/), &
745 & map_decomp, iodesc)
746 ELSE IF (ndims.eq.3) THEN
747 CALL pio_initdecomp (iosystem, iotype, (/ilen,jlen,klen/), &
748 & map_decomp, iodesc)
749 ELSE IF (ndims.eq.4) THEN
750 CALL pio_initdecomp (iosystem, iotype, (/ilen,jlen,klen,llen/), &
751 & map_decomp, iodesc)
752 END IF
753!
754! Deallocate.
755!
756 IF (allocated(map_decomp)) deallocate (map_decomp)
757!
758 RETURN
759 END SUBROUTINE field_iodecomp
760!
761 SUBROUTINE set_iodecomp
762!
763!***********************************************************************
764! !
765! Sets the IO decomposition descriptors for ROMS input and output !
766! variables. They are used for the mapping between computational !
767! and I/O processes. !
768! !
769!***********************************************************************
770!
771! Local variable declarations.
772!
773 integer :: ng
774!
775!-----------------------------------------------------------------------
776! Allocate I/O decomposition descriptors.
777!-----------------------------------------------------------------------
778!
779! I/O decomposition descriptors for single precision data.
780!
781 allocate ( iodesc_sp_p2dvar(ngrids) )
782# ifdef ADJUST_WSTRESS
783 allocate ( iodesc_sp_u2dfrc(ngrids) )
784 allocate ( iodesc_sp_v2dfrc(ngrids) )
785# endif
786# ifdef ADJUST_BOUNDARY
787 allocate ( iodesc_sp_r2dobc(ngrids) )
788 allocate ( iodesc_sp_u2dobc(ngrids) )
789 allocate ( iodesc_sp_v2dobc(ngrids) )
790# endif
791 allocate ( iodesc_sp_r2dvar(ngrids) )
792 allocate ( iodesc_sp_u2dvar(ngrids) )
793 allocate ( iodesc_sp_v2dvar(ngrids) )
794# if defined SSH_TIDES || defined UV_TIDES
795 allocate ( iodesc_sp_rtides(ngrids) )
796# endif
797# ifdef SOLVE3D
798# ifdef SEDIMENT
799 allocate ( iodesc_sp_b3dvar(ngrids) )
800# endif
801# if defined DIAGNOSTICS_BIO && defined ECOSIM
802 allocate ( iodesc_sp_l3dvar(ngrids) )
803 allocate ( iodesc_sp_l4dvar(ngrids) )
804# endif
805 allocate ( iodesc_sp_p3dvar(ngrids) )
806# ifdef ADJUST_STFLUX
807 allocate ( iodesc_sp_r2dfrc(ngrids) )
808# endif
809# ifdef ADJUST_BOUNDARY
810 allocate ( iodesc_sp_r3dobc(ngrids) )
811 allocate ( iodesc_sp_u3dobc(ngrids) )
812 allocate ( iodesc_sp_v3dobc(ngrids) )
813# endif
814 allocate ( iodesc_sp_r3dvar(ngrids) )
815 allocate ( iodesc_sp_u3dvar(ngrids) )
816 allocate ( iodesc_sp_v3dvar(ngrids) )
817 allocate ( iodesc_sp_w3dvar(ngrids) )
818# endif
819!
820! I/O decomposition descriptors for double precision data.
821!
822 allocate ( iodesc_dp_p2dvar(ngrids) )
823# ifdef ADJUST_WSTRESS
824 allocate ( iodesc_dp_u2dfrc(ngrids) )
825 allocate ( iodesc_dp_v2dfrc(ngrids) )
826# endif
827# ifdef ADJUST_BOUNDARY
828 allocate ( iodesc_dp_r2dobc(ngrids) )
829 allocate ( iodesc_dp_u2dobc(ngrids) )
830 allocate ( iodesc_dp_v2dobc(ngrids) )
831# endif
832 allocate ( iodesc_dp_r2dvar(ngrids) )
833 allocate ( iodesc_dp_u2dvar(ngrids) )
834 allocate ( iodesc_dp_v2dvar(ngrids) )
835# if defined SSH_TIDES || defined UV_TIDES
836 allocate ( iodesc_dp_rtides(ngrids) )
837# endif
838# ifdef SOLVE3D
839# ifdef SEDIMENT
840 allocate ( iodesc_dp_b3dvar(ngrids) )
841# endif
842# if defined DIAGNOSTICS_BIO && defined ECOSIM
843 allocate ( iodesc_dp_l3dvar(ngrids) )
844 allocate ( iodesc_dp_l4dvar(ngrids) )
845# endif
846 allocate ( iodesc_dp_p3dvar(ngrids) )
847# ifdef ADJUST_STFLUX
848 allocate ( iodesc_dp_r2dfrc(ngrids) )
849# endif
850# ifdef ADJUST_BOUNDARY
851 allocate ( iodesc_dp_r3dobc(ngrids) )
852 allocate ( iodesc_dp_u3dobc(ngrids) )
853 allocate ( iodesc_dp_v3dobc(ngrids) )
854# endif
855 allocate ( iodesc_dp_r3dvar(ngrids) )
856 allocate ( iodesc_dp_u3dvar(ngrids) )
857 allocate ( iodesc_dp_v3dvar(ngrids) )
858 allocate ( iodesc_dp_w3dvar(ngrids) )
859# endif
860!
861! I/O decomposition descriptors for special single precision
862! restart and harmonics data.
863!
864 allocate ( iodesc_sp_rubar(ngrids) )
865 allocate ( iodesc_sp_rvbar(ngrids) )
866 allocate ( iodesc_sp_rzeta(ngrids) )
867 allocate ( iodesc_sp_ubar(ngrids) )
868 allocate ( iodesc_sp_vbar(ngrids) )
869 allocate ( iodesc_sp_zeta(ngrids) )
870# ifdef SOLVE3D
871 allocate ( iodesc_sp_ruvel(ngrids) )
872 allocate ( iodesc_sp_rvvel(ngrids) )
873# if defined GLS_MIXING || defined MY25_MIXING
874 allocate ( iodesc_sp_tkevar(ngrids) )
875# endif
876 allocate ( iodesc_sp_trcvar(ngrids) )
877 allocate ( iodesc_sp_uvel(ngrids) )
878 allocate ( iodesc_sp_vvel(ngrids) )
879# endif
880# if defined AVERAGES && defined AVERAGES_DETIDE && \
881 (defined ssh_tides || defined uv_tides)
882!
883 allocate ( iodesc_sp_r2dvar(ngrids) )
884 allocate ( iodesc_sp_u2dvar(ngrids) )
885 allocate ( iodesc_sp_v2dvar(ngrids) )
886# ifdef SOLVE3D
887 allocate ( iodesc_sp_r3dvar(ngrids) )
888 allocate ( iodesc_sp_u3dvar(ngrids) )
889 allocate ( iodesc_sp_v3dvar(ngrids) )
890# endif
891# endif
892!
893! I/O decomposition descriptors for special double precison
894! restart and harmonics data.
895!
896 allocate ( iodesc_dp_rubar(ngrids) )
897 allocate ( iodesc_dp_rvbar(ngrids) )
898 allocate ( iodesc_dp_rzeta(ngrids) )
899 allocate ( iodesc_dp_ubar(ngrids) )
900 allocate ( iodesc_dp_vbar(ngrids) )
901 allocate ( iodesc_dp_zeta(ngrids) )
902# ifdef SOLVE3D
903 allocate ( iodesc_dp_ruvel(ngrids) )
904 allocate ( iodesc_dp_rvvel(ngrids) )
905# if defined GLS_MIXING || defined MY25_MIXING
906 allocate ( iodesc_dp_tkevar(ngrids) )
907# endif
908 allocate ( iodesc_dp_trcvar(ngrids) )
909 allocate ( iodesc_dp_uvel(ngrids) )
910 allocate ( iodesc_dp_vvel(ngrids) )
911# endif
912# if defined AVERAGES && defined AVERAGES_DETIDE && \
913 (defined ssh_tides || defined uv_tides)
914!
915 allocate ( iodesc_dp_r2dvar(ngrids) )
916 allocate ( iodesc_dp_u2dvar(ngrids) )
917 allocate ( iodesc_dp_v2dvar(ngrids) )
918# ifdef SOLVE3D
919 allocate ( iodesc_dp_r3dvar(ngrids) )
920 allocate ( iodesc_dp_u3dvar(ngrids) )
921 allocate ( iodesc_dp_v3dvar(ngrids) )
922# endif
923# endif
924# if defined PROPAGATOR && defined CHECKPOINTING
925!
926! I/O decomposition descriptors for GST single and double precision
927! state propagator data. Its values are set in routine "wpoints_tile".
928!
929 allocate ( iodesc_sp_bvec(ngrids) )
930 allocate ( iodesc_sp_resid(ngrids) )
931 allocate ( iodesc_sp_sworkd(ngrids) )
932!
933 allocate ( iodesc_dp_bvec(ngrids) )
934 allocate ( iodesc_dp_resid(ngrids) )
935 allocate ( iodesc_dp_sworkd(ngrids) )
936# endif
937!
938!-----------------------------------------------------------------------
939! Set the PIO computational decomposition for ROMS C-type variables
940! and array rank. It is based on variable kind type and its mapping
941! from storage order to memory order.
942!-----------------------------------------------------------------------
943!
944! Set I/O decomposition descriptors for single precision data
945!
946 DO ng=1,ngrids
947 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
948 & iodesc_sp_p2dvar(ng), &
949 & p2dvar, 2)
950 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
951 & iodesc_sp_r2dvar(ng), &
952 & r2dvar, 2)
953 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
954 & iodesc_sp_u2dvar(ng), &
955 & u2dvar, 2)
956 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
957 & iodesc_sp_v2dvar(ng), &
958 & v2dvar, 2)
959# if defined SSH_TIDES || defined UV_TIDES
960 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
961 & iodesc_sp_rtides(ng), &
962 & r2dvar+4, 3, 1, ntc(ng))
963# endif
964# ifdef SOLVE3D
965# ifdef SEDIMENT
966 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
967 & iodesc_sp_b3dvar(ng), &
968 & b3dvar, 3, 1, nbed)
969# endif
970# if defined DIAGNOSTICS_BIO && defined ECOSIM
971 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
972 & iodesc_sp_l3dvar(ng), &
973 & l3dvar, 3, 1, ndbands)
974 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
975 & iodesc_sp_l4dvar(ng), &
976 & l4dvar, 4, 1, n(ng), ndbands)
977# endif
978 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
979 & iodesc_sp_p3dvar(ng), &
980 & p3dvar, 3, 1, n(ng))
981 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
982 & iodesc_sp_r3dvar(ng), &
983 & r3dvar, 3, 1, n(ng))
984 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
985 & iodesc_sp_u3dvar(ng), &
986 & u3dvar, 3, 1, n(ng))
987 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
988 & iodesc_sp_v3dvar(ng), &
989 & v3dvar, 3, 1, n(ng))
990 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
991 & iodesc_sp_w3dvar(ng), &
992 & w3dvar, 3, 0, n(ng))
993# endif
994# if defined ADJUST_STFLUX && defined DISTRIBUTE
995 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
996 & iodesc_sp_r2dfrc(ng), &
997 & r2dvar, 3, 1, nfrec(ng))
998# endif
999# ifdef ADJUST_WSTRESS
1000 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1001 & iodesc_sp_u2dfrc(ng), &
1002 & u2dvar, 3, 1, nfrec(ng))
1003 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1004 & iodesc_sp_v2dfrc(ng), &
1005 & v2dvar, 3, 1, nfrec(ng))
1006# endif
1007# ifdef ADJUST_BOUNDARY
1008 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1009 & iodesc_sp_r2dobc(ng), &
1010 & r2dobc, 3, 1, nbrec(ng))
1011 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1012 & iodesc_sp_u2dobc(ng), &
1013 & u2dobc, 3, 1, nbrec(ng))
1014 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1015 & iodesc_sp_v2dobc(ng), &
1016 & v2dobc, 3, 1, nbrec(ng))
1017# ifdef SOLVE3D
1018 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1019 & iodesc_sp_r3dobc(ng), &
1020 & r3dobc, 4, 1, n(ng), 1, nbrec(ng))
1021 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1022 & iodesc_sp_u3dobc(ng), &
1023 & u3dobc, 4, 1, n(ng), 1, nbrec(ng))
1024 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1025 & iodesc_sp_v3dobc(ng), &
1026 & v3dobc, 4, 1, n(ng), 1, nbrec(ng))
1027# endif
1028# endif
1029 END DO
1030!
1031! Set IO decomposition descriptors for double precision data.
1032!
1033 DO ng=1,ngrids
1034 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1035 & iodesc_dp_p2dvar(ng), &
1036 & p2dvar, 2)
1037 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1038 & iodesc_dp_r2dvar(ng), &
1039 & r2dvar, 2)
1040 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1041 & iodesc_dp_u2dvar(ng), &
1042 & u2dvar, 2)
1043 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1044 & iodesc_dp_v2dvar(ng), &
1045 & v2dvar, 2)
1046# if defined SSH_TIDES || defined UV_TIDES
1047 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1048 & iodesc_dp_rtides(ng), &
1049 & r2dvar+4, 3, 1, ntc(ng))
1050# endif
1051# ifdef SOLVE3D
1052# ifdef SEDIMENT
1053 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1054 & iodesc_dp_b3dvar(ng), &
1055 & b3dvar, 3, 1, nbed)
1056# endif
1057# if defined DIAGNOSTICS_BIO && defined ECOSIM
1058 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1059 & iodesc_dp_l3dvar(ng), &
1060 & l3dvar, 3, 1, ndbands)
1061 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1062 & iodesc_dp_l4dvar(ng), &
1063 & l4dvar, 4, 1, n(ng), ndbands)
1064# endif
1065 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1066 & iodesc_dp_p3dvar(ng), &
1067 & p3dvar, 3, 1, n(ng))
1068 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1069 & iodesc_dp_r3dvar(ng), &
1070 & r3dvar, 3, 1, n(ng))
1071 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1072 & iodesc_dp_u3dvar(ng), &
1073 & u3dvar, 3, 1, n(ng))
1074 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1075 & iodesc_dp_v3dvar(ng), &
1076 & v3dvar, 3, 1, n(ng))
1077 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1078 & iodesc_dp_w3dvar(ng), &
1079 & w3dvar, 3, 0, n(ng))
1080# endif
1081# if defined ADJUST_STFLUX && defined DISTRIBUTE
1082 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1083 & iodesc_dp_r2dfrc(ng), &
1084 & r2dvar, 3, 1, nfrec(ng))
1085# endif
1086# ifdef ADJUST_WSTRESS
1087 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1088 & iodesc_dp_u2dfrc(ng), &
1089 & u2dvar, 3, 1, nfrec(ng))
1090 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1091 & iodesc_dp_v2dfrc(ng), &
1092 & v2dvar, 3, 1, nfrec(ng))
1093# endif
1094# ifdef ADJUST_BOUNDARY
1095 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1096 & iodesc_dp_r2dobc(ng), &
1097 & r2dobc, 3, 1, nbrec(ng))
1098 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1099 & iodesc_dp_u2dobc(ng), &
1100 & u2dobc, 3, 1, nbrec(ng))
1101 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1102 & iodesc_dp_v2dobc(ng), &
1103 & v2dobc, 3, 1, nbrec(ng))
1104# ifdef SOLVE3D
1105 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1106 & iodesc_dp_r3dobc(ng), &
1107 & r3dobc, 4, 1, n(ng), 1, nbrec(ng))
1108 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1109 & iodesc_dp_u3dobc(ng), &
1110 & u3dobc, 4, 1, n(ng), 1, nbrec(ng))
1111 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1112 & iodesc_dp_v3dobc(ng), &
1113 & v3dobc, 4, 1, n(ng), 1, nbrec(ng))
1114# endif
1115# endif
1116 END DO
1117!
1118! Set I/O decomposition descriptors for special single precision
1119! restart and harmonics data.
1120!
1121 DO ng=1,ngrids
1122 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1123 & iodesc_sp_rubar(ng), &
1124 & u2dvar, 3, 1, 2)
1125 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1126 & iodesc_sp_rvbar(ng), &
1127 & v2dvar, 3, 1, 2)
1128 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1129 & iodesc_sp_rzeta(ng), &
1130 & r2dvar, 3, 1, 2)
1131 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1132 & iodesc_sp_ubar(ng), &
1133 & u2dvar, 3, 1, 3)
1134 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1135 & iodesc_sp_vbar(ng), &
1136 & v2dvar, 3, 1, 3)
1137 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1138 & iodesc_sp_zeta(ng), &
1139 & r2dvar, 3, 1, 3)
1140# ifdef SOLVE3D
1141 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1142 & iodesc_sp_ruvel(ng), &
1143 & u3dvar, 4, 0, n(ng), 1, 2)
1144 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1145 & iodesc_sp_rvvel(ng), &
1146 & v3dvar, 4, 0, n(ng), 1, 2)
1147# if defined GLS_MIXING || defined MY25_MIXING
1148 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1149 & iodesc_sp_tkevar(ng), &
1150 & r3dvar, 4, 0, n(ng), 1, 2)
1151# endif
1152 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1153 & iodesc_sp_trcvar(ng), &
1154 & r3dvar, 4, 1, n(ng), 1, 2)
1155 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1156 & iodesc_sp_uvel(ng), &
1157 & u3dvar, 4, 1, n(ng), 1, 2)
1158 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1159 & iodesc_sp_vvel(ng), &
1160 & v3dvar, 4, 1, n(ng), 1, 2)
1161# endif
1162
1163# if defined AVERAGES && defined AVERAGES_DETIDE && \
1164 (defined ssh_tides || defined uv_tides)
1165 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1166 & iodesc_sp_r2dhar(ng), &
1167 & r2dvar, 3, 0, 2*ntc(ng))
1168 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1169 & iodesc_sp_u2dhar(ng), &
1170 & u2dvar, 3, 0, 2*ntc(ng))
1171 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1172 & iodesc_sp_v2dhar(ng), &
1173 & v2dvar, 3, 0, 2*ntc(ng))
1174# ifdef SOLVE3D
1175 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1176 & iodesc_sp_r3dhar(ng), &
1177 & r3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1178 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1179 & iodesc_sp_u3dhar(ng), &
1180 & u3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1181 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_real, &
1182 & iodesc_sp_v3dhar(ng), &
1183 & v3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1184# endif
1185# endif
1186 END DO
1187!
1188! Set I/O decomposition descriptors for special double precision
1189! restart and harmonics data.
1190!
1191 DO ng=1,ngrids
1192 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1193 & iodesc_dp_rubar(ng), &
1194 & u2dvar, 3, 1, 2)
1195 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1196 & iodesc_dp_rvbar(ng), &
1197 & v2dvar, 3, 1, 2)
1198 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1199 & iodesc_dp_rzeta(ng), &
1200 & r2dvar, 3, 1, 2)
1201 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1202 & iodesc_dp_ubar(ng), &
1203 & u2dvar, 3, 1, 3)
1204 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1205 & iodesc_dp_vbar(ng), &
1206 & v2dvar, 3, 1, 3)
1207 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1208 & iodesc_dp_zeta(ng), &
1209 & r2dvar, 3, 1, 3)
1210# ifdef SOLVE3D
1211 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1212 & iodesc_dp_ruvel(ng), &
1213 & u3dvar, 4, 0, n(ng), 1, 2)
1214 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1215 & iodesc_dp_rvvel(ng), &
1216 & v3dvar, 4, 0, n(ng), 1, 2)
1217# if defined GLS_MIXING || defined MY25_MIXING
1218 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1219 & iodesc_dp_tkevar(ng), &
1220 & r3dvar, 4, 0, n(ng), 1, 2)
1221# endif
1222 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1223 & iodesc_dp_trcvar(ng), &
1224 & r3dvar, 4, 1, n(ng), 1, 2)
1225 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1226 & iodesc_dp_uvel(ng), &
1227 & u3dvar, 4, 1, n(ng), 1, 2)
1228 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1229 & iodesc_dp_vvel(ng), &
1230 & v3dvar, 4, 1, n(ng), 1, 2)
1231# endif
1232
1233# if defined AVERAGES && defined AVERAGES_DETIDE && \
1234 (defined ssh_tides || defined uv_tides)
1235 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1236 & iodesc_dp_r2dhar(ng), &
1237 & r2dvar, 3, 0, 2*ntc(ng))
1238 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1239 & iodesc_dp_u2dhar(ng), &
1240 & u2dvar, 3, 0, 2*ntc(ng))
1241 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1242 & iodesc_dp_v2dhar(ng), &
1243 & v2dvar, 3, 0, 2*ntc(ng))
1244# ifdef SOLVE3D
1245 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1246 & iodesc_dp_r3dhar(ng), &
1247 & r3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1248 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1249 & iodesc_dp_u3dhar(ng), &
1250 & u3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1251 CALL field_iodecomp (ng, piosystem(ipioroms,ng), pio_double, &
1252 & iodesc_dp_v3dhar(ng), &
1253 & v3dvar, 4, 1, n(ng), 0, 2*ntc(ng))
1254# endif
1255# endif
1256 END DO
1257!
1258 RETURN
1259 END SUBROUTINE set_iodecomp
1260
1261# ifdef ASYNCHRONOUS_SCORPIO
1262!
1263 SUBROUTINE set_pio_async
1264!
1265!***********************************************************************
1266! !
1267! If SCORPIO library, splits the distributed-memory communicator to !
1268! allow asynchronous I/O with dedicated processes. !
1269! !
1270!***********************************************************************
1271!
1272! Local variable declarations.
1273!
1274 logical :: lsplit
1275 logical, allocatable :: lranks(:)
1276!
1277 integer :: computesize, lstr, myerror, serror
1278 integer :: iomaster, ocnmaster
1279 integer :: i, ic, last, ng, npets, tag
1280 integer :: grp_compute, grp_initial, grp_io
1281 integer :: petrange(3,1) ! one triplet only
1282!
1283 integer, allocatable :: compute_ranks(:,:), io_ranks(:)
1284!
1285 character (len=MPI_MAX_ERROR_STRING) :: string
1286
1287 character (len=*), parameter :: myfile = &
1288 & __FILE__//", set_pio_async"
1289!
1290!-----------------------------------------------------------------------
1291! Split distributed-memory communicator into computational and
1292! dedicated I/O processes.
1293!-----------------------------------------------------------------------
1294!
1295! Set peer communicator as the initial ROMS communicator. After
1296! splitting, the OCN_COMM_WORLD must have the value of MPI_COMM_NULL
1297! on those processes dedicated to I/O.
1298!
1299 peer_comm_world=ocn_comm_world
1300 ocn_comm_world=mpi_comm_null
1301 io_comm_world=mpi_comm_null
1302!
1303 peersize=numthreads
1304 peerrank=myrank
1305 computesize=peersize-pio_numiotasks
1306!
1307! Allocate and initialize local arrays.
1308!
1309 IF (.not.allocated(lranks)) THEN
1310 allocate ( lranks(0:peersize-1) )
1311 lranks(0:peersize-1)=.true.
1312 END IF
1313 IF (.not.allocated(compute_ranks)) THEN
1314 allocate ( compute_ranks(computesize,npiocomps) )
1315 compute_ranks=-1
1316 END IF
1317 IF (.not.allocated(io_ranks)) THEN
1318 allocate ( io_ranks(pio_numiotasks) )
1319 io_ranks=-1
1320 END IF
1321!
1322! Set the ranks of the dedicated I/O processes with respect the peer
1323! communicator.
1324!
1325 ic=pio_base
1326 io_ranks(1)=ic
1327 lranks(ic)=.false.
1328 DO i=2,pio_numiotasks
1329 IF ((ic+pio_stride).le.(peersize-1)) THEN
1330 ic=ic+pio_stride
1331 io_ranks(i)=ic
1332 lranks(ic)=.false.
1333 END IF
1334 END DO
1335 iomaster=io_ranks(1)
1336 WRITE (cioranks,'(*(i0,1x))') io_ranks
1337!
1338! Set the ranks of the computational processes with respect the peer
1339! communicator.
1340!
1341 ic=0
1342 DO i=0,peersize-1
1343 IF (lranks(i)) THEN
1344 ic=ic+1
1345 compute_ranks(ic,ipioroms)=i
1346 END IF
1347 END DO
1348 ocnmaster=compute_ranks(1,ipioroms)
1349 WRITE (ccompranks,'(*(i0,1x))') compute_ranks(:,ipioroms)
1350!
1351! Set switch to split communicator.
1352!
1353 IF ((inp_lib.eq.io_pio).or.(out_lib.eq.io_pio)) THEN
1354 lsplit=.true.
1355 ELSE
1356 lsplit=.false.
1357 END IF
1358!
1359! Check for correct parallel decompositon between computational and
1360! I/O processes or when split communicator is unnecessary.
1361!
1362 DO ng=1,ngrids
1363 IF (lsplit) THEN
1364 npets=pio_numiotasks+ntilei(ng)*ntilej(ng)
1365 IF (npets.ne.peersize) THEN
1366 IF (peerrank.eq.0) &
1367 print 10, ' asynchonous ', ng, &
1368 & 'NumIOtasks+NtileI(ng)*NtileJ(ng) = ', npets, &
1369 & 'Peer Communicator Size = ', peersize,&
1370 & 'NumIOtasks+NtileI(ng)*NtileJ(ng) = ', peersize
1371 exit_flag=6
1372 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1373 END IF
1374 ELSE
1375 npets=ntilei(ng)*ntilej(ng)
1376 IF (npets.ne.peersize) THEN
1377 IF (peerrank.eq.0) &
1378 print 10, ' synchonous ', ng, &
1379 & 'NtileI(ng)*NtileJ(ng) = ', npets, &
1380 & 'Communicator Size = ', peersize, &
1381 & 'NtileI(ng)*NtileJ(ng) = ', npets
1382 exit_flag=6
1383 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
1384 END IF
1385 END IF
1386 END DO
1387!
1388!-----------------------------------------------------------------------
1389! Split initial communicator into disjointed computational and I/O
1390! subgroups.
1391!-----------------------------------------------------------------------
1392!
1393! Set dedicated range I/O processes triplets. All ranks must be valid
1394! in group and all computed ranks must be distinct.
1395! Hmm, the grouping below works only for base=0. That is weid!
1396!
1397 petrange(1,1)=pio_base ! first rank
1398 petrange(2,1)=io_ranks(pio_numiotasks) ! last rank
1399 petrange(3,1)=pio_stride ! rank stride
1400!
1401! Split initial communicator into disjointed subgroups.
1402!
1403 IF (lsplit) THEN
1404!
1405! Create a group associated with the initial communicator.
1406!
1407 CALL mpi_comm_group (peer_comm_world, grp_initial, myerror)
1408 IF (myerror.ne.mpi_success) THEN
1409 CALL mpi_error_string (myerror, string, lstr, serror)
1410 IF (peerrank.eq.0) &
1411 print 20, 'MPI_COMM_GROUP', &
1412 & 'Comm = PEER_COMM_WORLD', &
1413 & peerrank, myerror, trim(string)
1414 exit_flag=2
1415 END IF
1416!
1417! Set group of processes the I/O group. Include the processes range
1418! defined in PetRange.
1419!
1420 CALL mpi_group_range_incl (grp_initial, 1, petrange, &
1421 & grp_io, myerror)
1422 IF (myerror.ne.mpi_success) THEN
1423 CALL mpi_error_string (myerror, string, lstr, serror)
1424 IF (peerrank.eq.iomaster) &
1425 print 20, 'MPI_GROUP_RANGE_INCL', &
1426 & 'Group = GRP_IO', &
1427 & iomaster, myerror, trim(string)
1428 exit_flag=2
1429 END IF
1430!
1431! Set group of process in the computational group. Exclude the
1432! precesses range defined in PetRange.
1433!
1434 CALL mpi_group_range_excl (grp_initial, 1, petrange, &
1435 & grp_compute, myerror)
1436 IF (myerror.ne.mpi_success) THEN
1437 CALL mpi_error_string (myerror, string, lstr, serror)
1438 IF (peerrank.eq.ocnmaster) &
1439 & print 20, 'MPI_GROUP_RANGE_EXCL', &
1440 & 'Group = GRP_COMPUTE', &
1441 & ocnmaster, myerror, trim(string)
1442 exit_flag=2
1443 END IF
1444!
1445! Create the computational group associated with the initial
1446! communicator.
1447!
1448 CALL mpi_comm_create (peer_comm_world, grp_compute, &
1449 & ocn_comm_world, myerror)
1450 IF (myerror.ne.mpi_success) THEN
1451 CALL mpi_error_string (myerror, string, lstr, serror)
1452 IF (peerrank.eq.ocnmaster) &
1453 & print 20, 'MPI_COMM_CREATE', &
1454 & 'Comm = OCN_COMM_WORLD', &
1455 & ocnmaster, myerror, trim(string)
1456 exit_flag=2
1457 END IF
1458!
1459! Create dedicated I/O group associated the initial communicator.
1460! Notice that at least
1461!
1462 CALL mpi_comm_create (peer_comm_world, grp_io, &
1463 & io_comm_world, myerror)
1464 IF (myerror.ne.mpi_success) THEN
1465 CALL mpi_error_string (myerror, string, lstr, serror)
1466 IF (peerrank.eq.iomaster) &
1467 & print 20, 'MPI_COMM_CREATE', &
1468 & 'Comm = IO_COMM_WORLD', &
1469 & iomaster, myerror, trim(string)
1470 exit_flag=2
1471 END IF
1472!
1473! Create inter-communicator from two existing intra-communicators.
1474! Notice that at least one selected process from each group has the
1475! ability to communicate with the selected member of the other group.
1476!
1477 tag=1
1478 IF (ocn_comm_world.ne.mpi_comm_null) THEN
1479 CALL mpi_intercomm_create (ocn_comm_world, 0, peer_comm_world,&
1480 & pio_base, tag, inter_comm_world, &
1481 & myerror)
1482 IF (myerror.ne.mpi_success) THEN
1483 CALL mpi_error_string (myerror, string, lstr, serror)
1484 IF (peerrank.eq.ocnmaster) &
1485 print 20, 'MPI_ITERCOMM_CREATE', &
1486 & 'Comm = INTER_COMM_WORLD', &
1487 & ocnmaster, myerror, trim(string)
1488 exit_flag=2
1489 END IF
1490 ELSE IF (io_comm_world.ne.mpi_comm_null) THEN
1491 IF (pio_base.eq.0) THEN
1492 IF (pio_stride.gt.1) THEN
1493 CALL mpi_intercomm_create (io_comm_world, 0, &
1494 & peer_comm_world, 1, tag, &
1495 & inter_comm_world, myerror)
1496 IF (myerror.ne.mpi_success) THEN
1497 CALL mpi_error_string (myerror, string, lstr, serror)
1498 IF (peerrank.eq.iomaster) &
1499 print 20, 'MPI_ITERCOMM_CREATE', &
1500 & 'Comm = INTER_COMM_WORLD', &
1501 & iomaster, myerror, trim(string)
1502 exit_flag=2
1503 END IF
1504 ELSE
1505 CALL mpi_intercomm_create (io_comm_world, 0, &
1506 & peer_comm_world, &
1507 & pio_numiotasks, tag, &
1508 & inter_comm_world, myerror)
1509 IF (myerror.ne.mpi_success) THEN
1510 CALL mpi_error_string (myerror, string, lstr, serror)
1511 IF (peerrank.eq.iomaster) &
1512 print 20, 'MPI_ITERCOMM_CREATE', &
1513 & 'Comm = INTER_COMM_WORLD', &
1514 & iomaster, myerror, trim(string)
1515 exit_flag=2
1516 END IF
1517 END IF
1518 ELSE
1519 CALL mpi_intercomm_create (io_comm_world, 0, &
1520 & peer_comm_world, 0, tag, &
1521 & inter_comm_world, myerror)
1522 IF (myerror.ne.mpi_success) THEN
1523 CALL mpi_error_string (myerror, string, lstr, serror)
1524 IF (peerrank.eq.iomaster) &
1525 & print 20, 'MPI_ITERCOMM_CREATE', &
1526 & 'Comm = INTER_COMM_WORLD', &
1527 & iomaster, myerror, trim(string)
1528 exit_flag=2
1529 END IF
1530 END IF
1531 ELSE
1532 exit_flag=2
1533 IF (peerrank.eq.0) print 30
1534 END IF
1535 ELSE
1536 ocn_comm_world=peer_comm_world ! not splitted
1537 END IF
1538!
1539!-----------------------------------------------------------------------
1540! Initialize parallel control switches.
1541!-----------------------------------------------------------------------
1542!
1543 IF (lsplit) THEN
1544 CALL mpi_comm_size (ocn_comm_world, numthreads, myerror)
1545 CALL mpi_comm_rank (ocn_comm_world, myrank, myerror)
1546!
1548
1549# ifdef PARALLEL_IO
1550 inpthread=.true.
1551 outthread=.true.
1552# else
1553 IF (myrank.eq.0) THEN
1554 inpthread=.true.
1555 outthread=.true.
1556 ELSE
1557 inpthread=.false.
1558 outthread=.false.
1559 END IF
1560# endif
1561 END IF
1562!
1563! Deallocate local arrays.
1564!
1565 IF (allocated(lranks)) deallocate (lranks)
1566 IF (allocated(compute_ranks)) deallocate (compute_ranks)
1567 IF (allocated(io_ranks)) deallocate (io_ranks)
1568!
1569 10 FORMAT (/,' SET_PIO_ASYNC - Wrong number of processors for', &
1570 & a,'I/O in grid: ',i0,/,17x,a,i0,/,17x,a,i0, &
1571 & ', but we need: ',/,17x,a,i0,/)
1572 20 FORMAT (/,' SET_PIO_ASYNC - error during ',a, &
1573 & ' call, ',a,', Rank = ',i0,' Error = ',i0,/,22x,a)
1574 30 FORMAT (/,' SET_PIO_ASYNC - no option to create ', &
1575 & 'inter-communicator.')
1576!
1577 RETURN
1578 END SUBROUTINE set_pio_async
1579# endif
1580# if defined PROPAGATOR && defined CHECKPOINTING
1581!
1582 SUBROUTINE state_iodecomp (ng, ioSystem, ioType, ioDesc, &
1583 & ioVname, ndims)
1584!
1585!***********************************************************************
1586! !
1587! Sets the IO decomposition descriptor for ROMS packed state variable !
1588! types. !
1589! !
1590! On Input: !
1591! !
1592! ng Nested grid number (integer) !
1593! ioSystem PIO system descriptor (TYPE IOSystem_desc_t) !
1594! ioType PIO kind variable type (integer) !
1595! ioVname State variable name (string) !
1596! ndims Number of state variable dimensions (integer) !
1597! !
1598! On Output: !
1599! !
1600! ioDesc IO decomposition descriptor (TYPE io_desc_t) !
1601! !
1602!***********************************************************************
1603!
1604! Imported variable declarations.
1605!
1606 integer, intent(in) :: ng, iotype, ndims
1607!
1608 character (len=*) :: iovname
1609!
1610 TYPE (iosystem_desc_t), intent(in) :: iosystem
1611 TYPE (io_desc_t), intent(out) :: iodesc
1612!
1613! Local variable declarations.
1614!
1615 integer :: is, ie, isize, js, je, jsize, my_size
1616 integer :: imin, imax, ioff, jmin, jmax, joff
1617 integer :: i, ic, j, jc, np
1618
1619 integer(PIO_Offset_kind), allocatable :: map_decomp(:)
1620!
1621!-----------------------------------------------------------------------
1622! Set the PIO computational decomposition for ROMS packed state
1623! variables.
1624!-----------------------------------------------------------------------
1625!
1626 SELECT CASE (trim(iovname))
1627 CASE ('Bvec')
1628 is=nstr(ng)
1629 ie=nend(ng)
1630 js=1
1631 je=ncv
1632 ioff=0
1633 joff=1
1634 CASE ('resid')
1635 is=nstr(ng)
1636 ie=nend(ng)
1637 CASE ('SworkD')
1638 is=myrank*3*nstate(ng)+1
1639 ie=min(is+3*nstate(ng)-1, 3*mstate(ng))
1640 END SELECT
1641!
1642! Starting/ending I- and J-indices for each decomposition tile.
1643!
1644 IF (ndims.eq.1) THEN
1645 imin=is
1646 imax=ie
1647 isize=ie-is+1
1648 my_size=isize
1649 ELSE IF (ndims.eq.2) THEN
1650 imin=is
1651 imax=ie
1652 jmin=js
1653 jmax=je
1654 isize=ie-is+1
1655 jsize=je-js+1
1656 my_size=isize*jsize
1657 END IF
1658!
1659! Allocate 1D array for mapping of the storage order of the variable to
1660! its memory order.
1661!
1662 IF (.not.ALLOCATED(map_decomp)) THEN
1663 allocate ( map_decomp(my_size) )
1664 END IF
1665 map_decomp=0_pio_offset_kind
1666!
1667! Set variable decomposition mapping.
1668!
1669 IF (ndims.eq.1) THEN
1670 np=0
1671 DO i=imin,imax
1672 np=np+1
1673 map_decomp(np)=i
1674 END DO
1675 ELSE IF (ndims.eq.2) THEN
1676 np=0
1677 DO j=jmin,jmax
1678 jc=(j-joff)*isize
1679 DO i=imin,imax
1680 np=np+1
1681 ic=i+ioff+jc
1682 map_decomp(np)=ic
1683 END DO
1684 END DO
1685 END IF
1686!
1687! Set IO decomposition descriptor
1688!
1689 IF (ndims.eq.1) THEN
1690 CALL pio_initdecomp (iosystem, iotype, (/isize/), &
1691 & map_decomp, iodesc)
1692 ELSE IF (ndims.eq.2) THEN
1693 CALL pio_initdecomp (iosystem, iotype, (/isize,jsize/), &
1694 & map_decomp, iodesc)
1695 END IF
1696!
1697! Deallocate.
1698!
1699 IF (ALLOCATED(map_decomp)) deallocate (map_decomp)
1700!
1701 RETURN
1702 END SUBROUTINE state_iodecomp
1703# endif
1704#endif
1705 END MODULE set_pio_mod
integer numthreads
logical inpthread
logical master
integer mymaster
logical outthread
integer ocn_comm_world
integer, parameter u2dobc
Definition mod_param.F:729
integer, parameter v3dobc
Definition mod_param.F:733
integer nbed
Definition mod_param.F:517
integer, parameter r2dobc
Definition mod_param.F:728
integer, dimension(:), allocatable nstate
Definition mod_param.F:645
integer, dimension(:), allocatable n
Definition mod_param.F:479
integer, dimension(:), allocatable mstate
Definition mod_param.F:644
type(t_bounds), dimension(:), allocatable bounds
Definition mod_param.F:232
integer, dimension(:), allocatable nstr
Definition mod_param.F:646
integer, parameter b3dvar
Definition mod_param.F:725
integer, parameter r3dvar
Definition mod_param.F:721
integer, parameter r3dobc
Definition mod_param.F:731
integer, parameter l4dvar
Definition mod_param.F:727
integer, parameter v2dobc
Definition mod_param.F:730
type(t_iobounds), dimension(:), allocatable iobounds
Definition mod_param.F:282
integer, parameter u3dobc
Definition mod_param.F:732
integer, parameter u3dvar
Definition mod_param.F:722
integer, parameter u2dvar
Definition mod_param.F:718
integer ngrids
Definition mod_param.F:113
integer, dimension(:), allocatable nend
Definition mod_param.F:647
integer, dimension(:), allocatable ntilei
Definition mod_param.F:677
integer, parameter w3dvar
Definition mod_param.F:724
integer, parameter p2dvar
Definition mod_param.F:716
integer, parameter r2dvar
Definition mod_param.F:717
integer, parameter l3dvar
Definition mod_param.F:726
integer, parameter v2dvar
Definition mod_param.F:719
integer, parameter p3dvar
Definition mod_param.F:720
integer, parameter v3dvar
Definition mod_param.F:723
integer, dimension(:), allocatable ntilej
Definition mod_param.F:678
type(io_desc_t), dimension(:), pointer iodesc_sp_w3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_u3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dobc
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dfrc
type(io_desc_t), dimension(:), pointer iodesc_dp_resid
type(io_desc_t), dimension(:), pointer iodesc_sp_bvec
type(io_desc_t), dimension(:), pointer iodesc_dp_v3dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dhar
type(iosystem_desc_t), dimension(:,:), allocatable, target piosystem
type(io_desc_t), dimension(:), pointer iodesc_dp_tkevar
type(io_desc_t), dimension(:), pointer iodesc_sp_trcvar
type(io_desc_t), dimension(:), pointer iodesc_dp_bvec
type(io_desc_t), dimension(:), pointer iodesc_dp_p3dvar
logical pio_rearr_c2i_is
type(io_desc_t), dimension(:), pointer iodesc_dp_b3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u3dobc
type(io_desc_t), dimension(:), pointer iodesc_sp_r3dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_u3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dobc
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_u3dhar
type(io_desc_t), dimension(:), pointer iodesc_dp_ubar
type(io_desc_t), dimension(:), pointer iodesc_dp_v3dhar
type(io_desc_t), dimension(:), pointer iodesc_sp_tkevar
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_ruvel
type(io_desc_t), dimension(:), pointer iodesc_dp_l3dvar
character(len=1024) cioranks
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dhar
logical pio_rearr_i2c_is
type(io_desc_t), dimension(:), pointer iodesc_dp_rtides
type(io_desc_t), dimension(:), pointer iodesc_sp_l3dvar
character(len=1024) ccompranks
type(io_desc_t), dimension(:), pointer iodesc_dp_rzeta
type(io_desc_t), dimension(:), pointer iodesc_sp_l4dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_rzeta
type(io_desc_t), dimension(:), pointer iodesc_sp_u3dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dfrc
type(io_desc_t), dimension(:), pointer iodesc_dp_uvel
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dobc
type(io_desc_t), dimension(:), pointer iodesc_sp_b3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dhar
type(io_desc_t), dimension(:), pointer iodesc_sp_r3dhar
type(io_desc_t), dimension(:), pointer iodesc_sp_rvvel
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dhar
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dhar
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_rvvel
type(io_desc_t), dimension(:), pointer iodesc_sp_v3dhar
type(io_desc_t), dimension(:), pointer iodesc_dp_l4dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dfrc
type(io_desc_t), dimension(:), pointer iodesc_sp_u3dhar
type(io_desc_t), dimension(:), pointer iodesc_dp_vvel
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dhar
type(io_desc_t), dimension(:), pointer iodesc_dp_rvbar
type(io_desc_t), dimension(:), pointer iodesc_dp_p2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_rtides
type(io_desc_t), dimension(:), pointer iodesc_sp_vbar
type(io_desc_t), dimension(:), pointer iodesc_dp_vbar
integer pio_rearr_c2i_pr
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dfrc
type(io_desc_t), dimension(:), pointer iodesc_sp_rvbar
type(io_desc_t), dimension(:), pointer iodesc_sp_sworkd
type(io_desc_t), dimension(:), pointer iodesc_dp_w3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dfrc
type(io_desc_t), dimension(:), pointer iodesc_sp_p3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_zeta
type(io_desc_t), dimension(:), pointer iodesc_sp_resid
type(io_desc_t), dimension(:), pointer iodesc_sp_vvel
logical pio_rearr_c2i_hs
type(io_desc_t), dimension(:), pointer iodesc_sp_ubar
type(io_desc_t), dimension(:), pointer iodesc_sp_uvel
type(io_desc_t), dimension(:), pointer iodesc_sp_zeta
type(io_desc_t), dimension(:), pointer iodesc_sp_v3dvar
integer pio_rearr_i2c_pr
type(io_desc_t), dimension(:), pointer iodesc_sp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_ruvel
type(io_desc_t), dimension(:), pointer iodesc_dp_r3dobc
type(io_desc_t), dimension(:), pointer iodesc_dp_rubar
type(io_desc_t), dimension(:), pointer iodesc_dp_sworkd
logical lpioinitialized
type(io_desc_t), dimension(:), pointer iodesc_sp_rubar
type(io_desc_t), dimension(:), pointer iodesc_sp_v3dobc
type(io_desc_t), dimension(:), pointer iodesc_sp_p2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dfrc
type(io_desc_t), dimension(:), pointer iodesc_dp_r3dhar
logical pio_rearr_i2c_hs
type(io_desc_t), dimension(:), pointer iodesc_dp_trcvar
integer, dimension(:), allocatable ntc
integer ncv
subroutine, public finalize_pio
Definition set_pio.F:323
subroutine, public field_iodecomp(ng, iosystem, iotype, iodesc, gtype, ndims, lbk, ubk, lbt, ubt)
Definition set_pio.F:516
subroutine, public set_iodecomp
Definition set_pio.F:762
subroutine, public state_iodecomp(ng, iosystem, iotype, iodesc, iovname, ndims)
Definition set_pio.F:1584
subroutine, public initialize_pio
Definition set_pio.F:50
logical function, public founderror(flag, noerr, line, routine)
Definition strings.F:52