find_index_bsearch Function

public pure function find_index_bsearch(list, val) result(ix)

Binary search of sorted list for the smallest ix such that list(ix) >= val. On failure, returns size(list)+1

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: list(:)

Sorted list

real(kind=dp), intent(in) :: val

Value to search for

Return Value integer


Called by

proc~~find_index_bsearch~~CalledByGraph proc~find_index_bsearch find_index_bsearch proc~find_index_adaptive find_index_adaptive proc~find_index_adaptive->proc~find_index_bsearch proc~lt_lin_interp_list LT_lin_interp_list proc~lt_lin_interp_list->proc~find_index_adaptive proc~lt_get_spaced_data LT_get_spaced_data proc~lt_get_spaced_data->proc~lt_lin_interp_list proc~lt2_set_col LT2_set_col proc~lt2_set_col->proc~lt_get_spaced_data proc~lt_add_col LT_add_col proc~lt_add_col->proc~lt_get_spaced_data proc~lt_set_col LT_set_col proc~lt_set_col->proc~lt_get_spaced_data

Source Code

  pure function find_index_bsearch(list, val) result(ix)
    real(dp), intent(in) :: list(:)
    !< Sorted list
    real(dp), intent(in) :: val
    !< Value to search for
    integer              :: ix, i_min, i_max, i_middle

    i_min = 1
    i_max = size(list)

    do while (i_min < i_max)
       ! This safely performs: i_middle = (i_max + i_min) / 2
       i_middle = i_min + ishft(i_max - i_min, -1)

       if (list(i_middle) >= val) then
          i_max = i_middle
       else
          i_min = i_middle + 1
       end if
    end do

    ix = i_min
    if (val > list(ix)) ix = size(list) + 1
  end function find_index_bsearch