3#if defined PIO_LIB && defined DISTRIBUTE
25# if defined PROPAGATOR && defined CHECKPOINTING
29# if defined SSH_TIDES || defined UV_TIDES
39# if defined PROPAGATOR && defined CHECKPOINTING
43# ifdef ASYNCHRONOUS_SCORPIO
44 PUBLIC :: set_pio_async
60# ifdef ASYNCHRONOUS_PIO
61 logical,
allocatable :: lranks(:)
63 integer :: computesize
65 integer,
allocatable :: compute_comm(:,:), io_comm(:)
66 integer,
allocatable :: compute_ranks(:,:), io_ranks(:)
71 character (len=*),
parameter :: myfile = &
72 & __FILE__//
", initialize_pio"
90# if defined ASYNCHRONOUS_PIO
110 IF (.not.
allocated(compute_comm))
THEN
112 compute_comm=mpi_comm_null
114 IF (.not.
allocated(io_comm))
THEN
115 allocate ( io_comm(
ngrids) )
116 io_comm=mpi_comm_null
119 IF (.not.
allocated(lranks))
THEN
120 allocate ( lranks(0:peersize-1) )
121 lranks(0:peersize-1)=.true.
123 IF (.not.
allocated(compute_ranks))
THEN
124 allocate ( compute_ranks(computesize,
npiocomps) )
127 IF (.not.
allocated(io_ranks))
THEN
145 WRITE (
cioranks,
'(*(i0,1x))') io_ranks
163 IF (out_lib.eq.io_pio)
THEN
179 io_comm_world =io_comm(ng)
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)
223# elif defined ASYNCHRONOUS_SCORPIO
236 IF (out_lib.eq.io_pio)
THEN
316 IF (
founderror(myerror, pio_noerr, __line__, myfile))
RETURN
333 integer :: i, ng, status
346# ifdef ADJUST_BOUNDARY
354# if defined SSH_TIDES || defined UV_TIDES
361# if defined DIAGNOSTICS_BIO && defined ECOSIM
366# ifdef ADJUST_BOUNDARY
384# ifdef ADJUST_BOUNDARY
392# if defined SSH_TIDES || defined UV_TIDES
399# if defined DIAGNOSTICS_BIO && defined ECOSIM
404# ifdef ADJUST_BOUNDARY
431# if defined GLS_MIXING || defined MY25_MIXING
438# if defined AVERAGES && defined AVERAGES_DETIDE && \
439 (defined ssh_tides || defined uv_tides)
466# if defined GLS_MIXING || defined MY25_MIXING
473# if defined AVERAGES && defined AVERAGES_DETIDE && \
474 (defined ssh_tides || defined uv_tides)
484# if defined PROPAGATOR && defined CHECKPOINTING
506 CALL pio_finalize (
piosystem(i,ng), status)
515 & gtype, ndims, LBk, UBk, LBt, UBt)
541 integer,
intent(in) :: ng, iotype, gtype, ndims
543 integer,
intent(in),
optional :: lbk, ubk
544 integer,
intent(in),
optional :: lbt, ubt
546 TYPE (iosystem_desc_t),
intent(in) :: iosystem
547 TYPE (io_desc_t),
intent(out) :: iodesc
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
562 integer(PIO_Offset_kind),
allocatable :: map_decomp(:)
642 IF (
PRESENT(lbk))
THEN
653 IF (
PRESENT(lbt))
THEN
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
693 IF (.not.
ALLOCATED(map_decomp))
THEN
694 allocate ( map_decomp(my_size) )
696 map_decomp=0_pio_offset_kind
710 ELSE IF (ndims.eq.3)
THEN
723 ELSE IF (ndims.eq.4)
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)
756 IF (
allocated(map_decomp))
deallocate (map_decomp)
782# ifdef ADJUST_WSTRESS
786# ifdef ADJUST_BOUNDARY
794# if defined SSH_TIDES || defined UV_TIDES
801# if defined DIAGNOSTICS_BIO && defined ECOSIM
809# ifdef ADJUST_BOUNDARY
823# ifdef ADJUST_WSTRESS
827# ifdef ADJUST_BOUNDARY
835# if defined SSH_TIDES || defined UV_TIDES
842# if defined DIAGNOSTICS_BIO && defined ECOSIM
850# ifdef ADJUST_BOUNDARY
873# if defined GLS_MIXING || defined MY25_MIXING
880# if defined AVERAGES && defined AVERAGES_DETIDE && \
881 (defined ssh_tides || defined uv_tides)
905# if defined GLS_MIXING || defined MY25_MIXING
912# if defined AVERAGES && defined AVERAGES_DETIDE && \
913 (defined ssh_tides || defined uv_tides)
924# if defined PROPAGATOR && defined CHECKPOINTING
959# if defined SSH_TIDES || defined UV_TIDES
970# if defined DIAGNOSTICS_BIO && defined ECOSIM
976 &
l4dvar, 4, 1,
n(ng), ndbands)
994# if defined ADJUST_STFLUX && defined DISTRIBUTE
997 &
r2dvar, 3, 1, nfrec(ng))
999# ifdef ADJUST_WSTRESS
1002 &
u2dvar, 3, 1, nfrec(ng))
1005 &
v2dvar, 3, 1, nfrec(ng))
1007# ifdef ADJUST_BOUNDARY
1010 &
r2dobc, 3, 1, nbrec(ng))
1013 &
u2dobc, 3, 1, nbrec(ng))
1016 &
v2dobc, 3, 1, nbrec(ng))
1020 &
r3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1023 &
u3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1026 &
v3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1046# if defined SSH_TIDES || defined UV_TIDES
1057# if defined DIAGNOSTICS_BIO && defined ECOSIM
1063 &
l4dvar, 4, 1,
n(ng), ndbands)
1081# if defined ADJUST_STFLUX && defined DISTRIBUTE
1084 &
r2dvar, 3, 1, nfrec(ng))
1086# ifdef ADJUST_WSTRESS
1089 &
u2dvar, 3, 1, nfrec(ng))
1092 &
v2dvar, 3, 1, nfrec(ng))
1094# ifdef ADJUST_BOUNDARY
1097 &
r2dobc, 3, 1, nbrec(ng))
1100 &
u2dobc, 3, 1, nbrec(ng))
1103 &
v2dobc, 3, 1, nbrec(ng))
1107 &
r3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1110 &
u3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1113 &
v3dobc, 4, 1,
n(ng), 1, nbrec(ng))
1147# if defined GLS_MIXING || defined MY25_MIXING
1163# if defined AVERAGES && defined AVERAGES_DETIDE && \
1164 (defined ssh_tides || defined uv_tides)
1217# if defined GLS_MIXING || defined MY25_MIXING
1233# if defined AVERAGES && defined AVERAGES_DETIDE && \
1234 (defined ssh_tides || defined uv_tides)
1261# ifdef ASYNCHRONOUS_SCORPIO
1263 SUBROUTINE set_pio_async
1275 logical,
allocatable :: lranks(:)
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)
1283 integer,
allocatable :: compute_ranks(:,:), io_ranks(:)
1285 character (len=MPI_MAX_ERROR_STRING) :: string
1287 character (len=*),
parameter :: myfile = &
1288 & __FILE__//
", set_pio_async"
1301 io_comm_world=mpi_comm_null
1309 IF (.not.
allocated(lranks))
THEN
1310 allocate ( lranks(0:peersize-1) )
1311 lranks(0:peersize-1)=.true.
1313 IF (.not.
allocated(compute_ranks))
THEN
1314 allocate ( compute_ranks(computesize,
npiocomps) )
1317 IF (.not.
allocated(io_ranks))
THEN
1335 iomaster=io_ranks(1)
1336 WRITE (
cioranks,
'(*(i0,1x))') io_ranks
1348 ocnmaster=compute_ranks(1,
ipioroms)
1353 IF ((inp_lib.eq.io_pio).or.(out_lib.eq.io_pio))
THEN
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
1372 IF (
founderror(exit_flag, noerror, __line__, myfile))
RETURN
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
1383 IF (
founderror(exit_flag, noerror, __line__, myfile))
RETURN
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)
1420 CALL mpi_group_range_incl (grp_initial, 1, petrange, &
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)
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)
1448 CALL mpi_comm_create (peer_comm_world, grp_compute, &
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)
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)
1480 &
pio_base, tag, inter_comm_world, &
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)
1490 ELSE IF (io_comm_world.ne.mpi_comm_null)
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)
1505 CALL mpi_intercomm_create (io_comm_world, 0, &
1506 & peer_comm_world, &
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)
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)
1533 IF (peerrank.eq.0) print 30
1565 IF (
allocated(lranks))
deallocate (lranks)
1566 IF (
allocated(compute_ranks))
deallocate (compute_ranks)
1567 IF (
allocated(io_ranks))
deallocate (io_ranks)
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.')
1578 END SUBROUTINE set_pio_async
1580# if defined PROPAGATOR && defined CHECKPOINTING
1606 integer,
intent(in) :: ng, iotype, ndims
1608 character (len=*) :: iovname
1610 TYPE (iosystem_desc_t),
intent(in) :: iosystem
1611 TYPE (io_desc_t),
intent(out) :: iodesc
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
1619 integer(PIO_Offset_kind),
allocatable :: map_decomp(:)
1626 SELECT CASE (trim(iovname))
1644 IF (ndims.eq.1)
THEN
1649 ELSE IF (ndims.eq.2)
THEN
1662 IF (.not.
ALLOCATED(map_decomp))
THEN
1663 allocate ( map_decomp(my_size) )
1665 map_decomp=0_pio_offset_kind
1669 IF (ndims.eq.1)
THEN
1675 ELSE IF (ndims.eq.2)
THEN
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)
1699 IF (
ALLOCATED(map_decomp))
deallocate (map_decomp)
integer, parameter u2dobc
integer, parameter v3dobc
integer, parameter r2dobc
integer, dimension(:), allocatable nstate
integer, dimension(:), allocatable n
integer, dimension(:), allocatable mstate
type(t_bounds), dimension(:), allocatable bounds
integer, dimension(:), allocatable nstr
integer, parameter b3dvar
integer, parameter r3dvar
integer, parameter r3dobc
integer, parameter l4dvar
integer, parameter v2dobc
type(t_iobounds), dimension(:), allocatable iobounds
integer, parameter u3dobc
integer, parameter u3dvar
integer, parameter u2dvar
integer, dimension(:), allocatable nend
integer, dimension(:), allocatable ntilei
integer, parameter w3dvar
integer, parameter p2dvar
integer, parameter r2dvar
integer, parameter l3dvar
integer, parameter v2dvar
integer, parameter p3dvar
integer, parameter v3dvar
integer, dimension(:), allocatable ntilej
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
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
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
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
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
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
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
type(io_desc_t), dimension(:), pointer iodesc_dp_trcvar
integer, dimension(:), allocatable ntc
subroutine, public finalize_pio
subroutine, public field_iodecomp(ng, iosystem, iotype, iodesc, gtype, ndims, lbk, ubk, lbt, ubt)
subroutine, public set_iodecomp
subroutine, public state_iodecomp(ng, iosystem, iotype, iodesc, iovname, ndims)
subroutine, public initialize_pio
logical function, public founderror(flag, noerr, line, routine)