| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | n_keep | |||
| integer, | intent(in) | :: | list_size | |||
| real(kind=dp), | intent(in) | :: | list(list_size) | |||
| integer, | intent(out) | :: | largest_indices(n_keep) |
subroutine return_largest_indices(n_keep, list_size, list, largest_indices) ! Return the indices of the largest elements in list. integer, intent(in) :: n_keep, list_size real(dp), intent(in) :: list(list_size) integer, intent(out) :: largest_indices(n_keep) integer :: i, j, ind, smallest_pos real(dp) :: smallest_sign, sign_curr, sign_curr_abs, low_sign largest_indices = 0 smallest_sign = 0.0_dp smallest_pos = 1 do i = 1, list_size sign_curr = list(i) sign_curr_abs = abs(sign_curr) if (sign_curr_abs > smallest_sign) then largest_indices(smallest_pos) = i low_sign = list(largest_indices(1)) smallest_sign = abs(low_sign) smallest_pos = 1 do j = 2, n_keep ind = largest_indices(j) if (ind == 0) then low_sign = 0.0_dp else low_sign = list(ind) end if sign_curr_abs = abs(low_sign) if (sign_curr_abs < smallest_sign .or. largest_indices(j) == 0) then smallest_pos = j smallest_sign = sign_curr_abs end if end do end if end do end subroutine return_largest_indices