Particularly useful in subroutines.
interface calcIndicesFromIndices subroutine calcIndicesFromIndicesDblDbl(oldIndices, newIndices, oldLbound, newLbound) real(double), intent(in) :: oldIndices(:) real(double), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesDblDbl subroutine calcIndicesFromIndicesDblI32(oldIndices, newIndices, oldLbound, newLbound) real(double), intent(in) :: oldIndices(:) integer(int32), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesDblI32 subroutine calcIndicesFromIndicesDblI16(oldIndices, newIndices, oldLbound, newLbound) real(double), intent(in) :: oldIndices(:) integer(int16), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesDblI16 subroutine calcIndicesFromIndicesSglSgl(oldIndices, newIndices, oldLbound, newLbound) real(single), intent(in) :: oldIndices(:) real(single), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesSglSgl subroutine calcIndicesFromIndicesSglI32(oldIndices, newIndices, oldLbound, newLbound) real(single), intent(in) :: oldIndices(:) integer(int32), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesSglI32 subroutine calcIndicesFromIndicesSglI16(oldIndices, newIndices, oldLbound, newLbound) real(single), intent(in) :: oldIndices(:) integer(int16), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesSglI16 subroutine calcIndicesFromIndicesI32I32(oldIndices, newIndices, oldLbound, newLbound) integer(int32), intent(in) :: oldIndices(:) integer(int32), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesI32I32 subroutine calcIndicesFromIndicesI16I16(oldIndices, newIndices, oldLbound, newLbound) integer(int16), intent(in) :: oldIndices(:) integer(int16), intent(out) :: newIndices(size(oldIndices)) integer, intent(in) :: oldLbound(size(oldIndices)) integer, intent(in), optional :: newLbound(size(oldIndices)) end subroutine calcIndicesFromIndicesI16I16 end interface
This calculates the indices (i,j) on the new frame converted from those on the old frame. The most likely case is to get a pair of indices of an array in a subroutine/function, all the lbound-s of which must be 1, from the old pair of indices, where the lbound-s can be arbitrary.
newLbound(:) is in default 1 (if not given).
The following is an example for a 1-dimension array.
integer :: ary(5:8) ary(7) = -99 ! i=7 is the 3rd element in the array. call aSub(iPoints=(/7/), lbounds=lbound(ary)) subroutine aSub(iPoints, lbounds) integer, intent(in) :: iPoints(:), lbounds(:) integer :: outAry(size(iPoints)) call getIndicesFromIndices(iPoints, outAry, lbounds) print *, outAry ! => 3 ! nb., the old index=7 corresponds to index=3 in the current context. end subroutine aSub