Edit PIO_initdecomp examples here.
subroutine GetIODOF(ndims, gdims, iorank, iodof, start, count, decompz)
integer, intent(in) :: ndims
integer, intent(in) :: gdims(ndims)
integer, intent(in) :: iorank
logical, intent(in), optional :: decompz
integer(kind=PIO_Offset), intent(out) :: start(ndims), count(ndims)
integer, intent(out), allocatable :: iodof(:)
integer :: nzrank, nxrank, nx, k, i, j, l_ndims, icnt
start=1
count=0
if(iorank>=0) then
if(present(decompz)) then
if(decompz) then
l_ndims=ndims
else
l_ndims=ndims-1
count(ndims)=gdims(ndims)
start(ndims)=1
endif
else
l_ndims=ndims
end if
nx=num_io_procs
count(l_ndims)=max(1,gdims(l_ndims)/num_io_procs)
nx=max(1,num_io_procs/gdims(l_ndims))
nzrank=iorank/nx
k=num_io_procs-gdims(l_ndims)*nx
if(iorank>num_io_procs-k-1.and.k>0) then
nzrank=gdims(l_ndims)-1
end if
start(l_ndims)=nzrank*count(l_ndims)+1
if(gdims(l_ndims)>num_io_procs) then
k=gdims(l_ndims)-num_io_procs*count(l_ndims)
if(k>iorank) then
count(l_ndims)=count(l_ndims)+1
end if
if(k>=iorank) then
start(l_ndims)=start(l_ndims)+iorank
else
start(l_ndims)=start(l_ndims)+k
end if
end if
if(k>0 .and.nzrank==gdims(l_ndims)-1 ) then
nx=nx+k
end if
nxrank=iorank
do i=l_ndims-1,1,-1
nxrank=mod(nxrank,nx)
count(i)=gdims(i)/nx
k=gdims(i)-count(i)*nx
if(nxrank<k) then
count(i)=count(i)+1
start(i)=count(i)*nxrank+1
else
start(i)=count(i)*nxrank+k+1
end if
nx=max(1,num_io_procs/gdims(i))
end do
h3. print *,__FILE__,__LINE__,start(1:ndims),count(1:ndims)
icnt=0
if(ndims.eq.1) then
allocate(iodof(count(1)))
do i=start(1),start(1)+count(1)-1
iodof(i)=i
end do
else if(ndims.eq.2) then
allocate(iodof(count(1)*count(2)))
do j=start(2),start(2)+count(2)-1
do i=start(1),start(1)+count(1)-1
icnt=icnt+1
iodof(icnt)=i+gdims(1)*(j-1)
end do
end do
else
allocate(iodof(count(1)[count(2)]count(3)))
do k=start(3),start(3)+count(3)-1
do j=start(2),start(2)+count(2)-1
do i=start(1),start(1)+count(1)-1
icnt=icnt+1
iodof(icnt)=i+gdims(1)[(j-1)+gdims(1)]gdims(2)*(k-1)
if(iodof(icnt).eq.577.or.iodof(icnt).eq.221185) then
print *,__FILE__,__LINE__,iodof(icnt),icnt,i,j,k
end if
end do
end do
end do
end if
h3. print *,__FILE__,__LINE__,minval(iodof),maxval(iodof),icnt,start(1:ndims),count(1:ndims)
else
allocate(iodof(1))
iodof=-1
end if
end subroutine GetIODOF