1827bd09bSSatish Balay 2827bd09bSSatish Balay /**********************************ivec.c************************************** 3827bd09bSSatish Balay 4827bd09bSSatish Balay Author: Henry M. Tufo III 5827bd09bSSatish Balay 6827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 7827bd09bSSatish Balay 8827bd09bSSatish Balay snail-mail: 9827bd09bSSatish Balay Division of Applied Mathematics 10827bd09bSSatish Balay Brown University 11827bd09bSSatish Balay Providence, RI 02912 12827bd09bSSatish Balay 13827bd09bSSatish Balay Last Modification: 14827bd09bSSatish Balay 6.21.97 15827bd09bSSatish Balay ***********************************ivec.c*************************************/ 16827bd09bSSatish Balay 17c6db04a5SJed Brown #include <../src/ksp/pc/impls/tfs/tfs.h> 18827bd09bSSatish Balay 19827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 20827bd09bSSatish Balay #define SORT_OPT 6 21827bd09bSSatish Balay #define SORT_STACK 50000 22827bd09bSSatish Balay 23827bd09bSSatish Balay 24827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 25827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 2652f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK]; 27827bd09bSSatish Balay 287b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 29ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy(PetscInt *arg1, PetscInt *arg2, PetscInt n) 30827bd09bSSatish Balay { 31*2fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 32827bd09bSSatish Balay return(arg1); 33827bd09bSSatish Balay } 34827bd09bSSatish Balay 357b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 36ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero(PetscInt *arg1, PetscInt n) 37827bd09bSSatish Balay { 383fdc5746SBarry Smith PetscFunctionBegin; 39*2fa5cd67SKarl Rupp while (n--) *arg1++ = 0; 403fdc5746SBarry Smith PetscFunctionReturn(0); 41827bd09bSSatish Balay } 42827bd09bSSatish Balay 437b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 44ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set(PetscInt *arg1, PetscInt arg2, PetscInt n) 45827bd09bSSatish Balay { 463fdc5746SBarry Smith PetscFunctionBegin; 47*2fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 483fdc5746SBarry Smith PetscFunctionReturn(0); 49827bd09bSSatish Balay } 50827bd09bSSatish Balay 517b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 52ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_max(PetscInt *arg1, PetscInt *arg2, PetscInt n) 53827bd09bSSatish Balay { 543fdc5746SBarry Smith PetscFunctionBegin; 5539945688SSatish Balay while (n--) { *arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++; } 563fdc5746SBarry Smith PetscFunctionReturn(0); 57827bd09bSSatish Balay } 58827bd09bSSatish Balay 597b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 60ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min(PetscInt *arg1, PetscInt *arg2, PetscInt n) 61827bd09bSSatish Balay { 623fdc5746SBarry Smith PetscFunctionBegin; 63*2fa5cd67SKarl Rupp while (n--) { 64*2fa5cd67SKarl Rupp *(arg1) = PetscMin(*arg1,*arg2); 65*2fa5cd67SKarl Rupp arg1++; 66*2fa5cd67SKarl Rupp arg2++; 67*2fa5cd67SKarl Rupp } 683fdc5746SBarry Smith PetscFunctionReturn(0); 69827bd09bSSatish Balay } 70827bd09bSSatish Balay 717b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 72ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult(PetscInt *arg1, PetscInt *arg2, PetscInt n) 73827bd09bSSatish Balay { 743fdc5746SBarry Smith PetscFunctionBegin; 75*2fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 763fdc5746SBarry Smith PetscFunctionReturn(0); 77827bd09bSSatish Balay } 78827bd09bSSatish Balay 797b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 80ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add(PetscInt *arg1, PetscInt *arg2, PetscInt n) 81827bd09bSSatish Balay { 823fdc5746SBarry Smith PetscFunctionBegin; 83*2fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 843fdc5746SBarry Smith PetscFunctionReturn(0); 85827bd09bSSatish Balay } 86827bd09bSSatish Balay 877b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 88ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 89827bd09bSSatish Balay { 903fdc5746SBarry Smith PetscFunctionBegin; 91*2fa5cd67SKarl Rupp while (n--) { 92*2fa5cd67SKarl Rupp *arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); 93*2fa5cd67SKarl Rupp arg1++; 94*2fa5cd67SKarl Rupp arg2++; 95*2fa5cd67SKarl Rupp } 963fdc5746SBarry Smith PetscFunctionReturn(0); 97827bd09bSSatish Balay } 98827bd09bSSatish Balay 997b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 100ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 101827bd09bSSatish Balay { 1023fdc5746SBarry Smith PetscFunctionBegin; 103*2fa5cd67SKarl Rupp while (n--) *arg1++ ^= *arg2++; 1043fdc5746SBarry Smith PetscFunctionReturn(0); 105827bd09bSSatish Balay } 106827bd09bSSatish Balay 1077b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 108ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or(PetscInt *arg1, PetscInt *arg2, PetscInt n) 109827bd09bSSatish Balay { 1103fdc5746SBarry Smith PetscFunctionBegin; 111*2fa5cd67SKarl Rupp while (n--) *arg1++ |= *arg2++; 1123fdc5746SBarry Smith PetscFunctionReturn(0); 113827bd09bSSatish Balay } 114827bd09bSSatish Balay 1157b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 116ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor(PetscInt *arg1, PetscInt *arg2, PetscInt n) 117827bd09bSSatish Balay { 1183fdc5746SBarry Smith PetscFunctionBegin; 119*2fa5cd67SKarl Rupp while (n--) { 120*2fa5cd67SKarl Rupp *arg1 = (*arg1 || *arg2); 121*2fa5cd67SKarl Rupp arg1++; 122*2fa5cd67SKarl Rupp arg2++; 123*2fa5cd67SKarl Rupp } 1243fdc5746SBarry Smith PetscFunctionReturn(0); 125827bd09bSSatish Balay } 126827bd09bSSatish Balay 1277b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 128ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and(PetscInt *arg1, PetscInt *arg2, PetscInt n) 129827bd09bSSatish Balay { 1303fdc5746SBarry Smith PetscFunctionBegin; 131*2fa5cd67SKarl Rupp while (n--) *arg1++ &= *arg2++; 1323fdc5746SBarry Smith PetscFunctionReturn(0); 133827bd09bSSatish Balay } 134827bd09bSSatish Balay 1357b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 136ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land(PetscInt *arg1, PetscInt *arg2, PetscInt n) 137827bd09bSSatish Balay { 1383fdc5746SBarry Smith PetscFunctionBegin; 139*2fa5cd67SKarl Rupp while (n--) { 140*2fa5cd67SKarl Rupp *arg1 = (*arg1 && *arg2); 141*2fa5cd67SKarl Rupp arg1++; 142*2fa5cd67SKarl Rupp arg2++; 143*2fa5cd67SKarl Rupp } 1443fdc5746SBarry Smith PetscFunctionReturn(0); 145827bd09bSSatish Balay } 146827bd09bSSatish Balay 1477b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 148ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3(PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 149827bd09bSSatish Balay { 1503fdc5746SBarry Smith PetscFunctionBegin; 151*2fa5cd67SKarl Rupp while (n--) *arg1++ = (*arg2++ & *arg3++); 1523fdc5746SBarry Smith PetscFunctionReturn(0); 153827bd09bSSatish Balay } 154827bd09bSSatish Balay 1557b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 156ca8e9878SJed Brown PetscInt PCTFS_ivec_sum(PetscInt *arg1, PetscInt n) 157827bd09bSSatish Balay { 15852f87cdaSBarry Smith PetscInt tmp = 0; 159*2fa5cd67SKarl Rupp while (n--) tmp += *arg1++; 160827bd09bSSatish Balay return(tmp); 161827bd09bSSatish Balay } 162827bd09bSSatish Balay 1637b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 164ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, PetscInt *arg3) 165827bd09bSSatish Balay { 16652f87cdaSBarry Smith PetscInt i, j, type; 167827bd09bSSatish Balay 1683fdc5746SBarry Smith PetscFunctionBegin; 169827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 170db4deed7SKarl Rupp for (i=0; i<n; ) { 171827bd09bSSatish Balay /* clump 'em for now */ 172827bd09bSSatish Balay j =i+1; 173827bd09bSSatish Balay type = arg3[i]; 174*2fa5cd67SKarl Rupp while ((j<n)&&(arg3[j]==type)) j++; 175827bd09bSSatish Balay 176827bd09bSSatish Balay /* how many together */ 177827bd09bSSatish Balay j -= i; 178827bd09bSSatish Balay 179827bd09bSSatish Balay /* call appropriate ivec function */ 180*2fa5cd67SKarl Rupp if (type == GL_MAX) PCTFS_ivec_max(arg1,arg2,j); 181*2fa5cd67SKarl Rupp else if (type == GL_MIN) PCTFS_ivec_min(arg1,arg2,j); 182*2fa5cd67SKarl Rupp else if (type == GL_MULT) PCTFS_ivec_mult(arg1,arg2,j); 183*2fa5cd67SKarl Rupp else if (type == GL_ADD) PCTFS_ivec_add(arg1,arg2,j); 184*2fa5cd67SKarl Rupp else if (type == GL_B_XOR) PCTFS_ivec_xor(arg1,arg2,j); 185*2fa5cd67SKarl Rupp else if (type == GL_B_OR) PCTFS_ivec_or(arg1,arg2,j); 186*2fa5cd67SKarl Rupp else if (type == GL_B_AND) PCTFS_ivec_and(arg1,arg2,j); 187*2fa5cd67SKarl Rupp else if (type == GL_L_XOR) PCTFS_ivec_lxor(arg1,arg2,j); 188*2fa5cd67SKarl Rupp else if (type == GL_L_OR) PCTFS_ivec_lor(arg1,arg2,j); 189*2fa5cd67SKarl Rupp else if (type == GL_L_AND) PCTFS_ivec_land(arg1,arg2,j); 190db4deed7SKarl Rupp else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_ivec_non_uniform()!"); 191827bd09bSSatish Balay 192827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 193827bd09bSSatish Balay } 1943fdc5746SBarry Smith PetscFunctionReturn(0); 195827bd09bSSatish Balay } 196827bd09bSSatish Balay 1977b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 198ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr(PetscInt type) 199827bd09bSSatish Balay { 200*2fa5cd67SKarl Rupp if (type == NON_UNIFORM) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_non_uniform); 201*2fa5cd67SKarl Rupp else if (type == GL_MAX) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_max); 202*2fa5cd67SKarl Rupp else if (type == GL_MIN) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_min); 203*2fa5cd67SKarl Rupp else if (type == GL_MULT) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_mult); 204*2fa5cd67SKarl Rupp else if (type == GL_ADD) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_add); 205*2fa5cd67SKarl Rupp else if (type == GL_B_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_xor); 206*2fa5cd67SKarl Rupp else if (type == GL_B_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_or); 207*2fa5cd67SKarl Rupp else if (type == GL_B_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_and); 208*2fa5cd67SKarl Rupp else if (type == GL_L_XOR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lxor); 209*2fa5cd67SKarl Rupp else if (type == GL_L_OR) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_lor); 210*2fa5cd67SKarl Rupp else if (type == GL_L_AND) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_ivec_land); 211827bd09bSSatish Balay 212827bd09bSSatish Balay /* catch all ... not good if we get here */ 213827bd09bSSatish Balay return(NULL); 214827bd09bSSatish Balay } 215827bd09bSSatish Balay 2167b1ae94cSBarry Smith /******************************************************************************/ 217ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort(PetscInt *ar, PetscInt size) 218827bd09bSSatish Balay { 21952f87cdaSBarry Smith PetscInt *pi, *pj, temp; 22052f87cdaSBarry Smith PetscInt **top_a = (PetscInt**) offset_stack; 22152f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 222827bd09bSSatish Balay 223827bd09bSSatish Balay 224827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 225827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 226827bd09bSSatish Balay size--; 227827bd09bSSatish Balay 228827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 229db4deed7SKarl Rupp for (;; ) { 230827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 231db4deed7SKarl Rupp if (size > SORT_OPT) { 232827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 233827bd09bSSatish Balay pi = ar+1; 234827bd09bSSatish Balay pj = ar+size; 235827bd09bSSatish Balay 236827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 237827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 238827bd09bSSatish Balay 239827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 240827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 241db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) } 242db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) } 243db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) } 244827bd09bSSatish Balay 245827bd09bSSatish Balay /* partition about pivot_value ... */ 246827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 247db4deed7SKarl Rupp for (;; ) { 248827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 249827bd09bSSatish Balay do pi++; while (*pi<*ar); 250827bd09bSSatish Balay do pj--; while (*pj>*ar); 251827bd09bSSatish Balay 252827bd09bSSatish Balay /* if we've crossed we're done */ 253827bd09bSSatish Balay if (pj<pi) break; 254827bd09bSSatish Balay 255827bd09bSSatish Balay /* else swap */ 256827bd09bSSatish Balay SWAP(*pi,*pj) 257827bd09bSSatish Balay } 258827bd09bSSatish Balay 259827bd09bSSatish Balay /* place pivot_value in it's correct location */ 260827bd09bSSatish Balay SWAP(*ar,*pj) 261827bd09bSSatish Balay 262827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 263ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!"); 264827bd09bSSatish Balay 265827bd09bSSatish Balay /* push right hand child iff length > 1 */ 266db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 267827bd09bSSatish Balay *(top_a++) = pi; 268827bd09bSSatish Balay size -= *top_s+2; 269827bd09bSSatish Balay top_s++; 270*2fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 271db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 272827bd09bSSatish Balay ar = *(--top_a); 273827bd09bSSatish Balay size = *(--top_s); 274827bd09bSSatish Balay } 275db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 276827bd09bSSatish Balay 277827bd09bSSatish Balay /* insertion sort for bottom */ 278db4deed7SKarl Rupp for (pj=ar+1; pj<=ar+size; pj++) { 279827bd09bSSatish Balay temp = *pj; 280db4deed7SKarl Rupp for (pi=pj-1; pi>=ar; pi--) { 281827bd09bSSatish Balay if (*pi <= temp) break; 282827bd09bSSatish Balay *(pi+1)=*pi; 283827bd09bSSatish Balay } 284827bd09bSSatish Balay *(pi+1)=temp; 285827bd09bSSatish Balay } 286827bd09bSSatish Balay 287827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 2883fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 289827bd09bSSatish Balay 290827bd09bSSatish Balay /* else pop another list from the stack */ 291827bd09bSSatish Balay ar = *(--top_a); 292827bd09bSSatish Balay size = *(--top_s); 293827bd09bSSatish Balay } 294827bd09bSSatish Balay } 2953fdc5746SBarry Smith PetscFunctionReturn(0); 296827bd09bSSatish Balay } 297827bd09bSSatish Balay 2987b1ae94cSBarry Smith /******************************************************************************/ 299ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion(PetscInt *ar, PetscInt *ar2, PetscInt size) 300827bd09bSSatish Balay { 30152f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 30252f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 30352f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 30452f87cdaSBarry Smith PetscInt *pi2, *pj2; 30552f87cdaSBarry Smith PetscInt mid; 306827bd09bSSatish Balay 3073fdc5746SBarry Smith PetscFunctionBegin; 308827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 309827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 310827bd09bSSatish Balay size--; 311827bd09bSSatish Balay 312827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 313db4deed7SKarl Rupp for (;; ) { 314db4deed7SKarl Rupp 315827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 316db4deed7SKarl Rupp if (size > SORT_OPT) { 317db4deed7SKarl Rupp 318827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 319827bd09bSSatish Balay mid = size>>1; 320827bd09bSSatish Balay pi = ar+1; 321827bd09bSSatish Balay pj = ar+mid; 322827bd09bSSatish Balay pi2 = ar2+1; 323827bd09bSSatish Balay pj2 = ar2+mid; 324827bd09bSSatish Balay 325827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 326827bd09bSSatish Balay SWAP(*pi,*pj) 327827bd09bSSatish Balay SWAP(*pi2,*pj2) 328827bd09bSSatish Balay 329827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 330827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 331827bd09bSSatish Balay pj = ar+size; 332827bd09bSSatish Balay pj2 = ar2+size; 333db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) SWAP(*pi2,*pj2) } 334db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) SWAP(*ar2,*pj2) } 335db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1)) } 336827bd09bSSatish Balay 337827bd09bSSatish Balay /* partition about pivot_value ... */ 338827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 339db4deed7SKarl Rupp for (;; ) { 340827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 341827bd09bSSatish Balay do { pi++; pi2++; } while (*pi<*ar); 342827bd09bSSatish Balay do { pj--; pj2--; } while (*pj>*ar); 343827bd09bSSatish Balay 344827bd09bSSatish Balay /* if we've crossed we're done */ 345827bd09bSSatish Balay if (pj<pi) break; 346827bd09bSSatish Balay 347827bd09bSSatish Balay /* else swap */ 348827bd09bSSatish Balay SWAP(*pi,*pj) 349827bd09bSSatish Balay SWAP(*pi2,*pj2) 350827bd09bSSatish Balay } 351827bd09bSSatish Balay 352827bd09bSSatish Balay /* place pivot_value in it's correct location */ 353827bd09bSSatish Balay SWAP(*ar,*pj) 354827bd09bSSatish Balay SWAP(*ar2,*pj2) 355827bd09bSSatish Balay 356827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 357ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!"); 358827bd09bSSatish Balay 359827bd09bSSatish Balay /* push right hand child iff length > 1 */ 360db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 361827bd09bSSatish Balay *(top_a++) = pi; 362827bd09bSSatish Balay *(top_a++) = pi2; 363827bd09bSSatish Balay size -= *top_s+2; 364827bd09bSSatish Balay top_s++; 365*2fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 366db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 367827bd09bSSatish Balay ar2 = *(--top_a); 368827bd09bSSatish Balay ar = *(--top_a); 369827bd09bSSatish Balay size = *(--top_s); 370827bd09bSSatish Balay } 371db4deed7SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 372827bd09bSSatish Balay 373827bd09bSSatish Balay /* insertion sort for bottom */ 374db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 375827bd09bSSatish Balay temp = *pj; 376827bd09bSSatish Balay temp2 = *pj2; 377db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 378827bd09bSSatish Balay if (*pi <= temp) break; 379827bd09bSSatish Balay *(pi+1) =*pi; 380827bd09bSSatish Balay *(pi2+1)=*pi2; 381827bd09bSSatish Balay } 382827bd09bSSatish Balay *(pi+1) =temp; 383827bd09bSSatish Balay *(pi2+1)=temp2; 384827bd09bSSatish Balay } 385827bd09bSSatish Balay 386827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3873fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 388827bd09bSSatish Balay 389827bd09bSSatish Balay /* else pop another list from the stack */ 390827bd09bSSatish Balay ar2 = *(--top_a); 391827bd09bSSatish Balay ar = *(--top_a); 392827bd09bSSatish Balay size = *(--top_s); 393827bd09bSSatish Balay } 394827bd09bSSatish Balay } 3953fdc5746SBarry Smith PetscFunctionReturn(0); 396827bd09bSSatish Balay } 397827bd09bSSatish Balay 3987b1ae94cSBarry Smith /******************************************************************************/ 399ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack(PetscInt *ar, PetscInt **ar2, PetscInt size) 400827bd09bSSatish Balay { 40152f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 40252f87cdaSBarry Smith PetscInt **top_a = (PetscInt**)offset_stack; 40352f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 40452f87cdaSBarry Smith PetscInt **pi2, **pj2; 40552f87cdaSBarry Smith PetscInt mid; 406827bd09bSSatish Balay 4073fdc5746SBarry Smith PetscFunctionBegin; 408827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 409827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 410827bd09bSSatish Balay size--; 411827bd09bSSatish Balay 412827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 413db4deed7SKarl Rupp for (;; ) { 414db4deed7SKarl Rupp 415827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 416db4deed7SKarl Rupp if (size > SORT_OPT) { 417db4deed7SKarl Rupp 418827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 419827bd09bSSatish Balay mid = size>>1; 420827bd09bSSatish Balay pi = ar+1; 421827bd09bSSatish Balay pj = ar+mid; 422827bd09bSSatish Balay pi2 = ar2+1; 423827bd09bSSatish Balay pj2 = ar2+mid; 424827bd09bSSatish Balay 425827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 426827bd09bSSatish Balay SWAP(*pi,*pj) 427827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 428827bd09bSSatish Balay 429827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 430827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 431827bd09bSSatish Balay pj = ar+size; 432827bd09bSSatish Balay pj2 = ar2+size; 433db4deed7SKarl Rupp if (*pi > *pj) { SWAP(*pi,*pj) P_SWAP(*pi2,*pj2) } 434db4deed7SKarl Rupp if (*ar > *pj) { SWAP(*ar,*pj) P_SWAP(*ar2,*pj2) } 435db4deed7SKarl Rupp else if (*pi > *ar) { SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1)) } 436827bd09bSSatish Balay 437827bd09bSSatish Balay /* partition about pivot_value ... */ 438827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 439db4deed7SKarl Rupp for (;; ) { 440db4deed7SKarl Rupp 441827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 442827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 443827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 444827bd09bSSatish Balay 445827bd09bSSatish Balay /* if we've crossed we're done */ 446827bd09bSSatish Balay if (pj<pi) break; 447827bd09bSSatish Balay 448827bd09bSSatish Balay /* else swap */ 449827bd09bSSatish Balay SWAP(*pi,*pj) 450827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 451827bd09bSSatish Balay } 452827bd09bSSatish Balay 453827bd09bSSatish Balay /* place pivot_value in it's correct location */ 454827bd09bSSatish Balay SWAP(*ar,*pj) 455827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 456827bd09bSSatish Balay 457827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 458ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 459827bd09bSSatish Balay 460827bd09bSSatish Balay /* push right hand child iff length > 1 */ 461db4deed7SKarl Rupp if ((*top_s = size-((PetscInt) (pi-ar)))) { 462827bd09bSSatish Balay *(top_a++) = pi; 46352f87cdaSBarry Smith *(top_a++) = (PetscInt*) pi2; 464827bd09bSSatish Balay size -= *top_s+2; 465827bd09bSSatish Balay top_s++; 466*2fa5cd67SKarl Rupp } else if (size -= *top_s+2) ; /* set up for next loop iff there is something to do */ 467db4deed7SKarl Rupp else { /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 46852f87cdaSBarry Smith ar2 = (PetscInt**) *(--top_a); 469827bd09bSSatish Balay ar = *(--top_a); 470827bd09bSSatish Balay size = *(--top_s); 471827bd09bSSatish Balay } 472*2fa5cd67SKarl Rupp } else { /* else sort small list directly then pop another off stack */ 473827bd09bSSatish Balay /* insertion sort for bottom */ 474db4deed7SKarl Rupp for (pj=ar+1, pj2=ar2+1; pj<=ar+size; pj++,pj2++) { 475827bd09bSSatish Balay temp = *pj; 476827bd09bSSatish Balay ptr = *pj2; 477db4deed7SKarl Rupp for (pi=pj-1,pi2=pj2-1; pi>=ar; pi--,pi2--) { 478827bd09bSSatish Balay if (*pi <= temp) break; 479827bd09bSSatish Balay *(pi+1) =*pi; 480827bd09bSSatish Balay *(pi2+1)=*pi2; 481827bd09bSSatish Balay } 482827bd09bSSatish Balay *(pi+1) =temp; 483827bd09bSSatish Balay *(pi2+1)=ptr; 484827bd09bSSatish Balay } 485827bd09bSSatish Balay 486827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4873fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 488827bd09bSSatish Balay 489827bd09bSSatish Balay /* else pop another list from the stack */ 49052f87cdaSBarry Smith ar2 = (PetscInt**)*(--top_a); 491827bd09bSSatish Balay ar = *(--top_a); 492827bd09bSSatish Balay size = *(--top_s); 493827bd09bSSatish Balay } 494827bd09bSSatish Balay } 4953fdc5746SBarry Smith PetscFunctionReturn(0); 496827bd09bSSatish Balay } 497827bd09bSSatish Balay 4987b1ae94cSBarry Smith /******************************************************************************/ 499ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 500827bd09bSSatish Balay { 5013fdc5746SBarry Smith PetscFunctionBegin; 502e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 503ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size); 504ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 505e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 506ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt**)ar2,size); 507ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 508ca8e9878SJed Brown } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!"); 5093fdc5746SBarry Smith PetscFunctionReturn(0); 510827bd09bSSatish Balay } 511827bd09bSSatish Balay 5127b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 513ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search(PetscInt item, PetscInt *list, PetscInt n) 514827bd09bSSatish Balay { 51552f87cdaSBarry Smith PetscInt tmp = n-1; 5165fd66863SKarl Rupp 5173fdc5746SBarry Smith PetscFunctionBegin; 518*2fa5cd67SKarl Rupp while (n--) { 519*2fa5cd67SKarl Rupp if (*list++ == item) return(tmp-n); 520*2fa5cd67SKarl Rupp } 521827bd09bSSatish Balay return(-1); 522827bd09bSSatish Balay } 523827bd09bSSatish Balay 5247b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 525ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search(PetscInt item, PetscInt *list, PetscInt rh) 526827bd09bSSatish Balay { 52752f87cdaSBarry Smith PetscInt mid, lh=0; 528827bd09bSSatish Balay 529827bd09bSSatish Balay rh--; 530db4deed7SKarl Rupp while (lh<=rh) { 531827bd09bSSatish Balay mid = (lh+rh)>>1; 532*2fa5cd67SKarl Rupp if (*(list+mid) == item) return(mid); 533*2fa5cd67SKarl Rupp if (*(list+mid) > item) rh = mid-1; 534*2fa5cd67SKarl Rupp else lh = mid+1; 535827bd09bSSatish Balay } 536827bd09bSSatish Balay return(-1); 537827bd09bSSatish Balay } 538827bd09bSSatish Balay 5397b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 540ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 541827bd09bSSatish Balay { 5423fdc5746SBarry Smith PetscFunctionBegin; 543*2fa5cd67SKarl Rupp while (n--) *arg1++ = *arg2++; 5443fdc5746SBarry Smith PetscFunctionReturn(0); 545827bd09bSSatish Balay } 546827bd09bSSatish Balay 5477b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 548ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero(PetscScalar *arg1, PetscInt n) 549827bd09bSSatish Balay { 5503fdc5746SBarry Smith PetscFunctionBegin; 551*2fa5cd67SKarl Rupp while (n--) *arg1++ = 0.0; 5523fdc5746SBarry Smith PetscFunctionReturn(0); 553827bd09bSSatish Balay } 554827bd09bSSatish Balay 5557b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 556ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one(PetscScalar *arg1, PetscInt n) 557827bd09bSSatish Balay { 5583fdc5746SBarry Smith PetscFunctionBegin; 559*2fa5cd67SKarl Rupp while (n--) *arg1++ = 1.0; 5603fdc5746SBarry Smith PetscFunctionReturn(0); 561827bd09bSSatish Balay } 562827bd09bSSatish Balay 5637b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 564ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 565827bd09bSSatish Balay { 5663fdc5746SBarry Smith PetscFunctionBegin; 567*2fa5cd67SKarl Rupp while (n--) *arg1++ = arg2; 5683fdc5746SBarry Smith PetscFunctionReturn(0); 569827bd09bSSatish Balay } 570827bd09bSSatish Balay 5717b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 572ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale(PetscScalar *arg1, PetscScalar arg2, PetscInt n) 573827bd09bSSatish Balay { 5743fdc5746SBarry Smith PetscFunctionBegin; 575*2fa5cd67SKarl Rupp while (n--) *arg1++ *= arg2; 5763fdc5746SBarry Smith PetscFunctionReturn(0); 577827bd09bSSatish Balay } 578827bd09bSSatish Balay 5797b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 580ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 581827bd09bSSatish Balay { 5823fdc5746SBarry Smith PetscFunctionBegin; 583*2fa5cd67SKarl Rupp while (n--) *arg1++ += *arg2++; 5843fdc5746SBarry Smith PetscFunctionReturn(0); 585827bd09bSSatish Balay } 586827bd09bSSatish Balay 5877b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 588ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 589827bd09bSSatish Balay { 5903fdc5746SBarry Smith PetscFunctionBegin; 591*2fa5cd67SKarl Rupp while (n--) *arg1++ *= *arg2++; 5923fdc5746SBarry Smith PetscFunctionReturn(0); 593827bd09bSSatish Balay } 594827bd09bSSatish Balay 5957b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 596ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 597827bd09bSSatish Balay { 5983fdc5746SBarry Smith PetscFunctionBegin; 599*2fa5cd67SKarl Rupp while (n--) { 600*2fa5cd67SKarl Rupp *arg1 = PetscMax(*arg1,*arg2); 601*2fa5cd67SKarl Rupp arg1++; 602*2fa5cd67SKarl Rupp arg2++; 603*2fa5cd67SKarl Rupp } 6043fdc5746SBarry Smith PetscFunctionReturn(0); 605827bd09bSSatish Balay } 606827bd09bSSatish Balay 6077b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 608ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 609827bd09bSSatish Balay { 6103fdc5746SBarry Smith PetscFunctionBegin; 611*2fa5cd67SKarl Rupp while (n--) { 612*2fa5cd67SKarl Rupp *arg1 = MAX_FABS(*arg1,*arg2); 613*2fa5cd67SKarl Rupp arg1++; 614*2fa5cd67SKarl Rupp arg2++; 615*2fa5cd67SKarl Rupp } 6163fdc5746SBarry Smith PetscFunctionReturn(0); 617827bd09bSSatish Balay } 618827bd09bSSatish Balay 6197b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 620ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 621827bd09bSSatish Balay { 6223fdc5746SBarry Smith PetscFunctionBegin; 623*2fa5cd67SKarl Rupp while (n--) { 624*2fa5cd67SKarl Rupp *arg1 = PetscMin(*arg1,*arg2); 625*2fa5cd67SKarl Rupp arg1++; 626*2fa5cd67SKarl Rupp arg2++; 627*2fa5cd67SKarl Rupp } 6283fdc5746SBarry Smith PetscFunctionReturn(0); 629827bd09bSSatish Balay } 630827bd09bSSatish Balay 6317b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 632ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 633827bd09bSSatish Balay { 6343fdc5746SBarry Smith PetscFunctionBegin; 635*2fa5cd67SKarl Rupp while (n--) { 636*2fa5cd67SKarl Rupp *arg1 = MIN_FABS(*arg1,*arg2); 637*2fa5cd67SKarl Rupp arg1++; 638*2fa5cd67SKarl Rupp arg2++; 639*2fa5cd67SKarl Rupp } 6403fdc5746SBarry Smith PetscFunctionReturn(0); 641827bd09bSSatish Balay } 642827bd09bSSatish Balay 6437b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 644ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists(PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 645827bd09bSSatish Balay { 6463fdc5746SBarry Smith PetscFunctionBegin; 647*2fa5cd67SKarl Rupp while (n--) { 648*2fa5cd67SKarl Rupp *arg1 = EXISTS(*arg1,*arg2); 649*2fa5cd67SKarl Rupp arg1++; 650*2fa5cd67SKarl Rupp arg2++; 651*2fa5cd67SKarl Rupp } 6523fdc5746SBarry Smith PetscFunctionReturn(0); 653827bd09bSSatish Balay } 654827bd09bSSatish Balay 6557b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 656ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3) 657827bd09bSSatish Balay { 65852f87cdaSBarry Smith PetscInt i, j, type; 659827bd09bSSatish Balay 6603fdc5746SBarry Smith PetscFunctionBegin; 661827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 662db4deed7SKarl Rupp for (i=0; i<n; ) { 663db4deed7SKarl Rupp 664827bd09bSSatish Balay /* clump 'em for now */ 665827bd09bSSatish Balay j =i+1; 666827bd09bSSatish Balay type = arg3[i]; 667*2fa5cd67SKarl Rupp while ((j<n)&&(arg3[j]==type)) j++; 668827bd09bSSatish Balay 669827bd09bSSatish Balay /* how many together */ 670827bd09bSSatish Balay j -= i; 671827bd09bSSatish Balay 672827bd09bSSatish Balay /* call appropriate ivec function */ 673*2fa5cd67SKarl Rupp if (type == GL_MAX) PCTFS_rvec_max(arg1,arg2,j); 674*2fa5cd67SKarl Rupp else if (type == GL_MIN) PCTFS_rvec_min(arg1,arg2,j); 675*2fa5cd67SKarl Rupp else if (type == GL_MULT) PCTFS_rvec_mult(arg1,arg2,j); 676*2fa5cd67SKarl Rupp else if (type == GL_ADD) PCTFS_rvec_add(arg1,arg2,j); 677*2fa5cd67SKarl Rupp else if (type == GL_MAX_ABS) PCTFS_rvec_max_abs(arg1,arg2,j); 678*2fa5cd67SKarl Rupp else if (type == GL_MIN_ABS) PCTFS_rvec_min_abs(arg1,arg2,j); 679*2fa5cd67SKarl Rupp else if (type == GL_EXISTS) PCTFS_rvec_exists(arg1,arg2,j); 680ca8e9878SJed Brown else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!"); 681827bd09bSSatish Balay 682827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 683827bd09bSSatish Balay } 6843fdc5746SBarry Smith PetscFunctionReturn(0); 685827bd09bSSatish Balay } 686827bd09bSSatish Balay 6877b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 688ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr(PetscInt type) 689827bd09bSSatish Balay { 690*2fa5cd67SKarl Rupp if (type == NON_UNIFORM) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_non_uniform); 691*2fa5cd67SKarl Rupp else if (type == GL_MAX) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max); 692*2fa5cd67SKarl Rupp else if (type == GL_MIN) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min); 693*2fa5cd67SKarl Rupp else if (type == GL_MULT) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_mult); 694*2fa5cd67SKarl Rupp else if (type == GL_ADD) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_add); 695*2fa5cd67SKarl Rupp else if (type == GL_MAX_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_max_abs); 696*2fa5cd67SKarl Rupp else if (type == GL_MIN_ABS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_min_abs); 697*2fa5cd67SKarl Rupp else if (type == GL_EXISTS) return((PetscErrorCode (*)(void*, void*, PetscInt, ...))&PCTFS_rvec_exists); 698827bd09bSSatish Balay 699827bd09bSSatish Balay /* catch all ... not good if we get here */ 700827bd09bSSatish Balay return(NULL); 701827bd09bSSatish Balay } 702827bd09bSSatish Balay 703827bd09bSSatish Balay 704827bd09bSSatish Balay 705827bd09bSSatish Balay 706827bd09bSSatish Balay 707827bd09bSSatish Balay 708