integer function fitp_intrv_helper(tt, x, n, periodic) result(index)
implicit none
integer, intent(in) :: n
real, intent(in) :: tt
real, dimension(n), intent(in) :: x
logical, intent(in) :: periodic
integer, save :: i = 1
integer :: il, ih, upper
if (periodic) then
upper = n
else
upper = n - 1
end if
!
! check for illegal i
!
if (i .ge. n) i = n / 2
!
! check old interval and extremes
!
if (tt .lt. x(i)) then
if (tt .le. x(2)) then
i = 1
index = 1
return
else
il = 2
ih = i
end if
else if (tt .le. x(i+1)) then
index = i
return
else if (tt .ge. x(upper)) then
i = upper
index = upper
return
else
il = i+1
ih = upper
end if
!
! binary search loop
!
do while (.true.)
i = (il + ih) / 2
if (tt < x(i)) then
ih = i
else if (tt > x(i + 1)) then
il = i + 1
else
index = i
exit
end if
end do
end function fitp_intrv_helper