diff --git a/src/utilities.h b/src/utilities.h new file mode 100644 index 0000000000000000000000000000000000000000..35cf0ea4b3490f9f33bc3a17c6f0e81c649373c2 --- /dev/null +++ b/src/utilities.h @@ -0,0 +1,92 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2018 Jacob Kegerreis (jacob.kegerreis@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ + +#ifndef SWIFT_UTILITIES_H +#define SWIFT_UTILITIES_H + +/** + * @brief Search for a value in a monotonic array to find the index such that + * array[index] < value < array[index + 1] + * + * @param x The value to find + * @param arr The array to search + * @param n The length of the array + * @param i The found index + * + * Set -1 and n for x below and above the array edge values respectively. + */ +void find_value_in_monotonic_array(float x, float *arr, int n, int *i) { + + int is_incr = (arr[n-1] > arr[0]); // Increasing or decreasing? + int i_mid, i_low = 0, i_high = n; + + // Until arr[i_low] < x < arr[i_high=i_low+1] + while (i_high - i_low > 1) { + i_mid = (i_high + i_low) >> 1; // Middle index + + // If mid < x and increasing or x < mid and decreasing + if ((arr[i_mid] <= x) == is_incr) + i_low = i_mid; + else + i_high = i_mid; + } + + // Set i with the found i_low, or an error value if outside the array + if (x < arr[0]) + *i = -1; + else if (arr[n-1] <= x) + *i = n; + else + *i = i_low; +} + +#endif /* SWIFT_UTILITIES_H */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +