1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay This file contains routines for sorting doubles. Values are sorted in place. 3e5c89e4eSSatish Balay These are provided because the general sort routines incur a great deal 4a5b23f4aSJose E. Roman of overhead in calling the comparison routines. 5e5c89e4eSSatish Balay 6e5c89e4eSSatish Balay */ 7c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 839f41f7fSStefano Zampini #include <petsc/private/petscimpl.h> 9e5c89e4eSSatish Balay 109371c9d4SSatish Balay #define SWAP(a, b, t) \ 11a8f51744SPierre Jolivet do { \ 129371c9d4SSatish Balay t = a; \ 139371c9d4SSatish Balay a = b; \ 149371c9d4SSatish Balay b = t; \ 15a8f51744SPierre Jolivet } while (0) 16e5c89e4eSSatish Balay 176a7c706bSVaclav Hapla /*@ 18811af0c4SBarry Smith PetscSortedReal - Determines whether the array of `PetscReal` is sorted. 196a7c706bSVaclav Hapla 206a7c706bSVaclav Hapla Not Collective 216a7c706bSVaclav Hapla 226a7c706bSVaclav Hapla Input Parameters: 236a7c706bSVaclav Hapla + n - number of values 246a7c706bSVaclav Hapla - X - array of integers 256a7c706bSVaclav Hapla 262fe279fdSBarry Smith Output Parameter: 276a7c706bSVaclav Hapla . sorted - flag whether the array is sorted 286a7c706bSVaclav Hapla 296a7c706bSVaclav Hapla Level: intermediate 306a7c706bSVaclav Hapla 31db781477SPatrick Sanan .seealso: `PetscSortReal()`, `PetscSortedInt()`, `PetscSortedMPIInt()` 326a7c706bSVaclav Hapla @*/ 33d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortedReal(PetscInt n, const PetscReal X[], PetscBool *sorted) 34d71ae5a4SJacob Faibussowitsch { 356a7c706bSVaclav Hapla PetscFunctionBegin; 366a7c706bSVaclav Hapla PetscSorted(n, X, *sorted); 373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 386a7c706bSVaclav Hapla } 396a7c706bSVaclav Hapla 40e5c89e4eSSatish Balay /* A simple version of quicksort; taken from Kernighan and Ritchie, page 87 */ 41d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSortReal_Private(PetscReal *v, PetscInt right) 42d71ae5a4SJacob Faibussowitsch { 43e5c89e4eSSatish Balay PetscInt i, last; 44e5c89e4eSSatish Balay PetscReal vl, tmp; 45e5c89e4eSSatish Balay 46e5c89e4eSSatish Balay PetscFunctionBegin; 47e5c89e4eSSatish Balay if (right <= 1) { 48e5c89e4eSSatish Balay if (right == 1) { 49e5c89e4eSSatish Balay if (v[0] > v[1]) SWAP(v[0], v[1], tmp); 50e5c89e4eSSatish Balay } 513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 52e5c89e4eSSatish Balay } 53e5c89e4eSSatish Balay SWAP(v[0], v[right / 2], tmp); 54e5c89e4eSSatish Balay vl = v[0]; 55e5c89e4eSSatish Balay last = 0; 56e5c89e4eSSatish Balay for (i = 1; i <= right; i++) { 579371c9d4SSatish Balay if (v[i] < vl) { 589371c9d4SSatish Balay last++; 599371c9d4SSatish Balay SWAP(v[last], v[i], tmp); 609371c9d4SSatish Balay } 61e5c89e4eSSatish Balay } 62e5c89e4eSSatish Balay SWAP(v[0], v[last], tmp); 633ba16761SJacob Faibussowitsch PetscCall(PetscSortReal_Private(v, last - 1)); 643ba16761SJacob Faibussowitsch PetscCall(PetscSortReal_Private(v + last + 1, right - (last + 1))); 653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 66e5c89e4eSSatish Balay } 67e5c89e4eSSatish Balay 68e5c89e4eSSatish Balay /*@ 69811af0c4SBarry Smith PetscSortReal - Sorts an array of `PetscReal` in place in increasing order. 70e5c89e4eSSatish Balay 71e5c89e4eSSatish Balay Not Collective 72e5c89e4eSSatish Balay 73e5c89e4eSSatish Balay Input Parameters: 74e5c89e4eSSatish Balay + n - number of values 75e5c89e4eSSatish Balay - v - array of doubles 76e5c89e4eSSatish Balay 77667f096bSBarry Smith Level: intermediate 78667f096bSBarry Smith 79811af0c4SBarry Smith Note: 80811af0c4SBarry Smith This function serves as an alternative to `PetscRealSortSemiOrdered()`, and may perform faster especially if the array 81a5b23f4aSJose E. Roman is completely random. There are exceptions to this and so it is __highly__ recommended that the user benchmark their 82676f2a66SJacob Faibussowitsch code to see which routine is fastest. 83676f2a66SJacob Faibussowitsch 84db781477SPatrick Sanan .seealso: `PetscRealSortSemiOrdered()`, `PetscSortInt()`, `PetscSortRealWithPermutation()`, `PetscSortRealWithArrayInt()` 85e5c89e4eSSatish Balay @*/ 86d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortReal(PetscInt n, PetscReal v[]) 87d71ae5a4SJacob Faibussowitsch { 88e5c89e4eSSatish Balay PetscInt j, k; 89e5c89e4eSSatish Balay PetscReal tmp, vk; 90e5c89e4eSSatish Balay 91e5c89e4eSSatish Balay PetscFunctionBegin; 924f572ea9SToby Isaac PetscAssertPointer(v, 2); 93e5c89e4eSSatish Balay if (n < 8) { 94e5c89e4eSSatish Balay for (k = 0; k < n; k++) { 95e5c89e4eSSatish Balay vk = v[k]; 96e5c89e4eSSatish Balay for (j = k + 1; j < n; j++) { 97e5c89e4eSSatish Balay if (vk > v[j]) { 98e5c89e4eSSatish Balay SWAP(v[k], v[j], tmp); 99e5c89e4eSSatish Balay vk = v[k]; 100e5c89e4eSSatish Balay } 101e5c89e4eSSatish Balay } 102e5c89e4eSSatish Balay } 1033ba16761SJacob Faibussowitsch } else PetscCall(PetscSortReal_Private(v, n - 1)); 1043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 105e5c89e4eSSatish Balay } 106e5c89e4eSSatish Balay 1079371c9d4SSatish Balay #define SWAP2ri(a, b, c, d, rt, it) \ 108a8f51744SPierre Jolivet do { \ 1099371c9d4SSatish Balay rt = a; \ 1109371c9d4SSatish Balay a = b; \ 1119371c9d4SSatish Balay b = rt; \ 1129371c9d4SSatish Balay it = c; \ 1139371c9d4SSatish Balay c = d; \ 1149371c9d4SSatish Balay d = it; \ 115a8f51744SPierre Jolivet } while (0) 11639f41f7fSStefano Zampini 11739f41f7fSStefano Zampini /* modified from PetscSortIntWithArray_Private */ 118d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscSortRealWithArrayInt_Private(PetscReal *v, PetscInt *V, PetscInt right) 119d71ae5a4SJacob Faibussowitsch { 12039f41f7fSStefano Zampini PetscInt i, last, itmp; 12139f41f7fSStefano Zampini PetscReal rvl, rtmp; 12239f41f7fSStefano Zampini 12339f41f7fSStefano Zampini PetscFunctionBegin; 12439f41f7fSStefano Zampini if (right <= 1) { 12539f41f7fSStefano Zampini if (right == 1) { 12639f41f7fSStefano Zampini if (v[0] > v[1]) SWAP2ri(v[0], v[1], V[0], V[1], rtmp, itmp); 12739f41f7fSStefano Zampini } 1283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12939f41f7fSStefano Zampini } 13039f41f7fSStefano Zampini SWAP2ri(v[0], v[right / 2], V[0], V[right / 2], rtmp, itmp); 13139f41f7fSStefano Zampini rvl = v[0]; 13239f41f7fSStefano Zampini last = 0; 13339f41f7fSStefano Zampini for (i = 1; i <= right; i++) { 1349371c9d4SSatish Balay if (v[i] < rvl) { 1359371c9d4SSatish Balay last++; 1369371c9d4SSatish Balay SWAP2ri(v[last], v[i], V[last], V[i], rtmp, itmp); 1379371c9d4SSatish Balay } 13839f41f7fSStefano Zampini } 13939f41f7fSStefano Zampini SWAP2ri(v[0], v[last], V[0], V[last], rtmp, itmp); 1409566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithArrayInt_Private(v, V, last - 1)); 1419566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithArrayInt_Private(v + last + 1, V + last + 1, right - (last + 1))); 1423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14339f41f7fSStefano Zampini } 14439f41f7fSStefano Zampini /*@ 145811af0c4SBarry Smith PetscSortRealWithArrayInt - Sorts an array of `PetscReal` in place in increasing order; 146811af0c4SBarry Smith changes a second `PetscInt` array to match the sorted first array. 14739f41f7fSStefano Zampini 14839f41f7fSStefano Zampini Not Collective 14939f41f7fSStefano Zampini 15039f41f7fSStefano Zampini Input Parameters: 15139f41f7fSStefano Zampini + n - number of values 152aec76313SJacob Faibussowitsch . Ii - array of integers 153aec76313SJacob Faibussowitsch - r - second array of integers 15439f41f7fSStefano Zampini 15539f41f7fSStefano Zampini Level: intermediate 15639f41f7fSStefano Zampini 157db781477SPatrick Sanan .seealso: `PetscSortReal()` 15839f41f7fSStefano Zampini @*/ 159d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortRealWithArrayInt(PetscInt n, PetscReal r[], PetscInt Ii[]) 160d71ae5a4SJacob Faibussowitsch { 16139f41f7fSStefano Zampini PetscInt j, k, itmp; 16239f41f7fSStefano Zampini PetscReal rk, rtmp; 16339f41f7fSStefano Zampini 16439f41f7fSStefano Zampini PetscFunctionBegin; 1654f572ea9SToby Isaac PetscAssertPointer(r, 2); 1664f572ea9SToby Isaac PetscAssertPointer(Ii, 3); 16739f41f7fSStefano Zampini if (n < 8) { 16839f41f7fSStefano Zampini for (k = 0; k < n; k++) { 16939f41f7fSStefano Zampini rk = r[k]; 17039f41f7fSStefano Zampini for (j = k + 1; j < n; j++) { 17139f41f7fSStefano Zampini if (rk > r[j]) { 17239f41f7fSStefano Zampini SWAP2ri(r[k], r[j], Ii[k], Ii[j], rtmp, itmp); 17339f41f7fSStefano Zampini rk = r[k]; 17439f41f7fSStefano Zampini } 17539f41f7fSStefano Zampini } 17639f41f7fSStefano Zampini } 17739f41f7fSStefano Zampini } else { 1789566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithArrayInt_Private(r, Ii, n - 1)); 17939f41f7fSStefano Zampini } 1803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18139f41f7fSStefano Zampini } 18239f41f7fSStefano Zampini 18339f41f7fSStefano Zampini /*@ 1847a43aa34SPierre Jolivet PetscFindReal - Finds a `PetscReal` in a sorted array of `PetscReal`s 18539f41f7fSStefano Zampini 18639f41f7fSStefano Zampini Not Collective 18739f41f7fSStefano Zampini 18839f41f7fSStefano Zampini Input Parameters: 18939f41f7fSStefano Zampini + key - the value to locate 19039f41f7fSStefano Zampini . n - number of values in the array 191aec76313SJacob Faibussowitsch . t - array of values 19239f41f7fSStefano Zampini - eps - tolerance used to compare 19339f41f7fSStefano Zampini 19439f41f7fSStefano Zampini Output Parameter: 19539f41f7fSStefano Zampini . loc - the location if found, otherwise -(slot+1) where slot is the place the value would go 19639f41f7fSStefano Zampini 19739f41f7fSStefano Zampini Level: intermediate 19839f41f7fSStefano Zampini 199db781477SPatrick Sanan .seealso: `PetscSortReal()`, `PetscSortRealWithArrayInt()` 20039f41f7fSStefano Zampini @*/ 201d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscFindReal(PetscReal key, PetscInt n, const PetscReal t[], PetscReal eps, PetscInt *loc) 202d71ae5a4SJacob Faibussowitsch { 20339f41f7fSStefano Zampini PetscInt lo = 0, hi = n; 20439f41f7fSStefano Zampini 20539f41f7fSStefano Zampini PetscFunctionBegin; 2064f572ea9SToby Isaac PetscAssertPointer(loc, 5); 2079371c9d4SSatish Balay if (!n) { 2089371c9d4SSatish Balay *loc = -1; 2093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2109371c9d4SSatish Balay } 2114f572ea9SToby Isaac PetscAssertPointer(t, 3); 21239f41f7fSStefano Zampini while (hi - lo > 1) { 21339f41f7fSStefano Zampini PetscInt mid = lo + (hi - lo) / 2; 214*42f965a0SMatthew G. Knepley PetscAssert(t[lo] <= t[mid] && t[mid] <= t[hi - 1], PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Input array was not sorted: (%g, %g, %g)", (double)t[lo], (double)t[mid], (double)t[hi - 1]); 21539f41f7fSStefano Zampini if (key < t[mid]) hi = mid; 21639f41f7fSStefano Zampini else lo = mid; 21739f41f7fSStefano Zampini } 21839f41f7fSStefano Zampini *loc = (PetscAbsReal(key - t[lo]) < eps) ? lo : -(lo + (key > t[lo]) + 1); 2193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22039f41f7fSStefano Zampini } 221745b41b2SMatthew G. Knepley 222745b41b2SMatthew G. Knepley /*@ 223811af0c4SBarry Smith PetscSortRemoveDupsReal - Sorts an array of `PetscReal` in place in increasing order and removes all duplicate entries 224745b41b2SMatthew G. Knepley 225745b41b2SMatthew G. Knepley Not Collective 226745b41b2SMatthew G. Knepley 227745b41b2SMatthew G. Knepley Input Parameters: 228745b41b2SMatthew G. Knepley + n - number of values 229745b41b2SMatthew G. Knepley - v - array of doubles 230745b41b2SMatthew G. Knepley 231745b41b2SMatthew G. Knepley Output Parameter: 232745b41b2SMatthew G. Knepley . n - number of non-redundant values 233745b41b2SMatthew G. Knepley 234745b41b2SMatthew G. Knepley Level: intermediate 235745b41b2SMatthew G. Knepley 236db781477SPatrick Sanan .seealso: `PetscSortReal()`, `PetscSortRemoveDupsInt()` 237745b41b2SMatthew G. Knepley @*/ 238d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortRemoveDupsReal(PetscInt *n, PetscReal v[]) 239d71ae5a4SJacob Faibussowitsch { 240745b41b2SMatthew G. Knepley PetscInt i, s = 0, N = *n, b = 0; 241745b41b2SMatthew G. Knepley 242745b41b2SMatthew G. Knepley PetscFunctionBegin; 2439566063dSJacob Faibussowitsch PetscCall(PetscSortReal(N, v)); 244745b41b2SMatthew G. Knepley for (i = 0; i < N - 1; i++) { 245745b41b2SMatthew G. Knepley if (v[b + s + 1] != v[b]) { 2469371c9d4SSatish Balay v[b + 1] = v[b + s + 1]; 2479371c9d4SSatish Balay b++; 248745b41b2SMatthew G. Knepley } else s++; 249745b41b2SMatthew G. Knepley } 250745b41b2SMatthew G. Knepley *n = N - s; 2513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 252745b41b2SMatthew G. Knepley } 253745b41b2SMatthew G. Knepley 254d97c5584SHong Zhang /*@ 255811af0c4SBarry Smith PetscSortSplit - Quick-sort split of an array of `PetscScalar`s in place. 256d97c5584SHong Zhang 257d97c5584SHong Zhang Not Collective 258d97c5584SHong Zhang 259d97c5584SHong Zhang Input Parameters: 2607a43aa34SPierre Jolivet + ncut - splitting index 2616b867d5aSJose E. Roman - n - number of values to sort 262d97c5584SHong Zhang 2636b867d5aSJose E. Roman Input/Output Parameters: 2646b867d5aSJose E. Roman + a - array of values, on output the values are permuted such that its elements satisfy: 265d97c5584SHong Zhang abs(a[i]) >= abs(a[ncut-1]) for i < ncut and 266d97c5584SHong Zhang abs(a[i]) <= abs(a[ncut-1]) for i >= ncut 2676b867d5aSJose E. Roman - idx - index for array a, on output permuted accordingly 268d97c5584SHong Zhang 269d97c5584SHong Zhang Level: intermediate 270d97c5584SHong Zhang 271db781477SPatrick Sanan .seealso: `PetscSortInt()`, `PetscSortRealWithPermutation()` 272d97c5584SHong Zhang @*/ 273d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortSplit(PetscInt ncut, PetscInt n, PetscScalar a[], PetscInt idx[]) 274d71ae5a4SJacob Faibussowitsch { 275d97c5584SHong Zhang PetscInt i, mid, last, itmp, j, first; 276d97c5584SHong Zhang PetscScalar d, tmp; 277d97c5584SHong Zhang PetscReal abskey; 278d97c5584SHong Zhang 279d97c5584SHong Zhang PetscFunctionBegin; 280d97c5584SHong Zhang first = 0; 281d97c5584SHong Zhang last = n - 1; 2823ba16761SJacob Faibussowitsch if (ncut < first || ncut > last) PetscFunctionReturn(PETSC_SUCCESS); 283d97c5584SHong Zhang 284d97c5584SHong Zhang while (1) { 285d97c5584SHong Zhang mid = first; 2862a274a78SSatish Balay d = a[mid]; 2872a274a78SSatish Balay abskey = PetscAbsScalar(d); 288d97c5584SHong Zhang i = last; 289d97c5584SHong Zhang for (j = first + 1; j <= i; ++j) { 2902a274a78SSatish Balay d = a[j]; 2912a274a78SSatish Balay if (PetscAbsScalar(d) >= abskey) { 292d97c5584SHong Zhang ++mid; 293d97c5584SHong Zhang /* interchange */ 2949371c9d4SSatish Balay tmp = a[mid]; 2959371c9d4SSatish Balay itmp = idx[mid]; 2969371c9d4SSatish Balay a[mid] = a[j]; 2979371c9d4SSatish Balay idx[mid] = idx[j]; 2989371c9d4SSatish Balay a[j] = tmp; 2999371c9d4SSatish Balay idx[j] = itmp; 300d97c5584SHong Zhang } 301d97c5584SHong Zhang } 302d97c5584SHong Zhang 303d97c5584SHong Zhang /* interchange */ 3049371c9d4SSatish Balay tmp = a[mid]; 3059371c9d4SSatish Balay itmp = idx[mid]; 3069371c9d4SSatish Balay a[mid] = a[first]; 3079371c9d4SSatish Balay idx[mid] = idx[first]; 3089371c9d4SSatish Balay a[first] = tmp; 3099371c9d4SSatish Balay idx[first] = itmp; 310d97c5584SHong Zhang 311d97c5584SHong Zhang /* test for while loop */ 312a297a907SKarl Rupp if (mid == ncut) break; 313a297a907SKarl Rupp else if (mid > ncut) last = mid - 1; 314a297a907SKarl Rupp else first = mid + 1; 315d97c5584SHong Zhang } 3163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 317d97c5584SHong Zhang } 318021822bcSHong Zhang 319021822bcSHong Zhang /*@ 320811af0c4SBarry Smith PetscSortSplitReal - Quick-sort split of an array of `PetscReal`s in place. 321021822bcSHong Zhang 322021822bcSHong Zhang Not Collective 323021822bcSHong Zhang 324021822bcSHong Zhang Input Parameters: 3257a43aa34SPierre Jolivet + ncut - splitting index 3266b867d5aSJose E. Roman - n - number of values to sort 327021822bcSHong Zhang 3286b867d5aSJose E. Roman Input/Output Parameters: 3296b867d5aSJose E. Roman + a - array of values, on output the values are permuted such that its elements satisfy: 330021822bcSHong Zhang abs(a[i]) >= abs(a[ncut-1]) for i < ncut and 331021822bcSHong Zhang abs(a[i]) <= abs(a[ncut-1]) for i >= ncut 3326b867d5aSJose E. Roman - idx - index for array a, on output permuted accordingly 333021822bcSHong Zhang 334021822bcSHong Zhang Level: intermediate 335021822bcSHong Zhang 336db781477SPatrick Sanan .seealso: `PetscSortInt()`, `PetscSortRealWithPermutation()` 337021822bcSHong Zhang @*/ 338d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSortSplitReal(PetscInt ncut, PetscInt n, PetscReal a[], PetscInt idx[]) 339d71ae5a4SJacob Faibussowitsch { 340021822bcSHong Zhang PetscInt i, mid, last, itmp, j, first; 341021822bcSHong Zhang PetscReal d, tmp; 342021822bcSHong Zhang PetscReal abskey; 343021822bcSHong Zhang 344021822bcSHong Zhang PetscFunctionBegin; 345021822bcSHong Zhang first = 0; 346021822bcSHong Zhang last = n - 1; 3473ba16761SJacob Faibussowitsch if (ncut < first || ncut > last) PetscFunctionReturn(PETSC_SUCCESS); 348021822bcSHong Zhang 349021822bcSHong Zhang while (1) { 350021822bcSHong Zhang mid = first; 3512a274a78SSatish Balay d = a[mid]; 3522a274a78SSatish Balay abskey = PetscAbsReal(d); 353021822bcSHong Zhang i = last; 354021822bcSHong Zhang for (j = first + 1; j <= i; ++j) { 3552a274a78SSatish Balay d = a[j]; 3562a274a78SSatish Balay if (PetscAbsReal(d) >= abskey) { 357021822bcSHong Zhang ++mid; 358021822bcSHong Zhang /* interchange */ 3599371c9d4SSatish Balay tmp = a[mid]; 3609371c9d4SSatish Balay itmp = idx[mid]; 3619371c9d4SSatish Balay a[mid] = a[j]; 3629371c9d4SSatish Balay idx[mid] = idx[j]; 3639371c9d4SSatish Balay a[j] = tmp; 3649371c9d4SSatish Balay idx[j] = itmp; 365021822bcSHong Zhang } 366021822bcSHong Zhang } 367021822bcSHong Zhang 368021822bcSHong Zhang /* interchange */ 3699371c9d4SSatish Balay tmp = a[mid]; 3709371c9d4SSatish Balay itmp = idx[mid]; 3719371c9d4SSatish Balay a[mid] = a[first]; 3729371c9d4SSatish Balay idx[mid] = idx[first]; 3739371c9d4SSatish Balay a[first] = tmp; 3749371c9d4SSatish Balay idx[first] = itmp; 375021822bcSHong Zhang 376021822bcSHong Zhang /* test for while loop */ 377a297a907SKarl Rupp if (mid == ncut) break; 378a297a907SKarl Rupp else if (mid > ncut) last = mid - 1; 379a297a907SKarl Rupp else first = mid + 1; 380021822bcSHong Zhang } 3813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 382021822bcSHong Zhang } 383