1827bd09bSSatish Balay /**********************************ivec.c************************************** 2827bd09bSSatish Balay 3827bd09bSSatish Balay Author: Henry M. Tufo III 4827bd09bSSatish Balay 5827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 6827bd09bSSatish Balay 7827bd09bSSatish Balay snail-mail: 8827bd09bSSatish Balay Division of Applied Mathematics 9827bd09bSSatish Balay Brown University 10827bd09bSSatish Balay Providence, RI 02912 11827bd09bSSatish Balay 12827bd09bSSatish Balay Last Modification: 13827bd09bSSatish Balay 6.21.97 14827bd09bSSatish Balay ***********************************ivec.c*************************************/ 15827bd09bSSatish Balay 16c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h> 17827bd09bSSatish Balay 18827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 19827bd09bSSatish Balay #define SORT_OPT 6 20827bd09bSSatish Balay #define SORT_STACK 50000 21827bd09bSSatish Balay 22827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 23827bd09bSSatish Balay static void *offset_stack[2 * SORT_STACK]; 2452f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK]; 25827bd09bSSatish Balay 267b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 27d71ae5a4SJacob Faibussowitsch PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n) 28d71ae5a4SJacob Faibussowitsch { 292fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 304ad8454bSPierre Jolivet return arg1; 31827bd09bSSatish Balay } 32827bd09bSSatish Balay 337b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 34d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n) 35d71ae5a4SJacob Faibussowitsch { 363fdc5746SBarry Smith PetscFunctionBegin; 372fa5cd67SKarl Rupp while (n--) *arg1++ = 0; 383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 39827bd09bSSatish Balay } 40827bd09bSSatish Balay 417b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 42d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n) 43d71ae5a4SJacob Faibussowitsch { 443fdc5746SBarry Smith PetscFunctionBegin; 452fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 47827bd09bSSatish Balay } 48827bd09bSSatish Balay 497b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 50d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_max(PetscInt *arg1, PetscInt *arg2, PetscInt n) 51d71ae5a4SJacob Faibussowitsch { 523fdc5746SBarry Smith PetscFunctionBegin; 539371c9d4SSatish Balay while (n--) { 549371c9d4SSatish Balay *arg1 = PetscMax(*arg1, *arg2); 559371c9d4SSatish Balay arg1++; 569371c9d4SSatish Balay arg2++; 579371c9d4SSatish Balay } 583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 59827bd09bSSatish Balay } 60827bd09bSSatish Balay 617b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 62d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_min(PetscInt *arg1, PetscInt *arg2, PetscInt n) 63d71ae5a4SJacob Faibussowitsch { 643fdc5746SBarry Smith PetscFunctionBegin; 652fa5cd67SKarl Rupp while (n--) { 662fa5cd67SKarl Rupp *(arg1) = PetscMin(*arg1, *arg2); 672fa5cd67SKarl Rupp arg1++; 682fa5cd67SKarl Rupp arg2++; 692fa5cd67SKarl Rupp } 703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71827bd09bSSatish Balay } 72827bd09bSSatish Balay 737b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 74d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1, PetscInt *arg2, PetscInt n) 75d71ae5a4SJacob Faibussowitsch { 763fdc5746SBarry Smith PetscFunctionBegin; 772fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79827bd09bSSatish Balay } 80827bd09bSSatish Balay 817b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 82d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_add(PetscInt *arg1, PetscInt *arg2, PetscInt n) 83d71ae5a4SJacob Faibussowitsch { 843fdc5746SBarry Smith PetscFunctionBegin; 852fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 87827bd09bSSatish Balay } 88827bd09bSSatish Balay 897b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 90d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 91d71ae5a4SJacob Faibussowitsch { 923fdc5746SBarry Smith PetscFunctionBegin; 932fa5cd67SKarl Rupp while (n--) { 9457508eceSPierre Jolivet *arg1 = (*arg1 || *arg2) && !(*arg1 && *arg2); 952fa5cd67SKarl Rupp arg1++; 962fa5cd67SKarl Rupp arg2++; 972fa5cd67SKarl Rupp } 983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 99827bd09bSSatish Balay } 100827bd09bSSatish Balay 1017b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 102d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 103d71ae5a4SJacob Faibussowitsch { 1043fdc5746SBarry Smith PetscFunctionBegin; 1052fa5cd67SKarl Rupp while (n--) *arg1++ ^= *arg2++; 1063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 107827bd09bSSatish Balay } 108827bd09bSSatish Balay 1097b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 110d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_or(PetscInt *arg1, PetscInt *arg2, PetscInt n) 111d71ae5a4SJacob Faibussowitsch { 1123fdc5746SBarry Smith PetscFunctionBegin; 1132fa5cd67SKarl Rupp while (n--) *arg1++ |= *arg2++; 1143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 115827bd09bSSatish Balay } 116827bd09bSSatish Balay 1177b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 118d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 119d71ae5a4SJacob Faibussowitsch { 1203fdc5746SBarry Smith PetscFunctionBegin; 1212fa5cd67SKarl Rupp while (n--) { 1222fa5cd67SKarl Rupp *arg1 = (*arg1 || *arg2); 1232fa5cd67SKarl Rupp arg1++; 1242fa5cd67SKarl Rupp arg2++; 1252fa5cd67SKarl Rupp } 1263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 127827bd09bSSatish Balay } 128827bd09bSSatish Balay 1297b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 130d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_and(PetscInt *arg1, PetscInt *arg2, PetscInt n) 131d71ae5a4SJacob Faibussowitsch { 1323fdc5746SBarry Smith PetscFunctionBegin; 1332fa5cd67SKarl Rupp while (n--) *arg1++ &= *arg2++; 1343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 135827bd09bSSatish Balay } 136827bd09bSSatish Balay 1377b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 138d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_land(PetscInt *arg1, PetscInt *arg2, PetscInt n) 139d71ae5a4SJacob Faibussowitsch { 1403fdc5746SBarry Smith PetscFunctionBegin; 1412fa5cd67SKarl Rupp while (n--) { 1422fa5cd67SKarl Rupp *arg1 = (*arg1 && *arg2); 1432fa5cd67SKarl Rupp arg1++; 1442fa5cd67SKarl Rupp arg2++; 1452fa5cd67SKarl Rupp } 1463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 147827bd09bSSatish Balay } 148827bd09bSSatish Balay 1497b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 150d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 151d71ae5a4SJacob Faibussowitsch { 1523fdc5746SBarry Smith PetscFunctionBegin; 1532fa5cd67SKarl Rupp while (n--) *arg1++ = (*arg2++ & *arg3++); 1543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 155827bd09bSSatish Balay } 156827bd09bSSatish Balay 1577b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 158d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_sum(PetscInt *arg1, PetscInt n) 159d71ae5a4SJacob Faibussowitsch { 16052f87cdaSBarry Smith PetscInt tmp = 0; 1612fa5cd67SKarl Rupp while (n--) tmp += *arg1++; 1624ad8454bSPierre Jolivet return tmp; 163827bd09bSSatish Balay } 164827bd09bSSatish Balay 1657b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 166d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, ...) 167d71ae5a4SJacob Faibussowitsch { 16852f87cdaSBarry Smith PetscInt i, j, type; 1696ae68b59SBarry Smith PetscInt *arg3; 1706ae68b59SBarry Smith va_list ap; 171827bd09bSSatish Balay 1723fdc5746SBarry Smith PetscFunctionBegin; 1736ae68b59SBarry Smith va_start(ap, n); 1746ae68b59SBarry Smith arg3 = va_arg(ap, PetscInt *); 1756ae68b59SBarry Smith va_end(ap); 1766ae68b59SBarry Smith 177827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 178db4deed7SKarl Rupp for (i = 0; i < n;) { 179827bd09bSSatish Balay /* clump 'em for now */ 180827bd09bSSatish Balay j = i + 1; 181827bd09bSSatish Balay type = arg3[i]; 1822fa5cd67SKarl Rupp while ((j < n) && (arg3[j] == type)) j++; 183827bd09bSSatish Balay 184827bd09bSSatish Balay /* how many together */ 185827bd09bSSatish Balay j -= i; 186827bd09bSSatish Balay 187827bd09bSSatish Balay /* call appropriate ivec function */ 1883ba16761SJacob Faibussowitsch if (type == GL_MAX) PetscCall(PCTFS_ivec_max(arg1, arg2, j)); 1893ba16761SJacob Faibussowitsch else if (type == GL_MIN) PetscCall(PCTFS_ivec_min(arg1, arg2, j)); 1903ba16761SJacob Faibussowitsch else if (type == GL_MULT) PetscCall(PCTFS_ivec_mult(arg1, arg2, j)); 1913ba16761SJacob Faibussowitsch else if (type == GL_ADD) PetscCall(PCTFS_ivec_add(arg1, arg2, j)); 1923ba16761SJacob Faibussowitsch else if (type == GL_B_XOR) PetscCall(PCTFS_ivec_xor(arg1, arg2, j)); 1933ba16761SJacob Faibussowitsch else if (type == GL_B_OR) PetscCall(PCTFS_ivec_or(arg1, arg2, j)); 1943ba16761SJacob Faibussowitsch else if (type == GL_B_AND) PetscCall(PCTFS_ivec_and(arg1, arg2, j)); 1953ba16761SJacob Faibussowitsch else if (type == GL_L_XOR) PetscCall(PCTFS_ivec_lxor(arg1, arg2, j)); 1963ba16761SJacob Faibussowitsch else if (type == GL_L_OR) PetscCall(PCTFS_ivec_lor(arg1, arg2, j)); 1973ba16761SJacob Faibussowitsch else if (type == GL_L_AND) PetscCall(PCTFS_ivec_land(arg1, arg2, j)); 198db4deed7SKarl Rupp else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "unrecognized type passed to PCTFS_ivec_non_uniform()!"); 199827bd09bSSatish Balay 2009371c9d4SSatish Balay arg1 += j; 2019371c9d4SSatish Balay arg2 += j; 2029371c9d4SSatish Balay i += j; 203827bd09bSSatish Balay } 2043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 205827bd09bSSatish Balay } 206827bd09bSSatish Balay 2077b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 208d71ae5a4SJacob Faibussowitsch vfp PCTFS_ivec_fct_addr(PetscInt type) 209d71ae5a4SJacob Faibussowitsch { 2104ad8454bSPierre Jolivet if (type == NON_UNIFORM) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_non_uniform; 2114ad8454bSPierre Jolivet else if (type == GL_MAX) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_max; 2124ad8454bSPierre Jolivet else if (type == GL_MIN) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_min; 2134ad8454bSPierre Jolivet else if (type == GL_MULT) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_mult; 2144ad8454bSPierre Jolivet else if (type == GL_ADD) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_add; 2154ad8454bSPierre Jolivet else if (type == GL_B_XOR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_xor; 2164ad8454bSPierre Jolivet else if (type == GL_B_OR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_or; 2174ad8454bSPierre Jolivet else if (type == GL_B_AND) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_and; 2184ad8454bSPierre Jolivet else if (type == GL_L_XOR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_lxor; 2194ad8454bSPierre Jolivet else if (type == GL_L_OR) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_lor; 2204ad8454bSPierre Jolivet else if (type == GL_L_AND) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_ivec_land; 221827bd09bSSatish Balay 222827bd09bSSatish Balay /* catch all ... not good if we get here */ 2234ad8454bSPierre Jolivet return NULL; 224827bd09bSSatish Balay } 225827bd09bSSatish Balay 2267b1ae94cSBarry Smith /******************************************************************************/ 227d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort(PetscInt *ar, PetscInt size) 228d71ae5a4SJacob Faibussowitsch { 22952f87cdaSBarry Smith PetscInt *pi, *pj, temp; 23052f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 23152f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 232827bd09bSSatish Balay 233b458e8f1SJose E. Roman PetscFunctionBegin; 234827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 235827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 236827bd09bSSatish Balay size--; 237827bd09bSSatish Balay 238827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 239db4deed7SKarl Rupp for (;;) { 240827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 241db4deed7SKarl Rupp if (size > SORT_OPT) { 242827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 243827bd09bSSatish Balay pi = ar + 1; 244827bd09bSSatish Balay pj = ar + size; 245827bd09bSSatish Balay 246827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 247*b6555650SPierre Jolivet SWAP(*(ar + (size >> 1)), *pi); 248827bd09bSSatish Balay 249827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 250827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 251*b6555650SPierre Jolivet if (*pi > *pj) SWAP(*pi, *pj); 252*b6555650SPierre Jolivet if (*ar > *pj) SWAP(*ar, *pj); 253*b6555650SPierre Jolivet else if (*pi > *ar) SWAP(*(ar), *(ar + 1)); 254827bd09bSSatish Balay 255827bd09bSSatish Balay /* partition about pivot_value ... */ 256827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 257db4deed7SKarl Rupp for (;;) { 258827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 2599371c9d4SSatish Balay do pi++; 2609371c9d4SSatish Balay while (*pi < *ar); 2619371c9d4SSatish Balay do pj--; 2629371c9d4SSatish Balay while (*pj > *ar); 263827bd09bSSatish Balay 264827bd09bSSatish Balay /* if we've crossed we're done */ 265827bd09bSSatish Balay if (pj < pi) break; 266827bd09bSSatish Balay 267827bd09bSSatish Balay /* else swap */ 268*b6555650SPierre Jolivet SWAP(*pi, *pj); 269827bd09bSSatish Balay } 270827bd09bSSatish Balay 271827bd09bSSatish Balay /* place pivot_value in it's correct location */ 272*b6555650SPierre Jolivet SWAP(*ar, *pj); 273827bd09bSSatish Balay 274827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 27508401ef6SPierre Jolivet PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort() :: STACK EXHAUSTED!!!"); 276827bd09bSSatish Balay 277827bd09bSSatish Balay /* push right hand child iff length > 1 */ 278db4deed7SKarl Rupp if ((*top_s = size - ((PetscInt)(pi - ar)))) { 279827bd09bSSatish Balay *(top_a++) = pi; 280827bd09bSSatish Balay size -= *top_s + 2; 281827bd09bSSatish Balay top_s++; 2829371c9d4SSatish Balay } else if (size -= *top_s + 2) 2839371c9d4SSatish Balay ; /* set up for next loop iff there is something to do */ 2849371c9d4SSatish Balay else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar = *(--top_a); 285827bd09bSSatish Balay size = *(--top_s); 286827bd09bSSatish Balay } 287db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 288827bd09bSSatish Balay 289827bd09bSSatish Balay /* insertion sort for bottom */ 290db4deed7SKarl Rupp for (pj = ar + 1; pj <= ar + size; pj++) { 291827bd09bSSatish Balay temp = *pj; 292db4deed7SKarl Rupp for (pi = pj - 1; pi >= ar; pi--) { 293827bd09bSSatish Balay if (*pi <= temp) break; 294827bd09bSSatish Balay *(pi + 1) = *pi; 295827bd09bSSatish Balay } 296827bd09bSSatish Balay *(pi + 1) = temp; 297827bd09bSSatish Balay } 298827bd09bSSatish Balay 299827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3003ba16761SJacob Faibussowitsch if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS); 301827bd09bSSatish Balay 302827bd09bSSatish Balay /* else pop another list from the stack */ 303827bd09bSSatish Balay ar = *(--top_a); 304827bd09bSSatish Balay size = *(--top_s); 305827bd09bSSatish Balay } 306827bd09bSSatish Balay } 307827bd09bSSatish Balay } 308827bd09bSSatish Balay 3097b1ae94cSBarry Smith /******************************************************************************/ 310d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar, PetscInt *ar2, PetscInt size) 311d71ae5a4SJacob Faibussowitsch { 31252f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 31352f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 31452f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 31552f87cdaSBarry Smith PetscInt *pi2, *pj2; 31652f87cdaSBarry Smith PetscInt mid; 317827bd09bSSatish Balay 3183fdc5746SBarry Smith PetscFunctionBegin; 319827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 320827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 321827bd09bSSatish Balay size--; 322827bd09bSSatish Balay 323827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 324db4deed7SKarl Rupp for (;;) { 325827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 326db4deed7SKarl Rupp if (size > SORT_OPT) { 327827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 328827bd09bSSatish Balay mid = size >> 1; 329827bd09bSSatish Balay pi = ar + 1; 330827bd09bSSatish Balay pj = ar + mid; 331827bd09bSSatish Balay pi2 = ar2 + 1; 332827bd09bSSatish Balay pj2 = ar2 + mid; 333827bd09bSSatish Balay 334827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 335*b6555650SPierre Jolivet SWAP(*pi, *pj); 336*b6555650SPierre Jolivet SWAP(*pi2, *pj2); 337827bd09bSSatish Balay 338827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 339827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 340827bd09bSSatish Balay pj = ar + size; 341827bd09bSSatish Balay pj2 = ar2 + size; 342*b6555650SPierre Jolivet if (*pi > *pj) { 343*b6555650SPierre Jolivet SWAP(*pi, *pj); 344*b6555650SPierre Jolivet SWAP(*pi2, *pj2); 345*b6555650SPierre Jolivet } 3469371c9d4SSatish Balay if (*ar > *pj) { 347*b6555650SPierre Jolivet SWAP(*ar, *pj); 348*b6555650SPierre Jolivet SWAP(*ar2, *pj2); 3499371c9d4SSatish Balay } else if (*pi > *ar) { 350*b6555650SPierre Jolivet SWAP(*(ar), *(ar + 1)); 351*b6555650SPierre Jolivet SWAP(*(ar2), *(ar2 + 1)); 3529371c9d4SSatish Balay } 353827bd09bSSatish Balay 354827bd09bSSatish Balay /* partition about pivot_value ... */ 355827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 356db4deed7SKarl Rupp for (;;) { 357827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 3589371c9d4SSatish Balay do { 3599371c9d4SSatish Balay pi++; 3609371c9d4SSatish Balay pi2++; 3619371c9d4SSatish Balay } while (*pi < *ar); 3629371c9d4SSatish Balay do { 3639371c9d4SSatish Balay pj--; 3649371c9d4SSatish Balay pj2--; 3659371c9d4SSatish Balay } while (*pj > *ar); 366827bd09bSSatish Balay 367827bd09bSSatish Balay /* if we've crossed we're done */ 368827bd09bSSatish Balay if (pj < pi) break; 369827bd09bSSatish Balay 370827bd09bSSatish Balay /* else swap */ 371*b6555650SPierre Jolivet SWAP(*pi, *pj); 372*b6555650SPierre Jolivet SWAP(*pi2, *pj2); 373827bd09bSSatish Balay } 374827bd09bSSatish Balay 375827bd09bSSatish Balay /* place pivot_value in it's correct location */ 376*b6555650SPierre Jolivet SWAP(*ar, *pj); 377*b6555650SPierre Jolivet SWAP(*ar2, *pj2); 378827bd09bSSatish Balay 379827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 38008401ef6SPierre Jolivet PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!"); 381827bd09bSSatish Balay 382827bd09bSSatish Balay /* push right hand child iff length > 1 */ 383db4deed7SKarl Rupp if ((*top_s = size - ((PetscInt)(pi - ar)))) { 384827bd09bSSatish Balay *(top_a++) = pi; 385827bd09bSSatish Balay *(top_a++) = pi2; 386827bd09bSSatish Balay size -= *top_s + 2; 387827bd09bSSatish Balay top_s++; 3889371c9d4SSatish Balay } else if (size -= *top_s + 2) 3899371c9d4SSatish Balay ; /* set up for next loop iff there is something to do */ 3909371c9d4SSatish Balay else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar2 = *(--top_a); 391827bd09bSSatish Balay ar = *(--top_a); 392827bd09bSSatish Balay size = *(--top_s); 393827bd09bSSatish Balay } 394db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 395827bd09bSSatish Balay 396827bd09bSSatish Balay /* insertion sort for bottom */ 397db4deed7SKarl Rupp for (pj = ar + 1, pj2 = ar2 + 1; pj <= ar + size; pj++, pj2++) { 398827bd09bSSatish Balay temp = *pj; 399827bd09bSSatish Balay temp2 = *pj2; 400db4deed7SKarl Rupp for (pi = pj - 1, pi2 = pj2 - 1; pi >= ar; pi--, pi2--) { 401827bd09bSSatish Balay if (*pi <= temp) break; 402827bd09bSSatish Balay *(pi + 1) = *pi; 403827bd09bSSatish Balay *(pi2 + 1) = *pi2; 404827bd09bSSatish Balay } 405827bd09bSSatish Balay *(pi + 1) = temp; 406827bd09bSSatish Balay *(pi2 + 1) = temp2; 407827bd09bSSatish Balay } 408827bd09bSSatish Balay 409827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4103ba16761SJacob Faibussowitsch if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS); 411827bd09bSSatish Balay 412827bd09bSSatish Balay /* else pop another list from the stack */ 413827bd09bSSatish Balay ar2 = *(--top_a); 414827bd09bSSatish Balay ar = *(--top_a); 415827bd09bSSatish Balay size = *(--top_s); 416827bd09bSSatish Balay } 417827bd09bSSatish Balay } 418827bd09bSSatish Balay } 419827bd09bSSatish Balay 4207b1ae94cSBarry Smith /******************************************************************************/ 421d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar, PetscInt **ar2, PetscInt size) 422d71ae5a4SJacob Faibussowitsch { 42352f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 42452f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 42552f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 42652f87cdaSBarry Smith PetscInt **pi2, **pj2; 42752f87cdaSBarry Smith PetscInt mid; 428827bd09bSSatish Balay 4293fdc5746SBarry Smith PetscFunctionBegin; 430827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 431827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 432827bd09bSSatish Balay size--; 433827bd09bSSatish Balay 434827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 435db4deed7SKarl Rupp for (;;) { 436827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 437db4deed7SKarl Rupp if (size > SORT_OPT) { 438827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 439827bd09bSSatish Balay mid = size >> 1; 440827bd09bSSatish Balay pi = ar + 1; 441827bd09bSSatish Balay pj = ar + mid; 442827bd09bSSatish Balay pi2 = ar2 + 1; 443827bd09bSSatish Balay pj2 = ar2 + mid; 444827bd09bSSatish Balay 445827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 446*b6555650SPierre Jolivet SWAP(*pi, *pj); 447*b6555650SPierre Jolivet P_SWAP(*pi2, *pj2); 448827bd09bSSatish Balay 449827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 450827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 451827bd09bSSatish Balay pj = ar + size; 452827bd09bSSatish Balay pj2 = ar2 + size; 453*b6555650SPierre Jolivet if (*pi > *pj) { 454*b6555650SPierre Jolivet SWAP(*pi, *pj); 455*b6555650SPierre Jolivet P_SWAP(*pi2, *pj2); 456*b6555650SPierre Jolivet } 4579371c9d4SSatish Balay if (*ar > *pj) { 458*b6555650SPierre Jolivet SWAP(*ar, *pj); 459*b6555650SPierre Jolivet P_SWAP(*ar2, *pj2); 4609371c9d4SSatish Balay } else if (*pi > *ar) { 461*b6555650SPierre Jolivet SWAP(*(ar), *(ar + 1)); 462*b6555650SPierre Jolivet P_SWAP(*(ar2), *(ar2 + 1)); 4639371c9d4SSatish Balay } 464827bd09bSSatish Balay 465827bd09bSSatish Balay /* partition about pivot_value ... */ 466827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 467db4deed7SKarl Rupp for (;;) { 468827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 4699371c9d4SSatish Balay do { 4709371c9d4SSatish Balay pi++; 4719371c9d4SSatish Balay pi2++; 4729371c9d4SSatish Balay } while (*pi < *ar); 4739371c9d4SSatish Balay do { 4749371c9d4SSatish Balay pj--; 4759371c9d4SSatish Balay pj2--; 4769371c9d4SSatish Balay } while (*pj > *ar); 477827bd09bSSatish Balay 478827bd09bSSatish Balay /* if we've crossed we're done */ 479827bd09bSSatish Balay if (pj < pi) break; 480827bd09bSSatish Balay 481827bd09bSSatish Balay /* else swap */ 482*b6555650SPierre Jolivet SWAP(*pi, *pj); 483*b6555650SPierre Jolivet P_SWAP(*pi2, *pj2); 484827bd09bSSatish Balay } 485827bd09bSSatish Balay 486827bd09bSSatish Balay /* place pivot_value in it's correct location */ 487*b6555650SPierre Jolivet SWAP(*ar, *pj); 488*b6555650SPierre Jolivet P_SWAP(*ar2, *pj2); 489827bd09bSSatish Balay 490827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 49108401ef6SPierre Jolivet PetscCheck(top_s - bottom_s < SORT_STACK, PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 492827bd09bSSatish Balay 493827bd09bSSatish Balay /* push right hand child iff length > 1 */ 494db4deed7SKarl Rupp if ((*top_s = size - ((PetscInt)(pi - ar)))) { 495827bd09bSSatish Balay *(top_a++) = pi; 49652f87cdaSBarry Smith *(top_a++) = (PetscInt *)pi2; 497827bd09bSSatish Balay size -= *top_s + 2; 498827bd09bSSatish Balay top_s++; 4999371c9d4SSatish Balay } else if (size -= *top_s + 2) 5009371c9d4SSatish Balay ; /* set up for next loop iff there is something to do */ 5019371c9d4SSatish Balay else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ ar2 = (PetscInt **)*(--top_a); 502827bd09bSSatish Balay ar = *(--top_a); 503827bd09bSSatish Balay size = *(--top_s); 504827bd09bSSatish Balay } 5052fa5cd67SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 506827bd09bSSatish Balay /* insertion sort for bottom */ 507db4deed7SKarl Rupp for (pj = ar + 1, pj2 = ar2 + 1; pj <= ar + size; pj++, pj2++) { 508827bd09bSSatish Balay temp = *pj; 509827bd09bSSatish Balay ptr = *pj2; 510db4deed7SKarl Rupp for (pi = pj - 1, pi2 = pj2 - 1; pi >= ar; pi--, pi2--) { 511827bd09bSSatish Balay if (*pi <= temp) break; 512827bd09bSSatish Balay *(pi + 1) = *pi; 513827bd09bSSatish Balay *(pi2 + 1) = *pi2; 514827bd09bSSatish Balay } 515827bd09bSSatish Balay *(pi + 1) = temp; 516827bd09bSSatish Balay *(pi2 + 1) = ptr; 517827bd09bSSatish Balay } 518827bd09bSSatish Balay 519827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 5203ba16761SJacob Faibussowitsch if (top_s == bottom_s) PetscFunctionReturn(PETSC_SUCCESS); 521827bd09bSSatish Balay 522827bd09bSSatish Balay /* else pop another list from the stack */ 52352f87cdaSBarry Smith ar2 = (PetscInt **)*(--top_a); 524827bd09bSSatish Balay ar = *(--top_a); 525827bd09bSSatish Balay size = *(--top_s); 526827bd09bSSatish Balay } 527827bd09bSSatish Balay } 528827bd09bSSatish Balay } 529827bd09bSSatish Balay 5307b1ae94cSBarry Smith /******************************************************************************/ 531d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 532d71ae5a4SJacob Faibussowitsch { 5333fdc5746SBarry Smith PetscFunctionBegin; 534e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 5353ba16761SJacob Faibussowitsch if (ar2) PetscCall(PCTFS_ivec_sort_companion((PetscInt *)ar1, (PetscInt *)ar2, size)); 5363ba16761SJacob Faibussowitsch else PetscCall(PCTFS_ivec_sort((PetscInt *)ar1, size)); 537e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 5383ba16761SJacob Faibussowitsch if (ar2) PetscCall(PCTFS_ivec_sort_companion_hack((PetscInt *)ar1, (PetscInt **)ar2, size)); 5393ba16761SJacob Faibussowitsch else PetscCall(PCTFS_ivec_sort((PetscInt *)ar1, size)); 540ca8e9878SJed Brown } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PCTFS_SMI_sort only does SORT_INTEGER!"); 5413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 542827bd09bSSatish Balay } 543827bd09bSSatish Balay 5447b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 545d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_linear_search(PetscInt item, PetscInt *list, PetscInt n) 546d71ae5a4SJacob Faibussowitsch { 54752f87cdaSBarry Smith PetscInt tmp = n - 1; 5485fd66863SKarl Rupp 5492fa5cd67SKarl Rupp while (n--) { 5504ad8454bSPierre Jolivet if (*list++ == item) return tmp - n; 5512fa5cd67SKarl Rupp } 5524ad8454bSPierre Jolivet return -1; 553827bd09bSSatish Balay } 554827bd09bSSatish Balay 5557b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 556d71ae5a4SJacob Faibussowitsch PetscInt PCTFS_ivec_binary_search(PetscInt item, PetscInt *list, PetscInt rh) 557d71ae5a4SJacob Faibussowitsch { 55852f87cdaSBarry Smith PetscInt mid, lh = 0; 559827bd09bSSatish Balay 560827bd09bSSatish Balay rh--; 561db4deed7SKarl Rupp while (lh <= rh) { 562827bd09bSSatish Balay mid = (lh + rh) >> 1; 5634ad8454bSPierre Jolivet if (*(list + mid) == item) return mid; 5642fa5cd67SKarl Rupp if (*(list + mid) > item) rh = mid - 1; 5652fa5cd67SKarl Rupp else lh = mid + 1; 566827bd09bSSatish Balay } 5674ad8454bSPierre Jolivet return -1; 568827bd09bSSatish Balay } 569827bd09bSSatish Balay 5707b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 571d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 572d71ae5a4SJacob Faibussowitsch { 5733fdc5746SBarry Smith PetscFunctionBegin; 5742fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 5753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 576827bd09bSSatish Balay } 577827bd09bSSatish Balay 5787b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 579d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1, PetscInt n) 580d71ae5a4SJacob Faibussowitsch { 5813fdc5746SBarry Smith PetscFunctionBegin; 5822fa5cd67SKarl Rupp while (n--) *arg1++ = 0.0; 5833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 584827bd09bSSatish Balay } 585827bd09bSSatish Balay 5867b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 587d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1, PetscInt n) 588d71ae5a4SJacob Faibussowitsch { 5893fdc5746SBarry Smith PetscFunctionBegin; 5902fa5cd67SKarl Rupp while (n--) *arg1++ = 1.0; 5913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 592827bd09bSSatish Balay } 593827bd09bSSatish Balay 5947b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 595d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 596d71ae5a4SJacob Faibussowitsch { 5973fdc5746SBarry Smith PetscFunctionBegin; 5982fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 5993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 600827bd09bSSatish Balay } 601827bd09bSSatish Balay 6027b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 603d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 604d71ae5a4SJacob Faibussowitsch { 6053fdc5746SBarry Smith PetscFunctionBegin; 6062fa5cd67SKarl Rupp while (n--) *arg1++ *= arg2; 6073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 608827bd09bSSatish Balay } 609827bd09bSSatish Balay 6107b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 611d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 612d71ae5a4SJacob Faibussowitsch { 6133fdc5746SBarry Smith PetscFunctionBegin; 6142fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 6153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 616827bd09bSSatish Balay } 617827bd09bSSatish Balay 6187b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 619d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 620d71ae5a4SJacob Faibussowitsch { 6213fdc5746SBarry Smith PetscFunctionBegin; 6222fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 6233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 624827bd09bSSatish Balay } 625827bd09bSSatish Balay 6267b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 627d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 628d71ae5a4SJacob Faibussowitsch { 6293fdc5746SBarry Smith PetscFunctionBegin; 6302fa5cd67SKarl Rupp while (n--) { 6312fa5cd67SKarl Rupp *arg1 = PetscMax(*arg1, *arg2); 6322fa5cd67SKarl Rupp arg1++; 6332fa5cd67SKarl Rupp arg2++; 6342fa5cd67SKarl Rupp } 6353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 636827bd09bSSatish Balay } 637827bd09bSSatish Balay 6387b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 639d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 640d71ae5a4SJacob Faibussowitsch { 6413fdc5746SBarry Smith PetscFunctionBegin; 6422fa5cd67SKarl Rupp while (n--) { 6432fa5cd67SKarl Rupp *arg1 = MAX_FABS(*arg1, *arg2); 6442fa5cd67SKarl Rupp arg1++; 6452fa5cd67SKarl Rupp arg2++; 6462fa5cd67SKarl Rupp } 6473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 648827bd09bSSatish Balay } 649827bd09bSSatish Balay 6507b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 651d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 652d71ae5a4SJacob Faibussowitsch { 6533fdc5746SBarry Smith PetscFunctionBegin; 6542fa5cd67SKarl Rupp while (n--) { 6552fa5cd67SKarl Rupp *arg1 = PetscMin(*arg1, *arg2); 6562fa5cd67SKarl Rupp arg1++; 6572fa5cd67SKarl Rupp arg2++; 6582fa5cd67SKarl Rupp } 6593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 660827bd09bSSatish Balay } 661827bd09bSSatish Balay 6627b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 663d71ae5a4SJacob Faibussowitsch PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 664d71ae5a4SJacob Faibussowitsch { 6653fdc5746SBarry Smith PetscFunctionBegin; 6662fa5cd67SKarl Rupp while (n--) { 6672fa5cd67SKarl Rupp *arg1 = MIN_FABS(*arg1, *arg2); 6682fa5cd67SKarl Rupp arg1++; 6692fa5cd67SKarl Rupp arg2++; 6702fa5cd67SKarl Rupp } 6713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 672827bd09bSSatish Balay } 673827bd09bSSatish Balay 6747b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 67566976f2fSJacob Faibussowitsch static PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 676d71ae5a4SJacob Faibussowitsch { 6773fdc5746SBarry Smith PetscFunctionBegin; 6782fa5cd67SKarl Rupp while (n--) { 6792fa5cd67SKarl Rupp *arg1 = EXISTS(*arg1, *arg2); 6802fa5cd67SKarl Rupp arg1++; 6812fa5cd67SKarl Rupp arg2++; 6822fa5cd67SKarl Rupp } 6833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 684827bd09bSSatish Balay } 685827bd09bSSatish Balay 6867b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 68766976f2fSJacob Faibussowitsch static PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3) 688d71ae5a4SJacob Faibussowitsch { 68952f87cdaSBarry Smith PetscInt i, j, type; 690827bd09bSSatish Balay 6913fdc5746SBarry Smith PetscFunctionBegin; 692827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 693db4deed7SKarl Rupp for (i = 0; i < n;) { 694827bd09bSSatish Balay /* clump 'em for now */ 695827bd09bSSatish Balay j = i + 1; 696827bd09bSSatish Balay type = arg3[i]; 6972fa5cd67SKarl Rupp while ((j < n) && (arg3[j] == type)) j++; 698827bd09bSSatish Balay 699827bd09bSSatish Balay /* how many together */ 700827bd09bSSatish Balay j -= i; 701827bd09bSSatish Balay 702827bd09bSSatish Balay /* call appropriate ivec function */ 7033ba16761SJacob Faibussowitsch if (type == GL_MAX) PetscCall(PCTFS_rvec_max(arg1, arg2, j)); 7043ba16761SJacob Faibussowitsch else if (type == GL_MIN) PetscCall(PCTFS_rvec_min(arg1, arg2, j)); 7053ba16761SJacob Faibussowitsch else if (type == GL_MULT) PetscCall(PCTFS_rvec_mult(arg1, arg2, j)); 7063ba16761SJacob Faibussowitsch else if (type == GL_ADD) PetscCall(PCTFS_rvec_add(arg1, arg2, j)); 7073ba16761SJacob Faibussowitsch else if (type == GL_MAX_ABS) PetscCall(PCTFS_rvec_max_abs(arg1, arg2, j)); 7083ba16761SJacob Faibussowitsch else if (type == GL_MIN_ABS) PetscCall(PCTFS_rvec_min_abs(arg1, arg2, j)); 7093ba16761SJacob Faibussowitsch else if (type == GL_EXISTS) PetscCall(PCTFS_rvec_exists(arg1, arg2, j)); 710ca8e9878SJed Brown else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "unrecognized type passed to PCTFS_rvec_non_uniform()!"); 711827bd09bSSatish Balay 7129371c9d4SSatish Balay arg1 += j; 7139371c9d4SSatish Balay arg2 += j; 7149371c9d4SSatish Balay i += j; 715827bd09bSSatish Balay } 7163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 717827bd09bSSatish Balay } 718827bd09bSSatish Balay 7197b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 720d71ae5a4SJacob Faibussowitsch vfp PCTFS_rvec_fct_addr(PetscInt type) 721d71ae5a4SJacob Faibussowitsch { 7224ad8454bSPierre Jolivet if (type == NON_UNIFORM) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_non_uniform; 7234ad8454bSPierre Jolivet else if (type == GL_MAX) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_max; 7244ad8454bSPierre Jolivet else if (type == GL_MIN) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_min; 7254ad8454bSPierre Jolivet else if (type == GL_MULT) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_mult; 7264ad8454bSPierre Jolivet else if (type == GL_ADD) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_add; 7274ad8454bSPierre Jolivet else if (type == GL_MAX_ABS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_max_abs; 7284ad8454bSPierre Jolivet else if (type == GL_MIN_ABS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_min_abs; 7294ad8454bSPierre Jolivet else if (type == GL_EXISTS) return (PetscErrorCode (*)(void *, void *, PetscInt, ...))&PCTFS_rvec_exists; 730827bd09bSSatish Balay 731827bd09bSSatish Balay /* catch all ... not good if we get here */ 7324ad8454bSPierre Jolivet return NULL; 733827bd09bSSatish Balay } 734