Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | minIndex(:) | |||
integer, | intent(in) | :: | maxIndex(:) | |||
integer, | intent(in) | :: | index(:) | |||
integer, | intent(out), | optional | :: | rc |
function ESMF_DistGridSeqIndex(minIndex, maxIndex, index, rc) ! ! !RETURN VALUE: integer :: ESMF_DistGridSeqIndex ! ! !ARGUMENTS: integer, intent(in) :: minIndex(:) integer, intent(in) :: maxIndex(:) integer, intent(in) :: index(:) integer, intent(out), optional :: rc ! ! !DESCRIPTION: ! Compute the canonical sequence index (single integer number) associated ! with the index tuple passed in as {\tt index}. Canonical indices start ! at 1 for the starting corner, specified via the {\tt minIndex} argument, ! and increase from there in column major fashion up to the end corner. The ! end corner is defined by the {\tt maxIndex} argument. ! ! If the {\tt index} tuple is not within the index space defined by ! {\tt minIndex} and {\tt maxIndex}, an invalid sequence index value ! of -1 is returned by this function. ! ! The size of {\tt minIndex}, {\tt maxIndex}, and {\tt index} must all be ! the same, or an error is returned in the return code. ! ! The arguments are: ! \begin{description} ! \item[minIndex] ! Index space tuple of the lower corner of the single tile. ! \item[maxIndex] ! Index space tuple of the upper corner of the single tile. ! \item[index] ! index space tuple of the index point to be converted into the ! sequence index. ! \item[{[rc]}] ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. ! \end{description} ! !EOPI !------------------------------------------------------------------------------ integer :: localrc ! local return code integer :: seqIndex integer :: i, count ! initialize return code; assume routine not implemented localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL ESMF_DistGridSeqIndex = -1 ! initialize to an invalid value ! error checking of the input count = size(minIndex) if (count /= size(maxIndex)) then call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, & msg="size(maxIndex) must match size(minIndex)", & ESMF_CONTEXT, rcToReturn=rc) return endif if (count /= size(index)) then call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_SIZE, & msg="size(index) must match size(minIndex)", & ESMF_CONTEXT, rcToReturn=rc) return endif seqIndex = 0 ! initialize to base 0 do i = count, 1, -1 ! error check: if (index(i)<minIndex(i) .or. index(i)>maxIndex(i)) then seqIndex = -2 ! will come out as -1 after the shift below exit endif ! first time multiply with zero intentionally: seqIndex = seqIndex * (maxIndex(i)-minIndex(i)+1) seqIndex = seqIndex + index(i)-minIndex(i) enddo seqIndex = seqIndex+1 ! shift sequence index to base 1 ! return successfully ESMF_DistGridSeqIndex = seqIndex if (present(rc)) rc = ESMF_SUCCESS end function ESMF_DistGridSeqIndex