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*************************************/ 29*ca8e9878SJed Brown PetscInt *PCTFS_ivec_copy( PetscInt *arg1, PetscInt *arg2, PetscInt n) 30827bd09bSSatish Balay { 31827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 32827bd09bSSatish Balay return(arg1); 33827bd09bSSatish Balay } 34827bd09bSSatish Balay 357b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 36*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_zero( PetscInt *arg1, PetscInt n) 37827bd09bSSatish Balay { 383fdc5746SBarry Smith PetscFunctionBegin; 39827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 403fdc5746SBarry Smith PetscFunctionReturn(0); 41827bd09bSSatish Balay } 42827bd09bSSatish Balay 437b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 44*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_set( PetscInt *arg1, PetscInt arg2, PetscInt n) 45827bd09bSSatish Balay { 463fdc5746SBarry Smith PetscFunctionBegin; 47827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 483fdc5746SBarry Smith PetscFunctionReturn(0); 49827bd09bSSatish Balay } 50827bd09bSSatish Balay 517b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 52*ca8e9878SJed 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*************************************/ 60*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_min( PetscInt *arg1, PetscInt *arg2, PetscInt n) 61827bd09bSSatish Balay { 623fdc5746SBarry Smith PetscFunctionBegin; 6339945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 643fdc5746SBarry Smith PetscFunctionReturn(0); 65827bd09bSSatish Balay } 66827bd09bSSatish Balay 677b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 68*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_mult( PetscInt *arg1, PetscInt *arg2, PetscInt n) 69827bd09bSSatish Balay { 703fdc5746SBarry Smith PetscFunctionBegin; 71827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 723fdc5746SBarry Smith PetscFunctionReturn(0); 73827bd09bSSatish Balay } 74827bd09bSSatish Balay 757b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 76*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_add( PetscInt *arg1, PetscInt *arg2, PetscInt n) 77827bd09bSSatish Balay { 783fdc5746SBarry Smith PetscFunctionBegin; 79827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 803fdc5746SBarry Smith PetscFunctionReturn(0); 81827bd09bSSatish Balay } 82827bd09bSSatish Balay 837b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 84*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lxor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 85827bd09bSSatish Balay { 863fdc5746SBarry Smith PetscFunctionBegin; 87827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 883fdc5746SBarry Smith PetscFunctionReturn(0); 89827bd09bSSatish Balay } 90827bd09bSSatish Balay 917b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 92*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_xor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 93827bd09bSSatish Balay { 943fdc5746SBarry Smith PetscFunctionBegin; 95827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 963fdc5746SBarry Smith PetscFunctionReturn(0); 97827bd09bSSatish Balay } 98827bd09bSSatish Balay 997b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 100*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_or( PetscInt *arg1, PetscInt *arg2, PetscInt n) 101827bd09bSSatish Balay { 1023fdc5746SBarry Smith PetscFunctionBegin; 103827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 1043fdc5746SBarry Smith PetscFunctionReturn(0); 105827bd09bSSatish Balay } 106827bd09bSSatish Balay 1077b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 108*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_lor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 109827bd09bSSatish Balay { 1103fdc5746SBarry Smith PetscFunctionBegin; 111827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 1123fdc5746SBarry Smith PetscFunctionReturn(0); 113827bd09bSSatish Balay } 114827bd09bSSatish Balay 1157b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 116*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and( PetscInt *arg1, PetscInt *arg2, PetscInt n) 117827bd09bSSatish Balay { 1183fdc5746SBarry Smith PetscFunctionBegin; 119827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 1203fdc5746SBarry Smith PetscFunctionReturn(0); 121827bd09bSSatish Balay } 122827bd09bSSatish Balay 1237b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 124*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_land( PetscInt *arg1, PetscInt *arg2, PetscInt n) 125827bd09bSSatish Balay { 1263fdc5746SBarry Smith PetscFunctionBegin; 127827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 1283fdc5746SBarry Smith PetscFunctionReturn(0); 129827bd09bSSatish Balay } 130827bd09bSSatish Balay 1317b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 132*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_and3( PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 133827bd09bSSatish Balay { 1343fdc5746SBarry Smith PetscFunctionBegin; 135827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 1363fdc5746SBarry Smith PetscFunctionReturn(0); 137827bd09bSSatish Balay } 138827bd09bSSatish Balay 1397b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 140*ca8e9878SJed Brown PetscInt PCTFS_ivec_sum( PetscInt *arg1, PetscInt n) 141827bd09bSSatish Balay { 14252f87cdaSBarry Smith PetscInt tmp = 0; 143827bd09bSSatish Balay 144827bd09bSSatish Balay 145827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 146827bd09bSSatish Balay return(tmp); 147827bd09bSSatish Balay } 148827bd09bSSatish Balay 1497b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 150*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, PetscInt *arg3) 151827bd09bSSatish Balay { 15252f87cdaSBarry Smith PetscInt i, j, type; 153827bd09bSSatish Balay 154827bd09bSSatish Balay 1553fdc5746SBarry Smith PetscFunctionBegin; 156827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 157827bd09bSSatish Balay for (i=0;i<n;) 158827bd09bSSatish Balay { 159827bd09bSSatish Balay /* clump 'em for now */ 160827bd09bSSatish Balay j=i+1; 161827bd09bSSatish Balay type = arg3[i]; 162827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 163827bd09bSSatish Balay {j++;} 164827bd09bSSatish Balay 165827bd09bSSatish Balay /* how many together */ 166827bd09bSSatish Balay j -= i; 167827bd09bSSatish Balay 168827bd09bSSatish Balay /* call appropriate ivec function */ 169827bd09bSSatish Balay if (type == GL_MAX) 170*ca8e9878SJed Brown {PCTFS_ivec_max(arg1,arg2,j);} 171827bd09bSSatish Balay else if (type == GL_MIN) 172*ca8e9878SJed Brown {PCTFS_ivec_min(arg1,arg2,j);} 173827bd09bSSatish Balay else if (type == GL_MULT) 174*ca8e9878SJed Brown {PCTFS_ivec_mult(arg1,arg2,j);} 175827bd09bSSatish Balay else if (type == GL_ADD) 176*ca8e9878SJed Brown {PCTFS_ivec_add(arg1,arg2,j);} 177827bd09bSSatish Balay else if (type == GL_B_XOR) 178*ca8e9878SJed Brown {PCTFS_ivec_xor(arg1,arg2,j);} 179827bd09bSSatish Balay else if (type == GL_B_OR) 180*ca8e9878SJed Brown {PCTFS_ivec_or(arg1,arg2,j);} 181827bd09bSSatish Balay else if (type == GL_B_AND) 182*ca8e9878SJed Brown {PCTFS_ivec_and(arg1,arg2,j);} 183827bd09bSSatish Balay else if (type == GL_L_XOR) 184*ca8e9878SJed Brown {PCTFS_ivec_lxor(arg1,arg2,j);} 185827bd09bSSatish Balay else if (type == GL_L_OR) 186*ca8e9878SJed Brown {PCTFS_ivec_lor(arg1,arg2,j);} 187827bd09bSSatish Balay else if (type == GL_L_AND) 188*ca8e9878SJed Brown {PCTFS_ivec_land(arg1,arg2,j);} 189827bd09bSSatish Balay else 190*ca8e9878SJed Brown 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*************************************/ 198*ca8e9878SJed Brown vfp PCTFS_ivec_fct_addr( PetscInt type) 199827bd09bSSatish Balay { 2003fdc5746SBarry Smith PetscFunctionBegin; 201827bd09bSSatish Balay if (type == NON_UNIFORM) 202*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_non_uniform);} 203827bd09bSSatish Balay else if (type == GL_MAX) 204*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_max);} 205827bd09bSSatish Balay else if (type == GL_MIN) 206*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_min);} 207827bd09bSSatish Balay else if (type == GL_MULT) 208*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_mult);} 209827bd09bSSatish Balay else if (type == GL_ADD) 210*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_add);} 211827bd09bSSatish Balay else if (type == GL_B_XOR) 212*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_xor);} 213827bd09bSSatish Balay else if (type == GL_B_OR) 214*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_or);} 215827bd09bSSatish Balay else if (type == GL_B_AND) 216*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_and);} 217827bd09bSSatish Balay else if (type == GL_L_XOR) 218*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_lxor);} 219827bd09bSSatish Balay else if (type == GL_L_OR) 220*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_lor);} 221827bd09bSSatish Balay else if (type == GL_L_AND) 222*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_ivec_land);} 223827bd09bSSatish Balay 224827bd09bSSatish Balay /* catch all ... not good if we get here */ 225827bd09bSSatish Balay return(NULL); 226827bd09bSSatish Balay } 227827bd09bSSatish Balay 2287b1ae94cSBarry Smith /******************************************************************************/ 229*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort( PetscInt *ar, PetscInt size) 230827bd09bSSatish Balay { 23152f87cdaSBarry Smith PetscInt *pi, *pj, temp; 23252f87cdaSBarry Smith PetscInt **top_a = (PetscInt **) offset_stack; 23352f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 234827bd09bSSatish Balay 235827bd09bSSatish Balay 236827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 237827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 238827bd09bSSatish Balay size--; 239827bd09bSSatish Balay 240827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 241827bd09bSSatish Balay for (;;) 242827bd09bSSatish Balay { 243827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 244827bd09bSSatish Balay if (size > SORT_OPT) 245827bd09bSSatish Balay { 246827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 247827bd09bSSatish Balay pi = ar+1; 248827bd09bSSatish Balay pj = ar+size; 249827bd09bSSatish Balay 250827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 251827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 252827bd09bSSatish Balay 253827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 254827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 255827bd09bSSatish Balay if (*pi > *pj) 256827bd09bSSatish Balay {SWAP(*pi,*pj)} 257827bd09bSSatish Balay if (*ar > *pj) 258827bd09bSSatish Balay {SWAP(*ar,*pj)} 259827bd09bSSatish Balay else if (*pi > *ar) 260827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 261827bd09bSSatish Balay 262827bd09bSSatish Balay /* partition about pivot_value ... */ 263827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 264827bd09bSSatish Balay for(;;) 265827bd09bSSatish Balay { 266827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 267827bd09bSSatish Balay do pi++; while (*pi<*ar); 268827bd09bSSatish Balay do pj--; while (*pj>*ar); 269827bd09bSSatish Balay 270827bd09bSSatish Balay /* if we've crossed we're done */ 271827bd09bSSatish Balay if (pj<pi) break; 272827bd09bSSatish Balay 273827bd09bSSatish Balay /* else swap */ 274827bd09bSSatish Balay SWAP(*pi,*pj) 275827bd09bSSatish Balay } 276827bd09bSSatish Balay 277827bd09bSSatish Balay /* place pivot_value in it's correct location */ 278827bd09bSSatish Balay SWAP(*ar,*pj) 279827bd09bSSatish Balay 280827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 281*ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort() :: STACK EXHAUSTED!!!"); 282827bd09bSSatish Balay 283827bd09bSSatish Balay /* push right hand child iff length > 1 */ 28452f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 285827bd09bSSatish Balay { 286827bd09bSSatish Balay *(top_a++) = pi; 287827bd09bSSatish Balay size -= *top_s+2; 288827bd09bSSatish Balay top_s++; 289827bd09bSSatish Balay } 290827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 291827bd09bSSatish Balay else if (size -= *top_s+2) 292827bd09bSSatish Balay {;} 293827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 294827bd09bSSatish Balay else 295827bd09bSSatish Balay { 296827bd09bSSatish Balay ar = *(--top_a); 297827bd09bSSatish Balay size = *(--top_s); 298827bd09bSSatish Balay } 299827bd09bSSatish Balay } 300827bd09bSSatish Balay 301827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 302827bd09bSSatish Balay else 303827bd09bSSatish Balay { 304827bd09bSSatish Balay /* insertion sort for bottom */ 305827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 306827bd09bSSatish Balay { 307827bd09bSSatish Balay temp = *pj; 308827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 309827bd09bSSatish Balay { 310827bd09bSSatish Balay if (*pi <= temp) break; 311827bd09bSSatish Balay *(pi+1)=*pi; 312827bd09bSSatish Balay } 313827bd09bSSatish Balay *(pi+1)=temp; 314827bd09bSSatish Balay } 315827bd09bSSatish Balay 316827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3173fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 318827bd09bSSatish Balay 319827bd09bSSatish Balay /* else pop another list from the stack */ 320827bd09bSSatish Balay ar = *(--top_a); 321827bd09bSSatish Balay size = *(--top_s); 322827bd09bSSatish Balay } 323827bd09bSSatish Balay } 3243fdc5746SBarry Smith PetscFunctionReturn(0); 325827bd09bSSatish Balay } 326827bd09bSSatish Balay 3277b1ae94cSBarry Smith /******************************************************************************/ 328*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion( PetscInt *ar, PetscInt *ar2, PetscInt size) 329827bd09bSSatish Balay { 33052f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 33152f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 33252f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 33352f87cdaSBarry Smith PetscInt *pi2, *pj2; 33452f87cdaSBarry Smith PetscInt mid; 335827bd09bSSatish Balay 3363fdc5746SBarry Smith PetscFunctionBegin; 337827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 338827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 339827bd09bSSatish Balay size--; 340827bd09bSSatish Balay 341827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 342827bd09bSSatish Balay for (;;) 343827bd09bSSatish Balay { 344827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 345827bd09bSSatish Balay if (size > SORT_OPT) 346827bd09bSSatish Balay { 347827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 348827bd09bSSatish Balay mid = size>>1; 349827bd09bSSatish Balay pi = ar+1; 350827bd09bSSatish Balay pj = ar+mid; 351827bd09bSSatish Balay pi2 = ar2+1; 352827bd09bSSatish Balay pj2 = ar2+mid; 353827bd09bSSatish Balay 354827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 355827bd09bSSatish Balay SWAP(*pi,*pj) 356827bd09bSSatish Balay SWAP(*pi2,*pj2) 357827bd09bSSatish Balay 358827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 359827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 360827bd09bSSatish Balay pj = ar+size; 361827bd09bSSatish Balay pj2 = ar2+size; 362827bd09bSSatish Balay if (*pi > *pj) 363827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 364827bd09bSSatish Balay if (*ar > *pj) 365827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 366827bd09bSSatish Balay else if (*pi > *ar) 367827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 368827bd09bSSatish Balay 369827bd09bSSatish Balay /* partition about pivot_value ... */ 370827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 371827bd09bSSatish Balay for(;;) 372827bd09bSSatish Balay { 373827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 374827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 375827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 376827bd09bSSatish Balay 377827bd09bSSatish Balay /* if we've crossed we're done */ 378827bd09bSSatish Balay if (pj<pi) break; 379827bd09bSSatish Balay 380827bd09bSSatish Balay /* else swap */ 381827bd09bSSatish Balay SWAP(*pi,*pj) 382827bd09bSSatish Balay SWAP(*pi2,*pj2) 383827bd09bSSatish Balay } 384827bd09bSSatish Balay 385827bd09bSSatish Balay /* place pivot_value in it's correct location */ 386827bd09bSSatish Balay SWAP(*ar,*pj) 387827bd09bSSatish Balay SWAP(*ar2,*pj2) 388827bd09bSSatish Balay 389827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 390*ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion() :: STACK EXHAUSTED!!!"); 391827bd09bSSatish Balay 392827bd09bSSatish Balay /* push right hand child iff length > 1 */ 39352f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 394827bd09bSSatish Balay { 395827bd09bSSatish Balay *(top_a++) = pi; 396827bd09bSSatish Balay *(top_a++) = pi2; 397827bd09bSSatish Balay size -= *top_s+2; 398827bd09bSSatish Balay top_s++; 399827bd09bSSatish Balay } 400827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 401827bd09bSSatish Balay else if (size -= *top_s+2) 402827bd09bSSatish Balay {;} 403827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 404827bd09bSSatish Balay else 405827bd09bSSatish Balay { 406827bd09bSSatish Balay ar2 = *(--top_a); 407827bd09bSSatish Balay ar = *(--top_a); 408827bd09bSSatish Balay size = *(--top_s); 409827bd09bSSatish Balay } 410827bd09bSSatish Balay } 411827bd09bSSatish Balay 412827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 413827bd09bSSatish Balay else 414827bd09bSSatish Balay { 415827bd09bSSatish Balay /* insertion sort for bottom */ 416827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 417827bd09bSSatish Balay { 418827bd09bSSatish Balay temp = *pj; 419827bd09bSSatish Balay temp2 = *pj2; 420827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 421827bd09bSSatish Balay { 422827bd09bSSatish Balay if (*pi <= temp) break; 423827bd09bSSatish Balay *(pi+1)=*pi; 424827bd09bSSatish Balay *(pi2+1)=*pi2; 425827bd09bSSatish Balay } 426827bd09bSSatish Balay *(pi+1)=temp; 427827bd09bSSatish Balay *(pi2+1)=temp2; 428827bd09bSSatish Balay } 429827bd09bSSatish Balay 430827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4313fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 432827bd09bSSatish Balay 433827bd09bSSatish Balay /* else pop another list from the stack */ 434827bd09bSSatish Balay ar2 = *(--top_a); 435827bd09bSSatish Balay ar = *(--top_a); 436827bd09bSSatish Balay size = *(--top_s); 437827bd09bSSatish Balay } 438827bd09bSSatish Balay } 4393fdc5746SBarry Smith PetscFunctionReturn(0); 440827bd09bSSatish Balay } 441827bd09bSSatish Balay 4427b1ae94cSBarry Smith /******************************************************************************/ 443*ca8e9878SJed Brown PetscErrorCode PCTFS_ivec_sort_companion_hack( PetscInt *ar, PetscInt **ar2, PetscInt size) 444827bd09bSSatish Balay { 44552f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 44652f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 44752f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 44852f87cdaSBarry Smith PetscInt **pi2, **pj2; 44952f87cdaSBarry Smith PetscInt mid; 450827bd09bSSatish Balay 4513fdc5746SBarry Smith PetscFunctionBegin; 452827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 453827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 454827bd09bSSatish Balay size--; 455827bd09bSSatish Balay 456827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 457827bd09bSSatish Balay for (;;) 458827bd09bSSatish Balay { 459827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 460827bd09bSSatish Balay if (size > SORT_OPT) 461827bd09bSSatish Balay { 462827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 463827bd09bSSatish Balay mid = size>>1; 464827bd09bSSatish Balay pi = ar+1; 465827bd09bSSatish Balay pj = ar+mid; 466827bd09bSSatish Balay pi2 = ar2+1; 467827bd09bSSatish Balay pj2 = ar2+mid; 468827bd09bSSatish Balay 469827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 470827bd09bSSatish Balay SWAP(*pi,*pj) 471827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 472827bd09bSSatish Balay 473827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 474827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 475827bd09bSSatish Balay pj = ar+size; 476827bd09bSSatish Balay pj2 = ar2+size; 477827bd09bSSatish Balay if (*pi > *pj) 478827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 479827bd09bSSatish Balay if (*ar > *pj) 480827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 481827bd09bSSatish Balay else if (*pi > *ar) 482827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 483827bd09bSSatish Balay 484827bd09bSSatish Balay /* partition about pivot_value ... */ 485827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 486827bd09bSSatish Balay for(;;) 487827bd09bSSatish Balay { 488827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 489827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 490827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 491827bd09bSSatish Balay 492827bd09bSSatish Balay /* if we've crossed we're done */ 493827bd09bSSatish Balay if (pj<pi) break; 494827bd09bSSatish Balay 495827bd09bSSatish Balay /* else swap */ 496827bd09bSSatish Balay SWAP(*pi,*pj) 497827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 498827bd09bSSatish Balay } 499827bd09bSSatish Balay 500827bd09bSSatish Balay /* place pivot_value in it's correct location */ 501827bd09bSSatish Balay SWAP(*ar,*pj) 502827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 503827bd09bSSatish Balay 504827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 505*ca8e9878SJed Brown if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 506827bd09bSSatish Balay 507827bd09bSSatish Balay /* push right hand child iff length > 1 */ 50852f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 509827bd09bSSatish Balay { 510827bd09bSSatish Balay *(top_a++) = pi; 51152f87cdaSBarry Smith *(top_a++) = (PetscInt*) pi2; 512827bd09bSSatish Balay size -= *top_s+2; 513827bd09bSSatish Balay top_s++; 514827bd09bSSatish Balay } 515827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 516827bd09bSSatish Balay else if (size -= *top_s+2) 517827bd09bSSatish Balay {;} 518827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 519827bd09bSSatish Balay else 520827bd09bSSatish Balay { 52152f87cdaSBarry Smith ar2 = (PetscInt **) *(--top_a); 522827bd09bSSatish Balay ar = *(--top_a); 523827bd09bSSatish Balay size = *(--top_s); 524827bd09bSSatish Balay } 525827bd09bSSatish Balay } 526827bd09bSSatish Balay 527827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 528827bd09bSSatish Balay else 529827bd09bSSatish Balay { 530827bd09bSSatish Balay /* insertion sort for bottom */ 531827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 532827bd09bSSatish Balay { 533827bd09bSSatish Balay temp = *pj; 534827bd09bSSatish Balay ptr = *pj2; 535827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 536827bd09bSSatish Balay { 537827bd09bSSatish Balay if (*pi <= temp) break; 538827bd09bSSatish Balay *(pi+1)=*pi; 539827bd09bSSatish Balay *(pi2+1)=*pi2; 540827bd09bSSatish Balay } 541827bd09bSSatish Balay *(pi+1)=temp; 542827bd09bSSatish Balay *(pi2+1)=ptr; 543827bd09bSSatish Balay } 544827bd09bSSatish Balay 545827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 5463fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 547827bd09bSSatish Balay 548827bd09bSSatish Balay /* else pop another list from the stack */ 54952f87cdaSBarry Smith ar2 = (PetscInt **)*(--top_a); 550827bd09bSSatish Balay ar = *(--top_a); 551827bd09bSSatish Balay size = *(--top_s); 552827bd09bSSatish Balay } 553827bd09bSSatish Balay } 5543fdc5746SBarry Smith PetscFunctionReturn(0); 555827bd09bSSatish Balay } 556827bd09bSSatish Balay 5577b1ae94cSBarry Smith /******************************************************************************/ 558*ca8e9878SJed Brown PetscErrorCode PCTFS_SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 559827bd09bSSatish Balay { 5603fdc5746SBarry Smith PetscFunctionBegin; 561e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 562*ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size); 563*ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 564e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 565*ca8e9878SJed Brown if (ar2) PCTFS_ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt **)ar2,size); 566*ca8e9878SJed Brown else PCTFS_ivec_sort((PetscInt*)ar1,size); 567*ca8e9878SJed Brown } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"PCTFS_SMI_sort only does SORT_INTEGER!"); 5683fdc5746SBarry Smith PetscFunctionReturn(0); 569827bd09bSSatish Balay } 570827bd09bSSatish Balay 5717b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 572*ca8e9878SJed Brown PetscInt PCTFS_ivec_linear_search( PetscInt item, PetscInt *list, PetscInt n) 573827bd09bSSatish Balay { 57452f87cdaSBarry Smith PetscInt tmp = n-1; 5753fdc5746SBarry Smith PetscFunctionBegin; 576827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 577827bd09bSSatish Balay return(-1); 578827bd09bSSatish Balay } 579827bd09bSSatish Balay 5807b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 581*ca8e9878SJed Brown PetscInt PCTFS_ivec_binary_search( PetscInt item, PetscInt *list, PetscInt rh) 582827bd09bSSatish Balay { 58352f87cdaSBarry Smith PetscInt mid, lh=0; 584827bd09bSSatish Balay 585827bd09bSSatish Balay rh--; 586827bd09bSSatish Balay while (lh<=rh) 587827bd09bSSatish Balay { 588827bd09bSSatish Balay mid = (lh+rh)>>1; 589827bd09bSSatish Balay if (*(list+mid) == item) 590827bd09bSSatish Balay {return(mid);} 591827bd09bSSatish Balay if (*(list+mid) > item) 592827bd09bSSatish Balay {rh = mid-1;} 593827bd09bSSatish Balay else 594827bd09bSSatish Balay {lh = mid+1;} 595827bd09bSSatish Balay } 596827bd09bSSatish Balay return(-1); 597827bd09bSSatish Balay } 598827bd09bSSatish Balay 5997b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 600*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_copy( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 601827bd09bSSatish Balay { 6023fdc5746SBarry Smith PetscFunctionBegin; 603827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 6043fdc5746SBarry Smith PetscFunctionReturn(0); 605827bd09bSSatish Balay } 606827bd09bSSatish Balay 6077b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 608*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_zero( PetscScalar *arg1, PetscInt n) 609827bd09bSSatish Balay { 6103fdc5746SBarry Smith PetscFunctionBegin; 611827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 6123fdc5746SBarry Smith PetscFunctionReturn(0); 613827bd09bSSatish Balay } 614827bd09bSSatish Balay 6157b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 616*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_one( PetscScalar *arg1, PetscInt n) 617827bd09bSSatish Balay { 6183fdc5746SBarry Smith PetscFunctionBegin; 619827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 6203fdc5746SBarry Smith PetscFunctionReturn(0); 621827bd09bSSatish Balay } 622827bd09bSSatish Balay 6237b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 624*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_set( PetscScalar *arg1, PetscScalar arg2, PetscInt n) 625827bd09bSSatish Balay { 6263fdc5746SBarry Smith PetscFunctionBegin; 627827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 6283fdc5746SBarry Smith PetscFunctionReturn(0); 629827bd09bSSatish Balay } 630827bd09bSSatish Balay 6317b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 632*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_scale( PetscScalar *arg1, PetscScalar arg2, PetscInt n) 633827bd09bSSatish Balay { 6343fdc5746SBarry Smith PetscFunctionBegin; 635827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 6363fdc5746SBarry Smith PetscFunctionReturn(0); 637827bd09bSSatish Balay } 638827bd09bSSatish Balay 6397b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 640*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_add( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 641827bd09bSSatish Balay { 6423fdc5746SBarry Smith PetscFunctionBegin; 643827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 6443fdc5746SBarry Smith PetscFunctionReturn(0); 645827bd09bSSatish Balay } 646827bd09bSSatish Balay 6477b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 648*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_mult( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 649827bd09bSSatish Balay { 6503fdc5746SBarry Smith PetscFunctionBegin; 651827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 6523fdc5746SBarry Smith PetscFunctionReturn(0); 653827bd09bSSatish Balay } 654827bd09bSSatish Balay 6557b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 656*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 657827bd09bSSatish Balay { 6583fdc5746SBarry Smith PetscFunctionBegin; 65939945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 6603fdc5746SBarry Smith PetscFunctionReturn(0); 661827bd09bSSatish Balay } 662827bd09bSSatish Balay 6637b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 664*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 665827bd09bSSatish Balay { 6663fdc5746SBarry Smith PetscFunctionBegin; 667827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 6683fdc5746SBarry Smith PetscFunctionReturn(0); 669827bd09bSSatish Balay } 670827bd09bSSatish Balay 6717b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 672*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 673827bd09bSSatish Balay { 6743fdc5746SBarry Smith PetscFunctionBegin; 67539945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 6763fdc5746SBarry Smith PetscFunctionReturn(0); 677827bd09bSSatish Balay } 678827bd09bSSatish Balay 6797b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 680*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 681827bd09bSSatish Balay { 6823fdc5746SBarry Smith PetscFunctionBegin; 683827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 6843fdc5746SBarry Smith PetscFunctionReturn(0); 685827bd09bSSatish Balay } 686827bd09bSSatish Balay 6877b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 688*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_exists( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 689827bd09bSSatish Balay { 6903fdc5746SBarry Smith PetscFunctionBegin; 691827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 6923fdc5746SBarry Smith PetscFunctionReturn(0); 693827bd09bSSatish Balay } 694827bd09bSSatish Balay 6957b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 696*ca8e9878SJed Brown PetscErrorCode PCTFS_rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3) 697827bd09bSSatish Balay { 69852f87cdaSBarry Smith PetscInt i, j, type; 699827bd09bSSatish Balay 7003fdc5746SBarry Smith PetscFunctionBegin; 701827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 702827bd09bSSatish Balay for (i=0;i<n;) 703827bd09bSSatish Balay { 704827bd09bSSatish Balay /* clump 'em for now */ 705827bd09bSSatish Balay j=i+1; 706827bd09bSSatish Balay type = arg3[i]; 707827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 708827bd09bSSatish Balay {j++;} 709827bd09bSSatish Balay 710827bd09bSSatish Balay /* how many together */ 711827bd09bSSatish Balay j -= i; 712827bd09bSSatish Balay 713827bd09bSSatish Balay /* call appropriate ivec function */ 714827bd09bSSatish Balay if (type == GL_MAX) 715*ca8e9878SJed Brown {PCTFS_rvec_max(arg1,arg2,j);} 716827bd09bSSatish Balay else if (type == GL_MIN) 717*ca8e9878SJed Brown {PCTFS_rvec_min(arg1,arg2,j);} 718827bd09bSSatish Balay else if (type == GL_MULT) 719*ca8e9878SJed Brown {PCTFS_rvec_mult(arg1,arg2,j);} 720827bd09bSSatish Balay else if (type == GL_ADD) 721*ca8e9878SJed Brown {PCTFS_rvec_add(arg1,arg2,j);} 722827bd09bSSatish Balay else if (type == GL_MAX_ABS) 723*ca8e9878SJed Brown {PCTFS_rvec_max_abs(arg1,arg2,j);} 724827bd09bSSatish Balay else if (type == GL_MIN_ABS) 725*ca8e9878SJed Brown {PCTFS_rvec_min_abs(arg1,arg2,j);} 726827bd09bSSatish Balay else if (type == GL_EXISTS) 727*ca8e9878SJed Brown {PCTFS_rvec_exists(arg1,arg2,j);} 728*ca8e9878SJed Brown else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to PCTFS_rvec_non_uniform()!"); 729827bd09bSSatish Balay 730827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 731827bd09bSSatish Balay } 7323fdc5746SBarry Smith PetscFunctionReturn(0); 733827bd09bSSatish Balay } 734827bd09bSSatish Balay 7357b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 736*ca8e9878SJed Brown vfp PCTFS_rvec_fct_addr( PetscInt type) 737827bd09bSSatish Balay { 738827bd09bSSatish Balay if (type == NON_UNIFORM) 739*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_non_uniform);} 740827bd09bSSatish Balay else if (type == GL_MAX) 741*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_max);} 742827bd09bSSatish Balay else if (type == GL_MIN) 743*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_min);} 744827bd09bSSatish Balay else if (type == GL_MULT) 745*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_mult);} 746827bd09bSSatish Balay else if (type == GL_ADD) 747*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_add);} 748827bd09bSSatish Balay else if (type == GL_MAX_ABS) 749*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_max_abs);} 750827bd09bSSatish Balay else if (type == GL_MIN_ABS) 751*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_min_abs);} 752827bd09bSSatish Balay else if (type == GL_EXISTS) 753*ca8e9878SJed Brown {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&PCTFS_rvec_exists);} 754827bd09bSSatish Balay 755827bd09bSSatish Balay /* catch all ... not good if we get here */ 756827bd09bSSatish Balay return(NULL); 757827bd09bSSatish Balay } 758827bd09bSSatish Balay 759827bd09bSSatish Balay 760827bd09bSSatish Balay 761827bd09bSSatish Balay 762827bd09bSSatish Balay 763827bd09bSSatish Balay 764