subroutine GetIndexSpaceIrreg(minIndex, &
countsPerDEDim1,countsPerDeDim2, &
countsPerDEDim3, dimCount, minIndexOut, maxIndexOut, rc)
!!
! !ARGUMENTS:
integer, intent(in), optional :: minIndex(:)
integer, intent(in) :: countsPerDEDim1(:)
integer, intent(in) :: countsPerDEDim2(:)
integer, intent(in), optional :: countsPerDEDim3(:)
integer, intent(inout) :: dimCount
integer, pointer :: minIndexOut(:)
integer, pointer :: maxIndexOut(:)
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
!
! This is a routine to calculate the minIndex and maxIndex of an irregular distribution.
! The arguments are:
! \begin{description}
! \item[{[minIndex]}]
! Tuple to start the index ranges at. If not present, defaults
! to /1,1,1,.../.
! \item[{countsPerDEDim1}]
! This arrays specifies the number of cells per DE for index dimension 1
! for the exclusive region (the center stagger location).
! \item[{countsPerDEDim2}]
! This array specifies the number of cells per DE for index dimension 2
! for the exclusive region (center stagger location).
! \item[{[countsPerDEDim3]}]
! This array specifies the number of cells per DE for index dimension 3
! for the exclusive region (center stagger location).
! If not specified then grid is 2D.
! \item[{minIndexOut}]
! MinIndex of range, needs to be allocated to dimCount.
! \item[{maxIndexOut}]
! MaxIndex of range, needs to be allocated to dimCount.
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOPI
integer :: localrc
integer :: i
! Initialize return code; assume failure until success is certain
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! Compute the Grid DimCount
! dimCount
if (present(countsPerDEDim3)) then
dimCount=3
else
dimCount=2
endif
! Argument Consistency Checking
if (size(countsPerDEDim1) .lt. 1) then
call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, &
msg="- size 0 countsPerDEDim1 not allowed", &
ESMF_CONTEXT, rcToReturn=rc)
return
endif
if (size(countsPerDEDim2) .lt. 1) then
call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, &
msg="- size 0 countsPerDEDim2 not allowed", &
ESMF_CONTEXT, rcToReturn=rc)
return
endif
if (present(countsPerDEDim3)) then
if (size(countsPerDEDim3) .lt. 1) then
call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, &
msg="- size 0 countsPerDEDim3 not allowed", &
ESMF_CONTEXT, rcToReturn=rc)
return
endif
endif
if (present(minIndex)) then
if (size(minIndex) /= dimCount) then
call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, &
msg="- minIndex size must equal grid dimCount", &
ESMF_CONTEXT, rcToReturn=rc)
return
endif
endif
! Allocate minIndex
allocate(minIndexOut(dimCount), stat=localrc)
if (ESMF_LogFoundAllocError(localrc, msg="Allocating minIndexOut", &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set minIndex
if (present(minIndex)) then
minIndexOut(:)=minIndex(:)
else
do i=1,dimCount
minIndexOut(i)=1
enddo
endif
! Allocate maxIndex
allocate(maxIndexOut(dimCount), stat=localrc)
if (ESMF_LogFoundAllocError(localrc, msg="Allocating maxIndexOut", &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set maxIndex
maxIndexOut(1)=sum(countsPerDEDim1)+minIndexOut(1)-1
maxIndexOut(2)=sum(countsPerDEDim2)+minIndexOut(2)-1
if (dimCount > 2) then
maxIndexOut(3)=sum(countsPerDEDim3)+minIndexOut(3)-1
endif
! Return successfully
if (present(rc)) rc = ESMF_SUCCESS
end subroutine GetIndexSpaceIrreg