1dba47a55SKris Buschelman #define PETSCKSP_DLL 2827bd09bSSatish Balay 3827bd09bSSatish Balay /**********************************ivec.c************************************** 4827bd09bSSatish Balay 5827bd09bSSatish Balay Author: Henry M. Tufo III 6827bd09bSSatish Balay 7827bd09bSSatish Balay e-mail: hmt@cs.brown.edu 8827bd09bSSatish Balay 9827bd09bSSatish Balay snail-mail: 10827bd09bSSatish Balay Division of Applied Mathematics 11827bd09bSSatish Balay Brown University 12827bd09bSSatish Balay Providence, RI 02912 13827bd09bSSatish Balay 14827bd09bSSatish Balay Last Modification: 15827bd09bSSatish Balay 6.21.97 16827bd09bSSatish Balay ***********************************ivec.c*************************************/ 17827bd09bSSatish Balay 187c4f633dSBarry Smith #include "../src/ksp/pc/impls/tfs/tfs.h" 19827bd09bSSatish Balay 20827bd09bSSatish Balay /* sorting args ivec.c ivec.c ... */ 21827bd09bSSatish Balay #define SORT_OPT 6 22827bd09bSSatish Balay #define SORT_STACK 50000 23827bd09bSSatish Balay 24827bd09bSSatish Balay 25827bd09bSSatish Balay /* allocate an address and size stack for sorter(s) */ 26827bd09bSSatish Balay static void *offset_stack[2*SORT_STACK]; 2752f87cdaSBarry Smith static PetscInt size_stack[SORT_STACK]; 28827bd09bSSatish Balay 297b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 3052f87cdaSBarry Smith PetscInt *ivec_copy( PetscInt *arg1, PetscInt *arg2, PetscInt n) 31827bd09bSSatish Balay { 32827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 33827bd09bSSatish Balay return(arg1); 34827bd09bSSatish Balay } 35827bd09bSSatish Balay 367b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 3752f87cdaSBarry Smith PetscErrorCode ivec_zero( PetscInt *arg1, PetscInt n) 38827bd09bSSatish Balay { 393fdc5746SBarry Smith PetscFunctionBegin; 40827bd09bSSatish Balay while (n--) {*arg1++ = 0;} 413fdc5746SBarry Smith PetscFunctionReturn(0); 42827bd09bSSatish Balay } 43827bd09bSSatish Balay 447b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 4552f87cdaSBarry Smith PetscErrorCode ivec_set( PetscInt *arg1, PetscInt arg2, PetscInt n) 46827bd09bSSatish Balay { 473fdc5746SBarry Smith PetscFunctionBegin; 48827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 493fdc5746SBarry Smith PetscFunctionReturn(0); 50827bd09bSSatish Balay } 51827bd09bSSatish Balay 527b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 5352f87cdaSBarry Smith PetscErrorCode ivec_max( PetscInt *arg1, PetscInt *arg2, PetscInt n) 54827bd09bSSatish Balay { 553fdc5746SBarry Smith PetscFunctionBegin; 5639945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 573fdc5746SBarry Smith PetscFunctionReturn(0); 58827bd09bSSatish Balay } 59827bd09bSSatish Balay 607b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 6152f87cdaSBarry Smith PetscErrorCode ivec_min( PetscInt *arg1, PetscInt *arg2, PetscInt n) 62827bd09bSSatish Balay { 633fdc5746SBarry Smith PetscFunctionBegin; 6439945688SSatish Balay while (n--) {*(arg1) = PetscMin(*arg1,*arg2); arg1++; arg2++;} 653fdc5746SBarry Smith PetscFunctionReturn(0); 66827bd09bSSatish Balay } 67827bd09bSSatish Balay 687b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 6952f87cdaSBarry Smith PetscErrorCode ivec_mult( PetscInt *arg1, PetscInt *arg2, PetscInt n) 70827bd09bSSatish Balay { 713fdc5746SBarry Smith PetscFunctionBegin; 72827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 733fdc5746SBarry Smith PetscFunctionReturn(0); 74827bd09bSSatish Balay } 75827bd09bSSatish Balay 767b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 7752f87cdaSBarry Smith PetscErrorCode ivec_add( PetscInt *arg1, PetscInt *arg2, PetscInt n) 78827bd09bSSatish Balay { 793fdc5746SBarry Smith PetscFunctionBegin; 80827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 813fdc5746SBarry Smith PetscFunctionReturn(0); 82827bd09bSSatish Balay } 83827bd09bSSatish Balay 847b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 8552f87cdaSBarry Smith PetscErrorCode ivec_lxor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 86827bd09bSSatish Balay { 873fdc5746SBarry Smith PetscFunctionBegin; 88827bd09bSSatish Balay while (n--) {*arg1=((*arg1 || *arg2) && !(*arg1 && *arg2)); arg1++; arg2++;} 893fdc5746SBarry Smith PetscFunctionReturn(0); 90827bd09bSSatish Balay } 91827bd09bSSatish Balay 927b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 9352f87cdaSBarry Smith PetscErrorCode ivec_xor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 94827bd09bSSatish Balay { 953fdc5746SBarry Smith PetscFunctionBegin; 96827bd09bSSatish Balay while (n--) {*arg1++ ^= *arg2++;} 973fdc5746SBarry Smith PetscFunctionReturn(0); 98827bd09bSSatish Balay } 99827bd09bSSatish Balay 1007b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 10152f87cdaSBarry Smith PetscErrorCode ivec_or( PetscInt *arg1, PetscInt *arg2, PetscInt n) 102827bd09bSSatish Balay { 1033fdc5746SBarry Smith PetscFunctionBegin; 104827bd09bSSatish Balay while (n--) {*arg1++ |= *arg2++;} 1053fdc5746SBarry Smith PetscFunctionReturn(0); 106827bd09bSSatish Balay } 107827bd09bSSatish Balay 1087b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 10952f87cdaSBarry Smith PetscErrorCode ivec_lor( PetscInt *arg1, PetscInt *arg2, PetscInt n) 110827bd09bSSatish Balay { 1113fdc5746SBarry Smith PetscFunctionBegin; 112827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 || *arg2); arg1++; arg2++;} 1133fdc5746SBarry Smith PetscFunctionReturn(0); 114827bd09bSSatish Balay } 115827bd09bSSatish Balay 1167b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 11752f87cdaSBarry Smith PetscErrorCode ivec_and( PetscInt *arg1, PetscInt *arg2, PetscInt n) 118827bd09bSSatish Balay { 1193fdc5746SBarry Smith PetscFunctionBegin; 120827bd09bSSatish Balay while (n--) {*arg1++ &= *arg2++;} 1213fdc5746SBarry Smith PetscFunctionReturn(0); 122827bd09bSSatish Balay } 123827bd09bSSatish Balay 1247b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 12552f87cdaSBarry Smith PetscErrorCode ivec_land( PetscInt *arg1, PetscInt *arg2, PetscInt n) 126827bd09bSSatish Balay { 1273fdc5746SBarry Smith PetscFunctionBegin; 128827bd09bSSatish Balay while (n--) {*arg1 = (*arg1 && *arg2); arg1++; arg2++;} 1293fdc5746SBarry Smith PetscFunctionReturn(0); 130827bd09bSSatish Balay } 131827bd09bSSatish Balay 1327b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 13352f87cdaSBarry Smith PetscErrorCode ivec_and3( PetscInt *arg1, PetscInt *arg2, PetscInt *arg3, PetscInt n) 134827bd09bSSatish Balay { 1353fdc5746SBarry Smith PetscFunctionBegin; 136827bd09bSSatish Balay while (n--) {*arg1++ = (*arg2++ & *arg3++);} 1373fdc5746SBarry Smith PetscFunctionReturn(0); 138827bd09bSSatish Balay } 139827bd09bSSatish Balay 1407b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 14152f87cdaSBarry Smith PetscInt ivec_sum( PetscInt *arg1, PetscInt n) 142827bd09bSSatish Balay { 14352f87cdaSBarry Smith PetscInt tmp = 0; 144827bd09bSSatish Balay 145827bd09bSSatish Balay 146827bd09bSSatish Balay while (n--) {tmp += *arg1++;} 147827bd09bSSatish Balay return(tmp); 148827bd09bSSatish Balay } 149827bd09bSSatish Balay 1507b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 15152f87cdaSBarry Smith PetscErrorCode ivec_non_uniform(PetscInt *arg1, PetscInt *arg2, PetscInt n, PetscInt *arg3) 152827bd09bSSatish Balay { 15352f87cdaSBarry Smith PetscInt i, j, type; 154827bd09bSSatish Balay 155827bd09bSSatish Balay 1563fdc5746SBarry Smith PetscFunctionBegin; 157827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 158827bd09bSSatish Balay for (i=0;i<n;) 159827bd09bSSatish Balay { 160827bd09bSSatish Balay /* clump 'em for now */ 161827bd09bSSatish Balay j=i+1; 162827bd09bSSatish Balay type = arg3[i]; 163827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 164827bd09bSSatish Balay {j++;} 165827bd09bSSatish Balay 166827bd09bSSatish Balay /* how many together */ 167827bd09bSSatish Balay j -= i; 168827bd09bSSatish Balay 169827bd09bSSatish Balay /* call appropriate ivec function */ 170827bd09bSSatish Balay if (type == GL_MAX) 171827bd09bSSatish Balay {ivec_max(arg1,arg2,j);} 172827bd09bSSatish Balay else if (type == GL_MIN) 173827bd09bSSatish Balay {ivec_min(arg1,arg2,j);} 174827bd09bSSatish Balay else if (type == GL_MULT) 175827bd09bSSatish Balay {ivec_mult(arg1,arg2,j);} 176827bd09bSSatish Balay else if (type == GL_ADD) 177827bd09bSSatish Balay {ivec_add(arg1,arg2,j);} 178827bd09bSSatish Balay else if (type == GL_B_XOR) 179827bd09bSSatish Balay {ivec_xor(arg1,arg2,j);} 180827bd09bSSatish Balay else if (type == GL_B_OR) 181827bd09bSSatish Balay {ivec_or(arg1,arg2,j);} 182827bd09bSSatish Balay else if (type == GL_B_AND) 183827bd09bSSatish Balay {ivec_and(arg1,arg2,j);} 184827bd09bSSatish Balay else if (type == GL_L_XOR) 185827bd09bSSatish Balay {ivec_lxor(arg1,arg2,j);} 186827bd09bSSatish Balay else if (type == GL_L_OR) 187827bd09bSSatish Balay {ivec_lor(arg1,arg2,j);} 188827bd09bSSatish Balay else if (type == GL_L_AND) 189827bd09bSSatish Balay {ivec_land(arg1,arg2,j);} 190827bd09bSSatish Balay else 191*e7e72b3dSBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to ivec_non_uniform()!"); 192827bd09bSSatish Balay 193827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 194827bd09bSSatish Balay } 1953fdc5746SBarry Smith PetscFunctionReturn(0); 196827bd09bSSatish Balay } 197827bd09bSSatish Balay 1987b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 19952f87cdaSBarry Smith vfp ivec_fct_addr( PetscInt type) 200827bd09bSSatish Balay { 2013fdc5746SBarry Smith PetscFunctionBegin; 202827bd09bSSatish Balay if (type == NON_UNIFORM) 20371a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_non_uniform);} 204827bd09bSSatish Balay else if (type == GL_MAX) 20571a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_max);} 206827bd09bSSatish Balay else if (type == GL_MIN) 20771a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_min);} 208827bd09bSSatish Balay else if (type == GL_MULT) 20971a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_mult);} 210827bd09bSSatish Balay else if (type == GL_ADD) 21171a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_add);} 212827bd09bSSatish Balay else if (type == GL_B_XOR) 21371a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_xor);} 214827bd09bSSatish Balay else if (type == GL_B_OR) 21571a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_or);} 216827bd09bSSatish Balay else if (type == GL_B_AND) 21771a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_and);} 218827bd09bSSatish Balay else if (type == GL_L_XOR) 21971a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_lxor);} 220827bd09bSSatish Balay else if (type == GL_L_OR) 22171a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_lor);} 222827bd09bSSatish Balay else if (type == GL_L_AND) 22371a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&ivec_land);} 224827bd09bSSatish Balay 225827bd09bSSatish Balay /* catch all ... not good if we get here */ 226827bd09bSSatish Balay return(NULL); 227827bd09bSSatish Balay } 228827bd09bSSatish Balay 2297b1ae94cSBarry Smith /******************************************************************************/ 23052f87cdaSBarry Smith PetscErrorCode ivec_sort( PetscInt *ar, PetscInt size) 231827bd09bSSatish Balay { 23252f87cdaSBarry Smith PetscInt *pi, *pj, temp; 23352f87cdaSBarry Smith PetscInt **top_a = (PetscInt **) offset_stack; 23452f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 235827bd09bSSatish Balay 236827bd09bSSatish Balay 237827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 238827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 239827bd09bSSatish Balay size--; 240827bd09bSSatish Balay 241827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 242827bd09bSSatish Balay for (;;) 243827bd09bSSatish Balay { 244827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 245827bd09bSSatish Balay if (size > SORT_OPT) 246827bd09bSSatish Balay { 247827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 248827bd09bSSatish Balay pi = ar+1; 249827bd09bSSatish Balay pj = ar+size; 250827bd09bSSatish Balay 251827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 252827bd09bSSatish Balay SWAP(*(ar+(size>>1)),*pi) 253827bd09bSSatish Balay 254827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 255827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 256827bd09bSSatish Balay if (*pi > *pj) 257827bd09bSSatish Balay {SWAP(*pi,*pj)} 258827bd09bSSatish Balay if (*ar > *pj) 259827bd09bSSatish Balay {SWAP(*ar,*pj)} 260827bd09bSSatish Balay else if (*pi > *ar) 261827bd09bSSatish Balay {SWAP(*(ar),*(ar+1))} 262827bd09bSSatish Balay 263827bd09bSSatish Balay /* partition about pivot_value ... */ 264827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 265827bd09bSSatish Balay for(;;) 266827bd09bSSatish Balay { 267827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 268827bd09bSSatish Balay do pi++; while (*pi<*ar); 269827bd09bSSatish Balay do pj--; while (*pj>*ar); 270827bd09bSSatish Balay 271827bd09bSSatish Balay /* if we've crossed we're done */ 272827bd09bSSatish Balay if (pj<pi) break; 273827bd09bSSatish Balay 274827bd09bSSatish Balay /* else swap */ 275827bd09bSSatish Balay SWAP(*pi,*pj) 276827bd09bSSatish Balay } 277827bd09bSSatish Balay 278827bd09bSSatish Balay /* place pivot_value in it's correct location */ 279827bd09bSSatish Balay SWAP(*ar,*pj) 280827bd09bSSatish Balay 281827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 282*e7e72b3dSBarry Smith if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort() :: STACK EXHAUSTED!!!"); 283827bd09bSSatish Balay 284827bd09bSSatish Balay /* push right hand child iff length > 1 */ 28552f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 286827bd09bSSatish Balay { 287827bd09bSSatish Balay *(top_a++) = pi; 288827bd09bSSatish Balay size -= *top_s+2; 289827bd09bSSatish Balay top_s++; 290827bd09bSSatish Balay } 291827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 292827bd09bSSatish Balay else if (size -= *top_s+2) 293827bd09bSSatish Balay {;} 294827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 295827bd09bSSatish Balay else 296827bd09bSSatish Balay { 297827bd09bSSatish Balay ar = *(--top_a); 298827bd09bSSatish Balay size = *(--top_s); 299827bd09bSSatish Balay } 300827bd09bSSatish Balay } 301827bd09bSSatish Balay 302827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 303827bd09bSSatish Balay else 304827bd09bSSatish Balay { 305827bd09bSSatish Balay /* insertion sort for bottom */ 306827bd09bSSatish Balay for (pj=ar+1;pj<=ar+size;pj++) 307827bd09bSSatish Balay { 308827bd09bSSatish Balay temp = *pj; 309827bd09bSSatish Balay for (pi=pj-1;pi>=ar;pi--) 310827bd09bSSatish Balay { 311827bd09bSSatish Balay if (*pi <= temp) break; 312827bd09bSSatish Balay *(pi+1)=*pi; 313827bd09bSSatish Balay } 314827bd09bSSatish Balay *(pi+1)=temp; 315827bd09bSSatish Balay } 316827bd09bSSatish Balay 317827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 3183fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 319827bd09bSSatish Balay 320827bd09bSSatish Balay /* else pop another list from the stack */ 321827bd09bSSatish Balay ar = *(--top_a); 322827bd09bSSatish Balay size = *(--top_s); 323827bd09bSSatish Balay } 324827bd09bSSatish Balay } 3253fdc5746SBarry Smith PetscFunctionReturn(0); 326827bd09bSSatish Balay } 327827bd09bSSatish Balay 3287b1ae94cSBarry Smith /******************************************************************************/ 32952f87cdaSBarry Smith PetscErrorCode ivec_sort_companion( PetscInt *ar, PetscInt *ar2, PetscInt size) 330827bd09bSSatish Balay { 33152f87cdaSBarry Smith PetscInt *pi, *pj, temp, temp2; 33252f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 33352f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 33452f87cdaSBarry Smith PetscInt *pi2, *pj2; 33552f87cdaSBarry Smith PetscInt mid; 336827bd09bSSatish Balay 3373fdc5746SBarry Smith PetscFunctionBegin; 338827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 339827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 340827bd09bSSatish Balay size--; 341827bd09bSSatish Balay 342827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 343827bd09bSSatish Balay for (;;) 344827bd09bSSatish Balay { 345827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 346827bd09bSSatish Balay if (size > SORT_OPT) 347827bd09bSSatish Balay { 348827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 349827bd09bSSatish Balay mid = size>>1; 350827bd09bSSatish Balay pi = ar+1; 351827bd09bSSatish Balay pj = ar+mid; 352827bd09bSSatish Balay pi2 = ar2+1; 353827bd09bSSatish Balay pj2 = ar2+mid; 354827bd09bSSatish Balay 355827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 356827bd09bSSatish Balay SWAP(*pi,*pj) 357827bd09bSSatish Balay SWAP(*pi2,*pj2) 358827bd09bSSatish Balay 359827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 360827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 361827bd09bSSatish Balay pj = ar+size; 362827bd09bSSatish Balay pj2 = ar2+size; 363827bd09bSSatish Balay if (*pi > *pj) 364827bd09bSSatish Balay {SWAP(*pi,*pj) SWAP(*pi2,*pj2)} 365827bd09bSSatish Balay if (*ar > *pj) 366827bd09bSSatish Balay {SWAP(*ar,*pj) SWAP(*ar2,*pj2)} 367827bd09bSSatish Balay else if (*pi > *ar) 368827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) SWAP(*(ar2),*(ar2+1))} 369827bd09bSSatish Balay 370827bd09bSSatish Balay /* partition about pivot_value ... */ 371827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 372827bd09bSSatish Balay for(;;) 373827bd09bSSatish Balay { 374827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 375827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 376827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 377827bd09bSSatish Balay 378827bd09bSSatish Balay /* if we've crossed we're done */ 379827bd09bSSatish Balay if (pj<pi) break; 380827bd09bSSatish Balay 381827bd09bSSatish Balay /* else swap */ 382827bd09bSSatish Balay SWAP(*pi,*pj) 383827bd09bSSatish Balay SWAP(*pi2,*pj2) 384827bd09bSSatish Balay } 385827bd09bSSatish Balay 386827bd09bSSatish Balay /* place pivot_value in it's correct location */ 387827bd09bSSatish Balay SWAP(*ar,*pj) 388827bd09bSSatish Balay SWAP(*ar2,*pj2) 389827bd09bSSatish Balay 390827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 391*e7e72b3dSBarry Smith if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort_companion() :: STACK EXHAUSTED!!!"); 392827bd09bSSatish Balay 393827bd09bSSatish Balay /* push right hand child iff length > 1 */ 39452f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 395827bd09bSSatish Balay { 396827bd09bSSatish Balay *(top_a++) = pi; 397827bd09bSSatish Balay *(top_a++) = pi2; 398827bd09bSSatish Balay size -= *top_s+2; 399827bd09bSSatish Balay top_s++; 400827bd09bSSatish Balay } 401827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 402827bd09bSSatish Balay else if (size -= *top_s+2) 403827bd09bSSatish Balay {;} 404827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 405827bd09bSSatish Balay else 406827bd09bSSatish Balay { 407827bd09bSSatish Balay ar2 = *(--top_a); 408827bd09bSSatish Balay ar = *(--top_a); 409827bd09bSSatish Balay size = *(--top_s); 410827bd09bSSatish Balay } 411827bd09bSSatish Balay } 412827bd09bSSatish Balay 413827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 414827bd09bSSatish Balay else 415827bd09bSSatish Balay { 416827bd09bSSatish Balay /* insertion sort for bottom */ 417827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 418827bd09bSSatish Balay { 419827bd09bSSatish Balay temp = *pj; 420827bd09bSSatish Balay temp2 = *pj2; 421827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 422827bd09bSSatish Balay { 423827bd09bSSatish Balay if (*pi <= temp) break; 424827bd09bSSatish Balay *(pi+1)=*pi; 425827bd09bSSatish Balay *(pi2+1)=*pi2; 426827bd09bSSatish Balay } 427827bd09bSSatish Balay *(pi+1)=temp; 428827bd09bSSatish Balay *(pi2+1)=temp2; 429827bd09bSSatish Balay } 430827bd09bSSatish Balay 431827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 4323fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 433827bd09bSSatish Balay 434827bd09bSSatish Balay /* else pop another list from the stack */ 435827bd09bSSatish Balay ar2 = *(--top_a); 436827bd09bSSatish Balay ar = *(--top_a); 437827bd09bSSatish Balay size = *(--top_s); 438827bd09bSSatish Balay } 439827bd09bSSatish Balay } 4403fdc5746SBarry Smith PetscFunctionReturn(0); 441827bd09bSSatish Balay } 442827bd09bSSatish Balay 4437b1ae94cSBarry Smith /******************************************************************************/ 44452f87cdaSBarry Smith PetscErrorCode ivec_sort_companion_hack( PetscInt *ar, PetscInt **ar2, PetscInt size) 445827bd09bSSatish Balay { 44652f87cdaSBarry Smith PetscInt *pi, *pj, temp, *ptr; 44752f87cdaSBarry Smith PetscInt **top_a = (PetscInt **)offset_stack; 44852f87cdaSBarry Smith PetscInt *top_s = size_stack, *bottom_s = size_stack; 44952f87cdaSBarry Smith PetscInt **pi2, **pj2; 45052f87cdaSBarry Smith PetscInt mid; 451827bd09bSSatish Balay 4523fdc5746SBarry Smith PetscFunctionBegin; 453827bd09bSSatish Balay /* we're really interested in the offset of the last element */ 454827bd09bSSatish Balay /* ==> length of the list is now size + 1 */ 455827bd09bSSatish Balay size--; 456827bd09bSSatish Balay 457827bd09bSSatish Balay /* do until we're done ... return when stack is exhausted */ 458827bd09bSSatish Balay for (;;) 459827bd09bSSatish Balay { 460827bd09bSSatish Balay /* if list is large enough use quicksort partition exchange code */ 461827bd09bSSatish Balay if (size > SORT_OPT) 462827bd09bSSatish Balay { 463827bd09bSSatish Balay /* start up pointer at element 1 and down at size */ 464827bd09bSSatish Balay mid = size>>1; 465827bd09bSSatish Balay pi = ar+1; 466827bd09bSSatish Balay pj = ar+mid; 467827bd09bSSatish Balay pi2 = ar2+1; 468827bd09bSSatish Balay pj2 = ar2+mid; 469827bd09bSSatish Balay 470827bd09bSSatish Balay /* find middle element in list and swap w/ element 1 */ 471827bd09bSSatish Balay SWAP(*pi,*pj) 472827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 473827bd09bSSatish Balay 474827bd09bSSatish Balay /* order element 0,1,size-1 st {M,L,...,U} w/L<=M<=U */ 475827bd09bSSatish Balay /* note ==> pivot_value in index 0 */ 476827bd09bSSatish Balay pj = ar+size; 477827bd09bSSatish Balay pj2 = ar2+size; 478827bd09bSSatish Balay if (*pi > *pj) 479827bd09bSSatish Balay {SWAP(*pi,*pj) P_SWAP(*pi2,*pj2)} 480827bd09bSSatish Balay if (*ar > *pj) 481827bd09bSSatish Balay {SWAP(*ar,*pj) P_SWAP(*ar2,*pj2)} 482827bd09bSSatish Balay else if (*pi > *ar) 483827bd09bSSatish Balay {SWAP(*(ar),*(ar+1)) P_SWAP(*(ar2),*(ar2+1))} 484827bd09bSSatish Balay 485827bd09bSSatish Balay /* partition about pivot_value ... */ 486827bd09bSSatish Balay /* note lists of length 2 are not guaranteed to be sorted */ 487827bd09bSSatish Balay for(;;) 488827bd09bSSatish Balay { 489827bd09bSSatish Balay /* walk up ... and down ... swap if equal to pivot! */ 490827bd09bSSatish Balay do {pi++; pi2++;} while (*pi<*ar); 491827bd09bSSatish Balay do {pj--; pj2--;} while (*pj>*ar); 492827bd09bSSatish Balay 493827bd09bSSatish Balay /* if we've crossed we're done */ 494827bd09bSSatish Balay if (pj<pi) break; 495827bd09bSSatish Balay 496827bd09bSSatish Balay /* else swap */ 497827bd09bSSatish Balay SWAP(*pi,*pj) 498827bd09bSSatish Balay P_SWAP(*pi2,*pj2) 499827bd09bSSatish Balay } 500827bd09bSSatish Balay 501827bd09bSSatish Balay /* place pivot_value in it's correct location */ 502827bd09bSSatish Balay SWAP(*ar,*pj) 503827bd09bSSatish Balay P_SWAP(*ar2,*pj2) 504827bd09bSSatish Balay 505827bd09bSSatish Balay /* test stack_size to see if we've exhausted our stack */ 506*e7e72b3dSBarry Smith if (top_s-bottom_s >= SORT_STACK) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"ivec_sort_companion_hack() :: STACK EXHAUSTED!!!"); 507827bd09bSSatish Balay 508827bd09bSSatish Balay /* push right hand child iff length > 1 */ 50952f87cdaSBarry Smith if ((*top_s = size-((PetscInt) (pi-ar)))) 510827bd09bSSatish Balay { 511827bd09bSSatish Balay *(top_a++) = pi; 51252f87cdaSBarry Smith *(top_a++) = (PetscInt*) pi2; 513827bd09bSSatish Balay size -= *top_s+2; 514827bd09bSSatish Balay top_s++; 515827bd09bSSatish Balay } 516827bd09bSSatish Balay /* set up for next loop iff there is something to do */ 517827bd09bSSatish Balay else if (size -= *top_s+2) 518827bd09bSSatish Balay {;} 519827bd09bSSatish Balay /* might as well pop - note NR_OPT >=2 ==> we're ok! */ 520827bd09bSSatish Balay else 521827bd09bSSatish Balay { 52252f87cdaSBarry Smith ar2 = (PetscInt **) *(--top_a); 523827bd09bSSatish Balay ar = *(--top_a); 524827bd09bSSatish Balay size = *(--top_s); 525827bd09bSSatish Balay } 526827bd09bSSatish Balay } 527827bd09bSSatish Balay 528827bd09bSSatish Balay /* else sort small list directly then pop another off stack */ 529827bd09bSSatish Balay else 530827bd09bSSatish Balay { 531827bd09bSSatish Balay /* insertion sort for bottom */ 532827bd09bSSatish Balay for (pj=ar+1, pj2=ar2+1;pj<=ar+size;pj++,pj2++) 533827bd09bSSatish Balay { 534827bd09bSSatish Balay temp = *pj; 535827bd09bSSatish Balay ptr = *pj2; 536827bd09bSSatish Balay for (pi=pj-1,pi2=pj2-1;pi>=ar;pi--,pi2--) 537827bd09bSSatish Balay { 538827bd09bSSatish Balay if (*pi <= temp) break; 539827bd09bSSatish Balay *(pi+1)=*pi; 540827bd09bSSatish Balay *(pi2+1)=*pi2; 541827bd09bSSatish Balay } 542827bd09bSSatish Balay *(pi+1)=temp; 543827bd09bSSatish Balay *(pi2+1)=ptr; 544827bd09bSSatish Balay } 545827bd09bSSatish Balay 546827bd09bSSatish Balay /* check to see if stack is exhausted ==> DONE */ 5473fdc5746SBarry Smith if (top_s==bottom_s) PetscFunctionReturn(0); 548827bd09bSSatish Balay 549827bd09bSSatish Balay /* else pop another list from the stack */ 55052f87cdaSBarry Smith ar2 = (PetscInt **)*(--top_a); 551827bd09bSSatish Balay ar = *(--top_a); 552827bd09bSSatish Balay size = *(--top_s); 553827bd09bSSatish Balay } 554827bd09bSSatish Balay } 5553fdc5746SBarry Smith PetscFunctionReturn(0); 556827bd09bSSatish Balay } 557827bd09bSSatish Balay 5587b1ae94cSBarry Smith /******************************************************************************/ 55952f87cdaSBarry Smith PetscErrorCode SMI_sort(void *ar1, void *ar2, PetscInt size, PetscInt type) 560827bd09bSSatish Balay { 5613fdc5746SBarry Smith PetscFunctionBegin; 562*e7e72b3dSBarry Smith if (type == SORT_INTEGER) { 563*e7e72b3dSBarry Smith if (ar2) ivec_sort_companion((PetscInt*)ar1,(PetscInt*)ar2,size); 564*e7e72b3dSBarry Smith else ivec_sort((PetscInt*)ar1,size); 565*e7e72b3dSBarry Smith } else if (type == SORT_INT_PTR) { 566*e7e72b3dSBarry Smith if (ar2) ivec_sort_companion_hack((PetscInt*)ar1,(PetscInt **)ar2,size); 567*e7e72b3dSBarry Smith else ivec_sort((PetscInt*)ar1,size); 568*e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"SMI_sort only does SORT_INTEGER!"); 5693fdc5746SBarry Smith PetscFunctionReturn(0); 570827bd09bSSatish Balay } 571827bd09bSSatish Balay 5727b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 57352f87cdaSBarry Smith PetscInt ivec_linear_search( PetscInt item, PetscInt *list, PetscInt n) 574827bd09bSSatish Balay { 57552f87cdaSBarry Smith PetscInt tmp = n-1; 5763fdc5746SBarry Smith PetscFunctionBegin; 577827bd09bSSatish Balay while (n--) {if (*list++ == item) {return(tmp-n);}} 578827bd09bSSatish Balay return(-1); 579827bd09bSSatish Balay } 580827bd09bSSatish Balay 5817b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 58252f87cdaSBarry Smith PetscInt ivec_binary_search( PetscInt item, PetscInt *list, PetscInt rh) 583827bd09bSSatish Balay { 58452f87cdaSBarry Smith PetscInt mid, lh=0; 585827bd09bSSatish Balay 586827bd09bSSatish Balay rh--; 587827bd09bSSatish Balay while (lh<=rh) 588827bd09bSSatish Balay { 589827bd09bSSatish Balay mid = (lh+rh)>>1; 590827bd09bSSatish Balay if (*(list+mid) == item) 591827bd09bSSatish Balay {return(mid);} 592827bd09bSSatish Balay if (*(list+mid) > item) 593827bd09bSSatish Balay {rh = mid-1;} 594827bd09bSSatish Balay else 595827bd09bSSatish Balay {lh = mid+1;} 596827bd09bSSatish Balay } 597827bd09bSSatish Balay return(-1); 598827bd09bSSatish Balay } 599827bd09bSSatish Balay 6007b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 60152f87cdaSBarry Smith PetscErrorCode rvec_copy( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 602827bd09bSSatish Balay { 6033fdc5746SBarry Smith PetscFunctionBegin; 604827bd09bSSatish Balay while (n--) {*arg1++ = *arg2++;} 6053fdc5746SBarry Smith PetscFunctionReturn(0); 606827bd09bSSatish Balay } 607827bd09bSSatish Balay 6087b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 60952f87cdaSBarry Smith PetscErrorCode rvec_zero( PetscScalar *arg1, PetscInt n) 610827bd09bSSatish Balay { 6113fdc5746SBarry Smith PetscFunctionBegin; 612827bd09bSSatish Balay while (n--) {*arg1++ = 0.0;} 6133fdc5746SBarry Smith PetscFunctionReturn(0); 614827bd09bSSatish Balay } 615827bd09bSSatish Balay 6167b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 61752f87cdaSBarry Smith PetscErrorCode rvec_one( PetscScalar *arg1, PetscInt n) 618827bd09bSSatish Balay { 6193fdc5746SBarry Smith PetscFunctionBegin; 620827bd09bSSatish Balay while (n--) {*arg1++ = 1.0;} 6213fdc5746SBarry Smith PetscFunctionReturn(0); 622827bd09bSSatish Balay } 623827bd09bSSatish Balay 6247b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 62552f87cdaSBarry Smith PetscErrorCode rvec_set( PetscScalar *arg1, PetscScalar arg2, PetscInt n) 626827bd09bSSatish Balay { 6273fdc5746SBarry Smith PetscFunctionBegin; 628827bd09bSSatish Balay while (n--) {*arg1++ = arg2;} 6293fdc5746SBarry Smith PetscFunctionReturn(0); 630827bd09bSSatish Balay } 631827bd09bSSatish Balay 6327b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 63352f87cdaSBarry Smith PetscErrorCode rvec_scale( PetscScalar *arg1, PetscScalar arg2, PetscInt n) 634827bd09bSSatish Balay { 6353fdc5746SBarry Smith PetscFunctionBegin; 636827bd09bSSatish Balay while (n--) {*arg1++ *= arg2;} 6373fdc5746SBarry Smith PetscFunctionReturn(0); 638827bd09bSSatish Balay } 639827bd09bSSatish Balay 6407b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 64152f87cdaSBarry Smith PetscErrorCode rvec_add( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 642827bd09bSSatish Balay { 6433fdc5746SBarry Smith PetscFunctionBegin; 644827bd09bSSatish Balay while (n--) {*arg1++ += *arg2++;} 6453fdc5746SBarry Smith PetscFunctionReturn(0); 646827bd09bSSatish Balay } 647827bd09bSSatish Balay 6487b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 64952f87cdaSBarry Smith PetscErrorCode rvec_mult( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 650827bd09bSSatish Balay { 6513fdc5746SBarry Smith PetscFunctionBegin; 652827bd09bSSatish Balay while (n--) {*arg1++ *= *arg2++;} 6533fdc5746SBarry Smith PetscFunctionReturn(0); 654827bd09bSSatish Balay } 655827bd09bSSatish Balay 6567b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 65752f87cdaSBarry Smith PetscErrorCode rvec_max( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 658827bd09bSSatish Balay { 6593fdc5746SBarry Smith PetscFunctionBegin; 66039945688SSatish Balay while (n--) {*arg1 = PetscMax(*arg1,*arg2); arg1++; arg2++;} 6613fdc5746SBarry Smith PetscFunctionReturn(0); 662827bd09bSSatish Balay } 663827bd09bSSatish Balay 6647b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 66552f87cdaSBarry Smith PetscErrorCode rvec_max_abs( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 666827bd09bSSatish Balay { 6673fdc5746SBarry Smith PetscFunctionBegin; 668827bd09bSSatish Balay while (n--) {*arg1 = MAX_FABS(*arg1,*arg2); arg1++; arg2++;} 6693fdc5746SBarry Smith PetscFunctionReturn(0); 670827bd09bSSatish Balay } 671827bd09bSSatish Balay 6727b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 67352f87cdaSBarry Smith PetscErrorCode rvec_min( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 674827bd09bSSatish Balay { 6753fdc5746SBarry Smith PetscFunctionBegin; 67639945688SSatish Balay while (n--) {*arg1 = PetscMin(*arg1,*arg2); arg1++; arg2++;} 6773fdc5746SBarry Smith PetscFunctionReturn(0); 678827bd09bSSatish Balay } 679827bd09bSSatish Balay 6807b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 68152f87cdaSBarry Smith PetscErrorCode rvec_min_abs( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 682827bd09bSSatish Balay { 6833fdc5746SBarry Smith PetscFunctionBegin; 684827bd09bSSatish Balay while (n--) {*arg1 = MIN_FABS(*arg1,*arg2); arg1++; arg2++;} 6853fdc5746SBarry Smith PetscFunctionReturn(0); 686827bd09bSSatish Balay } 687827bd09bSSatish Balay 6887b1ae94cSBarry Smith /*********************************ivec.c*************************************/ 68952f87cdaSBarry Smith PetscErrorCode rvec_exists( PetscScalar *arg1, PetscScalar *arg2, PetscInt n) 690827bd09bSSatish Balay { 6913fdc5746SBarry Smith PetscFunctionBegin; 692827bd09bSSatish Balay while (n--) {*arg1 = EXISTS(*arg1,*arg2); arg1++; arg2++;} 6933fdc5746SBarry Smith PetscFunctionReturn(0); 694827bd09bSSatish Balay } 695827bd09bSSatish Balay 6967b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 69752f87cdaSBarry Smith PetscErrorCode rvec_non_uniform(PetscScalar *arg1, PetscScalar *arg2, PetscInt n, PetscInt *arg3) 698827bd09bSSatish Balay { 69952f87cdaSBarry Smith PetscInt i, j, type; 700827bd09bSSatish Balay 7013fdc5746SBarry Smith PetscFunctionBegin; 702827bd09bSSatish Balay /* LATER: if we're really motivated we can sort and then unsort */ 703827bd09bSSatish Balay for (i=0;i<n;) 704827bd09bSSatish Balay { 705827bd09bSSatish Balay /* clump 'em for now */ 706827bd09bSSatish Balay j=i+1; 707827bd09bSSatish Balay type = arg3[i]; 708827bd09bSSatish Balay while ((j<n)&&(arg3[j]==type)) 709827bd09bSSatish Balay {j++;} 710827bd09bSSatish Balay 711827bd09bSSatish Balay /* how many together */ 712827bd09bSSatish Balay j -= i; 713827bd09bSSatish Balay 714827bd09bSSatish Balay /* call appropriate ivec function */ 715827bd09bSSatish Balay if (type == GL_MAX) 716827bd09bSSatish Balay {rvec_max(arg1,arg2,j);} 717827bd09bSSatish Balay else if (type == GL_MIN) 718827bd09bSSatish Balay {rvec_min(arg1,arg2,j);} 719827bd09bSSatish Balay else if (type == GL_MULT) 720827bd09bSSatish Balay {rvec_mult(arg1,arg2,j);} 721827bd09bSSatish Balay else if (type == GL_ADD) 722827bd09bSSatish Balay {rvec_add(arg1,arg2,j);} 723827bd09bSSatish Balay else if (type == GL_MAX_ABS) 724827bd09bSSatish Balay {rvec_max_abs(arg1,arg2,j);} 725827bd09bSSatish Balay else if (type == GL_MIN_ABS) 726827bd09bSSatish Balay {rvec_min_abs(arg1,arg2,j);} 727827bd09bSSatish Balay else if (type == GL_EXISTS) 728827bd09bSSatish Balay {rvec_exists(arg1,arg2,j);} 729*e7e72b3dSBarry Smith else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"unrecognized type passed to rvec_non_uniform()!"); 730827bd09bSSatish Balay 731827bd09bSSatish Balay arg1+=j; arg2+=j; i+=j; 732827bd09bSSatish Balay } 7333fdc5746SBarry Smith PetscFunctionReturn(0); 734827bd09bSSatish Balay } 735827bd09bSSatish Balay 7367b1ae94cSBarry Smith /***********************************ivec.c*************************************/ 73752f87cdaSBarry Smith vfp rvec_fct_addr( PetscInt type) 738827bd09bSSatish Balay { 739827bd09bSSatish Balay if (type == NON_UNIFORM) 74071a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_non_uniform);} 741827bd09bSSatish Balay else if (type == GL_MAX) 74271a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_max);} 743827bd09bSSatish Balay else if (type == GL_MIN) 74471a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_min);} 745827bd09bSSatish Balay else if (type == GL_MULT) 74671a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_mult);} 747827bd09bSSatish Balay else if (type == GL_ADD) 74871a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_add);} 749827bd09bSSatish Balay else if (type == GL_MAX_ABS) 75071a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_max_abs);} 751827bd09bSSatish Balay else if (type == GL_MIN_ABS) 75271a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_min_abs);} 753827bd09bSSatish Balay else if (type == GL_EXISTS) 75471a0148aSBarry Smith {return((PetscErrorCode (*)(void*, void *, PetscInt, ...))&rvec_exists);} 755827bd09bSSatish Balay 756827bd09bSSatish Balay /* catch all ... not good if we get here */ 757827bd09bSSatish Balay return(NULL); 758827bd09bSSatish Balay } 759827bd09bSSatish Balay 760827bd09bSSatish Balay 761827bd09bSSatish Balay 762827bd09bSSatish Balay 763827bd09bSSatish Balay 764827bd09bSSatish Balay 765